diff mbox series

brcmfmac: support CQM RSSI notification with older firmware

Message ID 20230123113924.2472721-1-john@metanate.com (mailing list archive)
State Changes Requested
Delegated to: Kalle Valo
Headers show
Series brcmfmac: support CQM RSSI notification with older firmware | expand

Commit Message

John Keeping Jan. 23, 2023, 11:39 a.m. UTC
Using the BCM4339 firmware from linux-firmware (version "BCM4339/2 wl0:
Sep  5 2019 11:05:52 version 6.37.39.113 (r722271 CY)" from
cypress/cyfmac4339-sdio.bin) the RSSI respose is only 4 bytes, which
results in an error being logged.

It seems that older devices send only the RSSI field and neither SNR nor
noise is included.  Handle this by accepting a 4 byte message and
reading only the RSSI from it.

Fixes: 7dd56ea45a66 ("brcmfmac: add support for CQM RSSI notifications")
Signed-off-by: John Keeping <john@metanate.com>
---
 .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

Comments

kernel test robot Jan. 23, 2023, 11:38 p.m. UTC | #1
Hi John,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main horms-ipvs/master linus/master v6.2-rc5 next-20230123]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/John-Keeping/brcmfmac-support-CQM-RSSI-notification-with-older-firmware/20230123-194055
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link:    https://lore.kernel.org/r/20230123113924.2472721-1-john%40metanate.com
patch subject: [PATCH] brcmfmac: support CQM RSSI notification with older firmware
config: sparc-randconfig-s051-20230123 (https://download.01.org/0day-ci/archive/20230124/202301240736.ApaNwujP-lkp@intel.com/config)
compiler: sparc64-linux-gcc (GCC) 12.1.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-39-gce1a6720-dirty
        # https://github.com/intel-lab-lkp/linux/commit/9e64c42d8517fca7356a698629cec1cdb79ce104
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review John-Keeping/brcmfmac-support-CQM-RSSI-notification-with-older-firmware/20230123-194055
        git checkout 9e64c42d8517fca7356a698629cec1cdb79ce104
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=sparc olddefconfig
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=sparc SHELL=/bin/bash drivers/net/wireless/broadcom/brcm80211/brcmfmac/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@intel.com>

sparse warnings: (new ones prefixed by >>)
>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c:6500:24: sparse: sparse: cast to restricted __be32

vim +6500 drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c

  6486	
  6487	static s32 brcmf_notify_rssi(struct brcmf_if *ifp,
  6488				     const struct brcmf_event_msg *e, void *data)
  6489	{
  6490		struct brcmf_cfg80211_vif *vif = ifp->vif;
  6491		struct brcmf_rssi_be *info = data;
  6492		s32 rssi, snr = 0, noise = 0;
  6493		s32 low, high, last;
  6494	
  6495		if (e->datalen >= sizeof(*info)) {
  6496			rssi = be32_to_cpu(info->rssi);
  6497			snr = be32_to_cpu(info->snr);
  6498			noise = be32_to_cpu(info->noise);
  6499		} else if (e->datalen >= sizeof(rssi)) {
> 6500			rssi = be32_to_cpu(*(s32 *)data);
  6501		} else {
  6502			brcmf_err("insufficient RSSI event data\n");
  6503			return 0;
  6504		}
  6505	
  6506		low = vif->cqm_rssi_low;
  6507		high = vif->cqm_rssi_high;
  6508		last = vif->cqm_rssi_last;
  6509	
  6510		brcmf_dbg(TRACE, "rssi=%d snr=%d noise=%d low=%d high=%d last=%d\n",
  6511			  rssi, snr, noise, low, high, last);
  6512	
  6513		vif->cqm_rssi_last = rssi;
  6514	
  6515		if (rssi <= low || rssi == 0) {
  6516			brcmf_dbg(INFO, "LOW rssi=%d\n", rssi);
  6517			cfg80211_cqm_rssi_notify(ifp->ndev,
  6518						 NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
  6519						 rssi, GFP_KERNEL);
  6520		} else if (rssi > high) {
  6521			brcmf_dbg(INFO, "HIGH rssi=%d\n", rssi);
  6522			cfg80211_cqm_rssi_notify(ifp->ndev,
  6523						 NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
  6524						 rssi, GFP_KERNEL);
  6525		}
  6526	
  6527		return 0;
  6528	}
  6529
diff mbox series

Patch

diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index b115902eb475..7dbb6f07d067 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -6489,18 +6489,20 @@  static s32 brcmf_notify_rssi(struct brcmf_if *ifp,
 {
 	struct brcmf_cfg80211_vif *vif = ifp->vif;
 	struct brcmf_rssi_be *info = data;
-	s32 rssi, snr, noise;
+	s32 rssi, snr = 0, noise = 0;
 	s32 low, high, last;
 
-	if (e->datalen < sizeof(*info)) {
+	if (e->datalen >= sizeof(*info)) {
+		rssi = be32_to_cpu(info->rssi);
+		snr = be32_to_cpu(info->snr);
+		noise = be32_to_cpu(info->noise);
+	} else if (e->datalen >= sizeof(rssi)) {
+		rssi = be32_to_cpu(*(s32 *)data);
+	} else {
 		brcmf_err("insufficient RSSI event data\n");
 		return 0;
 	}
 
-	rssi = be32_to_cpu(info->rssi);
-	snr = be32_to_cpu(info->snr);
-	noise = be32_to_cpu(info->noise);
-
 	low = vif->cqm_rssi_low;
 	high = vif->cqm_rssi_high;
 	last = vif->cqm_rssi_last;