Commit 61f15982 authored by David S. Miller's avatar David S. Miller

Merge branch 'wireless'

John W. Linville says:

====================
Here is a batch of fixes intended for the 3.10 stream.

Amitkumar Karwar provides an mwifiex fix to plug a memory leak when
the driver is unloaded.

Bing Zhao brings an mwifiex fix for some flag handling that leads to
log spam and an unusable interface.

Daniel Drake offers an mwifiex fix for multicast filter setup, to
correctly implement wakeup behaviour for multicast WOL.

Felix Fietkau fixes an ath9k problem that produces logspam and keycache
errors due to a bad return code.

Stanislaw Gruszka produces an fix for a WARNING from ath5k, and an
iwl4965 workaround to stop advertising a feature that doesn't work with
the current mac80211 implementation.

Sujith Manoharan gives us an ath9k fix to reprogram the HW beacon timers
after a TSF update, and an initvals fix for the AR9565 device.

Thommy Jakobsson fixes an rx descriptor underrun on b43.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 70eba422 4f81d715
...@@ -2369,6 +2369,9 @@ ath5k_tx_complete_poll_work(struct work_struct *work) ...@@ -2369,6 +2369,9 @@ ath5k_tx_complete_poll_work(struct work_struct *work)
int i; int i;
bool needreset = false; bool needreset = false;
if (!test_bit(ATH_STAT_STARTED, ah->status))
return;
mutex_lock(&ah->lock); mutex_lock(&ah->lock);
for (i = 0; i < ARRAY_SIZE(ah->txqs); i++) { for (i = 0; i < ARRAY_SIZE(ah->txqs); i++) {
...@@ -2676,6 +2679,7 @@ int ath5k_start(struct ieee80211_hw *hw) ...@@ -2676,6 +2679,7 @@ int ath5k_start(struct ieee80211_hw *hw)
mmiowb(); mmiowb();
mutex_unlock(&ah->lock); mutex_unlock(&ah->lock);
set_bit(ATH_STAT_STARTED, ah->status);
ieee80211_queue_delayed_work(ah->hw, &ah->tx_complete_work, ieee80211_queue_delayed_work(ah->hw, &ah->tx_complete_work,
msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT)); msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT));
...@@ -2737,6 +2741,7 @@ void ath5k_stop(struct ieee80211_hw *hw) ...@@ -2737,6 +2741,7 @@ void ath5k_stop(struct ieee80211_hw *hw)
ath5k_stop_tasklets(ah); ath5k_stop_tasklets(ah);
clear_bit(ATH_STAT_STARTED, ah->status);
cancel_delayed_work_sync(&ah->tx_complete_work); cancel_delayed_work_sync(&ah->tx_complete_work);
if (!ath5k_modparam_no_hw_rfkill_switch) if (!ath5k_modparam_no_hw_rfkill_switch)
......
...@@ -233,9 +233,9 @@ static const u32 ar9565_1p0_baseband_core[][2] = { ...@@ -233,9 +233,9 @@ static const u32 ar9565_1p0_baseband_core[][2] = {
{0x00009d10, 0x01834061}, {0x00009d10, 0x01834061},
{0x00009d14, 0x00c00400}, {0x00009d14, 0x00c00400},
{0x00009d18, 0x00000000}, {0x00009d18, 0x00000000},
{0x00009e08, 0x0078230c}, {0x00009e08, 0x0038230c},
{0x00009e24, 0x990bb515}, {0x00009e24, 0x9907b515},
{0x00009e28, 0x126f0000}, {0x00009e28, 0x126f0600},
{0x00009e30, 0x06336f77}, {0x00009e30, 0x06336f77},
{0x00009e34, 0x6af6532f}, {0x00009e34, 0x6af6532f},
{0x00009e38, 0x0cc80c00}, {0x00009e38, 0x0cc80c00},
...@@ -337,7 +337,7 @@ static const u32 ar9565_1p0_baseband_core[][2] = { ...@@ -337,7 +337,7 @@ static const u32 ar9565_1p0_baseband_core[][2] = {
static const u32 ar9565_1p0_baseband_postamble[][5] = { static const u32 ar9565_1p0_baseband_postamble[][5] = {
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a800d}, {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8009},
{0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a01ae}, {0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a01ae},
{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x63c640da}, {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x63c640da},
{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x09143c81}, {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x09143c81},
...@@ -345,9 +345,9 @@ static const u32 ar9565_1p0_baseband_postamble[][5] = { ...@@ -345,9 +345,9 @@ static const u32 ar9565_1p0_baseband_postamble[][5] = {
{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c}, {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
{0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4}, {0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
{0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0}, {0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
{0x00009e04, 0x00802020, 0x00802020, 0x00802020, 0x00802020}, {0x00009e04, 0x00802020, 0x00802020, 0x00142020, 0x00142020},
{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000d8}, {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec86d2e}, {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e},
{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e}, {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
...@@ -450,6 +450,8 @@ static const u32 ar9565_1p0_soc_postamble[][5] = { ...@@ -450,6 +450,8 @@ static const u32 ar9565_1p0_soc_postamble[][5] = {
static const u32 ar9565_1p0_Common_rx_gain_table[][2] = { static const u32 ar9565_1p0_Common_rx_gain_table[][2] = {
/* Addr allmodes */ /* Addr allmodes */
{0x00004050, 0x00300300},
{0x0000406c, 0x00100000},
{0x0000a000, 0x00010000}, {0x0000a000, 0x00010000},
{0x0000a004, 0x00030002}, {0x0000a004, 0x00030002},
{0x0000a008, 0x00050004}, {0x0000a008, 0x00050004},
...@@ -498,27 +500,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = { ...@@ -498,27 +500,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = {
{0x0000a0b4, 0x00000000}, {0x0000a0b4, 0x00000000},
{0x0000a0b8, 0x00000000}, {0x0000a0b8, 0x00000000},
{0x0000a0bc, 0x00000000}, {0x0000a0bc, 0x00000000},
{0x0000a0c0, 0x001f0000}, {0x0000a0c0, 0x00bf00a0},
{0x0000a0c4, 0x01000101}, {0x0000a0c4, 0x11a011a1},
{0x0000a0c8, 0x011e011f}, {0x0000a0c8, 0x11be11bf},
{0x0000a0cc, 0x011c011d}, {0x0000a0cc, 0x11bc11bd},
{0x0000a0d0, 0x02030204}, {0x0000a0d0, 0x22632264},
{0x0000a0d4, 0x02010202}, {0x0000a0d4, 0x22612262},
{0x0000a0d8, 0x021f0200}, {0x0000a0d8, 0x227f2260},
{0x0000a0dc, 0x0302021e}, {0x0000a0dc, 0x4322227e},
{0x0000a0e0, 0x03000301}, {0x0000a0e0, 0x43204321},
{0x0000a0e4, 0x031e031f}, {0x0000a0e4, 0x433e433f},
{0x0000a0e8, 0x0402031d}, {0x0000a0e8, 0x4462433d},
{0x0000a0ec, 0x04000401}, {0x0000a0ec, 0x44604461},
{0x0000a0f0, 0x041e041f}, {0x0000a0f0, 0x447e447f},
{0x0000a0f4, 0x0502041d}, {0x0000a0f4, 0x5582447d},
{0x0000a0f8, 0x05000501}, {0x0000a0f8, 0x55805581},
{0x0000a0fc, 0x051e051f}, {0x0000a0fc, 0x559e559f},
{0x0000a100, 0x06010602}, {0x0000a100, 0x66816682},
{0x0000a104, 0x061f0600}, {0x0000a104, 0x669f6680},
{0x0000a108, 0x061d061e}, {0x0000a108, 0x669d669e},
{0x0000a10c, 0x07020703}, {0x0000a10c, 0x77627763},
{0x0000a110, 0x07000701}, {0x0000a110, 0x77607761},
{0x0000a114, 0x00000000}, {0x0000a114, 0x00000000},
{0x0000a118, 0x00000000}, {0x0000a118, 0x00000000},
{0x0000a11c, 0x00000000}, {0x0000a11c, 0x00000000},
...@@ -530,27 +532,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = { ...@@ -530,27 +532,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = {
{0x0000a134, 0x00000000}, {0x0000a134, 0x00000000},
{0x0000a138, 0x00000000}, {0x0000a138, 0x00000000},
{0x0000a13c, 0x00000000}, {0x0000a13c, 0x00000000},
{0x0000a140, 0x001f0000}, {0x0000a140, 0x00bf00a0},
{0x0000a144, 0x01000101}, {0x0000a144, 0x11a011a1},
{0x0000a148, 0x011e011f}, {0x0000a148, 0x11be11bf},
{0x0000a14c, 0x011c011d}, {0x0000a14c, 0x11bc11bd},
{0x0000a150, 0x02030204}, {0x0000a150, 0x22632264},
{0x0000a154, 0x02010202}, {0x0000a154, 0x22612262},
{0x0000a158, 0x021f0200}, {0x0000a158, 0x227f2260},
{0x0000a15c, 0x0302021e}, {0x0000a15c, 0x4322227e},
{0x0000a160, 0x03000301}, {0x0000a160, 0x43204321},
{0x0000a164, 0x031e031f}, {0x0000a164, 0x433e433f},
{0x0000a168, 0x0402031d}, {0x0000a168, 0x4462433d},
{0x0000a16c, 0x04000401}, {0x0000a16c, 0x44604461},
{0x0000a170, 0x041e041f}, {0x0000a170, 0x447e447f},
{0x0000a174, 0x0502041d}, {0x0000a174, 0x5582447d},
{0x0000a178, 0x05000501}, {0x0000a178, 0x55805581},
{0x0000a17c, 0x051e051f}, {0x0000a17c, 0x559e559f},
{0x0000a180, 0x06010602}, {0x0000a180, 0x66816682},
{0x0000a184, 0x061f0600}, {0x0000a184, 0x669f6680},
{0x0000a188, 0x061d061e}, {0x0000a188, 0x669d669e},
{0x0000a18c, 0x07020703}, {0x0000a18c, 0x77e677e7},
{0x0000a190, 0x07000701}, {0x0000a190, 0x77e477e5},
{0x0000a194, 0x00000000}, {0x0000a194, 0x00000000},
{0x0000a198, 0x00000000}, {0x0000a198, 0x00000000},
{0x0000a19c, 0x00000000}, {0x0000a19c, 0x00000000},
...@@ -770,7 +772,7 @@ static const u32 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table[][5] = { ...@@ -770,7 +772,7 @@ static const u32 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table[][5] = {
static const u32 ar9565_1p0_pciephy_clkreq_disable_L1[][2] = { static const u32 ar9565_1p0_pciephy_clkreq_disable_L1[][2] = {
/* Addr allmodes */ /* Addr allmodes */
{0x00018c00, 0x18213ede}, {0x00018c00, 0x18212ede},
{0x00018c04, 0x000801d8}, {0x00018c04, 0x000801d8},
{0x00018c08, 0x0003780c}, {0x00018c08, 0x0003780c},
}; };
...@@ -889,8 +891,8 @@ static const u32 ar9565_1p0_common_wo_xlna_rx_gain_table[][2] = { ...@@ -889,8 +891,8 @@ static const u32 ar9565_1p0_common_wo_xlna_rx_gain_table[][2] = {
{0x0000a180, 0x66816682}, {0x0000a180, 0x66816682},
{0x0000a184, 0x669f6680}, {0x0000a184, 0x669f6680},
{0x0000a188, 0x669d669e}, {0x0000a188, 0x669d669e},
{0x0000a18c, 0x77627763}, {0x0000a18c, 0x77e677e7},
{0x0000a190, 0x77607761}, {0x0000a190, 0x77e477e5},
{0x0000a194, 0x00000000}, {0x0000a194, 0x00000000},
{0x0000a198, 0x00000000}, {0x0000a198, 0x00000000},
{0x0000a19c, 0x00000000}, {0x0000a19c, 0x00000000},
...@@ -1114,7 +1116,7 @@ static const u32 ar9565_1p0_modes_high_ob_db_tx_gain_table[][5] = { ...@@ -1114,7 +1116,7 @@ static const u32 ar9565_1p0_modes_high_ob_db_tx_gain_table[][5] = {
{0x0000a2e0, 0xffecec00, 0xffecec00, 0xfd339c84, 0xfd339c84}, {0x0000a2e0, 0xffecec00, 0xffecec00, 0xfd339c84, 0xfd339c84},
{0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000}, {0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000},
{0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000}, {0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000},
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, {0x0000a410, 0x000050d9, 0x000050d9, 0x000050df, 0x000050df},
{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
{0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002}, {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
{0x0000a508, 0x0b022220, 0x0b022220, 0x08000004, 0x08000004}, {0x0000a508, 0x0b022220, 0x0b022220, 0x08000004, 0x08000004},
...@@ -1140,13 +1142,13 @@ static const u32 ar9565_1p0_modes_high_ob_db_tx_gain_table[][5] = { ...@@ -1140,13 +1142,13 @@ static const u32 ar9565_1p0_modes_high_ob_db_tx_gain_table[][5] = {
{0x0000a558, 0x69027f56, 0x69027f56, 0x53001ce5, 0x53001ce5}, {0x0000a558, 0x69027f56, 0x69027f56, 0x53001ce5, 0x53001ce5},
{0x0000a55c, 0x6d029f56, 0x6d029f56, 0x57001ce9, 0x57001ce9}, {0x0000a55c, 0x6d029f56, 0x6d029f56, 0x57001ce9, 0x57001ce9},
{0x0000a560, 0x73049f56, 0x73049f56, 0x5b001ceb, 0x5b001ceb}, {0x0000a560, 0x73049f56, 0x73049f56, 0x5b001ceb, 0x5b001ceb},
{0x0000a564, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a564, 0x7804ff56, 0x7804ff56, 0x60001cf0, 0x60001cf0},
{0x0000a568, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a568, 0x7804ff56, 0x7804ff56, 0x61001cf1, 0x61001cf1},
{0x0000a56c, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a56c, 0x7804ff56, 0x7804ff56, 0x62001cf2, 0x62001cf2},
{0x0000a570, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a570, 0x7804ff56, 0x7804ff56, 0x63001cf3, 0x63001cf3},
{0x0000a574, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a574, 0x7804ff56, 0x7804ff56, 0x64001cf4, 0x64001cf4},
{0x0000a578, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a578, 0x7804ff56, 0x7804ff56, 0x66001ff6, 0x66001ff6},
{0x0000a57c, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec}, {0x0000a57c, 0x7804ff56, 0x7804ff56, 0x66001ff6, 0x66001ff6},
{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
...@@ -1174,7 +1176,7 @@ static const u32 ar9565_1p0_modes_high_power_tx_gain_table[][5] = { ...@@ -1174,7 +1176,7 @@ static const u32 ar9565_1p0_modes_high_power_tx_gain_table[][5] = {
{0x0000a2e0, 0xffecec00, 0xffecec00, 0xfd339c84, 0xfd339c84}, {0x0000a2e0, 0xffecec00, 0xffecec00, 0xfd339c84, 0xfd339c84},
{0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000}, {0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000},
{0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000}, {0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000},
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9}, {0x0000a410, 0x000050d9, 0x000050d9, 0x000050df, 0x000050df},
{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000}, {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
{0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002}, {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
{0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004}, {0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004},
...@@ -1200,13 +1202,13 @@ static const u32 ar9565_1p0_modes_high_power_tx_gain_table[][5] = { ...@@ -1200,13 +1202,13 @@ static const u32 ar9565_1p0_modes_high_power_tx_gain_table[][5] = {
{0x0000a558, 0x66027f56, 0x66027f56, 0x4c001ce5, 0x4c001ce5}, {0x0000a558, 0x66027f56, 0x66027f56, 0x4c001ce5, 0x4c001ce5},
{0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9}, {0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9},
{0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb}, {0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb},
{0x0000a564, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a564, 0x7504ff56, 0x7504ff56, 0x59001cf0, 0x59001cf0},
{0x0000a568, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a568, 0x7504ff56, 0x7504ff56, 0x5a001cf1, 0x5a001cf1},
{0x0000a56c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a56c, 0x7504ff56, 0x7504ff56, 0x5b001cf2, 0x5b001cf2},
{0x0000a570, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a570, 0x7504ff56, 0x7504ff56, 0x5c001cf3, 0x5c001cf3},
{0x0000a574, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a574, 0x7504ff56, 0x7504ff56, 0x5d001cf4, 0x5d001cf4},
{0x0000a578, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a578, 0x7504ff56, 0x7504ff56, 0x5f001ff6, 0x5f001ff6},
{0x0000a57c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec}, {0x0000a57c, 0x7504ff56, 0x7504ff56, 0x5f001ff6, 0x5f001ff6},
{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
{0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
......
...@@ -227,13 +227,13 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) ...@@ -227,13 +227,13 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
if (!test_bit(SC_OP_BEACONS, &sc->sc_flags)) if (!test_bit(SC_OP_BEACONS, &sc->sc_flags))
goto work; goto work;
ath9k_set_beacon(sc);
if (ah->opmode == NL80211_IFTYPE_STATION && if (ah->opmode == NL80211_IFTYPE_STATION &&
test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) { test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
spin_lock_irqsave(&sc->sc_pm_lock, flags); spin_lock_irqsave(&sc->sc_pm_lock, flags);
sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
spin_unlock_irqrestore(&sc->sc_pm_lock, flags); spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
} else {
ath9k_set_beacon(sc);
} }
work: work:
ath_restart_work(sc); ath_restart_work(sc);
...@@ -1332,6 +1332,7 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, ...@@ -1332,6 +1332,7 @@ static int ath9k_sta_add(struct ieee80211_hw *hw,
struct ath_common *common = ath9k_hw_common(sc->sc_ah); struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath_node *an = (struct ath_node *) sta->drv_priv; struct ath_node *an = (struct ath_node *) sta->drv_priv;
struct ieee80211_key_conf ps_key = { }; struct ieee80211_key_conf ps_key = { };
int key;
ath_node_attach(sc, sta, vif); ath_node_attach(sc, sta, vif);
...@@ -1339,7 +1340,9 @@ static int ath9k_sta_add(struct ieee80211_hw *hw, ...@@ -1339,7 +1340,9 @@ static int ath9k_sta_add(struct ieee80211_hw *hw,
vif->type != NL80211_IFTYPE_AP_VLAN) vif->type != NL80211_IFTYPE_AP_VLAN)
return 0; return 0;
an->ps_key = ath_key_config(common, vif, sta, &ps_key); key = ath_key_config(common, vif, sta, &ps_key);
if (key > 0)
an->ps_key = key;
return 0; return 0;
} }
...@@ -1356,6 +1359,7 @@ static void ath9k_del_ps_key(struct ath_softc *sc, ...@@ -1356,6 +1359,7 @@ static void ath9k_del_ps_key(struct ath_softc *sc,
return; return;
ath_key_delete(common, &ps_key); ath_key_delete(common, &ps_key);
an->ps_key = 0;
} }
static int ath9k_sta_remove(struct ieee80211_hw *hw, static int ath9k_sta_remove(struct ieee80211_hw *hw,
......
...@@ -1728,6 +1728,25 @@ static void dma_rx(struct b43_dmaring *ring, int *slot) ...@@ -1728,6 +1728,25 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize); sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
} }
void b43_dma_handle_rx_overflow(struct b43_dmaring *ring)
{
int current_slot, previous_slot;
B43_WARN_ON(ring->tx);
/* Device has filled all buffers, drop all packets and let TCP
* decrease speed.
* Decrement RX index by one will let the device to see all slots
* as free again
*/
/*
*TODO: How to increase rx_drop in mac80211?
*/
current_slot = ring->ops->get_current_rxslot(ring);
previous_slot = prev_slot(ring, current_slot);
ring->ops->set_current_rxslot(ring, previous_slot);
}
void b43_dma_rx(struct b43_dmaring *ring) void b43_dma_rx(struct b43_dmaring *ring)
{ {
const struct b43_dma_ops *ops = ring->ops; const struct b43_dma_ops *ops = ring->ops;
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
/* DMA-Interrupt reasons. */ /* DMA-Interrupt reasons. */
#define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \ #define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \
| (1 << 14) | (1 << 15)) | (1 << 14) | (1 << 15))
#define B43_DMAIRQ_NONFATALMASK (1 << 13) #define B43_DMAIRQ_RDESC_UFLOW (1 << 13)
#define B43_DMAIRQ_RX_DONE (1 << 16) #define B43_DMAIRQ_RX_DONE (1 << 16)
/*** 32-bit DMA Engine. ***/ /*** 32-bit DMA Engine. ***/
...@@ -295,6 +295,8 @@ int b43_dma_tx(struct b43_wldev *dev, ...@@ -295,6 +295,8 @@ int b43_dma_tx(struct b43_wldev *dev,
void b43_dma_handle_txstatus(struct b43_wldev *dev, void b43_dma_handle_txstatus(struct b43_wldev *dev,
const struct b43_txstatus *status); const struct b43_txstatus *status);
void b43_dma_handle_rx_overflow(struct b43_dmaring *ring);
void b43_dma_rx(struct b43_dmaring *ring); void b43_dma_rx(struct b43_dmaring *ring);
void b43_dma_direct_fifo_rx(struct b43_wldev *dev, void b43_dma_direct_fifo_rx(struct b43_wldev *dev,
......
...@@ -1902,12 +1902,9 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) ...@@ -1902,12 +1902,9 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev)
} }
} }
if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK | if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK))) {
B43_DMAIRQ_NONFATALMASK))) { b43err(dev->wl,
if (merged_dma_reason & B43_DMAIRQ_FATALMASK) { "Fatal DMA error: 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X\n",
b43err(dev->wl, "Fatal DMA error: "
"0x%08X, 0x%08X, 0x%08X, "
"0x%08X, 0x%08X, 0x%08X\n",
dma_reason[0], dma_reason[1], dma_reason[0], dma_reason[1],
dma_reason[2], dma_reason[3], dma_reason[2], dma_reason[3],
dma_reason[4], dma_reason[5]); dma_reason[4], dma_reason[5]);
...@@ -1918,15 +1915,6 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) ...@@ -1918,15 +1915,6 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev)
b43_controller_restart(dev, "DMA error"); b43_controller_restart(dev, "DMA error");
return; return;
} }
if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) {
b43err(dev->wl, "DMA error: "
"0x%08X, 0x%08X, 0x%08X, "
"0x%08X, 0x%08X, 0x%08X\n",
dma_reason[0], dma_reason[1],
dma_reason[2], dma_reason[3],
dma_reason[4], dma_reason[5]);
}
}
if (unlikely(reason & B43_IRQ_UCODE_DEBUG)) if (unlikely(reason & B43_IRQ_UCODE_DEBUG))
handle_irq_ucode_debug(dev); handle_irq_ucode_debug(dev);
...@@ -1944,6 +1932,11 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) ...@@ -1944,6 +1932,11 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev)
handle_irq_noise(dev); handle_irq_noise(dev);
/* Check the DMA reason registers for received data. */ /* Check the DMA reason registers for received data. */
if (dma_reason[0] & B43_DMAIRQ_RDESC_UFLOW) {
if (B43_DEBUG)
b43warn(dev->wl, "RX descriptor underrun\n");
b43_dma_handle_rx_overflow(dev->dma.rx_ring);
}
if (dma_reason[0] & B43_DMAIRQ_RX_DONE) { if (dma_reason[0] & B43_DMAIRQ_RX_DONE) {
if (b43_using_pio_transfers(dev)) if (b43_using_pio_transfers(dev))
b43_pio_rx(dev->pio.rx_queue); b43_pio_rx(dev->pio.rx_queue);
...@@ -2001,7 +1994,7 @@ static irqreturn_t b43_do_interrupt(struct b43_wldev *dev) ...@@ -2001,7 +1994,7 @@ static irqreturn_t b43_do_interrupt(struct b43_wldev *dev)
return IRQ_NONE; return IRQ_NONE;
dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON) dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON)
& 0x0001DC00; & 0x0001FC00;
dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON) dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON)
& 0x0000DC00; & 0x0000DC00;
dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON) dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON)
...@@ -3130,7 +3123,7 @@ static int b43_chip_init(struct b43_wldev *dev) ...@@ -3130,7 +3123,7 @@ static int b43_chip_init(struct b43_wldev *dev)
b43_write32(dev, 0x018C, 0x02000000); b43_write32(dev, 0x018C, 0x02000000);
} }
b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000); b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000);
b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001DC00); b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001FC00);
b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00); b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00);
b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00); b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00);
b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00); b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00);
......
...@@ -5741,8 +5741,7 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length) ...@@ -5741,8 +5741,7 @@ il4965_mac_setup_register(struct il_priv *il, u32 max_probe_length)
hw->flags = hw->flags =
IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_AMPDU_AGGREGATION | IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_AMPDU_AGGREGATION |
IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | IEEE80211_HW_SPECTRUM_MGMT | IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | IEEE80211_HW_SPECTRUM_MGMT |
IEEE80211_HW_REPORTS_TX_ACK_STATUS | IEEE80211_HW_SUPPORTS_PS | IEEE80211_HW_SUPPORTS_PS | IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
if (il->cfg->sku & IL_SKU_N) if (il->cfg->sku & IL_SKU_N)
hw->flags |= hw->flags |=
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS | IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
......
...@@ -2234,9 +2234,6 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev) ...@@ -2234,9 +2234,6 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
if (wdev->netdev->reg_state == NETREG_REGISTERED) if (wdev->netdev->reg_state == NETREG_REGISTERED)
unregister_netdevice(wdev->netdev); unregister_netdevice(wdev->netdev);
if (wdev->netdev->reg_state == NETREG_UNREGISTERED)
free_netdev(wdev->netdev);
/* Clear the priv in adapter */ /* Clear the priv in adapter */
priv->netdev = NULL; priv->netdev = NULL;
......
...@@ -1191,6 +1191,7 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter) ...@@ -1191,6 +1191,7 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter)
adapter->if_ops.wakeup(adapter); adapter->if_ops.wakeup(adapter);
adapter->hs_activated = false; adapter->hs_activated = false;
adapter->is_hs_configured = false; adapter->is_hs_configured = false;
adapter->is_suspended = false;
mwifiex_hs_activated_event(mwifiex_get_priv(adapter, mwifiex_hs_activated_event(mwifiex_get_priv(adapter,
MWIFIEX_BSS_ROLE_ANY), MWIFIEX_BSS_ROLE_ANY),
false); false);
......
...@@ -655,6 +655,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv, ...@@ -655,6 +655,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv,
struct net_device *dev) struct net_device *dev)
{ {
dev->netdev_ops = &mwifiex_netdev_ops; dev->netdev_ops = &mwifiex_netdev_ops;
dev->destructor = free_netdev;
/* Initialize private structure */ /* Initialize private structure */
priv->current_key_index = 0; priv->current_key_index = 0;
priv->media_connected = false; priv->media_connected = false;
......
...@@ -96,7 +96,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, ...@@ -96,7 +96,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
} else { } else {
/* Multicast */ /* Multicast */
priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE; priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;
if (mcast_list->mode == MWIFIEX_MULTICAST_MODE) { if (mcast_list->mode == MWIFIEX_ALL_MULTI_MODE) {
dev_dbg(priv->adapter->dev, dev_dbg(priv->adapter->dev,
"info: Enabling All Multicast!\n"); "info: Enabling All Multicast!\n");
priv->curr_pkt_filter |= priv->curr_pkt_filter |=
...@@ -108,15 +108,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, ...@@ -108,15 +108,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
dev_dbg(priv->adapter->dev, dev_dbg(priv->adapter->dev,
"info: Set multicast list=%d\n", "info: Set multicast list=%d\n",
mcast_list->num_multicast_addr); mcast_list->num_multicast_addr);
/* Set multicast addresses to firmware */ /* Send multicast addresses to firmware */
if (old_pkt_filter == priv->curr_pkt_filter) {
/* Send request to firmware */
ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_MAC_MULTICAST_ADR,
HostCmd_ACT_GEN_SET, 0,
mcast_list);
} else {
/* Send request to firmware */
ret = mwifiex_send_cmd_async(priv, ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_MAC_MULTICAST_ADR, HostCmd_CMD_MAC_MULTICAST_ADR,
HostCmd_ACT_GEN_SET, 0, HostCmd_ACT_GEN_SET, 0,
...@@ -124,7 +116,6 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, ...@@ -124,7 +116,6 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
} }
} }
} }
}
dev_dbg(priv->adapter->dev, dev_dbg(priv->adapter->dev,
"info: old_pkt_filter=%#x, curr_pkt_filter=%#x\n", "info: old_pkt_filter=%#x, curr_pkt_filter=%#x\n",
old_pkt_filter, priv->curr_pkt_filter); old_pkt_filter, priv->curr_pkt_filter);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment