mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 21:33:00 +00:00
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>
This commit is contained in:
commit
99a49ce613
@ -455,7 +455,7 @@ static ssize_t read_file_dma(struct file *file, char __user *user_buf,
|
||||
"%2d %2x %1x %2x %2x\n",
|
||||
i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset,
|
||||
(*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3),
|
||||
val[2] & (0x7 << (i * 3)) >> (i * 3),
|
||||
(val[2] & (0x7 << (i * 3))) >> (i * 3),
|
||||
(*dcuBase & (0x1f << dcuOffset)) >> dcuOffset);
|
||||
}
|
||||
|
||||
|
@ -196,6 +196,7 @@ mwifiex_del_rx_reorder_entry(struct mwifiex_private *priv,
|
||||
mwifiex_11n_dispatch_pkt_until_start_win(priv, tbl, start_win);
|
||||
|
||||
del_timer_sync(&tbl->timer_context.timer);
|
||||
tbl->timer_context.timer_is_set = false;
|
||||
|
||||
spin_lock_irqsave(&priv->rx_reorder_tbl_lock, flags);
|
||||
list_del(&tbl->list);
|
||||
@ -297,6 +298,7 @@ mwifiex_flush_data(unsigned long context)
|
||||
(struct reorder_tmr_cnxt *) context;
|
||||
int start_win, seq_num;
|
||||
|
||||
ctx->timer_is_set = false;
|
||||
seq_num = mwifiex_11n_find_last_seq_num(ctx);
|
||||
|
||||
if (seq_num < 0)
|
||||
@ -385,6 +387,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
|
||||
|
||||
new_node->timer_context.ptr = new_node;
|
||||
new_node->timer_context.priv = priv;
|
||||
new_node->timer_context.timer_is_set = false;
|
||||
|
||||
init_timer(&new_node->timer_context.timer);
|
||||
new_node->timer_context.timer.function = mwifiex_flush_data;
|
||||
@ -399,6 +402,22 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
|
||||
spin_unlock_irqrestore(&priv->rx_reorder_tbl_lock, flags);
|
||||
}
|
||||
|
||||
static void
|
||||
mwifiex_11n_rxreorder_timer_restart(struct mwifiex_rx_reorder_tbl *tbl)
|
||||
{
|
||||
u32 min_flush_time;
|
||||
|
||||
if (tbl->win_size >= MWIFIEX_BA_WIN_SIZE_32)
|
||||
min_flush_time = MIN_FLUSH_TIMER_15_MS;
|
||||
else
|
||||
min_flush_time = MIN_FLUSH_TIMER_MS;
|
||||
|
||||
mod_timer(&tbl->timer_context.timer,
|
||||
jiffies + msecs_to_jiffies(min_flush_time * tbl->win_size));
|
||||
|
||||
tbl->timer_context.timer_is_set = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function prepares command for adding a BA request.
|
||||
*
|
||||
@ -523,31 +542,31 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
|
||||
u8 *ta, u8 pkt_type, void *payload)
|
||||
{
|
||||
struct mwifiex_rx_reorder_tbl *tbl;
|
||||
int start_win, end_win, win_size;
|
||||
int prev_start_win, start_win, end_win, win_size;
|
||||
u16 pkt_index;
|
||||
bool init_window_shift = false;
|
||||
int ret = 0;
|
||||
|
||||
tbl = mwifiex_11n_get_rx_reorder_tbl(priv, tid, ta);
|
||||
if (!tbl) {
|
||||
if (pkt_type != PKT_TYPE_BAR)
|
||||
mwifiex_11n_dispatch_pkt(priv, payload);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((pkt_type == PKT_TYPE_AMSDU) && !tbl->amsdu) {
|
||||
mwifiex_11n_dispatch_pkt(priv, payload);
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
start_win = tbl->start_win;
|
||||
prev_start_win = start_win;
|
||||
win_size = tbl->win_size;
|
||||
end_win = ((start_win + win_size) - 1) & (MAX_TID_VALUE - 1);
|
||||
if (tbl->flags & RXREOR_INIT_WINDOW_SHIFT) {
|
||||
init_window_shift = true;
|
||||
tbl->flags &= ~RXREOR_INIT_WINDOW_SHIFT;
|
||||
}
|
||||
mod_timer(&tbl->timer_context.timer,
|
||||
jiffies + msecs_to_jiffies(MIN_FLUSH_TIMER_MS * win_size));
|
||||
|
||||
if (tbl->flags & RXREOR_FORCE_NO_DROP) {
|
||||
dev_dbg(priv->adapter->dev,
|
||||
@ -568,11 +587,14 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
|
||||
if ((start_win + TWOPOW11) > (MAX_TID_VALUE - 1)) {
|
||||
if (seq_num >= ((start_win + TWOPOW11) &
|
||||
(MAX_TID_VALUE - 1)) &&
|
||||
seq_num < start_win)
|
||||
return -1;
|
||||
seq_num < start_win) {
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
} else if ((seq_num < start_win) ||
|
||||
(seq_num > (start_win + TWOPOW11))) {
|
||||
return -1;
|
||||
(seq_num >= (start_win + TWOPOW11))) {
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
|
||||
@ -601,8 +623,10 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
|
||||
else
|
||||
pkt_index = (seq_num+MAX_TID_VALUE) - start_win;
|
||||
|
||||
if (tbl->rx_reorder_ptr[pkt_index])
|
||||
return -1;
|
||||
if (tbl->rx_reorder_ptr[pkt_index]) {
|
||||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
tbl->rx_reorder_ptr[pkt_index] = payload;
|
||||
}
|
||||
@ -613,7 +637,11 @@ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv,
|
||||
*/
|
||||
mwifiex_11n_scan_and_dispatch(priv, tbl);
|
||||
|
||||
return 0;
|
||||
done:
|
||||
if (!tbl->timer_context.timer_is_set ||
|
||||
prev_start_win != tbl->start_win)
|
||||
mwifiex_11n_rxreorder_timer_restart(tbl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -21,6 +21,8 @@
|
||||
#define _MWIFIEX_11N_RXREORDER_H_
|
||||
|
||||
#define MIN_FLUSH_TIMER_MS 50
|
||||
#define MIN_FLUSH_TIMER_15_MS 15
|
||||
#define MWIFIEX_BA_WIN_SIZE_32 32
|
||||
|
||||
#define PKT_TYPE_BAR 0xE7
|
||||
#define MAX_TID_VALUE (2 << 11)
|
||||
|
@ -592,6 +592,7 @@ struct reorder_tmr_cnxt {
|
||||
struct timer_list timer;
|
||||
struct mwifiex_rx_reorder_tbl *ptr;
|
||||
struct mwifiex_private *priv;
|
||||
u8 timer_is_set;
|
||||
};
|
||||
|
||||
struct mwifiex_rx_reorder_tbl {
|
||||
|
@ -1111,6 +1111,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
|
||||
/* Ovislink */
|
||||
{ USB_DEVICE(0x1b75, 0x3071) },
|
||||
{ USB_DEVICE(0x1b75, 0x3072) },
|
||||
{ USB_DEVICE(0x1b75, 0xa200) },
|
||||
/* Para */
|
||||
{ USB_DEVICE(0x20b8, 0x8888) },
|
||||
/* Pegatron */
|
||||
|
@ -1828,3 +1828,9 @@ const struct ieee80211_ops rtl_ops = {
|
||||
.flush = rtl_op_flush,
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(rtl_ops);
|
||||
|
||||
bool rtl_btc_status_false(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rtl_btc_status_false);
|
||||
|
@ -42,5 +42,6 @@ void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
|
||||
u32 mask, u32 data);
|
||||
void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data);
|
||||
bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
bool rtl_btc_status_false(void);
|
||||
|
||||
#endif
|
||||
|
@ -114,6 +114,8 @@
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
|
||||
#define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32)
|
||||
|
||||
#define CHIP_VER_B BIT(4)
|
||||
#define CHIP_BONDING_IDENTIFIER(_value) (((_value) >> 22) & 0x3)
|
||||
|
@ -244,6 +244,7 @@ static struct rtl_hal_ops rtl8192ce_hal_ops = {
|
||||
.phy_lc_calibrate = _rtl92ce_phy_lc_calibrate,
|
||||
.phy_set_bw_mode_callback = rtl92ce_phy_set_bw_mode_callback,
|
||||
.dm_dynamic_txpower = rtl92ce_dm_dynamic_txpower,
|
||||
.get_btc_status = rtl_btc_status_false,
|
||||
};
|
||||
|
||||
static struct rtl_mod_params rtl92ce_mod_params = {
|
||||
|
@ -728,6 +728,9 @@ u32 rtl92ce_get_desc(u8 *p_desc, bool istx, u8 desc_name)
|
||||
case HW_DESC_RXPKT_LEN:
|
||||
ret = GET_RX_DESC_PKT_LEN(pdesc);
|
||||
break;
|
||||
case HW_DESC_RXBUFF_ADDR:
|
||||
ret = GET_RX_STATUS_DESC_BUFF_ADDR(pdesc);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, "ERR rxdesc :%d not process\n",
|
||||
desc_name);
|
||||
|
@ -251,6 +251,7 @@ static struct rtl_hal_ops rtl8192de_hal_ops = {
|
||||
.get_rfreg = rtl92d_phy_query_rf_reg,
|
||||
.set_rfreg = rtl92d_phy_set_rf_reg,
|
||||
.linked_set_reg = rtl92d_linked_set_reg,
|
||||
.get_btc_status = rtl_btc_status_false,
|
||||
};
|
||||
|
||||
static struct rtl_mod_params rtl92de_mod_params = {
|
||||
|
@ -446,6 +446,8 @@
|
||||
/* DWORD 6 */
|
||||
#define SET_RX_STATUS__DESC_BUFF_ADDR(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc + 24, 0, 32, __val)
|
||||
#define GET_RX_STATUS_DESC_BUFF_ADDR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc + 24, 0, 32)
|
||||
|
||||
#define SE_RX_HAL_IS_CCK_RATE(_pdesc)\
|
||||
(GET_RX_STATUS_DESC_RX_MCS(_pdesc) == DESC92_RATE1M || \
|
||||
|
@ -87,11 +87,8 @@ static void rtl92s_init_aspm_vars(struct ieee80211_hw *hw)
|
||||
static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
|
||||
{
|
||||
struct ieee80211_hw *hw = context;
|
||||
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(pcipriv);
|
||||
struct rt_firmware *pfirmware = NULL;
|
||||
int err;
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
|
||||
"Firmware callback routine entered!\n");
|
||||
@ -112,20 +109,6 @@ static void rtl92se_fw_cb(const struct firmware *firmware, void *context)
|
||||
memcpy(pfirmware->sz_fw_tmpbuffer, firmware->data, firmware->size);
|
||||
pfirmware->sz_fw_tmpbufferlen = firmware->size;
|
||||
release_firmware(firmware);
|
||||
|
||||
err = ieee80211_register_hw(hw);
|
||||
if (err) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
"Can't register mac80211 hw\n");
|
||||
return;
|
||||
} else {
|
||||
rtlpriv->mac80211.mac80211_registered = 1;
|
||||
}
|
||||
rtlpci->irq_alloc = 1;
|
||||
set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
|
||||
|
||||
/*init rfkill */
|
||||
rtl_init_rfkill(hw);
|
||||
}
|
||||
|
||||
static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
|
||||
@ -226,8 +209,8 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
|
||||
if (!rtlpriv->rtlhal.pfirmware)
|
||||
return 1;
|
||||
|
||||
rtlpriv->max_fw_size = RTL8190_MAX_RAW_FIRMWARE_CODE_SIZE;
|
||||
|
||||
rtlpriv->max_fw_size = RTL8190_MAX_FIRMWARE_CODE_SIZE*2 +
|
||||
sizeof(struct fw_hdr);
|
||||
pr_info("Driver for Realtek RTL8192SE/RTL8191SE\n"
|
||||
"Loading firmware %s\n", rtlpriv->cfg->fw_name);
|
||||
/* request fw */
|
||||
@ -294,6 +277,7 @@ static struct rtl_hal_ops rtl8192se_hal_ops = {
|
||||
.set_bbreg = rtl92s_phy_set_bb_reg,
|
||||
.get_rfreg = rtl92s_phy_query_rf_reg,
|
||||
.set_rfreg = rtl92s_phy_set_rf_reg,
|
||||
.get_btc_status = rtl_btc_status_false,
|
||||
};
|
||||
|
||||
static struct rtl_mod_params rtl92se_mod_params = {
|
||||
|
@ -640,6 +640,9 @@ u32 rtl92se_get_desc(u8 *desc, bool istx, u8 desc_name)
|
||||
case HW_DESC_RXPKT_LEN:
|
||||
ret = GET_RX_STATUS_DESC_PKT_LEN(desc);
|
||||
break;
|
||||
case HW_DESC_RXBUFF_ADDR:
|
||||
ret = GET_RX_STATUS_DESC_BUFF_ADDR(desc);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, "ERR rxdesc :%d not process\n",
|
||||
desc_name);
|
||||
|
Loading…
Reference in New Issue
Block a user