drivers/block/z2ram.c

Source file repositories/reference/linux-study-clean/drivers/block/z2ram.c

File Facts

System
Linux kernel
Corpus path
drivers/block/z2ram.c
Extension
.c
Size
9352 bytes
Lines
412
Domain
Driver Families
Bucket
drivers/block
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct blk_mq_ops z2_mq_ops = {
	.queue_rq = z2_queue_rq,
};

static int z2ram_register_disk(int minor)
{
	struct gendisk *disk;
	int err;

	disk = blk_mq_alloc_disk(&tag_set, NULL, NULL);
	if (IS_ERR(disk))
		return PTR_ERR(disk);

	disk->major = Z2RAM_MAJOR;
	disk->first_minor = minor;
	disk->minors = 1;
	disk->flags |= GENHD_FL_NO_PART;
	disk->fops = &z2_fops;
	if (minor)
		sprintf(disk->disk_name, "z2ram%d", minor);
	else
		sprintf(disk->disk_name, "z2ram");

	z2ram_gendisk[minor] = disk;
	err = add_disk(disk);
	if (err)
		put_disk(disk);
	return err;
}

static int __init z2_init(void)
{
	int ret, i;

	if (!MACH_IS_AMIGA)
		return -ENODEV;

	if (register_blkdev(Z2RAM_MAJOR, DEVICE_NAME))
		return -EBUSY;

	tag_set.ops = &z2_mq_ops;
	tag_set.nr_hw_queues = 1;
	tag_set.nr_maps = 1;
	tag_set.queue_depth = 16;
	tag_set.numa_node = NUMA_NO_NODE;
	ret = blk_mq_alloc_tag_set(&tag_set);
	if (ret)
		goto out_unregister_blkdev;

	for (i = 0; i < Z2MINOR_COUNT; i++) {
		ret = z2ram_register_disk(i);
		if (ret && i == 0)
			goto out_free_tagset;
	}

	return 0;

out_free_tagset:
	blk_mq_free_tag_set(&tag_set);
out_unregister_blkdev:
	unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);
	return ret;
}

static void __exit z2_exit(void)
{
	int i, j;

	unregister_blkdev(Z2RAM_MAJOR, DEVICE_NAME);

	for (i = 0; i < Z2MINOR_COUNT; i++) {
		del_gendisk(z2ram_gendisk[i]);
		put_disk(z2ram_gendisk[i]);
	}
	blk_mq_free_tag_set(&tag_set);

	if (current_device != -1) {
		i = 0;

		for (j = 0; j < z2_count; j++) {
			set_bit(i++, zorro_unused_z2ram);
		}

		for (j = 0; j < chip_count; j++) {
			if (z2ram_map[i]) {
				amiga_chip_free((void *)z2ram_map[i++]);
			}
		}

		if (z2ram_map != NULL) {

Annotation

Implementation Notes