forked from luck/tmp_suning_uos_patched
Merge remote-tracking branch 'mac80211/master' into mac80211-next
This commit is contained in:
commit
dde7dc759b
|
@ -2369,6 +2369,9 @@ ath5k_tx_complete_poll_work(struct work_struct *work)
|
|||
int i;
|
||||
bool needreset = false;
|
||||
|
||||
if (!test_bit(ATH_STAT_STARTED, ah->status))
|
||||
return;
|
||||
|
||||
mutex_lock(&ah->lock);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ah->txqs); i++) {
|
||||
|
@ -2676,6 +2679,7 @@ int ath5k_start(struct ieee80211_hw *hw)
|
|||
mmiowb();
|
||||
mutex_unlock(&ah->lock);
|
||||
|
||||
set_bit(ATH_STAT_STARTED, ah->status);
|
||||
ieee80211_queue_delayed_work(ah->hw, &ah->tx_complete_work,
|
||||
msecs_to_jiffies(ATH5K_TX_COMPLETE_POLL_INT));
|
||||
|
||||
|
@ -2737,6 +2741,7 @@ void ath5k_stop(struct ieee80211_hw *hw)
|
|||
|
||||
ath5k_stop_tasklets(ah);
|
||||
|
||||
clear_bit(ATH_STAT_STARTED, ah->status);
|
||||
cancel_delayed_work_sync(&ah->tx_complete_work);
|
||||
|
||||
if (!ath5k_modparam_no_hw_rfkill_switch)
|
||||
|
|
|
@ -233,9 +233,9 @@ static const u32 ar9565_1p0_baseband_core[][2] = {
|
|||
{0x00009d10, 0x01834061},
|
||||
{0x00009d14, 0x00c00400},
|
||||
{0x00009d18, 0x00000000},
|
||||
{0x00009e08, 0x0078230c},
|
||||
{0x00009e24, 0x990bb515},
|
||||
{0x00009e28, 0x126f0000},
|
||||
{0x00009e08, 0x0038230c},
|
||||
{0x00009e24, 0x9907b515},
|
||||
{0x00009e28, 0x126f0600},
|
||||
{0x00009e30, 0x06336f77},
|
||||
{0x00009e34, 0x6af6532f},
|
||||
{0x00009e38, 0x0cc80c00},
|
||||
|
@ -337,7 +337,7 @@ static const u32 ar9565_1p0_baseband_core[][2] = {
|
|||
|
||||
static const u32 ar9565_1p0_baseband_postamble[][5] = {
|
||||
/* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
|
||||
{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a800d},
|
||||
{0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8009},
|
||||
{0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a01ae},
|
||||
{0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x63c640da},
|
||||
{0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x09143c81},
|
||||
|
@ -345,9 +345,9 @@ static const u32 ar9565_1p0_baseband_postamble[][5] = {
|
|||
{0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
|
||||
{0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
|
||||
{0x00009e00, 0x0372111a, 0x0372111a, 0x037216a0, 0x037216a0},
|
||||
{0x00009e04, 0x00802020, 0x00802020, 0x00802020, 0x00802020},
|
||||
{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000d8},
|
||||
{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec86d2e},
|
||||
{0x00009e04, 0x00802020, 0x00802020, 0x00142020, 0x00142020},
|
||||
{0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
|
||||
{0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e},
|
||||
{0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3379605e, 0x33795d5e},
|
||||
{0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{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] = {
|
||||
/* Addr allmodes */
|
||||
{0x00004050, 0x00300300},
|
||||
{0x0000406c, 0x00100000},
|
||||
{0x0000a000, 0x00010000},
|
||||
{0x0000a004, 0x00030002},
|
||||
{0x0000a008, 0x00050004},
|
||||
|
@ -498,27 +500,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = {
|
|||
{0x0000a0b4, 0x00000000},
|
||||
{0x0000a0b8, 0x00000000},
|
||||
{0x0000a0bc, 0x00000000},
|
||||
{0x0000a0c0, 0x001f0000},
|
||||
{0x0000a0c4, 0x01000101},
|
||||
{0x0000a0c8, 0x011e011f},
|
||||
{0x0000a0cc, 0x011c011d},
|
||||
{0x0000a0d0, 0x02030204},
|
||||
{0x0000a0d4, 0x02010202},
|
||||
{0x0000a0d8, 0x021f0200},
|
||||
{0x0000a0dc, 0x0302021e},
|
||||
{0x0000a0e0, 0x03000301},
|
||||
{0x0000a0e4, 0x031e031f},
|
||||
{0x0000a0e8, 0x0402031d},
|
||||
{0x0000a0ec, 0x04000401},
|
||||
{0x0000a0f0, 0x041e041f},
|
||||
{0x0000a0f4, 0x0502041d},
|
||||
{0x0000a0f8, 0x05000501},
|
||||
{0x0000a0fc, 0x051e051f},
|
||||
{0x0000a100, 0x06010602},
|
||||
{0x0000a104, 0x061f0600},
|
||||
{0x0000a108, 0x061d061e},
|
||||
{0x0000a10c, 0x07020703},
|
||||
{0x0000a110, 0x07000701},
|
||||
{0x0000a0c0, 0x00bf00a0},
|
||||
{0x0000a0c4, 0x11a011a1},
|
||||
{0x0000a0c8, 0x11be11bf},
|
||||
{0x0000a0cc, 0x11bc11bd},
|
||||
{0x0000a0d0, 0x22632264},
|
||||
{0x0000a0d4, 0x22612262},
|
||||
{0x0000a0d8, 0x227f2260},
|
||||
{0x0000a0dc, 0x4322227e},
|
||||
{0x0000a0e0, 0x43204321},
|
||||
{0x0000a0e4, 0x433e433f},
|
||||
{0x0000a0e8, 0x4462433d},
|
||||
{0x0000a0ec, 0x44604461},
|
||||
{0x0000a0f0, 0x447e447f},
|
||||
{0x0000a0f4, 0x5582447d},
|
||||
{0x0000a0f8, 0x55805581},
|
||||
{0x0000a0fc, 0x559e559f},
|
||||
{0x0000a100, 0x66816682},
|
||||
{0x0000a104, 0x669f6680},
|
||||
{0x0000a108, 0x669d669e},
|
||||
{0x0000a10c, 0x77627763},
|
||||
{0x0000a110, 0x77607761},
|
||||
{0x0000a114, 0x00000000},
|
||||
{0x0000a118, 0x00000000},
|
||||
{0x0000a11c, 0x00000000},
|
||||
|
@ -530,27 +532,27 @@ static const u32 ar9565_1p0_Common_rx_gain_table[][2] = {
|
|||
{0x0000a134, 0x00000000},
|
||||
{0x0000a138, 0x00000000},
|
||||
{0x0000a13c, 0x00000000},
|
||||
{0x0000a140, 0x001f0000},
|
||||
{0x0000a144, 0x01000101},
|
||||
{0x0000a148, 0x011e011f},
|
||||
{0x0000a14c, 0x011c011d},
|
||||
{0x0000a150, 0x02030204},
|
||||
{0x0000a154, 0x02010202},
|
||||
{0x0000a158, 0x021f0200},
|
||||
{0x0000a15c, 0x0302021e},
|
||||
{0x0000a160, 0x03000301},
|
||||
{0x0000a164, 0x031e031f},
|
||||
{0x0000a168, 0x0402031d},
|
||||
{0x0000a16c, 0x04000401},
|
||||
{0x0000a170, 0x041e041f},
|
||||
{0x0000a174, 0x0502041d},
|
||||
{0x0000a178, 0x05000501},
|
||||
{0x0000a17c, 0x051e051f},
|
||||
{0x0000a180, 0x06010602},
|
||||
{0x0000a184, 0x061f0600},
|
||||
{0x0000a188, 0x061d061e},
|
||||
{0x0000a18c, 0x07020703},
|
||||
{0x0000a190, 0x07000701},
|
||||
{0x0000a140, 0x00bf00a0},
|
||||
{0x0000a144, 0x11a011a1},
|
||||
{0x0000a148, 0x11be11bf},
|
||||
{0x0000a14c, 0x11bc11bd},
|
||||
{0x0000a150, 0x22632264},
|
||||
{0x0000a154, 0x22612262},
|
||||
{0x0000a158, 0x227f2260},
|
||||
{0x0000a15c, 0x4322227e},
|
||||
{0x0000a160, 0x43204321},
|
||||
{0x0000a164, 0x433e433f},
|
||||
{0x0000a168, 0x4462433d},
|
||||
{0x0000a16c, 0x44604461},
|
||||
{0x0000a170, 0x447e447f},
|
||||
{0x0000a174, 0x5582447d},
|
||||
{0x0000a178, 0x55805581},
|
||||
{0x0000a17c, 0x559e559f},
|
||||
{0x0000a180, 0x66816682},
|
||||
{0x0000a184, 0x669f6680},
|
||||
{0x0000a188, 0x669d669e},
|
||||
{0x0000a18c, 0x77e677e7},
|
||||
{0x0000a190, 0x77e477e5},
|
||||
{0x0000a194, 0x00000000},
|
||||
{0x0000a198, 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] = {
|
||||
/* Addr allmodes */
|
||||
{0x00018c00, 0x18213ede},
|
||||
{0x00018c00, 0x18212ede},
|
||||
{0x00018c04, 0x000801d8},
|
||||
{0x00018c08, 0x0003780c},
|
||||
};
|
||||
|
@ -889,8 +891,8 @@ static const u32 ar9565_1p0_common_wo_xlna_rx_gain_table[][2] = {
|
|||
{0x0000a180, 0x66816682},
|
||||
{0x0000a184, 0x669f6680},
|
||||
{0x0000a188, 0x669d669e},
|
||||
{0x0000a18c, 0x77627763},
|
||||
{0x0000a190, 0x77607761},
|
||||
{0x0000a18c, 0x77e677e7},
|
||||
{0x0000a190, 0x77e477e5},
|
||||
{0x0000a194, 0x00000000},
|
||||
{0x0000a198, 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},
|
||||
{0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000},
|
||||
{0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000},
|
||||
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
|
||||
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050df, 0x000050df},
|
||||
{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
|
||||
{0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
|
||||
{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},
|
||||
{0x0000a55c, 0x6d029f56, 0x6d029f56, 0x57001ce9, 0x57001ce9},
|
||||
{0x0000a560, 0x73049f56, 0x73049f56, 0x5b001ceb, 0x5b001ceb},
|
||||
{0x0000a564, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a568, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a56c, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a570, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a574, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a578, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a57c, 0x7804ff56, 0x7804ff56, 0x5d001eec, 0x5d001eec},
|
||||
{0x0000a564, 0x7804ff56, 0x7804ff56, 0x60001cf0, 0x60001cf0},
|
||||
{0x0000a568, 0x7804ff56, 0x7804ff56, 0x61001cf1, 0x61001cf1},
|
||||
{0x0000a56c, 0x7804ff56, 0x7804ff56, 0x62001cf2, 0x62001cf2},
|
||||
{0x0000a570, 0x7804ff56, 0x7804ff56, 0x63001cf3, 0x63001cf3},
|
||||
{0x0000a574, 0x7804ff56, 0x7804ff56, 0x64001cf4, 0x64001cf4},
|
||||
{0x0000a578, 0x7804ff56, 0x7804ff56, 0x66001ff6, 0x66001ff6},
|
||||
{0x0000a57c, 0x7804ff56, 0x7804ff56, 0x66001ff6, 0x66001ff6},
|
||||
{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a604, 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},
|
||||
{0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000},
|
||||
{0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000},
|
||||
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
|
||||
{0x0000a410, 0x000050d9, 0x000050d9, 0x000050df, 0x000050df},
|
||||
{0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
|
||||
{0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
|
||||
{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},
|
||||
{0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9},
|
||||
{0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb},
|
||||
{0x0000a564, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a568, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a56c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a570, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a574, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a578, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a57c, 0x7504ff56, 0x7504ff56, 0x56001eec, 0x56001eec},
|
||||
{0x0000a564, 0x7504ff56, 0x7504ff56, 0x59001cf0, 0x59001cf0},
|
||||
{0x0000a568, 0x7504ff56, 0x7504ff56, 0x5a001cf1, 0x5a001cf1},
|
||||
{0x0000a56c, 0x7504ff56, 0x7504ff56, 0x5b001cf2, 0x5b001cf2},
|
||||
{0x0000a570, 0x7504ff56, 0x7504ff56, 0x5c001cf3, 0x5c001cf3},
|
||||
{0x0000a574, 0x7504ff56, 0x7504ff56, 0x5d001cf4, 0x5d001cf4},
|
||||
{0x0000a578, 0x7504ff56, 0x7504ff56, 0x5f001ff6, 0x5f001ff6},
|
||||
{0x0000a57c, 0x7504ff56, 0x7504ff56, 0x5f001ff6, 0x5f001ff6},
|
||||
{0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
|
||||
{0x0000a604, 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))
|
||||
goto work;
|
||||
|
||||
ath9k_set_beacon(sc);
|
||||
|
||||
if (ah->opmode == NL80211_IFTYPE_STATION &&
|
||||
test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
|
||||
spin_lock_irqsave(&sc->sc_pm_lock, flags);
|
||||
sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON;
|
||||
spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
|
||||
} else {
|
||||
ath9k_set_beacon(sc);
|
||||
}
|
||||
work:
|
||||
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_node *an = (struct ath_node *) sta->drv_priv;
|
||||
struct ieee80211_key_conf ps_key = { };
|
||||
int key;
|
||||
|
||||
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)
|
||||
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;
|
||||
}
|
||||
|
@ -1356,6 +1359,7 @@ static void ath9k_del_ps_key(struct ath_softc *sc,
|
|||
return;
|
||||
|
||||
ath_key_delete(common, &ps_key);
|
||||
an->ps_key = 0;
|
||||
}
|
||||
|
||||
static int ath9k_sta_remove(struct ieee80211_hw *hw,
|
||||
|
|
|
@ -1728,6 +1728,25 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
|
|||
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)
|
||||
{
|
||||
const struct b43_dma_ops *ops = ring->ops;
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
/* DMA-Interrupt reasons. */
|
||||
#define B43_DMAIRQ_FATALMASK ((1 << 10) | (1 << 11) | (1 << 12) \
|
||||
| (1 << 14) | (1 << 15))
|
||||
#define B43_DMAIRQ_NONFATALMASK (1 << 13)
|
||||
#define B43_DMAIRQ_RDESC_UFLOW (1 << 13)
|
||||
#define B43_DMAIRQ_RX_DONE (1 << 16)
|
||||
|
||||
/*** 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,
|
||||
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_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 |
|
||||
B43_DMAIRQ_NONFATALMASK))) {
|
||||
if (merged_dma_reason & B43_DMAIRQ_FATALMASK) {
|
||||
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[2], dma_reason[3],
|
||||
dma_reason[4], dma_reason[5]);
|
||||
b43err(dev->wl, "This device does not support DMA "
|
||||
if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK))) {
|
||||
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[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");
|
||||
/* Fall back to PIO transfers if we get fatal DMA errors! */
|
||||
dev->use_pio = true;
|
||||
b43_controller_restart(dev, "DMA error");
|
||||
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]);
|
||||
}
|
||||
/* Fall back to PIO transfers if we get fatal DMA errors! */
|
||||
dev->use_pio = true;
|
||||
b43_controller_restart(dev, "DMA error");
|
||||
return;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
/* 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 (b43_using_pio_transfers(dev))
|
||||
b43_pio_rx(dev->pio.rx_queue);
|
||||
|
@ -2001,7 +1994,7 @@ static irqreturn_t b43_do_interrupt(struct b43_wldev *dev)
|
|||
return IRQ_NONE;
|
||||
|
||||
dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON)
|
||||
& 0x0001DC00;
|
||||
& 0x0001FC00;
|
||||
dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON)
|
||||
& 0x0000DC00;
|
||||
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, 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_DMA2_IRQ_MASK, 0x0000DC00);
|
||||
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 =
|
||||
IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC | IEEE80211_HW_SPECTRUM_MGMT |
|
||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS | IEEE80211_HW_SUPPORTS_PS |
|
||||
IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
|
||||
IEEE80211_HW_SUPPORTS_PS | IEEE80211_HW_SUPPORTS_DYNAMIC_PS;
|
||||
if (il->cfg->sku & IL_SKU_N)
|
||||
hw->flags |=
|
||||
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
|
||||
|
|
|
@ -84,15 +84,6 @@ static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
|
|||
.types = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
},
|
||||
{
|
||||
.max = 1,
|
||||
.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO),
|
||||
},
|
||||
{
|
||||
.max = 1,
|
||||
.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
|
||||
},
|
||||
};
|
||||
|
||||
static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
|
||||
|
@ -161,10 +152,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
hw->chanctx_data_size = sizeof(struct iwl_mvm_phy_ctxt);
|
||||
|
||||
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
BIT(NL80211_IFTYPE_AP);
|
||||
|
||||
hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY |
|
||||
WIPHY_FLAG_DISABLE_BEACON_HINTS |
|
||||
|
|
|
@ -1723,11 +1723,11 @@ static void mac80211_hwsim_free(void)
|
|||
class_destroy(hwsim_class);
|
||||
}
|
||||
|
||||
|
||||
static struct device_driver mac80211_hwsim_driver = {
|
||||
.name = "mac80211_hwsim",
|
||||
.bus = &platform_bus_type,
|
||||
.owner = THIS_MODULE,
|
||||
static struct platform_driver mac80211_hwsim_driver = {
|
||||
.driver = {
|
||||
.name = "mac80211_hwsim",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct net_device_ops hwsim_netdev_ops = {
|
||||
|
@ -2169,7 +2169,6 @@ static const struct ieee80211_iface_limit hwsim_if_limits[] = {
|
|||
#endif
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) },
|
||||
{ .max = 1, .types = BIT(NL80211_IFTYPE_P2P_DEVICE) },
|
||||
};
|
||||
|
||||
static struct ieee80211_iface_combination hwsim_if_comb = {
|
||||
|
@ -2219,7 +2218,7 @@ static int __init init_mac80211_hwsim(void)
|
|||
spin_lock_init(&hwsim_radio_lock);
|
||||
INIT_LIST_HEAD(&hwsim_radios);
|
||||
|
||||
err = driver_register(&mac80211_hwsim_driver);
|
||||
err = platform_driver_register(&mac80211_hwsim_driver);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -2254,7 +2253,7 @@ static int __init init_mac80211_hwsim(void)
|
|||
err = -ENOMEM;
|
||||
goto failed_drvdata;
|
||||
}
|
||||
data->dev->driver = &mac80211_hwsim_driver;
|
||||
data->dev->driver = &mac80211_hwsim_driver.driver;
|
||||
err = device_bind_driver(data->dev);
|
||||
if (err != 0) {
|
||||
printk(KERN_DEBUG
|
||||
|
@ -2295,8 +2294,7 @@ static int __init init_mac80211_hwsim(void)
|
|||
BIT(NL80211_IFTYPE_P2P_CLIENT) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO) |
|
||||
BIT(NL80211_IFTYPE_ADHOC) |
|
||||
BIT(NL80211_IFTYPE_MESH_POINT) |
|
||||
BIT(NL80211_IFTYPE_P2P_DEVICE);
|
||||
BIT(NL80211_IFTYPE_MESH_POINT);
|
||||
|
||||
hw->flags = IEEE80211_HW_MFP_CAPABLE |
|
||||
IEEE80211_HW_SIGNAL_DBM |
|
||||
|
@ -2564,7 +2562,7 @@ static int __init init_mac80211_hwsim(void)
|
|||
failed:
|
||||
mac80211_hwsim_free();
|
||||
failed_unregister_driver:
|
||||
driver_unregister(&mac80211_hwsim_driver);
|
||||
platform_driver_unregister(&mac80211_hwsim_driver);
|
||||
return err;
|
||||
}
|
||||
module_init(init_mac80211_hwsim);
|
||||
|
@ -2577,6 +2575,6 @@ static void __exit exit_mac80211_hwsim(void)
|
|||
|
||||
mac80211_hwsim_free();
|
||||
unregister_netdev(hwsim_mon);
|
||||
driver_unregister(&mac80211_hwsim_driver);
|
||||
platform_driver_unregister(&mac80211_hwsim_driver);
|
||||
}
|
||||
module_exit(exit_mac80211_hwsim);
|
||||
|
|
|
@ -2234,9 +2234,6 @@ int mwifiex_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
|
|||
if (wdev->netdev->reg_state == NETREG_REGISTERED)
|
||||
unregister_netdevice(wdev->netdev);
|
||||
|
||||
if (wdev->netdev->reg_state == NETREG_UNREGISTERED)
|
||||
free_netdev(wdev->netdev);
|
||||
|
||||
/* Clear the priv in adapter */
|
||||
priv->netdev = NULL;
|
||||
|
||||
|
|
|
@ -1191,6 +1191,7 @@ mwifiex_process_hs_config(struct mwifiex_adapter *adapter)
|
|||
adapter->if_ops.wakeup(adapter);
|
||||
adapter->hs_activated = false;
|
||||
adapter->is_hs_configured = false;
|
||||
adapter->is_suspended = false;
|
||||
mwifiex_hs_activated_event(mwifiex_get_priv(adapter,
|
||||
MWIFIEX_BSS_ROLE_ANY),
|
||||
false);
|
||||
|
|
|
@ -655,6 +655,7 @@ void mwifiex_init_priv_params(struct mwifiex_private *priv,
|
|||
struct net_device *dev)
|
||||
{
|
||||
dev->netdev_ops = &mwifiex_netdev_ops;
|
||||
dev->destructor = free_netdev;
|
||||
/* Initialize private structure */
|
||||
priv->current_key_index = 0;
|
||||
priv->media_connected = false;
|
||||
|
|
|
@ -96,7 +96,7 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
|
|||
} else {
|
||||
/* Multicast */
|
||||
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,
|
||||
"info: Enabling All Multicast!\n");
|
||||
priv->curr_pkt_filter |=
|
||||
|
@ -108,20 +108,11 @@ int mwifiex_request_set_multicast_list(struct mwifiex_private *priv,
|
|||
dev_dbg(priv->adapter->dev,
|
||||
"info: Set multicast list=%d\n",
|
||||
mcast_list->num_multicast_addr);
|
||||
/* Set 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,
|
||||
HostCmd_CMD_MAC_MULTICAST_ADR,
|
||||
HostCmd_ACT_GEN_SET, 0,
|
||||
mcast_list);
|
||||
}
|
||||
/* Send multicast addresses to firmware */
|
||||
ret = mwifiex_send_cmd_async(priv,
|
||||
HostCmd_CMD_MAC_MULTICAST_ADR,
|
||||
HostCmd_ACT_GEN_SET, 0,
|
||||
mcast_list);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3053,7 +3053,8 @@ void ieee80211_napi_complete(struct ieee80211_hw *hw);
|
|||
* This function may not be called in IRQ context. Calls to this function
|
||||
* for a single hardware must be synchronized against each other. Calls to
|
||||
* this function, ieee80211_rx_ni() and ieee80211_rx_irqsafe() may not be
|
||||
* mixed for a single hardware.
|
||||
* mixed for a single hardware. Must not run concurrently with
|
||||
* ieee80211_tx_status() or ieee80211_tx_status_ni().
|
||||
*
|
||||
* In process context use instead ieee80211_rx_ni().
|
||||
*
|
||||
|
@ -3069,7 +3070,8 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|||
* (internally defers to a tasklet.)
|
||||
*
|
||||
* Calls to this function, ieee80211_rx() or ieee80211_rx_ni() may not
|
||||
* be mixed for a single hardware.
|
||||
* be mixed for a single hardware.Must not run concurrently with
|
||||
* ieee80211_tx_status() or ieee80211_tx_status_ni().
|
||||
*
|
||||
* @hw: the hardware this frame came in on
|
||||
* @skb: the buffer to receive, owned by mac80211 after this call
|
||||
|
@ -3083,7 +3085,8 @@ void ieee80211_rx_irqsafe(struct ieee80211_hw *hw, struct sk_buff *skb);
|
|||
* (internally disables bottom halves).
|
||||
*
|
||||
* Calls to this function, ieee80211_rx() and ieee80211_rx_irqsafe() may
|
||||
* not be mixed for a single hardware.
|
||||
* not be mixed for a single hardware. Must not run concurrently with
|
||||
* ieee80211_tx_status() or ieee80211_tx_status_ni().
|
||||
*
|
||||
* @hw: the hardware this frame came in on
|
||||
* @skb: the buffer to receive, owned by mac80211 after this call
|
||||
|
@ -3206,7 +3209,8 @@ void ieee80211_get_tx_rates(struct ieee80211_vif *vif,
|
|||
* This function may not be called in IRQ context. Calls to this function
|
||||
* for a single hardware must be synchronized against each other. Calls
|
||||
* to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()
|
||||
* may not be mixed for a single hardware.
|
||||
* may not be mixed for a single hardware. Must not run concurrently with
|
||||
* ieee80211_rx() or ieee80211_rx_ni().
|
||||
*
|
||||
* @hw: the hardware the frame was transmitted by
|
||||
* @skb: the frame that was transmitted, owned by mac80211 after this call
|
||||
|
|
|
@ -1267,6 +1267,7 @@ void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);
|
|||
void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
|
||||
__le16 fc, bool acked);
|
||||
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
|
||||
|
||||
/* IBSS code */
|
||||
void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
|
||||
|
|
|
@ -474,6 +474,9 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
|||
master->control_port_protocol;
|
||||
sdata->control_port_no_encrypt =
|
||||
master->control_port_no_encrypt;
|
||||
sdata->vif.cab_queue = master->vif.cab_queue;
|
||||
memcpy(sdata->vif.hw_queue, master->vif.hw_queue,
|
||||
sizeof(sdata->vif.hw_queue));
|
||||
break;
|
||||
}
|
||||
case NL80211_IFTYPE_AP:
|
||||
|
@ -653,7 +656,11 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
|||
|
||||
ieee80211_recalc_ps(local, -1);
|
||||
|
||||
if (dev) {
|
||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
|
||||
sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
|
||||
/* XXX: for AP_VLAN, actually track AP queues */
|
||||
netif_tx_start_all_queues(dev);
|
||||
} else if (dev) {
|
||||
unsigned long flags;
|
||||
int n_acs = IEEE80211_NUM_ACS;
|
||||
int ac;
|
||||
|
@ -1696,6 +1703,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
|
|||
|
||||
ASSERT_RTNL();
|
||||
|
||||
/*
|
||||
* Close all AP_VLAN interfaces first, as otherwise they
|
||||
* might be closed while the AP interface they belong to
|
||||
* is closed, causing unregister_netdevice_many() to crash.
|
||||
*/
|
||||
list_for_each_entry(sdata, &local->interfaces, list)
|
||||
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
||||
dev_close(sdata->dev);
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
|
||||
list_del(&sdata->list);
|
||||
|
|
|
@ -3325,10 +3325,6 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
|||
if (WARN_ON_ONCE(!auth_data))
|
||||
return -EINVAL;
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
|
||||
auth_data->tries++;
|
||||
|
||||
if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) {
|
||||
|
@ -3362,6 +3358,10 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
|||
auth_data->expected_transaction = trans;
|
||||
}
|
||||
|
||||
if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
|
||||
tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
||||
IEEE80211_TX_INTFL_MLME_CONN_TX;
|
||||
|
||||
ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
|
||||
auth_data->data, auth_data->data_len,
|
||||
auth_data->bss->bssid,
|
||||
|
@ -3385,12 +3385,12 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
|||
* will not answer to direct packet in unassociated state.
|
||||
*/
|
||||
ieee80211_send_probe_req(sdata, NULL, ssidie + 2, ssidie[1],
|
||||
NULL, 0, (u32) -1, true, tx_flags,
|
||||
NULL, 0, (u32) -1, true, 0,
|
||||
auth_data->bss->channel, false);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
if (!(local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)) {
|
||||
if (tx_flags == 0) {
|
||||
auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
||||
ifmgd->auth_data->timeout_started = true;
|
||||
run_again(ifmgd, auth_data->timeout);
|
||||
|
@ -3643,6 +3643,31 @@ static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
|
|||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
|
||||
mutex_lock(&ifmgd->mtx);
|
||||
if (!ifmgd->associated) {
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
return;
|
||||
}
|
||||
|
||||
if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) {
|
||||
sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME;
|
||||
mlme_dbg(sdata, "driver requested disconnect after resume\n");
|
||||
ieee80211_sta_connection_lost(sdata,
|
||||
ifmgd->associated->bssid,
|
||||
WLAN_REASON_UNSPECIFIED,
|
||||
true);
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
return;
|
||||
}
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* interface setup */
|
||||
void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
|
@ -4349,7 +4374,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
|||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
|
||||
bool tx = !req->local_state_change;
|
||||
bool sent_frame = false;
|
||||
bool report_frame = false;
|
||||
|
||||
mutex_lock(&ifmgd->mtx);
|
||||
|
||||
|
@ -4366,7 +4391,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_destroy_auth_data(sdata, false);
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
|
||||
sent_frame = tx;
|
||||
report_frame = true;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -4374,12 +4399,12 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
|||
ether_addr_equal(ifmgd->associated->bssid, req->bssid)) {
|
||||
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
|
||||
req->reason_code, tx, frame_buf);
|
||||
sent_frame = tx;
|
||||
report_frame = true;
|
||||
}
|
||||
mutex_unlock(&ifmgd->mtx);
|
||||
|
||||
out:
|
||||
if (sent_frame)
|
||||
if (report_frame)
|
||||
__cfg80211_send_deauth(sdata->dev, frame_buf,
|
||||
IEEE80211_DEAUTH_FRAME_LEN);
|
||||
|
||||
|
|
|
@ -688,8 +688,15 @@ int rate_control_set_rates(struct ieee80211_hw *hw,
|
|||
struct ieee80211_sta *pubsta,
|
||||
struct ieee80211_sta_rates *rates)
|
||||
{
|
||||
struct ieee80211_sta_rates *old = rcu_dereference(pubsta->rates);
|
||||
struct ieee80211_sta_rates *old;
|
||||
|
||||
/*
|
||||
* mac80211 guarantees that this function will not be called
|
||||
* concurrently, so the following RCU access is safe, even without
|
||||
* extra locking. This can not be checked easily, so we just set
|
||||
* the condition to true.
|
||||
*/
|
||||
old = rcu_dereference_protected(pubsta->rates, true);
|
||||
rcu_assign_pointer(pubsta->rates, rates);
|
||||
if (old)
|
||||
kfree_rcu(old, rcu_head);
|
||||
|
|
|
@ -3054,6 +3054,9 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
|
|||
* and location updates. Note that mac80211
|
||||
* itself never looks at these frames.
|
||||
*/
|
||||
if (!multicast &&
|
||||
!ether_addr_equal(sdata->vif.addr, hdr->addr1))
|
||||
return 0;
|
||||
if (ieee80211_is_public_action(hdr, skb->len))
|
||||
return 1;
|
||||
if (!ieee80211_is_beacon(hdr->frame_control))
|
||||
|
|
|
@ -208,10 +208,10 @@ void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
|
|||
u32 iv32 = get_unaligned_le32(&data[4]);
|
||||
u16 iv16 = data[2] | (data[0] << 8);
|
||||
|
||||
spin_lock_bh(&key->u.tkip.txlock);
|
||||
spin_lock(&key->u.tkip.txlock);
|
||||
ieee80211_compute_tkip_p1k(key, iv32);
|
||||
tkip_mixing_phase2(tk, ctx, iv16, p2k);
|
||||
spin_unlock_bh(&key->u.tkip.txlock);
|
||||
spin_unlock(&key->u.tkip.txlock);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_get_tkip_p2k);
|
||||
|
||||
|
|
|
@ -1714,6 +1714,13 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
mb();
|
||||
local->resuming = false;
|
||||
|
||||
list_for_each_entry(sdata, &local->interfaces, list) {
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
continue;
|
||||
if (sdata->vif.type == NL80211_IFTYPE_STATION)
|
||||
ieee80211_sta_restart(sdata);
|
||||
}
|
||||
|
||||
mod_timer(&local->sta_cleanup, jiffies + 1);
|
||||
#else
|
||||
WARN_ON(1);
|
||||
|
|
|
@ -639,17 +639,21 @@ int wiphy_register(struct wiphy *wiphy)
|
|||
* cfg80211_mutex lock
|
||||
*/
|
||||
res = rfkill_register(rdev->rfkill);
|
||||
if (res)
|
||||
goto out_rm_dev;
|
||||
if (res) {
|
||||
device_del(&rdev->wiphy.dev);
|
||||
|
||||
mutex_lock(&cfg80211_mutex);
|
||||
debugfs_remove_recursive(rdev->wiphy.debugfsdir);
|
||||
list_del_rcu(&rdev->list);
|
||||
wiphy_regulatory_deregister(wiphy);
|
||||
mutex_unlock(&cfg80211_mutex);
|
||||
return res;
|
||||
}
|
||||
|
||||
rtnl_lock();
|
||||
rdev->wiphy.registered = true;
|
||||
rtnl_unlock();
|
||||
return 0;
|
||||
|
||||
out_rm_dev:
|
||||
device_del(&rdev->wiphy.dev);
|
||||
return res;
|
||||
}
|
||||
EXPORT_SYMBOL(wiphy_register);
|
||||
|
||||
|
@ -867,7 +871,6 @@ void cfg80211_leave(struct cfg80211_registered_device *rdev,
|
|||
#endif
|
||||
__cfg80211_disconnect(rdev, dev,
|
||||
WLAN_REASON_DEAUTH_LEAVING, true);
|
||||
cfg80211_mlme_down(rdev, dev);
|
||||
wdev_unlock(wdev);
|
||||
break;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
|
|
|
@ -3438,7 +3438,7 @@ static int nl80211_send_station(struct sk_buff *msg, u32 portid, u32 seq,
|
|||
(u32)sinfo->rx_bytes))
|
||||
goto nla_put_failure;
|
||||
if ((sinfo->filled & (STATION_INFO_TX_BYTES |
|
||||
NL80211_STA_INFO_TX_BYTES64)) &&
|
||||
STATION_INFO_TX_BYTES64)) &&
|
||||
nla_put_u32(msg, NL80211_STA_INFO_TX_BYTES,
|
||||
(u32)sinfo->tx_bytes))
|
||||
goto nla_put_failure;
|
||||
|
@ -7630,6 +7630,8 @@ static int nl80211_send_wowlan_tcp(struct sk_buff *msg,
|
|||
&tcp->payload_tok))
|
||||
return -ENOBUFS;
|
||||
|
||||
nla_nest_end(msg, nl_tcp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -10023,6 +10025,7 @@ int nl80211_send_mgmt(struct cfg80211_registered_device *rdev,
|
|||
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
||||
(netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
|
||||
netdev->ifindex)) ||
|
||||
nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
|
||||
nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||
|
||||
(sig_dbm &&
|
||||
nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, sig_dbm)) ||
|
||||
|
@ -10063,6 +10066,7 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie,
|
|||
if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
|
||||
(netdev && nla_put_u32(msg, NL80211_ATTR_IFINDEX,
|
||||
netdev->ifindex)) ||
|
||||
nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)) ||
|
||||
nla_put(msg, NL80211_ATTR_FRAME, len, buf) ||
|
||||
nla_put_u64(msg, NL80211_ATTR_COOKIE, cookie) ||
|
||||
(ack && nla_put_flag(msg, NL80211_ATTR_ACK)))
|
||||
|
|
|
@ -231,6 +231,9 @@ void cfg80211_conn_work(struct work_struct *work)
|
|||
mutex_lock(&rdev->sched_scan_mtx);
|
||||
|
||||
list_for_each_entry(wdev, &rdev->wdev_list, list) {
|
||||
if (!wdev->netdev)
|
||||
continue;
|
||||
|
||||
wdev_lock(wdev);
|
||||
if (!netif_running(wdev->netdev)) {
|
||||
wdev_unlock(wdev);
|
||||
|
@ -961,7 +964,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
|||
/* was it connected by userspace SME? */
|
||||
if (!wdev->conn) {
|
||||
cfg80211_mlme_down(rdev, dev);
|
||||
return 0;
|
||||
goto disconnect;
|
||||
}
|
||||
|
||||
if (wdev->sme_state == CFG80211_SME_CONNECTING &&
|
||||
|
@ -987,6 +990,7 @@ int __cfg80211_disconnect(struct cfg80211_registered_device *rdev,
|
|||
return err;
|
||||
}
|
||||
|
||||
disconnect:
|
||||
if (wdev->sme_state == CFG80211_SME_CONNECTED)
|
||||
__cfg80211_disconnected(dev, NULL, 0, 0, false);
|
||||
else if (wdev->sme_state == CFG80211_SME_CONNECTING)
|
||||
|
|
|
@ -2441,6 +2441,7 @@ TRACE_EVENT(cfg80211_report_wowlan_wakeup,
|
|||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
WDEV_ENTRY
|
||||
__field(bool, non_wireless)
|
||||
__field(bool, disconnect)
|
||||
__field(bool, magic_pkt)
|
||||
__field(bool, gtk_rekey_failure)
|
||||
|
@ -2449,20 +2450,22 @@ TRACE_EVENT(cfg80211_report_wowlan_wakeup,
|
|||
__field(bool, rfkill_release)
|
||||
__field(s32, pattern_idx)
|
||||
__field(u32, packet_len)
|
||||
__dynamic_array(u8, packet, wakeup->packet_present_len)
|
||||
__dynamic_array(u8, packet,
|
||||
wakeup ? wakeup->packet_present_len : 0)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
WDEV_ASSIGN;
|
||||
__entry->disconnect = wakeup->disconnect;
|
||||
__entry->magic_pkt = wakeup->magic_pkt;
|
||||
__entry->gtk_rekey_failure = wakeup->gtk_rekey_failure;
|
||||
__entry->eap_identity_req = wakeup->eap_identity_req;
|
||||
__entry->four_way_handshake = wakeup->four_way_handshake;
|
||||
__entry->rfkill_release = wakeup->rfkill_release;
|
||||
__entry->pattern_idx = wakeup->pattern_idx;
|
||||
__entry->packet_len = wakeup->packet_len;
|
||||
if (wakeup->packet && wakeup->packet_present_len)
|
||||
__entry->non_wireless = !wakeup;
|
||||
__entry->disconnect = wakeup ? wakeup->disconnect : false;
|
||||
__entry->magic_pkt = wakeup ? wakeup->magic_pkt : false;
|
||||
__entry->gtk_rekey_failure = wakeup ? wakeup->gtk_rekey_failure : false;
|
||||
__entry->eap_identity_req = wakeup ? wakeup->eap_identity_req : false;
|
||||
__entry->four_way_handshake = wakeup ? wakeup->four_way_handshake : false;
|
||||
__entry->rfkill_release = wakeup ? wakeup->rfkill_release : false;
|
||||
__entry->pattern_idx = wakeup ? wakeup->pattern_idx : false;
|
||||
__entry->packet_len = wakeup ? wakeup->packet_len : false;
|
||||
if (wakeup && wakeup->packet && wakeup->packet_present_len)
|
||||
memcpy(__get_dynamic_array(packet), wakeup->packet,
|
||||
wakeup->packet_present_len);
|
||||
),
|
||||
|
|
Loading…
Reference in New Issue
Block a user