mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-17 10:26:09 +00:00
Various updates:
* rtw88: operation, locking, warning, and code style fixes * rtw89: small updates * cfg80211/mac80211: more EHT/MLO (802.11be, WiFi 7) work * brcmfmac: a couple of fixes * misc cleanups etc. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAmMInmcACgkQB8qZga/f l8RKWw//bigvsgOiM+EnJ22+KzBIdI2FiGv0O7edO/RYjRNlv7C1hkNI6HwLVZTA U458HhGY7Y7odujPQrm9cHuTyeQ5DOLX4y/JItW3U4jTnZjKZNbrLvg5BU/1zJC0 yAWZuGs0+Hy4JdzSii9KSwIWFf6yFWPLpRD20nYuauAcEkbTftphuGH3glshUpqP N5ypDDRevJbvF6rGWHS8M0a5wcwPyyw1nDlyaytqn4IkNwhWxJO095tqls7QZkFh oOZQNk0oMqmhZTQzyq3/sl9SvEe3Er/pD+iIGkfw2mq1tiUI4CYu92ADrxqeUFmb s9KbLYppSFQxhISFqo7GdVIAg2WaZdrUsf2qXKoAWDl+n5iiug2GMDroW7CQw/cG eFkNDcw5aRz1LYkxA7HkVBkXOBpH17bfAt8BI969mTWwEzuNCH+z9egaOKtyy7MV 6b8+BWNC56WK+dvTaFH1x4+xnY0KIOEKjvkDMVBuVNi/mp0Of3y/Vj+zy2LfntwQ T+oJVC4TrkCvI2Lc2tLW+pQdoy61DjPHmVQwoM4jdTdOsL+a7aWgEql3kLJsdEP4 BEK1IcriPch3Q860PDG2Z5wRYw+bSf37Y6hOQgo2ARrIhAAPzMlvKwgdeipatnSk 5mWgVO6Y6Ejd/snAkgIdQyifkWmtwbPSUL6Mj5dtOJR+Q0QLzRw= =J5Fc -----END PGP SIGNATURE----- Merge tag 'wireless-next-2022-08-26-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next Johannes berg says: ==================== Various updates: * rtw88: operation, locking, warning, and code style fixes * rtw89: small updates * cfg80211/mac80211: more EHT/MLO (802.11be, WiFi 7) work * brcmfmac: a couple of fixes * misc cleanups etc. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
643952f3ec
@ -20,8 +20,6 @@ properties:
|
||||
|
||||
reg: true
|
||||
|
||||
spi-max-frequency: true
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
@ -51,7 +49,10 @@ required:
|
||||
- compatible
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
@ -29,12 +29,6 @@ description: >
|
||||
Documentation/devicetree/bindings/mmc/mmc-pwrseq-simple.yaml for more
|
||||
information.
|
||||
|
||||
For SPI:
|
||||
|
||||
In add of the properties below, please consult
|
||||
Documentation/devicetree/bindings/spi/spi-controller.yaml for optional SPI
|
||||
related properties.
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
@ -52,8 +46,6 @@ properties:
|
||||
bindings.
|
||||
maxItems: 1
|
||||
|
||||
spi-max-frequency: true
|
||||
|
||||
interrupts:
|
||||
description: The interrupt line. Should be IRQ_TYPE_EDGE_RISING. When SPI is
|
||||
used, this property is required. When SDIO is used, the "in-band"
|
||||
@ -84,12 +76,15 @@ properties:
|
||||
|
||||
mac-address: true
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
@ -36,8 +36,6 @@ properties:
|
||||
This is required when connected via SPI, and optional when connected via
|
||||
SDIO.
|
||||
|
||||
spi-max-frequency: true
|
||||
|
||||
interrupts:
|
||||
minItems: 1
|
||||
maxItems: 2
|
||||
@ -69,20 +67,22 @@ required:
|
||||
- compatible
|
||||
- interrupts
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,wl1271
|
||||
- ti,wl1273
|
||||
- ti,wl1281
|
||||
- ti,wl1283
|
||||
then:
|
||||
required:
|
||||
- ref-clock-frequency
|
||||
allOf:
|
||||
- $ref: /schemas/spi/spi-peripheral-props.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- ti,wl1271
|
||||
- ti,wl1273
|
||||
- ti,wl1281
|
||||
- ti,wl1283
|
||||
then:
|
||||
required:
|
||||
- ref-clock-frequency
|
||||
|
||||
additionalProperties: false
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
|
@ -1124,7 +1124,7 @@ void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
{
|
||||
@ -1249,7 +1249,7 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct ath6kl *ar = ath6kl_priv(ndev);
|
||||
@ -1279,7 +1279,7 @@ static int ath6kl_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback) (void *cookie,
|
||||
struct key_params *))
|
||||
@ -1314,7 +1314,7 @@ static int ath6kl_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct net_device *ndev, int link_id,
|
||||
u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
|
@ -1620,7 +1620,7 @@ static void wil_del_rx_key(u8 key_index, enum wmi_key_usage key_usage,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_add_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct net_device *ndev, int link_id,
|
||||
u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
@ -1696,7 +1696,7 @@ static int wil_cfg80211_add_key(struct wiphy *wiphy,
|
||||
}
|
||||
|
||||
static int wil_cfg80211_del_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct net_device *ndev, int link_id,
|
||||
u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
@ -1723,7 +1723,7 @@ static int wil_cfg80211_del_key(struct wiphy *wiphy,
|
||||
|
||||
/* Need to be present or wiphy_new() will WARN */
|
||||
static int wil_cfg80211_set_default_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev,
|
||||
struct net_device *ndev, int link_id,
|
||||
u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
@ -2072,8 +2072,8 @@ void wil_cfg80211_ap_recovery(struct wil6210_priv *wil)
|
||||
key_params.key = vif->gtk;
|
||||
key_params.key_len = vif->gtk_len;
|
||||
key_params.seq_len = IEEE80211_GCMP_PN_LEN;
|
||||
rc = wil_cfg80211_add_key(wiphy, ndev, vif->gtk_index, false,
|
||||
NULL, &key_params);
|
||||
rc = wil_cfg80211_add_key(wiphy, ndev, -1, vif->gtk_index,
|
||||
false, NULL, &key_params);
|
||||
if (rc)
|
||||
wil_err(wil, "vif %d recovery add key failed (%d)\n",
|
||||
i, rc);
|
||||
|
@ -368,8 +368,7 @@ brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
|
||||
|
||||
/* await txstatus signal for firmware if active */
|
||||
if (brcmf_fws_fc_active(bcdc->fws)) {
|
||||
if (!success)
|
||||
brcmf_fws_bustxfail(bcdc->fws, txp);
|
||||
brcmf_fws_bustxcomplete(bcdc->fws, txp, success);
|
||||
} else {
|
||||
if (brcmf_proto_bcdc_hdrpull(bus_if->drvr, false, txp, &ifp))
|
||||
brcmu_pkt_buf_free_skb(txp);
|
||||
|
@ -2361,7 +2361,8 @@ done:
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_config_default_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_idx, bool unicast, bool multicast)
|
||||
int link_id, u8 key_idx, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_pub *drvr = ifp->drvr;
|
||||
@ -2395,7 +2396,8 @@ done:
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
struct brcmf_wsec_key *key;
|
||||
@ -2432,8 +2434,8 @@ brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
@ -2457,8 +2459,8 @@ brcmf_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
if (params->key_len == 0)
|
||||
return brcmf_cfg80211_del_key(wiphy, ndev, key_idx, pairwise,
|
||||
mac_addr);
|
||||
return brcmf_cfg80211_del_key(wiphy, ndev, -1, key_idx,
|
||||
pairwise, mac_addr);
|
||||
|
||||
if (params->key_len > sizeof(key->data)) {
|
||||
bphy_err(drvr, "Too long key length (%u)\n", params->key_len);
|
||||
@ -2553,8 +2555,9 @@ done:
|
||||
}
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev, u8 key_idx,
|
||||
bool pairwise, const u8 *mac_addr, void *cookie,
|
||||
brcmf_cfg80211_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
struct key_params *params))
|
||||
{
|
||||
@ -2610,7 +2613,8 @@ done:
|
||||
|
||||
static s32
|
||||
brcmf_cfg80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev, u8 key_idx)
|
||||
struct net_device *ndev, int link_id,
|
||||
u8 key_idx)
|
||||
{
|
||||
struct brcmf_if *ifp = netdev_priv(ndev);
|
||||
|
||||
@ -6431,6 +6435,7 @@ static void wl_deinit_priv(struct brcmf_cfg80211_info *cfg)
|
||||
cfg->dongle_up = false; /* dongle down */
|
||||
brcmf_abort_scanning(cfg);
|
||||
brcmf_deinit_priv_mem(cfg);
|
||||
brcmf_clear_assoc_ies(cfg);
|
||||
}
|
||||
|
||||
static void init_vif_event(struct brcmf_cfg80211_vif_event *event)
|
||||
|
@ -1480,8 +1480,10 @@ int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp)
|
||||
!brcmf_get_pend_8021x_cnt(ifp),
|
||||
MAX_WAIT_FOR_8021X_TX);
|
||||
|
||||
if (!err)
|
||||
if (!err) {
|
||||
bphy_err(drvr, "Timed out waiting for no pending 802.1x packets\n");
|
||||
atomic_set(&ifp->pend_8021x_cnt, 0);
|
||||
}
|
||||
|
||||
return !err;
|
||||
}
|
||||
|
@ -419,7 +419,6 @@ void brcmf_flowring_configure_addr_mode(struct brcmf_flowring *flow, int ifidx,
|
||||
flowid = flow->hash[i].flowid;
|
||||
if (flow->rings[flowid]->status != RING_OPEN)
|
||||
continue;
|
||||
flow->rings[flowid]->status = RING_CLOSING;
|
||||
brcmf_msgbuf_delete_flowring(drvr, flowid);
|
||||
}
|
||||
}
|
||||
@ -458,10 +457,8 @@ void brcmf_flowring_delete_peer(struct brcmf_flowring *flow, int ifidx,
|
||||
if ((sta || (memcmp(hash[i].mac, peer, ETH_ALEN) == 0)) &&
|
||||
(hash[i].ifidx == ifidx)) {
|
||||
flowid = flow->hash[i].flowid;
|
||||
if (flow->rings[flowid]->status == RING_OPEN) {
|
||||
flow->rings[flowid]->status = RING_CLOSING;
|
||||
if (flow->rings[flowid]->status == RING_OPEN)
|
||||
brcmf_msgbuf_delete_flowring(drvr, flowid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2475,7 +2475,8 @@ bool brcmf_fws_fc_active(struct brcmf_fws_info *fws)
|
||||
return fws->fcmode != BRCMF_FWS_FCMODE_NONE;
|
||||
}
|
||||
|
||||
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
|
||||
void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
|
||||
bool success)
|
||||
{
|
||||
u32 hslot;
|
||||
|
||||
@ -2483,11 +2484,14 @@ void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb)
|
||||
brcmu_pkt_buf_free_skb(skb);
|
||||
return;
|
||||
}
|
||||
brcmf_fws_lock(fws);
|
||||
hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
|
||||
brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot, 0, 0,
|
||||
1);
|
||||
brcmf_fws_unlock(fws);
|
||||
|
||||
if (!success) {
|
||||
brcmf_fws_lock(fws);
|
||||
hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT);
|
||||
brcmf_fws_txs_process(fws, BRCMF_FWS_TXSTATUS_HOST_TOSSED, hslot,
|
||||
0, 0, 1);
|
||||
brcmf_fws_unlock(fws);
|
||||
}
|
||||
}
|
||||
|
||||
void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked)
|
||||
|
@ -40,7 +40,8 @@ int brcmf_fws_process_skb(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
void brcmf_fws_reset_interface(struct brcmf_if *ifp);
|
||||
void brcmf_fws_add_interface(struct brcmf_if *ifp);
|
||||
void brcmf_fws_del_interface(struct brcmf_if *ifp);
|
||||
void brcmf_fws_bustxfail(struct brcmf_fws_info *fws, struct sk_buff *skb);
|
||||
void brcmf_fws_bustxcomplete(struct brcmf_fws_info *fws, struct sk_buff *skb,
|
||||
bool success);
|
||||
void brcmf_fws_bus_blocked(struct brcmf_pub *drvr, bool flow_blocked);
|
||||
void brcmf_fws_rxreorder(struct brcmf_if *ifp, struct sk_buff *skb);
|
||||
|
||||
|
@ -71,6 +71,7 @@
|
||||
#define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS 32
|
||||
#define BRCMF_MSGBUF_UPDATE_RX_PTR_THRS 48
|
||||
|
||||
#define BRCMF_MAX_TXSTATUS_WAIT_RETRIES 10
|
||||
|
||||
struct msgbuf_common_hdr {
|
||||
u8 msgtype;
|
||||
@ -806,8 +807,12 @@ static int brcmf_msgbuf_tx_queue_data(struct brcmf_pub *drvr, int ifidx,
|
||||
flowid = brcmf_flowring_lookup(flow, eh->h_dest, skb->priority, ifidx);
|
||||
if (flowid == BRCMF_FLOWRING_INVALID_ID) {
|
||||
flowid = brcmf_msgbuf_flowring_create(msgbuf, ifidx, skb);
|
||||
if (flowid == BRCMF_FLOWRING_INVALID_ID)
|
||||
if (flowid == BRCMF_FLOWRING_INVALID_ID) {
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
brcmf_flowring_enqueue(flow, flowid, skb);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
queue_count = brcmf_flowring_enqueue(flow, flowid, skb);
|
||||
force = ((queue_count % BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS) == 0);
|
||||
@ -1395,9 +1400,27 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
|
||||
struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
|
||||
struct msgbuf_tx_flowring_delete_req *delete;
|
||||
struct brcmf_commonring *commonring;
|
||||
struct brcmf_commonring *commonring_del = msgbuf->flowrings[flowid];
|
||||
struct brcmf_flowring *flow = msgbuf->flow;
|
||||
void *ret_ptr;
|
||||
u8 ifidx;
|
||||
int err;
|
||||
int retry = BRCMF_MAX_TXSTATUS_WAIT_RETRIES;
|
||||
|
||||
/* make sure it is not in txflow */
|
||||
brcmf_commonring_lock(commonring_del);
|
||||
flow->rings[flowid]->status = RING_CLOSING;
|
||||
brcmf_commonring_unlock(commonring_del);
|
||||
|
||||
/* wait for commonring txflow finished */
|
||||
while (retry && atomic_read(&commonring_del->outstanding_tx)) {
|
||||
usleep_range(5000, 10000);
|
||||
retry--;
|
||||
}
|
||||
if (!retry) {
|
||||
brcmf_err("timed out waiting for txstatus\n");
|
||||
atomic_set(&commonring_del->outstanding_tx, 0);
|
||||
}
|
||||
|
||||
/* no need to submit if firmware can not be reached */
|
||||
if (drvr->bus_if->state != BRCMF_BUS_UP) {
|
||||
|
@ -158,12 +158,12 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
|
||||
struct brcmf_pno_macaddr_le pfn_mac;
|
||||
u8 *mac_addr = NULL;
|
||||
u8 *mac_mask = NULL;
|
||||
int err, i;
|
||||
int err, i, ri;
|
||||
|
||||
for (i = 0; i < pi->n_reqs; i++)
|
||||
if (pi->reqs[i]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
||||
mac_addr = pi->reqs[i]->mac_addr;
|
||||
mac_mask = pi->reqs[i]->mac_addr_mask;
|
||||
for (ri = 0; ri < pi->n_reqs; ri++)
|
||||
if (pi->reqs[ri]->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
|
||||
mac_addr = pi->reqs[ri]->mac_addr;
|
||||
mac_mask = pi->reqs[ri]->mac_addr_mask;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -185,7 +185,7 @@ static int brcmf_pno_set_random(struct brcmf_if *ifp, struct brcmf_pno_info *pi)
|
||||
pfn_mac.mac[0] |= 0x02;
|
||||
|
||||
brcmf_dbg(SCAN, "enabling random mac: reqid=%llu mac=%pM\n",
|
||||
pi->reqs[i]->reqid, pfn_mac.mac);
|
||||
pi->reqs[ri]->reqid, pfn_mac.mac);
|
||||
err = brcmf_fil_iovar_data_set(ifp, "pfn_macaddr", &pfn_mac,
|
||||
sizeof(pfn_mac));
|
||||
if (err)
|
||||
|
@ -123,7 +123,7 @@
|
||||
*/
|
||||
|
||||
/********************************************************************
|
||||
* Phy/Core Configuration. Defines macros to to check core phy/rev *
|
||||
* Phy/Core Configuration. Defines macros to check core phy/rev *
|
||||
* compile-time configuration. Defines default core support. *
|
||||
* ******************************************************************
|
||||
*/
|
||||
|
@ -2995,10 +2995,15 @@ static int mac80211_hwsim_change_vif_links(struct ieee80211_hw *hw,
|
||||
u16 old_links, u16 new_links,
|
||||
struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS])
|
||||
{
|
||||
unsigned long rem = old_links & ~new_links ?: BIT(0);
|
||||
unsigned long rem = old_links & ~new_links;
|
||||
unsigned long add = new_links & ~old_links;
|
||||
int i;
|
||||
|
||||
if (!old_links)
|
||||
rem |= BIT(0);
|
||||
if (!new_links)
|
||||
add |= BIT(0);
|
||||
|
||||
for_each_set_bit(i, &rem, IEEE80211_MLD_MAX_NUM_LINKS)
|
||||
mac80211_hwsim_config_mac_nl(hw, old[i]->addr, false);
|
||||
|
||||
@ -3208,8 +3213,112 @@ out_err:
|
||||
|
||||
static const struct ieee80211_sband_iftype_data sband_capa_2ghz[] = {
|
||||
{
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_160 = cpu_to_le16(0xffff),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xffff),
|
||||
},
|
||||
},
|
||||
.eht_cap = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
|
||||
IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
|
||||
IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE,
|
||||
.phy_cap_info[3] =
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
|
||||
.phy_cap_info[4] =
|
||||
IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI |
|
||||
IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK,
|
||||
.phy_cap_info[5] =
|
||||
IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT |
|
||||
IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK |
|
||||
IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK,
|
||||
.phy_cap_info[6] =
|
||||
IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK |
|
||||
IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK,
|
||||
.phy_cap_info[7] =
|
||||
IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW,
|
||||
},
|
||||
|
||||
/* For all MCS and bandwidth, set 8 NSS for both Tx and
|
||||
* Rx
|
||||
*/
|
||||
.eht_mcs_nss_supp = {
|
||||
/*
|
||||
* Since B0, B1, B2 and B3 are not set in
|
||||
* the supported channel width set field in the
|
||||
* HE PHY capabilities information field the
|
||||
* device is a 20MHz only device on 2.4GHz band.
|
||||
*/
|
||||
.only_20mhz = {
|
||||
.rx_tx_mcs7_max_nss = 0x88,
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
},
|
||||
/* PPE threshold information is not supported */
|
||||
},
|
||||
},
|
||||
{
|
||||
.types_mask = BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
@ -3356,9 +3465,132 @@ static const struct ieee80211_sband_iftype_data sband_capa_2ghz[] = {
|
||||
|
||||
static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
|
||||
{
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
/* TODO: should we support other types, e.g., P2P? */
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
},
|
||||
},
|
||||
.eht_cap = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
|
||||
IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
|
||||
IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE |
|
||||
IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK,
|
||||
.phy_cap_info[3] =
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
|
||||
.phy_cap_info[4] =
|
||||
IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI |
|
||||
IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK,
|
||||
.phy_cap_info[5] =
|
||||
IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT |
|
||||
IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK |
|
||||
IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK,
|
||||
.phy_cap_info[6] =
|
||||
IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK |
|
||||
IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK,
|
||||
.phy_cap_info[7] =
|
||||
IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ,
|
||||
},
|
||||
|
||||
/* For all MCS and bandwidth, set 8 NSS for both Tx and
|
||||
* Rx
|
||||
*/
|
||||
.eht_mcs_nss_supp = {
|
||||
/*
|
||||
* As B1 and B2 are set in the supported
|
||||
* channel width set field in the HE PHY
|
||||
* capabilities information field include all
|
||||
* the following MCS/NSS.
|
||||
*/
|
||||
.bw._80 = {
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
.bw._160 = {
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
},
|
||||
/* PPE threshold information is not supported */
|
||||
},
|
||||
},
|
||||
{
|
||||
.types_mask = BIT(NL80211_IFTYPE_AP),
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
@ -3529,9 +3761,153 @@ static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
|
||||
|
||||
static const struct ieee80211_sband_iftype_data sband_capa_6ghz[] = {
|
||||
{
|
||||
/* TODO: should we support other types, e.g., P2P?*/
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP),
|
||||
/* TODO: should we support other types, e.g., P2P? */
|
||||
.types_mask = BIT(NL80211_IFTYPE_STATION),
|
||||
.he_6ghz_capa = {
|
||||
.capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
|
||||
IEEE80211_HE_6GHZ_CAP_SM_PS |
|
||||
IEEE80211_HE_6GHZ_CAP_RD_RESPONDER |
|
||||
IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
|
||||
IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS),
|
||||
},
|
||||
.he_cap = {
|
||||
.has_he = true,
|
||||
.he_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_HE_MAC_CAP0_HTC_HE,
|
||||
.mac_cap_info[1] =
|
||||
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
|
||||
IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
|
||||
.mac_cap_info[2] =
|
||||
IEEE80211_HE_MAC_CAP2_BSR |
|
||||
IEEE80211_HE_MAC_CAP2_MU_CASCADING |
|
||||
IEEE80211_HE_MAC_CAP2_ACK_EN,
|
||||
.mac_cap_info[3] =
|
||||
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
|
||||
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
|
||||
.mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
|
||||
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
|
||||
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
|
||||
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
|
||||
IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
|
||||
IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
|
||||
|
||||
/* Leave all the other PHY capability bytes
|
||||
* unset, as DCM, beam forming, RU and PPE
|
||||
* threshold information are not supported
|
||||
*/
|
||||
},
|
||||
.he_mcs_nss_supp = {
|
||||
.rx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_160 = cpu_to_le16(0xfffa),
|
||||
.rx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
.tx_mcs_80p80 = cpu_to_le16(0xfffa),
|
||||
},
|
||||
},
|
||||
.eht_cap = {
|
||||
.has_eht = true,
|
||||
.eht_cap_elem = {
|
||||
.mac_cap_info[0] =
|
||||
IEEE80211_EHT_MAC_CAP0_EPCS_PRIO_ACCESS |
|
||||
IEEE80211_EHT_MAC_CAP0_OM_CONTROL |
|
||||
IEEE80211_EHT_MAC_CAP0_TRIG_TXOP_SHARING_MODE1,
|
||||
.phy_cap_info[0] =
|
||||
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ |
|
||||
IEEE80211_EHT_PHY_CAP0_242_TONE_RU_GT20MHZ |
|
||||
IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
|
||||
IEEE80211_EHT_PHY_CAP0_PARTIAL_BW_UL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
|
||||
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE |
|
||||
IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK,
|
||||
.phy_cap_info[1] =
|
||||
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK,
|
||||
.phy_cap_info[2] =
|
||||
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK |
|
||||
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK,
|
||||
.phy_cap_info[3] =
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
|
||||
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK,
|
||||
.phy_cap_info[4] =
|
||||
IEEE80211_EHT_PHY_CAP4_PART_BW_DL_MU_MIMO |
|
||||
IEEE80211_EHT_PHY_CAP4_PSR_SR_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_POWER_BOOST_FACT_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP4_EHT_MU_PPDU_4_EHT_LTF_08_GI |
|
||||
IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK,
|
||||
.phy_cap_info[5] =
|
||||
IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
|
||||
IEEE80211_EHT_PHY_CAP5_TX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_RX_LESS_242_TONE_RU_SUPP |
|
||||
IEEE80211_EHT_PHY_CAP5_PPE_THRESHOLD_PRESENT |
|
||||
IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK |
|
||||
IEEE80211_EHT_PHY_CAP5_MAX_NUM_SUPP_EHT_LTF_MASK,
|
||||
.phy_cap_info[6] =
|
||||
IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK |
|
||||
IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK |
|
||||
IEEE80211_EHT_PHY_CAP6_EHT_DUP_6GHZ_SUPP,
|
||||
.phy_cap_info[7] =
|
||||
IEEE80211_EHT_PHY_CAP7_20MHZ_STA_RX_NDP_WIDER_BW |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
|
||||
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ,
|
||||
},
|
||||
|
||||
/* For all MCS and bandwidth, set 8 NSS for both Tx and
|
||||
* Rx
|
||||
*/
|
||||
.eht_mcs_nss_supp = {
|
||||
/*
|
||||
* As B1 and B2 are set in the supported
|
||||
* channel width set field in the HE PHY
|
||||
* capabilities information field and 320MHz in
|
||||
* 6GHz is supported include all the following
|
||||
* MCS/NSS.
|
||||
*/
|
||||
.bw._80 = {
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
.bw._160 = {
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
.bw._320 = {
|
||||
.rx_tx_mcs9_max_nss = 0x88,
|
||||
.rx_tx_mcs11_max_nss = 0x88,
|
||||
.rx_tx_mcs13_max_nss = 0x88,
|
||||
},
|
||||
},
|
||||
/* PPE threshold information is not supported */
|
||||
},
|
||||
},
|
||||
{
|
||||
.types_mask = BIT(NL80211_IFTYPE_AP),
|
||||
.he_6ghz_capa = {
|
||||
.capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
|
||||
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
|
||||
|
@ -1435,7 +1435,7 @@ static int lbs_cfg_disconnect(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int lbs_cfg_set_default_key(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
@ -1455,8 +1455,8 @@ static int lbs_cfg_set_default_key(struct wiphy *wiphy,
|
||||
|
||||
|
||||
static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 idx, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct lbs_private *priv = wiphy_priv(wiphy);
|
||||
u16 key_info;
|
||||
@ -1516,7 +1516,8 @@ static int lbs_cfg_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
|
||||
|
||||
static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
|
||||
lbs_deb_assoc("del_key: key_idx %d, mac_addr %pM\n",
|
||||
|
@ -142,7 +142,8 @@ static void *mwifiex_cfg80211_get_adapter(struct wiphy *wiphy)
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
static const u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
|
||||
@ -431,7 +432,7 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool unicast,
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
@ -456,8 +457,8 @@ mwifiex_cfg80211_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
*/
|
||||
static int
|
||||
mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
struct mwifiex_wep_key *wep_key;
|
||||
@ -494,6 +495,7 @@ mwifiex_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
static int
|
||||
mwifiex_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
int link_id,
|
||||
u8 key_index)
|
||||
{
|
||||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(netdev);
|
||||
|
@ -540,8 +540,9 @@ static int wilc_wfi_cfg_copy_wpa_info(struct wilc_wfi_key *key_info,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int add_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr, struct key_params *params)
|
||||
static int add_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
|
||||
{
|
||||
int ret = 0, keylen = params->key_len;
|
||||
@ -644,7 +645,7 @@ static int add_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
static int del_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index,
|
||||
bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
@ -685,8 +686,9 @@ static int del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr, void *cookie,
|
||||
static int get_key(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params *))
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
@ -723,13 +725,14 @@ static int get_key(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
|
||||
/* wiphy_new_nm() will WARNON if not present */
|
||||
static int set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool unicast, bool multicast)
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_default_mgmt_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index)
|
||||
int link_id, u8 key_index)
|
||||
{
|
||||
struct wilc_vif *vif = netdev_priv(netdev);
|
||||
|
||||
|
@ -532,8 +532,8 @@ qtnf_dump_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
int ret;
|
||||
@ -548,7 +548,8 @@ static int qtnf_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int qtnf_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
int ret;
|
||||
@ -569,7 +570,8 @@ static int qtnf_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int qtnf_set_default_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool unicast, bool multicast)
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
int ret;
|
||||
@ -585,7 +587,7 @@ static int qtnf_set_default_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
static int
|
||||
qtnf_set_default_mgmt_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index)
|
||||
int link_id, u8 key_index)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(dev);
|
||||
int ret;
|
||||
@ -721,9 +723,8 @@ qtnf_disconnect(struct wiphy *wiphy, struct net_device *dev,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (vif->wdev.iftype != NL80211_IFTYPE_STATION) {
|
||||
if (vif->wdev.iftype != NL80211_IFTYPE_STATION)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
ret = qtnf_cmd_send_disconnect(vif, reason_code);
|
||||
if (ret)
|
||||
@ -750,7 +751,6 @@ qtnf_dump_survey(struct wiphy *wiphy, struct net_device *dev,
|
||||
struct ieee80211_channel *chan;
|
||||
int ret;
|
||||
|
||||
|
||||
sband = wiphy->bands[NL80211_BAND_2GHZ];
|
||||
if (sband && idx >= sband->n_channels) {
|
||||
idx -= sband->n_channels;
|
||||
|
@ -2386,11 +2386,10 @@ void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
|
||||
rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
|
||||
"Just Read IQK Matrix reg for channel:%d....\n",
|
||||
channel);
|
||||
_rtl92d_phy_patha_fill_iqk_matrix(hw, true,
|
||||
rtlphy->iqk_matrix[
|
||||
indexforchannel].value, 0,
|
||||
(rtlphy->iqk_matrix[
|
||||
indexforchannel].value[0][2] == 0));
|
||||
if (rtlphy->iqk_matrix[indexforchannel].value[0][0] != 0)
|
||||
_rtl92d_phy_patha_fill_iqk_matrix(hw, true,
|
||||
rtlphy->iqk_matrix[indexforchannel].value, 0,
|
||||
rtlphy->iqk_matrix[indexforchannel].value[0][2] == 0);
|
||||
if (IS_92D_SINGLEPHY(rtlhal->version)) {
|
||||
if ((rtlphy->iqk_matrix[
|
||||
indexforchannel].value[0][4] != 0)
|
||||
|
@ -30,11 +30,11 @@ void rtw_bf_disassoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_bss_conf *bss_conf)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
||||
struct rtw_bfee *bfee = &rtwvif->bfee;
|
||||
struct rtw_bf_info *bfinfo = &rtwdev->bf_info;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_sta *sta;
|
||||
struct ieee80211_sta_vht_cap *vht_cap;
|
||||
struct ieee80211_sta_vht_cap *ic_vht_cap;
|
||||
|
@ -13,7 +13,7 @@
|
||||
static u8 rtw_coex_next_rssi_state(struct rtw_dev *rtwdev, u8 pre_state,
|
||||
u8 rssi, u8 rssi_thresh)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 tol = chip->rssi_tolerance;
|
||||
u8 next_state;
|
||||
|
||||
@ -36,7 +36,7 @@ static u8 rtw_coex_next_rssi_state(struct rtw_dev *rtwdev, u8 pre_state,
|
||||
static void rtw_coex_limited_tx(struct rtw_dev *rtwdev,
|
||||
bool tx_limit_en, bool ampdu_limit_en)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 num_of_active_port = 1;
|
||||
@ -365,7 +365,7 @@ static void rtw_coex_set_wl_pri_mask(struct rtw_dev *rtwdev, u8 bitmap,
|
||||
|
||||
void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u16 val = 0x2;
|
||||
@ -400,7 +400,7 @@ EXPORT_SYMBOL(rtw_coex_write_scbd);
|
||||
|
||||
static u16 rtw_coex_read_scbd(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!chip->scbd_support)
|
||||
return 0;
|
||||
@ -410,7 +410,7 @@ static u16 rtw_coex_read_scbd(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_check_rfk(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_rfe *coex_rfe = &coex->rfe;
|
||||
@ -489,7 +489,7 @@ static void rtw_coex_monitor_bt_ctr(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_monitor_bt_enable(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
@ -524,10 +524,10 @@ static void rtw_coex_monitor_bt_enable(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_update_wl_link_info(struct rtw_dev *rtwdev, u8 reason)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_traffic_stats *stats = &rtwdev->stats;
|
||||
bool is_5G = false;
|
||||
bool wl_busy = false;
|
||||
@ -706,10 +706,10 @@ static const char *rtw_coex_get_bt_status_string(u8 bt_status)
|
||||
|
||||
static void rtw_coex_update_bt_link_info(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 i;
|
||||
u8 rssi_state;
|
||||
u8 rssi_step;
|
||||
@ -806,7 +806,7 @@ static void rtw_coex_update_bt_link_info(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_update_wl_ch_info(struct rtw_dev *rtwdev, u8 type)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_coex_dm *coex_dm = &rtwdev->coex.dm;
|
||||
struct rtw_coex_stat *coex_stat = &rtwdev->coex.stat;
|
||||
@ -933,7 +933,7 @@ EXPORT_SYMBOL(rtw_coex_write_indirect_reg);
|
||||
|
||||
static void rtw_coex_coex_ctrl_owner(struct rtw_dev *rtwdev, bool wifi_control)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_hw_reg *btg_reg = chip->btg_reg;
|
||||
|
||||
if (wifi_control) {
|
||||
@ -981,7 +981,7 @@ static void rtw_coex_mimo_ps(struct rtw_dev *rtwdev, bool force, bool state)
|
||||
static void rtw_btc_wltoggle_table_a(struct rtw_dev *rtwdev, bool force,
|
||||
u8 table_case)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
u8 h2c_para[6] = {0};
|
||||
u32 table_wl = 0x5a5a5a5a;
|
||||
@ -1065,9 +1065,9 @@ static void rtw_coex_set_table(struct rtw_dev *rtwdev, bool force, u32 table0,
|
||||
|
||||
static void rtw_coex_table(struct rtw_dev *rtwdev, bool force, u8 type)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
|
||||
@ -1135,9 +1135,9 @@ static void rtw_coex_power_save_state(struct rtw_dev *rtwdev, u8 ps_type,
|
||||
static void rtw_coex_set_tdma(struct rtw_dev *rtwdev, u8 byte1, u8 byte2,
|
||||
u8 byte3, u8 byte4, u8 byte5)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 ps_type = COEX_PS_WIFI_NATIVE;
|
||||
bool ap_enable = false;
|
||||
@ -1193,10 +1193,10 @@ static void rtw_coex_set_tdma(struct rtw_dev *rtwdev, u8 byte1, u8 byte2,
|
||||
|
||||
static void rtw_coex_tdma(struct rtw_dev *rtwdev, bool force, u32 tcase)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
u8 n, type;
|
||||
bool turn_on;
|
||||
@ -1526,8 +1526,8 @@ static u8 rtw_coex_algorithm(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_coex_all_off(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -1549,11 +1549,11 @@ static void rtw_coex_action_coex_all_off(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_freerun(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 level = 0;
|
||||
bool bt_afh_loss = true;
|
||||
|
||||
@ -1594,8 +1594,8 @@ static void rtw_coex_action_freerun(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_rf4ce(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -1619,8 +1619,8 @@ static void rtw_coex_action_rf4ce(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_whql_test(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -1644,10 +1644,10 @@ static void rtw_coex_action_bt_whql_test(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_relink(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
u32 slot_type = 0;
|
||||
|
||||
@ -1684,11 +1684,11 @@ static void rtw_coex_action_bt_relink(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_idle(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_rfe *coex_rfe = &coex->rfe;
|
||||
u8 table_case = 0xff, tdma_case = 0xff;
|
||||
|
||||
@ -1753,10 +1753,10 @@ exit:
|
||||
|
||||
static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
bool wl_hi_pri = false;
|
||||
u8 table_case, tdma_case;
|
||||
u32 slot_type = 0;
|
||||
@ -1853,11 +1853,11 @@ static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_game_hid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -1901,10 +1901,10 @@ static void rtw_coex_action_bt_game_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -1932,10 +1932,10 @@ static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_hid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
u32 slot_type = 0;
|
||||
bool bt_multi_link_remain = false, is_toggle_table = false;
|
||||
@ -2015,11 +2015,11 @@ static void rtw_coex_action_bt_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_a2dp(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
u32 slot_type = 0;
|
||||
|
||||
@ -2057,10 +2057,10 @@ static void rtw_coex_action_bt_a2dp(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_a2dpsink(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
bool ap_enable = false;
|
||||
|
||||
@ -2096,10 +2096,10 @@ static void rtw_coex_action_bt_a2dpsink(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_pan(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -2133,11 +2133,11 @@ static void rtw_coex_action_bt_pan(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_a2dp_hid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case, interval = 0;
|
||||
u32 slot_type = 0;
|
||||
bool is_toggle_table = false;
|
||||
@ -2190,10 +2190,10 @@ static void rtw_coex_action_bt_a2dp_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_a2dp_pan(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
bool wl_cpt_test = false, bt_cpt_test = false;
|
||||
|
||||
@ -2247,10 +2247,10 @@ static void rtw_coex_action_bt_a2dp_pan(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_pan_hid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -2282,10 +2282,10 @@ static void rtw_coex_action_bt_pan_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_bt_a2dp_pan_hid(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -2316,9 +2316,9 @@ static void rtw_coex_action_bt_a2dp_pan_hid(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_under5g(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
@ -2348,8 +2348,8 @@ static void rtw_coex_action_wl_under5g(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_only(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -2372,9 +2372,9 @@ static void rtw_coex_action_wl_only(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
@ -2411,10 +2411,10 @@ static void rtw_coex_action_wl_native_lps(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_linkscan(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
u32 slot_type = 0;
|
||||
|
||||
@ -2451,8 +2451,8 @@ static void rtw_coex_action_wl_linkscan(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_action_wl_not_connected(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 table_case, tdma_case;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], %s()\n", __func__);
|
||||
@ -2528,8 +2528,8 @@ static void rtw_coex_action_wl_connected(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_coex_run_coex(struct rtw_dev *rtwdev, u8 reason)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
bool rf4ce_en = false;
|
||||
@ -3002,9 +3002,9 @@ void rtw_coex_media_status_notify(struct rtw_dev *rtwdev, u8 type)
|
||||
|
||||
void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
u32 bt_relink_time;
|
||||
u8 i, rsp_source = 0, type;
|
||||
@ -3270,8 +3270,8 @@ static const u8 coex_bt_hidinfo_xb[] = {0x58, 0x62, 0x6f};
|
||||
|
||||
void rtw_coex_bt_hid_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_hid *hidinfo;
|
||||
struct rtw_coex_hid_info_a *hida;
|
||||
@ -3360,8 +3360,8 @@ void rtw_coex_bt_hid_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
|
||||
|
||||
void rtw_coex_query_bt_hid_list(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_hid *hidinfo;
|
||||
u8 i, handle;
|
||||
@ -3582,7 +3582,7 @@ static const char *rtw_coex_get_reason_string(u8 reason)
|
||||
static u8 rtw_coex_get_table_index(struct rtw_dev *rtwdev, u32 wl_reg_6c0,
|
||||
u32 wl_reg_6c4)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
u8 ans = 0xFF;
|
||||
u8 n, i;
|
||||
@ -3618,8 +3618,8 @@ static u8 rtw_coex_get_table_index(struct rtw_dev *rtwdev, u32 wl_reg_6c0,
|
||||
|
||||
static u8 rtw_coex_get_tdma_index(struct rtw_dev *rtwdev, u8 *tdma_para)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 ans = 0xFF;
|
||||
u8 n, i, j;
|
||||
u8 load_cur_tab_val;
|
||||
@ -3736,7 +3736,7 @@ static int rtw_coex_val_info(struct rtw_dev *rtwdev,
|
||||
|
||||
static void rtw_coex_set_coexinfo_hw(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_reg_domain *reg;
|
||||
char addr_info[INFO_SIZE];
|
||||
int n_addr = 0;
|
||||
@ -3910,7 +3910,7 @@ static const char *rtw_coex_get_wl_coex_mode(u8 coex_wl_link_mode)
|
||||
|
||||
void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
|
@ -327,7 +327,7 @@ struct coex_rf_para {
|
||||
|
||||
static inline void rtw_coex_set_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_init(rtwdev);
|
||||
}
|
||||
@ -335,7 +335,7 @@ static inline void rtw_coex_set_init(struct rtw_dev *rtwdev)
|
||||
static inline
|
||||
void rtw_coex_set_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, u8 pos_type)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!chip->ops->coex_set_ant_switch)
|
||||
return;
|
||||
@ -345,28 +345,28 @@ void rtw_coex_set_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, u8 pos_type)
|
||||
|
||||
static inline void rtw_coex_set_gnt_fix(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_gnt_fix(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw_coex_set_gnt_debug(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_gnt_debug(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw_coex_set_rfe_type(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_rfe_type(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw_coex_set_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_wl_tx_power(rtwdev, wl_pwr);
|
||||
}
|
||||
@ -374,7 +374,7 @@ static inline void rtw_coex_set_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
|
||||
static inline
|
||||
void rtw_coex_set_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->coex_set_wl_rx_gain(rtwdev, low_gain);
|
||||
}
|
||||
|
@ -621,11 +621,13 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u8 path, rate;
|
||||
u8 path, rate, bw, ch, regd;
|
||||
struct rtw_power_params pwr_param = {0};
|
||||
u8 bw = hal->current_band_width;
|
||||
u8 ch = hal->current_channel;
|
||||
u8 regd = rtw_regd_get(rtwdev);
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
bw = hal->current_band_width;
|
||||
ch = hal->current_channel;
|
||||
regd = rtw_regd_get(rtwdev);
|
||||
|
||||
seq_printf(m, "channel: %u\n", ch);
|
||||
seq_printf(m, "bandwidth: %u\n", bw);
|
||||
@ -667,6 +669,7 @@ static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
|
||||
}
|
||||
|
||||
mutex_unlock(&hal->tx_power_mutex);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ static int rtw_dump_logical_efuse_map(struct rtw_dev *rtwdev, u8 *phy_map,
|
||||
|
||||
static int rtw_dump_physical_efuse_map(struct rtw_dev *rtwdev, u8 *map)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 size = rtwdev->efuse.physical_size;
|
||||
u32 efuse_ctl;
|
||||
u32 addr;
|
||||
@ -145,7 +145,7 @@ EXPORT_SYMBOL(rtw_read8_physical_efuse);
|
||||
|
||||
int rtw_parse_efuse_map(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
u32 phy_size = efuse->physical_size;
|
||||
u32 log_size = efuse->logical_size;
|
||||
|
@ -14,6 +14,8 @@
|
||||
#include "util.h"
|
||||
#include "wow.h"
|
||||
#include "ps.h"
|
||||
#include "phy.h"
|
||||
#include "mac.h"
|
||||
|
||||
static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev,
|
||||
struct sk_buff *skb)
|
||||
@ -904,7 +906,7 @@ void rtw_send_rsvd_page_h2c(struct rtw_dev *rtwdev)
|
||||
static struct sk_buff *rtw_nlo_info_get(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req;
|
||||
struct rtw_nlo_info_hdr *nlo_hdr;
|
||||
struct cfg80211_ssid *ssid;
|
||||
@ -959,7 +961,7 @@ static struct sk_buff *rtw_nlo_info_get(struct ieee80211_hw *hw)
|
||||
static struct sk_buff *rtw_cs_channel_info_get(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_pno_request *pno_req = &rtwdev->wow.pno_req;
|
||||
struct ieee80211_channel *channels = pno_req->channels;
|
||||
struct sk_buff *skb;
|
||||
@ -993,7 +995,7 @@ static struct sk_buff *rtw_cs_channel_info_get(struct ieee80211_hw *hw)
|
||||
static struct sk_buff *rtw_lps_pg_dpk_get(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
|
||||
struct rtw_lps_pg_dpk_hdr *dpk_hdr;
|
||||
struct sk_buff *skb;
|
||||
@ -1018,7 +1020,7 @@ static struct sk_buff *rtw_lps_pg_dpk_get(struct ieee80211_hw *hw)
|
||||
static struct sk_buff *rtw_lps_pg_info_get(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_lps_conf *conf = &rtwdev->lps_conf;
|
||||
struct rtw_lps_pg_info_hdr *pg_info_hdr;
|
||||
struct rtw_wow_param *rtw_wow = &rtwdev->wow;
|
||||
@ -1122,7 +1124,7 @@ static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
enum rtw_rsvd_packet_type type)
|
||||
{
|
||||
struct rtw_tx_pkt_info pkt_info = {0};
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 *pkt_desc;
|
||||
|
||||
rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type);
|
||||
@ -1433,7 +1435,7 @@ static int __rtw_build_rsvd_page_from_vifs(struct rtw_dev *rtwdev)
|
||||
static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size)
|
||||
{
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *iter;
|
||||
struct rtw_rsvd_page *rsvd_pkt;
|
||||
u32 page = 0;
|
||||
@ -1647,7 +1649,7 @@ out:
|
||||
static void rtw_fw_read_fifo(struct rtw_dev *rtwdev, enum rtw_fw_fifo_sel sel,
|
||||
u32 offset, u32 size, u32 *buf)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 start_pg, residue;
|
||||
|
||||
if (sel >= RTW_FW_FIFO_MAX) {
|
||||
@ -1706,7 +1708,7 @@ int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size,
|
||||
static void __rtw_fw_update_pkt(struct rtw_dev *rtwdev, u8 pkt_id, u16 size,
|
||||
u8 location)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
|
||||
u16 total_size = H2C_PKT_HDR_SIZE + H2C_PKT_UPDATE_PKT_LEN;
|
||||
|
||||
@ -1818,8 +1820,8 @@ static int rtw_append_probe_req_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
struct sk_buff_head *list, u8 *bands,
|
||||
struct rtw_vif *rtwvif)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_scan_ies *ies = rtwvif->scan_ies;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *new;
|
||||
u8 idx;
|
||||
|
||||
@ -1841,16 +1843,23 @@ static int rtw_append_probe_req_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
struct sk_buff_head *probe_req_list)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb, *tmp;
|
||||
u8 page_offset = 1, *buf, page_size = chip->page_size;
|
||||
u8 pages = page_offset + num_probes * RTW_PROBE_PG_CNT;
|
||||
u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
|
||||
u16 buf_offset = page_size * page_offset;
|
||||
u8 tx_desc_sz = chip->tx_pkt_desc_sz;
|
||||
u8 page_cnt, pages;
|
||||
unsigned int pkt_len;
|
||||
int ret;
|
||||
|
||||
if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
||||
page_cnt = RTW_OLD_PROBE_PG_CNT;
|
||||
else
|
||||
page_cnt = RTW_PROBE_PG_CNT;
|
||||
|
||||
pages = page_offset + num_probes * page_cnt;
|
||||
|
||||
buf = kzalloc(page_size * pages, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
@ -1859,7 +1868,7 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
skb_queue_walk_safe(probe_req_list, skb, tmp) {
|
||||
skb_unlink(skb, probe_req_list);
|
||||
rtw_fill_rsvd_page_desc(rtwdev, skb, RSVD_PROBE_REQ);
|
||||
if (skb->len > page_size * RTW_PROBE_PG_CNT) {
|
||||
if (skb->len > page_size * page_cnt) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
@ -1869,8 +1878,8 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
loc = pg_addr - rtwdev->fifo.rsvd_boundary + page_offset;
|
||||
__rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, pkt_len, loc);
|
||||
|
||||
buf_offset += RTW_PROBE_PG_CNT * page_size;
|
||||
page_offset += RTW_PROBE_PG_CNT;
|
||||
buf_offset += page_cnt * page_size;
|
||||
page_offset += page_cnt;
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
@ -2048,6 +2057,9 @@ void rtw_hw_scan_start(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
rtwvif->scan_req = req;
|
||||
|
||||
ieee80211_stop_queues(rtwdev->hw);
|
||||
rtw_leave_lps_deep(rtwdev);
|
||||
rtw_hci_flush_all_queues(rtwdev, false);
|
||||
rtw_mac_flush_all_queues(rtwdev, false);
|
||||
if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR)
|
||||
get_random_mask_addr(mac_addr, req->mac_addr,
|
||||
req->mac_addr_mask);
|
||||
@ -2080,10 +2092,9 @@ void rtw_hw_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
rtw_core_scan_complete(rtwdev, vif, true);
|
||||
|
||||
rtwvif = (struct rtw_vif *)vif->drv_priv;
|
||||
if (rtwvif->net_type == RTW_NET_MGD_LINKED) {
|
||||
hal->current_channel = chan;
|
||||
hal->current_band_type = chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
}
|
||||
if (chan)
|
||||
rtw_store_op_chan(rtwdev, false);
|
||||
rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
|
||||
ieee80211_wake_queues(rtwdev->hw);
|
||||
ieee80211_scan_completed(rtwdev->hw, &info);
|
||||
|
||||
@ -2124,6 +2135,7 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
bool enable)
|
||||
{
|
||||
struct rtw_vif *rtwvif = vif ? (struct rtw_vif *)vif->drv_priv : NULL;
|
||||
struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
|
||||
struct rtw_ch_switch_option cs_option = {0};
|
||||
struct rtw_chan_list chan_list = {0};
|
||||
int ret = 0;
|
||||
@ -2132,7 +2144,7 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
return -EINVAL;
|
||||
|
||||
cs_option.switch_en = enable;
|
||||
cs_option.back_op_en = rtwvif->net_type == RTW_NET_MGD_LINKED;
|
||||
cs_option.back_op_en = scan_info->op_chan != 0;
|
||||
if (enable) {
|
||||
ret = rtw_hw_scan_prehandle(rtwdev, rtwvif, &chan_list);
|
||||
if (ret)
|
||||
@ -2171,14 +2183,33 @@ void rtw_hw_scan_status_report(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
rtw_dbg(rtwdev, RTW_DBG_HW_SCAN, "HW scan aborted with code: %d\n", rc);
|
||||
}
|
||||
|
||||
void rtw_store_op_chan(struct rtw_dev *rtwdev)
|
||||
void rtw_store_op_chan(struct rtw_dev *rtwdev, bool backup)
|
||||
{
|
||||
struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u8 band;
|
||||
|
||||
scan_info->op_chan = hal->current_channel;
|
||||
scan_info->op_bw = hal->current_band_width;
|
||||
scan_info->op_pri_ch_idx = hal->current_primary_channel_index;
|
||||
if (backup) {
|
||||
scan_info->op_chan = hal->current_channel;
|
||||
scan_info->op_bw = hal->current_band_width;
|
||||
scan_info->op_pri_ch_idx = hal->current_primary_channel_index;
|
||||
scan_info->op_pri_ch = hal->primary_channel;
|
||||
} else {
|
||||
band = scan_info->op_chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
rtw_update_channel(rtwdev, scan_info->op_chan,
|
||||
scan_info->op_pri_ch,
|
||||
band, scan_info->op_bw);
|
||||
}
|
||||
}
|
||||
|
||||
void rtw_clear_op_chan(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_hw_scan_info *scan_info = &rtwdev->scan_info;
|
||||
|
||||
scan_info->op_chan = 0;
|
||||
scan_info->op_bw = 0;
|
||||
scan_info->op_pri_ch_idx = 0;
|
||||
scan_info->op_pri_ch = 0;
|
||||
}
|
||||
|
||||
static bool rtw_is_op_chan(struct rtw_dev *rtwdev, u8 channel)
|
||||
@ -2193,7 +2224,7 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_c2h_cmd *c2h;
|
||||
enum rtw_scan_notify_id id;
|
||||
u8 chan, status;
|
||||
u8 chan, band, status;
|
||||
|
||||
if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
|
||||
return;
|
||||
@ -2204,10 +2235,13 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
status = GET_CHAN_SWITCH_STATUS(c2h->payload);
|
||||
|
||||
if (id == RTW_SCAN_NOTIFY_ID_POSTSWITCH) {
|
||||
if (rtw_is_op_chan(rtwdev, chan))
|
||||
band = chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
rtw_update_channel(rtwdev, chan, chan, band,
|
||||
RTW_CHANNEL_WIDTH_20);
|
||||
if (rtw_is_op_chan(rtwdev, chan)) {
|
||||
rtw_store_op_chan(rtwdev, false);
|
||||
ieee80211_wake_queues(rtwdev->hw);
|
||||
hal->current_channel = chan;
|
||||
hal->current_band_type = chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
}
|
||||
} else if (id == RTW_SCAN_NOTIFY_ID_PRESWITCH) {
|
||||
if (IS_CH_5G_BAND(chan)) {
|
||||
rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_5G);
|
||||
@ -2220,7 +2254,12 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
chan_type = COEX_SWITCH_TO_24G_NOFORSCAN;
|
||||
rtw_coex_switchband_notify(rtwdev, chan_type);
|
||||
}
|
||||
if (rtw_is_op_chan(rtwdev, chan))
|
||||
/* The channel of C2H RTW_SCAN_NOTIFY_ID_PRESWITCH is next
|
||||
* channel that hardware will switch. We need to stop queue
|
||||
* if next channel is non-op channel.
|
||||
*/
|
||||
if (!rtw_is_op_chan(rtwdev, chan) &&
|
||||
rtw_is_op_chan(rtwdev, hal->current_channel))
|
||||
ieee80211_stop_queues(rtwdev->hw);
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,8 @@
|
||||
#define RTW_EX_CH_INFO_HDR_SIZE 2
|
||||
#define RTW_SCAN_WIDTH 0
|
||||
#define RTW_PRI_CH_IDX 1
|
||||
#define RTW_PROBE_PG_CNT 2
|
||||
#define RTW_OLD_PROBE_PG_CNT 2
|
||||
#define RTW_PROBE_PG_CNT 4
|
||||
|
||||
enum rtw_c2h_cmd_id {
|
||||
C2H_CCX_TX_RPT = 0x03,
|
||||
@ -120,6 +121,10 @@ enum rtw_fw_feature {
|
||||
FW_FEATURE_MAX = BIT(31),
|
||||
};
|
||||
|
||||
enum rtw_fw_feature_ext {
|
||||
FW_FEATURE_EXT_OLD_PAGE_NUM = BIT(0),
|
||||
};
|
||||
|
||||
enum rtw_beacon_filter_offload_mode {
|
||||
BCN_FILTER_OFFLOAD_MODE_0 = 0,
|
||||
BCN_FILTER_OFFLOAD_MODE_1,
|
||||
@ -323,6 +328,11 @@ struct rtw_fw_hdr_legacy {
|
||||
__le32 rsvd5;
|
||||
} __packed;
|
||||
|
||||
#define RTW_FW_VER_CODE(ver, sub_ver, idx) \
|
||||
(((ver) << 16) | ((sub_ver) << 8) | (idx))
|
||||
#define RTW_FW_SUIT_VER_CODE(s) \
|
||||
RTW_FW_VER_CODE((s).version, (s).sub_version, (s).sub_index)
|
||||
|
||||
/* C2H */
|
||||
#define GET_CCX_REPORT_SEQNUM_V0(c2h_payload) (c2h_payload[6] & 0xfc)
|
||||
#define GET_CCX_REPORT_STATUS_V0(c2h_payload) (c2h_payload[0] & 0xc0)
|
||||
@ -770,6 +780,12 @@ static inline bool rtw_fw_feature_check(struct rtw_fw_state *fw,
|
||||
return !!(fw->feature & feature);
|
||||
}
|
||||
|
||||
static inline bool rtw_fw_feature_ext_check(struct rtw_fw_state *fw,
|
||||
enum rtw_fw_feature_ext feature)
|
||||
{
|
||||
return !!(fw->feature_ext & feature);
|
||||
}
|
||||
|
||||
void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
|
||||
struct sk_buff *skb);
|
||||
void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
|
||||
@ -831,7 +847,8 @@ int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size,
|
||||
u32 *buffer);
|
||||
void rtw_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
|
||||
void rtw_fw_adaptivity(struct rtw_dev *rtwdev);
|
||||
void rtw_store_op_chan(struct rtw_dev *rtwdev);
|
||||
void rtw_store_op_chan(struct rtw_dev *rtwdev, bool backup);
|
||||
void rtw_clear_op_chan(struct rtw_dev *rtwdev);
|
||||
void rtw_hw_scan_start(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *req);
|
||||
void rtw_hw_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
|
@ -243,7 +243,7 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
|
||||
static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_pwr_seq_cmd **pwr_seq;
|
||||
u8 rpwm;
|
||||
bool cur_pwr;
|
||||
@ -587,7 +587,7 @@ static int
|
||||
download_firmware_to_mem(struct rtw_dev *rtwdev, const u8 *data,
|
||||
u32 src, u32 dst, u32 size)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 desc_size = chip->tx_pkt_desc_sz;
|
||||
u8 first_part;
|
||||
u32 mem_offset;
|
||||
@ -934,7 +934,7 @@ static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues)
|
||||
static void __rtw_mac_flush_prio_queue(struct rtw_dev *rtwdev,
|
||||
u32 prio_queue, bool drop)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_prioq_addr *addr;
|
||||
bool wsize;
|
||||
u16 avail_page, rsvd_page;
|
||||
@ -996,7 +996,7 @@ void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop)
|
||||
|
||||
static int txdma_queue_mapping(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_rqpn *rqpn = NULL;
|
||||
u16 txdma_pq_map = 0;
|
||||
|
||||
@ -1037,8 +1037,8 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev)
|
||||
|
||||
static int set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fifo_conf *fifo = &rtwdev->fifo;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u16 cur_pg_addr;
|
||||
u8 csi_buf_pg_num = chip->csi_buf_pg_num;
|
||||
|
||||
@ -1092,8 +1092,8 @@ static int __priority_queue_cfg(struct rtw_dev *rtwdev,
|
||||
const struct rtw_page_table *pg_tbl,
|
||||
u16 pubq_num)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fifo_conf *fifo = &rtwdev->fifo;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, pg_tbl->hq_num);
|
||||
rtw_write16(rtwdev, REG_FIFOPAGE_INFO_2, pg_tbl->lq_num);
|
||||
@ -1123,8 +1123,8 @@ static int __priority_queue_cfg_legacy(struct rtw_dev *rtwdev,
|
||||
const struct rtw_page_table *pg_tbl,
|
||||
u16 pubq_num)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fifo_conf *fifo = &rtwdev->fifo;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 val32;
|
||||
|
||||
val32 = BIT_RQPN_NE(pg_tbl->nq_num, pg_tbl->exq_num);
|
||||
@ -1149,8 +1149,8 @@ static int __priority_queue_cfg_legacy(struct rtw_dev *rtwdev,
|
||||
|
||||
static int priority_queue_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fifo_conf *fifo = &rtwdev->fifo;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_page_table *pg_tbl = NULL;
|
||||
u16 pubq_num;
|
||||
int ret;
|
||||
@ -1277,7 +1277,7 @@ static int rtw_drv_info_cfg(struct rtw_dev *rtwdev)
|
||||
|
||||
int rtw_mac_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
int ret;
|
||||
|
||||
ret = rtw_init_trx_cfg(rtwdev);
|
||||
|
@ -101,7 +101,8 @@ static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
|
||||
rtw_set_channel(rtwdev);
|
||||
|
||||
if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
|
||||
(hw->conf.flags & IEEE80211_CONF_IDLE))
|
||||
(hw->conf.flags & IEEE80211_CONF_IDLE) &&
|
||||
!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
|
||||
rtw_enter_ips(rtwdev);
|
||||
|
||||
out:
|
||||
@ -377,7 +378,6 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
|
||||
rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc);
|
||||
if (rtw_bf_support)
|
||||
rtw_bf_assoc(rtwdev, vif, conf);
|
||||
rtw_store_op_chan(rtwdev);
|
||||
} else {
|
||||
rtw_leave_lps(rtwdev);
|
||||
rtw_bf_disassoc(rtwdev, vif, conf);
|
||||
@ -395,6 +395,10 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
ether_addr_copy(rtwvif->bssid, conf->bssid);
|
||||
config |= PORT_SET_BSSID;
|
||||
if (is_zero_ether_addr(rtwvif->bssid))
|
||||
rtw_clear_op_chan(rtwdev);
|
||||
else
|
||||
rtw_store_op_chan(rtwdev, true);
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||
@ -434,7 +438,7 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw,
|
||||
struct ieee80211_bss_conf *link_conf)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
chip->ops->phy_calibration(rtwdev);
|
||||
@ -752,7 +756,7 @@ static int rtw_ops_set_antenna(struct ieee80211_hw *hw,
|
||||
u32 rx_antenna)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
int ret;
|
||||
|
||||
if (!chip->ops->set_antenna)
|
||||
@ -872,7 +876,9 @@ static int rtw_ops_set_sar_specs(struct ieee80211_hw *hw,
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtw_set_sar_specs(rtwdev, sar);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -353,7 +353,7 @@ struct rtw_fwcd_hdr {
|
||||
|
||||
static int rtw_fwcd_prep(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fwcd_desc *desc = &rtwdev->fw.fwcd_desc;
|
||||
const struct rtw_fwcd_segs *segs = chip->fwcd_segs;
|
||||
u32 prep_size = chip->fw_rxff_size + sizeof(struct rtw_fwcd_hdr);
|
||||
@ -675,67 +675,126 @@ void rtw_set_dtim_period(struct rtw_dev *rtwdev, int dtim_period)
|
||||
rtw_write8(rtwdev, REG_DTIM_COUNTER_ROOT, dtim_period - 1);
|
||||
}
|
||||
|
||||
void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel,
|
||||
u8 primary_channel, enum rtw_supported_band band,
|
||||
enum rtw_bandwidth bandwidth)
|
||||
{
|
||||
enum nl80211_band nl_band = rtw_hw_to_nl80211_band(band);
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u8 *cch_by_bw = hal->cch_by_bw;
|
||||
u32 center_freq, primary_freq;
|
||||
enum rtw_sar_bands sar_band;
|
||||
u8 primary_channel_idx;
|
||||
|
||||
center_freq = ieee80211_channel_to_frequency(center_channel, nl_band);
|
||||
primary_freq = ieee80211_channel_to_frequency(primary_channel, nl_band);
|
||||
|
||||
/* assign the center channel used while 20M bw is selected */
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_20] = primary_channel;
|
||||
|
||||
/* assign the center channel used while current bw is selected */
|
||||
cch_by_bw[bandwidth] = center_channel;
|
||||
|
||||
switch (bandwidth) {
|
||||
case RTW_CHANNEL_WIDTH_20:
|
||||
default:
|
||||
primary_channel_idx = RTW_SC_DONT_CARE;
|
||||
break;
|
||||
case RTW_CHANNEL_WIDTH_40:
|
||||
if (primary_freq > center_freq)
|
||||
primary_channel_idx = RTW_SC_20_UPPER;
|
||||
else
|
||||
primary_channel_idx = RTW_SC_20_LOWER;
|
||||
break;
|
||||
case RTW_CHANNEL_WIDTH_80:
|
||||
if (primary_freq > center_freq) {
|
||||
if (primary_freq - center_freq == 10)
|
||||
primary_channel_idx = RTW_SC_20_UPPER;
|
||||
else
|
||||
primary_channel_idx = RTW_SC_20_UPMOST;
|
||||
|
||||
/* assign the center channel used
|
||||
* while 40M bw is selected
|
||||
*/
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_40] = center_channel + 4;
|
||||
} else {
|
||||
if (center_freq - primary_freq == 10)
|
||||
primary_channel_idx = RTW_SC_20_LOWER;
|
||||
else
|
||||
primary_channel_idx = RTW_SC_20_LOWEST;
|
||||
|
||||
/* assign the center channel used
|
||||
* while 40M bw is selected
|
||||
*/
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_40] = center_channel - 4;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (center_channel) {
|
||||
case 1 ... 14:
|
||||
sar_band = RTW_SAR_BAND_0;
|
||||
break;
|
||||
case 36 ... 64:
|
||||
sar_band = RTW_SAR_BAND_1;
|
||||
break;
|
||||
case 100 ... 144:
|
||||
sar_band = RTW_SAR_BAND_3;
|
||||
break;
|
||||
case 149 ... 177:
|
||||
sar_band = RTW_SAR_BAND_4;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "unknown ch(%u) to SAR band\n", center_channel);
|
||||
sar_band = RTW_SAR_BAND_0;
|
||||
break;
|
||||
}
|
||||
|
||||
hal->current_primary_channel_index = primary_channel_idx;
|
||||
hal->current_band_width = bandwidth;
|
||||
hal->primary_channel = primary_channel;
|
||||
hal->current_channel = center_channel;
|
||||
hal->current_band_type = band;
|
||||
hal->sar_band = sar_band;
|
||||
}
|
||||
|
||||
void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
struct rtw_channel_params *chan_params)
|
||||
{
|
||||
struct ieee80211_channel *channel = chandef->chan;
|
||||
enum nl80211_chan_width width = chandef->width;
|
||||
u8 *cch_by_bw = chan_params->cch_by_bw;
|
||||
u32 primary_freq, center_freq;
|
||||
u8 center_chan;
|
||||
u8 bandwidth = RTW_CHANNEL_WIDTH_20;
|
||||
u8 primary_chan_idx = 0;
|
||||
u8 i;
|
||||
|
||||
center_chan = channel->hw_value;
|
||||
primary_freq = channel->center_freq;
|
||||
center_freq = chandef->center_freq1;
|
||||
|
||||
/* assign the center channel used while 20M bw is selected */
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_20] = channel->hw_value;
|
||||
|
||||
switch (width) {
|
||||
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||
case NL80211_CHAN_WIDTH_20:
|
||||
bandwidth = RTW_CHANNEL_WIDTH_20;
|
||||
primary_chan_idx = RTW_SC_DONT_CARE;
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_40:
|
||||
bandwidth = RTW_CHANNEL_WIDTH_40;
|
||||
if (primary_freq > center_freq) {
|
||||
primary_chan_idx = RTW_SC_20_UPPER;
|
||||
if (primary_freq > center_freq)
|
||||
center_chan -= 2;
|
||||
} else {
|
||||
primary_chan_idx = RTW_SC_20_LOWER;
|
||||
else
|
||||
center_chan += 2;
|
||||
}
|
||||
break;
|
||||
case NL80211_CHAN_WIDTH_80:
|
||||
bandwidth = RTW_CHANNEL_WIDTH_80;
|
||||
if (primary_freq > center_freq) {
|
||||
if (primary_freq - center_freq == 10) {
|
||||
primary_chan_idx = RTW_SC_20_UPPER;
|
||||
if (primary_freq - center_freq == 10)
|
||||
center_chan -= 2;
|
||||
} else {
|
||||
primary_chan_idx = RTW_SC_20_UPMOST;
|
||||
else
|
||||
center_chan -= 6;
|
||||
}
|
||||
/* assign the center channel used
|
||||
* while 40M bw is selected
|
||||
*/
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_40] = center_chan + 4;
|
||||
} else {
|
||||
if (center_freq - primary_freq == 10) {
|
||||
primary_chan_idx = RTW_SC_20_LOWER;
|
||||
if (center_freq - primary_freq == 10)
|
||||
center_chan += 2;
|
||||
} else {
|
||||
primary_chan_idx = RTW_SC_20_LOWEST;
|
||||
else
|
||||
center_chan += 6;
|
||||
}
|
||||
/* assign the center channel used
|
||||
* while 40M bw is selected
|
||||
*/
|
||||
cch_by_bw[RTW_CHANNEL_WIDTH_40] = center_chan - 4;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -745,60 +804,30 @@ void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
|
||||
chan_params->center_chan = center_chan;
|
||||
chan_params->bandwidth = bandwidth;
|
||||
chan_params->primary_chan_idx = primary_chan_idx;
|
||||
|
||||
/* assign the center channel used while current bw is selected */
|
||||
cch_by_bw[bandwidth] = center_chan;
|
||||
|
||||
for (i = bandwidth + 1; i <= RTW_MAX_CHANNEL_WIDTH; i++)
|
||||
cch_by_bw[i] = 0;
|
||||
chan_params->primary_chan = channel->hw_value;
|
||||
}
|
||||
|
||||
void rtw_set_channel(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_channel_params ch_param;
|
||||
u8 center_chan, bandwidth, primary_chan_idx;
|
||||
u8 i;
|
||||
u8 center_chan, primary_chan, bandwidth, band;
|
||||
|
||||
rtw_get_channel_params(&hw->conf.chandef, &ch_param);
|
||||
if (WARN(ch_param.center_chan == 0, "Invalid channel\n"))
|
||||
return;
|
||||
|
||||
center_chan = ch_param.center_chan;
|
||||
primary_chan = ch_param.primary_chan;
|
||||
bandwidth = ch_param.bandwidth;
|
||||
primary_chan_idx = ch_param.primary_chan_idx;
|
||||
band = ch_param.center_chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
|
||||
hal->current_band_width = bandwidth;
|
||||
hal->current_channel = center_chan;
|
||||
hal->current_primary_channel_index = primary_chan_idx;
|
||||
hal->current_band_type = center_chan > 14 ? RTW_BAND_5G : RTW_BAND_2G;
|
||||
rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth);
|
||||
|
||||
switch (center_chan) {
|
||||
case 1 ... 14:
|
||||
hal->sar_band = RTW_SAR_BAND_0;
|
||||
break;
|
||||
case 36 ... 64:
|
||||
hal->sar_band = RTW_SAR_BAND_1;
|
||||
break;
|
||||
case 100 ... 144:
|
||||
hal->sar_band = RTW_SAR_BAND_3;
|
||||
break;
|
||||
case 149 ... 177:
|
||||
hal->sar_band = RTW_SAR_BAND_4;
|
||||
break;
|
||||
default:
|
||||
WARN(1, "unknown ch(%u) to SAR band\n", center_chan);
|
||||
hal->sar_band = RTW_SAR_BAND_0;
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = RTW_CHANNEL_WIDTH_20; i <= RTW_MAX_CHANNEL_WIDTH; i++)
|
||||
hal->cch_by_bw[i] = ch_param.cch_by_bw[i];
|
||||
|
||||
chip->ops->set_channel(rtwdev, center_chan, bandwidth, primary_chan_idx);
|
||||
chip->ops->set_channel(rtwdev, center_chan, bandwidth,
|
||||
hal->current_primary_channel_index);
|
||||
|
||||
if (hal->current_band_type == RTW_BAND_5G) {
|
||||
rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_5G);
|
||||
@ -821,7 +850,7 @@ void rtw_set_channel(struct rtw_dev *rtwdev)
|
||||
|
||||
void rtw_chip_prepare_tx(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (rtwdev->need_rfk) {
|
||||
rtwdev->need_rfk = false;
|
||||
@ -890,8 +919,8 @@ static u8 hw_bw_cap_to_bitamp(u8 bw_cap)
|
||||
|
||||
static void rtw_hw_config_rf_ant_num(struct rtw_dev *rtwdev, u8 hw_ant_num)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (hw_ant_num == EFUSE_HW_CAP_IGNORE ||
|
||||
hw_ant_num >= hal->rf_path_num)
|
||||
@ -1240,7 +1269,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
|
||||
|
||||
static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fw_state *fw;
|
||||
|
||||
fw = &rtwdev->fw;
|
||||
@ -1261,7 +1290,7 @@ static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
|
||||
struct rtw_fw_state *fw)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (rtw_disable_lps_deep_mode || !chip->lps_deep_mode_supported ||
|
||||
!fw->feature)
|
||||
@ -1280,7 +1309,7 @@ static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
|
||||
|
||||
static int rtw_power_on(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fw_state *fw = &rtwdev->fw;
|
||||
bool wifi_only;
|
||||
int ret;
|
||||
@ -1469,8 +1498,8 @@ void rtw_core_stop(struct rtw_dev *rtwdev)
|
||||
static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
||||
struct ieee80211_sta_ht_cap *ht_cap)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
ht_cap->ht_supported = true;
|
||||
ht_cap->cap = 0;
|
||||
@ -1552,8 +1581,23 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
|
||||
vht_cap->vht_mcs.tx_highest = highest;
|
||||
}
|
||||
|
||||
static u16 rtw_get_max_scan_ie_len(struct rtw_dev *rtwdev)
|
||||
{
|
||||
u16 len;
|
||||
|
||||
len = rtwdev->chip->max_scan_ie_len;
|
||||
|
||||
if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD) &&
|
||||
rtwdev->chip->id == RTW_CHIP_TYPE_8822C)
|
||||
len = IEEE80211_MAX_DATA_LEN;
|
||||
else if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
||||
len -= RTW_OLD_PROBE_PG_CNT * TX_PAGE_SIZE;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void rtw_set_supported_band(struct ieee80211_hw *hw,
|
||||
struct rtw_chip_info *chip)
|
||||
const struct rtw_chip_info *chip)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct ieee80211_supported_band *sband;
|
||||
@ -1585,7 +1629,7 @@ err_out:
|
||||
}
|
||||
|
||||
static void rtw_unset_supported_band(struct ieee80211_hw *hw,
|
||||
struct rtw_chip_info *chip)
|
||||
const struct rtw_chip_info *chip)
|
||||
{
|
||||
kfree(hw->wiphy->bands[NL80211_BAND_2GHZ]);
|
||||
kfree(hw->wiphy->bands[NL80211_BAND_5GHZ]);
|
||||
@ -1607,7 +1651,7 @@ static void rtw_vif_smps_iter(void *data, u8 *mac,
|
||||
|
||||
void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool txrx_1ss)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
|
||||
if (!chip->ops->config_txrx_mode || rtwdev->hal.txrx_1ss == txrx_1ss)
|
||||
@ -1631,6 +1675,10 @@ static void __update_firmware_feature(struct rtw_dev *rtwdev,
|
||||
|
||||
feature = le32_to_cpu(fw_hdr->feature);
|
||||
fw->feature = feature & FW_FEATURE_SIG ? feature : 0;
|
||||
|
||||
if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C &&
|
||||
RTW_FW_SUIT_VER_CODE(rtwdev->fw) < RTW_FW_VER_CODE(9, 9, 13))
|
||||
fw->feature_ext |= FW_FEATURE_EXT_OLD_PAGE_NUM;
|
||||
}
|
||||
|
||||
static void __update_firmware_info(struct rtw_dev *rtwdev,
|
||||
@ -1724,7 +1772,7 @@ static int rtw_load_firmware(struct rtw_dev *rtwdev, enum rtw_fw_type type)
|
||||
|
||||
static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
|
||||
@ -1982,7 +2030,7 @@ static void rtw_stats_init(struct rtw_dev *rtwdev)
|
||||
|
||||
int rtw_core_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
int ret;
|
||||
|
||||
@ -2136,7 +2184,7 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
|
||||
hw->wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
|
||||
hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS;
|
||||
hw->wiphy->max_scan_ie_len = RTW_SCAN_MAX_IE_LEN;
|
||||
hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN);
|
||||
@ -2180,7 +2228,7 @@ EXPORT_SYMBOL(rtw_register_hw);
|
||||
|
||||
void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtw_unset_supported_band(hw, chip);
|
||||
|
@ -22,7 +22,6 @@
|
||||
#define MAX_PG_CAM_BACKUP_NUM 8
|
||||
|
||||
#define RTW_SCAN_MAX_SSIDS 4
|
||||
#define RTW_SCAN_MAX_IE_LEN 128
|
||||
|
||||
#define RTW_MAX_PATTERN_NUM 12
|
||||
#define RTW_MAX_PATTERN_MASK_SIZE 16
|
||||
@ -33,6 +32,7 @@
|
||||
#define RFREG_MASK 0xfffff
|
||||
#define INV_RF_DATA 0xffffffff
|
||||
#define TX_PAGE_SIZE_SHIFT 7
|
||||
#define TX_PAGE_SIZE (1 << TX_PAGE_SIZE_SHIFT)
|
||||
|
||||
#define RTW_CHANNEL_WIDTH_MAX 3
|
||||
#define RTW_RF_PATH_MAX 4
|
||||
@ -510,12 +510,8 @@ struct rtw_timer_list {
|
||||
|
||||
struct rtw_channel_params {
|
||||
u8 center_chan;
|
||||
u8 primary_chan;
|
||||
u8 bandwidth;
|
||||
u8 primary_chan_idx;
|
||||
/* center channel by different available bandwidth,
|
||||
* val of (bw > current bandwidth) is invalid
|
||||
*/
|
||||
u8 cch_by_bw[RTW_MAX_CHANNEL_WIDTH + 1];
|
||||
};
|
||||
|
||||
struct rtw_hw_reg {
|
||||
@ -1232,6 +1228,7 @@ struct rtw_chip_info {
|
||||
const char *wow_fw_name;
|
||||
const struct wiphy_wowlan_support *wowlan_stub;
|
||||
const u8 max_sched_scan_ssids;
|
||||
const u16 max_scan_ie_len;
|
||||
|
||||
/* coex paras */
|
||||
u32 coex_para_ver;
|
||||
@ -1853,6 +1850,7 @@ struct rtw_fw_state {
|
||||
u8 sub_index;
|
||||
u16 h2c_version;
|
||||
u32 feature;
|
||||
u32 feature_ext;
|
||||
};
|
||||
|
||||
enum rtw_sar_sources {
|
||||
@ -1896,6 +1894,7 @@ struct rtw_hal {
|
||||
u8 current_primary_channel_index;
|
||||
u8 current_band_width;
|
||||
u8 current_band_type;
|
||||
u8 primary_channel;
|
||||
|
||||
/* center channel for different available bandwidth,
|
||||
* val of (bw > current_band_width) is invalid
|
||||
@ -1967,6 +1966,7 @@ struct rtw_hw_scan_info {
|
||||
struct ieee80211_vif *scanning_vif;
|
||||
u8 probe_pg_size;
|
||||
u8 op_pri_ch_idx;
|
||||
u8 op_pri_ch;
|
||||
u8 op_chan;
|
||||
u8 op_bw;
|
||||
};
|
||||
@ -1978,7 +1978,7 @@ struct rtw_dev {
|
||||
struct rtw_hci hci;
|
||||
|
||||
struct rtw_hw_scan_info scan_info;
|
||||
struct rtw_chip_info *chip;
|
||||
const struct rtw_chip_info *chip;
|
||||
struct rtw_hal hal;
|
||||
struct rtw_fifo_conf fifo;
|
||||
struct rtw_fw_state fw;
|
||||
@ -2132,6 +2132,20 @@ static inline int rtw_chip_dump_fw_crash(struct rtw_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline
|
||||
enum nl80211_band rtw_hw_to_nl80211_band(enum rtw_supported_band hw_band)
|
||||
{
|
||||
switch (hw_band) {
|
||||
default:
|
||||
case RTW_BAND_2G:
|
||||
return NL80211_BAND_2GHZ;
|
||||
case RTW_BAND_5G:
|
||||
return NL80211_BAND_5GHZ;
|
||||
case RTW_BAND_60G:
|
||||
return NL80211_BAND_60GHZ;
|
||||
}
|
||||
}
|
||||
|
||||
void rtw_set_rx_freq_band(struct rtw_rx_pkt_stat *pkt_stat, u8 channel);
|
||||
void rtw_set_dtim_period(struct rtw_dev *rtwdev, int dtim_period);
|
||||
void rtw_get_channel_params(struct cfg80211_chan_def *chandef,
|
||||
@ -2173,4 +2187,7 @@ int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
|
||||
u32 fwcd_item);
|
||||
int rtw_dump_reg(struct rtw_dev *rtwdev, const u32 addr, const u32 size);
|
||||
void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss);
|
||||
void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel,
|
||||
u8 primary_channel, enum rtw_supported_band band,
|
||||
enum rtw_bandwidth bandwidth);
|
||||
#endif
|
||||
|
@ -322,7 +322,7 @@ static int rtw_pci_init_trx_ring(struct rtw_dev *rtwdev)
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
struct rtw_pci_tx_ring *tx_ring;
|
||||
struct rtw_pci_rx_ring *rx_ring;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
int i = 0, j = 0, tx_alloced = 0, rx_alloced = 0;
|
||||
int tx_desc_size, rx_desc_size;
|
||||
u32 len;
|
||||
@ -721,7 +721,7 @@ static void rtw_pci_dma_check(struct rtw_dev *rtwdev,
|
||||
u32 idx)
|
||||
{
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_pci_rx_buffer_desc *buf_desc;
|
||||
u32 desc_sz = chip->rx_buf_desc_sz;
|
||||
u16 total_pkt_size;
|
||||
@ -834,7 +834,7 @@ static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev,
|
||||
struct sk_buff *skb, u8 queue)
|
||||
{
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_pci_tx_ring *ring;
|
||||
struct rtw_pci_tx_data *tx_data;
|
||||
dma_addr_t dma;
|
||||
@ -1073,7 +1073,7 @@ static int rtw_pci_get_hw_rx_ring_nr(struct rtw_dev *rtwdev,
|
||||
static u32 rtw_pci_rx_napi(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
|
||||
u8 hw_queue, u32 limit)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct napi_struct *napi = &rtwpci->napi;
|
||||
struct rtw_pci_rx_ring *ring = &rtwpci->rx_rings[RTW_RX_QUEUE_MPDU];
|
||||
struct rtw_rx_pkt_stat pkt_stat;
|
||||
@ -1425,7 +1425,7 @@ static void rtw_pci_link_ps(struct rtw_dev *rtwdev, bool enter)
|
||||
|
||||
static void rtw_pci_link_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
struct pci_dev *pdev = rtwpci->pdev;
|
||||
u16 link_ctrl;
|
||||
@ -1467,7 +1467,7 @@ static void rtw_pci_link_cfg(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_pci_interface_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
switch (chip->id) {
|
||||
case RTW_CHIP_TYPE_8822C:
|
||||
@ -1483,7 +1483,7 @@ static void rtw_pci_interface_cfg(struct rtw_dev *rtwdev)
|
||||
static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct pci_dev *pdev = rtwpci->pdev;
|
||||
const struct rtw_intf_phy_para *para;
|
||||
u16 cut;
|
||||
@ -1538,7 +1538,7 @@ static int __maybe_unused rtw_pci_suspend(struct device *dev)
|
||||
{
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev);
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
|
||||
if (chip->id == RTW_CHIP_TYPE_8822C && efuse->rfe_option == 6)
|
||||
@ -1550,7 +1550,7 @@ static int __maybe_unused rtw_pci_resume(struct device *dev)
|
||||
{
|
||||
struct ieee80211_hw *hw = dev_get_drvdata(dev);
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
|
||||
if (chip->id == RTW_CHIP_TYPE_8822C && efuse->rfe_option == 6)
|
||||
@ -1848,7 +1848,7 @@ void rtw_pci_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct rtw_dev *rtwdev;
|
||||
struct rtw_chip_info *chip;
|
||||
const struct rtw_chip_info *chip;
|
||||
|
||||
if (!hw)
|
||||
return;
|
||||
|
@ -138,7 +138,7 @@ EXPORT_SYMBOL(rtw_phy_set_edcca_th);
|
||||
|
||||
void rtw_phy_adaptivity_set_mode(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
|
||||
/* turn off in debugfs for debug usage */
|
||||
@ -165,7 +165,7 @@ void rtw_phy_adaptivity_set_mode(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_phy_adaptivity_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
rtw_phy_adaptivity_set_mode(rtwdev);
|
||||
if (chip->ops->adaptivity_init)
|
||||
@ -180,7 +180,7 @@ static void rtw_phy_adaptivity(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_phy_cfo_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->cfo_init)
|
||||
chip->ops->cfo_init(rtwdev);
|
||||
@ -199,7 +199,7 @@ static void rtw_phy_tx_path_div_init(struct rtw_dev *rtwdev)
|
||||
|
||||
void rtw_phy_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
u32 addr, mask;
|
||||
|
||||
@ -226,7 +226,7 @@ EXPORT_SYMBOL(rtw_phy_init);
|
||||
|
||||
void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u32 addr, mask;
|
||||
u8 path;
|
||||
@ -245,7 +245,7 @@ void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi)
|
||||
|
||||
static void rtw_phy_stat_false_alarm(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
chip->ops->false_alarm_statistics(rtwdev);
|
||||
}
|
||||
@ -603,7 +603,7 @@ static void rtw_phy_rrsr_update(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_phy_dpk_track(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->dpk_track)
|
||||
chip->ops->dpk_track(rtwdev);
|
||||
@ -659,7 +659,7 @@ EXPORT_SYMBOL(rtw_phy_parsing_cfo);
|
||||
|
||||
static void rtw_phy_cfo_track(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (chip->ops->cfo_track)
|
||||
chip->ops->cfo_track(rtwdev);
|
||||
@ -720,8 +720,8 @@ static u8 rtw_phy_cck_pd_lv(struct rtw_dev *rtwdev)
|
||||
|
||||
static void rtw_phy_cck_pd(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 cck_fa = dm_info->cck_fa_cnt;
|
||||
u8 level;
|
||||
|
||||
@ -816,23 +816,18 @@ static u8 rtw_phy_linear_2_db(u64 linear)
|
||||
u8 j;
|
||||
u32 dB;
|
||||
|
||||
if (linear >= db_invert_table[11][7])
|
||||
return 96; /* maximum 96 dB */
|
||||
|
||||
for (i = 0; i < 12; i++) {
|
||||
if (i <= 2 && (linear << FRAC_BITS) <= db_invert_table[i][7])
|
||||
break;
|
||||
else if (i > 2 && linear <= db_invert_table[i][7])
|
||||
break;
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (i <= 2 && (linear << FRAC_BITS) <= db_invert_table[i][j])
|
||||
goto cnt;
|
||||
else if (i > 2 && linear <= db_invert_table[i][j])
|
||||
goto cnt;
|
||||
}
|
||||
}
|
||||
|
||||
for (j = 0; j < 8; j++) {
|
||||
if (i <= 2 && (linear << FRAC_BITS) <= db_invert_table[i][j])
|
||||
break;
|
||||
else if (i > 2 && linear <= db_invert_table[i][j])
|
||||
break;
|
||||
}
|
||||
return 96; /* maximum 96 dB */
|
||||
|
||||
cnt:
|
||||
if (j == 0 && i == 0)
|
||||
goto end;
|
||||
|
||||
@ -900,7 +895,7 @@ u32 rtw_phy_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const u32 *base_addr = chip->rf_base_addr;
|
||||
u32 val, direct_addr;
|
||||
|
||||
@ -923,7 +918,7 @@ u32 rtw_phy_read_rf_sipi(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_rf_sipi_addr *rf_sipi_addr;
|
||||
const struct rtw_rf_sipi_addr *rf_sipi_addr_a;
|
||||
u32 val32;
|
||||
@ -972,8 +967,8 @@ bool rtw_phy_write_rf_reg_sipi(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u32 *sipi_addr = chip->rf_sipi_addr;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const u32 *sipi_addr = chip->rf_sipi_addr;
|
||||
u32 data_and_addr;
|
||||
u32 old_data = 0;
|
||||
u32 shift;
|
||||
@ -1012,7 +1007,7 @@ bool rtw_phy_write_rf_reg(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask, u32 data)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const u32 *base_addr = chip->rf_base_addr;
|
||||
u32 direct_addr;
|
||||
|
||||
@ -1747,7 +1742,7 @@ EXPORT_SYMBOL(rtw_phy_cfg_rf);
|
||||
|
||||
static void rtw_load_rfk_table(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_dpk_info *dpk_info = &rtwdev->dm_info.dpk_info;
|
||||
|
||||
if (!chip->rfk_init_tbl)
|
||||
@ -1766,7 +1761,7 @@ static void rtw_load_rfk_table(struct rtw_dev *rtwdev)
|
||||
|
||||
void rtw_phy_load_tables(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 rf_path;
|
||||
|
||||
rtw_load_table(rtwdev, chip->mac_tbl);
|
||||
@ -1875,7 +1870,7 @@ static u8 rtw_get_channel_group(u8 channel, u8 rate)
|
||||
|
||||
static s8 rtw_phy_get_dis_dpd_by_rate_diff(struct rtw_dev *rtwdev, u16 rate)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
s8 dpd_diff = 0;
|
||||
|
||||
if (!chip->en_dis_dpd)
|
||||
@ -1909,7 +1904,7 @@ static u8 rtw_phy_get_2g_tx_power_index(struct rtw_dev *rtwdev,
|
||||
enum rtw_bandwidth bandwidth,
|
||||
u8 rate, u8 group)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 tx_power;
|
||||
bool mcs_rate;
|
||||
bool above_2ss;
|
||||
@ -1956,7 +1951,7 @@ static u8 rtw_phy_get_5g_tx_power_index(struct rtw_dev *rtwdev,
|
||||
enum rtw_bandwidth bandwidth,
|
||||
u8 rate, u8 group)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
u8 tx_power;
|
||||
u8 upper, lower;
|
||||
bool mcs_rate;
|
||||
@ -2209,7 +2204,7 @@ static void rtw_phy_set_tx_power_level_by_path(struct rtw_dev *rtwdev,
|
||||
|
||||
void rtw_phy_set_tx_power_level(struct rtw_dev *rtwdev, u8 channel)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
u8 path;
|
||||
|
||||
@ -2484,7 +2479,7 @@ static void rtw_phy_set_tx_path_by_reg(struct rtw_dev *rtwdev,
|
||||
{
|
||||
struct rtw_path_div *path_div = &rtwdev->dm_path_div;
|
||||
enum rtw_bb_path tx_path_sel_cck = tx_path_sel_1ss;
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (tx_path_sel_1ss == path_div->current_tx_path)
|
||||
return;
|
||||
@ -2539,7 +2534,7 @@ static void rtw_phy_tx_path_diversity_2ss(struct rtw_dev *rtwdev)
|
||||
|
||||
void rtw_phy_tx_path_diversity(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!chip->path_div_supported)
|
||||
return;
|
||||
|
@ -114,7 +114,7 @@ const struct rtw_table name ## _tbl = { \
|
||||
|
||||
static inline const struct rtw_rfe_def *rtw_get_rfe_def(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
const struct rtw_rfe_def *rfe_def = NULL;
|
||||
|
||||
|
@ -19,14 +19,14 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)
|
||||
rtw_err(rtwdev, "leave idle state failed\n");
|
||||
|
||||
rtw_set_channel(rtwdev);
|
||||
clear_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int rtw_enter_ips(struct rtw_dev *rtwdev)
|
||||
{
|
||||
set_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags);
|
||||
if (test_and_set_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags))
|
||||
return 0;
|
||||
|
||||
rtw_coex_ips_notify(rtwdev, COEX_IPS_ENTER);
|
||||
|
||||
@ -50,6 +50,9 @@ int rtw_leave_ips(struct rtw_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!test_and_clear_bit(RTW_FLAG_INACTIVE_PS, rtwdev->flags))
|
||||
return 0;
|
||||
|
||||
rtw_hci_link_ps(rtwdev, false);
|
||||
|
||||
ret = rtw_ips_pwr_up(rtwdev);
|
||||
|
@ -479,6 +479,7 @@ void rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
rtw_dbg(rtwdev, RTW_DBG_REGD, "regd state: %d -> %d\n",
|
||||
rtwdev->regd.state, next_regd.state);
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
rtwdev->regd = next_regd;
|
||||
rtw_dbg_regd_dump(rtwdev, "get alpha2 %c%c from initiator %d: ",
|
||||
request->alpha2[0],
|
||||
@ -487,6 +488,7 @@ void rtw_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request)
|
||||
|
||||
rtw_phy_adaptivity_set_mode(rtwdev);
|
||||
rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
u8 rtw_regd_get(struct rtw_dev *rtwdev)
|
||||
|
@ -2720,7 +2720,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.ht_supported = true,
|
||||
.vht_supported = false,
|
||||
@ -2748,6 +2748,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x2007022f,
|
||||
.bt_desired_ver = 0x2f,
|
||||
|
@ -1898,7 +1898,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
@ -1926,6 +1926,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.bfer_su_max_num = 2,
|
||||
.bfer_mu_max_num = 1,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x19092746,
|
||||
.bt_desired_ver = 0x46,
|
||||
|
@ -2517,7 +2517,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
@ -2549,6 +2549,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.l2h_th_ini_cs = 10 + EDCCA_IGI_BASE,
|
||||
.l2h_th_ini_ad = -14 + EDCCA_IGI_BASE,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x20070206,
|
||||
.bt_desired_ver = 0x6,
|
||||
|
@ -5330,7 +5330,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.max_power_index = 0x7f,
|
||||
.csi_buf_pg_num = 50,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
@ -5375,6 +5375,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.wowlan_stub = &rtw_wowlan_stub_8822c,
|
||||
.max_sched_scan_ssids = 4,
|
||||
#endif
|
||||
.max_scan_ie_len = (RTW_PROBE_PG_CNT - 1) * TX_PAGE_SIZE,
|
||||
.coex_para_ver = 0x22020720,
|
||||
.bt_desired_ver = 0x20,
|
||||
.scbd_support = true,
|
||||
|
@ -384,7 +384,7 @@ void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
struct ieee80211_sta *sta,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
struct rtw_sta_info *si;
|
||||
@ -424,7 +424,7 @@ void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
struct sk_buff *skb,
|
||||
enum rtw_rsvd_packet_type type)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
bool bmc;
|
||||
|
||||
@ -475,7 +475,7 @@ rtw_tx_write_data_rsvd_page_get(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *buf, u32 size)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb;
|
||||
u32 tx_pkt_desc_sz;
|
||||
u32 length;
|
||||
@ -501,7 +501,7 @@ rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *buf, u32 size)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb;
|
||||
u32 tx_pkt_desc_sz;
|
||||
u32 length;
|
||||
|
@ -23,7 +23,7 @@ EXPORT_SYMBOL(check_hw_ready);
|
||||
|
||||
bool ltecoex_read_reg(struct rtw_dev *rtwdev, u16 offset, u32 *val)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_ltecoex_addr *ltecoex = chip->ltecoex_addr;
|
||||
|
||||
if (!check_hw_ready(rtwdev, ltecoex->ctrl, LTECOEX_READY, 1))
|
||||
@ -37,7 +37,7 @@ bool ltecoex_read_reg(struct rtw_dev *rtwdev, u16 offset, u32 *val)
|
||||
|
||||
bool ltecoex_reg_write(struct rtw_dev *rtwdev, u16 offset, u32 value)
|
||||
{
|
||||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw_ltecoex_addr *ltecoex = chip->ltecoex_addr;
|
||||
|
||||
if (!check_hw_ready(rtwdev, ltecoex->ctrl, LTECOEX_READY, 1))
|
||||
|
@ -127,7 +127,6 @@ static void rtw89_leave_lps_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwv
|
||||
if (rtwvif->wifi_role != RTW89_WIFI_ROLE_STATION)
|
||||
return;
|
||||
|
||||
__rtw89_leave_ps_mode(rtwdev);
|
||||
__rtw89_leave_lps(rtwdev, rtwvif->mac_id);
|
||||
}
|
||||
|
||||
@ -140,6 +139,8 @@ void rtw89_leave_lps(struct rtw89_dev *rtwdev)
|
||||
if (!test_and_clear_bit(RTW89_FLAG_LEISURE_PS, rtwdev->flags))
|
||||
return;
|
||||
|
||||
__rtw89_leave_ps_mode(rtwdev);
|
||||
|
||||
rtw89_for_each_rtwvif(rtwdev, rtwvif)
|
||||
rtw89_leave_lps_vif(rtwdev, rtwvif);
|
||||
}
|
||||
|
@ -1024,15 +1024,13 @@
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
#define B_AX_WDE_IMR_SET (B_AX_WDE_BUFREQ_QTAID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SIZE0_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SIZELMT_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN_V1 | \
|
||||
B_AX_WDE_BUFREQ_UNAVAL_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_INVLD_PKTID_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFRTN_SIZE_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFREQ_SRCHTAILPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_STRPG_ERR_INT_EN | \
|
||||
B_AX_WDE_GETNPG_PGOFST_ERR_INT_EN | \
|
||||
B_AX_WDE_BUFMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_CMDTYPE_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_DSTQUEID_ERR_INT_EN | \
|
||||
B_AX_WDE_QUE_SRCQUEID_ERR_INT_EN | \
|
||||
@ -1043,10 +1041,7 @@
|
||||
B_AX_WDE_QUEMGN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ARBT_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_NULLPG_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_RRDY_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN | \
|
||||
B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN)
|
||||
B_AX_WDE_DATCHN_FRZTO_ERR_INT_EN)
|
||||
|
||||
#define B_AX_WDE_DATCHN_CAMREQ_ERR_INT_EN BIT(29)
|
||||
#define B_AX_WDE_DATCHN_ADRERR_ERR_INT_EN BIT(28)
|
||||
|
@ -489,14 +489,16 @@ static int rndis_join_ibss(struct wiphy *wiphy, struct net_device *dev,
|
||||
static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev);
|
||||
|
||||
static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params);
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params);
|
||||
|
||||
static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr);
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr);
|
||||
|
||||
static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool unicast, bool multicast);
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast);
|
||||
|
||||
static int rndis_get_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
const u8 *mac, struct station_info *sinfo);
|
||||
@ -2377,8 +2379,8 @@ static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
|
||||
}
|
||||
|
||||
static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
|
||||
struct usbnet *usbdev = priv->usbdev;
|
||||
@ -2413,7 +2415,8 @@ static int rndis_add_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
}
|
||||
|
||||
static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
|
||||
struct usbnet *usbdev = priv->usbdev;
|
||||
@ -2424,7 +2427,8 @@ static int rndis_del_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
}
|
||||
|
||||
static int rndis_set_default_key(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool unicast, bool multicast)
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
struct rndis_wlan_private *priv = wiphy_priv(wiphy);
|
||||
struct usbnet *usbdev = priv->usbdev;
|
||||
|
@ -850,8 +850,8 @@ exit:
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
char *alg_name;
|
||||
u32 param_len;
|
||||
@ -932,8 +932,8 @@ addkey_end:
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
struct key_params*))
|
||||
{
|
||||
@ -941,7 +941,8 @@ static int cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct adapter *padapter = rtw_netdev_priv(ndev);
|
||||
struct security_priv *psecuritypriv = &padapter->securitypriv;
|
||||
@ -955,7 +956,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
|
||||
}
|
||||
|
||||
static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
|
||||
struct net_device *ndev, u8 key_index
|
||||
struct net_device *ndev, int link_id, u8 key_index
|
||||
, bool unicast, bool multicast
|
||||
)
|
||||
{
|
||||
|
@ -143,8 +143,8 @@ exit:
|
||||
}
|
||||
|
||||
static int prism2_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct wlandevice *wlandev = dev->ml_priv;
|
||||
u32 did;
|
||||
@ -172,7 +172,7 @@ static int prism2_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int prism2_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool pairwise,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params*))
|
||||
{
|
||||
@ -202,7 +202,8 @@ static int prism2_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int prism2_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct wlandevice *wlandev = dev->ml_priv;
|
||||
u32 did;
|
||||
@ -227,7 +228,8 @@ static int prism2_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int prism2_set_default_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_index, bool unicast, bool multicast)
|
||||
int link_id, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
{
|
||||
struct wlandevice *wlandev = dev->ml_priv;
|
||||
|
||||
|
@ -2886,7 +2886,8 @@ ieee80211_he_spr_size(const u8 *he_spr_ie)
|
||||
/* Calculate 802.11be EHT capabilities IE Tx/Rx EHT MCS NSS Support Field size */
|
||||
static inline u8
|
||||
ieee80211_eht_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap,
|
||||
const struct ieee80211_eht_cap_elem_fixed *eht_cap)
|
||||
const struct ieee80211_eht_cap_elem_fixed *eht_cap,
|
||||
bool from_ap)
|
||||
{
|
||||
u8 count = 0;
|
||||
|
||||
@ -2907,7 +2908,10 @@ ieee80211_eht_mcs_nss_size(const struct ieee80211_he_cap_elem *he_cap,
|
||||
if (eht_cap->phy_cap_info[0] & IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ)
|
||||
count += 3;
|
||||
|
||||
return count ? count : 4;
|
||||
if (count)
|
||||
return count;
|
||||
|
||||
return from_ap ? 3 : 4;
|
||||
}
|
||||
|
||||
/* 802.11be EHT PPE Thresholds */
|
||||
@ -2943,7 +2947,8 @@ ieee80211_eht_ppe_size(u16 ppe_thres_hdr, const u8 *phy_cap_info)
|
||||
}
|
||||
|
||||
static inline bool
|
||||
ieee80211_eht_capa_size_ok(const u8 *he_capa, const u8 *data, u8 len)
|
||||
ieee80211_eht_capa_size_ok(const u8 *he_capa, const u8 *data, u8 len,
|
||||
bool from_ap)
|
||||
{
|
||||
const struct ieee80211_eht_cap_elem_fixed *elem = (const void *)data;
|
||||
u8 needed = sizeof(struct ieee80211_eht_cap_elem_fixed);
|
||||
@ -2952,7 +2957,8 @@ ieee80211_eht_capa_size_ok(const u8 *he_capa, const u8 *data, u8 len)
|
||||
return false;
|
||||
|
||||
needed += ieee80211_eht_mcs_nss_size((const void *)he_capa,
|
||||
(const void *)data);
|
||||
(const void *)data,
|
||||
from_ap);
|
||||
if (len < needed)
|
||||
return false;
|
||||
|
||||
|
@ -2316,6 +2316,7 @@ struct ocb_setup {
|
||||
* @cwmax: Maximum contention window [a value of the form 2^n-1 in the range
|
||||
* 1..32767]
|
||||
* @aifs: Arbitration interframe space [0..255]
|
||||
* @link_id: link_id or -1 for non-MLD
|
||||
*/
|
||||
struct ieee80211_txq_params {
|
||||
enum nl80211_ac ac;
|
||||
@ -2323,6 +2324,7 @@ struct ieee80211_txq_params {
|
||||
u16 cwmin;
|
||||
u16 cwmax;
|
||||
u8 aifs;
|
||||
int link_id;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -3929,22 +3931,33 @@ struct mgmt_frame_regs {
|
||||
* @del_intf_link: Remove an MLO link from the given interface.
|
||||
*
|
||||
* @add_key: add a key with the given parameters. @mac_addr will be %NULL
|
||||
* when adding a group key.
|
||||
* when adding a group key. @link_id will be -1 for non-MLO connection.
|
||||
* For MLO connection, @link_id will be >= 0 for group key and -1 for
|
||||
* pairwise key, @mac_addr will be peer's MLD address for MLO pairwise key.
|
||||
*
|
||||
* @get_key: get information about the key with the given parameters.
|
||||
* @mac_addr will be %NULL when requesting information for a group
|
||||
* key. All pointers given to the @callback function need not be valid
|
||||
* after it returns. This function should return an error if it is
|
||||
* not possible to retrieve the key, -ENOENT if it doesn't exist.
|
||||
* @link_id will be -1 for non-MLO connection. For MLO connection,
|
||||
* @link_id will be >= 0 for group key and -1 for pairwise key, @mac_addr
|
||||
* will be peer's MLD address for MLO pairwise key.
|
||||
*
|
||||
* @del_key: remove a key given the @mac_addr (%NULL for a group key)
|
||||
* and @key_index, return -ENOENT if the key doesn't exist.
|
||||
* and @key_index, return -ENOENT if the key doesn't exist. @link_id will
|
||||
* be -1 for non-MLO connection. For MLO connection, @link_id will be >= 0
|
||||
* for group key and -1 for pairwise key, @mac_addr will be peer's MLD
|
||||
* address for MLO pairwise key.
|
||||
*
|
||||
* @set_default_key: set the default key on an interface
|
||||
* @set_default_key: set the default key on an interface. @link_id will be >= 0
|
||||
* for MLO connection and -1 for non-MLO connection.
|
||||
*
|
||||
* @set_default_mgmt_key: set the default management frame key on an interface
|
||||
* @set_default_mgmt_key: set the default management frame key on an interface.
|
||||
* @link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
|
||||
*
|
||||
* @set_default_beacon_key: set the default Beacon frame key on an interface
|
||||
* @set_default_beacon_key: set the default Beacon frame key on an interface.
|
||||
* @link_id will be >= 0 for MLO connection and -1 for non-MLO connection.
|
||||
*
|
||||
* @set_rekey_data: give the data necessary for GTK rekeying to the driver
|
||||
*
|
||||
@ -4293,22 +4306,24 @@ struct cfg80211_ops {
|
||||
unsigned int link_id);
|
||||
|
||||
int (*add_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params);
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params);
|
||||
int (*get_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params*));
|
||||
int (*del_key)(struct wiphy *wiphy, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr);
|
||||
int link_id, u8 key_index, bool pairwise,
|
||||
const u8 *mac_addr);
|
||||
int (*set_default_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool unicast, bool multicast);
|
||||
int (*set_default_mgmt_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index);
|
||||
int (*set_default_beacon_key)(struct wiphy *wiphy,
|
||||
struct net_device *netdev,
|
||||
int link_id,
|
||||
u8 key_index);
|
||||
|
||||
int (*start_ap)(struct wiphy *wiphy, struct net_device *dev,
|
||||
@ -8266,6 +8281,7 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
* cfg80211_ch_switch_started_notify - notify channel switch start
|
||||
* @dev: the device on which the channel switch started
|
||||
* @chandef: the future channel definition
|
||||
* @link_id: the link ID for MLO, must be 0 for non-MLO
|
||||
* @count: the number of TBTTs until the channel switch happens
|
||||
* @quiet: whether or not immediate quiet was requested by the AP
|
||||
*
|
||||
@ -8275,7 +8291,8 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
*/
|
||||
void cfg80211_ch_switch_started_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
u8 count, bool quiet);
|
||||
unsigned int link_id, u8 count,
|
||||
bool quiet);
|
||||
|
||||
/**
|
||||
* ieee80211_operating_class_to_band - convert operating class to band
|
||||
|
@ -1480,6 +1480,10 @@ enum mac80211_rx_encoding {
|
||||
* each A-MPDU but the same for each subframe within one A-MPDU
|
||||
* @ampdu_delimiter_crc: A-MPDU delimiter CRC
|
||||
* @zero_length_psdu_type: radiotap type of the 0-length PSDU
|
||||
* @link_valid: if the link which is identified by @link_id is valid. This flag
|
||||
* is set only when connection is MLO.
|
||||
* @link_id: id of the link used to receive the packet. This is used along with
|
||||
* @link_valid.
|
||||
*/
|
||||
struct ieee80211_rx_status {
|
||||
u64 mactime;
|
||||
@ -1504,6 +1508,7 @@ struct ieee80211_rx_status {
|
||||
s8 chain_signal[IEEE80211_MAX_CHAINS];
|
||||
u8 ampdu_delimiter_crc;
|
||||
u8 zero_length_psdu_type;
|
||||
u8 link_valid:1, link_id:4;
|
||||
};
|
||||
|
||||
static inline u32
|
||||
@ -1975,6 +1980,7 @@ enum ieee80211_key_flags {
|
||||
* - Temporal Authenticator Rx MIC Key (64 bits)
|
||||
* @icv_len: The ICV length for this key type
|
||||
* @iv_len: The IV length for this key type
|
||||
* @link_id: the link ID for MLO, or -1 for non-MLO or pairwise keys
|
||||
*/
|
||||
struct ieee80211_key_conf {
|
||||
atomic64_t tx_pn;
|
||||
@ -1984,6 +1990,7 @@ struct ieee80211_key_conf {
|
||||
u8 hw_key_idx;
|
||||
s8 keyidx;
|
||||
u16 flags;
|
||||
s8 link_id;
|
||||
u8 keylen;
|
||||
u8 key[];
|
||||
};
|
||||
@ -2128,6 +2135,7 @@ struct ieee80211_sta_txpwr {
|
||||
* @addr: MAC address of the Link STA. For non-MLO STA this is same as the addr
|
||||
* in ieee80211_sta. For MLO Link STA this addr can be same or different
|
||||
* from addr in ieee80211_sta (representing MLD STA addr)
|
||||
* @link_id: the link ID for this link STA (0 for deflink)
|
||||
* @supp_rates: Bitmap of supported rates
|
||||
* @ht_cap: HT capabilities of this STA; restricted to our own capabilities
|
||||
* @vht_cap: VHT capabilities of this STA; restricted to our own capabilities
|
||||
@ -2144,6 +2152,7 @@ struct ieee80211_sta_txpwr {
|
||||
*/
|
||||
struct ieee80211_link_sta {
|
||||
u8 addr[ETH_ALEN];
|
||||
u8 link_id;
|
||||
|
||||
u32 supp_rates[NUM_NL80211_BANDS];
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
|
@ -377,14 +377,22 @@
|
||||
* the non-transmitting interfaces are deleted as well.
|
||||
*
|
||||
* @NL80211_CMD_GET_KEY: Get sequence counter information for a key specified
|
||||
* by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC.
|
||||
* by %NL80211_ATTR_KEY_IDX and/or %NL80211_ATTR_MAC. %NL80211_ATTR_MAC
|
||||
* represents peer's MLD address for MLO pairwise key. For MLO group key,
|
||||
* the link is identified by %NL80211_ATTR_MLO_LINK_ID.
|
||||
* @NL80211_CMD_SET_KEY: Set key attributes %NL80211_ATTR_KEY_DEFAULT,
|
||||
* %NL80211_ATTR_KEY_DEFAULT_MGMT, or %NL80211_ATTR_KEY_THRESHOLD.
|
||||
* For MLO connection, the link to set default key is identified by
|
||||
* %NL80211_ATTR_MLO_LINK_ID.
|
||||
* @NL80211_CMD_NEW_KEY: add a key with given %NL80211_ATTR_KEY_DATA,
|
||||
* %NL80211_ATTR_KEY_IDX, %NL80211_ATTR_MAC, %NL80211_ATTR_KEY_CIPHER,
|
||||
* and %NL80211_ATTR_KEY_SEQ attributes.
|
||||
* and %NL80211_ATTR_KEY_SEQ attributes. %NL80211_ATTR_MAC represents
|
||||
* peer's MLD address for MLO pairwise key. The link to add MLO
|
||||
* group key is identified by %NL80211_ATTR_MLO_LINK_ID.
|
||||
* @NL80211_CMD_DEL_KEY: delete a key identified by %NL80211_ATTR_KEY_IDX
|
||||
* or %NL80211_ATTR_MAC.
|
||||
* or %NL80211_ATTR_MAC. %NL80211_ATTR_MAC represents peer's MLD address
|
||||
* for MLO pairwise key. The link to delete group key is identified by
|
||||
* %NL80211_ATTR_MLO_LINK_ID.
|
||||
*
|
||||
* @NL80211_CMD_GET_BEACON: (not used)
|
||||
* @NL80211_CMD_SET_BEACON: change the beacon on an access point interface
|
||||
|
@ -23,6 +23,30 @@
|
||||
#include "mesh.h"
|
||||
#include "wme.h"
|
||||
|
||||
static struct ieee80211_link_data *
|
||||
ieee80211_link_or_deflink(struct ieee80211_sub_if_data *sdata, int link_id,
|
||||
bool require_valid)
|
||||
{
|
||||
struct ieee80211_link_data *link;
|
||||
|
||||
if (link_id < 0) {
|
||||
/*
|
||||
* For keys, if sdata is not an MLD, we might not use
|
||||
* the return value at all (if it's not a pairwise key),
|
||||
* so in that case (require_valid==false) don't error.
|
||||
*/
|
||||
if (require_valid && sdata->vif.valid_links)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
return &sdata->deflink;
|
||||
}
|
||||
|
||||
link = sdata_dereference(sdata->link[link_id], sdata);
|
||||
if (!link)
|
||||
return ERR_PTR(-ENOLINK);
|
||||
return link;
|
||||
}
|
||||
|
||||
static void ieee80211_set_mu_mimo_follow(struct ieee80211_sub_if_data *sdata,
|
||||
struct vif_params *params)
|
||||
{
|
||||
@ -434,10 +458,12 @@ static int ieee80211_set_tx(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, struct key_params *params)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, false);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sta_info *sta = NULL;
|
||||
struct ieee80211_key *key;
|
||||
@ -446,6 +472,9 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (!ieee80211_sdata_running(sdata))
|
||||
return -ENETDOWN;
|
||||
|
||||
if (IS_ERR(link))
|
||||
return PTR_ERR(link);
|
||||
|
||||
if (pairwise && params->mode == NL80211_KEY_SET_TX)
|
||||
return ieee80211_set_tx(sdata, mac_addr, key_idx);
|
||||
|
||||
@ -454,6 +483,8 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
if (link_id >= 0)
|
||||
return -EINVAL;
|
||||
if (WARN_ON_ONCE(fips_enabled))
|
||||
return -EINVAL;
|
||||
break;
|
||||
@ -466,6 +497,8 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
if (IS_ERR(key))
|
||||
return PTR_ERR(key);
|
||||
|
||||
key->conf.link_id = link_id;
|
||||
|
||||
if (pairwise)
|
||||
key->conf.flags |= IEEE80211_KEY_FLAG_PAIRWISE;
|
||||
|
||||
@ -527,7 +560,7 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
break;
|
||||
}
|
||||
|
||||
err = ieee80211_key_link(key, sdata, sta);
|
||||
err = ieee80211_key_link(key, link, sta);
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
@ -536,18 +569,37 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static struct ieee80211_key *
|
||||
ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata, int link_id,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_link_data *link = &sdata->deflink;
|
||||
struct ieee80211_key *key;
|
||||
struct sta_info *sta;
|
||||
|
||||
if (link_id >= 0) {
|
||||
link = rcu_dereference_check(sdata->link[link_id],
|
||||
lockdep_is_held(&sdata->wdev.mtx));
|
||||
if (!link)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (mac_addr) {
|
||||
struct sta_info *sta;
|
||||
struct link_sta_info *link_sta;
|
||||
|
||||
sta = sta_info_get_bss(sdata, mac_addr);
|
||||
if (!sta)
|
||||
return NULL;
|
||||
|
||||
if (link_id >= 0) {
|
||||
link_sta = rcu_dereference_check(sta->link[link_id],
|
||||
lockdep_is_held(&local->sta_mtx));
|
||||
if (!link_sta)
|
||||
return NULL;
|
||||
} else {
|
||||
link_sta = &sta->deflink;
|
||||
}
|
||||
|
||||
if (pairwise && key_idx < NUM_DEFAULT_KEYS)
|
||||
return rcu_dereference_check_key_mtx(local,
|
||||
sta->ptk[key_idx]);
|
||||
@ -557,7 +609,7 @@ ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata,
|
||||
NUM_DEFAULT_MGMT_KEYS +
|
||||
NUM_DEFAULT_BEACON_KEYS)
|
||||
return rcu_dereference_check_key_mtx(local,
|
||||
sta->deflink.gtk[key_idx]);
|
||||
link_sta->gtk[key_idx]);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -566,7 +618,7 @@ ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata,
|
||||
return rcu_dereference_check_key_mtx(local,
|
||||
sdata->keys[key_idx]);
|
||||
|
||||
key = rcu_dereference_check_key_mtx(local, sdata->deflink.gtk[key_idx]);
|
||||
key = rcu_dereference_check_key_mtx(local, link->gtk[key_idx]);
|
||||
if (key)
|
||||
return key;
|
||||
|
||||
@ -578,7 +630,8 @@ ieee80211_lookup_key(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr)
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
@ -588,7 +641,7 @@ static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
mutex_lock(&local->sta_mtx);
|
||||
mutex_lock(&local->key_mtx);
|
||||
|
||||
key = ieee80211_lookup_key(sdata, key_idx, pairwise, mac_addr);
|
||||
key = ieee80211_lookup_key(sdata, link_id, key_idx, pairwise, mac_addr);
|
||||
if (!key) {
|
||||
ret = -ENOENT;
|
||||
goto out_unlock;
|
||||
@ -605,8 +658,8 @@ static int ieee80211_del_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
}
|
||||
|
||||
static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
u8 key_idx, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
int link_id, u8 key_idx, bool pairwise,
|
||||
const u8 *mac_addr, void *cookie,
|
||||
void (*callback)(void *cookie,
|
||||
struct key_params *params))
|
||||
{
|
||||
@ -624,7 +677,7 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
key = ieee80211_lookup_key(sdata, key_idx, pairwise, mac_addr);
|
||||
key = ieee80211_lookup_key(sdata, link_id, key_idx, pairwise, mac_addr);
|
||||
if (!key)
|
||||
goto out;
|
||||
|
||||
@ -711,34 +764,49 @@ static int ieee80211_get_key(struct wiphy *wiphy, struct net_device *dev,
|
||||
|
||||
static int ieee80211_config_default_key(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
u8 key_idx, bool uni,
|
||||
int link_id, u8 key_idx, bool uni,
|
||||
bool multi)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, false);
|
||||
|
||||
ieee80211_set_default_key(sdata, key_idx, uni, multi);
|
||||
if (IS_ERR(link))
|
||||
return PTR_ERR(link);
|
||||
|
||||
ieee80211_set_default_key(link, key_idx, uni, multi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_config_default_mgmt_key(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
u8 key_idx)
|
||||
int link_id, u8 key_idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, true);
|
||||
|
||||
ieee80211_set_default_mgmt_key(sdata, key_idx);
|
||||
if (IS_ERR(link))
|
||||
return PTR_ERR(link);
|
||||
|
||||
ieee80211_set_default_mgmt_key(link, key_idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ieee80211_config_default_beacon_key(struct wiphy *wiphy,
|
||||
struct net_device *dev,
|
||||
u8 key_idx)
|
||||
int link_id, u8 key_idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, link_id, true);
|
||||
|
||||
ieee80211_set_default_beacon_key(sdata, key_idx);
|
||||
if (IS_ERR(link))
|
||||
return PTR_ERR(link);
|
||||
|
||||
ieee80211_set_default_beacon_key(link, key_idx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1610,6 +1678,18 @@ static int sta_link_apply_parameters(struct ieee80211_local *local,
|
||||
rcu_dereference_protected(sta->link[link_id],
|
||||
lockdep_is_held(&local->sta_mtx));
|
||||
|
||||
/*
|
||||
* If there are no changes, then accept a link that doesn't exist,
|
||||
* unless it's a new link.
|
||||
*/
|
||||
if (params->link_id < 0 && !new_link &&
|
||||
!params->link_mac && !params->txpwr_set &&
|
||||
!params->supported_rates_len &&
|
||||
!params->ht_capa && !params->vht_capa &&
|
||||
!params->he_capa && !params->eht_capa &&
|
||||
!params->opmode_notif_used)
|
||||
return 0;
|
||||
|
||||
if (!link || !link_sta)
|
||||
return -EINVAL;
|
||||
|
||||
@ -1625,6 +1705,8 @@ static int sta_link_apply_parameters(struct ieee80211_local *local,
|
||||
params->link_mac)) {
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (new_link) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (params->txpwr_set) {
|
||||
@ -2554,7 +2636,8 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||
struct ieee80211_link_data *link = &sdata->deflink;
|
||||
struct ieee80211_link_data *link =
|
||||
ieee80211_link_or_deflink(sdata, params->link_id, true);
|
||||
struct ieee80211_tx_queue_params p;
|
||||
|
||||
if (!local->ops->conf_tx)
|
||||
@ -2563,6 +2646,9 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
|
||||
if (local->hw.queues < IEEE80211_NUM_ACS)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (IS_ERR(link))
|
||||
return PTR_ERR(link);
|
||||
|
||||
memset(&p, 0, sizeof(p));
|
||||
p.aifs = params->aifs;
|
||||
p.cw_max = params->cwmax;
|
||||
@ -3597,9 +3683,6 @@ static int ieee80211_set_csa_beacon(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_IFTYPE_MESH_POINT: {
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
|
||||
if (params->chandef.width != sdata->vif.bss_conf.chandef.width)
|
||||
return -EINVAL;
|
||||
|
||||
/* changes into another band are not supported */
|
||||
if (sdata->vif.bss_conf.chandef.chan->band !=
|
||||
params->chandef.chan->band)
|
||||
@ -3732,7 +3815,7 @@ __ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
|
||||
cfg80211_ch_switch_started_notify(sdata->dev,
|
||||
&sdata->deflink.csa_chandef,
|
||||
&sdata->deflink.csa_chandef, 0,
|
||||
params->count, params->block_tx);
|
||||
|
||||
if (changed) {
|
||||
|
@ -30,7 +30,9 @@ ieee80211_eht_cap_ie_to_sta_eht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
return;
|
||||
|
||||
mcs_nss_size = ieee80211_eht_mcs_nss_size(he_cap_ie_elem,
|
||||
&eht_cap_ie_elem->fixed);
|
||||
&eht_cap_ie_elem->fixed,
|
||||
sdata->vif.type ==
|
||||
NL80211_IFTYPE_STATION);
|
||||
|
||||
eht_total_size += mcs_nss_size;
|
||||
|
||||
|
@ -83,17 +83,17 @@ static void ieee80211_get_stats(struct net_device *dev,
|
||||
|
||||
#define ADD_STA_STATS(sta) \
|
||||
do { \
|
||||
data[i++] += (sta)->rx_stats.packets; \
|
||||
data[i++] += (sta)->rx_stats.bytes; \
|
||||
data[i++] += sinfo.rx_packets; \
|
||||
data[i++] += sinfo.rx_bytes; \
|
||||
data[i++] += (sta)->rx_stats.num_duplicates; \
|
||||
data[i++] += (sta)->rx_stats.fragments; \
|
||||
data[i++] += (sta)->rx_stats.dropped; \
|
||||
data[i++] += sinfo.rx_dropped_misc; \
|
||||
\
|
||||
data[i++] += sinfo.tx_packets; \
|
||||
data[i++] += sinfo.tx_bytes; \
|
||||
data[i++] += (sta)->status_stats.filtered; \
|
||||
data[i++] += (sta)->status_stats.retry_failed; \
|
||||
data[i++] += (sta)->status_stats.retry_count; \
|
||||
data[i++] += sinfo.tx_failed; \
|
||||
data[i++] += sinfo.tx_retries; \
|
||||
} while (0)
|
||||
|
||||
/* For Managed stations, find the single station based on BSSID
|
||||
|
@ -1346,10 +1346,10 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
|
||||
capability, 0, true);
|
||||
}
|
||||
|
||||
static unsigned ibss_setup_channels(struct wiphy *wiphy,
|
||||
struct ieee80211_channel **channels,
|
||||
unsigned int channels_max,
|
||||
u32 center_freq, u32 width)
|
||||
static unsigned int ibss_setup_channels(struct wiphy *wiphy,
|
||||
struct ieee80211_channel **channels,
|
||||
unsigned int channels_max,
|
||||
u32 center_freq, u32 width)
|
||||
{
|
||||
struct ieee80211_channel *chan = NULL;
|
||||
unsigned int n_chan = 0;
|
||||
|
@ -213,6 +213,7 @@ struct ieee80211_rx_data {
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct ieee80211_link_data *link;
|
||||
struct sta_info *sta;
|
||||
struct link_sta_info *link_sta;
|
||||
struct ieee80211_key *key;
|
||||
|
||||
unsigned int flags;
|
||||
@ -2184,6 +2185,8 @@ static inline void ieee80211_tx_skb(struct ieee80211_sub_if_data *sdata,
|
||||
* for that non-transmitting BSS is returned
|
||||
* @link_id: the link ID to parse elements for, if a STA profile
|
||||
* is present in the multi-link element, or -1 to ignore
|
||||
* @from_ap: frame is received from an AP (currently used only
|
||||
* for EHT capabilities parsing)
|
||||
*/
|
||||
struct ieee80211_elems_parse_params {
|
||||
const u8 *start;
|
||||
@ -2193,6 +2196,7 @@ struct ieee80211_elems_parse_params {
|
||||
u32 crc;
|
||||
struct cfg80211_bss *bss;
|
||||
int link_id;
|
||||
bool from_ap;
|
||||
};
|
||||
|
||||
struct ieee802_11_elems *
|
||||
@ -2382,6 +2386,7 @@ u8 *ieee80211_ie_build_he_cap(ieee80211_conn_flags_t disable_flags, u8 *pos,
|
||||
const struct ieee80211_sta_he_cap *he_cap,
|
||||
u8 *end);
|
||||
void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
|
||||
enum ieee80211_smps_mode smps_mode,
|
||||
struct sk_buff *skb);
|
||||
u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef);
|
||||
int ieee80211_parse_bitrates(enum nl80211_chan_width width,
|
||||
@ -2513,7 +2518,8 @@ u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype);
|
||||
u8 *ieee80211_ie_build_eht_cap(u8 *pos,
|
||||
const struct ieee80211_sta_he_cap *he_cap,
|
||||
const struct ieee80211_sta_eht_cap *eht_cap,
|
||||
u8 *end);
|
||||
u8 *end,
|
||||
bool for_ap);
|
||||
|
||||
void
|
||||
ieee80211_eht_cap_ie_to_sta_eht_cap(struct ieee80211_sub_if_data *sdata,
|
||||
|
@ -406,9 +406,11 @@ static void ieee80211_link_init(struct ieee80211_sub_if_data *sdata,
|
||||
case NL80211_IFTYPE_AP:
|
||||
ether_addr_copy(link_conf->addr,
|
||||
sdata->wdev.links[link_id].addr);
|
||||
link_conf->bssid = link_conf->addr;
|
||||
WARN_ON(!(sdata->wdev.valid_links & BIT(link_id)));
|
||||
break;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
/* station sets the bssid in ieee80211_mgd_setup_link */
|
||||
break;
|
||||
default:
|
||||
WARN_ON(1);
|
||||
@ -432,10 +434,19 @@ struct link_container {
|
||||
static void ieee80211_free_links(struct ieee80211_sub_if_data *sdata,
|
||||
struct link_container **links)
|
||||
{
|
||||
LIST_HEAD(keys);
|
||||
unsigned int link_id;
|
||||
|
||||
for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
|
||||
if (!links[link_id])
|
||||
continue;
|
||||
ieee80211_remove_link_keys(&links[link_id]->data, &keys);
|
||||
}
|
||||
|
||||
synchronize_rcu();
|
||||
|
||||
ieee80211_free_key_list(sdata->local, &keys);
|
||||
|
||||
for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS; link_id++) {
|
||||
if (!links[link_id])
|
||||
continue;
|
||||
@ -2267,7 +2278,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
|
||||
wdev = &sdata->wdev;
|
||||
|
||||
sdata->dev = NULL;
|
||||
strlcpy(sdata->name, name, IFNAMSIZ);
|
||||
strscpy(sdata->name, name, IFNAMSIZ);
|
||||
ieee80211_assign_perm_addr(local, wdev->address, type);
|
||||
memcpy(sdata->vif.addr, wdev->address, ETH_ALEN);
|
||||
ether_addr_copy(sdata->vif.bss_conf.addr, sdata->vif.addr);
|
||||
|
@ -344,9 +344,10 @@ static void ieee80211_pairwise_rekey(struct ieee80211_key *old,
|
||||
}
|
||||
}
|
||||
|
||||
static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
|
||||
static void __ieee80211_set_default_key(struct ieee80211_link_data *link,
|
||||
int idx, bool uni, bool multi)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_key *key = NULL;
|
||||
|
||||
assert_key_lock(sdata->local);
|
||||
@ -354,7 +355,7 @@ static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
|
||||
if (idx >= 0 && idx < NUM_DEFAULT_KEYS) {
|
||||
key = key_mtx_dereference(sdata->local, sdata->keys[idx]);
|
||||
if (!key)
|
||||
key = key_mtx_dereference(sdata->local, sdata->deflink.gtk[idx]);
|
||||
key = key_mtx_dereference(sdata->local, link->gtk[idx]);
|
||||
}
|
||||
|
||||
if (uni) {
|
||||
@ -365,47 +366,48 @@ static void __ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
if (multi)
|
||||
rcu_assign_pointer(sdata->deflink.default_multicast_key, key);
|
||||
rcu_assign_pointer(link->default_multicast_key, key);
|
||||
|
||||
ieee80211_debugfs_key_update_default(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
|
||||
void ieee80211_set_default_key(struct ieee80211_link_data *link, int idx,
|
||||
bool uni, bool multi)
|
||||
{
|
||||
mutex_lock(&sdata->local->key_mtx);
|
||||
__ieee80211_set_default_key(sdata, idx, uni, multi);
|
||||
mutex_unlock(&sdata->local->key_mtx);
|
||||
mutex_lock(&link->sdata->local->key_mtx);
|
||||
__ieee80211_set_default_key(link, idx, uni, multi);
|
||||
mutex_unlock(&link->sdata->local->key_mtx);
|
||||
}
|
||||
|
||||
static void
|
||||
__ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata, int idx)
|
||||
__ieee80211_set_default_mgmt_key(struct ieee80211_link_data *link, int idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_key *key = NULL;
|
||||
|
||||
assert_key_lock(sdata->local);
|
||||
|
||||
if (idx >= NUM_DEFAULT_KEYS &&
|
||||
idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
|
||||
key = key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.gtk[idx]);
|
||||
key = key_mtx_dereference(sdata->local, link->gtk[idx]);
|
||||
|
||||
rcu_assign_pointer(sdata->deflink.default_mgmt_key, key);
|
||||
rcu_assign_pointer(link->default_mgmt_key, key);
|
||||
|
||||
ieee80211_debugfs_key_update_default(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
|
||||
void ieee80211_set_default_mgmt_key(struct ieee80211_link_data *link,
|
||||
int idx)
|
||||
{
|
||||
mutex_lock(&sdata->local->key_mtx);
|
||||
__ieee80211_set_default_mgmt_key(sdata, idx);
|
||||
mutex_unlock(&sdata->local->key_mtx);
|
||||
mutex_lock(&link->sdata->local->key_mtx);
|
||||
__ieee80211_set_default_mgmt_key(link, idx);
|
||||
mutex_unlock(&link->sdata->local->key_mtx);
|
||||
}
|
||||
|
||||
static void
|
||||
__ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata, int idx)
|
||||
__ieee80211_set_default_beacon_key(struct ieee80211_link_data *link, int idx)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_key *key = NULL;
|
||||
|
||||
assert_key_lock(sdata->local);
|
||||
@ -413,28 +415,30 @@ __ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata, int idx)
|
||||
if (idx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS &&
|
||||
idx < NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS +
|
||||
NUM_DEFAULT_BEACON_KEYS)
|
||||
key = key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.gtk[idx]);
|
||||
key = key_mtx_dereference(sdata->local, link->gtk[idx]);
|
||||
|
||||
rcu_assign_pointer(sdata->deflink.default_beacon_key, key);
|
||||
rcu_assign_pointer(link->default_beacon_key, key);
|
||||
|
||||
ieee80211_debugfs_key_update_default(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata,
|
||||
void ieee80211_set_default_beacon_key(struct ieee80211_link_data *link,
|
||||
int idx)
|
||||
{
|
||||
mutex_lock(&sdata->local->key_mtx);
|
||||
__ieee80211_set_default_beacon_key(sdata, idx);
|
||||
mutex_unlock(&sdata->local->key_mtx);
|
||||
mutex_lock(&link->sdata->local->key_mtx);
|
||||
__ieee80211_set_default_beacon_key(link, idx);
|
||||
mutex_unlock(&link->sdata->local->key_mtx);
|
||||
}
|
||||
|
||||
static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
struct sta_info *sta,
|
||||
bool pairwise,
|
||||
struct ieee80211_key *old,
|
||||
struct ieee80211_key *new)
|
||||
struct ieee80211_link_data *link,
|
||||
struct sta_info *sta,
|
||||
bool pairwise,
|
||||
struct ieee80211_key *old,
|
||||
struct ieee80211_key *new)
|
||||
{
|
||||
struct link_sta_info *link_sta = sta ? &sta->deflink : NULL;
|
||||
int link_id;
|
||||
int idx;
|
||||
int ret = 0;
|
||||
bool defunikey, defmultikey, defmgmtkey, defbeaconkey;
|
||||
@ -446,13 +450,36 @@ static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
if (new) {
|
||||
idx = new->conf.keyidx;
|
||||
list_add_tail_rcu(&new->list, &sdata->key_list);
|
||||
is_wep = new->conf.cipher == WLAN_CIPHER_SUITE_WEP40 ||
|
||||
new->conf.cipher == WLAN_CIPHER_SUITE_WEP104;
|
||||
link_id = new->conf.link_id;
|
||||
} else {
|
||||
idx = old->conf.keyidx;
|
||||
is_wep = old->conf.cipher == WLAN_CIPHER_SUITE_WEP40 ||
|
||||
old->conf.cipher == WLAN_CIPHER_SUITE_WEP104;
|
||||
link_id = old->conf.link_id;
|
||||
}
|
||||
|
||||
if (WARN(old && old->conf.link_id != link_id,
|
||||
"old link ID %d doesn't match new link ID %d\n",
|
||||
old->conf.link_id, link_id))
|
||||
return -EINVAL;
|
||||
|
||||
if (link_id >= 0) {
|
||||
if (!link) {
|
||||
link = sdata_dereference(sdata->link[link_id], sdata);
|
||||
if (!link)
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
if (sta) {
|
||||
link_sta = rcu_dereference_protected(sta->link[link_id],
|
||||
lockdep_is_held(&sta->local->sta_mtx));
|
||||
if (!link_sta)
|
||||
return -ENOLINK;
|
||||
}
|
||||
} else {
|
||||
link = &sdata->deflink;
|
||||
}
|
||||
|
||||
if ((is_wep || pairwise) && idx >= NUM_DEFAULT_KEYS)
|
||||
@ -482,6 +509,9 @@ static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (new)
|
||||
list_add_tail_rcu(&new->list, &sdata->key_list);
|
||||
|
||||
if (sta) {
|
||||
if (pairwise) {
|
||||
rcu_assign_pointer(sta->ptk[idx], new);
|
||||
@ -489,7 +519,7 @@ static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
!(new->conf.flags & IEEE80211_KEY_FLAG_NO_AUTO_TX))
|
||||
_ieee80211_set_tx_key(new, true);
|
||||
} else {
|
||||
rcu_assign_pointer(sta->deflink.gtk[idx], new);
|
||||
rcu_assign_pointer(link_sta->gtk[idx], new);
|
||||
}
|
||||
/* Only needed for transition from no key -> key.
|
||||
* Still triggers unnecessary when using Extended Key ID
|
||||
@ -503,39 +533,39 @@ static int ieee80211_key_replace(struct ieee80211_sub_if_data *sdata,
|
||||
sdata->default_unicast_key);
|
||||
defmultikey = old &&
|
||||
old == key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.default_multicast_key);
|
||||
link->default_multicast_key);
|
||||
defmgmtkey = old &&
|
||||
old == key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.default_mgmt_key);
|
||||
link->default_mgmt_key);
|
||||
defbeaconkey = old &&
|
||||
old == key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.default_beacon_key);
|
||||
link->default_beacon_key);
|
||||
|
||||
if (defunikey && !new)
|
||||
__ieee80211_set_default_key(sdata, -1, true, false);
|
||||
__ieee80211_set_default_key(link, -1, true, false);
|
||||
if (defmultikey && !new)
|
||||
__ieee80211_set_default_key(sdata, -1, false, true);
|
||||
__ieee80211_set_default_key(link, -1, false, true);
|
||||
if (defmgmtkey && !new)
|
||||
__ieee80211_set_default_mgmt_key(sdata, -1);
|
||||
__ieee80211_set_default_mgmt_key(link, -1);
|
||||
if (defbeaconkey && !new)
|
||||
__ieee80211_set_default_beacon_key(sdata, -1);
|
||||
__ieee80211_set_default_beacon_key(link, -1);
|
||||
|
||||
if (is_wep || pairwise)
|
||||
rcu_assign_pointer(sdata->keys[idx], new);
|
||||
else
|
||||
rcu_assign_pointer(sdata->deflink.gtk[idx], new);
|
||||
rcu_assign_pointer(link->gtk[idx], new);
|
||||
|
||||
if (defunikey && new)
|
||||
__ieee80211_set_default_key(sdata, new->conf.keyidx,
|
||||
__ieee80211_set_default_key(link, new->conf.keyidx,
|
||||
true, false);
|
||||
if (defmultikey && new)
|
||||
__ieee80211_set_default_key(sdata, new->conf.keyidx,
|
||||
__ieee80211_set_default_key(link, new->conf.keyidx,
|
||||
false, true);
|
||||
if (defmgmtkey && new)
|
||||
__ieee80211_set_default_mgmt_key(sdata,
|
||||
__ieee80211_set_default_mgmt_key(link,
|
||||
new->conf.keyidx);
|
||||
if (defbeaconkey && new)
|
||||
__ieee80211_set_default_beacon_key(sdata,
|
||||
__ieee80211_set_default_beacon_key(link,
|
||||
new->conf.keyidx);
|
||||
}
|
||||
|
||||
@ -569,6 +599,7 @@ ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
||||
key->conf.flags = 0;
|
||||
key->flags = 0;
|
||||
|
||||
key->conf.link_id = -1;
|
||||
key->conf.cipher = cipher;
|
||||
key->conf.keyidx = idx;
|
||||
key->conf.keylen = key_len;
|
||||
@ -797,9 +828,10 @@ static bool ieee80211_key_identical(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
int ieee80211_key_link(struct ieee80211_key *key,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_link_data *link,
|
||||
struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
static atomic_t key_color = ATOMIC_INIT(0);
|
||||
struct ieee80211_key *old_key = NULL;
|
||||
int idx = key->conf.keyidx;
|
||||
@ -827,15 +859,24 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
||||
(old_key && old_key->conf.cipher != key->conf.cipher))
|
||||
goto out;
|
||||
} else if (sta) {
|
||||
old_key = key_mtx_dereference(sdata->local,
|
||||
sta->deflink.gtk[idx]);
|
||||
struct link_sta_info *link_sta = &sta->deflink;
|
||||
int link_id = key->conf.link_id;
|
||||
|
||||
if (link_id >= 0) {
|
||||
link_sta = rcu_dereference_protected(sta->link[link_id],
|
||||
lockdep_is_held(&sta->local->sta_mtx));
|
||||
if (!link_sta)
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
old_key = key_mtx_dereference(sdata->local, link_sta->gtk[idx]);
|
||||
} else {
|
||||
if (idx < NUM_DEFAULT_KEYS)
|
||||
old_key = key_mtx_dereference(sdata->local,
|
||||
sdata->keys[idx]);
|
||||
if (!old_key)
|
||||
old_key = key_mtx_dereference(sdata->local,
|
||||
sdata->deflink.gtk[idx]);
|
||||
link->gtk[idx]);
|
||||
}
|
||||
|
||||
/* Non-pairwise keys must also not switch the cipher on rekey */
|
||||
@ -866,7 +907,7 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
||||
|
||||
increment_tailroom_need_count(sdata);
|
||||
|
||||
ret = ieee80211_key_replace(sdata, sta, pairwise, old_key, key);
|
||||
ret = ieee80211_key_replace(sdata, link, sta, pairwise, old_key, key);
|
||||
|
||||
if (!ret) {
|
||||
ieee80211_debugfs_key_add(key);
|
||||
@ -890,9 +931,9 @@ void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom)
|
||||
* Replace key with nothingness if it was ever used.
|
||||
*/
|
||||
if (key->sdata)
|
||||
ieee80211_key_replace(key->sdata, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
ieee80211_key_replace(key->sdata, NULL, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
ieee80211_key_destroy(key, delay_tailroom);
|
||||
}
|
||||
|
||||
@ -1019,15 +1060,45 @@ static void ieee80211_free_keys_iface(struct ieee80211_sub_if_data *sdata,
|
||||
ieee80211_debugfs_key_remove_beacon_default(sdata);
|
||||
|
||||
list_for_each_entry_safe(key, tmp, &sdata->key_list, list) {
|
||||
ieee80211_key_replace(key->sdata, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
ieee80211_key_replace(key->sdata, NULL, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
list_add_tail(&key->list, keys);
|
||||
}
|
||||
|
||||
ieee80211_debugfs_key_update_default(sdata);
|
||||
}
|
||||
|
||||
void ieee80211_remove_link_keys(struct ieee80211_link_data *link,
|
||||
struct list_head *keys)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = link->sdata;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_key *key, *tmp;
|
||||
|
||||
mutex_lock(&local->key_mtx);
|
||||
list_for_each_entry_safe(key, tmp, &sdata->key_list, list) {
|
||||
if (key->conf.link_id != link->link_id)
|
||||
continue;
|
||||
ieee80211_key_replace(key->sdata, link, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
list_add_tail(&key->list, keys);
|
||||
}
|
||||
mutex_unlock(&local->key_mtx);
|
||||
}
|
||||
|
||||
void ieee80211_free_key_list(struct ieee80211_local *local,
|
||||
struct list_head *keys)
|
||||
{
|
||||
struct ieee80211_key *key, *tmp;
|
||||
|
||||
mutex_lock(&local->key_mtx);
|
||||
list_for_each_entry_safe(key, tmp, keys, list)
|
||||
__ieee80211_key_destroy(key, false);
|
||||
mutex_unlock(&local->key_mtx);
|
||||
}
|
||||
|
||||
void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
|
||||
bool force_synchronize)
|
||||
{
|
||||
@ -1087,9 +1158,9 @@ void ieee80211_free_sta_keys(struct ieee80211_local *local,
|
||||
key = key_mtx_dereference(local, sta->deflink.gtk[i]);
|
||||
if (!key)
|
||||
continue;
|
||||
ieee80211_key_replace(key->sdata, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
ieee80211_key_replace(key->sdata, NULL, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
__ieee80211_key_destroy(key, key->sdata->vif.type ==
|
||||
NL80211_IFTYPE_STATION);
|
||||
}
|
||||
@ -1098,9 +1169,9 @@ void ieee80211_free_sta_keys(struct ieee80211_local *local,
|
||||
key = key_mtx_dereference(local, sta->ptk[i]);
|
||||
if (!key)
|
||||
continue;
|
||||
ieee80211_key_replace(key->sdata, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
ieee80211_key_replace(key->sdata, NULL, key->sta,
|
||||
key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE,
|
||||
key, NULL);
|
||||
__ieee80211_key_destroy(key, key->sdata->vif.type ==
|
||||
NL80211_IFTYPE_STATION);
|
||||
}
|
||||
@ -1307,7 +1378,8 @@ ieee80211_gtk_rekey_add(struct ieee80211_vif *vif,
|
||||
if (sdata->u.mgd.mfp != IEEE80211_MFP_DISABLED)
|
||||
key->conf.flags |= IEEE80211_KEY_FLAG_RX_MGMT;
|
||||
|
||||
err = ieee80211_key_link(key, sdata, NULL);
|
||||
/* FIXME: this function needs to get a link ID */
|
||||
err = ieee80211_key_link(key, &sdata->deflink, NULL);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
|
||||
struct ieee80211_local;
|
||||
struct ieee80211_sub_if_data;
|
||||
struct ieee80211_link_data;
|
||||
struct sta_info;
|
||||
|
||||
/**
|
||||
@ -144,17 +145,21 @@ ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
|
||||
* to make it used, free old key. On failure, also free the new key.
|
||||
*/
|
||||
int ieee80211_key_link(struct ieee80211_key *key,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_link_data *link,
|
||||
struct sta_info *sta);
|
||||
int ieee80211_set_tx_key(struct ieee80211_key *key);
|
||||
void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom);
|
||||
void ieee80211_key_free_unused(struct ieee80211_key *key);
|
||||
void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
|
||||
void ieee80211_set_default_key(struct ieee80211_link_data *link, int idx,
|
||||
bool uni, bool multi);
|
||||
void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
|
||||
void ieee80211_set_default_mgmt_key(struct ieee80211_link_data *link,
|
||||
int idx);
|
||||
void ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata,
|
||||
void ieee80211_set_default_beacon_key(struct ieee80211_link_data *link,
|
||||
int idx);
|
||||
void ieee80211_remove_link_keys(struct ieee80211_link_data *link,
|
||||
struct list_head *keys);
|
||||
void ieee80211_free_key_list(struct ieee80211_local *local,
|
||||
struct list_head *keys);
|
||||
void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
|
||||
bool force_synchronize);
|
||||
void ieee80211_free_sta_keys(struct ieee80211_local *local,
|
||||
|
@ -634,7 +634,7 @@ int mesh_add_he_6ghz_cap_ie(struct ieee80211_sub_if_data *sdata,
|
||||
if (!iftd)
|
||||
return 0;
|
||||
|
||||
ieee80211_ie_build_he_6ghz_cap(sdata, skb);
|
||||
ieee80211_ie_build_he_6ghz_cap(sdata, sdata->deflink.smps_mode, skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -695,6 +695,7 @@ static bool ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
|
||||
static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb,
|
||||
struct ieee80211_supported_band *sband,
|
||||
enum ieee80211_smps_mode smps_mode,
|
||||
ieee80211_conn_flags_t conn_flags)
|
||||
{
|
||||
u8 *pos, *pre_he_pos;
|
||||
@ -719,7 +720,7 @@ static void ieee80211_add_he_ie(struct ieee80211_sub_if_data *sdata,
|
||||
/* trim excess if any */
|
||||
skb_trim(skb, skb->len - (pre_he_pos + he_cap_size - pos));
|
||||
|
||||
ieee80211_ie_build_he_6ghz_cap(sdata, skb);
|
||||
ieee80211_ie_build_he_6ghz_cap(sdata, smps_mode, skb);
|
||||
}
|
||||
|
||||
static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata,
|
||||
@ -746,11 +747,13 @@ static void ieee80211_add_eht_ie(struct ieee80211_sub_if_data *sdata,
|
||||
eht_cap_size =
|
||||
2 + 1 + sizeof(eht_cap->eht_cap_elem) +
|
||||
ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
|
||||
&eht_cap->eht_cap_elem) +
|
||||
&eht_cap->eht_cap_elem,
|
||||
false) +
|
||||
ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
|
||||
eht_cap->eht_cap_elem.phy_cap_info);
|
||||
pos = skb_put(skb, eht_cap_size);
|
||||
ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, pos + eht_cap_size);
|
||||
ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, pos + eht_cap_size,
|
||||
false);
|
||||
}
|
||||
|
||||
static void ieee80211_assoc_add_rates(struct sk_buff *skb,
|
||||
@ -1098,7 +1101,7 @@ static size_t ieee80211_assoc_link_elems(struct ieee80211_sub_if_data *sdata,
|
||||
offset);
|
||||
|
||||
if (!(assoc_data->link[link_id].conn_flags & IEEE80211_CONN_DISABLE_HE)) {
|
||||
ieee80211_add_he_ie(sdata, skb, sband,
|
||||
ieee80211_add_he_ie(sdata, skb, sband, smps_mode,
|
||||
assoc_data->link[link_id].conn_flags);
|
||||
ADD_PRESENT_EXT_ELEM(WLAN_EID_EXT_HE_CAPABILITY);
|
||||
}
|
||||
@ -1220,14 +1223,21 @@ static void ieee80211_assoc_add_ml_elem(struct ieee80211_sub_if_data *sdata,
|
||||
ml_elem = skb_put(skb, sizeof(*ml_elem));
|
||||
ml_elem->control =
|
||||
cpu_to_le16(IEEE80211_ML_CONTROL_TYPE_BASIC |
|
||||
IEEE80211_MLC_BASIC_PRES_EML_CAPA |
|
||||
IEEE80211_MLC_BASIC_PRES_MLD_CAPA_OP);
|
||||
common = skb_put(skb, sizeof(*common));
|
||||
common->len = sizeof(*common) +
|
||||
2 + /* EML capabilities */
|
||||
2; /* MLD capa/ops */
|
||||
memcpy(common->mld_mac_addr, sdata->vif.addr, ETH_ALEN);
|
||||
skb_put_data(skb, &eml_capa, sizeof(eml_capa));
|
||||
|
||||
/* add EML_CAPA only if needed, see Draft P802.11be_D2.1, 35.3.17 */
|
||||
if (eml_capa &
|
||||
cpu_to_le16((IEEE80211_EML_CAP_EMLSR_SUPP |
|
||||
IEEE80211_EML_CAP_EMLMR_SUPPORT))) {
|
||||
common->len += 2; /* EML capabilities */
|
||||
ml_elem->control |=
|
||||
cpu_to_le16(IEEE80211_MLC_BASIC_PRES_EML_CAPA);
|
||||
skb_put_data(skb, &eml_capa, sizeof(eml_capa));
|
||||
}
|
||||
/* need indication from userspace to support this */
|
||||
mld_capa_ops &= ~cpu_to_le16(IEEE80211_MLD_CAP_OP_TID_TO_LINK_MAP_NEG_SUPP);
|
||||
skb_put_data(skb, &mld_capa_ops, sizeof(mld_capa_ops));
|
||||
@ -1902,7 +1912,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_link_data *link,
|
||||
IEEE80211_QUEUE_STOP_REASON_CSA);
|
||||
mutex_unlock(&local->mtx);
|
||||
|
||||
cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef,
|
||||
cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef, 0,
|
||||
csa_ie.count, csa_ie.mode);
|
||||
|
||||
if (local->ops->channel_switch) {
|
||||
@ -3905,6 +3915,7 @@ static bool ieee80211_assoc_config_link(struct ieee80211_link_data *link,
|
||||
.len = elem_len,
|
||||
.bss = cbss,
|
||||
.link_id = link == &sdata->deflink ? -1 : link->link_id,
|
||||
.from_ap = true,
|
||||
};
|
||||
bool is_6ghz = cbss->channel->band == NL80211_BAND_6GHZ;
|
||||
bool is_s1g = cbss->channel->band == NL80211_BAND_S1GHZ;
|
||||
@ -4573,6 +4584,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||
bool is_6ghz = cbss->channel->band == NL80211_BAND_6GHZ;
|
||||
bool is_5ghz = cbss->channel->band == NL80211_BAND_5GHZ;
|
||||
struct ieee80211_bss *bss = (void *)cbss->priv;
|
||||
struct ieee80211_elems_parse_params parse_params = {
|
||||
.bss = cbss,
|
||||
.link_id = -1,
|
||||
.from_ap = true,
|
||||
};
|
||||
struct ieee802_11_elems *elems;
|
||||
const struct cfg80211_bss_ies *ies;
|
||||
int ret;
|
||||
@ -4582,7 +4598,9 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
||||
rcu_read_lock();
|
||||
|
||||
ies = rcu_dereference(cbss->ies);
|
||||
elems = ieee802_11_parse_elems(ies->data, ies->len, false, cbss);
|
||||
parse_params.start = ies->data;
|
||||
parse_params.len = ies->len;
|
||||
elems = ieee802_11_parse_elems_full(&parse_params);
|
||||
if (!elems) {
|
||||
rcu_read_unlock();
|
||||
return -ENOMEM;
|
||||
@ -4937,6 +4955,11 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
|
||||
u16 capab_info, status_code, aid;
|
||||
struct ieee80211_elems_parse_params parse_params = {
|
||||
.bss = NULL,
|
||||
.link_id = -1,
|
||||
.from_ap = true,
|
||||
};
|
||||
struct ieee802_11_elems *elems;
|
||||
int ac;
|
||||
const u8 *elem_start;
|
||||
@ -4991,7 +5014,9 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
return;
|
||||
|
||||
elem_len = len - (elem_start - (u8 *)mgmt);
|
||||
elems = ieee802_11_parse_elems(elem_start, elem_len, false, NULL);
|
||||
parse_params.start = elem_start;
|
||||
parse_params.len = elem_len;
|
||||
elems = ieee802_11_parse_elems_full(&parse_params);
|
||||
if (!elems)
|
||||
goto notify_driver;
|
||||
|
||||
@ -5124,7 +5149,7 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
|
||||
resp.req_ies = ifmgd->assoc_req_ies;
|
||||
resp.req_ies_len = ifmgd->assoc_req_ies_len;
|
||||
if (sdata->vif.valid_links)
|
||||
resp.ap_mld_addr = assoc_data->ap_addr;
|
||||
resp.ap_mld_addr = sdata->vif.cfg.ap_addr;
|
||||
cfg80211_rx_assoc_resp(sdata->dev, &resp);
|
||||
notify_driver:
|
||||
drv_mgd_complete_tx(sdata->local, sdata, &info);
|
||||
@ -5356,6 +5381,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
|
||||
u32 ncrc = 0;
|
||||
u8 *bssid, *variable = mgmt->u.beacon.variable;
|
||||
u8 deauth_buf[IEEE80211_DEAUTH_FRAME_LEN];
|
||||
struct ieee80211_elems_parse_params parse_params = {
|
||||
.link_id = -1,
|
||||
.from_ap = true,
|
||||
};
|
||||
|
||||
sdata_assert_lock(sdata);
|
||||
|
||||
@ -5374,6 +5403,9 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
|
||||
if (baselen > len)
|
||||
return;
|
||||
|
||||
parse_params.start = variable;
|
||||
parse_params.len = len - baselen;
|
||||
|
||||
rcu_read_lock();
|
||||
chanctx_conf = rcu_dereference(link->conf->chanctx_conf);
|
||||
if (!chanctx_conf) {
|
||||
@ -5392,8 +5424,8 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
|
||||
if (ifmgd->assoc_data && ifmgd->assoc_data->need_beacon &&
|
||||
!WARN_ON(sdata->vif.valid_links) &&
|
||||
ieee80211_rx_our_beacon(bssid, ifmgd->assoc_data->link[0].bss)) {
|
||||
elems = ieee802_11_parse_elems(variable, len - baselen, false,
|
||||
ifmgd->assoc_data->link[0].bss);
|
||||
parse_params.bss = ifmgd->assoc_data->link[0].bss;
|
||||
elems = ieee802_11_parse_elems_full(&parse_params);
|
||||
if (!elems)
|
||||
return;
|
||||
|
||||
@ -5459,9 +5491,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_link_data *link,
|
||||
*/
|
||||
if (!ieee80211_is_s1g_beacon(hdr->frame_control))
|
||||
ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4);
|
||||
elems = ieee802_11_parse_elems_crc(variable, len - baselen,
|
||||
false, care_about_ies, ncrc,
|
||||
link->u.mgd.bss);
|
||||
parse_params.bss = link->u.mgd.bss;
|
||||
parse_params.filter = care_about_ies;
|
||||
parse_params.crc = ncrc;
|
||||
elems = ieee802_11_parse_elems_full(&parse_params);
|
||||
if (!elems)
|
||||
return;
|
||||
ncrc = elems->crc;
|
||||
@ -5671,6 +5704,13 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
sdata_lock(sdata);
|
||||
|
||||
if (rx_status->link_valid) {
|
||||
link = sdata_dereference(sdata->link[rx_status->link_id],
|
||||
sdata);
|
||||
if (!link)
|
||||
goto out;
|
||||
}
|
||||
|
||||
switch (fc & IEEE80211_FCTL_STYPE) {
|
||||
case IEEE80211_STYPE_BEACON:
|
||||
ieee80211_rx_mgmt_beacon(link, (void *)mgmt,
|
||||
@ -5747,6 +5787,7 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
break;
|
||||
}
|
||||
out:
|
||||
sdata_unlock(sdata);
|
||||
}
|
||||
|
||||
|
@ -215,9 +215,19 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,
|
||||
}
|
||||
|
||||
static void __ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
|
||||
int link_id,
|
||||
struct sta_info *sta,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
|
||||
if (link_id >= 0) {
|
||||
status->link_valid = 1;
|
||||
status->link_id = link_id;
|
||||
} else {
|
||||
status->link_valid = 0;
|
||||
}
|
||||
|
||||
skb_queue_tail(&sdata->skb_queue, skb);
|
||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||
if (sta)
|
||||
@ -225,11 +235,12 @@ static void __ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
static void ieee80211_queue_skb_to_iface(struct ieee80211_sub_if_data *sdata,
|
||||
int link_id,
|
||||
struct sta_info *sta,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
skb->protocol = 0;
|
||||
__ieee80211_queue_skb_to_iface(sdata, sta, skb);
|
||||
__ieee80211_queue_skb_to_iface(sdata, link_id, sta, skb);
|
||||
}
|
||||
|
||||
static void ieee80211_handle_mu_mimo_mon(struct ieee80211_sub_if_data *sdata,
|
||||
@ -272,7 +283,7 @@ static void ieee80211_handle_mu_mimo_mon(struct ieee80211_sub_if_data *sdata,
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
ieee80211_queue_skb_to_iface(sdata, NULL, skb);
|
||||
ieee80211_queue_skb_to_iface(sdata, -1, NULL, skb);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1394,7 +1405,7 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx,
|
||||
/* if this mpdu is fragmented - terminate rx aggregation session */
|
||||
sc = le16_to_cpu(hdr->seq_ctrl);
|
||||
if (sc & IEEE80211_SCTL_FRAG) {
|
||||
ieee80211_queue_skb_to_iface(rx->sdata, NULL, skb);
|
||||
ieee80211_queue_skb_to_iface(rx->sdata, rx->link_id, NULL, skb);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1854,7 +1865,6 @@ static struct ieee80211_key *
|
||||
ieee80211_rx_get_bigtk(struct ieee80211_rx_data *rx, int idx)
|
||||
{
|
||||
struct ieee80211_key *key = NULL;
|
||||
struct ieee80211_sub_if_data *sdata = rx->sdata;
|
||||
int idx2;
|
||||
|
||||
/* Make sure key gets set if either BIGTK key index is set so that
|
||||
@ -1873,14 +1883,14 @@ ieee80211_rx_get_bigtk(struct ieee80211_rx_data *rx, int idx)
|
||||
idx2 = idx - 1;
|
||||
}
|
||||
|
||||
if (rx->sta)
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[idx]);
|
||||
if (rx->link_sta)
|
||||
key = rcu_dereference(rx->link_sta->gtk[idx]);
|
||||
if (!key)
|
||||
key = rcu_dereference(sdata->deflink.gtk[idx]);
|
||||
if (!key && rx->sta)
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[idx2]);
|
||||
key = rcu_dereference(rx->link->gtk[idx]);
|
||||
if (!key && rx->link_sta)
|
||||
key = rcu_dereference(rx->link_sta->gtk[idx2]);
|
||||
if (!key)
|
||||
key = rcu_dereference(sdata->deflink.gtk[idx2]);
|
||||
key = rcu_dereference(rx->link->gtk[idx2]);
|
||||
|
||||
return key;
|
||||
}
|
||||
@ -1986,15 +1996,15 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
if (mmie_keyidx < NUM_DEFAULT_KEYS ||
|
||||
mmie_keyidx >= NUM_DEFAULT_KEYS + NUM_DEFAULT_MGMT_KEYS)
|
||||
return RX_DROP_MONITOR; /* unexpected BIP keyidx */
|
||||
if (rx->sta) {
|
||||
if (rx->link_sta) {
|
||||
if (ieee80211_is_group_privacy_action(skb) &&
|
||||
test_sta_flag(rx->sta, WLAN_STA_MFP))
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
rx->key = rcu_dereference(rx->sta->deflink.gtk[mmie_keyidx]);
|
||||
rx->key = rcu_dereference(rx->link_sta->gtk[mmie_keyidx]);
|
||||
}
|
||||
if (!rx->key)
|
||||
rx->key = rcu_dereference(rx->sdata->deflink.gtk[mmie_keyidx]);
|
||||
rx->key = rcu_dereference(rx->link->gtk[mmie_keyidx]);
|
||||
} else if (!ieee80211_has_protected(fc)) {
|
||||
/*
|
||||
* The frame was not protected, so skip decryption. However, we
|
||||
@ -2003,25 +2013,24 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
* have been expected.
|
||||
*/
|
||||
struct ieee80211_key *key = NULL;
|
||||
struct ieee80211_sub_if_data *sdata = rx->sdata;
|
||||
int i;
|
||||
|
||||
if (ieee80211_is_beacon(fc)) {
|
||||
key = ieee80211_rx_get_bigtk(rx, -1);
|
||||
} else if (ieee80211_is_mgmt(fc) &&
|
||||
is_multicast_ether_addr(hdr->addr1)) {
|
||||
key = rcu_dereference(rx->sdata->deflink.default_mgmt_key);
|
||||
key = rcu_dereference(rx->link->default_mgmt_key);
|
||||
} else {
|
||||
if (rx->sta) {
|
||||
if (rx->link_sta) {
|
||||
for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
|
||||
key = rcu_dereference(rx->sta->deflink.gtk[i]);
|
||||
key = rcu_dereference(rx->link_sta->gtk[i]);
|
||||
if (key)
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!key) {
|
||||
for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
|
||||
key = rcu_dereference(sdata->deflink.gtk[i]);
|
||||
key = rcu_dereference(rx->link->gtk[i]);
|
||||
if (key)
|
||||
break;
|
||||
}
|
||||
@ -2050,13 +2059,13 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx)
|
||||
return RX_DROP_UNUSABLE;
|
||||
|
||||
/* check per-station GTK first, if multicast packet */
|
||||
if (is_multicast_ether_addr(hdr->addr1) && rx->sta)
|
||||
rx->key = rcu_dereference(rx->sta->deflink.gtk[keyidx]);
|
||||
if (is_multicast_ether_addr(hdr->addr1) && rx->link_sta)
|
||||
rx->key = rcu_dereference(rx->link_sta->gtk[keyidx]);
|
||||
|
||||
/* if not found, try default key */
|
||||
if (!rx->key) {
|
||||
if (is_multicast_ether_addr(hdr->addr1))
|
||||
rx->key = rcu_dereference(rx->sdata->deflink.gtk[keyidx]);
|
||||
rx->key = rcu_dereference(rx->link->gtk[keyidx]);
|
||||
if (!rx->key)
|
||||
rx->key = rcu_dereference(rx->sdata->keys[keyidx]);
|
||||
|
||||
@ -3046,7 +3055,8 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
|
||||
(tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_REQUEST ||
|
||||
tf->action_code == WLAN_TDLS_CHANNEL_SWITCH_RESPONSE)) {
|
||||
rx->skb->protocol = cpu_to_be16(ETH_P_TDLS);
|
||||
__ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb);
|
||||
__ieee80211_queue_skb_to_iface(sdata, rx->link_id,
|
||||
rx->sta, rx->skb);
|
||||
return RX_QUEUED;
|
||||
}
|
||||
}
|
||||
@ -3636,7 +3646,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
return RX_QUEUED;
|
||||
|
||||
queue:
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb);
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb);
|
||||
return RX_QUEUED;
|
||||
}
|
||||
|
||||
@ -3794,7 +3804,7 @@ ieee80211_rx_h_ext(struct ieee80211_rx_data *rx)
|
||||
return RX_DROP_MONITOR;
|
||||
|
||||
/* for now only beacons are ext, so queue them */
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb);
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb);
|
||||
|
||||
return RX_QUEUED;
|
||||
}
|
||||
@ -3851,7 +3861,7 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_data *rx)
|
||||
return RX_DROP_MONITOR;
|
||||
}
|
||||
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->sta, rx->skb);
|
||||
ieee80211_queue_skb_to_iface(sdata, rx->link_id, rx->sta, rx->skb);
|
||||
|
||||
return RX_QUEUED;
|
||||
}
|
||||
@ -4508,6 +4518,15 @@ void ieee80211_check_fast_rx_iface(struct ieee80211_sub_if_data *sdata)
|
||||
mutex_unlock(&local->sta_mtx);
|
||||
}
|
||||
|
||||
static bool
|
||||
ieee80211_rx_is_valid_sta_link_id(struct ieee80211_sta *sta, u8 link_id)
|
||||
{
|
||||
if (!sta->mlo)
|
||||
return false;
|
||||
|
||||
return !!(sta->valid_links & BIT(link_id));
|
||||
}
|
||||
|
||||
static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
struct ieee80211_fast_rx *fast_rx,
|
||||
int orig_len)
|
||||
@ -4515,19 +4534,30 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
struct ieee80211_sta_rx_stats *stats;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
|
||||
struct sta_info *sta = rx->sta;
|
||||
struct link_sta_info *link_sta;
|
||||
struct sk_buff *skb = rx->skb;
|
||||
void *sa = skb->data + ETH_ALEN;
|
||||
void *da = skb->data;
|
||||
|
||||
stats = &sta->deflink.rx_stats;
|
||||
if (rx->link_id >= 0) {
|
||||
link_sta = rcu_dereference(sta->link[rx->link_id]);
|
||||
if (WARN_ON_ONCE(!link_sta)) {
|
||||
dev_kfree_skb(rx->skb);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
link_sta = &sta->deflink;
|
||||
}
|
||||
|
||||
stats = &link_sta->rx_stats;
|
||||
if (fast_rx->uses_rss)
|
||||
stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
|
||||
stats = this_cpu_ptr(link_sta->pcpu_rx_stats);
|
||||
|
||||
/* statistics part of ieee80211_rx_h_sta_process() */
|
||||
if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) {
|
||||
stats->last_signal = status->signal;
|
||||
if (!fast_rx->uses_rss)
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.signal,
|
||||
ewma_signal_add(&link_sta->rx_stats_avg.signal,
|
||||
-status->signal);
|
||||
}
|
||||
|
||||
@ -4543,7 +4573,7 @@ static void ieee80211_rx_8023(struct ieee80211_rx_data *rx,
|
||||
|
||||
stats->chain_signal_last[i] = signal;
|
||||
if (!fast_rx->uses_rss)
|
||||
ewma_signal_add(&sta->deflink.rx_stats_avg.chain_signal[i],
|
||||
ewma_signal_add(&link_sta->rx_stats_avg.chain_signal[i],
|
||||
-signal);
|
||||
}
|
||||
}
|
||||
@ -4619,7 +4649,8 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
u8 da[ETH_ALEN];
|
||||
u8 sa[ETH_ALEN];
|
||||
} addrs __aligned(2);
|
||||
struct ieee80211_sta_rx_stats *stats = &sta->deflink.rx_stats;
|
||||
struct link_sta_info *link_sta;
|
||||
struct ieee80211_sta_rx_stats *stats;
|
||||
|
||||
/* for parallel-rx, we need to have DUP_VALIDATED, otherwise we write
|
||||
* to a common data structure; drivers can implement that per queue
|
||||
@ -4720,8 +4751,19 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
|
||||
return true;
|
||||
drop:
|
||||
dev_kfree_skb(skb);
|
||||
|
||||
if (rx->link_id >= 0) {
|
||||
link_sta = rcu_dereference(sta->link[rx->link_id]);
|
||||
if (!link_sta)
|
||||
return true;
|
||||
} else {
|
||||
link_sta = &sta->deflink;
|
||||
}
|
||||
|
||||
if (fast_rx->uses_rss)
|
||||
stats = this_cpu_ptr(sta->deflink.pcpu_rx_stats);
|
||||
stats = this_cpu_ptr(link_sta->pcpu_rx_stats);
|
||||
else
|
||||
stats = &link_sta->rx_stats;
|
||||
|
||||
stats->dropped++;
|
||||
return true;
|
||||
@ -4769,7 +4811,17 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
|
||||
if (!link)
|
||||
return true;
|
||||
rx->link = link;
|
||||
|
||||
if (rx->sta) {
|
||||
rx->link_sta =
|
||||
rcu_dereference(rx->sta->link[rx->link_id]);
|
||||
if (!rx->link_sta)
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
if (rx->sta)
|
||||
rx->link_sta = &rx->sta->deflink;
|
||||
|
||||
rx->link = &sdata->deflink;
|
||||
}
|
||||
|
||||
@ -4827,6 +4879,7 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
|
||||
struct list_head *list)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct ieee80211_fast_rx *fast_rx;
|
||||
struct ieee80211_rx_data rx;
|
||||
|
||||
@ -4847,7 +4900,31 @@ static void __ieee80211_rx_handle_8023(struct ieee80211_hw *hw,
|
||||
|
||||
rx.sta = container_of(pubsta, struct sta_info, sta);
|
||||
rx.sdata = rx.sta->sdata;
|
||||
rx.link = &rx.sdata->deflink;
|
||||
|
||||
if (status->link_valid &&
|
||||
!ieee80211_rx_is_valid_sta_link_id(pubsta, status->link_id))
|
||||
goto drop;
|
||||
|
||||
/*
|
||||
* TODO: Should the frame be dropped if the right link_id is not
|
||||
* available? Or may be it is fine in the current form to proceed with
|
||||
* the frame processing because with frame being in 802.3 format,
|
||||
* link_id is used only for stats purpose and updating the stats on
|
||||
* the deflink is fine?
|
||||
*/
|
||||
if (status->link_valid)
|
||||
rx.link_id = status->link_id;
|
||||
|
||||
if (rx.link_id >= 0) {
|
||||
struct ieee80211_link_data *link;
|
||||
|
||||
link = rcu_dereference(rx.sdata->link[rx.link_id]);
|
||||
if (!link)
|
||||
goto drop;
|
||||
rx.link = link;
|
||||
} else {
|
||||
rx.link = &rx.sdata->deflink;
|
||||
}
|
||||
|
||||
fast_rx = rcu_dereference(rx.sta->fast_rx);
|
||||
if (!fast_rx)
|
||||
@ -4877,7 +4954,19 @@ static bool ieee80211_rx_for_interface(struct ieee80211_rx_data *rx,
|
||||
rx->sta = link_sta->sta;
|
||||
rx->link_id = link_sta->link_id;
|
||||
} else {
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
|
||||
rx->sta = sta_info_get_bss(rx->sdata, hdr->addr2);
|
||||
if (rx->sta) {
|
||||
if (status->link_valid &&
|
||||
!ieee80211_rx_is_valid_sta_link_id(&rx->sta->sta,
|
||||
status->link_id))
|
||||
return false;
|
||||
|
||||
rx->link_id = status->link_valid ? status->link_id : -1;
|
||||
} else {
|
||||
rx->link_id = -1;
|
||||
}
|
||||
}
|
||||
|
||||
return ieee80211_prepare_and_rx_handle(rx, skb, consume);
|
||||
@ -4893,6 +4982,7 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||
struct list_head *list)
|
||||
{
|
||||
struct ieee80211_local *local = hw_to_local(hw);
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
struct ieee80211_sub_if_data *sdata;
|
||||
struct ieee80211_hdr *hdr;
|
||||
__le16 fc;
|
||||
@ -4937,10 +5027,39 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||
|
||||
if (ieee80211_is_data(fc)) {
|
||||
struct sta_info *sta, *prev_sta;
|
||||
u8 link_id = status->link_id;
|
||||
|
||||
if (pubsta) {
|
||||
rx.sta = container_of(pubsta, struct sta_info, sta);
|
||||
rx.sdata = rx.sta->sdata;
|
||||
|
||||
if (status->link_valid &&
|
||||
!ieee80211_rx_is_valid_sta_link_id(pubsta, link_id))
|
||||
goto out;
|
||||
|
||||
if (status->link_valid)
|
||||
rx.link_id = status->link_id;
|
||||
|
||||
/*
|
||||
* In MLO connection, fetch the link_id using addr2
|
||||
* when the driver does not pass link_id in status.
|
||||
* When the address translation is already performed by
|
||||
* driver/hw, the valid link_id must be passed in
|
||||
* status.
|
||||
*/
|
||||
|
||||
if (!status->link_valid && pubsta->mlo) {
|
||||
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||
struct link_sta_info *link_sta;
|
||||
|
||||
link_sta = link_sta_info_get_bss(rx.sdata,
|
||||
hdr->addr2);
|
||||
if (!link_sta)
|
||||
goto out;
|
||||
|
||||
rx.link_id = link_sta->link_id;
|
||||
}
|
||||
|
||||
if (ieee80211_prepare_and_rx_handle(&rx, skb, true))
|
||||
return;
|
||||
goto out;
|
||||
@ -4954,6 +5073,13 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((status->link_valid &&
|
||||
!ieee80211_rx_is_valid_sta_link_id(&prev_sta->sta,
|
||||
link_id)) ||
|
||||
(!status->link_valid && prev_sta->sta.mlo))
|
||||
continue;
|
||||
|
||||
rx.link_id = status->link_valid ? link_id : -1;
|
||||
rx.sta = prev_sta;
|
||||
rx.sdata = prev_sta->sdata;
|
||||
ieee80211_prepare_and_rx_handle(&rx, skb, false);
|
||||
@ -4962,6 +5088,13 @@ static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
if (prev_sta) {
|
||||
if ((status->link_valid &&
|
||||
!ieee80211_rx_is_valid_sta_link_id(&prev_sta->sta,
|
||||
link_id)) ||
|
||||
(!status->link_valid && prev_sta->sta.mlo))
|
||||
goto out;
|
||||
|
||||
rx.link_id = status->link_valid ? link_id : -1;
|
||||
rx.sta = prev_sta;
|
||||
rx.sdata = prev_sta->sdata;
|
||||
|
||||
@ -5104,6 +5237,9 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_sta *pubsta,
|
||||
}
|
||||
}
|
||||
|
||||
if (WARN_ON_ONCE(status->link_id >= IEEE80211_LINK_UNSPECIFIED))
|
||||
goto drop;
|
||||
|
||||
status->rx_flags = 0;
|
||||
|
||||
kcov_remote_start_common(skb_get_kcov_handle(skb));
|
||||
|
@ -472,6 +472,7 @@ static void sta_info_add_link(struct sta_info *sta,
|
||||
link_info->sta = sta;
|
||||
link_info->link_id = link_id;
|
||||
link_info->pub = link_sta;
|
||||
link_sta->link_id = link_id;
|
||||
rcu_assign_pointer(sta->link[link_id], link_info);
|
||||
rcu_assign_pointer(sta->sta.link[link_id], link_sta);
|
||||
}
|
||||
@ -2777,10 +2778,8 @@ int ieee80211_sta_activate_link(struct sta_info *sta, unsigned int link_id)
|
||||
|
||||
sta->sta.valid_links = new_links;
|
||||
|
||||
if (!test_sta_flag(sta, WLAN_STA_INSERTED)) {
|
||||
ret = 0;
|
||||
if (!test_sta_flag(sta, WLAN_STA_INSERTED))
|
||||
goto hash;
|
||||
}
|
||||
|
||||
ret = drv_change_sta_links(sdata->local, sdata, &sta->sta,
|
||||
old_links, new_links);
|
||||
@ -2799,6 +2798,7 @@ hash:
|
||||
void ieee80211_sta_remove_link(struct sta_info *sta, unsigned int link_id)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
u16 old_links = sta->sta.valid_links;
|
||||
|
||||
lockdep_assert_held(&sdata->local->sta_mtx);
|
||||
|
||||
@ -2806,8 +2806,7 @@ void ieee80211_sta_remove_link(struct sta_info *sta, unsigned int link_id)
|
||||
|
||||
if (test_sta_flag(sta, WLAN_STA_INSERTED))
|
||||
drv_change_sta_links(sdata->local, sdata, &sta->sta,
|
||||
sta->sta.valid_links,
|
||||
sta->sta.valid_links & ~BIT(link_id));
|
||||
old_links, sta->sta.valid_links);
|
||||
|
||||
sta_remove_link(sta, link_id, true);
|
||||
}
|
||||
|
@ -576,6 +576,51 @@ ieee80211_tx_h_check_control_port_protocol(struct ieee80211_tx_data *tx)
|
||||
return TX_CONTINUE;
|
||||
}
|
||||
|
||||
static struct ieee80211_key *
|
||||
ieee80211_select_link_key(struct ieee80211_tx_data *tx)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
|
||||
enum {
|
||||
USE_NONE,
|
||||
USE_MGMT_KEY,
|
||||
USE_MCAST_KEY,
|
||||
} which_key = USE_NONE;
|
||||
struct ieee80211_link_data *link;
|
||||
unsigned int link_id;
|
||||
|
||||
if (ieee80211_is_group_privacy_action(tx->skb))
|
||||
which_key = USE_MCAST_KEY;
|
||||
else if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
is_multicast_ether_addr(hdr->addr1) &&
|
||||
ieee80211_is_robust_mgmt_frame(tx->skb))
|
||||
which_key = USE_MGMT_KEY;
|
||||
else if (is_multicast_ether_addr(hdr->addr1))
|
||||
which_key = USE_MCAST_KEY;
|
||||
else
|
||||
return NULL;
|
||||
|
||||
link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
|
||||
if (link_id == IEEE80211_LINK_UNSPECIFIED) {
|
||||
link = &tx->sdata->deflink;
|
||||
} else {
|
||||
link = rcu_dereference(tx->sdata->link[link_id]);
|
||||
if (!link)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch (which_key) {
|
||||
case USE_NONE:
|
||||
break;
|
||||
case USE_MGMT_KEY:
|
||||
return rcu_dereference(link->default_mgmt_key);
|
||||
case USE_MCAST_KEY:
|
||||
return rcu_dereference(link->default_multicast_key);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ieee80211_tx_result debug_noinline
|
||||
ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
||||
{
|
||||
@ -591,16 +636,7 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx)
|
||||
if (tx->sta &&
|
||||
(key = rcu_dereference(tx->sta->ptk[tx->sta->ptk_idx])))
|
||||
tx->key = key;
|
||||
else if (ieee80211_is_group_privacy_action(tx->skb) &&
|
||||
(key = rcu_dereference(tx->sdata->deflink.default_multicast_key)))
|
||||
tx->key = key;
|
||||
else if (ieee80211_is_mgmt(hdr->frame_control) &&
|
||||
is_multicast_ether_addr(hdr->addr1) &&
|
||||
ieee80211_is_robust_mgmt_frame(tx->skb) &&
|
||||
(key = rcu_dereference(tx->sdata->deflink.default_mgmt_key)))
|
||||
tx->key = key;
|
||||
else if (is_multicast_ether_addr(hdr->addr1) &&
|
||||
(key = rcu_dereference(tx->sdata->deflink.default_multicast_key)))
|
||||
else if ((key = ieee80211_select_link_key(tx)))
|
||||
tx->key = key;
|
||||
else if (!is_multicast_ether_addr(hdr->addr1) &&
|
||||
(key = rcu_dereference(tx->sdata->default_unicast_key)))
|
||||
@ -2640,7 +2676,8 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
|
||||
goto free;
|
||||
}
|
||||
memcpy(hdr.addr2, link->conf->addr, ETH_ALEN);
|
||||
} else if (link_id == IEEE80211_LINK_UNSPECIFIED) {
|
||||
} else if (link_id == IEEE80211_LINK_UNSPECIFIED ||
|
||||
(sta && sta->sta.mlo)) {
|
||||
memcpy(hdr.addr2, sdata->vif.addr, ETH_ALEN);
|
||||
} else {
|
||||
struct ieee80211_bss_conf *conf;
|
||||
@ -3735,8 +3772,8 @@ begin:
|
||||
!test_sta_flag(tx.sta, WLAN_STA_AUTHORIZED) &&
|
||||
(!(info->control.flags &
|
||||
IEEE80211_TX_CTRL_PORT_CTRL_PROTO) ||
|
||||
!ether_addr_equal(tx.sdata->vif.addr,
|
||||
hdr->addr2)))) {
|
||||
!ieee80211_is_our_addr(tx.sdata, hdr->addr2,
|
||||
NULL)))) {
|
||||
I802_DEBUG_INC(local->tx_handlers_drop_unauth_port);
|
||||
ieee80211_free_txskb(&local->hw, skb);
|
||||
goto begin;
|
||||
@ -5061,6 +5098,8 @@ ieee80211_beacon_get_finish(struct ieee80211_hw *hw,
|
||||
rate_control_get_rate(sdata, NULL, &txrc);
|
||||
|
||||
info->control.vif = vif;
|
||||
info->control.flags |= u32_encode_bits(link->link_id,
|
||||
IEEE80211_TX_CTRL_MLO_LINK);
|
||||
info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT |
|
||||
IEEE80211_TX_CTL_ASSIGN_SEQ |
|
||||
IEEE80211_TX_CTL_FIRST_FRAGMENT;
|
||||
|
@ -954,9 +954,11 @@ void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_queue_delayed_work);
|
||||
|
||||
static void ieee80211_parse_extension_element(u32 *crc,
|
||||
const struct element *elem,
|
||||
struct ieee802_11_elems *elems)
|
||||
static void
|
||||
ieee80211_parse_extension_element(u32 *crc,
|
||||
const struct element *elem,
|
||||
struct ieee802_11_elems *elems,
|
||||
struct ieee80211_elems_parse_params *params)
|
||||
{
|
||||
const void *data = elem->data + 1;
|
||||
u8 len;
|
||||
@ -1013,7 +1015,8 @@ static void ieee80211_parse_extension_element(u32 *crc,
|
||||
break;
|
||||
case WLAN_EID_EXT_EHT_CAPABILITY:
|
||||
if (ieee80211_eht_capa_size_ok(elems->he_cap,
|
||||
data, len)) {
|
||||
data, len,
|
||||
params->from_ap)) {
|
||||
elems->eht_cap = data;
|
||||
elems->eht_cap_len = len;
|
||||
}
|
||||
@ -1385,7 +1388,7 @@ _ieee802_11_parse_elems_full(struct ieee80211_elems_parse_params *params,
|
||||
case WLAN_EID_EXTENSION:
|
||||
ieee80211_parse_extension_element(calc_crc ?
|
||||
&crc : NULL,
|
||||
elem, elems);
|
||||
elem, elems, params);
|
||||
break;
|
||||
case WLAN_EID_S1G_CAPABILITIES:
|
||||
if (elen >= sizeof(*elems->s1g_capab))
|
||||
@ -2025,7 +2028,8 @@ static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
|
||||
cfg80211_any_usable_channels(local->hw.wiphy, BIT(sband->band),
|
||||
IEEE80211_CHAN_NO_HE |
|
||||
IEEE80211_CHAN_NO_EHT)) {
|
||||
pos = ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, end);
|
||||
pos = ieee80211_ie_build_eht_cap(pos, he_cap, eht_cap, end,
|
||||
sdata->vif.type == NL80211_IFTYPE_AP);
|
||||
if (!pos)
|
||||
goto out_err;
|
||||
}
|
||||
@ -3080,6 +3084,7 @@ end:
|
||||
}
|
||||
|
||||
void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
|
||||
enum ieee80211_smps_mode smps_mode,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
@ -3106,7 +3111,7 @@ void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
|
||||
cap = le16_to_cpu(iftd->he_6ghz_capa.capa);
|
||||
cap &= ~IEEE80211_HE_6GHZ_CAP_SM_PS;
|
||||
|
||||
switch (sdata->deflink.smps_mode) {
|
||||
switch (smps_mode) {
|
||||
case IEEE80211_SMPS_AUTOMATIC:
|
||||
case IEEE80211_SMPS_NUM_MODES:
|
||||
WARN_ON(1);
|
||||
@ -4770,6 +4775,7 @@ u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
|
||||
const struct ieee80211_sta_he_cap *he_cap;
|
||||
const struct ieee80211_sta_eht_cap *eht_cap;
|
||||
struct ieee80211_supported_band *sband;
|
||||
bool is_ap;
|
||||
u8 n;
|
||||
|
||||
sband = ieee80211_get_sband(sdata);
|
||||
@ -4781,8 +4787,12 @@ u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
|
||||
if (!he_cap || !eht_cap)
|
||||
return 0;
|
||||
|
||||
is_ap = iftype == NL80211_IFTYPE_AP ||
|
||||
iftype == NL80211_IFTYPE_P2P_GO;
|
||||
|
||||
n = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
|
||||
&eht_cap->eht_cap_elem);
|
||||
&eht_cap->eht_cap_elem,
|
||||
is_ap);
|
||||
return 2 + 1 +
|
||||
sizeof(he_cap->he_cap_elem) + n +
|
||||
ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
|
||||
@ -4793,7 +4803,8 @@ u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
|
||||
u8 *ieee80211_ie_build_eht_cap(u8 *pos,
|
||||
const struct ieee80211_sta_he_cap *he_cap,
|
||||
const struct ieee80211_sta_eht_cap *eht_cap,
|
||||
u8 *end)
|
||||
u8 *end,
|
||||
bool for_ap)
|
||||
{
|
||||
u8 mcs_nss_len, ppet_len;
|
||||
u8 ie_len;
|
||||
@ -4804,7 +4815,8 @@ u8 *ieee80211_ie_build_eht_cap(u8 *pos,
|
||||
return orig_pos;
|
||||
|
||||
mcs_nss_len = ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
|
||||
&eht_cap->eht_cap_elem);
|
||||
&eht_cap->eht_cap_elem,
|
||||
for_ap);
|
||||
ppet_len = ieee80211_eht_ppe_size(eht_cap->eht_ppe_thres[0],
|
||||
eht_cap->eht_cap_elem.phy_cap_info);
|
||||
|
||||
|
@ -860,6 +860,9 @@ int wiphy_register(struct wiphy *wiphy)
|
||||
|
||||
for (i = 0; i < sband->n_iftype_data; i++) {
|
||||
const struct ieee80211_sband_iftype_data *iftd;
|
||||
bool has_ap, has_non_ap;
|
||||
u32 ap_bits = BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
|
||||
iftd = &sband->iftype_data[i];
|
||||
|
||||
@ -879,6 +882,19 @@ int wiphy_register(struct wiphy *wiphy)
|
||||
else
|
||||
have_he = have_he &&
|
||||
iftd->he_cap.has_he;
|
||||
|
||||
has_ap = iftd->types_mask & ap_bits;
|
||||
has_non_ap = iftd->types_mask & ~ap_bits;
|
||||
|
||||
/*
|
||||
* For EHT 20 MHz STA, the capabilities format differs
|
||||
* but to simplify, don't check 20 MHz but rather check
|
||||
* only if AP and non-AP were mentioned at the same time,
|
||||
* reject if so.
|
||||
*/
|
||||
if (WARN_ON(iftd->eht_cap.has_eht &&
|
||||
has_ap && has_non_ap))
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (WARN_ON(!have_he && band == NL80211_BAND_6GHZ))
|
||||
|
@ -171,7 +171,7 @@ static void __cfg80211_clear_ibss(struct net_device *dev, bool nowext)
|
||||
*/
|
||||
if (rdev->ops->del_key)
|
||||
for (i = 0; i < 6; i++)
|
||||
rdev_del_key(rdev, dev, i, false, NULL);
|
||||
rdev_del_key(rdev, dev, -1, i, false, NULL);
|
||||
|
||||
if (wdev->u.ibss.current_bss) {
|
||||
cfg80211_unhold_bss(wdev->u.ibss.current_bss);
|
||||
|
@ -1545,7 +1545,6 @@ static int nl80211_key_allowed(struct wireless_dev *wdev)
|
||||
return -ENOLINK;
|
||||
case NL80211_IFTYPE_STATION:
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
/* for MLO, require driver validation of the link ID */
|
||||
if (wdev->connected)
|
||||
return 0;
|
||||
return -ENOLINK;
|
||||
@ -1821,10 +1820,15 @@ nl80211_send_iftype_data(struct sk_buff *msg,
|
||||
if (eht_cap->has_eht && he_cap->has_he) {
|
||||
u8 mcs_nss_size, ppe_thresh_size;
|
||||
u16 ppe_thres_hdr;
|
||||
bool is_ap;
|
||||
|
||||
is_ap = iftdata->types_mask & BIT(NL80211_IFTYPE_AP) ||
|
||||
iftdata->types_mask & BIT(NL80211_IFTYPE_P2P_GO);
|
||||
|
||||
mcs_nss_size =
|
||||
ieee80211_eht_mcs_nss_size(&he_cap->he_cap_elem,
|
||||
&eht_cap->eht_cap_elem);
|
||||
&eht_cap->eht_cap_elem,
|
||||
is_ap);
|
||||
|
||||
ppe_thres_hdr = get_unaligned_le16(&eht_cap->eht_ppe_thres[0]);
|
||||
ppe_thresh_size =
|
||||
@ -3476,8 +3480,21 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
|
||||
if (result)
|
||||
goto out;
|
||||
|
||||
result = rdev_set_txq_params(rdev, netdev,
|
||||
&txq_params);
|
||||
txq_params.link_id =
|
||||
nl80211_link_id_or_invalid(info->attrs);
|
||||
|
||||
wdev_lock(netdev->ieee80211_ptr);
|
||||
if (txq_params.link_id >= 0 &&
|
||||
!(netdev->ieee80211_ptr->valid_links &
|
||||
BIT(txq_params.link_id)))
|
||||
result = -ENOLINK;
|
||||
else if (txq_params.link_id >= 0 &&
|
||||
!netdev->ieee80211_ptr->valid_links)
|
||||
result = -EINVAL;
|
||||
else
|
||||
result = rdev_set_txq_params(rdev, netdev,
|
||||
&txq_params);
|
||||
wdev_unlock(netdev->ieee80211_ptr);
|
||||
if (result)
|
||||
goto out;
|
||||
}
|
||||
@ -3848,12 +3865,19 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag
|
||||
|
||||
for_each_valid_link(wdev, link_id) {
|
||||
struct nlattr *link = nla_nest_start(msg, link_id + 1);
|
||||
struct cfg80211_chan_def chandef = {};
|
||||
int ret;
|
||||
|
||||
if (nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
|
||||
goto nla_put_failure;
|
||||
if (nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN,
|
||||
wdev->links[link_id].addr))
|
||||
goto nla_put_failure;
|
||||
|
||||
ret = rdev_get_channel(rdev, wdev, link_id, &chandef);
|
||||
if (ret == 0 && nl80211_send_chandef(msg, &chandef))
|
||||
goto nla_put_failure;
|
||||
|
||||
nla_nest_end(msg, link);
|
||||
}
|
||||
|
||||
@ -4320,6 +4344,38 @@ static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
|
||||
return rdev_set_noack_map(rdev, dev, noack_map);
|
||||
}
|
||||
|
||||
static int nl80211_validate_key_link_id(struct genl_info *info,
|
||||
struct wireless_dev *wdev,
|
||||
int link_id, bool pairwise)
|
||||
{
|
||||
if (pairwise) {
|
||||
if (link_id != -1) {
|
||||
GENL_SET_ERR_MSG(info,
|
||||
"link ID not allowed for pairwise key");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (wdev->valid_links) {
|
||||
if (link_id == -1) {
|
||||
GENL_SET_ERR_MSG(info,
|
||||
"link ID must for MLO group key");
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!(wdev->valid_links & BIT(link_id))) {
|
||||
GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key");
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (link_id != -1) {
|
||||
GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct get_key_cookie {
|
||||
struct sk_buff *msg;
|
||||
int error;
|
||||
@ -4381,13 +4437,15 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
void *hdr;
|
||||
struct sk_buff *msg;
|
||||
bool bigtk_support = false;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
if (wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION))
|
||||
bigtk_support = true;
|
||||
|
||||
if ((dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION ||
|
||||
dev->ieee80211_ptr->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
|
||||
if ((wdev->iftype == NL80211_IFTYPE_STATION ||
|
||||
wdev->iftype == NL80211_IFTYPE_P2P_CLIENT) &&
|
||||
wiphy_ext_feature_isset(&rdev->wiphy,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||
bigtk_support = true;
|
||||
@ -4439,8 +4497,12 @@ static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
|
||||
nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr))
|
||||
goto nla_put_failure;
|
||||
|
||||
err = rdev_get_key(rdev, dev, key_idx, pairwise, mac_addr, &cookie,
|
||||
get_key_callback);
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise);
|
||||
if (err)
|
||||
goto free_msg;
|
||||
|
||||
err = rdev_get_key(rdev, dev, link_id, key_idx, pairwise, mac_addr,
|
||||
&cookie, get_key_callback);
|
||||
|
||||
if (err)
|
||||
goto free_msg;
|
||||
@ -4464,6 +4526,8 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
struct key_parse key;
|
||||
int err;
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@ -4479,7 +4543,7 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
!(key.p.mode == NL80211_KEY_SET_TX))
|
||||
return -EINVAL;
|
||||
|
||||
wdev_lock(dev->ieee80211_ptr);
|
||||
wdev_lock(wdev);
|
||||
|
||||
if (key.def) {
|
||||
if (!rdev->ops->set_default_key) {
|
||||
@ -4487,18 +4551,22 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||
err = nl80211_key_allowed(wdev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_key(rdev, dev, key.idx,
|
||||
key.def_uni, key.def_multi);
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id, false);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_key(rdev, dev, link_id, key.idx,
|
||||
key.def_uni, key.def_multi);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
dev->ieee80211_ptr->wext.default_key = key.idx;
|
||||
wdev->wext.default_key = key.idx;
|
||||
#endif
|
||||
} else if (key.defmgmt) {
|
||||
if (key.def_uni || !key.def_multi) {
|
||||
@ -4511,16 +4579,20 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||
err = nl80211_key_allowed(wdev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, key.idx);
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id, false);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, link_id, key.idx);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
dev->ieee80211_ptr->wext.default_mgmt_key = key.idx;
|
||||
wdev->wext.default_mgmt_key = key.idx;
|
||||
#endif
|
||||
} else if (key.defbeacon) {
|
||||
if (key.def_uni || !key.def_multi) {
|
||||
@ -4533,11 +4605,15 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||
err = nl80211_key_allowed(wdev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_beacon_key(rdev, dev, key.idx);
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id, false);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_set_default_beacon_key(rdev, dev, link_id, key.idx);
|
||||
if (err)
|
||||
goto out;
|
||||
} else if (key.p.mode == NL80211_KEY_SET_TX &&
|
||||
@ -4553,14 +4629,18 @@ static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = rdev_add_key(rdev, dev, key.idx,
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id, true);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = rdev_add_key(rdev, dev, link_id, key.idx,
|
||||
NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr, &key.p);
|
||||
} else {
|
||||
err = -EINVAL;
|
||||
}
|
||||
out:
|
||||
wdev_unlock(dev->ieee80211_ptr);
|
||||
wdev_unlock(wdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -4572,6 +4652,8 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
struct key_parse key;
|
||||
const u8 *mac_addr = NULL;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@ -4613,18 +4695,23 @@ static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wdev_lock(dev->ieee80211_ptr);
|
||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||
wdev_lock(wdev);
|
||||
err = nl80211_key_allowed(wdev);
|
||||
if (err)
|
||||
GENL_SET_ERR_MSG(info, "key not allowed");
|
||||
|
||||
if (!err)
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE);
|
||||
|
||||
if (!err) {
|
||||
err = rdev_add_key(rdev, dev, key.idx,
|
||||
err = rdev_add_key(rdev, dev, link_id, key.idx,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr, &key.p);
|
||||
if (err)
|
||||
GENL_SET_ERR_MSG(info, "key addition failed");
|
||||
}
|
||||
wdev_unlock(dev->ieee80211_ptr);
|
||||
wdev_unlock(wdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -4636,6 +4723,8 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
struct net_device *dev = info->user_ptr[1];
|
||||
u8 *mac_addr = NULL;
|
||||
struct key_parse key;
|
||||
int link_id = nl80211_link_id_or_invalid(info->attrs);
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
|
||||
err = nl80211_parse_key(info, &key);
|
||||
if (err)
|
||||
@ -4663,27 +4752,31 @@ static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
|
||||
if (!rdev->ops->del_key)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
wdev_lock(dev->ieee80211_ptr);
|
||||
err = nl80211_key_allowed(dev->ieee80211_ptr);
|
||||
wdev_lock(wdev);
|
||||
err = nl80211_key_allowed(wdev);
|
||||
|
||||
if (key.type == NL80211_KEYTYPE_GROUP && mac_addr &&
|
||||
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||
err = -ENOENT;
|
||||
|
||||
if (!err)
|
||||
err = rdev_del_key(rdev, dev, key.idx,
|
||||
err = nl80211_validate_key_link_id(info, wdev, link_id,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE);
|
||||
|
||||
if (!err)
|
||||
err = rdev_del_key(rdev, dev, link_id, key.idx,
|
||||
key.type == NL80211_KEYTYPE_PAIRWISE,
|
||||
mac_addr);
|
||||
|
||||
#ifdef CONFIG_CFG80211_WEXT
|
||||
if (!err) {
|
||||
if (key.idx == dev->ieee80211_ptr->wext.default_key)
|
||||
dev->ieee80211_ptr->wext.default_key = -1;
|
||||
else if (key.idx == dev->ieee80211_ptr->wext.default_mgmt_key)
|
||||
dev->ieee80211_ptr->wext.default_mgmt_key = -1;
|
||||
if (key.idx == wdev->wext.default_key)
|
||||
wdev->wext.default_key = -1;
|
||||
else if (key.idx == wdev->wext.default_mgmt_key)
|
||||
wdev->wext.default_mgmt_key = -1;
|
||||
}
|
||||
#endif
|
||||
wdev_unlock(dev->ieee80211_ptr);
|
||||
wdev_unlock(wdev);
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -5587,7 +5680,7 @@ static int nl80211_calculate_ap_params(struct cfg80211_ap_settings *params)
|
||||
params->eht_cap = (void *)(cap->data + 1);
|
||||
if (!ieee80211_eht_capa_size_ok((const u8 *)params->he_cap,
|
||||
(const u8 *)params->eht_cap,
|
||||
cap->datalen - 1))
|
||||
cap->datalen - 1, true))
|
||||
return -EINVAL;
|
||||
}
|
||||
cap = cfg80211_find_ext_elem(WLAN_EID_EXT_EHT_OPERATION, ies, ies_len);
|
||||
@ -6816,7 +6909,8 @@ static int nl80211_set_station_tdls(struct genl_info *info,
|
||||
|
||||
if (!ieee80211_eht_capa_size_ok((const u8 *)params->link_sta_params.he_capa,
|
||||
(const u8 *)params->link_sta_params.eht_capa,
|
||||
params->link_sta_params.eht_capa_len))
|
||||
params->link_sta_params.eht_capa_len,
|
||||
false))
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -7127,7 +7221,8 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
|
||||
|
||||
if (!ieee80211_eht_capa_size_ok((const u8 *)params.link_sta_params.he_capa,
|
||||
(const u8 *)params.link_sta_params.eht_capa,
|
||||
params.link_sta_params.eht_capa_len))
|
||||
params.link_sta_params.eht_capa_len,
|
||||
false))
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -15887,7 +15982,8 @@ nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info,
|
||||
|
||||
if (!ieee80211_eht_capa_size_ok((const u8 *)params.he_capa,
|
||||
(const u8 *)params.eht_capa,
|
||||
params.eht_capa_len))
|
||||
params.eht_capa_len,
|
||||
false))
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
@ -18836,11 +18932,13 @@ EXPORT_SYMBOL(cfg80211_pmksa_candidate_notify);
|
||||
|
||||
static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev,
|
||||
unsigned int link_id,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
gfp_t gfp,
|
||||
enum nl80211_commands notif,
|
||||
u8 count, bool quiet)
|
||||
{
|
||||
struct wireless_dev *wdev = netdev->ieee80211_ptr;
|
||||
struct sk_buff *msg;
|
||||
void *hdr;
|
||||
|
||||
@ -18857,6 +18955,10 @@ static void nl80211_ch_switch_notify(struct cfg80211_registered_device *rdev,
|
||||
if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, netdev->ifindex))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (wdev->valid_links &&
|
||||
nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, link_id))
|
||||
goto nla_put_failure;
|
||||
|
||||
if (nl80211_send_chandef(msg, chandef))
|
||||
goto nla_put_failure;
|
||||
|
||||
@ -18916,22 +19018,26 @@ void cfg80211_ch_switch_notify(struct net_device *dev,
|
||||
|
||||
cfg80211_sched_dfs_chan_update(rdev);
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
|
||||
nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
|
||||
NL80211_CMD_CH_SWITCH_NOTIFY, 0, false);
|
||||
}
|
||||
EXPORT_SYMBOL(cfg80211_ch_switch_notify);
|
||||
|
||||
void cfg80211_ch_switch_started_notify(struct net_device *dev,
|
||||
struct cfg80211_chan_def *chandef,
|
||||
u8 count, bool quiet)
|
||||
unsigned int link_id, u8 count,
|
||||
bool quiet)
|
||||
{
|
||||
struct wireless_dev *wdev = dev->ieee80211_ptr;
|
||||
struct wiphy *wiphy = wdev->wiphy;
|
||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||
|
||||
trace_cfg80211_ch_switch_started_notify(dev, chandef);
|
||||
ASSERT_WDEV_LOCK(wdev);
|
||||
WARN_INVALID_LINK_ID(wdev, link_id);
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL,
|
||||
trace_cfg80211_ch_switch_started_notify(dev, chandef, link_id);
|
||||
|
||||
nl80211_ch_switch_notify(rdev, dev, link_id, chandef, GFP_KERNEL,
|
||||
NL80211_CMD_CH_SWITCH_STARTED_NOTIFY,
|
||||
count, quiet);
|
||||
}
|
||||
|
@ -77,65 +77,69 @@ rdev_change_virtual_intf(struct cfg80211_registered_device *rdev,
|
||||
}
|
||||
|
||||
static inline int rdev_add_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr,
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
struct key_params *params)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_add_key(&rdev->wiphy, netdev, key_index, pairwise,
|
||||
trace_rdev_add_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
mac_addr, params->mode);
|
||||
ret = rdev->ops->add_key(&rdev->wiphy, netdev, key_index, pairwise,
|
||||
mac_addr, params);
|
||||
ret = rdev->ops->add_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
pairwise, mac_addr, params);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_get_key(struct cfg80211_registered_device *rdev, struct net_device *netdev,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr, void *cookie,
|
||||
int link_id, u8 key_index, bool pairwise, const u8 *mac_addr,
|
||||
void *cookie,
|
||||
void (*callback)(void *cookie, struct key_params*))
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_get_key(&rdev->wiphy, netdev, key_index, pairwise, mac_addr);
|
||||
ret = rdev->ops->get_key(&rdev->wiphy, netdev, key_index, pairwise,
|
||||
mac_addr, cookie, callback);
|
||||
trace_rdev_get_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
mac_addr);
|
||||
ret = rdev->ops->get_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
pairwise, mac_addr, cookie, callback);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int rdev_del_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr)
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_del_key(&rdev->wiphy, netdev, key_index, pairwise, mac_addr);
|
||||
ret = rdev->ops->del_key(&rdev->wiphy, netdev, key_index, pairwise,
|
||||
mac_addr);
|
||||
trace_rdev_del_key(&rdev->wiphy, netdev, link_id, key_index, pairwise,
|
||||
mac_addr);
|
||||
ret = rdev->ops->del_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
pairwise, mac_addr);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_set_default_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u8 key_index, bool unicast,
|
||||
bool multicast)
|
||||
struct net_device *netdev, int link_id, u8 key_index,
|
||||
bool unicast, bool multicast)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_set_default_key(&rdev->wiphy, netdev, key_index,
|
||||
trace_rdev_set_default_key(&rdev->wiphy, netdev, link_id, key_index,
|
||||
unicast, multicast);
|
||||
ret = rdev->ops->set_default_key(&rdev->wiphy, netdev, key_index,
|
||||
unicast, multicast);
|
||||
ret = rdev->ops->set_default_key(&rdev->wiphy, netdev, link_id,
|
||||
key_index, unicast, multicast);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int
|
||||
rdev_set_default_mgmt_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u8 key_index)
|
||||
struct net_device *netdev, int link_id, u8 key_index)
|
||||
{
|
||||
int ret;
|
||||
trace_rdev_set_default_mgmt_key(&rdev->wiphy, netdev, key_index);
|
||||
ret = rdev->ops->set_default_mgmt_key(&rdev->wiphy, netdev,
|
||||
trace_rdev_set_default_mgmt_key(&rdev->wiphy, netdev, link_id,
|
||||
key_index);
|
||||
ret = rdev->ops->set_default_mgmt_key(&rdev->wiphy, netdev, link_id,
|
||||
key_index);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
@ -143,13 +147,15 @@ rdev_set_default_mgmt_key(struct cfg80211_registered_device *rdev,
|
||||
|
||||
static inline int
|
||||
rdev_set_default_beacon_key(struct cfg80211_registered_device *rdev,
|
||||
struct net_device *netdev, u8 key_index)
|
||||
struct net_device *netdev, int link_id,
|
||||
u8 key_index)
|
||||
{
|
||||
int ret;
|
||||
|
||||
trace_rdev_set_default_beacon_key(&rdev->wiphy, netdev, key_index);
|
||||
ret = rdev->ops->set_default_beacon_key(&rdev->wiphy, netdev,
|
||||
key_index);
|
||||
trace_rdev_set_default_beacon_key(&rdev->wiphy, netdev, link_id,
|
||||
key_index);
|
||||
ret = rdev->ops->set_default_beacon_key(&rdev->wiphy, netdev, link_id,
|
||||
key_index);
|
||||
trace_rdev_return_int(&rdev->wiphy, ret);
|
||||
return ret;
|
||||
}
|
||||
|
@ -2389,6 +2389,10 @@ static bool reg_wdev_chan_valid(struct wiphy *wiphy, struct wireless_dev *wdev)
|
||||
switch (iftype) {
|
||||
case NL80211_IFTYPE_AP:
|
||||
case NL80211_IFTYPE_P2P_GO:
|
||||
if (!wdev->links[link].ap.beacon_interval)
|
||||
continue;
|
||||
chandef = wdev->links[link].ap.chandef;
|
||||
break;
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
if (!wdev->u.mesh.beacon_interval)
|
||||
continue;
|
||||
|
@ -540,7 +540,7 @@ static int cfg80211_parse_ap_info(struct cfg80211_colocated_ap *entry,
|
||||
memcpy(entry->bssid, pos, ETH_ALEN);
|
||||
pos += ETH_ALEN;
|
||||
|
||||
if (length == IEEE80211_TBTT_INFO_OFFSET_BSSID_SSSID_BSS_PARAM) {
|
||||
if (length >= IEEE80211_TBTT_INFO_OFFSET_BSSID_SSSID_BSS_PARAM) {
|
||||
memcpy(&entry->short_ssid, pos,
|
||||
sizeof(entry->short_ssid));
|
||||
entry->short_ssid_valid = true;
|
||||
|
@ -747,6 +747,9 @@ void __cfg80211_connect_result(struct net_device *dev,
|
||||
if (WARN_ON(!cr->links[link].addr))
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (WARN_ON(wdev->connect_keys))
|
||||
goto out;
|
||||
}
|
||||
|
||||
wdev->unprot_beacon_reported = 0;
|
||||
@ -1325,7 +1328,7 @@ void __cfg80211_disconnected(struct net_device *dev, const u8 *ie,
|
||||
NL80211_EXT_FEATURE_BEACON_PROTECTION_CLIENT))
|
||||
max_key_idx = 7;
|
||||
for (i = 0; i <= max_key_idx; i++)
|
||||
rdev_del_key(rdev, dev, i, false, NULL);
|
||||
rdev_del_key(rdev, dev, -1, i, false, NULL);
|
||||
}
|
||||
|
||||
rdev_set_qos_map(rdev, dev, NULL);
|
||||
|
@ -434,13 +434,14 @@ TRACE_EVENT(rdev_change_virtual_intf,
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(key_handle,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, key_index, pairwise, mac_addr),
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
MAC_ENTRY(mac_addr)
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
__field(bool, pairwise)
|
||||
),
|
||||
@ -448,34 +449,38 @@ DECLARE_EVENT_CLASS(key_handle,
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
MAC_ASSIGN(mac_addr, mac_addr);
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
__entry->pairwise = pairwise;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", key_index: %u, pairwise: %s, mac addr: " MAC_PR_FMT,
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->key_index,
|
||||
BOOL_TO_STR(__entry->pairwise), MAC_PR_ARG(mac_addr))
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key_index: %u, pairwise: %s, mac addr: " MAC_PR_FMT,
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index, BOOL_TO_STR(__entry->pairwise),
|
||||
MAC_PR_ARG(mac_addr))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(key_handle, rdev_get_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, key_index, pairwise, mac_addr)
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr)
|
||||
);
|
||||
|
||||
DEFINE_EVENT(key_handle, rdev_del_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, key_index, pairwise, mac_addr)
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_add_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool pairwise, const u8 *mac_addr, u8 mode),
|
||||
TP_ARGS(wiphy, netdev, key_index, pairwise, mac_addr, mode),
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool pairwise, const u8 *mac_addr, u8 mode),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, pairwise, mac_addr, mode),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
MAC_ENTRY(mac_addr)
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
__field(bool, pairwise)
|
||||
__field(u8, mode)
|
||||
@ -484,24 +489,27 @@ TRACE_EVENT(rdev_add_key,
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
MAC_ASSIGN(mac_addr, mac_addr);
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
__entry->pairwise = pairwise;
|
||||
__entry->mode = mode;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", key_index: %u, "
|
||||
"mode: %u, pairwise: %s, mac addr: " MAC_PR_FMT,
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->key_index,
|
||||
__entry->mode, BOOL_TO_STR(__entry->pairwise),
|
||||
MAC_PR_ARG(mac_addr))
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key_index: %u, mode: %u, pairwise: %s, "
|
||||
"mac addr: " MAC_PR_FMT,
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index, __entry->mode,
|
||||
BOOL_TO_STR(__entry->pairwise), MAC_PR_ARG(mac_addr))
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_default_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index,
|
||||
bool unicast, bool multicast),
|
||||
TP_ARGS(wiphy, netdev, key_index, unicast, multicast),
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index, bool unicast, bool multicast),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index, unicast, multicast),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
__field(bool, unicast)
|
||||
__field(bool, multicast)
|
||||
@ -509,48 +517,58 @@ TRACE_EVENT(rdev_set_default_key,
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
__entry->unicast = unicast;
|
||||
__entry->multicast = multicast;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", key index: %u, unicast: %s, multicast: %s",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->key_index,
|
||||
BOOL_TO_STR(__entry->unicast),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key index: %u, unicast: %s, multicast: %s",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->link_id,
|
||||
__entry->key_index, BOOL_TO_STR(__entry->unicast),
|
||||
BOOL_TO_STR(__entry->multicast))
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_default_mgmt_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, key_index),
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", key index: %u",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->key_index)
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key index: %u", WIPHY_PR_ARG, NETDEV_PR_ARG,
|
||||
__entry->link_id, __entry->key_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_set_default_beacon_key,
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, key_index),
|
||||
TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int link_id,
|
||||
u8 key_index),
|
||||
TP_ARGS(wiphy, netdev, link_id, key_index),
|
||||
TP_STRUCT__entry(
|
||||
WIPHY_ENTRY
|
||||
NETDEV_ENTRY
|
||||
__field(int, link_id)
|
||||
__field(u8, key_index)
|
||||
),
|
||||
TP_fast_assign(
|
||||
WIPHY_ASSIGN;
|
||||
NETDEV_ASSIGN;
|
||||
__entry->link_id = link_id;
|
||||
__entry->key_index = key_index;
|
||||
),
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", key index: %u",
|
||||
WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->key_index)
|
||||
TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", link_id: %d, "
|
||||
"key index: %u", WIPHY_PR_ARG, NETDEV_PR_ARG,
|
||||
__entry->link_id, __entry->key_index)
|
||||
);
|
||||
|
||||
TRACE_EVENT(rdev_start_ap,
|
||||
@ -3245,18 +3263,21 @@ TRACE_EVENT(cfg80211_ch_switch_notify,
|
||||
|
||||
TRACE_EVENT(cfg80211_ch_switch_started_notify,
|
||||
TP_PROTO(struct net_device *netdev,
|
||||
struct cfg80211_chan_def *chandef),
|
||||
TP_ARGS(netdev, chandef),
|
||||
struct cfg80211_chan_def *chandef,
|
||||
unsigned int link_id),
|
||||
TP_ARGS(netdev, chandef, link_id),
|
||||
TP_STRUCT__entry(
|
||||
NETDEV_ENTRY
|
||||
CHAN_DEF_ENTRY
|
||||
__field(unsigned int, link_id)
|
||||
),
|
||||
TP_fast_assign(
|
||||
NETDEV_ASSIGN;
|
||||
CHAN_DEF_ASSIGN(chandef);
|
||||
__entry->link_id = link_id;
|
||||
),
|
||||
TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT,
|
||||
NETDEV_PR_ARG, CHAN_DEF_PR_ARG)
|
||||
TP_printk(NETDEV_PR_FMT ", " CHAN_DEF_PR_FMT ", link:%d",
|
||||
NETDEV_PR_ARG, CHAN_DEF_PR_ARG, __entry->link_id)
|
||||
);
|
||||
|
||||
TRACE_EVENT(cfg80211_radar_event,
|
||||
|
@ -935,13 +935,13 @@ void cfg80211_upload_connect_keys(struct wireless_dev *wdev)
|
||||
for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) {
|
||||
if (!wdev->connect_keys->params[i].cipher)
|
||||
continue;
|
||||
if (rdev_add_key(rdev, dev, i, false, NULL,
|
||||
if (rdev_add_key(rdev, dev, -1, i, false, NULL,
|
||||
&wdev->connect_keys->params[i])) {
|
||||
netdev_err(dev, "failed to set key %d\n", i);
|
||||
continue;
|
||||
}
|
||||
if (wdev->connect_keys->def == i &&
|
||||
rdev_set_default_key(rdev, dev, i, true, true)) {
|
||||
rdev_set_default_key(rdev, dev, -1, i, true, true)) {
|
||||
netdev_err(dev, "failed to set defkey %d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
@ -470,7 +470,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
!(rdev->wiphy.flags & WIPHY_FLAG_IBSS_RSN))
|
||||
err = -ENOENT;
|
||||
else
|
||||
err = rdev_del_key(rdev, dev, idx, pairwise,
|
||||
err = rdev_del_key(rdev, dev, -1, idx, pairwise,
|
||||
addr);
|
||||
}
|
||||
wdev->wext.connect.privacy = false;
|
||||
@ -509,7 +509,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
if (wdev->connected ||
|
||||
(wdev->iftype == NL80211_IFTYPE_ADHOC &&
|
||||
wdev->u.ibss.current_bss))
|
||||
err = rdev_add_key(rdev, dev, idx, pairwise, addr, params);
|
||||
err = rdev_add_key(rdev, dev, -1, idx, pairwise, addr, params);
|
||||
else if (params->cipher != WLAN_CIPHER_SUITE_WEP40 &&
|
||||
params->cipher != WLAN_CIPHER_SUITE_WEP104)
|
||||
return -EINVAL;
|
||||
@ -546,7 +546,8 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
__cfg80211_leave_ibss(rdev, wdev->netdev, true);
|
||||
rejoin = true;
|
||||
}
|
||||
err = rdev_set_default_key(rdev, dev, idx, true, true);
|
||||
err = rdev_set_default_key(rdev, dev, -1, idx, true,
|
||||
true);
|
||||
}
|
||||
if (!err) {
|
||||
wdev->wext.default_key = idx;
|
||||
@ -561,7 +562,7 @@ static int __cfg80211_set_encryption(struct cfg80211_registered_device *rdev,
|
||||
if (wdev->connected ||
|
||||
(wdev->iftype == NL80211_IFTYPE_ADHOC &&
|
||||
wdev->u.ibss.current_bss))
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, idx);
|
||||
err = rdev_set_default_mgmt_key(rdev, dev, -1, idx);
|
||||
if (!err)
|
||||
wdev->wext.default_mgmt_key = idx;
|
||||
return err;
|
||||
@ -632,7 +633,7 @@ static int cfg80211_wext_siwencode(struct net_device *dev,
|
||||
if (wdev->connected ||
|
||||
(wdev->iftype == NL80211_IFTYPE_ADHOC &&
|
||||
wdev->u.ibss.current_bss))
|
||||
err = rdev_set_default_key(rdev, dev, idx, true,
|
||||
err = rdev_set_default_key(rdev, dev, -1, idx, true,
|
||||
true);
|
||||
if (!err)
|
||||
wdev->wext.default_key = idx;
|
||||
@ -685,6 +686,13 @@ static int cfg80211_wext_siwencodeext(struct net_device *dev,
|
||||
!rdev->ops->set_default_key)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
wdev_lock(wdev);
|
||||
if (wdev->valid_links) {
|
||||
wdev_unlock(wdev);
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
wdev_unlock(wdev);
|
||||
|
||||
switch (ext->alg) {
|
||||
case IW_ENCODE_ALG_NONE:
|
||||
remove = true;
|
||||
|
Loading…
x
Reference in New Issue
Block a user