From: Jeff Chen Advertise P2P client and GO support through cfg80211 and register the management frame subtypes supported by each role. Also handle P2P client interfaces in station-specific paths. Signed-off-by: Jeff Chen --- drivers/net/wireless/nxp/nxpwifi/11n.c | 3 ++- .../net/wireless/nxp/nxpwifi/11n_rxreorder.c | 6 ++++-- drivers/net/wireless/nxp/nxpwifi/cfg80211.c | 20 +++++++++++++++++++ drivers/net/wireless/nxp/nxpwifi/cfp.c | 3 ++- drivers/net/wireless/nxp/nxpwifi/join.c | 1 + drivers/net/wireless/nxp/nxpwifi/sta_event.c | 3 ++- 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/nxp/nxpwifi/11n.c b/drivers/net/wireless/nxp/nxpwifi/11n.c index 9eae93c3b800..3efd315eddd9 100644 --- a/drivers/net/wireless/nxp/nxpwifi/11n.c +++ b/drivers/net/wireless/nxp/nxpwifi/11n.c @@ -816,7 +816,8 @@ void nxpwifi_update_ampdu_txwinsize(struct nxpwifi_adapter *adapter) priv = adapter->priv[i]; tx_win_size = priv->add_ba_param.tx_win_size; - if (priv->bss_type == NXPWIFI_BSS_TYPE_STA) + if (priv->bss_type == NXPWIFI_BSS_TYPE_STA || + priv->bss_type == NXPWIFI_BSS_TYPE_P2P) priv->add_ba_param.tx_win_size = NXPWIFI_STA_AMPDU_DEF_TXWINSIZE; diff --git a/drivers/net/wireless/nxp/nxpwifi/11n_rxreorder.c b/drivers/net/wireless/nxp/nxpwifi/11n_rxreorder.c index 87cf2ec85991..ca9ca8cdcb16 100644 --- a/drivers/net/wireless/nxp/nxpwifi/11n_rxreorder.c +++ b/drivers/net/wireless/nxp/nxpwifi/11n_rxreorder.c @@ -677,14 +677,16 @@ static void nxpwifi_update_ampdu_rxwinsize(struct nxpwifi_adapter *adapter, priv = adapter->priv[i]; rx_win_size = priv->add_ba_param.rx_win_size; if (coex_flag) { - if (priv->bss_type == NXPWIFI_BSS_TYPE_STA) + if (priv->bss_type == NXPWIFI_BSS_TYPE_STA || + priv->bss_type == NXPWIFI_BSS_TYPE_P2P) priv->add_ba_param.rx_win_size = NXPWIFI_STA_COEX_AMPDU_DEF_RXWINSIZE; if (priv->bss_type == NXPWIFI_BSS_TYPE_UAP) priv->add_ba_param.rx_win_size = NXPWIFI_UAP_COEX_AMPDU_DEF_RXWINSIZE; } else { - if (priv->bss_type == NXPWIFI_BSS_TYPE_STA) + if (priv->bss_type == NXPWIFI_BSS_TYPE_STA || + priv->bss_type == NXPWIFI_BSS_TYPE_P2P) priv->add_ba_param.rx_win_size = NXPWIFI_STA_AMPDU_DEF_RXWINSIZE; if (priv->bss_type == NXPWIFI_BSS_TYPE_UAP) diff --git a/drivers/net/wireless/nxp/nxpwifi/cfg80211.c b/drivers/net/wireless/nxp/nxpwifi/cfg80211.c index ade57f128d10..8f590d76c6af 100644 --- a/drivers/net/wireless/nxp/nxpwifi/cfg80211.c +++ b/drivers/net/wireless/nxp/nxpwifi/cfg80211.c @@ -15,6 +15,8 @@ static const struct ieee80211_iface_limit nxpwifi_ap_sta_limits[] = { { .max = NXPWIFI_MAX_BSS_NUM, .types = BIT(NL80211_IFTYPE_STATION) | + BIT(NL80211_IFTYPE_P2P_GO) | + BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR), }, @@ -1392,6 +1394,22 @@ nxpwifi_mgmt_stypes[NUM_NL80211_IFTYPES] = { BIT(IEEE80211_STYPE_DEAUTH >> 4) | BIT(IEEE80211_STYPE_ACTION >> 4), }, + [NL80211_IFTYPE_P2P_CLIENT] = { + .tx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_RESP >> 4), + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4), + }, + [NL80211_IFTYPE_P2P_GO] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_AUTH >> 4) | + BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | + BIT(IEEE80211_STYPE_DISASSOC >> 4) | + BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_DEAUTH >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4), + }, }; /* @@ -3788,6 +3806,8 @@ int nxpwifi_register_cfg80211(struct nxpwifi_adapter *adapter) wiphy->mgmt_stypes = nxpwifi_mgmt_stypes; wiphy->max_remain_on_channel_duration = 5000; wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | + BIT(NL80211_IFTYPE_P2P_CLIENT) | + BIT(NL80211_IFTYPE_P2P_GO) | BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR); diff --git a/drivers/net/wireless/nxp/nxpwifi/cfp.c b/drivers/net/wireless/nxp/nxpwifi/cfp.c index aec1d5014810..9d18bde01f9f 100644 --- a/drivers/net/wireless/nxp/nxpwifi/cfp.c +++ b/drivers/net/wireless/nxp/nxpwifi/cfp.c @@ -398,7 +398,8 @@ u32 nxpwifi_get_supported_rates(struct nxpwifi_private *priv, u8 *rates) bands = nxpwifi_convert_config_bands(adapter->fw_bands); - if (priv->bss_mode == NL80211_IFTYPE_STATION) { + if (priv->bss_mode == NL80211_IFTYPE_STATION || + priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { if (bands == BAND_B) { /* B only */ nxpwifi_dbg(adapter, INFO, "info: infra band=%d\t" diff --git a/drivers/net/wireless/nxp/nxpwifi/join.c b/drivers/net/wireless/nxp/nxpwifi/join.c index 359006e2c391..bebb66c2fd76 100644 --- a/drivers/net/wireless/nxp/nxpwifi/join.c +++ b/drivers/net/wireless/nxp/nxpwifi/join.c @@ -747,6 +747,7 @@ int nxpwifi_deauthenticate(struct nxpwifi_private *priv, u8 *mac) switch (priv->bss_mode) { case NL80211_IFTYPE_STATION: + case NL80211_IFTYPE_P2P_CLIENT: ret = nxpwifi_deauthenticate_infra(priv, mac); if (ret) cfg80211_disconnected(priv->netdev, 0, NULL, 0, diff --git a/drivers/net/wireless/nxp/nxpwifi/sta_event.c b/drivers/net/wireless/nxp/nxpwifi/sta_event.c index 355064b1d8f7..d70792efadca 100644 --- a/drivers/net/wireless/nxp/nxpwifi/sta_event.c +++ b/drivers/net/wireless/nxp/nxpwifi/sta_event.c @@ -638,7 +638,8 @@ void nxpwifi_reset_connect_state(struct nxpwifi_private *priv, u16 reason_code, "info: successfully disconnected from %pM: reason code %d\n", priv->cfg_bssid, reason_code); - if (priv->bss_mode == NL80211_IFTYPE_STATION) { + if (priv->bss_mode == NL80211_IFTYPE_STATION || + priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) { if (adapter->host_mlme_link_lost) nxpwifi_host_mlme_disconnect(adapter->priv_link_lost, reason_code, NULL); -- 2.34.1