This removes unnecessary fluff from the AUX STA code and simplifies error handling around iwm_send_cmd_pdu_status() calls. While at it I spotted an uninitalized 'status' variable in iwm_add_int_sta_common() (note how iwm_send_cmd_pdu_status() won't always initialize *status).
Index: if_iwm.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v retrieving revision 1.131 diff -u -p -r1.131 if_iwm.c --- if_iwm.c 10 Sep 2016 10:00:41 -0000 1.131 +++ if_iwm.c 10 Sep 2016 10:55:01 -0000 @@ -387,8 +387,6 @@ int iwm_power_update_device(struct iwm_s 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, str 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, st 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 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, st 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 *s 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; Index: if_iwmvar.h =================================================================== RCS file: /cvs/src/sys/dev/pci/if_iwmvar.h,v retrieving revision 1.22 diff -u -p -r1.22 if_iwmvar.h --- if_iwmvar.h 10 Sep 2016 09:32:33 -0000 1.22 +++ if_iwmvar.h 10 Sep 2016 10:55:01 -0000 @@ -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; @@ -472,8 +467,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];