From 75a6f6e04020dfde9dd8dc954e96cce54ebf2778 Mon Sep 17 00:00:00 2001 From: Adesh Kumar Singh Date: Mon, 25 Sep 2023 07:14:28 -0500 Subject: [PATCH 270/296] non-upstream: PNO: Fix for fw trap when we add more than 12 ssids to pno list Fixes: SWWLAN-147564 Signed-off-by: Adesh Kumar Singh --- .../broadcom/brcm80211/brcmfmac/pno.c | 25 ++++++++++++++++++- .../broadcom/brcm80211/brcmfmac/vendor_ifx.c | 5 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c index a1a774d9a064..774dd23c9982 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pno.c @@ -606,6 +606,7 @@ int pfn_send_network_blob_fw(struct wiphy *wiphy, brcm_pfn_param_t pfn_param; struct brcm_pfn *pfn_list_buffer, *pssidnet; int brcm_pfn_length = 0; + uint32_t offset; struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); vif = container_of(wdev, struct brcmf_cfg80211_vif, wdev); @@ -723,7 +724,29 @@ int pfn_send_network_blob_fw(struct wiphy *wiphy, network_blob_data++; } - ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", (void *)pfn_list_buffer, brcm_pfn_length); + /* There is a limit in len of data that we can send to fw using an iovar at a time. + * Here max value of cfg->pfn_data.count could be 16 which is exceeding the limit, + * so sending it two times. */ + if (cfg->pfn_data.count > (BRCMF_PNO_MAX_PFN_COUNT/2)) { + offset = sizeof(struct brcm_pfn) * (BRCMF_PNO_MAX_PFN_COUNT/2); + ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", (void *)pfn_list_buffer, + offset); + if (ret) { + brcmf_err("set pfnadd enable error:%d\n", ret); + return -1; + } + + ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", (void *)pfn_list_buffer + offset, + brcm_pfn_length - offset); + if (ret) { + brcmf_err("set pfnadd enable error:%d\n", ret); + return -1; + } + + } else { + ret = brcmf_fil_iovar_data_set(ifp, "pfn_add", (void *)pfn_list_buffer, brcm_pfn_length); + } + if (ret) { brcmf_err("set pfnadd enable error:%d\n", ret); return -1; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor_ifx.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor_ifx.c index 159441e29753..9148b1a47c91 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor_ifx.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/vendor_ifx.c @@ -1048,6 +1048,11 @@ int ifx_cfg80211_vndr_cmds_config_pfn(struct wiphy *wiphy, cfg->pfn_data.pfn_config = pfn_data->pfn_config; cfg->pfn_data.count = pfn_data->count; + if (cfg->pfn_data.count > BRCMF_PNO_MAX_PFN_COUNT) { + brcmf_dbg(TRACE, "Not in range. Max 16 ssids allowed to add in pfn list"); + cfg->pfn_data.count = BRCMF_PNO_MAX_PFN_COUNT; + } + buflen = cfg->pfn_data.count * sizeof(struct network_blob); cfg->pfn_data.network_blob_data = (struct network_blob *)kmalloc(buflen, GFP_KERNEL); memset(cfg->pfn_data.network_blob_data, '\0', buflen); -- 2.25.1