Signed-off-by: Andrew Morton --- 25-akpm/drivers/bluetooth/bluecard_cs.c | 5 25-akpm/drivers/bluetooth/bt3c_cs.c | 5 25-akpm/drivers/bluetooth/btuart_cs.c | 5 25-akpm/drivers/bluetooth/dtl1_cs.c | 5 25-akpm/drivers/char/pcmcia/synclink_cs.c | 8 - 25-akpm/drivers/ide/legacy/ide-cs.c | 3 25-akpm/drivers/isdn/hardware/avm/avm_cs.c | 8 - 25-akpm/drivers/isdn/hisax/avma1_cs.c | 8 - 25-akpm/drivers/isdn/hisax/elsa_cs.c | 5 25-akpm/drivers/isdn/hisax/sedlbauer_cs.c | 8 - 25-akpm/drivers/isdn/hisax/teles_cs.c | 5 25-akpm/drivers/mtd/maps/pcmciamtd.c | 30 ----- 25-akpm/drivers/net/pcmcia/3c574_cs.c | 3 25-akpm/drivers/net/pcmcia/3c589_cs.c | 3 25-akpm/drivers/net/pcmcia/axnet_cs.c | 3 25-akpm/drivers/net/pcmcia/com20020_cs.c | 3 25-akpm/drivers/net/pcmcia/fmvj18x_cs.c | 3 25-akpm/drivers/net/pcmcia/ibmtr_cs.c | 3 25-akpm/drivers/net/pcmcia/nmclan_cs.c | 3 25-akpm/drivers/net/pcmcia/pcnet_cs.c | 3 25-akpm/drivers/net/pcmcia/smc91c92_cs.c | 3 25-akpm/drivers/net/pcmcia/xirc2ps_cs.c | 4 25-akpm/drivers/net/wireless/airo_cs.c | 8 - 25-akpm/drivers/net/wireless/atmel_cs.c | 8 - 25-akpm/drivers/net/wireless/netwave_cs.c | 4 25-akpm/drivers/net/wireless/orinoco_cs.c | 9 - 25-akpm/drivers/net/wireless/ray_cs.c | 3 25-akpm/drivers/net/wireless/wl3501_cs.c | 8 - 25-akpm/drivers/parport/parport_cs.c | 5 25-akpm/drivers/pcmcia/bulkmem.c | 1 25-akpm/drivers/pcmcia/cs.c | 19 --- 25-akpm/drivers/pcmcia/cs_internal.h | 14 -- 25-akpm/drivers/pcmcia/ds.c | 146 +++++++++++------------------ 25-akpm/drivers/scsi/pcmcia/aha152x_stub.c | 5 25-akpm/drivers/scsi/pcmcia/fdomain_stub.c | 5 25-akpm/drivers/scsi/pcmcia/nsp_cs.c | 4 25-akpm/drivers/scsi/pcmcia/qlogic_stub.c | 5 25-akpm/drivers/serial/serial_cs.c | 5 25-akpm/drivers/telephony/ixj_pcmcia.c | 5 25-akpm/include/pcmcia/ds.h | 15 ++ 25-akpm/include/pcmcia/ss.h | 1 25-akpm/sound/pcmcia/pdaudiocf/pdaudiocf.c | 11 -- 25-akpm/sound/pcmcia/vx/vx_entry.c | 10 - 25-akpm/sound/pcmcia/vx/vxpocket.c | 2 25-akpm/sound/pcmcia/vx/vxpocket.h | 1 45 files changed, 111 insertions(+), 309 deletions(-) diff -puN drivers/bluetooth/bluecard_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/bluetooth/bluecard_cs.c --- 25/drivers/bluetooth/bluecard_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.876441384 -0800 +++ 25-akpm/drivers/bluetooth/bluecard_cs.c 2004-11-30 01:23:21.946430744 -0800 @@ -1117,10 +1117,7 @@ static int __init init_bluecard_cs(void) static void __exit exit_bluecard_cs(void) { pcmcia_unregister_driver(&bluecard_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - bluecard_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_bluecard_cs); diff -puN drivers/bluetooth/bt3c_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/bluetooth/bt3c_cs.c --- 25/drivers/bluetooth/bt3c_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.877441232 -0800 +++ 25-akpm/drivers/bluetooth/bt3c_cs.c 2004-11-30 01:23:21.946430744 -0800 @@ -967,10 +967,7 @@ static int __init init_bt3c_cs(void) static void __exit exit_bt3c_cs(void) { pcmcia_unregister_driver(&bt3c_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - bt3c_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_bt3c_cs); diff -puN drivers/bluetooth/btuart_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/bluetooth/btuart_cs.c --- 25/drivers/bluetooth/btuart_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.879440928 -0800 +++ 25-akpm/drivers/bluetooth/btuart_cs.c 2004-11-30 01:23:21.947430592 -0800 @@ -887,10 +887,7 @@ static int __init init_btuart_cs(void) static void __exit exit_btuart_cs(void) { pcmcia_unregister_driver(&btuart_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - btuart_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_btuart_cs); diff -puN drivers/bluetooth/dtl1_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/bluetooth/dtl1_cs.c --- 25/drivers/bluetooth/dtl1_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.881440624 -0800 +++ 25-akpm/drivers/bluetooth/dtl1_cs.c 2004-11-30 01:23:21.948430440 -0800 @@ -839,10 +839,7 @@ static int __init init_dtl1_cs(void) static void __exit exit_dtl1_cs(void) { pcmcia_unregister_driver(&dtl1_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - dtl1_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_dtl1_cs); diff -puN drivers/char/pcmcia/synclink_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/char/pcmcia/synclink_cs.c --- 25/drivers/char/pcmcia/synclink_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.883440320 -0800 +++ 25-akpm/drivers/char/pcmcia/synclink_cs.c 2004-11-30 01:23:21.951429984 -0800 @@ -3147,13 +3147,7 @@ static void synclink_cs_cleanup(void) } pcmcia_unregister_driver(&mgslpc_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - mgslpc_release((u_long)dev_list); - mgslpc_detach(dev_list); - } + BUG_ON(dev_list != NULL); } static int __init synclink_cs_init(void) diff -puN drivers/ide/legacy/ide-cs.c~pcmcia-b18b-error-on-leftover-devices drivers/ide/legacy/ide-cs.c --- 25/drivers/ide/legacy/ide-cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.884440168 -0800 +++ 25-akpm/drivers/ide/legacy/ide-cs.c 2004-11-30 01:23:21.952429832 -0800 @@ -485,8 +485,7 @@ static int __init init_ide_cs(void) static void __exit exit_ide_cs(void) { pcmcia_unregister_driver(&ide_cs_driver); - while (dev_list != NULL) - ide_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_ide_cs); diff -puN drivers/isdn/hardware/avm/avm_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/isdn/hardware/avm/avm_cs.c --- 25/drivers/isdn/hardware/avm/avm_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.886439864 -0800 +++ 25-akpm/drivers/isdn/hardware/avm/avm_cs.c 2004-11-30 01:23:21.952429832 -0800 @@ -521,13 +521,7 @@ static int __init avmcs_init(void) static void __exit avmcs_exit(void) { pcmcia_unregister_driver(&avmcs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - avmcs_release(dev_list); - avmcs_detach(dev_list); - } + BUG_ON(dev_list != NULL); } module_init(avmcs_init); diff -puN drivers/isdn/hisax/avma1_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/isdn/hisax/avma1_cs.c --- 25/drivers/isdn/hisax/avma1_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.887439712 -0800 +++ 25-akpm/drivers/isdn/hisax/avma1_cs.c 2004-11-30 01:23:21.953429680 -0800 @@ -531,13 +531,7 @@ static int __init init_avma1_cs(void) static void __exit exit_avma1_cs(void) { pcmcia_unregister_driver(&avma1cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - avma1cs_release(dev_list); - avma1cs_detach(dev_list); - } + BUG_ON(dev_list != NULL); } module_init(init_avma1_cs); diff -puN drivers/isdn/hisax/elsa_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/isdn/hisax/elsa_cs.c --- 25/drivers/isdn/hisax/elsa_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.889439408 -0800 +++ 25-akpm/drivers/isdn/hisax/elsa_cs.c 2004-11-30 01:23:21.954429528 -0800 @@ -541,10 +541,7 @@ static int __init init_elsa_cs(void) static void __exit exit_elsa_cs(void) { pcmcia_unregister_driver(&elsa_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - elsa_cs_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_elsa_cs); diff -puN drivers/isdn/hisax/sedlbauer_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/isdn/hisax/sedlbauer_cs.c --- 25/drivers/isdn/hisax/sedlbauer_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.890439256 -0800 +++ 25-akpm/drivers/isdn/hisax/sedlbauer_cs.c 2004-11-30 01:23:21.954429528 -0800 @@ -648,13 +648,7 @@ static int __init init_sedlbauer_cs(void static void __exit exit_sedlbauer_cs(void) { pcmcia_unregister_driver(&sedlbauer_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - sedlbauer_release(dev_list); - sedlbauer_detach(dev_list); - } + BUG_ON(dev_list != NULL); } module_init(init_sedlbauer_cs); diff -puN drivers/isdn/hisax/teles_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/isdn/hisax/teles_cs.c --- 25/drivers/isdn/hisax/teles_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.892438952 -0800 +++ 25-akpm/drivers/isdn/hisax/teles_cs.c 2004-11-30 01:23:21.955429376 -0800 @@ -522,10 +522,7 @@ static int __init init_teles_cs(void) static void __exit exit_teles_cs(void) { pcmcia_unregister_driver(&teles_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - teles_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_teles_cs); diff -puN drivers/mtd/maps/pcmciamtd.c~pcmcia-b18b-error-on-leftover-devices drivers/mtd/maps/pcmciamtd.c --- 25/drivers/mtd/maps/pcmciamtd.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.893438800 -0800 +++ 25-akpm/drivers/mtd/maps/pcmciamtd.c 2004-11-30 01:23:21.956429224 -0800 @@ -854,35 +854,7 @@ static void __exit exit_pcmciamtd(void) { DEBUG(1, DRIVER_DESC " unloading"); pcmcia_unregister_driver(&pcmciamtd_driver); - - while(dev_list) { - dev_link_t *link = dev_list; - - dev_list = link->next; - if (link) { - struct pcmciamtd_dev *dev = link->priv; - - if(dev) { - if(link->state & DEV_PRESENT) { - if (!(link->state & DEV_STALE_LINK)) { - pcmciamtd_detach(link); - } - link->state &= ~DEV_PRESENT; - if(dev->mtd_info) { - del_mtd_device(dev->mtd_info); - info("mtd%d: Removed", - dev->mtd_info->index); - } - } - if(dev->mtd_info) { - DEBUG(2, "Destroying map for mtd%d", - dev->mtd_info->index); - map_destroy(dev->mtd_info); - } - kfree(dev); - } - } - } + BUG_ON(dev_list != NULL); } module_init(init_pcmciamtd); diff -puN drivers/net/pcmcia/3c574_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/3c574_cs.c --- 25/drivers/net/pcmcia/3c574_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.894438648 -0800 +++ 25-akpm/drivers/net/pcmcia/3c574_cs.c 2004-11-30 01:23:21.957429072 -0800 @@ -1308,8 +1308,7 @@ static int __init init_tc574(void) static void __exit exit_tc574(void) { pcmcia_unregister_driver(&tc574_driver); - while (dev_list != NULL) - tc574_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_tc574); diff -puN drivers/net/pcmcia/3c589_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/3c589_cs.c --- 25/drivers/net/pcmcia/3c589_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.896438344 -0800 +++ 25-akpm/drivers/net/pcmcia/3c589_cs.c 2004-11-30 01:23:21.958428920 -0800 @@ -1083,8 +1083,7 @@ static int __init init_tc589(void) static void __exit exit_tc589(void) { pcmcia_unregister_driver(&tc589_driver); - while (dev_list != NULL) - tc589_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_tc589); diff -puN drivers/net/pcmcia/axnet_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/axnet_cs.c --- 25/drivers/net/pcmcia/axnet_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.898438040 -0800 +++ 25-akpm/drivers/net/pcmcia/axnet_cs.c 2004-11-30 01:23:21.960428616 -0800 @@ -877,8 +877,7 @@ static int __init init_axnet_cs(void) static void __exit exit_axnet_cs(void) { pcmcia_unregister_driver(&axnet_cs_driver); - while (dev_list != NULL) - axnet_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_axnet_cs); diff -puN drivers/net/pcmcia/com20020_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/com20020_cs.c --- 25/drivers/net/pcmcia/com20020_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.899437888 -0800 +++ 25-akpm/drivers/net/pcmcia/com20020_cs.c 2004-11-30 01:23:21.960428616 -0800 @@ -513,8 +513,7 @@ static int __init init_com20020_cs(void) static void __exit exit_com20020_cs(void) { pcmcia_unregister_driver(&com20020_cs_driver); - while (dev_list != NULL) - com20020_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_com20020_cs); diff -puN drivers/net/pcmcia/fmvj18x_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/fmvj18x_cs.c --- 25/drivers/net/pcmcia/fmvj18x_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.900437736 -0800 +++ 25-akpm/drivers/net/pcmcia/fmvj18x_cs.c 2004-11-30 01:23:21.962428312 -0800 @@ -792,8 +792,7 @@ static int __init init_fmvj18x_cs(void) static void __exit exit_fmvj18x_cs(void) { pcmcia_unregister_driver(&fmvj18x_cs_driver); - while (dev_list != NULL) - fmvj18x_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_fmvj18x_cs); diff -puN drivers/net/pcmcia/ibmtr_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/ibmtr_cs.c --- 25/drivers/net/pcmcia/ibmtr_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.902437432 -0800 +++ 25-akpm/drivers/net/pcmcia/ibmtr_cs.c 2004-11-30 01:23:21.962428312 -0800 @@ -539,8 +539,7 @@ static int __init init_ibmtr_cs(void) static void __exit exit_ibmtr_cs(void) { pcmcia_unregister_driver(&ibmtr_cs_driver); - while (dev_list != NULL) - ibmtr_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_ibmtr_cs); diff -puN drivers/net/pcmcia/nmclan_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/nmclan_cs.c --- 25/drivers/net/pcmcia/nmclan_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.903437280 -0800 +++ 25-akpm/drivers/net/pcmcia/nmclan_cs.c 2004-11-30 01:23:21.963428160 -0800 @@ -1702,8 +1702,7 @@ static int __init init_nmclan_cs(void) static void __exit exit_nmclan_cs(void) { pcmcia_unregister_driver(&nmclan_cs_driver); - while (dev_list != NULL) - nmclan_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_nmclan_cs); diff -puN drivers/net/pcmcia/pcnet_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/pcnet_cs.c --- 25/drivers/net/pcmcia/pcnet_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.905436976 -0800 +++ 25-akpm/drivers/net/pcmcia/pcnet_cs.c 2004-11-30 01:23:21.965427856 -0800 @@ -1662,8 +1662,7 @@ static void __exit exit_pcnet_cs(void) { DEBUG(0, "pcnet_cs: unloading\n"); pcmcia_unregister_driver(&pcnet_driver); - while (dev_list != NULL) - pcnet_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_pcnet_cs); diff -puN drivers/net/pcmcia/smc91c92_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/smc91c92_cs.c --- 25/drivers/net/pcmcia/smc91c92_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.907436672 -0800 +++ 25-akpm/drivers/net/pcmcia/smc91c92_cs.c 2004-11-30 01:23:21.967427552 -0800 @@ -2263,8 +2263,7 @@ static int __init init_smc91c92_cs(void) static void __exit exit_smc91c92_cs(void) { pcmcia_unregister_driver(&smc91c92_cs_driver); - while (dev_list != NULL) - smc91c92_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_smc91c92_cs); diff -puN drivers/net/pcmcia/xirc2ps_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/pcmcia/xirc2ps_cs.c --- 25/drivers/net/pcmcia/xirc2ps_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.908436520 -0800 +++ 25-akpm/drivers/net/pcmcia/xirc2ps_cs.c 2004-11-30 01:23:21.968427400 -0800 @@ -2016,9 +2016,7 @@ static void __exit exit_xirc2ps_cs(void) { pcmcia_unregister_driver(&xirc2ps_cs_driver); - - while (dev_list) - xirc2ps_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_xirc2ps_cs); diff -puN drivers/net/wireless/airo_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/airo_cs.c --- 25/drivers/net/wireless/airo_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.910436216 -0800 +++ 25-akpm/drivers/net/wireless/airo_cs.c 2004-11-30 01:23:21.969427248 -0800 @@ -592,13 +592,7 @@ static int airo_cs_init(void) static void airo_cs_cleanup(void) { pcmcia_unregister_driver(&airo_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - airo_release(dev_list); - airo_detach(dev_list); - } + BUG_ON(dev_list != NULL); } /* diff -puN drivers/net/wireless/atmel_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/atmel_cs.c --- 25/drivers/net/wireless/atmel_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.911436064 -0800 +++ 25-akpm/drivers/net/wireless/atmel_cs.c 2004-11-30 01:23:21.970427096 -0800 @@ -693,13 +693,7 @@ static int atmel_cs_init(void) static void atmel_cs_cleanup(void) { pcmcia_unregister_driver(&atmel_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - atmel_release(dev_list); - atmel_detach(dev_list); - } + BUG_ON(dev_list != NULL); } /* diff -puN drivers/net/wireless/netwave_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/netwave_cs.c --- 25/drivers/net/wireless/netwave_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.913435760 -0800 +++ 25-akpm/drivers/net/wireless/netwave_cs.c 2004-11-30 01:23:21.971426944 -0800 @@ -1696,9 +1696,7 @@ static int __init init_netwave_cs(void) static void __exit exit_netwave_cs(void) { pcmcia_unregister_driver(&netwave_driver); - - if (dev_list != NULL) /* Critical situation */ - printk("netwave_cs: devices remaining when removing module\n"); + BUG_ON(dev_list != NULL); } module_init(init_netwave_cs); diff -puN drivers/net/wireless/orinoco_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/orinoco_cs.c --- 25/drivers/net/wireless/orinoco_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.914435608 -0800 +++ 25-akpm/drivers/net/wireless/orinoco_cs.c 2004-11-30 01:23:21.972426792 -0800 @@ -659,14 +659,7 @@ static void __exit exit_orinoco_cs(void) { pcmcia_unregister_driver(&orinoco_driver); - - if (dev_list) - DEBUG(0, PFX "Removing leftover devices.\n"); - while (dev_list != NULL) { - if (dev_list->state & DEV_CONFIG) - orinoco_cs_release(dev_list); - orinoco_cs_detach(dev_list); - } + BUG_ON(dev_list != NULL); } module_init(init_orinoco_cs); diff -puN drivers/net/wireless/ray_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/ray_cs.c --- 25/drivers/net/wireless/ray_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.916435304 -0800 +++ 25-akpm/drivers/net/wireless/ray_cs.c 2004-11-30 01:23:21.975426336 -0800 @@ -2952,8 +2952,7 @@ static void __exit exit_ray_cs(void) #endif pcmcia_unregister_driver(&ray_driver); - while (dev_list != NULL) - ray_detach(dev_list); + BUG_ON(dev_list != NULL); } /* exit_ray_cs */ module_init(init_ray_cs); diff -puN drivers/net/wireless/wl3501_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/net/wireless/wl3501_cs.c --- 25/drivers/net/wireless/wl3501_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.918435000 -0800 +++ 25-akpm/drivers/net/wireless/wl3501_cs.c 2004-11-30 01:23:21.976426184 -0800 @@ -2267,13 +2267,7 @@ static void __exit wl3501_exit_module(vo { dprintk(0, ": unloading"); pcmcia_unregister_driver(&wl3501_driver); - while (wl3501_dev_list) { - /* Mark the device as non-existing to minimize calls to card */ - wl3501_dev_list->state &= ~DEV_PRESENT; - if (wl3501_dev_list->state & DEV_CONFIG) - wl3501_release(wl3501_dev_list); - wl3501_detach(wl3501_dev_list); - } + BUG_ON(wl3501_dev_list != NULL); } module_init(wl3501_init_module); diff -puN drivers/parport/parport_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/parport/parport_cs.c --- 25/drivers/parport/parport_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.919434848 -0800 +++ 25-akpm/drivers/parport/parport_cs.c 2004-11-30 01:23:21.977426032 -0800 @@ -401,10 +401,7 @@ static int __init init_parport_cs(void) static void __exit exit_parport_cs(void) { pcmcia_unregister_driver(&parport_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - parport_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_parport_cs); diff -puN drivers/pcmcia/bulkmem.c~pcmcia-b18b-error-on-leftover-devices drivers/pcmcia/bulkmem.c --- 25/drivers/pcmcia/bulkmem.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.920434696 -0800 +++ 25-akpm/drivers/pcmcia/bulkmem.c 2004-11-30 01:23:21.977426032 -0800 @@ -27,6 +27,7 @@ #include #include #include +#include #include "cs_internal.h" #ifdef DEBUG diff -puN drivers/pcmcia/cs.c~pcmcia-b18b-error-on-leftover-devices drivers/pcmcia/cs.c --- 25/drivers/pcmcia/cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.922434392 -0800 +++ 25-akpm/drivers/pcmcia/cs.c 2004-11-30 01:23:21.979425728 -0800 @@ -41,6 +41,7 @@ #include #include #include +#include #include "cs_internal.h" #ifdef CONFIG_PCI @@ -198,13 +199,6 @@ EXPORT_SYMBOL(pcmcia_put_socket); static void pcmcia_release_socket(struct class_device *class_dev) { struct pcmcia_socket *socket = class_get_devdata(class_dev); - client_t *client; - - while (socket->clients) { - client = socket->clients; - socket->clients = socket->clients->next; - kfree(client); - } complete(&socket->socket_released); } @@ -357,8 +351,6 @@ static void free_regions(memory_handle_t static void shutdown_socket(struct pcmcia_socket *s) { - client_t **c; - cs_dbg(s, 1, "shutdown_socket\n"); /* Blank out the socket state */ @@ -376,15 +368,6 @@ static void shutdown_socket(struct pcmci kfree(s->config); s->config = NULL; } - for (c = &s->clients; *c; ) { - if ((*c)->state & CLIENT_UNBOUND) { - client_t *d = *c; - *c = (*c)->next; - kfree(d); - } else { - c = &((*c)->next); - } - } free_regions(&s->a_region); free_regions(&s->c_region); diff -puN drivers/pcmcia/cs_internal.h~pcmcia-b18b-error-on-leftover-devices drivers/pcmcia/cs_internal.h --- 25/drivers/pcmcia/cs_internal.h~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.923434240 -0800 +++ 25-akpm/drivers/pcmcia/cs_internal.h 2004-11-30 01:23:21.979425728 -0800 @@ -18,19 +18,7 @@ #include #define CLIENT_MAGIC 0x51E6 -typedef struct client_t { - u_short client_magic; - struct pcmcia_socket *Socket; - u_char Function; - dev_info_t dev_info; - u_int Attributes; - u_int state; - event_t EventMask, PendingEvents; - int (*event_handler)(event_t event, int priority, - event_callback_args_t *); - event_callback_args_t event_callback_args; - struct client_t *next; -} client_t; +typedef struct client_t client_t; /* Flags in client state */ #define CLIENT_CONFIG_LOCKED 0x0001 diff -puN drivers/pcmcia/ds.c~pcmcia-b18b-error-on-leftover-devices drivers/pcmcia/ds.c --- 25/drivers/pcmcia/ds.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.925433936 -0800 +++ 25-akpm/drivers/pcmcia/ds.c 2004-11-30 01:23:21.982425272 -0800 @@ -353,6 +353,7 @@ static void pcmcia_put_dev(struct pcmcia static void pcmcia_release_dev(struct device *dev) { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); + ds_dbg(1, "releasing dev %p\n", p_dev); pcmcia_put_bus_socket(p_dev->socket->pcmcia); kfree(p_dev); } @@ -426,11 +427,11 @@ static int send_event_callback(struct de if (p_dev->socket != data->skt) return 0; - if (p_dev->client->state & (CLIENT_UNBOUND|CLIENT_STALE)) + if (p_dev->client.state & (CLIENT_UNBOUND|CLIENT_STALE)) return 0; - if (p_dev->client->EventMask & data->event) - return EVENT(p_dev->client, data->event, data->priority); + if (p_dev->client.EventMask & data->event) + return EVENT(&p_dev->client, data->event, data->priority); return 0; } @@ -556,10 +557,10 @@ static int bind_request(struct pcmcia_bu { struct pcmcia_driver *p_drv; struct pcmcia_device *p_dev, *tmp_dev; - client_t *client; unsigned long flags; int ret = 0; + s = pcmcia_get_bus_socket(s); if (!s) return -EINVAL; @@ -567,25 +568,15 @@ static int bind_request(struct pcmcia_bu (char *)bind_info->dev_info); p_drv = get_pcmcia_driver(&bind_info->dev_info); - if (!p_drv) - return -EINVAL; - - if (!try_module_get(p_drv->owner)) - return -EINVAL; - - client = (client_t *) kmalloc(sizeof(client_t), GFP_KERNEL); - if (!client) { - ret = -ENOMEM; + if (!p_drv) { + ret = -EINVAL; goto err_put; } - memset(client, 0, sizeof(client_t)); - client->client_magic = CLIENT_MAGIC; - client->Socket = s->parent; - client->Function = bind_info->function; - client->state = CLIENT_UNBOUND; - client->next = s->parent->clients; - strlcpy(client->dev_info, p_drv->drv.name, DEV_NAME_LEN); + if (!try_module_get(p_drv->owner)) { + ret = -EINVAL; + goto err_put_driver; + } /* Currently, the userspace pcmcia cardmgr detects pcmcia devices. * Here this information is translated into a kernel @@ -595,20 +586,12 @@ static int bind_request(struct pcmcia_bu p_dev = kmalloc(sizeof(struct pcmcia_device), GFP_KERNEL); if (!p_dev) { ret = -ENOMEM; - goto err_free_client; + goto err_put_module; } memset(p_dev, 0, sizeof(struct pcmcia_device)); - s = pcmcia_get_bus_socket(s); - if (!s) { - ret = -ENODEV; - kfree(p_dev); - goto err_free_client; - } - p_dev->socket = s->parent; p_dev->func = bind_info->function; - p_dev->client = client; p_dev->dev.bus = &pcmcia_bus_type; p_dev->dev.parent = s->parent->dev.dev; @@ -616,11 +599,17 @@ static int bind_request(struct pcmcia_bu sprintf (p_dev->dev.bus_id, "pcmcia%d.%d", p_dev->socket->sock, p_dev->func); p_dev->dev.driver = &p_drv->drv; + /* compat */ + p_dev->client.client_magic = CLIENT_MAGIC; + p_dev->client.Socket = s->parent; + p_dev->client.Function = bind_info->function; + p_dev->client.state = CLIENT_UNBOUND; + strlcpy(p_dev->client.dev_info, p_drv->drv.name, DEV_NAME_LEN); + ret = device_register(&p_dev->dev); if (ret) { kfree(p_dev); - pcmcia_put_bus_socket(s); - goto err_free_client; + goto err_put_module; } /* @@ -640,28 +629,32 @@ static int bind_request(struct pcmcia_bu list_add_tail(&p_dev->socket_device_list, &s->devices_list); spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); - /* finally here the parent client is registered */ - s->parent->clients = client; - if (p_drv->attach) { p_dev->instance = p_drv->attach(); - if (!p_dev->instance) { + if ((!p_dev->instance) || (p_dev->client.state & CLIENT_UNBOUND)) { printk(KERN_NOTICE "ds: unable to create instance " "of '%s'!\n", (char *)bind_info->dev_info); - /* FIXME: client isn't freed here */ ret = -ENODEV; goto err_unregister; } } - + + put_driver(&p_drv->drv); + return 0; err_unregister: device_unregister(&p_dev->dev); - err_free_client: - kfree(client); - err_put: module_put(p_drv->owner); + put_driver(&p_drv->drv); + return (ret); + + err_put_module: + module_put(p_drv->owner); + err_put_driver: + put_driver(&p_drv->drv); + err_put: + pcmcia_put_bus_socket(s); return (ret); } /* bind_request */ @@ -688,11 +681,11 @@ int pcmcia_register_client(client_handle continue; spin_lock_irqsave(&pcmcia_dev_list_lock, flags); list_for_each_entry(p_dev, &skt->devices_list, socket_device_list) { - if ((p_dev->client->state & CLIENT_UNBOUND) && - (!strcmp(p_dev->client->dev_info, (char *)req->dev_info))) { + if ((p_dev->client.state & CLIENT_UNBOUND) && + (!strcmp(p_dev->client.dev_info, (char *)req->dev_info))) { p_dev = pcmcia_get_dev(p_dev); if (p_dev) - client = p_dev->client; + client = &p_dev->client; spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); goto found; } @@ -751,7 +744,6 @@ int pcmcia_register_client(client_handle } up(&s->skt_sem); - pcmcia_put_dev(p_dev); /* FIXME: put in deregister_client. */ return CS_SUCCESS; out_no_resource: @@ -873,7 +865,7 @@ static int unbind_request(struct pcmcia_ } p_dev = list_entry((&s->devices_list)->next, struct pcmcia_device, socket_device_list); list_del(&p_dev->socket_device_list); - p_dev->client->state |= CLIENT_STALE; + p_dev->client.state |= CLIENT_STALE; spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags); /* detach the "instance" */ @@ -892,10 +884,9 @@ static int unbind_request(struct pcmcia_ int pcmcia_deregister_client(client_handle_t handle) { - client_t **client; struct pcmcia_socket *s; - u_long flags; int i; + struct pcmcia_device *p_dev = handle_to_pdev(handle); if (CHECK_HANDLE(handle)) return CS_BAD_HANDLE; @@ -903,33 +894,25 @@ int pcmcia_deregister_client(client_hand s = SOCKET(handle); ds_dbg(1, "deregister_client(%p)\n", handle); - if (handle->state & - (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED)) - return CS_IN_USE; + if (handle->state & (CLIENT_IRQ_REQ|CLIENT_IO_REQ|CLIENT_CONFIG_LOCKED)) + goto warn_out; for (i = 0; i < MAX_WIN; i++) if (handle->state & CLIENT_WIN_REQ(i)) - return CS_IN_USE; + goto warn_out; - if ((handle->state & CLIENT_STALE) || - (handle->Attributes & INFO_MASTER_CLIENT)) { - spin_lock_irqsave(&s->lock, flags); - client = &s->clients; - while ((*client) && ((*client) != handle)) - client = &(*client)->next; - if (*client == NULL) { - spin_unlock_irqrestore(&s->lock, flags); - return CS_BAD_HANDLE; - } - *client = handle->next; + if (handle->state & CLIENT_STALE) { handle->client_magic = 0; - kfree(handle); - spin_unlock_irqrestore(&s->lock, flags); + handle->state &= ~CLIENT_STALE; + pcmcia_put_dev(p_dev); } else { handle->state = CLIENT_UNBOUND; handle->event_handler = NULL; } return CS_SUCCESS; + warn_out: + printk(KERN_WARNING "ds: deregister_client was called too early.\n"); + return CS_IN_USE; } /* deregister_client */ EXPORT_SYMBOL(pcmcia_deregister_client); @@ -1441,33 +1424,18 @@ static struct pcmcia_bus_socket * get_so /* backwards-compatible accessing of driver --- by name! */ -struct cmp_data { - void *dev_info; - struct pcmcia_driver *drv; -}; - -static int cmp_drv_callback(struct device_driver *drv, void *data) -{ - struct cmp_data *cmp = data; - if (strncmp((char *)cmp->dev_info, (char *)drv->name, - DEV_NAME_LEN) == 0) { - cmp->drv = container_of(drv, struct pcmcia_driver, drv); - return -EINVAL; - } - return 0; -} - static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info) { - int ret; - struct cmp_data cmp = { - .dev_info = dev_info, - }; - - ret = bus_for_each_drv(&pcmcia_bus_type, NULL, &cmp, cmp_drv_callback); - if (ret) - return cmp.drv; - return NULL; + struct device_driver *drv; + struct pcmcia_driver *p_drv; + + drv = driver_find((char *) dev_info, &pcmcia_bus_type); + if (!drv) + return NULL; + + p_drv = container_of(drv, struct pcmcia_driver, drv); + + return (p_drv); } MODULE_ALIAS("ds"); diff -puN drivers/scsi/pcmcia/aha152x_stub.c~pcmcia-b18b-error-on-leftover-devices drivers/scsi/pcmcia/aha152x_stub.c --- 25/drivers/scsi/pcmcia/aha152x_stub.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.926433784 -0800 +++ 25-akpm/drivers/scsi/pcmcia/aha152x_stub.c 2004-11-30 01:23:21.982425272 -0800 @@ -347,10 +347,7 @@ static int __init init_aha152x_cs(void) static void __exit exit_aha152x_cs(void) { pcmcia_unregister_driver(&aha152x_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - aha152x_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_aha152x_cs); diff -puN drivers/scsi/pcmcia/fdomain_stub.c~pcmcia-b18b-error-on-leftover-devices drivers/scsi/pcmcia/fdomain_stub.c --- 25/drivers/scsi/pcmcia/fdomain_stub.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.928433480 -0800 +++ 25-akpm/drivers/scsi/pcmcia/fdomain_stub.c 2004-11-30 01:23:21.983425120 -0800 @@ -328,10 +328,7 @@ static int __init init_fdomain_cs(void) static void __exit exit_fdomain_cs(void) { pcmcia_unregister_driver(&fdomain_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - fdomain_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_fdomain_cs); diff -puN drivers/scsi/pcmcia/nsp_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/scsi/pcmcia/nsp_cs.c --- 25/drivers/scsi/pcmcia/nsp_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.929433328 -0800 +++ 25-akpm/drivers/scsi/pcmcia/nsp_cs.c 2004-11-30 01:23:21.985424816 -0800 @@ -2194,10 +2194,9 @@ static void __exit nsp_cs_exit(void) #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) pcmcia_unregister_driver(&nsp_driver); + BUG_ON(dev_list != NULL); #else unregister_pcmcia_driver(&dev_info); -#endif - /* XXX: this really needs to move into generic code.. */ while (dev_list != NULL) { if (dev_list->state & DEV_CONFIG) { @@ -2205,6 +2204,7 @@ static void __exit nsp_cs_exit(void) } nsp_cs_detach(dev_list); } +#endif } diff -puN drivers/scsi/pcmcia/qlogic_stub.c~pcmcia-b18b-error-on-leftover-devices drivers/scsi/pcmcia/qlogic_stub.c --- 25/drivers/scsi/pcmcia/qlogic_stub.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.931433024 -0800 +++ 25-akpm/drivers/scsi/pcmcia/qlogic_stub.c 2004-11-30 01:23:21.985424816 -0800 @@ -432,10 +432,7 @@ static int __init init_qlogic_cs(void) static void __exit exit_qlogic_cs(void) { pcmcia_unregister_driver(&qlogic_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - qlogic_detach(dev_list); + BUG_ON(dev_list != NULL); } MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); diff -puN drivers/serial/serial_cs.c~pcmcia-b18b-error-on-leftover-devices drivers/serial/serial_cs.c --- 25/drivers/serial/serial_cs.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.932432872 -0800 +++ 25-akpm/drivers/serial/serial_cs.c 2004-11-30 01:23:21.986424664 -0800 @@ -749,10 +749,7 @@ static int __init init_serial_cs(void) static void __exit exit_serial_cs(void) { pcmcia_unregister_driver(&serial_cs_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - serial_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(init_serial_cs); diff -puN drivers/telephony/ixj_pcmcia.c~pcmcia-b18b-error-on-leftover-devices drivers/telephony/ixj_pcmcia.c --- 25/drivers/telephony/ixj_pcmcia.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.933432720 -0800 +++ 25-akpm/drivers/telephony/ixj_pcmcia.c 2004-11-30 01:23:21.986424664 -0800 @@ -313,10 +313,7 @@ static int __init ixj_pcmcia_init(void) static void ixj_pcmcia_exit(void) { pcmcia_unregister_driver(&ixj_driver); - - /* XXX: this really needs to move into generic code.. */ - while (dev_list != NULL) - ixj_detach(dev_list); + BUG_ON(dev_list != NULL); } module_init(ixj_pcmcia_init); diff -puN include/pcmcia/ds.h~pcmcia-b18b-error-on-leftover-devices include/pcmcia/ds.h --- 25/include/pcmcia/ds.h~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.935432416 -0800 +++ 25-akpm/include/pcmcia/ds.h 2004-11-30 01:23:21.987424512 -0800 @@ -128,7 +128,6 @@ typedef struct dev_link_t { struct pcmcia_socket; -struct client_t; extern struct bus_type pcmcia_bus_type; @@ -154,7 +153,18 @@ struct pcmcia_device { /* deprecated, a cleaned up version will be moved into this struct soon */ dev_link_t *instance; - struct client_t *client; + struct client_t { + u_short client_magic; + struct pcmcia_socket *Socket; + u_char Function; + dev_info_t dev_info; + u_int Attributes; + u_int state; + event_t EventMask, PendingEvents; + int (*event_handler) (event_t event, int priority, + event_callback_args_t *); + event_callback_args_t event_callback_args; + } client; struct device dev; }; @@ -162,6 +172,7 @@ struct pcmcia_device { #define to_pcmcia_dev(n) container_of(n, struct pcmcia_device, dev) #define to_pcmcia_drv(n) container_of(n, struct pcmcia_driver, drv) +#define handle_to_pdev(handle) container_of(handle, struct pcmcia_device, client); /* error reporting */ void cs_error(client_handle_t handle, int func, int ret); diff -puN include/pcmcia/ss.h~pcmcia-b18b-error-on-leftover-devices include/pcmcia/ss.h --- 25/include/pcmcia/ss.h~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.936432264 -0800 +++ 25-akpm/include/pcmcia/ss.h 2004-11-30 01:23:21.987424512 -0800 @@ -153,7 +153,6 @@ struct pcmcia_socket { u_int state; u_short functions; u_short lock_count; - client_handle_t clients; pccard_mem_map cis_mem; void __iomem *cis_virt; struct config_t *config; diff -puN sound/pcmcia/pdaudiocf/pdaudiocf.c~pcmcia-b18b-error-on-leftover-devices sound/pcmcia/pdaudiocf/pdaudiocf.c --- 25/sound/pcmcia/pdaudiocf/pdaudiocf.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.938431960 -0800 +++ 25-akpm/sound/pcmcia/pdaudiocf/pdaudiocf.c 2004-11-30 01:23:21.988424360 -0800 @@ -274,15 +274,6 @@ static void snd_pdacf_detach(dev_link_t } /* - * snd_pdacf_detach_all - detach all instances linked to the hw - */ -static void snd_pdacf_detach_all(void) -{ - while (dev_list != NULL) - snd_pdacf_detach(dev_list); -} - -/* * configuration callback */ @@ -413,7 +404,7 @@ static int __init init_pdacf(void) static void __exit exit_pdacf(void) { pcmcia_unregister_driver(&pdacf_cs_driver); - snd_pdacf_detach_all(); + BUG_ON(dev_list != NULL); } module_init(init_pdacf); diff -puN sound/pcmcia/vx/vx_entry.c~pcmcia-b18b-error-on-leftover-devices sound/pcmcia/vx/vx_entry.c --- 25/sound/pcmcia/vx/vx_entry.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.939431808 -0800 +++ 25-akpm/sound/pcmcia/vx/vx_entry.c 2004-11-30 01:23:21.989424208 -0800 @@ -245,15 +245,6 @@ void snd_vxpocket_detach(struct snd_vxp_ } /* - * snd_vxpocket_detach_all - detach all instances linked to the hw - */ -void snd_vxpocket_detach_all(struct snd_vxp_entry *hw) -{ - while (hw->dev_list != NULL) - snd_vxpocket_detach(hw, hw->dev_list); -} - -/* * configuration callback */ @@ -373,4 +364,3 @@ static int vxpocket_event(event_t event, EXPORT_SYMBOL(snd_vxpocket_ops); EXPORT_SYMBOL(snd_vxpocket_attach); EXPORT_SYMBOL(snd_vxpocket_detach); -EXPORT_SYMBOL(snd_vxpocket_detach_all); diff -puN sound/pcmcia/vx/vxpocket.c~pcmcia-b18b-error-on-leftover-devices sound/pcmcia/vx/vxpocket.c --- 25/sound/pcmcia/vx/vxpocket.c~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.940431656 -0800 +++ 25-akpm/sound/pcmcia/vx/vxpocket.c 2004-11-30 01:23:21.989424208 -0800 @@ -165,7 +165,7 @@ static int __init init_vxpocket(void) static void __exit exit_vxpocket(void) { pcmcia_unregister_driver(&vxp_cs_driver); - snd_vxpocket_detach_all(&hw_entry); + BUG_ON(hw_entry.dev_list != NULL); } module_init(init_vxpocket); diff -puN sound/pcmcia/vx/vxpocket.h~pcmcia-b18b-error-on-leftover-devices sound/pcmcia/vx/vxpocket.h --- 25/sound/pcmcia/vx/vxpocket.h~pcmcia-b18b-error-on-leftover-devices 2004-11-30 01:23:21.942431352 -0800 +++ 25-akpm/sound/pcmcia/vx/vxpocket.h 2004-11-30 01:23:21.989424208 -0800 @@ -77,7 +77,6 @@ void vx_set_mic_level(vx_core_t *chip, i */ dev_link_t *snd_vxpocket_attach(struct snd_vxp_entry *hw); void snd_vxpocket_detach(struct snd_vxp_entry *hw, dev_link_t *link); -void snd_vxpocket_detach_all(struct snd_vxp_entry *hw); int vxp_add_mic_controls(vx_core_t *chip); _