From: Bartlomiej Zolnierkiewicz - do not unregister ide-pnp driver during detaching random IDE device from random IDE device driver if IDE is modular (somebody added this in 2.3.51) - clear 'hw_regs_t hw' allocated from stack - mark idepnp_init() with __init - use ide_std_init_ports() instead of ide_setup_ports() Signed-off-by: Bartlomiej Zolnierkiewicz Signed-off-by: Andrew Morton --- 25-akpm/drivers/ide/ide-pnp.c | 36 +++++++----------------------------- 25-akpm/drivers/ide/ide.c | 13 ++++--------- 2 files changed, 11 insertions(+), 38 deletions(-) diff -puN drivers/ide/ide.c~ide-ide-pnp-update drivers/ide/ide.c --- 25/drivers/ide/ide.c~ide-ide-pnp-update Fri Jun 11 15:58:47 2004 +++ 25-akpm/drivers/ide/ide.c Fri Jun 11 15:58:47 2004 @@ -2026,6 +2026,7 @@ done: return 1; } +extern void pnpide_init(void); extern void h8300_ide_init(void); /* @@ -2092,12 +2093,9 @@ static void __init probe_for_hwifs (void buddha_init(); } #endif /* CONFIG_BLK_DEV_BUDDHA */ -#if defined(CONFIG_BLK_DEV_IDEPNP) && defined(CONFIG_PNP) - { - extern void pnpide_init(int enable); - pnpide_init(1); - } -#endif /* CONFIG_BLK_DEV_IDEPNP */ +#ifdef CONFIG_BLK_DEV_IDEPNP + pnpide_init(); +#endif #ifdef CONFIG_H8300 h8300_ide_init(); #endif @@ -2235,9 +2233,6 @@ int ide_unregister_subdriver (ide_drive_ up(&ide_setting_sem); return 1; } -#if defined(CONFIG_BLK_DEV_IDEPNP) && defined(CONFIG_PNP) && defined(MODULE) - pnpide_init(0); -#endif /* CONFIG_BLK_DEV_IDEPNP */ #ifdef CONFIG_PROC_FS ide_remove_proc_entries(drive->proc, DRIVER(drive)->proc); ide_remove_proc_entries(drive->proc, generic_subdriver_entries); diff -puN drivers/ide/ide-pnp.c~ide-ide-pnp-update drivers/ide/ide-pnp.c --- 25/drivers/ide/ide-pnp.c~ide-ide-pnp-update Fri Jun 11 15:58:47 2004 +++ 25-akpm/drivers/ide/ide-pnp.c Fri Jun 11 15:58:47 2004 @@ -16,25 +16,9 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include #include - #include - -#define GENERIC_HD_DATA 0 -#define GENERIC_HD_ERROR 1 -#define GENERIC_HD_NSECTOR 2 -#define GENERIC_HD_SECTOR 3 -#define GENERIC_HD_LCYL 4 -#define GENERIC_HD_HCYL 5 -#define GENERIC_HD_SELECT 6 -#define GENERIC_HD_STATUS 7 - -static int generic_ide_offsets[IDE_NR_PORTS] = { - GENERIC_HD_DATA, GENERIC_HD_ERROR, GENERIC_HD_NSECTOR, - GENERIC_HD_SECTOR, GENERIC_HD_LCYL, GENERIC_HD_HCYL, - GENERIC_HD_SELECT, GENERIC_HD_STATUS, -1, -1 -}; +#include /* Add your devices here :)) */ struct pnp_device_id idepnp_devices[] = { @@ -52,12 +36,10 @@ static int idepnp_probe(struct pnp_dev * if (!(pnp_port_valid(dev, 0) && pnp_port_valid(dev, 1) && pnp_irq_valid(dev, 0))) return -1; - ide_setup_ports(&hw, (unsigned long) pnp_port_start(dev, 0), - generic_ide_offsets, - (unsigned long) pnp_port_start(dev, 1), - 0, NULL, -// generic_pnp_ide_iops, - pnp_irq(dev, 0)); + memset(&hw, 0, sizeof(hw)); + ide_std_init_ports(&hw, pnp_port_start(dev, 0), + pnp_port_start(dev, 1)); + hw.irq = pnp_irq(dev, 0); index = ide_register_hw(&hw, &hwif); @@ -86,11 +68,7 @@ static struct pnp_driver idepnp_driver = .remove = idepnp_remove, }; - -void pnpide_init(int enable) +void __init pnpide_init(void) { - if(enable) - pnp_register_driver(&idepnp_driver); - else - pnp_unregister_driver(&idepnp_driver); + pnp_register_driver(&idepnp_driver); } _