Commit 99a49ce613057f1934e1c378808374fd683b1541

Authored by David S. Miller

Merge tag 'master-2014-10-30' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless

John W. Linville says:

====================
pull request: wireless 2014-10-31

Please pull this small batch of spooky fixes intended for the 3.18
stream...boo!

Cyril Brulebois adds an rt2x00 device ID.

Dan Carpenter provides a one-line masking fix for an ath9k debugfs
entry.

Larry Finger gives us a package of small rtlwifi fixes which add some
bits that were left out of some feature updates that were included
in the merge window.  Hopefully this isn't a sign that the rtlwifi
base is getting too big...

Marc Yang brings a fix for a temporary mwifiex stall when doing 11n
RX reordering.

Please let me know if there are problems!
====================

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

Showing 14 changed files Side-by-side Diff

drivers/net/wireless/ath/ath9k/debug.c
... ... @@ -455,7 +455,7 @@
455 455 "%2d %2x %1x %2x %2x\n",
456 456 i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset,
457 457 (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3),
458   - val[2] & (0x7 << (i * 3)) >> (i * 3),
  458 + (val[2] & (0x7 << (i * 3))) >> (i * 3),
459 459 (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset);
460 460 }
461 461  
drivers/net/wireless/mwifiex/11n_rxreorder.c
... ... @@ -196,6 +196,7 @@
196 196 mwifiex_11n_dispatch_pkt_until_start_win(priv, tbl, start_win);
197 197  
198 198 del_timer_sync(&tbl->timer_context.timer);
  199 + tbl->timer_context.timer_is_set = false;
199 200  
200 201 spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
201 202 list_del(&tbl->list);
... ... @@ -297,6 +298,7 @@
297 298 (struct reorder_tmr_cnxt *) context;
298 299 int start_win, seq_num;
299 300  
  301 + ctx->timer_is_set = false;
300 302 seq_num = mwifiex_11n_find_last_seq_num(ctx);
301 303  
302 304 if (seq_num < 0)
... ... @@ -385,6 +387,7 @@
385 387  
386 388 new_node->timer_context.ptr = new_node;
387 389 new_node->timer_context.priv = priv;
  390 + new_node->timer_context.timer_is_set = false;
388 391  
389 392 init_timer(&new_node->timer_context.timer);
390 393 new_node->timer_context.timer.function = mwifiex_flush_data;
... ... @@ -399,6 +402,22 @@
399 402 spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
400 403 }
401 404  
  405 +static void
  406 +mwifiex_11n_rxreorder_timer_restart(struct mwifiex_rx_reorder_tbl *tbl)
  407 +{
  408 + u32 min_flush_time;
  409 +
  410 + if (tbl->win_size >= MWIFIEX_BA_WIN_SIZE_32)
  411 + min_flush_time = MIN_FLUSH_TIMER_15_MS;
  412 + else
  413 + min_flush_time = MIN_FLUSH_TIMER_MS;
  414 +
  415 + mod_timer(&tbl->timer_context.timer,
  416 + jiffies + msecs_to_jiffies(min_flush_time * tbl->win_size));
  417 +
  418 + tbl->timer_context.timer_is_set = true;
  419 +}
  420 +
