> -----Original Message----- > From: Martin Kaistra <martin.kaistra@xxxxxxxxxxxxx> > Sent: Monday, December 18, 2023 10:37 PM > To: linux-wireless@xxxxxxxxxxxxxxx > Cc: Jes Sorensen <Jes.Sorensen@xxxxxxxxx>; Kalle Valo <kvalo@xxxxxxxxxx>; Ping-Ke Shih > <pkshih@xxxxxxxxxxx>; Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx>; Sebastian Andrzej Siewior > <bigeasy@xxxxxxxxxxxxx> > Subject: [PATCH 19/20] wifi: rtl8xxxu: make supporting AP mode only on port 0 transparent > > When the driver is used for concurrent mode, both virtual interfaces can > be set to station or AP mode, though only one can be in AP mode at the > same time. > > In order to keep the code simple, use only hw port 0 for AP mode. When > an interface is added in AP mode which would be assigned to port 1, use > a switch_port function to transparently swap the mapping between virtual > interface and hw port. > > Signed-off-by: Martin Kaistra <martin.kaistra@xxxxxxxxxxxxx> > --- > .../wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 84 ++++++++++++++++++- > 1 file changed, 82 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c > b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c > index 88730791091a7..595f447874f4d 100644 > --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c > +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c > @@ -6613,6 +6613,84 @@ static int rtl8xxxu_submit_int_urb(struct ieee80211_hw *hw) > return ret; > } > > +static void rtl8xxxu_switch_ports(struct rtl8xxxu_priv *priv) > +{ [...] > + > + vif = priv->vifs[0]; > + priv->vifs[0] = priv->vifs[1]; > + priv->vifs[1] = vif; > + rtlvif = (struct rtl8xxxu_vif *)priv->vifs[1]->drv_priv; > + rtlvif->port_num = 1; nit: Would it be better to swap port_num as well? Currently, port_num of vifs[0] will be set to 0 by caller, but not sure if further people could misuse this function. > +} > + > static int rtl8xxxu_add_interface(struct ieee80211_hw *hw, > struct ieee80211_vif *vif) > { > @@ -6640,8 +6718,10 @@ static int rtl8xxxu_add_interface(struct ieee80211_hw *hw, > } > break; > case NL80211_IFTYPE_AP: > - if (port_num == 1) > - return -EOPNOTSUPP; > + if (port_num == 1) { > + rtl8xxxu_switch_ports(priv); > + port_num = 0; > + } > > rtl8xxxu_write8(priv, REG_BEACON_CTRL, > BEACON_DISABLE_TSF_UPDATE | BEACON_CTRL_MBSSID); > -- > 2.39.2