diff options
Diffstat (limited to 'drivers/net/wireless/orinoco')
-rw-r--r-- | drivers/net/wireless/orinoco/Kconfig | 6 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/fw.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/hermes_dld.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/hw.c | 55 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/hw.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/main.c | 42 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_cs.c | 42 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_nortel.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_plx.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/orinoco_tmd.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/scan.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/spectrum_cs.c | 60 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco/wext.c | 7 |
15 files changed, 113 insertions, 127 deletions
diff --git a/drivers/net/wireless/orinoco/Kconfig b/drivers/net/wireless/orinoco/Kconfig index 83b635fd7784..e2a2c18920aa 100644 --- a/drivers/net/wireless/orinoco/Kconfig +++ b/drivers/net/wireless/orinoco/Kconfig | |||
@@ -1,8 +1,10 @@ | |||
1 | config HERMES | 1 | config HERMES |
2 | tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)" | 2 | tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)" |
3 | depends on (PPC_PMAC || PCI || PCMCIA) && WLAN_80211 | 3 | depends on (PPC_PMAC || PCI || PCMCIA) |
4 | depends on CFG80211 | 4 | depends on CFG80211 && CFG80211_WEXT |
5 | select WIRELESS_EXT | 5 | select WIRELESS_EXT |
6 | select WEXT_SPY | ||
7 | select WEXT_PRIV | ||
6 | select FW_LOADER | 8 | select FW_LOADER |
7 | select CRYPTO | 9 | select CRYPTO |
8 | select CRYPTO_MICHAEL_MIC | 10 | select CRYPTO_MICHAEL_MIC |
diff --git a/drivers/net/wireless/orinoco/fw.c b/drivers/net/wireless/orinoco/fw.c index 1257250a1e22..5ea0f7cf85b1 100644 --- a/drivers/net/wireless/orinoco/fw.c +++ b/drivers/net/wireless/orinoco/fw.c | |||
@@ -3,6 +3,7 @@ | |||
3 | * See copyright notice in main.c | 3 | * See copyright notice in main.c |
4 | */ | 4 | */ |
5 | #include <linux/kernel.h> | 5 | #include <linux/kernel.h> |
6 | #include <linux/slab.h> | ||
6 | #include <linux/firmware.h> | 7 | #include <linux/firmware.h> |
7 | #include <linux/device.h> | 8 | #include <linux/device.h> |
8 | 9 | ||
@@ -28,6 +29,12 @@ static const struct fw_info orinoco_fw[] = { | |||
28 | { NULL, "prism_sta_fw.bin", "prism_ap_fw.bin", 0, 1024 }, | 29 | { NULL, "prism_sta_fw.bin", "prism_ap_fw.bin", 0, 1024 }, |
29 | { "symbol_sp24t_prim_fw", "symbol_sp24t_sec_fw", NULL, 0x00003100, 512 } | 30 | { "symbol_sp24t_prim_fw", "symbol_sp24t_sec_fw", NULL, 0x00003100, 512 } |
30 | }; | 31 | }; |
32 | MODULE_FIRMWARE("agere_sta_fw.bin"); | ||
33 | MODULE_FIRMWARE("agere_ap_fw.bin"); | ||
34 | MODULE_FIRMWARE("prism_sta_fw.bin"); | ||
35 | MODULE_FIRMWARE("prism_ap_fw.bin"); | ||
36 | MODULE_FIRMWARE("symbol_sp24t_prim_fw"); | ||
37 | MODULE_FIRMWARE("symbol_sp24t_sec_fw"); | ||
31 | 38 | ||
32 | /* Structure used to access fields in FW | 39 | /* Structure used to access fields in FW |
33 | * Make sure LE decoding macros are used | 40 | * Make sure LE decoding macros are used |
diff --git a/drivers/net/wireless/orinoco/hermes_dld.c b/drivers/net/wireless/orinoco/hermes_dld.c index a3eefe109df4..fb157eb889ca 100644 --- a/drivers/net/wireless/orinoco/hermes_dld.c +++ b/drivers/net/wireless/orinoco/hermes_dld.c | |||
@@ -427,7 +427,7 @@ int hermesi_program_init(hermes_t *hw, u32 offset) | |||
427 | if (err) | 427 | if (err) |
428 | return err; | 428 | return err; |
429 | 429 | ||
430 | pr_debug(KERN_DEBUG PFX "Enabling volatile, EP 0x%08x\n", offset); | 430 | pr_debug(PFX "Enabling volatile, EP 0x%08x\n", offset); |
431 | err = hermes_doicmd_wait(hw, | 431 | err = hermes_doicmd_wait(hw, |
432 | HERMES_PROGRAM_ENABLE_VOLATILE, | 432 | HERMES_PROGRAM_ENABLE_VOLATILE, |
433 | offset & 0xFFFFu, | 433 | offset & 0xFFFFu, |
@@ -550,7 +550,7 @@ static const struct { \ | |||
550 | 550 | ||
551 | #define DEFAULT_PDR(pid) default_pdr_data_##pid | 551 | #define DEFAULT_PDR(pid) default_pdr_data_##pid |
552 | 552 | ||
553 | /* HWIF Compatiblity */ | 553 | /* HWIF Compatibility */ |
554 | DEFINE_DEFAULT_PDR(0x0005, 10, "\x00\x00\x06\x00\x01\x00\x01\x00\x01\x00"); | 554 | DEFINE_DEFAULT_PDR(0x0005, 10, "\x00\x00\x06\x00\x01\x00\x01\x00\x01\x00"); |
555 | 555 | ||
556 | /* PPPPSign */ | 556 | /* PPPPSign */ |
@@ -656,7 +656,7 @@ int hermes_apply_pda_with_defaults(hermes_t *hw, | |||
656 | record_id + 1, pdi); | 656 | record_id + 1, pdi); |
657 | } | 657 | } |
658 | break; | 658 | break; |
659 | case 0x5: /* HWIF Compatiblity */ | 659 | case 0x5: /* HWIF Compatibility */ |
660 | default_pdi = (struct pdi *) &DEFAULT_PDR(0x0005); | 660 | default_pdi = (struct pdi *) &DEFAULT_PDR(0x0005); |
661 | break; | 661 | break; |
662 | case 0x108: /* PPPPSign */ | 662 | case 0x108: /* PPPPSign */ |
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index 359652d35e63..e6369242e49c 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
@@ -60,8 +60,15 @@ static inline fwtype_t determine_firmware_type(struct comp_id *nic_id) | |||
60 | /* Set priv->firmware type, determine firmware properties | 60 | /* Set priv->firmware type, determine firmware properties |
61 | * This function can be called before we have registerred with netdev, | 61 | * This function can be called before we have registerred with netdev, |
62 | * so all errors go out with dev_* rather than printk | 62 | * so all errors go out with dev_* rather than printk |
63 | * | ||
64 | * If non-NULL stores a firmware description in fw_name. | ||
65 | * If non-NULL stores a HW version in hw_ver | ||
66 | * | ||
67 | * These are output via generic cfg80211 ethtool support. | ||
63 | */ | 68 | */ |
64 | int determine_fw_capabilities(struct orinoco_private *priv) | 69 | int determine_fw_capabilities(struct orinoco_private *priv, |
70 | char *fw_name, size_t fw_name_len, | ||
71 | u32 *hw_ver) | ||
65 | { | 72 | { |
66 | struct device *dev = priv->dev; | 73 | struct device *dev = priv->dev; |
67 | hermes_t *hw = &priv->hw; | 74 | hermes_t *hw = &priv->hw; |
@@ -85,6 +92,12 @@ int determine_fw_capabilities(struct orinoco_private *priv) | |||
85 | dev_info(dev, "Hardware identity %04x:%04x:%04x:%04x\n", | 92 | dev_info(dev, "Hardware identity %04x:%04x:%04x:%04x\n", |
86 | nic_id.id, nic_id.variant, nic_id.major, nic_id.minor); | 93 | nic_id.id, nic_id.variant, nic_id.major, nic_id.minor); |
87 | 94 | ||
95 | if (hw_ver) | ||
96 | *hw_ver = (((nic_id.id & 0xff) << 24) | | ||
97 | ((nic_id.variant & 0xff) << 16) | | ||
98 | ((nic_id.major & 0xff) << 8) | | ||
99 | (nic_id.minor & 0xff)); | ||
100 | |||
88 | priv->firmware_type = determine_firmware_type(&nic_id); | 101 | priv->firmware_type = determine_firmware_type(&nic_id); |
89 | 102 | ||
90 | /* Get the firmware version */ | 103 | /* Get the firmware version */ |
@@ -135,8 +148,9 @@ int determine_fw_capabilities(struct orinoco_private *priv) | |||
135 | case FIRMWARE_TYPE_AGERE: | 148 | case FIRMWARE_TYPE_AGERE: |
136 | /* Lucent Wavelan IEEE, Lucent Orinoco, Cabletron RoamAbout, | 149 | /* Lucent Wavelan IEEE, Lucent Orinoco, Cabletron RoamAbout, |
137 | ELSA, Melco, HP, IBM, Dell 1150, Compaq 110/210 */ | 150 | ELSA, Melco, HP, IBM, Dell 1150, Compaq 110/210 */ |
138 | snprintf(priv->fw_name, sizeof(priv->fw_name) - 1, | 151 | if (fw_name) |
139 | "Lucent/Agere %d.%02d", sta_id.major, sta_id.minor); | 152 | snprintf(fw_name, fw_name_len, "Lucent/Agere %d.%02d", |
153 | sta_id.major, sta_id.minor); | ||
140 | 154 | ||
141 | firmver = ((unsigned long)sta_id.major << 16) | sta_id.minor; | 155 | firmver = ((unsigned long)sta_id.major << 16) | sta_id.minor; |
142 | 156 | ||
@@ -185,8 +199,8 @@ int determine_fw_capabilities(struct orinoco_private *priv) | |||
185 | tmp[SYMBOL_MAX_VER_LEN] = '\0'; | 199 | tmp[SYMBOL_MAX_VER_LEN] = '\0'; |
186 | } | 200 | } |
187 | 201 | ||
188 | snprintf(priv->fw_name, sizeof(priv->fw_name) - 1, | 202 | if (fw_name) |
189 | "Symbol %s", tmp); | 203 | snprintf(fw_name, fw_name_len, "Symbol %s", tmp); |
190 | 204 | ||
191 | priv->has_ibss = (firmver >= 0x20000); | 205 | priv->has_ibss = (firmver >= 0x20000); |
192 | priv->has_wep = (firmver >= 0x15012); | 206 | priv->has_wep = (firmver >= 0x15012); |
@@ -224,9 +238,9 @@ int determine_fw_capabilities(struct orinoco_private *priv) | |||
224 | * different and less well tested */ | 238 | * different and less well tested */ |
225 | /* D-Link MAC : 00:40:05:* */ | 239 | /* D-Link MAC : 00:40:05:* */ |
226 | /* Addtron MAC : 00:90:D1:* */ | 240 | /* Addtron MAC : 00:90:D1:* */ |
227 | snprintf(priv->fw_name, sizeof(priv->fw_name) - 1, | 241 | if (fw_name) |
228 | "Intersil %d.%d.%d", sta_id.major, sta_id.minor, | 242 | snprintf(fw_name, fw_name_len, "Intersil %d.%d.%d", |
229 | sta_id.variant); | 243 | sta_id.major, sta_id.minor, sta_id.variant); |
230 | 244 | ||
231 | firmver = ((unsigned long)sta_id.major << 16) | | 245 | firmver = ((unsigned long)sta_id.major << 16) | |
232 | ((unsigned long)sta_id.minor << 8) | sta_id.variant; | 246 | ((unsigned long)sta_id.minor << 8) | sta_id.variant; |
@@ -245,7 +259,8 @@ int determine_fw_capabilities(struct orinoco_private *priv) | |||
245 | } | 259 | } |
246 | break; | 260 | break; |
247 | } | 261 | } |
248 | dev_info(dev, "Firmware determined as %s\n", priv->fw_name); | 262 | if (fw_name) |
263 | dev_info(dev, "Firmware determined as %s\n", fw_name); | ||
249 | 264 | ||
250 | return 0; | 265 | return 0; |
251 | } | 266 | } |
@@ -1013,7 +1028,7 @@ int orinoco_clear_tkip_key(struct orinoco_private *priv, int key_idx) | |||
1013 | } | 1028 | } |
1014 | 1029 | ||
1015 | int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, | 1030 | int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, |
1016 | struct dev_addr_list *mc_list, | 1031 | struct net_device *dev, |
1017 | int mc_count, int promisc) | 1032 | int mc_count, int promisc) |
1018 | { | 1033 | { |
1019 | hermes_t *hw = &priv->hw; | 1034 | hermes_t *hw = &priv->hw; |
@@ -1034,24 +1049,16 @@ int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, | |||
1034 | * group address if either we want to multicast, or if we were | 1049 | * group address if either we want to multicast, or if we were |
1035 | * multicasting and want to stop */ | 1050 | * multicasting and want to stop */ |
1036 | if (!promisc && (mc_count || priv->mc_count)) { | 1051 | if (!promisc && (mc_count || priv->mc_count)) { |
1037 | struct dev_mc_list *p = mc_list; | 1052 | struct dev_mc_list *p; |
1038 | struct hermes_multicast mclist; | 1053 | struct hermes_multicast mclist; |
1039 | int i; | 1054 | int i = 0; |
1040 | 1055 | ||
1041 | for (i = 0; i < mc_count; i++) { | 1056 | netdev_for_each_mc_addr(p, dev) { |
1042 | /* paranoia: is list shorter than mc_count? */ | 1057 | if (i == mc_count) |
1043 | BUG_ON(!p); | 1058 | break; |
1044 | /* paranoia: bad address size in list? */ | 1059 | memcpy(mclist.addr[i++], p->dmi_addr, ETH_ALEN); |
1045 | BUG_ON(p->dmi_addrlen != ETH_ALEN); | ||
1046 | |||
1047 | memcpy(mclist.addr[i], p->dmi_addr, ETH_ALEN); | ||
1048 | p = p->next; | ||
1049 | } | 1060 | } |
1050 | 1061 | ||
1051 | if (p) | ||
1052 | printk(KERN_WARNING "%s: Multicast list is " | ||
1053 | "longer than mc_count\n", priv->ndev->name); | ||
1054 | |||
1055 | err = hermes_write_ltv(hw, USER_BAP, | 1062 | err = hermes_write_ltv(hw, USER_BAP, |
1056 | HERMES_RID_CNFGROUPADDRESSES, | 1063 | HERMES_RID_CNFGROUPADDRESSES, |
1057 | HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN), | 1064 | HERMES_BYTES_TO_RECLEN(mc_count * ETH_ALEN), |
diff --git a/drivers/net/wireless/orinoco/hw.h b/drivers/net/wireless/orinoco/hw.h index 8df6e8752be6..9799a1d14a63 100644 --- a/drivers/net/wireless/orinoco/hw.h +++ b/drivers/net/wireless/orinoco/hw.h | |||
@@ -24,7 +24,8 @@ | |||
24 | struct orinoco_private; | 24 | struct orinoco_private; |
25 | struct dev_addr_list; | 25 | struct dev_addr_list; |
26 | 26 | ||
27 | int determine_fw_capabilities(struct orinoco_private *priv); | 27 | int determine_fw_capabilities(struct orinoco_private *priv, char *fw_name, |
28 | size_t fw_name_len, u32 *hw_ver); | ||
28 | int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr); | 29 | int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr); |
29 | int orinoco_hw_allocate_fid(struct orinoco_private *priv); | 30 | int orinoco_hw_allocate_fid(struct orinoco_private *priv); |
30 | int orinoco_get_bitratemode(int bitrate, int automatic); | 31 | int orinoco_get_bitratemode(int bitrate, int automatic); |
@@ -42,7 +43,7 @@ int __orinoco_hw_set_tkip_key(struct orinoco_private *priv, int key_idx, | |||
42 | u8 *tsc, size_t tsc_len); | 43 | u8 *tsc, size_t tsc_len); |
43 | int orinoco_clear_tkip_key(struct orinoco_private *priv, int key_idx); | 44 | int orinoco_clear_tkip_key(struct orinoco_private *priv, int key_idx); |
44 | int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, | 45 | int __orinoco_hw_set_multicast_list(struct orinoco_private *priv, |
45 | struct dev_addr_list *mc_list, | 46 | struct net_device *dev, |
46 | int mc_count, int promisc); | 47 | int mc_count, int promisc); |
47 | int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, | 48 | int orinoco_hw_get_essid(struct orinoco_private *priv, int *active, |
48 | char buf[IW_ESSID_MAX_SIZE+1]); | 49 | char buf[IW_ESSID_MAX_SIZE+1]); |
diff --git a/drivers/net/wireless/orinoco/main.c b/drivers/net/wireless/orinoco/main.c index 7a32bcb0c037..413e9ab6cab3 100644 --- a/drivers/net/wireless/orinoco/main.c +++ b/drivers/net/wireless/orinoco/main.c | |||
@@ -78,12 +78,12 @@ | |||
78 | 78 | ||
79 | #include <linux/module.h> | 79 | #include <linux/module.h> |
80 | #include <linux/kernel.h> | 80 | #include <linux/kernel.h> |
81 | #include <linux/slab.h> | ||
81 | #include <linux/init.h> | 82 | #include <linux/init.h> |
82 | #include <linux/delay.h> | 83 | #include <linux/delay.h> |
83 | #include <linux/device.h> | 84 | #include <linux/device.h> |
84 | #include <linux/netdevice.h> | 85 | #include <linux/netdevice.h> |
85 | #include <linux/etherdevice.h> | 86 | #include <linux/etherdevice.h> |
86 | #include <linux/ethtool.h> | ||
87 | #include <linux/suspend.h> | 87 | #include <linux/suspend.h> |
88 | #include <linux/if_arp.h> | 88 | #include <linux/if_arp.h> |
89 | #include <linux/wireless.h> | 89 | #include <linux/wireless.h> |
@@ -162,8 +162,6 @@ static const u8 encaps_hdr[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; | |||
162 | | HERMES_EV_WTERR | HERMES_EV_INFO \ | 162 | | HERMES_EV_WTERR | HERMES_EV_INFO \ |
163 | | HERMES_EV_INFDROP) | 163 | | HERMES_EV_INFDROP) |
164 | 164 | ||
165 | static const struct ethtool_ops orinoco_ethtool_ops; | ||
166 | |||
167 | /********************************************************************/ | 165 | /********************************************************************/ |
168 | /* Data types */ | 166 | /* Data types */ |
169 | /********************************************************************/ | 167 | /********************************************************************/ |
@@ -1671,16 +1669,15 @@ __orinoco_set_multicast_list(struct net_device *dev) | |||
1671 | /* The Hermes doesn't seem to have an allmulti mode, so we go | 1669 | /* The Hermes doesn't seem to have an allmulti mode, so we go |
1672 | * into promiscuous mode and let the upper levels deal. */ | 1670 | * into promiscuous mode and let the upper levels deal. */ |
1673 | if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) || | 1671 | if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI) || |
1674 | (dev->mc_count > MAX_MULTICAST(priv))) { | 1672 | (netdev_mc_count(dev) > MAX_MULTICAST(priv))) { |
1675 | promisc = 1; | 1673 | promisc = 1; |
1676 | mc_count = 0; | 1674 | mc_count = 0; |
1677 | } else { | 1675 | } else { |
1678 | promisc = 0; | 1676 | promisc = 0; |
1679 | mc_count = dev->mc_count; | 1677 | mc_count = netdev_mc_count(dev); |
1680 | } | 1678 | } |
1681 | 1679 | ||
1682 | err = __orinoco_hw_set_multicast_list(priv, dev->mc_list, mc_count, | 1680 | err = __orinoco_hw_set_multicast_list(priv, dev, mc_count, promisc); |
1683 | promisc); | ||
1684 | 1681 | ||
1685 | return err; | 1682 | return err; |
1686 | } | 1683 | } |
@@ -1994,7 +1991,9 @@ int orinoco_init(struct orinoco_private *priv) | |||
1994 | goto out; | 1991 | goto out; |
1995 | } | 1992 | } |
1996 | 1993 | ||
1997 | err = determine_fw_capabilities(priv); | 1994 | err = determine_fw_capabilities(priv, wiphy->fw_version, |
1995 | sizeof(wiphy->fw_version), | ||
1996 | &wiphy->hw_version); | ||
1998 | if (err != 0) { | 1997 | if (err != 0) { |
1999 | dev_err(dev, "Incompatible firmware, aborting\n"); | 1998 | dev_err(dev, "Incompatible firmware, aborting\n"); |
2000 | goto out; | 1999 | goto out; |
@@ -2010,7 +2009,9 @@ int orinoco_init(struct orinoco_private *priv) | |||
2010 | priv->do_fw_download = 0; | 2009 | priv->do_fw_download = 0; |
2011 | 2010 | ||
2012 | /* Check firmware version again */ | 2011 | /* Check firmware version again */ |
2013 | err = determine_fw_capabilities(priv); | 2012 | err = determine_fw_capabilities(priv, wiphy->fw_version, |
2013 | sizeof(wiphy->fw_version), | ||
2014 | &wiphy->hw_version); | ||
2014 | if (err != 0) { | 2015 | if (err != 0) { |
2015 | dev_err(dev, "Incompatible firmware, aborting\n"); | 2016 | dev_err(dev, "Incompatible firmware, aborting\n"); |
2016 | goto out; | 2017 | goto out; |
@@ -2212,7 +2213,6 @@ int orinoco_if_add(struct orinoco_private *priv, | |||
2212 | dev->ieee80211_ptr = wdev; | 2213 | dev->ieee80211_ptr = wdev; |
2213 | dev->netdev_ops = &orinoco_netdev_ops; | 2214 | dev->netdev_ops = &orinoco_netdev_ops; |
2214 | dev->watchdog_timeo = HZ; /* 1 second timeout */ | 2215 | dev->watchdog_timeo = HZ; /* 1 second timeout */ |
2215 | dev->ethtool_ops = &orinoco_ethtool_ops; | ||
2216 | dev->wireless_handlers = &orinoco_handler_def; | 2216 | dev->wireless_handlers = &orinoco_handler_def; |
2217 | #ifdef WIRELESS_SPY | 2217 | #ifdef WIRELESS_SPY |
2218 | dev->wireless_data = &priv->wireless_data; | 2218 | dev->wireless_data = &priv->wireless_data; |
@@ -2225,6 +2225,7 @@ int orinoco_if_add(struct orinoco_private *priv, | |||
2225 | netif_carrier_off(dev); | 2225 | netif_carrier_off(dev); |
2226 | 2226 | ||
2227 | memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN); | 2227 | memcpy(dev->dev_addr, wiphy->perm_addr, ETH_ALEN); |
2228 | memcpy(dev->perm_addr, wiphy->perm_addr, ETH_ALEN); | ||
2228 | 2229 | ||
2229 | dev->base_addr = base_addr; | 2230 | dev->base_addr = base_addr; |
2230 | dev->irq = irq; | 2231 | dev->irq = irq; |
@@ -2348,27 +2349,6 @@ void orinoco_down(struct orinoco_private *priv) | |||
2348 | } | 2349 | } |
2349 | EXPORT_SYMBOL(orinoco_down); | 2350 | EXPORT_SYMBOL(orinoco_down); |
2350 | 2351 | ||
2351 | static void orinoco_get_drvinfo(struct net_device *dev, | ||
2352 | struct ethtool_drvinfo *info) | ||
2353 | { | ||
2354 | struct orinoco_private *priv = ndev_priv(dev); | ||
2355 | |||
2356 | strncpy(info->driver, DRIVER_NAME, sizeof(info->driver) - 1); | ||
2357 | strncpy(info->version, DRIVER_VERSION, sizeof(info->version) - 1); | ||
2358 | strncpy(info->fw_version, priv->fw_name, sizeof(info->fw_version) - 1); | ||
2359 | if (dev->dev.parent) | ||
2360 | strncpy(info->bus_info, dev_name(dev->dev.parent), | ||
2361 | sizeof(info->bus_info) - 1); | ||
2362 | else | ||
2363 | snprintf(info->bus_info, sizeof(info->bus_info) - 1, | ||
2364 | "PCMCIA %p", priv->hw.iobase); | ||
2365 | } | ||
2366 | |||
2367 | static const struct ethtool_ops orinoco_ethtool_ops = { | ||
2368 | .get_drvinfo = orinoco_get_drvinfo, | ||
2369 | .get_link = ethtool_op_get_link, | ||
2370 | }; | ||
2371 | |||
2372 | /********************************************************************/ | 2352 | /********************************************************************/ |
2373 | /* Module initialization */ | 2353 | /* Module initialization */ |
2374 | /********************************************************************/ | 2354 | /********************************************************************/ |
diff --git a/drivers/net/wireless/orinoco/orinoco.h b/drivers/net/wireless/orinoco/orinoco.h index 9ac6f1dda4b0..665ef56f8382 100644 --- a/drivers/net/wireless/orinoco/orinoco.h +++ b/drivers/net/wireless/orinoco/orinoco.h | |||
@@ -93,7 +93,6 @@ struct orinoco_private { | |||
93 | 93 | ||
94 | /* Capabilities of the hardware/firmware */ | 94 | /* Capabilities of the hardware/firmware */ |
95 | fwtype_t firmware_type; | 95 | fwtype_t firmware_type; |
96 | char fw_name[32]; | ||
97 | int ibss_port; | 96 | int ibss_port; |
98 | int nicbuf_size; | 97 | int nicbuf_size; |
99 | u16 channel_mask; | 98 | u16 channel_mask; |
diff --git a/drivers/net/wireless/orinoco/orinoco_cs.c b/drivers/net/wireless/orinoco/orinoco_cs.c index 38c1c9d2abb8..1d4ada188eda 100644 --- a/drivers/net/wireless/orinoco/orinoco_cs.c +++ b/drivers/net/wireless/orinoco/orinoco_cs.c | |||
@@ -109,7 +109,7 @@ orinoco_cs_probe(struct pcmcia_device *link) | |||
109 | struct orinoco_private *priv; | 109 | struct orinoco_private *priv; |
110 | struct orinoco_pccard *card; | 110 | struct orinoco_pccard *card; |
111 | 111 | ||
112 | priv = alloc_orinocodev(sizeof(*card), &handle_to_dev(link), | 112 | priv = alloc_orinocodev(sizeof(*card), &link->dev, |
113 | orinoco_cs_hard_reset, NULL); | 113 | orinoco_cs_hard_reset, NULL); |
114 | if (!priv) | 114 | if (!priv) |
115 | return -ENOMEM; | 115 | return -ENOMEM; |
@@ -120,10 +120,8 @@ orinoco_cs_probe(struct pcmcia_device *link) | |||
120 | link->priv = priv; | 120 | link->priv = priv; |
121 | 121 | ||
122 | /* Interrupt setup */ | 122 | /* Interrupt setup */ |
123 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; | 123 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
124 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | ||
125 | link->irq.Handler = orinoco_interrupt; | 124 | link->irq.Handler = orinoco_interrupt; |
126 | link->irq.Instance = priv; | ||
127 | 125 | ||
128 | /* General socket configuration defaults can go here. In this | 126 | /* General socket configuration defaults can go here. In this |
129 | * client, we assume very little, and rely on the CIS for | 127 | * client, we assume very little, and rely on the CIS for |
@@ -160,12 +158,6 @@ static void orinoco_cs_detach(struct pcmcia_device *link) | |||
160 | * device available to the system. | 158 | * device available to the system. |
161 | */ | 159 | */ |
162 | 160 | ||
163 | #define CS_CHECK(fn, ret) do { \ | ||
164 | last_fn = (fn); \ | ||
165 | if ((last_ret = (ret)) != 0) \ | ||
166 | goto cs_failed; \ | ||
167 | } while (0) | ||
168 | |||
169 | static int orinoco_cs_config_check(struct pcmcia_device *p_dev, | 161 | static int orinoco_cs_config_check(struct pcmcia_device *p_dev, |
170 | cistpl_cftable_entry_t *cfg, | 162 | cistpl_cftable_entry_t *cfg, |
171 | cistpl_cftable_entry_t *dflt, | 163 | cistpl_cftable_entry_t *dflt, |
@@ -240,7 +232,7 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
240 | struct orinoco_private *priv = link->priv; | 232 | struct orinoco_private *priv = link->priv; |
241 | struct orinoco_pccard *card = priv->card; | 233 | struct orinoco_pccard *card = priv->card; |
242 | hermes_t *hw = &priv->hw; | 234 | hermes_t *hw = &priv->hw; |
243 | int last_fn, last_ret; | 235 | int ret; |
244 | void __iomem *mem; | 236 | void __iomem *mem; |
245 | 237 | ||
246 | /* | 238 | /* |
@@ -257,13 +249,12 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
257 | * and most client drivers will only use the CIS to fill in | 249 | * and most client drivers will only use the CIS to fill in |
258 | * implementation-defined details. | 250 | * implementation-defined details. |
259 | */ | 251 | */ |
260 | last_ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); | 252 | ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); |
261 | if (last_ret) { | 253 | if (ret) { |
262 | if (!ignore_cis_vcc) | 254 | if (!ignore_cis_vcc) |
263 | printk(KERN_ERR PFX "GetNextTuple(): No matching " | 255 | printk(KERN_ERR PFX "GetNextTuple(): No matching " |
264 | "CIS configuration. Maybe you need the " | 256 | "CIS configuration. Maybe you need the " |
265 | "ignore_cis_vcc=1 parameter.\n"); | 257 | "ignore_cis_vcc=1 parameter.\n"); |
266 | cs_error(link, RequestIO, last_ret); | ||
267 | goto failed; | 258 | goto failed; |
268 | } | 259 | } |
269 | 260 | ||
@@ -272,14 +263,16 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
272 | * a handler to the interrupt, unless the 'Handler' member of | 263 | * a handler to the interrupt, unless the 'Handler' member of |
273 | * the irq structure is initialized. | 264 | * the irq structure is initialized. |
274 | */ | 265 | */ |
275 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 266 | ret = pcmcia_request_irq(link, &link->irq); |
267 | if (ret) | ||
268 | goto failed; | ||
276 | 269 | ||
277 | /* We initialize the hermes structure before completing PCMCIA | 270 | /* We initialize the hermes structure before completing PCMCIA |
278 | * configuration just in case the interrupt handler gets | 271 | * configuration just in case the interrupt handler gets |
279 | * called. */ | 272 | * called. */ |
280 | mem = ioport_map(link->io.BasePort1, link->io.NumPorts1); | 273 | mem = ioport_map(link->io.BasePort1, link->io.NumPorts1); |
281 | if (!mem) | 274 | if (!mem) |
282 | goto cs_failed; | 275 | goto failed; |
283 | 276 | ||
284 | hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); | 277 | hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); |
285 | 278 | ||
@@ -288,8 +281,9 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
288 | * the I/O windows and the interrupt mapping, and putting the | 281 | * the I/O windows and the interrupt mapping, and putting the |
289 | * card and host interface into "Memory and IO" mode. | 282 | * card and host interface into "Memory and IO" mode. |
290 | */ | 283 | */ |
291 | CS_CHECK(RequestConfiguration, | 284 | ret = pcmcia_request_configuration(link, &link->conf); |
292 | pcmcia_request_configuration(link, &link->conf)); | 285 | if (ret) |
286 | goto failed; | ||
293 | 287 | ||
294 | /* Ok, we have the configuration, prepare to register the netdev */ | 288 | /* Ok, we have the configuration, prepare to register the netdev */ |
295 | card->node.major = card->node.minor = 0; | 289 | card->node.major = card->node.minor = 0; |
@@ -315,9 +309,6 @@ orinoco_cs_config(struct pcmcia_device *link) | |||
315 | * net_device has been registered */ | 309 | * net_device has been registered */ |
316 | return 0; | 310 | return 0; |
317 | 311 | ||
318 | cs_failed: | ||
319 | cs_error(link, last_fn, last_ret); | ||
320 | |||
321 | failed: | 312 | failed: |
322 | orinoco_cs_release(link); | 313 | orinoco_cs_release(link); |
323 | return -ENODEV; | 314 | return -ENODEV; |
@@ -416,7 +407,6 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
416 | PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), | 407 | PCMCIA_DEVICE_PROD_ID12("3Com", "3CRWE737A AirConnect Wireless LAN PC Card", 0x41240e5b, 0x56010af3), |
417 | PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), | 408 | PCMCIA_DEVICE_PROD_ID12("ACTIONTEC", "PRISM Wireless LAN PC Card", 0x393089da, 0xa71e69d5), |
418 | PCMCIA_DEVICE_PROD_ID12("Addtron", "AWP-100 Wireless PCMCIA", 0xe6ec52ce, 0x08649af2), | 409 | PCMCIA_DEVICE_PROD_ID12("Addtron", "AWP-100 Wireless PCMCIA", 0xe6ec52ce, 0x08649af2), |
419 | PCMCIA_DEVICE_PROD_ID123("AIRVAST", "IEEE 802.11b Wireless PCMCIA Card", "HFA3863", 0xea569531, 0x4bcb9645, 0x355cb092), | ||
420 | PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), | 410 | PCMCIA_DEVICE_PROD_ID12("Allied Telesyn", "AT-WCL452 Wireless PCMCIA Radio", 0x5cd01705, 0x4271660f), |
421 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), | 411 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11b_PC_CARD_25", 0x78fc06ee, 0xdb9aa842), |
422 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), | 412 | PCMCIA_DEVICE_PROD_ID12("ASUS", "802_11B_CF_CARD_25", 0x78fc06ee, 0x45a50c1e), |
@@ -426,7 +416,6 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
426 | PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), | 416 | PCMCIA_DEVICE_PROD_ID12("BUFFALO", "WLI-CF-S11G", 0x2decece3, 0x82067c18), |
427 | PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), | 417 | PCMCIA_DEVICE_PROD_ID12("Cabletron", "RoamAbout 802.11 DS", 0x32d445f5, 0xedeffd90), |
428 | PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), | 418 | PCMCIA_DEVICE_PROD_ID12("Compaq", "WL200_11Mbps_Wireless_PCI_Card", 0x54f7c49c, 0x15a75e5b), |
429 | PCMCIA_DEVICE_PROD_ID123("corega", "WL PCCL-11", "ISL37300P", 0x0a21501a, 0x59868926, 0xc9049a39), | ||
430 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), | 419 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCC-11", 0x5261440f, 0xa6405584), |
431 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), | 420 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "Wireless LAN PCCA-11", 0x5261440f, 0xdf6115f9), |
432 | PCMCIA_DEVICE_PROD_ID12("corega_K.K.", "Wireless_LAN_PCCB-11", 0x29e33311, 0xee7a27ae), | 421 | PCMCIA_DEVICE_PROD_ID12("corega_K.K.", "Wireless_LAN_PCCB-11", 0x29e33311, 0xee7a27ae), |
@@ -441,7 +430,6 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
441 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), | 430 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "HFA384x/IEEE", 0x74c5e40d, 0xdb472a18), |
442 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), | 431 | PCMCIA_DEVICE_PROD_ID12("INTERSIL", "I-GATE 11M PC Card / PC Card plus", 0x74c5e40d, 0x8304ff77), |
443 | PCMCIA_DEVICE_PROD_ID12("Intersil", "PRISM 2_5 PCMCIA ADAPTER", 0x4b801a17, 0x6345a0bf), | 432 | PCMCIA_DEVICE_PROD_ID12("Intersil", "PRISM 2_5 PCMCIA ADAPTER", 0x4b801a17, 0x6345a0bf), |
444 | PCMCIA_DEVICE_PROD_ID123("Intersil", "PRISM Freedom PCMCIA Adapter", "ISL37100P", 0x4b801a17, 0xf222ec2d, 0x630d52b2), | ||
445 | PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), | 433 | PCMCIA_DEVICE_PROD_ID12("LeArtery", "SYNCBYAIR 11Mbps Wireless LAN PC Card", 0x7e3b326a, 0x49893e92), |
446 | PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), | 434 | PCMCIA_DEVICE_PROD_ID12("Linksys", "Wireless CompactFlash Card", 0x0733cc81, 0x0c52f395), |
447 | PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), | 435 | PCMCIA_DEVICE_PROD_ID12("Lucent Technologies", "WaveLAN/IEEE", 0x23eb9949, 0xc562e72a), |
@@ -454,7 +442,6 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
454 | PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), | 442 | PCMCIA_DEVICE_PROD_ID12("Nortel Networks", "emobility 802.11 Wireless LAN PC Card", 0x2d617ea0, 0x88cd5767), |
455 | PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), | 443 | PCMCIA_DEVICE_PROD_ID12("OEM", "PRISM2 IEEE 802.11 PC-Card", 0xfea54c90, 0x48f2bdd6), |
456 | PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), | 444 | PCMCIA_DEVICE_PROD_ID12("OTC", "Wireless AirEZY 2411-PCC WLAN Card", 0x4ac44287, 0x235a6bed), |
457 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "11M WLAN Card v2.5", "ISL37300P", 0x281f1c5d, 0x6e440487, 0xc9049a39), | ||
458 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), | 445 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-CF110", 0x209f40ab, 0xd9715264), |
459 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), | 446 | PCMCIA_DEVICE_PROD_ID12("PLANEX", "GeoWave/GW-NS110", 0x209f40ab, 0x46263178), |
460 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), | 447 | PCMCIA_DEVICE_PROD_ID12("PROXIM", "LAN PC CARD HARMONY 80211B", 0xc6536a5e, 0x090c3cd9), |
@@ -463,8 +450,11 @@ static struct pcmcia_device_id orinoco_cs_ids[] = { | |||
463 | PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2532W-B EliteConnect Wireless Adapter", 0xc4f8b18b, 0x196bd757), | 450 | PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2532W-B EliteConnect Wireless Adapter", 0xc4f8b18b, 0x196bd757), |
464 | PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2632W", 0xc4f8b18b, 0x474a1f2a), | 451 | PCMCIA_DEVICE_PROD_ID12("SMC", "SMC2632W", 0xc4f8b18b, 0x474a1f2a), |
465 | PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), | 452 | PCMCIA_DEVICE_PROD_ID12("Symbol Technologies", "LA4111 Spectrum24 Wireless LAN PC Card", 0x3f02b4d6, 0x3663cb0e), |
466 | PCMCIA_DEVICE_PROD_ID123("The Linksys Group, Inc.", "Instant Wireless Network PC Card", "ISL37300P", 0xa5f472c2, 0x590eb502, 0xc9049a39), | ||
467 | PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), | 453 | PCMCIA_DEVICE_PROD_ID12("ZoomAir 11Mbps High", "Rate wireless Networking", 0x273fe3db, 0x32a1eaee), |
454 | PCMCIA_DEVICE_PROD_ID3("HFA3863", 0x355cb092), | ||
455 | PCMCIA_DEVICE_PROD_ID3("ISL37100P", 0x630d52b2), | ||
456 | PCMCIA_DEVICE_PROD_ID3("ISL37101P-10", 0xdd97a26b), | ||
457 | PCMCIA_DEVICE_PROD_ID3("ISL37300P", 0xc9049a39), | ||
468 | PCMCIA_DEVICE_NULL, | 458 | PCMCIA_DEVICE_NULL, |
469 | }; | 459 | }; |
470 | MODULE_DEVICE_TABLE(pcmcia, orinoco_cs_ids); | 460 | MODULE_DEVICE_TABLE(pcmcia, orinoco_cs_ids); |
diff --git a/drivers/net/wireless/orinoco/orinoco_nortel.c b/drivers/net/wireless/orinoco/orinoco_nortel.c index c13a4c383410..075f446b3139 100644 --- a/drivers/net/wireless/orinoco/orinoco_nortel.c +++ b/drivers/net/wireless/orinoco/orinoco_nortel.c | |||
@@ -274,7 +274,7 @@ static void __devexit orinoco_nortel_remove_one(struct pci_dev *pdev) | |||
274 | pci_disable_device(pdev); | 274 | pci_disable_device(pdev); |
275 | } | 275 | } |
276 | 276 | ||
277 | static struct pci_device_id orinoco_nortel_id_table[] = { | 277 | static DEFINE_PCI_DEVICE_TABLE(orinoco_nortel_id_table) = { |
278 | /* Nortel emobility PCI */ | 278 | /* Nortel emobility PCI */ |
279 | {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, | 279 | {0x126c, 0x8030, PCI_ANY_ID, PCI_ANY_ID,}, |
280 | /* Symbol LA-4123 PCI */ | 280 | /* Symbol LA-4123 PCI */ |
diff --git a/drivers/net/wireless/orinoco/orinoco_pci.c b/drivers/net/wireless/orinoco/orinoco_pci.c index fea7781948e7..bda5317cc596 100644 --- a/drivers/net/wireless/orinoco/orinoco_pci.c +++ b/drivers/net/wireless/orinoco/orinoco_pci.c | |||
@@ -212,7 +212,7 @@ static void __devexit orinoco_pci_remove_one(struct pci_dev *pdev) | |||
212 | pci_disable_device(pdev); | 212 | pci_disable_device(pdev); |
213 | } | 213 | } |
214 | 214 | ||
215 | static struct pci_device_id orinoco_pci_id_table[] = { | 215 | static DEFINE_PCI_DEVICE_TABLE(orinoco_pci_id_table) = { |
216 | /* Intersil Prism 3 */ | 216 | /* Intersil Prism 3 */ |
217 | {0x1260, 0x3872, PCI_ANY_ID, PCI_ANY_ID,}, | 217 | {0x1260, 0x3872, PCI_ANY_ID, PCI_ANY_ID,}, |
218 | /* Intersil Prism 2.5 */ | 218 | /* Intersil Prism 2.5 */ |
diff --git a/drivers/net/wireless/orinoco/orinoco_plx.c b/drivers/net/wireless/orinoco/orinoco_plx.c index 3f2942a1e4f5..e0d5874ab42f 100644 --- a/drivers/net/wireless/orinoco/orinoco_plx.c +++ b/drivers/net/wireless/orinoco/orinoco_plx.c | |||
@@ -310,7 +310,7 @@ static void __devexit orinoco_plx_remove_one(struct pci_dev *pdev) | |||
310 | pci_disable_device(pdev); | 310 | pci_disable_device(pdev); |
311 | } | 311 | } |
312 | 312 | ||
313 | static struct pci_device_id orinoco_plx_id_table[] = { | 313 | static DEFINE_PCI_DEVICE_TABLE(orinoco_plx_id_table) = { |
314 | {0x111a, 0x1023, PCI_ANY_ID, PCI_ANY_ID,}, /* Siemens SpeedStream SS1023 */ | 314 | {0x111a, 0x1023, PCI_ANY_ID, PCI_ANY_ID,}, /* Siemens SpeedStream SS1023 */ |
315 | {0x1385, 0x4100, PCI_ANY_ID, PCI_ANY_ID,}, /* Netgear MA301 */ | 315 | {0x1385, 0x4100, PCI_ANY_ID, PCI_ANY_ID,}, /* Netgear MA301 */ |
316 | {0x15e8, 0x0130, PCI_ANY_ID, PCI_ANY_ID,}, /* Correga - does this work? */ | 316 | {0x15e8, 0x0130, PCI_ANY_ID, PCI_ANY_ID,}, /* Correga - does this work? */ |
diff --git a/drivers/net/wireless/orinoco/orinoco_tmd.c b/drivers/net/wireless/orinoco/orinoco_tmd.c index d3452548cc71..88cbc7902aa0 100644 --- a/drivers/net/wireless/orinoco/orinoco_tmd.c +++ b/drivers/net/wireless/orinoco/orinoco_tmd.c | |||
@@ -203,7 +203,7 @@ static void __devexit orinoco_tmd_remove_one(struct pci_dev *pdev) | |||
203 | pci_disable_device(pdev); | 203 | pci_disable_device(pdev); |
204 | } | 204 | } |
205 | 205 | ||
206 | static struct pci_device_id orinoco_tmd_id_table[] = { | 206 | static DEFINE_PCI_DEVICE_TABLE(orinoco_tmd_id_table) = { |
207 | {0x15e8, 0x0131, PCI_ANY_ID, PCI_ANY_ID,}, /* NDC and OEMs, e.g. pheecom */ | 207 | {0x15e8, 0x0131, PCI_ANY_ID, PCI_ANY_ID,}, /* NDC and OEMs, e.g. pheecom */ |
208 | {0,}, | 208 | {0,}, |
209 | }; | 209 | }; |
diff --git a/drivers/net/wireless/orinoco/scan.c b/drivers/net/wireless/orinoco/scan.c index d2f10e9c2162..330d42d45333 100644 --- a/drivers/net/wireless/orinoco/scan.c +++ b/drivers/net/wireless/orinoco/scan.c | |||
@@ -3,6 +3,7 @@ | |||
3 | * See copyright notice in main.c | 3 | * See copyright notice in main.c |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/gfp.h> | ||
6 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
7 | #include <linux/string.h> | 8 | #include <linux/string.h> |
8 | #include <linux/ieee80211.h> | 9 | #include <linux/ieee80211.h> |
diff --git a/drivers/net/wireless/orinoco/spectrum_cs.c b/drivers/net/wireless/orinoco/spectrum_cs.c index c361310b885d..59bda240fdc2 100644 --- a/drivers/net/wireless/orinoco/spectrum_cs.c +++ b/drivers/net/wireless/orinoco/spectrum_cs.c | |||
@@ -73,9 +73,6 @@ static void spectrum_cs_release(struct pcmcia_device *link); | |||
73 | #define HCR_MEM16 0x10 /* memory width bit, should be preserved */ | 73 | #define HCR_MEM16 0x10 /* memory width bit, should be preserved */ |
74 | 74 | ||
75 | 75 | ||
76 | #define CS_CHECK(fn, ret) \ | ||
77 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | ||
78 | |||
79 | /* | 76 | /* |
80 | * Reset the card using configuration registers COR and CCSR. | 77 | * Reset the card using configuration registers COR and CCSR. |
81 | * If IDLE is 1, stop the firmware, so that it can be safely rewritten. | 78 | * If IDLE is 1, stop the firmware, so that it can be safely rewritten. |
@@ -83,7 +80,7 @@ static void spectrum_cs_release(struct pcmcia_device *link); | |||
83 | static int | 80 | static int |
84 | spectrum_reset(struct pcmcia_device *link, int idle) | 81 | spectrum_reset(struct pcmcia_device *link, int idle) |
85 | { | 82 | { |
86 | int last_ret, last_fn; | 83 | int ret; |
87 | conf_reg_t reg; | 84 | conf_reg_t reg; |
88 | u_int save_cor; | 85 | u_int save_cor; |
89 | 86 | ||
@@ -95,23 +92,26 @@ spectrum_reset(struct pcmcia_device *link, int idle) | |||
95 | reg.Function = 0; | 92 | reg.Function = 0; |
96 | reg.Action = CS_READ; | 93 | reg.Action = CS_READ; |
97 | reg.Offset = CISREG_COR; | 94 | reg.Offset = CISREG_COR; |
98 | CS_CHECK(AccessConfigurationRegister, | 95 | ret = pcmcia_access_configuration_register(link, ®); |
99 | pcmcia_access_configuration_register(link, ®)); | 96 | if (ret) |
97 | goto failed; | ||
100 | save_cor = reg.Value; | 98 | save_cor = reg.Value; |
101 | 99 | ||
102 | /* Soft-Reset card */ | 100 | /* Soft-Reset card */ |
103 | reg.Action = CS_WRITE; | 101 | reg.Action = CS_WRITE; |
104 | reg.Offset = CISREG_COR; | 102 | reg.Offset = CISREG_COR; |
105 | reg.Value = (save_cor | COR_SOFT_RESET); | 103 | reg.Value = (save_cor | COR_SOFT_RESET); |
106 | CS_CHECK(AccessConfigurationRegister, | 104 | ret = pcmcia_access_configuration_register(link, ®); |
107 | pcmcia_access_configuration_register(link, ®)); | 105 | if (ret) |
106 | goto failed; | ||
108 | udelay(1000); | 107 | udelay(1000); |
109 | 108 | ||
110 | /* Read CCSR */ | 109 | /* Read CCSR */ |
111 | reg.Action = CS_READ; | 110 | reg.Action = CS_READ; |
112 | reg.Offset = CISREG_CCSR; | 111 | reg.Offset = CISREG_CCSR; |
113 | CS_CHECK(AccessConfigurationRegister, | 112 | ret = pcmcia_access_configuration_register(link, ®); |
114 | pcmcia_access_configuration_register(link, ®)); | 113 | if (ret) |
114 | goto failed; | ||
115 | 115 | ||
116 | /* | 116 | /* |
117 | * Start or stop the firmware. Memory width bit should be | 117 | * Start or stop the firmware. Memory width bit should be |
@@ -120,21 +120,22 @@ spectrum_reset(struct pcmcia_device *link, int idle) | |||
120 | reg.Action = CS_WRITE; | 120 | reg.Action = CS_WRITE; |
121 | reg.Offset = CISREG_CCSR; | 121 | reg.Offset = CISREG_CCSR; |
122 | reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16); | 122 | reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16); |
123 | CS_CHECK(AccessConfigurationRegister, | 123 | ret = pcmcia_access_configuration_register(link, ®); |
124 | pcmcia_access_configuration_register(link, ®)); | 124 | if (ret) |
125 | goto failed; | ||
125 | udelay(1000); | 126 | udelay(1000); |
126 | 127 | ||
127 | /* Restore original COR configuration index */ | 128 | /* Restore original COR configuration index */ |
128 | reg.Action = CS_WRITE; | 129 | reg.Action = CS_WRITE; |
129 | reg.Offset = CISREG_COR; | 130 | reg.Offset = CISREG_COR; |
130 | reg.Value = (save_cor & ~COR_SOFT_RESET); | 131 | reg.Value = (save_cor & ~COR_SOFT_RESET); |
131 | CS_CHECK(AccessConfigurationRegister, | 132 | ret = pcmcia_access_configuration_register(link, ®); |
132 | pcmcia_access_configuration_register(link, ®)); | 133 | if (ret) |
134 | goto failed; | ||
133 | udelay(1000); | 135 | udelay(1000); |
134 | return 0; | 136 | return 0; |
135 | 137 | ||
136 | cs_failed: | 138 | failed: |
137 | cs_error(link, last_fn, last_ret); | ||
138 | return -ENODEV; | 139 | return -ENODEV; |
139 | } | 140 | } |
140 | 141 | ||
@@ -181,7 +182,7 @@ spectrum_cs_probe(struct pcmcia_device *link) | |||
181 | struct orinoco_private *priv; | 182 | struct orinoco_private *priv; |
182 | struct orinoco_pccard *card; | 183 | struct orinoco_pccard *card; |
183 | 184 | ||
184 | priv = alloc_orinocodev(sizeof(*card), &handle_to_dev(link), | 185 | priv = alloc_orinocodev(sizeof(*card), &link->dev, |
185 | spectrum_cs_hard_reset, | 186 | spectrum_cs_hard_reset, |
186 | spectrum_cs_stop_firmware); | 187 | spectrum_cs_stop_firmware); |
187 | if (!priv) | 188 | if (!priv) |
@@ -193,10 +194,8 @@ spectrum_cs_probe(struct pcmcia_device *link) | |||
193 | link->priv = priv; | 194 | link->priv = priv; |
194 | 195 | ||
195 | /* Interrupt setup */ | 196 | /* Interrupt setup */ |
196 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING | IRQ_HANDLE_PRESENT; | 197 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
197 | link->irq.IRQInfo1 = IRQ_LEVEL_ID; | ||
198 | link->irq.Handler = orinoco_interrupt; | 198 | link->irq.Handler = orinoco_interrupt; |
199 | link->irq.Instance = priv; | ||
200 | 199 | ||
201 | /* General socket configuration defaults can go here. In this | 200 | /* General socket configuration defaults can go here. In this |
202 | * client, we assume very little, and rely on the CIS for | 201 | * client, we assume very little, and rely on the CIS for |
@@ -307,7 +306,7 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
307 | struct orinoco_private *priv = link->priv; | 306 | struct orinoco_private *priv = link->priv; |
308 | struct orinoco_pccard *card = priv->card; | 307 | struct orinoco_pccard *card = priv->card; |
309 | hermes_t *hw = &priv->hw; | 308 | hermes_t *hw = &priv->hw; |
310 | int last_fn, last_ret; | 309 | int ret; |
311 | void __iomem *mem; | 310 | void __iomem *mem; |
312 | 311 | ||
313 | /* | 312 | /* |
@@ -324,13 +323,12 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
324 | * and most client drivers will only use the CIS to fill in | 323 | * and most client drivers will only use the CIS to fill in |
325 | * implementation-defined details. | 324 | * implementation-defined details. |
326 | */ | 325 | */ |
327 | last_ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL); | 326 | ret = pcmcia_loop_config(link, spectrum_cs_config_check, NULL); |
328 | if (last_ret) { | 327 | if (ret) { |
329 | if (!ignore_cis_vcc) | 328 | if (!ignore_cis_vcc) |
330 | printk(KERN_ERR PFX "GetNextTuple(): No matching " | 329 | printk(KERN_ERR PFX "GetNextTuple(): No matching " |
331 | "CIS configuration. Maybe you need the " | 330 | "CIS configuration. Maybe you need the " |
332 | "ignore_cis_vcc=1 parameter.\n"); | 331 | "ignore_cis_vcc=1 parameter.\n"); |
333 | cs_error(link, RequestIO, last_ret); | ||
334 | goto failed; | 332 | goto failed; |
335 | } | 333 | } |
336 | 334 | ||
@@ -339,14 +337,16 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
339 | * a handler to the interrupt, unless the 'Handler' member of | 337 | * a handler to the interrupt, unless the 'Handler' member of |
340 | * the irq structure is initialized. | 338 | * the irq structure is initialized. |
341 | */ | 339 | */ |
342 | CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq)); | 340 | ret = pcmcia_request_irq(link, &link->irq); |
341 | if (ret) | ||
342 | goto failed; | ||
343 | 343 | ||
344 | /* We initialize the hermes structure before completing PCMCIA | 344 | /* We initialize the hermes structure before completing PCMCIA |
345 | * configuration just in case the interrupt handler gets | 345 | * configuration just in case the interrupt handler gets |
346 | * called. */ | 346 | * called. */ |
347 | mem = ioport_map(link->io.BasePort1, link->io.NumPorts1); | 347 | mem = ioport_map(link->io.BasePort1, link->io.NumPorts1); |
348 | if (!mem) | 348 | if (!mem) |
349 | goto cs_failed; | 349 | goto failed; |
350 | 350 | ||
351 | hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); | 351 | hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); |
352 | 352 | ||
@@ -355,8 +355,9 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
355 | * the I/O windows and the interrupt mapping, and putting the | 355 | * the I/O windows and the interrupt mapping, and putting the |
356 | * card and host interface into "Memory and IO" mode. | 356 | * card and host interface into "Memory and IO" mode. |
357 | */ | 357 | */ |
358 | CS_CHECK(RequestConfiguration, | 358 | ret = pcmcia_request_configuration(link, &link->conf); |
359 | pcmcia_request_configuration(link, &link->conf)); | 359 | if (ret) |
360 | goto failed; | ||
360 | 361 | ||
361 | /* Ok, we have the configuration, prepare to register the netdev */ | 362 | /* Ok, we have the configuration, prepare to register the netdev */ |
362 | card->node.major = card->node.minor = 0; | 363 | card->node.major = card->node.minor = 0; |
@@ -386,9 +387,6 @@ spectrum_cs_config(struct pcmcia_device *link) | |||
386 | * net_device has been registered */ | 387 | * net_device has been registered */ |
387 | return 0; | 388 | return 0; |
388 | 389 | ||
389 | cs_failed: | ||
390 | cs_error(link, last_fn, last_ret); | ||
391 | |||
392 | failed: | 390 | failed: |
393 | spectrum_cs_release(link); | 391 | spectrum_cs_release(link); |
394 | return -ENODEV; | 392 | return -ENODEV; |
diff --git a/drivers/net/wireless/orinoco/wext.c b/drivers/net/wireless/orinoco/wext.c index 7698fdd6a3a2..fbcc6e1a2e1d 100644 --- a/drivers/net/wireless/orinoco/wext.c +++ b/drivers/net/wireless/orinoco/wext.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * | 2 | * |
3 | * See copyright notice in main.c | 3 | * See copyright notice in main.c |
4 | */ | 4 | */ |
5 | #include <linux/slab.h> | ||
5 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
6 | #include <linux/if_arp.h> | 7 | #include <linux/if_arp.h> |
7 | #include <linux/wireless.h> | 8 | #include <linux/wireless.h> |
@@ -23,7 +24,7 @@ | |||
23 | #define MAX_RID_LEN 1024 | 24 | #define MAX_RID_LEN 1024 |
24 | 25 | ||
25 | /* Helper routine to record keys | 26 | /* Helper routine to record keys |
26 | * Do not call from interrupt context */ | 27 | * It is called under orinoco_lock so it may not sleep */ |
27 | static int orinoco_set_key(struct orinoco_private *priv, int index, | 28 | static int orinoco_set_key(struct orinoco_private *priv, int index, |
28 | enum orinoco_alg alg, const u8 *key, int key_len, | 29 | enum orinoco_alg alg, const u8 *key, int key_len, |
29 | const u8 *seq, int seq_len) | 30 | const u8 *seq, int seq_len) |
@@ -32,14 +33,14 @@ static int orinoco_set_key(struct orinoco_private *priv, int index, | |||
32 | kzfree(priv->keys[index].seq); | 33 | kzfree(priv->keys[index].seq); |
33 | 34 | ||
34 | if (key_len) { | 35 | if (key_len) { |
35 | priv->keys[index].key = kzalloc(key_len, GFP_KERNEL); | 36 | priv->keys[index].key = kzalloc(key_len, GFP_ATOMIC); |
36 | if (!priv->keys[index].key) | 37 | if (!priv->keys[index].key) |
37 | goto nomem; | 38 | goto nomem; |
38 | } else | 39 | } else |
39 | priv->keys[index].key = NULL; | 40 | priv->keys[index].key = NULL; |
40 | 41 | ||
41 | if (seq_len) { | 42 | if (seq_len) { |
42 | priv->keys[index].seq = kzalloc(seq_len, GFP_KERNEL); | 43 | priv->keys[index].seq = kzalloc(seq_len, GFP_ATOMIC); |
43 | if (!priv->keys[index].seq) | 44 | if (!priv->keys[index].seq) |
44 | goto free_key; | 45 | goto free_key; |
45 | } else | 46 | } else |