402 421 /*
403 422 * This function prepares command for adding a BA request.
404 423 *
405 424  
406 425  
407 426  
408 427  
409 428  
... ... @@ -523,31 +542,31 @@
523 542 u8 *ta, u8 pkt_type, void *payload)
524 543 {
525 544 struct mwifiex_rx_reorder_tbl *tbl;
526   - int start_win, end_win, win_size;
  545 + int prev_start_win, start_win, end_win, win_size;
527 546 u16 pkt_index;
528 547 bool init_window_shift = false;
  548 + int ret = 0;
529 549  
530 550 tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta);
531 551 if (!tbl) {
532 552 if (pkt_type != PKT_TYPE_BAR)
533 553 mwifiex_11n_dispatch_pkt(priv, payload);
534   - return 0;
  554 + return ret;
535 555 }
536 556  
537 557 if ((pkt_type == PKT_TYPE_AMSDU) && !tbl->amsdu) {
538 558 mwifiex_11n_dispatch_pkt(priv, payload);
539   - return 0;
  559 + return ret;
540 560 }
541 561  
542 562 start_win = tbl->start_win;
  563 + prev_start_win = start_win;
543 564 win_size = tbl->win_size;
544 565 end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1);
545 566 if (tbl->flags & RXREOR_INIT_WINDOW_SHIFT) {
546 567 init_window_shift = true;
547 568 tbl->flags &= ~RXREOR_INIT_WINDOW_SHIFT;
548 569 }
549   - mod_timer(&tbl->timer_context.timer,
550   - jiffies + msecs_to_jiffies(MIN_FLUSH_TIMER_MS * win_size));
551 570  
552 571 if (tbl->flags & RXREOR_FORCE_NO_DROP) {
553 572 dev_dbg(priv->adapter->dev,
554 573  
... ... @@ -568,11 +587,14 @@
568 587 if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {
569 588 if (seq_num >= ((start_win + TWOPOW11) &
570 589 (MAX_TID_VALUE - 1)) &&
571   - seq_num < start_win)
572   - return -1;
  590 + seq_num < start_win) {
  591 + ret = -1;
  592 + goto done;
  593 + }
573 594 } else if ((seq_num < start_win) ||
574   - (seq_num > (start_win + TWOPOW11))) {
575   - return -1;
  595 + (seq_num >= (start_win + TWOPOW11))) {
  596 + ret = -1;
  597 + goto done;
576 598 }
577 599 }
578 600  
... ... @@ -601,8 +623,10 @@
601 623 else
602 624 pkt_index = (seq_num+MAX_TID_VALUE) - start_win;
603 625  
604   - if (tbl->rx_reorder_ptr[pkt_index])
605   - return -1;
  626 + if (tbl->rx_reorder_ptr[pkt_index]) {
  627 + ret = -1;
  628 + goto done;
  629 + }
606 630  
607 631 tbl->rx_reorder_ptr[pkt_index] = payload;
608 632 }
... ... @@ -613,7 +637,11 @@
613 637 */
614 638 mwifiex_11n_scan_and_dispatch(priv, tbl);
615 639  
616   - return 0;
  640 +done:
  641 + if (!tbl->timer_context.timer_is_set ||
  642 + prev_start_win != tbl->start_win)
  643 + mwifiex_11n_rxreorder_timer_restart(tbl);
  644 + return ret;
617 645 }
618 646  
619 647 /*
drivers/net/wireless/mwifiex/11n_rxreorder.h
... ... @@ -21,6 +21,8 @@
21 21 #define _MWIFIEX_11N_RXREORDER_H_
22 22  
23 23 #define MIN_FLUSH_TIMER_MS 50
  24 +#define MIN_FLUSH_TIMER_15_MS 15
  25 +#define MWIFIEX_BA_WIN_SIZE_32 32
24 26  
25 27 #define PKT_TYPE_BAR 0xE7
26 28 #define MAX_TID_VALUE (2 << 11)
drivers/net/wireless/mwifiex/main.h
... ... @@ -592,6 +592,7 @@
592 592 struct timer_list timer;
593 593 struct mwifiex_rx_reorder_tbl *ptr;
594 594 struct mwifiex_private *priv;
  595 + u8 timer_is_set;
595 596 };
596 597  
597 598 struct mwifiex_rx_reorder_tbl {
drivers/net/wireless/rt2x00/rt2800usb.c
... ... @@ -1111,6 +1111,7 @@
1111 1111 /* Ovislink */
1112 1112 { USB_DEVICE(0x1b75, 0x3071) },
1113 1113 { USB_DEVICE(0x1b75, 0x3072) },
  1114 + { USB_DEVICE(0x1b75, 0xa200) },
1114 1115 /* Para */
1115 1116 { USB_DEVICE(0x20b8, 0x8888) },
1116 1117 /* Pegatron */
drivers/net/wireless/rtlwifi/core.c
... ... @@ -1828,4 +1828,10 @@
1828 1828 .flush = rtl_op_flush,
1829 1829 };
1830 1830 EXPORT_SYMBOL_GPL(rtl_ops);
  1831 +
  1832 +bool rtl_btc_status_false(void)
  1833 +{
  1834 + return false;
  1835 +}
  1836 +EXPORT_SYMBOL_GPL(rtl_btc_status_false);
drivers/net/wireless/rtlwifi/core.h
... ... @@ -42,6 +42,7 @@
42 42 u32 mask, u32 data);
43 43 void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data);
44 44 bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
  45 +bool rtl_btc_status_false(void);
45 46  
46 47 #endif
drivers/net/wireless/rtlwifi/rtl8192ce/def.h
... ... @@ -114,6 +114,8 @@
114 114 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
115 115 #define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
116 116 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
  117 +#define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \
  118 + SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32)
