diff options
Diffstat (limited to 'drivers/net')
31 files changed, 284 insertions, 163 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c index b07f164d65cf..20e49095db2a 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | |||
| @@ -187,17 +187,17 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah) | |||
| 187 | INIT_INI_ARRAY(&ah->iniCckfirJapan2484, | 187 | INIT_INI_ARRAY(&ah->iniCckfirJapan2484, |
| 188 | ar9485_1_1_baseband_core_txfir_coeff_japan_2484); | 188 | ar9485_1_1_baseband_core_txfir_coeff_japan_2484); |
| 189 | 189 | ||
| 190 | /* Load PCIE SERDES settings from INI */ | 190 | if (ah->config.no_pll_pwrsave) { |
| 191 | 191 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | |
| 192 | /* Awake Setting */ | 192 | ar9485_1_1_pcie_phy_clkreq_disable_L1); |
| 193 | 193 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | |
| 194 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | 194 | ar9485_1_1_pcie_phy_clkreq_disable_L1); |
| 195 | ar9485_1_1_pcie_phy_clkreq_disable_L1); | 195 | } else { |
| 196 | 196 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | |
| 197 | /* Sleep Setting */ | 197 | ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1); |
| 198 | 198 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | |
| 199 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | 199 | ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1); |
| 200 | ar9485_1_1_pcie_phy_clkreq_disable_L1); | 200 | } |
| 201 | } else if (AR_SREV_9462_21(ah)) { | 201 | } else if (AR_SREV_9462_21(ah)) { |
| 202 | INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], | 202 | INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], |
| 203 | ar9462_2p1_mac_core); | 203 | ar9462_2p1_mac_core); |
diff --git a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h index 6f899c692647..7c1845221e1c 100644 --- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h | |||
| @@ -32,13 +32,6 @@ static const u32 ar9485_1_1_mac_postamble[][5] = { | |||
| 32 | {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, | 32 | {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
| 35 | static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = { | ||
| 36 | /* Addr allmodes */ | ||
| 37 | {0x00018c00, 0x18012e5e}, | ||
| 38 | {0x00018c04, 0x000801d8}, | ||
| 39 | {0x00018c08, 0x0000080c}, | ||
| 40 | }; | ||
| 41 | |||
| 42 | static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = { | 35 | static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = { |
| 43 | /* Addr allmodes */ | 36 | /* Addr allmodes */ |
| 44 | {0x00009e00, 0x037216a0}, | 37 | {0x00009e00, 0x037216a0}, |
| @@ -1101,20 +1094,6 @@ static const u32 ar9485_common_rx_gain_1_1[][2] = { | |||
| 1101 | {0x0000a1fc, 0x00000296}, | 1094 | {0x0000a1fc, 0x00000296}, |
| 1102 | }; | 1095 | }; |
| 1103 | 1096 | ||
| 1104 | static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = { | ||
| 1105 | /* Addr allmodes */ | ||
| 1106 | {0x00018c00, 0x18052e5e}, | ||
| 1107 | {0x00018c04, 0x000801d8}, | ||
| 1108 | {0x00018c08, 0x0000080c}, | ||
| 1109 | }; | ||
| 1110 | |||
| 1111 | static const u32 ar9485_1_1_pcie_phy_clkreq_enable_L1[][2] = { | ||
| 1112 | /* Addr allmodes */ | ||
| 1113 | {0x00018c00, 0x18053e5e}, | ||
| 1114 | {0x00018c04, 0x000801d8}, | ||
| 1115 | {0x00018c08, 0x0000080c}, | ||
| 1116 | }; | ||
| 1117 | |||
| 1118 | static const u32 ar9485_1_1_soc_preamble[][2] = { | 1097 | static const u32 ar9485_1_1_soc_preamble[][2] = { |
| 1119 | /* Addr allmodes */ | 1098 | /* Addr allmodes */ |
| 1120 | {0x00004014, 0xba280400}, | 1099 | {0x00004014, 0xba280400}, |
| @@ -1173,13 +1152,6 @@ static const u32 ar9485_1_1_baseband_postamble[][5] = { | |||
| 1173 | {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | 1152 | {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
| 1174 | }; | 1153 | }; |
| 1175 | 1154 | ||
| 1176 | static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = { | ||
| 1177 | /* Addr allmodes */ | ||
| 1178 | {0x00018c00, 0x18013e5e}, | ||
| 1179 | {0x00018c04, 0x000801d8}, | ||
| 1180 | {0x00018c08, 0x0000080c}, | ||
| 1181 | }; | ||
| 1182 | |||
| 1183 | static const u32 ar9485_1_1_radio_postamble[][2] = { | 1155 | static const u32 ar9485_1_1_radio_postamble[][2] = { |
| 1184 | /* Addr allmodes */ | 1156 | /* Addr allmodes */ |
| 1185 | {0x0001609c, 0x0b283f31}, | 1157 | {0x0001609c, 0x0b283f31}, |
| @@ -1358,4 +1330,18 @@ static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = { | |||
| 1358 | {0x0000a3a0, 0xca9228ee}, | 1330 | {0x0000a3a0, 0xca9228ee}, |
| 1359 | }; | 1331 | }; |
| 1360 | 1332 | ||
| 1333 | static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = { | ||
| 1334 | /* Addr allmodes */ | ||
| 1335 | {0x00018c00, 0x18013e5e}, | ||
| 1336 | {0x00018c04, 0x000801d8}, | ||
| 1337 | {0x00018c08, 0x0000080c}, | ||
| 1338 | }; | ||
| 1339 | |||
| 1340 | static const u32 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1[][2] = { | ||
| 1341 | /* Addr allmodes */ | ||
| 1342 | {0x00018c00, 0x1801265e}, | ||
| 1343 | {0x00018c04, 0x000801d8}, | ||
| 1344 | {0x00018c08, 0x0000080c}, | ||
| 1345 | }; | ||
| 1346 | |||
| 1361 | #endif /* INITVALS_9485_H */ | 1347 | #endif /* INITVALS_9485_H */ |
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index e7a38d844a6a..60a5da53668f 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -632,15 +632,16 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs); | |||
| 632 | /* Main driver core */ | 632 | /* Main driver core */ |
| 633 | /********************/ | 633 | /********************/ |
| 634 | 634 | ||
| 635 | #define ATH9K_PCI_CUS198 0x0001 | 635 | #define ATH9K_PCI_CUS198 0x0001 |
| 636 | #define ATH9K_PCI_CUS230 0x0002 | 636 | #define ATH9K_PCI_CUS230 0x0002 |
| 637 | #define ATH9K_PCI_CUS217 0x0004 | 637 | #define ATH9K_PCI_CUS217 0x0004 |
| 638 | #define ATH9K_PCI_CUS252 0x0008 | 638 | #define ATH9K_PCI_CUS252 0x0008 |
| 639 | #define ATH9K_PCI_WOW 0x0010 | 639 | #define ATH9K_PCI_WOW 0x0010 |
| 640 | #define ATH9K_PCI_BT_ANT_DIV 0x0020 | 640 | #define ATH9K_PCI_BT_ANT_DIV 0x0020 |
| 641 | #define ATH9K_PCI_D3_L1_WAR 0x0040 | 641 | #define ATH9K_PCI_D3_L1_WAR 0x0040 |
| 642 | #define ATH9K_PCI_AR9565_1ANT 0x0080 | 642 | #define ATH9K_PCI_AR9565_1ANT 0x0080 |
| 643 | #define ATH9K_PCI_AR9565_2ANT 0x0100 | 643 | #define ATH9K_PCI_AR9565_2ANT 0x0100 |
| 644 | #define ATH9K_PCI_NO_PLL_PWRSAVE 0x0200 | ||
| 644 | 645 | ||
| 645 | /* | 646 | /* |
| 646 | * Default cache line size, in bytes. | 647 | * Default cache line size, in bytes. |
diff --git a/drivers/net/wireless/ath/ath9k/dfs_debug.c b/drivers/net/wireless/ath/ath9k/dfs_debug.c index 90b8342d1ed4..8824610c21fb 100644 --- a/drivers/net/wireless/ath/ath9k/dfs_debug.c +++ b/drivers/net/wireless/ath/ath9k/dfs_debug.c | |||
| @@ -44,14 +44,20 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, | |||
| 44 | if (buf == NULL) | 44 | if (buf == NULL) |
| 45 | return -ENOMEM; | 45 | return -ENOMEM; |
| 46 | 46 | ||
| 47 | if (sc->dfs_detector) | ||
| 48 | dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector); | ||
| 49 | |||
| 50 | len += scnprintf(buf + len, size - len, "DFS support for " | 47 | len += scnprintf(buf + len, size - len, "DFS support for " |
| 51 | "macVersion = 0x%x, macRev = 0x%x: %s\n", | 48 | "macVersion = 0x%x, macRev = 0x%x: %s\n", |
| 52 | hw_ver->macVersion, hw_ver->macRev, | 49 | hw_ver->macVersion, hw_ver->macRev, |
| 53 | (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ? | 50 | (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ? |
| 54 | "enabled" : "disabled"); | 51 | "enabled" : "disabled"); |
| 52 | |||
| 53 | if (!sc->dfs_detector) { | ||
| 54 | len += scnprintf(buf + len, size - len, | ||
| 55 | "DFS detector not enabled\n"); | ||
| 56 | goto exit; | ||
| 57 | } | ||
| 58 | |||
| 59 | dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector); | ||
| 60 | |||
| 55 | len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n"); | 61 | len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n"); |
| 56 | ATH9K_DFS_STAT("pulse events reported ", pulses_total); | 62 | ATH9K_DFS_STAT("pulse events reported ", pulses_total); |
| 57 | ATH9K_DFS_STAT("invalid pulse events ", pulses_no_dfs); | 63 | ATH9K_DFS_STAT("invalid pulse events ", pulses_no_dfs); |
| @@ -76,6 +82,7 @@ static ssize_t read_file_dfs(struct file *file, char __user *user_buf, | |||
| 76 | ATH9K_DFS_POOL_STAT("Seqs. alloc error ", pseq_alloc_error); | 82 | ATH9K_DFS_POOL_STAT("Seqs. alloc error ", pseq_alloc_error); |
| 77 | ATH9K_DFS_POOL_STAT("Seqs. in use ", pseq_used); | 83 | ATH9K_DFS_POOL_STAT("Seqs. in use ", pseq_used); |
| 78 | 84 | ||
| 85 | exit: | ||
| 79 | if (len > size) | 86 | if (len > size) |
| 80 | len = size; | 87 | len = size; |
| 81 | 88 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 9ea24f1cba73..a2c9a5dbac6b 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
| @@ -316,6 +316,7 @@ struct ath9k_ops_config { | |||
| 316 | u32 ant_ctrl_comm2g_switch_enable; | 316 | u32 ant_ctrl_comm2g_switch_enable; |
| 317 | bool xatten_margin_cfg; | 317 | bool xatten_margin_cfg; |
| 318 | bool alt_mingainidx; | 318 | bool alt_mingainidx; |
| 319 | bool no_pll_pwrsave; | ||
| 319 | }; | 320 | }; |
| 320 | 321 | ||
| 321 | enum ath9k_int { | 322 | enum ath9k_int { |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index d8643ebabd30..710192ed27ed 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
| @@ -609,6 +609,11 @@ static void ath9k_init_platform(struct ath_softc *sc) | |||
| 609 | ah->config.pcie_waen = 0x0040473b; | 609 | ah->config.pcie_waen = 0x0040473b; |
| 610 | ath_info(common, "Enable WAR for ASPM D3/L1\n"); | 610 | ath_info(common, "Enable WAR for ASPM D3/L1\n"); |
| 611 | } | 611 | } |
| 612 | |||
| 613 | if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) { | ||
| 614 | ah->config.no_pll_pwrsave = true; | ||
| 615 | ath_info(common, "Disable PLL PowerSave\n"); | ||
| 616 | } | ||
| 612 | } | 617 | } |
| 613 | 618 | ||
| 614 | static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob, | 619 | static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob, |
| @@ -863,8 +868,8 @@ static const struct ieee80211_iface_combination if_comb[] = { | |||
| 863 | .max_interfaces = 1, | 868 | .max_interfaces = 1, |
| 864 | .num_different_channels = 1, | 869 | .num_different_channels = 1, |
| 865 | .beacon_int_infra_match = true, | 870 | .beacon_int_infra_match = true, |
| 866 | .radar_detect_widths = BIT(NL80211_CHAN_NO_HT) | | 871 | .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | |
| 867 | BIT(NL80211_CHAN_HT20), | 872 | BIT(NL80211_CHAN_WIDTH_20), |
| 868 | } | 873 | } |
| 869 | }; | 874 | }; |
| 870 | 875 | ||
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 7e4c2524b630..b5656fce4ff5 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
| @@ -195,6 +195,93 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = { | |||
| 195 | 0x3219), | 195 | 0x3219), |
| 196 | .driver_data = ATH9K_PCI_BT_ANT_DIV }, | 196 | .driver_data = ATH9K_PCI_BT_ANT_DIV }, |
| 197 | 197 | ||
| 198 | /* AR9485 cards with PLL power-save disabled by default. */ | ||
| 199 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 200 | 0x0032, | ||
| 201 | PCI_VENDOR_ID_AZWAVE, | ||
| 202 | 0x2C97), | ||
| 203 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 204 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 205 | 0x0032, | ||
| 206 | PCI_VENDOR_ID_AZWAVE, | ||
| 207 | 0x2100), | ||
| 208 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 209 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 210 | 0x0032, | ||
| 211 | 0x1C56, /* ASKEY */ | ||
| 212 | 0x4001), | ||
| 213 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 214 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 215 | 0x0032, | ||
| 216 | 0x11AD, /* LITEON */ | ||
| 217 | 0x6627), | ||
| 218 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 219 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 220 | 0x0032, | ||
| 221 | 0x11AD, /* LITEON */ | ||
| 222 | 0x6628), | ||
| 223 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 224 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 225 | 0x0032, | ||
| 226 | PCI_VENDOR_ID_FOXCONN, | ||
| 227 | 0xE04E), | ||
| 228 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 229 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 230 | 0x0032, | ||
| 231 | PCI_VENDOR_ID_FOXCONN, | ||
| 232 | 0xE04F), | ||
| 233 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 234 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 235 | 0x0032, | ||
| 236 | 0x144F, /* ASKEY */ | ||
| 237 | 0x7197), | ||
| 238 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 239 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 240 | 0x0032, | ||
| 241 | 0x1B9A, /* XAVI */ | ||
| 242 | 0x2000), | ||
| 243 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 244 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 245 | 0x0032, | ||
| 246 | 0x1B9A, /* XAVI */ | ||
| 247 | 0x2001), | ||
| 248 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 249 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 250 | 0x0032, | ||
| 251 | PCI_VENDOR_ID_AZWAVE, | ||
| 252 | 0x1186), | ||
| 253 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 254 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 255 | 0x0032, | ||
| 256 | PCI_VENDOR_ID_AZWAVE, | ||
| 257 | 0x1F86), | ||
| 258 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 259 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 260 | 0x0032, | ||
| 261 | PCI_VENDOR_ID_AZWAVE, | ||
| 262 | 0x1195), | ||
| 263 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 264 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 265 | 0x0032, | ||
| 266 | PCI_VENDOR_ID_AZWAVE, | ||
| 267 | 0x1F95), | ||
| 268 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 269 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 270 | 0x0032, | ||
| 271 | 0x1B9A, /* XAVI */ | ||
| 272 | 0x1C00), | ||
| 273 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 274 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 275 | 0x0032, | ||
| 276 | 0x1B9A, /* XAVI */ | ||
| 277 | 0x1C01), | ||
| 278 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 279 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS, | ||
| 280 | 0x0032, | ||
| 281 | PCI_VENDOR_ID_ASUSTEK, | ||
| 282 | 0x850D), | ||
| 283 | .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE }, | ||
| 284 | |||
| 198 | { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ | 285 | { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */ |
| 199 | { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ | 286 | { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */ |
| 200 | 287 | ||
diff --git a/drivers/net/wireless/ath/wcn36xx/debug.c b/drivers/net/wireless/ath/wcn36xx/debug.c index 5b84f7ae0b1e..ef44a2da644d 100644 --- a/drivers/net/wireless/ath/wcn36xx/debug.c +++ b/drivers/net/wireless/ath/wcn36xx/debug.c | |||
| @@ -126,7 +126,7 @@ static ssize_t write_file_dump(struct file *file, | |||
| 126 | if (begin == NULL) | 126 | if (begin == NULL) |
| 127 | break; | 127 | break; |
| 128 | 128 | ||
| 129 | if (kstrtoul(begin, 0, (unsigned long *)(arg + i)) != 0) | 129 | if (kstrtou32(begin, 0, &arg[i]) != 0) |
| 130 | break; | 130 | break; |
| 131 | } | 131 | } |
| 132 | 132 | ||
diff --git a/drivers/net/wireless/ath/wcn36xx/smd.c b/drivers/net/wireless/ath/wcn36xx/smd.c index f8c3a10510c2..de9eb2cfbf4b 100644 --- a/drivers/net/wireless/ath/wcn36xx/smd.c +++ b/drivers/net/wireless/ath/wcn36xx/smd.c | |||
| @@ -1286,7 +1286,8 @@ int wcn36xx_smd_send_beacon(struct wcn36xx *wcn, struct ieee80211_vif *vif, | |||
| 1286 | } else { | 1286 | } else { |
| 1287 | wcn36xx_err("Beacon is to big: beacon size=%d\n", | 1287 | wcn36xx_err("Beacon is to big: beacon size=%d\n", |
| 1288 | msg_body.beacon_length); | 1288 | msg_body.beacon_length); |
| 1289 | return -ENOMEM; | 1289 | ret = -ENOMEM; |
| 1290 | goto out; | ||
| 1290 | } | 1291 | } |
| 1291 | memcpy(msg_body.bssid, vif->addr, ETH_ALEN); | 1292 | memcpy(msg_body.bssid, vif->addr, ETH_ALEN); |
| 1292 | 1293 | ||
| @@ -1327,7 +1328,8 @@ int wcn36xx_smd_update_proberesp_tmpl(struct wcn36xx *wcn, | |||
| 1327 | if (skb->len > BEACON_TEMPLATE_SIZE) { | 1328 | if (skb->len > BEACON_TEMPLATE_SIZE) { |
| 1328 | wcn36xx_warn("probe response template is too big: %d\n", | 1329 | wcn36xx_warn("probe response template is too big: %d\n", |
| 1329 | skb->len); | 1330 | skb->len); |
| 1330 | return -E2BIG; | 1331 | ret = -E2BIG; |
| 1332 | goto out; | ||
| 1331 | } | 1333 | } |
| 1332 | 1334 | ||
| 1333 | msg.probe_resp_template_len = skb->len; | 1335 | msg.probe_resp_template_len = skb->len; |
| @@ -1606,7 +1608,8 @@ int wcn36xx_smd_keep_alive_req(struct wcn36xx *wcn, | |||
| 1606 | /* TODO: it also support ARP response type */ | 1608 | /* TODO: it also support ARP response type */ |
| 1607 | } else { | 1609 | } else { |
| 1608 | wcn36xx_warn("unknow keep alive packet type %d\n", packet_type); | 1610 | wcn36xx_warn("unknow keep alive packet type %d\n", packet_type); |
| 1609 | return -EINVAL; | 1611 | ret = -EINVAL; |
| 1612 | goto out; | ||
| 1610 | } | 1613 | } |
| 1611 | 1614 | ||
| 1612 | PREPARE_HAL_BUF(wcn->hal_buf, msg_body); | 1615 | PREPARE_HAL_BUF(wcn->hal_buf, msg_body); |
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c index 668dd27616a0..cc6a0a586f0b 100644 --- a/drivers/net/wireless/libertas/debugfs.c +++ b/drivers/net/wireless/libertas/debugfs.c | |||
| @@ -913,7 +913,10 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | |||
| 913 | char *p2; | 913 | char *p2; |
| 914 | struct debug_data *d = f->private_data; | 914 | struct debug_data *d = f->private_data; |
| 915 | 915 | ||
| 916 | pdata = kmalloc(cnt, GFP_KERNEL); | 916 | if (cnt == 0) |
| 917 | return 0; | ||
| 918 | |||
| 919 | pdata = kmalloc(cnt + 1, GFP_KERNEL); | ||
| 917 | if (pdata == NULL) | 920 | if (pdata == NULL) |
| 918 | return 0; | 921 | return 0; |
| 919 | 922 | ||
| @@ -922,6 +925,7 @@ static ssize_t lbs_debugfs_write(struct file *f, const char __user *buf, | |||
| 922 | kfree(pdata); | 925 | kfree(pdata); |
| 923 | return 0; | 926 | return 0; |
| 924 | } | 927 | } |
| 928 | pdata[cnt] = '\0'; | ||
| 925 | 929 | ||
| 926 | p0 = pdata; | 930 | p0 = pdata; |
| 927 | for (i = 0; i < num_of_items; i++) { | 931 | for (i = 0; i < num_of_items; i++) { |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index ef8c98e21098..f499efc6abcf 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
| @@ -902,6 +902,7 @@ static int if_cs_probe(struct pcmcia_device *p_dev) | |||
| 902 | if (card->model == MODEL_UNKNOWN) { | 902 | if (card->model == MODEL_UNKNOWN) { |
| 903 | pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n", | 903 | pr_err("unsupported manf_id 0x%04x / card_id 0x%04x\n", |
| 904 | p_dev->manf_id, p_dev->card_id); | 904 | p_dev->manf_id, p_dev->card_id); |
| 905 | ret = -ENODEV; | ||
| 905 | goto out2; | 906 | goto out2; |
| 906 | } | 907 | } |
| 907 | 908 | ||
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h index f80f30b6160e..c8385ec77a86 100644 --- a/drivers/net/wireless/mwifiex/fw.h +++ b/drivers/net/wireless/mwifiex/fw.h | |||
| @@ -1020,8 +1020,8 @@ struct mwifiex_power_group { | |||
| 1020 | } __packed; | 1020 | } __packed; |
| 1021 | 1021 | ||
| 1022 | struct mwifiex_types_power_group { | 1022 | struct mwifiex_types_power_group { |
| 1023 | u16 type; | 1023 | __le16 type; |
| 1024 | u16 length; | 1024 | __le16 length; |
| 1025 | } __packed; | 1025 | } __packed; |
| 1026 | 1026 | ||
| 1027 | struct host_cmd_ds_txpwr_cfg { | 1027 | struct host_cmd_ds_txpwr_cfg { |
diff --git a/drivers/net/wireless/mwifiex/ie.c b/drivers/net/wireless/mwifiex/ie.c index 220af4fe0fc6..81ac001ee741 100644 --- a/drivers/net/wireless/mwifiex/ie.c +++ b/drivers/net/wireless/mwifiex/ie.c | |||
| @@ -82,7 +82,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, | |||
| 82 | struct mwifiex_ie_list *ie_list) | 82 | struct mwifiex_ie_list *ie_list) |
| 83 | { | 83 | { |
| 84 | u16 travel_len, index, mask; | 84 | u16 travel_len, index, mask; |
| 85 | s16 input_len; | 85 | s16 input_len, tlv_len; |
| 86 | struct mwifiex_ie *ie; | 86 | struct mwifiex_ie *ie; |
| 87 | u8 *tmp; | 87 | u8 *tmp; |
| 88 | 88 | ||
| @@ -91,11 +91,13 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, | |||
| 91 | 91 | ||
| 92 | ie_list->len = 0; | 92 | ie_list->len = 0; |
| 93 | 93 | ||
| 94 | while (input_len > 0) { | 94 | while (input_len >= sizeof(struct mwifiex_ie_types_header)) { |
| 95 | ie = (struct mwifiex_ie *)(((u8 *)ie_list) + travel_len); | 95 | ie = (struct mwifiex_ie *)(((u8 *)ie_list) + travel_len); |
| 96 | input_len -= le16_to_cpu(ie->ie_length) + MWIFIEX_IE_HDR_SIZE; | 96 | tlv_len = le16_to_cpu(ie->ie_length); |
| 97 | travel_len += le16_to_cpu(ie->ie_length) + MWIFIEX_IE_HDR_SIZE; | 97 | travel_len += tlv_len + MWIFIEX_IE_HDR_SIZE; |
| 98 | 98 | ||
| 99 | if (input_len < tlv_len + MWIFIEX_IE_HDR_SIZE) | ||
| 100 | return -1; | ||
| 99 | index = le16_to_cpu(ie->ie_index); | 101 | index = le16_to_cpu(ie->ie_index); |
| 100 | mask = le16_to_cpu(ie->mgmt_subtype_mask); | 102 | mask = le16_to_cpu(ie->mgmt_subtype_mask); |
| 101 | 103 | ||
| @@ -132,6 +134,7 @@ mwifiex_update_autoindex_ies(struct mwifiex_private *priv, | |||
| 132 | le16_add_cpu(&ie_list->len, | 134 | le16_add_cpu(&ie_list->len, |
| 133 | le16_to_cpu(priv->mgmt_ie[index].ie_length) + | 135 | le16_to_cpu(priv->mgmt_ie[index].ie_length) + |
| 134 | MWIFIEX_IE_HDR_SIZE); | 136 | MWIFIEX_IE_HDR_SIZE); |
| 137 | input_len -= tlv_len + MWIFIEX_IE_HDR_SIZE; | ||
| 135 | } | 138 | } |
| 136 | 139 | ||
| 137 | if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) | 140 | if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) |
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c index 1576104e3d95..9bf8898743ab 100644 --- a/drivers/net/wireless/mwifiex/sdio.c +++ b/drivers/net/wireless/mwifiex/sdio.c | |||
| @@ -1029,7 +1029,10 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter, | |||
| 1029 | struct sk_buff *skb, u32 upld_typ) | 1029 | struct sk_buff *skb, u32 upld_typ) |
| 1030 | { | 1030 | { |
| 1031 | u8 *cmd_buf; | 1031 | u8 *cmd_buf; |
| 1032 | __le16 *curr_ptr = (__le16 *)skb->data; | ||
| 1033 | u16 pkt_len = le16_to_cpu(*curr_ptr); | ||
| 1032 | 1034 | ||
| 1035 | skb_trim(skb, pkt_len); | ||
| 1033 | skb_pull(skb, INTF_HEADER_LEN); | 1036 | skb_pull(skb, INTF_HEADER_LEN); |
| 1034 | 1037 | ||
| 1035 | switch (upld_typ) { | 1038 | switch (upld_typ) { |
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c index 7d66018a2e33..2181ee283d82 100644 --- a/drivers/net/wireless/mwifiex/sta_cmd.c +++ b/drivers/net/wireless/mwifiex/sta_cmd.c | |||
| @@ -239,14 +239,14 @@ static int mwifiex_cmd_tx_power_cfg(struct host_cmd_ds_command *cmd, | |||
| 239 | memmove(cmd_txp_cfg, txp, | 239 | memmove(cmd_txp_cfg, txp, |
| 240 | sizeof(struct host_cmd_ds_txpwr_cfg) + | 240 | sizeof(struct host_cmd_ds_txpwr_cfg) + |
| 241 | sizeof(struct mwifiex_types_power_group) + | 241 | sizeof(struct mwifiex_types_power_group) + |
| 242 | pg_tlv->length); | 242 | le16_to_cpu(pg_tlv->length)); |
| 243 | 243 | ||
| 244 | pg_tlv = (struct mwifiex_types_power_group *) ((u8 *) | 244 | pg_tlv = (struct mwifiex_types_power_group *) ((u8 *) |
| 245 | cmd_txp_cfg + | 245 | cmd_txp_cfg + |
| 246 | sizeof(struct host_cmd_ds_txpwr_cfg)); | 246 | sizeof(struct host_cmd_ds_txpwr_cfg)); |
| 247 | cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) + | 247 | cmd->size = cpu_to_le16(le16_to_cpu(cmd->size) + |
| 248 | sizeof(struct mwifiex_types_power_group) + | 248 | sizeof(struct mwifiex_types_power_group) + |
| 249 | pg_tlv->length); | 249 | le16_to_cpu(pg_tlv->length)); |
| 250 | } else { | 250 | } else { |
| 251 | memmove(cmd_txp_cfg, txp, sizeof(*txp)); | 251 | memmove(cmd_txp_cfg, txp, sizeof(*txp)); |
| 252 | } | 252 | } |
diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c index 58a6013712d2..2675ca7f8d14 100644 --- a/drivers/net/wireless/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c | |||
| @@ -274,17 +274,20 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv, | |||
| 274 | struct host_cmd_ds_tx_rate_cfg *rate_cfg = &resp->params.tx_rate_cfg; | 274 | struct host_cmd_ds_tx_rate_cfg *rate_cfg = &resp->params.tx_rate_cfg; |
| 275 | struct mwifiex_rate_scope *rate_scope; | 275 | struct mwifiex_rate_scope *rate_scope; |
| 276 | struct mwifiex_ie_types_header *head; | 276 | struct mwifiex_ie_types_header *head; |
| 277 | u16 tlv, tlv_buf_len; | 277 | u16 tlv, tlv_buf_len, tlv_buf_left; |
| 278 | u8 *tlv_buf; | 278 | u8 *tlv_buf; |
| 279 | u32 i; | 279 | u32 i; |
| 280 | 280 | ||
| 281 | tlv_buf = ((u8 *)rate_cfg) + | 281 | tlv_buf = ((u8 *)rate_cfg) + sizeof(struct host_cmd_ds_tx_rate_cfg); |
| 282 | sizeof(struct host_cmd_ds_tx_rate_cfg); | 282 | tlv_buf_left = le16_to_cpu(resp->size) - S_DS_GEN - sizeof(*rate_cfg); |
| 283 | tlv_buf_len = le16_to_cpu(*(__le16 *) (tlv_buf + sizeof(u16))); | ||
| 284 | 283 | ||
| 285 | while (tlv_buf && tlv_buf_len > 0) { | 284 | while (tlv_buf_left >= sizeof(*head)) { |
| 286 | tlv = (*tlv_buf); | 285 | head = (struct mwifiex_ie_types_header *)tlv_buf; |
| 287 | tlv = tlv | (*(tlv_buf + 1) << 8); | 286 | tlv = le16_to_cpu(head->type); |
| 287 | tlv_buf_len = le16_to_cpu(head->len); | ||
| 288 | |||
| 289 | if (tlv_buf_left < (sizeof(*head) + tlv_buf_len)) | ||
| 290 | break; | ||
| 288 | 291 | ||
| 289 | switch (tlv) { | 292 | switch (tlv) { |
| 290 | case TLV_TYPE_RATE_SCOPE: | 293 | case TLV_TYPE_RATE_SCOPE: |
| @@ -304,9 +307,8 @@ static int mwifiex_ret_tx_rate_cfg(struct mwifiex_private *priv, | |||
| 304 | /* Add RATE_DROP tlv here */ | 307 | /* Add RATE_DROP tlv here */ |
| 305 | } | 308 | } |
| 306 | 309 | ||
| 307 | head = (struct mwifiex_ie_types_header *) tlv_buf; | 310 | tlv_buf += (sizeof(*head) + tlv_buf_len); |
| 308 | tlv_buf += le16_to_cpu(head->len) + sizeof(*head); | 311 | tlv_buf_left -= (sizeof(*head) + tlv_buf_len); |
| 309 | tlv_buf_len -= le16_to_cpu(head->len); | ||
| 310 | } | 312 | } |
| 311 | 313 | ||
| 312 | priv->is_data_rate_auto = mwifiex_is_rate_auto(priv); | 314 | priv->is_data_rate_auto = mwifiex_is_rate_auto(priv); |
| @@ -340,13 +342,17 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf) | |||
| 340 | ((u8 *) data_buf + sizeof(struct host_cmd_ds_txpwr_cfg)); | 342 | ((u8 *) data_buf + sizeof(struct host_cmd_ds_txpwr_cfg)); |
| 341 | pg = (struct mwifiex_power_group *) | 343 | pg = (struct mwifiex_power_group *) |
| 342 | ((u8 *) pg_tlv_hdr + sizeof(struct mwifiex_types_power_group)); | 344 | ((u8 *) pg_tlv_hdr + sizeof(struct mwifiex_types_power_group)); |
| 343 | length = pg_tlv_hdr->length; | 345 | length = le16_to_cpu(pg_tlv_hdr->length); |
| 344 | if (length > 0) { | 346 | |
| 345 | max_power = pg->power_max; | 347 | /* At least one structure required to update power */ |
| 346 | min_power = pg->power_min; | 348 | if (length < sizeof(struct mwifiex_power_group)) |
| 347 | length -= sizeof(struct mwifiex_power_group); | 349 | return 0; |
| 348 | } | 350 | |
| 349 | while (length) { | 351 | max_power = pg->power_max; |
| 352 | min_power = pg->power_min; | ||
| 353 | length -= sizeof(struct mwifiex_power_group); | ||
| 354 | |||
| 355 | while (length >= sizeof(struct mwifiex_power_group)) { | ||
| 350 | pg++; | 356 | pg++; |
| 351 | if (max_power < pg->power_max) | 357 | if (max_power < pg->power_max) |
| 352 | max_power = pg->power_max; | 358 | max_power = pg->power_max; |
| @@ -356,10 +362,8 @@ static int mwifiex_get_power_level(struct mwifiex_private *priv, void *data_buf) | |||
| 356 | 362 | ||
| 357 | length -= sizeof(struct mwifiex_power_group); | 363 | length -= sizeof(struct mwifiex_power_group); |
| 358 | } | 364 | } |
| 359 | if (pg_tlv_hdr->length > 0) { | 365 | priv->min_tx_power_level = (u8) min_power; |
| 360 | priv->min_tx_power_level = (u8) min_power; | 366 | priv->max_tx_power_level = (u8) max_power; |
| 361 | priv->max_tx_power_level = (u8) max_power; | ||
| 362 | } | ||
| 363 | 367 | ||
| 364 | return 0; | 368 | return 0; |
| 365 | } | 369 | } |
diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c index f084412eee0b..c8e029df770e 100644 --- a/drivers/net/wireless/mwifiex/sta_ioctl.c +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c | |||
| @@ -638,8 +638,9 @@ int mwifiex_set_tx_power(struct mwifiex_private *priv, | |||
| 638 | txp_cfg->mode = cpu_to_le32(1); | 638 | txp_cfg->mode = cpu_to_le32(1); |
| 639 | pg_tlv = (struct mwifiex_types_power_group *) | 639 | pg_tlv = (struct mwifiex_types_power_group *) |
| 640 | (buf + sizeof(struct host_cmd_ds_txpwr_cfg)); | 640 | (buf + sizeof(struct host_cmd_ds_txpwr_cfg)); |
| 641 | pg_tlv->type = TLV_TYPE_POWER_GROUP; | 641 | pg_tlv->type = cpu_to_le16(TLV_TYPE_POWER_GROUP); |
| 642 | pg_tlv->length = 4 * sizeof(struct mwifiex_power_group); | 642 | pg_tlv->length = |
| 643 | cpu_to_le16(4 * sizeof(struct mwifiex_power_group)); | ||
| 643 | pg = (struct mwifiex_power_group *) | 644 | pg = (struct mwifiex_power_group *) |
| 644 | (buf + sizeof(struct host_cmd_ds_txpwr_cfg) | 645 | (buf + sizeof(struct host_cmd_ds_txpwr_cfg) |
| 645 | + sizeof(struct mwifiex_types_power_group)); | 646 | + sizeof(struct mwifiex_types_power_group)); |
diff --git a/drivers/net/wireless/mwifiex/uap_txrx.c b/drivers/net/wireless/mwifiex/uap_txrx.c index 1cfe5a738c47..92f76d655e6c 100644 --- a/drivers/net/wireless/mwifiex/uap_txrx.c +++ b/drivers/net/wireless/mwifiex/uap_txrx.c | |||
| @@ -97,6 +97,7 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv, | |||
| 97 | struct mwifiex_txinfo *tx_info; | 97 | struct mwifiex_txinfo *tx_info; |
| 98 | int hdr_chop; | 98 | int hdr_chop; |
| 99 | struct timeval tv; | 99 | struct timeval tv; |
| 100 | struct ethhdr *p_ethhdr; | ||
| 100 | u8 rfc1042_eth_hdr[ETH_ALEN] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; | 101 | u8 rfc1042_eth_hdr[ETH_ALEN] = { 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 }; |
| 101 | 102 | ||
| 102 | uap_rx_pd = (struct uap_rxpd *)(skb->data); | 103 | uap_rx_pd = (struct uap_rxpd *)(skb->data); |
| @@ -112,14 +113,36 @@ static void mwifiex_uap_queue_bridged_pkt(struct mwifiex_private *priv, | |||
| 112 | } | 113 | } |
| 113 | 114 | ||
| 114 | if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, | 115 | if (!memcmp(&rx_pkt_hdr->rfc1042_hdr, |
| 115 | rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) | 116 | rfc1042_eth_hdr, sizeof(rfc1042_eth_hdr))) { |
| 117 | /* Replace the 803 header and rfc1042 header (llc/snap) with | ||
| 118 | * an Ethernet II header, keep the src/dst and snap_type | ||
| 119 | * (ethertype). | ||
| 120 | * | ||
| 121 | * The firmware only passes up SNAP frames converting all RX | ||
| 122 | * data from 802.11 to 802.2/LLC/SNAP frames. | ||
| 123 | * | ||
| 124 | * To create the Ethernet II, just move the src, dst address | ||
| 125 | * right before the snap_type. | ||
| 126 | */ | ||
| 127 | p_ethhdr = (struct ethhdr *) | ||
| 128 | ((u8 *)(&rx_pkt_hdr->eth803_hdr) | ||
| 129 | + sizeof(rx_pkt_hdr->eth803_hdr) | ||
| 130 | + sizeof(rx_pkt_hdr->rfc1042_hdr) | ||
| 131 | - sizeof(rx_pkt_hdr->eth803_hdr.h_dest) | ||
| 132 | - sizeof(rx_pkt_hdr->eth803_hdr.h_source) | ||
| 133 | - sizeof(rx_pkt_hdr->rfc1042_hdr.snap_type)); | ||
| 134 | memcpy(p_ethhdr->h_source, rx_pkt_hdr->eth803_hdr.h_source, | ||
| 135 | sizeof(p_ethhdr->h_source)); | ||
| 136 | memcpy(p_ethhdr->h_dest, rx_pkt_hdr->eth803_hdr.h_dest, | ||
| 137 | sizeof(p_ethhdr->h_dest)); | ||
| 116 | /* Chop off the rxpd + the excess memory from | 138 | /* Chop off the rxpd + the excess memory from |
| 117 | * 802.2/llc/snap header that was removed. | 139 | * 802.2/llc/snap header that was removed. |
| 118 | */ | 140 | */ |
| 119 | hdr_chop = (u8 *)eth_hdr - (u8 *)uap_rx_pd; | 141 | hdr_chop = (u8 *)p_ethhdr - (u8 *)uap_rx_pd; |
| 120 | else | 142 | } else { |
| 121 | /* Chop off the rxpd */ | 143 | /* Chop off the rxpd */ |
| 122 | hdr_chop = (u8 *)&rx_pkt_hdr->eth803_hdr - (u8 *)uap_rx_pd; | 144 | hdr_chop = (u8 *)&rx_pkt_hdr->eth803_hdr - (u8 *)uap_rx_pd; |
| 145 | } | ||
| 123 | 146 | ||
| 124 | /* Chop off the leading header bytes so the it points | 147 | /* Chop off the leading header bytes so the it points |
| 125 | * to the start of either the reconstructed EthII frame | 148 | * to the start of either the reconstructed EthII frame |
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c index 5dd0ccc70b86..13eaeed03898 100644 --- a/drivers/net/wireless/mwifiex/wmm.c +++ b/drivers/net/wireless/mwifiex/wmm.c | |||
| @@ -722,6 +722,9 @@ int mwifiex_ret_wmm_get_status(struct mwifiex_private *priv, | |||
| 722 | tlv_hdr = (struct mwifiex_ie_types_data *) curr; | 722 | tlv_hdr = (struct mwifiex_ie_types_data *) curr; |
| 723 | tlv_len = le16_to_cpu(tlv_hdr->header.len); | 723 | tlv_len = le16_to_cpu(tlv_hdr->header.len); |
| 724 | 724 | ||
| 725 | if (resp_len < tlv_len + sizeof(tlv_hdr->header)) | ||
| 726 | break; | ||
| 727 | |||
| 725 | switch (le16_to_cpu(tlv_hdr->header.type)) { | 728 | switch (le16_to_cpu(tlv_hdr->header.type)) { |
| 726 | case TLV_TYPE_WMMQSTATUS: | 729 | case TLV_TYPE_WMMQSTATUS: |
| 727 | tlv_wmm_qstatus = | 730 | tlv_wmm_qstatus = |
diff --git a/drivers/net/wireless/prism54/islpci_dev.c b/drivers/net/wireless/prism54/islpci_dev.c index 41a16d30c79c..e05d9b4c8317 100644 --- a/drivers/net/wireless/prism54/islpci_dev.c +++ b/drivers/net/wireless/prism54/islpci_dev.c | |||
| @@ -811,6 +811,10 @@ static const struct net_device_ops islpci_netdev_ops = { | |||
| 811 | .ndo_validate_addr = eth_validate_addr, | 811 | .ndo_validate_addr = eth_validate_addr, |
| 812 | }; | 812 | }; |
| 813 | 813 | ||
| 814 | static struct device_type wlan_type = { | ||
| 815 | .name = "wlan", | ||
| 816 | }; | ||
| 817 | |||
| 814 | struct net_device * | 818 | struct net_device * |
| 815 | islpci_setup(struct pci_dev *pdev) | 819 | islpci_setup(struct pci_dev *pdev) |
| 816 | { | 820 | { |
| @@ -821,9 +825,8 @@ islpci_setup(struct pci_dev *pdev) | |||
| 821 | return ndev; | 825 | return ndev; |
| 822 | 826 | ||
| 823 | pci_set_drvdata(pdev, ndev); | 827 | pci_set_drvdata(pdev, ndev); |
| 824 | #if defined(SET_NETDEV_DEV) | ||
| 825 | SET_NETDEV_DEV(ndev, &pdev->dev); | 828 | SET_NETDEV_DEV(ndev, &pdev->dev); |
| 826 | #endif | 829 | SET_NETDEV_DEVTYPE(ndev, &wlan_type); |
| 827 | 830 | ||
| 828 | /* setup the structure members */ | 831 | /* setup the structure members */ |
| 829 | ndev->base_addr = pci_resource_start(pdev, 0); | 832 | ndev->base_addr = pci_resource_start(pdev, 0); |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index c5738f14c4ba..776aff3678ff 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
| @@ -2640,7 +2640,7 @@ static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev, | |||
| 2640 | 2640 | ||
| 2641 | if (rt2x00_rt(rt2x00dev, RT5392)) { | 2641 | if (rt2x00_rt(rt2x00dev, RT5392)) { |
| 2642 | rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr); | 2642 | rt2800_rfcsr_read(rt2x00dev, 50, &rfcsr); |
| 2643 | if (info->default_power1 > POWER_BOUND) | 2643 | if (info->default_power2 > POWER_BOUND) |
| 2644 | rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND); | 2644 | rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND); |
| 2645 | else | 2645 | else |
| 2646 | rt2x00_set_field8(&rfcsr, RFCSR50_TX, | 2646 | rt2x00_set_field8(&rfcsr, RFCSR50_TX, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index a0935987fa3a..7f40ab8e1bd8 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
| @@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_buff *skb, unsigned int header_length); | |||
| 146 | * @local: frame is not from mac80211 | 146 | * @local: frame is not from mac80211 |
| 147 | */ | 147 | */ |
| 148 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | 148 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
| 149 | bool local); | 149 | struct ieee80211_sta *sta, bool local); |
| 150 | 150 | ||
| 151 | /** | 151 | /** |
| 152 | * rt2x00queue_update_beacon - Send new beacon from mac80211 | 152 | * rt2x00queue_update_beacon - Send new beacon from mac80211 |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index 7c157857f5ce..2183e7978399 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
| @@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev, | |||
| 90 | frag_skb->data, data_length, tx_info, | 90 | frag_skb->data, data_length, tx_info, |
| 91 | (struct ieee80211_rts *)(skb->data)); | 91 | (struct ieee80211_rts *)(skb->data)); |
| 92 | 92 | ||
| 93 | retval = rt2x00queue_write_tx_frame(queue, skb, true); | 93 | retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true); |
| 94 | if (retval) { | 94 | if (retval) { |
| 95 | dev_kfree_skb_any(skb); | 95 | dev_kfree_skb_any(skb); |
| 96 | rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); | 96 | rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); |
| @@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw, | |||
| 151 | goto exit_fail; | 151 | goto exit_fail; |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) | 154 | if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false))) |
| 155 | goto exit_fail; | 155 | goto exit_fail; |
| 156 | 156 | ||
| 157 | /* | 157 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 50590b1420a5..a5d38e8ad9e4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
| @@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct queue_entry *entry) | |||
| 635 | } | 635 | } |
| 636 | 636 | ||
| 637 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | 637 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
| 638 | bool local) | 638 | struct ieee80211_sta *sta, bool local) |
| 639 | { | 639 | { |
| 640 | struct ieee80211_tx_info *tx_info; | 640 | struct ieee80211_tx_info *tx_info; |
| 641 | struct queue_entry *entry; | 641 | struct queue_entry *entry; |
| @@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
| 649 | * after that we are free to use the skb->cb array | 649 | * after that we are free to use the skb->cb array |
| 650 | * for our information. | 650 | * for our information. |
| 651 | */ | 651 | */ |
| 652 | rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL); | 652 | rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta); |
| 653 | 653 | ||
| 654 | /* | 654 | /* |
| 655 | * All information is retrieved from the skb->cb array, | 655 | * All information is retrieved from the skb->cb array, |
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c index 9a78e3daf742..ff784072fb42 100644 --- a/drivers/net/wireless/rtlwifi/base.c +++ b/drivers/net/wireless/rtlwifi/base.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | 37 | ||
| 38 | #include <linux/ip.h> | 38 | #include <linux/ip.h> |
| 39 | #include <linux/module.h> | 39 | #include <linux/module.h> |
| 40 | #include <linux/udp.h> | ||
| 40 | 41 | ||
| 41 | /* | 42 | /* |
| 42 | *NOTICE!!!: This file will be very big, we should | 43 | *NOTICE!!!: This file will be very big, we should |
| @@ -1074,64 +1075,52 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) | |||
| 1074 | if (!ieee80211_is_data(fc)) | 1075 | if (!ieee80211_is_data(fc)) |
| 1075 | return false; | 1076 | return false; |
| 1076 | 1077 | ||
| 1078 | ip = (const struct iphdr *)(skb->data + mac_hdr_len + | ||
| 1079 | SNAP_SIZE + PROTOC_TYPE_SIZE); | ||
| 1080 | ether_type = be16_to_cpup((__be16 *) | ||
| 1081 | (skb->data + mac_hdr_len + SNAP_SIZE)); | ||
| 1077 | 1082 | ||
| 1078 | ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len + | 1083 | switch (ether_type) { |
| 1079 | SNAP_SIZE + PROTOC_TYPE_SIZE); | 1084 | case ETH_P_IP: { |
| 1080 | ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE); | 1085 | struct udphdr *udp; |
| 1081 | /* ether_type = ntohs(ether_type); */ | 1086 | u16 src; |
| 1082 | 1087 | u16 dst; | |
| 1083 | if (ETH_P_IP == ether_type) { | ||
| 1084 | if (IPPROTO_UDP == ip->protocol) { | ||
| 1085 | struct udphdr *udp = (struct udphdr *)((u8 *) ip + | ||
| 1086 | (ip->ihl << 2)); | ||
| 1087 | if (((((u8 *) udp)[1] == 68) && | ||
| 1088 | (((u8 *) udp)[3] == 67)) || | ||
| 1089 | ((((u8 *) udp)[1] == 67) && | ||
| 1090 | (((u8 *) udp)[3] == 68))) { | ||
| 1091 | /* | ||
| 1092 | * 68 : UDP BOOTP client | ||
| 1093 | * 67 : UDP BOOTP server | ||
| 1094 | */ | ||
| 1095 | RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), | ||
| 1096 | DBG_DMESG, "dhcp %s !!\n", | ||
| 1097 | is_tx ? "Tx" : "Rx"); | ||
| 1098 | |||
| 1099 | if (is_tx) { | ||
| 1100 | rtlpriv->enter_ps = false; | ||
| 1101 | schedule_work(&rtlpriv-> | ||
| 1102 | works.lps_change_work); | ||
| 1103 | ppsc->last_delaylps_stamp_jiffies = | ||
| 1104 | jiffies; | ||
| 1105 | } | ||
| 1106 | 1088 | ||
| 1107 | return true; | 1089 | if (ip->protocol != IPPROTO_UDP) |
| 1108 | } | 1090 | return false; |
| 1109 | } | 1091 | udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2)); |
| 1110 | } else if (ETH_P_ARP == ether_type) { | 1092 | src = be16_to_cpu(udp->source); |
| 1111 | if (is_tx) { | 1093 | dst = be16_to_cpu(udp->dest); |
| 1112 | rtlpriv->enter_ps = false; | ||
| 1113 | schedule_work(&rtlpriv->works.lps_change_work); | ||
| 1114 | ppsc->last_delaylps_stamp_jiffies = jiffies; | ||
| 1115 | } | ||
| 1116 | 1094 | ||
| 1117 | return true; | 1095 | /* If this case involves port 68 (UDP BOOTP client) connecting |
| 1118 | } else if (ETH_P_PAE == ether_type) { | 1096 | * with port 67 (UDP BOOTP server), then return true so that |
| 1097 | * the lowest speed is used. | ||
| 1098 | */ | ||
| 1099 | if (!((src == 68 && dst == 67) || (src == 67 && dst == 68))) | ||
| 1100 | return false; | ||
| 1101 | |||
| 1102 | RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, | ||
| 1103 | "dhcp %s !!\n", is_tx ? "Tx" : "Rx"); | ||
| 1104 | break; | ||
| 1105 | } | ||
| 1106 | case ETH_P_ARP: | ||
| 1107 | break; | ||
| 1108 | case ETH_P_PAE: | ||
| 1119 | RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, | 1109 | RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, |
| 1120 | "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx"); | 1110 | "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx"); |
| 1121 | 1111 | break; | |
| 1122 | if (is_tx) { | 1112 | case ETH_P_IPV6: |
| 1123 | rtlpriv->enter_ps = false; | 1113 | /* TODO: Is this right? */ |
| 1124 | schedule_work(&rtlpriv->works.lps_change_work); | 1114 | return false; |
| 1125 | ppsc->last_delaylps_stamp_jiffies = jiffies; | 1115 | default: |
| 1126 | } | 1116 | return false; |
| 1127 | |||
| 1128 | return true; | ||
| 1129 | } else if (ETH_P_IPV6 == ether_type) { | ||
| 1130 | /* IPv6 */ | ||
| 1131 | return true; | ||
| 1132 | } | 1117 | } |
| 1133 | 1118 | if (is_tx) { | |
| 1134 | return false; | 1119 | rtlpriv->enter_ps = false; |
| 1120 | schedule_work(&rtlpriv->works.lps_change_work); | ||
| 1121 | ppsc->last_delaylps_stamp_jiffies = jiffies; | ||
| 1122 | } | ||
| 1123 | return true; | ||
| 1135 | } | 1124 | } |
| 1136 | EXPORT_SYMBOL_GPL(rtl_is_special_data); | 1125 | EXPORT_SYMBOL_GPL(rtl_is_special_data); |
| 1137 | 1126 | ||
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c index ae13fb94b2e8..2ffc7298f686 100644 --- a/drivers/net/wireless/rtlwifi/efuse.c +++ b/drivers/net/wireless/rtlwifi/efuse.c | |||
| @@ -262,9 +262,9 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf) | |||
| 262 | sizeof(u8), GFP_ATOMIC); | 262 | sizeof(u8), GFP_ATOMIC); |
| 263 | if (!efuse_tbl) | 263 | if (!efuse_tbl) |
| 264 | return; | 264 | return; |
| 265 | efuse_word = kmalloc(EFUSE_MAX_WORD_UNIT * sizeof(u16 *), GFP_ATOMIC); | 265 | efuse_word = kzalloc(EFUSE_MAX_WORD_UNIT * sizeof(u16 *), GFP_ATOMIC); |
| 266 | if (!efuse_word) | 266 | if (!efuse_word) |
| 267 | goto done; | 267 | goto out; |
| 268 | for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { | 268 | for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { |
| 269 | efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16), | 269 | efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16), |
| 270 | GFP_ATOMIC); | 270 | GFP_ATOMIC); |
| @@ -378,6 +378,7 @@ done: | |||
| 378 | for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) | 378 | for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) |
| 379 | kfree(efuse_word[i]); | 379 | kfree(efuse_word[i]); |
| 380 | kfree(efuse_word); | 380 | kfree(efuse_word); |
| 381 | out: | ||
| 381 | kfree(efuse_tbl); | 382 | kfree(efuse_tbl); |
| 382 | } | 383 | } |
| 383 | 384 | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c index 25e50ffc44ec..b0c346a9e4b8 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c | |||
| @@ -349,7 +349,7 @@ bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw, | |||
| 349 | p_drvinfo); | 349 | p_drvinfo); |
| 350 | } | 350 | } |
| 351 | /*rx_status->qual = stats->signal; */ | 351 | /*rx_status->qual = stats->signal; */ |
| 352 | rx_status->signal = stats->rssi + 10; | 352 | rx_status->signal = stats->recvsignalpower + 10; |
| 353 | return true; | 353 | return true; |
| 354 | } | 354 | } |
| 355 | 355 | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c index 945ddecf90c9..0eb0f4ae5920 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c | |||
| @@ -525,7 +525,7 @@ bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, | |||
| 525 | p_drvinfo); | 525 | p_drvinfo); |
| 526 | } | 526 | } |
| 527 | /*rx_status->qual = stats->signal; */ | 527 | /*rx_status->qual = stats->signal; */ |
| 528 | rx_status->signal = stats->rssi + 10; | 528 | rx_status->signal = stats->recvsignalpower + 10; |
| 529 | return true; | 529 | return true; |
| 530 | } | 530 | } |
| 531 | 531 | ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/rf.c b/drivers/net/wireless/rtlwifi/rtl8192se/rf.c index 5061f1db3f02..92d38ab3c60e 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/rf.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/rf.c | |||
| @@ -265,7 +265,7 @@ static void _rtl92s_get_txpower_writeval_byregulatory(struct ieee80211_hw *hw, | |||
| 265 | rtlefuse->pwrgroup_ht40 | 265 | rtlefuse->pwrgroup_ht40 |
| 266 | [RF90_PATH_A][chnl - 1]) { | 266 | [RF90_PATH_A][chnl - 1]) { |
| 267 | pwrdiff_limit[i] = | 267 | pwrdiff_limit[i] = |
| 268 | rtlefuse->pwrgroup_ht20 | 268 | rtlefuse->pwrgroup_ht40 |
| 269 | [RF90_PATH_A][chnl - 1]; | 269 | [RF90_PATH_A][chnl - 1]; |
| 270 | } | 270 | } |
| 271 | } else { | 271 | } else { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c index 222d2e792ca6..27efbcdac6a9 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c +++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c | |||
| @@ -329,7 +329,7 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats, | |||
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | /*rx_status->qual = stats->signal; */ | 331 | /*rx_status->qual = stats->signal; */ |
| 332 | rx_status->signal = stats->rssi + 10; | 332 | rx_status->signal = stats->recvsignalpower + 10; |
| 333 | 333 | ||
| 334 | return true; | 334 | return true; |
| 335 | } | 335 | } |
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index d224dc3bb092..0c65386fa30d 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h | |||
| @@ -77,11 +77,7 @@ | |||
| 77 | #define RTL_SLOT_TIME_9 9 | 77 | #define RTL_SLOT_TIME_9 9 |
| 78 | #define RTL_SLOT_TIME_20 20 | 78 | #define RTL_SLOT_TIME_20 20 |
| 79 | 79 | ||
| 80 | /*related with tcp/ip. */ | 80 | /*related to tcp/ip. */ |
| 81 | /*if_ehther.h*/ | ||
| 82 | #define ETH_P_PAE 0x888E /*Port Access Entity (IEEE 802.1X) */ | ||
| 83 | #define ETH_P_IP 0x0800 /*Internet Protocol packet */ | ||
| 84 | #define ETH_P_ARP 0x0806 /*Address Resolution packet */ | ||
| 85 | #define SNAP_SIZE 6 | 81 | #define SNAP_SIZE 6 |
| 86 | #define PROTOC_TYPE_SIZE 2 | 82 | #define PROTOC_TYPE_SIZE 2 |
| 87 | 83 | ||
