Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless

John W. Linville says:

====================
pull request: wireless 2014-04-17

Please pull this batch of fixes intended for the 3.15 stream...

For the mac80211 bits, Johannes says:

"We have a fix from Chun-Yeow to not look at management frame bitrates
that are typically really low, two fixes from Felix for AP_VLAN
interfaces, a fix from Ido to disable SMPS settings when a monitor
interface is enabled, a radar detection fix from Michał and a fix from
myself for a very old remain-on-channel bug."

For the iwlwifi bits, Emmanuel says:

"I have new device IDs and a new firmware API. These are the trivial
ones. The less trivial ones are Johannes's fix that delays the
enablement of an interrupt coalescing hardware until after association
- this fixes a few connection problems seen in the field. Eyal has a
bunch of rate control fixes. I decided to add these for 3.15 because
they fix some disconnection and packet loss scenarios which were
reported by the field. I also have a fix for a memory leak that
happens only with a very new NIC."

Along with those...

Amitkumar Karwar fixes a couple of problems relating to driver/firmware
interactions in mwifiex.

Christian Engelmayer avoids a couple of potential memory leaks in
the new rsi driver.

Eliad Peller provides a wl18xx mailbox alignment fix for problems
when using new firmware.

Frederic Danis adds a couple of missing debugging strings to the
cw1200 driver.

Geert Uytterhoeven adds a variable initialization inside of the
rsi driver.

