[PATCH 03/10] staging: rtl8723bs: set frame control flags with IEEE80211_FCTL_* masks

From: Rishik Yechuri

Date: Tue Oct 13 2026 - 16:49:13 EST


The driver defines SetToDs(), SetFrDs(), SetMFrag(), ClearMFrag(),
ClearRetry(), SetPwrMgt(), ClearPwrMgt(), SetMData(), ClearMData() and
SetPrivacy() in wifi.h to set and clear bits of the IEEE 802.11 Frame
Control field, using private _TO_DS_ through _ORDER_ bit definitions
that duplicate the IEEE80211_FCTL_* constants in <linux/ieee80211.h>.

Replace each use of these macros by operating on the frame_control
member directly with the corresponding IEEE80211_FCTL_* mask, as is
done elsewhere in the wireless subsystem.

In rtw_xmitframe_coalesce(), the header pointer is updated on each
iteration of the fragmentation loop, since mem_start advances to a new
fragment each time.

When constructing the BIP additional authentication data, mask the
Retry, Power Management and More Data bits in a local copy of the
Frame Control field before copying it into the buffer. This matches
bip_aad() in net/mac80211/wpa.c.

Remove the macro definitions and the private bit definitions, which no
longer have any users. Also remove the mem_start variable from
rtw_mgmt_xmitframe_coalesce(), as its only use was the SetPrivacy()
call.

No functional change intended.

Signed-off-by: Rishik Yechuri <rishik.yechuri.code@xxxxxxxxx>
---
drivers/staging/rtl8723bs/core/rtw_mlme_ext.c | 12 +++---
drivers/staging/rtl8723bs/core/rtw_security.c | 9 +++--
drivers/staging/rtl8723bs/core/rtw_xmit.c | 29 +++++++-------
drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c | 12 +++---
drivers/staging/rtl8723bs/include/wifi.h | 39 -------------------
5 files changed, 33 insertions(+), 68 deletions(-)

diff --git a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
index d318b0ff4..842c3d39c 100644
--- a/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
+++ b/drivers/staging/rtl8723bs/core/rtw_mlme_ext.c
@@ -2573,7 +2573,7 @@ void issue_auth(struct adapter *padapter, struct sta_info *psta, unsigned short
if ((pmlmeinfo->auth_seq == 3) && (pmlmeinfo->state & WIFI_FW_AUTH_STATE) && (use_shared_key == 1)) {
pframe = rtw_set_ie(pframe, WLAN_EID_CHALLENGE, 128, pmlmeinfo->chg_txt, &(pattrib->pktlen));

- SetPrivacy(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);

pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);

@@ -2926,12 +2926,12 @@ static int _issue_nulldata(struct adapter *padapter, unsigned char *da,
*(fctrl) = 0;

if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)
- SetFrDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE)
- SetToDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_TODS);

if (power_mode)
- SetPwrMgt(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PM);

memcpy(pwlanhdr->addr1, da, ETH_ALEN);
memcpy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)), ETH_ALEN);
@@ -3068,9 +3068,9 @@ static int _issue_qos_nulldata(struct adapter *padapter, unsigned char *da,
*(fctrl) = 0;

if ((pmlmeinfo->state & 0x03) == WIFI_FW_AP_STATE)
- SetFrDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
else if ((pmlmeinfo->state & 0x03) == WIFI_FW_STATION_STATE)
- SetToDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_TODS);

qc = (unsigned short *)(pframe + pattrib->hdrlen - 2);

diff --git a/drivers/staging/rtl8723bs/core/rtw_security.c b/drivers/staging/rtl8723bs/core/rtw_security.c
index ae64823af..fc3113922 100644
--- a/drivers/staging/rtl8723bs/core/rtw_security.c
+++ b/drivers/staging/rtl8723bs/core/rtw_security.c
@@ -1277,6 +1277,7 @@ u32 rtw_BIP_verify(struct adapter *padapter, u8 *precvframe)
u8 mic[16];
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
__le16 le_tmp;
+ __le16 mask_fc;
__le64 le_tmp64 = 0;

