Commit 99a49ce613057f1934e1c378808374fd683b1541
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
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
- drivers/net/wireless/mwifiex/11n_rxreorder.c
- drivers/net/wireless/mwifiex/11n_rxreorder.h
- drivers/net/wireless/mwifiex/main.h
- drivers/net/wireless/rt2x00/rt2800usb.c
- drivers/net/wireless/rtlwifi/core.c
- drivers/net/wireless/rtlwifi/core.h
- drivers/net/wireless/rtlwifi/rtl8192ce/def.h
- drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
- drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
- drivers/net/wireless/rtlwifi/rtl8192de/sw.c
- drivers/net/wireless/rtlwifi/rtl8192se/def.h
- drivers/net/wireless/rtlwifi/rtl8192se/sw.c
- drivers/net/wireless/rtlwifi/rtl8192se/trx.c
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
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rtlwifi/core.c
drivers/net/wireless/rtlwifi/core.h
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
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); |