Luciano Coelho patches the wlcore code to ignore dummy packet events
in PLT mode in order to work around a firmware bug.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+263 -137
+2
drivers/net/wireless/cw1200/debug.c
··· 41 41 "REQ", 42 42 "SOFT", 43 43 "HARD", 44 + "RESET", 45 + "RESET_REMAP", 44 46 }; 45 47 46 48 static const char *cw1200_debug_mode(int mode)
+3 -2
drivers/net/wireless/iwlwifi/iwl-7000.c
··· 67 67 #include "iwl-agn-hw.h" 68 68 69 69 /* Highest firmware API version supported */ 70 - #define IWL7260_UCODE_API_MAX 8 71 - #define IWL3160_UCODE_API_MAX 8 70 + #define IWL7260_UCODE_API_MAX 9 71 + #define IWL3160_UCODE_API_MAX 9 72 72 73 73 /* Oldest version we won't warn about */ 74 74 #define IWL7260_UCODE_API_OK 8 ··· 244 244 245 245 MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); 246 246 MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); 247 + MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK));
+11 -7
drivers/net/wireless/iwlwifi/mvm/coex.c
··· 190 190 cpu_to_le32(0xcc00aaaa), 191 191 cpu_to_le32(0x0000aaaa), 192 192 cpu_to_le32(0xc0004000), 193 - cpu_to_le32(0x00000000), 193 + cpu_to_le32(0x00004000), 194 194 cpu_to_le32(0xf0005000), 195 195 cpu_to_le32(0xf0005000), 196 196 }, ··· 213 213 /* Tx Tx disabled */ 214 214 cpu_to_le32(0xaaaaaaaa), 215 215 cpu_to_le32(0xaaaaaaaa), 216 - cpu_to_le32(0xaaaaaaaa), 216 + cpu_to_le32(0xeeaaaaaa), 217 217 cpu_to_le32(0xaaaaaaaa), 218 218 cpu_to_le32(0xcc00ff28), 219 219 cpu_to_le32(0x0000aaaa), 220 220 cpu_to_le32(0xcc00aaaa), 221 221 cpu_to_le32(0x0000aaaa), 222 - cpu_to_le32(0xC0004000), 223 - cpu_to_le32(0xC0004000), 224 - cpu_to_le32(0xF0005000), 225 - cpu_to_le32(0xF0005000), 222 + cpu_to_le32(0xc0004000), 223 + cpu_to_le32(0xc0004000), 224 + cpu_to_le32(0xf0005000), 225 + cpu_to_le32(0xf0005000), 226 226 }, 227 227 }; 228 228 ··· 1262 1262 struct iwl_rx_packet *pkt = rxb_addr(rxb); 1263 1263 u32 ant_isolation = le32_to_cpup((void *)pkt->data); 1264 1264 u8 __maybe_unused lower_bound, upper_bound; 1265 + int ret; 1265 1266 u8 lut; 1266 1267 1267 1268 struct iwl_bt_coex_cmd *bt_cmd; ··· 1319 1318 memcpy(bt_cmd->bt4_corun_lut40, antenna_coupling_ranges[lut].lut20, 1320 1319 sizeof(bt_cmd->bt4_corun_lut40)); 1321 1320 1322 - return 0; 1321 + ret = iwl_mvm_send_cmd(mvm, &cmd); 1322 + 1323 + kfree(bt_cmd); 1324 + return ret; 1323 1325 }
+1
drivers/net/wireless/iwlwifi/mvm/mac80211.c
··· 1332 1332 */ 1333 1333 iwl_mvm_remove_time_event(mvm, mvmvif, 1334 1334 &mvmvif->time_event_data); 1335 + iwl_mvm_sf_update(mvm, vif, false); 1335 1336 WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, CMD_SYNC)); 1336 1337 } else if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS | 1337 1338 BSS_CHANGED_QOS)) {
+170 -101
drivers/net/wireless/iwlwifi/mvm/rs.c
··· 59 59 /* max allowed rate miss before sync LQ cmd */ 60 60 #define IWL_MISSED_RATE_MAX 15 61 61 #define RS_STAY_IN_COLUMN_TIMEOUT (5*HZ) 62 - 62 + #define RS_IDLE_TIMEOUT (5*HZ) 63 63 64 64 static u8 rs_ht_to_legacy[] = { 65 65 [IWL_RATE_MCS_0_INDEX] = IWL_RATE_6M_INDEX, ··· 142 142 RS_MIMO2, 143 143 }; 144 144 145 - #define MAX_NEXT_COLUMNS 5 145 + #define MAX_NEXT_COLUMNS 7 146 146 #define MAX_COLUMN_CHECKS 3 147 147 148 148 typedef bool (*allow_column_func_t) (struct iwl_mvm *mvm, ··· 212 212 RS_COLUMN_LEGACY_ANT_B, 213 213 RS_COLUMN_SISO_ANT_A, 214 214 RS_COLUMN_SISO_ANT_B, 215 - RS_COLUMN_MIMO2, 216 - RS_COLUMN_MIMO2_SGI, 215 + RS_COLUMN_INVALID, 216 + RS_COLUMN_INVALID, 217 + RS_COLUMN_INVALID, 218 + RS_COLUMN_INVALID, 217 219 }, 218 220 }, 219 221 [RS_COLUMN_LEGACY_ANT_B] = { ··· 225 223 RS_COLUMN_LEGACY_ANT_A, 226 224 RS_COLUMN_SISO_ANT_A, 227 225 RS_COLUMN_SISO_ANT_B, 228 - RS_COLUMN_MIMO2, 229 - RS_COLUMN_MIMO2_SGI, 226 + RS_COLUMN_INVALID, 227 + RS_COLUMN_INVALID, 228 + RS_COLUMN_INVALID, 229 + RS_COLUMN_INVALID, 230 230 }, 231 231 }, 232 232 [RS_COLUMN_SISO_ANT_A] = { ··· 239 235 RS_COLUMN_MIMO2, 240 236 RS_COLUMN_SISO_ANT_A_SGI, 241 237 RS_COLUMN_SISO_ANT_B_SGI, 242 - RS_COLUMN_MIMO2_SGI, 238 + RS_COLUMN_LEGACY_ANT_A, 239 + RS_COLUMN_LEGACY_ANT_B, 240 + RS_COLUMN_INVALID, 243 241 }, 244 242 .checks = { 245 243 rs_siso_allow, ··· 255 249 RS_COLUMN_MIMO2, 256 250 RS_COLUMN_SISO_ANT_B_SGI, 257 251 RS_COLUMN_SISO_ANT_A_SGI, 258 - RS_COLUMN_MIMO2_SGI, 252 + RS_COLUMN_LEGACY_ANT_A, 253 + RS_COLUMN_LEGACY_ANT_B, 254 + RS_COLUMN_INVALID, 259 255 }, 260 256 .checks = { 261 257 rs_siso_allow, ··· 273 265 RS_COLUMN_SISO_ANT_A, 274 266 RS_COLUMN_SISO_ANT_B, 275 267 RS_COLUMN_MIMO2, 268 + RS_COLUMN_LEGACY_ANT_A, 269 + RS_COLUMN_LEGACY_ANT_B, 276 270 }, 277 271 .checks = { 278 272 rs_siso_allow, ··· 291 281 RS_COLUMN_SISO_ANT_B, 292 282 RS_COLUMN_SISO_ANT_A, 293 283 RS_COLUMN_MIMO2, 284 + RS_COLUMN_LEGACY_ANT_A, 285 + RS_COLUMN_LEGACY_ANT_B, 294 286 }, 295 287 .checks = { 296 288 rs_siso_allow, ··· 308 296 RS_COLUMN_SISO_ANT_A_SGI, 309 297 RS_COLUMN_SISO_ANT_B_SGI, 310 298 RS_COLUMN_MIMO2_SGI, 299 + RS_COLUMN_LEGACY_ANT_A, 300 + RS_COLUMN_LEGACY_ANT_B, 311 301 }, 312 302 .checks = { 313 303 rs_mimo_allow, ··· 325 311 RS_COLUMN_SISO_ANT_A, 326 312 RS_COLUMN_SISO_ANT_B, 327 313 RS_COLUMN_MIMO2, 314 + RS_COLUMN_LEGACY_ANT_A, 315 + RS_COLUMN_LEGACY_ANT_B, 328 316 }, 329 317 .checks = { 330 318 rs_mimo_allow, ··· 519 503 window->average_tpt = IWL_INVALID_VALUE; 520 504 } 521 505 522 - static void rs_rate_scale_clear_tbl_windows(struct iwl_scale_tbl_info *tbl) 506 + static void rs_rate_scale_clear_tbl_windows(struct iwl_mvm *mvm, 507 + struct iwl_scale_tbl_info *tbl) 523 508 { 524 509 int i; 525 510 511 + IWL_DEBUG_RATE(mvm, "Clearing up window stats\n"); 526 512 for (i = 0; i < IWL_RATE_COUNT; i++) 527 513 rs_rate_scale_clear_window(&tbl->win[i]); 528 514 } ··· 1010 992 return; 1011 993 } 1012 994 995 + #ifdef CPTCFG_MAC80211_DEBUGFS 996 + /* Disable last tx check if we are debugging with fixed rate */ 997 + if (lq_sta->dbg_fixed_rate) { 998 + IWL_DEBUG_RATE(mvm, "Fixed rate. avoid rate scaling\n"); 999 + return; 1000 + } 1001 + #endif 1013 1002 if (!ieee80211_is_data(hdr->frame_control) || 1014 1003 info->flags & IEEE80211_TX_CTL_NO_ACK) 1015 1004 return; ··· 1058 1033 if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE)) 1059 1034 mac_index++; 1060 1035 } 1036 + 1037 + if (time_after(jiffies, 1038 + (unsigned long)(lq_sta->last_tx + RS_IDLE_TIMEOUT))) { 1039 + int tid; 1040 + IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n"); 1041 + for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) 1042 + ieee80211_stop_tx_ba_session(sta, tid); 1043 + 1044 + iwl_mvm_rs_rate_init(mvm, sta, sband->band, false); 1045 + return; 1046 + } 1047 + lq_sta->last_tx = jiffies; 1061 1048 1062 1049 /* Here we actually compare this rate to the latest LQ command */ 1063 1050 if ((mac_index < 0) || ··· 1223 1186 lq_sta->visited_columns = 0; 1224 1187 } 1225 1188 1189 + static int rs_get_max_allowed_rate(struct iwl_lq_sta *lq_sta, 1190 + const struct rs_tx_column *column) 1191 + { 1192 + switch (column->mode) { 1193 + case RS_LEGACY: 1194 + return lq_sta->max_legacy_rate_idx; 1195 + case RS_SISO: 1196 + return lq_sta->max_siso_rate_idx; 1197 + case RS_MIMO2: 1198 + return lq_sta->max_mimo2_rate_idx; 1199 + default: 1200 + WARN_ON_ONCE(1); 1201 + } 1202 + 1203 + return lq_sta->max_legacy_rate_idx; 1204 + } 1205 + 1226 1206 static const u16 *rs_get_expected_tpt_table(struct iwl_lq_sta *lq_sta, 1227 - const struct rs_tx_column *column, 1228 - u32 bw) 1207 + const struct rs_tx_column *column, 1208 + u32 bw) 1229 1209 { 1230 1210 /* Used to choose among HT tables */ 1231 1211 const u16 (*ht_tbl_pointer)[IWL_RATE_COUNT]; ··· 1492 1438 1493 1439 IWL_DEBUG_RATE(mvm, 1494 1440 "LQ: stay in table clear win\n"); 1495 - rs_rate_scale_clear_tbl_windows(tbl); 1441 + rs_rate_scale_clear_tbl_windows(mvm, tbl); 1496 1442 } 1497 1443 } 1498 1444 ··· 1500 1446 * bitmaps and stats in active table (this will become the new 1501 1447 * "search" table). */ 1502 1448 if (lq_sta->rs_state == RS_STATE_SEARCH_CYCLE_STARTED) { 1503 - IWL_DEBUG_RATE(mvm, "Clearing up window stats\n"); 1504 - rs_rate_scale_clear_tbl_windows(tbl); 1449 + rs_rate_scale_clear_tbl_windows(mvm, tbl); 1505 1450 } 1506 1451 } 1507 1452 } ··· 1538 1485 struct ieee80211_sta *sta, 1539 1486 struct iwl_scale_tbl_info *tbl) 1540 1487 { 1541 - int i, j, n; 1488 + int i, j, max_rate; 1542 1489 enum rs_column next_col_id; 1543 1490 const struct rs_tx_column *curr_col = &rs_tx_columns[tbl->column]; 1544 1491 const struct rs_tx_column *next_col; 1545 1492 allow_column_func_t allow_func; 1546 1493 u8 valid_ants = mvm->fw->valid_tx_ant; 1547 1494 const u16 *expected_tpt_tbl; 1548 - s32 tpt, max_expected_tpt; 1495 + u16 tpt, max_expected_tpt; 1549 1496 1550 1497 for (i = 0; i < MAX_NEXT_COLUMNS; i++) { 1551 1498 next_col_id = curr_col->next_columns[i]; ··· 1588 1535 if (WARN_ON_ONCE(!expected_tpt_tbl)) 1589 1536 continue; 1590 1537 1591 - max_expected_tpt = 0; 1592 - for (n = 0; n < IWL_RATE_COUNT; n++) 1593 - if (expected_tpt_tbl[n] > max_expected_tpt) 1594 - max_expected_tpt = expected_tpt_tbl[n]; 1538 + max_rate = rs_get_max_allowed_rate(lq_sta, next_col); 1539 + if (WARN_ON_ONCE(max_rate == IWL_RATE_INVALID)) 1540 + continue; 1595 1541 1542 + max_expected_tpt = expected_tpt_tbl[max_rate]; 1596 1543 if (tpt >= max_expected_tpt) { 1597 1544 IWL_DEBUG_RATE(mvm, 1598 1545 "Skip column %d: can't beat current TPT. Max expected %d current %d\n", ··· 1600 1547 continue; 1601 1548 } 1602 1549 1550 + IWL_DEBUG_RATE(mvm, 1551 + "Found potential column %d. Max expected %d current %d\n", 1552 + next_col_id, max_expected_tpt, tpt); 1603 1553 break; 1604 1554 } 1605 1555 1606 1556 if (i == MAX_NEXT_COLUMNS) 1607 1557 return RS_COLUMN_INVALID; 1608 - 1609 - IWL_DEBUG_RATE(mvm, "Found potential column %d\n", next_col_id); 1610 1558 1611 1559 return next_col_id; 1612 1560 } ··· 1694 1640 { 1695 1641 enum rs_action action = RS_ACTION_STAY; 1696 1642 1697 - /* Too many failures, decrease rate */ 1698 1643 if ((sr <= RS_SR_FORCE_DECREASE) || (current_tpt == 0)) { 1699 1644 IWL_DEBUG_RATE(mvm, 1700 - "decrease rate because of low SR\n"); 1645 + "Decrease rate because of low SR\n"); 1646 + return RS_ACTION_DOWNSCALE; 1647 + } 1648 + 1649 + if ((low_tpt == IWL_INVALID_VALUE) && 1650 + (high_tpt == IWL_INVALID_VALUE) && 1651 + (high != IWL_RATE_INVALID)) { 1652 + IWL_DEBUG_RATE(mvm, 1653 + "No data about high/low rates. Increase rate\n"); 1654 + return RS_ACTION_UPSCALE; 1655 + } 1656 + 1657 + if ((high_tpt == IWL_INVALID_VALUE) && 1658 + (high != IWL_RATE_INVALID) && 1659 + (low_tpt != IWL_INVALID_VALUE) && 1660 + (low_tpt < current_tpt)) { 1661 + IWL_DEBUG_RATE(mvm, 1662 + "No data about high rate and low rate is worse. Increase rate\n"); 1663 + return RS_ACTION_UPSCALE; 1664 + } 1665 + 1666 + if ((high_tpt != IWL_INVALID_VALUE) && 1667 + (high_tpt > current_tpt)) { 1668 + IWL_DEBUG_RATE(mvm, 1669 + "Higher rate is better. Increate rate\n"); 1670 + return RS_ACTION_UPSCALE; 1671 + } 1672 + 1673 + if ((low_tpt != IWL_INVALID_VALUE) && 1674 + (high_tpt != IWL_INVALID_VALUE) && 1675 + (low_tpt < current_tpt) && 1676 + (high_tpt < current_tpt)) { 1677 + IWL_DEBUG_RATE(mvm, 1678 + "Both high and low are worse. Maintain rate\n"); 1679 + return RS_ACTION_STAY; 1680 + } 1681 + 1682 + if ((low_tpt != IWL_INVALID_VALUE) && 1683 + (low_tpt > current_tpt)) { 1684 + IWL_DEBUG_RATE(mvm, 1685 + "Lower rate is better\n"); 1701 1686 action = RS_ACTION_DOWNSCALE; 1702 - /* No throughput measured yet for adjacent rates; try increase. */ 1703 - } else if ((low_tpt == IWL_INVALID_VALUE) && 1704 - (high_tpt == IWL_INVALID_VALUE)) { 1705 - if (high != IWL_RATE_INVALID && sr >= IWL_RATE_INCREASE_TH) { 1687 + goto out; 1688 + } 1689 + 1690 + if ((low_tpt == IWL_INVALID_VALUE) && 1691 + (low != IWL_RATE_INVALID)) { 1692 + IWL_DEBUG_RATE(mvm, 1693 + "No data about lower rate\n"); 1694 + action = RS_ACTION_DOWNSCALE; 1695 + goto out; 1696 + } 1697 + 1698 + IWL_DEBUG_RATE(mvm, "Maintain rate\n"); 1699 + 1700 + out: 1701 + if ((action == RS_ACTION_DOWNSCALE) && (low != IWL_RATE_INVALID)) { 1702 + if (sr >= RS_SR_NO_DECREASE) { 1706 1703 IWL_DEBUG_RATE(mvm, 1707 - "Good SR and no high rate measurement. " 1708 - "Increase rate\n"); 1709 - action = RS_ACTION_UPSCALE; 1710 - } else if (low != IWL_RATE_INVALID) { 1711 - IWL_DEBUG_RATE(mvm, 1712 - "Remain in current rate\n"); 1704 + "SR is above NO DECREASE. Avoid downscale\n"); 1713 1705 action = RS_ACTION_STAY; 1706 + } else if (current_tpt > (100 * tbl->expected_tpt[low])) { 1707 + IWL_DEBUG_RATE(mvm, 1708 + "Current TPT is higher than max expected in low rate. Avoid downscale\n"); 1709 + action = RS_ACTION_STAY; 1710 + } else { 1711 + IWL_DEBUG_RATE(mvm, "Decrease rate\n"); 1714 1712 } 1715 - } 1716 - 1717 - /* Both adjacent throughputs are measured, but neither one has better 1718 - * throughput; we're using the best rate, don't change it! 1719 - */ 1720 - else if ((low_tpt != IWL_INVALID_VALUE) && 1721 - (high_tpt != IWL_INVALID_VALUE) && 1722 - (low_tpt < current_tpt) && 1723 - (high_tpt < current_tpt)) { 1724 - IWL_DEBUG_RATE(mvm, 1725 - "Both high and low are worse. " 1726 - "Maintain rate\n"); 1727 - action = RS_ACTION_STAY; 1728 - } 1729 - 1730 - /* At least one adjacent rate's throughput is measured, 1731 - * and may have better performance. 1732 - */ 1733 - else { 1734 - /* Higher adjacent rate's throughput is measured */ 1735 - if (high_tpt != IWL_INVALID_VALUE) { 1736 - /* Higher rate has better throughput */ 1737 - if (high_tpt > current_tpt && 1738 - sr >= IWL_RATE_INCREASE_TH) { 1739 - IWL_DEBUG_RATE(mvm, 1740 - "Higher rate is better and good " 1741 - "SR. Increate rate\n"); 1742 - action = RS_ACTION_UPSCALE; 1743 - } else { 1744 - IWL_DEBUG_RATE(mvm, 1745 - "Higher rate isn't better OR " 1746 - "no good SR. Maintain rate\n"); 1747 - action = RS_ACTION_STAY; 1748 - } 1749 - 1750 - /* Lower adjacent rate's throughput is measured */ 1751 - } else if (low_tpt != IWL_INVALID_VALUE) { 1752 - /* Lower rate has better throughput */ 1753 - if (low_tpt > current_tpt) { 1754 - IWL_DEBUG_RATE(mvm, 1755 - "Lower rate is better. " 1756 - "Decrease rate\n"); 1757 - action = RS_ACTION_DOWNSCALE; 1758 - } else if (sr >= IWL_RATE_INCREASE_TH) { 1759 - IWL_DEBUG_RATE(mvm, 1760 - "Lower rate isn't better and " 1761 - "good SR. Increase rate\n"); 1762 - action = RS_ACTION_UPSCALE; 1763 - } 1764 - } 1765 - } 1766 - 1767 - /* Sanity check; asked for decrease, but success rate or throughput 1768 - * has been good at old rate. Don't change it. 1769 - */ 1770 - if ((action == RS_ACTION_DOWNSCALE) && (low != IWL_RATE_INVALID) && 1771 - ((sr > IWL_RATE_HIGH_TH) || 1772 - (current_tpt > (100 * tbl->expected_tpt[low])))) { 1773 - IWL_DEBUG_RATE(mvm, 1774 - "Sanity check failed. Maintain rate\n"); 1775 - action = RS_ACTION_STAY; 1776 1713 } 1777 1714 1778 1715 return action; ··· 1837 1792 "Aggregation changed: prev %d current %d. Update expected TPT table\n", 1838 1793 prev_agg, lq_sta->is_agg); 1839 1794 rs_set_expected_tpt_table(lq_sta, tbl); 1795 + rs_rate_scale_clear_tbl_windows(mvm, tbl); 1840 1796 } 1841 1797 1842 1798 /* current tx rate */ ··· 2067 2021 if (lq_sta->search_better_tbl) { 2068 2022 /* Access the "search" table, clear its history. */ 2069 2023 tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); 2070 - rs_rate_scale_clear_tbl_windows(tbl); 2024 + rs_rate_scale_clear_tbl_windows(mvm, tbl); 2071 2025 2072 2026 /* Use new "search" start rate */ 2073 2027 index = tbl->rate.index; ··· 2088 2042 * stay with best antenna legacy modulation for a while 2089 2043 * before next round of mode comparisons. */ 2090 2044 tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]); 2091 - if (is_legacy(&tbl1->rate) && !sta->ht_cap.ht_supported) { 2045 + if (is_legacy(&tbl1->rate)) { 2092 2046 IWL_DEBUG_RATE(mvm, "LQ: STAY in legacy table\n"); 2047 + 2048 + if (tid != IWL_MAX_TID_COUNT) { 2049 + tid_data = &sta_priv->tid_data[tid]; 2050 + if (tid_data->state != IWL_AGG_OFF) { 2051 + IWL_DEBUG_RATE(mvm, 2052 + "Stop aggregation on tid %d\n", 2053 + tid); 2054 + ieee80211_stop_tx_ba_session(sta, tid); 2055 + } 2056 + } 2093 2057 rs_set_stay_in_table(mvm, 1, lq_sta); 2094 2058 } else { 2095 2059 /* If we're in an HT mode, and all 3 mode switch actions ··· 2398 2342 lq_sta->lq.sta_id = sta_priv->sta_id; 2399 2343 2400 2344 for (j = 0; j < LQ_SIZE; j++) 2401 - rs_rate_scale_clear_tbl_windows(&lq_sta->lq_info[j]); 2345 + rs_rate_scale_clear_tbl_windows(mvm, &lq_sta->lq_info[j]); 2402 2346 2403 2347 lq_sta->flush_timer = 0; 2348 + lq_sta->last_tx = jiffies; 2404 2349 2405 2350 IWL_DEBUG_RATE(mvm, 2406 2351 "LQ: *** rate scale station global init for station %d ***\n", ··· 2445 2388 lq_sta->is_vht = true; 2446 2389 } 2447 2390 2448 - IWL_DEBUG_RATE(mvm, 2449 - "SISO-RATE=%X MIMO2-RATE=%X VHT=%d\n", 2391 + lq_sta->max_legacy_rate_idx = find_last_bit(&lq_sta->active_legacy_rate, 2392 + BITS_PER_LONG); 2393 + lq_sta->max_siso_rate_idx = find_last_bit(&lq_sta->active_siso_rate, 2394 + BITS_PER_LONG); 2395 + lq_sta->max_mimo2_rate_idx = find_last_bit(&lq_sta->active_mimo2_rate, 2396 + BITS_PER_LONG); 2397 + 2398 + IWL_DEBUG_RATE(mvm, "RATE MASK: LEGACY=%lX SISO=%lX MIMO2=%lX VHT=%d\n", 2399 + lq_sta->active_legacy_rate, 2450 2400 lq_sta->active_siso_rate, 2451 2401 lq_sta->active_mimo2_rate, 2452 2402 lq_sta->is_vht); 2403 + IWL_DEBUG_RATE(mvm, "MAX RATE: LEGACY=%d SISO=%d MIMO2=%d\n", 2404 + lq_sta->max_legacy_rate_idx, 2405 + lq_sta->max_siso_rate_idx, 2406 + lq_sta->max_mimo2_rate_idx); 2453 2407 2454 2408 /* These values will be overridden later */ 2455 2409 lq_sta->lq.single_stream_ant_msk = ··· 2615 2547 if (is_siso(&rate)) { 2616 2548 num_rates = RS_SECONDARY_SISO_NUM_RATES; 2617 2549 num_retries = RS_SECONDARY_SISO_RETRIES; 2550 + lq_cmd->mimo_delim = index; 2618 2551 } else if (is_legacy(&rate)) { 2619 2552 num_rates = RS_SECONDARY_LEGACY_NUM_RATES; 2620 2553 num_retries = RS_LEGACY_RETRIES_PER_RATE; ··· 2818 2749 return -ENOMEM; 2819 2750 2820 2751 desc += sprintf(buff+desc, "sta_id %d\n", lq_sta->lq.sta_id); 2821 - desc += sprintf(buff+desc, "failed=%d success=%d rate=0%X\n", 2752 + desc += sprintf(buff+desc, "failed=%d success=%d rate=0%lX\n", 2822 2753 lq_sta->total_failed, lq_sta->total_success, 2823 2754 lq_sta->active_legacy_rate); 2824 2755 desc += sprintf(buff+desc, "fixed rate 0x%X\n",
+11 -3
drivers/net/wireless/iwlwifi/mvm/rs.h
··· 156 156 #define IWL_RATE_HIGH_TH 10880 /* 85% */ 157 157 #define IWL_RATE_INCREASE_TH 6400 /* 50% */ 158 158 #define RS_SR_FORCE_DECREASE 1920 /* 15% */ 159 + #define RS_SR_NO_DECREASE 10880 /* 85% */ 159 160 160 161 #define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000) /* 4 milliseconds */ 161 162 #define LINK_QUAL_AGG_TIME_LIMIT_MAX (8000) ··· 311 310 u32 visited_columns; /* Bitmask marking which Tx columns were 312 311 * explored during a search cycle 313 312 */ 313 + u64 last_tx; 314 314 bool is_vht; 315 315 enum ieee80211_band band; 316 316 317 317 /* The following are bitmaps of rates; IWL_RATE_6M_MASK, etc. */ 318 - u16 active_legacy_rate; 319 - u16 active_siso_rate; 320 - u16 active_mimo2_rate; 318 + unsigned long active_legacy_rate; 319 + unsigned long active_siso_rate; 320 + unsigned long active_mimo2_rate; 321 + 322 + /* Highest rate per Tx mode */ 323 + u8 max_legacy_rate_idx; 324 + u8 max_siso_rate_idx; 325 + u8 max_mimo2_rate_idx; 326 + 321 327 s8 max_rate_idx; /* Max rate set by user */ 322 328 u8 missed_rate_counter; 323 329
+2 -1
drivers/net/wireless/iwlwifi/mvm/sf.c
··· 274 274 return -EINVAL; 275 275 if (changed_vif->type != NL80211_IFTYPE_STATION) { 276 276 new_state = SF_UNINIT; 277 - } else if (changed_vif->bss_conf.assoc) { 277 + } else if (changed_vif->bss_conf.assoc && 278 + changed_vif->bss_conf.dtim_period) { 278 279 mvmvif = iwl_mvm_vif_from_mac80211(changed_vif); 279 280 sta_id = mvmvif->ap_sta_id; 280 281 new_state = SF_FULL_ON;
+2
drivers/net/wireless/iwlwifi/pcie/drv.c
··· 373 373 {IWL_PCI_DEVICE(0x095A, 0x500A, iwl7265_2n_cfg)}, 374 374 {IWL_PCI_DEVICE(0x095B, 0x5200, iwl7265_2n_cfg)}, 375 375 {IWL_PCI_DEVICE(0x095A, 0x5002, iwl7265_n_cfg)}, 376 + {IWL_PCI_DEVICE(0x095A, 0x5102, iwl7265_n_cfg)}, 376 377 {IWL_PCI_DEVICE(0x095B, 0x5202, iwl7265_n_cfg)}, 377 378 {IWL_PCI_DEVICE(0x095A, 0x9010, iwl7265_2ac_cfg)}, 378 379 {IWL_PCI_DEVICE(0x095A, 0x9012, iwl7265_2ac_cfg)}, 379 380 {IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)}, 380 381 {IWL_PCI_DEVICE(0x095A, 0x9112, iwl7265_2ac_cfg)}, 381 382 {IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)}, 383 + {IWL_PCI_DEVICE(0x095A, 0x9200, iwl7265_2ac_cfg)}, 382 384 {IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)}, 383 385 {IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)}, 384 386 {IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)},
+6 -6
drivers/net/wireless/mwifiex/main.c
··· 292 292 while ((skb = skb_dequeue(&adapter->usb_rx_data_q))) 293 293 mwifiex_handle_rx_packet(adapter, skb); 294 294 295 + /* Check for event */ 296 + if (adapter->event_received) { 297 + adapter->event_received = false; 298 + mwifiex_process_event(adapter); 299 + } 300 + 295 301 /* Check for Cmd Resp */ 296 302 if (adapter->cmd_resp_received) { 297 303 adapter->cmd_resp_received = false; ··· 308 302 adapter->hw_status = MWIFIEX_HW_STATUS_READY; 309 303 mwifiex_init_fw_complete(adapter); 310 304 } 311 - } 312 - 313 - /* Check for event */ 314 - if (adapter->event_received) { 315 - adapter->event_received = false; 316 - mwifiex_process_event(adapter); 317 305 } 318 306 319 307 /* Check if we need to confirm Sleep Request
+4 -3
drivers/net/wireless/mwifiex/sta_ioctl.c
··· 60 60 int status; 61 61 62 62 /* Wait for completion */ 63 - status = wait_event_interruptible(adapter->cmd_wait_q.wait, 64 - *(cmd_queued->condition)); 65 - if (status) { 63 + status = wait_event_interruptible_timeout(adapter->cmd_wait_q.wait, 64 + *(cmd_queued->condition), 65 + (12 * HZ)); 66 + if (status <= 0) { 66 67 dev_err(adapter->dev, "cmd_wait_q terminated: %d\n", status); 67 68 mwifiex_cancel_all_pending_cmd(adapter); 68 69 return status;
+1 -1
drivers/net/wireless/rsi/rsi_91x_core.c
··· 88 88 bool recontend_queue = false; 89 89 u32 q_len = 0; 90 90 u8 q_num = INVALID_QUEUE; 91 - u8 ii, min = 0; 91 + u8 ii = 0, min = 0; 92 92 93 93 if (skb_queue_len(&common->tx_queue[MGMT_SOFT_Q])) { 94 94 if (!common->mgmt_q_block)
+11 -10
drivers/net/wireless/rsi/rsi_91x_mgmt.c
··· 841 841 rsi_dbg(MGMT_TX_ZONE, 842 842 "%s: Sending scan req frame\n", __func__); 843 843 844 - skb = dev_alloc_skb(FRAME_DESC_SZ); 845 - if (!skb) { 846 - rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n", 847 - __func__); 848 - return -ENOMEM; 849 - } 850 - 851 - memset(skb->data, 0, FRAME_DESC_SZ); 852 - mgmt_frame = (struct rsi_mac_frame *)skb->data; 853 - 854 844 if (common->band == IEEE80211_BAND_5GHZ) { 855 845 if ((channel >= 36) && (channel <= 64)) 856 846 channel = ((channel - 32) / 4); ··· 857 867 return -EINVAL; 858 868 } 859 869 } 870 + 871 + skb = dev_alloc_skb(FRAME_DESC_SZ); 872 + if (!skb) { 873 + rsi_dbg(ERR_ZONE, "%s: Failed in allocation of skb\n", 874 + __func__); 875 + return -ENOMEM; 876 + } 877 + 878 + memset(skb->data, 0, FRAME_DESC_SZ); 879 + mgmt_frame = (struct rsi_mac_frame *)skb->data; 860 880 861 881 mgmt_frame->desc_word[0] = cpu_to_le16(RSI_WIFI_MGMT_Q << 12); 862 882 mgmt_frame->desc_word[1] = cpu_to_le16(SCAN_REQUEST); ··· 966 966 if (!selected_rates) { 967 967 rsi_dbg(ERR_ZONE, "%s: Failed in allocation of mem\n", 968 968 __func__); 969 + dev_kfree_skb(skb); 969 970 return -ENOMEM; 970 971 } 971 972
+20
drivers/net/wireless/ti/wl18xx/event.h
··· 68 68 69 69 /* bitmap of inactive stations (by HLID) */ 70 70 __le32 inactive_sta_bitmap; 71 + 72 + /* rx BA win size indicated by RX_BA_WIN_SIZE_CHANGE_EVENT_ID */ 73 + u8 rx_ba_role_id; 74 + u8 rx_ba_link_id; 75 + u8 rx_ba_win_size; 76 + u8 padding; 77 + 78 + /* smart config */ 79 + u8 sc_ssid_len; 80 + u8 sc_pwd_len; 81 + u8 sc_token_len; 82 + u8 padding1; 83 + u8 sc_ssid[32]; 84 + u8 sc_pwd[32]; 85 + u8 sc_token[32]; 86 + 87 + /* smart config sync channel */ 88 + u8 sc_sync_channel; 89 + u8 sc_sync_band; 90 + u8 padding2[2]; 71 91 } __packed; 72 92 73 93 int wl18xx_wait_for_event(struct wl1271 *wl, enum wlcore_wait_event event,
+5
drivers/net/wireless/ti/wlcore/event.c
··· 158 158 159 159 void wlcore_event_dummy_packet(struct wl1271 *wl) 160 160 { 161 + if (wl->plt) { 162 + wl1271_info("Got DUMMY_PACKET event in PLT mode. FW bug, ignoring."); 163 + return; 164 + } 165 + 161 166 wl1271_debug(DEBUG_EVENT, "DUMMY_PACKET_ID_EVENT_ID"); 162 167 wl1271_tx_dummy_packet(wl); 163 168 }
+9 -2
net/mac80211/chan.c
··· 249 249 250 250 if (!local->use_chanctx) { 251 251 local->_oper_chandef = *chandef; 252 - ieee80211_hw_config(local, 0); 252 + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 253 253 } else { 254 254 err = drv_add_chanctx(local, ctx); 255 255 if (err) { ··· 286 286 check_single_channel = true; 287 287 local->hw.conf.radar_enabled = false; 288 288 289 - ieee80211_hw_config(local, 0); 289 + ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); 290 290 } else { 291 291 drv_remove_chanctx(local, ctx); 292 292 } ··· 492 492 rx_chains_static = max(rx_chains_static, needed_static); 493 493 rx_chains_dynamic = max(rx_chains_dynamic, needed_dynamic); 494 494 } 495 + 496 + /* Disable SMPS for the monitor interface */ 497 + sdata = rcu_dereference(local->monitor_sdata); 498 + if (sdata && 499 + rcu_access_pointer(sdata->vif.chanctx_conf) == &chanctx->conf) 500 + rx_chains_dynamic = rx_chains_static = local->rx_chains; 501 + 495 502 rcu_read_unlock(); 496 503 497 504 if (!local->use_chanctx) {
+3 -1
net/mac80211/main.c
··· 148 148 list_for_each_entry_rcu(sdata, &local->interfaces, list) { 149 149 if (!rcu_access_pointer(sdata->vif.chanctx_conf)) 150 150 continue; 151 + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 152 + continue; 151 153 power = min(power, sdata->vif.bss_conf.txpower); 152 154 } 153 155 rcu_read_unlock(); ··· 201 199 { 202 200 struct ieee80211_local *local = sdata->local; 203 201 204 - if (!changed) 202 + if (!changed || sdata->vif.type == NL80211_IFTYPE_AP_VLAN) 205 203 return; 206 204 207 205 drv_bss_info_changed(local, sdata, &sdata->vif.bss_conf, changed);
+1
net/mac80211/offchannel.c
··· 355 355 struct ieee80211_roc_work *dep; 356 356 357 357 /* start this ROC */ 358 + ieee80211_offchannel_stop_vifs(local); 358 359 359 360 /* switch channel etc */ 360 361 ieee80211_recalc_idle(local);
+1
net/mac80211/status.c
··· 618 618 sta, true, acked); 619 619 620 620 if ((local->hw.flags & IEEE80211_HW_HAS_RATE_CONTROL) && 621 + (ieee80211_is_data(hdr->frame_control)) && 621 622 (rates_idx != -1)) 622 623 sta->last_tx_rate = info->status.rates[rates_idx]; 623 624