ori_len = pattrib->pkt_len - WLAN_HDR_A3_LEN + BIP_AAD_SIZE;
@@ -1320,10 +1321,10 @@ u32 rtw_BIP_verify(struct adapter *padapter, u8 *precvframe)
memset(p + 2 + len - 8, 0, 8);

/* conscruct AAD, copy frame control field */
- memcpy(BIP_AAD, &pwlanhdr->frame_control, 2);
- ClearRetry(BIP_AAD);
- ClearPwrMgt(BIP_AAD);
- ClearMData(BIP_AAD);
+ mask_fc = pwlanhdr->frame_control;
+ mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY | IEEE80211_FCTL_PM |
+ IEEE80211_FCTL_MOREDATA);
+ memcpy(BIP_AAD, &mask_fc, 2);
/* conscruct AAD, copy address 1 to address 3 */
memcpy(BIP_AAD + 2, &pwlanhdr->addrs, sizeof(pwlanhdr->addrs));

diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c
index 364de3c8d..db75ff51f 100644
--- a/drivers/staging/rtl8723bs/core/rtw_xmit.c
+++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c
@@ -921,7 +921,7 @@ int rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
{
/* 1.Data transfer to AP */
/* 2.Arp pkt will relayed by AP */
- SetToDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_TODS);
memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
@@ -930,7 +930,7 @@ int rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
if (pqospriv->qos_option)
qos_option = true;
} else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
- SetFrDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
@@ -950,10 +950,10 @@ int rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
}

if (pattrib->mdata)
- SetMData(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);

if (pattrib->encrypt)
- SetPrivacy(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);

if (qos_option) {
qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
@@ -1069,6 +1069,7 @@ int rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct
SIZE_PTR addr;

u8 *pframe, *mem_start;
+ struct ieee80211_hdr *hdr;
u8 hw_hdr_offset;

struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
@@ -1106,8 +1107,9 @@ int rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct
mpdu_len = frg_len;

pframe = mem_start;
+ hdr = (struct ieee80211_hdr *)mem_start;

- SetMFrag(mem_start);
+ hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS);

pframe += pattrib->hdrlen;
mpdu_len -= pattrib->hdrlen;
@@ -1157,7 +1159,7 @@ int rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct
((pattrib->bswenc) ? pattrib->icv_len : 0) +
mem_sz;

- ClearMFrag(mem_start);
+ hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREFRAGS);

break;
}
@@ -1185,7 +1187,7 @@ int rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct
/* broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption */
int rtw_mgmt_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct xmit_frame *pxmitframe)
{
- u8 *pframe, *mem_start = NULL, *tmp_buf = NULL;
+ u8 *pframe, *tmp_buf = NULL;
u8 subtype;
struct sta_info *psta = NULL;
struct pkt_attrib *pattrib = &pxmitframe->attrib;
@@ -1196,10 +1198,11 @@ int rtw_mgmt_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, s
struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
struct ieee80211_hdr *pwlanhdr;
+ __le16 mask_fc;
u8 MME[_MME_IE_LENGTH_];
u32 ori_len;

- mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
+ pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
pwlanhdr = (struct ieee80211_hdr *)pframe;

ori_len = BIP_AAD_SIZE + pattrib->pktlen;
@@ -1249,10 +1252,10 @@ int rtw_mgmt_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, s
frame_body_len = pattrib->pktlen - sizeof(struct ieee80211_hdr_3addr);

/* conscruct AAD, copy frame control field */
- memcpy(BIP_AAD, &pwlanhdr->frame_control, 2);
- ClearRetry(BIP_AAD);
- ClearPwrMgt(BIP_AAD);
- ClearMData(BIP_AAD);
+ mask_fc = pwlanhdr->frame_control;
+ mask_fc &= ~cpu_to_le16(IEEE80211_FCTL_RETRY | IEEE80211_FCTL_PM |
+ IEEE80211_FCTL_MOREDATA);
+ memcpy(BIP_AAD, &mask_fc, 2);
/* conscruct AAD, copy address 1 to address 3 */
memcpy(BIP_AAD + 2, &pwlanhdr->addrs, sizeof(pwlanhdr->addrs));
/* copy management fram body */
@@ -1329,7 +1332,7 @@ int rtw_mgmt_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, s
pattrib->last_txcmdsz = pattrib->pktlen;

/* set protected bit must be before SW encrypt */
- SetPrivacy(mem_start);
+ pwlanhdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
/* software encrypt */
xmitframe_swencrypt(padapter, pxmitframe);
}
diff --git a/drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c b/drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c
index 734fb9bb1..5600d9064 100644
--- a/drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c
+++ b/drivers/staging/rtl8723bs/hal/rtl8723b_cmd.c
@@ -192,7 +192,7 @@ static void ConstructPSPoll(struct adapter *padapter, u8 *pframe, u32 *pLength)
/* Frame control. */
fctrl = &pwlanhdr->frame_control;
*(fctrl) = 0;
- SetPwrMgt(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PM);
SetFrameSubType(pframe, WIFI_PSPOLL);

