Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src-draft/trunk]: src/sys/dev/pci Iwm locking fixes.
details: https://anonhg.NetBSD.org/src-all/rev/5f9b9361b479
branches: trunk
changeset: 375675:5f9b9361b479
user: Nathanial Sloss <nat%netbsd.org@localhost>
date: Sun Jan 17 04:05:38 2021 +1100
description:
Iwm locking fixes.
Locking rework requred for some functions.
diffstat:
sys/dev/pci/if_iwm.c | 23 +++++++++++++----------
1 files changed, 13 insertions(+), 10 deletions(-)
diffs (113 lines):
diff -r 5564cf731130 -r 5f9b9361b479 sys/dev/pci/if_iwm.c
--- a/sys/dev/pci/if_iwm.c Sun Jan 17 04:03:52 2021 +1100
+++ b/sys/dev/pci/if_iwm.c Sun Jan 17 04:05:38 2021 +1100
@@ -2864,8 +2864,10 @@ iwm_ampdu_rx_start(struct ieee80211com *
struct iwm_softc *sc = ic->ic_softc;
IWM_LOCK(sc);
- if (sc->sc_rx_ba_sessions >= IWM_MAX_RX_BA_SESSIONS)
+ if (sc->sc_rx_ba_sessions >= IWM_MAX_RX_BA_SESSIONS) {
+ IWM_UNLOCK(sc);
return ENOSPC;
+ }
sc->ba_start = 1;
sc->ba_tid = tid;
@@ -4000,7 +4002,7 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
uint32_t rx_pkt_status;
int rssi;
- IWM_LOCK(sc);
+ IWM_ASSERT_LOCKED(sc);
bus_dmamap_sync(sc->sc_dmat, data->map, 0, IWM_RBUF_SIZE,
BUS_DMASYNC_POSTREAD);
@@ -4019,14 +4021,12 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
if (__predict_false(phy_info->cfg_phy_cnt > 20)) {
DPRINTF(("dsp size out of range [0,20]: %d\n",
phy_info->cfg_phy_cnt));
- IWM_UNLOCK(sc);
return;
}
if (!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_CRC_OK) ||
!(rx_pkt_status & IWM_RX_MPDU_RES_STATUS_OVERRUN_OK)) {
DPRINTF(("Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status));
- IWM_UNLOCK(sc);
return; /* drop */
}
@@ -4043,7 +4043,6 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
#endif
if (iwm_rx_addbuf(sc, IWM_RBUF_SIZE, sc->rxq.cur) != 0) {
- IWM_UNLOCK(sc);
return;
}
@@ -4094,7 +4093,6 @@ iwm_rx_rx_mpdu(struct iwm_softc *sc, str
bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m, BPF_D_IN);
}
- IWM_UNLOCK(sc);
ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
if (c)
@@ -6101,7 +6099,7 @@ iwm_newassoc(struct ieee80211_node *ni,
IWM_LOCK(sc);
(void)iwm_add_sta_cmd(sc, in, 1);
- IWM_ASSERT_LOCKED(sc);
+ IWM_UNLOCK(sc);
return;
}
@@ -6290,8 +6288,11 @@ iwm_newstate(struct ieee80211vap *vap, e
DPRINTF(("switching state %s->%s\n", ieee80211_state_name[ostate],
ieee80211_state_name[nstate]));
- if (ostate == IEEE80211_S_SCAN && nstate != ostate)
+ if (ostate == IEEE80211_S_SCAN && nstate != ostate) {
+ IWM_LOCK(sc);
iwm_led_blink_stop(sc);
+ IWM_UNLOCK(sc);
+ }
if (ostate == IEEE80211_S_RUN && nstate != ostate)
iwm_disable_beacon_filter(sc);
@@ -6339,7 +6340,9 @@ iwm_newstate(struct ieee80211vap *vap, e
return err;
}
SET(sc->sc_flags, IWM_FLAG_SCANNING);
+ IWM_LOCK(sc);
iwm_led_blink_start(sc);
+ IWM_UNLOCK(sc);
break;
case IEEE80211_S_AUTH:
@@ -6740,13 +6743,13 @@ iwm_init_hw(struct iwm_softc *sc)
/* Restart, this time with the regular firmware */
err = iwm_load_ucode_wait_alive(sc, IWM_UCODE_TYPE_REGULAR);
+ IWM_LOCK(sc);
if (err) {
aprint_error_dev(sc->sc_dev,
"could not load firmware (error %d)\n", err);
return err;
}
- IWM_LOCK(sc);
err = iwm_send_bt_init_conf(sc);
if (err) {
aprint_error_dev(sc->sc_dev,
@@ -7685,9 +7688,9 @@ iwm_softintr(void *arg)
aprint_error_dev(sc->sc_dev, "fatal firmware error\n");
fatal:
- iwm_stop(sc);
/* Don't restore interrupt mask */
IWM_UNLOCK(sc);
+ iwm_stop(sc);
return;
}
Home |
Main Index |
Thread Index |
Old Index