iaxwifi200 & idualwifi7260: Synchronize with OpenBSD.
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: if_iwx.c,v 1.176 2023/08/26 09:05:34 stsp Exp $ */
|
/* $OpenBSD: if_iwx.c,v 1.180 2023/12/30 16:55:44 stsp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
|
* Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
|
||||||
@@ -411,7 +411,6 @@ void iwx_tx_update_byte_tbl(struct iwx_softc *, struct iwx_tx_ring *, int,
|
|||||||
uint16_t, uint16_t);
|
uint16_t, uint16_t);
|
||||||
int iwx_tx(struct iwx_softc *, struct mbuf *, struct ieee80211_node *);
|
int iwx_tx(struct iwx_softc *, struct mbuf *, struct ieee80211_node *);
|
||||||
int iwx_flush_sta_tids(struct iwx_softc *, int, uint16_t);
|
int iwx_flush_sta_tids(struct iwx_softc *, int, uint16_t);
|
||||||
int iwx_wait_tx_queues_empty(struct iwx_softc *);
|
|
||||||
int iwx_drain_sta(struct iwx_softc *sc, struct iwx_node *, int);
|
int iwx_drain_sta(struct iwx_softc *sc, struct iwx_node *, int);
|
||||||
int iwx_flush_sta(struct iwx_softc *, struct iwx_node *);
|
int iwx_flush_sta(struct iwx_softc *, struct iwx_node *);
|
||||||
int iwx_beacon_filter_send_cmd(struct iwx_softc *,
|
int iwx_beacon_filter_send_cmd(struct iwx_softc *,
|
||||||
@@ -6408,10 +6407,7 @@ iwx_flush_sta_tids(struct iwx_softc *sc, int sta_id, uint16_t tids)
|
|||||||
}
|
}
|
||||||
|
|
||||||
resp_len = iwx_rx_packet_payload_len(pkt);
|
resp_len = iwx_rx_packet_payload_len(pkt);
|
||||||
/* Some firmware versions don't provide a response. */
|
if (resp_len != sizeof(*resp)) {
|
||||||
if (resp_len == 0)
|
|
||||||
goto out;
|
|
||||||
else if (resp_len != sizeof(*resp)) {
|
|
||||||
err = EIO;
|
err = EIO;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -6452,28 +6448,6 @@ out:
|
|||||||
|
|
||||||
#define IWX_FLUSH_WAIT_MS 2000
|
#define IWX_FLUSH_WAIT_MS 2000
|
||||||
|
|
||||||
int
|
|
||||||
iwx_wait_tx_queues_empty(struct iwx_softc *sc)
|
|
||||||
{
|
|
||||||
int i, err;
|
|
||||||
|
|
||||||
for (i = 0; i < nitems(sc->txq); i++) {
|
|
||||||
struct iwx_tx_ring *ring = &sc->txq[i];
|
|
||||||
|
|
||||||
if (i == IWX_DQA_CMD_QUEUE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
while (ring->queued > 0) {
|
|
||||||
err = tsleep_nsec(ring, 0, "iwxflush",
|
|
||||||
MSEC_TO_NSEC(IWX_FLUSH_WAIT_MS));
|
|
||||||
if (err)
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
iwx_drain_sta(struct iwx_softc *sc, struct iwx_node* in, int drain)
|
iwx_drain_sta(struct iwx_softc *sc, struct iwx_node* in, int drain)
|
||||||
{
|
{
|
||||||
@@ -6531,13 +6505,6 @@ iwx_flush_sta(struct iwx_softc *sc, struct iwx_node *in)
|
|||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = iwx_wait_tx_queues_empty(sc);
|
|
||||||
if (err) {
|
|
||||||
printf("%s: Could not empty Tx queues (error %d)\n",
|
|
||||||
DEVNAME(sc), err);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = iwx_drain_sta(sc, in, 0);
|
err = iwx_drain_sta(sc, in, 0);
|
||||||
done:
|
done:
|
||||||
sc->sc_flags &= ~IWX_FLAG_TXFLUSH;
|
sc->sc_flags &= ~IWX_FLAG_TXFLUSH;
|
||||||
@@ -6998,6 +6965,7 @@ iwx_fill_probe_req(struct iwx_softc *sc, struct iwx_scan_probe_req *preq)
|
|||||||
return ENOBUFS;
|
return ENOBUFS;
|
||||||
frm = ieee80211_add_vhtcaps(frm, ic);
|
frm = ieee80211_add_vhtcaps(frm, ic);
|
||||||
remain -= frm - pos;
|
remain -= frm - pos;
|
||||||
|
preq->band_data[1].len = htole16(frm - pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -10148,6 +10116,16 @@ iwx_rx_pkt(struct iwx_softc *sc, struct iwx_rx_data *data, struct mbuf_list *ml)
|
|||||||
case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, IWX_RLC_CONFIG_CMD):
|
case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, IWX_RLC_CONFIG_CMD):
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Ignore for now. The Linux driver only acts on this request
|
||||||
|
* with 160Mhz channels in 11ax mode.
|
||||||
|
*/
|
||||||
|
case IWX_WIDE_ID(IWX_DATA_PATH_GROUP,
|
||||||
|
IWX_THERMAL_DUAL_CHAIN_REQUEST):
|
||||||
|
DPRINTF(("%s: thermal dual-chain request received\n",
|
||||||
|
DEVNAME(sc)));
|
||||||
|
break;
|
||||||
|
|
||||||
/* undocumented notification from iwx-ty-a0-gf-a0-77 image */
|
/* undocumented notification from iwx-ty-a0-gf-a0-77 image */
|
||||||
case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, 0xf8):
|
case IWX_WIDE_ID(IWX_DATA_PATH_GROUP, 0xf8):
|
||||||
break;
|
break;
|
||||||
@@ -10775,7 +10753,7 @@ static const struct iwx_dev_info iwx_dev_info_table[] = {
|
|||||||
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
||||||
IWX_CFG_MAC_TYPE_SO, IWX_CFG_ANY,
|
IWX_CFG_MAC_TYPE_SO, IWX_CFG_ANY,
|
||||||
IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
|
IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
|
||||||
IWX_CFG_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
|
IWX_CFG_NO_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
|
||||||
iwx_cfg_so_a0_hr_b0), /* ax101 */
|
iwx_cfg_so_a0_hr_b0), /* ax101 */
|
||||||
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
||||||
IWX_CFG_MAC_TYPE_SO, IWX_CFG_ANY,
|
IWX_CFG_MAC_TYPE_SO, IWX_CFG_ANY,
|
||||||
@@ -10792,7 +10770,7 @@ static const struct iwx_dev_info iwx_dev_info_table[] = {
|
|||||||
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
||||||
IWX_CFG_MAC_TYPE_SOF, IWX_CFG_ANY,
|
IWX_CFG_MAC_TYPE_SOF, IWX_CFG_ANY,
|
||||||
IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
|
IWX_CFG_RF_TYPE_HR1, IWX_CFG_ANY,
|
||||||
IWX_CFG_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
|
IWX_CFG_NO_160, IWX_CFG_ANY, IWX_CFG_NO_CDB, IWX_CFG_ANY,
|
||||||
iwx_cfg_so_a0_hr_b0), /* AX101 */
|
iwx_cfg_so_a0_hr_b0), /* AX101 */
|
||||||
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
_IWX_DEV_INFO(IWX_CFG_ANY, IWX_CFG_ANY,
|
||||||
IWX_CFG_MAC_TYPE_SOF, IWX_CFG_ANY,
|
IWX_CFG_MAC_TYPE_SOF, IWX_CFG_ANY,
|
||||||
@@ -11431,6 +11409,7 @@ iwx_attach(struct device *parent, struct device *self, void *aux)
|
|||||||
/* Override 802.11 state transition machine. */
|
/* Override 802.11 state transition machine. */
|
||||||
sc->sc_newstate = ic->ic_newstate;
|
sc->sc_newstate = ic->ic_newstate;
|
||||||
ic->ic_newstate = iwx_newstate;
|
ic->ic_newstate = iwx_newstate;
|
||||||
|
ic->ic_updatechan = iwx_updatechan;
|
||||||
ic->ic_updateprot = iwx_updateprot;
|
ic->ic_updateprot = iwx_updateprot;
|
||||||
ic->ic_updateslot = iwx_updateslot;
|
ic->ic_updateslot = iwx_updateslot;
|
||||||
ic->ic_updateedca = iwx_updateedca;
|
ic->ic_updateedca = iwx_updateedca;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: if_iwxreg.h,v 1.51 2023/03/06 11:18:37 stsp Exp $ */
|
/* $OpenBSD: if_iwxreg.h,v 1.52 2023/10/06 15:15:41 stsp Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Based on BSD-licensed source modules in the Linux iwlwifi driver,
|
* Based on BSD-licensed source modules in the Linux iwlwifi driver,
|
||||||
@@ -2010,6 +2010,7 @@ struct iwx_tx_queue_cfg_rsp {
|
|||||||
#define IWX_RX_BAID_ALLOCATION_CONFIG_CMD 0x16
|
#define IWX_RX_BAID_ALLOCATION_CONFIG_CMD 0x16
|
||||||
#define IWX_SCD_QUEUE_CONFIG_CMD 0x17
|
#define IWX_SCD_QUEUE_CONFIG_CMD 0x17
|
||||||
#define IWX_RX_NO_DATA_NOTIF 0xf5
|
#define IWX_RX_NO_DATA_NOTIF 0xf5
|
||||||
|
#define IWX_THERMAL_DUAL_CHAIN_REQUEST 0xf6
|
||||||
#define IWX_TLC_MNG_UPDATE_NOTIF 0xf7
|
#define IWX_TLC_MNG_UPDATE_NOTIF 0xf7
|
||||||
|
|
||||||
/* REGULATORY_AND_NVM group subcommand IDs */
|
/* REGULATORY_AND_NVM group subcommand IDs */
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/* $OpenBSD: if_iwm.c,v 1.407 2023/04/14 12:45:10 stsp Exp $ */
|
/* $OpenBSD: if_iwm.c,v 1.413 2023/12/20 07:32:05 stsp Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
|
* Copyright (c) 2014, 2016 genua gmbh <info@genua.de>
|
||||||
@@ -6174,7 +6174,7 @@ uint8_t
|
|||||||
iwm_get_vht_ctrl_pos(struct ieee80211com *ic, struct ieee80211_channel *chan)
|
iwm_get_vht_ctrl_pos(struct ieee80211com *ic, struct ieee80211_channel *chan)
|
||||||
{
|
{
|
||||||
int center_idx = ic->ic_bss->ni_vht_chan_center_freq_idx0;
|
int center_idx = ic->ic_bss->ni_vht_chan_center_freq_idx0;
|
||||||
int primary_idx = ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan);
|
int primary_idx = ic->ic_bss->ni_primary_chan;
|
||||||
/*
|
/*
|
||||||
* The FW is expected to check the control channel position only
|
* The FW is expected to check the control channel position only
|
||||||
* when in HT/VHT and the channel width is not 20MHz. Return
|
* when in HT/VHT and the channel width is not 20MHz. Return
|
||||||
@@ -6754,7 +6754,12 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
|
|||||||
* client mode; the firmware's station table contains only one entry
|
* client mode; the firmware's station table contains only one entry
|
||||||
* which represents our access point.
|
* which represents our access point.
|
||||||
*/
|
*/
|
||||||
if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DQA_SUPPORT))
|
if (ic->ic_opmode == IEEE80211_M_MONITOR) {
|
||||||
|
if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DQA_SUPPORT))
|
||||||
|
qid = IWM_DQA_INJECT_MONITOR_QUEUE;
|
||||||
|
else
|
||||||
|
qid = IWM_AUX_QUEUE;
|
||||||
|
} else if (isset(sc->sc_enabled_capa, IWM_UCODE_TLV_CAPA_DQA_SUPPORT))
|
||||||
qid = IWM_DQA_MIN_MGMT_QUEUE + ac;
|
qid = IWM_DQA_MIN_MGMT_QUEUE + ac;
|
||||||
else
|
else
|
||||||
qid = ac;
|
qid = ac;
|
||||||
@@ -6826,7 +6831,8 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
|
|||||||
#endif
|
#endif
|
||||||
totlen = m->m_pkthdr.len;
|
totlen = m->m_pkthdr.len;
|
||||||
|
|
||||||
if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
|
if (ic->ic_opmode != IEEE80211_M_MONITOR &&
|
||||||
|
(wh->i_fc[1] & IEEE80211_FC1_PROTECTED)) {
|
||||||
k = ieee80211_get_txkey(ic, wh, ni);
|
k = ieee80211_get_txkey(ic, wh, ni);
|
||||||
if ((k->k_flags & IEEE80211_KEY_GROUP) ||
|
if ((k->k_flags & IEEE80211_KEY_GROUP) ||
|
||||||
(k->k_cipher != IEEE80211_CIPHER_CCMP)) {
|
(k->k_cipher != IEEE80211_CIPHER_CCMP)) {
|
||||||
@@ -6853,7 +6859,10 @@ iwm_tx(struct iwm_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
|
|||||||
(ic->ic_flags & IEEE80211_F_USEPROT)))
|
(ic->ic_flags & IEEE80211_F_USEPROT)))
|
||||||
flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
|
flags |= IWM_TX_CMD_FLG_PROT_REQUIRE;
|
||||||
|
|
||||||
tx->sta_id = IWM_STATION_ID;
|
if (ic->ic_opmode == IEEE80211_M_MONITOR)
|
||||||
|
tx->sta_id = IWM_MONITOR_STA_ID;
|
||||||
|
else
|
||||||
|
tx->sta_id = IWM_STATION_ID;
|
||||||
|
|
||||||
if (type == IEEE80211_FC0_TYPE_MGT) {
|
if (type == IEEE80211_FC0_TYPE_MGT) {
|
||||||
if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
|
if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
|
||||||
@@ -7715,6 +7724,7 @@ iwm_fill_probe_req(struct iwm_softc *sc, struct iwm_scan_probe_req *preq)
|
|||||||
return ENOBUFS;
|
return ENOBUFS;
|
||||||
frm = ieee80211_add_vhtcaps(frm, ic);
|
frm = ieee80211_add_vhtcaps(frm, ic);
|
||||||
remain -= frm - pos;
|
remain -= frm - pos;
|
||||||
|
preq->band_data[1].len = htole16(frm - pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -8594,7 +8604,7 @@ iwm_bgscan_done(struct ieee80211com *ic,
|
|||||||
free(sc->bgscan_unref_arg, M_DEVBUF, sc->bgscan_unref_arg_size);
|
free(sc->bgscan_unref_arg, M_DEVBUF, sc->bgscan_unref_arg_size);
|
||||||
sc->bgscan_unref_arg = arg;
|
sc->bgscan_unref_arg = arg;
|
||||||
sc->bgscan_unref_arg_size = arg_size;
|
sc->bgscan_unref_arg_size = arg_size;
|
||||||
iwm_add_task(sc, sc->sc_nswq, &sc->bgscan_done_task);
|
iwm_add_task(sc, systq, &sc->bgscan_done_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -9217,6 +9227,9 @@ iwm_delete_key(struct ieee80211com *ic, struct ieee80211_node *ni,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((sc->sc_flags & IWM_FLAG_STA_ACTIVE) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
if (!isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_TKIP_MIC_KEYS))
|
if (!isset(sc->sc_ucode_api, IWM_UCODE_TLV_API_TKIP_MIC_KEYS))
|
||||||
return iwm_delete_key_v1(ic, ni, k);
|
return iwm_delete_key_v1(ic, ni, k);
|
||||||
|
|
||||||
@@ -9302,8 +9315,17 @@ iwm_set_rate_table_vht(struct iwm_node *in, struct iwm_lq_cmd *lqcmd)
|
|||||||
if (i < 2 && in->in_phyctxt->vht_chan_width >=
|
if (i < 2 && in->in_phyctxt->vht_chan_width >=
|
||||||
IEEE80211_VHTOP0_CHAN_WIDTH_80)
|
IEEE80211_VHTOP0_CHAN_WIDTH_80)
|
||||||
tab |= IWM_RATE_MCS_CHAN_WIDTH_80;
|
tab |= IWM_RATE_MCS_CHAN_WIDTH_80;
|
||||||
else
|
else if (in->in_phyctxt->sco ==
|
||||||
|
IEEE80211_HTOP0_SCO_SCA ||
|
||||||
|
in->in_phyctxt->sco ==
|
||||||
|
IEEE80211_HTOP0_SCO_SCB)
|
||||||
tab |= IWM_RATE_MCS_CHAN_WIDTH_40;
|
tab |= IWM_RATE_MCS_CHAN_WIDTH_40;
|
||||||
|
else {
|
||||||
|
/* no 40 MHz, fall back on MCS 8 */
|
||||||
|
tab &= ~IWM_RATE_VHT_MCS_RATE_CODE_MSK;
|
||||||
|
tab |= 8;
|
||||||
|
}
|
||||||
|
|
||||||
tab |= IWM_RATE_MCS_RTS_REQUIRED_MSK;
|
tab |= IWM_RATE_MCS_RTS_REQUIRED_MSK;
|
||||||
if (i < 4) {
|
if (i < 4) {
|
||||||
if (ieee80211_ra_vht_use_sgi(ni))
|
if (ieee80211_ra_vht_use_sgi(ni))
|
||||||
|
|||||||
Reference in New Issue
Block a user