[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>

+216 -449
+18 -29
drivers/ide/ide-cd.c
··· 3255 3255 return capacity * sectors_per_frame; 3256 3256 } 3257 3257 3258 - static 3259 - int ide_cdrom_cleanup(ide_drive_t *drive) 3258 + static int ide_cd_remove(struct device *dev) 3260 3259 { 3260 + ide_drive_t *drive = to_ide_device(dev); 3261 3261 struct cdrom_info *info = drive->driver_data; 3262 3262 3263 - if (ide_unregister_subdriver(drive)) { 3264 - printk(KERN_ERR "%s: %s: failed to ide_unregister_subdriver\n", 3265 - __FUNCTION__, drive->name); 3266 - return 1; 3267 - } 3263 + ide_unregister_subdriver(drive, info->driver); 3268 3264 3269 3265 del_gendisk(info->disk); 3270 3266 ··· 3293 3297 kfree(info); 3294 3298 } 3295 3299 3296 - static int ide_cdrom_attach (ide_drive_t *drive); 3300 + static int ide_cd_probe(struct device *); 3297 3301 3298 3302 #ifdef CONFIG_PROC_FS 3299 3303 static int proc_idecd_read_capacity ··· 3316 3320 3317 3321 static ide_driver_t ide_cdrom_driver = { 3318 3322 .owner = THIS_MODULE, 3319 - .name = "ide-cdrom", 3323 + .gen_driver = { 3324 + .name = "ide-cdrom", 3325 + .bus = &ide_bus_type, 3326 + .probe = ide_cd_probe, 3327 + .remove = ide_cd_remove, 3328 + }, 3320 3329 .version = IDECD_VERSION, 3321 3330 .media = ide_cdrom, 3322 - .busy = 0, 3323 3331 .supports_dsc_overlap = 1, 3324 - .cleanup = ide_cdrom_cleanup, 3325 3332 .do_request = ide_do_rw_cdrom, 3326 3333 .end_request = ide_end_request, 3327 3334 .error = __ide_error, 3328 3335 .abort = __ide_abort, 3329 3336 .proc = idecd_proc, 3330 - .attach = ide_cdrom_attach, 3331 - .drives = LIST_HEAD_INIT(ide_cdrom_driver.drives), 3332 3337 }; 3333 3338 3334 3339 static int idecd_open(struct inode * inode, struct file * file) ··· 3415 3418 module_param(ignore, charp, 0400); 3416 3419 MODULE_DESCRIPTION("ATAPI CD-ROM Driver"); 3417 3420 3418 - static int ide_cdrom_attach (ide_drive_t *drive) 3421 + static int ide_cd_probe(struct device *dev) 3419 3422 { 3423 + ide_drive_t *drive = to_ide_device(dev); 3420 3424 struct cdrom_info *info; 3421 3425 struct gendisk *g; 3422 3426 struct request_sense sense; ··· 3451 3453 3452 3454 ide_init_disk(g, drive); 3453 3455 3454 - if (ide_register_subdriver(drive, &ide_cdrom_driver)) { 3455 - printk(KERN_ERR "%s: Failed to register the driver with ide.c\n", 3456 - drive->name); 3457 - goto out_put_disk; 3458 - } 3456 + ide_register_subdriver(drive, &ide_cdrom_driver); 3457 + 3459 3458 memset(info, 0, sizeof (struct cdrom_info)); 3460 3459 3461 3460 kref_init(&info->kref); ··· 3465 3470 3466 3471 drive->driver_data = info; 3467 3472 3468 - DRIVER(drive)->busy++; 3469 3473 g->minors = 1; 3470 3474 snprintf(g->devfs_name, sizeof(g->devfs_name), 3471 3475 "%s/cd", drive->devfs_name); ··· 3472 3478 g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; 3473 3479 if (ide_cdrom_setup(drive)) { 3474 3480 struct cdrom_device_info *devinfo = &info->devinfo; 3475 - DRIVER(drive)->busy--; 3476 - ide_unregister_subdriver(drive); 3481 + ide_unregister_subdriver(drive, &ide_cdrom_driver); 3477 3482 if (info->buffer != NULL) 3478 3483 kfree(info->buffer); 3479 3484 if (info->toc != NULL) ··· 3485 3492 drive->driver_data = NULL; 3486 3493 goto failed; 3487 3494 } 3488 - DRIVER(drive)->busy--; 3489 3495 3490 3496 cdrom_read_toc(drive, &sense); 3491 3497 g->fops = &idecd_ops; ··· 3492 3500 add_disk(g); 3493 3501 return 0; 3494 3502 3495 - out_put_disk: 3496 - put_disk(g); 3497 3503 out_free_cd: 3498 3504 kfree(info); 3499 3505 failed: 3500 - return 1; 3506 + return -ENODEV; 3501 3507 } 3502 3508 3503 3509 static void __exit ide_cdrom_exit(void) 3504 3510 { 3505 - ide_unregister_driver(&ide_cdrom_driver); 3511 + driver_unregister(&ide_cdrom_driver.gen_driver); 3506 3512 } 3507 3513 3508 3514 static int ide_cdrom_init(void) 3509 3515 { 3510 - ide_register_driver(&ide_cdrom_driver); 3511 - return 0; 3516 + return driver_register(&ide_cdrom_driver.gen_driver); 3512 3517 } 3513 3518 3514 3519 module_init(ide_cdrom_init);
+17 -24
drivers/ide/ide-disk.c
··· 1024 1024 printk(KERN_INFO "%s: wcache flush failed!\n", drive->name); 1025 1025 } 1026 1026 1027 - static int idedisk_cleanup (ide_drive_t *drive) 1027 + static int ide_disk_remove(struct device *dev) 1028 1028 { 1029 + ide_drive_t *drive = to_ide_device(dev); 1029 1030 struct ide_disk_obj *idkp = drive->driver_data; 1030 1031 struct gendisk *g = idkp->disk; 1031 1032 1032 1033 ide_cacheflush_p(drive); 1033 - if (ide_unregister_subdriver(drive)) 1034 - return 1; 1034 + 1035 + ide_unregister_subdriver(drive, idkp->driver); 1036 + 1035 1037 del_gendisk(g); 1036 1038 1037 1039 ide_disk_put(idkp); ··· 1054 1052 kfree(idkp); 1055 1053 } 1056 1054 1057 - static int idedisk_attach(ide_drive_t *drive); 1055 + static int ide_disk_probe(struct device *dev); 1058 1056 1059 1057 static void ide_device_shutdown(struct device *dev) 1060 1058 { ··· 1084 1082 dev->bus->suspend(dev, PMSG_SUSPEND); 1085 1083 } 1086 1084 1087 - /* 1088 - * IDE subdriver functions, registered with ide.c 1089 - */ 1090 1085 static ide_driver_t idedisk_driver = { 1091 1086 .owner = THIS_MODULE, 1092 1087 .gen_driver = { 1088 + .name = "ide-disk", 1089 + .bus = &ide_bus_type, 1090 + .probe = ide_disk_probe, 1091 + .remove = ide_disk_remove, 1093 1092 .shutdown = ide_device_shutdown, 1094 1093 }, 1095 - .name = "ide-disk", 1096 1094 .version = IDEDISK_VERSION, 1097 1095 .media = ide_disk, 1098 - .busy = 0, 1099 1096 .supports_dsc_overlap = 0, 1100 - .cleanup = idedisk_cleanup, 1101 1097 .do_request = ide_do_rw_disk, 1102 1098 .end_request = ide_end_request, 1103 1099 .error = __ide_error, 1104 1100 .abort = __ide_abort, 1105 1101 .proc = idedisk_proc, 1106 - .attach = idedisk_attach, 1107 - .drives = LIST_HEAD_INIT(idedisk_driver.drives), 1108 1102 }; 1109 1103 1110 1104 static int idedisk_open(struct inode *inode, struct file *filp) ··· 1197 1199 1198 1200 MODULE_DESCRIPTION("ATA DISK Driver"); 1199 1201 1200 - static int idedisk_attach(ide_drive_t *drive) 1202 + static int ide_disk_probe(struct device *dev) 1201 1203 { 1204 + ide_drive_t *drive = to_ide_device(dev); 1202 1205 struct ide_disk_obj *idkp; 1203 1206 struct gendisk *g; 1204 1207 ··· 1221 1222 1222 1223 ide_init_disk(g, drive); 1223 1224 1224 - if (ide_register_subdriver(drive, &idedisk_driver)) { 1225 - printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.c\n", drive->name); 1226 - goto out_put_disk; 1227 - } 1225 + ide_register_subdriver(drive, &idedisk_driver); 1228 1226 1229 1227 memset(idkp, 0, sizeof(*idkp)); 1230 1228 ··· 1235 1239 1236 1240 drive->driver_data = idkp; 1237 1241 1238 - DRIVER(drive)->busy++; 1239 1242 idedisk_setup(drive); 1240 1243 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) { 1241 1244 printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", ··· 1242 1247 drive->attach = 0; 1243 1248 } else 1244 1249 drive->attach = 1; 1245 - DRIVER(drive)->busy--; 1250 + 1246 1251 g->minors = 1 << PARTN_BITS; 1247 1252 strcpy(g->devfs_name, drive->devfs_name); 1248 1253 g->driverfs_dev = &drive->gendev; ··· 1252 1257 add_disk(g); 1253 1258 return 0; 1254 1259 1255 - out_put_disk: 1256 - put_disk(g); 1257 1260 out_free_idkp: 1258 1261 kfree(idkp); 1259 1262 failed: 1260 - return 1; 1263 + return -ENODEV; 1261 1264 } 1262 1265 1263 1266 static void __exit idedisk_exit (void) 1264 1267 { 1265 - ide_unregister_driver(&idedisk_driver); 1268 + driver_unregister(&idedisk_driver.gen_driver); 1266 1269 } 1267 1270 1268 1271 static int idedisk_init (void) 1269 1272 { 1270 - return ide_register_driver(&idedisk_driver); 1273 + return driver_register(&idedisk_driver.gen_driver); 1271 1274 } 1272 1275 1273 1276 module_init(idedisk_init);
+17 -25
drivers/ide/ide-floppy.c
··· 1865 1865 idefloppy_add_settings(drive); 1866 1866 } 1867 1867 1868 - static int idefloppy_cleanup (ide_drive_t *drive) 1868 + static int ide_floppy_remove(struct device *dev) 1869 1869 { 1870 + ide_drive_t *drive = to_ide_device(dev); 1870 1871 idefloppy_floppy_t *floppy = drive->driver_data; 1871 1872 struct gendisk *g = floppy->disk; 1872 1873 1873 - if (ide_unregister_subdriver(drive)) 1874 - return 1; 1874 + ide_unregister_subdriver(drive, floppy->driver); 1875 1875 1876 1876 del_gendisk(g); 1877 1877 ··· 1916 1916 1917 1917 #endif /* CONFIG_PROC_FS */ 1918 1918 1919 - static int idefloppy_attach(ide_drive_t *drive); 1919 + static int ide_floppy_probe(struct device *); 1920 1920 1921 - /* 1922 - * IDE subdriver functions, registered with ide.c 1923 - */ 1924 1921 static ide_driver_t idefloppy_driver = { 1925 1922 .owner = THIS_MODULE, 1926 - .name = "ide-floppy", 1923 + .gen_driver = { 1924 + .name = "ide-floppy", 1925 + .bus = &ide_bus_type, 1926 + .probe = ide_floppy_probe, 1927 + .remove = ide_floppy_remove, 1928 + }, 1927 1929 .version = IDEFLOPPY_VERSION, 1928 1930 .media = ide_floppy, 1929 - .busy = 0, 1930 1931 .supports_dsc_overlap = 0, 1931 - .cleanup = idefloppy_cleanup, 1932 1932 .do_request = idefloppy_do_request, 1933 1933 .end_request = idefloppy_do_end_request, 1934 1934 .error = __ide_error, 1935 1935 .abort = __ide_abort, 1936 1936 .proc = idefloppy_proc, 1937 - .attach = idefloppy_attach, 1938 - .drives = LIST_HEAD_INIT(idefloppy_driver.drives), 1939 1937 }; 1940 1938 1941 1939 static int idefloppy_open(struct inode *inode, struct file *filp) ··· 2120 2122 .revalidate_disk= idefloppy_revalidate_disk 2121 2123 }; 2122 2124 2123 - static int idefloppy_attach (ide_drive_t *drive) 2125 + static int ide_floppy_probe(struct device *dev) 2124 2126 { 2127 + ide_drive_t *drive = to_ide_device(dev); 2125 2128 idefloppy_floppy_t *floppy; 2126 2129 struct gendisk *g; 2127 2130 ··· 2151 2152 2152 2153 ide_init_disk(g, drive); 2153 2154 2154 - if (ide_register_subdriver(drive, &idefloppy_driver)) { 2155 - printk (KERN_ERR "ide-floppy: %s: Failed to register the driver with ide.c\n", drive->name); 2156 - goto out_put_disk; 2157 - } 2155 + ide_register_subdriver(drive, &idefloppy_driver); 2158 2156 2159 2157 memset(floppy, 0, sizeof(*floppy)); 2160 2158 ··· 2165 2169 2166 2170 drive->driver_data = floppy; 2167 2171 2168 - DRIVER(drive)->busy++; 2169 2172 idefloppy_setup (drive, floppy); 2170 - DRIVER(drive)->busy--; 2173 + 2171 2174 g->minors = 1 << PARTN_BITS; 2172 2175 g->driverfs_dev = &drive->gendev; 2173 2176 strcpy(g->devfs_name, drive->devfs_name); ··· 2176 2181 add_disk(g); 2177 2182 return 0; 2178 2183 2179 - out_put_disk: 2180 - put_disk(g); 2181 2184 out_free_floppy: 2182 2185 kfree(floppy); 2183 2186 failed: 2184 - return 1; 2187 + return -ENODEV; 2185 2188 } 2186 2189 2187 2190 MODULE_DESCRIPTION("ATAPI FLOPPY Driver"); 2188 2191 2189 2192 static void __exit idefloppy_exit (void) 2190 2193 { 2191 - ide_unregister_driver(&idefloppy_driver); 2194 + driver_unregister(&idefloppy_driver.gen_driver); 2192 2195 } 2193 2196 2194 2197 /* ··· 2195 2202 static int idefloppy_init (void) 2196 2203 { 2197 2204 printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); 2198 - ide_register_driver(&idefloppy_driver); 2199 - return 0; 2205 + return driver_register(&idefloppy_driver.gen_driver); 2200 2206 } 2201 2207 2202 2208 module_init(idefloppy_init);
+44 -3
drivers/ide/ide-probe.c
··· 47 47 #include <linux/slab.h> 48 48 #include <linux/delay.h> 49 49 #include <linux/ide.h> 50 + #include <linux/devfs_fs_kernel.h> 50 51 #include <linux/spinlock.h> 51 52 #include <linux/kmod.h> 52 53 #include <linux/pci.h> ··· 919 918 want them on default or a new "empty" class 920 919 for hotplug reprobing ? */ 921 920 if (drive->present) { 922 - ata_attach(drive); 921 + device_register(&drive->gendev); 923 922 } 924 923 } 925 924 } ··· 1280 1279 1281 1280 EXPORT_SYMBOL_GPL(ide_init_disk); 1282 1281 1282 + static void ide_remove_drive_from_hwgroup(ide_drive_t *drive) 1283 + { 1284 + ide_hwgroup_t *hwgroup = drive->hwif->hwgroup; 1285 + 1286 + if (drive == drive->next) { 1287 + /* special case: last drive from hwgroup. */ 1288 + BUG_ON(hwgroup->drive != drive); 1289 + hwgroup->drive = NULL; 1290 + } else { 1291 + ide_drive_t *walk; 1292 + 1293 + walk = hwgroup->drive; 1294 + while (walk->next != drive) 1295 + walk = walk->next; 1296 + walk->next = drive->next; 1297 + if (hwgroup->drive == drive) { 1298 + hwgroup->drive = drive->next; 1299 + hwgroup->hwif = hwgroup->drive->hwif; 1300 + } 1301 + } 1302 + BUG_ON(hwgroup->drive == drive); 1303 + } 1304 + 1283 1305 static void drive_release_dev (struct device *dev) 1284 1306 { 1285 1307 ide_drive_t *drive = container_of(dev, ide_drive_t, gendev); 1308 + 1309 + spin_lock_irq(&ide_lock); 1310 + if (drive->devfs_name[0] != '\0') { 1311 + devfs_remove(drive->devfs_name); 1312 + drive->devfs_name[0] = '\0'; 1313 + } 1314 + ide_remove_drive_from_hwgroup(drive); 1315 + if (drive->id != NULL) { 1316 + kfree(drive->id); 1317 + drive->id = NULL; 1318 + } 1319 + drive->present = 0; 1320 + /* Messed up locking ... */ 1321 + spin_unlock_irq(&ide_lock); 1322 + blk_cleanup_queue(drive->queue); 1323 + spin_lock_irq(&ide_lock); 1324 + drive->queue = NULL; 1325 + spin_unlock_irq(&ide_lock); 1286 1326 1287 1327 up(&drive->gendev_rel_sem); 1288 1328 } ··· 1348 1306 drive->gendev.driver_data = drive; 1349 1307 drive->gendev.release = drive_release_dev; 1350 1308 if (drive->present) { 1351 - device_register(&drive->gendev); 1352 1309 sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d", 1353 1310 (hwif->channel && hwif->mate) ? 1354 1311 hwif->mate->index : hwif->index, ··· 1453 1412 hwif->chipset = ide_generic; 1454 1413 for (unit = 0; unit < MAX_DRIVES; ++unit) 1455 1414 if (hwif->drives[unit].present) 1456 - ata_attach(&hwif->drives[unit]); 1415 + device_register(&hwif->drives[unit].gendev); 1457 1416 } 1458 1417 } 1459 1418 return 0;
+46 -6
drivers/ide/ide-proc.c
··· 307 307 (char *page, char **start, off_t off, int count, int *eof, void *data) 308 308 { 309 309 ide_drive_t *drive = (ide_drive_t *) data; 310 - ide_driver_t *driver = drive->driver; 310 + struct device *dev = &drive->gendev; 311 + ide_driver_t *ide_drv; 311 312 int len; 312 313 313 - if (driver) { 314 + down_read(&dev->bus->subsys.rwsem); 315 + if (dev->driver) { 316 + ide_drv = container_of(dev->driver, ide_driver_t, gen_driver); 314 317 len = sprintf(page, "%s version %s\n", 315 - driver->name, driver->version); 318 + dev->driver->name, ide_drv->version); 316 319 } else 317 320 len = sprintf(page, "ide-default version 0.9.newide\n"); 321 + up_read(&dev->bus->subsys.rwsem); 318 322 PROC_IDE_READ_RETURN(page,start,off,count,eof,len); 323 + } 324 + 325 + static int ide_replace_subdriver(ide_drive_t *drive, const char *driver) 326 + { 327 + struct device *dev = &drive->gendev; 328 + int ret = 1; 329 + 330 + down_write(&dev->bus->subsys.rwsem); 331 + device_release_driver(dev); 332 + /* FIXME: device can still be in use by previous driver */ 333 + strlcpy(drive->driver_req, driver, sizeof(drive->driver_req)); 334 + device_attach(dev); 335 + drive->driver_req[0] = 0; 336 + if (dev->driver == NULL) 337 + device_attach(dev); 338 + if (dev->driver && !strcmp(dev->driver->name, driver)) 339 + ret = 0; 340 + up_write(&dev->bus->subsys.rwsem); 341 + 342 + return ret; 319 343 } 320 344 321 345 static int proc_ide_write_driver ··· 512 488 } 513 489 } 514 490 515 - extern struct seq_operations ide_drivers_op; 491 + static int proc_print_driver(struct device_driver *drv, void *data) 492 + { 493 + ide_driver_t *ide_drv = container_of(drv, ide_driver_t, gen_driver); 494 + struct seq_file *s = data; 495 + 496 + seq_printf(s, "%s version %s\n", drv->name, ide_drv->version); 497 + 498 + return 0; 499 + } 500 + 501 + static int ide_drivers_show(struct seq_file *s, void *p) 502 + { 503 + bus_for_each_drv(&ide_bus_type, NULL, s, proc_print_driver); 504 + return 0; 505 + } 506 + 516 507 static int ide_drivers_open(struct inode *inode, struct file *file) 517 508 { 518 - return seq_open(file, &ide_drivers_op); 509 + return single_open(file, &ide_drivers_show, NULL); 519 510 } 511 + 520 512 static struct file_operations ide_drivers_operations = { 521 513 .open = ide_drivers_open, 522 514 .read = seq_read, 523 515 .llseek = seq_lseek, 524 - .release = seq_release, 516 + .release = single_release, 525 517 }; 526 518 527 519 void proc_ide_create(void)
+19 -32
drivers/ide/ide-tape.c
··· 4681 4681 idetape_add_settings(drive); 4682 4682 } 4683 4683 4684 - static int idetape_cleanup (ide_drive_t *drive) 4684 + static int ide_tape_remove(struct device *dev) 4685 4685 { 4686 + ide_drive_t *drive = to_ide_device(dev); 4686 4687 idetape_tape_t *tape = drive->driver_data; 4687 - unsigned long flags; 4688 4688 4689 - spin_lock_irqsave(&ide_lock, flags); 4690 - if (test_bit(IDETAPE_BUSY, &tape->flags) || drive->usage || 4691 - tape->first_stage != NULL || tape->merge_stage_size) { 4692 - spin_unlock_irqrestore(&ide_lock, flags); 4693 - return 1; 4694 - } 4695 - 4696 - spin_unlock_irqrestore(&ide_lock, flags); 4697 - DRIVER(drive)->busy = 0; 4698 - (void) ide_unregister_subdriver(drive); 4689 + ide_unregister_subdriver(drive, tape->driver); 4699 4690 4700 4691 ide_unregister_region(tape->disk); 4701 4692 ··· 4700 4709 struct ide_tape_obj *tape = to_ide_tape(kref); 4701 4710 ide_drive_t *drive = tape->drive; 4702 4711 struct gendisk *g = tape->disk; 4712 + 4713 + BUG_ON(tape->first_stage != NULL || tape->merge_stage_size); 4703 4714 4704 4715 drive->dsc_overlap = 0; 4705 4716 drive->driver_data = NULL; ··· 4740 4747 4741 4748 #endif 4742 4749 4743 - static int idetape_attach(ide_drive_t *drive); 4750 + static int ide_tape_probe(struct device *); 4744 4751 4745 - /* 4746 - * IDE subdriver functions, registered with ide.c 4747 - */ 4748 4752 static ide_driver_t idetape_driver = { 4749 4753 .owner = THIS_MODULE, 4750 - .name = "ide-tape", 4754 + .gen_driver = { 4755 + .name = "ide-tape", 4756 + .bus = &ide_bus_type, 4757 + .probe = ide_tape_probe, 4758 + .remove = ide_tape_remove, 4759 + }, 4751 4760 .version = IDETAPE_VERSION, 4752 4761 .media = ide_tape, 4753 - .busy = 1, 4754 4762 .supports_dsc_overlap = 1, 4755 - .cleanup = idetape_cleanup, 4756 4763 .do_request = idetape_do_request, 4757 4764 .end_request = idetape_end_request, 4758 4765 .error = __ide_error, 4759 4766 .abort = __ide_abort, 4760 4767 .proc = idetape_proc, 4761 - .attach = idetape_attach, 4762 - .drives = LIST_HEAD_INIT(idetape_driver.drives), 4763 4768 }; 4764 4769 4765 4770 /* ··· 4820 4829 .ioctl = idetape_ioctl, 4821 4830 }; 4822 4831 4823 - static int idetape_attach (ide_drive_t *drive) 4832 + static int ide_tape_probe(struct device *dev) 4824 4833 { 4834 + ide_drive_t *drive = to_ide_device(dev); 4825 4835 idetape_tape_t *tape; 4826 4836 struct gendisk *g; 4827 4837 int minor; ··· 4857 4865 4858 4866 ide_init_disk(g, drive); 4859 4867 4860 - if (ide_register_subdriver(drive, &idetape_driver)) { 4861 - printk(KERN_ERR "ide-tape: %s: Failed to register the driver with ide.c\n", drive->name); 4862 - goto out_put_disk; 4863 - } 4868 + ide_register_subdriver(drive, &idetape_driver); 4864 4869 4865 4870 memset(tape, 0, sizeof(*tape)); 4866 4871 ··· 4891 4902 ide_register_region(g); 4892 4903 4893 4904 return 0; 4894 - out_put_disk: 4895 - put_disk(g); 4905 + 4896 4906 out_free_tape: 4897 4907 kfree(tape); 4898 4908 failed: 4899 - return 1; 4909 + return -ENODEV; 4900 4910 } 4901 4911 4902 4912 MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver"); ··· 4903 4915 4904 4916 static void __exit idetape_exit (void) 4905 4917 { 4906 - ide_unregister_driver(&idetape_driver); 4918 + driver_unregister(&idetape_driver.gen_driver); 4907 4919 unregister_chrdev(IDETAPE_MAJOR, "ht"); 4908 4920 } 4909 4921 ··· 4916 4928 printk(KERN_ERR "ide-tape: Failed to register character device interface\n"); 4917 4929 return -EBUSY; 4918 4930 } 4919 - ide_register_driver(&idetape_driver); 4920 - return 0; 4931 + return driver_register(&idetape_driver.gen_driver); 4921 4932 } 4922 4933 4923 4934 module_init(idetape_init);
+25 -282
drivers/ide/ide.c
··· 196 196 197 197 EXPORT_SYMBOL(ide_hwifs); 198 198 199 - static struct list_head ide_drives = LIST_HEAD_INIT(ide_drives); 200 - 201 199 /* 202 200 * Do not even *think* about calling this! 203 201 */ ··· 355 357 } 356 358 return system_bus_speed; 357 359 } 358 - 359 - /* 360 - * drives_lock protects the list of drives, drivers_lock the 361 - * list of drivers. Currently nobody takes both at once. 362 - */ 363 - 364 - static DEFINE_SPINLOCK(drives_lock); 365 - static DEFINE_SPINLOCK(drivers_lock); 366 - static LIST_HEAD(drivers); 367 - 368 - /* Iterator for the driver list. */ 369 - 370 - static void *m_start(struct seq_file *m, loff_t *pos) 371 - { 372 - struct list_head *p; 373 - loff_t l = *pos; 374 - spin_lock(&drivers_lock); 375 - list_for_each(p, &drivers) 376 - if (!l--) 377 - return list_entry(p, ide_driver_t, drivers); 378 - return NULL; 379 - } 380 - 381 - static void *m_next(struct seq_file *m, void *v, loff_t *pos) 382 - { 383 - struct list_head *p = ((ide_driver_t *)v)->drivers.next; 384 - (*pos)++; 385 - return p==&drivers ? NULL : list_entry(p, ide_driver_t, drivers); 386 - } 387 - 388 - static void m_stop(struct seq_file *m, void *v) 389 - { 390 - spin_unlock(&drivers_lock); 391 - } 392 - 393 - static int show_driver(struct seq_file *m, void *v) 394 - { 395 - ide_driver_t *driver = v; 396 - seq_printf(m, "%s version %s\n", driver->name, driver->version); 397 - return 0; 398 - } 399 - 400 - struct seq_operations ide_drivers_op = { 401 - .start = m_start, 402 - .next = m_next, 403 - .stop = m_stop, 404 - .show = show_driver 405 - }; 406 360 407 361 #ifdef CONFIG_PROC_FS 408 362 struct proc_dir_entry *proc_ide_root; ··· 580 630 ide_hwif_t *hwif, *g; 581 631 static ide_hwif_t tmp_hwif; /* protected by ide_cfg_sem */ 582 632 ide_hwgroup_t *hwgroup; 583 - int irq_count = 0, unit, i; 633 + int irq_count = 0, unit; 584 634 585 635 BUG_ON(index >= MAX_HWIFS); 586 636 ··· 593 643 goto abort; 594 644 for (unit = 0; unit < MAX_DRIVES; ++unit) { 595 645 drive = &hwif->drives[unit]; 596 - if (!drive->present) 646 + if (!drive->present) { 647 + if (drive->devfs_name[0] != '\0') { 648 + devfs_remove(drive->devfs_name); 649 + drive->devfs_name[0] = '\0'; 650 + } 597 651 continue; 598 - if (drive->usage || DRIVER(drive)->busy) 599 - goto abort; 600 - drive->dead = 1; 652 + } 653 + spin_unlock_irq(&ide_lock); 654 + device_unregister(&drive->gendev); 655 + down(&drive->gendev_rel_sem); 656 + spin_lock_irq(&ide_lock); 601 657 } 602 658 hwif->present = 0; 603 659 604 660 spin_unlock_irq(&ide_lock); 605 - 606 - for (unit = 0; unit < MAX_DRIVES; ++unit) { 607 - drive = &hwif->drives[unit]; 608 - if (!drive->present) 609 - continue; 610 - DRIVER(drive)->cleanup(drive); 611 - } 612 661 613 662 destroy_proc_ide_interface(hwif); 614 663 ··· 636 687 * Remove us from the hwgroup, and free 637 688 * the hwgroup if we were the only member 638 689 */ 639 - for (i = 0; i < MAX_DRIVES; ++i) { 640 - drive = &hwif->drives[i]; 641 - if (drive->devfs_name[0] != '\0') { 642 - devfs_remove(drive->devfs_name); 643 - drive->devfs_name[0] = '\0'; 644 - } 645 - if (!drive->present) 646 - continue; 647 - if (drive == drive->next) { 648 - /* special case: last drive from hwgroup. */ 649 - BUG_ON(hwgroup->drive != drive); 650 - hwgroup->drive = NULL; 651 - } else { 652 - ide_drive_t *walk; 653 - 654 - walk = hwgroup->drive; 655 - while (walk->next != drive) 656 - walk = walk->next; 657 - walk->next = drive->next; 658 - if (hwgroup->drive == drive) { 659 - hwgroup->drive = drive->next; 660 - hwgroup->hwif = HWIF(hwgroup->drive); 661 - } 662 - } 663 - BUG_ON(hwgroup->drive == drive); 664 - if (drive->id != NULL) { 665 - kfree(drive->id); 666 - drive->id = NULL; 667 - } 668 - drive->present = 0; 669 - /* Messed up locking ... */ 670 - spin_unlock_irq(&ide_lock); 671 - blk_cleanup_queue(drive->queue); 672 - device_unregister(&drive->gendev); 673 - down(&drive->gendev_rel_sem); 674 - spin_lock_irq(&ide_lock); 675 - drive->queue = NULL; 676 - } 677 690 if (hwif->next == hwif) { 678 691 BUG_ON(hwgroup->hwif != hwif); 679 692 kfree(hwgroup); ··· 1214 1303 } 1215 1304 1216 1305 EXPORT_SYMBOL(system_bus_clock); 1217 - 1218 - /* 1219 - * Locking is badly broken here - since way back. That sucker is 1220 - * root-only, but that's not an excuse... The real question is what 1221 - * exclusion rules do we want here. 1222 - */ 1223 - int ide_replace_subdriver (ide_drive_t *drive, const char *driver) 1224 - { 1225 - if (!drive->present || drive->usage || drive->dead) 1226 - goto abort; 1227 - if (DRIVER(drive)->cleanup(drive)) 1228 - goto abort; 1229 - strlcpy(drive->driver_req, driver, sizeof(drive->driver_req)); 1230 - if (ata_attach(drive)) { 1231 - spin_lock(&drives_lock); 1232 - list_del_init(&drive->list); 1233 - spin_unlock(&drives_lock); 1234 - drive->driver_req[0] = 0; 1235 - ata_attach(drive); 1236 - } else { 1237 - drive->driver_req[0] = 0; 1238 - } 1239 - if (drive->driver && !strcmp(drive->driver->name, driver)) 1240 - return 0; 1241 - abort: 1242 - return 1; 1243 - } 1244 - 1245 - /** 1246 - * ata_attach - attach an ATA/ATAPI device 1247 - * @drive: drive to attach 1248 - * 1249 - * Takes a drive that is as yet not assigned to any midlayer IDE 1250 - * driver (or is assigned to the default driver) and figures out 1251 - * which driver would like to own it. If nobody claims the drive 1252 - * then it is automatically attached to the default driver used for 1253 - * unclaimed objects. 1254 - * 1255 - * A return of zero indicates attachment to a driver, of one 1256 - * attachment to the default driver. 1257 - * 1258 - * Takes drivers_lock. 1259 - */ 1260 - 1261 - int ata_attach(ide_drive_t *drive) 1262 - { 1263 - struct list_head *p; 1264 - spin_lock(&drivers_lock); 1265 - list_for_each(p, &drivers) { 1266 - ide_driver_t *driver = list_entry(p, ide_driver_t, drivers); 1267 - if (!try_module_get(driver->owner)) 1268 - continue; 1269 - spin_unlock(&drivers_lock); 1270 - if (driver->attach(drive) == 0) { 1271 - module_put(driver->owner); 1272 - drive->gendev.driver = &driver->gen_driver; 1273 - return 0; 1274 - } 1275 - spin_lock(&drivers_lock); 1276 - module_put(driver->owner); 1277 - } 1278 - drive->gendev.driver = NULL; 1279 - spin_unlock(&drivers_lock); 1280 - if (ide_register_subdriver(drive, NULL)) 1281 - panic("ide: default attach failed"); 1282 - return 1; 1283 - } 1284 1306 1285 1307 static int generic_ide_suspend(struct device *dev, pm_message_t state) 1286 1308 { ··· 1857 2013 #endif 1858 2014 } 1859 2015 1860 - int ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver) 2016 + void ide_register_subdriver(ide_drive_t *drive, ide_driver_t *driver) 1861 2017 { 1862 - unsigned long flags; 1863 - 1864 - spin_lock_irqsave(&ide_lock, flags); 1865 - if (!drive->present || drive->driver != NULL || 1866 - drive->usage || drive->dead) { 1867 - spin_unlock_irqrestore(&ide_lock, flags); 1868 - return 1; 1869 - } 1870 - drive->driver = driver; 1871 - spin_unlock_irqrestore(&ide_lock, flags); 1872 - spin_lock(&drives_lock); 1873 - list_add_tail(&drive->list, driver ? &driver->drives : &ide_drives); 1874 - spin_unlock(&drives_lock); 1875 - // printk(KERN_INFO "%s: attached %s driver.\n", drive->name, driver->name); 1876 2018 #ifdef CONFIG_PROC_FS 1877 - if (driver) 1878 - ide_add_proc_entries(drive->proc, driver->proc, drive); 2019 + ide_add_proc_entries(drive->proc, driver->proc, drive); 1879 2020 #endif 1880 - return 0; 1881 2021 } 1882 2022 1883 2023 EXPORT_SYMBOL(ide_register_subdriver); ··· 1869 2041 /** 1870 2042 * ide_unregister_subdriver - disconnect drive from driver 1871 2043 * @drive: drive to unplug 2044 + * @driver: driver 1872 2045 * 1873 2046 * Disconnect a drive from the driver it was attached to and then 1874 2047 * clean up the various proc files and other objects attached to it. 1875 2048 * 1876 - * Takes ide_setting_sem, ide_lock and drives_lock. 2049 + * Takes ide_setting_sem and ide_lock. 1877 2050 * Caller must hold none of the locks. 1878 - * 1879 - * No locking versus subdriver unload because we are moving to the 1880 - * default driver anyway. Wants double checking. 1881 2051 */ 1882 2052 1883 - int ide_unregister_subdriver (ide_drive_t *drive) 2053 + void ide_unregister_subdriver(ide_drive_t *drive, ide_driver_t *driver) 1884 2054 { 1885 2055 unsigned long flags; 1886 2056 1887 2057 down(&ide_setting_sem); 1888 2058 spin_lock_irqsave(&ide_lock, flags); 1889 - if (drive->usage || drive->driver == NULL || DRIVER(drive)->busy) { 1890 - spin_unlock_irqrestore(&ide_lock, flags); 1891 - up(&ide_setting_sem); 1892 - return 1; 1893 - } 1894 2059 #ifdef CONFIG_PROC_FS 1895 - ide_remove_proc_entries(drive->proc, DRIVER(drive)->proc); 2060 + ide_remove_proc_entries(drive->proc, driver->proc); 1896 2061 #endif 1897 2062 auto_remove_settings(drive); 1898 - drive->driver = NULL; 1899 2063 spin_unlock_irqrestore(&ide_lock, flags); 1900 2064 up(&ide_setting_sem); 1901 - spin_lock(&drives_lock); 1902 - list_del_init(&drive->list); 1903 - spin_unlock(&drives_lock); 1904 - /* drive will be added to &ide_drives in ata_attach() */ 1905 - return 0; 1906 2065 } 1907 2066 1908 2067 EXPORT_SYMBOL(ide_unregister_subdriver); 1909 - 1910 - static int ide_drive_remove(struct device * dev) 1911 - { 1912 - ide_drive_t * drive = container_of(dev,ide_drive_t,gendev); 1913 - DRIVER(drive)->cleanup(drive); 1914 - return 0; 1915 - } 1916 - 1917 - /** 1918 - * ide_register_driver - register IDE device driver 1919 - * @driver: the IDE device driver 1920 - * 1921 - * Register a new device driver and then scan the devices 1922 - * on the IDE bus in case any should be attached to the 1923 - * driver we have just registered. If so attach them. 1924 - * 1925 - * Takes drivers_lock and drives_lock. 1926 - */ 1927 - 1928 - int ide_register_driver(ide_driver_t *driver) 1929 - { 1930 - struct list_head list; 1931 - struct list_head *list_loop; 1932 - struct list_head *tmp_storage; 1933 - 1934 - spin_lock(&drivers_lock); 1935 - list_add(&driver->drivers, &drivers); 1936 - spin_unlock(&drivers_lock); 1937 - 1938 - INIT_LIST_HEAD(&list); 1939 - spin_lock(&drives_lock); 1940 - list_splice_init(&ide_drives, &list); 1941 - spin_unlock(&drives_lock); 1942 - 1943 - list_for_each_safe(list_loop, tmp_storage, &list) { 1944 - ide_drive_t *drive = container_of(list_loop, ide_drive_t, list); 1945 - list_del_init(&drive->list); 1946 - if (drive->present) 1947 - ata_attach(drive); 1948 - } 1949 - driver->gen_driver.name = (char *) driver->name; 1950 - driver->gen_driver.bus = &ide_bus_type; 1951 - driver->gen_driver.remove = ide_drive_remove; 1952 - return driver_register(&driver->gen_driver); 1953 - } 1954 - 1955 - EXPORT_SYMBOL(ide_register_driver); 1956 - 1957 - /** 1958 - * ide_unregister_driver - unregister IDE device driver 1959 - * @driver: the IDE device driver 1960 - * 1961 - * Called when a driver module is being unloaded. We reattach any 1962 - * devices to whatever driver claims them next (typically the default 1963 - * driver). 1964 - * 1965 - * Takes drivers_lock and called functions will take ide_setting_sem. 1966 - */ 1967 - 1968 - void ide_unregister_driver(ide_driver_t *driver) 1969 - { 1970 - ide_drive_t *drive; 1971 - 1972 - spin_lock(&drivers_lock); 1973 - list_del(&driver->drivers); 1974 - spin_unlock(&drivers_lock); 1975 - 1976 - driver_unregister(&driver->gen_driver); 1977 - 1978 - while(!list_empty(&driver->drives)) { 1979 - drive = list_entry(driver->drives.next, ide_drive_t, list); 1980 - if (driver->cleanup(drive)) { 1981 - printk(KERN_ERR "%s: cleanup_module() called while still busy\n", drive->name); 1982 - BUG(); 1983 - } 1984 - ata_attach(drive); 1985 - } 1986 - } 1987 - 1988 - EXPORT_SYMBOL(ide_unregister_driver); 1989 2068 1990 2069 /* 1991 2070 * Probe module ··· 1900 2165 1901 2166 EXPORT_SYMBOL(ide_lock); 1902 2167 2168 + static int ide_bus_match(struct device *dev, struct device_driver *drv) 2169 + { 2170 + return 1; 2171 + } 2172 + 1903 2173 struct bus_type ide_bus_type = { 1904 2174 .name = "ide", 2175 + .match = ide_bus_match, 1905 2176 .suspend = generic_ide_suspend, 1906 2177 .resume = generic_ide_resume, 1907 2178 }; 2179 + 2180 + EXPORT_SYMBOL_GPL(ide_bus_type); 1908 2181 1909 2182 /* 1910 2183 * This is gets invoked once during initialization, to set *everything* up
+26 -32
drivers/scsi/ide-scsi.c
··· 713 713 */ 714 714 static void idescsi_setup (ide_drive_t *drive, idescsi_scsi_t *scsi) 715 715 { 716 - DRIVER(drive)->busy++; 717 716 if (drive->id && (drive->id->config & 0x0060) == 0x20) 718 717 set_bit (IDESCSI_DRQ_INTERRUPT, &scsi->flags); 719 718 set_bit(IDESCSI_TRANSFORM, &scsi->transform); ··· 721 722 set_bit(IDESCSI_LOG_CMD, &scsi->log); 722 723 #endif /* IDESCSI_DEBUG_LOG */ 723 724 idescsi_add_settings(drive); 724 - DRIVER(drive)->busy--; 725 725 } 726 726 727 - static int idescsi_cleanup (ide_drive_t *drive) 727 + static int ide_scsi_remove(struct device *dev) 728 728 { 729 + ide_drive_t *drive = to_ide_device(dev); 729 730 struct Scsi_Host *scsihost = drive->driver_data; 730 731 struct ide_scsi_obj *scsi = scsihost_to_idescsi(scsihost); 731 732 struct gendisk *g = scsi->disk; 732 733 733 - if (ide_unregister_subdriver(drive)) 734 - return 1; 734 + ide_unregister_subdriver(drive, scsi->driver); 735 735 736 736 ide_unregister_region(g); 737 737 ··· 744 746 return 0; 745 747 } 746 748 747 - static int idescsi_attach(ide_drive_t *drive); 749 + static int ide_scsi_probe(struct device *); 748 750 749 751 #ifdef CONFIG_PROC_FS 750 752 static ide_proc_entry_t idescsi_proc[] = { ··· 755 757 # define idescsi_proc NULL 756 758 #endif 757 759 758 - /* 759 - * IDE subdriver functions, registered with ide.c 760 - */ 761 760 static ide_driver_t idescsi_driver = { 762 761 .owner = THIS_MODULE, 763 - .name = "ide-scsi", 762 + .gen_driver = { 763 + .name = "ide-scsi", 764 + .bus = &ide_bus_type, 765 + .probe = ide_scsi_probe, 766 + .remove = ide_scsi_remove, 767 + }, 764 768 .version = IDESCSI_VERSION, 765 769 .media = ide_scsi, 766 - .busy = 0, 767 770 .supports_dsc_overlap = 0, 768 771 .proc = idescsi_proc, 769 - .attach = idescsi_attach, 770 - .cleanup = idescsi_cleanup, 771 772 .do_request = idescsi_do_request, 772 773 .end_request = idescsi_end_request, 773 774 .error = idescsi_atapi_error, 774 775 .abort = idescsi_atapi_abort, 775 - .drives = LIST_HEAD_INIT(idescsi_driver.drives), 776 776 }; 777 777 778 778 static int idescsi_ide_open(struct inode *inode, struct file *filp) ··· 816 820 .release = idescsi_ide_release, 817 821 .ioctl = idescsi_ide_ioctl, 818 822 }; 819 - 820 - static int idescsi_attach(ide_drive_t *drive); 821 823 822 824 static int idescsi_slave_configure(struct scsi_device * sdp) 823 825 { ··· 1089 1095 .proc_name = "ide-scsi", 1090 1096 }; 1091 1097 1092 - static int idescsi_attach(ide_drive_t *drive) 1098 + static int ide_scsi_probe(struct device *dev) 1093 1099 { 1100 + ide_drive_t *drive = to_ide_device(dev); 1094 1101 idescsi_scsi_t *idescsi; 1095 1102 struct Scsi_Host *host; 1096 1103 struct gendisk *g; ··· 1107 1112 !drive->present || 1108 1113 drive->media == ide_disk || 1109 1114 !(host = scsi_host_alloc(&idescsi_template,sizeof(idescsi_scsi_t)))) 1110 - return 1; 1115 + return -ENODEV; 1111 1116 1112 1117 g = alloc_disk(1 << PARTN_BITS); 1113 1118 if (!g) ··· 1133 1138 idescsi->host = host; 1134 1139 idescsi->disk = g; 1135 1140 g->private_data = &idescsi->driver; 1136 - err = ide_register_subdriver(drive, &idescsi_driver); 1141 + ide_register_subdriver(drive, &idescsi_driver); 1142 + err = 0; 1143 + idescsi_setup(drive, idescsi); 1144 + g->fops = &idescsi_ops; 1145 + ide_register_region(g); 1146 + err = scsi_add_host(host, &drive->gendev); 1137 1147 if (!err) { 1138 - idescsi_setup (drive, idescsi); 1139 - g->fops = &idescsi_ops; 1140 - ide_register_region(g); 1141 - err = scsi_add_host(host, &drive->gendev); 1142 - if (!err) { 1143 - scsi_scan_host(host); 1144 - return 0; 1145 - } 1146 - /* fall through on error */ 1147 - ide_unregister_region(g); 1148 - ide_unregister_subdriver(drive); 1148 + scsi_scan_host(host); 1149 + return 0; 1149 1150 } 1151 + /* fall through on error */ 1152 + ide_unregister_region(g); 1153 + ide_unregister_subdriver(drive, &idescsi_driver); 1150 1154 1151 1155 put_disk(g); 1152 1156 out_host_put: ··· 1155 1161 1156 1162 static int __init init_idescsi_module(void) 1157 1163 { 1158 - return ide_register_driver(&idescsi_driver); 1164 + return driver_register(&idescsi_driver.gen_driver); 1159 1165 } 1160 1166 1161 1167 static void __exit exit_idescsi_module(void) 1162 1168 { 1163 - ide_unregister_driver(&idescsi_driver); 1169 + driver_unregister(&idescsi_driver.gen_driver); 1164 1170 } 1165 1171 1166 1172 module_init(init_idescsi_module);
+4 -16
include/linux/ide.h
··· 664 664 665 665 struct request *rq; /* current request */ 666 666 struct ide_drive_s *next; /* circular list of hwgroup drives */ 667 - struct ide_driver_s *driver;/* (ide_driver_t *) */ 668 667 void *driver_data; /* extra driver data */ 669 668 struct hd_driveid *id; /* drive model identification info */ 670 669 struct proc_dir_entry *proc; /* /proc/ide/ directory entry */ ··· 756 757 struct device gendev; 757 758 struct semaphore gendev_rel_sem; /* to deal with device release() */ 758 759 } ide_drive_t; 760 + 761 + #define to_ide_device(dev)container_of(dev, ide_drive_t, gendev) 759 762 760 763 #define IDE_CHIPSET_PCI_MASK \ 761 764 ((1<<ide_pci)|(1<<ide_cmd646)|(1<<ide_ali14xx)) ··· 1087 1086 */ 1088 1087 typedef struct ide_driver_s { 1089 1088 struct module *owner; 1090 - const char *name; 1091 1089 const char *version; 1092 1090 u8 media; 1093 - unsigned busy : 1; 1094 1091 unsigned supports_dsc_overlap : 1; 1095 - int (*cleanup)(ide_drive_t *); 1096 1092 ide_startstop_t (*do_request)(ide_drive_t *, struct request *, sector_t); 1097 1093 int (*end_request)(ide_drive_t *, int, int); 1098 1094 ide_startstop_t (*error)(ide_drive_t *, struct request *rq, u8, u8); 1099 1095 ide_startstop_t (*abort)(ide_drive_t *, struct request *rq); 1100 1096 int (*ioctl)(ide_drive_t *, struct inode *, struct file *, unsigned int, unsigned long); 1101 1097 ide_proc_entry_t *proc; 1102 - int (*attach)(ide_drive_t *); 1103 1098 void (*ata_prebuilder)(ide_drive_t *); 1104 1099 void (*atapi_prebuilder)(ide_drive_t *); 1105 1100 struct device_driver gen_driver; 1106 - struct list_head drives; 1107 - struct list_head drivers; 1108 1101 } ide_driver_t; 1109 - 1110 - #define DRIVER(drive) ((drive)->driver) 1111 1102 1112 1103 int generic_ide_ioctl(ide_drive_t *, struct file *, struct block_device *, unsigned, unsigned long); 1113 1104 ··· 1321 1328 1322 1329 void ide_init_disk(struct gendisk *, ide_drive_t *); 1323 1330 1324 - extern int ata_attach(ide_drive_t *); 1325 - 1326 1331 extern int ideprobe_init(void); 1327 1332 1328 1333 extern void ide_scan_pcibus(int scan_direction) __init; ··· 1333 1342 extern void default_hwif_mmiops(ide_hwif_t *); 1334 1343 extern void default_hwif_transport(ide_hwif_t *); 1335 1344 1336 - int ide_register_driver(ide_driver_t *driver); 1337 - void ide_unregister_driver(ide_driver_t *driver); 1338 - int ide_register_subdriver(ide_drive_t *, ide_driver_t *); 1339 - int ide_unregister_subdriver (ide_drive_t *drive); 1340 - int ide_replace_subdriver(ide_drive_t *drive, const char *driver); 1345 + void ide_register_subdriver(ide_drive_t *, ide_driver_t *); 1346 + void ide_unregister_subdriver(ide_drive_t *, ide_driver_t *); 1341 1347 1342 1348 #define ON_BOARD 1 1343 1349 #define NEVER_BOARD 0