Commit 69466b97 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

wifi: rtw89: use struct to fill H2C command to download beacon frame

Download beacon frame via H2C command for AP mode, and then firmware can
issues beacon periodically. Originally TIM offset minus fixed 24 bytes of
frame header implicitly in macro, and this patch explicitly uses
ieee80211_hdrlen() to get header length, but expected to change nothing
at all.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240108091325.67424-1-pkshih@realtek.com
parent c313c31f
...@@ -2277,18 +2277,20 @@ int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev, ...@@ -2277,18 +2277,20 @@ int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev,
return ret; return ret;
} }
#define H2C_BCN_BASE_LEN 12
int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev, int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
struct rtw89_vif *rtwvif) struct rtw89_vif *rtwvif)
{ {
struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, const struct rtw89_chan *chan = rtw89_chan_get(rtwdev,
rtwvif->sub_entity_idx); rtwvif->sub_entity_idx);
struct sk_buff *skb; struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
struct rtw89_h2c_bcn_upd *h2c;
struct sk_buff *skb_beacon; struct sk_buff *skb_beacon;
u16 tim_offset; struct ieee80211_hdr *hdr;
u32 len = sizeof(*h2c);
struct sk_buff *skb;
int bcn_total_len; int bcn_total_len;
u16 beacon_rate; u16 beacon_rate;
u16 tim_offset;
void *noa_data; void *noa_data;
u8 noa_len; u8 noa_len;
int ret; int ret;
...@@ -2314,23 +2316,27 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev, ...@@ -2314,23 +2316,27 @@ int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev,
skb_put_data(skb_beacon, noa_data, noa_len); skb_put_data(skb_beacon, noa_data, noa_len);
} }
bcn_total_len = H2C_BCN_BASE_LEN + skb_beacon->len; hdr = (struct ieee80211_hdr *)skb_beacon;
tim_offset -= ieee80211_hdrlen(hdr->frame_control);
bcn_total_len = len + skb_beacon->len;
skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, bcn_total_len); skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, bcn_total_len);
if (!skb) { if (!skb) {
rtw89_err(rtwdev, "failed to alloc skb for fw dl\n"); rtw89_err(rtwdev, "failed to alloc skb for fw dl\n");
dev_kfree_skb_any(skb_beacon); dev_kfree_skb_any(skb_beacon);
return -ENOMEM; return -ENOMEM;
} }
skb_put(skb, H2C_BCN_BASE_LEN); skb_put(skb, len);
h2c = (struct rtw89_h2c_bcn_upd *)skb->data;
SET_BCN_UPD_PORT(skb->data, rtwvif->port);
SET_BCN_UPD_MBSSID(skb->data, 0); h2c->w0 = le32_encode_bits(rtwvif->port, RTW89_H2C_BCN_UPD_W0_PORT) |
SET_BCN_UPD_BAND(skb->data, rtwvif->mac_idx); le32_encode_bits(0, RTW89_H2C_BCN_UPD_W0_MBSSID) |
SET_BCN_UPD_GRP_IE_OFST(skb->data, tim_offset); le32_encode_bits(rtwvif->mac_idx, RTW89_H2C_BCN_UPD_W0_BAND) |
SET_BCN_UPD_MACID(skb->data, rtwvif->mac_id); le32_encode_bits(tim_offset | BIT(7), RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST);
SET_BCN_UPD_SSN_SEL(skb->data, RTW89_MGMT_HW_SSN_SEL); h2c->w1 = le32_encode_bits(rtwvif->mac_id, RTW89_H2C_BCN_UPD_W1_MACID) |
SET_BCN_UPD_SSN_MODE(skb->data, RTW89_MGMT_HW_SEQ_MODE); le32_encode_bits(RTW89_MGMT_HW_SSN_SEL, RTW89_H2C_BCN_UPD_W1_SSN_SEL) |
SET_BCN_UPD_RATE(skb->data, beacon_rate); le32_encode_bits(RTW89_MGMT_HW_SEQ_MODE, RTW89_H2C_BCN_UPD_W1_SSN_MODE) |
le32_encode_bits(beacon_rate, RTW89_H2C_BCN_UPD_W1_RATE);
skb_put_data(skb, skb_beacon->data, skb_beacon->len); skb_put_data(skb, skb_beacon->data, skb_beacon->len);
dev_kfree_skb_any(skb_beacon); dev_kfree_skb_any(skb_beacon);
......
...@@ -1509,105 +1509,32 @@ static inline void SET_DCTL_SEC_ENT6_V1(void *table, u32 val) ...@@ -1509,105 +1509,32 @@ static inline void SET_DCTL_SEC_ENT6_V1(void *table, u32 val)
GENMASK(31, 24)); GENMASK(31, 24));
} }
static inline void SET_BCN_UPD_PORT(void *h2c, u32 val) struct rtw89_h2c_bcn_upd {
{ __le32 w0;
le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0)); __le32 w1;
} __le32 w2;
} __packed;
static inline void SET_BCN_UPD_MBSSID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8));
}
static inline void SET_BCN_UPD_BAND(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16));
}
static inline void SET_BCN_UPD_GRP_IE_OFST(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)h2c, (val - 24) | BIT(7), GENMASK(31, 24));
}
static inline void SET_BCN_UPD_MACID(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0));
}
static inline void SET_BCN_UPD_SSN_SEL(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(9, 8));
}
static inline void SET_BCN_UPD_SSN_MODE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(11, 10));
}
static inline void SET_BCN_UPD_RATE(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(20, 12));
}
static inline void SET_BCN_UPD_TXPWR(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(23, 21));
}
static inline void SET_BCN_UPD_TXINFO_CTRL_EN(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, BIT(0));
}
static inline void SET_BCN_UPD_NTX_PATH_EN(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(4, 1));
}
static inline void SET_BCN_UPD_PATH_MAP_A(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(6, 5));
}
static inline void SET_BCN_UPD_PATH_MAP_B(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(8, 7));
}
static inline void SET_BCN_UPD_PATH_MAP_C(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(10, 9));
}
static inline void SET_BCN_UPD_PATH_MAP_D(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(12, 11));
}
static inline void SET_BCN_UPD_PATH_ANTSEL_A(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, BIT(13));
}
static inline void SET_BCN_UPD_PATH_ANTSEL_B(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, BIT(14));
}
static inline void SET_BCN_UPD_PATH_ANTSEL_C(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, BIT(15));
}
static inline void SET_BCN_UPD_PATH_ANTSEL_D(void *h2c, u32 val)
{
le32p_replace_bits((__le32 *)(h2c) + 2, val, BIT(16));
}
static inline void SET_BCN_UPD_CSA_OFST(void *h2c, u32 val) #define RTW89_H2C_BCN_UPD_W0_PORT GENMASK(7, 0)
{ #define RTW89_H2C_BCN_UPD_W0_MBSSID GENMASK(15, 8)
le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(31, 17)); #define RTW89_H2C_BCN_UPD_W0_BAND GENMASK(23, 16)
} #define RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST GENMASK(31, 24)
#define RTW89_H2C_BCN_UPD_W1_MACID GENMASK(7, 0)
#define RTW89_H2C_BCN_UPD_W1_SSN_SEL GENMASK(9, 8)
#define RTW89_H2C_BCN_UPD_W1_SSN_MODE GENMASK(11, 10)
#define RTW89_H2C_BCN_UPD_W1_RATE GENMASK(20, 12)
#define RTW89_H2C_BCN_UPD_W1_TXPWR GENMASK(23, 21)
#define RTW89_H2C_BCN_UPD_W2_TXINFO_CTRL_EN BIT(0)
#define RTW89_H2C_BCN_UPD_W2_NTX_PATH_EN GENMASK(4, 1)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_A GENMASK(6, 5)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_B GENMASK(8, 7)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_C GENMASK(10, 9)
#define RTW89_H2C_BCN_UPD_W2_PATH_MAP_D GENMASK(12, 11)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_A BIT(13)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_B BIT(14)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_C BIT(15)
#define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_D BIT(16)
#define RTW89_H2C_BCN_UPD_W2_CSA_OFST GENMASK(31, 17)
static inline void SET_FWROLE_MAINTAIN_MACID(void *h2c, u32 val) static inline void SET_FWROLE_MAINTAIN_MACID(void *h2c, u32 val)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment