Commit 781b14a3 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

ath9k: Use atomic operations

The 'sc_flags' variable is being used in a number of places
with no locking whatsoever. This patch converts the usage
of sc_flags to atomic ops.
Signed-off-by: default avatarSujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 8da07830
...@@ -126,7 +126,7 @@ static int ath_ahb_probe(struct platform_device *pdev) ...@@ -126,7 +126,7 @@ static int ath_ahb_probe(struct platform_device *pdev)
sc->irq = irq; sc->irq = irq;
/* Will be cleared in ath9k_start() */ /* Will be cleared in ath9k_start() */
sc->sc_flags |= SC_OP_INVALID; set_bit(SC_OP_INVALID, &sc->sc_flags);
ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc); ret = request_irq(irq, ath_isr, IRQF_SHARED, "ath9k", sc);
if (ret) { if (ret) {
......
...@@ -604,12 +604,14 @@ void ath_ant_comb_update(struct ath_softc *sc); ...@@ -604,12 +604,14 @@ void ath_ant_comb_update(struct ath_softc *sc);
#define ATH_TXPOWER_MAX 100 /* .5 dBm units */ #define ATH_TXPOWER_MAX 100 /* .5 dBm units */
#define ATH_RATE_DUMMY_MARKER 0 #define ATH_RATE_DUMMY_MARKER 0
#define SC_OP_INVALID BIT(0) enum sc_op_flags {
#define SC_OP_BEACONS BIT(1) SC_OP_INVALID,
#define SC_OP_RXFLUSH BIT(2) SC_OP_BEACONS,
#define SC_OP_TSF_RESET BIT(3) SC_OP_RXFLUSH,
#define SC_OP_ANI_RUN BIT(4) SC_OP_TSF_RESET,
#define SC_OP_PRIM_STA_VIF BIT(5) SC_OP_ANI_RUN,
SC_OP_PRIM_STA_VIF,
};
/* Powersave flags */ /* Powersave flags */
#define PS_WAIT_FOR_BEACON BIT(0) #define PS_WAIT_FOR_BEACON BIT(0)
...@@ -655,9 +657,9 @@ struct ath_softc { ...@@ -655,9 +657,9 @@ struct ath_softc {
struct completion paprd_complete; struct completion paprd_complete;
unsigned int hw_busy_count; unsigned int hw_busy_count;
unsigned long sc_flags;
u32 intrstatus; u32 intrstatus;
u32 sc_flags; /* SC_OP_* */
u16 ps_flags; /* PS_* */ u16 ps_flags; /* PS_* */
u16 curtxpow; u16 curtxpow;
bool ps_enabled; bool ps_enabled;
......
...@@ -390,7 +390,7 @@ void ath_beacon_tasklet(unsigned long data) ...@@ -390,7 +390,7 @@ void ath_beacon_tasklet(unsigned long data)
} else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) {
ath_dbg(common, BSTUCK, "beacon is officially stuck\n"); ath_dbg(common, BSTUCK, "beacon is officially stuck\n");
sc->beacon.bmisscnt = 0; sc->beacon.bmisscnt = 0;
sc->sc_flags |= SC_OP_TSF_RESET; set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
ieee80211_queue_work(sc->hw, &sc->hw_reset_work); ieee80211_queue_work(sc->hw, &sc->hw_reset_work);
} }
...@@ -480,16 +480,16 @@ static void ath9k_beacon_init(struct ath_softc *sc, ...@@ -480,16 +480,16 @@ static void ath9k_beacon_init(struct ath_softc *sc,
u32 next_beacon, u32 next_beacon,
u32 beacon_period) u32 beacon_period)
{ {
if (sc->sc_flags & SC_OP_TSF_RESET) { if (test_bit(SC_OP_TSF_RESET, &sc->sc_flags)) {
ath9k_ps_wakeup(sc); ath9k_ps_wakeup(sc);
ath9k_hw_reset_tsf(sc->sc_ah); ath9k_hw_reset_tsf(sc->sc_ah);
} }
ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period); ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period);
if (sc->sc_flags & SC_OP_TSF_RESET) { if (test_bit(SC_OP_TSF_RESET, &sc->sc_flags)) {
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
sc->sc_flags &= ~SC_OP_TSF_RESET; clear_bit(SC_OP_TSF_RESET, &sc->sc_flags);
} }
} }
...@@ -519,7 +519,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc, ...@@ -519,7 +519,7 @@ static void ath_beacon_config_ap(struct ath_softc *sc,
/* Set the computed AP beacon timers */ /* Set the computed AP beacon timers */
ath9k_hw_disable_interrupts(ah); ath9k_hw_disable_interrupts(ah);
sc->sc_flags |= SC_OP_TSF_RESET; set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
ath9k_beacon_init(sc, nexttbtt, intval); ath9k_beacon_init(sc, nexttbtt, intval);
sc->beacon.bmisscnt = 0; sc->beacon.bmisscnt = 0;
ath9k_hw_set_interrupts(ah); ath9k_hw_set_interrupts(ah);
...@@ -662,7 +662,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc, ...@@ -662,7 +662,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
u32 tsf, intval, nexttbtt; u32 tsf, intval, nexttbtt;
ath9k_reset_beacon_status(sc); ath9k_reset_beacon_status(sc);
if (!(sc->sc_flags & SC_OP_BEACONS)) if (!test_bit(SC_OP_BEACONS, &sc->sc_flags))
ath9k_hw_settsf64(ah, sc->beacon.bc_tstamp); ath9k_hw_settsf64(ah, sc->beacon.bc_tstamp);
intval = TU_TO_USEC(conf->beacon_interval); intval = TU_TO_USEC(conf->beacon_interval);
...@@ -727,7 +727,7 @@ static bool ath9k_allow_beacon_config(struct ath_softc *sc, ...@@ -727,7 +727,7 @@ static bool ath9k_allow_beacon_config(struct ath_softc *sc,
*/ */
if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) && if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) &&
(vif->type == NL80211_IFTYPE_STATION) && (vif->type == NL80211_IFTYPE_STATION) &&
(sc->sc_flags & SC_OP_BEACONS) && test_bit(SC_OP_BEACONS, &sc->sc_flags) &&
!avp->primary_sta_vif) { !avp->primary_sta_vif) {
ath_dbg(common, CONFIG, ath_dbg(common, CONFIG,
"Beacon already configured for a station interface\n"); "Beacon already configured for a station interface\n");
...@@ -813,7 +813,7 @@ void ath_set_beacon(struct ath_softc *sc) ...@@ -813,7 +813,7 @@ void ath_set_beacon(struct ath_softc *sc)
return; return;
} }
sc->sc_flags |= SC_OP_BEACONS; set_bit(SC_OP_BEACONS, &sc->sc_flags);
} }
void ath9k_set_beaconing_status(struct ath_softc *sc, bool status) void ath9k_set_beaconing_status(struct ath_softc *sc, bool status)
...@@ -821,7 +821,7 @@ void ath9k_set_beaconing_status(struct ath_softc *sc, bool status) ...@@ -821,7 +821,7 @@ void ath9k_set_beaconing_status(struct ath_softc *sc, bool status)
struct ath_hw *ah = sc->sc_ah; struct ath_hw *ah = sc->sc_ah;
if (!ath_has_valid_bslot(sc)) { if (!ath_has_valid_bslot(sc)) {
sc->sc_flags &= ~SC_OP_BEACONS; clear_bit(SC_OP_BEACONS, &sc->sc_flags);
return; return;
} }
......
...@@ -205,10 +205,10 @@ static ssize_t write_file_disable_ani(struct file *file, ...@@ -205,10 +205,10 @@ static ssize_t write_file_disable_ani(struct file *file,
common->disable_ani = !!disable_ani; common->disable_ani = !!disable_ani;
if (disable_ani) { if (disable_ani) {
sc->sc_flags &= ~SC_OP_ANI_RUN; clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
del_timer_sync(&common->ani.timer); del_timer_sync(&common->ani.timer);
} else { } else {
sc->sc_flags |= SC_OP_ANI_RUN; set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
ath_start_ani(common); ath_start_ani(common);
} }
...@@ -1321,7 +1321,7 @@ static int open_file_bb_mac_samps(struct inode *inode, struct file *file) ...@@ -1321,7 +1321,7 @@ static int open_file_bb_mac_samps(struct inode *inode, struct file *file)
u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
u8 nread; u8 nread;
if (sc->sc_flags & SC_OP_INVALID) if (test_bit(SC_OP_INVALID, &sc->sc_flags))
return -EAGAIN; return -EAGAIN;
buf = vmalloc(size); buf = vmalloc(size);
......
...@@ -155,7 +155,7 @@ void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon) ...@@ -155,7 +155,7 @@ void ath_start_rx_poll(struct ath_softc *sc, u8 nbeacon)
if (!AR_SREV_9300(sc->sc_ah)) if (!AR_SREV_9300(sc->sc_ah))
return; return;
if (!(sc->sc_flags & SC_OP_PRIM_STA_VIF)) if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
return; return;
mod_timer(&sc->rx_poll_timer, jiffies + msecs_to_jiffies mod_timer(&sc->rx_poll_timer, jiffies + msecs_to_jiffies
...@@ -430,7 +430,7 @@ void ath_start_ani(struct ath_common *common) ...@@ -430,7 +430,7 @@ void ath_start_ani(struct ath_common *common)
unsigned long timestamp = jiffies_to_msecs(jiffies); unsigned long timestamp = jiffies_to_msecs(jiffies);
struct ath_softc *sc = (struct ath_softc *) common->priv; struct ath_softc *sc = (struct ath_softc *) common->priv;
if (!(sc->sc_flags & SC_OP_ANI_RUN)) if (!test_bit(SC_OP_ANI_RUN, &sc->sc_flags))
return; return;
if (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) if (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)
......
...@@ -222,7 +222,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start) ...@@ -222,7 +222,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
ath9k_hw_enable_interrupts(ah); ath9k_hw_enable_interrupts(ah);
if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && start) { if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL) && start) {
if (sc->sc_flags & SC_OP_BEACONS) if (test_bit(SC_OP_BEACONS, &sc->sc_flags))
ath_set_beacon(sc); ath_set_beacon(sc);
ath_restart_work(sc); ath_restart_work(sc);
...@@ -293,7 +293,7 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw, ...@@ -293,7 +293,7 @@ static int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
{ {
int r; int r;
if (sc->sc_flags & SC_OP_INVALID) if (test_bit(SC_OP_INVALID, &sc->sc_flags))
return -EIO; return -EIO;
r = ath_reset_internal(sc, hchan, false); r = ath_reset_internal(sc, hchan, false);
...@@ -435,7 +435,7 @@ irqreturn_t ath_isr(int irq, void *dev) ...@@ -435,7 +435,7 @@ irqreturn_t ath_isr(int irq, void *dev)
* touch anything. Note this can happen early * touch anything. Note this can happen early
* on if the IRQ is shared. * on if the IRQ is shared.
*/ */
if (sc->sc_flags & SC_OP_INVALID) if (test_bit(SC_OP_INVALID, &sc->sc_flags))
return IRQ_NONE; return IRQ_NONE;
...@@ -635,7 +635,7 @@ static int ath9k_start(struct ieee80211_hw *hw) ...@@ -635,7 +635,7 @@ static int ath9k_start(struct ieee80211_hw *hw)
ath_mci_enable(sc); ath_mci_enable(sc);
sc->sc_flags &= ~SC_OP_INVALID; clear_bit(SC_OP_INVALID, &sc->sc_flags);
sc->sc_ah->is_monitoring = false; sc->sc_ah->is_monitoring = false;
if (!ath_complete_reset(sc, false)) { if (!ath_complete_reset(sc, false)) {
...@@ -754,7 +754,7 @@ static void ath9k_stop(struct ieee80211_hw *hw) ...@@ -754,7 +754,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)
ath_cancel_work(sc); ath_cancel_work(sc);
del_timer_sync(&sc->rx_poll_timer); del_timer_sync(&sc->rx_poll_timer);
if (sc->sc_flags & SC_OP_INVALID) { if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
ath_dbg(common, ANY, "Device not present\n"); ath_dbg(common, ANY, "Device not present\n");
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
return; return;
...@@ -811,7 +811,7 @@ static void ath9k_stop(struct ieee80211_hw *hw) ...@@ -811,7 +811,7 @@ static void ath9k_stop(struct ieee80211_hw *hw)
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
sc->sc_flags |= SC_OP_INVALID; set_bit(SC_OP_INVALID, &sc->sc_flags);
sc->ps_idle = prev_idle; sc->ps_idle = prev_idle;
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
...@@ -915,11 +915,11 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, ...@@ -915,11 +915,11 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
/* Set op-mode & TSF */ /* Set op-mode & TSF */
if (iter_data.naps > 0) { if (iter_data.naps > 0) {
ath9k_hw_set_tsfadjust(ah, 1); ath9k_hw_set_tsfadjust(ah, 1);
sc->sc_flags |= SC_OP_TSF_RESET; set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
ah->opmode = NL80211_IFTYPE_AP; ah->opmode = NL80211_IFTYPE_AP;
} else { } else {
ath9k_hw_set_tsfadjust(ah, 0); ath9k_hw_set_tsfadjust(ah, 0);
sc->sc_flags &= ~SC_OP_TSF_RESET; clear_bit(SC_OP_TSF_RESET, &sc->sc_flags);
if (iter_data.nmeshes) if (iter_data.nmeshes)
ah->opmode = NL80211_IFTYPE_MESH_POINT; ah->opmode = NL80211_IFTYPE_MESH_POINT;
...@@ -950,12 +950,12 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw, ...@@ -950,12 +950,12 @@ static void ath9k_calculate_summary_state(struct ieee80211_hw *hw,
sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
if (!common->disable_ani) { if (!common->disable_ani) {
sc->sc_flags |= SC_OP_ANI_RUN; set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
ath_start_ani(common); ath_start_ani(common);
} }
} else { } else {
sc->sc_flags &= ~SC_OP_ANI_RUN; clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
del_timer_sync(&common->ani.timer); del_timer_sync(&common->ani.timer);
} }
} }
...@@ -1479,11 +1479,11 @@ static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ...@@ -1479,11 +1479,11 @@ static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
* Skip iteration if primary station vif's bss info * Skip iteration if primary station vif's bss info
* was not changed * was not changed
*/ */
if (sc->sc_flags & SC_OP_PRIM_STA_VIF) if (test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags))
return; return;
if (bss_conf->assoc) { if (bss_conf->assoc) {
sc->sc_flags |= SC_OP_PRIM_STA_VIF; set_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
avp->primary_sta_vif = true; avp->primary_sta_vif = true;
memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN); memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
common->curaid = bss_conf->aid; common->curaid = bss_conf->aid;
...@@ -1504,7 +1504,7 @@ static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif) ...@@ -1504,7 +1504,7 @@ static void ath9k_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
ath_start_rx_poll(sc, 3); ath_start_rx_poll(sc, 3);
if (!common->disable_ani) { if (!common->disable_ani) {
sc->sc_flags |= SC_OP_ANI_RUN; set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
ath_start_ani(common); ath_start_ani(common);
} }
...@@ -1524,7 +1524,8 @@ static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif) ...@@ -1524,7 +1524,8 @@ static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif)
if (avp->primary_sta_vif && !bss_conf->assoc) { if (avp->primary_sta_vif && !bss_conf->assoc) {
ath_dbg(common, CONFIG, "Bss Info DISASSOC %d, bssid %pM\n", ath_dbg(common, CONFIG, "Bss Info DISASSOC %d, bssid %pM\n",
common->curaid, common->curbssid); common->curaid, common->curbssid);
sc->sc_flags &= ~(SC_OP_PRIM_STA_VIF | SC_OP_BEACONS); clear_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags);
clear_bit(SC_OP_BEACONS, &sc->sc_flags);
avp->primary_sta_vif = false; avp->primary_sta_vif = false;
memset(common->curbssid, 0, ETH_ALEN); memset(common->curbssid, 0, ETH_ALEN);
common->curaid = 0; common->curaid = 0;
...@@ -1537,10 +1538,9 @@ static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif) ...@@ -1537,10 +1538,9 @@ static void ath9k_config_bss(struct ath_softc *sc, struct ieee80211_vif *vif)
* None of station vifs are associated. * None of station vifs are associated.
* Clear bssid & aid * Clear bssid & aid
*/ */
if (!(sc->sc_flags & SC_OP_PRIM_STA_VIF)) { if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
ath9k_hw_write_associd(sc->sc_ah); ath9k_hw_write_associd(sc->sc_ah);
/* Stop ANI */ clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
sc->sc_flags &= ~SC_OP_ANI_RUN;
del_timer_sync(&common->ani.timer); del_timer_sync(&common->ani.timer);
del_timer_sync(&sc->rx_poll_timer); del_timer_sync(&sc->rx_poll_timer);
memset(&sc->caldata, 0, sizeof(sc->caldata)); memset(&sc->caldata, 0, sizeof(sc->caldata));
...@@ -1578,12 +1578,12 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -1578,12 +1578,12 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER; sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
if (!common->disable_ani) { if (!common->disable_ani) {
sc->sc_flags |= SC_OP_ANI_RUN; set_bit(SC_OP_ANI_RUN, &sc->sc_flags);
ath_start_ani(common); ath_start_ani(common);
} }
} else { } else {
sc->sc_flags &= ~SC_OP_ANI_RUN; clear_bit(SC_OP_ANI_RUN, &sc->sc_flags);
del_timer_sync(&common->ani.timer); del_timer_sync(&common->ani.timer);
del_timer_sync(&sc->rx_poll_timer); del_timer_sync(&sc->rx_poll_timer);
} }
...@@ -1595,7 +1595,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -1595,7 +1595,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
*/ */
if ((changed & BSS_CHANGED_BEACON_INT) && if ((changed & BSS_CHANGED_BEACON_INT) &&
(vif->type == NL80211_IFTYPE_AP)) (vif->type == NL80211_IFTYPE_AP))
sc->sc_flags |= SC_OP_TSF_RESET; set_bit(SC_OP_TSF_RESET, &sc->sc_flags);
/* Configure beaconing (AP, IBSS, MESH) */ /* Configure beaconing (AP, IBSS, MESH) */
if (ath9k_uses_beacons(vif->type) && if (ath9k_uses_beacons(vif->type) &&
...@@ -1787,7 +1787,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop) ...@@ -1787,7 +1787,7 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
return; return;
} }
if (sc->sc_flags & SC_OP_INVALID) { if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
ath_dbg(common, ANY, "Device not present\n"); ath_dbg(common, ANY, "Device not present\n");
mutex_unlock(&sc->mutex); mutex_unlock(&sc->mutex);
return; return;
......
...@@ -251,7 +251,7 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -251,7 +251,7 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
sc->mem = mem; sc->mem = mem;
/* Will be cleared in ath9k_start() */ /* Will be cleared in ath9k_start() */
sc->sc_flags |= SC_OP_INVALID; set_bit(SC_OP_INVALID, &sc->sc_flags);
ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc); ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
if (ret) { if (ret) {
......
...@@ -285,8 +285,8 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) ...@@ -285,8 +285,8 @@ int ath_rx_init(struct ath_softc *sc, int nbufs)
int error = 0; int error = 0;
spin_lock_init(&sc->sc_pcu_lock); spin_lock_init(&sc->sc_pcu_lock);
sc->sc_flags &= ~SC_OP_RXFLUSH;
spin_lock_init(&sc->rx.rxbuflock); spin_lock_init(&sc->rx.rxbuflock);
clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);
common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 + common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 +
sc->sc_ah->caps.rx_status_len; sc->sc_ah->caps.rx_status_len;
...@@ -498,11 +498,11 @@ bool ath_stoprecv(struct ath_softc *sc) ...@@ -498,11 +498,11 @@ bool ath_stoprecv(struct ath_softc *sc)
void ath_flushrecv(struct ath_softc *sc) void ath_flushrecv(struct ath_softc *sc)
{ {
sc->sc_flags |= SC_OP_RXFLUSH; set_bit(SC_OP_RXFLUSH, &sc->sc_flags);
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)
ath_rx_tasklet(sc, 1, true); ath_rx_tasklet(sc, 1, true);
ath_rx_tasklet(sc, 1, false); ath_rx_tasklet(sc, 1, false);
sc->sc_flags &= ~SC_OP_RXFLUSH; clear_bit(SC_OP_RXFLUSH, &sc->sc_flags);
} }
static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
...@@ -1063,7 +1063,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) ...@@ -1063,7 +1063,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
do { do {
/* If handling rx interrupt and flush is in progress => exit */ /* If handling rx interrupt and flush is in progress => exit */
if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0))
break; break;
memset(&rs, 0, sizeof(rs)); memset(&rs, 0, sizeof(rs));
...@@ -1108,7 +1108,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) ...@@ -1108,7 +1108,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
* If we're asked to flush receive queue, directly * If we're asked to flush receive queue, directly
* chain it back at the queue without processing it. * chain it back at the queue without processing it.
*/ */
if (sc->sc_flags & SC_OP_RXFLUSH) { if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags)) {
RX_STAT_INC(rx_drop_rxflush); RX_STAT_INC(rx_drop_rxflush);
goto requeue_drop_frag; goto requeue_drop_frag;
} }
......
...@@ -1536,7 +1536,7 @@ bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) ...@@ -1536,7 +1536,7 @@ bool ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
int i; int i;
u32 npend = 0; u32 npend = 0;
if (sc->sc_flags & SC_OP_INVALID) if (test_bit(SC_OP_INVALID, &sc->sc_flags))
return true; return true;
ath9k_hw_abort_tx_dma(ah); ath9k_hw_abort_tx_dma(ah);
......
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