diff options
author | 2016-09-12 10:18:26 +0000 | |
---|---|---|
committer | 2016-09-12 10:18:26 +0000 | |
commit | 9b983274474c470db6e20d5244ae6c60f2f87335 (patch) | |
tree | 42ac556317172e01ebfff072bc0fe93afac3d1de | |
parent | Define for HUP_WACOM, missed in previous. (diff) | |
download | wireguard-openbsd-9b983274474c470db6e20d5244ae6c60f2f87335.tar.xz wireguard-openbsd-9b983274474c470db6e20d5244ae6c60f2f87335.zip |
Simplify handling of the AUX STA in iwm(4). There is no good reason for
storing AUX STA data in the softc. Also, simplify error handling around
iwm_send_cmd_pdu_status(), and inline its iwm_add_int_sta_common() helper
along with fixing an uninitialized 'status' output parameter.
-rw-r--r-- | sys/dev/pci/if_iwm.c | 93 | ||||
-rw-r--r-- | sys/dev/pci/if_iwmvar.h | 9 |
2 files changed, 24 insertions, 78 deletions
diff --git a/sys/dev/pci/if_iwm.c b/sys/dev/pci/if_iwm.c index 7dbc122a2c2..5e3c68c4c40 100644 --- a/sys/dev/pci/if_iwm.c +++ b/sys/dev/pci/if_iwm.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwm.c,v 1.131 2016/09/10 10:00:41 stsp Exp $ */ +/* $OpenBSD: if_iwm.c,v 1.132 2016/09/12 10:18:26 stsp Exp $ */ /* * Copyright (c) 2014, 2016 genua gmbh <info@genua.de> @@ -387,8 +387,6 @@ int iwm_power_update_device(struct iwm_softc *); int iwm_enable_beacon_filter(struct iwm_softc *, struct iwm_node *); int iwm_disable_beacon_filter(struct iwm_softc *); int iwm_add_sta_cmd(struct iwm_softc *, struct iwm_node *, int); -int iwm_add_int_sta_common(struct iwm_softc *, struct iwm_int_sta *, - const uint8_t *, uint16_t, uint16_t); int iwm_add_aux_sta(struct iwm_softc *); uint16_t iwm_scan_rx_chain(struct iwm_softc *); uint32_t iwm_scan_max_out_time(struct iwm_softc *, uint32_t, int); @@ -2406,26 +2404,18 @@ iwm_sta_rx_agg(struct iwm_softc *sc, struct ieee80211_node *ni, uint8_t tid, IWM_STA_MODIFY_REMOVE_BA_TID; status = IWM_ADD_STA_SUCCESS; - err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, - sizeof(cmd), &cmd, &status); + err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(cmd), &cmd, + &status); if (err) return; - switch (status) { - case IWM_ADD_STA_SUCCESS: + if (status == IWM_ADD_STA_SUCCESS) { s = splnet(); if (start) sc->sc_rx_ba_sessions++; else if (sc->sc_rx_ba_sessions > 0) sc->sc_rx_ba_sessions--; splx(s); - break; - case IWM_ADD_STA_IMMEDIATE_BA_FAILURE: - err = EIO; - break; - default: - err = EIO; - break; } } @@ -3471,10 +3461,7 @@ iwm_binding_cmd(struct iwm_softc *sc, struct iwm_node *in, uint32_t action) status = 0; err = iwm_send_cmd_pdu_status(sc, IWM_BINDING_CONTEXT_CMD, sizeof(cmd), &cmd, &status); - if (err) - return err; - - if (status) + if (err == 0 && status != 0) err = EIO; return err; @@ -3998,7 +3985,7 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac) if (IEEE80211_IS_MULTICAST(wh->i_addr1) || type != IEEE80211_FC0_TYPE_DATA) - tx->sta_id = sc->sc_aux_sta.sta_id; + tx->sta_id = IWM_AUX_STA_ID; else tx->sta_id = IWM_STATION_ID; @@ -4370,70 +4357,36 @@ iwm_add_sta_cmd(struct iwm_softc *sc, struct iwm_node *in, int update) status = IWM_ADD_STA_SUCCESS; err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(add_sta_cmd), &add_sta_cmd, &status); - if (err) - return err; - - switch (status) { - case IWM_ADD_STA_SUCCESS: - break; - default: + if (err == 0 && status != IWM_ADD_STA_SUCCESS) err = EIO; - break; - } return err; } int -iwm_add_int_sta_common(struct iwm_softc *sc, struct iwm_int_sta *sta, - const uint8_t *addr, uint16_t mac_id, uint16_t color) +iwm_add_aux_sta(struct iwm_softc *sc) { struct iwm_add_sta_cmd_v7 cmd; int err; uint32_t status; - memset(&cmd, 0, sizeof(cmd)); - cmd.sta_id = sta->sta_id; - cmd.mac_id_n_color = htole32(IWM_FW_CMD_ID_AND_COLOR(mac_id, color)); - - cmd.tfd_queue_msk = htole32(sta->tfd_queue_msk); - cmd.tid_disable_tx = htole16(0xffff); - - if (addr) - memcpy(cmd.addr, addr, ETHER_ADDR_LEN); - - err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, - sizeof(cmd), &cmd, &status); - if (err) - return err; - - switch (status) { - case IWM_ADD_STA_SUCCESS: - return 0; - default: - err = EIO; - break; - } - return err; -} - -int -iwm_add_aux_sta(struct iwm_softc *sc) -{ - int err; - - sc->sc_aux_sta.sta_id = IWM_AUX_STA_ID; - sc->sc_aux_sta.tfd_queue_msk = (1 << IWM_AUX_QUEUE); - err = iwm_enable_txq(sc, 0, IWM_AUX_QUEUE, IWM_TX_FIFO_MCAST); if (err) return err; - err = iwm_add_int_sta_common(sc, - &sc->sc_aux_sta, NULL, IWM_MAC_INDEX_AUX, 0); + memset(&cmd, 0, sizeof(cmd)); + cmd.sta_id = IWM_AUX_STA_ID; + cmd.mac_id_n_color = + htole32(IWM_FW_CMD_ID_AND_COLOR(IWM_MAC_INDEX_AUX, 0)); + cmd.tfd_queue_msk = htole32(1 << IWM_AUX_QUEUE); + cmd.tid_disable_tx = htole16(0xffff); + + status = IWM_ADD_STA_SUCCESS; + err = iwm_send_cmd_pdu_status(sc, IWM_ADD_STA, sizeof(cmd), &cmd, + &status); + if (err == 0 && status != IWM_ADD_STA_SUCCESS) + err = EIO; - if (err) - memset(&sc->sc_aux_sta, 0, sizeof(sc->sc_aux_sta)); return err; } @@ -4738,14 +4691,14 @@ iwm_lmac_scan(struct iwm_softc *sc) IWM_TX_CMD_FLG_BT_DIS); req->tx_cmd[0].rate_n_flags = iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_2GHZ, 1/*XXX*/); - req->tx_cmd[0].sta_id = sc->sc_aux_sta.sta_id; + req->tx_cmd[0].sta_id = IWM_AUX_STA_ID; /* Tx flags 5 GHz. */ req->tx_cmd[1].tx_flags = htole32(IWM_TX_CMD_FLG_SEQ_CTL | IWM_TX_CMD_FLG_BT_DIS); req->tx_cmd[1].rate_n_flags = iwm_scan_rate_n_flags(sc, IEEE80211_CHAN_5GHZ, 1/*XXX*/); - req->tx_cmd[1].sta_id = sc->sc_aux_sta.sta_id; + req->tx_cmd[1].sta_id = IWM_AUX_STA_ID; /* Check if we're doing an active directed scan. */ if (ic->ic_des_esslen != 0) { @@ -4822,7 +4775,7 @@ iwm_config_umac_scan(struct iwm_softc *sc) IEEE80211_ADDR_COPY(scan_config->mac_addr, sc->sc_ic.ic_myaddr); - scan_config->bcast_sta_id = sc->sc_aux_sta.sta_id; + scan_config->bcast_sta_id = IWM_AUX_STA_ID; scan_config->channel_flags = IWM_CHANNEL_FLAG_EBS | IWM_CHANNEL_FLAG_ACCURATE_EBS | IWM_CHANNEL_FLAG_EBS_ADD | IWM_CHANNEL_FLAG_PRE_SCAN_PASSIVE2ACTIVE; diff --git a/sys/dev/pci/if_iwmvar.h b/sys/dev/pci/if_iwmvar.h index 89bdd5f825f..4273254a4c3 100644 --- a/sys/dev/pci/if_iwmvar.h +++ b/sys/dev/pci/if_iwmvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_iwmvar.h,v 1.22 2016/09/10 09:32:33 stsp Exp $ */ +/* $OpenBSD: if_iwmvar.h,v 1.23 2016/09/12 10:18:26 stsp Exp $ */ /* * Copyright (c) 2014 genua mbh <info@genua.de> @@ -331,11 +331,6 @@ struct iwm_phy_db { struct iwm_phy_db_entry calib_ch_group_txp[IWM_NUM_TXP_CH_GROUPS]; }; -struct iwm_int_sta { - uint32_t sta_id; - uint32_t tfd_queue_msk; -}; - struct iwm_phy_ctxt { uint16_t id; uint16_t color; @@ -473,8 +468,6 @@ struct iwm_softc { struct iwm_rx_phy_info sc_last_phy_info; int sc_ampdu_ref; - struct iwm_int_sta sc_aux_sta; - /* phy contexts. we only use the first one */ struct iwm_phy_ctxt sc_phyctxt[IWM_NUM_PHY_CTX]; |