mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 18:53:52 +08:00
Merge remote-tracking branch 'iwlwifi-fixes/master' into HEAD
Conflicts: drivers/net/wireless/iwlwifi/mvm/ops.c
This commit is contained in:
commit
09e1a79ac0
@ -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 @@ done:
|
|||||||
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)
|
|||||||
|
|
||||||
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] = {
|
|||||||
{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] = {
|
|||||||
|
|
||||||
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] = {
|
|||||||
{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] = {
|
|||||||
|
|
||||||
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] = {
|
|||||||
{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] = {
|
|||||||
{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] = {
|
|||||||
|
|
||||||
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] = {
|
|||||||
{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] = {
|
|||||||
{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] = {
|
|||||||
{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] = {
|
|||||||
{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] = {
|
|||||||
{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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@ drop_recycle_buffer:
|
|||||||
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 @@
|
|||||||
/* 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,
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 |
|
||||||
|
@ -735,7 +735,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
|||||||
memcpy(&lq, priv->stations[i].lq,
|
memcpy(&lq, priv->stations[i].lq,
|
||||||
sizeof(struct iwl_link_quality_cmd));
|
sizeof(struct iwl_link_quality_cmd));
|
||||||
|
|
||||||
if (!memcmp(&lq, &zero_lq, sizeof(lq)))
|
if (memcmp(&lq, &zero_lq, sizeof(lq)))
|
||||||
send_lq = true;
|
send_lq = true;
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&priv->sta_lock);
|
spin_unlock_bh(&priv->sta_lock);
|
||||||
|
@ -175,6 +175,8 @@ enum {
|
|||||||
REPLY_DEBUG_CMD = 0xf0,
|
REPLY_DEBUG_CMD = 0xf0,
|
||||||
DEBUG_LOG_MSG = 0xf7,
|
DEBUG_LOG_MSG = 0xf7,
|
||||||
|
|
||||||
|
MCAST_FILTER_CMD = 0xd0,
|
||||||
|
|
||||||
/* D3 commands/notifications */
|
/* D3 commands/notifications */
|
||||||
D3_CONFIG_CMD = 0xd3,
|
D3_CONFIG_CMD = 0xd3,
|
||||||
PROT_OFFLOAD_CONFIG_CMD = 0xd4,
|
PROT_OFFLOAD_CONFIG_CMD = 0xd4,
|
||||||
@ -950,4 +952,29 @@ struct iwl_set_calib_default_cmd {
|
|||||||
u8 data[0];
|
u8 data[0];
|
||||||
} __packed; /* PHY_CALIB_OVERRIDE_VALUES_S */
|
} __packed; /* PHY_CALIB_OVERRIDE_VALUES_S */
|
||||||
|
|
||||||
|
#define MAX_PORT_ID_NUM 2
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct iwl_mcast_filter_cmd - configure multicast filter.
|
||||||
|
* @filter_own: Set 1 to filter out multicast packets sent by station itself
|
||||||
|
* @port_id: Multicast MAC addresses array specifier. This is a strange way
|
||||||
|
* to identify network interface adopted in host-device IF.
|
||||||
|
* It is used by FW as index in array of addresses. This array has
|
||||||
|
* MAX_PORT_ID_NUM members.
|
||||||
|
* @count: Number of MAC addresses in the array
|
||||||
|
* @pass_all: Set 1 to pass all multicast packets.
|
||||||
|
* @bssid: current association BSSID.
|
||||||
|
* @addr_list: Place holder for array of MAC addresses.
|
||||||
|
* IMPORTANT: add padding if necessary to ensure DWORD alignment.
|
||||||
|
*/
|
||||||
|
struct iwl_mcast_filter_cmd {
|
||||||
|
u8 filter_own;
|
||||||
|
u8 port_id;
|
||||||
|
u8 count;
|
||||||
|
u8 pass_all;
|
||||||
|
u8 bssid[6];
|
||||||
|
u8 reserved[2];
|
||||||
|
u8 addr_list[0];
|
||||||
|
} __packed; /* MCAST_FILTERING_CMD_API_S_VER_1 */
|
||||||
|
|
||||||
#endif /* __fw_api_h__ */
|
#endif /* __fw_api_h__ */
|
||||||
|
@ -586,10 +586,12 @@ static int iwl_mvm_mac_ctxt_send_cmd(struct iwl_mvm *mvm,
|
|||||||
*/
|
*/
|
||||||
static void iwl_mvm_mac_ctxt_cmd_fill_sta(struct iwl_mvm *mvm,
|
static void iwl_mvm_mac_ctxt_cmd_fill_sta(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct iwl_mac_data_sta *ctxt_sta)
|
struct iwl_mac_data_sta *ctxt_sta,
|
||||||
|
bool force_assoc_off)
|
||||||
{
|
{
|
||||||
/* We need the dtim_period to set the MAC as associated */
|
/* We need the dtim_period to set the MAC as associated */
|
||||||
if (vif->bss_conf.assoc && vif->bss_conf.dtim_period) {
|
if (vif->bss_conf.assoc && vif->bss_conf.dtim_period &&
|
||||||
|
!force_assoc_off) {
|
||||||
u32 dtim_offs;
|
u32 dtim_offs;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -659,7 +661,8 @@ static int iwl_mvm_mac_ctxt_cmd_station(struct iwl_mvm *mvm,
|
|||||||
cmd.filter_flags &= ~cpu_to_le32(MAC_FILTER_IN_BEACON);
|
cmd.filter_flags &= ~cpu_to_le32(MAC_FILTER_IN_BEACON);
|
||||||
|
|
||||||
/* Fill the data specific for station mode */
|
/* Fill the data specific for station mode */
|
||||||
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.sta);
|
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.sta,
|
||||||
|
action == FW_CTXT_ACTION_ADD);
|
||||||
|
|
||||||
return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
|
return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
|
||||||
}
|
}
|
||||||
@ -677,7 +680,8 @@ static int iwl_mvm_mac_ctxt_cmd_p2p_client(struct iwl_mvm *mvm,
|
|||||||
iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, action);
|
iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, action);
|
||||||
|
|
||||||
/* Fill the data specific for station mode */
|
/* Fill the data specific for station mode */
|
||||||
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.p2p_sta.sta);
|
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.p2p_sta.sta,
|
||||||
|
action == FW_CTXT_ACTION_ADD);
|
||||||
|
|
||||||
cmd.p2p_sta.ctwin = cpu_to_le32(noa->oppps_ctwindow &
|
cmd.p2p_sta.ctwin = cpu_to_le32(noa->oppps_ctwindow &
|
||||||
IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
|
IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
|
||||||
|
@ -737,6 +737,20 @@ static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,
|
|||||||
*total_flags = 0;
|
*total_flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int iwl_mvm_configure_mcast_filter(struct iwl_mvm *mvm,
|
||||||
|
struct ieee80211_vif *vif)
|
||||||
|
{
|
||||||
|
struct iwl_mcast_filter_cmd mcast_filter_cmd = {
|
||||||
|
.pass_all = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
memcpy(mcast_filter_cmd.bssid, vif->bss_conf.bssid, ETH_ALEN);
|
||||||
|
|
||||||
|
return iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_SYNC,
|
||||||
|
sizeof(mcast_filter_cmd),
|
||||||
|
&mcast_filter_cmd);
|
||||||
|
}
|
||||||
|
|
||||||
static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
struct ieee80211_bss_conf *bss_conf,
|
struct ieee80211_bss_conf *bss_conf,
|
||||||
@ -758,6 +772,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iwl_mvm_bt_coex_vif_assoc(mvm, vif);
|
iwl_mvm_bt_coex_vif_assoc(mvm, vif);
|
||||||
|
iwl_mvm_configure_mcast_filter(mvm, vif);
|
||||||
} else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
|
} else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
|
||||||
/* remove AP station now that the MAC is unassoc */
|
/* remove AP station now that the MAC is unassoc */
|
||||||
ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
|
ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
|
||||||
@ -967,7 +982,7 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
|
|||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case STA_NOTIFY_SLEEP:
|
case STA_NOTIFY_SLEEP:
|
||||||
if (atomic_read(&mvmsta->pending_frames) > 0)
|
if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0)
|
||||||
ieee80211_sta_block_awake(hw, sta, true);
|
ieee80211_sta_block_awake(hw, sta, true);
|
||||||
/*
|
/*
|
||||||
* The fw updates the STA to be asleep. Tx packets on the Tx
|
* The fw updates the STA to be asleep. Tx packets on the Tx
|
||||||
|
@ -301,6 +301,7 @@ struct iwl_mvm {
|
|||||||
struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT];
|
struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT];
|
||||||
struct work_struct sta_drained_wk;
|
struct work_struct sta_drained_wk;
|
||||||
unsigned long sta_drained[BITS_TO_LONGS(IWL_MVM_STATION_COUNT)];
|
unsigned long sta_drained[BITS_TO_LONGS(IWL_MVM_STATION_COUNT)];
|
||||||
|
atomic_t pending_frames[IWL_MVM_STATION_COUNT];
|
||||||
|
|
||||||
/* configured by mac80211 */
|
/* configured by mac80211 */
|
||||||
u32 rts_threshold;
|
u32 rts_threshold;
|
||||||
|
@ -292,6 +292,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
|
|||||||
CMD(BT_COEX_PROT_ENV),
|
CMD(BT_COEX_PROT_ENV),
|
||||||
CMD(BT_PROFILE_NOTIFICATION),
|
CMD(BT_PROFILE_NOTIFICATION),
|
||||||
CMD(BT_CONFIG),
|
CMD(BT_CONFIG),
|
||||||
|
CMD(MCAST_FILTER_CMD),
|
||||||
CMD(REPLY_BEACON_FILTERING_CMD),
|
CMD(REPLY_BEACON_FILTERING_CMD),
|
||||||
};
|
};
|
||||||
#undef CMD
|
#undef CMD
|
||||||
|
@ -298,6 +298,12 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
|
|||||||
else
|
else
|
||||||
cmd->type = cpu_to_le32(SCAN_TYPE_FORCED);
|
cmd->type = cpu_to_le32(SCAN_TYPE_FORCED);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: This is a WA due to a bug in the FW AUX framework that does not
|
||||||
|
* properly handle time events that fail to be scheduled
|
||||||
|
*/
|
||||||
|
cmd->type = cpu_to_le32(SCAN_TYPE_FORCED);
|
||||||
|
|
||||||
cmd->repeats = cpu_to_le32(1);
|
cmd->repeats = cpu_to_le32(1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -219,7 +219,7 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
|
|||||||
mvm_sta->max_agg_bufsize = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
|
mvm_sta->max_agg_bufsize = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
|
||||||
|
|
||||||
/* HW restart, don't assume the memory has been zeroed */
|
/* HW restart, don't assume the memory has been zeroed */
|
||||||
atomic_set(&mvm_sta->pending_frames, 0);
|
atomic_set(&mvm->pending_frames[sta_id], 0);
|
||||||
mvm_sta->tid_disable_agg = 0;
|
mvm_sta->tid_disable_agg = 0;
|
||||||
mvm_sta->tfd_queue_msk = 0;
|
mvm_sta->tfd_queue_msk = 0;
|
||||||
for (i = 0; i < IEEE80211_NUM_ACS; i++)
|
for (i = 0; i < IEEE80211_NUM_ACS; i++)
|
||||||
@ -406,15 +406,22 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
|
|||||||
mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
|
mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that the tx response code sees the station as -EBUSY and
|
||||||
|
* calls the drain worker.
|
||||||
|
*/
|
||||||
|
spin_lock_bh(&mvm_sta->lock);
|
||||||
/*
|
/*
|
||||||
* There are frames pending on the AC queues for this station.
|
* There are frames pending on the AC queues for this station.
|
||||||
* We need to wait until all the frames are drained...
|
* We need to wait until all the frames are drained...
|
||||||
*/
|
*/
|
||||||
if (atomic_read(&mvm_sta->pending_frames)) {
|
if (atomic_read(&mvm->pending_frames[mvm_sta->sta_id])) {
|
||||||
ret = iwl_mvm_drain_sta(mvm, mvm_sta, true);
|
|
||||||
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
|
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
|
||||||
ERR_PTR(-EBUSY));
|
ERR_PTR(-EBUSY));
|
||||||
|
spin_unlock_bh(&mvm_sta->lock);
|
||||||
|
ret = iwl_mvm_drain_sta(mvm, mvm_sta, true);
|
||||||
} else {
|
} else {
|
||||||
|
spin_unlock_bh(&mvm_sta->lock);
|
||||||
ret = iwl_mvm_rm_sta_common(mvm, mvm_sta->sta_id);
|
ret = iwl_mvm_rm_sta_common(mvm, mvm_sta->sta_id);
|
||||||
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id], NULL);
|
rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id], NULL);
|
||||||
}
|
}
|
||||||
|
@ -274,7 +274,6 @@ struct iwl_mvm_tid_data {
|
|||||||
* @bt_reduced_txpower: is reduced tx power enabled for this station
|
* @bt_reduced_txpower: is reduced tx power enabled for this station
|
||||||
* @lock: lock to protect the whole struct. Since %tid_data is access from Tx
|
* @lock: lock to protect the whole struct. Since %tid_data is access from Tx
|
||||||
* and from Tx response flow, it needs a spinlock.
|
* and from Tx response flow, it needs a spinlock.
|
||||||
* @pending_frames: number of frames for this STA on the shared Tx queues.
|
|
||||||
* @tid_data: per tid data. Look at %iwl_mvm_tid_data.
|
* @tid_data: per tid data. Look at %iwl_mvm_tid_data.
|
||||||
*
|
*
|
||||||
* When mac80211 creates a station it reserves some space (hw->sta_data_size)
|
* When mac80211 creates a station it reserves some space (hw->sta_data_size)
|
||||||
@ -290,7 +289,6 @@ struct iwl_mvm_sta {
|
|||||||
u8 max_agg_bufsize;
|
u8 max_agg_bufsize;
|
||||||
bool bt_reduced_txpower;
|
bool bt_reduced_txpower;
|
||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
atomic_t pending_frames;
|
|
||||||
struct iwl_mvm_tid_data tid_data[IWL_MAX_TID_COUNT];
|
struct iwl_mvm_tid_data tid_data[IWL_MAX_TID_COUNT];
|
||||||
struct iwl_lq_sta lq_sta;
|
struct iwl_lq_sta lq_sta;
|
||||||
struct ieee80211_vif *vif;
|
struct ieee80211_vif *vif;
|
||||||
|
@ -416,9 +416,8 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||||||
|
|
||||||
spin_unlock(&mvmsta->lock);
|
spin_unlock(&mvmsta->lock);
|
||||||
|
|
||||||
if (mvmsta->vif->type == NL80211_IFTYPE_AP &&
|
if (txq_id < IWL_MVM_FIRST_AGG_QUEUE)
|
||||||
txq_id < IWL_MVM_FIRST_AGG_QUEUE)
|
atomic_inc(&mvm->pending_frames[mvmsta->sta_id]);
|
||||||
atomic_inc(&mvmsta->pending_frames);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -680,16 +679,41 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
|
|||||||
/*
|
/*
|
||||||
* If the txq is not an AMPDU queue, there is no chance we freed
|
* If the txq is not an AMPDU queue, there is no chance we freed
|
||||||
* several skbs. Check that out...
|
* several skbs. Check that out...
|
||||||
* If there are no pending frames for this STA, notify mac80211 that
|
|
||||||
* this station can go to sleep in its STA table.
|
|
||||||
*/
|
*/
|
||||||
if (txq_id < IWL_MVM_FIRST_AGG_QUEUE && mvmsta &&
|
if (txq_id < IWL_MVM_FIRST_AGG_QUEUE && !WARN_ON(skb_freed > 1) &&
|
||||||
!WARN_ON(skb_freed > 1) &&
|
atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id])) {
|
||||||
mvmsta->vif->type == NL80211_IFTYPE_AP &&
|
if (mvmsta) {
|
||||||
atomic_sub_and_test(skb_freed, &mvmsta->pending_frames)) {
|
/*
|
||||||
ieee80211_sta_block_awake(mvm->hw, sta, false);
|
* If there are no pending frames for this STA, notify
|
||||||
set_bit(sta_id, mvm->sta_drained);
|
* mac80211 that this station can go to sleep in its
|
||||||
schedule_work(&mvm->sta_drained_wk);
|
* STA table.
|
||||||
|
*/
|
||||||
|
if (mvmsta->vif->type == NL80211_IFTYPE_AP)
|
||||||
|
ieee80211_sta_block_awake(mvm->hw, sta, false);
|
||||||
|
/*
|
||||||
|
* We might very well have taken mvmsta pointer while
|
||||||
|
* the station was being removed. The remove flow might
|
||||||
|
* have seen a pending_frame (because we didn't take
|
||||||
|
* the lock) even if now the queues are drained. So make
|
||||||
|
* really sure now that this the station is not being
|
||||||
|
* removed. If it is, run the drain worker to remove it.
|
||||||
|
*/
|
||||||
|
spin_lock_bh(&mvmsta->lock);
|
||||||
|
sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
|
||||||
|
if (IS_ERR_OR_NULL(sta)) {
|
||||||
|
/*
|
||||||
|
* Station disappeared in the meantime:
|
||||||
|
* so we are draining.
|
||||||
|
*/
|
||||||
|
set_bit(sta_id, mvm->sta_drained);
|
||||||
|
schedule_work(&mvm->sta_drained_wk);
|
||||||
|
}
|
||||||
|
spin_unlock_bh(&mvmsta->lock);
|
||||||
|
} else if (!mvmsta) {
|
||||||
|
/* Tx response without STA, so we are draining */
|
||||||
|
set_bit(sta_id, mvm->sta_drained);
|
||||||
|
schedule_work(&mvm->sta_drained_wk);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
@ -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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
} 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,
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user