mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
wifi: rtw88: 8822c: extend supported probe request size
Some WSC IEs require size larger than we current supports. Extend size to fit those demands. Separate the registered scan IE length by IC so settings can be independent. Since old firmware uses fewer page number, define a firmware feature to be compatible with various firmware version. Signed-off-by: Po-Hao Huang <phhuang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Signed-off-by: Kalle Valo <kvalo@kernel.org> Link: https://lore.kernel.org/r/20220727065003.28340-2-pkshih@realtek.com
This commit is contained in:
parent
63757225a9
commit
d2eb7cb97c
8 changed files with 59 additions and 11 deletions
|
@ -1844,13 +1844,20 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
|||
struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb, *tmp;
|
||||
u8 page_offset = 1, *buf, page_size = chip->page_size;
|
||||
u8 pages = page_offset + num_probes * RTW_PROBE_PG_CNT;
|
||||
u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
|
||||
u16 buf_offset = page_size * page_offset;
|
||||
u8 tx_desc_sz = chip->tx_pkt_desc_sz;
|
||||
u8 page_cnt, pages;
|
||||
unsigned int pkt_len;
|
||||
int ret;
|
||||
|
||||
if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
||||
page_cnt = RTW_OLD_PROBE_PG_CNT;
|
||||
else
|
||||
page_cnt = RTW_PROBE_PG_CNT;
|
||||
|
||||
pages = page_offset + num_probes * page_cnt;
|
||||
|
||||
buf = kzalloc(page_size * pages, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
@ -1859,7 +1866,7 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
|||
skb_queue_walk_safe(probe_req_list, skb, tmp) {
|
||||
skb_unlink(skb, probe_req_list);
|
||||
rtw_fill_rsvd_page_desc(rtwdev, skb, RSVD_PROBE_REQ);
|
||||
if (skb->len > page_size * RTW_PROBE_PG_CNT) {
|
||||
if (skb->len > page_size * page_cnt) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1869,8 +1876,8 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
|||
loc = pg_addr - rtwdev->fifo.rsvd_boundary + page_offset;
|
||||
__rtw_fw_update_pkt(rtwdev, RTW_PACKET_PROBE_REQ, pkt_len, loc);
|
||||
|
||||
buf_offset += RTW_PROBE_PG_CNT * page_size;
|
||||
page_offset += RTW_PROBE_PG_CNT;
|
||||
buf_offset += page_cnt * page_size;
|
||||
page_offset += page_cnt;
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,8 @@
|
|||
#define RTW_EX_CH_INFO_HDR_SIZE 2
|
||||
#define RTW_SCAN_WIDTH 0
|
||||
#define RTW_PRI_CH_IDX 1
|
||||
#define RTW_PROBE_PG_CNT 2
|
||||
#define RTW_OLD_PROBE_PG_CNT 2
|
||||
#define RTW_PROBE_PG_CNT 4
|
||||
|
||||
enum rtw_c2h_cmd_id {
|
||||
C2H_CCX_TX_RPT = 0x03,
|
||||
|
@ -120,6 +121,10 @@ enum rtw_fw_feature {
|
|||
FW_FEATURE_MAX = BIT(31),
|
||||
};
|
||||
|
||||
enum rtw_fw_feature_ext {
|
||||
FW_FEATURE_EXT_OLD_PAGE_NUM = BIT(0),
|
||||
};
|
||||
|
||||
enum rtw_beacon_filter_offload_mode {
|
||||
BCN_FILTER_OFFLOAD_MODE_0 = 0,
|
||||
BCN_FILTER_OFFLOAD_MODE_1,
|
||||
|
@ -323,6 +328,11 @@ struct rtw_fw_hdr_legacy {
|
|||
__le32 rsvd5;
|
||||
} __packed;
|
||||
|
||||
#define RTW_FW_VER_CODE(ver, sub_ver, idx) \
|
||||
(((ver) << 16) | ((sub_ver) << 8) | (idx))
|
||||
#define RTW_FW_SUIT_VER_CODE(s) \
|
||||
RTW_FW_VER_CODE((s).version, (s).sub_version, (s).sub_index)
|
||||
|
||||
/* C2H */
|
||||
#define GET_CCX_REPORT_SEQNUM_V0(c2h_payload) (c2h_payload[6] & 0xfc)
|
||||
#define GET_CCX_REPORT_STATUS_V0(c2h_payload) (c2h_payload[0] & 0xc0)
|
||||
|
@ -770,6 +780,12 @@ static inline bool rtw_fw_feature_check(struct rtw_fw_state *fw,
|
|||
return !!(fw->feature & feature);
|
||||
}
|
||||
|
||||
static inline bool rtw_fw_feature_ext_check(struct rtw_fw_state *fw,
|
||||
enum rtw_fw_feature_ext feature)
|
||||
{
|
||||
return !!(fw->feature_ext & feature);
|
||||
}
|
||||
|
||||
void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
|
||||
struct sk_buff *skb);
|
||||
void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
|
||||
|
|
|
@ -1552,6 +1552,21 @@ static void rtw_init_vht_cap(struct rtw_dev *rtwdev,
|
|||
vht_cap->vht_mcs.tx_highest = highest;
|
||||
}
|
||||
|
||||
static u16 rtw_get_max_scan_ie_len(struct rtw_dev *rtwdev)
|
||||
{
|
||||
u16 len;
|
||||
|
||||
len = rtwdev->chip->max_scan_ie_len;
|
||||
|
||||
if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD) &&
|
||||
rtwdev->chip->id == RTW_CHIP_TYPE_8822C)
|
||||
len = IEEE80211_MAX_DATA_LEN;
|
||||
else if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
||||
len -= RTW_OLD_PROBE_PG_CNT * TX_PAGE_SIZE;
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
static void rtw_set_supported_band(struct ieee80211_hw *hw,
|
||||
struct rtw_chip_info *chip)
|
||||
{
|
||||
|
@ -1631,6 +1646,10 @@ static void __update_firmware_feature(struct rtw_dev *rtwdev,
|
|||
|
||||
feature = le32_to_cpu(fw_hdr->feature);
|
||||
fw->feature = feature & FW_FEATURE_SIG ? feature : 0;
|
||||
|
||||
if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C &&
|
||||
RTW_FW_SUIT_VER_CODE(rtwdev->fw) < RTW_FW_VER_CODE(9, 9, 13))
|
||||
fw->feature_ext |= FW_FEATURE_EXT_OLD_PAGE_NUM;
|
||||
}
|
||||
|
||||
static void __update_firmware_info(struct rtw_dev *rtwdev,
|
||||
|
@ -2136,7 +2155,7 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
|||
|
||||
hw->wiphy->features |= NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
|
||||
hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS;
|
||||
hw->wiphy->max_scan_ie_len = RTW_SCAN_MAX_IE_LEN;
|
||||
hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev);
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN);
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#define MAX_PG_CAM_BACKUP_NUM 8
|
||||
|
||||
#define RTW_SCAN_MAX_SSIDS 4
|
||||
#define RTW_SCAN_MAX_IE_LEN 128
|
||||
|
||||
#define RTW_MAX_PATTERN_NUM 12
|
||||
#define RTW_MAX_PATTERN_MASK_SIZE 16
|
||||
|
@ -33,6 +32,7 @@
|
|||
#define RFREG_MASK 0xfffff
|
||||
#define INV_RF_DATA 0xffffffff
|
||||
#define TX_PAGE_SIZE_SHIFT 7
|
||||
#define TX_PAGE_SIZE (1 << TX_PAGE_SIZE_SHIFT)
|
||||
|
||||
#define RTW_CHANNEL_WIDTH_MAX 3
|
||||
#define RTW_RF_PATH_MAX 4
|
||||
|
@ -1232,6 +1232,7 @@ struct rtw_chip_info {
|
|||
const char *wow_fw_name;
|
||||
const struct wiphy_wowlan_support *wowlan_stub;
|
||||
const u8 max_sched_scan_ssids;
|
||||
const u16 max_scan_ie_len;
|
||||
|
||||
/* coex paras */
|
||||
u32 coex_para_ver;
|
||||
|
@ -1853,6 +1854,7 @@ struct rtw_fw_state {
|
|||
u8 sub_index;
|
||||
u16 h2c_version;
|
||||
u32 feature;
|
||||
u32 feature_ext;
|
||||
};
|
||||
|
||||
enum rtw_sar_sources {
|
||||
|
|
|
@ -2720,7 +2720,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
|||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.ht_supported = true,
|
||||
.vht_supported = false,
|
||||
|
@ -2748,6 +2748,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
|||
.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x2007022f,
|
||||
.bt_desired_ver = 0x2f,
|
||||
|
|
|
@ -1898,7 +1898,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
|||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
|
@ -1926,6 +1926,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
|||
.bfer_su_max_num = 2,
|
||||
.bfer_mu_max_num = 1,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x19092746,
|
||||
.bt_desired_ver = 0x46,
|
||||
|
|
|
@ -2517,7 +2517,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
|||
.max_power_index = 0x3f,
|
||||
.csi_buf_pg_num = 0,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
|
@ -2549,6 +2549,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
|||
.l2h_th_ini_cs = 10 + EDCCA_IGI_BASE,
|
||||
.l2h_th_ini_ad = -14 + EDCCA_IGI_BASE,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
|
||||
.coex_para_ver = 0x20070206,
|
||||
.bt_desired_ver = 0x6,
|
||||
|
|
|
@ -5330,7 +5330,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
|||
.max_power_index = 0x7f,
|
||||
.csi_buf_pg_num = 50,
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = 128,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
|
@ -5375,6 +5375,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
|||
.wowlan_stub = &rtw_wowlan_stub_8822c,
|
||||
.max_sched_scan_ssids = 4,
|
||||
#endif
|
||||
.max_scan_ie_len = (RTW_PROBE_PG_CNT - 1) * TX_PAGE_SIZE,
|
||||
.coex_para_ver = 0x22020720,
|
||||
.bt_desired_ver = 0x20,
|
||||
.scbd_support = true,
|
||||
|
|
Loading…
Reference in a new issue