[PATCH] convert IDE device drivers to driver-model
* add ide_bus_match() and export ide_bus_type * split ide_remove_driver_from_hwgroup() out of ide_unregister() * move device cleanup from ide_unregister() to drive_release_dev() * convert ide_driver_t->name to driver->name * convert ide_driver_t->{attach,cleanup} to driver->{probe,remove} * remove ide_driver_t->busy as ide_bus_type->subsys.rwsem protects against concurrent ->{probe,remove} calls * make ide_{un}register_driver() void as it cannot fail now * use driver_{un}register() directly, remove ide_{un}register_driver() * use device_register() instead of ata_attach(), remove ata_attach() * add proc_print_driver() and ide_drivers_show(), remove ide_drivers_op * fix ide_replace_subdriver() and move it to ide-proc.c * remove ide_driver_t->drives, ide_drives and drives_lock * remove ide_driver_t->drivers, drivers and drivers_lock * remove ide_drive_t->driver and DRIVER() macro Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@elka.pw.edu.pl>
This commit is contained in:
@@ -713,7 +713,6 @@ static void idescsi_add_settings(ide_drive_t *drive)
|
||||
*/
|
||||
static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
|
||||
{
|
||||
DRIVER(drive)->busy++;
|
||||
if (drive->id && (drive->id->config & 0x0060) == 0x20)
|
||||
set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags);
|
||||
set_bit(IDESCSI_TRANSFORM, &scsi->transform);
|
||||
@@ -722,17 +721,16 @@ static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi)
|
||||
set_bit(IDESCSI_LOG_CMD, &scsi->log);
|
||||
#endif /* IDESCSI_DEBUG_LOG */
|
||||
idescsi_add_settings(drive);
|
||||
DRIVER(drive)->busy--;
|
||||
}
|
||||
|
||||
static int idescsi_cleanup (ide_drive_t *drive)
|
||||
static int ide_scsi_remove(struct device *dev)
|
||||
{
|
||||
ide_drive_t *drive = to_ide_device(dev);
|
||||
struct Scsi_Host *scsihost = drive->driver_data;
|
||||
struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost);
|
||||
struct gendisk *g = scsi->disk;
|
||||
|
||||
if (ide_unregister_subdriver(drive))
|
||||
return 1;
|
||||
ide_unregister_subdriver(drive, scsi->driver);
|
||||
|
||||
ide_unregister_region(g);
|
||||
|
||||
@@ -746,7 +744,7 @@ static int idescsi_cleanup (ide_drive_t *drive)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive);
|
||||
static int ide_scsi_probe(struct device *);
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static ide_proc_entry_t idescsi_proc[] = {
|
||||
@@ -757,24 +755,22 @@ static ide_proc_entry_t idescsi_proc[] = {
|
||||
# define idescsi_proc NULL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* IDE subdriver functions, registered with ide.c
|
||||
*/
|
||||
static ide_driver_t idescsi_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "ide-scsi",
|
||||
.gen_driver = {
|
||||
.name = "ide-scsi",
|
||||
.bus = &ide_bus_type,
|
||||
.probe = ide_scsi_probe,
|
||||
.remove = ide_scsi_remove,
|
||||
},
|
||||
.version = IDESCSI_VERSION,
|
||||
.media = ide_scsi,
|
||||
.busy = 0,
|
||||
.supports_dsc_overlap = 0,
|
||||
.proc = idescsi_proc,
|
||||
.attach = idescsi_attach,
|
||||
.cleanup = idescsi_cleanup,
|
||||
.do_request = idescsi_do_request,
|
||||
.end_request = idescsi_end_request,
|
||||
.error = idescsi_atapi_error,
|
||||
.abort = idescsi_atapi_abort,
|
||||
.drives = LIST_HEAD_INIT(idescsi_driver.drives),
|
||||
};
|
||||
|
||||
static int idescsi_ide_open(struct inode *inode, struct file *filp)
|
||||
@@ -821,8 +817,6 @@ static struct block_device_operations idescsi_ops = {
|
||||
.ioctl = idescsi_ide_ioctl,
|
||||
};
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive);
|
||||
|
||||
static int idescsi_slave_configure(struct scsi_device * sdp)
|
||||
{
|
||||
/* Configure detected device */
|
||||
@@ -1095,8 +1089,9 @@ static struct scsi_host_template idescsi_template = {
|
||||
.proc_name = "ide-scsi",
|
||||
};
|
||||
|
||||
static int idescsi_attach(ide_drive_t *drive)
|
||||
static int ide_scsi_probe(struct device *dev)
|
||||
{
|
||||
ide_drive_t *drive = to_ide_device(dev);
|
||||
idescsi_scsi_t *idescsi;
|
||||
struct Scsi_Host *host;
|
||||
struct gendisk *g;
|
||||
@@ -1112,7 +1107,7 @@ static int idescsi_attach(ide_drive_t *drive)
|
||||
!drive->present ||
|
||||
drive->media == ide_disk ||
|
||||
!(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t))))
|
||||
return 1;
|
||||
return -ENODEV;
|
||||
|
||||
g = alloc_disk(1 << PARTN_BITS);
|
||||
if (!g)
|
||||
@@ -1138,20 +1133,19 @@ static int idescsi_attach(ide_drive_t *drive)
|
||||
idescsi->host = host;
|
||||
idescsi->disk = g;
|
||||
g->private_data = &idescsi->driver;
|
||||
err = ide_register_subdriver(drive, &idescsi_driver);
|
||||
ide_register_subdriver(drive, &idescsi_driver);
|
||||
err = 0;
|
||||
idescsi_setup(drive, idescsi);
|
||||
g->fops = &idescsi_ops;
|
||||
ide_register_region(g);
|
||||
err = scsi_add_host(host, &drive->gendev);
|
||||
if (!err) {
|
||||
idescsi_setup (drive, idescsi);
|
||||
g->fops = &idescsi_ops;
|
||||
ide_register_region(g);
|
||||
err = scsi_add_host(host, &drive->gendev);
|
||||
if (!err) {
|
||||
scsi_scan_host(host);
|
||||
return 0;
|
||||
}
|
||||
/* fall through on error */
|
||||
ide_unregister_region(g);
|
||||
ide_unregister_subdriver(drive);
|
||||
scsi_scan_host(host);
|
||||
return 0;
|
||||
}
|
||||
/* fall through on error */
|
||||
ide_unregister_region(g);
|
||||
ide_unregister_subdriver(drive, &idescsi_driver);
|
||||
|
||||
put_disk(g);
|
||||
out_host_put:
|
||||
@@ -1161,12 +1155,12 @@ out_host_put:
|
||||
|
||||
static int __init init_idescsi_module(void)
|
||||
{
|
||||
return ide_register_driver(&idescsi_driver);
|
||||
return driver_register(&idescsi_driver.gen_driver);
|
||||
}
|
||||
|
||||
static void __exit exit_idescsi_module(void)
|
||||
{
|
||||
ide_unregister_driver(&idescsi_driver);
|
||||
driver_unregister(&idescsi_driver.gen_driver);
|
||||
}
|
||||
|
||||
module_init(init_idescsi_module);
|
||||
|
Reference in New Issue
Block a user