Commit 4f81d715 authored by John W. Linville's avatar John W. Linville

Merge branch 'master' of...

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
parents 70eba422 ccd384b1
...@@ -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,30 +1902,18 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) ...@@ -1902,30 +1902,18 @@ 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: " dma_reason[0], dma_reason[1],
"0x%08X, 0x%08X, 0x%08X, " dma_reason[2], dma_reason[3],
"0x%08X, 0x%08X, 0x%08X\n", dma_reason[4], dma_reason[5]);
dma_reason[0], dma_reason[1], b43err(dev->wl, "This device does not support DMA "
dma_reason[2], dma_reason[3],
dma_reason[4], dma_reason[5]);
b43err(dev->wl, "This device does not support DMA "
"on your system. It will now be switched to PIO.\n"); "on your system. It will now be switched to PIO.\n");
/* Fall back to PIO transfers if we get fatal DMA errors! */ /* Fall back to PIO transfers if we get fatal DMA errors! */
dev->use_pio = true; dev->use_pio = true;
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))
...@@ -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,20 +108,11 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv, ...@@ -108,20 +108,11 @@ 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) { ret = mwifiex_send_cmd_async(priv,
/* Send request to firmware */ HostCmd_CMD_MAC_MULTICAST_ADR,
ret = mwifiex_send_cmd_async(priv, HostCmd_ACT_GEN_SET, 0,
HostCmd_CMD_MAC_MULTICAST_ADR, mcast_list);
HostCmd_ACT_GEN_SET, 0,
mcast_list);
} else {
/* Send request to firmware */
ret = mwifiex_send_cmd_async(priv,
HostCmd_CMD_MAC_MULTICAST_ADR,
HostCmd_ACT_GEN_SET, 0,
mcast_list);
}
} }
} }
} }
......
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