117 119  
118 120 #define CHIP_VER_B BIT(4)
119 121 #define CHIP_BONDING_IDENTIFIER(_value) (((_value) >> 22) & 0x3)
drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
... ... @@ -244,6 +244,7 @@
244 244 .phy_lc_calibrate = _rtl92ce_phy_lc_calibrate,
245 245 .phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback,
246 246 .dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower,
  247 + .get_btc_status = rtl_btc_status_false,
247 248 };
248 249  
249 250 static struct rtl_mod_params rtl92ce_mod_params = {
drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
... ... @@ -728,6 +728,9 @@
728 728 case HW_DESC_RXPKT_LEN:
729 729 ret = GET_RX_DESC_PKT_LEN(pdesc);
730 730 break;
  731 + case HW_DESC_RXBUFF_ADDR:
  732 + ret = GET_RX_STATUS_DESC_BUFF_ADDR(pdesc);
  733 + break;
731 734 default:
732 735 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
733 736 desc_name);
drivers/net/wireless/rtlwifi/rtl8192de/sw.c
... ... @@ -251,6 +251,7 @@
251 251 .get_rfreg = rtl92d_phy_query_rf_reg,
252 252 .set_rfreg = rtl92d_phy_set_rf_reg,
253 253 .linked_set_reg = rtl92d_linked_set_reg,
  254 + .get_btc_status = rtl_btc_status_false,
254 255 };
255 256  
256 257 static struct rtl_mod_params rtl92de_mod_params = {
drivers/net/wireless/rtlwifi/rtl8192se/def.h
... ... @@ -446,6 +446,8 @@
446 446 /* DWORD 6 */
447 447 #define SET_RX_STATUS__DESC_BUFF_ADDR(__pdesc, __val) \
448 448 SET_BITS_OFFSET_LE(__pdesc + 24, 0, 32, __val)
  449 +#define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \
  450 + SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32)
449 451  
450 452 #define SE_RX_HAL_IS_CCK_RATE(_pdesc)\
451 453 (GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE1M || \
drivers/net/wireless/rtlwifi/rtl8192se/sw.c
... ... @@ -87,11 +87,8 @@
87 87 static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
88 88 {
89 89 struct ieee80211_hw *hw = context;
90   - struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
91 90 struct rtl_priv *rtlpriv = rtl_priv(hw);
92   - struct rtl_pci *rtlpci = rtl_pcidev(pcipriv);
93 91 struct rt_firmware *pfirmware = NULL;
94   - int err;
95 92  
96 93 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
97 94 "Firmware callback routine entered!\n");
... ... @@ -112,20 +109,6 @@
112 109 memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size);
113 110 pfirmware->sz_fw_tmpbufferlen = firmware->size;
114 111 release_firmware(firmware);
115   -
116   - err = ieee80211_register_hw(hw);
117   - if (err) {
118   - RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
119   - "Can't register mac80211 hw\n");
120   - return;
121   - } else {
122   - rtlpriv->mac80211.mac80211_registered = 1;
123   - }
124   - rtlpci->irq_alloc = 1;
125   - set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
126   -
127   - /*init rfkill */
128   - rtl_init_rfkill(hw);
129 112 }
130 113  
131 114 static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
... ... @@ -226,8 +209,8 @@
226 209 if (!rtlpriv->rtlhal.pfirmware)
227 210 return 1;
228 211  
229   - rtlpriv->max_fw_size = RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE;
230   -
  212 + rtlpriv->max_fw_size = RTL8190_MAX_FIRMWARE_CODE_SIZE*2 +
  213 + sizeof(struct fw_hdr);
231 214 pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n"
232 215 "Loading firmware %s\n", rtlpriv->cfg->fw_name);
233 216 /* request fw */
... ... @@ -294,6 +277,7 @@
294 277 .set_bbreg = rtl92s_phy_set_bb_reg,
295 278 .get_rfreg = rtl92s_phy_query_rf_reg,
296 279 .set_rfreg = rtl92s_phy_set_rf_reg,
  280 + .get_btc_status = rtl_btc_status_false,
297 281 };
298 282  
299 283 static struct rtl_mod_params rtl92se_mod_params = {
drivers/net/wireless/rtlwifi/rtl8192se/trx.c
... ... @@ -640,6 +640,9 @@
640 640 case HW_DESC_RXPKT_LEN:
641 641 ret = GET_RX_STATUS_DESC_PKT_LEN(desc);
642 642 break;
  643 + case HW_DESC_RXBUFF_ADDR:
  644 + ret = GET_RX_STATUS_DESC_BUFF_ADDR(desc);
  645 + break;
643 646 default:
644 647 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
645 648 desc_name);