diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/b43/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/Kconfig | 1 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/bcm43xx/Kconfig | 2 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/cmdresp.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/decl.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/p54common.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/p54common.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rndis_wlan.c | 22 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00config.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 73 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00reg.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 11 |
19 files changed, 110 insertions, 98 deletions
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index 1a2141dabdc7..8bc4bc4c330e 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig | |||
@@ -32,6 +32,7 @@ config B43_PCI_AUTOSELECT | |||
32 | bool | 32 | bool |
33 | depends on B43 && SSB_PCIHOST_POSSIBLE | 33 | depends on B43 && SSB_PCIHOST_POSSIBLE |
34 | select SSB_PCIHOST | 34 | select SSB_PCIHOST |
35 | select SSB_B43_PCI_BRIDGE | ||
35 | default y | 36 | default y |
36 | 37 | ||
37 | # Auto-select SSB PCICORE driver, if possible | 38 | # Auto-select SSB PCICORE driver, if possible |
diff --git a/drivers/net/wireless/b43legacy/Kconfig b/drivers/net/wireless/b43legacy/Kconfig index 6745579ba96d..13c65faf0247 100644 --- a/drivers/net/wireless/b43legacy/Kconfig +++ b/drivers/net/wireless/b43legacy/Kconfig | |||
@@ -25,6 +25,7 @@ config B43LEGACY_PCI_AUTOSELECT | |||
25 | bool | 25 | bool |
26 | depends on B43LEGACY && SSB_PCIHOST_POSSIBLE | 26 | depends on B43LEGACY && SSB_PCIHOST_POSSIBLE |
27 | select SSB_PCIHOST | 27 | select SSB_PCIHOST |
28 | select SSB_B43_PCI_BRIDGE | ||
28 | default y | 29 | default y |
29 | 30 | ||
30 | # Auto-select SSB PCICORE driver, if possible | 31 | # Auto-select SSB PCICORE driver, if possible |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index c39de422e220..5f3f34e1dbfd 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -3829,7 +3829,7 @@ static void b43legacy_print_driverinfo(void) | |||
3829 | #ifdef CONFIG_B43LEGACY_DMA | 3829 | #ifdef CONFIG_B43LEGACY_DMA |
3830 | feat_dma = "D"; | 3830 | feat_dma = "D"; |
3831 | #endif | 3831 | #endif |
3832 | printk(KERN_INFO "Broadcom 43xx driver loaded " | 3832 | printk(KERN_INFO "Broadcom 43xx-legacy driver loaded " |
3833 | "[ Features: %s%s%s%s%s, Firmware-ID: " | 3833 | "[ Features: %s%s%s%s%s, Firmware-ID: " |
3834 | B43legacy_SUPPORTED_FIRMWARE_ID " ]\n", | 3834 | B43legacy_SUPPORTED_FIRMWARE_ID " ]\n", |
3835 | feat_pci, feat_leds, feat_rfkill, feat_pio, feat_dma); | 3835 | feat_pci, feat_leds, feat_rfkill, feat_pio, feat_dma); |
diff --git a/drivers/net/wireless/bcm43xx/Kconfig b/drivers/net/wireless/bcm43xx/Kconfig index 0159701e8456..afb8f4305c24 100644 --- a/drivers/net/wireless/bcm43xx/Kconfig +++ b/drivers/net/wireless/bcm43xx/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config BCM43XX | 1 | config BCM43XX |
2 | tristate "Broadcom BCM43xx wireless support (DEPRECATED)" | 2 | tristate "Broadcom BCM43xx wireless support (DEPRECATED)" |
3 | depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && EXPERIMENTAL | 3 | depends on PCI && IEEE80211 && IEEE80211_SOFTMAC && WLAN_80211 && (!SSB_B43_PCI_BRIDGE || SSB != y) && EXPERIMENTAL |
4 | select WIRELESS_EXT | 4 | select WIRELESS_EXT |
5 | select FW_LOADER | 5 | select FW_LOADER |
6 | select HW_RANDOM | 6 | select HW_RANDOM |
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index eab020338fde..b3c1acbcc655 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -1040,7 +1040,6 @@ int lbs_mesh_access(struct lbs_private *priv, uint16_t cmd_action, | |||
1040 | lbs_deb_leave(LBS_DEB_CMD); | 1040 | lbs_deb_leave(LBS_DEB_CMD); |
1041 | return ret; | 1041 | return ret; |
1042 | } | 1042 | } |
1043 | EXPORT_SYMBOL_GPL(lbs_mesh_access); | ||
1044 | 1043 | ||
1045 | int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan) | 1044 | int lbs_mesh_config(struct lbs_private *priv, uint16_t enable, uint16_t chan) |
1046 | { | 1045 | { |
@@ -1576,7 +1575,6 @@ done: | |||
1576 | lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret); | 1575 | lbs_deb_leave_args(LBS_DEB_HOST, "ret %d", ret); |
1577 | return ret; | 1576 | return ret; |
1578 | } | 1577 | } |
1579 | EXPORT_SYMBOL_GPL(lbs_prepare_and_send_command); | ||
1580 | 1578 | ||
1581 | /** | 1579 | /** |
1582 | * @brief This function allocates the command buffer and link | 1580 | * @brief This function allocates the command buffer and link |
diff --git a/drivers/net/wireless/libertas/cmdresp.c b/drivers/net/wireless/libertas/cmdresp.c index 159216a91903..f0ef7081bdeb 100644 --- a/drivers/net/wireless/libertas/cmdresp.c +++ b/drivers/net/wireless/libertas/cmdresp.c | |||
@@ -562,9 +562,7 @@ int lbs_process_rx_command(struct lbs_private *priv) | |||
562 | } | 562 | } |
563 | 563 | ||
564 | resp = (void *)priv->upld_buf; | 564 | resp = (void *)priv->upld_buf; |
565 | 565 | curcmd = le16_to_cpu(priv->cur_cmd->cmdbuf->command); | |
566 | curcmd = le16_to_cpu(resp->command); | ||
567 | |||
568 | respcmd = le16_to_cpu(resp->command); | 566 | respcmd = le16_to_cpu(resp->command); |
569 | result = le16_to_cpu(resp->result); | 567 | result = le16_to_cpu(resp->result); |
570 | 568 | ||
@@ -572,15 +570,15 @@ int lbs_process_rx_command(struct lbs_private *priv) | |||
572 | respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies); | 570 | respcmd, le16_to_cpu(resp->seqnum), priv->upld_len, jiffies); |
573 | lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", (void *) resp, priv->upld_len); | 571 | lbs_deb_hex(LBS_DEB_HOST, "CMD_RESP", (void *) resp, priv->upld_len); |
574 | 572 | ||
575 | if (resp->seqnum != resp->seqnum) { | 573 | if (resp->seqnum != priv->cur_cmd->cmdbuf->seqnum) { |
576 | lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n", | 574 | lbs_pr_info("Received CMD_RESP with invalid sequence %d (expected %d)\n", |
577 | le16_to_cpu(resp->seqnum), le16_to_cpu(resp->seqnum)); | 575 | le16_to_cpu(resp->seqnum), le16_to_cpu(priv->cur_cmd->cmdbuf->seqnum)); |
578 | spin_unlock_irqrestore(&priv->driver_lock, flags); | 576 | spin_unlock_irqrestore(&priv->driver_lock, flags); |
579 | ret = -1; | 577 | ret = -1; |
580 | goto done; | 578 | goto done; |
581 | } | 579 | } |
582 | if (respcmd != CMD_RET(curcmd) && | 580 | if (respcmd != CMD_RET(curcmd) && |
583 | respcmd != CMD_802_11_ASSOCIATE && curcmd != CMD_RET_802_11_ASSOCIATE) { | 581 | respcmd != CMD_RET_802_11_ASSOCIATE && curcmd != CMD_802_11_ASSOCIATE) { |
584 | lbs_pr_info("Invalid CMD_RESP %x to command %x!\n", respcmd, curcmd); | 582 | lbs_pr_info("Invalid CMD_RESP %x to command %x!\n", respcmd, curcmd); |
585 | spin_unlock_irqrestore(&priv->driver_lock, flags); | 583 | spin_unlock_irqrestore(&priv->driver_lock, flags); |
586 | ret = -1; | 584 | ret = -1; |
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h index aaacd9bd6bd2..4e22341b4f3d 100644 --- a/drivers/net/wireless/libertas/decl.h +++ b/drivers/net/wireless/libertas/decl.h | |||
@@ -69,7 +69,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev); | |||
69 | int lbs_remove_card(struct lbs_private *priv); | 69 | int lbs_remove_card(struct lbs_private *priv); |
70 | int lbs_start_card(struct lbs_private *priv); | 70 | int lbs_start_card(struct lbs_private *priv); |
71 | int lbs_stop_card(struct lbs_private *priv); | 71 | int lbs_stop_card(struct lbs_private *priv); |
72 | int lbs_reset_device(struct lbs_private *priv); | ||
73 | void lbs_host_to_card_done(struct lbs_private *priv); | 72 | void lbs_host_to_card_done(struct lbs_private *priv); |
74 | 73 | ||
75 | int lbs_update_channel(struct lbs_private *priv); | 74 | int lbs_update_channel(struct lbs_private *priv); |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 84fb49ca0fae..4d4e2f3b66ac 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
@@ -1351,8 +1351,6 @@ done: | |||
1351 | lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret); | 1351 | lbs_deb_leave_args(LBS_DEB_MESH, "ret %d", ret); |
1352 | return ret; | 1352 | return ret; |
1353 | } | 1353 | } |
1354 | EXPORT_SYMBOL_GPL(lbs_add_mesh); | ||
1355 | |||
1356 | 1354 | ||
1357 | static void lbs_remove_mesh(struct lbs_private *priv) | 1355 | static void lbs_remove_mesh(struct lbs_private *priv) |
1358 | { | 1356 | { |
@@ -1372,7 +1370,6 @@ static void lbs_remove_mesh(struct lbs_private *priv) | |||
1372 | free_netdev(mesh_dev); | 1370 | free_netdev(mesh_dev); |
1373 | lbs_deb_leave(LBS_DEB_MESH); | 1371 | lbs_deb_leave(LBS_DEB_MESH); |
1374 | } | 1372 | } |
1375 | EXPORT_SYMBOL_GPL(lbs_remove_mesh); | ||
1376 | 1373 | ||
1377 | /** | 1374 | /** |
1378 | * @brief This function finds the CFP in | 1375 | * @brief This function finds the CFP in |
@@ -1458,20 +1455,6 @@ void lbs_interrupt(struct lbs_private *priv) | |||
1458 | } | 1455 | } |
1459 | EXPORT_SYMBOL_GPL(lbs_interrupt); | 1456 | EXPORT_SYMBOL_GPL(lbs_interrupt); |
1460 | 1457 | ||
1461 | int lbs_reset_device(struct lbs_private *priv) | ||
1462 | { | ||
1463 | int ret; | ||
1464 | |||
1465 | lbs_deb_enter(LBS_DEB_MAIN); | ||
1466 | ret = lbs_prepare_and_send_command(priv, CMD_802_11_RESET, | ||
1467 | CMD_ACT_HALT, 0, 0, NULL); | ||
1468 | msleep_interruptible(10); | ||
1469 | |||
1470 | lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret); | ||
1471 | return ret; | ||
1472 | } | ||
1473 | EXPORT_SYMBOL_GPL(lbs_reset_device); | ||
1474 | |||
1475 | static int __init lbs_init_module(void) | 1458 | static int __init lbs_init_module(void) |
1476 | { | 1459 | { |
1477 | lbs_deb_enter(LBS_DEB_MAIN); | 1460 | lbs_deb_enter(LBS_DEB_MAIN); |
diff --git a/drivers/net/wireless/p54common.c b/drivers/net/wireless/p54common.c index 5cda49aff3a8..d191e055a788 100644 --- a/drivers/net/wireless/p54common.c +++ b/drivers/net/wireless/p54common.c | |||
@@ -166,18 +166,23 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
166 | struct p54_common *priv = dev->priv; | 166 | struct p54_common *priv = dev->priv; |
167 | struct eeprom_pda_wrap *wrap = NULL; | 167 | struct eeprom_pda_wrap *wrap = NULL; |
168 | struct pda_entry *entry; | 168 | struct pda_entry *entry; |
169 | int i = 0; | ||
170 | unsigned int data_len, entry_len; | 169 | unsigned int data_len, entry_len; |
171 | void *tmp; | 170 | void *tmp; |
172 | int err; | 171 | int err; |
172 | u8 *end = (u8 *)eeprom + len; | ||
173 | 173 | ||
174 | wrap = (struct eeprom_pda_wrap *) eeprom; | 174 | wrap = (struct eeprom_pda_wrap *) eeprom; |
175 | entry = (void *)wrap->data + wrap->len; | 175 | entry = (void *)wrap->data + le16_to_cpu(wrap->len); |
176 | i += 2; | 176 | |
177 | i += le16_to_cpu(entry->len)*2; | 177 | /* verify that at least the entry length/code fits */ |
178 | while (i < len) { | 178 | while ((u8 *)entry <= end - sizeof(*entry)) { |
179 | entry_len = le16_to_cpu(entry->len); | 179 | entry_len = le16_to_cpu(entry->len); |
180 | data_len = ((entry_len - 1) << 1); | 180 | data_len = ((entry_len - 1) << 1); |
181 | |||
182 | /* abort if entry exceeds whole structure */ | ||
183 | if ((u8 *)entry + sizeof(*entry) + data_len > end) | ||
184 | break; | ||
185 | |||
181 | switch (le16_to_cpu(entry->code)) { | 186 | switch (le16_to_cpu(entry->code)) { |
182 | case PDR_MAC_ADDRESS: | 187 | case PDR_MAC_ADDRESS: |
183 | SET_IEEE80211_PERM_ADDR(dev, entry->data); | 188 | SET_IEEE80211_PERM_ADDR(dev, entry->data); |
@@ -249,13 +254,12 @@ int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len) | |||
249 | priv->version = *(u8 *)(entry->data + 1); | 254 | priv->version = *(u8 *)(entry->data + 1); |
250 | break; | 255 | break; |
251 | case PDR_END: | 256 | case PDR_END: |
252 | i = len; | 257 | /* make it overrun */ |
258 | entry_len = len; | ||
253 | break; | 259 | break; |
254 | } | 260 | } |
255 | 261 | ||
256 | entry = (void *)entry + (entry_len + 1)*2; | 262 | entry = (void *)entry + (entry_len + 1)*2; |
257 | i += 2; | ||
258 | i += entry_len*2; | ||
259 | } | 263 | } |
260 | 264 | ||
261 | if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) { | 265 | if (!priv->iq_autocal || !priv->output_limit || !priv->curve_data) { |
diff --git a/drivers/net/wireless/p54common.h b/drivers/net/wireless/p54common.h index a721334e20d9..b67ff34e26fe 100644 --- a/drivers/net/wireless/p54common.h +++ b/drivers/net/wireless/p54common.h | |||
@@ -53,10 +53,10 @@ struct pda_entry { | |||
53 | } __attribute__ ((packed)); | 53 | } __attribute__ ((packed)); |
54 | 54 | ||
55 | struct eeprom_pda_wrap { | 55 | struct eeprom_pda_wrap { |
56 | u32 magic; | 56 | __le32 magic; |
57 | u16 pad; | 57 | __le16 pad; |
58 | u16 len; | 58 | __le16 len; |
59 | u32 arm_opcode; | 59 | __le32 arm_opcode; |
60 | u8 data[0]; | 60 | u8 data[0]; |
61 | } __attribute__ ((packed)); | 61 | } __attribute__ ((packed)); |
62 | 62 | ||
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index 8ce2ddf8024f..10b776c1adc5 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
@@ -228,9 +228,9 @@ struct NDIS_WLAN_BSSID_EX { | |||
228 | struct NDIS_802_11_SSID Ssid; | 228 | struct NDIS_802_11_SSID Ssid; |
229 | __le32 Privacy; | 229 | __le32 Privacy; |
230 | __le32 Rssi; | 230 | __le32 Rssi; |
231 | enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; | 231 | __le32 NetworkTypeInUse; |
232 | struct NDIS_802_11_CONFIGURATION Configuration; | 232 | struct NDIS_802_11_CONFIGURATION Configuration; |
233 | enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; | 233 | __le32 InfrastructureMode; |
234 | u8 SupportedRates[NDIS_802_11_LENGTH_RATES_EX]; | 234 | u8 SupportedRates[NDIS_802_11_LENGTH_RATES_EX]; |
235 | __le32 IELength; | 235 | __le32 IELength; |
236 | u8 IEs[0]; | 236 | u8 IEs[0]; |
@@ -260,7 +260,7 @@ struct NDIS_802_11_KEY { | |||
260 | __le32 KeyLength; | 260 | __le32 KeyLength; |
261 | u8 Bssid[6]; | 261 | u8 Bssid[6]; |
262 | u8 Padding[6]; | 262 | u8 Padding[6]; |
263 | __le64 KeyRSC; | 263 | u8 KeyRSC[8]; |
264 | u8 KeyMaterial[32]; | 264 | u8 KeyMaterial[32]; |
265 | } __attribute__((packed)); | 265 | } __attribute__((packed)); |
266 | 266 | ||
@@ -279,11 +279,11 @@ struct RNDIS_CONFIG_PARAMETER_INFOBUFFER { | |||
279 | } __attribute__((packed)); | 279 | } __attribute__((packed)); |
280 | 280 | ||
281 | /* these have to match what is in wpa_supplicant */ | 281 | /* these have to match what is in wpa_supplicant */ |
282 | enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg; | 282 | enum wpa_alg { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP }; |
283 | enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, CIPHER_WEP104 } | 283 | enum wpa_cipher { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, |
284 | wpa_cipher; | 284 | CIPHER_WEP104 }; |
285 | enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, KEY_MGMT_802_1X_NO_WPA, | 285 | enum wpa_key_mgmt { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, |
286 | KEY_MGMT_WPA_NONE } wpa_key_mgmt; | 286 | KEY_MGMT_802_1X_NO_WPA, KEY_MGMT_WPA_NONE }; |
287 | 287 | ||
288 | /* | 288 | /* |
289 | * private data | 289 | * private data |
@@ -1508,7 +1508,7 @@ static int rndis_iw_set_encode_ext(struct net_device *dev, | |||
1508 | struct usbnet *usbdev = dev->priv; | 1508 | struct usbnet *usbdev = dev->priv; |
1509 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | 1509 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); |
1510 | struct NDIS_802_11_KEY ndis_key; | 1510 | struct NDIS_802_11_KEY ndis_key; |
1511 | int i, keyidx, ret; | 1511 | int keyidx, ret; |
1512 | u8 *addr; | 1512 | u8 *addr; |
1513 | 1513 | ||
1514 | keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX; | 1514 | keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX; |
@@ -1543,9 +1543,7 @@ static int rndis_iw_set_encode_ext(struct net_device *dev, | |||
1543 | ndis_key.KeyIndex = cpu_to_le32(keyidx); | 1543 | ndis_key.KeyIndex = cpu_to_le32(keyidx); |
1544 | 1544 | ||
1545 | if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { | 1545 | if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { |
1546 | for (i = 0; i < 6; i++) | 1546 | memcpy(ndis_key.KeyRSC, ext->rx_seq, 6); |
1547 | ndis_key.KeyRSC |= | ||
1548 | cpu_to_le64(ext->rx_seq[i] << (i * 8)); | ||
1549 | ndis_key.KeyIndex |= cpu_to_le32(1 << 29); | 1547 | ndis_key.KeyIndex |= cpu_to_le32(1 << 29); |
1550 | } | 1548 | } |
1551 | 1549 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index d6cba138c7ab..c69f85ed7669 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -960,8 +960,12 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
960 | rt2400pci_disable_radio(rt2x00dev); | 960 | rt2400pci_disable_radio(rt2x00dev); |
961 | break; | 961 | break; |
962 | case STATE_RADIO_RX_ON: | 962 | case STATE_RADIO_RX_ON: |
963 | case STATE_RADIO_RX_ON_LINK: | ||
964 | rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
965 | break; | ||
963 | case STATE_RADIO_RX_OFF: | 966 | case STATE_RADIO_RX_OFF: |
964 | rt2400pci_toggle_rx(rt2x00dev, state); | 967 | case STATE_RADIO_RX_OFF_LINK: |
968 | rt2400pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | ||
965 | break; | 969 | break; |
966 | case STATE_DEEP_SLEEP: | 970 | case STATE_DEEP_SLEEP: |
967 | case STATE_SLEEP: | 971 | case STATE_SLEEP: |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index e874fdcae204..91e87b53374f 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -1112,8 +1112,12 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1112 | rt2500pci_disable_radio(rt2x00dev); | 1112 | rt2500pci_disable_radio(rt2x00dev); |
1113 | break; | 1113 | break; |
1114 | case STATE_RADIO_RX_ON: | 1114 | case STATE_RADIO_RX_ON: |
1115 | case STATE_RADIO_RX_ON_LINK: | ||
1116 | rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
1117 | break; | ||
1115 | case STATE_RADIO_RX_OFF: | 1118 | case STATE_RADIO_RX_OFF: |
1116 | rt2500pci_toggle_rx(rt2x00dev, state); | 1119 | case STATE_RADIO_RX_OFF_LINK: |
1120 | rt2500pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | ||
1117 | break; | 1121 | break; |
1118 | case STATE_DEEP_SLEEP: | 1122 | case STATE_DEEP_SLEEP: |
1119 | case STATE_SLEEP: | 1123 | case STATE_SLEEP: |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 4ca9730e5e92..638c3d243108 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1001,8 +1001,12 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1001 | rt2500usb_disable_radio(rt2x00dev); | 1001 | rt2500usb_disable_radio(rt2x00dev); |
1002 | break; | 1002 | break; |
1003 | case STATE_RADIO_RX_ON: | 1003 | case STATE_RADIO_RX_ON: |
1004 | case STATE_RADIO_RX_ON_LINK: | ||
1005 | rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
1006 | break; | ||
1004 | case STATE_RADIO_RX_OFF: | 1007 | case STATE_RADIO_RX_OFF: |
1005 | rt2500usb_toggle_rx(rt2x00dev, state); | 1008 | case STATE_RADIO_RX_OFF_LINK: |
1009 | rt2500usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | ||
1006 | break; | 1010 | break; |
1007 | case STATE_DEEP_SLEEP: | 1011 | case STATE_DEEP_SLEEP: |
1008 | case STATE_SLEEP: | 1012 | case STATE_SLEEP: |
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 72cfe00c1ed7..07adc576db49 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
@@ -97,12 +97,16 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
97 | libconf.ant.rx = rx; | 97 | libconf.ant.rx = rx; |
98 | libconf.ant.tx = tx; | 98 | libconf.ant.tx = tx; |
99 | 99 | ||
100 | if (rx == rt2x00dev->link.ant.active.rx && | ||
101 | tx == rt2x00dev->link.ant.active.tx) | ||
102 | return; | ||
103 | |||
100 | /* | 104 | /* |
101 | * Antenna setup changes require the RX to be disabled, | 105 | * Antenna setup changes require the RX to be disabled, |
102 | * else the changes will be ignored by the device. | 106 | * else the changes will be ignored by the device. |
103 | */ | 107 | */ |
104 | if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | 108 | if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) |
105 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | 109 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK); |
106 | 110 | ||
107 | /* | 111 | /* |
108 | * Write new antenna setup to device and reset the link tuner. | 112 | * Write new antenna setup to device and reset the link tuner. |
@@ -116,7 +120,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
116 | rt2x00dev->link.ant.active.tx = libconf.ant.tx; | 120 | rt2x00dev->link.ant.active.tx = libconf.ant.tx; |
117 | 121 | ||
118 | if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | 122 | if (test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) |
119 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | 123 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK); |
120 | } | 124 | } |
121 | 125 | ||
122 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, | 126 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c4be2ac4d7a4..0d51f478bcdf 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -61,11 +61,33 @@ EXPORT_SYMBOL_GPL(rt2x00lib_get_ring); | |||
61 | /* | 61 | /* |
62 | * Link tuning handlers | 62 | * Link tuning handlers |
63 | */ | 63 | */ |
64 | static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev) | 64 | void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev) |
65 | { | 65 | { |
66 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
67 | return; | ||
68 | |||
69 | /* | ||
70 | * Reset link information. | ||
71 | * Both the currently active vgc level as well as | ||
72 | * the link tuner counter should be reset. Resetting | ||
73 | * the counter is important for devices where the | ||
74 | * device should only perform link tuning during the | ||
75 | * first minute after being enabled. | ||
76 | */ | ||
66 | rt2x00dev->link.count = 0; | 77 | rt2x00dev->link.count = 0; |
67 | rt2x00dev->link.vgc_level = 0; | 78 | rt2x00dev->link.vgc_level = 0; |
68 | 79 | ||
80 | /* | ||
81 | * Reset the link tuner. | ||
82 | */ | ||
83 | rt2x00dev->ops->lib->reset_tuner(rt2x00dev); | ||
84 | } | ||
85 | |||
86 | static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev) | ||
87 | { | ||
88 | /* | ||
89 | * Clear all (possibly) pre-existing quality statistics. | ||
90 | */ | ||
69 | memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual)); | 91 | memset(&rt2x00dev->link.qual, 0, sizeof(rt2x00dev->link.qual)); |
70 | 92 | ||
71 | /* | 93 | /* |
@@ -79,10 +101,7 @@ static void rt2x00lib_start_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
79 | rt2x00dev->link.qual.rx_percentage = 50; | 101 | rt2x00dev->link.qual.rx_percentage = 50; |
80 | rt2x00dev->link.qual.tx_percentage = 50; | 102 | rt2x00dev->link.qual.tx_percentage = 50; |
81 | 103 | ||
82 | /* | 104 | rt2x00lib_reset_link_tuner(rt2x00dev); |
83 | * Reset the link tuner. | ||
84 | */ | ||
85 | rt2x00dev->ops->lib->reset_tuner(rt2x00dev); | ||
86 | 105 | ||
87 | queue_delayed_work(rt2x00dev->hw->workqueue, | 106 | queue_delayed_work(rt2x00dev->hw->workqueue, |
88 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); | 107 | &rt2x00dev->link.work, LINK_TUNE_INTERVAL); |
@@ -93,15 +112,6 @@ static void rt2x00lib_stop_link_tuner(struct rt2x00_dev *rt2x00dev) | |||
93 | cancel_delayed_work_sync(&rt2x00dev->link.work); | 112 | cancel_delayed_work_sync(&rt2x00dev->link.work); |
94 | } | 113 | } |
95 | 114 | ||
96 | void rt2x00lib_reset_link_tuner(struct rt2x00_dev *rt2x00dev) | ||
97 | { | ||
98 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
99 | return; | ||
100 | |||
101 | rt2x00lib_stop_link_tuner(rt2x00dev); | ||
102 | rt2x00lib_start_link_tuner(rt2x00dev); | ||
103 | } | ||
104 | |||
105 | /* | 115 | /* |
106 | * Ring initialization | 116 | * Ring initialization |
107 | */ | 117 | */ |
@@ -260,19 +270,11 @@ static void rt2x00lib_evaluate_antenna_sample(struct rt2x00_dev *rt2x00dev) | |||
260 | if (sample_a == sample_b) | 270 | if (sample_a == sample_b) |
261 | return; | 271 | return; |
262 | 272 | ||
263 | if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) { | 273 | if (rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) |
264 | if (sample_a > sample_b && rx == ANTENNA_B) | 274 | rx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B; |
265 | rx = ANTENNA_A; | ||
266 | else if (rx == ANTENNA_A) | ||
267 | rx = ANTENNA_B; | ||
268 | } | ||
269 | 275 | ||
270 | if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) { | 276 | if (rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY) |
271 | if (sample_a > sample_b && tx == ANTENNA_B) | 277 | tx = (sample_a > sample_b) ? ANTENNA_A : ANTENNA_B; |
272 | tx = ANTENNA_A; | ||
273 | else if (tx == ANTENNA_A) | ||
274 | tx = ANTENNA_B; | ||
275 | } | ||
276 | 278 | ||
277 | rt2x00lib_config_antenna(rt2x00dev, rx, tx); | 279 | rt2x00lib_config_antenna(rt2x00dev, rx, tx); |
278 | } | 280 | } |
@@ -293,7 +295,7 @@ static void rt2x00lib_evaluate_antenna_eval(struct rt2x00_dev *rt2x00dev) | |||
293 | * sample the rssi from the other antenna to make a valid | 295 | * sample the rssi from the other antenna to make a valid |
294 | * comparison between the 2 antennas. | 296 | * comparison between the 2 antennas. |
295 | */ | 297 | */ |
296 | if ((rssi_curr - rssi_old) > -5 || (rssi_curr - rssi_old) < 5) | 298 | if (abs(rssi_curr - rssi_old) < 5) |
297 | return; | 299 | return; |
298 | 300 | ||
299 | rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE; | 301 | rt2x00dev->link.ant.flags |= ANTENNA_MODE_SAMPLE; |
@@ -319,15 +321,15 @@ static void rt2x00lib_evaluate_antenna(struct rt2x00_dev *rt2x00dev) | |||
319 | rt2x00dev->link.ant.flags &= ~ANTENNA_TX_DIVERSITY; | 321 | rt2x00dev->link.ant.flags &= ~ANTENNA_TX_DIVERSITY; |
320 | 322 | ||
321 | if (rt2x00dev->hw->conf.antenna_sel_rx == 0 && | 323 | if (rt2x00dev->hw->conf.antenna_sel_rx == 0 && |
322 | rt2x00dev->default_ant.rx != ANTENNA_SW_DIVERSITY) | 324 | rt2x00dev->default_ant.rx == ANTENNA_SW_DIVERSITY) |
323 | rt2x00dev->link.ant.flags |= ANTENNA_RX_DIVERSITY; | 325 | rt2x00dev->link.ant.flags |= ANTENNA_RX_DIVERSITY; |
324 | if (rt2x00dev->hw->conf.antenna_sel_tx == 0 && | 326 | if (rt2x00dev->hw->conf.antenna_sel_tx == 0 && |
325 | rt2x00dev->default_ant.tx != ANTENNA_SW_DIVERSITY) | 327 | rt2x00dev->default_ant.tx == ANTENNA_SW_DIVERSITY) |
326 | rt2x00dev->link.ant.flags |= ANTENNA_TX_DIVERSITY; | 328 | rt2x00dev->link.ant.flags |= ANTENNA_TX_DIVERSITY; |
327 | 329 | ||
328 | if (!(rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) && | 330 | if (!(rt2x00dev->link.ant.flags & ANTENNA_RX_DIVERSITY) && |
329 | !(rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)) { | 331 | !(rt2x00dev->link.ant.flags & ANTENNA_TX_DIVERSITY)) { |
330 | rt2x00dev->link.ant.flags &= ~ANTENNA_MODE_SAMPLE; | 332 | rt2x00dev->link.ant.flags = 0; |
331 | return; | 333 | return; |
332 | } | 334 | } |
333 | 335 | ||
@@ -441,17 +443,18 @@ static void rt2x00lib_link_tuner(struct work_struct *work) | |||
441 | rt2x00dev->ops->lib->link_tuner(rt2x00dev); | 443 | rt2x00dev->ops->lib->link_tuner(rt2x00dev); |
442 | 444 | ||
443 | /* | 445 | /* |
444 | * Evaluate antenna setup. | ||
445 | */ | ||
446 | rt2x00lib_evaluate_antenna(rt2x00dev); | ||
447 | |||
448 | /* | ||
449 | * Precalculate a portion of the link signal which is | 446 | * Precalculate a portion of the link signal which is |
450 | * in based on the tx/rx success/failure counters. | 447 | * in based on the tx/rx success/failure counters. |
451 | */ | 448 | */ |
452 | rt2x00lib_precalculate_link_signal(&rt2x00dev->link.qual); | 449 | rt2x00lib_precalculate_link_signal(&rt2x00dev->link.qual); |
453 | 450 | ||
454 | /* | 451 | /* |
452 | * Evaluate antenna setup, make this the last step since this could | ||
453 | * possibly reset some statistics. | ||
454 | */ | ||
455 | rt2x00lib_evaluate_antenna(rt2x00dev); | ||
456 | |||
457 | /* | ||
455 | * Increase tuner counter, and reschedule the next link tuner run. | 458 | * Increase tuner counter, and reschedule the next link tuner run. |
456 | */ | 459 | */ |
457 | rt2x00dev->link.count++; | 460 | rt2x00dev->link.count++; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00reg.h b/drivers/net/wireless/rt2x00/rt2x00reg.h index 838421216da0..b1915dc7dda1 100644 --- a/drivers/net/wireless/rt2x00/rt2x00reg.h +++ b/drivers/net/wireless/rt2x00/rt2x00reg.h | |||
@@ -85,6 +85,8 @@ enum dev_state { | |||
85 | STATE_RADIO_OFF, | 85 | STATE_RADIO_OFF, |
86 | STATE_RADIO_RX_ON, | 86 | STATE_RADIO_RX_ON, |
87 | STATE_RADIO_RX_OFF, | 87 | STATE_RADIO_RX_OFF, |
88 | STATE_RADIO_RX_ON_LINK, | ||
89 | STATE_RADIO_RX_OFF_LINK, | ||
88 | STATE_RADIO_IRQ_ON, | 90 | STATE_RADIO_IRQ_ON, |
89 | STATE_RADIO_IRQ_OFF, | 91 | STATE_RADIO_IRQ_OFF, |
90 | }; | 92 | }; |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index b31f0c26c32b..93ea212fedd5 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1482,8 +1482,12 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1482 | rt61pci_disable_radio(rt2x00dev); | 1482 | rt61pci_disable_radio(rt2x00dev); |
1483 | break; | 1483 | break; |
1484 | case STATE_RADIO_RX_ON: | 1484 | case STATE_RADIO_RX_ON: |
1485 | case STATE_RADIO_RX_ON_LINK: | ||
1486 | rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
1487 | break; | ||
1485 | case STATE_RADIO_RX_OFF: | 1488 | case STATE_RADIO_RX_OFF: |
1486 | rt61pci_toggle_rx(rt2x00dev, state); | 1489 | case STATE_RADIO_RX_OFF_LINK: |
1490 | rt61pci_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | ||
1487 | break; | 1491 | break; |
1488 | case STATE_DEEP_SLEEP: | 1492 | case STATE_DEEP_SLEEP: |
1489 | case STATE_SLEEP: | 1493 | case STATE_SLEEP: |
@@ -2298,9 +2302,9 @@ static void rt61pci_configure_filter(struct ieee80211_hw *hw, | |||
2298 | * Apply some rules to the filters: | 2302 | * Apply some rules to the filters: |
2299 | * - Some filters imply different filters to be set. | 2303 | * - Some filters imply different filters to be set. |
2300 | * - Some things we can't filter out at all. | 2304 | * - Some things we can't filter out at all. |
2305 | * - Multicast filter seems to kill broadcast traffic so never use it. | ||
2301 | */ | 2306 | */ |
2302 | if (mc_count) | 2307 | *total_flags |= FIF_ALLMULTI; |
2303 | *total_flags |= FIF_ALLMULTI; | ||
2304 | if (*total_flags & FIF_OTHER_BSS || | 2308 | if (*total_flags & FIF_OTHER_BSS || |
2305 | *total_flags & FIF_PROMISC_IN_BSS) | 2309 | *total_flags & FIF_PROMISC_IN_BSS) |
2306 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | 2310 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 4d576ab3e7f9..8103d41a1543 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -1208,8 +1208,12 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1208 | rt73usb_disable_radio(rt2x00dev); | 1208 | rt73usb_disable_radio(rt2x00dev); |
1209 | break; | 1209 | break; |
1210 | case STATE_RADIO_RX_ON: | 1210 | case STATE_RADIO_RX_ON: |
1211 | case STATE_RADIO_RX_ON_LINK: | ||
1212 | rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | ||
1213 | break; | ||
1211 | case STATE_RADIO_RX_OFF: | 1214 | case STATE_RADIO_RX_OFF: |
1212 | rt73usb_toggle_rx(rt2x00dev, state); | 1215 | case STATE_RADIO_RX_OFF_LINK: |
1216 | rt73usb_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | ||
1213 | break; | 1217 | break; |
1214 | case STATE_DEEP_SLEEP: | 1218 | case STATE_DEEP_SLEEP: |
1215 | case STATE_SLEEP: | 1219 | case STATE_SLEEP: |
@@ -1865,9 +1869,9 @@ static void rt73usb_configure_filter(struct ieee80211_hw *hw, | |||
1865 | * Apply some rules to the filters: | 1869 | * Apply some rules to the filters: |
1866 | * - Some filters imply different filters to be set. | 1870 | * - Some filters imply different filters to be set. |
1867 | * - Some things we can't filter out at all. | 1871 | * - Some things we can't filter out at all. |
1872 | * - Multicast filter seems to kill broadcast traffic so never use it. | ||
1868 | */ | 1873 | */ |
1869 | if (mc_count) | 1874 | *total_flags |= FIF_ALLMULTI; |
1870 | *total_flags |= FIF_ALLMULTI; | ||
1871 | if (*total_flags & FIF_OTHER_BSS || | 1875 | if (*total_flags & FIF_OTHER_BSS || |
1872 | *total_flags & FIF_PROMISC_IN_BSS) | 1876 | *total_flags & FIF_PROMISC_IN_BSS) |
1873 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; | 1877 | *total_flags |= FIF_PROMISC_IN_BSS | FIF_OTHER_BSS; |
@@ -2094,6 +2098,7 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
2094 | /* D-Link */ | 2098 | /* D-Link */ |
2095 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, | 2099 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, |
2096 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, | 2100 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, |
2101 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2097 | /* Gemtek */ | 2102 | /* Gemtek */ |
2098 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, | 2103 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, |
2099 | /* Gigabyte */ | 2104 | /* Gigabyte */ |