rtw89: fix crash when loading firmware file on certain platforms
Ping-Ke Shih
maintainercover rtw89: fix crash when loading firmware file on certain platforms
First patch is to avoid writing "partition size" on read-only firmware buffer, so it has to fix the crash.
The later two patches are used to make the semantics clear, but they don't change the logic at all.
I hope at least first patch can be taken into 5.16-rc, so people can avoid this crash.
Ping-Ke Shih (3):
rtw89: update partition size of firmware header on skb->data
rtw89: add const in the cast of le32_get_bits()
rtw89: use inline function instead macro to set H2C and CAM
drivers/net/wireless/realtek/rtw89/cam.h | 468 ++++-- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- drivers/net/wireless/realtek/rtw89/fw.h | 1768 ++++++++++++--------- drivers/net/wireless/realtek/rtw89/txrx.h | 46 +- 4 files changed, 1370 insertions(+), 914 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/3 rtw89: update partition size of firmware header on skb->data
The partition size is used to tell hardware the size of piece we are going to send a firmware. The old code updates the size in constant buffer of firmware, and leads system crash.
To fix this, update the size on skb->data after we copy the firmware data into skb.
--- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- drivers/net/wireless/realtek/rtw89/fw.h | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +1 -1
@@ -91,7 +91,6 @@ static int rtw89_fw_hdr_parser(struct rtw89_dev *rtwdev, const u8 *fw, u32 len, info->section_num =GET_FW_HDR_SEC_NUM (fw); info->hdr_len =RTW89_FW_HDR_SIZE + info->section_num *RTW89_FW_SECTION_HDR_SIZE ; -SET_FW_HDR_PART_SIZE (fw,FWDL_SECTION_PER_PKT_LEN ); bin = fw + info->hdr_len;
@@ -275,6 +274,7 @@ static int __rtw89_fw_download_hdr(struct rtw89_dev *rtwdev, const u8 *fw, u32 l }skb_put_data (skb, fw, len); +SET_FW_HDR_PART_SIZE (skb->data,FWDL_SECTION_PER_PKT_LEN );rtw89_h2c_pkt_set_hdr_fwdl (rtwdev, skb,FWCMD_TYPE_H2C ,H2C_CAT_MAC ,H2C_CL_MAC_FWDL ,H2C_FUNC_MAC_FWHDR_DL , len);
drivers/net/wireless/realtek/rtw89/fw.h +4 -2
@@ -282,8 +282,10 @@ struct rtw89_h2creg_sch_tx_en { le32_get_bits(*((__le32 *)(fwhdr) + 6), GENMASK(15, 8))#define GET_FW_HDR_CMD_VERSERION (fwhdr) \ le32_get_bits(*((__le32 *)(fwhdr) + 7), GENMASK(31, 24)) -#define SET_FW_HDR_PART_SIZE (fwhdr, val) \ - le32p_replace_bits((__le32 *)(fwhdr) + 7, val, GENMASK(15, 0)) +static inline void SET_FW_HDR_PART_SIZE (void *fwhdr,u32 val) +{ +le32p_replace_bits ((__le32 *)fwhdr +7 , val,GENMASK (15 ,0 )); +}#define SET_CTRL_INFO_MACID (table, val) \ le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0))
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 2/3 rtw89: add const in the cast of le32_get_bits()
In reply to Ping-Ke ShihAdd 'const' to be clear that this is a read-only access, and this patch doesn't change logic at all.
--- drivers/net/wireless/realtek/rtw89/fw.h | 68 +++++++++++------------ drivers/net/wireless/realtek/rtw89/txrx.h | 46 +++++++-------- 2 files changed, 57 insertions(+), 57 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.h +34 -34
@@ -252,36 +252,36 @@ struct rtw89_h2creg_sch_tx_en {#define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0)#define GET_FWSECTION_HDR_SEC_SIZE (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), GENMASK(23, 0)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(23, 0))#define GET_FWSECTION_HDR_CHECKSUM (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), BIT(28)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), BIT(28))#define GET_FWSECTION_HDR_REDL (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), BIT(29)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), BIT(29))#define GET_FWSECTION_HDR_DL_ADDR (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr)), GENMASK(31, 0)) + le32_get_bits(*((const __le32 *)(fwhdr)), GENMASK(31, 0))#define GET_FW_HDR_MAJOR_VERSION (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), GENMASK(7, 0)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(7, 0))#define GET_FW_HDR_MINOR_VERSION (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(15, 8))#define GET_FW_HDR_SUBVERSION (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), GENMASK(23, 16)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(23, 16))#define GET_FW_HDR_SUBINDEX (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 1), GENMASK(31, 24)) + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(31, 24))#define GET_FW_HDR_MONTH (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 4), GENMASK(7, 0)) + le32_get_bits(*((const __le32 *)(fwhdr) + 4), GENMASK(7, 0))#define GET_FW_HDR_DATE (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 4), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)(fwhdr) + 4), GENMASK(15, 8))#define GET_FW_HDR_HOUR (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 4), GENMASK(23, 16)) + le32_get_bits(*((const __le32 *)(fwhdr) + 4), GENMASK(23, 16))#define GET_FW_HDR_MIN (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 4), GENMASK(31, 24)) + le32_get_bits(*((const __le32 *)(fwhdr) + 4), GENMASK(31, 24))#define GET_FW_HDR_YEAR (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 5), GENMASK(31, 0)) + le32_get_bits(*((const __le32 *)(fwhdr) + 5), GENMASK(31, 0))#define GET_FW_HDR_SEC_NUM (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 6), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)(fwhdr) + 6), GENMASK(15, 8))#define GET_FW_HDR_CMD_VERSERION (fwhdr) \ - le32_get_bits(*((__le32 *)(fwhdr) + 7), GENMASK(31, 24)) + le32_get_bits(*((const __le32 *)(fwhdr) + 7), GENMASK(31, 24))static inline void SET_FW_HDR_PART_SIZE (void *fwhdr,u32 val) {le32p_replace_bits ((__le32 *)fwhdr +7 , val,GENMASK (15 ,0 ));
@@ -1170,49 +1170,49 @@ enum rtw89_btc_cxdrvinfo {#define RTW89_C2H_HEADER_LEN 8#define RTW89_GET_C2H_CATEGORY (c2h) \ - le32_get_bits(*((__le32 *)c2h), GENMASK(1, 0)) + le32_get_bits(*((const __le32 *)c2h), GENMASK(1, 0))#define RTW89_GET_C2H_CLASS (c2h) \ - le32_get_bits(*((__le32 *)c2h), GENMASK(7, 2)) + le32_get_bits(*((const __le32 *)c2h), GENMASK(7, 2))#define RTW89_GET_C2H_FUNC (c2h) \ - le32_get_bits(*((__le32 *)c2h), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)c2h), GENMASK(15, 8))#define RTW89_GET_C2H_LEN (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 1), GENMASK(13, 0)) + le32_get_bits(*((const __le32 *)(c2h) + 1), GENMASK(13, 0))#define RTW89_GET_C2H_LOG_SRT_PRT (c2h) (char *)((__le32 *)(c2h) + 2)#define RTW89_GET_C2H_LOG_LEN (len) ((len) - RTW89_C2H_HEADER_LEN)#define RTW89_GET_MAC_C2H_DONE_ACK_CAT (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(1, 0)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))#define RTW89_GET_MAC_C2H_DONE_ACK_CLASS (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(7, 2)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))#define RTW89_GET_MAC_C2H_DONE_ACK_FUNC (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))#define RTW89_GET_MAC_C2H_DONE_ACK_H2C_RETURN (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(23, 16)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16))#define RTW89_GET_MAC_C2H_DONE_ACK_H2C_SEQ (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(31, 24)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 24))#define RTW89_GET_MAC_C2H_REV_ACK_CAT (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(1, 0)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0))#define RTW89_GET_MAC_C2H_REV_ACK_CLASS (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(7, 2)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2))#define RTW89_GET_MAC_C2H_REV_ACK_FUNC (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(15, 8)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8))#define RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(23, 16)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16))#define RTW89_GET_PHY_C2H_RA_RPT_MACID (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(15, 0)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 0))#define RTW89_GET_PHY_C2H_RA_RPT_RETRY_RATIO (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 2), GENMASK(23, 16)) + le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16))#define RTW89_GET_PHY_C2H_RA_RPT_MCSNSS (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 3), GENMASK(6, 0)) + le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(6, 0))#define RTW89_GET_PHY_C2H_RA_RPT_MD_SEL (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 3), GENMASK(9, 8)) + le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(9, 8))#define RTW89_GET_PHY_C2H_RA_RPT_GILTF (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 3), GENMASK(12, 10)) + le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(12, 10))#define RTW89_GET_PHY_C2H_RA_RPT_BW (c2h) \ - le32_get_bits(*((__le32 *)(c2h) + 3), GENMASK(14, 13)) + le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(14, 13))/* VHT, HE, HT-old: [6:4]: NSS, [3:0]: MCS * HT-new: [6:5]: NA, [4:0]: MCS
drivers/net/wireless/realtek/rtw89/txrx.h +23 -23
75 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/3 rtw89: use inline function instead macro to set H2C and CAM
In reply to Ping-Ke ShihIn order to use compiler to check if we do improper cast of const* on arguments of inline function.
--- drivers/net/wireless/realtek/rtw89/cam.h | 468 ++++-- drivers/net/wireless/realtek/rtw89/fw.h | 1692 +++++++++++++--------- 2 files changed, 1307 insertions(+), 853 deletions(-)
drivers/net/wireless/realtek/rtw89/cam.h +334 -134
@@ -9,140 +9,340 @@#define RTW89_SEC_CAM_LEN 20 -#define FWCMD_SET_ADDR_IDX (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_OFFSET (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_LEN (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 1, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_VALID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(0)) -#define FWCMD_SET_ADDR_NET_TYPE (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(2, 1)) -#define FWCMD_SET_ADDR_BCN_HIT_COND (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(4, 3)) -#define FWCMD_SET_ADDR_HIT_RULE (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(6, 5)) -#define FWCMD_SET_ADDR_BB_SEL (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, BIT(7)) -#define FWCMD_SET_ADDR_ADDR_MASK (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(13, 8)) -#define FWCMD_SET_ADDR_MASK_SEL (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(15, 14)) -#define FWCMD_SET_ADDR_SMA_HASH (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_TMA_HASH (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 2, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_BSSID_CAM_IDX (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 3, value, GENMASK(5, 0)) -#define FWCMD_SET_ADDR_SMA0 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_SMA1 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_SMA2 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_SMA3 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 4, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_SMA4 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_SMA5 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_TMA0 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_TMA1 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 5, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_TMA2 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_TMA3 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_TMA4 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_TMA5 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 6, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_MACID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_PORT_INT (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(10, 8)) -#define FWCMD_SET_ADDR_TSF_SYNC (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(13, 11)) -#define FWCMD_SET_ADDR_TF_TRS (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(14)) -#define FWCMD_SET_ADDR_LSIG_TXOP (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, BIT(15)) -#define FWCMD_SET_ADDR_TGT_IND (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(26, 24)) -#define FWCMD_SET_ADDR_FRM_TGT_IND (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 8, value, GENMASK(29, 27)) -#define FWCMD_SET_ADDR_AID12 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 0)) -#define FWCMD_SET_ADDR_AID12_0 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_AID12_1 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(11, 8)) -#define FWCMD_SET_ADDR_WOL_PATTERN (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(12)) -#define FWCMD_SET_ADDR_WOL_UC (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(13)) -#define FWCMD_SET_ADDR_WOL_MAGIC (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(14)) -#define FWCMD_SET_ADDR_WAPI (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, BIT(15)) -#define FWCMD_SET_ADDR_SEC_ENT_MODE (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(17, 16)) -#define FWCMD_SET_ADDR_SEC_ENT0_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(19, 18)) -#define FWCMD_SET_ADDR_SEC_ENT1_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(21, 20)) -#define FWCMD_SET_ADDR_SEC_ENT2_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(23, 22)) -#define FWCMD_SET_ADDR_SEC_ENT3_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(25, 24)) -#define FWCMD_SET_ADDR_SEC_ENT4_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(27, 26)) -#define FWCMD_SET_ADDR_SEC_ENT5_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(29, 28)) -#define FWCMD_SET_ADDR_SEC_ENT6_KEYID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 9, value, GENMASK(31, 30)) -#define FWCMD_SET_ADDR_SEC_ENT_VALID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_SEC_ENT0 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_SEC_ENT1 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_SEC_ENT2 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 10, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_SEC_ENT3 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_SEC_ENT4 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_SEC_ENT5 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_SEC_ENT6 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 11, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_BSSID_IDX (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_BSSID_OFFSET (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_BSSID_LEN (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 12, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_BSSID_VALID (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(0)) -#define FWCMD_SET_ADDR_BSSID_BB_SEL (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 13, value, BIT(1)) -#define FWCMD_SET_ADDR_BSSID_BSS_COLOR (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(13, 8)) -#define FWCMD_SET_ADDR_BSSID_BSSID0 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_BSSID_BSSID1 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 13, value, GENMASK(31, 24)) -#define FWCMD_SET_ADDR_BSSID_BSSID2 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(7, 0)) -#define FWCMD_SET_ADDR_BSSID_BSSID3 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(15, 8)) -#define FWCMD_SET_ADDR_BSSID_BSSID4 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(23, 16)) -#define FWCMD_SET_ADDR_BSSID_BSSID5 (cmd, value) \ - le32p_replace_bits((__le32 *)(cmd) + 14, value, GENMASK(31, 24)) +static inline void FWCMD_SET_ADDR_IDX (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +1 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_OFFSET (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +1 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_LEN (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +1 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_VALID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,BIT (0 )); +} + +static inline void FWCMD_SET_ADDR_NET_TYPE (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (2 ,1 )); +} + +static inline void FWCMD_SET_ADDR_BCN_HIT_COND (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (4 ,3 )); +} + +static inline void FWCMD_SET_ADDR_HIT_RULE (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (6 ,5 )); +} + +static inline void FWCMD_SET_ADDR_BB_SEL (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,BIT (7 )); +} + +static inline void FWCMD_SET_ADDR_ADDR_MASK (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (13 ,8 )); +} + +static inline void FWCMD_SET_ADDR_MASK_SEL (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (15 ,14 )); +} + +static inline void FWCMD_SET_ADDR_SMA_HASH (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_TMA_HASH (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +2 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_CAM_IDX (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +3 , value,GENMASK (5 ,0 )); +} + +static inline void FWCMD_SET_ADDR_SMA0 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +4 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_SMA1 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +4 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_SMA2 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +4 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_SMA3 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +4 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_SMA4 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +5 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_SMA5 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +5 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_TMA0 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +5 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_TMA1 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +5 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_TMA2 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +6 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_TMA3 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +6 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_TMA4 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +6 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_TMA5 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +6 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_MACID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_PORT_INT (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,GENMASK (10 ,8 )); +} + +static inline void FWCMD_SET_ADDR_TSF_SYNC (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,GENMASK (13 ,11 )); +} + +static inline void FWCMD_SET_ADDR_TF_TRS (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,BIT (14 )); +} + +static inline void FWCMD_SET_ADDR_LSIG_TXOP (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,BIT (15 )); +} + +static inline void FWCMD_SET_ADDR_TGT_IND (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,GENMASK (26 ,24 )); +} + +static inline void FWCMD_SET_ADDR_FRM_TGT_IND (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +8 , value,GENMASK (29 ,27 )); +} + +static inline void FWCMD_SET_ADDR_AID12 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (11 ,0 )); +} + +static inline void FWCMD_SET_ADDR_AID12_0 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_AID12_1 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (11 ,8 )); +} + +static inline void FWCMD_SET_ADDR_WOL_PATTERN (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,BIT (12 )); +} + +static inline void FWCMD_SET_ADDR_WOL_UC (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,BIT (13 )); +} + +static inline void FWCMD_SET_ADDR_WOL_MAGIC (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,BIT (14 )); +} + +static inline void FWCMD_SET_ADDR_WAPI (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,BIT (15 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT_MODE (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (17 ,16 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT0_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (19 ,18 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT1_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (21 ,20 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT2_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (23 ,22 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT3_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (25 ,24 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT4_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (27 ,26 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT5_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (29 ,28 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT6_KEYID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +9 , value,GENMASK (31 ,30 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT_VALID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +10 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT0 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +10 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT1 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +10 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT2 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +10 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT3 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +11 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT4 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +11 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT5 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +11 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_SEC_ENT6 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +11 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_IDX (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +12 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_OFFSET (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +12 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_LEN (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +12 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_VALID (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +13 , value,BIT (0 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BB_SEL (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +13 , value,BIT (1 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSS_COLOR (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +13 , value,GENMASK (13 ,8 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID0 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +13 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID1 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +13 , value,GENMASK (31 ,24 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID2 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +14 , value,GENMASK (7 ,0 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID3 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +14 , value,GENMASK (15 ,8 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID4 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +14 , value,GENMASK (23 ,16 )); +} + +static inline void FWCMD_SET_ADDR_BSSID_BSSID5 (void *cmd,u32 value) +{ +le32p_replace_bits ((__le32 *)(cmd) +14 , value,GENMASK (31 ,24 )); +}int rtw89_cam_init (struct rtw89_dev *rtwdev,struct rtw89_vif *vif);void rtw89_cam_deinit (struct rtw89_dev *rtwdev,struct rtw89_vif *vif);
drivers/net/wireless/realtek/rtw89/fw.h +973 -719
1,804 lines not on this page · raw message
Signature · 1 line
2.25.1
Quoted 7 lines · Ping-Ke Shih
First patch is to avoid writing "partition size" on read-only firmware buffer, so it has to fix the crash.
The later two patches are used to make the semantics clear, but they don't change the logic at all.I hope at least first patch can be taken into 5.16-rc, so people can avoid this crash.
Quoted 12 lines
Ping-Ke Shih (3):
rtw89: update partition size of firmware header onskb->data
rtw89: add const in the cast ofle32_get_bits()
rtw89: use inline function instead macro to set H2C and CAMdrivers/net/wireless/realtek/rtw89/cam.h | 468 ++++-- drivers/net/wireless/realtek/rtw89/fw.c | 2 +- drivers/net/wireless/realtek/rtw89/fw.h | 1768 ++++++++++++--------- drivers/net/wireless/realtek/rtw89/txrx.h | 46 +- 4 files changed, 1370 insertions(+), 914 deletions(-)