/* AID. */
@@ -229,17 +229,17 @@ static void ConstructNullFunctionData(struct adapter *padapter,
fctrl = &pwlanhdr->frame_control;
*(fctrl) = 0;
if (bForcePowerSave)
- SetPwrMgt(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PM);

switch (cur_network->network.infrastructure_mode) {
case NL80211_IFTYPE_STATION:
- SetToDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_TODS);
ether_addr_copy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)));
ether_addr_copy(pwlanhdr->addr2, myid(&(padapter->eeprompriv)));
ether_addr_copy(pwlanhdr->addr3, StaAddr);
break;
case NL80211_IFTYPE_AP:
- SetFrDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
ether_addr_copy(pwlanhdr->addr1, StaAddr);
ether_addr_copy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)));
ether_addr_copy(pwlanhdr->addr3, myid(&(padapter->eeprompriv)));
@@ -732,9 +732,9 @@ static void ConstructBtNullFunctionData(struct adapter *padapter,
fctrl = &pwlanhdr->frame_control;
*fctrl = 0;
if (bForcePowerSave)
- SetPwrMgt(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_PM);

- SetFrDs(fctrl);
+ *fctrl |= cpu_to_le16(IEEE80211_FCTL_FROMDS);
ether_addr_copy(pwlanhdr->addr1, StaAddr);
ether_addr_copy(pwlanhdr->addr2, myid(&padapter->eeprompriv));
ether_addr_copy(pwlanhdr->addr3, myid(&padapter->eeprompriv));
diff --git a/drivers/staging/rtl8723bs/include/wifi.h b/drivers/staging/rtl8723bs/include/wifi.h
index 800bfd962..bfc985870 100644
--- a/drivers/staging/rtl8723bs/include/wifi.h
+++ b/drivers/staging/rtl8723bs/include/wifi.h
@@ -63,45 +63,6 @@ enum {
WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE),
};

-#define _TO_DS_ BIT(8)
-#define _FROM_DS_ BIT(9)
-#define _MORE_FRAG_ BIT(10)
-#define _RETRY_ BIT(11)
-#define _PWRMGT_ BIT(12)
-#define _MORE_DATA_ BIT(13)
-#define _PRIVACY_ BIT(14)
-#define _ORDER_ BIT(15)
-
-#define SetToDs(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_TO_DS_))
-
-#define SetFrDs(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_FROM_DS_))
-
-#define SetMFrag(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_MORE_FRAG_))
-
-#define ClearMFrag(pbuf) \
- (*(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)))
-
-#define ClearRetry(pbuf) \
- (*(__le16 *)(pbuf) &= (~cpu_to_le16(_RETRY_)))
-
-#define SetPwrMgt(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_PWRMGT_))
-
-#define ClearPwrMgt(pbuf) \
- (*(__le16 *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)))
-
-#define SetMData(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_MORE_DATA_))
-
-#define ClearMData(pbuf) \
- (*(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)))
-
-#define SetPrivacy(pbuf) \
- (*(__le16 *)(pbuf) |= cpu_to_le16(_PRIVACY_))
-
#define GetFrameType(pbuf) \
(le16_to_cpu(*(__le16 *)(pbuf)) & (BIT(3) | BIT(2)))

--
2.43.0