diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2005-11-14 15:25:35 -0500 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-01-05 18:03:20 -0500 |
commit | b463581154f3f3eecda27cae60df813fefcd84d3 (patch) | |
tree | 5e5b0f7a32b0727b64e52b9b2649897e6c841074 | |
parent | f3990715589d378a2d3aa9b8accd78bb4a2378b7 (diff) |
[PATCH] pcmcia: remove dev_list from drivers
The linked list of devices managed by each PCMCIA driver is, in very most
cases, unused. Therefore, remove it from many drivers.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
38 files changed, 78 insertions, 651 deletions
diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index f5088cb3812b..bd80535646fa 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c | |||
@@ -94,8 +94,6 @@ static dev_info_t dev_info = "bluecard_cs"; | |||
94 | static dev_link_t *bluecard_attach(void); | 94 | static dev_link_t *bluecard_attach(void); |
95 | static void bluecard_detach(struct pcmcia_device *p_dev); | 95 | static void bluecard_detach(struct pcmcia_device *p_dev); |
96 | 96 | ||
97 | static dev_link_t *dev_list = NULL; | ||
98 | |||
99 | 97 | ||
100 | /* Default baud rate: 57600, 115200, 230400 or 460800 */ | 98 | /* Default baud rate: 57600, 115200, 230400 or 460800 */ |
101 | #define DEFAULT_BAUD_RATE 230400 | 99 | #define DEFAULT_BAUD_RATE 230400 |
@@ -890,8 +888,7 @@ static dev_link_t *bluecard_attach(void) | |||
890 | link->conf.IntType = INT_MEMORY_AND_IO; | 888 | link->conf.IntType = INT_MEMORY_AND_IO; |
891 | 889 | ||
892 | /* Register with Card Services */ | 890 | /* Register with Card Services */ |
893 | link->next = dev_list; | 891 | link->next = NULL; |
894 | dev_list = link; | ||
895 | client_reg.dev_info = &dev_info; | 892 | client_reg.dev_info = &dev_info; |
896 | client_reg.Version = 0x0210; | 893 | client_reg.Version = 0x0210; |
897 | client_reg.event_callback_args.client_data = link; | 894 | client_reg.event_callback_args.client_data = link; |
@@ -911,22 +908,10 @@ static void bluecard_detach(struct pcmcia_device *p_dev) | |||
911 | { | 908 | { |
912 | dev_link_t *link = dev_to_instance(p_dev); | 909 | dev_link_t *link = dev_to_instance(p_dev); |
913 | bluecard_info_t *info = link->priv; | 910 | bluecard_info_t *info = link->priv; |
914 | dev_link_t **linkp; | ||
915 | |||
916 | /* Locate device structure */ | ||
917 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
918 | if (*linkp == link) | ||
919 | break; | ||
920 | |||
921 | if (*linkp == NULL) | ||
922 | return; | ||
923 | 911 | ||
924 | if (link->state & DEV_CONFIG) | 912 | if (link->state & DEV_CONFIG) |
925 | bluecard_release(link); | 913 | bluecard_release(link); |
926 | 914 | ||
927 | /* Unlink device structure, free bits */ | ||
928 | *linkp = link->next; | ||
929 | |||
930 | kfree(info); | 915 | kfree(info); |
931 | } | 916 | } |
932 | 917 | ||
@@ -1105,7 +1090,6 @@ static int __init init_bluecard_cs(void) | |||
1105 | static void __exit exit_bluecard_cs(void) | 1090 | static void __exit exit_bluecard_cs(void) |
1106 | { | 1091 | { |
1107 | pcmcia_unregister_driver(&bluecard_driver); | 1092 | pcmcia_unregister_driver(&bluecard_driver); |
1108 | BUG_ON(dev_list != NULL); | ||
1109 | } | 1093 | } |
1110 | 1094 | ||
1111 | module_init(init_bluecard_cs); | 1095 | module_init(init_bluecard_cs); |
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 02ce38e33d32..50aa52b3cd20 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
@@ -97,8 +97,6 @@ static dev_info_t dev_info = "bt3c_cs"; | |||
97 | static dev_link_t *bt3c_attach(void); | 97 | static dev_link_t *bt3c_attach(void); |
98 | static void bt3c_detach(struct pcmcia_device *p_dev); | 98 | static void bt3c_detach(struct pcmcia_device *p_dev); |
99 | 99 | ||
100 | static dev_link_t *dev_list = NULL; | ||
101 | |||
102 | 100 | ||
103 | /* Transmit states */ | 101 | /* Transmit states */ |
104 | #define XMIT_SENDING 1 | 102 | #define XMIT_SENDING 1 |
@@ -691,8 +689,7 @@ static dev_link_t *bt3c_attach(void) | |||
691 | link->conf.IntType = INT_MEMORY_AND_IO; | 689 | link->conf.IntType = INT_MEMORY_AND_IO; |
692 | 690 | ||
693 | /* Register with Card Services */ | 691 | /* Register with Card Services */ |
694 | link->next = dev_list; | 692 | link->next = NULL; |
695 | dev_list = link; | ||
696 | client_reg.dev_info = &dev_info; | 693 | client_reg.dev_info = &dev_info; |
697 | client_reg.Version = 0x0210; | 694 | client_reg.Version = 0x0210; |
698 | client_reg.event_callback_args.client_data = link; | 695 | client_reg.event_callback_args.client_data = link; |
@@ -712,22 +709,10 @@ static void bt3c_detach(struct pcmcia_device *p_dev) | |||
712 | { | 709 | { |
713 | dev_link_t *link = dev_to_instance(p_dev); | 710 | dev_link_t *link = dev_to_instance(p_dev); |
714 | bt3c_info_t *info = link->priv; | 711 | bt3c_info_t *info = link->priv; |
715 | dev_link_t **linkp; | ||
716 | |||
717 | /* Locate device structure */ | ||
718 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
719 | if (*linkp == link) | ||
720 | break; | ||
721 | |||
722 | if (*linkp == NULL) | ||
723 | return; | ||
724 | 712 | ||
725 | if (link->state & DEV_CONFIG) | 713 | if (link->state & DEV_CONFIG) |
726 | bt3c_release(link); | 714 | bt3c_release(link); |
727 | 715 | ||
728 | /* Unlink device structure, free bits */ | ||
729 | *linkp = link->next; | ||
730 | |||
731 | kfree(info); | 716 | kfree(info); |
732 | } | 717 | } |
733 | 718 | ||
@@ -949,7 +934,6 @@ static int __init init_bt3c_cs(void) | |||
949 | static void __exit exit_bt3c_cs(void) | 934 | static void __exit exit_bt3c_cs(void) |
950 | { | 935 | { |
951 | pcmcia_unregister_driver(&bt3c_driver); | 936 | pcmcia_unregister_driver(&bt3c_driver); |
952 | BUG_ON(dev_list != NULL); | ||
953 | } | 937 | } |
954 | 938 | ||
955 | module_init(init_bt3c_cs); | 939 | module_init(init_bt3c_cs); |
diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 63221d383fda..7b04f89f7a71 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c | |||
@@ -93,8 +93,6 @@ static dev_info_t dev_info = "btuart_cs"; | |||
93 | static dev_link_t *btuart_attach(void); | 93 | static dev_link_t *btuart_attach(void); |
94 | static void btuart_detach(struct pcmcia_device *p_dev); | 94 | static void btuart_detach(struct pcmcia_device *p_dev); |
95 | 95 | ||
96 | static dev_link_t *dev_list = NULL; | ||
97 | |||
98 | 96 | ||
99 | /* Maximum baud rate */ | 97 | /* Maximum baud rate */ |
100 | #define SPEED_MAX 115200 | 98 | #define SPEED_MAX 115200 |
@@ -610,8 +608,7 @@ static dev_link_t *btuart_attach(void) | |||
610 | link->conf.IntType = INT_MEMORY_AND_IO; | 608 | link->conf.IntType = INT_MEMORY_AND_IO; |
611 | 609 | ||
612 | /* Register with Card Services */ | 610 | /* Register with Card Services */ |
613 | link->next = dev_list; | 611 | link->next = NULL; |
614 | dev_list = link; | ||
615 | client_reg.dev_info = &dev_info; | 612 | client_reg.dev_info = &dev_info; |
616 | client_reg.Version = 0x0210; | 613 | client_reg.Version = 0x0210; |
617 | client_reg.event_callback_args.client_data = link; | 614 | client_reg.event_callback_args.client_data = link; |
@@ -631,22 +628,10 @@ static void btuart_detach(struct pcmcia_device *p_dev) | |||
631 | { | 628 | { |
632 | dev_link_t *link = dev_to_instance(p_dev); | 629 | dev_link_t *link = dev_to_instance(p_dev); |
633 | btuart_info_t *info = link->priv; | 630 | btuart_info_t *info = link->priv; |
634 | dev_link_t **linkp; | ||
635 | |||
636 | /* Locate device structure */ | ||
637 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
638 | if (*linkp == link) | ||
639 | break; | ||
640 | |||
641 | if (*linkp == NULL) | ||
642 | return; | ||
643 | 631 | ||
644 | if (link->state & DEV_CONFIG) | 632 | if (link->state & DEV_CONFIG) |
645 | btuart_release(link); | 633 | btuart_release(link); |
646 | 634 | ||
647 | /* Unlink device structure, free bits */ | ||
648 | *linkp = link->next; | ||
649 | |||
650 | kfree(info); | 635 | kfree(info); |
651 | } | 636 | } |
652 | 637 | ||
@@ -870,7 +855,6 @@ static int __init init_btuart_cs(void) | |||
870 | static void __exit exit_btuart_cs(void) | 855 | static void __exit exit_btuart_cs(void) |
871 | { | 856 | { |
872 | pcmcia_unregister_driver(&btuart_driver); | 857 | pcmcia_unregister_driver(&btuart_driver); |
873 | BUG_ON(dev_list != NULL); | ||
874 | } | 858 | } |
875 | 859 | ||
876 | module_init(init_btuart_cs); | 860 | module_init(init_btuart_cs); |
diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index 2874d8722be9..c39d4576cfff 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c | |||
@@ -96,8 +96,6 @@ static dev_info_t dev_info = "dtl1_cs"; | |||
96 | static dev_link_t *dtl1_attach(void); | 96 | static dev_link_t *dtl1_attach(void); |
97 | static void dtl1_detach(struct pcmcia_device *p_dev); | 97 | static void dtl1_detach(struct pcmcia_device *p_dev); |
98 | 98 | ||
99 | static dev_link_t *dev_list = NULL; | ||
100 | |||
101 | 99 | ||
102 | /* Transmit states */ | 100 | /* Transmit states */ |
103 | #define XMIT_SENDING 1 | 101 | #define XMIT_SENDING 1 |
@@ -589,8 +587,7 @@ static dev_link_t *dtl1_attach(void) | |||
589 | link->conf.IntType = INT_MEMORY_AND_IO; | 587 | link->conf.IntType = INT_MEMORY_AND_IO; |
590 | 588 | ||
591 | /* Register with Card Services */ | 589 | /* Register with Card Services */ |
592 | link->next = dev_list; | 590 | link->next = NULL; |
593 | dev_list = link; | ||
594 | client_reg.dev_info = &dev_info; | 591 | client_reg.dev_info = &dev_info; |
595 | client_reg.Version = 0x0210; | 592 | client_reg.Version = 0x0210; |
596 | client_reg.event_callback_args.client_data = link; | 593 | client_reg.event_callback_args.client_data = link; |
@@ -610,22 +607,10 @@ static void dtl1_detach(struct pcmcia_device *p_dev) | |||
610 | { | 607 | { |
611 | dev_link_t *link = dev_to_instance(p_dev); | 608 | dev_link_t *link = dev_to_instance(p_dev); |
612 | dtl1_info_t *info = link->priv; | 609 | dtl1_info_t *info = link->priv; |
613 | dev_link_t **linkp; | ||
614 | |||
615 | /* Locate device structure */ | ||
616 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
617 | if (*linkp == link) | ||
618 | break; | ||
619 | |||
620 | if (*linkp == NULL) | ||
621 | return; | ||
622 | 610 | ||
623 | if (link->state & DEV_CONFIG) | 611 | if (link->state & DEV_CONFIG) |
624 | dtl1_release(link); | 612 | dtl1_release(link); |
625 | 613 | ||
626 | /* Unlink device structure, free bits */ | ||
627 | *linkp = link->next; | ||
628 | |||
629 | kfree(info); | 614 | kfree(info); |
630 | } | 615 | } |
631 | 616 | ||
@@ -822,7 +807,6 @@ static int __init init_dtl1_cs(void) | |||
822 | static void __exit exit_dtl1_cs(void) | 807 | static void __exit exit_dtl1_cs(void) |
823 | { | 808 | { |
824 | pcmcia_unregister_driver(&dtl1_driver); | 809 | pcmcia_unregister_driver(&dtl1_driver); |
825 | BUG_ON(dev_list != NULL); | ||
826 | } | 810 | } |
827 | 811 | ||
828 | module_init(init_dtl1_cs); | 812 | module_init(init_dtl1_cs); |
diff --git a/drivers/char/pcmcia/synclink_cs.c b/drivers/char/pcmcia/synclink_cs.c index 34597144d9c1..dc38b1d0a725 100644 --- a/drivers/char/pcmcia/synclink_cs.c +++ b/drivers/char/pcmcia/synclink_cs.c | |||
@@ -492,7 +492,6 @@ static dev_link_t *mgslpc_attach(void); | |||
492 | static void mgslpc_detach(struct pcmcia_device *p_dev); | 492 | static void mgslpc_detach(struct pcmcia_device *p_dev); |
493 | 493 | ||
494 | static dev_info_t dev_info = "synclink_cs"; | 494 | static dev_info_t dev_info = "synclink_cs"; |
495 | static dev_link_t *dev_list = NULL; | ||
496 | 495 | ||
497 | /* | 496 | /* |
498 | * 1st function defined in .text section. Calling this function in | 497 | * 1st function defined in .text section. Calling this function in |
@@ -588,8 +587,7 @@ static dev_link_t *mgslpc_attach(void) | |||
588 | link->conf.IntType = INT_MEMORY_AND_IO; | 587 | link->conf.IntType = INT_MEMORY_AND_IO; |
589 | 588 | ||
590 | /* Register with Card Services */ | 589 | /* Register with Card Services */ |
591 | link->next = dev_list; | 590 | link->next = NULL; |
592 | dev_list = link; | ||
593 | 591 | ||
594 | client_reg.dev_info = &dev_info; | 592 | client_reg.dev_info = &dev_info; |
595 | client_reg.Version = 0x0210; | 593 | client_reg.Version = 0x0210; |
@@ -741,24 +739,15 @@ static void mgslpc_release(u_long arg) | |||
741 | static void mgslpc_detach(struct pcmcia_device *p_dev) | 739 | static void mgslpc_detach(struct pcmcia_device *p_dev) |
742 | { | 740 | { |
743 | dev_link_t *link = dev_to_instance(p_dev); | 741 | dev_link_t *link = dev_to_instance(p_dev); |
744 | dev_link_t **linkp; | ||
745 | 742 | ||
746 | if (debug_level >= DEBUG_LEVEL_INFO) | 743 | if (debug_level >= DEBUG_LEVEL_INFO) |
747 | printk("mgslpc_detach(0x%p)\n", link); | 744 | printk("mgslpc_detach(0x%p)\n", link); |
748 | 745 | ||
749 | /* find device */ | ||
750 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
751 | if (*linkp == link) break; | ||
752 | if (*linkp == NULL) | ||
753 | return; | ||
754 | |||
755 | if (link->state & DEV_CONFIG) { | 746 | if (link->state & DEV_CONFIG) { |
756 | ((MGSLPC_INFO *)link->priv)->stop = 1; | 747 | ((MGSLPC_INFO *)link->priv)->stop = 1; |
757 | mgslpc_release((u_long)link); | 748 | mgslpc_release((u_long)link); |
758 | } | 749 | } |
759 | 750 | ||
760 | /* Unlink device structure, and free it */ | ||
761 | *linkp = link->next; | ||
762 | mgslpc_remove_device((MGSLPC_INFO *)link->priv); | 751 | mgslpc_remove_device((MGSLPC_INFO *)link->priv); |
763 | } | 752 | } |
764 | 753 | ||
@@ -3131,7 +3120,6 @@ static void synclink_cs_cleanup(void) | |||
3131 | } | 3120 | } |
3132 | 3121 | ||
3133 | pcmcia_unregister_driver(&mgslpc_driver); | 3122 | pcmcia_unregister_driver(&mgslpc_driver); |
3134 | BUG_ON(dev_list != NULL); | ||
3135 | } | 3123 | } |
3136 | 3124 | ||
3137 | static int __init synclink_cs_init(void) | 3125 | static int __init synclink_cs_init(void) |
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 1fb8976496d9..c83068dd42a0 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
@@ -96,7 +96,8 @@ static dev_info_t dev_info = "ide-cs"; | |||
96 | static dev_link_t *ide_attach(void); | 96 | static dev_link_t *ide_attach(void); |
97 | static void ide_detach(struct pcmcia_device *p_dev); | 97 | static void ide_detach(struct pcmcia_device *p_dev); |
98 | 98 | ||
99 | static dev_link_t *dev_list = NULL; | 99 | |
100 | |||
100 | 101 | ||
101 | /*====================================================================== | 102 | /*====================================================================== |
102 | 103 | ||
@@ -130,8 +131,7 @@ static dev_link_t *ide_attach(void) | |||
130 | link->conf.IntType = INT_MEMORY_AND_IO; | 131 | link->conf.IntType = INT_MEMORY_AND_IO; |
131 | 132 | ||
132 | /* Register with Card Services */ | 133 | /* Register with Card Services */ |
133 | link->next = dev_list; | 134 | link->next = NULL; |
134 | dev_list = link; | ||
135 | client_reg.dev_info = &dev_info; | 135 | client_reg.dev_info = &dev_info; |
136 | client_reg.Version = 0x0210; | 136 | client_reg.Version = 0x0210; |
137 | client_reg.event_callback_args.client_data = link; | 137 | client_reg.event_callback_args.client_data = link; |
@@ -157,23 +157,13 @@ static dev_link_t *ide_attach(void) | |||
157 | static void ide_detach(struct pcmcia_device *p_dev) | 157 | static void ide_detach(struct pcmcia_device *p_dev) |
158 | { | 158 | { |
159 | dev_link_t *link = dev_to_instance(p_dev); | 159 | dev_link_t *link = dev_to_instance(p_dev); |
160 | dev_link_t **linkp; | ||
161 | 160 | ||
162 | DEBUG(0, "ide_detach(0x%p)\n", link); | 161 | DEBUG(0, "ide_detach(0x%p)\n", link); |
163 | |||
164 | /* Locate device structure */ | ||
165 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
166 | if (*linkp == link) break; | ||
167 | if (*linkp == NULL) | ||
168 | return; | ||
169 | 162 | ||
170 | if (link->state & DEV_CONFIG) | 163 | if (link->state & DEV_CONFIG) |
171 | ide_release(link); | 164 | ide_release(link); |
172 | 165 | ||
173 | /* Unlink, free device structure */ | ||
174 | *linkp = link->next; | ||
175 | kfree(link->priv); | 166 | kfree(link->priv); |
176 | |||
177 | } /* ide_detach */ | 167 | } /* ide_detach */ |
178 | 168 | ||
179 | static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) | 169 | static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle) |
@@ -507,7 +497,6 @@ static int __init init_ide_cs(void) | |||
507 | static void __exit exit_ide_cs(void) | 497 | static void __exit exit_ide_cs(void) |
508 | { | 498 | { |
509 | pcmcia_unregister_driver(&ide_cs_driver); | 499 | pcmcia_unregister_driver(&ide_cs_driver); |
510 | BUG_ON(dev_list != NULL); | ||
511 | } | 500 | } |
512 | 501 | ||
513 | late_initcall(init_ide_cs); | 502 | late_initcall(init_ide_cs); |
diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c index 2d898d3afc97..0a8c1da10b4b 100644 --- a/drivers/isdn/hardware/avm/avm_cs.c +++ b/drivers/isdn/hardware/avm/avm_cs.c | |||
@@ -83,15 +83,7 @@ static dev_info_t dev_info = "avm_cs"; | |||
83 | device numbers are used to derive the corresponding array index. | 83 | device numbers are used to derive the corresponding array index. |
84 | */ | 84 | */ |
85 | 85 | ||
86 | static dev_link_t *dev_list = NULL; | ||
87 | |||
88 | /* | 86 | /* |
89 | A dev_link_t structure has fields for most things that are needed | ||
90 | to keep track of a socket, but there will usually be some device | ||
91 | specific information that also needs to be kept track of. The | ||
92 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
93 | a device-specific private data structure, like this. | ||
94 | |||
95 | A driver needs to provide a dev_node_t structure for each device | 87 | A driver needs to provide a dev_node_t structure for each device |
96 | on a card. In some cases, there is only one device per card (for | 88 | on a card. In some cases, there is only one device per card (for |
97 | example, ethernet cards, modems). In other cases, there may be | 89 | example, ethernet cards, modems). In other cases, there may be |
@@ -157,8 +149,7 @@ static dev_link_t *avmcs_attach(void) | |||
157 | link->priv = local; | 149 | link->priv = local; |
158 | 150 | ||
159 | /* Register with Card Services */ | 151 | /* Register with Card Services */ |
160 | link->next = dev_list; | 152 | link->next = NULL; |
161 | dev_list = link; | ||
162 | client_reg.dev_info = &dev_info; | 153 | client_reg.dev_info = &dev_info; |
163 | client_reg.Version = 0x0210; | 154 | client_reg.Version = 0x0210; |
164 | client_reg.event_callback_args.client_data = link; | 155 | client_reg.event_callback_args.client_data = link; |
@@ -188,19 +179,10 @@ static dev_link_t *avmcs_attach(void) | |||
188 | static void avmcs_detach(struct pcmcia_device *p_dev) | 179 | static void avmcs_detach(struct pcmcia_device *p_dev) |
189 | { | 180 | { |
190 | dev_link_t *link = dev_to_instance(p_dev); | 181 | dev_link_t *link = dev_to_instance(p_dev); |
191 | dev_link_t **linkp; | ||
192 | |||
193 | /* Locate device structure */ | ||
194 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
195 | if (*linkp == link) break; | ||
196 | if (*linkp == NULL) | ||
197 | return; | ||
198 | 182 | ||
199 | if (link->state & DEV_CONFIG) | 183 | if (link->state & DEV_CONFIG) |
200 | avmcs_release(link); | 184 | avmcs_release(link); |
201 | 185 | ||
202 | /* Unlink device structure, free pieces */ | ||
203 | *linkp = link->next; | ||
204 | kfree(link->priv); | 186 | kfree(link->priv); |
205 | kfree(link); | 187 | kfree(link); |
206 | } /* avmcs_detach */ | 188 | } /* avmcs_detach */ |
@@ -494,7 +476,6 @@ static int __init avmcs_init(void) | |||
494 | static void __exit avmcs_exit(void) | 476 | static void __exit avmcs_exit(void) |
495 | { | 477 | { |
496 | pcmcia_unregister_driver(&avmcs_driver); | 478 | pcmcia_unregister_driver(&avmcs_driver); |
497 | BUG_ON(dev_list != NULL); | ||
498 | } | 479 | } |
499 | 480 | ||
500 | module_init(avmcs_init); | 481 | module_init(avmcs_init); |
diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c index 6b322e88c6c3..b6ea653f881e 100644 --- a/drivers/isdn/hisax/avma1_cs.c +++ b/drivers/isdn/hisax/avma1_cs.c | |||
@@ -99,15 +99,7 @@ static dev_info_t dev_info = "avma1_cs"; | |||
99 | device numbers are used to derive the corresponding array index. | 99 | device numbers are used to derive the corresponding array index. |
100 | */ | 100 | */ |
101 | 101 | ||
102 | static dev_link_t *dev_list = NULL; | ||
103 | |||
104 | /* | 102 | /* |
105 | A dev_link_t structure has fields for most things that are needed | ||
106 | to keep track of a socket, but there will usually be some device | ||
107 | specific information that also needs to be kept track of. The | ||
108 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
109 | a device-specific private data structure, like this. | ||
110 | |||
111 | A driver needs to provide a dev_node_t structure for each device | 103 | A driver needs to provide a dev_node_t structure for each device |
112 | on a card. In some cases, there is only one device per card (for | 104 | on a card. In some cases, there is only one device per card (for |
113 | example, ethernet cards, modems). In other cases, there may be | 105 | example, ethernet cards, modems). In other cases, there may be |
@@ -179,8 +171,7 @@ static dev_link_t *avma1cs_attach(void) | |||
179 | link->conf.Present = PRESENT_OPTION; | 171 | link->conf.Present = PRESENT_OPTION; |
180 | 172 | ||
181 | /* Register with Card Services */ | 173 | /* Register with Card Services */ |
182 | link->next = dev_list; | 174 | link->next = NULL; |
183 | dev_list = link; | ||
184 | client_reg.dev_info = &dev_info; | 175 | client_reg.dev_info = &dev_info; |
185 | client_reg.Version = 0x0210; | 176 | client_reg.Version = 0x0210; |
186 | client_reg.event_callback_args.client_data = link; | 177 | client_reg.event_callback_args.client_data = link; |
@@ -206,21 +197,12 @@ static dev_link_t *avma1cs_attach(void) | |||
206 | static void avma1cs_detach(struct pcmcia_device *p_dev) | 197 | static void avma1cs_detach(struct pcmcia_device *p_dev) |
207 | { | 198 | { |
208 | dev_link_t *link = dev_to_instance(p_dev); | 199 | dev_link_t *link = dev_to_instance(p_dev); |
209 | dev_link_t **linkp; | ||
210 | 200 | ||
211 | DEBUG(0, "avma1cs_detach(0x%p)\n", link); | 201 | DEBUG(0, "avma1cs_detach(0x%p)\n", link); |
212 | 202 | ||
213 | /* Locate device structure */ | ||
214 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
215 | if (*linkp == link) break; | ||
216 | if (*linkp == NULL) | ||
217 | return; | ||
218 | |||
219 | if (link->state & DEV_CONFIG) | 203 | if (link->state & DEV_CONFIG) |
220 | avma1cs_release(link); | 204 | avma1cs_release(link); |
221 | 205 | ||
222 | /* Unlink device structure, free pieces */ | ||
223 | *linkp = link->next; | ||
224 | kfree(link->priv); | 206 | kfree(link->priv); |
225 | kfree(link); | 207 | kfree(link); |
226 | } /* avma1cs_detach */ | 208 | } /* avma1cs_detach */ |
@@ -508,7 +490,6 @@ static int __init init_avma1_cs(void) | |||
508 | static void __exit exit_avma1_cs(void) | 490 | static void __exit exit_avma1_cs(void) |
509 | { | 491 | { |
510 | pcmcia_unregister_driver(&avma1cs_driver); | 492 | pcmcia_unregister_driver(&avma1cs_driver); |
511 | BUG_ON(dev_list != NULL); | ||
512 | } | 493 | } |
513 | 494 | ||
514 | module_init(init_avma1_cs); | 495 | module_init(init_avma1_cs); |
diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c index 48cc677249f1..a0c5bad7bc6b 100644 --- a/drivers/isdn/hisax/elsa_cs.c +++ b/drivers/isdn/hisax/elsa_cs.c | |||
@@ -126,18 +126,7 @@ static dev_info_t dev_info = "elsa_cs"; | |||
126 | device numbers are used to derive the corresponding array index. | 126 | device numbers are used to derive the corresponding array index. |
127 | */ | 127 | */ |
128 | 128 | ||
129 | static dev_link_t *dev_list = NULL; | ||
130 | |||
131 | /* | 129 | /* |
132 | A dev_link_t structure has fields for most things that are needed | ||
133 | to keep track of a socket, but there will usually be some device | ||
134 | specific information that also needs to be kept track of. The | ||
135 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
136 | a device-specific private data structure, like this. | ||
137 | |||
138 | To simplify the data structure handling, we actually include the | ||
139 | dev_link_t structure in the device's private data structure. | ||
140 | |||
141 | A driver needs to provide a dev_node_t structure for each device | 130 | A driver needs to provide a dev_node_t structure for each device |
142 | on a card. In some cases, there is only one device per card (for | 131 | on a card. In some cases, there is only one device per card (for |
143 | example, ethernet cards, modems). In other cases, there may be | 132 | example, ethernet cards, modems). In other cases, there may be |
@@ -208,8 +197,7 @@ static dev_link_t *elsa_cs_attach(void) | |||
208 | link->conf.IntType = INT_MEMORY_AND_IO; | 197 | link->conf.IntType = INT_MEMORY_AND_IO; |
209 | 198 | ||
210 | /* Register with Card Services */ | 199 | /* Register with Card Services */ |
211 | link->next = dev_list; | 200 | link->next = NULL; |
212 | dev_list = link; | ||
213 | client_reg.dev_info = &dev_info; | 201 | client_reg.dev_info = &dev_info; |
214 | client_reg.Version = 0x0210; | 202 | client_reg.Version = 0x0210; |
215 | client_reg.event_callback_args.client_data = link; | 203 | client_reg.event_callback_args.client_data = link; |
@@ -235,24 +223,15 @@ static dev_link_t *elsa_cs_attach(void) | |||
235 | static void elsa_cs_detach(struct pcmcia_device *p_dev) | 223 | static void elsa_cs_detach(struct pcmcia_device *p_dev) |
236 | { | 224 | { |
237 | dev_link_t *link = dev_to_instance(p_dev); | 225 | dev_link_t *link = dev_to_instance(p_dev); |
238 | dev_link_t **linkp; | ||
239 | local_info_t *info = link->priv; | 226 | local_info_t *info = link->priv; |
240 | 227 | ||
241 | DEBUG(0, "elsa_cs_detach(0x%p)\n", link); | 228 | DEBUG(0, "elsa_cs_detach(0x%p)\n", link); |
242 | 229 | ||
243 | /* Locate device structure */ | ||
244 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
245 | if (*linkp == link) break; | ||
246 | if (*linkp == NULL) | ||
247 | return; | ||
248 | |||
249 | if (link->state & DEV_CONFIG) { | 230 | if (link->state & DEV_CONFIG) { |
250 | ((local_info_t*)link->priv)->busy = 1; | 231 | info->busy = 1; |
251 | elsa_cs_release(link); | 232 | elsa_cs_release(link); |
252 | } | 233 | } |
253 | 234 | ||
254 | /* Unlink device structure and free it */ | ||
255 | *linkp = link->next; | ||
256 | kfree(info); | 235 | kfree(info); |
257 | 236 | ||
258 | } /* elsa_cs_detach */ | 237 | } /* elsa_cs_detach */ |
@@ -526,7 +505,6 @@ static int __init init_elsa_cs(void) | |||
526 | static void __exit exit_elsa_cs(void) | 505 | static void __exit exit_elsa_cs(void) |
527 | { | 506 | { |
528 | pcmcia_unregister_driver(&elsa_cs_driver); | 507 | pcmcia_unregister_driver(&elsa_cs_driver); |
529 | BUG_ON(dev_list != NULL); | ||
530 | } | 508 | } |
531 | 509 | ||
532 | module_init(init_elsa_cs); | 510 | module_init(init_elsa_cs); |
diff --git a/drivers/isdn/hisax/sedlbauer_cs.c b/drivers/isdn/hisax/sedlbauer_cs.c index d2386f6867b7..814b32a9ef3b 100644 --- a/drivers/isdn/hisax/sedlbauer_cs.c +++ b/drivers/isdn/hisax/sedlbauer_cs.c | |||
@@ -134,18 +134,7 @@ static dev_info_t dev_info = "sedlbauer_cs"; | |||
134 | device numbers are used to derive the corresponding array index. | 134 | device numbers are used to derive the corresponding array index. |
135 | */ | 135 | */ |
136 | 136 | ||
137 | static dev_link_t *dev_list = NULL; | ||
138 | |||
139 | /* | 137 | /* |
140 | A dev_link_t structure has fields for most things that are needed | ||
141 | to keep track of a socket, but there will usually be some device | ||
142 | specific information that also needs to be kept track of. The | ||
143 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
144 | a device-specific private data structure, like this. | ||
145 | |||
146 | To simplify the data structure handling, we actually include the | ||
147 | dev_link_t structure in the device's private data structure. | ||
148 | |||
149 | A driver needs to provide a dev_node_t structure for each device | 138 | A driver needs to provide a dev_node_t structure for each device |
150 | on a card. In some cases, there is only one device per card (for | 139 | on a card. In some cases, there is only one device per card (for |
151 | example, ethernet cards, modems). In other cases, there may be | 140 | example, ethernet cards, modems). In other cases, there may be |
@@ -222,8 +211,7 @@ static dev_link_t *sedlbauer_attach(void) | |||
222 | link->conf.IntType = INT_MEMORY_AND_IO; | 211 | link->conf.IntType = INT_MEMORY_AND_IO; |
223 | 212 | ||
224 | /* Register with Card Services */ | 213 | /* Register with Card Services */ |
225 | link->next = dev_list; | 214 | link->next = NULL; |
226 | dev_list = link; | ||
227 | client_reg.dev_info = &dev_info; | 215 | client_reg.dev_info = &dev_info; |
228 | client_reg.Version = 0x0210; | 216 | client_reg.Version = 0x0210; |
229 | client_reg.event_callback_args.client_data = link; | 217 | client_reg.event_callback_args.client_data = link; |
@@ -249,23 +237,14 @@ static dev_link_t *sedlbauer_attach(void) | |||
249 | static void sedlbauer_detach(struct pcmcia_device *p_dev) | 237 | static void sedlbauer_detach(struct pcmcia_device *p_dev) |
250 | { | 238 | { |
251 | dev_link_t *link = dev_to_instance(p_dev); | 239 | dev_link_t *link = dev_to_instance(p_dev); |
252 | dev_link_t **linkp; | ||
253 | 240 | ||
254 | DEBUG(0, "sedlbauer_detach(0x%p)\n", link); | 241 | DEBUG(0, "sedlbauer_detach(0x%p)\n", link); |
255 | |||
256 | /* Locate device structure */ | ||
257 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
258 | if (*linkp == link) break; | ||
259 | if (*linkp == NULL) | ||
260 | return; | ||
261 | 242 | ||
262 | if (link->state & DEV_CONFIG) { | 243 | if (link->state & DEV_CONFIG) { |
263 | ((local_info_t *)link->priv)->stop = 1; | 244 | ((local_info_t *)link->priv)->stop = 1; |
264 | sedlbauer_release(link); | 245 | sedlbauer_release(link); |
265 | } | 246 | } |
266 | 247 | ||
267 | /* Unlink device structure, and free it */ | ||
268 | *linkp = link->next; | ||
269 | /* This points to the parent local_info_t struct */ | 248 | /* This points to the parent local_info_t struct */ |
270 | kfree(link->priv); | 249 | kfree(link->priv); |
271 | } /* sedlbauer_detach */ | 250 | } /* sedlbauer_detach */ |
@@ -623,7 +602,6 @@ static int __init init_sedlbauer_cs(void) | |||
623 | static void __exit exit_sedlbauer_cs(void) | 602 | static void __exit exit_sedlbauer_cs(void) |
624 | { | 603 | { |
625 | pcmcia_unregister_driver(&sedlbauer_driver); | 604 | pcmcia_unregister_driver(&sedlbauer_driver); |
626 | BUG_ON(dev_list != NULL); | ||
627 | } | 605 | } |
628 | 606 | ||
629 | module_init(init_sedlbauer_cs); | 607 | module_init(init_sedlbauer_cs); |
diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c index cd0f86f0975b..f956fceb9db2 100644 --- a/drivers/isdn/hisax/teles_cs.c +++ b/drivers/isdn/hisax/teles_cs.c | |||
@@ -107,18 +107,7 @@ static dev_info_t dev_info = "teles_cs"; | |||
107 | device numbers are used to derive the corresponding array index. | 107 | device numbers are used to derive the corresponding array index. |
108 | */ | 108 | */ |
109 | 109 | ||
110 | static dev_link_t *dev_list = NULL; | ||
111 | |||
112 | /* | 110 | /* |
113 | A dev_link_t structure has fields for most things that are needed | ||
114 | to keep track of a socket, but there will usually be some device | ||
115 | specific information that also needs to be kept track of. The | ||
116 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
117 | a device-specific private data structure, like this. | ||
118 | |||
119 | To simplify the data structure handling, we actually include the | ||
120 | dev_link_t structure in the device's private data structure. | ||
121 | |||
122 | A driver needs to provide a dev_node_t structure for each device | 111 | A driver needs to provide a dev_node_t structure for each device |
123 | on a card. In some cases, there is only one device per card (for | 112 | on a card. In some cases, there is only one device per card (for |
124 | example, ethernet cards, modems). In other cases, there may be | 113 | example, ethernet cards, modems). In other cases, there may be |
@@ -189,8 +178,7 @@ static dev_link_t *teles_attach(void) | |||
189 | link->conf.IntType = INT_MEMORY_AND_IO; | 178 | link->conf.IntType = INT_MEMORY_AND_IO; |
190 | 179 | ||
191 | /* Register with Card Services */ | 180 | /* Register with Card Services */ |
192 | link->next = dev_list; | 181 | link->next = NULL; |
193 | dev_list = link; | ||
194 | client_reg.dev_info = &dev_info; | 182 | client_reg.dev_info = &dev_info; |
195 | client_reg.Version = 0x0210; | 183 | client_reg.Version = 0x0210; |
196 | client_reg.event_callback_args.client_data = link; | 184 | client_reg.event_callback_args.client_data = link; |
@@ -216,24 +204,15 @@ static dev_link_t *teles_attach(void) | |||
216 | static void teles_detach(struct pcmcia_device *p_dev) | 204 | static void teles_detach(struct pcmcia_device *p_dev) |
217 | { | 205 | { |
218 | dev_link_t *link = dev_to_instance(p_dev); | 206 | dev_link_t *link = dev_to_instance(p_dev); |
219 | dev_link_t **linkp; | ||
220 | local_info_t *info = link->priv; | 207 | local_info_t *info = link->priv; |
221 | 208 | ||
222 | DEBUG(0, "teles_detach(0x%p)\n", link); | 209 | DEBUG(0, "teles_detach(0x%p)\n", link); |
223 | 210 | ||
224 | /* Locate device structure */ | ||
225 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
226 | if (*linkp == link) break; | ||
227 | if (*linkp == NULL) | ||
228 | return; | ||
229 | |||
230 | if (link->state & DEV_CONFIG) { | 211 | if (link->state & DEV_CONFIG) { |
231 | info->busy = 1; | 212 | info->busy = 1; |
232 | teles_cs_release(link); | 213 | teles_cs_release(link); |
233 | } | 214 | } |
234 | 215 | ||
235 | /* Unlink device structure and free it */ | ||
236 | *linkp = link->next; | ||
237 | kfree(info); | 216 | kfree(info); |
238 | 217 | ||
239 | } /* teles_detach */ | 218 | } /* teles_detach */ |
@@ -506,7 +485,6 @@ static int __init init_teles_cs(void) | |||
506 | static void __exit exit_teles_cs(void) | 485 | static void __exit exit_teles_cs(void) |
507 | { | 486 | { |
508 | pcmcia_unregister_driver(&teles_cs_driver); | 487 | pcmcia_unregister_driver(&teles_cs_driver); |
509 | BUG_ON(dev_list != NULL); | ||
510 | } | 488 | } |
511 | 489 | ||
512 | module_init(init_teles_cs); | 490 | module_init(init_teles_cs); |
diff --git a/drivers/mtd/maps/pcmciamtd.c b/drivers/mtd/maps/pcmciamtd.c index 3ddcb1bf6824..93c05dfa030d 100644 --- a/drivers/mtd/maps/pcmciamtd.c +++ b/drivers/mtd/maps/pcmciamtd.c | |||
@@ -67,7 +67,6 @@ struct pcmciamtd_dev { | |||
67 | 67 | ||
68 | 68 | ||
69 | static dev_info_t dev_info = "pcmciamtd"; | 69 | static dev_info_t dev_info = "pcmciamtd"; |
70 | static dev_link_t *dev_list; | ||
71 | 70 | ||
72 | /* Module parameters */ | 71 | /* Module parameters */ |
73 | 72 | ||
@@ -782,8 +781,7 @@ static dev_link_t *pcmciamtd_attach(void) | |||
782 | link->conf.Attributes = 0; | 781 | link->conf.Attributes = 0; |
783 | link->conf.IntType = INT_MEMORY; | 782 | link->conf.IntType = INT_MEMORY; |
784 | 783 | ||
785 | link->next = dev_list; | 784 | link->next = NULL; |
786 | dev_list = link; | ||
787 | 785 | ||
788 | /* Register with Card Services */ | 786 | /* Register with Card Services */ |
789 | client_reg.dev_info = &dev_info; | 787 | client_reg.dev_info = &dev_info; |
@@ -865,7 +863,6 @@ static void __exit exit_pcmciamtd(void) | |||
865 | { | 863 | { |
866 | DEBUG(1, DRIVER_DESC " unloading"); | 864 | DEBUG(1, DRIVER_DESC " unloading"); |
867 | pcmcia_unregister_driver(&pcmciamtd_driver); | 865 | pcmcia_unregister_driver(&pcmciamtd_driver); |
868 | BUG_ON(dev_list != NULL); | ||
869 | } | 866 | } |
870 | 867 | ||
871 | module_init(init_pcmciamtd); | 868 | module_init(init_pcmciamtd); |
diff --git a/drivers/net/pcmcia/3c574_cs.c b/drivers/net/pcmcia/3c574_cs.c index 60a3bc2b8fc4..8fcb63698ef1 100644 --- a/drivers/net/pcmcia/3c574_cs.c +++ b/drivers/net/pcmcia/3c574_cs.c | |||
@@ -255,8 +255,6 @@ static dev_info_t dev_info = "3c574_cs"; | |||
255 | static dev_link_t *tc574_attach(void); | 255 | static dev_link_t *tc574_attach(void); |
256 | static void tc574_detach(struct pcmcia_device *p_dev); | 256 | static void tc574_detach(struct pcmcia_device *p_dev); |
257 | 257 | ||
258 | static dev_link_t *dev_list; | ||
259 | |||
260 | /* | 258 | /* |
261 | tc574_attach() creates an "instance" of the driver, allocating | 259 | tc574_attach() creates an "instance" of the driver, allocating |
262 | local data structures for one device. The device is registered | 260 | local data structures for one device. The device is registered |
@@ -308,8 +306,7 @@ static dev_link_t *tc574_attach(void) | |||
308 | #endif | 306 | #endif |
309 | 307 | ||
310 | /* Register with Card Services */ | 308 | /* Register with Card Services */ |
311 | link->next = dev_list; | 309 | link->next = NULL; |
312 | dev_list = link; | ||
313 | client_reg.dev_info = &dev_info; | 310 | client_reg.dev_info = &dev_info; |
314 | client_reg.Version = 0x0210; | 311 | client_reg.Version = 0x0210; |
315 | client_reg.event_callback_args.client_data = link; | 312 | client_reg.event_callback_args.client_data = link; |
@@ -336,24 +333,15 @@ static void tc574_detach(struct pcmcia_device *p_dev) | |||
336 | { | 333 | { |
337 | dev_link_t *link = dev_to_instance(p_dev); | 334 | dev_link_t *link = dev_to_instance(p_dev); |
338 | struct net_device *dev = link->priv; | 335 | struct net_device *dev = link->priv; |
339 | dev_link_t **linkp; | ||
340 | 336 | ||
341 | DEBUG(0, "3c574_detach(0x%p)\n", link); | 337 | DEBUG(0, "3c574_detach(0x%p)\n", link); |
342 | 338 | ||
343 | /* Locate device structure */ | ||
344 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
345 | if (*linkp == link) break; | ||
346 | if (*linkp == NULL) | ||
347 | return; | ||
348 | |||
349 | if (link->dev) | 339 | if (link->dev) |
350 | unregister_netdev(dev); | 340 | unregister_netdev(dev); |
351 | 341 | ||
352 | if (link->state & DEV_CONFIG) | 342 | if (link->state & DEV_CONFIG) |
353 | tc574_release(link); | 343 | tc574_release(link); |
354 | 344 | ||
355 | /* Unlink device structure, free bits */ | ||
356 | *linkp = link->next; | ||
357 | free_netdev(dev); | 345 | free_netdev(dev); |
358 | } /* tc574_detach */ | 346 | } /* tc574_detach */ |
359 | 347 | ||
@@ -1310,7 +1298,6 @@ static int __init init_tc574(void) | |||
1310 | static void __exit exit_tc574(void) | 1298 | static void __exit exit_tc574(void) |
1311 | { | 1299 | { |
1312 | pcmcia_unregister_driver(&tc574_driver); | 1300 | pcmcia_unregister_driver(&tc574_driver); |
1313 | BUG_ON(dev_list != NULL); | ||
1314 | } | 1301 | } |
1315 | 1302 | ||
1316 | module_init(init_tc574); | 1303 | module_init(init_tc574); |
diff --git a/drivers/net/pcmcia/3c589_cs.c b/drivers/net/pcmcia/3c589_cs.c index 09b96c76216e..3516c02b9c89 100644 --- a/drivers/net/pcmcia/3c589_cs.c +++ b/drivers/net/pcmcia/3c589_cs.c | |||
@@ -166,8 +166,6 @@ static dev_info_t dev_info = "3c589_cs"; | |||
166 | static dev_link_t *tc589_attach(void); | 166 | static dev_link_t *tc589_attach(void); |
167 | static void tc589_detach(struct pcmcia_device *p_dev); | 167 | static void tc589_detach(struct pcmcia_device *p_dev); |
168 | 168 | ||
169 | static dev_link_t *dev_list; | ||
170 | |||
171 | /*====================================================================== | 169 | /*====================================================================== |
172 | 170 | ||
173 | tc589_attach() creates an "instance" of the driver, allocating | 171 | tc589_attach() creates an "instance" of the driver, allocating |
@@ -222,8 +220,7 @@ static dev_link_t *tc589_attach(void) | |||
222 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 220 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
223 | 221 | ||
224 | /* Register with Card Services */ | 222 | /* Register with Card Services */ |
225 | link->next = dev_list; | 223 | link->next = NULL; |
226 | dev_list = link; | ||
227 | client_reg.dev_info = &dev_info; | 224 | client_reg.dev_info = &dev_info; |
228 | client_reg.Version = 0x0210; | 225 | client_reg.Version = 0x0210; |
229 | client_reg.event_callback_args.client_data = link; | 226 | client_reg.event_callback_args.client_data = link; |
@@ -250,15 +247,8 @@ static void tc589_detach(struct pcmcia_device *p_dev) | |||
250 | { | 247 | { |
251 | dev_link_t *link = dev_to_instance(p_dev); | 248 | dev_link_t *link = dev_to_instance(p_dev); |
252 | struct net_device *dev = link->priv; | 249 | struct net_device *dev = link->priv; |
253 | dev_link_t **linkp; | 250 | |
254 | |||
255 | DEBUG(0, "3c589_detach(0x%p)\n", link); | 251 | DEBUG(0, "3c589_detach(0x%p)\n", link); |
256 | |||
257 | /* Locate device structure */ | ||
258 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
259 | if (*linkp == link) break; | ||
260 | if (*linkp == NULL) | ||
261 | return; | ||
262 | 252 | ||
263 | if (link->dev) | 253 | if (link->dev) |
264 | unregister_netdev(dev); | 254 | unregister_netdev(dev); |
@@ -266,8 +256,6 @@ static void tc589_detach(struct pcmcia_device *p_dev) | |||
266 | if (link->state & DEV_CONFIG) | 256 | if (link->state & DEV_CONFIG) |
267 | tc589_release(link); | 257 | tc589_release(link); |
268 | 258 | ||
269 | /* Unlink device structure, free bits */ | ||
270 | *linkp = link->next; | ||
271 | free_netdev(dev); | 259 | free_netdev(dev); |
272 | } /* tc589_detach */ | 260 | } /* tc589_detach */ |
273 | 261 | ||
@@ -1085,7 +1073,6 @@ static int __init init_tc589(void) | |||
1085 | static void __exit exit_tc589(void) | 1073 | static void __exit exit_tc589(void) |
1086 | { | 1074 | { |
1087 | pcmcia_unregister_driver(&tc589_driver); | 1075 | pcmcia_unregister_driver(&tc589_driver); |
1088 | BUG_ON(dev_list != NULL); | ||
1089 | } | 1076 | } |
1090 | 1077 | ||
1091 | module_init(init_tc589); | 1078 | module_init(init_tc589); |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 11f701a8ff02..3d36207d3332 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
@@ -111,7 +111,6 @@ static dev_link_t *axnet_attach(void); | |||
111 | static void axnet_detach(struct pcmcia_device *p_dev); | 111 | static void axnet_detach(struct pcmcia_device *p_dev); |
112 | 112 | ||
113 | static dev_info_t dev_info = "axnet_cs"; | 113 | static dev_info_t dev_info = "axnet_cs"; |
114 | static dev_link_t *dev_list; | ||
115 | 114 | ||
116 | static void axdev_setup(struct net_device *dev); | 115 | static void axdev_setup(struct net_device *dev); |
117 | static void AX88190_init(struct net_device *dev, int startp); | 116 | static void AX88190_init(struct net_device *dev, int startp); |
@@ -177,8 +176,7 @@ static dev_link_t *axnet_attach(void) | |||
177 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 176 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
178 | 177 | ||
179 | /* Register with Card Services */ | 178 | /* Register with Card Services */ |
180 | link->next = dev_list; | 179 | link->next = NULL; |
181 | dev_list = link; | ||
182 | client_reg.dev_info = &dev_info; | 180 | client_reg.dev_info = &dev_info; |
183 | client_reg.Version = 0x0210; | 181 | client_reg.Version = 0x0210; |
184 | client_reg.event_callback_args.client_data = link; | 182 | client_reg.event_callback_args.client_data = link; |
@@ -205,24 +203,15 @@ static void axnet_detach(struct pcmcia_device *p_dev) | |||
205 | { | 203 | { |
206 | dev_link_t *link = dev_to_instance(p_dev); | 204 | dev_link_t *link = dev_to_instance(p_dev); |
207 | struct net_device *dev = link->priv; | 205 | struct net_device *dev = link->priv; |
208 | dev_link_t **linkp; | ||
209 | 206 | ||
210 | DEBUG(0, "axnet_detach(0x%p)\n", link); | 207 | DEBUG(0, "axnet_detach(0x%p)\n", link); |
211 | 208 | ||
212 | /* Locate device structure */ | ||
213 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
214 | if (*linkp == link) break; | ||
215 | if (*linkp == NULL) | ||
216 | return; | ||
217 | |||
218 | if (link->dev) | 209 | if (link->dev) |
219 | unregister_netdev(dev); | 210 | unregister_netdev(dev); |
220 | 211 | ||
221 | if (link->state & DEV_CONFIG) | 212 | if (link->state & DEV_CONFIG) |
222 | axnet_release(link); | 213 | axnet_release(link); |
223 | 214 | ||
224 | /* Unlink device structure, free bits */ | ||
225 | *linkp = link->next; | ||
226 | free_netdev(dev); | 215 | free_netdev(dev); |
227 | } /* axnet_detach */ | 216 | } /* axnet_detach */ |
228 | 217 | ||
@@ -896,7 +885,6 @@ static int __init init_axnet_cs(void) | |||
896 | static void __exit exit_axnet_cs(void) | 885 | static void __exit exit_axnet_cs(void) |
897 | { | 886 | { |
898 | pcmcia_unregister_driver(&axnet_cs_driver); | 887 | pcmcia_unregister_driver(&axnet_cs_driver); |
899 | BUG_ON(dev_list != NULL); | ||
900 | } | 888 | } |
901 | 889 | ||
902 | module_init(init_axnet_cs); | 890 | module_init(init_axnet_cs); |
diff --git a/drivers/net/pcmcia/com20020_cs.c b/drivers/net/pcmcia/com20020_cs.c index 6970888cba10..d48dbd3e153a 100644 --- a/drivers/net/pcmcia/com20020_cs.c +++ b/drivers/net/pcmcia/com20020_cs.c | |||
@@ -128,8 +128,6 @@ static dev_info_t dev_info = "com20020_cs"; | |||
128 | static dev_link_t *com20020_attach(void); | 128 | static dev_link_t *com20020_attach(void); |
129 | static void com20020_detach(struct pcmcia_device *p_dev); | 129 | static void com20020_detach(struct pcmcia_device *p_dev); |
130 | 130 | ||
131 | static dev_link_t *dev_list; | ||
132 | |||
133 | /*====================================================================*/ | 131 | /*====================================================================*/ |
134 | 132 | ||
135 | typedef struct com20020_dev_t { | 133 | typedef struct com20020_dev_t { |
@@ -196,8 +194,7 @@ static dev_link_t *com20020_attach(void) | |||
196 | link->priv = info; | 194 | link->priv = info; |
197 | 195 | ||
198 | /* Register with Card Services */ | 196 | /* Register with Card Services */ |
199 | link->next = dev_list; | 197 | link->next = NULL; |
200 | dev_list = link; | ||
201 | client_reg.dev_info = &dev_info; | 198 | client_reg.dev_info = &dev_info; |
202 | client_reg.Version = 0x0210; | 199 | client_reg.Version = 0x0210; |
203 | client_reg.event_callback_args.client_data = link; | 200 | client_reg.event_callback_args.client_data = link; |
@@ -230,26 +227,17 @@ static void com20020_detach(struct pcmcia_device *p_dev) | |||
230 | { | 227 | { |
231 | dev_link_t *link = dev_to_instance(p_dev); | 228 | dev_link_t *link = dev_to_instance(p_dev); |
232 | struct com20020_dev_t *info = link->priv; | 229 | struct com20020_dev_t *info = link->priv; |
233 | dev_link_t **linkp; | 230 | struct net_device *dev = info->dev; |
234 | struct net_device *dev; | 231 | |
235 | |||
236 | DEBUG(1,"detach...\n"); | 232 | DEBUG(1,"detach...\n"); |
237 | 233 | ||
238 | DEBUG(0, "com20020_detach(0x%p)\n", link); | 234 | DEBUG(0, "com20020_detach(0x%p)\n", link); |
239 | 235 | ||
240 | /* Locate device structure */ | ||
241 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
242 | if (*linkp == link) break; | ||
243 | if (*linkp == NULL) | ||
244 | return; | ||
245 | |||
246 | dev = info->dev; | ||
247 | |||
248 | if (link->dev) { | 236 | if (link->dev) { |
249 | DEBUG(1,"unregister...\n"); | 237 | DEBUG(1,"unregister...\n"); |
250 | 238 | ||
251 | unregister_netdev(dev); | 239 | unregister_netdev(dev); |
252 | 240 | ||
253 | /* | 241 | /* |
254 | * this is necessary because we register our IRQ separately | 242 | * this is necessary because we register our IRQ separately |
255 | * from card services. | 243 | * from card services. |
@@ -263,7 +251,6 @@ static void com20020_detach(struct pcmcia_device *p_dev) | |||
263 | 251 | ||
264 | /* Unlink device structure, free bits */ | 252 | /* Unlink device structure, free bits */ |
265 | DEBUG(1,"unlinking...\n"); | 253 | DEBUG(1,"unlinking...\n"); |
266 | *linkp = link->next; | ||
267 | if (link->priv) | 254 | if (link->priv) |
268 | { | 255 | { |
269 | dev = info->dev; | 256 | dev = info->dev; |
@@ -507,7 +494,6 @@ static int __init init_com20020_cs(void) | |||
507 | static void __exit exit_com20020_cs(void) | 494 | static void __exit exit_com20020_cs(void) |
508 | { | 495 | { |
509 | pcmcia_unregister_driver(&com20020_cs_driver); | 496 | pcmcia_unregister_driver(&com20020_cs_driver); |
510 | BUG_ON(dev_list != NULL); | ||
511 | } | 497 | } |
512 | 498 | ||
513 | module_init(init_com20020_cs); | 499 | module_init(init_com20020_cs); |
diff --git a/drivers/net/pcmcia/fmvj18x_cs.c b/drivers/net/pcmcia/fmvj18x_cs.c index 560d4ee22803..dad6393052ff 100644 --- a/drivers/net/pcmcia/fmvj18x_cs.c +++ b/drivers/net/pcmcia/fmvj18x_cs.c | |||
@@ -109,7 +109,6 @@ static void fjn_tx_timeout(struct net_device *dev); | |||
109 | static struct ethtool_ops netdev_ethtool_ops; | 109 | static struct ethtool_ops netdev_ethtool_ops; |
110 | 110 | ||
111 | static dev_info_t dev_info = "fmvj18x_cs"; | 111 | static dev_info_t dev_info = "fmvj18x_cs"; |
112 | static dev_link_t *dev_list; | ||
113 | 112 | ||
114 | /* | 113 | /* |
115 | card type | 114 | card type |
@@ -283,8 +282,7 @@ static dev_link_t *fmvj18x_attach(void) | |||
283 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 282 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
284 | 283 | ||
285 | /* Register with Card Services */ | 284 | /* Register with Card Services */ |
286 | link->next = dev_list; | 285 | link->next = NULL; |
287 | dev_list = link; | ||
288 | client_reg.dev_info = &dev_info; | 286 | client_reg.dev_info = &dev_info; |
289 | client_reg.Version = 0x0210; | 287 | client_reg.Version = 0x0210; |
290 | client_reg.event_callback_args.client_data = link; | 288 | client_reg.event_callback_args.client_data = link; |
@@ -304,15 +302,8 @@ static void fmvj18x_detach(struct pcmcia_device *p_dev) | |||
304 | { | 302 | { |
305 | dev_link_t *link = dev_to_instance(p_dev); | 303 | dev_link_t *link = dev_to_instance(p_dev); |
306 | struct net_device *dev = link->priv; | 304 | struct net_device *dev = link->priv; |
307 | dev_link_t **linkp; | 305 | |
308 | |||
309 | DEBUG(0, "fmvj18x_detach(0x%p)\n", link); | 306 | DEBUG(0, "fmvj18x_detach(0x%p)\n", link); |
310 | |||
311 | /* Locate device structure */ | ||
312 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
313 | if (*linkp == link) break; | ||
314 | if (*linkp == NULL) | ||
315 | return; | ||
316 | 307 | ||
317 | if (link->dev) | 308 | if (link->dev) |
318 | unregister_netdev(dev); | 309 | unregister_netdev(dev); |
@@ -320,8 +311,6 @@ static void fmvj18x_detach(struct pcmcia_device *p_dev) | |||
320 | if (link->state & DEV_CONFIG) | 311 | if (link->state & DEV_CONFIG) |
321 | fmvj18x_release(link); | 312 | fmvj18x_release(link); |
322 | 313 | ||
323 | /* Unlink device structure, free pieces */ | ||
324 | *linkp = link->next; | ||
325 | free_netdev(dev); | 314 | free_netdev(dev); |
326 | } /* fmvj18x_detach */ | 315 | } /* fmvj18x_detach */ |
327 | 316 | ||
@@ -807,7 +796,6 @@ static int __init init_fmvj18x_cs(void) | |||
807 | static void __exit exit_fmvj18x_cs(void) | 796 | static void __exit exit_fmvj18x_cs(void) |
808 | { | 797 | { |
809 | pcmcia_unregister_driver(&fmvj18x_cs_driver); | 798 | pcmcia_unregister_driver(&fmvj18x_cs_driver); |
810 | BUG_ON(dev_list != NULL); | ||
811 | } | 799 | } |
812 | 800 | ||
813 | module_init(init_fmvj18x_cs); | 801 | module_init(init_fmvj18x_cs); |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index 961294983354..90da35d1f4a5 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -116,8 +116,6 @@ static dev_info_t dev_info = "ibmtr_cs"; | |||
116 | static dev_link_t *ibmtr_attach(void); | 116 | static dev_link_t *ibmtr_attach(void); |
117 | static void ibmtr_detach(struct pcmcia_device *p_dev); | 117 | static void ibmtr_detach(struct pcmcia_device *p_dev); |
118 | 118 | ||
119 | static dev_link_t *dev_list; | ||
120 | |||
121 | /*====================================================================*/ | 119 | /*====================================================================*/ |
122 | 120 | ||
123 | typedef struct ibmtr_dev_t { | 121 | typedef struct ibmtr_dev_t { |
@@ -186,8 +184,7 @@ static dev_link_t *ibmtr_attach(void) | |||
186 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 184 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
187 | 185 | ||
188 | /* Register with Card Services */ | 186 | /* Register with Card Services */ |
189 | link->next = dev_list; | 187 | link->next = NULL; |
190 | dev_list = link; | ||
191 | client_reg.dev_info = &dev_info; | 188 | client_reg.dev_info = &dev_info; |
192 | client_reg.Version = 0x0210; | 189 | client_reg.Version = 0x0210; |
193 | client_reg.event_callback_args.client_data = link; | 190 | client_reg.event_callback_args.client_data = link; |
@@ -219,19 +216,10 @@ static void ibmtr_detach(struct pcmcia_device *p_dev) | |||
219 | { | 216 | { |
220 | dev_link_t *link = dev_to_instance(p_dev); | 217 | dev_link_t *link = dev_to_instance(p_dev); |
221 | struct ibmtr_dev_t *info = link->priv; | 218 | struct ibmtr_dev_t *info = link->priv; |
222 | dev_link_t **linkp; | 219 | struct net_device *dev = info->dev; |
223 | struct net_device *dev; | ||
224 | 220 | ||
225 | DEBUG(0, "ibmtr_detach(0x%p)\n", link); | 221 | DEBUG(0, "ibmtr_detach(0x%p)\n", link); |
226 | 222 | ||
227 | /* Locate device structure */ | ||
228 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
229 | if (*linkp == link) break; | ||
230 | if (*linkp == NULL) | ||
231 | return; | ||
232 | |||
233 | dev = info->dev; | ||
234 | |||
235 | if (link->dev) | 223 | if (link->dev) |
236 | unregister_netdev(dev); | 224 | unregister_netdev(dev); |
237 | 225 | ||
@@ -242,10 +230,8 @@ static void ibmtr_detach(struct pcmcia_device *p_dev) | |||
242 | if (link->state & DEV_CONFIG) | 230 | if (link->state & DEV_CONFIG) |
243 | ibmtr_release(link); | 231 | ibmtr_release(link); |
244 | 232 | ||
245 | /* Unlink device structure, free bits */ | ||
246 | *linkp = link->next; | ||
247 | free_netdev(dev); | 233 | free_netdev(dev); |
248 | kfree(info); | 234 | kfree(info); |
249 | } /* ibmtr_detach */ | 235 | } /* ibmtr_detach */ |
250 | 236 | ||
251 | /*====================================================================== | 237 | /*====================================================================== |
@@ -530,7 +516,6 @@ static int __init init_ibmtr_cs(void) | |||
530 | static void __exit exit_ibmtr_cs(void) | 516 | static void __exit exit_ibmtr_cs(void) |
531 | { | 517 | { |
532 | pcmcia_unregister_driver(&ibmtr_cs_driver); | 518 | pcmcia_unregister_driver(&ibmtr_cs_driver); |
533 | BUG_ON(dev_list != NULL); | ||
534 | } | 519 | } |
535 | 520 | ||
536 | module_init(init_ibmtr_cs); | 521 | module_init(init_ibmtr_cs); |
diff --git a/drivers/net/pcmcia/nmclan_cs.c b/drivers/net/pcmcia/nmclan_cs.c index 011ceb090320..0c9cb9f49a81 100644 --- a/drivers/net/pcmcia/nmclan_cs.c +++ b/drivers/net/pcmcia/nmclan_cs.c | |||
@@ -389,7 +389,6 @@ DRV_NAME " " DRV_VERSION " (Roger C. Pao)"; | |||
389 | #endif | 389 | #endif |
390 | 390 | ||
391 | static dev_info_t dev_info="nmclan_cs"; | 391 | static dev_info_t dev_info="nmclan_cs"; |
392 | static dev_link_t *dev_list; | ||
393 | 392 | ||
394 | static char *if_names[]={ | 393 | static char *if_names[]={ |
395 | "Auto", "10baseT", "BNC", | 394 | "Auto", "10baseT", "BNC", |
@@ -498,8 +497,7 @@ static dev_link_t *nmclan_attach(void) | |||
498 | #endif | 497 | #endif |
499 | 498 | ||
500 | /* Register with Card Services */ | 499 | /* Register with Card Services */ |
501 | link->next = dev_list; | 500 | link->next = NULL; |
502 | dev_list = link; | ||
503 | client_reg.dev_info = &dev_info; | 501 | client_reg.dev_info = &dev_info; |
504 | client_reg.Version = 0x0210; | 502 | client_reg.Version = 0x0210; |
505 | client_reg.event_callback_args.client_data = link; | 503 | client_reg.event_callback_args.client_data = link; |
@@ -525,24 +523,15 @@ static void nmclan_detach(struct pcmcia_device *p_dev) | |||
525 | { | 523 | { |
526 | dev_link_t *link = dev_to_instance(p_dev); | 524 | dev_link_t *link = dev_to_instance(p_dev); |
527 | struct net_device *dev = link->priv; | 525 | struct net_device *dev = link->priv; |
528 | dev_link_t **linkp; | ||
529 | 526 | ||
530 | DEBUG(0, "nmclan_detach(0x%p)\n", link); | 527 | DEBUG(0, "nmclan_detach(0x%p)\n", link); |
531 | 528 | ||
532 | /* Locate device structure */ | ||
533 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
534 | if (*linkp == link) break; | ||
535 | if (*linkp == NULL) | ||
536 | return; | ||
537 | |||
538 | if (link->dev) | 529 | if (link->dev) |
539 | unregister_netdev(dev); | 530 | unregister_netdev(dev); |
540 | 531 | ||
541 | if (link->state & DEV_CONFIG) | 532 | if (link->state & DEV_CONFIG) |
542 | nmclan_release(link); | 533 | nmclan_release(link); |
543 | 534 | ||
544 | /* Unlink device structure, free bits */ | ||
545 | *linkp = link->next; | ||
546 | free_netdev(dev); | 535 | free_netdev(dev); |
547 | } /* nmclan_detach */ | 536 | } /* nmclan_detach */ |
548 | 537 | ||
@@ -1700,7 +1689,6 @@ static int __init init_nmclan_cs(void) | |||
1700 | static void __exit exit_nmclan_cs(void) | 1689 | static void __exit exit_nmclan_cs(void) |
1701 | { | 1690 | { |
1702 | pcmcia_unregister_driver(&nmclan_cs_driver); | 1691 | pcmcia_unregister_driver(&nmclan_cs_driver); |
1703 | BUG_ON(dev_list != NULL); | ||
1704 | } | 1692 | } |
1705 | 1693 | ||
1706 | module_init(init_nmclan_cs); | 1694 | module_init(init_nmclan_cs); |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index fb3e411d6daf..b35c951fc6fa 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -124,7 +124,6 @@ static dev_link_t *pcnet_attach(void); | |||
124 | static void pcnet_detach(struct pcmcia_device *p_dev); | 124 | static void pcnet_detach(struct pcmcia_device *p_dev); |
125 | 125 | ||
126 | static dev_info_t dev_info = "pcnet_cs"; | 126 | static dev_info_t dev_info = "pcnet_cs"; |
127 | static dev_link_t *dev_list; | ||
128 | 127 | ||
129 | /*====================================================================*/ | 128 | /*====================================================================*/ |
130 | 129 | ||
@@ -272,8 +271,7 @@ static dev_link_t *pcnet_attach(void) | |||
272 | dev->set_config = &set_config; | 271 | dev->set_config = &set_config; |
273 | 272 | ||
274 | /* Register with Card Services */ | 273 | /* Register with Card Services */ |
275 | link->next = dev_list; | 274 | link->next = NULL; |
276 | dev_list = link; | ||
277 | client_reg.dev_info = &dev_info; | 275 | client_reg.dev_info = &dev_info; |
278 | client_reg.Version = 0x0210; | 276 | client_reg.Version = 0x0210; |
279 | client_reg.event_callback_args.client_data = link; | 277 | client_reg.event_callback_args.client_data = link; |
@@ -300,24 +298,15 @@ static void pcnet_detach(struct pcmcia_device *p_dev) | |||
300 | { | 298 | { |
301 | dev_link_t *link = dev_to_instance(p_dev); | 299 | dev_link_t *link = dev_to_instance(p_dev); |
302 | struct net_device *dev = link->priv; | 300 | struct net_device *dev = link->priv; |
303 | dev_link_t **linkp; | ||
304 | 301 | ||
305 | DEBUG(0, "pcnet_detach(0x%p)\n", link); | 302 | DEBUG(0, "pcnet_detach(0x%p)\n", link); |
306 | 303 | ||
307 | /* Locate device structure */ | ||
308 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
309 | if (*linkp == link) break; | ||
310 | if (*linkp == NULL) | ||
311 | return; | ||
312 | |||
313 | if (link->dev) | 304 | if (link->dev) |
314 | unregister_netdev(dev); | 305 | unregister_netdev(dev); |
315 | 306 | ||
316 | if (link->state & DEV_CONFIG) | 307 | if (link->state & DEV_CONFIG) |
317 | pcnet_release(link); | 308 | pcnet_release(link); |
318 | 309 | ||
319 | /* Unlink device structure, free bits */ | ||
320 | *linkp = link->next; | ||
321 | free_netdev(dev); | 310 | free_netdev(dev); |
322 | } /* pcnet_detach */ | 311 | } /* pcnet_detach */ |
323 | 312 | ||
@@ -1864,7 +1853,6 @@ static void __exit exit_pcnet_cs(void) | |||
1864 | { | 1853 | { |
1865 | DEBUG(0, "pcnet_cs: unloading\n"); | 1854 | DEBUG(0, "pcnet_cs: unloading\n"); |
1866 | pcmcia_unregister_driver(&pcnet_driver); | 1855 | pcmcia_unregister_driver(&pcnet_driver); |
1867 | BUG_ON(dev_list != NULL); | ||
1868 | } | 1856 | } |
1869 | 1857 | ||
1870 | module_init(init_pcnet_cs); | 1858 | module_init(init_pcnet_cs); |
diff --git a/drivers/net/pcmcia/smc91c92_cs.c b/drivers/net/pcmcia/smc91c92_cs.c index 6cb5198d6094..9eb5cecfb2f5 100644 --- a/drivers/net/pcmcia/smc91c92_cs.c +++ b/drivers/net/pcmcia/smc91c92_cs.c | |||
@@ -104,8 +104,6 @@ static const char *version = | |||
104 | 104 | ||
105 | static dev_info_t dev_info = "smc91c92_cs"; | 105 | static dev_info_t dev_info = "smc91c92_cs"; |
106 | 106 | ||
107 | static dev_link_t *dev_list; | ||
108 | |||
109 | struct smc_private { | 107 | struct smc_private { |
110 | dev_link_t link; | 108 | dev_link_t link; |
111 | spinlock_t lock; | 109 | spinlock_t lock; |
@@ -367,8 +365,7 @@ static dev_link_t *smc91c92_attach(void) | |||
367 | smc->mii_if.reg_num_mask = 0x1f; | 365 | smc->mii_if.reg_num_mask = 0x1f; |
368 | 366 | ||
369 | /* Register with Card Services */ | 367 | /* Register with Card Services */ |
370 | link->next = dev_list; | 368 | link->next = NULL; |
371 | dev_list = link; | ||
372 | client_reg.dev_info = &dev_info; | 369 | client_reg.dev_info = &dev_info; |
373 | client_reg.Version = 0x0210; | 370 | client_reg.Version = 0x0210; |
374 | client_reg.event_callback_args.client_data = link; | 371 | client_reg.event_callback_args.client_data = link; |
@@ -395,24 +392,15 @@ static void smc91c92_detach(struct pcmcia_device *p_dev) | |||
395 | { | 392 | { |
396 | dev_link_t *link = dev_to_instance(p_dev); | 393 | dev_link_t *link = dev_to_instance(p_dev); |
397 | struct net_device *dev = link->priv; | 394 | struct net_device *dev = link->priv; |
398 | dev_link_t **linkp; | ||
399 | 395 | ||
400 | DEBUG(0, "smc91c92_detach(0x%p)\n", link); | 396 | DEBUG(0, "smc91c92_detach(0x%p)\n", link); |
401 | 397 | ||
402 | /* Locate device structure */ | ||
403 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
404 | if (*linkp == link) break; | ||
405 | if (*linkp == NULL) | ||
406 | return; | ||
407 | |||
408 | if (link->dev) | 398 | if (link->dev) |
409 | unregister_netdev(dev); | 399 | unregister_netdev(dev); |
410 | 400 | ||
411 | if (link->state & DEV_CONFIG) | 401 | if (link->state & DEV_CONFIG) |
412 | smc91c92_release(link); | 402 | smc91c92_release(link); |
413 | 403 | ||
414 | /* Unlink device structure, free bits */ | ||
415 | *linkp = link->next; | ||
416 | free_netdev(dev); | 404 | free_netdev(dev); |
417 | } /* smc91c92_detach */ | 405 | } /* smc91c92_detach */ |
418 | 406 | ||
@@ -2377,7 +2365,6 @@ static int __init init_smc91c92_cs(void) | |||
2377 | static void __exit exit_smc91c92_cs(void) | 2365 | static void __exit exit_smc91c92_cs(void) |
2378 | { | 2366 | { |
2379 | pcmcia_unregister_driver(&smc91c92_cs_driver); | 2367 | pcmcia_unregister_driver(&smc91c92_cs_driver); |
2380 | BUG_ON(dev_list != NULL); | ||
2381 | } | 2368 | } |
2382 | 2369 | ||
2383 | module_init(init_smc91c92_cs); | 2370 | module_init(init_smc91c92_cs); |
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 804e56771baf..8c8cc40bbb7d 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
@@ -331,15 +331,7 @@ static dev_info_t dev_info = "xirc2ps_cs"; | |||
331 | * device numbers are used to derive the corresponding array index. | 331 | * device numbers are used to derive the corresponding array index. |
332 | */ | 332 | */ |
333 | 333 | ||
334 | static dev_link_t *dev_list; | ||
335 | |||
336 | /**************** | 334 | /**************** |
337 | * A dev_link_t structure has fields for most things that are needed | ||
338 | * to keep track of a socket, but there will usually be some device | ||
339 | * specific information that also needs to be kept track of. The | ||
340 | * 'priv' pointer in a dev_link_t structure can be used to point to | ||
341 | * a device-specific private data structure, like this. | ||
342 | * | ||
343 | * A driver needs to provide a dev_node_t structure for each device | 335 | * A driver needs to provide a dev_node_t structure for each device |
344 | * on a card. In some cases, there is only one device per card (for | 336 | * on a card. In some cases, there is only one device per card (for |
345 | * example, ethernet cards, modems). In other cases, there may be | 337 | * example, ethernet cards, modems). In other cases, there may be |
@@ -615,8 +607,7 @@ xirc2ps_attach(void) | |||
615 | #endif | 607 | #endif |
616 | 608 | ||
617 | /* Register with Card Services */ | 609 | /* Register with Card Services */ |
618 | link->next = dev_list; | 610 | link->next = NULL; |
619 | dev_list = link; | ||
620 | client_reg.dev_info = &dev_info; | 611 | client_reg.dev_info = &dev_info; |
621 | client_reg.Version = 0x0210; | 612 | client_reg.Version = 0x0210; |
622 | client_reg.event_callback_args.client_data = link; | 613 | client_reg.event_callback_args.client_data = link; |
@@ -641,27 +632,15 @@ xirc2ps_detach(struct pcmcia_device *p_dev) | |||
641 | { | 632 | { |
642 | dev_link_t *link = dev_to_instance(p_dev); | 633 | dev_link_t *link = dev_to_instance(p_dev); |
643 | struct net_device *dev = link->priv; | 634 | struct net_device *dev = link->priv; |
644 | dev_link_t **linkp; | ||
645 | 635 | ||
646 | DEBUG(0, "detach(0x%p)\n", link); | 636 | DEBUG(0, "detach(0x%p)\n", link); |
647 | 637 | ||
648 | /* Locate device structure */ | ||
649 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
650 | if (*linkp == link) | ||
651 | break; | ||
652 | if (!*linkp) { | ||
653 | DEBUG(0, "detach(0x%p): dev_link lost\n", link); | ||
654 | return; | ||
655 | } | ||
656 | |||
657 | if (link->dev) | 638 | if (link->dev) |
658 | unregister_netdev(dev); | 639 | unregister_netdev(dev); |
659 | 640 | ||
660 | if (link->state & DEV_CONFIG) | 641 | if (link->state & DEV_CONFIG) |
661 | xirc2ps_release(link); | 642 | xirc2ps_release(link); |
662 | 643 | ||
663 | /* Unlink device structure, free it */ | ||
664 | *linkp = link->next; | ||
665 | free_netdev(dev); | 644 | free_netdev(dev); |
666 | } /* xirc2ps_detach */ | 645 | } /* xirc2ps_detach */ |
667 | 646 | ||
@@ -2020,7 +1999,6 @@ static void __exit | |||
2020 | exit_xirc2ps_cs(void) | 1999 | exit_xirc2ps_cs(void) |
2021 | { | 2000 | { |
2022 | pcmcia_unregister_driver(&xirc2ps_cs_driver); | 2001 | pcmcia_unregister_driver(&xirc2ps_cs_driver); |
2023 | BUG_ON(dev_list != NULL); | ||
2024 | } | 2002 | } |
2025 | 2003 | ||
2026 | module_init(init_xirc2ps_cs); | 2004 | module_init(init_xirc2ps_cs); |
diff --git a/drivers/net/wireless/airo_cs.c b/drivers/net/wireless/airo_cs.c index 7a28139544c0..88805a4c29f1 100644 --- a/drivers/net/wireless/airo_cs.c +++ b/drivers/net/wireless/airo_cs.c | |||
@@ -119,15 +119,7 @@ static dev_info_t dev_info = "airo_cs"; | |||
119 | device numbers are used to derive the corresponding array index. | 119 | device numbers are used to derive the corresponding array index. |
120 | */ | 120 | */ |
121 | 121 | ||
122 | static dev_link_t *dev_list = NULL; | ||
123 | |||
124 | /* | 122 | /* |
125 | A dev_link_t structure has fields for most things that are needed | ||
126 | to keep track of a socket, but there will usually be some device | ||
127 | specific information that also needs to be kept track of. The | ||
128 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
129 | a device-specific private data structure, like this. | ||
130 | |||
131 | A driver needs to provide a dev_node_t structure for each device | 123 | A driver needs to provide a dev_node_t structure for each device |
132 | on a card. In some cases, there is only one device per card (for | 124 | on a card. In some cases, there is only one device per card (for |
133 | example, ethernet cards, modems). In other cases, there may be | 125 | example, ethernet cards, modems). In other cases, there may be |
@@ -202,8 +194,7 @@ static dev_link_t *airo_attach(void) | |||
202 | link->priv = local; | 194 | link->priv = local; |
203 | 195 | ||
204 | /* Register with Card Services */ | 196 | /* Register with Card Services */ |
205 | link->next = dev_list; | 197 | link->next = NULL; |
206 | dev_list = link; | ||
207 | client_reg.dev_info = &dev_info; | 198 | client_reg.dev_info = &dev_info; |
208 | client_reg.Version = 0x0210; | 199 | client_reg.Version = 0x0210; |
209 | client_reg.event_callback_args.client_data = link; | 200 | client_reg.event_callback_args.client_data = link; |
@@ -229,29 +220,19 @@ static dev_link_t *airo_attach(void) | |||
229 | static void airo_detach(struct pcmcia_device *p_dev) | 220 | static void airo_detach(struct pcmcia_device *p_dev) |
230 | { | 221 | { |
231 | dev_link_t *link = dev_to_instance(p_dev); | 222 | dev_link_t *link = dev_to_instance(p_dev); |
232 | dev_link_t **linkp; | 223 | |
233 | |||
234 | DEBUG(0, "airo_detach(0x%p)\n", link); | 224 | DEBUG(0, "airo_detach(0x%p)\n", link); |
235 | 225 | ||
236 | /* Locate device structure */ | ||
237 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
238 | if (*linkp == link) break; | ||
239 | if (*linkp == NULL) | ||
240 | return; | ||
241 | |||
242 | if (link->state & DEV_CONFIG) | 226 | if (link->state & DEV_CONFIG) |
243 | airo_release(link); | 227 | airo_release(link); |
244 | 228 | ||
245 | if ( ((local_info_t*)link->priv)->eth_dev ) { | 229 | if ( ((local_info_t*)link->priv)->eth_dev ) { |
246 | stop_airo_card( ((local_info_t*)link->priv)->eth_dev, 0 ); | 230 | stop_airo_card( ((local_info_t*)link->priv)->eth_dev, 0 ); |
247 | } | 231 | } |
248 | ((local_info_t*)link->priv)->eth_dev = NULL; | 232 | ((local_info_t*)link->priv)->eth_dev = NULL; |
249 | 233 | ||
250 | /* Unlink device structure, free pieces */ | ||
251 | *linkp = link->next; | ||
252 | kfree(link->priv); | 234 | kfree(link->priv); |
253 | kfree(link); | 235 | kfree(link); |
254 | |||
255 | } /* airo_detach */ | 236 | } /* airo_detach */ |
256 | 237 | ||
257 | /*====================================================================== | 238 | /*====================================================================== |
@@ -574,7 +555,6 @@ static int airo_cs_init(void) | |||
574 | static void airo_cs_cleanup(void) | 555 | static void airo_cs_cleanup(void) |
575 | { | 556 | { |
576 | pcmcia_unregister_driver(&airo_driver); | 557 | pcmcia_unregister_driver(&airo_driver); |
577 | BUG_ON(dev_list != NULL); | ||
578 | } | 558 | } |
579 | 559 | ||
580 | /* | 560 | /* |
diff --git a/drivers/net/wireless/atmel_cs.c b/drivers/net/wireless/atmel_cs.c index 3ab33dd49ea2..32f009709355 100644 --- a/drivers/net/wireless/atmel_cs.c +++ b/drivers/net/wireless/atmel_cs.c | |||
@@ -130,15 +130,7 @@ static dev_info_t dev_info = "atmel_cs"; | |||
130 | device numbers are used to derive the corresponding array index. | 130 | device numbers are used to derive the corresponding array index. |
131 | */ | 131 | */ |
132 | 132 | ||
133 | static dev_link_t *dev_list = NULL; | ||
134 | |||
135 | /* | 133 | /* |
136 | A dev_link_t structure has fields for most things that are needed | ||
137 | to keep track of a socket, but there will usually be some device | ||
138 | specific information that also needs to be kept track of. The | ||
139 | 'priv' pointer in a dev_link_t structure can be used to point to | ||
140 | a device-specific private data structure, like this. | ||
141 | |||
142 | A driver needs to provide a dev_node_t structure for each device | 134 | A driver needs to provide a dev_node_t structure for each device |
143 | on a card. In some cases, there is only one device per card (for | 135 | on a card. In some cases, there is only one device per card (for |
144 | example, ethernet cards, modems). In other cases, there may be | 136 | example, ethernet cards, modems). In other cases, there may be |
@@ -213,8 +205,7 @@ static dev_link_t *atmel_attach(void) | |||
213 | link->priv = local; | 205 | link->priv = local; |
214 | 206 | ||
215 | /* Register with Card Services */ | 207 | /* Register with Card Services */ |
216 | link->next = dev_list; | 208 | link->next = NULL; |
217 | dev_list = link; | ||
218 | client_reg.dev_info = &dev_info; | 209 | client_reg.dev_info = &dev_info; |
219 | client_reg.Version = 0x0210; | 210 | client_reg.Version = 0x0210; |
220 | client_reg.event_callback_args.client_data = link; | 211 | client_reg.event_callback_args.client_data = link; |
@@ -240,21 +231,12 @@ static dev_link_t *atmel_attach(void) | |||
240 | static void atmel_detach(struct pcmcia_device *p_dev) | 231 | static void atmel_detach(struct pcmcia_device *p_dev) |
241 | { | 232 | { |
242 | dev_link_t *link = dev_to_instance(p_dev); | 233 | dev_link_t *link = dev_to_instance(p_dev); |
243 | dev_link_t **linkp; | 234 | |
244 | |||
245 | DEBUG(0, "atmel_detach(0x%p)\n", link); | 235 | DEBUG(0, "atmel_detach(0x%p)\n", link); |
246 | |||
247 | /* Locate device structure */ | ||
248 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
249 | if (*linkp == link) break; | ||
250 | if (*linkp == NULL) | ||
251 | return; | ||
252 | 236 | ||
253 | if (link->state & DEV_CONFIG) | 237 | if (link->state & DEV_CONFIG) |
254 | atmel_release(link); | 238 | atmel_release(link); |
255 | 239 | ||
256 | /* Unlink device structure, free pieces */ | ||
257 | *linkp = link->next; | ||
258 | kfree(link->priv); | 240 | kfree(link->priv); |
259 | kfree(link); | 241 | kfree(link); |
260 | } | 242 | } |
@@ -596,7 +578,6 @@ static int atmel_cs_init(void) | |||
596 | static void atmel_cs_cleanup(void) | 578 | static void atmel_cs_cleanup(void) |
597 | { | 579 | { |
598 | pcmcia_unregister_driver(&atmel_driver); | 580 | pcmcia_unregister_driver(&atmel_driver); |
599 | BUG_ON(dev_list != NULL); | ||
600 | } | 581 | } |
601 | 582 | ||
602 | /* | 583 | /* |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 866142af7d92..195a5bf3d725 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | static char *version = PRISM2_VERSION " (Jouni Malinen <jkmaline@cc.hut.fi>)"; | 26 | static char *version = PRISM2_VERSION " (Jouni Malinen <jkmaline@cc.hut.fi>)"; |
27 | static dev_info_t dev_info = "hostap_cs"; | 27 | static dev_info_t dev_info = "hostap_cs"; |
28 | static dev_link_t *dev_list = NULL; | ||
29 | 28 | ||
30 | MODULE_AUTHOR("Jouni Malinen"); | 29 | MODULE_AUTHOR("Jouni Malinen"); |
31 | MODULE_DESCRIPTION("Support for Intersil Prism2-based 802.11 wireless LAN " | 30 | MODULE_DESCRIPTION("Support for Intersil Prism2-based 802.11 wireless LAN " |
@@ -520,8 +519,7 @@ static dev_link_t *prism2_attach(void) | |||
520 | link->conf.IntType = INT_MEMORY_AND_IO; | 519 | link->conf.IntType = INT_MEMORY_AND_IO; |
521 | 520 | ||
522 | /* register with CardServices */ | 521 | /* register with CardServices */ |
523 | link->next = dev_list; | 522 | link->next = NULL; |
524 | dev_list = link; | ||
525 | client_reg.dev_info = &dev_info; | 523 | client_reg.dev_info = &dev_info; |
526 | client_reg.Version = 0x0210; | 524 | client_reg.Version = 0x0210; |
527 | client_reg.event_callback_args.client_data = link; | 525 | client_reg.event_callback_args.client_data = link; |
@@ -538,24 +536,13 @@ static dev_link_t *prism2_attach(void) | |||
538 | static void prism2_detach(struct pcmcia_device *p_dev) | 536 | static void prism2_detach(struct pcmcia_device *p_dev) |
539 | { | 537 | { |
540 | dev_link_t *link = dev_to_instance(p_dev); | 538 | dev_link_t *link = dev_to_instance(p_dev); |
541 | dev_link_t **linkp; | ||
542 | 539 | ||
543 | PDEBUG(DEBUG_FLOW, "prism2_detach\n"); | 540 | PDEBUG(DEBUG_FLOW, "prism2_detach\n"); |
544 | 541 | ||
545 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
546 | if (*linkp == link) | ||
547 | break; | ||
548 | if (*linkp == NULL) { | ||
549 | printk(KERN_WARNING "%s: Attempt to detach non-existing " | ||
550 | "PCMCIA client\n", dev_info); | ||
551 | return; | ||
552 | } | ||
553 | |||
554 | if (link->state & DEV_CONFIG) { | 542 | if (link->state & DEV_CONFIG) { |
555 | prism2_release((u_long)link); | 543 | prism2_release((u_long)link); |
556 | } | 544 | } |
557 | 545 | ||
558 | *linkp = link->next; | ||
559 | /* release net devices */ | 546 | /* release net devices */ |
560 | if (link->priv) { | 547 | if (link->priv) { |
561 | struct hostap_cs_priv *hw_priv; | 548 | struct hostap_cs_priv *hw_priv; |
diff --git a/drivers/net/wireless/netwave_cs.c b/drivers/net/wireless/netwave_cs.c index 1770677d9e10..af9a32d8d22d 100644 --- a/drivers/net/wireless/netwave_cs.c +++ b/drivers/net/wireless/netwave_cs.c | |||
@@ -228,17 +228,6 @@ static struct iw_statistics* netwave_get_wireless_stats(struct net_device *dev); | |||
228 | static void set_multicast_list(struct net_device *dev); | 228 | static void set_multicast_list(struct net_device *dev); |
229 | 229 | ||
230 | /* | 230 | /* |
231 | A linked list of "instances" of the skeleton device. Each actual | ||
232 | PCMCIA card corresponds to one device instance, and is described | ||
233 | by one dev_link_t structure (defined in ds.h). | ||
234 | |||
235 | You may not want to use a linked list for this -- for example, the | ||
236 | memory card driver uses an array of dev_link_t pointers, where minor | ||
237 | device numbers are used to derive the corresponding array index. | ||
238 | */ | ||
239 | static dev_link_t *dev_list; | ||
240 | |||
241 | /* | ||
242 | A dev_link_t structure has fields for most things that are needed | 231 | A dev_link_t structure has fields for most things that are needed |
243 | to keep track of a socket, but there will usually be some device | 232 | to keep track of a socket, but there will usually be some device |
244 | specific information that also needs to be kept track of. The | 233 | specific information that also needs to be kept track of. The |
@@ -451,8 +440,7 @@ static dev_link_t *netwave_attach(void) | |||
451 | link->irq.Instance = dev; | 440 | link->irq.Instance = dev; |
452 | 441 | ||
453 | /* Register with Card Services */ | 442 | /* Register with Card Services */ |
454 | link->next = dev_list; | 443 | link->next = NULL; |
455 | dev_list = link; | ||
456 | client_reg.dev_info = &dev_info; | 444 | client_reg.dev_info = &dev_info; |
457 | client_reg.Version = 0x0210; | 445 | client_reg.Version = 0x0210; |
458 | client_reg.event_callback_args.client_data = link; | 446 | client_reg.event_callback_args.client_data = link; |
@@ -476,37 +464,18 @@ static dev_link_t *netwave_attach(void) | |||
476 | */ | 464 | */ |
477 | static void netwave_detach(struct pcmcia_device *p_dev) | 465 | static void netwave_detach(struct pcmcia_device *p_dev) |
478 | { | 466 | { |
479 | dev_link_t *link = dev_to_instance(p_dev); | 467 | dev_link_t *link = dev_to_instance(p_dev); |
480 | struct net_device *dev = link->priv; | 468 | struct net_device *dev = link->priv; |
481 | dev_link_t **linkp; | ||
482 | 469 | ||
483 | DEBUG(0, "netwave_detach(0x%p)\n", link); | 470 | DEBUG(0, "netwave_detach(0x%p)\n", link); |
484 | 471 | ||
485 | /* | 472 | if (link->state & DEV_CONFIG) |
486 | If the device is currently configured and active, we won't | 473 | netwave_release(link); |
487 | actually delete it yet. Instead, it is marked so that when | 474 | |
488 | the release() function is called, that will trigger a proper | 475 | if (link->dev) |
489 | detach(). | 476 | unregister_netdev(dev); |
490 | */ | 477 | |
491 | if (link->state & DEV_CONFIG) | 478 | free_netdev(dev); |
492 | netwave_release(link); | ||
493 | |||
494 | /* Locate device structure */ | ||
495 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
496 | if (*linkp == link) break; | ||
497 | if (*linkp == NULL) | ||
498 | { | ||
499 | DEBUG(1, "netwave_cs: detach fail, '%s' not in list\n", | ||
500 | link->dev->dev_name); | ||
501 | return; | ||
502 | } | ||
503 | |||
504 | /* Unlink device structure, free pieces */ | ||
505 | *linkp = link->next; | ||
506 | if (link->dev) | ||
507 | unregister_netdev(dev); | ||
508 | free_netdev(dev); | ||
509 | |||
510 | } /* netwave_detach */ | 479 | } /* netwave_detach */ |
511 | 480 | ||
512 | /* | 481 | /* |
@@ -1503,7 +1472,6 @@ static int __init init_netwave_cs(void) | |||
1503 | static void __exit exit_netwave_cs(void) | 1472 | static void __exit exit_netwave_cs(void) |
1504 | { | 1473 | { |
1505 | pcmcia_unregister_driver(&netwave_driver); | 1474 | pcmcia_unregister_driver(&netwave_driver); |
1506 | BUG_ON(dev_list != NULL); | ||
1507 | } | 1475 | } |
1508 | 1476 | ||
1509 | module_init(init_netwave_cs); | 1477 | module_init(init_netwave_cs); |
diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c index 00679b6c87c1..bfeeef49f0b3 100644 --- a/drivers/net/wireless/orinoco_cs.c +++ b/drivers/net/wireless/orinoco_cs.c | |||
@@ -69,12 +69,6 @@ struct orinoco_pccard { | |||
69 | unsigned long hard_reset_in_progress; | 69 | unsigned long hard_reset_in_progress; |
70 | }; | 70 | }; |
71 | 71 | ||
72 | /* | ||
73 | * A linked list of "instances" of the device. Each actual PCMCIA | ||
74 | * card corresponds to one device instance, and is described by one | ||
75 | * dev_link_t structure (defined in ds.h). | ||
76 | */ | ||
77 | static dev_link_t *dev_list; /* = NULL */ | ||
78 | 72 | ||
79 | /********************************************************************/ | 73 | /********************************************************************/ |
80 | /* Function prototypes */ | 74 | /* Function prototypes */ |
@@ -154,9 +148,7 @@ orinoco_cs_attach(void) | |||
154 | link->conf.IntType = INT_MEMORY_AND_IO; | 148 | link->conf.IntType = INT_MEMORY_AND_IO; |
155 | 149 | ||
156 | /* Register with Card Services */ | 150 | /* Register with Card Services */ |
157 | /* FIXME: need a lock? */ | 151 | link->next = NULL; |
158 | link->next = dev_list; | ||
159 | dev_list = link; | ||
160 | 152 | ||
161 | client_reg.dev_info = &dev_info; | 153 | client_reg.dev_info = &dev_info; |
162 | client_reg.Version = 0x0210; /* FIXME: what does this mean? */ | 154 | client_reg.Version = 0x0210; /* FIXME: what does this mean? */ |
@@ -181,21 +173,11 @@ orinoco_cs_attach(void) | |||
181 | static void orinoco_cs_detach(struct pcmcia_device *p_dev) | 173 | static void orinoco_cs_detach(struct pcmcia_device *p_dev) |
182 | { | 174 | { |
183 | dev_link_t *link = dev_to_instance(p_dev); | 175 | dev_link_t *link = dev_to_instance(p_dev); |
184 | dev_link_t **linkp; | ||
185 | struct net_device *dev = link->priv; | 176 | struct net_device *dev = link->priv; |
186 | 177 | ||
187 | /* Locate device structure */ | ||
188 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
189 | if (*linkp == link) | ||
190 | break; | ||
191 | |||
192 | BUG_ON(*linkp == NULL); | ||
193 | |||
194 | if (link->state & DEV_CONFIG) | 178 | if (link->state & DEV_CONFIG) |
195 | orinoco_cs_release(link); | 179 | orinoco_cs_release(link); |
196 | 180 | ||
197 | /* Unlink device structure, and free it */ | ||
198 | *linkp = link->next; | ||
199 | DEBUG(0, PFX "detach: link=%p link->dev=%p\n", link, link->dev); | 181 | DEBUG(0, PFX "detach: link=%p link->dev=%p\n", link, link->dev); |
200 | if (link->dev) { | 182 | if (link->dev) { |
201 | DEBUG(0, PFX "About to unregister net device %p\n", | 183 | DEBUG(0, PFX "About to unregister net device %p\n", |
@@ -678,7 +660,6 @@ static void __exit | |||
678 | exit_orinoco_cs(void) | 660 | exit_orinoco_cs(void) |
679 | { | 661 | { |
680 | pcmcia_unregister_driver(&orinoco_driver); | 662 | pcmcia_unregister_driver(&orinoco_driver); |
681 | BUG_ON(dev_list != NULL); | ||
682 | } | 663 | } |
683 | 664 | ||
684 | module_init(init_orinoco_cs); | 665 | module_init(init_orinoco_cs); |
diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index a2dcab7995c1..1933250dad1a 100644 --- a/drivers/net/wireless/spectrum_cs.c +++ b/drivers/net/wireless/spectrum_cs.c | |||
@@ -78,13 +78,6 @@ struct orinoco_pccard { | |||
78 | dev_node_t node; | 78 | dev_node_t node; |
79 | }; | 79 | }; |
80 | 80 | ||
81 | /* | ||
82 | * A linked list of "instances" of the device. Each actual PCMCIA | ||
83 | * card corresponds to one device instance, and is described by one | ||
84 | * dev_link_t structure (defined in ds.h). | ||
85 | */ | ||
86 | static dev_link_t *dev_list; /* = NULL */ | ||
87 | |||
88 | /********************************************************************/ | 81 | /********************************************************************/ |
89 | /* Function prototypes */ | 82 | /* Function prototypes */ |
90 | /********************************************************************/ | 83 | /********************************************************************/ |
@@ -637,8 +630,7 @@ spectrum_cs_attach(void) | |||
637 | 630 | ||
638 | /* Register with Card Services */ | 631 | /* Register with Card Services */ |
639 | /* FIXME: need a lock? */ | 632 | /* FIXME: need a lock? */ |
640 | link->next = dev_list; | 633 | link->next = NULL; /* not needed */ |
641 | dev_list = link; | ||
642 | 634 | ||
643 | client_reg.dev_info = &dev_info; | 635 | client_reg.dev_info = &dev_info; |
644 | client_reg.Version = 0x0210; /* FIXME: what does this mean? */ | 636 | client_reg.Version = 0x0210; /* FIXME: what does this mean? */ |
@@ -1049,7 +1041,6 @@ static void __exit | |||
1049 | exit_spectrum_cs(void) | 1041 | exit_spectrum_cs(void) |
1050 | { | 1042 | { |
1051 | pcmcia_unregister_driver(&orinoco_driver); | 1043 | pcmcia_unregister_driver(&orinoco_driver); |
1052 | BUG_ON(dev_list != NULL); | ||
1053 | } | 1044 | } |
1054 | 1045 | ||
1055 | module_init(init_spectrum_cs); | 1046 | module_init(init_spectrum_cs); |
diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index 255952d8cea0..196e827fc846 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c | |||
@@ -4627,8 +4627,7 @@ wavelan_attach(void) | |||
4627 | link->conf.IntType = INT_MEMORY_AND_IO; | 4627 | link->conf.IntType = INT_MEMORY_AND_IO; |
4628 | 4628 | ||
4629 | /* Chain drivers */ | 4629 | /* Chain drivers */ |
4630 | link->next = dev_list; | 4630 | link->next = NULL; |
4631 | dev_list = link; | ||
4632 | 4631 | ||
4633 | /* Allocate the generic data structure */ | 4632 | /* Allocate the generic data structure */ |
4634 | dev = alloc_etherdev(sizeof(net_local)); | 4633 | dev = alloc_etherdev(sizeof(net_local)); |
@@ -4731,27 +4730,6 @@ wavelan_detach(struct pcmcia_device *p_dev) | |||
4731 | wv_pcmcia_release(link); | 4730 | wv_pcmcia_release(link); |
4732 | } | 4731 | } |
4733 | 4732 | ||
4734 | /* Remove the interface data from the linked list */ | ||
4735 | if(dev_list == link) | ||
4736 | dev_list = link->next; | ||
4737 | else | ||
4738 | { | ||
4739 | dev_link_t * prev = dev_list; | ||
4740 | |||
4741 | while((prev != (dev_link_t *) NULL) && (prev->next != link)) | ||
4742 | prev = prev->next; | ||
4743 | |||
4744 | if(prev == (dev_link_t *) NULL) | ||
4745 | { | ||
4746 | #ifdef DEBUG_CONFIG_ERRORS | ||
4747 | printk(KERN_WARNING "wavelan_detach : Attempting to remove a nonexistent device.\n"); | ||
4748 | #endif | ||
4749 | return; | ||
4750 | } | ||
4751 | |||
4752 | prev->next = link->next; | ||
4753 | } | ||
4754 | |||
4755 | /* Free pieces */ | 4733 | /* Free pieces */ |
4756 | if(link->priv) | 4734 | if(link->priv) |
4757 | { | 4735 | { |
diff --git a/drivers/net/wireless/wavelan_cs.p.h b/drivers/net/wireless/wavelan_cs.p.h index 3cb34817c039..a1a19177c5cd 100644 --- a/drivers/net/wireless/wavelan_cs.p.h +++ b/drivers/net/wireless/wavelan_cs.p.h | |||
@@ -766,7 +766,6 @@ static int | |||
766 | /**************************** VARIABLES ****************************/ | 766 | /**************************** VARIABLES ****************************/ |
767 | 767 | ||
768 | static dev_info_t dev_info = "wavelan_cs"; | 768 | static dev_info_t dev_info = "wavelan_cs"; |
769 | static dev_link_t *dev_list = NULL; /* Linked list of devices */ | ||
770 | 769 | ||
771 | /* | 770 | /* |
772 | * Parameters that can be set with 'insmod' | 771 | * Parameters that can be set with 'insmod' |
diff --git a/drivers/parport/parport_cs.c b/drivers/parport/parport_cs.c index 063d22de9743..763f91a79085 100644 --- a/drivers/parport/parport_cs.c +++ b/drivers/parport/parport_cs.c | |||
@@ -95,7 +95,6 @@ static int parport_event(event_t event, int priority, | |||
95 | event_callback_args_t *args); | 95 | event_callback_args_t *args); |
96 | 96 | ||
97 | static dev_info_t dev_info = "parport_cs"; | 97 | static dev_info_t dev_info = "parport_cs"; |
98 | static dev_link_t *dev_list = NULL; | ||
99 | 98 | ||
100 | /*====================================================================== | 99 | /*====================================================================== |
101 | 100 | ||
@@ -129,8 +128,7 @@ static dev_link_t *parport_attach(void) | |||
129 | link->conf.IntType = INT_MEMORY_AND_IO; | 128 | link->conf.IntType = INT_MEMORY_AND_IO; |
130 | 129 | ||
131 | /* Register with Card Services */ | 130 | /* Register with Card Services */ |
132 | link->next = dev_list; | 131 | link->next = NULL; |
133 | dev_list = link; | ||
134 | client_reg.dev_info = &dev_info; | 132 | client_reg.dev_info = &dev_info; |
135 | client_reg.Version = 0x0210; | 133 | client_reg.Version = 0x0210; |
136 | client_reg.event_callback_args.client_data = link; | 134 | client_reg.event_callback_args.client_data = link; |
@@ -156,21 +154,12 @@ static dev_link_t *parport_attach(void) | |||
156 | static void parport_detach(struct pcmcia_device *p_dev) | 154 | static void parport_detach(struct pcmcia_device *p_dev) |
157 | { | 155 | { |
158 | dev_link_t *link = dev_to_instance(p_dev); | 156 | dev_link_t *link = dev_to_instance(p_dev); |
159 | dev_link_t **linkp; | ||
160 | 157 | ||
161 | DEBUG(0, "parport_detach(0x%p)\n", link); | 158 | DEBUG(0, "parport_detach(0x%p)\n", link); |
162 | 159 | ||
163 | /* Locate device structure */ | ||
164 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
165 | if (*linkp == link) break; | ||
166 | if (*linkp == NULL) | ||
167 | return; | ||
168 | |||
169 | if (link->state & DEV_CONFIG) | 160 | if (link->state & DEV_CONFIG) |
170 | parport_cs_release(link); | 161 | parport_cs_release(link); |
171 | 162 | ||
172 | /* Unlink, free device structure */ | ||
173 | *linkp = link->next; | ||
174 | kfree(link->priv); | 163 | kfree(link->priv); |
175 | } /* parport_detach */ | 164 | } /* parport_detach */ |
176 | 165 | ||
@@ -391,7 +380,6 @@ static int __init init_parport_cs(void) | |||
391 | static void __exit exit_parport_cs(void) | 380 | static void __exit exit_parport_cs(void) |
392 | { | 381 | { |
393 | pcmcia_unregister_driver(&parport_cs_driver); | 382 | pcmcia_unregister_driver(&parport_cs_driver); |
394 | BUG_ON(dev_list != NULL); | ||
395 | } | 383 | } |
396 | 384 | ||
397 | module_init(init_parport_cs); | 385 | module_init(init_parport_cs); |
diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c index 5842c938fff5..538fedb97924 100644 --- a/drivers/scsi/pcmcia/fdomain_stub.c +++ b/drivers/scsi/pcmcia/fdomain_stub.c | |||
@@ -87,8 +87,6 @@ static dev_link_t *fdomain_attach(void); | |||
87 | static void fdomain_detach(struct pcmcia_device *p_dev); | 87 | static void fdomain_detach(struct pcmcia_device *p_dev); |
88 | 88 | ||
89 | 89 | ||
90 | static dev_link_t *dev_list = NULL; | ||
91 | |||
92 | static dev_info_t dev_info = "fdomain_cs"; | 90 | static dev_info_t dev_info = "fdomain_cs"; |
93 | 91 | ||
94 | static dev_link_t *fdomain_attach(void) | 92 | static dev_link_t *fdomain_attach(void) |
@@ -116,8 +114,7 @@ static dev_link_t *fdomain_attach(void) | |||
116 | link->conf.Present = PRESENT_OPTION; | 114 | link->conf.Present = PRESENT_OPTION; |
117 | 115 | ||
118 | /* Register with Card Services */ | 116 | /* Register with Card Services */ |
119 | link->next = dev_list; | 117 | link->next = NULL; |
120 | dev_list = link; | ||
121 | client_reg.dev_info = &dev_info; | 118 | client_reg.dev_info = &dev_info; |
122 | client_reg.Version = 0x0210; | 119 | client_reg.Version = 0x0210; |
123 | client_reg.event_callback_args.client_data = link; | 120 | client_reg.event_callback_args.client_data = link; |
@@ -135,24 +132,14 @@ static dev_link_t *fdomain_attach(void) | |||
135 | 132 | ||
136 | static void fdomain_detach(struct pcmcia_device *p_dev) | 133 | static void fdomain_detach(struct pcmcia_device *p_dev) |
137 | { | 134 | { |
138 | dev_link_t *link = dev_to_instance(p_dev); | 135 | dev_link_t *link = dev_to_instance(p_dev); |
139 | dev_link_t **linkp; | ||
140 | 136 | ||
141 | DEBUG(0, "fdomain_detach(0x%p)\n", link); | 137 | DEBUG(0, "fdomain_detach(0x%p)\n", link); |
142 | 138 | ||
143 | /* Locate device structure */ | 139 | if (link->state & DEV_CONFIG) |
144 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | 140 | fdomain_release(link); |
145 | if (*linkp == link) break; | 141 | |
146 | if (*linkp == NULL) | 142 | kfree(link->priv); |
147 | return; | ||
148 | |||
149 | if (link->state & DEV_CONFIG) | ||
150 | fdomain_release(link); | ||
151 | |||
152 | /* Unlink device structure, free bits */ | ||
153 | *linkp = link->next; | ||
154 | kfree(link->priv); | ||
155 | |||
156 | } /* fdomain_detach */ | 143 | } /* fdomain_detach */ |
157 | 144 | ||
158 | /*====================================================================*/ | 145 | /*====================================================================*/ |
@@ -324,7 +311,6 @@ static int __init init_fdomain_cs(void) | |||
324 | static void __exit exit_fdomain_cs(void) | 311 | static void __exit exit_fdomain_cs(void) |
325 | { | 312 | { |
326 | pcmcia_unregister_driver(&fdomain_cs_driver); | 313 | pcmcia_unregister_driver(&fdomain_cs_driver); |
327 | BUG_ON(dev_list != NULL); | ||
328 | } | 314 | } |
329 | 315 | ||
330 | module_init(init_fdomain_cs); | 316 | module_init(init_fdomain_cs); |
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index e40a8c22aa9d..e48e9fb3c58c 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
@@ -104,7 +104,6 @@ static struct scsi_host_template nsp_driver_template = { | |||
104 | #endif | 104 | #endif |
105 | }; | 105 | }; |
106 | 106 | ||
107 | static dev_link_t *dev_list = NULL; | ||
108 | static dev_info_t dev_info = {"nsp_cs"}; | 107 | static dev_info_t dev_info = {"nsp_cs"}; |
109 | 108 | ||
110 | static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ | 109 | static nsp_hw_data nsp_data_base; /* attach <-> detect glue */ |
@@ -1638,8 +1637,7 @@ static dev_link_t *nsp_cs_attach(void) | |||
1638 | 1637 | ||
1639 | 1638 | ||
1640 | /* Register with Card Services */ | 1639 | /* Register with Card Services */ |
1641 | link->next = dev_list; | 1640 | link->next = NULL; |
1642 | dev_list = link; | ||
1643 | client_reg.dev_info = &dev_info; | 1641 | client_reg.dev_info = &dev_info; |
1644 | client_reg.Version = 0x0210; | 1642 | client_reg.Version = 0x0210; |
1645 | client_reg.event_callback_args.client_data = link; | 1643 | client_reg.event_callback_args.client_data = link; |
@@ -1665,30 +1663,16 @@ static dev_link_t *nsp_cs_attach(void) | |||
1665 | static void nsp_cs_detach(struct pcmcia_device *p_dev) | 1663 | static void nsp_cs_detach(struct pcmcia_device *p_dev) |
1666 | { | 1664 | { |
1667 | dev_link_t *link = dev_to_instance(p_dev); | 1665 | dev_link_t *link = dev_to_instance(p_dev); |
1668 | dev_link_t **linkp; | ||
1669 | 1666 | ||
1670 | nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); | 1667 | nsp_dbg(NSP_DEBUG_INIT, "in, link=0x%p", link); |
1671 | 1668 | ||
1672 | /* Locate device structure */ | ||
1673 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { | ||
1674 | if (*linkp == link) { | ||
1675 | break; | ||
1676 | } | ||
1677 | } | ||
1678 | if (*linkp == NULL) { | ||
1679 | return; | ||
1680 | } | ||
1681 | |||
1682 | if (link->state & DEV_CONFIG) { | 1669 | if (link->state & DEV_CONFIG) { |
1683 | ((scsi_info_t *)link->priv)->stop = 1; | 1670 | ((scsi_info_t *)link->priv)->stop = 1; |
1684 | nsp_cs_release(link); | 1671 | nsp_cs_release(link); |
1685 | } | 1672 | } |
1686 | 1673 | ||
1687 | /* Unlink device structure, free bits */ | ||
1688 | *linkp = link->next; | ||
1689 | kfree(link->priv); | 1674 | kfree(link->priv); |
1690 | link->priv = NULL; | 1675 | link->priv = NULL; |
1691 | |||
1692 | } /* nsp_cs_detach */ | 1676 | } /* nsp_cs_detach */ |
1693 | 1677 | ||
1694 | 1678 | ||
@@ -2168,7 +2152,6 @@ static void __exit nsp_cs_exit(void) | |||
2168 | 2152 | ||
2169 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) | 2153 | #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,68)) |
2170 | pcmcia_unregister_driver(&nsp_driver); | 2154 | pcmcia_unregister_driver(&nsp_driver); |
2171 | BUG_ON(dev_list != NULL); | ||
2172 | #else | 2155 | #else |
2173 | unregister_pcmcia_driver(&dev_info); | 2156 | unregister_pcmcia_driver(&dev_info); |
2174 | /* XXX: this really needs to move into generic code.. */ | 2157 | /* XXX: this really needs to move into generic code.. */ |
diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c index 8351dc234ffb..e10281a6e5f9 100644 --- a/drivers/scsi/pcmcia/qlogic_stub.c +++ b/drivers/scsi/pcmcia/qlogic_stub.c | |||
@@ -104,8 +104,6 @@ static dev_link_t *qlogic_attach(void); | |||
104 | static void qlogic_detach(struct pcmcia_device *p_dev); | 104 | static void qlogic_detach(struct pcmcia_device *p_dev); |
105 | 105 | ||
106 | 106 | ||
107 | static dev_link_t *dev_list = NULL; | ||
108 | |||
109 | static dev_info_t dev_info = "qlogic_cs"; | 107 | static dev_info_t dev_info = "qlogic_cs"; |
110 | 108 | ||
111 | static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host, | 109 | static struct Scsi_Host *qlogic_detect(struct scsi_host_template *host, |
@@ -190,8 +188,7 @@ static dev_link_t *qlogic_attach(void) | |||
190 | link->conf.Present = PRESENT_OPTION; | 188 | link->conf.Present = PRESENT_OPTION; |
191 | 189 | ||
192 | /* Register with Card Services */ | 190 | /* Register with Card Services */ |
193 | link->next = dev_list; | 191 | link->next = NULL; |
194 | dev_list = link; | ||
195 | client_reg.dev_info = &dev_info; | 192 | client_reg.dev_info = &dev_info; |
196 | client_reg.Version = 0x0210; | 193 | client_reg.Version = 0x0210; |
197 | client_reg.event_callback_args.client_data = link; | 194 | client_reg.event_callback_args.client_data = link; |
@@ -210,22 +207,12 @@ static dev_link_t *qlogic_attach(void) | |||
210 | static void qlogic_detach(struct pcmcia_device *p_dev) | 207 | static void qlogic_detach(struct pcmcia_device *p_dev) |
211 | { | 208 | { |
212 | dev_link_t *link = dev_to_instance(p_dev); | 209 | dev_link_t *link = dev_to_instance(p_dev); |
213 | dev_link_t **linkp; | ||
214 | 210 | ||
215 | DEBUG(0, "qlogic_detach(0x%p)\n", link); | 211 | DEBUG(0, "qlogic_detach(0x%p)\n", link); |
216 | 212 | ||
217 | /* Locate device structure */ | ||
218 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
219 | if (*linkp == link) | ||
220 | break; | ||
221 | if (*linkp == NULL) | ||
222 | return; | ||
223 | |||
224 | if (link->state & DEV_CONFIG) | 213 | if (link->state & DEV_CONFIG) |
225 | qlogic_release(link); | 214 | qlogic_release(link); |
226 | 215 | ||
227 | /* Unlink device structure, free bits */ | ||
228 | *linkp = link->next; | ||
229 | kfree(link->priv); | 216 | kfree(link->priv); |
230 | 217 | ||
231 | } /* qlogic_detach */ | 218 | } /* qlogic_detach */ |
@@ -439,7 +426,6 @@ static int __init init_qlogic_cs(void) | |||
439 | static void __exit exit_qlogic_cs(void) | 426 | static void __exit exit_qlogic_cs(void) |
440 | { | 427 | { |
441 | pcmcia_unregister_driver(&qlogic_cs_driver); | 428 | pcmcia_unregister_driver(&qlogic_cs_driver); |
442 | BUG_ON(dev_list != NULL); | ||
443 | } | 429 | } |
444 | 430 | ||
445 | MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); | 431 | MODULE_AUTHOR("Tom Zerucha, Michael Griffith"); |
diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c index a0f8e2691f9c..87d50b33475e 100644 --- a/drivers/scsi/pcmcia/sym53c500_cs.c +++ b/drivers/scsi/pcmcia/sym53c500_cs.c | |||
@@ -232,7 +232,6 @@ enum Phase { | |||
232 | * Global (within this module) variables other than | 232 | * Global (within this module) variables other than |
233 | * sym53c500_driver_template (the scsi_host_template). | 233 | * sym53c500_driver_template (the scsi_host_template). |
234 | */ | 234 | */ |
235 | static dev_link_t *dev_list; | ||
236 | static dev_info_t dev_info = "sym53c500_cs"; | 235 | static dev_info_t dev_info = "sym53c500_cs"; |
237 | 236 | ||
238 | /* ================================================================== */ | 237 | /* ================================================================== */ |
@@ -930,22 +929,12 @@ static void | |||
930 | SYM53C500_detach(struct pcmcia_device *p_dev) | 929 | SYM53C500_detach(struct pcmcia_device *p_dev) |
931 | { | 930 | { |
932 | dev_link_t *link = dev_to_instance(p_dev); | 931 | dev_link_t *link = dev_to_instance(p_dev); |
933 | dev_link_t **linkp; | ||
934 | 932 | ||
935 | DEBUG(0, "SYM53C500_detach(0x%p)\n", link); | 933 | DEBUG(0, "SYM53C500_detach(0x%p)\n", link); |
936 | 934 | ||
937 | /* Locate device structure */ | ||
938 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
939 | if (*linkp == link) | ||
940 | break; | ||
941 | if (*linkp == NULL) | ||
942 | return; | ||
943 | |||
944 | if (link->state & DEV_CONFIG) | 935 | if (link->state & DEV_CONFIG) |
945 | SYM53C500_release(link); | 936 | SYM53C500_release(link); |
946 | 937 | ||
947 | /* Unlink device structure, free bits. */ | ||
948 | *linkp = link->next; | ||
949 | kfree(link->priv); | 938 | kfree(link->priv); |
950 | link->priv = NULL; | 939 | link->priv = NULL; |
951 | } /* SYM53C500_detach */ | 940 | } /* SYM53C500_detach */ |
@@ -978,8 +967,7 @@ SYM53C500_attach(void) | |||
978 | link->conf.Present = PRESENT_OPTION; | 967 | link->conf.Present = PRESENT_OPTION; |
979 | 968 | ||
980 | /* Register with Card Services */ | 969 | /* Register with Card Services */ |
981 | link->next = dev_list; | 970 | link->next = NULL; |
982 | dev_list = link; | ||
983 | client_reg.dev_info = &dev_info; | 971 | client_reg.dev_info = &dev_info; |
984 | client_reg.Version = 0x0210; | 972 | client_reg.Version = 0x0210; |
985 | client_reg.event_callback_args.client_data = link; | 973 | client_reg.event_callback_args.client_data = link; |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index a95366366504..6e7a1a0ae015 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
@@ -122,8 +122,6 @@ static dev_info_t dev_info = "serial_cs"; | |||
122 | static dev_link_t *serial_attach(void); | 122 | static dev_link_t *serial_attach(void); |
123 | static void serial_detach(struct pcmcia_device *p_dev); | 123 | static void serial_detach(struct pcmcia_device *p_dev); |
124 | 124 | ||
125 | static dev_link_t *dev_list = NULL; | ||
126 | |||
127 | /*====================================================================== | 125 | /*====================================================================== |
128 | 126 | ||
129 | After a card is removed, serial_remove() will unregister | 127 | After a card is removed, serial_remove() will unregister |
@@ -234,8 +232,7 @@ static dev_link_t *serial_attach(void) | |||
234 | link->conf.IntType = INT_MEMORY_AND_IO; | 232 | link->conf.IntType = INT_MEMORY_AND_IO; |
235 | 233 | ||
236 | /* Register with Card Services */ | 234 | /* Register with Card Services */ |
237 | link->next = dev_list; | 235 | link->next = NULL; /* not needed */ |
238 | dev_list = link; | ||
239 | client_reg.dev_info = &dev_info; | 236 | client_reg.dev_info = &dev_info; |
240 | client_reg.Version = 0x0210; | 237 | client_reg.Version = 0x0210; |
241 | client_reg.event_callback_args.client_data = link; | 238 | client_reg.event_callback_args.client_data = link; |
@@ -262,17 +259,9 @@ static void serial_detach(struct pcmcia_device *p_dev) | |||
262 | { | 259 | { |
263 | dev_link_t *link = dev_to_instance(p_dev); | 260 | dev_link_t *link = dev_to_instance(p_dev); |
264 | struct serial_info *info = link->priv; | 261 | struct serial_info *info = link->priv; |
265 | dev_link_t **linkp; | ||
266 | 262 | ||
267 | DEBUG(0, "serial_detach(0x%p)\n", link); | 263 | DEBUG(0, "serial_detach(0x%p)\n", link); |
268 | 264 | ||
269 | /* Locate device structure */ | ||
270 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | ||
271 | if (*linkp == link) | ||
272 | break; | ||
273 | if (*linkp == NULL) | ||
274 | return; | ||
275 | |||
276 | /* | 265 | /* |
277 | * Ensure any outstanding scheduled tasks are completed. | 266 | * Ensure any outstanding scheduled tasks are completed. |
278 | */ | 267 | */ |
@@ -283,8 +272,7 @@ static void serial_detach(struct pcmcia_device *p_dev) | |||
283 | */ | 272 | */ |
284 | serial_remove(link); | 273 | serial_remove(link); |
285 | 274 | ||
286 | /* Unlink device structure, free bits */ | 275 | /* free bits */ |
287 | *linkp = link->next; | ||
288 | kfree(info); | 276 | kfree(info); |
289 | } | 277 | } |
290 | 278 | ||
@@ -871,7 +859,6 @@ static int __init init_serial_cs(void) | |||
871 | static void __exit exit_serial_cs(void) | 859 | static void __exit exit_serial_cs(void) |
872 | { | 860 | { |
873 | pcmcia_unregister_driver(&serial_cs_driver); | 861 | pcmcia_unregister_driver(&serial_cs_driver); |
874 | BUG_ON(dev_list != NULL); | ||
875 | } | 862 | } |
876 | 863 | ||
877 | module_init(init_serial_cs); | 864 | module_init(init_serial_cs); |
diff --git a/drivers/telephony/ixj_pcmcia.c b/drivers/telephony/ixj_pcmcia.c index c58140dc7a73..6b992985d782 100644 --- a/drivers/telephony/ixj_pcmcia.c +++ b/drivers/telephony/ixj_pcmcia.c | |||
@@ -40,7 +40,6 @@ static void ixj_config(dev_link_t * link); | |||
40 | static void ixj_cs_release(dev_link_t * link); | 40 | static void ixj_cs_release(dev_link_t * link); |
41 | static int ixj_event(event_t event, int priority, event_callback_args_t * args); | 41 | static int ixj_event(event_t event, int priority, event_callback_args_t * args); |
42 | static dev_info_t dev_info = "ixj_cs"; | 42 | static dev_info_t dev_info = "ixj_cs"; |
43 | static dev_link_t *dev_list = NULL; | ||
44 | 43 | ||
45 | static dev_link_t *ixj_attach(void) | 44 | static dev_link_t *ixj_attach(void) |
46 | { | 45 | { |
@@ -65,8 +64,7 @@ static dev_link_t *ixj_attach(void) | |||
65 | } | 64 | } |
66 | memset(link->priv, 0, sizeof(struct ixj_info_t)); | 65 | memset(link->priv, 0, sizeof(struct ixj_info_t)); |
67 | /* Register with Card Services */ | 66 | /* Register with Card Services */ |
68 | link->next = dev_list; | 67 | link->next = NULL; |
69 | dev_list = link; | ||
70 | client_reg.dev_info = &dev_info; | 68 | client_reg.dev_info = &dev_info; |
71 | client_reg.Version = 0x0210; | 69 | client_reg.Version = 0x0210; |
72 | client_reg.event_callback_args.client_data = link; | 70 | client_reg.event_callback_args.client_data = link; |
@@ -82,20 +80,13 @@ static dev_link_t *ixj_attach(void) | |||
82 | static void ixj_detach(struct pcmcia_device *p_dev) | 80 | static void ixj_detach(struct pcmcia_device *p_dev) |
83 | { | 81 | { |
84 | dev_link_t *link = dev_to_instance(p_dev); | 82 | dev_link_t *link = dev_to_instance(p_dev); |
85 | dev_link_t **linkp; | ||
86 | 83 | ||
87 | DEBUG(0, "ixj_detach(0x%p)\n", link); | 84 | DEBUG(0, "ixj_detach(0x%p)\n", link); |
88 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) | 85 | |
89 | if (*linkp == link) | ||
90 | break; | ||
91 | if (*linkp == NULL) | ||
92 | return; | ||
93 | link->state &= ~DEV_RELEASE_PENDING; | 86 | link->state &= ~DEV_RELEASE_PENDING; |
94 | if (link->state & DEV_CONFIG) | 87 | if (link->state & DEV_CONFIG) |
95 | ixj_cs_release(link); | 88 | ixj_cs_release(link); |
96 | 89 | ||
97 | /* Unlink device structure, free bits */ | ||
98 | *linkp = link->next; | ||
99 | kfree(link->priv); | 90 | kfree(link->priv); |
100 | kfree(link); | 91 | kfree(link); |
101 | } | 92 | } |
@@ -314,7 +305,6 @@ static int __init ixj_pcmcia_init(void) | |||
314 | static void ixj_pcmcia_exit(void) | 305 | static void ixj_pcmcia_exit(void) |
315 | { | 306 | { |
316 | pcmcia_unregister_driver(&ixj_driver); | 307 | pcmcia_unregister_driver(&ixj_driver); |
317 | BUG_ON(dev_list != NULL); | ||
318 | } | 308 | } |
319 | 309 | ||
320 | module_init(ixj_pcmcia_init); | 310 | module_init(ixj_pcmcia_init); |
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c index ed3e7014dbbc..439709670d0b 100644 --- a/drivers/usb/host/sl811_cs.c +++ b/drivers/usb/host/sl811_cs.c | |||
@@ -66,8 +66,6 @@ module_param(pc_debug, int, 0644); | |||
66 | 66 | ||
67 | static const char driver_name[DEV_NAME_LEN] = "sl811_cs"; | 67 | static const char driver_name[DEV_NAME_LEN] = "sl811_cs"; |
68 | 68 | ||
69 | static dev_link_t *dev_list = NULL; | ||
70 | |||
71 | typedef struct local_info_t { | 69 | typedef struct local_info_t { |
72 | dev_link_t link; | 70 | dev_link_t link; |
73 | dev_node_t node; | 71 | dev_node_t node; |
@@ -143,24 +141,13 @@ static int sl811_hc_init(struct device *parent, ioaddr_t base_addr, int irq) | |||
143 | static void sl811_cs_detach(struct pcmcia_device *p_dev) | 141 | static void sl811_cs_detach(struct pcmcia_device *p_dev) |
144 | { | 142 | { |
145 | dev_link_t *link = dev_to_instance(p_dev); | 143 | dev_link_t *link = dev_to_instance(p_dev); |
146 | dev_link_t **linkp; | ||
147 | 144 | ||
148 | DBG(0, "sl811_cs_detach(0x%p)\n", link); | 145 | DBG(0, "sl811_cs_detach(0x%p)\n", link); |
149 | 146 | ||
150 | /* Locate device structure */ | ||
151 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { | ||
152 | if (*linkp == link) | ||
153 | break; | ||
154 | } | ||
155 | if (*linkp == NULL) | ||
156 | return; | ||
157 | |||
158 | link->state &= ~DEV_PRESENT; | 147 | link->state &= ~DEV_PRESENT; |
159 | if (link->state & DEV_CONFIG) | 148 | if (link->state & DEV_CONFIG) |
160 | sl811_cs_release(link); | 149 | sl811_cs_release(link); |
161 | 150 | ||
162 | /* Unlink device structure, and free it */ | ||
163 | *linkp = link->next; | ||
164 | /* This points to the parent local_info_t struct */ | 151 | /* This points to the parent local_info_t struct */ |
165 | kfree(link->priv); | 152 | kfree(link->priv); |
166 | } | 153 | } |
@@ -378,8 +365,7 @@ static dev_link_t *sl811_cs_attach(void) | |||
378 | link->conf.IntType = INT_MEMORY_AND_IO; | 365 | link->conf.IntType = INT_MEMORY_AND_IO; |
379 | 366 | ||
380 | /* Register with Card Services */ | 367 | /* Register with Card Services */ |
381 | link->next = dev_list; | 368 | link->next = NULL; |
382 | dev_list = link; | ||
383 | client_reg.dev_info = (dev_info_t *) &driver_name; | 369 | client_reg.dev_info = (dev_info_t *) &driver_name; |
384 | client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; | 370 | client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; |
385 | client_reg.Version = 0x0210; | 371 | client_reg.Version = 0x0210; |