mac80211: rebase ontop of v4.18.5
Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
		
							parent
							
								
									e9d92bf1e1
								
							
						
					
					
						commit
						d9eefa7a70
					
				| @ -10,10 +10,10 @@ include $(INCLUDE_DIR)/kernel.mk | ||||
| 
 | ||||
| PKG_NAME:=mac80211 | ||||
| 
 | ||||
| PKG_VERSION:=2017-11-01 | ||||
| PKG_RELEASE:=9 | ||||
| PKG_VERSION:=v4.18.5 | ||||
| PKG_RELEASE:=1 | ||||
| PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources | ||||
| PKG_HASH:=8437ab7886b988c8152e7a4db30b7f41009e49a3b2cb863edd05da1ecd7eb05a | ||||
| PKG_HASH:=9c13660e98b9397260266f98c9db76bdad2b48462cb376b5862dfbd18369edf2 | ||||
| 
 | ||||
| PKG_SOURCE:=backports-$(PKG_VERSION).tar.xz | ||||
| PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/backports-$(PKG_VERSION) | ||||
| @ -1116,7 +1116,7 @@ endef | ||||
| define KernelPackage/mt7601u | ||||
|   $(call KernelPackage/mac80211/Default) | ||||
|   TITLE:=MT7601U-based USB dongles Wireless Driver | ||||
|   DEPENDS+= +kmod-mac80211 +@DRIVER_11N_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware | ||||
|   DEPENDS+= @BROKEN +kmod-mac80211 +@DRIVER_11N_SUPPORT @USB_SUPPORT +kmod-usb-core +mt7601u-firmware | ||||
|   FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko | ||||
|   AUTOLOAD:=$(call AutoProbe,mt7601u) | ||||
| endef | ||||
| @ -1839,6 +1839,26 @@ ifeq ($(strip $(CONFIG_EXTERNAL_KERNEL_TREE)),"") | ||||
|   endif | ||||
| endif | ||||
| 
 | ||||
| define Build/Patch | ||||
| 	$(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/) | ||||
| 	$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/) | ||||
| 	$(if $(QUILT),touch $(PKG_BUILD_DIR)/.quilt_used) | ||||
| endef | ||||
| 
 | ||||
| define Quilt/Refresh/Package | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/build,build/) | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/subsys,subsys/) | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/ath,ath/) | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/rt2x00,rt2x00/) | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/mwl,mwl/) | ||||
| 	$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR)/brcm,brcm/) | ||||
| endef | ||||
| 
 | ||||
| define Build/Compile | ||||
| 	$(SH_FUNC) var2file "$(call shvar,mac80211_config)" $(PKG_BUILD_DIR)/.config | ||||
| 	$(MAKE) $(MAKE_OPTS) allnoconfig | ||||
|  | ||||
| @ -1,11 +0,0 @@ | ||||
| --- a/backport-include/linux/verification.h
 | ||||
| +++ b/backport-include/linux/verification.h
 | ||||
| @@ -1,7 +1,7 @@
 | ||||
|  #ifndef __BP_VERIFICATION_H | ||||
|  #define __BP_VERIFICATION_H | ||||
|  #include <linux/version.h> | ||||
| -#ifndef CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION
 | ||||
| +#if LINUX_VERSION_IS_GEQ(4,7,0) && !defined(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION)
 | ||||
|  #include_next <linux/verification.h> | ||||
|  #else | ||||
|  #include <linux/key.h> | ||||
| @ -1,10 +0,0 @@ | ||||
| --- a/compat/backport-4.12.c
 | ||||
| +++ b/compat/backport-4.12.c
 | ||||
| @@ -224,6 +224,7 @@ int bp_extack_genl_register_family(struc
 | ||||
|  	} | ||||
|   | ||||
|  	/* copy this since the family might access it directly */ | ||||
| +	family->id = copy->family.id;
 | ||||
|  	family->attrbuf = copy->family.attrbuf; | ||||
|  	family->mcgrp_offset = copy->family.mcgrp_offset; | ||||
|   | ||||
| @ -1,34 +0,0 @@ | ||||
| --- a/drivers/net/wireless/intel/ipw2x00/ipw2200.c
 | ||||
| +++ b/drivers/net/wireless/intel/ipw2x00/ipw2200.c
 | ||||
| @@ -11506,6 +11506,15 @@ static const struct attribute_group ipw_
 | ||||
|  	.attrs = ipw_sysfs_entries, | ||||
|  }; | ||||
|   | ||||
| +#if LINUX_VERSION_IS_LESS(4,10,0)
 | ||||
| +static int __change_mtu(struct net_device *ndev, int new_mtu){
 | ||||
| +	if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
 | ||||
| +		return -EINVAL;
 | ||||
| +	ndev->mtu = new_mtu;
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef CPTCFG_IPW2200_PROMISCUOUS | ||||
|  static int ipw_prom_open(struct net_device *dev) | ||||
|  { | ||||
| @@ -11554,15 +11563,6 @@ static netdev_tx_t ipw_prom_hard_start_x
 | ||||
|  	return NETDEV_TX_OK; | ||||
|  } | ||||
|   | ||||
| -#if LINUX_VERSION_IS_LESS(4,10,0)
 | ||||
| -static int __change_mtu(struct net_device *ndev, int new_mtu){
 | ||||
| -	if (new_mtu < 68 || new_mtu > LIBIPW_DATA_LEN)
 | ||||
| -		return -EINVAL;
 | ||||
| -	ndev->mtu = new_mtu;
 | ||||
| -	return 0;
 | ||||
| -}
 | ||||
| -#endif
 | ||||
| -
 | ||||
|  static const struct net_device_ops ipw_prom_netdev_ops = { | ||||
|  #if LINUX_VERSION_IS_LESS(4,10,0) | ||||
|  	.ndo_change_mtu = __change_mtu, | ||||
| @ -1,47 +0,0 @@ | ||||
| --- a/drivers/net/wireless/ath/ath10k/Kconfig
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/Kconfig
 | ||||
| @@ -65,6 +65,12 @@ config ATH10K_TRACING
 | ||||
|  	---help--- | ||||
|  	  Select this to ath10k use tracing infrastructure. | ||||
|   | ||||
| +config ATH10K_THERMAL
 | ||||
| +	bool "Atheros ath10k thermal monitoring support"
 | ||||
| +	depends on THERMAL
 | ||||
| +	---help---
 | ||||
| +	  Select this to ath10k use hwmon for thermal measurement.
 | ||||
| +
 | ||||
|  config ATH10K_DFS_CERTIFIED | ||||
|  	bool "Atheros DFS support for certified platforms" | ||||
|  	depends on ATH10K && CFG80211_CERTIFICATION_ONUS | ||||
| --- a/drivers/net/wireless/ath/ath10k/Makefile
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/Makefile
 | ||||
| @@ -17,7 +17,7 @@ ath10k_core-y += mac.o \
 | ||||
|  ath10k_core-$(CPTCFG_ATH10K_DEBUGFS) += spectral.o | ||||
|  ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o | ||||
|  ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o | ||||
| -ath10k_core-$(CONFIG_THERMAL) += thermal.o
 | ||||
| +ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o
 | ||||
|  ath10k_core-$(CPTCFG_MAC80211_DEBUGFS) += debugfs_sta.o | ||||
|  ath10k_core-$(CONFIG_PM) += wow.o | ||||
|   | ||||
| --- a/drivers/net/wireless/ath/ath10k/thermal.h
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/thermal.h
 | ||||
| @@ -36,7 +36,7 @@ struct ath10k_thermal {
 | ||||
|  	int temperature; | ||||
|  }; | ||||
|   | ||||
| -#if IS_REACHABLE(CONFIG_THERMAL)
 | ||||
| +#if IS_REACHABLE(CPTCFG_ATH10K_THERMAL)
 | ||||
|  int ath10k_thermal_register(struct ath10k *ar); | ||||
|  void ath10k_thermal_unregister(struct ath10k *ar); | ||||
|  void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature); | ||||
| --- a/local-symbols
 | ||||
| +++ b/local-symbols
 | ||||
| @@ -139,6 +139,7 @@ ATH10K_SDIO=
 | ||||
|  ATH10K_USB= | ||||
|  ATH10K_DEBUG= | ||||
|  ATH10K_DEBUGFS= | ||||
| +ATH10K_THERMAL=
 | ||||
|  ATH10K_TRACING= | ||||
|  ATH10K_DFS_CERTIFIED= | ||||
|  WCN36XX= | ||||
| @ -1,111 +0,0 @@ | ||||
| From d06f26c5c8a41f246a9c40862a77a55725cedbd3 Mon Sep 17 00:00:00 2001 | ||||
| From: Sven Eckelmann <sven.eckelmann@openmesh.com> | ||||
| Date: Fri, 8 Dec 2017 11:37:42 +0100 | ||||
| Subject: ath10k: search DT for qcom,ath10k-calibration-variant | ||||
| 
 | ||||
| Board Data File (BDF) is loaded upon driver boot-up procedure. The right | ||||
| board data file is identified on QCA4019 using bus, bmi-chip-id and | ||||
| bmi-board-id. | ||||
| 
 | ||||
| The problem, however, can occur when the (default) board data file cannot | ||||
| fulfill with the vendor requirements and it is necessary to use a different | ||||
| board data file. | ||||
| 
 | ||||
| This problem was solved for SMBIOS by adding a special SMBIOS type 0xF8. | ||||
| Something similar has to be provided for systems without SMBIOS but with | ||||
| device trees. No solution was specified by QCA and therefore a new one has | ||||
| to be found for ath10k. | ||||
| 
 | ||||
| The device tree requires addition strings to define the variant name | ||||
| 
 | ||||
|     wifi@a000000 { | ||||
|     	status = "okay"; | ||||
|     	qcom,ath10k-calibration-variant = "RT-AC58U"; | ||||
|     }; | ||||
| 
 | ||||
|     wifi@a800000 { | ||||
|     	status = "okay"; | ||||
|     	qcom,ath10k-calibration-variant = "RT-AC58U"; | ||||
|     }; | ||||
| 
 | ||||
| This would create the boarddata identifiers for the board-2.bin search | ||||
| 
 | ||||
|  *  bus=ahb,bmi-chip-id=0,bmi-board-id=16,variant=RT-AC58U | ||||
|  *  bus=ahb,bmi-chip-id=0,bmi-board-id=17,variant=RT-AC58U | ||||
| 
 | ||||
| Signed-off-by: Sven Eckelmann <sven.eckelmann@openmesh.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||
| ---
 | ||||
|  drivers/net/wireless/ath/ath10k/core.c | 40 ++++++++++++++++++++++++++++------ | ||||
|  1 file changed, 33 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath10k/core.c
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/core.c
 | ||||
| @@ -860,6 +860,28 @@ static int ath10k_core_check_smbios(stru
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int ath10k_core_check_dt(struct ath10k *ar)
 | ||||
| +{
 | ||||
| +	struct device_node *node;
 | ||||
| +	const char *variant = NULL;
 | ||||
| +
 | ||||
| +	node = ar->dev->of_node;
 | ||||
| +	if (!node)
 | ||||
| +		return -ENOENT;
 | ||||
| +
 | ||||
| +	of_property_read_string(node, "qcom,ath10k-calibration-variant",
 | ||||
| +				&variant);
 | ||||
| +	if (!variant)
 | ||||
| +		return -ENODATA;
 | ||||
| +
 | ||||
| +	if (strscpy(ar->id.bdf_ext, variant, sizeof(ar->id.bdf_ext)) < 0)
 | ||||
| +		ath10k_dbg(ar, ATH10K_DBG_BOOT,
 | ||||
| +			   "bdf variant string is longer than the buffer can accommodate (variant: %s)\n",
 | ||||
| +			    variant);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int ath10k_download_and_run_otp(struct ath10k *ar) | ||||
|  { | ||||
|  	u32 result, address = ar->hw_params.patch_load_addr; | ||||
| @@ -1231,19 +1253,19 @@ static int ath10k_core_create_board_name
 | ||||
|  	/* strlen(',variant=') + strlen(ar->id.bdf_ext) */ | ||||
|  	char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 }; | ||||
|   | ||||
| +	if (ar->id.bdf_ext[0] != '\0')
 | ||||
| +		scnprintf(variant, sizeof(variant), ",variant=%s",
 | ||||
| +			  ar->id.bdf_ext);
 | ||||
| +
 | ||||
|  	if (ar->id.bmi_ids_valid) { | ||||
|  		scnprintf(name, name_len, | ||||
| -			  "bus=%s,bmi-chip-id=%d,bmi-board-id=%d",
 | ||||
| +			  "bus=%s,bmi-chip-id=%d,bmi-board-id=%d%s",
 | ||||
|  			  ath10k_bus_str(ar->hif.bus), | ||||
|  			  ar->id.bmi_chip_id, | ||||
| -			  ar->id.bmi_board_id);
 | ||||
| +			  ar->id.bmi_board_id, variant);
 | ||||
|  		goto out; | ||||
|  	} | ||||
|   | ||||
| -	if (ar->id.bdf_ext[0] != '\0')
 | ||||
| -		scnprintf(variant, sizeof(variant), ",variant=%s",
 | ||||
| -			  ar->id.bdf_ext);
 | ||||
| -
 | ||||
|  	scnprintf(name, name_len, | ||||
|  		  "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x%s", | ||||
|  		  ath10k_bus_str(ar->hif.bus), | ||||
| @@ -2343,7 +2365,11 @@ static int ath10k_core_probe_fw(struct a
 | ||||
|   | ||||
|  	ret = ath10k_core_check_smbios(ar); | ||||
|  	if (ret) | ||||
| -		ath10k_dbg(ar, ATH10K_DBG_BOOT, "bdf variant name not set.\n");
 | ||||
| +		ath10k_dbg(ar, ATH10K_DBG_BOOT, "SMBIOS bdf variant name not set.\n");
 | ||||
| +
 | ||||
| +	ret = ath10k_core_check_dt(ar);
 | ||||
| +	if (ret)
 | ||||
| +		ath10k_dbg(ar, ATH10K_DBG_BOOT, "DT bdf variant name not set.\n");
 | ||||
|   | ||||
|  	ret = ath10k_core_fetch_board_file(ar); | ||||
|  	if (ret) { | ||||
| @ -1,36 +0,0 @@ | ||||
| From 606204bb863fa3b0bb54929d79b4dc46338f9180 Mon Sep 17 00:00:00 2001 | ||||
| From: Sathishkumar Muruganandam <murugana@codeaurora.org> | ||||
| Date: Tue, 27 Mar 2018 11:26:46 +0300 | ||||
| Subject: [PATCH] ath10k: suppress "Unknown eventid: 36925" warnings | ||||
| 
 | ||||
| FW has Smart Logging feature enabled by default for detecting failures | ||||
| and processing FATAL_CONDITION_EVENTID (36925 - 0x903D) back to host. | ||||
| 
 | ||||
| Since ath10k doesn't implement the Smart Logging and FATAL CONDITION | ||||
| EVENT processing yet, suppressing the unknown event ID warning by moving | ||||
| this under ATH10K_DBG_WMI. | ||||
| 
 | ||||
| Simulated the same issue by having associated STA powered off when | ||||
| ping flood was running from AP backbone. This triggerd STA KICKOUT | ||||
| in AP followed by FATAL CONDITION event 36925. | ||||
| 
 | ||||
| Issue was reproduced and verified in below DUT | ||||
| ------------------------------------------------
 | ||||
| AP mode of OpenWRT QCA9984 running 6.0.8 with FW ver 10.4-3.5.3-00053 | ||||
| 
 | ||||
| Signed-off-by: Sathishkumar Muruganandam <murugana@codeaurora.org> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/ath/ath10k/wmi.c | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath10k/wmi.c
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/wmi.c
 | ||||
| @@ -5462,6 +5462,7 @@ static void ath10k_wmi_10_4_op_rx(struct
 | ||||
|  	case WMI_10_4_WOW_WAKEUP_HOST_EVENTID: | ||||
|  	case WMI_10_4_PEER_RATECODE_LIST_EVENTID: | ||||
|  	case WMI_10_4_WDS_PEER_EVENTID: | ||||
| +	case WMI_10_4_DEBUG_FATAL_CONDITION_EVENTID:
 | ||||
|  		ath10k_dbg(ar, ATH10K_DBG_WMI, | ||||
|  			   "received event id %d not implemented\n", id); | ||||
|  		break; | ||||
| @ -1,45 +0,0 @@ | ||||
| From patchwork Mon May 28 11:25:06 2018 | ||||
| Content-Type: text/plain; charset="utf-8" | ||||
| MIME-Version: 1.0 | ||||
| Content-Transfer-Encoding: 7bit | ||||
| Subject: Revert "rt2800: use TXOP_BACKOFF for probe frames" | ||||
| From: Stanislaw Gruszka <sgruszka@redhat.com> | ||||
| X-Patchwork-Id: 10431861 | ||||
| Message-Id: <1527506706-6488-1-git-send-email-sgruszka@redhat.com> | ||||
| To: linux-wireless@vger.kernel.org | ||||
| Date: Mon, 28 May 2018 13:25:06 +0200 | ||||
| 
 | ||||
| This reverts commit fb47ada8dc3c30c8e7b415da155742b49536c61e. | ||||
| 
 | ||||
| In some situations when we set TXOP_BACKOFF, the probe frame is | ||||
| not sent at all. What it worse then sending probe frame as part | ||||
| of AMPDU and can degrade 11n performance to 11g rates. | ||||
| 
 | ||||
| Cc: stable@vger.kernel.org | ||||
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> | ||||
| ---
 | ||||
|  drivers/net/wireless/ralink/rt2x00/rt2x00queue.c | 7 +++---- | ||||
|  1 file changed, 3 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
 | ||||
| +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00queue.c
 | ||||
| @@ -372,16 +372,15 @@ static void rt2x00queue_create_tx_descri
 | ||||
|   | ||||
|  	/* | ||||
|  	 * Determine IFS values | ||||
| -	 * - Use TXOP_BACKOFF for probe and management frames except beacons
 | ||||
| +	 * - Use TXOP_BACKOFF for management frames except beacons
 | ||||
|  	 * - Use TXOP_SIFS for fragment bursts | ||||
|  	 * - Use TXOP_HTTXOP for everything else | ||||
|  	 * | ||||
|  	 * Note: rt2800 devices won't use CTS protection (if used) | ||||
|  	 * for frames not transmitted with TXOP_HTTXOP | ||||
|  	 */ | ||||
| -	if ((ieee80211_is_mgmt(hdr->frame_control) &&
 | ||||
| -	     !ieee80211_is_beacon(hdr->frame_control)) ||
 | ||||
| -	    (tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE))
 | ||||
| +	if (ieee80211_is_mgmt(hdr->frame_control) &&
 | ||||
| +	    !ieee80211_is_beacon(hdr->frame_control))
 | ||||
|  		txdesc->u.ht.txop = TXOP_BACKOFF; | ||||
|  	else if (!(tx_info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)) | ||||
|  		txdesc->u.ht.txop = TXOP_SIFS; | ||||
| @ -1,237 +0,0 @@ | ||||
| From: Thomas Hebb <tommyhebb@gmail.com> | ||||
| Subject: [PATCH] ath10k: search all IEs for variant before falling back | ||||
| Date: Wed, 21 Feb 2018 11:43:39 -0500 | ||||
| 
 | ||||
| commit f2593cb1b291 ("ath10k: Search SMBIOS for OEM board file | ||||
| extension") added a feature to ath10k that allows Board Data File | ||||
| (BDF) conflicts between multiple devices that use the same device IDs | ||||
| but have different calibration requirements to be resolved by allowing | ||||
| a "variant" string to be stored in SMBIOS [and later device tree, added | ||||
| by commit d06f26c5c8a4 ("ath10k: search DT for qcom,ath10k-calibration- | ||||
| variant")] that gets appended to the ID stored in board-2.bin. | ||||
| 
 | ||||
| This original patch had a regression, however. Namely that devices with | ||||
| a variant present in SMBIOS that didn't need custom BDFs could no longer | ||||
| find the default BDF, which has no variant appended. The patch was | ||||
| reverted and re-applied with a fix for this issue in commit 1657b8f84ed9 | ||||
| ("search SMBIOS for OEM board file extension"). | ||||
| 
 | ||||
| But the fix to fall back to a default BDF introduced another issue: the | ||||
| driver currently parses IEs in board-2.bin one by one, and for each one | ||||
| it first checks to see if it matches the ID with the variant appended. | ||||
| If it doesn't, it checks to see if it matches the "fallback" ID with no | ||||
| variant. If a matching BDF is found at any point during this search, the | ||||
| search is terminated and that BDF is used. The issue is that it's very | ||||
| possible (and is currently the case for board-2.bin files present in the | ||||
| ath10k-firmware repository) for the default BDF to occur in an earlier | ||||
| IE than the variant-specific BDF. In this case, the current code will | ||||
| happily choose the default BDF even though a better-matching BDF is | ||||
| present later in the file. | ||||
| 
 | ||||
| This patch fixes the issue by first searching the entire file for the ID | ||||
| with variant, and searching for the fallback ID only if that search | ||||
| fails. It also includes some code cleanup in the area, as | ||||
| ath10k_core_fetch_board_data_api_n() no longer does its own string | ||||
| mangling to remove the variant from an ID, instead leaving that job to a | ||||
| new flag passed to ath10k_core_create_board_name(). | ||||
| 
 | ||||
| I've tested this patch on a QCA4019 and verified that the driver behaves | ||||
| correctly for 1) both fallback and variant BDFs present, 2) only fallback | ||||
| BDF present, and 3) no matching BDFs present. | ||||
| 
 | ||||
| Fixes: 1657b8f84ed9 ("ath10k: search SMBIOS for OEM board file extension") | ||||
| Signed-off-by: Thomas Hebb <tommyhebb@gmail.com> | ||||
| ---
 | ||||
|  drivers/net/wireless/ath/ath10k/core.c | 134 ++++++++++++++++++--------------- | ||||
|  1 file changed, 72 insertions(+), 62 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath10k/core.c
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/core.c
 | ||||
| @@ -1132,14 +1132,61 @@ out:
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| +static int ath10k_core_search_bd(struct ath10k *ar,
 | ||||
| +				 const char *boardname,
 | ||||
| +				 const u8 *data,
 | ||||
| +				 size_t len)
 | ||||
| +{
 | ||||
| +	size_t ie_len;
 | ||||
| +	struct ath10k_fw_ie *hdr;
 | ||||
| +	int ret = -ENOENT, ie_id;
 | ||||
| +
 | ||||
| +	while (len > sizeof(struct ath10k_fw_ie)) {
 | ||||
| +		hdr = (struct ath10k_fw_ie *)data;
 | ||||
| +		ie_id = le32_to_cpu(hdr->id);
 | ||||
| +		ie_len = le32_to_cpu(hdr->len);
 | ||||
| +
 | ||||
| +		len -= sizeof(*hdr);
 | ||||
| +		data = hdr->data;
 | ||||
| +
 | ||||
| +		if (len < ALIGN(ie_len, 4)) {
 | ||||
| +			ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
 | ||||
| +				   ie_id, ie_len, len);
 | ||||
| +			return -EINVAL;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		switch (ie_id) {
 | ||||
| +		case ATH10K_BD_IE_BOARD:
 | ||||
| +			ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
 | ||||
| +							    boardname);
 | ||||
| +			if (ret == -ENOENT)
 | ||||
| +				/* no match found, continue */
 | ||||
| +				break;
 | ||||
| +
 | ||||
| +			/* either found or error, so stop searching */
 | ||||
| +			goto out;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		/* jump over the padding */
 | ||||
| +		ie_len = ALIGN(ie_len, 4);
 | ||||
| +
 | ||||
| +		len -= ie_len;
 | ||||
| +		data += ie_len;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +out:
 | ||||
| +	/* return result of parse_bd_ie_board() or -ENOENT */
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar, | ||||
|  					      const char *boardname, | ||||
| +					      const char *fallback_boardname,
 | ||||
|  					      const char *filename) | ||||
|  { | ||||
| -	size_t len, magic_len, ie_len;
 | ||||
| -	struct ath10k_fw_ie *hdr;
 | ||||
| +	size_t len, magic_len;
 | ||||
|  	const u8 *data; | ||||
| -	int ret, ie_id;
 | ||||
| +	int ret;
 | ||||
|   | ||||
|  	ar->normal_mode_fw.board = ath10k_fetch_fw_file(ar, | ||||
|  							ar->hw_params.fw.dir, | ||||
| @@ -1177,69 +1224,23 @@ static int ath10k_core_fetch_board_data_
 | ||||
|  	data += magic_len; | ||||
|  	len -= magic_len; | ||||
|   | ||||
| -	while (len > sizeof(struct ath10k_fw_ie)) {
 | ||||
| -		hdr = (struct ath10k_fw_ie *)data;
 | ||||
| -		ie_id = le32_to_cpu(hdr->id);
 | ||||
| -		ie_len = le32_to_cpu(hdr->len);
 | ||||
| -
 | ||||
| -		len -= sizeof(*hdr);
 | ||||
| -		data = hdr->data;
 | ||||
| -
 | ||||
| -		if (len < ALIGN(ie_len, 4)) {
 | ||||
| -			ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
 | ||||
| -				   ie_id, ie_len, len);
 | ||||
| -			ret = -EINVAL;
 | ||||
| -			goto err;
 | ||||
| -		}
 | ||||
| +	/* attempt to find boardname in the IE list */
 | ||||
| +	ret = ath10k_core_search_bd(ar, boardname, data, len);
 | ||||
|   | ||||
| -		switch (ie_id) {
 | ||||
| -		case ATH10K_BD_IE_BOARD:
 | ||||
| -			ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
 | ||||
| -							    boardname);
 | ||||
| -			if (ret == -ENOENT && ar->id.bdf_ext[0] != '\0') {
 | ||||
| -				/* try default bdf if variant was not found */
 | ||||
| -				char *s, *v = ",variant=";
 | ||||
| -				char boardname2[100];
 | ||||
| -
 | ||||
| -				strlcpy(boardname2, boardname,
 | ||||
| -					sizeof(boardname2));
 | ||||
| -
 | ||||
| -				s = strstr(boardname2, v);
 | ||||
| -				if (s)
 | ||||
| -					*s = '\0';  /* strip ",variant=%s" */
 | ||||
| -
 | ||||
| -				ret = ath10k_core_parse_bd_ie_board(ar, data,
 | ||||
| -								    ie_len,
 | ||||
| -								    boardname2);
 | ||||
| -			}
 | ||||
| +	/* if we didn't find it and have a fallback name, try that */
 | ||||
| +	if (ret == -ENOENT && fallback_boardname)
 | ||||
| +		ret = ath10k_core_search_bd(ar, fallback_boardname, data, len);
 | ||||
|   | ||||
| -			if (ret == -ENOENT)
 | ||||
| -				/* no match found, continue */
 | ||||
| -				break;
 | ||||
| -			else if (ret)
 | ||||
| -				/* there was an error, bail out */
 | ||||
| -				goto err;
 | ||||
| -
 | ||||
| -			/* board data found */
 | ||||
| -			goto out;
 | ||||
| -		}
 | ||||
| -
 | ||||
| -		/* jump over the padding */
 | ||||
| -		ie_len = ALIGN(ie_len, 4);
 | ||||
| -
 | ||||
| -		len -= ie_len;
 | ||||
| -		data += ie_len;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -out:
 | ||||
| -	if (!ar->normal_mode_fw.board_data || !ar->normal_mode_fw.board_len) {
 | ||||
| +	if (ret == -ENOENT) {
 | ||||
|  		ath10k_err(ar, | ||||
|  			   "failed to fetch board data for %s from %s/%s\n", | ||||
|  			   boardname, ar->hw_params.fw.dir, filename); | ||||
|  		ret = -ENODATA; | ||||
| -		goto err;
 | ||||
|  	} | ||||
|   | ||||
| +	if (ret)
 | ||||
| +		goto err;
 | ||||
| +
 | ||||
|  	return 0; | ||||
|   | ||||
|  err: | ||||
| @@ -1248,12 +1249,12 @@ err:
 | ||||
|  } | ||||
|   | ||||
|  static int ath10k_core_create_board_name(struct ath10k *ar, char *name, | ||||
| -					 size_t name_len)
 | ||||
| +					 size_t name_len, bool with_variant)
 | ||||
|  { | ||||
|  	/* strlen(',variant=') + strlen(ar->id.bdf_ext) */ | ||||
|  	char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 }; | ||||
|   | ||||
| -	if (ar->id.bdf_ext[0] != '\0')
 | ||||
| +	if (with_variant && ar->id.bdf_ext[0] != '\0')
 | ||||
|  		scnprintf(variant, sizeof(variant), ",variant=%s", | ||||
|  			  ar->id.bdf_ext); | ||||
|   | ||||
| @@ -1279,17 +1280,26 @@ out:
 | ||||
|   | ||||
|  static int ath10k_core_fetch_board_file(struct ath10k *ar) | ||||
|  { | ||||
| -	char boardname[100];
 | ||||
| +	char boardname[100], fallback_boardname[100];
 | ||||
|  	int ret; | ||||
|   | ||||
| -	ret = ath10k_core_create_board_name(ar, boardname, sizeof(boardname));
 | ||||
| +	ret = ath10k_core_create_board_name(ar, boardname,
 | ||||
| +					    sizeof(boardname), true);
 | ||||
|  	if (ret) { | ||||
|  		ath10k_err(ar, "failed to create board name: %d", ret); | ||||
|  		return ret; | ||||
|  	} | ||||
|   | ||||
| +	ret = ath10k_core_create_board_name(ar, fallback_boardname,
 | ||||
| +					    sizeof(boardname), false);
 | ||||
| +	if (ret) {
 | ||||
| +		ath10k_err(ar, "failed to create fallback board name: %d", ret);
 | ||||
| +		return ret;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	ar->bd_api = 2; | ||||
|  	ret = ath10k_core_fetch_board_data_api_n(ar, boardname, | ||||
| +						 fallback_boardname,
 | ||||
|  						 ATH10K_BOARD_API2_FILE); | ||||
|  	if (!ret) | ||||
|  		goto success; | ||||
| @ -1,72 +0,0 @@ | ||||
| From: Brian Norris <briannorris@chromium.org> | ||||
| Date: Thu, 19 Oct 2017 11:45:19 -0700 | ||||
| Subject: [PATCH] ath10k: fix build errors with !CONFIG_PM | ||||
| 
 | ||||
| Build errors have been reported with CONFIG_PM=n: | ||||
| 
 | ||||
| drivers/net/wireless/ath/ath10k/pci.c:3416:8: error: implicit | ||||
| declaration of function 'ath10k_pci_suspend' | ||||
| [-Werror=implicit-function-declaration] | ||||
| 
 | ||||
| drivers/net/wireless/ath/ath10k/pci.c:3428:8: error: implicit | ||||
| declaration of function 'ath10k_pci_resume' | ||||
| [-Werror=implicit-function-declaration] | ||||
| 
 | ||||
| These are caused by the combination of the following two commits: | ||||
| 
 | ||||
| 6af1de2e4ec4 ("ath10k: mark PM functions as __maybe_unused") | ||||
| 96378bd2c6cd ("ath10k: fix core PCI suspend when WoWLAN is supported but | ||||
| disabled") | ||||
| 
 | ||||
| Both build fine on their own. | ||||
| 
 | ||||
| But now that ath10k_pci_pm_{suspend,resume}() is compiled | ||||
| unconditionally, we should also compile ath10k_pci_{suspend,resume}() | ||||
| unconditionally. | ||||
| 
 | ||||
| And drop the #ifdef around ath10k_pci_hif_{suspend,resume}() too; they | ||||
| are trivial (empty), so we're not saving much space by compiling them | ||||
| out. And the alternatives would be to sprinkle more __maybe_unused, or | ||||
| spread the #ifdef's further. | ||||
| 
 | ||||
| Build tested with the following combinations: | ||||
| CONFIG_PM=y && CONFIG_PM_SLEEP=y | ||||
| CONFIG_PM=y && CONFIG_PM_SLEEP=n | ||||
| CONFIG_PM=n | ||||
| 
 | ||||
| Fixes: 96378bd2c6cd ("ath10k: fix core PCI suspend when WoWLAN is supported but disabled") | ||||
| Fixes: 096ad2a15fd8 ("Merge branch 'ath-next'") | ||||
| Signed-off-by: Brian Norris <briannorris@chromium.org> | ||||
| Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath10k/pci.c
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/pci.c
 | ||||
| @@ -2577,8 +2577,6 @@ void ath10k_pci_hif_power_down(struct at
 | ||||
|  	 */ | ||||
|  } | ||||
|   | ||||
| -#ifdef CONFIG_PM
 | ||||
| -
 | ||||
|  static int ath10k_pci_hif_suspend(struct ath10k *ar) | ||||
|  { | ||||
|  	/* Nothing to do; the important stuff is in the driver suspend. */ | ||||
| @@ -2627,7 +2625,6 @@ static int ath10k_pci_resume(struct ath1
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| -#endif
 | ||||
|   | ||||
|  static bool ath10k_pci_validate_cal(void *data, size_t size) | ||||
|  { | ||||
| @@ -2782,10 +2779,8 @@ static const struct ath10k_hif_ops ath10
 | ||||
|  	.power_down		= ath10k_pci_hif_power_down, | ||||
|  	.read32			= ath10k_pci_read32, | ||||
|  	.write32		= ath10k_pci_write32, | ||||
| -#ifdef CONFIG_PM
 | ||||
|  	.suspend		= ath10k_pci_hif_suspend, | ||||
|  	.resume			= ath10k_pci_hif_resume, | ||||
| -#endif
 | ||||
|  	.fetch_cal_eeprom	= ath10k_pci_hif_fetch_cal_eeprom, | ||||
|  }; | ||||
|   | ||||
| @ -1,37 +0,0 @@ | ||||
| From: Johannes Berg <johannes.berg@intel.com> | ||||
| Date: Mon, 20 Nov 2017 17:01:44 +0100 | ||||
| Subject: [PATCH] mac80211: properly free requested-but-not-started TX agg | ||||
|  sessions | ||||
| 
 | ||||
| When deleting a station or otherwise tearing down all aggregation | ||||
| sessions, make sure to delete requested but not yet started ones, | ||||
| to avoid the following scenario: | ||||
| 
 | ||||
|  * session is requested, added to tid_start_tx[] | ||||
|  * ieee80211_ba_session_work() runs, gets past BLOCK_BA check | ||||
|  * ieee80211_sta_tear_down_BA_sessions() runs, locks &sta->ampdu_mlme.mtx, | ||||
|    e.g. while deleting the station - deleting all active sessions | ||||
|  * ieee80211_ba_session_work() continues since tear down flushes it, and | ||||
|    calls ieee80211_tx_ba_session_handle_start() for the new session, arms | ||||
|    the timer for it | ||||
|  * station deletion continues to __cleanup_single_sta() and frees the | ||||
|    session struct, while the timer is armed | ||||
| 
 | ||||
| Reported-by: Fengguang Wu <fengguang.wu@intel.com> | ||||
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/agg-tx.c
 | ||||
| +++ b/net/mac80211/agg-tx.c
 | ||||
| @@ -330,6 +330,11 @@ int ___ieee80211_stop_tx_ba_session(stru
 | ||||
|   | ||||
|  	spin_lock_bh(&sta->lock); | ||||
|   | ||||
| +	/* free struct pending for start, if present */
 | ||||
| +	tid_tx = sta->ampdu_mlme.tid_start_tx[tid];
 | ||||
| +	kfree(tid_tx);
 | ||||
| +	sta->ampdu_mlme.tid_start_tx[tid] = NULL;
 | ||||
| +
 | ||||
|  	tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | ||||
|  	if (!tid_tx) { | ||||
|  		spin_unlock_bh(&sta->lock); | ||||
| @ -1,25 +0,0 @@ | ||||
| From: Johannes Berg <johannes.berg@intel.com> | ||||
| Date: Thu, 4 Jan 2018 15:51:53 +0100 | ||||
| Subject: [PATCH] mac80211: mesh: drop frames appearing to be from us | ||||
| 
 | ||||
| If there are multiple mesh stations with the same MAC address, | ||||
| they will both get confused and start throwing warnings. | ||||
| 
 | ||||
| Obviously in this case nothing can actually work anyway, so just | ||||
| drop frames that look like they're from ourselves early on. | ||||
| 
 | ||||
| Reported-by: Gui Iribarren <gui@altermundi.net> | ||||
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -3632,6 +3632,8 @@ static bool ieee80211_accept_frame(struc
 | ||||
|  		} | ||||
|  		return true; | ||||
|  	case NL80211_IFTYPE_MESH_POINT: | ||||
| +		if (ether_addr_equal(sdata->vif.addr, hdr->addr2))
 | ||||
| +			return false;
 | ||||
|  		if (multicast) | ||||
|  			return true; | ||||
|  		return ether_addr_equal(sdata->vif.addr, hdr->addr1); | ||||
| @ -1,60 +0,0 @@ | ||||
| From 2fd3877b5bb7d39782c3205a1dcda02023b8514a Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:31 +0100 | ||||
| Subject: [PATCH] brcmfmac: handle FWHALT mailbox indication | ||||
| 
 | ||||
| The firmware uses a mailbox to communicate to the host what is going | ||||
| on. In the driver we validate the bit received. Various people seen | ||||
| the following message: | ||||
| 
 | ||||
|  brcmfmac: brcmf_sdio_hostmail: Unknown mailbox data content: 0x40012 | ||||
| 
 | ||||
| Bit 4 is cause of this message, but this actually indicates the firmware | ||||
| has halted. Handle this bit by giving a more meaningful error message. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 14 ++++++++++---- | ||||
|  1 file changed, 10 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -260,10 +260,11 @@ struct rte_console {
 | ||||
|  #define I_HMB_HOST_INT	I_HMB_SW3	/* Miscellaneous Interrupt */ | ||||
|   | ||||
|  /* tohostmailboxdata */ | ||||
| -#define HMB_DATA_NAKHANDLED	1	/* retransmit NAK'd frame */
 | ||||
| -#define HMB_DATA_DEVREADY	2	/* talk to host after enable */
 | ||||
| -#define HMB_DATA_FC		4	/* per prio flowcontrol update flag */
 | ||||
| -#define HMB_DATA_FWREADY	8	/* fw ready for protocol activity */
 | ||||
| +#define HMB_DATA_NAKHANDLED	0x0001	/* retransmit NAK'd frame */
 | ||||
| +#define HMB_DATA_DEVREADY	0x0002	/* talk to host after enable */
 | ||||
| +#define HMB_DATA_FC		0x0004	/* per prio flowcontrol update flag */
 | ||||
| +#define HMB_DATA_FWREADY	0x0008	/* fw ready for protocol activity */
 | ||||
| +#define HMB_DATA_FWHALT		0x0010	/* firmware halted */
 | ||||
|   | ||||
|  #define HMB_DATA_FCDATA_MASK	0xff000000 | ||||
|  #define HMB_DATA_FCDATA_SHIFT	24 | ||||
| @@ -1094,6 +1095,10 @@ static u32 brcmf_sdio_hostmail(struct br
 | ||||
|  			  offsetof(struct sdpcmd_regs, tosbmailbox)); | ||||
|  	bus->sdcnt.f1regdata += 2; | ||||
|   | ||||
| +	/* dongle indicates the firmware has halted/crashed */
 | ||||
| +	if (hmb_data & HMB_DATA_FWHALT)
 | ||||
| +		brcmf_err("mailbox indicates firmware halted\n");
 | ||||
| +
 | ||||
|  	/* Dongle recomposed rx frames, accept them again */ | ||||
|  	if (hmb_data & HMB_DATA_NAKHANDLED) { | ||||
|  		brcmf_dbg(SDIO, "Dongle reports NAK handled, expect rtx of %d\n", | ||||
| @@ -1151,6 +1156,7 @@ static u32 brcmf_sdio_hostmail(struct br
 | ||||
|  			 HMB_DATA_NAKHANDLED | | ||||
|  			 HMB_DATA_FC | | ||||
|  			 HMB_DATA_FWREADY | | ||||
| +			 HMB_DATA_FWHALT |
 | ||||
|  			 HMB_DATA_FCDATA_MASK | HMB_DATA_VERSION_MASK)) | ||||
|  		brcmf_err("Unknown mailbox data content: 0x%02x\n", | ||||
|  			  hmb_data); | ||||
| @ -1,133 +0,0 @@ | ||||
| From 6c219b0088158da839a5be63c5b3d96c145501d2 Mon Sep 17 00:00:00 2001 | ||||
| From: Franky Lin <franky.lin@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:32 +0100 | ||||
| Subject: [PATCH] brcmfmac: disable packet filtering in promiscuous mode | ||||
| 
 | ||||
| Disable arp and nd offload to allow all packets sending to host. | ||||
| 
 | ||||
| Reported-by: Phil Elwell <phil@raspberrypi.org> | ||||
| Tested-by: Phil Elwell <phil@raspberrypi.org> | ||||
| Reviewed-by: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 41 ---------------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 38 ++++++++++++++++++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  1 + | ||||
|  3 files changed, 39 insertions(+), 41 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -472,47 +472,6 @@ send_key_to_dongle(struct brcmf_if *ifp,
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -static s32
 | ||||
| -brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
 | ||||
| -{
 | ||||
| -	s32 err;
 | ||||
| -	u32 mode;
 | ||||
| -
 | ||||
| -	if (enable)
 | ||||
| -		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
 | ||||
| -	else
 | ||||
| -		mode = 0;
 | ||||
| -
 | ||||
| -	/* Try to set and enable ARP offload feature, this may fail, then it  */
 | ||||
| -	/* is simply not supported and err 0 will be returned                 */
 | ||||
| -	err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
 | ||||
| -	if (err) {
 | ||||
| -		brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
 | ||||
| -			  mode, err);
 | ||||
| -		err = 0;
 | ||||
| -	} else {
 | ||||
| -		err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
 | ||||
| -		if (err) {
 | ||||
| -			brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
 | ||||
| -				  enable, err);
 | ||||
| -			err = 0;
 | ||||
| -		} else
 | ||||
| -			brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
 | ||||
| -				  enable, mode);
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
 | ||||
| -	if (err) {
 | ||||
| -		brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
 | ||||
| -			  enable, err);
 | ||||
| -		err = 0;
 | ||||
| -	} else
 | ||||
| -		brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
 | ||||
| -			  enable, mode);
 | ||||
| -
 | ||||
| -	return err;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static void | ||||
|  brcmf_cfg80211_update_proto_addr_mode(struct wireless_dev *wdev) | ||||
|  { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -71,6 +71,43 @@ struct brcmf_if *brcmf_get_ifp(struct br
 | ||||
|  	return ifp; | ||||
|  } | ||||
|   | ||||
| +void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable)
 | ||||
| +{
 | ||||
| +	s32 err;
 | ||||
| +	u32 mode;
 | ||||
| +
 | ||||
| +	if (enable)
 | ||||
| +		mode = BRCMF_ARP_OL_AGENT | BRCMF_ARP_OL_PEER_AUTO_REPLY;
 | ||||
| +	else
 | ||||
| +		mode = 0;
 | ||||
| +
 | ||||
| +	/* Try to set and enable ARP offload feature, this may fail, then it  */
 | ||||
| +	/* is simply not supported and err 0 will be returned                 */
 | ||||
| +	err = brcmf_fil_iovar_int_set(ifp, "arp_ol", mode);
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_dbg(TRACE, "failed to set ARP offload mode to 0x%x, err = %d\n",
 | ||||
| +			  mode, err);
 | ||||
| +	} else {
 | ||||
| +		err = brcmf_fil_iovar_int_set(ifp, "arpoe", enable);
 | ||||
| +		if (err) {
 | ||||
| +			brcmf_dbg(TRACE, "failed to configure (%d) ARP offload err = %d\n",
 | ||||
| +				  enable, err);
 | ||||
| +		} else {
 | ||||
| +			brcmf_dbg(TRACE, "successfully configured (%d) ARP offload to 0x%x\n",
 | ||||
| +				  enable, mode);
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	err = brcmf_fil_iovar_int_set(ifp, "ndoe", enable);
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_dbg(TRACE, "failed to configure (%d) ND offload err = %d\n",
 | ||||
| +			  enable, err);
 | ||||
| +	} else {
 | ||||
| +		brcmf_dbg(TRACE, "successfully configured (%d) ND offload to 0x%x\n",
 | ||||
| +			  enable, mode);
 | ||||
| +	}
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void _brcmf_set_multicast_list(struct work_struct *work) | ||||
|  { | ||||
|  	struct brcmf_if *ifp; | ||||
| @@ -134,6 +171,7 @@ static void _brcmf_set_multicast_list(st
 | ||||
|  	if (err < 0) | ||||
|  		brcmf_err("Setting BRCMF_C_SET_PROMISC failed, %d\n", | ||||
|  			  err); | ||||
| +	brcmf_configure_arp_nd_offload(ifp, !cmd_value);
 | ||||
|  } | ||||
|   | ||||
|  #if IS_ENABLED(CONFIG_IPV6) | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| @@ -203,6 +203,7 @@ int brcmf_netdev_wait_pend8021x(struct b
 | ||||
|  /* Return pointer to interface name */ | ||||
|  char *brcmf_ifname(struct brcmf_if *ifp); | ||||
|  struct brcmf_if *brcmf_get_ifp(struct brcmf_pub *drvr, int ifidx); | ||||
| +void brcmf_configure_arp_nd_offload(struct brcmf_if *ifp, bool enable);
 | ||||
|  int brcmf_net_attach(struct brcmf_if *ifp, bool rtnl_locked); | ||||
|  struct brcmf_if *brcmf_add_if(struct brcmf_pub *drvr, s32 bsscfgidx, s32 ifidx, | ||||
|  			      bool is_p2pdev, const char *name, u8 *mac_addr); | ||||
| @ -1,133 +0,0 @@ | ||||
| From 8c6efda22f5f9f73fc948f517424466be01ae84d Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:33 +0100 | ||||
| Subject: [PATCH] brcmfmac: cleanup brcmf_cfg80211_escan() function | ||||
| 
 | ||||
| The function brcmf_cfg80211_escan() was always called with a non-null | ||||
| request parameter and null pointer for this_ssid parameter. Clean up | ||||
| the function removing the dead code path. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 76 ++++------------------ | ||||
|  1 file changed, 11 insertions(+), 65 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -1072,18 +1072,10 @@ brcmf_do_escan(struct brcmf_if *ifp, str
 | ||||
|   | ||||
|  static s32 | ||||
|  brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif, | ||||
| -		     struct cfg80211_scan_request *request,
 | ||||
| -		     struct cfg80211_ssid *this_ssid)
 | ||||
| +		     struct cfg80211_scan_request *request)
 | ||||
|  { | ||||
| -	struct brcmf_if *ifp = vif->ifp;
 | ||||
|  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||||
| -	struct cfg80211_ssid *ssids;
 | ||||
| -	u32 passive_scan;
 | ||||
| -	bool escan_req;
 | ||||
| -	bool spec_scan;
 | ||||
|  	s32 err; | ||||
| -	struct brcmf_ssid_le ssid_le;
 | ||||
| -	u32 SSID_len;
 | ||||
|   | ||||
|  	brcmf_dbg(SCAN, "START ESCAN\n"); | ||||
|   | ||||
| @@ -1101,8 +1093,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
 | ||||
|  			  cfg->scan_status); | ||||
|  		return -EAGAIN; | ||||
|  	} | ||||
| -	if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) {
 | ||||
| -		brcmf_err("Connecting: status (%lu)\n", ifp->vif->sme_state);
 | ||||
| +	if (test_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state)) {
 | ||||
| +		brcmf_err("Connecting: status (%lu)\n", vif->sme_state);
 | ||||
|  		return -EAGAIN; | ||||
|  	} | ||||
|   | ||||
| @@ -1110,63 +1102,17 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
 | ||||
|  	if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) | ||||
|  		vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; | ||||
|   | ||||
| -	escan_req = false;
 | ||||
| -	if (request) {
 | ||||
| -		/* scan bss */
 | ||||
| -		ssids = request->ssids;
 | ||||
| -		escan_req = true;
 | ||||
| -	} else {
 | ||||
| -		/* scan in ibss */
 | ||||
| -		/* we don't do escan in ibss */
 | ||||
| -		ssids = this_ssid;
 | ||||
| -	}
 | ||||
| -
 | ||||
|  	cfg->scan_request = request; | ||||
|  	set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||
| -	if (escan_req) {
 | ||||
| -		cfg->escan_info.run = brcmf_run_escan;
 | ||||
| -		err = brcmf_p2p_scan_prep(wiphy, request, vif);
 | ||||
| -		if (err)
 | ||||
| -			goto scan_out;
 | ||||
| -
 | ||||
| -		err = brcmf_do_escan(vif->ifp, request);
 | ||||
| -		if (err)
 | ||||
| -			goto scan_out;
 | ||||
| -	} else {
 | ||||
| -		brcmf_dbg(SCAN, "ssid \"%s\", ssid_len (%d)\n",
 | ||||
| -			  ssids->ssid, ssids->ssid_len);
 | ||||
| -		memset(&ssid_le, 0, sizeof(ssid_le));
 | ||||
| -		SSID_len = min_t(u8, sizeof(ssid_le.SSID), ssids->ssid_len);
 | ||||
| -		ssid_le.SSID_len = cpu_to_le32(0);
 | ||||
| -		spec_scan = false;
 | ||||
| -		if (SSID_len) {
 | ||||
| -			memcpy(ssid_le.SSID, ssids->ssid, SSID_len);
 | ||||
| -			ssid_le.SSID_len = cpu_to_le32(SSID_len);
 | ||||
| -			spec_scan = true;
 | ||||
| -		} else
 | ||||
| -			brcmf_dbg(SCAN, "Broadcast scan\n");
 | ||||
| -
 | ||||
| -		passive_scan = cfg->active_scan ? 0 : 1;
 | ||||
| -		err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
 | ||||
| -					    passive_scan);
 | ||||
| -		if (err) {
 | ||||
| -			brcmf_err("WLC_SET_PASSIVE_SCAN error (%d)\n", err);
 | ||||
| -			goto scan_out;
 | ||||
| -		}
 | ||||
| -		brcmf_scan_config_mpc(ifp, 0);
 | ||||
| -		err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCAN, &ssid_le,
 | ||||
| -					     sizeof(ssid_le));
 | ||||
| -		if (err) {
 | ||||
| -			if (err == -EBUSY)
 | ||||
| -				brcmf_dbg(INFO, "BUSY: scan for \"%s\" canceled\n",
 | ||||
| -					  ssid_le.SSID);
 | ||||
| -			else
 | ||||
| -				brcmf_err("WLC_SCAN error (%d)\n", err);
 | ||||
| -
 | ||||
| -			brcmf_scan_config_mpc(ifp, 1);
 | ||||
| -			goto scan_out;
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| +
 | ||||
| +	cfg->escan_info.run = brcmf_run_escan;
 | ||||
| +	err = brcmf_p2p_scan_prep(wiphy, request, vif);
 | ||||
| +	if (err)
 | ||||
| +		goto scan_out;
 | ||||
| +
 | ||||
| +	err = brcmf_do_escan(vif->ifp, request);
 | ||||
| +	if (err)
 | ||||
| +		goto scan_out;
 | ||||
|   | ||||
|  	/* Arm scan timeout timer */ | ||||
|  	mod_timer(&cfg->escan_timeout, jiffies + | ||||
| @@ -1191,7 +1137,7 @@ brcmf_cfg80211_scan(struct wiphy *wiphy,
 | ||||
|  	if (!check_vif_up(vif)) | ||||
|  		return -EIO; | ||||
|   | ||||
| -	err = brcmf_cfg80211_escan(wiphy, vif, request, NULL);
 | ||||
| +	err = brcmf_cfg80211_escan(wiphy, vif, request);
 | ||||
|   | ||||
|  	if (err) | ||||
|  		brcmf_err("scan error (%d)\n", err); | ||||
| @ -1,31 +0,0 @@ | ||||
| From df2d8388bc96c0f29d27d121f2a4cd054f8b3900 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:34 +0100 | ||||
| Subject: [PATCH] brcmfmac: use msecs_to_jiffies() instead of calculation using | ||||
|  HZ | ||||
| 
 | ||||
| Minor cleanup using provided macro to convert milliseconds interval | ||||
| to jiffies in brcmf_cfg80211_escan(). | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -1115,8 +1115,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
 | ||||
|  		goto scan_out; | ||||
|   | ||||
|  	/* Arm scan timeout timer */ | ||||
| -	mod_timer(&cfg->escan_timeout, jiffies +
 | ||||
| -			BRCMF_ESCAN_TIMER_INTERVAL_MS * HZ / 1000);
 | ||||
| +	mod_timer(&cfg->escan_timeout,
 | ||||
| +		  jiffies + msecs_to_jiffies(BRCMF_ESCAN_TIMER_INTERVAL_MS));
 | ||||
|   | ||||
|  	return 0; | ||||
|   | ||||
| @ -1,83 +0,0 @@ | ||||
| From 588378f15cff285ac81c929239ccba01d7f71d50 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:35 +0100 | ||||
| Subject: [PATCH] brcmfmac: get rid of brcmf_cfg80211_escan() function | ||||
| 
 | ||||
| The function brcmf_cfg80211_escan() is only called by brcmf_cfg80211_scan() | ||||
| so there is no reason to split in two function especially since the latter | ||||
| does not do an awful lot. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 34 +++++++--------------- | ||||
|  1 file changed, 10 insertions(+), 24 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -1071,13 +1071,16 @@ brcmf_do_escan(struct brcmf_if *ifp, str
 | ||||
|  } | ||||
|   | ||||
|  static s32 | ||||
| -brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
 | ||||
| -		     struct cfg80211_scan_request *request)
 | ||||
| +brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
 | ||||
|  { | ||||
|  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||||
| -	s32 err;
 | ||||
| +	struct brcmf_cfg80211_vif *vif;
 | ||||
| +	s32 err = 0;
 | ||||
|   | ||||
| -	brcmf_dbg(SCAN, "START ESCAN\n");
 | ||||
| +	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +	vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
 | ||||
| +	if (!check_vif_up(vif))
 | ||||
| +		return -EIO;
 | ||||
|   | ||||
|  	if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) { | ||||
|  		brcmf_err("Scanning already: status (%lu)\n", cfg->scan_status); | ||||
| @@ -1102,6 +1105,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
 | ||||
|  	if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) | ||||
|  		vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; | ||||
|   | ||||
| +	brcmf_dbg(SCAN, "START ESCAN\n");
 | ||||
| +
 | ||||
|  	cfg->scan_request = request; | ||||
|  	set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||
|   | ||||
| @@ -1121,31 +1126,12 @@ brcmf_cfg80211_escan(struct wiphy *wiphy
 | ||||
|  	return 0; | ||||
|   | ||||
|  scan_out: | ||||
| +	brcmf_err("scan error (%d)\n", err);
 | ||||
|  	clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); | ||||
|  	cfg->scan_request = NULL; | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -static s32
 | ||||
| -brcmf_cfg80211_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
 | ||||
| -{
 | ||||
| -	struct brcmf_cfg80211_vif *vif;
 | ||||
| -	s32 err = 0;
 | ||||
| -
 | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| -	vif = container_of(request->wdev, struct brcmf_cfg80211_vif, wdev);
 | ||||
| -	if (!check_vif_up(vif))
 | ||||
| -		return -EIO;
 | ||||
| -
 | ||||
| -	err = brcmf_cfg80211_escan(wiphy, vif, request);
 | ||||
| -
 | ||||
| -	if (err)
 | ||||
| -		brcmf_err("scan error (%d)\n", err);
 | ||||
| -
 | ||||
| -	brcmf_dbg(TRACE, "Exit\n");
 | ||||
| -	return err;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static s32 brcmf_set_rts(struct net_device *ndev, u32 rts_threshold) | ||||
|  { | ||||
|  	s32 err = 0; | ||||
| @ -1,86 +0,0 @@ | ||||
| From bbf35414cd23a9d7230bfd7046e1e2c26020e7eb Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:36 +0100 | ||||
| Subject: [PATCH] brcmfmac: get rid of struct brcmf_cfg80211_info::active_scan | ||||
|  field | ||||
| 
 | ||||
| The field struct brcmf_cfg80211_info::active_scan is set to true upon | ||||
| initializing the driver instance, but it is never changed so simply | ||||
| get rid of it. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 10 +--------- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h |  2 -- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c      |  5 +---- | ||||
|  3 files changed, 2 insertions(+), 15 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -1043,7 +1043,6 @@ brcmf_do_escan(struct brcmf_if *ifp, str
 | ||||
|  { | ||||
|  	struct brcmf_cfg80211_info *cfg = ifp->drvr->config; | ||||
|  	s32 err; | ||||
| -	u32 passive_scan;
 | ||||
|  	struct brcmf_scan_results *results; | ||||
|  	struct escan_info *escan = &cfg->escan_info; | ||||
|   | ||||
| @@ -1051,13 +1050,7 @@ brcmf_do_escan(struct brcmf_if *ifp, str
 | ||||
|  	escan->ifp = ifp; | ||||
|  	escan->wiphy = cfg->wiphy; | ||||
|  	escan->escan_state = WL_ESCAN_STATE_SCANNING; | ||||
| -	passive_scan = cfg->active_scan ? 0 : 1;
 | ||||
| -	err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PASSIVE_SCAN,
 | ||||
| -				    passive_scan);
 | ||||
| -	if (err) {
 | ||||
| -		brcmf_err("error (%d)\n", err);
 | ||||
| -		return err;
 | ||||
| -	}
 | ||||
| +
 | ||||
|  	brcmf_scan_config_mpc(ifp, 0); | ||||
|  	results = (struct brcmf_scan_results *)cfg->escan_info.escan_buf; | ||||
|  	results->version = 0; | ||||
| @@ -5767,7 +5760,6 @@ static s32 wl_init_priv(struct brcmf_cfg
 | ||||
|   | ||||
|  	cfg->scan_request = NULL; | ||||
|  	cfg->pwr_save = true; | ||||
| -	cfg->active_scan = true;	/* we do active scan per default */
 | ||||
|  	cfg->dongle_up = false;		/* dongle is not up yet */ | ||||
|  	err = brcmf_init_priv_mem(cfg); | ||||
|  	if (err) | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
 | ||||
| @@ -283,7 +283,6 @@ struct brcmf_cfg80211_wowl {
 | ||||
|   * @scan_status: scan activity on the dongle. | ||||
|   * @pub: common driver information. | ||||
|   * @channel: current channel. | ||||
| - * @active_scan: current scan mode.
 | ||||
|   * @int_escan_map: bucket map for which internal e-scan is done. | ||||
|   * @ibss_starter: indicates this sta is ibss starter. | ||||
|   * @pwr_save: indicate whether dongle to support power save mode. | ||||
| @@ -316,7 +315,6 @@ struct brcmf_cfg80211_info {
 | ||||
|  	unsigned long scan_status; | ||||
|  	struct brcmf_pub *pub; | ||||
|  	u32 channel; | ||||
| -	bool active_scan;
 | ||||
|  	u32 int_escan_map; | ||||
|  	bool ibss_starter; | ||||
|  	bool pwr_save; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| @@ -692,10 +692,7 @@ static s32 brcmf_p2p_escan(struct brcmf_
 | ||||
|   | ||||
|  	/* determine the scan engine parameters */ | ||||
|  	sparams->bss_type = DOT11_BSSTYPE_ANY; | ||||
| -	if (p2p->cfg->active_scan)
 | ||||
| -		sparams->scan_type = 0;
 | ||||
| -	else
 | ||||
| -		sparams->scan_type = 1;
 | ||||
| +	sparams->scan_type = BRCMF_SCANTYPE_ACTIVE;
 | ||||
|   | ||||
|  	eth_broadcast_addr(sparams->bssid); | ||||
|  	sparams->home_time = cpu_to_le32(P2PAPI_SCAN_HOME_TIME_MS); | ||||
| @ -1,55 +0,0 @@ | ||||
| From bd99a3013bdc00f8fc7534c657b39616792b4467 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 8 Nov 2017 14:36:37 +0100 | ||||
| Subject: [PATCH] brcmfmac: move configuration of probe request IEs | ||||
| 
 | ||||
| The configuration of the IEs for probe requests was done in a P2P | ||||
| related function, which is not very obvious. Moving it to | ||||
| .scan callback function, ie. brcmf_cfg80211_scan(). | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 5 +++++ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c      | 6 ++---- | ||||
|  2 files changed, 7 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -1108,6 +1108,11 @@ brcmf_cfg80211_scan(struct wiphy *wiphy,
 | ||||
|  	if (err) | ||||
|  		goto scan_out; | ||||
|   | ||||
| +	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
 | ||||
| +				    request->ie, request->ie_len);
 | ||||
| +	if (err)
 | ||||
| +		goto scan_out;
 | ||||
| +
 | ||||
|  	err = brcmf_do_escan(vif->ifp, request); | ||||
|  	if (err) | ||||
|  		goto scan_out; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| @@ -881,7 +881,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wi
 | ||||
|  { | ||||
|  	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); | ||||
|  	struct brcmf_p2p_info *p2p = &cfg->p2p; | ||||
| -	int err = 0;
 | ||||
| +	int err;
 | ||||
|   | ||||
|  	if (brcmf_p2p_scan_is_p2p_request(request)) { | ||||
|  		/* find my listen channel */ | ||||
| @@ -904,9 +904,7 @@ int brcmf_p2p_scan_prep(struct wiphy *wi
 | ||||
|  		/* override .run_escan() callback. */ | ||||
|  		cfg->escan_info.run = brcmf_p2p_run_escan; | ||||
|  	} | ||||
| -	err = brcmf_vif_set_mgmt_ie(vif, BRCMF_VNDR_IE_PRBREQ_FLAG,
 | ||||
| -				    request->ie, request->ie_len);
 | ||||
| -	return err;
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| @ -1,434 +0,0 @@ | ||||
| From fdd0bd88ceaecf729db103ac8836af5805dd2dc1 Mon Sep 17 00:00:00 2001 | ||||
| From: Chung-Hsien Hsu <stanley.hsu@cypress.com> | ||||
| Date: Fri, 10 Nov 2017 17:27:15 +0800 | ||||
| Subject: [PATCH] brcmfmac: add CLM download support | ||||
| 
 | ||||
| The firmware for brcmfmac devices includes information regarding | ||||
| regulatory constraints. For certain devices this information is kept | ||||
| separately in a binary form that needs to be downloaded to the device. | ||||
| This patch adds support to download this so-called CLM blob file. It | ||||
| uses the same naming scheme as the other firmware files with extension | ||||
| of .clm_blob. | ||||
| 
 | ||||
| The CLM blob file is optional. If the file does not exist, the download | ||||
| process will be bypassed. It will not affect the driver loading. | ||||
| 
 | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Chung-Hsien Hsu <stanley.hsu@cypress.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  10 ++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  | 157 +++++++++++++++++++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    |   2 + | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.h    |   2 + | ||||
|  .../broadcom/brcm80211/brcmfmac/fwil_types.h       |  31 ++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    |  19 +++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |  19 +++ | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c |  18 +++ | ||||
|  8 files changed, 258 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| @@ -71,6 +71,7 @@ struct brcmf_bus_dcmd {
 | ||||
|   * @wowl_config: specify if dongle is configured for wowl when going to suspend | ||||
|   * @get_ramsize: obtain size of device memory. | ||||
|   * @get_memdump: obtain device memory dump in provided buffer. | ||||
| + * @get_fwname: obtain firmware name.
 | ||||
|   * | ||||
|   * This structure provides an abstract interface towards the | ||||
|   * bus specific driver. For control messages to common driver | ||||
| @@ -87,6 +88,8 @@ struct brcmf_bus_ops {
 | ||||
|  	void (*wowl_config)(struct device *dev, bool enabled); | ||||
|  	size_t (*get_ramsize)(struct device *dev); | ||||
|  	int (*get_memdump)(struct device *dev, void *data, size_t len); | ||||
| +	int (*get_fwname)(struct device *dev, uint chip, uint chiprev,
 | ||||
| +			  unsigned char *fw_name);
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| @@ -224,6 +227,13 @@ int brcmf_bus_get_memdump(struct brcmf_b
 | ||||
|  	return bus->ops->get_memdump(bus->dev, data, len); | ||||
|  } | ||||
|   | ||||
| +static inline
 | ||||
| +int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev,
 | ||||
| +			 unsigned char *fw_name)
 | ||||
| +{
 | ||||
| +	return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name);
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * interface functions from common layer | ||||
|   */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -18,6 +18,7 @@
 | ||||
|  #include <linux/string.h> | ||||
|  #include <linux/netdevice.h> | ||||
|  #include <linux/module.h> | ||||
| +#include <linux/firmware.h>
 | ||||
|  #include <brcmu_wifi.h> | ||||
|  #include <brcmu_utils.h> | ||||
|  #include "core.h" | ||||
| @@ -28,6 +29,7 @@
 | ||||
|  #include "tracepoint.h" | ||||
|  #include "common.h" | ||||
|  #include "of.h" | ||||
| +#include "firmware.h"
 | ||||
|   | ||||
|  MODULE_AUTHOR("Broadcom Corporation"); | ||||
|  MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); | ||||
| @@ -104,12 +106,140 @@ void brcmf_c_set_joinpref_default(struct
 | ||||
|  		brcmf_err("Set join_pref error (%d)\n", err); | ||||
|  } | ||||
|   | ||||
| +static int brcmf_c_download(struct brcmf_if *ifp, u16 flag,
 | ||||
| +			    struct brcmf_dload_data_le *dload_buf,
 | ||||
| +			    u32 len)
 | ||||
| +{
 | ||||
| +	s32 err;
 | ||||
| +
 | ||||
| +	flag |= (DLOAD_HANDLER_VER << DLOAD_FLAG_VER_SHIFT);
 | ||||
| +	dload_buf->flag = cpu_to_le16(flag);
 | ||||
| +	dload_buf->dload_type = cpu_to_le16(DL_TYPE_CLM);
 | ||||
| +	dload_buf->len = cpu_to_le32(len);
 | ||||
| +	dload_buf->crc = cpu_to_le32(0);
 | ||||
| +	len = sizeof(*dload_buf) + len - 1;
 | ||||
| +
 | ||||
| +	err = brcmf_fil_iovar_data_set(ifp, "clmload", dload_buf, len);
 | ||||
| +
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name)
 | ||||
| +{
 | ||||
| +	struct brcmf_bus *bus = ifp->drvr->bus_if;
 | ||||
| +	struct brcmf_rev_info *ri = &ifp->drvr->revinfo;
 | ||||
| +	u8 fw_name[BRCMF_FW_NAME_LEN];
 | ||||
| +	u8 *ptr;
 | ||||
| +	size_t len;
 | ||||
| +	s32 err;
 | ||||
| +
 | ||||
| +	memset(fw_name, 0, BRCMF_FW_NAME_LEN);
 | ||||
| +	err = brcmf_bus_get_fwname(bus, ri->chipnum, ri->chiprev, fw_name);
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_err("get firmware name failed (%d)\n", err);
 | ||||
| +		goto done;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/* generate CLM blob file name */
 | ||||
| +	ptr = strrchr(fw_name, '.');
 | ||||
| +	if (!ptr) {
 | ||||
| +		err = -ENOENT;
 | ||||
| +		goto done;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	len = ptr - fw_name + 1;
 | ||||
| +	if (len + strlen(".clm_blob") > BRCMF_FW_NAME_LEN) {
 | ||||
| +		err = -E2BIG;
 | ||||
| +	} else {
 | ||||
| +		strlcpy(clm_name, fw_name, len);
 | ||||
| +		strlcat(clm_name, ".clm_blob", BRCMF_FW_NAME_LEN);
 | ||||
| +	}
 | ||||
| +done:
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int brcmf_c_process_clm_blob(struct brcmf_if *ifp)
 | ||||
| +{
 | ||||
| +	struct device *dev = ifp->drvr->bus_if->dev;
 | ||||
| +	struct brcmf_dload_data_le *chunk_buf;
 | ||||
| +	const struct firmware *clm = NULL;
 | ||||
| +	u8 clm_name[BRCMF_FW_NAME_LEN];
 | ||||
| +	u32 chunk_len;
 | ||||
| +	u32 datalen;
 | ||||
| +	u32 cumulative_len;
 | ||||
| +	u16 dl_flag = DL_BEGIN;
 | ||||
| +	u32 status;
 | ||||
| +	s32 err;
 | ||||
| +
 | ||||
| +	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +
 | ||||
| +	memset(clm_name, 0, BRCMF_FW_NAME_LEN);
 | ||||
| +	err = brcmf_c_get_clm_name(ifp, clm_name);
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_err("get CLM blob file name failed (%d)\n", err);
 | ||||
| +		return err;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	err = request_firmware(&clm, clm_name, dev);
 | ||||
| +	if (err) {
 | ||||
| +		if (err == -ENOENT) {
 | ||||
| +			brcmf_dbg(INFO, "continue with CLM data currently present in firmware\n");
 | ||||
| +			return 0;
 | ||||
| +		}
 | ||||
| +		brcmf_err("request CLM blob file failed (%d)\n", err);
 | ||||
| +		return err;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL);
 | ||||
| +	if (!chunk_buf) {
 | ||||
| +		err = -ENOMEM;
 | ||||
| +		goto done;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	datalen = clm->size;
 | ||||
| +	cumulative_len = 0;
 | ||||
| +	do {
 | ||||
| +		if (datalen > MAX_CHUNK_LEN) {
 | ||||
| +			chunk_len = MAX_CHUNK_LEN;
 | ||||
| +		} else {
 | ||||
| +			chunk_len = datalen;
 | ||||
| +			dl_flag |= DL_END;
 | ||||
| +		}
 | ||||
| +		memcpy(chunk_buf->data, clm->data + cumulative_len, chunk_len);
 | ||||
| +
 | ||||
| +		err = brcmf_c_download(ifp, dl_flag, chunk_buf, chunk_len);
 | ||||
| +
 | ||||
| +		dl_flag &= ~DL_BEGIN;
 | ||||
| +
 | ||||
| +		cumulative_len += chunk_len;
 | ||||
| +		datalen -= chunk_len;
 | ||||
| +	} while ((datalen > 0) && (err == 0));
 | ||||
| +
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_err("clmload (%zu byte file) failed (%d); ",
 | ||||
| +			  clm->size, err);
 | ||||
| +		/* Retrieve clmload_status and print */
 | ||||
| +		err = brcmf_fil_iovar_int_get(ifp, "clmload_status", &status);
 | ||||
| +		if (err)
 | ||||
| +			brcmf_err("get clmload_status failed (%d)\n", err);
 | ||||
| +		else
 | ||||
| +			brcmf_dbg(INFO, "clmload_status=%d\n", status);
 | ||||
| +		err = -EIO;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	kfree(chunk_buf);
 | ||||
| +done:
 | ||||
| +	release_firmware(clm);
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +
 | ||||
|  int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) | ||||
|  { | ||||
|  	s8 eventmask[BRCMF_EVENTING_MASK_LEN]; | ||||
|  	u8 buf[BRCMF_DCMD_SMLEN]; | ||||
|  	struct brcmf_rev_info_le revinfo; | ||||
|  	struct brcmf_rev_info *ri; | ||||
| +	char *clmver;
 | ||||
|  	char *ptr; | ||||
|  	s32 err; | ||||
|   | ||||
| @@ -148,6 +278,13 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  	} | ||||
|  	ri->result = err; | ||||
|   | ||||
| +	/* Do any CLM downloading */
 | ||||
| +	err = brcmf_c_process_clm_blob(ifp);
 | ||||
| +	if (err < 0) {
 | ||||
| +		brcmf_err("download CLM blob file failed, %d\n", err);
 | ||||
| +		goto done;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	/* query for 'ver' to get version info from firmware */ | ||||
|  	memset(buf, 0, sizeof(buf)); | ||||
|  	strcpy(buf, "ver"); | ||||
| @@ -167,6 +304,26 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  	ptr = strrchr(buf, ' ') + 1; | ||||
|  	strlcpy(ifp->drvr->fwver, ptr, sizeof(ifp->drvr->fwver)); | ||||
|   | ||||
| +	/* Query for 'clmver' to get CLM version info from firmware */
 | ||||
| +	memset(buf, 0, sizeof(buf));
 | ||||
| +	err = brcmf_fil_iovar_data_get(ifp, "clmver", buf, sizeof(buf));
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_dbg(TRACE, "retrieving clmver failed, %d\n", err);
 | ||||
| +	} else {
 | ||||
| +		clmver = (char *)buf;
 | ||||
| +		/* store CLM version for adding it to revinfo debugfs file */
 | ||||
| +		memcpy(ifp->drvr->clmver, clmver, sizeof(ifp->drvr->clmver));
 | ||||
| +
 | ||||
| +		/* Replace all newline/linefeed characters with space
 | ||||
| +		 * character
 | ||||
| +		 */
 | ||||
| +		ptr = clmver;
 | ||||
| +		while ((ptr = strnchr(ptr, '\n', sizeof(buf))) != NULL)
 | ||||
| +			*ptr = ' ';
 | ||||
| +
 | ||||
| +		brcmf_dbg(INFO, "CLM version = %s\n", clmver);
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	/* set mpc */ | ||||
|  	err = brcmf_fil_iovar_int_set(ifp, "mpc", 1); | ||||
|  	if (err) { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1009,6 +1009,8 @@ static int brcmf_revinfo_read(struct seq
 | ||||
|  	seq_printf(s, "anarev: %u\n", ri->anarev); | ||||
|  	seq_printf(s, "nvramrev: %08x\n", ri->nvramrev); | ||||
|   | ||||
| +	seq_printf(s, "clmver: %s\n", bus_if->drvr->clmver);
 | ||||
| +
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| @@ -141,6 +141,8 @@ struct brcmf_pub {
 | ||||
|  	struct notifier_block inetaddr_notifier; | ||||
|  	struct notifier_block inet6addr_notifier; | ||||
|  	struct brcmf_mp_device *settings; | ||||
| +
 | ||||
| +	u8 clmver[BRCMF_DCMD_SMLEN];
 | ||||
|  }; | ||||
|   | ||||
|  /* forward declarations */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil_types.h
 | ||||
| @@ -155,6 +155,21 @@
 | ||||
|  #define BRCMF_MFP_CAPABLE		1 | ||||
|  #define BRCMF_MFP_REQUIRED		2 | ||||
|   | ||||
| +/* MAX_CHUNK_LEN is the maximum length for data passing to firmware in each
 | ||||
| + * ioctl. It is relatively small because firmware has small maximum size input
 | ||||
| + * playload restriction for ioctls.
 | ||||
| + */
 | ||||
| +#define MAX_CHUNK_LEN			1400
 | ||||
| +
 | ||||
| +#define DLOAD_HANDLER_VER		1	/* Downloader version */
 | ||||
| +#define DLOAD_FLAG_VER_MASK		0xf000	/* Downloader version mask */
 | ||||
| +#define DLOAD_FLAG_VER_SHIFT		12	/* Downloader version shift */
 | ||||
| +
 | ||||
| +#define DL_BEGIN			0x0002
 | ||||
| +#define DL_END				0x0004
 | ||||
| +
 | ||||
| +#define DL_TYPE_CLM			2
 | ||||
| +
 | ||||
|  /* join preference types for join_pref iovar */ | ||||
|  enum brcmf_join_pref_types { | ||||
|  	BRCMF_JOIN_PREF_RSSI = 1, | ||||
| @@ -827,6 +842,22 @@ struct brcmf_pno_macaddr_le {
 | ||||
|  }; | ||||
|   | ||||
|  /** | ||||
| + * struct brcmf_dload_data_le - data passing to firmware for downloading
 | ||||
| + * @flag: flags related to download data.
 | ||||
| + * @dload_type: type of download data.
 | ||||
| + * @len: length in bytes of download data.
 | ||||
| + * @crc: crc of download data.
 | ||||
| + * @data: download data.
 | ||||
| + */
 | ||||
| +struct brcmf_dload_data_le {
 | ||||
| +	__le16 flag;
 | ||||
| +	__le16 dload_type;
 | ||||
| +	__le32 len;
 | ||||
| +	__le32 crc;
 | ||||
| +	u8 data[1];
 | ||||
| +};
 | ||||
| +
 | ||||
| +/**
 | ||||
|   * struct brcmf_pno_bssid_le - bssid configuration for PNO scan. | ||||
|   * | ||||
|   * @bssid: BSS network identifier. | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1350,6 +1350,24 @@ static int brcmf_pcie_get_memdump(struct
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int brcmf_pcie_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| +				 u8 *fw_name)
 | ||||
| +{
 | ||||
| +	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
 | ||||
| +	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
 | ||||
| +	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
 | ||||
| +	int ret = 0;
 | ||||
| +
 | ||||
| +	if (devinfo->fw_name[0] != '\0')
 | ||||
| +		strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| +	else
 | ||||
| +		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| +						brcmf_pcie_fwnames,
 | ||||
| +						ARRAY_SIZE(brcmf_pcie_fwnames),
 | ||||
| +						fw_name, NULL);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
|   | ||||
|  static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { | ||||
|  	.txdata = brcmf_pcie_tx, | ||||
| @@ -1359,6 +1377,7 @@ static const struct brcmf_bus_ops brcmf_
 | ||||
|  	.wowl_config = brcmf_pcie_wowl_config, | ||||
|  	.get_ramsize = brcmf_pcie_get_ramsize, | ||||
|  	.get_memdump = brcmf_pcie_get_memdump, | ||||
| +	.get_fwname = brcmf_pcie_get_fwname,
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3985,6 +3985,24 @@ brcmf_sdio_watchdog(unsigned long data)
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| +static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| +				 u8 *fw_name)
 | ||||
| +{
 | ||||
| +	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
 | ||||
| +	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
 | ||||
| +	int ret = 0;
 | ||||
| +
 | ||||
| +	if (sdiodev->fw_name[0] != '\0')
 | ||||
| +		strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| +	else
 | ||||
| +		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| +						brcmf_sdio_fwnames,
 | ||||
| +						ARRAY_SIZE(brcmf_sdio_fwnames),
 | ||||
| +						fw_name, NULL);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { | ||||
|  	.stop = brcmf_sdio_bus_stop, | ||||
|  	.preinit = brcmf_sdio_bus_preinit, | ||||
| @@ -3995,6 +4013,7 @@ static const struct brcmf_bus_ops brcmf_
 | ||||
|  	.wowl_config = brcmf_sdio_wowl_config, | ||||
|  	.get_ramsize = brcmf_sdio_bus_get_ramsize, | ||||
|  	.get_memdump = brcmf_sdio_bus_get_memdump, | ||||
| +	.get_fwname = brcmf_sdio_get_fwname,
 | ||||
|  }; | ||||
|   | ||||
|  static void brcmf_sdio_firmware_callback(struct device *dev, int err, | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1128,12 +1128,30 @@ static void brcmf_usb_wowl_config(struct
 | ||||
|  		device_set_wakeup_enable(devinfo->dev, false); | ||||
|  } | ||||
|   | ||||
| +static int brcmf_usb_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| +				u8 *fw_name)
 | ||||
| +{
 | ||||
| +	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
 | ||||
| +	int ret = 0;
 | ||||
| +
 | ||||
| +	if (devinfo->fw_name[0] != '\0')
 | ||||
| +		strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| +	else
 | ||||
| +		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| +						brcmf_usb_fwnames,
 | ||||
| +						ARRAY_SIZE(brcmf_usb_fwnames),
 | ||||
| +						fw_name, NULL);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static const struct brcmf_bus_ops brcmf_usb_bus_ops = { | ||||
|  	.txdata = brcmf_usb_tx, | ||||
|  	.stop = brcmf_usb_down, | ||||
|  	.txctl = brcmf_usb_tx_ctlpkt, | ||||
|  	.rxctl = brcmf_usb_rx_ctlpkt, | ||||
|  	.wowl_config = brcmf_usb_wowl_config, | ||||
| +	.get_fwname = brcmf_usb_get_fwname,
 | ||||
|  }; | ||||
|   | ||||
|  static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo) | ||||
| @ -1,37 +0,0 @@ | ||||
| From 5c3de777bdaf48bd0cfb43097c0d0fb85056cab7 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Sat, 25 Nov 2017 21:39:25 +0100 | ||||
| Subject: [PATCH] brcmfmac: change driver unbind order of the sdio function | ||||
|  devices | ||||
| 
 | ||||
| In the function brcmf_sdio_firmware_callback() the driver is | ||||
| unbound from the sdio function devices in the error path. | ||||
| However, the order in which it is done resulted in a use-after-free | ||||
| issue (see brcmf_ops_sdio_remove() in bcmsdh.c). Hence change | ||||
| the order and first unbind sdio function #2 device and then | ||||
| unbind sdio function #1 device. | ||||
| 
 | ||||
| Cc: stable@vger.kernel.org # v4.12.x | ||||
| Fixes: 7a51461fc2da ("brcmfmac: unbind all devices upon failure in firmware callback") | ||||
| Reported-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4121,8 +4121,8 @@ release:
 | ||||
|  	sdio_release_host(sdiodev->func[1]); | ||||
|  fail: | ||||
|  	brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err); | ||||
| -	device_release_driver(dev);
 | ||||
|  	device_release_driver(&sdiodev->func[2]->dev); | ||||
| +	device_release_driver(dev);
 | ||||
|  } | ||||
|   | ||||
|  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) | ||||
| @ -1,33 +0,0 @@ | ||||
| From 51ef7925e10688c57186d438e784532e063492e4 Mon Sep 17 00:00:00 2001 | ||||
| From: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | ||||
| Date: Thu, 23 Nov 2017 17:57:04 +0200 | ||||
| Subject: [PATCH] brcmfmac: Avoid build error with make W=1 | ||||
| 
 | ||||
| When I run make W=1 on gcc (Debian 7.2.0-16) 7.2.0 I got an error for | ||||
| the first run, all next ones are okay. | ||||
| 
 | ||||
|   CC [M]  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.o | ||||
| drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c:2078: error: Cannot parse struct or union! | ||||
| scripts/Makefile.build:310: recipe for target 'drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.o' failed | ||||
| 
 | ||||
| Seems like something happened with W=1 and wrong kernel doc format. | ||||
| As a quick fix remove dubious /** in the code. | ||||
| 
 | ||||
| Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -2070,7 +2070,7 @@ static int brcmf_sdio_txpkt_hdalign(stru
 | ||||
|  	return head_pad; | ||||
|  } | ||||
|   | ||||
| -/**
 | ||||
| +/*
 | ||||
|   * struct brcmf_skbuff_cb reserves first two bytes in sk_buff::cb for | ||||
|   * bus layer usage. | ||||
|   */ | ||||
| @ -1,40 +0,0 @@ | ||||
| From cc124d5cc8d81985c3511892d7a6d546552ff754 Mon Sep 17 00:00:00 2001 | ||||
| From: Wright Feng <wright.feng@cypress.com> | ||||
| Date: Tue, 16 Jan 2018 17:26:50 +0800 | ||||
| Subject: [PATCH] brcmfmac: fix CLM load error for legacy chips when user | ||||
|  helper is enabled | ||||
| 
 | ||||
| For legacy chips without CLM blob files, kernel with user helper function | ||||
| returns -EAGAIN when we request_firmware(), and then driver got failed | ||||
| when bringing up legacy chips. We expect the CLM blob file for legacy chip | ||||
| is not existence in firmware path, but the -ENOENT error is transferred to | ||||
| -EAGAIN in firmware_class.c with user helper.
 | ||||
| Because of that, we continue with CLM data currently present in firmware | ||||
| if getting error from doing request_firmware(). | ||||
| 
 | ||||
| Cc: stable@vger.kernel.org # v4.15.y | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Wright Feng <wright.feng@cypress.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 9 +++------ | ||||
|  1 file changed, 3 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -182,12 +182,9 @@ static int brcmf_c_process_clm_blob(stru
 | ||||
|   | ||||
|  	err = request_firmware(&clm, clm_name, dev); | ||||
|  	if (err) { | ||||
| -		if (err == -ENOENT) {
 | ||||
| -			brcmf_dbg(INFO, "continue with CLM data currently present in firmware\n");
 | ||||
| -			return 0;
 | ||||
| -		}
 | ||||
| -		brcmf_err("request CLM blob file failed (%d)\n", err);
 | ||||
| -		return err;
 | ||||
| +		brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n",
 | ||||
| +			   err);
 | ||||
| +		return 0;
 | ||||
|  	} | ||||
|   | ||||
|  	chunk_buf = kzalloc(sizeof(*chunk_buf) + MAX_CHUNK_LEN - 1, GFP_KERNEL); | ||||
| @ -1,103 +0,0 @@ | ||||
| From 9df7ddc3ed25b7d3473f117a0680b9418adb5753 Mon Sep 17 00:00:00 2001 | ||||
| Message-Id: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net> | ||||
| From: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| Date: Mon, 27 Nov 2017 18:56:22 +0100 | ||||
| Subject: [PATCH 1/2] ath9k: move spectral scan support under a separate config | ||||
|  symbol | ||||
| 
 | ||||
| At the moment, spectral scan support, and with it RELAY, is always enabled | ||||
| with ATH9K[_HTC]_DEBUGFS. Spectral scan support is currently the only user | ||||
| of RELAY in ath9k, and it unconditionally reserves a relay channel. | ||||
| 
 | ||||
| Having debugfs support in ath9k is often useful even on very small embedded | ||||
| routers, where we'd rather like to avoid the code size and RAM usage of the | ||||
| relay support. | ||||
| 
 | ||||
| Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||
| ---
 | ||||
|  drivers/net/wireless/ath/ath9k/Kconfig           | 14 ++++++++++---- | ||||
|  drivers/net/wireless/ath/ath9k/Makefile          |  4 ++-- | ||||
|  drivers/net/wireless/ath/ath9k/common-spectral.h |  4 ++-- | ||||
|  3 files changed, 14 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath9k/Kconfig
 | ||||
| +++ b/drivers/net/wireless/ath/ath9k/Kconfig
 | ||||
| @@ -64,13 +64,12 @@ config ATH9K_DEBUGFS
 | ||||
|  	depends on ATH9K && DEBUG_FS | ||||
|  	select MAC80211_DEBUGFS | ||||
|  	select ATH9K_COMMON_DEBUG | ||||
| -	depends on RELAY
 | ||||
|  	---help--- | ||||
|  	  Say Y, if you need access to ath9k's statistics for | ||||
|  	  interrupts, rate control, etc. | ||||
|   | ||||
| -	  Also required for changing debug message flags at run time.
 | ||||
| -	  As well as access to the FFT/spectral data and TX99.
 | ||||
| +	  Also required for changing debug message flags at run time and for
 | ||||
| +	  TX99.
 | ||||
|   | ||||
|  config ATH9K_STATION_STATISTICS | ||||
|  	bool "Detailed station statistics" | ||||
| @@ -181,7 +180,6 @@ config ATH9K_HTC_DEBUGFS
 | ||||
|  	bool "Atheros ath9k_htc debugging" | ||||
|  	depends on ATH9K_HTC && DEBUG_FS | ||||
|  	select ATH9K_COMMON_DEBUG | ||||
| -	depends on RELAY
 | ||||
|  	---help--- | ||||
|  	  Say Y, if you need access to ath9k_htc's statistics. | ||||
|  	  As well as access to the FFT/spectral data. | ||||
| @@ -197,3 +195,11 @@ config ATH9K_HWRNG
 | ||||
|   | ||||
|  	  Say Y, feeds the entropy directly from the WiFi driver to the input | ||||
|  	  pool. | ||||
| +
 | ||||
| +config ATH9K_COMMON_SPECTRAL
 | ||||
| +	bool "Atheros ath9k/ath9k_htc spectral scan support"
 | ||||
| +	depends on ATH9K_DEBUGFS || ATH9K_HTC_DEBUGFS
 | ||||
| +	depends on RELAY
 | ||||
| +	default n
 | ||||
| +	---help---
 | ||||
| +	  Say Y to enable access to the FFT/spectral data via debugfs.
 | ||||
| --- a/drivers/net/wireless/ath/ath9k/Makefile
 | ||||
| +++ b/drivers/net/wireless/ath/ath9k/Makefile
 | ||||
| @@ -61,8 +61,8 @@ ath9k_common-y:=	common.o \
 | ||||
|  			common-init.o \ | ||||
|  			common-beacon.o \ | ||||
|   | ||||
| -ath9k_common-$(CPTCFG_ATH9K_COMMON_DEBUG) += common-debug.o \
 | ||||
| -					     common-spectral.o
 | ||||
| +ath9k_common-$(CPTCFG_ATH9K_COMMON_DEBUG) += common-debug.o
 | ||||
| +ath9k_common-$(CPTCFG_ATH9K_COMMON_SPECTRAL) += common-spectral.o
 | ||||
|   | ||||
|  ath9k_htc-y +=	htc_hst.o \ | ||||
|  		hif_usb.o \ | ||||
| --- a/drivers/net/wireless/ath/ath9k/common-spectral.h
 | ||||
| +++ b/drivers/net/wireless/ath/ath9k/common-spectral.h
 | ||||
| @@ -151,7 +151,7 @@ static inline u8 spectral_bitmap_weight(
 | ||||
|  	return bins[0] & 0x3f; | ||||
|  } | ||||
|   | ||||
| -#ifdef CPTCFG_ATH9K_COMMON_DEBUG
 | ||||
| +#ifdef CPTCFG_ATH9K_COMMON_SPECTRAL
 | ||||
|  void ath9k_cmn_spectral_init_debug(struct ath_spec_scan_priv *spec_priv, struct dentry *debugfs_phy); | ||||
|  void ath9k_cmn_spectral_deinit_debug(struct ath_spec_scan_priv *spec_priv); | ||||
|   | ||||
| @@ -183,6 +183,6 @@ static inline int ath_cmn_process_fft(st
 | ||||
|  { | ||||
|  	return 0; | ||||
|  } | ||||
| -#endif /* CPTCFG_ATH9K_COMMON_DEBUG */
 | ||||
| +#endif /* CPTCFG_ATH9K_COMMON_SPECTRAL */
 | ||||
|   | ||||
|  #endif /* SPECTRAL_H */ | ||||
| --- a/local-symbols
 | ||||
| +++ b/local-symbols
 | ||||
| @@ -116,6 +116,7 @@ ATH9K_PCOEM=
 | ||||
|  ATH9K_HTC= | ||||
|  ATH9K_HTC_DEBUGFS= | ||||
|  ATH9K_HWRNG= | ||||
| +ATH9K_COMMON_SPECTRAL=
 | ||||
|  CARL9170= | ||||
|  CARL9170_LEDS= | ||||
|  CARL9170_DEBUGFS= | ||||
| @ -1,91 +0,0 @@ | ||||
| From 42e01cb9cb109fb0bb4743f6c54d6aa67ac39b61 Mon Sep 17 00:00:00 2001 | ||||
| Message-Id: <42e01cb9cb109fb0bb4743f6c54d6aa67ac39b61.1515610034.git.mschiffer@universe-factory.net> | ||||
| In-Reply-To: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net> | ||||
| References: <9df7ddc3ed25b7d3473f117a0680b9418adb5753.1515610034.git.mschiffer@universe-factory.net> | ||||
| From: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| Date: Mon, 27 Nov 2017 18:56:23 +0100 | ||||
| Subject: [PATCH 2/2] ath10k: move spectral scan support under a separate | ||||
|  config symbol | ||||
| 
 | ||||
| At the moment, spectral scan support, and with it RELAY, is always enabled | ||||
| with ATH10K_DEBUGFS. Spectral scan support is currently the only user of | ||||
| RELAY in ath10k, and it unconditionally reserves a relay channel. | ||||
| 
 | ||||
| Having debugfs support in ath10k is often useful even on very small | ||||
| embedded routers, where we'd rather like to avoid the code size and RAM | ||||
| usage of the relay support. While ath10k-based devices usually have more | ||||
| resources than ath9k-based ones, it makes sense to keep the configuration | ||||
| symmetric to ath9k, so the same base kernel without RELAY can be used for | ||||
| both ath9k and ath10k hardware. | ||||
| 
 | ||||
| Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net> | ||||
| Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com> | ||||
| ---
 | ||||
|  drivers/net/wireless/ath/ath10k/Kconfig    | 9 ++++++++- | ||||
|  drivers/net/wireless/ath/ath10k/Makefile   | 2 +- | ||||
|  drivers/net/wireless/ath/ath10k/spectral.h | 4 ++-- | ||||
|  3 files changed, 11 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath10k/Kconfig
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/Kconfig
 | ||||
| @@ -51,12 +51,19 @@ config ATH10K_DEBUG
 | ||||
|  config ATH10K_DEBUGFS | ||||
|  	bool "Atheros ath10k debugfs support" | ||||
|  	depends on ATH10K && DEBUG_FS | ||||
| -	depends on RELAY
 | ||||
|  	---help--- | ||||
|  	  Enabled debugfs support | ||||
|   | ||||
|  	  If unsure, say Y to make it easier to debug problems. | ||||
|   | ||||
| +config ATH10K_SPECTRAL
 | ||||
| +	bool "Atheros ath10k spectral scan support"
 | ||||
| +	depends on ATH10K_DEBUGFS
 | ||||
| +	depends on RELAY
 | ||||
| +	default n
 | ||||
| +	---help---
 | ||||
| +	  Say Y to enable access to the FFT/spectral data via debugfs.
 | ||||
| +
 | ||||
|  config ATH10K_TRACING | ||||
|  	depends on !KERNEL_3_4 | ||||
|  	bool "Atheros ath10k tracing support" | ||||
| --- a/drivers/net/wireless/ath/ath10k/Makefile
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/Makefile
 | ||||
| @@ -14,7 +14,7 @@ ath10k_core-y += mac.o \
 | ||||
|  		 p2p.o \ | ||||
|  		 swap.o | ||||
|   | ||||
| -ath10k_core-$(CPTCFG_ATH10K_DEBUGFS) += spectral.o
 | ||||
| +ath10k_core-$(CPTCFG_ATH10K_SPECTRAL) += spectral.o
 | ||||
|  ath10k_core-$(CPTCFG_NL80211_TESTMODE) += testmode.o | ||||
|  ath10k_core-$(CPTCFG_ATH10K_TRACING) += trace.o | ||||
|  ath10k_core-$(CPTCFG_ATH10K_THERMAL) += thermal.o | ||||
| --- a/drivers/net/wireless/ath/ath10k/spectral.h
 | ||||
| +++ b/drivers/net/wireless/ath/ath10k/spectral.h
 | ||||
| @@ -44,7 +44,7 @@ enum ath10k_spectral_mode {
 | ||||
|  	SPECTRAL_MANUAL, | ||||
|  }; | ||||
|   | ||||
| -#ifdef CPTCFG_ATH10K_DEBUGFS
 | ||||
| +#ifdef CPTCFG_ATH10K_SPECTRAL
 | ||||
|   | ||||
|  int ath10k_spectral_process_fft(struct ath10k *ar, | ||||
|  				struct wmi_phyerr_ev_arg *phyerr, | ||||
| @@ -85,6 +85,6 @@ static inline void ath10k_spectral_destr
 | ||||
|  { | ||||
|  } | ||||
|   | ||||
| -#endif /* CPTCFG_ATH10K_DEBUGFS */
 | ||||
| +#endif /* CPTCFG_ATH10K_SPECTRAL */
 | ||||
|   | ||||
|  #endif /* SPECTRAL_H */ | ||||
| --- a/local-symbols
 | ||||
| +++ b/local-symbols
 | ||||
| @@ -140,6 +140,7 @@ ATH10K_SDIO=
 | ||||
|  ATH10K_USB= | ||||
|  ATH10K_DEBUG= | ||||
|  ATH10K_DEBUGFS= | ||||
| +ATH10K_SPECTRAL=
 | ||||
|  ATH10K_THERMAL= | ||||
|  ATH10K_TRACING= | ||||
|  ATH10K_DFS_CERTIFIED= | ||||
| @ -1,25 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Wed, 17 Jan 2018 11:11:17 +0100 | ||||
| Subject: [PATCH] ath9k: discard undersized packets | ||||
| 
 | ||||
| Sometimes the hardware will push small packets that trigger a WARN_ON | ||||
| in mac80211. Discard them early to avoid this issue. | ||||
| 
 | ||||
| Reported-by: Stijn Tintel <stijn@linux-ipv6.be> | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/drivers/net/wireless/ath/ath9k/recv.c
 | ||||
| +++ b/drivers/net/wireless/ath/ath9k/recv.c
 | ||||
| @@ -826,9 +826,9 @@ static int ath9k_rx_skb_preprocess(struc
 | ||||
|  	sc->rx.discard_next = false; | ||||
|   | ||||
|  	/* | ||||
| -	 * Discard zero-length packets.
 | ||||
| +	 * Discard zero-length packets and packets smaller than an ACK
 | ||||
|  	 */ | ||||
| -	if (!rx_stats->rs_datalen) {
 | ||||
| +	if (rx_stats->rs_datalen < 10) {
 | ||||
|  		RX_STAT_INC(rx_len_err); | ||||
|  		goto corrupt; | ||||
|  	} | ||||
| @ -1,39 +0,0 @@ | ||||
| From 1fd3ae124d5e675f57cf7e3c601fb8f7712e0329 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:38 +0100 | ||||
| Subject: [PATCH] brcmfmac: Fix parameter order in brcmf_sdiod_f0_writeb() | ||||
| 
 | ||||
| All the other IO functions are the other way round in this | ||||
| driver. Make this one match. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 8 ++++---- | ||||
|  1 file changed, 4 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -230,8 +230,8 @@ void brcmf_sdiod_change_state(struct brc
 | ||||
|  	sdiodev->state = state; | ||||
|  } | ||||
|   | ||||
| -static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func,
 | ||||
| -					uint regaddr, u8 byte)
 | ||||
| +static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, u8 byte,
 | ||||
| +					uint regaddr)
 | ||||
|  { | ||||
|  	int err_ret; | ||||
|   | ||||
| @@ -269,8 +269,8 @@ static int brcmf_sdiod_request_data(stru
 | ||||
|  			if (fn) | ||||
|  				sdio_writeb(func, *(u8 *)data, addr, &ret); | ||||
|  			else | ||||
| -				ret = brcmf_sdiod_f0_writeb(func, addr,
 | ||||
| -							    *(u8 *)data);
 | ||||
| +				ret = brcmf_sdiod_f0_writeb(func, *(u8 *)data,
 | ||||
| +							    addr);
 | ||||
|  		} else { | ||||
|  			if (fn) | ||||
|  				*(u8 *)data = sdio_readb(func, addr, &ret); | ||||
| @ -1,105 +0,0 @@ | ||||
| From 1e6f676f43aa4270ebc5cff8e32a55f72362e042 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:39 +0100 | ||||
| Subject: [PATCH] brcmfmac: Register sizes on hardware are not dependent on | ||||
|  compiler types | ||||
| 
 | ||||
| The 4 IO functions in this patch are incorrect as they use compiler types | ||||
| to determine how many bytes to send to the hardware. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 22 +++++++++++----------- | ||||
|  1 file changed, 11 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -264,7 +264,7 @@ static int brcmf_sdiod_request_data(stru
 | ||||
|  	func = sdiodev->func[fn]; | ||||
|   | ||||
|  	switch (regsz) { | ||||
| -	case sizeof(u8):
 | ||||
| +	case 1:
 | ||||
|  		if (write) { | ||||
|  			if (fn) | ||||
|  				sdio_writeb(func, *(u8 *)data, addr, &ret); | ||||
| @@ -278,13 +278,13 @@ static int brcmf_sdiod_request_data(stru
 | ||||
|  				*(u8 *)data = sdio_f0_readb(func, addr, &ret); | ||||
|  		} | ||||
|  		break; | ||||
| -	case sizeof(u16):
 | ||||
| +	case 2:
 | ||||
|  		if (write) | ||||
|  			sdio_writew(func, *(u16 *)data, addr, &ret); | ||||
|  		else | ||||
|  			*(u16 *)data = sdio_readw(func, addr, &ret); | ||||
|  		break; | ||||
| -	case sizeof(u32):
 | ||||
| +	case 4:
 | ||||
|  		if (write) | ||||
|  			sdio_writel(func, *(u32 *)data, addr, &ret); | ||||
|  		else | ||||
| @@ -368,7 +368,7 @@ brcmf_sdiod_set_sbaddr_window(struct brc
 | ||||
|  	for (i = 0; i < 3; i++) { | ||||
|  		err = brcmf_sdiod_regrw_helper(sdiodev, | ||||
|  					       SBSDIO_FUNC1_SBADDRLOW + i, | ||||
| -					       sizeof(u8), &addr[i], true);
 | ||||
| +					       1, &addr[i], true);
 | ||||
|  		if (err) { | ||||
|  			brcmf_err("failed at addr: 0x%0x\n", | ||||
|  				  SBSDIO_FUNC1_SBADDRLOW + i); | ||||
| @@ -407,7 +407,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
 | ||||
| +	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
 | ||||
|  					  false); | ||||
|  	brcmf_dbg(SDIO, "data:0x%02x\n", data); | ||||
|   | ||||
| @@ -423,10 +423,10 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
 | ||||
| +	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
 | ||||
|  					  false); | ||||
|  	brcmf_dbg(SDIO, "data:0x%08x\n", data); | ||||
|   | ||||
| @@ -443,7 +443,7 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data); | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
 | ||||
| +	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
 | ||||
|  					  true); | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
| @@ -455,10 +455,10 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, sizeof(data), &addr);
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, sizeof(data), &data,
 | ||||
| +	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
 | ||||
|  					  true); | ||||
|   | ||||
|  done: | ||||
| @@ -876,7 +876,7 @@ int brcmf_sdiod_abort(struct brcmf_sdio_
 | ||||
|   | ||||
|  	/* issue abort cmd52 command through F0 */ | ||||
|  	brcmf_sdiod_request_data(sdiodev, SDIO_FUNC_0, SDIO_CCCR_ABORT, | ||||
| -				 sizeof(t_func), &t_func, true);
 | ||||
| +				 1, &t_func, true);
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "Exit\n"); | ||||
|  	return 0; | ||||
| @ -1,179 +0,0 @@ | ||||
| From 0fcc9fe0048422d66bb906eaa73cc75e11ff7345 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:40 +0100 | ||||
| Subject: [PATCH] brcmfmac: Split brcmf_sdiod_regrw_helper() up. | ||||
| 
 | ||||
| This large function is concealing a LOT of obscure logic about | ||||
| how the hardware functions. Time to split it up. | ||||
| 
 | ||||
| This first patch splits the function into two pieces - read and write, | ||||
| doing away with the rw flag in the process. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 94 +++++++++++++++++----- | ||||
|  1 file changed, 73 insertions(+), 21 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -302,8 +302,8 @@ static int brcmf_sdiod_request_data(stru
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| -				   u8 regsz, void *data, bool write)
 | ||||
| +static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| +				 u8 regsz, void *data)
 | ||||
|  { | ||||
|  	u8 func; | ||||
|  	s32 retry = 0; | ||||
| @@ -324,13 +324,66 @@ static int brcmf_sdiod_regrw_helper(stru
 | ||||
|  		func = SDIO_FUNC_1; | ||||
|   | ||||
|  	do { | ||||
| -		if (!write)
 | ||||
| -			memset(data, 0, regsz);
 | ||||
|  		/* for retry wait for 1 ms till bus get settled down */ | ||||
|  		if (retry) | ||||
|  			usleep_range(1000, 2000); | ||||
| +
 | ||||
| +		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
 | ||||
| +					       data, true);
 | ||||
| +
 | ||||
| +	} while (ret != 0 && ret != -ENOMEDIUM &&
 | ||||
| +		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
 | ||||
| +
 | ||||
| +	if (ret == -ENOMEDIUM) {
 | ||||
| +		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | ||||
| +	} else if (ret != 0) {
 | ||||
| +		/*
 | ||||
| +		 * SleepCSR register access can fail when
 | ||||
| +		 * waking up the device so reduce this noise
 | ||||
| +		 * in the logs.
 | ||||
| +		 */
 | ||||
| +		if (addr != SBSDIO_FUNC1_SLEEPCSR)
 | ||||
| +			brcmf_err("failed to write data F%d@0x%05x, err: %d\n",
 | ||||
| +				  func, addr, ret);
 | ||||
| +		else
 | ||||
| +			brcmf_dbg(SDIO, "failed to write data F%d@0x%05x, err: %d\n",
 | ||||
| +				  func, addr, ret);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| +				u8 regsz, void *data)
 | ||||
| +{
 | ||||
| +	u8 func;
 | ||||
| +	s32 retry = 0;
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| +		return -ENOMEDIUM;
 | ||||
| +
 | ||||
| +	/*
 | ||||
| +	 * figure out how to read the register based on address range
 | ||||
| +	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
 | ||||
| +	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
 | ||||
| +	 * The rest: function 1 silicon backplane core registers
 | ||||
| +	 */
 | ||||
| +	if ((addr & ~REG_F0_REG_MASK) == 0)
 | ||||
| +		func = SDIO_FUNC_0;
 | ||||
| +	else
 | ||||
| +		func = SDIO_FUNC_1;
 | ||||
| +
 | ||||
| +	do {
 | ||||
| +		memset(data, 0, regsz);
 | ||||
| +
 | ||||
| +		/* for retry wait for 1 ms till bus get settled down */
 | ||||
| +		if (retry)
 | ||||
| +			usleep_range(1000, 2000);
 | ||||
| +
 | ||||
|  		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz, | ||||
| -					       data, write);
 | ||||
| +					       data, false);
 | ||||
| +
 | ||||
|  	} while (ret != 0 && ret != -ENOMEDIUM && | ||||
|  		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); | ||||
|   | ||||
| @@ -343,12 +396,13 @@ static int brcmf_sdiod_regrw_helper(stru
 | ||||
|  		 * in the logs. | ||||
|  		 */ | ||||
|  		if (addr != SBSDIO_FUNC1_SLEEPCSR) | ||||
| -			brcmf_err("failed to %s data F%d@0x%05x, err: %d\n",
 | ||||
| -				  write ? "write" : "read", func, addr, ret);
 | ||||
| +			brcmf_err("failed to read data F%d@0x%05x, err: %d\n",
 | ||||
| +				  func, addr, ret);
 | ||||
|  		else | ||||
| -			brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
 | ||||
| -				  write ? "write" : "read", func, addr, ret);
 | ||||
| +			brcmf_dbg(SDIO, "failed to read data F%d@0x%05x, err: %d\n",
 | ||||
| +				  func, addr, ret);
 | ||||
|  	} | ||||
| +
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| @@ -366,13 +420,11 @@ brcmf_sdiod_set_sbaddr_window(struct brc
 | ||||
|  	addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK; | ||||
|   | ||||
|  	for (i = 0; i < 3; i++) { | ||||
| -		err = brcmf_sdiod_regrw_helper(sdiodev,
 | ||||
| -					       SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| -					       1, &addr[i], true);
 | ||||
| +		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, addr[i],
 | ||||
| +				  &err);
 | ||||
|  		if (err) { | ||||
|  			brcmf_err("failed at addr: 0x%0x\n", | ||||
|  				  SBSDIO_FUNC1_SBADDRLOW + i); | ||||
| -			break;
 | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| @@ -407,8 +459,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
 | ||||
| -					  false);
 | ||||
| +	retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
 | ||||
|  	brcmf_dbg(SDIO, "data:0x%02x\n", data); | ||||
|   | ||||
|  	if (ret) | ||||
| @@ -426,8 +477,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr); | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
 | ||||
| -					  false);
 | ||||
| +
 | ||||
| +	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
 | ||||
| +
 | ||||
|  	brcmf_dbg(SDIO, "data:0x%08x\n", data); | ||||
|   | ||||
|  done: | ||||
| @@ -443,8 +495,8 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data); | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 1, &data,
 | ||||
| -					  true);
 | ||||
| +	retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data);
 | ||||
| +
 | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
|  } | ||||
| @@ -458,8 +510,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr); | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
| -	retval = brcmf_sdiod_regrw_helper(sdiodev, addr, 4, &data,
 | ||||
| -					  true);
 | ||||
| +
 | ||||
| +	retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
 | ||||
|   | ||||
|  done: | ||||
|  	if (ret) | ||||
| @ -1,62 +0,0 @@ | ||||
| From b9b0d290bc0c90a5a262bc89c9d995988ea98669 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:41 +0100 | ||||
| Subject: [PATCH] brcmfmac: Clean up brcmf_sdiod_set_sbaddr_window() | ||||
| 
 | ||||
| This function sets the address of the IO window used for | ||||
| SDIO accesses onto the backplane of the chip. | ||||
| 
 | ||||
| It currently uses 3 separate masks despite the full mask being | ||||
| defined in the code already. Remove the separate masks and clean up. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c   | 17 +++++------------ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h |  3 --- | ||||
|  2 files changed, 5 insertions(+), 15 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -410,23 +410,16 @@ static int
 | ||||
|  brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address) | ||||
|  { | ||||
|  	int err = 0, i; | ||||
| -	u8 addr[3];
 | ||||
| +	u32 addr;
 | ||||
|   | ||||
|  	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM) | ||||
|  		return -ENOMEDIUM; | ||||
|   | ||||
| -	addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
 | ||||
| -	addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK;
 | ||||
| -	addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
 | ||||
| +	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
 | ||||
|   | ||||
| -	for (i = 0; i < 3; i++) {
 | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, addr[i],
 | ||||
| -				  &err);
 | ||||
| -		if (err) {
 | ||||
| -			brcmf_err("failed at addr: 0x%0x\n",
 | ||||
| -				  SBSDIO_FUNC1_SBADDRLOW + i);
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| +	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
 | ||||
| +		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| +				  addr & 0xff, &err);
 | ||||
|   | ||||
|  	return err; | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -133,9 +133,6 @@
 | ||||
|   | ||||
|  /* valid bits in SBSDIO_FUNC1_SBADDRxxx regs */ | ||||
|   | ||||
| -#define SBSDIO_SBADDRLOW_MASK		0x80	/* Valid bits in SBADDRLOW */
 | ||||
| -#define SBSDIO_SBADDRMID_MASK		0xff	/* Valid bits in SBADDRMID */
 | ||||
| -#define SBSDIO_SBADDRHIGH_MASK		0xffU	/* Valid bits in SBADDRHIGH */
 | ||||
|  /* Address bits from SBADDR regs */ | ||||
|  #define SBSDIO_SBWINDOW_MASK		0xffff8000 | ||||
|   | ||||
| @ -1,91 +0,0 @@ | ||||
| From ea243e9077b3545f20d93884e91c50ac0719685a Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:42 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove dead IO code | ||||
| 
 | ||||
| The value passed to brcmf_sdiod_addrprep() is *always* 4 | ||||
| remove this parameter and the unused code to handle it. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 18 ++++++++---------- | ||||
|  1 file changed, 8 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -425,7 +425,7 @@ brcmf_sdiod_set_sbaddr_window(struct brc
 | ||||
|  } | ||||
|   | ||||
|  static int | ||||
| -brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, uint width, u32 *addr)
 | ||||
| +brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
 | ||||
|  { | ||||
|  	uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK; | ||||
|  	int err = 0; | ||||
| @@ -439,9 +439,7 @@ brcmf_sdiod_addrprep(struct brcmf_sdio_d
 | ||||
|  	} | ||||
|   | ||||
|  	*addr &= SBSDIO_SB_OFT_ADDR_MASK; | ||||
| -
 | ||||
| -	if (width == 4)
 | ||||
| -		*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| +	*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -467,7 +465,7 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
|   | ||||
| @@ -500,7 +498,7 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|  	if (retval) | ||||
|  		goto done; | ||||
|   | ||||
| @@ -736,7 +734,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|  	if (err) | ||||
|  		goto done; | ||||
|   | ||||
| @@ -757,7 +755,7 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", | ||||
|  		  addr, pktq->qlen); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|  	if (err) | ||||
|  		goto done; | ||||
|   | ||||
| @@ -801,7 +799,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|   | ||||
|  	memcpy(mypkt->data, buf, nbytes); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|   | ||||
|  	if (!err) | ||||
|  		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr, | ||||
| @@ -821,7 +819,7 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, 4, &addr);
 | ||||
| +	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|  	if (err) | ||||
|  		return err; | ||||
|   | ||||
| @ -1,61 +0,0 @@ | ||||
| From 4a3338ba2a7421db2260159cca5a27bd2ee36d00 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:43 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove bandaid for SleepCSR | ||||
| 
 | ||||
| Register access code is not the place for band-aid fixes like this. | ||||
| If this is a genuine problem, it should be fixed further up in the driver | ||||
| stack. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 28 +--------------------- | ||||
|  1 file changed, 1 insertion(+), 27 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -334,21 +334,8 @@ static int brcmf_sdiod_reg_write(struct
 | ||||
|  	} while (ret != 0 && ret != -ENOMEDIUM && | ||||
|  		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); | ||||
|   | ||||
| -	if (ret == -ENOMEDIUM) {
 | ||||
| +	if (ret == -ENOMEDIUM)
 | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| -	} else if (ret != 0) {
 | ||||
| -		/*
 | ||||
| -		 * SleepCSR register access can fail when
 | ||||
| -		 * waking up the device so reduce this noise
 | ||||
| -		 * in the logs.
 | ||||
| -		 */
 | ||||
| -		if (addr != SBSDIO_FUNC1_SLEEPCSR)
 | ||||
| -			brcmf_err("failed to write data F%d@0x%05x, err: %d\n",
 | ||||
| -				  func, addr, ret);
 | ||||
| -		else
 | ||||
| -			brcmf_dbg(SDIO, "failed to write data F%d@0x%05x, err: %d\n",
 | ||||
| -				  func, addr, ret);
 | ||||
| -	}
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -389,19 +376,6 @@ static int brcmf_sdiod_reg_read(struct b
 | ||||
|   | ||||
|  	if (ret == -ENOMEDIUM) | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| -	else if (ret != 0) {
 | ||||
| -		/*
 | ||||
| -		 * SleepCSR register access can fail when
 | ||||
| -		 * waking up the device so reduce this noise
 | ||||
| -		 * in the logs.
 | ||||
| -		 */
 | ||||
| -		if (addr != SBSDIO_FUNC1_SLEEPCSR)
 | ||||
| -			brcmf_err("failed to read data F%d@0x%05x, err: %d\n",
 | ||||
| -				  func, addr, ret);
 | ||||
| -		else
 | ||||
| -			brcmf_dbg(SDIO, "failed to read data F%d@0x%05x, err: %d\n",
 | ||||
| -				  func, addr, ret);
 | ||||
| -	}
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @ -1,344 +0,0 @@ | ||||
| From 993a98a42e6e790fd0d2bf7d55a031513c7ba7dc Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:44 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove brcmf_sdiod_request_data() | ||||
| 
 | ||||
| This function is obfuscating how IO works on this chip. Remove it | ||||
| and push its logic into brcmf_sdiod_reg_{read,write}(). | ||||
| 
 | ||||
| Handling of -ENOMEDIUM is altered, but as that's pretty much broken anyway | ||||
| we can ignore that. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 237 ++++++++------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |   2 +- | ||||
|  2 files changed, 87 insertions(+), 152 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -230,6 +230,43 @@ void brcmf_sdiod_change_state(struct brc
 | ||||
|  	sdiodev->state = state; | ||||
|  } | ||||
|   | ||||
| +static int brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +					 u32 address)
 | ||||
| +{
 | ||||
| +	int err = 0, i;
 | ||||
| +	u32 addr;
 | ||||
| +
 | ||||
| +	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| +		return -ENOMEDIUM;
 | ||||
| +
 | ||||
| +	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
 | ||||
| +
 | ||||
| +	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
 | ||||
| +		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| +				  addr & 0xff, &err);
 | ||||
| +
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
 | ||||
| +{
 | ||||
| +	uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	int err = 0;
 | ||||
| +
 | ||||
| +	if (bar0 != sdiodev->sbwad) {
 | ||||
| +		err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
 | ||||
| +		if (err)
 | ||||
| +			return err;
 | ||||
| +
 | ||||
| +		sdiodev->sbwad = bar0;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	*addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, u8 byte, | ||||
|  					uint regaddr) | ||||
|  { | ||||
| @@ -249,173 +286,84 @@ static inline int brcmf_sdiod_f0_writeb(
 | ||||
|  	return err_ret; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn,
 | ||||
| -				    u32 addr, u8 regsz, void *data, bool write)
 | ||||
| -{
 | ||||
| -	struct sdio_func *func;
 | ||||
| -	int ret = -EINVAL;
 | ||||
| -
 | ||||
| -	brcmf_dbg(SDIO, "rw=%d, func=%d, addr=0x%05x, nbytes=%d\n",
 | ||||
| -		  write, fn, addr, regsz);
 | ||||
| -
 | ||||
| -	/* only allow byte access on F0 */
 | ||||
| -	if (WARN_ON(regsz > 1 && !fn))
 | ||||
| -		return -EINVAL;
 | ||||
| -	func = sdiodev->func[fn];
 | ||||
| -
 | ||||
| -	switch (regsz) {
 | ||||
| -	case 1:
 | ||||
| -		if (write) {
 | ||||
| -			if (fn)
 | ||||
| -				sdio_writeb(func, *(u8 *)data, addr, &ret);
 | ||||
| -			else
 | ||||
| -				ret = brcmf_sdiod_f0_writeb(func, *(u8 *)data,
 | ||||
| -							    addr);
 | ||||
| -		} else {
 | ||||
| -			if (fn)
 | ||||
| -				*(u8 *)data = sdio_readb(func, addr, &ret);
 | ||||
| -			else
 | ||||
| -				*(u8 *)data = sdio_f0_readb(func, addr, &ret);
 | ||||
| -		}
 | ||||
| -		break;
 | ||||
| -	case 2:
 | ||||
| -		if (write)
 | ||||
| -			sdio_writew(func, *(u16 *)data, addr, &ret);
 | ||||
| -		else
 | ||||
| -			*(u16 *)data = sdio_readw(func, addr, &ret);
 | ||||
| -		break;
 | ||||
| -	case 4:
 | ||||
| -		if (write)
 | ||||
| -			sdio_writel(func, *(u32 *)data, addr, &ret);
 | ||||
| -		else
 | ||||
| -			*(u32 *)data = sdio_readl(func, addr, &ret);
 | ||||
| -		break;
 | ||||
| -	default:
 | ||||
| -		brcmf_err("invalid size: %d\n", regsz);
 | ||||
| -		break;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	if (ret)
 | ||||
| -		brcmf_dbg(SDIO, "failed to %s data F%d@0x%05x, err: %d\n",
 | ||||
| -			  write ? "write" : "read", fn, addr, ret);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr, | ||||
|  				 u8 regsz, void *data) | ||||
|  { | ||||
| -	u8 func;
 | ||||
| -	s32 retry = 0;
 | ||||
|  	int ret; | ||||
|   | ||||
| -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| -		return -ENOMEDIUM;
 | ||||
| -
 | ||||
|  	/* | ||||
|  	 * figure out how to read the register based on address range | ||||
|  	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR | ||||
|  	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers | ||||
|  	 * The rest: function 1 silicon backplane core registers | ||||
| +	 * f0 writes must be bytewise
 | ||||
|  	 */ | ||||
| -	if ((addr & ~REG_F0_REG_MASK) == 0)
 | ||||
| -		func = SDIO_FUNC_0;
 | ||||
| -	else
 | ||||
| -		func = SDIO_FUNC_1;
 | ||||
| -
 | ||||
| -	do {
 | ||||
| -		/* for retry wait for 1 ms till bus get settled down */
 | ||||
| -		if (retry)
 | ||||
| -			usleep_range(1000, 2000);
 | ||||
|   | ||||
| -		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
 | ||||
| -					       data, true);
 | ||||
| -
 | ||||
| -	} while (ret != 0 && ret != -ENOMEDIUM &&
 | ||||
| -		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
 | ||||
| +	if ((addr & ~REG_F0_REG_MASK) == 0) {
 | ||||
| +		if (WARN_ON(regsz > 1))
 | ||||
| +			return -EINVAL;
 | ||||
| +		ret = brcmf_sdiod_f0_writeb(sdiodev->func[0],
 | ||||
| +					    *(u8 *)data, addr);
 | ||||
| +	} else {
 | ||||
| +		switch (regsz) {
 | ||||
| +		case 1:
 | ||||
| +			sdio_writeb(sdiodev->func[1], *(u8 *)data, addr, &ret);
 | ||||
| +			break;
 | ||||
| +		case 4:
 | ||||
| +			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +			if (ret)
 | ||||
| +				goto done;
 | ||||
|   | ||||
| -	if (ret == -ENOMEDIUM)
 | ||||
| -		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | ||||
| +			sdio_writel(sdiodev->func[1], *(u32 *)data, addr, &ret);
 | ||||
| +			break;
 | ||||
| +		default:
 | ||||
| +			WARN(1, "Invalid reg size\n");
 | ||||
| +			ret = -EINVAL;
 | ||||
| +			break;
 | ||||
| +		}
 | ||||
| +	}
 | ||||
|   | ||||
| +done:
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
|  static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr, | ||||
|  				u8 regsz, void *data) | ||||
|  { | ||||
| -	u8 func;
 | ||||
| -	s32 retry = 0;
 | ||||
|  	int ret; | ||||
|   | ||||
| -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| -		return -ENOMEDIUM;
 | ||||
| -
 | ||||
|  	/* | ||||
|  	 * figure out how to read the register based on address range | ||||
|  	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR | ||||
|  	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers | ||||
|  	 * The rest: function 1 silicon backplane core registers | ||||
| +	 * f0 reads must be bytewise
 | ||||
|  	 */ | ||||
| -	if ((addr & ~REG_F0_REG_MASK) == 0)
 | ||||
| -		func = SDIO_FUNC_0;
 | ||||
| -	else
 | ||||
| -		func = SDIO_FUNC_1;
 | ||||
| -
 | ||||
| -	do {
 | ||||
| -		memset(data, 0, regsz);
 | ||||
| -
 | ||||
| -		/* for retry wait for 1 ms till bus get settled down */
 | ||||
| -		if (retry)
 | ||||
| -			usleep_range(1000, 2000);
 | ||||
| -
 | ||||
| -		ret = brcmf_sdiod_request_data(sdiodev, func, addr, regsz,
 | ||||
| -					       data, false);
 | ||||
| -
 | ||||
| -	} while (ret != 0 && ret != -ENOMEDIUM &&
 | ||||
| -		 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
 | ||||
| -
 | ||||
| -	if (ret == -ENOMEDIUM)
 | ||||
| -		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int
 | ||||
| -brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
 | ||||
| -{
 | ||||
| -	int err = 0, i;
 | ||||
| -	u32 addr;
 | ||||
| -
 | ||||
| -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| -		return -ENOMEDIUM;
 | ||||
| -
 | ||||
| -	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
 | ||||
| -
 | ||||
| -	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
 | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| -				  addr & 0xff, &err);
 | ||||
| -
 | ||||
| -	return err;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int
 | ||||
| -brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
 | ||||
| -{
 | ||||
| -	uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| -	int err = 0;
 | ||||
| -
 | ||||
| -	if (bar0 != sdiodev->sbwad) {
 | ||||
| -		err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
 | ||||
| -		if (err)
 | ||||
| -			return err;
 | ||||
| +	if ((addr & ~REG_F0_REG_MASK) == 0) {
 | ||||
| +		if (WARN_ON(regsz > 1))
 | ||||
| +			return -EINVAL;
 | ||||
| +		*(u8 *)data = sdio_f0_readb(sdiodev->func[0], addr, &ret);
 | ||||
| +	} else {
 | ||||
| +		switch (regsz) {
 | ||||
| +		case 1:
 | ||||
| +			*(u8 *)data = sdio_readb(sdiodev->func[1], addr, &ret);
 | ||||
| +			break;
 | ||||
| +		case 4:
 | ||||
| +			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +			if (ret)
 | ||||
| +				goto done;
 | ||||
|   | ||||
| -		sdiodev->sbwad = bar0;
 | ||||
| +			*(u32 *)data = sdio_readl(sdiodev->func[1], addr, &ret);
 | ||||
| +			break;
 | ||||
| +		default:
 | ||||
| +			WARN(1, "Invalid reg size\n");
 | ||||
| +			ret = -EINVAL;
 | ||||
| +			break;
 | ||||
| +		}
 | ||||
|  	} | ||||
|   | ||||
| -	*addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| -	*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| -
 | ||||
| -	return 0;
 | ||||
| +done:
 | ||||
| +	return ret;
 | ||||
|  } | ||||
|   | ||||
|  u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | ||||
| @@ -439,15 +387,9 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| -	if (retval)
 | ||||
| -		goto done;
 | ||||
| -
 | ||||
|  	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data); | ||||
| -
 | ||||
|  	brcmf_dbg(SDIO, "data:0x%08x\n", data); | ||||
|   | ||||
| -done:
 | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
|   | ||||
| @@ -472,13 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data); | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| -	if (retval)
 | ||||
| -		goto done;
 | ||||
| -
 | ||||
|  	retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data); | ||||
|   | ||||
| -done:
 | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
|  } | ||||
| @@ -886,14 +823,12 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  	return bcmerror; | ||||
|  } | ||||
|   | ||||
| -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn)
 | ||||
| +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn)
 | ||||
|  { | ||||
| -	char t_func = (char)fn;
 | ||||
|  	brcmf_dbg(SDIO, "Enter\n"); | ||||
|   | ||||
|  	/* issue abort cmd52 command through F0 */ | ||||
| -	brcmf_sdiod_request_data(sdiodev, SDIO_FUNC_0, SDIO_CCCR_ABORT,
 | ||||
| -				 1, &t_func, true);
 | ||||
| +	brcmf_sdiod_reg_write(sdiodev, SDIO_CCCR_ABORT, 1, &fn);
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "Exit\n"); | ||||
|  	return 0; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -339,7 +339,7 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_
 | ||||
|  		      u8 *data, uint size); | ||||
|   | ||||
|  /* Issue an abort to the specified function */ | ||||
| -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
 | ||||
| +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn);
 | ||||
|  void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev); | ||||
|  void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev, | ||||
|  			      enum brcmf_sdiod_state state); | ||||
| @ -1,28 +0,0 @@ | ||||
| From 3508a056a1f45d95c874fc9af8748bf4229432b6 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:45 +0100 | ||||
| Subject: [PATCH] brcmfmac: Fix asymmetric IO functions. | ||||
| 
 | ||||
| Unlikely to be a problem, but brcmf_sdiod_regrl() is | ||||
| not symmetric with brcmf_sdiod_regrb() in initializing | ||||
| the data value on stack. Fix that. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| [arend: reword the commit message a bit] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -383,7 +383,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
 | ||||
|   | ||||
|  u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | ||||
|  { | ||||
| -	u32 data = 0;
 | ||||
| +	u32 data;
 | ||||
|  	int retval; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr:0x%08x\n", addr); | ||||
| @ -1,53 +0,0 @@ | ||||
| From 12e3e74e2820e11d91ee44fd3a190cd80d109faa Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:46 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove noisy debugging. | ||||
| 
 | ||||
| If you need debugging this low level, you're doing something wrong. | ||||
| Remove these noisy debug statements so the code is more readable. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 6 ------ | ||||
|  1 file changed, 6 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -371,9 +371,7 @@ u8 brcmf_sdiod_regrb(struct brcmf_sdio_d
 | ||||
|  	u8 data; | ||||
|  	int retval; | ||||
|   | ||||
| -	brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
 | ||||
|  	retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data); | ||||
| -	brcmf_dbg(SDIO, "data:0x%02x\n", data);
 | ||||
|   | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
| @@ -386,9 +384,7 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	u32 data; | ||||
|  	int retval; | ||||
|   | ||||
| -	brcmf_dbg(SDIO, "addr:0x%08x\n", addr);
 | ||||
|  	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data); | ||||
| -	brcmf_dbg(SDIO, "data:0x%08x\n", data);
 | ||||
|   | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
| @@ -401,7 +397,6 @@ void brcmf_sdiod_regwb(struct brcmf_sdio
 | ||||
|  { | ||||
|  	int retval; | ||||
|   | ||||
| -	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%02x\n", addr, data);
 | ||||
|  	retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data); | ||||
|   | ||||
|  	if (ret) | ||||
| @@ -413,7 +408,6 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  { | ||||
|  	int retval; | ||||
|   | ||||
| -	brcmf_dbg(SDIO, "addr:0x%08x, data:0x%08x\n", addr, data);
 | ||||
|  	retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data); | ||||
|   | ||||
|  	if (ret) | ||||
| @ -1,58 +0,0 @@ | ||||
| From dd8a2d49e4ed321ab8e7b679499c3a98ccc5ca24 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Mon, 13 Nov 2017 21:35:47 +0100 | ||||
| Subject: [PATCH] brcmfmac: Rename bcmerror to err | ||||
| 
 | ||||
| Trivial cleanup of nasty variable name | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 14 +++++++------- | ||||
|  1 file changed, 7 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -746,7 +746,7 @@ int
 | ||||
|  brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address, | ||||
|  		  u8 *data, uint size) | ||||
|  { | ||||
| -	int bcmerror = 0;
 | ||||
| +	int err = 0;
 | ||||
|  	struct sk_buff *pkt; | ||||
|  	u32 sdaddr; | ||||
|  	uint dsize; | ||||
| @@ -771,8 +771,8 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  	/* Do the transfer(s) */ | ||||
|  	while (size) { | ||||
|  		/* Set the backplane window to include the start address */ | ||||
| -		bcmerror = brcmf_sdiod_set_sbaddr_window(sdiodev, address);
 | ||||
| -		if (bcmerror)
 | ||||
| +		err = brcmf_sdiod_set_sbaddr_window(sdiodev, address);
 | ||||
| +		if (err)
 | ||||
|  			break; | ||||
|   | ||||
|  		brcmf_dbg(SDIO, "%s %d bytes at offset 0x%08x in window 0x%08x\n", | ||||
| @@ -785,9 +785,9 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  		skb_put(pkt, dsize); | ||||
|  		if (write) | ||||
|  			memcpy(pkt->data, data, dsize); | ||||
| -		bcmerror = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write,
 | ||||
| -					      sdaddr, pkt);
 | ||||
| -		if (bcmerror) {
 | ||||
| +		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
 | ||||
| +					 pkt);
 | ||||
| +		if (err) {
 | ||||
|  			brcmf_err("membytes transfer failed\n"); | ||||
|  			break; | ||||
|  		} | ||||
| @@ -814,7 +814,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|   | ||||
|  	sdio_release_host(sdiodev->func[1]); | ||||
|   | ||||
| -	return bcmerror;
 | ||||
| +	return err;
 | ||||
|  } | ||||
|   | ||||
|  int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn) | ||||
| @ -1,143 +0,0 @@ | ||||
| From 8f13c87ccc495e30de5f58bbda967f6edd5bec53 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:26 +0100 | ||||
| Subject: [PATCH] brcmfmac: Split brcmf_sdiod_buffrw function up. | ||||
| 
 | ||||
| This function needs to be split up into separate read / write variants | ||||
| for clarity. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 67 +++++++++++++++------- | ||||
|  1 file changed, 45 insertions(+), 22 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | ||||
|  		*ret = retval; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| -			     bool write, u32 addr, struct sk_buff *pkt)
 | ||||
| +static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| +				 u32 addr, struct sk_buff *pkt)
 | ||||
|  { | ||||
|  	unsigned int req_sz; | ||||
|  	int err; | ||||
| @@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brc
 | ||||
|  	req_sz = pkt->len + 3; | ||||
|  	req_sz &= (uint)~3; | ||||
|   | ||||
| -	if (write)
 | ||||
| -		err = sdio_memcpy_toio(sdiodev->func[fn], addr,
 | ||||
| -				       ((u8 *)(pkt->data)), req_sz);
 | ||||
| -	else if (fn == 1)
 | ||||
| -		err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
 | ||||
| -					 addr, req_sz);
 | ||||
| +	if (fn == 1)
 | ||||
| +		err = sdio_memcpy_fromio(sdiodev->func[fn],
 | ||||
| +					 ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
|  	else | ||||
|  		/* function 2 read is FIFO operation */ | ||||
| -		err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
 | ||||
| -				  req_sz);
 | ||||
| +		err = sdio_readsb(sdiodev->func[fn],
 | ||||
| +				  ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
| +
 | ||||
| +	if (err == -ENOMEDIUM)
 | ||||
| +		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | ||||
| +
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| +				  u32 addr, struct sk_buff *pkt)
 | ||||
| +{
 | ||||
| +	unsigned int req_sz;
 | ||||
| +	int err;
 | ||||
| +
 | ||||
| +	/* Single skb use the standard mmc interface */
 | ||||
| +	req_sz = pkt->len + 3;
 | ||||
| +	req_sz &= (uint)~3;
 | ||||
| +
 | ||||
| +	err = sdio_memcpy_toio(sdiodev->func[fn], addr,
 | ||||
| +			       ((u8 *)(pkt->data)), req_sz);
 | ||||
| +
 | ||||
|  	if (err == -ENOMEDIUM) | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| +
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| @@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | ||||
|  	if (err) | ||||
|  		goto done; | ||||
|   | ||||
| -	err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt);
 | ||||
| +	err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
 | ||||
|   | ||||
|  done: | ||||
|  	return err; | ||||
| @@ -665,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  		goto done; | ||||
|   | ||||
|  	if (pktq->qlen == 1) | ||||
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
 | ||||
| -					 pktq->next);
 | ||||
| +		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | ||||
| +					    pktq->next);
 | ||||
|  	else if (!sdiodev->sg_support) { | ||||
|  		glom_skb = brcmu_pkt_buf_get_skb(totlen); | ||||
|  		if (!glom_skb) | ||||
|  			return -ENOMEM; | ||||
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
 | ||||
| -					 glom_skb);
 | ||||
| +		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | ||||
| +					    glom_skb);
 | ||||
|  		if (err) | ||||
|  			goto done; | ||||
|   | ||||
| @@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|  	err = brcmf_sdiod_addrprep(sdiodev, &addr); | ||||
|   | ||||
|  	if (!err) | ||||
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
 | ||||
| -					 mypkt);
 | ||||
| +		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
 | ||||
|   | ||||
|  	brcmu_pkt_buf_free_skb(mypkt); | ||||
|  	return err; | ||||
| @@ -730,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	if (pktq->qlen == 1 || !sdiodev->sg_support) | ||||
|  		skb_queue_walk(pktq, skb) { | ||||
| -			err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
 | ||||
| -						 addr, skb);
 | ||||
| +			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
 | ||||
| +						     addr, skb);
 | ||||
|  			if (err) | ||||
|  				break; | ||||
|  		} | ||||
| @@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  		sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
|  		skb_put(pkt, dsize); | ||||
| -		if (write)
 | ||||
| +
 | ||||
| +		if (write) {
 | ||||
|  			memcpy(pkt->data, data, dsize); | ||||
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
 | ||||
| -					 pkt);
 | ||||
| +			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
 | ||||
| +						     sdaddr, pkt);
 | ||||
| +		} else {
 | ||||
| +			err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
 | ||||
| +						    sdaddr, pkt);
 | ||||
| +		}
 | ||||
| +
 | ||||
|  		if (err) { | ||||
|  			brcmf_err("membytes transfer failed\n"); | ||||
|  			break; | ||||
| @ -1,34 +0,0 @@ | ||||
| From 6e24dd012bfda479d0046f7995058f167e1923bc Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:27 +0100 | ||||
| Subject: [PATCH] brcmfmac: whitespace fixes in brcmf_sdiod_send_buf() | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: mention function in patch subject] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 3 ++- | ||||
|  1 file changed, 2 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -714,6 +714,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|  	int err; | ||||
|   | ||||
|  	mypkt = brcmu_pkt_buf_get_skb(nbytes); | ||||
| +
 | ||||
|  	if (!mypkt) { | ||||
|  		brcmf_err("brcmu_pkt_buf_get_skb failed: len %d\n", | ||||
|  			  nbytes); | ||||
| @@ -728,8 +729,8 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|  		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt); | ||||
|   | ||||
|  	brcmu_pkt_buf_free_skb(mypkt); | ||||
| -	return err;
 | ||||
|   | ||||
| +	return err;
 | ||||
|  } | ||||
|   | ||||
|  int brcmf_sdiod_send_pkt(struct brcmf_sdio_dev *sdiodev, | ||||
| @ -1,36 +0,0 @@ | ||||
| From a7323378dcf1f10a98f47b744e6f65e6fd671d84 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:28 +0100 | ||||
| Subject: [PATCH] brcmfmac: Clarify if using braces. | ||||
| 
 | ||||
| Whilst this if () statement is technically correct, it lacks clarity. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 5 +++-- | ||||
|  1 file changed, 3 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -746,16 +746,17 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|  	if (err) | ||||
|  		return err; | ||||
|   | ||||
| -	if (pktq->qlen == 1 || !sdiodev->sg_support)
 | ||||
| +	if (pktq->qlen == 1 || !sdiodev->sg_support) {
 | ||||
|  		skb_queue_walk(pktq, skb) { | ||||
|  			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, | ||||
|  						     addr, skb); | ||||
|  			if (err) | ||||
|  				break; | ||||
|  		} | ||||
| -	else
 | ||||
| +	} else {
 | ||||
|  		err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, true, addr, | ||||
|  					    pktq); | ||||
| +	}
 | ||||
|   | ||||
|  	return err; | ||||
|  } | ||||
| @ -1,831 +0,0 @@ | ||||
| From 71bd508d7ded8c504ef05d1b4befecfe25e54cb1 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:29 +0100 | ||||
| Subject: [PATCH] brcmfmac: Rename / replace old IO functions with simpler | ||||
|  ones. | ||||
| 
 | ||||
| Primarily this patch removes: | ||||
| 
 | ||||
| brcmf_sdiod_f0_writeb() | ||||
| brcmf_sdiod_reg_write() | ||||
| brcmf_sdiod_reg_read() | ||||
| 
 | ||||
| Since we no longer use the quirky method of deciding which function to | ||||
| address via the address being accessed, take the opportunity to rename | ||||
| some IO functions more in line with common kernel code. We also convert | ||||
| those that map directly to sdio_{read,write}*() to macros. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 169 +++---------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 186 ++++++++++----------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |  28 +++- | ||||
|  3 files changed, 138 insertions(+), 245 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -137,27 +137,27 @@ int brcmf_sdiod_intr_register(struct brc
 | ||||
|  		if (sdiodev->bus_if->chip == BRCM_CC_43362_CHIP_ID) { | ||||
|  			/* assign GPIO to SDIO core */ | ||||
|  			addr = CORE_CC_REG(SI_ENUM_BASE, gpiocontrol); | ||||
| -			gpiocontrol = brcmf_sdiod_regrl(sdiodev, addr, &ret);
 | ||||
| +			gpiocontrol = brcmf_sdiod_readl(sdiodev, addr, &ret);
 | ||||
|  			gpiocontrol |= 0x2; | ||||
| -			brcmf_sdiod_regwl(sdiodev, addr, gpiocontrol, &ret);
 | ||||
| +			brcmf_sdiod_writel(sdiodev, addr, gpiocontrol, &ret);
 | ||||
|   | ||||
| -			brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_SELECT, 0xf,
 | ||||
| -					  &ret);
 | ||||
| -			brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_OUT, 0, &ret);
 | ||||
| -			brcmf_sdiod_regwb(sdiodev, SBSDIO_GPIO_EN, 0x2, &ret);
 | ||||
| +			brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_SELECT,
 | ||||
| +					   0xf, &ret);
 | ||||
| +			brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_OUT, 0, &ret);
 | ||||
| +			brcmf_sdiod_writeb(sdiodev, SBSDIO_GPIO_EN, 0x2, &ret);
 | ||||
|  		} | ||||
|   | ||||
|  		/* must configure SDIO_CCCR_IENx to enable irq */ | ||||
| -		data = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_IENx, &ret);
 | ||||
| +		data = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_IENx, &ret);
 | ||||
|  		data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1; | ||||
| -		brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, data, &ret);
 | ||||
| +		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, data, &ret);
 | ||||
|   | ||||
|  		/* redirect, configure and enable io for interrupt signal */ | ||||
|  		data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE; | ||||
|  		if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) | ||||
|  			data |= SDIO_SEPINT_ACT_HI; | ||||
| -		brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, data, &ret);
 | ||||
| -
 | ||||
| +		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT,
 | ||||
| +				     data, &ret);
 | ||||
|  		sdio_release_host(sdiodev->func[1]); | ||||
|  	} else { | ||||
|  		brcmf_dbg(SDIO, "Entering\n"); | ||||
| @@ -183,8 +183,8 @@ void brcmf_sdiod_intr_unregister(struct
 | ||||
|   | ||||
|  		pdata = &sdiodev->settings->bus.sdio; | ||||
|  		sdio_claim_host(sdiodev->func[1]); | ||||
| -		brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
 | ||||
| -		brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_IENx, 0, NULL);
 | ||||
| +		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, 0, NULL);
 | ||||
| +		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, 0, NULL);
 | ||||
|  		sdio_release_host(sdiodev->func[1]); | ||||
|   | ||||
|  		sdiodev->oob_irq_requested = false; | ||||
| @@ -242,8 +242,8 @@ static int brcmf_sdiod_set_sbaddr_window
 | ||||
|  	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8; | ||||
|   | ||||
|  	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8) | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| -				  addr & 0xff, &err);
 | ||||
| +		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i,
 | ||||
| +				   addr & 0xff, &err);
 | ||||
|   | ||||
|  	return err; | ||||
|  } | ||||
| @@ -267,124 +267,15 @@ static int brcmf_sdiod_addrprep(struct b
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, u8 byte,
 | ||||
| -					uint regaddr)
 | ||||
| -{
 | ||||
| -	int err_ret;
 | ||||
| -
 | ||||
| -	/*
 | ||||
| -	 * Can only directly write to some F0 registers.
 | ||||
| -	 * Handle CCCR_IENx and CCCR_ABORT command
 | ||||
| -	 * as a special case.
 | ||||
| -	 */
 | ||||
| -	if ((regaddr == SDIO_CCCR_ABORT) ||
 | ||||
| -	    (regaddr == SDIO_CCCR_IENx))
 | ||||
| -		sdio_writeb(func, byte, regaddr, &err_ret);
 | ||||
| -	else
 | ||||
| -		sdio_f0_writeb(func, byte, regaddr, &err_ret);
 | ||||
| -
 | ||||
| -	return err_ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int brcmf_sdiod_reg_write(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| -				 u8 regsz, void *data)
 | ||||
| -{
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	/*
 | ||||
| -	 * figure out how to read the register based on address range
 | ||||
| -	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
 | ||||
| -	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
 | ||||
| -	 * The rest: function 1 silicon backplane core registers
 | ||||
| -	 * f0 writes must be bytewise
 | ||||
| -	 */
 | ||||
| -
 | ||||
| -	if ((addr & ~REG_F0_REG_MASK) == 0) {
 | ||||
| -		if (WARN_ON(regsz > 1))
 | ||||
| -			return -EINVAL;
 | ||||
| -		ret = brcmf_sdiod_f0_writeb(sdiodev->func[0],
 | ||||
| -					    *(u8 *)data, addr);
 | ||||
| -	} else {
 | ||||
| -		switch (regsz) {
 | ||||
| -		case 1:
 | ||||
| -			sdio_writeb(sdiodev->func[1], *(u8 *)data, addr, &ret);
 | ||||
| -			break;
 | ||||
| -		case 4:
 | ||||
| -			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| -			if (ret)
 | ||||
| -				goto done;
 | ||||
| -
 | ||||
| -			sdio_writel(sdiodev->func[1], *(u32 *)data, addr, &ret);
 | ||||
| -			break;
 | ||||
| -		default:
 | ||||
| -			WARN(1, "Invalid reg size\n");
 | ||||
| -			ret = -EINVAL;
 | ||||
| -			break;
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| -
 | ||||
| -done:
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int brcmf_sdiod_reg_read(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| -				u8 regsz, void *data)
 | ||||
| -{
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	/*
 | ||||
| -	 * figure out how to read the register based on address range
 | ||||
| -	 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
 | ||||
| -	 * 0x10000 ~ 0x1FFFF: function 1 miscellaneous registers
 | ||||
| -	 * The rest: function 1 silicon backplane core registers
 | ||||
| -	 * f0 reads must be bytewise
 | ||||
| -	 */
 | ||||
| -	if ((addr & ~REG_F0_REG_MASK) == 0) {
 | ||||
| -		if (WARN_ON(regsz > 1))
 | ||||
| -			return -EINVAL;
 | ||||
| -		*(u8 *)data = sdio_f0_readb(sdiodev->func[0], addr, &ret);
 | ||||
| -	} else {
 | ||||
| -		switch (regsz) {
 | ||||
| -		case 1:
 | ||||
| -			*(u8 *)data = sdio_readb(sdiodev->func[1], addr, &ret);
 | ||||
| -			break;
 | ||||
| -		case 4:
 | ||||
| -			ret = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| -			if (ret)
 | ||||
| -				goto done;
 | ||||
| -
 | ||||
| -			*(u32 *)data = sdio_readl(sdiodev->func[1], addr, &ret);
 | ||||
| -			break;
 | ||||
| -		default:
 | ||||
| -			WARN(1, "Invalid reg size\n");
 | ||||
| -			ret = -EINVAL;
 | ||||
| -			break;
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| -
 | ||||
| -done:
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
 | ||||
| +u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
 | ||||
|  { | ||||
| -	u8 data;
 | ||||
| +	u32 data = 0;
 | ||||
|  	int retval; | ||||
|   | ||||
| -	retval = brcmf_sdiod_reg_read(sdiodev, addr, 1, &data);
 | ||||
| -
 | ||||
| -	if (ret)
 | ||||
| -		*ret = retval;
 | ||||
| -
 | ||||
| -	return data;
 | ||||
| -}
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|   | ||||
| -u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret)
 | ||||
| -{
 | ||||
| -	u32 data;
 | ||||
| -	int retval;
 | ||||
| -
 | ||||
| -	retval = brcmf_sdiod_reg_read(sdiodev, addr, 4, &data);
 | ||||
| +	if (!retval)
 | ||||
| +		data = sdio_readl(sdiodev->func[1], addr, &retval);
 | ||||
|   | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
| @@ -392,23 +283,15 @@ u32 brcmf_sdiod_regrl(struct brcmf_sdio_
 | ||||
|  	return data; | ||||
|  } | ||||
|   | ||||
| -void brcmf_sdiod_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| -		      u8 data, int *ret)
 | ||||
| +void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| +			u32 data, int *ret)
 | ||||
|  { | ||||
|  	int retval; | ||||
|   | ||||
| -	retval = brcmf_sdiod_reg_write(sdiodev, addr, 1, &data);
 | ||||
| -
 | ||||
| -	if (ret)
 | ||||
| -		*ret = retval;
 | ||||
| -}
 | ||||
| -
 | ||||
| -void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr,
 | ||||
| -		      u32 data, int *ret)
 | ||||
| -{
 | ||||
| -	int retval;
 | ||||
| +	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
|   | ||||
| -	retval = brcmf_sdiod_reg_write(sdiodev, addr, 4, &data);
 | ||||
| +	if (!retval)
 | ||||
| +		sdio_writel(sdiodev->func[1], data, addr, &retval);
 | ||||
|   | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
| @@ -846,8 +729,8 @@ int brcmf_sdiod_abort(struct brcmf_sdio_
 | ||||
|  { | ||||
|  	brcmf_dbg(SDIO, "Enter\n"); | ||||
|   | ||||
| -	/* issue abort cmd52 command through F0 */
 | ||||
| -	brcmf_sdiod_reg_write(sdiodev, SDIO_CCCR_ABORT, 1, &fn);
 | ||||
| +	/* Issue abort cmd52 command through F0 */
 | ||||
| +	brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, fn, NULL);
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "Exit\n"); | ||||
|  	return 0; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -669,7 +669,7 @@ static int r_sdreg32(struct brcmf_sdio *
 | ||||
|  	int ret; | ||||
|   | ||||
|  	core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV); | ||||
| -	*regvar = brcmf_sdiod_regrl(bus->sdiodev, core->base + offset, &ret);
 | ||||
| +	*regvar = brcmf_sdiod_readl(bus->sdiodev, core->base + offset, &ret);
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -680,7 +680,7 @@ static int w_sdreg32(struct brcmf_sdio *
 | ||||
|  	int ret; | ||||
|   | ||||
|  	core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV); | ||||
| -	brcmf_sdiod_regwl(bus->sdiodev, core->base + reg_offset, regval, &ret);
 | ||||
| +	brcmf_sdiod_writel(bus->sdiodev, core->base + reg_offset, regval, &ret);
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -697,8 +697,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio
 | ||||
|   | ||||
|  	wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); | ||||
|  	/* 1st KSO write goes to AOS wake up core if device is asleep  */ | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
| -			  wr_val, &err);
 | ||||
| +	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);
 | ||||
|   | ||||
|  	if (on) { | ||||
|  		/* device WAKEUP through KSO: | ||||
| @@ -724,7 +723,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio
 | ||||
|  		 * just one write attempt may fail, | ||||
|  		 * read it back until it matches written value | ||||
|  		 */ | ||||
| -		rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
| +		rd_val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
|  					   &err); | ||||
|  		if (!err) { | ||||
|  			if ((rd_val & bmask) == cmp_val) | ||||
| @@ -734,9 +733,11 @@ brcmf_sdio_kso_control(struct brcmf_sdio
 | ||||
|  		/* bail out upon subsequent access errors */ | ||||
|  		if (err && (err_cnt++ > BRCMF_SDIO_MAX_ACCESS_ERRORS)) | ||||
|  			break; | ||||
| +
 | ||||
|  		udelay(KSO_WAIT_US); | ||||
| -		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
| -				  wr_val, &err);
 | ||||
| +		brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val,
 | ||||
| +				   &err);
 | ||||
| +
 | ||||
|  	} while (try_cnt++ < MAX_KSO_ATTEMPTS); | ||||
|   | ||||
|  	if (try_cnt > 2) | ||||
| @@ -772,15 +773,15 @@ static int brcmf_sdio_htclk(struct brcmf
 | ||||
|  		clkreq = | ||||
|  		    bus->alp_only ? SBSDIO_ALP_AVAIL_REQ : SBSDIO_HT_AVAIL_REQ; | ||||
|   | ||||
| -		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -				  clkreq, &err);
 | ||||
| +		brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +				   clkreq, &err);
 | ||||
|  		if (err) { | ||||
|  			brcmf_err("HT Avail request error: %d\n", err); | ||||
|  			return -EBADE; | ||||
|  		} | ||||
|   | ||||
|  		/* Check current status */ | ||||
| -		clkctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +		clkctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  					   SBSDIO_FUNC1_CHIPCLKCSR, &err); | ||||
|  		if (err) { | ||||
|  			brcmf_err("HT Avail read error: %d\n", err); | ||||
| @@ -790,35 +791,34 @@ static int brcmf_sdio_htclk(struct brcmf
 | ||||
|  		/* Go to pending and await interrupt if appropriate */ | ||||
|  		if (!SBSDIO_CLKAV(clkctl, bus->alp_only) && pendok) { | ||||
|  			/* Allow only clock-available interrupt */ | ||||
| -			devctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			devctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_DEVICE_CTL, &err); | ||||
|  			if (err) { | ||||
| -				brcmf_err("Devctl error setting CA: %d\n",
 | ||||
| -					  err);
 | ||||
| +				brcmf_err("Devctl error setting CA: %d\n", err);
 | ||||
|  				return -EBADE; | ||||
|  			} | ||||
|   | ||||
|  			devctl |= SBSDIO_DEVCTL_CA_INT_ONLY; | ||||
| -			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| -					  devctl, &err);
 | ||||
| +			brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| +					   devctl, &err);
 | ||||
|  			brcmf_dbg(SDIO, "CLKCTL: set PENDING\n"); | ||||
|  			bus->clkstate = CLK_PENDING; | ||||
|   | ||||
|  			return 0; | ||||
|  		} else if (bus->clkstate == CLK_PENDING) { | ||||
|  			/* Cancel CA-only interrupt filter */ | ||||
| -			devctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			devctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_DEVICE_CTL, &err); | ||||
|  			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | ||||
| -			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| -					  devctl, &err);
 | ||||
| +			brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| +					   devctl, &err);
 | ||||
|  		} | ||||
|   | ||||
|  		/* Otherwise, wait here (polling) for HT Avail */ | ||||
|  		timeout = jiffies + | ||||
|  			  msecs_to_jiffies(PMU_MAX_TRANSITION_DLY/1000); | ||||
|  		while (!SBSDIO_CLKAV(clkctl, bus->alp_only)) { | ||||
| -			clkctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			clkctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_FUNC1_CHIPCLKCSR, | ||||
|  						   &err); | ||||
|  			if (time_after(jiffies, timeout)) | ||||
| @@ -852,16 +852,16 @@ static int brcmf_sdio_htclk(struct brcmf
 | ||||
|   | ||||
|  		if (bus->clkstate == CLK_PENDING) { | ||||
|  			/* Cancel CA-only interrupt filter */ | ||||
| -			devctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			devctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_DEVICE_CTL, &err); | ||||
|  			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | ||||
| -			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| -					  devctl, &err);
 | ||||
| +			brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| +					   devctl, &err);
 | ||||
|  		} | ||||
|   | ||||
|  		bus->clkstate = CLK_SDONLY; | ||||
| -		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -				  clkreq, &err);
 | ||||
| +		brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +				   clkreq, &err);
 | ||||
|  		brcmf_dbg(SDIO, "CLKCTL: turned OFF\n"); | ||||
|  		if (err) { | ||||
|  			brcmf_err("Failed access turning clock off: %d\n", | ||||
| @@ -951,14 +951,14 @@ brcmf_sdio_bus_sleep(struct brcmf_sdio *
 | ||||
|   | ||||
|  		/* Going to sleep */ | ||||
|  		if (sleep) { | ||||
| -			clkcsr = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			clkcsr = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_FUNC1_CHIPCLKCSR, | ||||
|  						   &err); | ||||
|  			if ((clkcsr & SBSDIO_CSR_MASK) == 0) { | ||||
|  				brcmf_dbg(SDIO, "no clock, set ALP\n"); | ||||
| -				brcmf_sdiod_regwb(bus->sdiodev,
 | ||||
| -						  SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -						  SBSDIO_ALP_AVAIL_REQ, &err);
 | ||||
| +				brcmf_sdiod_writeb(bus->sdiodev,
 | ||||
| +						   SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +						   SBSDIO_ALP_AVAIL_REQ, &err);
 | ||||
|  			} | ||||
|  			err = brcmf_sdio_kso_control(bus, false); | ||||
|  		} else { | ||||
| @@ -1178,16 +1178,16 @@ static void brcmf_sdio_rxfail(struct brc
 | ||||
|  	if (abort) | ||||
|  		brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2); | ||||
|   | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL,
 | ||||
| -			  SFC_RF_TERM, &err);
 | ||||
| +	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM,
 | ||||
| +			   &err);
 | ||||
|  	bus->sdcnt.f1regdata++; | ||||
|   | ||||
|  	/* Wait until the packet has been flushed (device/FIFO stable) */ | ||||
|  	for (lastrbc = retries = 0xffff; retries > 0; retries--) { | ||||
| -		hi = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| -				       SBSDIO_FUNC1_RFRAMEBCHI, &err);
 | ||||
| -		lo = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| -				       SBSDIO_FUNC1_RFRAMEBCLO, &err);
 | ||||
| +		hi = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_RFRAMEBCHI,
 | ||||
| +				       &err);
 | ||||
| +		lo = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_RFRAMEBCLO,
 | ||||
| +				       &err);
 | ||||
|  		bus->sdcnt.f1regdata += 2; | ||||
|   | ||||
|  		if ((hi == 0) && (lo == 0)) | ||||
| @@ -1229,12 +1229,12 @@ static void brcmf_sdio_txfail(struct brc
 | ||||
|  	bus->sdcnt.tx_sderrs++; | ||||
|   | ||||
|  	brcmf_sdiod_abort(sdiodev, SDIO_FUNC_2); | ||||
| -	brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL);
 | ||||
| +	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL);
 | ||||
|  	bus->sdcnt.f1regdata++; | ||||
|   | ||||
|  	for (i = 0; i < 3; i++) { | ||||
| -		hi = brcmf_sdiod_regrb(sdiodev, SBSDIO_FUNC1_WFRAMEBCHI, NULL);
 | ||||
| -		lo = brcmf_sdiod_regrb(sdiodev, SBSDIO_FUNC1_WFRAMEBCLO, NULL);
 | ||||
| +		hi = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_WFRAMEBCHI, NULL);
 | ||||
| +		lo = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_WFRAMEBCLO, NULL);
 | ||||
|  		bus->sdcnt.f1regdata += 2; | ||||
|  		if ((hi == 0) && (lo == 0)) | ||||
|  			break; | ||||
| @@ -2446,11 +2446,11 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|  		bus->hostintmask = 0; | ||||
|   | ||||
|  		/* Force backplane clocks to assure F2 interrupt propagates */ | ||||
| -		saveclk = brcmf_sdiod_regrb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +		saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
|  					    &err); | ||||
|  		if (!err) | ||||
| -			brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -					  (saveclk | SBSDIO_FORCE_HT), &err);
 | ||||
| +			brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +					   (saveclk | SBSDIO_FORCE_HT), &err);
 | ||||
|  		if (err) | ||||
|  			brcmf_err("Failed to force clock for F2: err %d\n", | ||||
|  				  err); | ||||
| @@ -2509,7 +2509,7 @@ static int brcmf_sdio_intr_rstatus(struc
 | ||||
|  	buscore = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV); | ||||
|  	addr = buscore->base + offsetof(struct sdpcmd_regs, intstatus); | ||||
|   | ||||
| -	val = brcmf_sdiod_regrl(bus->sdiodev, addr, &ret);
 | ||||
| +	val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret);
 | ||||
|  	bus->sdcnt.f1regdata++; | ||||
|  	if (ret != 0) | ||||
|  		return ret; | ||||
| @@ -2519,7 +2519,7 @@ static int brcmf_sdio_intr_rstatus(struc
 | ||||
|   | ||||
|  	/* Clear interrupts */ | ||||
|  	if (val) { | ||||
| -		brcmf_sdiod_regwl(bus->sdiodev, addr, val, &ret);
 | ||||
| +		brcmf_sdiod_writel(bus->sdiodev, addr, val, &ret);
 | ||||
|  		bus->sdcnt.f1regdata++; | ||||
|  		atomic_or(val, &bus->intstatus); | ||||
|  	} | ||||
| @@ -2545,23 +2545,23 @@ static void brcmf_sdio_dpc(struct brcmf_
 | ||||
|   | ||||
|  #ifdef DEBUG | ||||
|  		/* Check for inconsistent device control */ | ||||
| -		devctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| -					   SBSDIO_DEVICE_CTL, &err);
 | ||||
| +		devctl = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| +					   &err);
 | ||||
|  #endif				/* DEBUG */ | ||||
|   | ||||
|  		/* Read CSR, if clock on switch to AVAIL, else ignore */ | ||||
| -		clkctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +		clkctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  					   SBSDIO_FUNC1_CHIPCLKCSR, &err); | ||||
|   | ||||
|  		brcmf_dbg(SDIO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n", | ||||
|  			  devctl, clkctl); | ||||
|   | ||||
|  		if (SBSDIO_HTAV(clkctl)) { | ||||
| -			devctl = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| +			devctl = brcmf_sdiod_readb(bus->sdiodev,
 | ||||
|  						   SBSDIO_DEVICE_CTL, &err); | ||||
|  			devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; | ||||
| -			brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
 | ||||
| -					  devctl, &err);
 | ||||
| +			brcmf_sdiod_writeb(bus->sdiodev,
 | ||||
| +					   SBSDIO_DEVICE_CTL, devctl, &err);
 | ||||
|  			bus->clkstate = CLK_AVAIL; | ||||
|  		} | ||||
|  	} | ||||
| @@ -3347,31 +3347,31 @@ static void brcmf_sdio_sr_init(struct br
 | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
| -	val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err);
 | ||||
| +	val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error reading SBSDIO_FUNC1_WAKEUPCTRL\n"); | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
|  	val |= 1 << SBSDIO_FUNC1_WCTRL_HTWAIT_SHIFT; | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err);
 | ||||
| +	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_WAKEUPCTRL, val, &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error writing SBSDIO_FUNC1_WAKEUPCTRL\n"); | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
|  	/* Add CMD14 Support */ | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP,
 | ||||
| -			  (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT |
 | ||||
| -			   SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT),
 | ||||
| -			  &err);
 | ||||
| +	brcmf_sdiod_func0_wb(bus->sdiodev, SDIO_CCCR_BRCM_CARDCAP,
 | ||||
| +			     (SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT |
 | ||||
| +			      SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT),
 | ||||
| +			     &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error writing SDIO_CCCR_BRCM_CARDCAP\n"); | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -			  SBSDIO_FORCE_HT, &err);
 | ||||
| +	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +			   SBSDIO_FORCE_HT, &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error writing SBSDIO_FUNC1_CHIPCLKCSR\n"); | ||||
|  		return; | ||||
| @@ -3394,7 +3394,7 @@ static int brcmf_sdio_kso_init(struct br
 | ||||
|  	if (brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV)->rev < 12) | ||||
|  		return 0; | ||||
|   | ||||
| -	val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err);
 | ||||
| +	val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error reading SBSDIO_FUNC1_SLEEPCSR\n"); | ||||
|  		return err; | ||||
| @@ -3403,8 +3403,8 @@ static int brcmf_sdio_kso_init(struct br
 | ||||
|  	if (!(val & SBSDIO_FUNC1_SLEEPCSR_KSO_MASK)) { | ||||
|  		val |= (SBSDIO_FUNC1_SLEEPCSR_KSO_EN << | ||||
|  			SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT); | ||||
| -		brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
| -				  val, &err);
 | ||||
| +		brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
 | ||||
| +				   val, &err);
 | ||||
|  		if (err) { | ||||
|  			brcmf_err("error writing SBSDIO_FUNC1_SLEEPCSR\n"); | ||||
|  			return err; | ||||
| @@ -3565,9 +3565,9 @@ static void brcmf_sdio_bus_watchdog(stru
 | ||||
|  				u8 devpend; | ||||
|   | ||||
|  				sdio_claim_host(bus->sdiodev->func[1]); | ||||
| -				devpend = brcmf_sdiod_regrb(bus->sdiodev,
 | ||||
| -							    SDIO_CCCR_INTx,
 | ||||
| -							    NULL);
 | ||||
| +				devpend = brcmf_sdiod_func0_rb(bus->sdiodev,
 | ||||
| +							       SDIO_CCCR_INTx,
 | ||||
| +							       NULL);
 | ||||
|  				sdio_release_host(bus->sdiodev->func[1]); | ||||
|  				intstatus = devpend & (INTR_STATUS_FUNC1 | | ||||
|  						       INTR_STATUS_FUNC2); | ||||
| @@ -3705,12 +3705,12 @@ brcmf_sdio_drivestrengthinit(struct brcm
 | ||||
|  			} | ||||
|  		} | ||||
|  		addr = CORE_CC_REG(pmu->base, chipcontrol_addr); | ||||
| -		brcmf_sdiod_regwl(sdiodev, addr, 1, NULL);
 | ||||
| -		cc_data_temp = brcmf_sdiod_regrl(sdiodev, addr, NULL);
 | ||||
| +		brcmf_sdiod_writel(sdiodev, addr, 1, NULL);
 | ||||
| +		cc_data_temp = brcmf_sdiod_readl(sdiodev, addr, NULL);
 | ||||
|  		cc_data_temp &= ~str_mask; | ||||
|  		drivestrength_sel <<= str_shift; | ||||
|  		cc_data_temp |= drivestrength_sel; | ||||
| -		brcmf_sdiod_regwl(sdiodev, addr, cc_data_temp, NULL);
 | ||||
| +		brcmf_sdiod_writel(sdiodev, addr, cc_data_temp, NULL);
 | ||||
|   | ||||
|  		brcmf_dbg(INFO, "SDIO: %d mA (req=%d mA) drive strength selected, set to 0x%08x\n", | ||||
|  			  str_tab[i].strength, drivestrength, cc_data_temp); | ||||
| @@ -3725,7 +3725,7 @@ static int brcmf_sdio_buscoreprep(void *
 | ||||
|   | ||||
|  	/* Try forcing SDIO core to do ALPAvail request only */ | ||||
|  	clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_ALP_AVAIL_REQ; | ||||
| -	brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
 | ||||
| +	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error writing for HT off\n"); | ||||
|  		return err; | ||||
| @@ -3733,8 +3733,7 @@ static int brcmf_sdio_buscoreprep(void *
 | ||||
|   | ||||
|  	/* If register supported, wait for ALPAvail and then force ALP */ | ||||
|  	/* This may take up to 15 milliseconds */ | ||||
| -	clkval = brcmf_sdiod_regrb(sdiodev,
 | ||||
| -				   SBSDIO_FUNC1_CHIPCLKCSR, NULL);
 | ||||
| +	clkval = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, NULL);
 | ||||
|   | ||||
|  	if ((clkval & ~SBSDIO_AVBITS) != clkset) { | ||||
|  		brcmf_err("ChipClkCSR access: wrote 0x%02x read 0x%02x\n", | ||||
| @@ -3742,10 +3741,11 @@ static int brcmf_sdio_buscoreprep(void *
 | ||||
|  		return -EACCES; | ||||
|  	} | ||||
|   | ||||
| -	SPINWAIT(((clkval = brcmf_sdiod_regrb(sdiodev,
 | ||||
| -					      SBSDIO_FUNC1_CHIPCLKCSR, NULL)),
 | ||||
| -			!SBSDIO_ALPAV(clkval)),
 | ||||
| -			PMU_MAX_TRANSITION_DLY);
 | ||||
| +	SPINWAIT(((clkval = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +					      NULL)),
 | ||||
| +		 !SBSDIO_ALPAV(clkval)),
 | ||||
| +		 PMU_MAX_TRANSITION_DLY);
 | ||||
| +
 | ||||
|  	if (!SBSDIO_ALPAV(clkval)) { | ||||
|  		brcmf_err("timeout on ALPAV wait, clkval 0x%02x\n", | ||||
|  			  clkval); | ||||
| @@ -3753,11 +3753,11 @@ static int brcmf_sdio_buscoreprep(void *
 | ||||
|  	} | ||||
|   | ||||
|  	clkset = SBSDIO_FORCE_HW_CLKREQ_OFF | SBSDIO_FORCE_ALP; | ||||
| -	brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
 | ||||
| +	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, clkset, &err);
 | ||||
|  	udelay(65); | ||||
|   | ||||
|  	/* Also, disable the extra SDIO pull-ups */ | ||||
| -	brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL);
 | ||||
| +	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SDIOPULLUP, 0, NULL);
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -3772,7 +3772,7 @@ static void brcmf_sdio_buscore_activate(
 | ||||
|  	/* clear all interrupts */ | ||||
|  	core = brcmf_chip_get_core(chip, BCMA_CORE_SDIO_DEV); | ||||
|  	reg_addr = core->base + offsetof(struct sdpcmd_regs, intstatus); | ||||
| -	brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL);
 | ||||
| +	brcmf_sdiod_writel(sdiodev, reg_addr, 0xFFFFFFFF, NULL);
 | ||||
|   | ||||
|  	if (rstvec) | ||||
|  		/* Write reset vector to address 0 */ | ||||
| @@ -3785,7 +3785,7 @@ static u32 brcmf_sdio_buscore_read32(voi
 | ||||
|  	struct brcmf_sdio_dev *sdiodev = ctx; | ||||
|  	u32 val, rev; | ||||
|   | ||||
| -	val = brcmf_sdiod_regrl(sdiodev, addr, NULL);
 | ||||
| +	val = brcmf_sdiod_readl(sdiodev, addr, NULL);
 | ||||
|  	if ((sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 || | ||||
|  	     sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4339) && | ||||
|  	    addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) { | ||||
| @@ -3802,7 +3802,7 @@ static void brcmf_sdio_buscore_write32(v
 | ||||
|  { | ||||
|  	struct brcmf_sdio_dev *sdiodev = ctx; | ||||
|   | ||||
| -	brcmf_sdiod_regwl(sdiodev, addr, val, NULL);
 | ||||
| +	brcmf_sdiod_writel(sdiodev, addr, val, NULL);
 | ||||
|  } | ||||
|   | ||||
|  static const struct brcmf_buscore_ops brcmf_sdio_buscore_ops = { | ||||
| @@ -3826,18 +3826,18 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
 | ||||
|  	sdio_claim_host(sdiodev->func[1]); | ||||
|   | ||||
|  	pr_debug("F1 signature read @0x18000000=0x%4x\n", | ||||
| -		 brcmf_sdiod_regrl(sdiodev, SI_ENUM_BASE, NULL));
 | ||||
| +		 brcmf_sdiod_readl(sdiodev, SI_ENUM_BASE, NULL));
 | ||||
|   | ||||
|  	/* | ||||
|  	 * Force PLL off until brcmf_chip_attach() | ||||
|  	 * programs PLL control regs | ||||
|  	 */ | ||||
|   | ||||
| -	brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -			  BRCMF_INIT_CLKCTL1, &err);
 | ||||
| +	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, BRCMF_INIT_CLKCTL1,
 | ||||
| +			   &err);
 | ||||
|  	if (!err) | ||||
| -		clkctl = brcmf_sdiod_regrb(sdiodev,
 | ||||
| -					   SBSDIO_FUNC1_CHIPCLKCSR, &err);
 | ||||
| +		clkctl = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +					   &err);
 | ||||
|   | ||||
|  	if (err || ((clkctl & ~SBSDIO_AVBITS) != BRCMF_INIT_CLKCTL1)) { | ||||
|  		brcmf_err("ChipClkCSR access: err %d wrote 0x%02x read 0x%02x\n", | ||||
| @@ -3897,25 +3897,25 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
 | ||||
|  	brcmf_sdio_drivestrengthinit(sdiodev, bus->ci, drivestrength); | ||||
|   | ||||
|  	/* Set card control so an SDIO card reset does a WLAN backplane reset */ | ||||
| -	reg_val = brcmf_sdiod_regrb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err);
 | ||||
| +	reg_val = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, &err);
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
|  	reg_val |= SDIO_CCCR_BRCM_CARDCTRL_WLANRESET; | ||||
|   | ||||
| -	brcmf_sdiod_regwb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
 | ||||
| +	brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_CARDCTRL, reg_val, &err);
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
|  	/* set PMUControl so a backplane reset does PMU state reload */ | ||||
|  	reg_addr = CORE_CC_REG(brcmf_chip_get_pmu(bus->ci)->base, pmucontrol); | ||||
| -	reg_val = brcmf_sdiod_regrl(sdiodev, reg_addr, &err);
 | ||||
| +	reg_val = brcmf_sdiod_readl(sdiodev, reg_addr, &err);
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
|  	reg_val |= (BCMA_CC_PMU_CTL_RES_RELOAD << BCMA_CC_PMU_CTL_RES_SHIFT); | ||||
|   | ||||
| -	brcmf_sdiod_regwl(sdiodev, reg_addr, reg_val, &err);
 | ||||
| +	brcmf_sdiod_writel(sdiodev, reg_addr, reg_val, &err);
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
| @@ -4055,10 +4055,10 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		goto release; | ||||
|   | ||||
|  	/* Force clocks on backplane to be sure F2 interrupt propagates */ | ||||
| -	saveclk = brcmf_sdiod_regrb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, &err);
 | ||||
| +	saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, &err);
 | ||||
|  	if (!err) { | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -				  (saveclk | SBSDIO_FORCE_HT), &err);
 | ||||
| +		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +				   (saveclk | SBSDIO_FORCE_HT), &err);
 | ||||
|  	} | ||||
|  	if (err) { | ||||
|  		brcmf_err("Failed to force clock for F2: err %d\n", err); | ||||
| @@ -4080,7 +4080,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		w_sdreg32(bus, bus->hostintmask, | ||||
|  			  offsetof(struct sdpcmd_regs, hostintmask)); | ||||
|   | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_WATERMARK, 8, &err);
 | ||||
| +		brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err);
 | ||||
|  	} else { | ||||
|  		/* Disable F2 again */ | ||||
|  		sdio_disable_func(sdiodev->func[SDIO_FUNC_2]); | ||||
| @@ -4091,8 +4091,8 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		brcmf_sdio_sr_init(bus); | ||||
|  	} else { | ||||
|  		/* Restore previous clock setting */ | ||||
| -		brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| -				  saveclk, &err);
 | ||||
| +		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +				   saveclk, &err);
 | ||||
|  	} | ||||
|   | ||||
|  	if (err == 0) { | ||||
| @@ -4225,7 +4225,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	bus->rxflow = false; | ||||
|   | ||||
|  	/* Done with backplane-dependent accesses, can drop clock... */ | ||||
| -	brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
 | ||||
| +	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, 0, NULL);
 | ||||
|   | ||||
|  	sdio_release_host(bus->sdiodev->func[1]); | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -50,6 +50,7 @@
 | ||||
|  #define SBSDIO_NUM_FUNCTION		3 | ||||
|   | ||||
|  /* function 0 vendor specific CCCR registers */ | ||||
| +
 | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP			0xf0 | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	0x02 | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	0x04 | ||||
| @@ -131,8 +132,6 @@
 | ||||
|  /* with b15, maps to 32-bit SB access */ | ||||
|  #define SBSDIO_SB_ACCESS_2_4B_FLAG	0x08000 | ||||
|   | ||||
| -/* valid bits in SBSDIO_FUNC1_SBADDRxxx regs */
 | ||||
| -
 | ||||
|  /* Address bits from SBADDR regs */ | ||||
|  #define SBSDIO_SBWINDOW_MASK		0xffff8000 | ||||
|   | ||||
| @@ -293,13 +292,24 @@ struct sdpcmd_regs {
 | ||||
|  int brcmf_sdiod_intr_register(struct brcmf_sdio_dev *sdiodev); | ||||
|  void brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev); | ||||
|   | ||||
| -/* sdio device register access interface */
 | ||||
| -u8 brcmf_sdiod_regrb(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 | ||||
| -u32 brcmf_sdiod_regrl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 | ||||
| -void brcmf_sdiod_regwb(struct brcmf_sdio_dev *sdiodev, u32 addr, u8 data,
 | ||||
| -		       int *ret);
 | ||||
| -void brcmf_sdiod_regwl(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
 | ||||
| -		       int *ret);
 | ||||
| +/* SDIO device register access interface */
 | ||||
| +/* Accessors for SDIO Function 0 */
 | ||||
| +#define brcmf_sdiod_func0_rb(sdiodev, addr, r) \
 | ||||
| +	sdio_readb((sdiodev)->func[0], (addr), (r))
 | ||||
| +
 | ||||
| +#define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \
 | ||||
| +	sdio_writeb((sdiodev)->func[0], (v), (addr), (ret))
 | ||||
| +
 | ||||
| +/* Accessors for SDIO Function 1 */
 | ||||
| +#define brcmf_sdiod_readb(sdiodev, addr, r) \
 | ||||
| +	sdio_readb((sdiodev)->func[1], (addr), (r))
 | ||||
| +
 | ||||
| +#define brcmf_sdiod_writeb(sdiodev, addr, v, ret) \
 | ||||
| +	sdio_writeb((sdiodev)->func[1], (v), (addr), (ret))
 | ||||
| +
 | ||||
| +u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret);
 | ||||
| +void brcmf_sdiod_writel(struct brcmf_sdio_dev *sdiodev, u32 addr, u32 data,
 | ||||
| +			int *ret);
 | ||||
|   | ||||
|  /* Buffer transfer to/from device (client) core via cmd53. | ||||
|   *   fn:       function number | ||||
| @ -1,59 +0,0 @@ | ||||
| From eeef8a5da781e11746347b3cd9f1942be48ebaf0 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:30 +0100 | ||||
| Subject: [PATCH] brcmfmac: Tidy register definitions a little | ||||
| 
 | ||||
| Trivial tidy of register definitions. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |  4 ++-- | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/sdio.h   | 19 ++++++++++--------- | ||||
|  2 files changed, 12 insertions(+), 11 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -153,9 +153,9 @@ int brcmf_sdiod_intr_register(struct brc
 | ||||
|  		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, data, &ret); | ||||
|   | ||||
|  		/* redirect, configure and enable io for interrupt signal */ | ||||
| -		data = SDIO_SEPINT_MASK | SDIO_SEPINT_OE;
 | ||||
| +		data = SDIO_CCCR_BRCM_SEPINT_MASK | SDIO_CCCR_BRCM_SEPINT_OE;
 | ||||
|  		if (pdata->oob_irq_flags & IRQF_TRIGGER_HIGH) | ||||
| -			data |= SDIO_SEPINT_ACT_HI;
 | ||||
| +			data |= SDIO_CCCR_BRCM_SEPINT_ACT_HI;
 | ||||
|  		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_BRCM_SEPINT, | ||||
|  				     data, &ret); | ||||
|  		sdio_release_host(sdiodev->func[1]); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -52,16 +52,17 @@
 | ||||
|  /* function 0 vendor specific CCCR registers */ | ||||
|   | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP			0xf0 | ||||
| -#define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	0x02
 | ||||
| -#define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	0x04
 | ||||
| -#define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC	0x08
 | ||||
| -#define SDIO_CCCR_BRCM_CARDCTRL		0xf1
 | ||||
| -#define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET	0x02
 | ||||
| -#define SDIO_CCCR_BRCM_SEPINT			0xf2
 | ||||
| +#define SDIO_CCCR_BRCM_CARDCAP_CMD14_SUPPORT	BIT(1)
 | ||||
| +#define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	BIT(2)
 | ||||
| +#define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC	BIT(3)
 | ||||
| +
 | ||||
| +#define SDIO_CCCR_BRCM_CARDCTRL			0xf1
 | ||||
| +#define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET	BIT(1)
 | ||||
|   | ||||
| -#define  SDIO_SEPINT_MASK		0x01
 | ||||
| -#define  SDIO_SEPINT_OE			0x02
 | ||||
| -#define  SDIO_SEPINT_ACT_HI		0x04
 | ||||
| +#define SDIO_CCCR_BRCM_SEPINT			0xf2
 | ||||
| +#define SDIO_CCCR_BRCM_SEPINT_MASK		BIT(0)
 | ||||
| +#define SDIO_CCCR_BRCM_SEPINT_OE		BIT(1)
 | ||||
| +#define SDIO_CCCR_BRCM_SEPINT_ACT_HI		BIT(2)
 | ||||
|   | ||||
|  /* function 1 miscellaneous registers */ | ||||
|   | ||||
| @ -1,190 +0,0 @@ | ||||
| From a7c3aa1509e243a09c5b1660c8702d792ca76aed Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:31 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove brcmf_sdiod_addrprep() | ||||
| 
 | ||||
| This function has become trivial enough that it may as well be pushed into | ||||
| its callers, which has the side-benefit of clarifying what's going on. | ||||
| 
 | ||||
| Remove it, and rename brcmf_sdiod_set_sbaddr_window() to | ||||
| brcmf_sdiod_set_backplane_window() as it's easier to understand. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 84 ++++++++++++---------- | ||||
|  1 file changed, 46 insertions(+), 38 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -230,41 +230,25 @@ void brcmf_sdiod_change_state(struct brc
 | ||||
|  	sdiodev->state = state; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev,
 | ||||
| -					 u32 address)
 | ||||
| +static int brcmf_sdiod_set_backplane_window(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +					    u32 addr)
 | ||||
|  { | ||||
| +	u32 v, bar0 = addr & SBSDIO_SBWINDOW_MASK;
 | ||||
|  	int err = 0, i; | ||||
| -	u32 addr;
 | ||||
|   | ||||
| -	if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
 | ||||
| -		return -ENOMEDIUM;
 | ||||
| +	if (bar0 == sdiodev->sbwad)
 | ||||
| +		return 0;
 | ||||
|   | ||||
| -	addr = (address & SBSDIO_SBWINDOW_MASK) >> 8;
 | ||||
| +	v = bar0 >> 8;
 | ||||
|   | ||||
| -	for (i = 0 ; i < 3 && !err ; i++, addr >>= 8)
 | ||||
| +	for (i = 0 ; i < 3 && !err ; i++, v >>= 8)
 | ||||
|  		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_SBADDRLOW + i, | ||||
| -				   addr & 0xff, &err);
 | ||||
| -
 | ||||
| -	return err;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int brcmf_sdiod_addrprep(struct brcmf_sdio_dev *sdiodev, u32 *addr)
 | ||||
| -{
 | ||||
| -	uint bar0 = *addr & ~SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| -	int err = 0;
 | ||||
| -
 | ||||
| -	if (bar0 != sdiodev->sbwad) {
 | ||||
| -		err = brcmf_sdiod_set_sbaddr_window(sdiodev, bar0);
 | ||||
| -		if (err)
 | ||||
| -			return err;
 | ||||
| +				   v & 0xff, &err);
 | ||||
|   | ||||
| +	if (!err)
 | ||||
|  		sdiodev->sbwad = bar0; | ||||
| -	}
 | ||||
|   | ||||
| -	*addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| -	*addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| -
 | ||||
| -	return 0;
 | ||||
| +	return err;
 | ||||
|  } | ||||
|   | ||||
|  u32 brcmf_sdiod_readl(struct brcmf_sdio_dev *sdiodev, u32 addr, int *ret) | ||||
| @@ -272,11 +256,16 @@ u32 brcmf_sdiod_readl(struct brcmf_sdio_
 | ||||
|  	u32 data = 0; | ||||
|  	int retval; | ||||
|   | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
| +	if (retval)
 | ||||
| +		goto out;
 | ||||
| +
 | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
|   | ||||
| -	if (!retval)
 | ||||
| -		data = sdio_readl(sdiodev->func[1], addr, &retval);
 | ||||
| +	data = sdio_readl(sdiodev->func[1], addr, &retval);
 | ||||
|   | ||||
| +out:
 | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
|   | ||||
| @@ -288,11 +277,16 @@ void brcmf_sdiod_writel(struct brcmf_sdi
 | ||||
|  { | ||||
|  	int retval; | ||||
|   | ||||
| -	retval = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	retval = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
| +	if (retval)
 | ||||
| +		goto out;
 | ||||
|   | ||||
| -	if (!retval)
 | ||||
| -		sdio_writel(sdiodev->func[1], data, addr, &retval);
 | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
|   | ||||
| +	sdio_writel(sdiodev->func[1], data, addr, &retval);
 | ||||
| +
 | ||||
| +out:
 | ||||
|  	if (ret) | ||||
|  		*ret = retval; | ||||
|  } | ||||
| @@ -540,10 +534,13 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
|  	if (err) | ||||
|  		goto done; | ||||
|   | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| +
 | ||||
|  	err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt); | ||||
|   | ||||
|  done: | ||||
| @@ -561,10 +558,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", | ||||
|  		  addr, pktq->qlen); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
|  	if (err) | ||||
|  		goto done; | ||||
|   | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| +
 | ||||
|  	if (pktq->qlen == 1) | ||||
|  		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, | ||||
|  					    pktq->next); | ||||
| @@ -606,7 +606,12 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|   | ||||
|  	memcpy(mypkt->data, buf, nbytes); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
| +	if (err)
 | ||||
| +		return err;
 | ||||
| +
 | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
|   | ||||
|  	if (!err) | ||||
|  		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt); | ||||
| @@ -625,10 +630,13 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); | ||||
|   | ||||
| -	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | ||||
| +	err = brcmf_sdiod_set_backplane_window(sdiodev, addr);
 | ||||
|  	if (err) | ||||
|  		return err; | ||||
|   | ||||
| +	addr &= SBSDIO_SB_OFT_ADDR_MASK;
 | ||||
| +	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | ||||
| +
 | ||||
|  	if (pktq->qlen == 1 || !sdiodev->sg_support) { | ||||
|  		skb_queue_walk(pktq, skb) { | ||||
|  			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, | ||||
| @@ -673,7 +681,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  	/* Do the transfer(s) */ | ||||
|  	while (size) { | ||||
|  		/* Set the backplane window to include the start address */ | ||||
| -		err = brcmf_sdiod_set_sbaddr_window(sdiodev, address);
 | ||||
| +		err = brcmf_sdiod_set_backplane_window(sdiodev, address);
 | ||||
|  		if (err) | ||||
|  			break; | ||||
|   | ||||
| @@ -716,7 +724,7 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  	dev_kfree_skb(pkt); | ||||
|   | ||||
|  	/* Return the window to backplane enumeration space for core access */ | ||||
| -	if (brcmf_sdiod_set_sbaddr_window(sdiodev, sdiodev->sbwad))
 | ||||
| +	if (brcmf_sdiod_set_backplane_window(sdiodev, sdiodev->sbwad))
 | ||||
|  		brcmf_err("FAILED to set window back to 0x%x\n", | ||||
|  			  sdiodev->sbwad); | ||||
|   | ||||
| @ -1,32 +0,0 @@ | ||||
| From c900072bd6faff089aa4fb7b19136a2a0fe3baf0 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:32 +0100 | ||||
| Subject: [PATCH] brcmfmac: remove unnecessary call to | ||||
|  brcmf_sdiod_set_backplane_window() | ||||
| 
 | ||||
| All functions that might require the window address changing call | ||||
| brcmf_sdiod_set_backplane_window() prior to access. Thus resetting | ||||
| the window is not required. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| [arend: corrected the driver prefix in the subject] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 5 ----- | ||||
|  1 file changed, 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -723,11 +723,6 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|   | ||||
|  	dev_kfree_skb(pkt); | ||||
|   | ||||
| -	/* Return the window to backplane enumeration space for core access */
 | ||||
| -	if (brcmf_sdiod_set_backplane_window(sdiodev, sdiodev->sbwad))
 | ||||
| -		brcmf_err("FAILED to set window back to 0x%x\n",
 | ||||
| -			  sdiodev->sbwad);
 | ||||
| -
 | ||||
|  	sdio_release_host(sdiodev->func[1]); | ||||
|   | ||||
|  	return err; | ||||
| @ -1,134 +0,0 @@ | ||||
| From e4c05fc3c0a6c79376f72f17d08014477e962ada Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:33 +0100 | ||||
| Subject: [PATCH] brcmfmac: Cleanup offsetof() | ||||
| 
 | ||||
| Create a macro to make the code a bit more readable, whilst we're stuck | ||||
| with using struct element offsets as register offsets. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: rename macro to SD_REG] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 35 +++++++++------------- | ||||
|  1 file changed, 14 insertions(+), 21 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -161,6 +161,8 @@ struct rte_console {
 | ||||
|   | ||||
|  #define CORE_BUS_REG(base, field) \ | ||||
|  		(base + offsetof(struct sdpcmd_regs, field)) | ||||
| +#define SD_REG(field) \
 | ||||
| +		(offsetof(struct sdpcmd_regs, field))
 | ||||
|   | ||||
|  /* SDIO function 1 register CHIPCLKCSR */ | ||||
|  /* Force ALP request to backplane */ | ||||
| @@ -1087,12 +1089,10 @@ static u32 brcmf_sdio_hostmail(struct br
 | ||||
|  	brcmf_dbg(SDIO, "Enter\n"); | ||||
|   | ||||
|  	/* Read mailbox data and ack that we did so */ | ||||
| -	ret = r_sdreg32(bus, &hmb_data,
 | ||||
| -			offsetof(struct sdpcmd_regs, tohostmailboxdata));
 | ||||
| +	ret = r_sdreg32(bus, &hmb_data,	SD_REG(tohostmailboxdata));
 | ||||
|   | ||||
|  	if (ret == 0) | ||||
| -		w_sdreg32(bus, SMB_INT_ACK,
 | ||||
| -			  offsetof(struct sdpcmd_regs, tosbmailbox));
 | ||||
| +		w_sdreg32(bus, SMB_INT_ACK, SD_REG(tosbmailbox));
 | ||||
|  	bus->sdcnt.f1regdata += 2; | ||||
|   | ||||
|  	/* dongle indicates the firmware has halted/crashed */ | ||||
| @@ -1207,8 +1207,7 @@ static void brcmf_sdio_rxfail(struct brc
 | ||||
|   | ||||
|  	if (rtx) { | ||||
|  		bus->sdcnt.rxrtx++; | ||||
| -		err = w_sdreg32(bus, SMB_NAK,
 | ||||
| -				offsetof(struct sdpcmd_regs, tosbmailbox));
 | ||||
| +		err = w_sdreg32(bus, SMB_NAK, SD_REG(tosbmailbox));
 | ||||
|   | ||||
|  		bus->sdcnt.f1regdata++; | ||||
|  		if (err == 0) | ||||
| @@ -2333,9 +2332,7 @@ static uint brcmf_sdio_sendfromq(struct
 | ||||
|  		if (!bus->intr) { | ||||
|  			/* Check device status, signal pending interrupt */ | ||||
|  			sdio_claim_host(bus->sdiodev->func[1]); | ||||
| -			ret = r_sdreg32(bus, &intstatus,
 | ||||
| -					offsetof(struct sdpcmd_regs,
 | ||||
| -						 intstatus));
 | ||||
| +			ret = r_sdreg32(bus, &intstatus, SD_REG(intstatus));
 | ||||
|  			sdio_release_host(bus->sdiodev->func[1]); | ||||
|  			bus->sdcnt.f2txdata++; | ||||
|  			if (ret != 0) | ||||
| @@ -2441,7 +2438,7 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|  		brcmf_sdio_bus_sleep(bus, false, false); | ||||
|   | ||||
|  		/* Disable and clear interrupts at the chip level also */ | ||||
| -		w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask));
 | ||||
| +		w_sdreg32(bus, 0, SD_REG(hostintmask));
 | ||||
|  		local_hostintmask = bus->hostintmask; | ||||
|  		bus->hostintmask = 0; | ||||
|   | ||||
| @@ -2460,8 +2457,7 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|  		sdio_disable_func(sdiodev->func[SDIO_FUNC_2]); | ||||
|   | ||||
|  		/* Clear any pending interrupts now that F2 is disabled */ | ||||
| -		w_sdreg32(bus, local_hostintmask,
 | ||||
| -			  offsetof(struct sdpcmd_regs, intstatus));
 | ||||
| +		w_sdreg32(bus, local_hostintmask, SD_REG(intstatus));
 | ||||
|   | ||||
|  		sdio_release_host(sdiodev->func[1]); | ||||
|  	} | ||||
| @@ -2507,7 +2503,7 @@ static int brcmf_sdio_intr_rstatus(struc
 | ||||
|  	int ret; | ||||
|   | ||||
|  	buscore = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV); | ||||
| -	addr = buscore->base + offsetof(struct sdpcmd_regs, intstatus);
 | ||||
| +	addr = buscore->base + SD_REG(intstatus);
 | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret); | ||||
|  	bus->sdcnt.f1regdata++; | ||||
| @@ -2584,11 +2580,9 @@ static void brcmf_sdio_dpc(struct brcmf_
 | ||||
|  	 */ | ||||
|  	if (intstatus & I_HMB_FC_CHANGE) { | ||||
|  		intstatus &= ~I_HMB_FC_CHANGE; | ||||
| -		err = w_sdreg32(bus, I_HMB_FC_CHANGE,
 | ||||
| -				offsetof(struct sdpcmd_regs, intstatus));
 | ||||
| +		err = w_sdreg32(bus, I_HMB_FC_CHANGE, SD_REG(intstatus));
 | ||||
|   | ||||
| -		err = r_sdreg32(bus, &newstatus,
 | ||||
| -				offsetof(struct sdpcmd_regs, intstatus));
 | ||||
| +		err = r_sdreg32(bus, &newstatus, SD_REG(intstatus));
 | ||||
|  		bus->sdcnt.f1regdata += 2; | ||||
|  		atomic_set(&bus->fcstate, | ||||
|  			   !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE))); | ||||
| @@ -3771,7 +3765,7 @@ static void brcmf_sdio_buscore_activate(
 | ||||
|   | ||||
|  	/* clear all interrupts */ | ||||
|  	core = brcmf_chip_get_core(chip, BCMA_CORE_SDIO_DEV); | ||||
| -	reg_addr = core->base + offsetof(struct sdpcmd_regs, intstatus);
 | ||||
| +	reg_addr = core->base + SD_REG(intstatus);
 | ||||
|  	brcmf_sdiod_writel(sdiodev, reg_addr, 0xFFFFFFFF, NULL); | ||||
|   | ||||
|  	if (rstvec) | ||||
| @@ -4067,7 +4061,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|   | ||||
|  	/* Enable function 2 (frame transfers) */ | ||||
|  	w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, | ||||
| -		  offsetof(struct sdpcmd_regs, tosbmailboxdata));
 | ||||
| +		  SD_REG(tosbmailboxdata));
 | ||||
|  	err = sdio_enable_func(sdiodev->func[SDIO_FUNC_2]); | ||||
|   | ||||
|   | ||||
| @@ -4077,8 +4071,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	if (!err) { | ||||
|  		/* Set up the interrupt mask and enable interrupts */ | ||||
|  		bus->hostintmask = HOSTINTMASK; | ||||
| -		w_sdreg32(bus, bus->hostintmask,
 | ||||
| -			  offsetof(struct sdpcmd_regs, hostintmask));
 | ||||
| +		w_sdreg32(bus, bus->hostintmask, SD_REG(hostintmask));
 | ||||
|   | ||||
|  		brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err); | ||||
|  	} else { | ||||
| @ -1,26 +0,0 @@ | ||||
| From 5cfe38f1f8d3c6b98e15b8cfde05028a3c79930b Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:34 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove unused macro. | ||||
| 
 | ||||
| This macro is used exactly nowhere in the code. Delete it. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 -- | ||||
|  1 file changed, 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -159,8 +159,6 @@ struct rte_console {
 | ||||
|  /* manfid tuple length, include tuple, link bytes */ | ||||
|  #define SBSDIO_CIS_MANFID_TUPLE_LEN	6 | ||||
|   | ||||
| -#define CORE_BUS_REG(base, field) \
 | ||||
| -		(base + offsetof(struct sdpcmd_regs, field))
 | ||||
|  #define SD_REG(field) \ | ||||
|  		(offsetof(struct sdpcmd_regs, field)) | ||||
|   | ||||
| @ -1,128 +0,0 @@ | ||||
| From 21a10846d09db3c5e3bdfb0be0fc7aa9fdc7000a Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Fri, 8 Dec 2017 13:10:35 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove repeated calls to brcmf_chip_get_core() | ||||
| 
 | ||||
| There is no need to repeatdly call brcmf_chip_get_core(), which | ||||
| traverses a list of cores every time its called (including during | ||||
| register access code!). | ||||
| 
 | ||||
| Call it once, and store a pointer to the core structure. The existing | ||||
| code does nto keep track of users of the cores anyway, and even so, this | ||||
| will allow for easier refcounting in future. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 25 +++++++++++++--------- | ||||
|  1 file changed, 15 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -436,6 +436,7 @@ struct brcmf_sdio_count {
 | ||||
|  struct brcmf_sdio { | ||||
|  	struct brcmf_sdio_dev *sdiodev;	/* sdio device handler */ | ||||
|  	struct brcmf_chip *ci;	/* Chip info struct */ | ||||
| +	struct brcmf_core *sdio_core; /* sdio core info struct */
 | ||||
|   | ||||
|  	u32 hostintmask;	/* Copy of Host Interrupt Mask */ | ||||
|  	atomic_t intstatus;	/* Intstatus bits (events) pending */ | ||||
| @@ -665,10 +666,9 @@ static bool data_ok(struct brcmf_sdio *b
 | ||||
|   */ | ||||
|  static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset) | ||||
|  { | ||||
| -	struct brcmf_core *core;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	int ret; | ||||
|   | ||||
| -	core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
 | ||||
|  	*regvar = brcmf_sdiod_readl(bus->sdiodev, core->base + offset, &ret); | ||||
|   | ||||
|  	return ret; | ||||
| @@ -676,10 +676,9 @@ static int r_sdreg32(struct brcmf_sdio *
 | ||||
|   | ||||
|  static int w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset) | ||||
|  { | ||||
| -	struct brcmf_core *core;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	int ret; | ||||
|   | ||||
| -	core = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
 | ||||
|  	brcmf_sdiod_writel(bus->sdiodev, core->base + reg_offset, regval, &ret); | ||||
|   | ||||
|  	return ret; | ||||
| @@ -2495,12 +2494,11 @@ static inline void brcmf_sdio_clrintr(st
 | ||||
|   | ||||
|  static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | ||||
|  { | ||||
| -	struct brcmf_core *buscore;
 | ||||
| +	struct brcmf_core *buscore = bus->sdio_core;
 | ||||
|  	u32 addr; | ||||
|  	unsigned long val; | ||||
|  	int ret; | ||||
|   | ||||
| -	buscore = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
 | ||||
|  	addr = buscore->base + SD_REG(intstatus); | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret); | ||||
| @@ -3377,13 +3375,14 @@ static void brcmf_sdio_sr_init(struct br
 | ||||
|  /* enable KSO bit */ | ||||
|  static int brcmf_sdio_kso_init(struct brcmf_sdio *bus) | ||||
|  { | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	u8 val; | ||||
|  	int err = 0; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
|  	/* KSO bit added in SDIO core rev 12 */ | ||||
| -	if (brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV)->rev < 12)
 | ||||
| +	if (core->rev < 12)
 | ||||
|  		return 0; | ||||
|   | ||||
|  	val = brcmf_sdiod_readb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, &err); | ||||
| @@ -3412,6 +3411,7 @@ static int brcmf_sdio_bus_preinit(struct
 | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
|  	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||||
|  	struct brcmf_sdio *bus = sdiodev->bus; | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	uint pad_size; | ||||
|  	u32 value; | ||||
|  	int err; | ||||
| @@ -3420,7 +3420,7 @@ static int brcmf_sdio_bus_preinit(struct
 | ||||
|  	 * a device perspective, ie. bus:txglom affects the | ||||
|  	 * bus transfers from device to host. | ||||
|  	 */ | ||||
| -	if (brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV)->rev < 12) {
 | ||||
| +	if (core->rev < 12) {
 | ||||
|  		/* for sdio core rev < 12, disable txgloming */ | ||||
|  		value = 0; | ||||
|  		err = brcmf_iovar_data_set(dev, "bus:txglom", &value, | ||||
| @@ -3758,11 +3758,10 @@ static void brcmf_sdio_buscore_activate(
 | ||||
|  					u32 rstvec) | ||||
|  { | ||||
|  	struct brcmf_sdio_dev *sdiodev = ctx; | ||||
| -	struct brcmf_core *core;
 | ||||
| +	struct brcmf_core *core = sdiodev->bus->sdio_core;
 | ||||
|  	u32 reg_addr; | ||||
|   | ||||
|  	/* clear all interrupts */ | ||||
| -	core = brcmf_chip_get_core(chip, BCMA_CORE_SDIO_DEV);
 | ||||
|  	reg_addr = core->base + SD_REG(intstatus); | ||||
|  	brcmf_sdiod_writel(sdiodev, reg_addr, 0xFFFFFFFF, NULL); | ||||
|   | ||||
| @@ -3843,6 +3842,12 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
 | ||||
|  		bus->ci = NULL; | ||||
|  		goto fail; | ||||
|  	} | ||||
| +
 | ||||
| +	/* Pick up the SDIO core info struct from chip.c */
 | ||||
| +	bus->sdio_core   = brcmf_chip_get_core(bus->ci, BCMA_CORE_SDIO_DEV);
 | ||||
| +	if (!bus->sdio_core)
 | ||||
| +		goto fail;
 | ||||
| +
 | ||||
|  	sdiodev->settings = brcmf_get_module_param(sdiodev->dev, | ||||
|  						   BRCMF_BUSTYPE_SDIO, | ||||
|  						   bus->ci->chip, | ||||
| @ -1,44 +0,0 @@ | ||||
| From 7762bb134e3b40e8ee2611365775b7432190a9c7 Mon Sep 17 00:00:00 2001 | ||||
| From: Wright Feng <wright.feng@cypress.com> | ||||
| Date: Mon, 11 Dec 2017 15:38:21 +0800 | ||||
| Subject: [PATCH] brcmfmac: enlarge buffer size of caps to 512 bytes | ||||
| 
 | ||||
| The buffer size of return of cap iovar is greater than 256 bytes in some | ||||
| firmwares. For instance, the return size of cap iovar is 271 bytes in 4373 | ||||
| 13.10.246.79 firmare. It makes feature capability parsing failed because | ||||
| caps buffer is default value. | ||||
| So we enlarge caps buffer size to 512 bytes and add the error print for | ||||
| cap iovar error. | ||||
| 
 | ||||
| Signed-off-by: Wright Feng <wright.feng@cypress.com> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 12 +++++++++--- | ||||
|  1 file changed, 9 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| @@ -130,13 +130,19 @@ static void brcmf_feat_iovar_data_set(st
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| +#define MAX_CAPS_BUFFER_SIZE	512
 | ||||
|  static void brcmf_feat_firmware_capabilities(struct brcmf_if *ifp) | ||||
|  { | ||||
| -	char caps[256];
 | ||||
| +	char caps[MAX_CAPS_BUFFER_SIZE];
 | ||||
|  	enum brcmf_feat_id id; | ||||
| -	int i;
 | ||||
| +	int i, err;
 | ||||
| +
 | ||||
| +	err = brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
 | ||||
| +	if (err) {
 | ||||
| +		brcmf_err("could not get firmware cap (%d)\n", err);
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
|   | ||||
| -	brcmf_fil_iovar_data_get(ifp, "cap", caps, sizeof(caps));
 | ||||
|  	brcmf_dbg(INFO, "[ %s]\n", caps); | ||||
|   | ||||
|  	for (i = 0; i < ARRAY_SIZE(brcmf_fwcap_map); i++) { | ||||
| @ -1,227 +0,0 @@ | ||||
| From 3d110df8f74781354051e4bb1e3e97fa368b2f80 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:07 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove {r,w}_sdreg32 | ||||
| 
 | ||||
| Remove yet another IO function from the code and replace with one | ||||
| that already exists. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: keep address calculation, ie. (base + offset) in one line] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 88 +++++++++++----------- | ||||
|  1 file changed, 42 insertions(+), 46 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -660,30 +660,6 @@ static bool data_ok(struct brcmf_sdio *b
 | ||||
|  	       ((u8)(bus->tx_max - bus->tx_seq) & 0x80) == 0; | ||||
|  } | ||||
|   | ||||
| -/*
 | ||||
| - * Reads a register in the SDIO hardware block. This block occupies a series of
 | ||||
| - * adresses on the 32 bit backplane bus.
 | ||||
| - */
 | ||||
| -static int r_sdreg32(struct brcmf_sdio *bus, u32 *regvar, u32 offset)
 | ||||
| -{
 | ||||
| -	struct brcmf_core *core = bus->sdio_core;
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	*regvar = brcmf_sdiod_readl(bus->sdiodev, core->base + offset, &ret);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -static int w_sdreg32(struct brcmf_sdio *bus, u32 regval, u32 reg_offset)
 | ||||
| -{
 | ||||
| -	struct brcmf_core *core = bus->sdio_core;
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	brcmf_sdiod_writel(bus->sdiodev, core->base + reg_offset, regval, &ret);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static int | ||||
|  brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on) | ||||
|  { | ||||
| @@ -1078,6 +1054,8 @@ static void brcmf_sdio_get_console_addr(
 | ||||
|   | ||||
|  static u32 brcmf_sdio_hostmail(struct brcmf_sdio *bus) | ||||
|  { | ||||
| +	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	u32 intstatus = 0; | ||||
|  	u32 hmb_data; | ||||
|  	u8 fcbits; | ||||
| @@ -1086,10 +1064,14 @@ static u32 brcmf_sdio_hostmail(struct br
 | ||||
|  	brcmf_dbg(SDIO, "Enter\n"); | ||||
|   | ||||
|  	/* Read mailbox data and ack that we did so */ | ||||
| -	ret = r_sdreg32(bus, &hmb_data,	SD_REG(tohostmailboxdata));
 | ||||
| +	hmb_data = brcmf_sdiod_readl(sdiod,
 | ||||
| +				     core->base + SD_REG(tohostmailboxdata),
 | ||||
| +				     &ret);
 | ||||
| +
 | ||||
| +	if (!ret)
 | ||||
| +		brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailbox),
 | ||||
| +				   SMB_INT_ACK, &ret);
 | ||||
|   | ||||
| -	if (ret == 0)
 | ||||
| -		w_sdreg32(bus, SMB_INT_ACK, SD_REG(tosbmailbox));
 | ||||
|  	bus->sdcnt.f1regdata += 2; | ||||
|   | ||||
|  	/* dongle indicates the firmware has halted/crashed */ | ||||
| @@ -1163,6 +1145,8 @@ static u32 brcmf_sdio_hostmail(struct br
 | ||||
|   | ||||
|  static void brcmf_sdio_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx) | ||||
|  { | ||||
| +	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	uint retries = 0; | ||||
|  	u16 lastrbc; | ||||
|  	u8 hi, lo; | ||||
| @@ -1204,7 +1188,8 @@ static void brcmf_sdio_rxfail(struct brc
 | ||||
|   | ||||
|  	if (rtx) { | ||||
|  		bus->sdcnt.rxrtx++; | ||||
| -		err = w_sdreg32(bus, SMB_NAK, SD_REG(tosbmailbox));
 | ||||
| +		brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailbox),
 | ||||
| +				   SMB_NAK, &err);
 | ||||
|   | ||||
|  		bus->sdcnt.f1regdata++; | ||||
|  		if (err == 0) | ||||
| @@ -2291,6 +2276,7 @@ static uint brcmf_sdio_sendfromq(struct
 | ||||
|  { | ||||
|  	struct sk_buff *pkt; | ||||
|  	struct sk_buff_head pktq; | ||||
| +	u32 intstat_addr = bus->sdio_core->base + SD_REG(intstatus);
 | ||||
|  	u32 intstatus = 0; | ||||
|  	int ret = 0, prec_out, i; | ||||
|  	uint cnt = 0; | ||||
| @@ -2329,7 +2315,8 @@ static uint brcmf_sdio_sendfromq(struct
 | ||||
|  		if (!bus->intr) { | ||||
|  			/* Check device status, signal pending interrupt */ | ||||
|  			sdio_claim_host(bus->sdiodev->func[1]); | ||||
| -			ret = r_sdreg32(bus, &intstatus, SD_REG(intstatus));
 | ||||
| +			intstatus = brcmf_sdiod_readl(bus->sdiodev,
 | ||||
| +						      intstat_addr, &ret);
 | ||||
|  			sdio_release_host(bus->sdiodev->func[1]); | ||||
|  			bus->sdcnt.f2txdata++; | ||||
|  			if (ret != 0) | ||||
| @@ -2413,12 +2400,13 @@ static int brcmf_sdio_tx_ctrlframe(struc
 | ||||
|   | ||||
|  static void brcmf_sdio_bus_stop(struct device *dev) | ||||
|  { | ||||
| -	u32 local_hostintmask;
 | ||||
| -	u8 saveclk;
 | ||||
| -	int err;
 | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
|  	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; | ||||
|  	struct brcmf_sdio *bus = sdiodev->bus; | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
| +	u32 local_hostintmask;
 | ||||
| +	u8 saveclk;
 | ||||
| +	int err;
 | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
| @@ -2435,7 +2423,9 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|  		brcmf_sdio_bus_sleep(bus, false, false); | ||||
|   | ||||
|  		/* Disable and clear interrupts at the chip level also */ | ||||
| -		w_sdreg32(bus, 0, SD_REG(hostintmask));
 | ||||
| +		brcmf_sdiod_writel(sdiodev, core->base + SD_REG(hostintmask),
 | ||||
| +				   0, NULL);
 | ||||
| +
 | ||||
|  		local_hostintmask = bus->hostintmask; | ||||
|  		bus->hostintmask = 0; | ||||
|   | ||||
| @@ -2454,7 +2444,8 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|  		sdio_disable_func(sdiodev->func[SDIO_FUNC_2]); | ||||
|   | ||||
|  		/* Clear any pending interrupts now that F2 is disabled */ | ||||
| -		w_sdreg32(bus, local_hostintmask, SD_REG(intstatus));
 | ||||
| +		brcmf_sdiod_writel(sdiodev, core->base + SD_REG(intstatus),
 | ||||
| +				   local_hostintmask, NULL);
 | ||||
|   | ||||
|  		sdio_release_host(sdiodev->func[1]); | ||||
|  	} | ||||
| @@ -2521,7 +2512,9 @@ static int brcmf_sdio_intr_rstatus(struc
 | ||||
|   | ||||
|  static void brcmf_sdio_dpc(struct brcmf_sdio *bus) | ||||
|  { | ||||
| +	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
 | ||||
|  	u32 newstatus = 0; | ||||
| +	u32 intstat_addr = bus->sdio_core->base + SD_REG(intstatus);
 | ||||
|  	unsigned long intstatus; | ||||
|  	uint txlimit = bus->txbound;	/* Tx frames to send before resched */ | ||||
|  	uint framecnt;			/* Temporary counter of tx/rx frames */ | ||||
| @@ -2576,9 +2569,10 @@ static void brcmf_sdio_dpc(struct brcmf_
 | ||||
|  	 */ | ||||
|  	if (intstatus & I_HMB_FC_CHANGE) { | ||||
|  		intstatus &= ~I_HMB_FC_CHANGE; | ||||
| -		err = w_sdreg32(bus, I_HMB_FC_CHANGE, SD_REG(intstatus));
 | ||||
| +		brcmf_sdiod_writel(sdiod, intstat_addr, I_HMB_FC_CHANGE, &err);
 | ||||
| +
 | ||||
| +		newstatus = brcmf_sdiod_readl(sdiod, intstat_addr, &err);
 | ||||
|   | ||||
| -		err = r_sdreg32(bus, &newstatus, SD_REG(intstatus));
 | ||||
|  		bus->sdcnt.f1regdata += 2; | ||||
|  		atomic_set(&bus->fcstate, | ||||
|  			   !!(newstatus & (I_HMB_FC_STATE | I_HMB_FC_CHANGE))); | ||||
| @@ -4017,22 +4011,21 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  					 const struct firmware *code, | ||||
|  					 void *nvram, u32 nvram_len) | ||||
|  { | ||||
| -	struct brcmf_bus *bus_if;
 | ||||
| -	struct brcmf_sdio_dev *sdiodev;
 | ||||
| -	struct brcmf_sdio *bus;
 | ||||
| +	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
 | ||||
| +	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
 | ||||
| +	struct brcmf_sdio *bus = sdiodev->bus;
 | ||||
| +	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	u8 saveclk; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err); | ||||
| -	bus_if = dev_get_drvdata(dev);
 | ||||
| -	sdiodev = bus_if->bus_priv.sdio;
 | ||||
| +
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
|  	if (!bus_if->drvr) | ||||
|  		return; | ||||
|   | ||||
| -	bus = sdiodev->bus;
 | ||||
| -
 | ||||
|  	/* try to download image and nvram to the dongle */ | ||||
|  	bus->alp_only = true; | ||||
|  	err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len); | ||||
| @@ -4063,8 +4056,9 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	} | ||||
|   | ||||
|  	/* Enable function 2 (frame transfers) */ | ||||
| -	w_sdreg32(bus, SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT,
 | ||||
| -		  SD_REG(tosbmailboxdata));
 | ||||
| +	brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata),
 | ||||
| +			   SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL);
 | ||||
| +
 | ||||
|  	err = sdio_enable_func(sdiodev->func[SDIO_FUNC_2]); | ||||
|   | ||||
|   | ||||
| @@ -4074,7 +4068,9 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	if (!err) { | ||||
|  		/* Set up the interrupt mask and enable interrupts */ | ||||
|  		bus->hostintmask = HOSTINTMASK; | ||||
| -		w_sdreg32(bus, bus->hostintmask, SD_REG(hostintmask));
 | ||||
| +		brcmf_sdiod_writel(sdiod, core->base + SD_REG(hostintmask),
 | ||||
| +				   bus->hostintmask, NULL);
 | ||||
| +
 | ||||
|   | ||||
|  		brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err); | ||||
|  	} else { | ||||
| @ -1,33 +0,0 @@ | ||||
| From dbda7dacb79a377e8ed9d38ce0e4a58b70aa9060 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 19 Dec 2017 13:47:08 +0100 | ||||
| Subject: [PATCH] brcmfmac: Rename buscore to core for consistency | ||||
| 
 | ||||
| Avoid confusion with unrelated _buscore labels. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: only do the rename] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -2485,12 +2485,12 @@ static inline void brcmf_sdio_clrintr(st
 | ||||
|   | ||||
|  static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus) | ||||
|  { | ||||
| -	struct brcmf_core *buscore = bus->sdio_core;
 | ||||
| +	struct brcmf_core *core = bus->sdio_core;
 | ||||
|  	u32 addr; | ||||
|  	unsigned long val; | ||||
|  	int ret; | ||||
|   | ||||
| -	addr = buscore->base + SD_REG(intstatus);
 | ||||
| +	addr = core->base + SD_REG(intstatus);
 | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(bus->sdiodev, addr, &ret); | ||||
|  	bus->sdcnt.f1regdata++; | ||||
| @ -1,82 +0,0 @@ | ||||
| From 874bb8e49b7c6368f8ff9f2566c7bd06a2249be0 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:09 +0100 | ||||
| Subject: [PATCH] brcmfmac: stabilise the value of ->sbwad in use for some xfer | ||||
|  routines. | ||||
| 
 | ||||
| The IO functions operate within the Chipcommon IO window. Explicitly | ||||
| set this, rather than relying on the last initialisation IO access to | ||||
| leave it set to the right value by chance. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 8 ++++---- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   | 5 +++++ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h   | 1 + | ||||
|  3 files changed, 10 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -529,7 +529,7 @@ int brcmf_sdiod_recv_buf(struct brcmf_sd
 | ||||
|   | ||||
|  int brcmf_sdiod_recv_pkt(struct brcmf_sdio_dev *sdiodev, struct sk_buff *pkt) | ||||
|  { | ||||
| -	u32 addr = sdiodev->sbwad;
 | ||||
| +	u32 addr = sdiodev->cc_core->base;
 | ||||
|  	int err = 0; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pkt->len); | ||||
| @@ -552,7 +552,7 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  { | ||||
|  	struct sk_buff *glom_skb = NULL; | ||||
|  	struct sk_buff *skb; | ||||
| -	u32 addr = sdiodev->sbwad;
 | ||||
| +	u32 addr = sdiodev->cc_core->base;
 | ||||
|  	int err = 0; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", | ||||
| @@ -593,7 +593,7 @@ done:
 | ||||
|  int brcmf_sdiod_send_buf(struct brcmf_sdio_dev *sdiodev, u8 *buf, uint nbytes) | ||||
|  { | ||||
|  	struct sk_buff *mypkt; | ||||
| -	u32 addr = sdiodev->sbwad;
 | ||||
| +	u32 addr = sdiodev->cc_core->base;
 | ||||
|  	int err; | ||||
|   | ||||
|  	mypkt = brcmu_pkt_buf_get_skb(nbytes); | ||||
| @@ -625,7 +625,7 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|  			 struct sk_buff_head *pktq) | ||||
|  { | ||||
|  	struct sk_buff *skb; | ||||
| -	u32 addr = sdiodev->sbwad;
 | ||||
| +	u32 addr = sdiodev->cc_core->base;
 | ||||
|  	int err; | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "addr = 0x%x, size = %d\n", addr, pktq->qlen); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3842,6 +3842,11 @@ brcmf_sdio_probe_attach(struct brcmf_sdi
 | ||||
|  	if (!bus->sdio_core) | ||||
|  		goto fail; | ||||
|   | ||||
| +	/* Pick up the CHIPCOMMON core info struct, for bulk IO in bcmsdh.c */
 | ||||
| +	sdiodev->cc_core = brcmf_chip_get_core(bus->ci, BCMA_CORE_CHIPCOMMON);
 | ||||
| +	if (!sdiodev->cc_core)
 | ||||
| +		goto fail;
 | ||||
| +
 | ||||
|  	sdiodev->settings = brcmf_get_module_param(sdiodev->dev, | ||||
|  						   BRCMF_BUSTYPE_SDIO, | ||||
|  						   bus->ci->chip, | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -178,6 +178,7 @@ struct brcmf_sdio_dev {
 | ||||
|  	struct sdio_func *func[SDIO_MAX_FUNCS]; | ||||
|  	u8 num_funcs;			/* Supported funcs on client */ | ||||
|  	u32 sbwad;			/* Save backplane window address */ | ||||
| +	struct brcmf_core *cc_core;	/* chipcommon core info struct */
 | ||||
|  	struct brcmf_sdio *bus; | ||||
|  	struct device *dev; | ||||
|  	struct brcmf_bus *bus_if; | ||||
| @ -1,45 +0,0 @@ | ||||
| From 508422f3695bf66f7b85fb4723c22f5166003ec6 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:10 +0100 | ||||
| Subject: [PATCH] brcmfmac: Correctly handle accesses to SDIO func0 | ||||
| 
 | ||||
| Rather than workaround the restrictions on func0 addressing in the | ||||
| driver, set MMC_QUIRK_LENIENT_FN0 | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 4 ++++ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h   | 4 ++-- | ||||
|  2 files changed, 6 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -995,6 +995,10 @@ static int brcmf_ops_sdio_probe(struct s
 | ||||
|  	brcmf_dbg(SDIO, "Function#: %d\n", func->num); | ||||
|   | ||||
|  	dev = &func->dev; | ||||
| +
 | ||||
| +	/* Set MMC_QUIRK_LENIENT_FN0 for this card */
 | ||||
| +	func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
 | ||||
| +
 | ||||
|  	/* prohibit ACPI power management for this device */ | ||||
|  	brcmf_sdiod_acpi_set_power_manageable(dev, 0); | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -297,10 +297,10 @@ void brcmf_sdiod_intr_unregister(struct
 | ||||
|  /* SDIO device register access interface */ | ||||
|  /* Accessors for SDIO Function 0 */ | ||||
|  #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \ | ||||
| -	sdio_readb((sdiodev)->func[0], (addr), (r))
 | ||||
| +	sdio_f0_readb((sdiodev)->func[0], (addr), (r))
 | ||||
|   | ||||
|  #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \ | ||||
| -	sdio_writeb((sdiodev)->func[0], (v), (addr), (ret))
 | ||||
| +	sdio_f0_writeb((sdiodev)->func[0], (v), (addr), (ret))
 | ||||
|   | ||||
|  /* Accessors for SDIO Function 1 */ | ||||
|  #define brcmf_sdiod_readb(sdiodev, addr, r) \ | ||||
| @ -1,111 +0,0 @@ | ||||
| From 99d7b6fdfc8c24052c92c720330d31ca1332f996 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:11 +0100 | ||||
| Subject: [PATCH] brcmfmac: Remove func0 from function array | ||||
| 
 | ||||
| func0 is not provided by the mmc stack as a function when probing. | ||||
| Instead providing specific access functions to read/write it. | ||||
| 
 | ||||
| This prepares for a patch to remove the actual array entry itself. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: rephrased the commit message] | ||||
| [arend: removed unrelated comment for which separate patch is warranted] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |  5 +---- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c   |  7 ++++--- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h   | 13 ++++++------- | ||||
|  3 files changed, 11 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -1022,8 +1022,7 @@ static int brcmf_ops_sdio_probe(struct s
 | ||||
|  	/* store refs to functions used. mmc_card does | ||||
|  	 * not hold the F0 function pointer. | ||||
|  	 */ | ||||
| -	sdiodev->func[0] = kmemdup(func, sizeof(*func), GFP_KERNEL);
 | ||||
| -	sdiodev->func[0]->num = 0;
 | ||||
| +	sdiodev->func[0] = NULL;
 | ||||
|  	sdiodev->func[1] = func->card->sdio_func[0]; | ||||
|  	sdiodev->func[2] = func; | ||||
|   | ||||
| @@ -1049,7 +1048,6 @@ static int brcmf_ops_sdio_probe(struct s
 | ||||
|  fail: | ||||
|  	dev_set_drvdata(&func->dev, NULL); | ||||
|  	dev_set_drvdata(&sdiodev->func[1]->dev, NULL); | ||||
| -	kfree(sdiodev->func[0]);
 | ||||
|  	kfree(sdiodev); | ||||
|  	kfree(bus_if); | ||||
|  	return err; | ||||
| @@ -1082,7 +1080,6 @@ static void brcmf_ops_sdio_remove(struct
 | ||||
|  		dev_set_drvdata(&sdiodev->func[2]->dev, NULL); | ||||
|   | ||||
|  		kfree(bus_if); | ||||
| -		kfree(sdiodev->func[0]);
 | ||||
|  		kfree(sdiodev); | ||||
|  	} | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3771,9 +3771,10 @@ static u32 brcmf_sdio_buscore_read32(voi
 | ||||
|  	u32 val, rev; | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(sdiodev, addr, NULL); | ||||
| -	if ((sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 ||
 | ||||
| -	     sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4339) &&
 | ||||
| -	    addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) {
 | ||||
| +
 | ||||
| +	if ((sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 ||
 | ||||
| +	     sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4339) &&
 | ||||
| +	     addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) {
 | ||||
|  		rev = (val & CID_REV_MASK) >> CID_REV_SHIFT; | ||||
|  		if (rev >= 2) { | ||||
|  			val &= ~CID_ID_MASK; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -21,7 +21,9 @@
 | ||||
|  #include <linux/firmware.h> | ||||
|  #include "firmware.h" | ||||
|   | ||||
| -#define SDIO_FUNC_0		0
 | ||||
| +/* Maximum number of I/O funcs */
 | ||||
| +#define NUM_SDIO_FUNCS	3
 | ||||
| +
 | ||||
|  #define SDIO_FUNC_1		1 | ||||
|  #define SDIO_FUNC_2		2 | ||||
|   | ||||
| @@ -39,9 +41,6 @@
 | ||||
|  #define INTR_STATUS_FUNC1	0x2 | ||||
|  #define INTR_STATUS_FUNC2	0x4 | ||||
|   | ||||
| -/* Maximum number of I/O funcs */
 | ||||
| -#define SDIOD_MAX_IOFUNCS	7
 | ||||
| -
 | ||||
|  /* mask of register map */ | ||||
|  #define REG_F0_REG_MASK		0x7FF | ||||
|  #define REG_F1_MISC_MASK	0x1FFFF | ||||
| @@ -175,7 +174,7 @@ struct brcmf_sdio;
 | ||||
|  struct brcmf_sdiod_freezer; | ||||
|   | ||||
|  struct brcmf_sdio_dev { | ||||
| -	struct sdio_func *func[SDIO_MAX_FUNCS];
 | ||||
| +	struct sdio_func *func[NUM_SDIO_FUNCS];
 | ||||
|  	u8 num_funcs;			/* Supported funcs on client */ | ||||
|  	u32 sbwad;			/* Save backplane window address */ | ||||
|  	struct brcmf_core *cc_core;	/* chipcommon core info struct */ | ||||
| @@ -297,10 +296,10 @@ void brcmf_sdiod_intr_unregister(struct
 | ||||
|  /* SDIO device register access interface */ | ||||
|  /* Accessors for SDIO Function 0 */ | ||||
|  #define brcmf_sdiod_func0_rb(sdiodev, addr, r) \ | ||||
| -	sdio_f0_readb((sdiodev)->func[0], (addr), (r))
 | ||||
| +	sdio_f0_readb((sdiodev)->func[1], (addr), (r))
 | ||||
|   | ||||
|  #define brcmf_sdiod_func0_wb(sdiodev, addr, v, ret) \ | ||||
| -	sdio_f0_writeb((sdiodev)->func[0], (v), (addr), (ret))
 | ||||
| +	sdio_f0_writeb((sdiodev)->func[1], (v), (addr), (ret))
 | ||||
|   | ||||
|  /* Accessors for SDIO Function 1 */ | ||||
|  #define brcmf_sdiod_readb(sdiodev, addr, r) \ | ||||
| @ -1,40 +0,0 @@ | ||||
| From bcadaaa097c7ec103fe75f9da41f8fe52693b644 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 19 Dec 2017 13:47:12 +0100 | ||||
| Subject: [PATCH] brcmfmac: More efficient and slightly easier to read fixup | ||||
|  for 4339 chips | ||||
| 
 | ||||
| Its more efficient to test the register we're interested in first, | ||||
| potentially avoiding two more comparisons, and therefore always avoiding | ||||
| one comparison per call on all other chips. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| [arend: fix some checkpatch warnings] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 ++++--- | ||||
|  1 file changed, 4 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3772,15 +3772,16 @@ static u32 brcmf_sdio_buscore_read32(voi
 | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(sdiodev, addr, NULL); | ||||
|   | ||||
| -	if ((sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 ||
 | ||||
| -	     sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4339) &&
 | ||||
| -	     addr == CORE_CC_REG(SI_ENUM_BASE, chipid)) {
 | ||||
| +	if (addr == CORE_CC_REG(SI_ENUM_BASE, chipid) &&
 | ||||
| +	    (sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4339 ||
 | ||||
| +	     sdiodev->func[1]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339)) {
 | ||||
|  		rev = (val & CID_REV_MASK) >> CID_REV_SHIFT; | ||||
|  		if (rev >= 2) { | ||||
|  			val &= ~CID_ID_MASK; | ||||
|  			val |= BRCM_CC_4339_CHIP_ID; | ||||
|  		} | ||||
|  	} | ||||
| +
 | ||||
|  	return val; | ||||
|  } | ||||
|   | ||||
| @ -1,347 +0,0 @@ | ||||
| From 00eb62cfc5f806b003fe5d54c8b5fe9a9665482f Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:13 +0100 | ||||
| Subject: [PATCH] brcmfmac: Replace function index with function pointer | ||||
| 
 | ||||
| In preparation for removing the function array, remove all code that | ||||
| refers to function by index and replace with pointers to the function | ||||
| itself. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| [arend: replace BUG() with WARN() macro] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 85 ++++++++++++---------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 15 ++-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.h    |  6 +- | ||||
|  3 files changed, 56 insertions(+), 50 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -291,8 +291,9 @@ out:
 | ||||
|  		*ret = retval; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| -				 u32 addr, struct sk_buff *pkt)
 | ||||
| +static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +				 struct sdio_func *func, u32 addr,
 | ||||
| +				 struct sk_buff *pkt)
 | ||||
|  { | ||||
|  	unsigned int req_sz; | ||||
|  	int err; | ||||
| @@ -301,13 +302,19 @@ static int brcmf_sdiod_buff_read(struct
 | ||||
|  	req_sz = pkt->len + 3; | ||||
|  	req_sz &= (uint)~3; | ||||
|   | ||||
| -	if (fn == 1)
 | ||||
| -		err = sdio_memcpy_fromio(sdiodev->func[fn],
 | ||||
| -					 ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
| -	else
 | ||||
| -		/* function 2 read is FIFO operation */
 | ||||
| -		err = sdio_readsb(sdiodev->func[fn],
 | ||||
| -				  ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
| +	switch (func->num) {
 | ||||
| +	case 1:
 | ||||
| +		err = sdio_memcpy_fromio(func, ((u8 *)(pkt->data)), addr,
 | ||||
| +					 req_sz);
 | ||||
| +		break;
 | ||||
| +	case 2:
 | ||||
| +		err = sdio_readsb(func, ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
| +		break;
 | ||||
| +	default:
 | ||||
| +		/* bail out as things are really fishy here */
 | ||||
| +		WARN(1, "invalid sdio function number: %d\n", func->num);
 | ||||
| +		err = -ENOMEDIUM;
 | ||||
| +	};
 | ||||
|   | ||||
|  	if (err == -ENOMEDIUM) | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| @@ -315,8 +322,9 @@ static int brcmf_sdiod_buff_read(struct
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| -				  u32 addr, struct sk_buff *pkt)
 | ||||
| +static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +				  struct sdio_func *func, u32 addr,
 | ||||
| +				  struct sk_buff *pkt)
 | ||||
|  { | ||||
|  	unsigned int req_sz; | ||||
|  	int err; | ||||
| @@ -325,8 +333,7 @@ static int brcmf_sdiod_buff_write(struct
 | ||||
|  	req_sz = pkt->len + 3; | ||||
|  	req_sz &= (uint)~3; | ||||
|   | ||||
| -	err = sdio_memcpy_toio(sdiodev->func[fn], addr,
 | ||||
| -			       ((u8 *)(pkt->data)), req_sz);
 | ||||
| +	err = sdio_memcpy_toio(func, addr, ((u8 *)(pkt->data)), req_sz);
 | ||||
|   | ||||
|  	if (err == -ENOMEDIUM) | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| @@ -337,7 +344,7 @@ static int brcmf_sdiod_buff_write(struct
 | ||||
|  /** | ||||
|   * brcmf_sdiod_sglist_rw - SDIO interface function for block data access | ||||
|   * @sdiodev: brcmfmac sdio device | ||||
| - * @fn: SDIO function number
 | ||||
| + * @func: SDIO function
 | ||||
|   * @write: direction flag | ||||
|   * @addr: dongle memory address as source/destination | ||||
|   * @pkt: skb pointer | ||||
| @@ -346,7 +353,8 @@ static int brcmf_sdiod_buff_write(struct
 | ||||
|   * stack for block data access. It assumes that the skb passed down by the | ||||
|   * caller has already been padded and aligned. | ||||
|   */ | ||||
| -static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn,
 | ||||
| +static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +				 struct sdio_func *func,
 | ||||
|  				 bool write, u32 addr, | ||||
|  				 struct sk_buff_head *pktlist) | ||||
|  { | ||||
| @@ -372,7 +380,7 @@ static int brcmf_sdiod_sglist_rw(struct
 | ||||
|  		req_sz = 0; | ||||
|  		skb_queue_walk(pktlist, pkt_next) | ||||
|  			req_sz += pkt_next->len; | ||||
| -		req_sz = ALIGN(req_sz, sdiodev->func[fn]->cur_blksize);
 | ||||
| +		req_sz = ALIGN(req_sz, func->cur_blksize);
 | ||||
|  		while (req_sz > PAGE_SIZE) { | ||||
|  			pkt_next = brcmu_pkt_buf_get_skb(PAGE_SIZE); | ||||
|  			if (pkt_next == NULL) { | ||||
| @@ -391,7 +399,7 @@ static int brcmf_sdiod_sglist_rw(struct
 | ||||
|  		target_list = &local_list; | ||||
|  	} | ||||
|   | ||||
| -	func_blk_sz = sdiodev->func[fn]->cur_blksize;
 | ||||
| +	func_blk_sz = func->cur_blksize;
 | ||||
|  	max_req_sz = sdiodev->max_request_size; | ||||
|  	max_seg_cnt = min_t(unsigned short, sdiodev->max_segment_count, | ||||
|  			    target_list->qlen); | ||||
| @@ -408,10 +416,10 @@ static int brcmf_sdiod_sglist_rw(struct
 | ||||
|  	mmc_dat.flags = write ? MMC_DATA_WRITE : MMC_DATA_READ; | ||||
|  	mmc_cmd.opcode = SD_IO_RW_EXTENDED; | ||||
|  	mmc_cmd.arg = write ? 1<<31 : 0;	/* write flag  */ | ||||
| -	mmc_cmd.arg |= (fn & 0x7) << 28;	/* SDIO func num */
 | ||||
| -	mmc_cmd.arg |= 1<<27;			/* block mode */
 | ||||
| +	mmc_cmd.arg |= (func->num & 0x7) << 28;	/* SDIO func num */
 | ||||
| +	mmc_cmd.arg |= 1 << 27;			/* block mode */
 | ||||
|  	/* for function 1 the addr will be incremented */ | ||||
| -	mmc_cmd.arg |= (fn == 1) ? 1<<26 : 0;
 | ||||
| +	mmc_cmd.arg |= (func->num == 1) ? 1 << 26 : 0;
 | ||||
|  	mmc_cmd.flags = MMC_RSP_SPI_R5 | MMC_RSP_R5 | MMC_CMD_ADTC; | ||||
|  	mmc_req.cmd = &mmc_cmd; | ||||
|  	mmc_req.data = &mmc_dat; | ||||
| @@ -457,11 +465,11 @@ static int brcmf_sdiod_sglist_rw(struct
 | ||||
|  		mmc_cmd.arg |= (addr & 0x1FFFF) << 9;	/* address */ | ||||
|  		mmc_cmd.arg |= mmc_dat.blocks & 0x1FF;	/* block count */ | ||||
|  		/* incrementing addr for function 1 */ | ||||
| -		if (fn == 1)
 | ||||
| +		if (func->num == 1)
 | ||||
|  			addr += req_sz; | ||||
|   | ||||
| -		mmc_set_data_timeout(&mmc_dat, sdiodev->func[fn]->card);
 | ||||
| -		mmc_wait_for_req(sdiodev->func[fn]->card->host, &mmc_req);
 | ||||
| +		mmc_set_data_timeout(&mmc_dat, func->card);
 | ||||
| +		mmc_wait_for_req(func->card->host, &mmc_req);
 | ||||
|   | ||||
|  		ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error; | ||||
|  		if (ret == -ENOMEDIUM) { | ||||
| @@ -541,7 +549,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | ||||
|  	addr &= SBSDIO_SB_OFT_ADDR_MASK; | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
| -	err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
 | ||||
| +	err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr, pkt);
 | ||||
|   | ||||
|  done: | ||||
|  	return err; | ||||
| @@ -566,13 +574,13 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
|  	if (pktq->qlen == 1) | ||||
| -		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | ||||
| +		err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
 | ||||
|  					    pktq->next); | ||||
|  	else if (!sdiodev->sg_support) { | ||||
|  		glom_skb = brcmu_pkt_buf_get_skb(totlen); | ||||
|  		if (!glom_skb) | ||||
|  			return -ENOMEM; | ||||
| -		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | ||||
| +		err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[2], addr,
 | ||||
|  					    glom_skb); | ||||
|  		if (err) | ||||
|  			goto done; | ||||
| @@ -582,8 +590,8 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  			skb_pull(glom_skb, skb->len); | ||||
|  		} | ||||
|  	} else | ||||
| -		err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, false, addr,
 | ||||
| -					    pktq);
 | ||||
| +		err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], false,
 | ||||
| +					    addr, pktq);
 | ||||
|   | ||||
|  done: | ||||
|  	brcmu_pkt_buf_free_skb(glom_skb); | ||||
| @@ -614,7 +622,8 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
|  	if (!err) | ||||
| -		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
 | ||||
| +		err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2], addr,
 | ||||
| +					     mypkt);
 | ||||
|   | ||||
|  	brcmu_pkt_buf_free_skb(mypkt); | ||||
|   | ||||
| @@ -639,14 +648,14 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	if (pktq->qlen == 1 || !sdiodev->sg_support) { | ||||
|  		skb_queue_walk(pktq, skb) { | ||||
| -			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
 | ||||
| +			err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[2],
 | ||||
|  						     addr, skb); | ||||
|  			if (err) | ||||
|  				break; | ||||
|  		} | ||||
|  	} else { | ||||
| -		err = brcmf_sdiod_sglist_rw(sdiodev, SDIO_FUNC_2, true, addr,
 | ||||
| -					    pktq);
 | ||||
| +		err = brcmf_sdiod_sglist_rw(sdiodev, sdiodev->func[2], true,
 | ||||
| +					    addr, pktq);
 | ||||
|  	} | ||||
|   | ||||
|  	return err; | ||||
| @@ -696,10 +705,10 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|   | ||||
|  		if (write) { | ||||
|  			memcpy(pkt->data, data, dsize); | ||||
| -			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
 | ||||
| +			err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func[1],
 | ||||
|  						     sdaddr, pkt); | ||||
|  		} else { | ||||
| -			err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
 | ||||
| +			err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func[1],
 | ||||
|  						    sdaddr, pkt); | ||||
|  		} | ||||
|   | ||||
| @@ -728,12 +737,12 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn)
 | ||||
| +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func)
 | ||||
|  { | ||||
|  	brcmf_dbg(SDIO, "Enter\n"); | ||||
|   | ||||
|  	/* Issue abort cmd52 command through F0 */ | ||||
| -	brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, fn, NULL);
 | ||||
| +	brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_ABORT, func->num, NULL);
 | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "Exit\n"); | ||||
|  	return 0; | ||||
| @@ -1105,7 +1114,7 @@ static int brcmf_ops_sdio_suspend(struct
 | ||||
|   | ||||
|  	func = container_of(dev, struct sdio_func, dev); | ||||
|  	brcmf_dbg(SDIO, "Enter: F%d\n", func->num); | ||||
| -	if (func->num != SDIO_FUNC_1)
 | ||||
| +	if (func->num != 1)
 | ||||
|  		return 0; | ||||
|   | ||||
|   | ||||
| @@ -1134,7 +1143,7 @@ static int brcmf_ops_sdio_resume(struct
 | ||||
|  	struct sdio_func *func = container_of(dev, struct sdio_func, dev); | ||||
|   | ||||
|  	brcmf_dbg(SDIO, "Enter: F%d\n", func->num); | ||||
| -	if (func->num != SDIO_FUNC_2)
 | ||||
| +	if (func->num != 2)
 | ||||
|  		return 0; | ||||
|   | ||||
|  	brcmf_sdiod_freezer_off(sdiodev); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -1157,7 +1157,7 @@ static void brcmf_sdio_rxfail(struct brc
 | ||||
|  		  rtx ? ", send NAK" : ""); | ||||
|   | ||||
|  	if (abort) | ||||
| -		brcmf_sdiod_abort(bus->sdiodev, SDIO_FUNC_2);
 | ||||
| +		brcmf_sdiod_abort(bus->sdiodev, bus->sdiodev->func[2]);
 | ||||
|   | ||||
|  	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_RF_TERM, | ||||
|  			   &err); | ||||
| @@ -1209,7 +1209,7 @@ static void brcmf_sdio_txfail(struct brc
 | ||||
|  	brcmf_err("sdio error, abort command and terminate frame\n"); | ||||
|  	bus->sdcnt.tx_sderrs++; | ||||
|   | ||||
| -	brcmf_sdiod_abort(sdiodev, SDIO_FUNC_2);
 | ||||
| +	brcmf_sdiod_abort(sdiodev, sdiodev->func[2]);
 | ||||
|  	brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_FRAMECTRL, SFC_WF_TERM, NULL); | ||||
|  	bus->sdcnt.f1regdata++; | ||||
|   | ||||
| @@ -2072,7 +2072,7 @@ static int brcmf_sdio_txpkt_prep_sg(stru
 | ||||
|  	int ntail, ret; | ||||
|   | ||||
|  	sdiodev = bus->sdiodev; | ||||
| -	blksize = sdiodev->func[SDIO_FUNC_2]->cur_blksize;
 | ||||
| +	blksize = sdiodev->func[2]->cur_blksize;
 | ||||
|  	/* sg entry alignment should be a divisor of block size */ | ||||
|  	WARN_ON(blksize % bus->sgentry_align); | ||||
|   | ||||
| @@ -2441,7 +2441,7 @@ static void brcmf_sdio_bus_stop(struct d
 | ||||
|   | ||||
|  		/* Turn off the bus (F2), free any pending packets */ | ||||
|  		brcmf_dbg(INTR, "disable SDIO interrupts\n"); | ||||
| -		sdio_disable_func(sdiodev->func[SDIO_FUNC_2]);
 | ||||
| +		sdio_disable_func(sdiodev->func[2]);
 | ||||
|   | ||||
|  		/* Clear any pending interrupts now that F2 is disabled */ | ||||
|  		brcmf_sdiod_writel(sdiodev, core->base + SD_REG(intstatus), | ||||
| @@ -4066,8 +4066,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata), | ||||
|  			   SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL); | ||||
|   | ||||
| -	err = sdio_enable_func(sdiodev->func[SDIO_FUNC_2]);
 | ||||
| -
 | ||||
| +	err = sdio_enable_func(sdiodev->func[2]);
 | ||||
|   | ||||
|  	brcmf_dbg(INFO, "enable F2: err=%d\n", err); | ||||
|   | ||||
| @@ -4082,7 +4081,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err); | ||||
|  	} else { | ||||
|  		/* Disable F2 again */ | ||||
| -		sdio_disable_func(sdiodev->func[SDIO_FUNC_2]);
 | ||||
| +		sdio_disable_func(sdiodev->func[2]);
 | ||||
|  		goto release; | ||||
|  	} | ||||
|   | ||||
| @@ -4219,7 +4218,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	sdio_claim_host(bus->sdiodev->func[1]); | ||||
|   | ||||
|  	/* Disable F2 to clear any intermediate frame state on the dongle */ | ||||
| -	sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
 | ||||
| +	sdio_disable_func(bus->sdiodev->func[2]);
 | ||||
|   | ||||
|  	bus->rxflow = false; | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -45,9 +45,6 @@
 | ||||
|  #define REG_F0_REG_MASK		0x7FF | ||||
|  #define REG_F1_MISC_MASK	0x1FFFF | ||||
|   | ||||
| -/* as of sdiod rev 0, supports 3 functions */
 | ||||
| -#define SBSDIO_NUM_FUNCTION		3
 | ||||
| -
 | ||||
|  /* function 0 vendor specific CCCR registers */ | ||||
|   | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP			0xf0 | ||||
| @@ -350,7 +347,8 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_
 | ||||
|  		      u8 *data, uint size); | ||||
|   | ||||
|  /* Issue an abort to the specified function */ | ||||
| -int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, u8 fn);
 | ||||
| +int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, struct sdio_func *func);
 | ||||
| +
 | ||||
|  void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev); | ||||
|  void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev, | ||||
|  			      enum brcmf_sdiod_state state); | ||||
| @ -1,53 +0,0 @@ | ||||
| From 9c3438ed215adba7025268ee1f0b6f7a2af12316 Mon Sep 17 00:00:00 2001 | ||||
| From: Ian Molton <ian@mnementh.co.uk> | ||||
| Date: Tue, 19 Dec 2017 13:47:14 +0100 | ||||
| Subject: [PATCH] brcmfmac: Clean up interrupt macros | ||||
| 
 | ||||
| Make it more obvious that this code acually enables interrupts, and | ||||
| provide nice definitions for the bits in the register. | ||||
| 
 | ||||
| Signed-off-by: Ian Molton <ian@mnementh.co.uk> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 3 ++- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h   | 8 +++++--- | ||||
|  2 files changed, 7 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -149,7 +149,8 @@ int brcmf_sdiod_intr_register(struct brc
 | ||||
|   | ||||
|  		/* must configure SDIO_CCCR_IENx to enable irq */ | ||||
|  		data = brcmf_sdiod_func0_rb(sdiodev, SDIO_CCCR_IENx, &ret); | ||||
| -		data |= 1 << SDIO_FUNC_1 | 1 << SDIO_FUNC_2 | 1;
 | ||||
| +		data |= SDIO_CCCR_IEN_FUNC1 | SDIO_CCCR_IEN_FUNC2 |
 | ||||
| +			SDIO_CCCR_IEN_FUNC0;
 | ||||
|  		brcmf_sdiod_func0_wb(sdiodev, SDIO_CCCR_IENx, data, &ret); | ||||
|   | ||||
|  		/* redirect, configure and enable io for interrupt signal */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
 | ||||
| @@ -24,9 +24,6 @@
 | ||||
|  /* Maximum number of I/O funcs */ | ||||
|  #define NUM_SDIO_FUNCS	3 | ||||
|   | ||||
| -#define SDIO_FUNC_1		1
 | ||||
| -#define SDIO_FUNC_2		2
 | ||||
| -
 | ||||
|  #define SDIOD_FBR_SIZE		0x100 | ||||
|   | ||||
|  /* io_en */ | ||||
| @@ -52,6 +49,11 @@
 | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP_CMD14_EXT	BIT(2) | ||||
|  #define SDIO_CCCR_BRCM_CARDCAP_CMD_NODEC	BIT(3) | ||||
|   | ||||
| +/* Interrupt enable bits for each function */
 | ||||
| +#define SDIO_CCCR_IEN_FUNC0			BIT(0)
 | ||||
| +#define SDIO_CCCR_IEN_FUNC1			BIT(1)
 | ||||
| +#define SDIO_CCCR_IEN_FUNC2			BIT(2)
 | ||||
| +
 | ||||
|  #define SDIO_CCCR_BRCM_CARDCTRL			0xf1 | ||||
|  #define SDIO_CCCR_BRCM_CARDCTRL_WLANRESET	BIT(1) | ||||
|   | ||||
| @ -1,27 +0,0 @@ | ||||
| From e3720dad99859251a8b0fe2807275a8afcfb560d Mon Sep 17 00:00:00 2001 | ||||
| From: Double Lo <double.lo@cypress.com> | ||||
| Date: Tue, 19 Dec 2017 14:56:44 +0800 | ||||
| Subject: [PATCH] brcmfmac: Support 43455 save-restore (SR) feature if FW | ||||
|  include -sr | ||||
| 
 | ||||
| This patch will add 43455 into the save-restore(SR) capable chip list, so | ||||
| the SR engine will be enabled with 43455 FW which built-in the -sr | ||||
| function. | ||||
| 
 | ||||
| Signed-off-by: Double Lo <double.lo@cypress.com> | ||||
| Signed-off-by: Wright Feng <wright.feng@cypress.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| @@ -1338,6 +1338,7 @@ bool brcmf_chip_sr_capable(struct brcmf_
 | ||||
|  	switch (pub->chip) { | ||||
|  	case BRCM_CC_4354_CHIP_ID: | ||||
|  	case BRCM_CC_4356_CHIP_ID: | ||||
| +	case BRCM_CC_4345_CHIP_ID:
 | ||||
|  		/* explicitly check SR engine enable bit */ | ||||
|  		pmu_cc3_mask = BIT(2); | ||||
|  		/* fall-through */ | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,31 +0,0 @@ | ||||
| From 32adbcaa5df49f1977441f7a4bf180a0bcfe9966 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 9 Jan 2018 13:22:53 +0100 | ||||
| Subject: [PATCH] brcmfmac: add comment block in brcmf_sdio_buscore_read() | ||||
| 
 | ||||
| In brcmf_sdio_buscore_read() there is some special handling upon | ||||
| register access to chipid register of the chipcommon core. Add | ||||
| comment explaining why it is done here. | ||||
| 
 | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++++++ | ||||
|  1 file changed, 7 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3772,6 +3772,13 @@ static u32 brcmf_sdio_buscore_read32(voi
 | ||||
|   | ||||
|  	val = brcmf_sdiod_readl(sdiodev, addr, NULL); | ||||
|   | ||||
| +	/*
 | ||||
| +	 * this is a bit of special handling if reading the chipcommon chipid
 | ||||
| +	 * register. The 4339 is a next-gen of the 4335. It uses the same
 | ||||
| +	 * SDIO device id as 4335 and the chipid register returns 4335 as well.
 | ||||
| +	 * It can be identified as 4339 by looking at the chip revision. It
 | ||||
| +	 * is corrected here so the chip.c module has the right info.
 | ||||
| +	 */
 | ||||
|  	if (addr == CORE_CC_REG(SI_ENUM_BASE, chipid) && | ||||
|  	    (sdiodev->func1->device == SDIO_DEVICE_ID_BROADCOM_4339 || | ||||
|  	     sdiodev->func1->device == SDIO_DEVICE_ID_BROADCOM_4335_4339)) { | ||||
| @ -1,137 +0,0 @@ | ||||
| From 378f6a16043e5d3346301fc618f503e97aea335b Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 9 Jan 2018 13:22:54 +0100 | ||||
| Subject: [PATCH] brcmfmac: rename brcmf_sdiod_buff_{read,write}() functions | ||||
| 
 | ||||
| Rename functions to brcmf_sdio_skbuff_{read,write}() as we pass an | ||||
| skbuff to this function. | ||||
| 
 | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 48 +++++++++++----------- | ||||
|  1 file changed, 24 insertions(+), 24 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | ||||
| @@ -292,24 +292,24 @@ out:
 | ||||
|  		*ret = retval; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev,
 | ||||
| -				 struct sdio_func *func, u32 addr,
 | ||||
| -				 struct sk_buff *pkt)
 | ||||
| +static int brcmf_sdiod_skbuff_read(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +				   struct sdio_func *func, u32 addr,
 | ||||
| +				   struct sk_buff *skb)
 | ||||
|  { | ||||
|  	unsigned int req_sz; | ||||
|  	int err; | ||||
|   | ||||
|  	/* Single skb use the standard mmc interface */ | ||||
| -	req_sz = pkt->len + 3;
 | ||||
| +	req_sz = skb->len + 3;
 | ||||
|  	req_sz &= (uint)~3; | ||||
|   | ||||
|  	switch (func->num) { | ||||
|  	case 1: | ||||
| -		err = sdio_memcpy_fromio(func, ((u8 *)(pkt->data)), addr,
 | ||||
| +		err = sdio_memcpy_fromio(func, ((u8 *)(skb->data)), addr,
 | ||||
|  					 req_sz); | ||||
|  		break; | ||||
|  	case 2: | ||||
| -		err = sdio_readsb(func, ((u8 *)(pkt->data)), addr, req_sz);
 | ||||
| +		err = sdio_readsb(func, ((u8 *)(skb->data)), addr, req_sz);
 | ||||
|  		break; | ||||
|  	default: | ||||
|  		/* bail out as things are really fishy here */ | ||||
| @@ -323,18 +323,18 @@ static int brcmf_sdiod_buff_read(struct
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev,
 | ||||
| -				  struct sdio_func *func, u32 addr,
 | ||||
| -				  struct sk_buff *pkt)
 | ||||
| +static int brcmf_sdiod_skbuff_write(struct brcmf_sdio_dev *sdiodev,
 | ||||
| +				    struct sdio_func *func, u32 addr,
 | ||||
| +				    struct sk_buff *skb)
 | ||||
|  { | ||||
|  	unsigned int req_sz; | ||||
|  	int err; | ||||
|   | ||||
|  	/* Single skb use the standard mmc interface */ | ||||
| -	req_sz = pkt->len + 3;
 | ||||
| +	req_sz = skb->len + 3;
 | ||||
|  	req_sz &= (uint)~3; | ||||
|   | ||||
| -	err = sdio_memcpy_toio(func, addr, ((u8 *)(pkt->data)), req_sz);
 | ||||
| +	err = sdio_memcpy_toio(func, addr, ((u8 *)(skb->data)), req_sz);
 | ||||
|   | ||||
|  	if (err == -ENOMEDIUM) | ||||
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM); | ||||
| @@ -550,7 +550,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | ||||
|  	addr &= SBSDIO_SB_OFT_ADDR_MASK; | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
| -	err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr, pkt);
 | ||||
| +	err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr, pkt);
 | ||||
|   | ||||
|  done: | ||||
|  	return err; | ||||
| @@ -575,14 +575,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
|  	if (pktq->qlen == 1) | ||||
| -		err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr,
 | ||||
| -					    pktq->next);
 | ||||
| +		err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr,
 | ||||
| +					      pktq->next);
 | ||||
|  	else if (!sdiodev->sg_support) { | ||||
|  		glom_skb = brcmu_pkt_buf_get_skb(totlen); | ||||
|  		if (!glom_skb) | ||||
|  			return -ENOMEM; | ||||
| -		err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func2, addr,
 | ||||
| -					    glom_skb);
 | ||||
| +		err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func2, addr,
 | ||||
| +					      glom_skb);
 | ||||
|  		if (err) | ||||
|  			goto done; | ||||
|   | ||||
| @@ -623,8 +623,8 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | ||||
|  	addr |= SBSDIO_SB_ACCESS_2_4B_FLAG; | ||||
|   | ||||
|  	if (!err) | ||||
| -		err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func2, addr,
 | ||||
| -					     mypkt);
 | ||||
| +		err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2, addr,
 | ||||
| +					       mypkt);
 | ||||
|   | ||||
|  	brcmu_pkt_buf_free_skb(mypkt); | ||||
|   | ||||
| @@ -649,8 +649,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | ||||
|   | ||||
|  	if (pktq->qlen == 1 || !sdiodev->sg_support) { | ||||
|  		skb_queue_walk(pktq, skb) { | ||||
| -			err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func2,
 | ||||
| -						     addr, skb);
 | ||||
| +			err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func2,
 | ||||
| +						       addr, skb);
 | ||||
|  			if (err) | ||||
|  				break; | ||||
|  		} | ||||
| @@ -706,11 +706,11 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | ||||
|   | ||||
|  		if (write) { | ||||
|  			memcpy(pkt->data, data, dsize); | ||||
| -			err = brcmf_sdiod_buff_write(sdiodev, sdiodev->func1,
 | ||||
| -						     sdaddr, pkt);
 | ||||
| +			err = brcmf_sdiod_skbuff_write(sdiodev, sdiodev->func1,
 | ||||
| +						       sdaddr, pkt);
 | ||||
|  		} else { | ||||
| -			err = brcmf_sdiod_buff_read(sdiodev, sdiodev->func1,
 | ||||
| -						    sdaddr, pkt);
 | ||||
| +			err = brcmf_sdiod_skbuff_read(sdiodev, sdiodev->func1,
 | ||||
| +						      sdaddr, pkt);
 | ||||
|  		} | ||||
|   | ||||
|  		if (err) { | ||||
| @ -1,59 +0,0 @@ | ||||
| From b7acadaf038740c43515dc1548f43d01cc92823a Mon Sep 17 00:00:00 2001 | ||||
| From: Himanshu Jha <himanshujha199640@gmail.com> | ||||
| Date: Tue, 9 Jan 2018 02:15:31 +0530 | ||||
| Subject: [PATCH] brcmfmac: Use zeroing memory allocator than allocator/memset | ||||
| 
 | ||||
| Use dma_zalloc_coherent for allocating zeroed | ||||
| memory and remove unnecessary memset function. | ||||
| 
 | ||||
| Generated-by: scripts/coccinelle/api/alloc/kzalloc-simple.cocci | ||||
| 
 | ||||
| Suggested-by: Luis R. Rodriguez <mcgrof@kernel.org> | ||||
| Signed-off-by: Himanshu Jha <himanshujha199640@gmail.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/pcie.c  | 20 ++++++++++---------- | ||||
|  1 file changed, 10 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1251,14 +1251,14 @@ static int brcmf_pcie_init_scratchbuffer
 | ||||
|  	u64 address; | ||||
|  	u32 addr; | ||||
|   | ||||
| -	devinfo->shared.scratch = dma_alloc_coherent(&devinfo->pdev->dev,
 | ||||
| -		BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
 | ||||
| -		&devinfo->shared.scratch_dmahandle, GFP_KERNEL);
 | ||||
| +	devinfo->shared.scratch =
 | ||||
| +		dma_zalloc_coherent(&devinfo->pdev->dev,
 | ||||
| +					BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
 | ||||
| +					&devinfo->shared.scratch_dmahandle,
 | ||||
| +					GFP_KERNEL);
 | ||||
|  	if (!devinfo->shared.scratch) | ||||
|  		goto fail; | ||||
|   | ||||
| -	memset(devinfo->shared.scratch, 0, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
 | ||||
| -
 | ||||
|  	addr = devinfo->shared.tcm_base_address + | ||||
|  	       BRCMF_SHARED_DMA_SCRATCH_ADDR_OFFSET; | ||||
|  	address = (u64)devinfo->shared.scratch_dmahandle; | ||||
| @@ -1268,14 +1268,14 @@ static int brcmf_pcie_init_scratchbuffer
 | ||||
|  	       BRCMF_SHARED_DMA_SCRATCH_LEN_OFFSET; | ||||
|  	brcmf_pcie_write_tcm32(devinfo, addr, BRCMF_DMA_D2H_SCRATCH_BUF_LEN); | ||||
|   | ||||
| -	devinfo->shared.ringupd = dma_alloc_coherent(&devinfo->pdev->dev,
 | ||||
| -		BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
 | ||||
| -		&devinfo->shared.ringupd_dmahandle, GFP_KERNEL);
 | ||||
| +	devinfo->shared.ringupd =
 | ||||
| +		dma_zalloc_coherent(&devinfo->pdev->dev,
 | ||||
| +					BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
 | ||||
| +					&devinfo->shared.ringupd_dmahandle,
 | ||||
| +					GFP_KERNEL);
 | ||||
|  	if (!devinfo->shared.ringupd) | ||||
|  		goto fail; | ||||
|   | ||||
| -	memset(devinfo->shared.ringupd, 0, BRCMF_DMA_D2H_RINGUPD_BUF_LEN);
 | ||||
| -
 | ||||
|  	addr = devinfo->shared.tcm_base_address + | ||||
|  	       BRCMF_SHARED_DMA_RINGUPD_ADDR_OFFSET; | ||||
|  	address = (u64)devinfo->shared.ringupd_dmahandle; | ||||
| @ -1,26 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 9 Feb 2018 19:46:54 +0100 | ||||
| Subject: [PATCH] mac80211: round IEEE80211_TX_STATUS_HEADROOM up to multiple | ||||
|  of 4 | ||||
| 
 | ||||
| This ensures that mac80211 allocated management frames are properly | ||||
| aligned, which makes copying them more efficient. | ||||
| For instance, mt76 uses iowrite32_copy to copy beacon frames to beacon | ||||
| template memory on the chip. | ||||
| Misaligned 32-bit accesses cause CPU exceptions on MIPS and should be | ||||
| avoided. | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/include/net/mac80211.h
 | ||||
| +++ b/include/net/mac80211.h
 | ||||
| @@ -4145,7 +4145,7 @@ void ieee80211_sta_uapsd_trigger(struct
 | ||||
|   * The TX headroom reserved by mac80211 for its own tx_status functions. | ||||
|   * This is enough for the radiotap header. | ||||
|   */ | ||||
| -#define IEEE80211_TX_STATUS_HEADROOM	14
 | ||||
| +#define IEEE80211_TX_STATUS_HEADROOM	ALIGN(14, 4)
 | ||||
|   | ||||
|  /** | ||||
|   * ieee80211_sta_set_buffered - inform mac80211 about driver-buffered frames | ||||
| @ -1,21 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 23 Feb 2018 09:59:35 +0100 | ||||
| Subject: [PATCH] mac80211: drop frames with unexpected DS bits from | ||||
|  fast-rx to slow path | ||||
| 
 | ||||
| Fixes rx for 4-addr packets in AP mode | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -3928,7 +3928,7 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  	if ((hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_FROMDS | | ||||
|  					      IEEE80211_FCTL_TODS)) != | ||||
|  	    fast_rx->expected_ds_bits) | ||||
| -		goto drop;
 | ||||
| +		return false;
 | ||||
|   | ||||
|  	/* assign the key to drop unencrypted frames (later) | ||||
|  	 * and strip the IV/MIC if necessary | ||||
| @ -1,25 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 23 Feb 2018 10:00:22 +0100 | ||||
| Subject: [PATCH] mac80211: support AP 4-addr mode fast-rx | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -3774,6 +3774,15 @@ void ieee80211_check_fast_rx(struct sta_
 | ||||
|  			!(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && | ||||
|  			(sdata->vif.type != NL80211_IFTYPE_AP_VLAN || | ||||
|  			 !sdata->u.vlan.sta); | ||||
| +
 | ||||
| +		if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN &&
 | ||||
| +		    sdata->u.vlan.sta) {
 | ||||
| +			fastrx.expected_ds_bits |=
 | ||||
| +				cpu_to_le16(IEEE80211_FCTL_FROMDS);
 | ||||
| +			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
 | ||||
| +			fastrx.internal_forward = 0;
 | ||||
| +		}
 | ||||
| +
 | ||||
|  		break; | ||||
|  	default: | ||||
|  		goto clear; | ||||
| @ -1,53 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 23 Feb 2018 10:01:53 +0100 | ||||
| Subject: [PATCH] mac80211: support fast-rx with incompatible PS | ||||
|  capabilities when PS is disabled | ||||
| 
 | ||||
| When powersave is disabled for the interface, we can do fast-rx anyway. | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/cfg.c
 | ||||
| +++ b/net/mac80211/cfg.c
 | ||||
| @@ -2658,6 +2658,7 @@ static int ieee80211_set_power_mgmt(stru
 | ||||
|   | ||||
|  	ieee80211_recalc_ps(local); | ||||
|  	ieee80211_recalc_ps_vif(sdata); | ||||
| +	ieee80211_check_fast_rx_iface(sdata);
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -3741,12 +3741,7 @@ void ieee80211_check_fast_rx(struct sta_
 | ||||
|  		/* 4-addr is harder to deal with, later maybe */ | ||||
|  		if (sdata->u.mgd.use_4addr) | ||||
|  			goto clear; | ||||
| -		/* software powersave is a huge mess, avoid all of it */
 | ||||
| -		if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
 | ||||
| -			goto clear;
 | ||||
| -		if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) &&
 | ||||
| -		    !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
 | ||||
| -			goto clear;
 | ||||
| +
 | ||||
|  		if (sta->sta.tdls) { | ||||
|  			fastrx.da_offs = offsetof(struct ieee80211_hdr, addr1); | ||||
|  			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr2); | ||||
| @@ -3758,6 +3753,16 @@ void ieee80211_check_fast_rx(struct sta_
 | ||||
|  			fastrx.expected_ds_bits = | ||||
|  				cpu_to_le16(IEEE80211_FCTL_FROMDS); | ||||
|  		} | ||||
| +
 | ||||
| +		if (!sdata->u.mgd.powersave)
 | ||||
| +		    break;
 | ||||
| +
 | ||||
| +		/* software powersave is a huge mess, avoid all of it */
 | ||||
| +		if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
 | ||||
| +			goto clear;
 | ||||
| +		if (ieee80211_hw_check(&local->hw, SUPPORTS_PS) &&
 | ||||
| +		    !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS))
 | ||||
| +			goto clear;
 | ||||
|  		break; | ||||
|  	case NL80211_IFTYPE_AP_VLAN: | ||||
|  	case NL80211_IFTYPE_AP: | ||||
| @ -1,34 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 23 Feb 2018 10:05:08 +0100 | ||||
| Subject: [PATCH] mac80211: support station 4-addr mode fast-rx | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -3738,10 +3738,6 @@ void ieee80211_check_fast_rx(struct sta_
 | ||||
|   | ||||
|  	switch (sdata->vif.type) { | ||||
|  	case NL80211_IFTYPE_STATION: | ||||
| -		/* 4-addr is harder to deal with, later maybe */
 | ||||
| -		if (sdata->u.mgd.use_4addr)
 | ||||
| -			goto clear;
 | ||||
| -
 | ||||
|  		if (sta->sta.tdls) { | ||||
|  			fastrx.da_offs = offsetof(struct ieee80211_hdr, addr1); | ||||
|  			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr2); | ||||
| @@ -3754,6 +3750,13 @@ void ieee80211_check_fast_rx(struct sta_
 | ||||
|  				cpu_to_le16(IEEE80211_FCTL_FROMDS); | ||||
|  		} | ||||
|   | ||||
| +		if (sdata->u.mgd.use_4addr && !sta->sta.tdls) {
 | ||||
| +			fastrx.expected_ds_bits |=
 | ||||
| +				cpu_to_le16(IEEE80211_FCTL_TODS);
 | ||||
| +			fastrx.da_offs = offsetof(struct ieee80211_hdr, addr3);
 | ||||
| +			fastrx.sa_offs = offsetof(struct ieee80211_hdr, addr4);
 | ||||
| +		}
 | ||||
| +
 | ||||
|  		if (!sdata->u.mgd.powersave) | ||||
|  		    break; | ||||
|   | ||||
| @ -1,256 +0,0 @@ | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Mon, 26 Feb 2018 22:09:29 +0100 | ||||
| Subject: [PATCH] mac80211: support A-MSDU in fast-rx | ||||
| 
 | ||||
| Only works if the IV was stripped from packets. Create a smaller | ||||
| variant of ieee80211_rx_h_amsdu, which bypasses checks already done | ||||
| within the fast-rx context. | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| 
 | ||||
| --- a/net/mac80211/rx.c
 | ||||
| +++ b/net/mac80211/rx.c
 | ||||
| @@ -2358,39 +2358,17 @@ ieee80211_deliver_skb(struct ieee80211_r
 | ||||
|  } | ||||
|   | ||||
|  static ieee80211_rx_result debug_noinline | ||||
| -ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
 | ||||
| +__ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset)
 | ||||
|  { | ||||
|  	struct net_device *dev = rx->sdata->dev; | ||||
|  	struct sk_buff *skb = rx->skb; | ||||
|  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; | ||||
|  	__le16 fc = hdr->frame_control; | ||||
|  	struct sk_buff_head frame_list; | ||||
| -	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
 | ||||
|  	struct ethhdr ethhdr; | ||||
|  	const u8 *check_da = ethhdr.h_dest, *check_sa = ethhdr.h_source; | ||||
|   | ||||
| -	if (unlikely(!ieee80211_is_data(fc)))
 | ||||
| -		return RX_CONTINUE;
 | ||||
| -
 | ||||
| -	if (unlikely(!ieee80211_is_data_present(fc)))
 | ||||
| -		return RX_DROP_MONITOR;
 | ||||
| -
 | ||||
| -	if (!(status->rx_flags & IEEE80211_RX_AMSDU))
 | ||||
| -		return RX_CONTINUE;
 | ||||
| -
 | ||||
|  	if (unlikely(ieee80211_has_a4(hdr->frame_control))) { | ||||
| -		switch (rx->sdata->vif.type) {
 | ||||
| -		case NL80211_IFTYPE_AP_VLAN:
 | ||||
| -			if (!rx->sdata->u.vlan.sta)
 | ||||
| -				return RX_DROP_UNUSABLE;
 | ||||
| -			break;
 | ||||
| -		case NL80211_IFTYPE_STATION:
 | ||||
| -			if (!rx->sdata->u.mgd.use_4addr)
 | ||||
| -				return RX_DROP_UNUSABLE;
 | ||||
| -			break;
 | ||||
| -		default:
 | ||||
| -			return RX_DROP_UNUSABLE;
 | ||||
| -		}
 | ||||
|  		check_da = NULL; | ||||
|  		check_sa = NULL; | ||||
|  	} else switch (rx->sdata->vif.type) { | ||||
| @@ -2410,15 +2388,13 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
 | ||||
|  			break; | ||||
|  	} | ||||
|   | ||||
| -	if (is_multicast_ether_addr(hdr->addr1))
 | ||||
| -		return RX_DROP_UNUSABLE;
 | ||||
| -
 | ||||
|  	skb->dev = dev; | ||||
|  	__skb_queue_head_init(&frame_list); | ||||
|   | ||||
|  	if (ieee80211_data_to_8023_exthdr(skb, ðhdr, | ||||
|  					  rx->sdata->vif.addr, | ||||
| -					  rx->sdata->vif.type))
 | ||||
| +					  rx->sdata->vif.type,
 | ||||
| +					  data_offset))
 | ||||
|  		return RX_DROP_UNUSABLE; | ||||
|   | ||||
|  	ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, | ||||
| @@ -2440,6 +2416,44 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx
 | ||||
|  	return RX_QUEUED; | ||||
|  } | ||||
|   | ||||
| +static ieee80211_rx_result debug_noinline
 | ||||
| +ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
 | ||||
| +{
 | ||||
| +	struct sk_buff *skb = rx->skb;
 | ||||
| +	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
 | ||||
| +	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
 | ||||
| +	__le16 fc = hdr->frame_control;
 | ||||
| +
 | ||||
| +	if (!(status->rx_flags & IEEE80211_RX_AMSDU))
 | ||||
| +		return RX_CONTINUE;
 | ||||
| +
 | ||||
| +	if (unlikely(!ieee80211_is_data(fc)))
 | ||||
| +		return RX_CONTINUE;
 | ||||
| +
 | ||||
| +	if (unlikely(!ieee80211_is_data_present(fc)))
 | ||||
| +		return RX_DROP_MONITOR;
 | ||||
| +
 | ||||
| +	if (unlikely(ieee80211_has_a4(hdr->frame_control))) {
 | ||||
| +		switch (rx->sdata->vif.type) {
 | ||||
| +		case NL80211_IFTYPE_AP_VLAN:
 | ||||
| +			if (!rx->sdata->u.vlan.sta)
 | ||||
| +				return RX_DROP_UNUSABLE;
 | ||||
| +			break;
 | ||||
| +		case NL80211_IFTYPE_STATION:
 | ||||
| +			if (!rx->sdata->u.mgd.use_4addr)
 | ||||
| +				return RX_DROP_UNUSABLE;
 | ||||
| +			break;
 | ||||
| +		default:
 | ||||
| +			return RX_DROP_UNUSABLE;
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	if (is_multicast_ether_addr(hdr->addr1))
 | ||||
| +		return RX_DROP_UNUSABLE;
 | ||||
| +
 | ||||
| +	return __ieee80211_rx_h_amsdu(rx, 0);
 | ||||
| +}
 | ||||
| +
 | ||||
|  #ifdef CPTCFG_MAC80211_MESH | ||||
|  static ieee80211_rx_result | ||||
|  ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | ||||
| @@ -3889,7 +3903,8 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  	struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | ||||
|  	struct sta_info *sta = rx->sta; | ||||
|  	int orig_len = skb->len; | ||||
| -	int snap_offs = ieee80211_hdrlen(hdr->frame_control);
 | ||||
| +	int hdrlen = ieee80211_hdrlen(hdr->frame_control);
 | ||||
| +	int snap_offs = hdrlen;
 | ||||
|  	struct { | ||||
|  		u8 snap[sizeof(rfc1042_header)]; | ||||
|  		__be16 proto; | ||||
| @@ -3920,10 +3935,6 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  	    (status->flag & FAST_RX_CRYPT_FLAGS) != FAST_RX_CRYPT_FLAGS) | ||||
|  		return false; | ||||
|   | ||||
| -	/* we don't deal with A-MSDU deaggregation here */
 | ||||
| -	if (status->rx_flags & IEEE80211_RX_AMSDU)
 | ||||
| -		return false;
 | ||||
| -
 | ||||
|  	if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) | ||||
|  		return false; | ||||
|   | ||||
| @@ -3955,21 +3966,24 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  		snap_offs += IEEE80211_CCMP_HDR_LEN; | ||||
|  	} | ||||
|   | ||||
| -	if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
 | ||||
| -		goto drop;
 | ||||
| -	payload = (void *)(skb->data + snap_offs);
 | ||||
| +	if (!(status->rx_flags & IEEE80211_RX_AMSDU)) {
 | ||||
| +		if (!pskb_may_pull(skb, snap_offs + sizeof(*payload)))
 | ||||
| +			goto drop;
 | ||||
|   | ||||
| -	if (!ether_addr_equal(payload->snap, fast_rx->rfc1042_hdr))
 | ||||
| -		return false;
 | ||||
| +		payload = (void *)(skb->data + snap_offs);
 | ||||
|   | ||||
| -	/* Don't handle these here since they require special code.
 | ||||
| -	 * Accept AARP and IPX even though they should come with a
 | ||||
| -	 * bridge-tunnel header - but if we get them this way then
 | ||||
| -	 * there's little point in discarding them.
 | ||||
| -	 */
 | ||||
| -	if (unlikely(payload->proto == cpu_to_be16(ETH_P_TDLS) ||
 | ||||
| -		     payload->proto == fast_rx->control_port_protocol))
 | ||||
| -		return false;
 | ||||
| +		if (!ether_addr_equal(payload->snap, fast_rx->rfc1042_hdr))
 | ||||
| +			return false;
 | ||||
| +
 | ||||
| +		/* Don't handle these here since they require special code.
 | ||||
| +		 * Accept AARP and IPX even though they should come with a
 | ||||
| +		 * bridge-tunnel header - but if we get them this way then
 | ||||
| +		 * there's little point in discarding them.
 | ||||
| +		 */
 | ||||
| +		if (unlikely(payload->proto == cpu_to_be16(ETH_P_TDLS) ||
 | ||||
| +			     payload->proto == fast_rx->control_port_protocol))
 | ||||
| +			return false;
 | ||||
| +	}
 | ||||
|   | ||||
|  	/* after this point, don't punt to the slowpath! */ | ||||
|   | ||||
| @@ -3983,12 +3997,6 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  	} | ||||
|   | ||||
|  	/* statistics part of ieee80211_rx_h_sta_process() */ | ||||
| -	stats->last_rx = jiffies;
 | ||||
| -	stats->last_rate = sta_stats_encode_rate(status);
 | ||||
| -
 | ||||
| -	stats->fragments++;
 | ||||
| -	stats->packets++;
 | ||||
| -
 | ||||
|  	if (!(status->flag & RX_FLAG_NO_SIGNAL_VAL)) { | ||||
|  		stats->last_signal = status->signal; | ||||
|  		if (!fast_rx->uses_rss) | ||||
| @@ -4017,6 +4025,20 @@ static bool ieee80211_invoke_fast_rx(str
 | ||||
|  	if (rx->key && !ieee80211_has_protected(hdr->frame_control)) | ||||
|  		goto drop; | ||||
|   | ||||
| +	if (status->rx_flags & IEEE80211_RX_AMSDU) {
 | ||||
| +		if (__ieee80211_rx_h_amsdu(rx, snap_offs - hdrlen) !=
 | ||||
| +		    RX_QUEUED)
 | ||||
| +			goto drop;
 | ||||
| +
 | ||||
| +		return true;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	stats->last_rx = jiffies;
 | ||||
| +	stats->last_rate = sta_stats_encode_rate(status);
 | ||||
| +
 | ||||
| +	stats->fragments++;
 | ||||
| +	stats->packets++;
 | ||||
| +
 | ||||
|  	/* do the header conversion - first grab the addresses */ | ||||
|  	ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs); | ||||
|  	ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs); | ||||
| --- a/include/net/cfg80211.h
 | ||||
| +++ b/include/net/cfg80211.h
 | ||||
| @@ -4331,10 +4331,12 @@ unsigned int ieee80211_get_mesh_hdrlen(s
 | ||||
|   *	of it being pushed into the SKB | ||||
|   * @addr: the device MAC address | ||||
|   * @iftype: the virtual interface type | ||||
| + * @data_offset: offset of payload after the 802.11 header
 | ||||
|   * Return: 0 on success. Non-zero on error. | ||||
|   */ | ||||
|  int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, | ||||
| -				  const u8 *addr, enum nl80211_iftype iftype);
 | ||||
| +				  const u8 *addr, enum nl80211_iftype iftype,
 | ||||
| +				  u8 data_offset);
 | ||||
|   | ||||
|  /** | ||||
|   * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 | ||||
| @@ -4346,7 +4348,7 @@ int ieee80211_data_to_8023_exthdr(struct
 | ||||
|  static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, | ||||
|  					 enum nl80211_iftype iftype) | ||||
|  { | ||||
| -	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype);
 | ||||
| +	return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0);
 | ||||
|  } | ||||
|   | ||||
|  /** | ||||
| --- a/net/wireless/util.c
 | ||||
| +++ b/net/wireless/util.c
 | ||||
| @@ -419,7 +419,8 @@ unsigned int ieee80211_get_mesh_hdrlen(s
 | ||||
|  EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); | ||||
|   | ||||
|  int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, | ||||
| -				  const u8 *addr, enum nl80211_iftype iftype)
 | ||||
| +				  const u8 *addr, enum nl80211_iftype iftype,
 | ||||
| +				  u8 data_offset)
 | ||||
|  { | ||||
|  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; | ||||
|  	struct { | ||||
| @@ -433,7 +434,7 @@ int ieee80211_data_to_8023_exthdr(struct
 | ||||
|  	if (unlikely(!ieee80211_is_data_present(hdr->frame_control))) | ||||
|  		return -1; | ||||
|   | ||||
| -	hdrlen = ieee80211_hdrlen(hdr->frame_control);
 | ||||
| +	hdrlen = ieee80211_hdrlen(hdr->frame_control) + data_offset;
 | ||||
|  	if (skb->len < hdrlen + 8) | ||||
|  		return -1; | ||||
|   | ||||
| @ -1,68 +0,0 @@ | ||||
| From 5242a5444e0b6464d7455beb55d936dd192b5e9d Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Mon, 22 Jan 2018 21:46:39 +0100 | ||||
| Subject: [PATCH] brcmfmac: assure bcdc dcmd api does not return value > 0 | ||||
| 
 | ||||
| The protocol layer api defines callbacks for dongle commands. | ||||
| Although not really well documented these should only return an | ||||
| error code in case of an error, or 0 upon success. In the bcdc | ||||
| protocol it can return value above 0 and we carry a fix in the | ||||
| caller of the protocol layer api. This patch makes it adhere to | ||||
| the intent of the api as described above. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c | 6 +++++- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c | 8 +++----- | ||||
|  2 files changed, 8 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| @@ -211,6 +211,8 @@ retry:
 | ||||
|  		memcpy(buf, info, len); | ||||
|  	} | ||||
|   | ||||
| +	ret = 0;
 | ||||
| +
 | ||||
|  	/* Check the ERROR flag */ | ||||
|  	if (flags & BCDC_DCMD_ERROR) | ||||
|  		ret = le32_to_cpu(msg->status); | ||||
| @@ -225,7 +227,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
 | ||||
|  { | ||||
|  	struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd; | ||||
|  	struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg; | ||||
| -	int ret = 0;
 | ||||
| +	int ret;
 | ||||
|  	u32 flags, id; | ||||
|   | ||||
|  	brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); | ||||
| @@ -249,6 +251,8 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
 | ||||
|  		goto done; | ||||
|  	} | ||||
|   | ||||
| +	ret = 0;
 | ||||
| +
 | ||||
|  	/* Check the ERROR flag */ | ||||
|  	if (flags & BCDC_DCMD_ERROR) | ||||
|  		ret = le32_to_cpu(msg->status); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| @@ -121,11 +121,9 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
 | ||||
|  	else | ||||
|  		err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd, data, len); | ||||
|   | ||||
| -	if (err >= 0)
 | ||||
| -		return 0;
 | ||||
| -
 | ||||
| -	brcmf_dbg(FIL, "Failed: %s (%d)\n",
 | ||||
| -		  brcmf_fil_get_errstr((u32)(-err)), err);
 | ||||
| +	if (err)
 | ||||
| +		brcmf_dbg(FIL, "Failed: %s (%d)\n",
 | ||||
| +			  brcmf_fil_get_errstr((u32)(-err)), err);
 | ||||
|   | ||||
|  	return err; | ||||
|  } | ||||
| @ -1,186 +0,0 @@ | ||||
| From b69c1df47281ad47bd2037a42b98f5c7115b7fd5 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Mon, 22 Jan 2018 21:46:40 +0100 | ||||
| Subject: [PATCH] brcmfmac: separate firmware errors from i/o errors | ||||
| 
 | ||||
| When using the firmware api it can fail simply because firmware does | ||||
| not like the request or it fails due to issues in the host interface. | ||||
| Currently, there is only a single error code which is confusing. So | ||||
| adding a parameter to pass the firmware error separately and in case | ||||
| of a firmware error always return -EBADE to user-space. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c  | 11 ++++++----- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c  | 16 +++++++++++----- | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c    | 10 ++++++---- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h | 14 ++++++++------ | ||||
|  4 files changed, 31 insertions(+), 20 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| @@ -165,7 +165,7 @@ static int brcmf_proto_bcdc_cmplt(struct
 | ||||
|   | ||||
|  static int | ||||
|  brcmf_proto_bcdc_query_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, | ||||
| -			    void *buf, uint len)
 | ||||
| +			    void *buf, uint len, int *fwerr)
 | ||||
|  { | ||||
|  	struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd; | ||||
|  	struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg; | ||||
| @@ -175,6 +175,7 @@ brcmf_proto_bcdc_query_dcmd(struct brcmf
 | ||||
|   | ||||
|  	brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); | ||||
|   | ||||
| +	*fwerr = 0;
 | ||||
|  	ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, false); | ||||
|  	if (ret < 0) { | ||||
|  		brcmf_err("brcmf_proto_bcdc_msg failed w/status %d\n", | ||||
| @@ -215,15 +216,14 @@ retry:
 | ||||
|   | ||||
|  	/* Check the ERROR flag */ | ||||
|  	if (flags & BCDC_DCMD_ERROR) | ||||
| -		ret = le32_to_cpu(msg->status);
 | ||||
| -
 | ||||
| +		*fwerr = le32_to_cpu(msg->status);
 | ||||
|  done: | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
|  static int | ||||
|  brcmf_proto_bcdc_set_dcmd(struct brcmf_pub *drvr, int ifidx, uint cmd, | ||||
| -			  void *buf, uint len)
 | ||||
| +			  void *buf, uint len, int *fwerr)
 | ||||
|  { | ||||
|  	struct brcmf_bcdc *bcdc = (struct brcmf_bcdc *)drvr->proto->pd; | ||||
|  	struct brcmf_proto_bcdc_dcmd *msg = &bcdc->msg; | ||||
| @@ -232,6 +232,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
 | ||||
|   | ||||
|  	brcmf_dbg(BCDC, "Enter, cmd %d len %d\n", cmd, len); | ||||
|   | ||||
| +	*fwerr = 0;
 | ||||
|  	ret = brcmf_proto_bcdc_msg(drvr, ifidx, cmd, buf, len, true); | ||||
|  	if (ret < 0) | ||||
|  		goto done; | ||||
| @@ -255,7 +256,7 @@ brcmf_proto_bcdc_set_dcmd(struct brcmf_p
 | ||||
|   | ||||
|  	/* Check the ERROR flag */ | ||||
|  	if (flags & BCDC_DCMD_ERROR) | ||||
| -		ret = le32_to_cpu(msg->status);
 | ||||
| +		*fwerr = le32_to_cpu(msg->status);
 | ||||
|   | ||||
|  done: | ||||
|  	return ret; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| @@ -107,7 +107,7 @@ static s32
 | ||||
|  brcmf_fil_cmd_data(struct brcmf_if *ifp, u32 cmd, void *data, u32 len, bool set) | ||||
|  { | ||||
|  	struct brcmf_pub *drvr = ifp->drvr; | ||||
| -	s32 err;
 | ||||
| +	s32 err, fwerr;
 | ||||
|   | ||||
|  	if (drvr->bus_if->state != BRCMF_BUS_UP) { | ||||
|  		brcmf_err("bus is down. we have nothing to do.\n"); | ||||
| @@ -117,14 +117,20 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
 | ||||
|  	if (data != NULL) | ||||
|  		len = min_t(uint, len, BRCMF_DCMD_MAXLEN); | ||||
|  	if (set) | ||||
| -		err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd, data, len);
 | ||||
| +		err = brcmf_proto_set_dcmd(drvr, ifp->ifidx, cmd,
 | ||||
| +					   data, len, &fwerr);
 | ||||
|  	else | ||||
| -		err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd, data, len);
 | ||||
| +		err = brcmf_proto_query_dcmd(drvr, ifp->ifidx, cmd,
 | ||||
| +					     data, len, &fwerr);
 | ||||
|   | ||||
| -	if (err)
 | ||||
| +	if (err) {
 | ||||
|  		brcmf_dbg(FIL, "Failed: %s (%d)\n", | ||||
|  			  brcmf_fil_get_errstr((u32)(-err)), err); | ||||
| -
 | ||||
| +	} else if (fwerr < 0) {
 | ||||
| +		brcmf_dbg(FIL, "Firmware error: %s (%d)\n",
 | ||||
| +			  brcmf_fil_get_errstr((u32)(-fwerr)), fwerr);
 | ||||
| +		err = -EBADE;
 | ||||
| +	}
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | ||||
| @@ -477,7 +477,7 @@ static void brcmf_msgbuf_ioctl_resp_wake
 | ||||
|   | ||||
|   | ||||
|  static int brcmf_msgbuf_query_dcmd(struct brcmf_pub *drvr, int ifidx, | ||||
| -				   uint cmd, void *buf, uint len)
 | ||||
| +				   uint cmd, void *buf, uint len, int *fwerr)
 | ||||
|  { | ||||
|  	struct brcmf_msgbuf *msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; | ||||
|  	struct sk_buff *skb = NULL; | ||||
| @@ -485,6 +485,7 @@ static int brcmf_msgbuf_query_dcmd(struc
 | ||||
|  	int err; | ||||
|   | ||||
|  	brcmf_dbg(MSGBUF, "ifidx=%d, cmd=%d, len=%d\n", ifidx, cmd, len); | ||||
| +	*fwerr = 0;
 | ||||
|  	msgbuf->ctl_completed = false; | ||||
|  	err = brcmf_msgbuf_tx_ioctl(drvr, ifidx, cmd, buf, len); | ||||
|  	if (err) | ||||
| @@ -508,14 +509,15 @@ static int brcmf_msgbuf_query_dcmd(struc
 | ||||
|  	} | ||||
|  	brcmu_pkt_buf_free_skb(skb); | ||||
|   | ||||
| -	return msgbuf->ioctl_resp_status;
 | ||||
| +	*fwerr = msgbuf->ioctl_resp_status;
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|   | ||||
|  static int brcmf_msgbuf_set_dcmd(struct brcmf_pub *drvr, int ifidx, | ||||
| -				 uint cmd, void *buf, uint len)
 | ||||
| +				 uint cmd, void *buf, uint len, int *fwerr)
 | ||||
|  { | ||||
| -	return brcmf_msgbuf_query_dcmd(drvr, ifidx, cmd, buf, len);
 | ||||
| +	return brcmf_msgbuf_query_dcmd(drvr, ifidx, cmd, buf, len, fwerr);
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
 | ||||
| @@ -30,9 +30,9 @@ struct brcmf_proto {
 | ||||
|  	int (*hdrpull)(struct brcmf_pub *drvr, bool do_fws, | ||||
|  		       struct sk_buff *skb, struct brcmf_if **ifp); | ||||
|  	int (*query_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, | ||||
| -			  void *buf, uint len);
 | ||||
| +			  void *buf, uint len, int *fwerr);
 | ||||
|  	int (*set_dcmd)(struct brcmf_pub *drvr, int ifidx, uint cmd, void *buf, | ||||
| -			uint len);
 | ||||
| +			uint len, int *fwerr);
 | ||||
|  	int (*tx_queue_data)(struct brcmf_pub *drvr, int ifidx, | ||||
|  			     struct sk_buff *skb); | ||||
|  	int (*txdata)(struct brcmf_pub *drvr, int ifidx, u8 offset, | ||||
| @@ -71,14 +71,16 @@ static inline int brcmf_proto_hdrpull(st
 | ||||
|  	return drvr->proto->hdrpull(drvr, do_fws, skb, ifp); | ||||
|  } | ||||
|  static inline int brcmf_proto_query_dcmd(struct brcmf_pub *drvr, int ifidx, | ||||
| -					 uint cmd, void *buf, uint len)
 | ||||
| +					 uint cmd, void *buf, uint len,
 | ||||
| +					 int *fwerr)
 | ||||
|  { | ||||
| -	return drvr->proto->query_dcmd(drvr, ifidx, cmd, buf, len);
 | ||||
| +	return drvr->proto->query_dcmd(drvr, ifidx, cmd, buf, len,fwerr);
 | ||||
|  } | ||||
|  static inline int brcmf_proto_set_dcmd(struct brcmf_pub *drvr, int ifidx, | ||||
| -				       uint cmd, void *buf, uint len)
 | ||||
| +				       uint cmd, void *buf, uint len,
 | ||||
| +				       int *fwerr)
 | ||||
|  { | ||||
| -	return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len);
 | ||||
| +	return drvr->proto->set_dcmd(drvr, ifidx, cmd, buf, len, fwerr);
 | ||||
|  } | ||||
|   | ||||
|  static inline int brcmf_proto_tx_queue_data(struct brcmf_pub *drvr, int ifidx, | ||||
| @ -1,92 +0,0 @@ | ||||
| From 933897342d0714ae1c10729cbaeecea0c6178db5 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 28 Feb 2018 21:15:19 +0100 | ||||
| Subject: [PATCH] brcmfmac: add possibility to obtain firmware error | ||||
| 
 | ||||
| The feature module needs to evaluate the actual firmware error return | ||||
| upon a control command. This adds a flag to struct brcmf_if that the | ||||
| caller can set. This flag is checked to determine the error code that | ||||
| needs to be returned. | ||||
| 
 | ||||
| Fixes: b69c1df47281 ("brcmfmac: separate firmware errors from i/o errors") | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h    |  2 ++ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c | 10 ++++++++++ | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c    |  3 +++ | ||||
|  3 files changed, 15 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| @@ -181,6 +181,7 @@ enum brcmf_netif_stop_reason {
 | ||||
|   * @netif_stop_lock: spinlock for update netif_stop from multiple sources. | ||||
|   * @pend_8021x_cnt: tracks outstanding number of 802.1x frames. | ||||
|   * @pend_8021x_wait: used for signalling change in count. | ||||
| + * @fwil_fwerr: flag indicating fwil layer should return firmware error codes.
 | ||||
|   */ | ||||
|  struct brcmf_if { | ||||
|  	struct brcmf_pub *drvr; | ||||
| @@ -198,6 +199,7 @@ struct brcmf_if {
 | ||||
|  	wait_queue_head_t pend_8021x_wait; | ||||
|  	struct in6_addr ipv6_addr_tbl[NDOL_MAX_ENTRIES]; | ||||
|  	u8 ipv6addr_idx; | ||||
| +	bool fwil_fwerr;
 | ||||
|  }; | ||||
|   | ||||
|  int brcmf_netdev_wait_pend8021x(struct brcmf_if *ifp); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| @@ -104,6 +104,9 @@ static void brcmf_feat_iovar_int_get(str
 | ||||
|  	u32 data; | ||||
|  	int err; | ||||
|   | ||||
| +	/* we need to know firmware error */
 | ||||
| +	ifp->fwil_fwerr = true;
 | ||||
| +
 | ||||
|  	err = brcmf_fil_iovar_int_get(ifp, name, &data); | ||||
|  	if (err == 0) { | ||||
|  		brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]); | ||||
| @@ -112,6 +115,8 @@ static void brcmf_feat_iovar_int_get(str
 | ||||
|  		brcmf_dbg(TRACE, "%s feature check failed: %d\n", | ||||
|  			  brcmf_feat_names[id], err); | ||||
|  	} | ||||
| +
 | ||||
| +	ifp->fwil_fwerr = false;
 | ||||
|  } | ||||
|   | ||||
|  static void brcmf_feat_iovar_data_set(struct brcmf_if *ifp, | ||||
| @@ -120,6 +125,9 @@ static void brcmf_feat_iovar_data_set(st
 | ||||
|  { | ||||
|  	int err; | ||||
|   | ||||
| +	/* we need to know firmware error */
 | ||||
| +	ifp->fwil_fwerr = true;
 | ||||
| +
 | ||||
|  	err = brcmf_fil_iovar_data_set(ifp, name, data, len); | ||||
|  	if (err != -BRCMF_FW_UNSUPPORTED) { | ||||
|  		brcmf_dbg(INFO, "enabling feature: %s\n", brcmf_feat_names[id]); | ||||
| @@ -128,6 +136,8 @@ static void brcmf_feat_iovar_data_set(st
 | ||||
|  		brcmf_dbg(TRACE, "%s feature check failed: %d\n", | ||||
|  			  brcmf_feat_names[id], err); | ||||
|  	} | ||||
| +
 | ||||
| +	ifp->fwil_fwerr = false;
 | ||||
|  } | ||||
|   | ||||
|  #define MAX_CAPS_BUFFER_SIZE	512 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| @@ -131,6 +131,9 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
 | ||||
|  			  brcmf_fil_get_errstr((u32)(-fwerr)), fwerr); | ||||
|  		err = -EBADE; | ||||
|  	} | ||||
| +	if (ifp->fwil_fwerr)
 | ||||
| +		return fwerr;
 | ||||
| +
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| @ -1,64 +0,0 @@ | ||||
| From 455f3e76cfc0d893585a5f358b9ddbe9c1e1e53b Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Wed, 28 Feb 2018 21:15:20 +0100 | ||||
| Subject: [PATCH] brcmfmac: fix P2P_DEVICE ethernet address generation | ||||
| 
 | ||||
| The firmware has a requirement that the P2P_DEVICE address should | ||||
| be different from the address of the primary interface. When not | ||||
| specified by user-space, the driver generates the MAC address for | ||||
| the P2P_DEVICE interface using the MAC address of the primary | ||||
| interface and setting the locally administered bit. However, the MAC | ||||
| address of the primary interface may already have that bit set causing | ||||
| the creation of the P2P_DEVICE interface to fail with -EBUSY. Fix this | ||||
| by using a random address instead to determine the P2P_DEVICE address. | ||||
| 
 | ||||
| Cc: stable@vger.kernel.org # 3.10.y | ||||
| Reported-by: Hans de Goede <hdegoede@redhat.com> | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 24 ++++++++++------------ | ||||
|  1 file changed, 11 insertions(+), 13 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| @@ -462,25 +462,23 @@ static int brcmf_p2p_set_firmware(struct
 | ||||
|   * @dev_addr: optional device address. | ||||
|   * | ||||
|   * P2P needs mac addresses for P2P device and interface. If no device | ||||
| - * address it specified, these are derived from the primary net device, ie.
 | ||||
| - * the permanent ethernet address of the device.
 | ||||
| + * address it specified, these are derived from a random ethernet
 | ||||
| + * address.
 | ||||
|   */ | ||||
|  static void brcmf_p2p_generate_bss_mac(struct brcmf_p2p_info *p2p, u8 *dev_addr) | ||||
|  { | ||||
| -	struct brcmf_if *pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp;
 | ||||
| -	bool local_admin = false;
 | ||||
| +	bool random_addr = false;
 | ||||
|   | ||||
| -	if (!dev_addr || is_zero_ether_addr(dev_addr)) {
 | ||||
| -		dev_addr = pri_ifp->mac_addr;
 | ||||
| -		local_admin = true;
 | ||||
| -	}
 | ||||
| +	if (!dev_addr || is_zero_ether_addr(dev_addr))
 | ||||
| +		random_addr = true;
 | ||||
|   | ||||
| -	/* Generate the P2P Device Address.  This consists of the device's
 | ||||
| -	 * primary MAC address with the locally administered bit set.
 | ||||
| +	/* Generate the P2P Device Address obtaining a random ethernet
 | ||||
| +	 * address with the locally administered bit set.
 | ||||
|  	 */ | ||||
| -	memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
 | ||||
| -	if (local_admin)
 | ||||
| -		p2p->dev_addr[0] |= 0x02;
 | ||||
| +	if (random_addr)
 | ||||
| +		eth_random_addr(p2p->dev_addr);
 | ||||
| +	else
 | ||||
| +		memcpy(p2p->dev_addr, dev_addr, ETH_ALEN);
 | ||||
|   | ||||
|  	/* Generate the P2P Interface Address.  If the discovery and connection | ||||
|  	 * BSSCFGs need to simultaneously co-exist, then this address must be | ||||
| @ -1,157 +0,0 @@ | ||||
| From 1259055170287a350cad453e9eac139c81609860 Mon Sep 17 00:00:00 2001 | ||||
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||
| Date: Thu, 15 Mar 2018 08:29:09 +0100 | ||||
| Subject: [PATCH] brcmfmac: drop Inter-Access Point Protocol packets by default | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| Testing brcmfmac with more recent firmwares resulted in AP interfaces | ||||
| not working in some specific setups. Debugging resulted in discovering | ||||
| support for IAPP in Broadcom's firmwares. | ||||
| 
 | ||||
| Older firmwares were only generating 802.11f frames. Newer ones like: | ||||
| 1) 10.10 (TOB) (r663589) | ||||
| 2) 10.10.122.20 (r683106) | ||||
| for 4366b1 and 4366c0 respectively seem to also /respect/ 802.11f frames | ||||
| in the Tx path by performing a STA disassociation. | ||||
| 
 | ||||
| This obsoleted standard and its implementation is something that: | ||||
| 1) Most people don't need / want to use | ||||
| 2) Can allow local DoS attacks | ||||
| 3) Breaks AP interfaces in some specific bridge setups | ||||
| 
 | ||||
| To solve issues it can cause this commit modifies brcmfmac to drop IAPP | ||||
| packets. If affects: | ||||
| 1) Rx path: driver won't be sending these unwanted packets up. | ||||
| 2) Tx path: driver will reject packets that would trigger STA | ||||
|    disassociation perfromed by a firmware (possible local DoS attack). | ||||
| 
 | ||||
| It appears there are some Broadcom's clients/users who care about this | ||||
| feature despite the drawbacks. They can switch it on using a new module | ||||
| param. | ||||
| 
 | ||||
| This change results in only two more comparisons (check for module param | ||||
| and check for Ethernet packet length) for 99.9% of packets. Its overhead | ||||
| should be very minimal. | ||||
| 
 | ||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  5 ++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.h  |  1 + | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 57 ++++++++++++++++++++++ | ||||
|  3 files changed, 63 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -75,6 +75,10 @@ static int brcmf_roamoff;
 | ||||
|  module_param_named(roamoff, brcmf_roamoff, int, S_IRUSR); | ||||
|  MODULE_PARM_DESC(roamoff, "Do not use internal roaming engine"); | ||||
|   | ||||
| +static int brcmf_iapp_enable;
 | ||||
| +module_param_named(iapp, brcmf_iapp_enable, int, 0);
 | ||||
| +MODULE_PARM_DESC(iapp, "Enable partial support for the obsoleted Inter-Access Point Protocol");
 | ||||
| +
 | ||||
|  #ifdef DEBUG | ||||
|  /* always succeed brcmf_bus_started() */ | ||||
|  static int brcmf_ignore_probe_fail; | ||||
| @@ -441,6 +445,7 @@ struct brcmf_mp_device *brcmf_get_module
 | ||||
|  	settings->feature_disable = brcmf_feature_disable; | ||||
|  	settings->fcmode = brcmf_fcmode; | ||||
|  	settings->roamoff = !!brcmf_roamoff; | ||||
| +	settings->iapp = !!brcmf_iapp_enable;
 | ||||
|  #ifdef DEBUG | ||||
|  	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail; | ||||
|  #endif | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.h
 | ||||
| @@ -58,6 +58,7 @@ struct brcmf_mp_device {
 | ||||
|  	unsigned int	feature_disable; | ||||
|  	int		fcmode; | ||||
|  	bool		roamoff; | ||||
| +	bool		iapp;
 | ||||
|  	bool		ignore_probe_fail; | ||||
|  	struct brcmfmac_pd_cc *country_codes; | ||||
|  	union { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -230,6 +230,37 @@ static void brcmf_netdev_set_multicast_l
 | ||||
|  	schedule_work(&ifp->multicast_work); | ||||
|  } | ||||
|   | ||||
| +/**
 | ||||
| + * brcmf_skb_is_iapp - checks if skb is an IAPP packet
 | ||||
| + *
 | ||||
| + * @skb: skb to check
 | ||||
| + */
 | ||||
| +static bool brcmf_skb_is_iapp(struct sk_buff *skb)
 | ||||
| +{
 | ||||
| +	static const u8 iapp_l2_update_packet[6] __aligned(2) = {
 | ||||
| +		0x00, 0x01, 0xaf, 0x81, 0x01, 0x00,
 | ||||
| +	};
 | ||||
| +	unsigned char *eth_data;
 | ||||
| +#if !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 | ||||
| +	const u16 *a, *b;
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +	if (skb->len - skb->mac_len != 6 ||
 | ||||
| +	    !is_multicast_ether_addr(eth_hdr(skb)->h_dest))
 | ||||
| +		return false;
 | ||||
| +
 | ||||
| +	eth_data = skb_mac_header(skb) + ETH_HLEN;
 | ||||
| +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 | ||||
| +	return !(((*(const u32 *)eth_data) ^ (*(const u32 *)iapp_l2_update_packet)) |
 | ||||
| +		 ((*(const u16 *)(eth_data + 4)) ^ (*(const u16 *)(iapp_l2_update_packet + 4))));
 | ||||
| +#else
 | ||||
| +	a = (const u16 *)eth_data;
 | ||||
| +	b = (const u16 *)iapp_l2_update_packet;
 | ||||
| +
 | ||||
| +	return !((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]));
 | ||||
| +#endif
 | ||||
| +}
 | ||||
| +
 | ||||
|  static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb, | ||||
|  					   struct net_device *ndev) | ||||
|  { | ||||
| @@ -250,6 +281,23 @@ static netdev_tx_t brcmf_netdev_start_xm
 | ||||
|  		goto done; | ||||
|  	} | ||||
|   | ||||
| +	/* Some recent Broadcom's firmwares disassociate STA when they receive
 | ||||
| +	 * an 802.11f ADD frame. This behavior can lead to a local DoS security
 | ||||
| +	 * issue. Attacker may trigger disassociation of any STA by sending a
 | ||||
| +	 * proper Ethernet frame to the wireless interface.
 | ||||
| +	 *
 | ||||
| +	 * Moreover this feature may break AP interfaces in some specific
 | ||||
| +	 * setups. This applies e.g. to the bridge with hairpin mode enabled and
 | ||||
| +	 * IFLA_BRPORT_MCAST_TO_UCAST set. IAPP packet generated by a firmware
 | ||||
| +	 * will get passed back to the wireless interface and cause immediate
 | ||||
| +	 * disassociation of a just-connected STA.
 | ||||
| +	 */
 | ||||
| +	if (!drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
 | ||||
| +		dev_kfree_skb(skb);
 | ||||
| +		ret = -EINVAL;
 | ||||
| +		goto done;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	/* Make sure there's enough writeable headroom */ | ||||
|  	if (skb_headroom(skb) < drvr->hdrlen || skb_header_cloned(skb)) { | ||||
|  		head_delta = max_t(int, drvr->hdrlen - skb_headroom(skb), 0); | ||||
| @@ -325,6 +373,15 @@ void brcmf_txflowblock_if(struct brcmf_i
 | ||||
|   | ||||
|  void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb) | ||||
|  { | ||||
| +	/* Most of Broadcom's firmwares send 802.11f ADD frame every time a new
 | ||||
| +	 * STA connects to the AP interface. This is an obsoleted standard most
 | ||||
| +	 * users don't use, so don't pass these frames up unless requested.
 | ||||
| +	 */
 | ||||
| +	if (!ifp->drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
 | ||||
| +		brcmu_pkt_buf_free_skb(skb);
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	if (skb->pkt_type == PACKET_MULTICAST) | ||||
|  		ifp->ndev->stats.multicast++; | ||||
|   | ||||
| @ -1,29 +0,0 @@ | ||||
| From 9b9322db5c5a1917a66c71fe47c3848a9a31227e Mon Sep 17 00:00:00 2001 | ||||
| From: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Date: Wed, 14 Mar 2018 20:02:59 +0100 | ||||
| Subject: [PATCH] brcmfmac: Fix check for ISO3166 code | ||||
| 
 | ||||
| The commit "regulatory: add NUL to request alpha2" increases the length of | ||||
| alpha2 to 3. This causes a regression on brcmfmac, because | ||||
| brcmf_cfg80211_reg_notifier() expect valid ISO3166 codes in the complete | ||||
| array. So fix this accordingly. | ||||
| 
 | ||||
| Fixes: 657308f73e67 ("regulatory: add NUL to request alpha2") | ||||
| Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com> | ||||
| Acked-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -6803,7 +6803,7 @@ static void brcmf_cfg80211_reg_notifier(
 | ||||
|  		return; | ||||
|   | ||||
|  	/* ignore non-ISO3166 country codes */ | ||||
| -	for (i = 0; i < sizeof(req->alpha2); i++)
 | ||||
| +	for (i = 0; i < 2; i++)
 | ||||
|  		if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') { | ||||
|  			brcmf_err("not an ISO3166 code (0x%02x 0x%02x)\n", | ||||
|  				  req->alpha2[0], req->alpha2[1]); | ||||
| @ -1,45 +0,0 @@ | ||||
| From da472385a29f1fddcac7cfa0499482704310bd16 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:18 +0100 | ||||
| Subject: [PATCH] brcmfmac: move brcmf_bus_preinit() call just after changing | ||||
|  bus state | ||||
| 
 | ||||
| Moving the brcmf_bus_preinit() call allows the bus code to do some | ||||
| required initialization before handling firmware control messages. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c | 3 --- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c   | 5 +++++ | ||||
|  2 files changed, 5 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -369,9 +369,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|   | ||||
|  	/* Enable tx beamforming, errors can be ignored (not supported) */ | ||||
|  	(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1); | ||||
| -
 | ||||
| -	/* do bus specific preinit here */
 | ||||
| -	err = brcmf_bus_preinit(ifp->drvr->bus_if);
 | ||||
|  done: | ||||
|  	return err; | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1091,6 +1091,11 @@ int brcmf_bus_started(struct device *dev
 | ||||
|  	/* signal bus ready */ | ||||
|  	brcmf_bus_change_state(bus_if, BRCMF_BUS_UP); | ||||
|   | ||||
| +	/* do bus specific preinit here */
 | ||||
| +	ret = brcmf_bus_preinit(ifp->drvr->bus_if);
 | ||||
| +	if (ret < 0)
 | ||||
| +		goto fail;
 | ||||
| +
 | ||||
|  	/* Bus is ready, do any initialization */ | ||||
|  	ret = brcmf_c_preinit_dcmds(ifp); | ||||
|  	if (ret < 0) | ||||
| @ -1,69 +0,0 @@ | ||||
| From 4b5adc736828dc25ca33e263ad8c0b9dcd3bf325 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:19 +0100 | ||||
| Subject: [PATCH] brcmfmac: move allocation of control rx buffer to | ||||
|  brcmf_sdio_bus_preinit() | ||||
| 
 | ||||
| Allocate the control rx buffer needed for firmware control interface | ||||
| during brcmf_sdio_bus_preinit(). This relies on common layer setting | ||||
| struct brcmf_bus::maxctl during brcmf_attach(). By moving the allocation | ||||
| we can move brcmf_attach() in subsequent change. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 26 ++++++++++------------ | ||||
|  1 file changed, 12 insertions(+), 14 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -1707,7 +1707,6 @@ brcmf_sdio_read_control(struct brcmf_sdi
 | ||||
|  	int sdret; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
| -
 | ||||
|  	if (bus->rxblen) | ||||
|  		buf = vzalloc(bus->rxblen); | ||||
|  	if (!buf) | ||||
| @@ -3411,6 +3410,18 @@ static int brcmf_sdio_bus_preinit(struct
 | ||||
|  	u32 value; | ||||
|  	int err; | ||||
|   | ||||
| +	/* maxctl provided by common layer */
 | ||||
| +	if (WARN_ON(!bus_if->maxctl))
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	/* Allocate control receive buffer */
 | ||||
| +	bus_if->maxctl += bus->roundup;
 | ||||
| +	value = roundup((bus_if->maxctl + SDPCM_HDRLEN), ALIGNMENT);
 | ||||
| +	value += bus->head_align;
 | ||||
| +	bus->rxbuf = kmalloc(value, GFP_ATOMIC);
 | ||||
| +	if (bus->rxbuf)
 | ||||
| +		bus->rxblen = value;
 | ||||
| +
 | ||||
|  	/* the commands below use the terms tx and rx from | ||||
|  	 * a device perspective, ie. bus:txglom affects the | ||||
|  	 * bus transfers from device to host. | ||||
| @@ -4209,19 +4220,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	bus->blocksize = bus->sdiodev->func2->cur_blksize; | ||||
|  	bus->roundup = min(max_roundup, bus->blocksize); | ||||
|   | ||||
| -	/* Allocate buffers */
 | ||||
| -	if (bus->sdiodev->bus_if->maxctl) {
 | ||||
| -		bus->sdiodev->bus_if->maxctl += bus->roundup;
 | ||||
| -		bus->rxblen =
 | ||||
| -		    roundup((bus->sdiodev->bus_if->maxctl + SDPCM_HDRLEN),
 | ||||
| -			    ALIGNMENT) + bus->head_align;
 | ||||
| -		bus->rxbuf = kmalloc(bus->rxblen, GFP_ATOMIC);
 | ||||
| -		if (!(bus->rxbuf)) {
 | ||||
| -			brcmf_err("rxbuf allocation failed\n");
 | ||||
| -			goto fail;
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| -
 | ||||
|  	sdio_claim_host(bus->sdiodev->func1); | ||||
|   | ||||
|  	/* Disable F2 to clear any intermediate frame state on the dongle */ | ||||
| @ -1,106 +0,0 @@ | ||||
| From 262f2b53f67936b59cc8dfc6f3899ab8905bf1ed Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:20 +0100 | ||||
| Subject: [PATCH] brcmfmac: call brcmf_attach() just before calling | ||||
|  brcmf_bus_started() | ||||
| 
 | ||||
| Now we can move brcmf_attach() until after the firmware has been downloaded | ||||
| to the device. Make the call just before brcmf_bus_started(). | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    |  6 ++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 34 +++++++++++----------- | ||||
|  2 files changed, 23 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1268,6 +1268,12 @@ void brcmf_bus_change_state(struct brcmf
 | ||||
|  	int ifidx; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "%d -> %d\n", bus->state, state); | ||||
| +
 | ||||
| +	if (!drvr) {
 | ||||
| +		brcmf_dbg(INFO, "ignoring transition, bus not attached yet\n");
 | ||||
| +		return;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	bus->state = state; | ||||
|   | ||||
|  	if (state == BRCMF_BUS_UP) { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4048,9 +4048,6 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
| -	if (!bus_if->drvr)
 | ||||
| -		return;
 | ||||
| -
 | ||||
|  	/* try to download image and nvram to the dongle */ | ||||
|  	bus->alp_only = true; | ||||
|  	err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len); | ||||
| @@ -4126,11 +4123,28 @@ static void brcmf_sdio_firmware_callback
 | ||||
|   | ||||
|  	sdio_release_host(sdiodev->func1); | ||||
|   | ||||
| +	/* Assign bus interface call back */
 | ||||
| +	sdiodev->bus_if->dev = sdiodev->dev;
 | ||||
| +	sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
 | ||||
| +	sdiodev->bus_if->chip = bus->ci->chip;
 | ||||
| +	sdiodev->bus_if->chiprev = bus->ci->chiprev;
 | ||||
| +
 | ||||
| +	/* Attach to the common layer, reserve hdr space */
 | ||||
| +	err = brcmf_attach(sdiodev->dev, sdiodev->settings);
 | ||||
| +	if (err != 0) {
 | ||||
| +		brcmf_err("brcmf_attach failed\n");
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	brcmf_sdio_debugfs_create(bus);
 | ||||
| +
 | ||||
|  	err = brcmf_bus_started(dev); | ||||
|  	if (err != 0) { | ||||
|  		brcmf_err("dongle is not responding\n"); | ||||
|  		goto fail; | ||||
|  	} | ||||
| +
 | ||||
| +	/* ready */
 | ||||
|  	return; | ||||
|   | ||||
|  release: | ||||
| @@ -4200,22 +4214,9 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	bus->dpc_triggered = false; | ||||
|  	bus->dpc_running = false; | ||||
|   | ||||
| -	/* Assign bus interface call back */
 | ||||
| -	bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
 | ||||
| -	bus->sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
 | ||||
| -	bus->sdiodev->bus_if->chip = bus->ci->chip;
 | ||||
| -	bus->sdiodev->bus_if->chiprev = bus->ci->chiprev;
 | ||||
| -
 | ||||
|  	/* default sdio bus header length for tx packet */ | ||||
|  	bus->tx_hdrlen = SDPCM_HWHDR_LEN + SDPCM_SWHDR_LEN; | ||||
|   | ||||
| -	/* Attach to the common layer, reserve hdr space */
 | ||||
| -	ret = brcmf_attach(bus->sdiodev->dev, bus->sdiodev->settings);
 | ||||
| -	if (ret != 0) {
 | ||||
| -		brcmf_err("brcmf_attach failed\n");
 | ||||
| -		goto fail;
 | ||||
| -	}
 | ||||
| -
 | ||||
|  	/* Query the F2 block size, set roundup accordingly */ | ||||
|  	bus->blocksize = bus->sdiodev->func2->cur_blksize; | ||||
|  	bus->roundup = min(max_roundup, bus->blocksize); | ||||
| @@ -4240,7 +4241,6 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	/* SR state */ | ||||
|  	bus->sr_enabled = false; | ||||
|   | ||||
| -	brcmf_sdio_debugfs_create(bus);
 | ||||
|  	brcmf_dbg(INFO, "completed!!\n"); | ||||
|   | ||||
|  	ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev, | ||||
| @ -1,41 +0,0 @@ | ||||
| From a7f4a80c0070b673d4a4ce94b99979ea6d0c6296 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:21 +0100 | ||||
| Subject: [PATCH] brcmfmac: usb: call brcmf_usb_up() during brcmf_bus_preinit() | ||||
| 
 | ||||
| By calling brcmf_usb_up() during brcmf_bus_preinit() it does not need | ||||
| to be called in brcmf_usb_bus_setup(). | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 7 ++----- | ||||
|  1 file changed, 2 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1146,8 +1146,9 @@ static int brcmf_usb_get_fwname(struct d
 | ||||
|  } | ||||
|   | ||||
|  static const struct brcmf_bus_ops brcmf_usb_bus_ops = { | ||||
| -	.txdata = brcmf_usb_tx,
 | ||||
| +	.preinit = brcmf_usb_up,
 | ||||
|  	.stop = brcmf_usb_down, | ||||
| +	.txdata = brcmf_usb_tx,
 | ||||
|  	.txctl = brcmf_usb_tx_ctlpkt, | ||||
|  	.rxctl = brcmf_usb_rx_ctlpkt, | ||||
|  	.wowl_config = brcmf_usb_wowl_config, | ||||
| @@ -1165,10 +1166,6 @@ static int brcmf_usb_bus_setup(struct br
 | ||||
|  		return ret; | ||||
|  	} | ||||
|   | ||||
| -	ret = brcmf_usb_up(devinfo->dev);
 | ||||
| -	if (ret)
 | ||||
| -		goto fail;
 | ||||
| -
 | ||||
|  	ret = brcmf_bus_started(devinfo->dev); | ||||
|  	if (ret) | ||||
|  		goto fail; | ||||
| @ -1,130 +0,0 @@ | ||||
| From 0542503c4c164c65cd1567b0f2b3f887af6c81eb Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:22 +0100 | ||||
| Subject: [PATCH] brcmfmac: move brcmf_attach() function in core.c | ||||
| 
 | ||||
| Moving the function in preparation of subsequent patch. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 98 +++++++++++----------- | ||||
|  1 file changed, 49 insertions(+), 49 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -992,55 +992,6 @@ static int brcmf_inet6addr_changed(struc
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| -int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 | ||||
| -{
 | ||||
| -	struct brcmf_pub *drvr = NULL;
 | ||||
| -	int ret = 0;
 | ||||
| -	int i;
 | ||||
| -
 | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| -
 | ||||
| -	/* Allocate primary brcmf_info */
 | ||||
| -	drvr = kzalloc(sizeof(struct brcmf_pub), GFP_ATOMIC);
 | ||||
| -	if (!drvr)
 | ||||
| -		return -ENOMEM;
 | ||||
| -
 | ||||
| -	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
 | ||||
| -		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
 | ||||
| -
 | ||||
| -	mutex_init(&drvr->proto_block);
 | ||||
| -
 | ||||
| -	/* Link to bus module */
 | ||||
| -	drvr->hdrlen = 0;
 | ||||
| -	drvr->bus_if = dev_get_drvdata(dev);
 | ||||
| -	drvr->bus_if->drvr = drvr;
 | ||||
| -	drvr->settings = settings;
 | ||||
| -
 | ||||
| -	/* attach debug facilities */
 | ||||
| -	brcmf_debug_attach(drvr);
 | ||||
| -
 | ||||
| -	/* Attach and link in the protocol */
 | ||||
| -	ret = brcmf_proto_attach(drvr);
 | ||||
| -	if (ret != 0) {
 | ||||
| -		brcmf_err("brcmf_prot_attach failed\n");
 | ||||
| -		goto fail;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	/* Attach to events important for core code */
 | ||||
| -	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
 | ||||
| -			    brcmf_psm_watchdog_notify);
 | ||||
| -
 | ||||
| -	/* attach firmware event handler */
 | ||||
| -	brcmf_fweh_attach(drvr);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -
 | ||||
| -fail:
 | ||||
| -	brcmf_detach(dev);
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static int brcmf_revinfo_read(struct seq_file *s, void *data) | ||||
|  { | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(s->private); | ||||
| @@ -1170,6 +1121,55 @@ fail:
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| +
 | ||||
| +int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
 | ||||
| +{
 | ||||
| +	struct brcmf_pub *drvr = NULL;
 | ||||
| +	int ret = 0;
 | ||||
| +	int i;
 | ||||
| +
 | ||||
| +	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +
 | ||||
| +	/* Allocate primary brcmf_info */
 | ||||
| +	drvr = kzalloc(sizeof(*drvr), GFP_ATOMIC);
 | ||||
| +	if (!drvr)
 | ||||
| +		return -ENOMEM;
 | ||||
| +
 | ||||
| +	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
 | ||||
| +		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
 | ||||
| +
 | ||||
| +	mutex_init(&drvr->proto_block);
 | ||||
| +
 | ||||
| +	/* Link to bus module */
 | ||||
| +	drvr->hdrlen = 0;
 | ||||
| +	drvr->bus_if = dev_get_drvdata(dev);
 | ||||
| +	drvr->bus_if->drvr = drvr;
 | ||||
| +	drvr->settings = settings;
 | ||||
| +
 | ||||
| +	/* attach debug facilities */
 | ||||
| +	brcmf_debug_attach(drvr);
 | ||||
| +
 | ||||
| +	/* Attach and link in the protocol */
 | ||||
| +	ret = brcmf_proto_attach(drvr);
 | ||||
| +	if (ret != 0) {
 | ||||
| +		brcmf_err("brcmf_prot_attach failed\n");
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/* Attach to events important for core code */
 | ||||
| +	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
 | ||||
| +			    brcmf_psm_watchdog_notify);
 | ||||
| +
 | ||||
| +	/* attach firmware event handler */
 | ||||
| +	brcmf_fweh_attach(drvr);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +
 | ||||
| +fail:
 | ||||
| +	brcmf_detach(dev);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
| +}
 | ||||
|   | ||||
|  void brcmf_bus_add_txhdrlen(struct device *dev, uint len) | ||||
|  { | ||||
| @ -1,190 +0,0 @@ | ||||
| From de2a3027f6f15e2f6558dc4d178282ccc1f054db Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:23 +0100 | ||||
| Subject: [PATCH] brcmfmac: remove brcmf_bus_started() from bus api | ||||
| 
 | ||||
| No longer needed to call this in bus layer so make it static and call | ||||
| it in the last phase of brcmf_attach() instead. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  1 - | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 14 +++++++---- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 20 +--------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 10 ++------ | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 28 ++++------------------ | ||||
|  5 files changed, 16 insertions(+), 57 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| @@ -253,7 +253,6 @@ void brcmf_dev_reset(struct device *dev)
 | ||||
|  /* Configure the "global" bus state used by upper layers */ | ||||
|  void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state); | ||||
|   | ||||
| -int brcmf_bus_started(struct device *dev);
 | ||||
|  s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len); | ||||
|  void brcmf_bus_add_txhdrlen(struct device *dev, uint len); | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1022,11 +1022,10 @@ static int brcmf_revinfo_read(struct seq
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -int brcmf_bus_started(struct device *dev)
 | ||||
| +static int brcmf_bus_started(struct brcmf_pub *drvr)
 | ||||
|  { | ||||
|  	int ret = -1; | ||||
| -	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
 | ||||
| -	struct brcmf_pub *drvr = bus_if->drvr;
 | ||||
| +	struct brcmf_bus *bus_if = drvr->bus_if;
 | ||||
|  	struct brcmf_if *ifp; | ||||
|  	struct brcmf_if *p2p_ifp; | ||||
|   | ||||
| @@ -1043,7 +1042,7 @@ int brcmf_bus_started(struct device *dev
 | ||||
|  	brcmf_bus_change_state(bus_if, BRCMF_BUS_UP); | ||||
|   | ||||
|  	/* do bus specific preinit here */ | ||||
| -	ret = brcmf_bus_preinit(ifp->drvr->bus_if);
 | ||||
| +	ret = brcmf_bus_preinit(bus_if);
 | ||||
|  	if (ret < 0) | ||||
|  		goto fail; | ||||
|   | ||||
| @@ -1163,7 +1162,12 @@ int brcmf_attach(struct device *dev, str
 | ||||
|  	/* attach firmware event handler */ | ||||
|  	brcmf_fweh_attach(drvr); | ||||
|   | ||||
| -	return ret;
 | ||||
| +	ret = brcmf_bus_started(drvr);
 | ||||
| +	if (ret != 0) {
 | ||||
| +		brcmf_err("dongle is not responding: err=%d\n", ret);
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
|   | ||||
|  fail: | ||||
|  	brcmf_detach(dev); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1581,24 +1581,6 @@ static void brcmf_pcie_release_resource(
 | ||||
|  } | ||||
|   | ||||
|   | ||||
| -static int brcmf_pcie_attach_bus(struct brcmf_pciedev_info *devinfo)
 | ||||
| -{
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	/* Attach to the common driver interface */
 | ||||
| -	ret = brcmf_attach(&devinfo->pdev->dev, devinfo->settings);
 | ||||
| -	if (ret) {
 | ||||
| -		brcmf_err("brcmf_attach failed\n");
 | ||||
| -	} else {
 | ||||
| -		ret = brcmf_bus_started(&devinfo->pdev->dev);
 | ||||
| -		if (ret)
 | ||||
| -			brcmf_err("dongle is not responding\n");
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
| -
 | ||||
|  static u32 brcmf_pcie_buscore_prep_addr(const struct pci_dev *pdev, u32 addr) | ||||
|  { | ||||
|  	u32 ret_addr; | ||||
| @@ -1735,7 +1717,7 @@ static void brcmf_pcie_setup(struct devi
 | ||||
|  	init_waitqueue_head(&devinfo->mbdata_resp_wait); | ||||
|   | ||||
|  	brcmf_pcie_intr_enable(devinfo); | ||||
| -	if (brcmf_pcie_attach_bus(devinfo) == 0)
 | ||||
| +	if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
 | ||||
|  		return; | ||||
|   | ||||
|  	brcmf_pcie_bus_console_read(devinfo); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -3422,6 +3422,8 @@ static int brcmf_sdio_bus_preinit(struct
 | ||||
|  	if (bus->rxbuf) | ||||
|  		bus->rxblen = value; | ||||
|   | ||||
| +	brcmf_sdio_debugfs_create(bus);
 | ||||
| +
 | ||||
|  	/* the commands below use the terms tx and rx from | ||||
|  	 * a device perspective, ie. bus:txglom affects the | ||||
|  	 * bus transfers from device to host. | ||||
| @@ -4136,14 +4138,6 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| -	brcmf_sdio_debugfs_create(bus);
 | ||||
| -
 | ||||
| -	err = brcmf_bus_started(dev);
 | ||||
| -	if (err != 0) {
 | ||||
| -		brcmf_err("dongle is not responding\n");
 | ||||
| -		goto fail;
 | ||||
| -	}
 | ||||
| -
 | ||||
|  	/* ready */ | ||||
|  	return; | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1155,27 +1155,6 @@ static const struct brcmf_bus_ops brcmf_
 | ||||
|  	.get_fwname = brcmf_usb_get_fwname, | ||||
|  }; | ||||
|   | ||||
| -static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo)
 | ||||
| -{
 | ||||
| -	int ret;
 | ||||
| -
 | ||||
| -	/* Attach to the common driver interface */
 | ||||
| -	ret = brcmf_attach(devinfo->dev, devinfo->settings);
 | ||||
| -	if (ret) {
 | ||||
| -		brcmf_err("brcmf_attach failed\n");
 | ||||
| -		return ret;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	ret = brcmf_bus_started(devinfo->dev);
 | ||||
| -	if (ret)
 | ||||
| -		goto fail;
 | ||||
| -
 | ||||
| -	return 0;
 | ||||
| -fail:
 | ||||
| -	brcmf_detach(devinfo->dev);
 | ||||
| -	return ret;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static void brcmf_usb_probe_phase2(struct device *dev, int ret, | ||||
|  				   const struct firmware *fw, | ||||
|  				   void *nvram, u32 nvlen) | ||||
| @@ -1203,7 +1182,8 @@ static void brcmf_usb_probe_phase2(struc
 | ||||
|  	if (ret) | ||||
|  		goto error; | ||||
|   | ||||
| -	ret = brcmf_usb_bus_setup(devinfo);
 | ||||
| +	/* Attach to the common driver interface */
 | ||||
| +	ret = brcmf_attach(devinfo->dev, devinfo->settings);
 | ||||
|  	if (ret) | ||||
|  		goto error; | ||||
|   | ||||
| @@ -1253,7 +1233,7 @@ static int brcmf_usb_probe_cb(struct brc
 | ||||
|  	} | ||||
|   | ||||
|  	if (!brcmf_usb_dlneeded(devinfo)) { | ||||
| -		ret = brcmf_usb_bus_setup(devinfo);
 | ||||
| +		ret = brcmf_attach(devinfo->dev, devinfo->settings);
 | ||||
|  		if (ret) | ||||
|  			goto fail; | ||||
|  		/* we are done */ | ||||
| @@ -1456,7 +1436,7 @@ static int brcmf_usb_resume(struct usb_i
 | ||||
|   | ||||
|  	brcmf_dbg(USB, "Enter\n"); | ||||
|  	if (!devinfo->wowl_enabled) | ||||
| -		return brcmf_usb_bus_setup(devinfo);
 | ||||
| +		return brcmf_attach(devinfo->dev, devinfo->settings);
 | ||||
|   | ||||
|  	devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP; | ||||
|  	brcmf_usb_rx_fill_all(devinfo); | ||||
| @ -1,64 +0,0 @@ | ||||
| From d678296bfb9a630d0000222fc21f4ed0d0d65332 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:24 +0100 | ||||
| Subject: [PATCH] brcmfmac: change log level for some low-level sdio functions | ||||
| 
 | ||||
| Reducing the number of trace level messages in sdio code giving | ||||
| them sdio log level instead. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 10 +++++----- | ||||
|  1 file changed, 5 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -1706,7 +1706,7 @@ brcmf_sdio_read_control(struct brcmf_sdi
 | ||||
|  	u8 *buf = NULL, *rbuf; | ||||
|  	int sdret; | ||||
|   | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +	brcmf_dbg(SDIO, "Enter\n");
 | ||||
|  	if (bus->rxblen) | ||||
|  		buf = vzalloc(bus->rxblen); | ||||
|  	if (!buf) | ||||
| @@ -1809,7 +1809,7 @@ static uint brcmf_sdio_readframes(struct
 | ||||
|  	struct brcmf_sdio_hdrinfo *rd = &bus->cur_read, rd_new; | ||||
|  	u8 head_read = 0; | ||||
|   | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +	brcmf_dbg(SDIO, "Enter\n");
 | ||||
|   | ||||
|  	/* Not finished unless we encounter no more frames indication */ | ||||
|  	bus->rxpending = true; | ||||
| @@ -2344,7 +2344,7 @@ static int brcmf_sdio_tx_ctrlframe(struc
 | ||||
|  	struct brcmf_sdio_hdrinfo hd_info = {0}; | ||||
|  	int ret; | ||||
|   | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +	brcmf_dbg(SDIO, "Enter\n");
 | ||||
|   | ||||
|  	/* Back the pointer to make room for bus header */ | ||||
|  	frame -= bus->tx_hdrlen; | ||||
| @@ -2520,7 +2520,7 @@ static void brcmf_sdio_dpc(struct brcmf_
 | ||||
|  	uint framecnt;			/* Temporary counter of tx/rx frames */ | ||||
|  	int err = 0; | ||||
|   | ||||
| -	brcmf_dbg(TRACE, "Enter\n");
 | ||||
| +	brcmf_dbg(SDIO, "Enter\n");
 | ||||
|   | ||||
|  	sdio_claim_host(bus->sdiodev->func1); | ||||
|   | ||||
| @@ -2605,7 +2605,7 @@ static void brcmf_sdio_dpc(struct brcmf_
 | ||||
|   | ||||
|  	/* Would be active due to wake-wlan in gSPI */ | ||||
|  	if (intstatus & I_CHIPACTIVE) { | ||||
| -		brcmf_dbg(INFO, "Dongle reports CHIPACTIVE\n");
 | ||||
| +		brcmf_dbg(SDIO, "Dongle reports CHIPACTIVE\n");
 | ||||
|  		intstatus &= ~I_CHIPACTIVE; | ||||
|  	} | ||||
|   | ||||
| @ -1,126 +0,0 @@ | ||||
| From 2d6edad4b2da1991f74e7b02053eeb4a043b887f Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 20 Feb 2018 00:14:25 +0100 | ||||
| Subject: [PATCH] brcmfmac: remove duplicate pointer variable from | ||||
|  brcmf_sdio_firmware_callback() | ||||
| 
 | ||||
| In brcmf_sdio_firmware_callback() two pointer variables were used | ||||
| pointing to the same construct. Get rid of sdiodev variable. | ||||
| 
 | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 37 +++++++++++----------- | ||||
|  1 file changed, 18 insertions(+), 19 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4039,9 +4039,8 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  					 void *nvram, u32 nvram_len) | ||||
|  { | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
| -	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
 | ||||
| -	struct brcmf_sdio *bus = sdiodev->bus;
 | ||||
| -	struct brcmf_sdio_dev *sdiod = bus->sdiodev;
 | ||||
| +	struct brcmf_sdio_dev *sdiod = bus_if->bus_priv.sdio;
 | ||||
| +	struct brcmf_sdio *bus = sdiod->bus;
 | ||||
|  	struct brcmf_core *core = bus->sdio_core; | ||||
|  	u8 saveclk; | ||||
|   | ||||
| @@ -4061,7 +4060,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	bus->sdcnt.tickcnt = 0; | ||||
|  	brcmf_sdio_wd_timer(bus, true); | ||||
|   | ||||
| -	sdio_claim_host(sdiodev->func1);
 | ||||
| +	sdio_claim_host(sdiod->func1);
 | ||||
|   | ||||
|  	/* Make sure backplane clock is on, needed to generate F2 interrupt */ | ||||
|  	brcmf_sdio_clkctl(bus, CLK_AVAIL, false); | ||||
| @@ -4069,9 +4068,9 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		goto release; | ||||
|   | ||||
|  	/* Force clocks on backplane to be sure F2 interrupt propagates */ | ||||
| -	saveclk = brcmf_sdiod_readb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR, &err);
 | ||||
| +	saveclk = brcmf_sdiod_readb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR, &err);
 | ||||
|  	if (!err) { | ||||
| -		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +		brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
|  				   (saveclk | SBSDIO_FORCE_HT), &err); | ||||
|  	} | ||||
|  	if (err) { | ||||
| @@ -4083,7 +4082,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	brcmf_sdiod_writel(sdiod, core->base + SD_REG(tosbmailboxdata), | ||||
|  			   SDPCM_PROT_VERSION << SMB_DATA_VERSION_SHIFT, NULL); | ||||
|   | ||||
| -	err = sdio_enable_func(sdiodev->func2);
 | ||||
| +	err = sdio_enable_func(sdiod->func2);
 | ||||
|   | ||||
|  	brcmf_dbg(INFO, "enable F2: err=%d\n", err); | ||||
|   | ||||
| @@ -4095,10 +4094,10 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  				   bus->hostintmask, NULL); | ||||
|   | ||||
|   | ||||
| -		brcmf_sdiod_writeb(sdiodev, SBSDIO_WATERMARK, 8, &err);
 | ||||
| +		brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, 8, &err);
 | ||||
|  	} else { | ||||
|  		/* Disable F2 again */ | ||||
| -		sdio_disable_func(sdiodev->func2);
 | ||||
| +		sdio_disable_func(sdiod->func2);
 | ||||
|  		goto release; | ||||
|  	} | ||||
|   | ||||
| @@ -4106,7 +4105,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		brcmf_sdio_sr_init(bus); | ||||
|  	} else { | ||||
|  		/* Restore previous clock setting */ | ||||
| -		brcmf_sdiod_writeb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
| +		brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_CHIPCLKCSR,
 | ||||
|  				   saveclk, &err); | ||||
|  	} | ||||
|   | ||||
| @@ -4114,7 +4113,7 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  		/* Allow full data communication using DPC from now on. */ | ||||
|  		brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA); | ||||
|   | ||||
| -		err = brcmf_sdiod_intr_register(sdiodev);
 | ||||
| +		err = brcmf_sdiod_intr_register(sdiod);
 | ||||
|  		if (err != 0) | ||||
|  			brcmf_err("intr register failed:%d\n", err); | ||||
|  	} | ||||
| @@ -4123,16 +4122,16 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	if (err != 0) | ||||
|  		brcmf_sdio_clkctl(bus, CLK_NONE, false); | ||||
|   | ||||
| -	sdio_release_host(sdiodev->func1);
 | ||||
| +	sdio_release_host(sdiod->func1);
 | ||||
|   | ||||
|  	/* Assign bus interface call back */ | ||||
| -	sdiodev->bus_if->dev = sdiodev->dev;
 | ||||
| -	sdiodev->bus_if->ops = &brcmf_sdio_bus_ops;
 | ||||
| -	sdiodev->bus_if->chip = bus->ci->chip;
 | ||||
| -	sdiodev->bus_if->chiprev = bus->ci->chiprev;
 | ||||
| +	sdiod->bus_if->dev = sdiod->dev;
 | ||||
| +	sdiod->bus_if->ops = &brcmf_sdio_bus_ops;
 | ||||
| +	sdiod->bus_if->chip = bus->ci->chip;
 | ||||
| +	sdiod->bus_if->chiprev = bus->ci->chiprev;
 | ||||
|   | ||||
|  	/* Attach to the common layer, reserve hdr space */ | ||||
| -	err = brcmf_attach(sdiodev->dev, sdiodev->settings);
 | ||||
| +	err = brcmf_attach(sdiod->dev, sdiod->settings);
 | ||||
|  	if (err != 0) { | ||||
|  		brcmf_err("brcmf_attach failed\n"); | ||||
|  		goto fail; | ||||
| @@ -4142,10 +4141,10 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	return; | ||||
|   | ||||
|  release: | ||||
| -	sdio_release_host(sdiodev->func1);
 | ||||
| +	sdio_release_host(sdiod->func1);
 | ||||
|  fail: | ||||
|  	brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), err); | ||||
| -	device_release_driver(&sdiodev->func2->dev);
 | ||||
| +	device_release_driver(&sdiod->func2->dev);
 | ||||
|  	device_release_driver(dev); | ||||
|  } | ||||
|   | ||||
| @ -1,27 +0,0 @@ | ||||
| From 64d1519edc959f5b8f86a66a51c40971c215e4ec Mon Sep 17 00:00:00 2001 | ||||
| From: Johannes Berg <johannes.berg@intel.com> | ||||
| Date: Mon, 19 Feb 2018 13:30:45 +0100 | ||||
| Subject: [PATCH] brcmfmac: reject too long PSK | ||||
| 
 | ||||
| nl80211 already allows specifying 48 bytes, but brcmfmac | ||||
| only supports 32. Reject keys that are too long. | ||||
| 
 | ||||
| Signed-off-by: Johannes Berg <johannes.berg@intel.com> | ||||
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -5125,6 +5125,9 @@ static int brcmf_cfg80211_set_pmk(struct
 | ||||
|  	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X)) | ||||
|  		return -EINVAL; | ||||
|   | ||||
| +	if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
 | ||||
| +		return -ERANGE;
 | ||||
| +
 | ||||
|  	return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len); | ||||
|  } | ||||
|   | ||||
| @ -1,31 +0,0 @@ | ||||
| From 1170f6d1be6a39e1a115a2c0f50923eb4ce2a7ec Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:20 +0100 | ||||
| Subject: [PATCH] brcmfmac: do not convert linux error to firmware error string | ||||
| 
 | ||||
| In case of a linux error brcmf_fil_cmd_data() blurts an error message | ||||
| in which the error code is translated to an error string. However, it | ||||
| maps it to a firmware error string which should not happen. Simply | ||||
| print only the numeric error code and be done with it. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c | 3 +-- | ||||
|  1 file changed, 1 insertion(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwil.c
 | ||||
| @@ -124,8 +124,7 @@ brcmf_fil_cmd_data(struct brcmf_if *ifp,
 | ||||
|  					     data, len, &fwerr); | ||||
|   | ||||
|  	if (err) { | ||||
| -		brcmf_dbg(FIL, "Failed: %s (%d)\n",
 | ||||
| -			  brcmf_fil_get_errstr((u32)(-err)), err);
 | ||||
| +		brcmf_dbg(FIL, "Failed: error=%d\n", err);
 | ||||
|  	} else if (fwerr < 0) { | ||||
|  		brcmf_dbg(FIL, "Firmware error: %s (%d)\n", | ||||
|  			  brcmf_fil_get_errstr((u32)(-fwerr)), fwerr); | ||||
| @ -1,203 +0,0 @@ | ||||
| From 756a2b390874d274f2f615921318ef0856ff9313 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:21 +0100 | ||||
| Subject: [PATCH] brcmfmac: use brcmf_chip_name() to store name in revinfo | ||||
| 
 | ||||
| The chip id can either be four or five digits. For the chip name either | ||||
| the hexadecimal value needs to be taken (four digits) or the decimal | ||||
| value (five digits). The function brcmf_chip_name() does this conversion | ||||
| so use it to store the name in driver revision info. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/chip.c    |  9 +++++---- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/chip.h    |  3 ++- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  | 23 ++++++++++++++++------ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 10 +--------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  3 +-- | ||||
|  5 files changed, 26 insertions(+), 22 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| @@ -464,12 +464,12 @@ static void brcmf_chip_ai_resetcore(stru
 | ||||
|  	ci->ops->read32(ci->ctx, core->wrapbase + BCMA_IOCTL); | ||||
|  } | ||||
|   | ||||
| -static char *brcmf_chip_name(uint chipid, char *buf, uint len)
 | ||||
| +char *brcmf_chip_name(u32 id, u32 rev, char *buf, uint len)
 | ||||
|  { | ||||
|  	const char *fmt; | ||||
|   | ||||
| -	fmt = ((chipid > 0xa000) || (chipid < 0x4000)) ? "%d" : "%x";
 | ||||
| -	snprintf(buf, len, fmt, chipid);
 | ||||
| +	fmt = ((id > 0xa000) || (id < 0x4000)) ? "BCM%d/%u" : "BCM%x/%u";
 | ||||
| +	snprintf(buf, len, fmt, id, rev);
 | ||||
|  	return buf; | ||||
|  } | ||||
|   | ||||
| @@ -924,7 +924,8 @@ static int brcmf_chip_recognition(struct
 | ||||
|  	ci->pub.chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; | ||||
|  	socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT; | ||||
|   | ||||
| -	brcmf_chip_name(ci->pub.chip, ci->pub.name, sizeof(ci->pub.name));
 | ||||
| +	brcmf_chip_name(ci->pub.chip, ci->pub.chiprev,
 | ||||
| +			ci->pub.name, sizeof(ci->pub.name));
 | ||||
|  	brcmf_dbg(INFO, "found %s chip: BCM%s, rev=%d\n", | ||||
|  		  socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name, | ||||
|  		  ci->pub.chiprev); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.h
 | ||||
| @@ -45,7 +45,7 @@ struct brcmf_chip {
 | ||||
|  	u32 rambase; | ||||
|  	u32 ramsize; | ||||
|  	u32 srsize; | ||||
| -	char name[8];
 | ||||
| +	char name[12];
 | ||||
|  }; | ||||
|   | ||||
|  /** | ||||
| @@ -93,5 +93,6 @@ void brcmf_chip_resetcore(struct brcmf_c
 | ||||
|  void brcmf_chip_set_passive(struct brcmf_chip *ci); | ||||
|  bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec); | ||||
|  bool brcmf_chip_sr_capable(struct brcmf_chip *pub); | ||||
| +char *brcmf_chip_name(u32 chipid, u32 chiprev, char *buf, uint len);
 | ||||
|   | ||||
|  #endif /* BRCMF_AXIDMP_H */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -30,6 +30,7 @@
 | ||||
|  #include "common.h" | ||||
|  #include "of.h" | ||||
|  #include "firmware.h" | ||||
| +#include "chip.h"
 | ||||
|   | ||||
|  MODULE_AUTHOR("Broadcom Corporation"); | ||||
|  MODULE_DESCRIPTION("Broadcom 802.11 wireless LAN fullmac driver."); | ||||
| @@ -131,14 +132,13 @@ static int brcmf_c_download(struct brcmf
 | ||||
|  static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name) | ||||
|  { | ||||
|  	struct brcmf_bus *bus = ifp->drvr->bus_if; | ||||
| -	struct brcmf_rev_info *ri = &ifp->drvr->revinfo;
 | ||||
|  	u8 fw_name[BRCMF_FW_NAME_LEN]; | ||||
|  	u8 *ptr; | ||||
|  	size_t len; | ||||
|  	s32 err; | ||||
|   | ||||
|  	memset(fw_name, 0, BRCMF_FW_NAME_LEN); | ||||
| -	err = brcmf_bus_get_fwname(bus, ri->chipnum, ri->chiprev, fw_name);
 | ||||
| +	err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("get firmware name failed (%d)\n", err); | ||||
|  		goto done; | ||||
| @@ -238,6 +238,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  { | ||||
|  	s8 eventmask[BRCMF_EVENTING_MASK_LEN]; | ||||
|  	u8 buf[BRCMF_DCMD_SMLEN]; | ||||
| +	struct brcmf_bus *bus;
 | ||||
|  	struct brcmf_rev_info_le revinfo; | ||||
|  	struct brcmf_rev_info *ri; | ||||
|  	char *clmver; | ||||
| @@ -253,16 +254,18 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  	} | ||||
|  	memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac)); | ||||
|   | ||||
| +	bus = ifp->drvr->bus_if;
 | ||||
| +	ri = &ifp->drvr->revinfo;
 | ||||
| +
 | ||||
|  	err = brcmf_fil_cmd_data_get(ifp, BRCMF_C_GET_REVINFO, | ||||
|  				     &revinfo, sizeof(revinfo)); | ||||
| -	ri = &ifp->drvr->revinfo;
 | ||||
|  	if (err < 0) { | ||||
|  		brcmf_err("retrieving revision info failed, %d\n", err); | ||||
| +		strlcpy(ri->chipname, "UNKNOWN", sizeof(ri->chipname));
 | ||||
|  	} else { | ||||
|  		ri->vendorid = le32_to_cpu(revinfo.vendorid); | ||||
|  		ri->deviceid = le32_to_cpu(revinfo.deviceid); | ||||
|  		ri->radiorev = le32_to_cpu(revinfo.radiorev); | ||||
| -		ri->chiprev = le32_to_cpu(revinfo.chiprev);
 | ||||
|  		ri->corerev = le32_to_cpu(revinfo.corerev); | ||||
|  		ri->boardid = le32_to_cpu(revinfo.boardid); | ||||
|  		ri->boardvendor = le32_to_cpu(revinfo.boardvendor); | ||||
| @@ -270,15 +273,23 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  		ri->driverrev = le32_to_cpu(revinfo.driverrev); | ||||
|  		ri->ucoderev = le32_to_cpu(revinfo.ucoderev); | ||||
|  		ri->bus = le32_to_cpu(revinfo.bus); | ||||
| -		ri->chipnum = le32_to_cpu(revinfo.chipnum);
 | ||||
|  		ri->phytype = le32_to_cpu(revinfo.phytype); | ||||
|  		ri->phyrev = le32_to_cpu(revinfo.phyrev); | ||||
|  		ri->anarev = le32_to_cpu(revinfo.anarev); | ||||
|  		ri->chippkg = le32_to_cpu(revinfo.chippkg); | ||||
|  		ri->nvramrev = le32_to_cpu(revinfo.nvramrev); | ||||
| +
 | ||||
| +		if (!bus->chip) {
 | ||||
| +			bus->chip = le32_to_cpu(revinfo.chipnum);
 | ||||
| +			bus->chiprev = le32_to_cpu(revinfo.chiprev);
 | ||||
| +		}
 | ||||
|  	} | ||||
|  	ri->result = err; | ||||
|   | ||||
| +	if (bus->chip)
 | ||||
| +		brcmf_chip_name(bus->chip, bus->chiprev,
 | ||||
| +				ri->chipname, sizeof(ri->chipname));
 | ||||
| +
 | ||||
|  	/* Do any CLM downloading */ | ||||
|  	err = brcmf_c_process_clm_blob(ifp); | ||||
|  	if (err < 0) { | ||||
| @@ -299,7 +310,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  	strsep(&ptr, "\n"); | ||||
|   | ||||
|  	/* Print fw version info */ | ||||
| -	brcmf_info("Firmware version = %s\n", buf);
 | ||||
| +	brcmf_info("Firmware: %s %s\n", ri->chipname, buf);
 | ||||
|   | ||||
|  	/* locate firmware version number for ethtool */ | ||||
|  	ptr = strrchr(buf, ' ') + 1; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1002,8 +1002,7 @@ static int brcmf_revinfo_read(struct seq
 | ||||
|  	seq_printf(s, "vendorid: 0x%04x\n", ri->vendorid); | ||||
|  	seq_printf(s, "deviceid: 0x%04x\n", ri->deviceid); | ||||
|  	seq_printf(s, "radiorev: %s\n", brcmu_dotrev_str(ri->radiorev, drev)); | ||||
| -	seq_printf(s, "chipnum: %u (%x)\n", ri->chipnum, ri->chipnum);
 | ||||
| -	seq_printf(s, "chiprev: %u\n", ri->chiprev);
 | ||||
| +	seq_printf(s, "chip: %s\n", ri->chipname);
 | ||||
|  	seq_printf(s, "chippkg: %u\n", ri->chippkg); | ||||
|  	seq_printf(s, "corerev: %u\n", ri->corerev); | ||||
|  	seq_printf(s, "boardid: 0x%04x\n", ri->boardid); | ||||
| @@ -1053,13 +1052,6 @@ static int brcmf_bus_started(struct brcm
 | ||||
|   | ||||
|  	brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read); | ||||
|   | ||||
| -	/* assure we have chipid before feature attach */
 | ||||
| -	if (!bus_if->chip) {
 | ||||
| -		bus_if->chip = drvr->revinfo.chipnum;
 | ||||
| -		bus_if->chiprev = drvr->revinfo.chiprev;
 | ||||
| -		brcmf_dbg(INFO, "firmware revinfo: chip %x (%d) rev %d\n",
 | ||||
| -			  bus_if->chip, bus_if->chip, bus_if->chiprev);
 | ||||
| -	}
 | ||||
|  	brcmf_feat_attach(drvr); | ||||
|   | ||||
|  	ret = brcmf_proto_init_done(drvr); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| @@ -87,7 +87,6 @@ struct brcmf_rev_info {
 | ||||
|  	u32 vendorid; | ||||
|  	u32 deviceid; | ||||
|  	u32 radiorev; | ||||
| -	u32 chiprev;
 | ||||
|  	u32 corerev; | ||||
|  	u32 boardid; | ||||
|  	u32 boardvendor; | ||||
| @@ -95,7 +94,7 @@ struct brcmf_rev_info {
 | ||||
|  	u32 driverrev; | ||||
|  	u32 ucoderev; | ||||
|  	u32 bus; | ||||
| -	u32 chipnum;
 | ||||
| +	char chipname[12];
 | ||||
|  	u32 phytype; | ||||
|  	u32 phyrev; | ||||
|  	u32 anarev; | ||||
| @ -1,69 +0,0 @@ | ||||
| From c88cfa075de356ddf40c668896b2126340f19ba4 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:22 +0100 | ||||
| Subject: [PATCH] brcmfmac: use brcmf_chip_name() for consistency | ||||
| 
 | ||||
| When logging the chip id/revision information make use of | ||||
| brcmf_chip_name() so it is always the same. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c     | 5 ++--- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 7 +++++-- | ||||
|  2 files changed, 7 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| @@ -926,9 +926,8 @@ static int brcmf_chip_recognition(struct
 | ||||
|   | ||||
|  	brcmf_chip_name(ci->pub.chip, ci->pub.chiprev, | ||||
|  			ci->pub.name, sizeof(ci->pub.name)); | ||||
| -	brcmf_dbg(INFO, "found %s chip: BCM%s, rev=%d\n",
 | ||||
| -		  socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name,
 | ||||
| -		  ci->pub.chiprev);
 | ||||
| +	brcmf_dbg(INFO, "found %s chip: %s\n",
 | ||||
| +		  socitype == SOCI_SB ? "SB" : "AXI", ci->pub.name);
 | ||||
|   | ||||
|  	if (socitype == SOCI_SB) { | ||||
|  		if (ci->pub.chip != BRCM_CC_4329_CHIP_ID) { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -25,6 +25,7 @@
 | ||||
|  #include "firmware.h" | ||||
|  #include "core.h" | ||||
|  #include "common.h" | ||||
| +#include "chip.h"
 | ||||
|   | ||||
|  #define BRCMF_FW_MAX_NVRAM_SIZE			64000 | ||||
|  #define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */ | ||||
| @@ -567,6 +568,7 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|  			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN], | ||||
|  			      char nvram_name[BRCMF_FW_NAME_LEN]) | ||||
|  { | ||||
| +	char chipname[12];
 | ||||
|  	u32 i; | ||||
|  	char end; | ||||
|   | ||||
| @@ -581,6 +583,8 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|  		return -ENODEV; | ||||
|  	} | ||||
|   | ||||
| +	brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
 | ||||
| +
 | ||||
|  	/* check if firmware path is provided by module parameter */ | ||||
|  	if (brcmf_mp_global.firmware_path[0] != '\0') { | ||||
|  		strlcpy(fw_name, brcmf_mp_global.firmware_path, | ||||
| @@ -601,8 +605,7 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|  	if ((nvram_name) && (mapping_table[i].nvram)) | ||||
|  		strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN); | ||||
|   | ||||
| -	brcmf_info("using %s for chip %#08x(%d) rev %#08x\n",
 | ||||
| -		   fw_name, chip, chip, chiprev);
 | ||||
| +	brcmf_info("using %s for chip %s\n", fw_name, chipname);
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @ -1,452 +0,0 @@ | ||||
| From 856d5a011c86b59f6564be4508912fb1d866adfc Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:23 +0100 | ||||
| Subject: [PATCH] brcmfmac: allocate struct brcmf_pub instance using | ||||
|  wiphy_new() | ||||
| 
 | ||||
| Rework the driver so the wiphy instance holds the main driver information | ||||
| in its private buffer. Previously it held struct brcmf_cfg80211_info | ||||
| instance so a bit of reorg was needed. This was done so that the wiphy | ||||
| name or its parent device can be shown in debug output. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/btcoex.c  |  2 +- | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 86 ++++++++++------------ | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.h         | 17 +++-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  2 + | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 27 +++++-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.h    |  1 + | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/p2p.c |  2 +- | ||||
|  7 files changed, 76 insertions(+), 61 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c
 | ||||
| @@ -462,7 +462,7 @@ static void brcmf_btcoex_dhcp_end(struct
 | ||||
|  int brcmf_btcoex_set_mode(struct brcmf_cfg80211_vif *vif, | ||||
|  			  enum brcmf_btcoex_mode mode, u16 duration) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(vif->wdev.wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
 | ||||
|  	struct brcmf_btcoex_info *btci = cfg->btcoex; | ||||
|  	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -753,7 +753,7 @@ s32 brcmf_notify_escan_complete(struct b
 | ||||
|  static int brcmf_cfg80211_del_ap_iface(struct wiphy *wiphy, | ||||
|  				       struct wireless_dev *wdev) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
|  	struct net_device *ndev = wdev->netdev; | ||||
|  	struct brcmf_if *ifp = netdev_priv(ndev); | ||||
|  	int ret; | ||||
| @@ -786,7 +786,7 @@ err_unarm:
 | ||||
|  static | ||||
|  int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
|  	struct net_device *ndev = wdev->netdev; | ||||
|   | ||||
|  	if (ndev && ndev == cfg_to_ndev(cfg)) | ||||
| @@ -831,7 +831,7 @@ brcmf_cfg80211_change_iface(struct wiphy
 | ||||
|  			 enum nl80211_iftype type, | ||||
|  			 struct vif_params *params) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
|  	struct brcmf_if *ifp = netdev_priv(ndev); | ||||
|  	struct brcmf_cfg80211_vif *vif = ifp->vif; | ||||
|  	s32 infra = 0; | ||||
| @@ -2127,17 +2127,15 @@ static s32
 | ||||
|  brcmf_cfg80211_get_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, | ||||
|  			    s32 *dbm) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
| -	struct net_device *ndev = cfg_to_ndev(cfg);
 | ||||
| -	struct brcmf_if *ifp = netdev_priv(ndev);
 | ||||
| +	struct brcmf_cfg80211_vif *vif = wdev_to_vif(wdev);
 | ||||
|  	s32 qdbm = 0; | ||||
|  	s32 err; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
| -	if (!check_vif_up(ifp->vif))
 | ||||
| +	if (!check_vif_up(vif))
 | ||||
|  		return -EIO; | ||||
|   | ||||
| -	err = brcmf_fil_iovar_int_get(ifp, "qtxpower", &qdbm);
 | ||||
| +	err = brcmf_fil_iovar_int_get(vif->ifp, "qtxpower", &qdbm);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("error (%d)\n", err); | ||||
|  		goto done; | ||||
| @@ -3359,7 +3357,7 @@ brcmf_cfg80211_sched_scan_start(struct w
 | ||||
|  				struct cfg80211_sched_scan_request *req) | ||||
|  { | ||||
|  	struct brcmf_if *ifp = netdev_priv(ndev); | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
|   | ||||
|  	brcmf_dbg(SCAN, "Enter: n_match_sets=%d n_ssids=%d\n", | ||||
|  		  req->n_match_sets, req->n_ssids); | ||||
| @@ -5191,6 +5189,12 @@ static struct cfg80211_ops brcmf_cfg8021
 | ||||
|  	.del_pmk = brcmf_cfg80211_del_pmk, | ||||
|  }; | ||||
|   | ||||
| +struct cfg80211_ops *brcmf_cfg80211_get_ops(void)
 | ||||
| +{
 | ||||
| +	return kmemdup(&brcmf_cfg80211_ops, sizeof(brcmf_cfg80211_ops),
 | ||||
| +		       GFP_KERNEL);
 | ||||
| +}
 | ||||
| +
 | ||||
|  struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | ||||
|  					   enum nl80211_iftype type) | ||||
|  { | ||||
| @@ -5898,7 +5902,7 @@ static void brcmf_update_bw40_channel_fl
 | ||||
|  static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, | ||||
|  				    u32 bw_cap[]) | ||||
|  { | ||||
| -	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
 | ||||
| +	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
 | ||||
|  	struct ieee80211_supported_band *band; | ||||
|  	struct ieee80211_channel *channel; | ||||
|  	struct wiphy *wiphy; | ||||
| @@ -6013,7 +6017,7 @@ fail_pbuf:
 | ||||
|   | ||||
|  static int brcmf_enable_bw40_2g(struct brcmf_cfg80211_info *cfg) | ||||
|  { | ||||
| -	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
 | ||||
| +	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
 | ||||
|  	struct ieee80211_supported_band *band; | ||||
|  	struct brcmf_fil_bwcap_le band_bwcap; | ||||
|  	struct brcmf_chanspec_list *list; | ||||
| @@ -6198,10 +6202,10 @@ static void brcmf_update_vht_cap(struct
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| -static int brcmf_setup_wiphybands(struct wiphy *wiphy)
 | ||||
| +static int brcmf_setup_wiphybands(struct brcmf_cfg80211_info *cfg)
 | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| -	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
 | ||||
| +	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
 | ||||
| +	struct wiphy *wiphy;
 | ||||
|  	u32 nmode = 0; | ||||
|  	u32 vhtmode = 0; | ||||
|  	u32 bw_cap[2] = { WLC_BW_20MHZ_BIT, WLC_BW_20MHZ_BIT }; | ||||
| @@ -6795,8 +6799,8 @@ static s32 brcmf_translate_country_code(
 | ||||
|  static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, | ||||
|  					struct regulatory_request *req) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| -	struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg));
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
| +	struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0);
 | ||||
|  	struct brcmf_fil_country_le ccreq; | ||||
|  	s32 err; | ||||
|  	int i; | ||||
| @@ -6831,7 +6835,7 @@ static void brcmf_cfg80211_reg_notifier(
 | ||||
|  		brcmf_err("Firmware rejected country setting\n"); | ||||
|  		return; | ||||
|  	} | ||||
| -	brcmf_setup_wiphybands(wiphy);
 | ||||
| +	brcmf_setup_wiphybands(cfg);
 | ||||
|  } | ||||
|   | ||||
|  static void brcmf_free_wiphy(struct wiphy *wiphy) | ||||
| @@ -6858,17 +6862,15 @@ static void brcmf_free_wiphy(struct wiph
 | ||||
|  	if (wiphy->wowlan != &brcmf_wowlan_support) | ||||
|  		kfree(wiphy->wowlan); | ||||
|  #endif | ||||
| -	wiphy_free(wiphy);
 | ||||
|  } | ||||
|   | ||||
|  struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr, | ||||
| -						  struct device *busdev,
 | ||||
| +						  struct cfg80211_ops *ops,
 | ||||
|  						  bool p2pdev_forced) | ||||
|  { | ||||
| +	struct wiphy *wiphy = drvr->wiphy;
 | ||||
|  	struct net_device *ndev = brcmf_get_ifp(drvr, 0)->ndev; | ||||
|  	struct brcmf_cfg80211_info *cfg; | ||||
| -	struct wiphy *wiphy;
 | ||||
| -	struct cfg80211_ops *ops;
 | ||||
|  	struct brcmf_cfg80211_vif *vif; | ||||
|  	struct brcmf_if *ifp; | ||||
|  	s32 err = 0; | ||||
| @@ -6880,26 +6882,13 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||
|  		return NULL; | ||||
|  	} | ||||
|   | ||||
| -	ops = kmemdup(&brcmf_cfg80211_ops, sizeof(*ops), GFP_KERNEL);
 | ||||
| -	if (!ops)
 | ||||
| -		return NULL;
 | ||||
| -
 | ||||
| -	ifp = netdev_priv(ndev);
 | ||||
| -#ifdef CONFIG_PM
 | ||||
| -	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
 | ||||
| -		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
 | ||||
| -#endif
 | ||||
| -	wiphy = wiphy_new(ops, sizeof(struct brcmf_cfg80211_info));
 | ||||
| -	if (!wiphy) {
 | ||||
| +	cfg = kzalloc(sizeof(*cfg), GFP_KERNEL);
 | ||||
| +	if (!cfg) {
 | ||||
|  		brcmf_err("Could not allocate wiphy device\n"); | ||||
| -		goto ops_out;
 | ||||
| +		return NULL;
 | ||||
|  	} | ||||
| -	memcpy(wiphy->perm_addr, drvr->mac, ETH_ALEN);
 | ||||
| -	set_wiphy_dev(wiphy, busdev);
 | ||||
|   | ||||
| -	cfg = wiphy_priv(wiphy);
 | ||||
|  	cfg->wiphy = wiphy; | ||||
| -	cfg->ops = ops;
 | ||||
|  	cfg->pub = drvr; | ||||
|  	init_vif_event(&cfg->vif_event); | ||||
|  	INIT_LIST_HEAD(&cfg->vif_list); | ||||
| @@ -6908,6 +6897,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||
|  	if (IS_ERR(vif)) | ||||
|  		goto wiphy_out; | ||||
|   | ||||
| +	ifp = netdev_priv(ndev);
 | ||||
|  	vif->ifp = ifp; | ||||
|  	vif->wdev.netdev = ndev; | ||||
|  	ndev->ieee80211_ptr = &vif->wdev; | ||||
| @@ -6934,6 +6924,11 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||
|  	if (err < 0) | ||||
|  		goto priv_out; | ||||
|   | ||||
| +	/* regulatory notifer below needs access to cfg so
 | ||||
| +	 * assign it now.
 | ||||
| +	 */
 | ||||
| +	drvr->config = cfg;
 | ||||
| +
 | ||||
|  	brcmf_dbg(INFO, "Registering custom regulatory\n"); | ||||
|  	wiphy->reg_notifier = brcmf_cfg80211_reg_notifier; | ||||
|  	wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; | ||||
| @@ -6947,13 +6942,17 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||
|  		cap = &wiphy->bands[NL80211_BAND_2GHZ]->ht_cap.cap; | ||||
|  		*cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||||
|  	} | ||||
| +#ifdef CONFIG_PM
 | ||||
| +	if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL_GTK))
 | ||||
| +		ops->set_rekey_data = brcmf_cfg80211_set_rekey_data;
 | ||||
| +#endif
 | ||||
|  	err = wiphy_register(wiphy); | ||||
|  	if (err < 0) { | ||||
|  		brcmf_err("Could not register wiphy device (%d)\n", err); | ||||
|  		goto priv_out; | ||||
|  	} | ||||
|   | ||||
| -	err = brcmf_setup_wiphybands(wiphy);
 | ||||
| +	err = brcmf_setup_wiphybands(cfg);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("Setting wiphy bands failed (%d)\n", err); | ||||
|  		goto wiphy_unreg_out; | ||||
| @@ -6970,12 +6969,7 @@ struct brcmf_cfg80211_info *brcmf_cfg802
 | ||||
|  		else | ||||
|  			*cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||||
|  	} | ||||
| -	/* p2p might require that "if-events" get processed by fweh. So
 | ||||
| -	 * activate the already registered event handlers now and activate
 | ||||
| -	 * the rest when initialization has completed. drvr->config needs to
 | ||||
| -	 * be assigned before activating events.
 | ||||
| -	 */
 | ||||
| -	drvr->config = cfg;
 | ||||
| +
 | ||||
|  	err = brcmf_fweh_activate_events(ifp); | ||||
|  	if (err) { | ||||
|  		brcmf_err("FWEH activation failed (%d)\n", err); | ||||
| @@ -7043,8 +7037,7 @@ priv_out:
 | ||||
|  	ifp->vif = NULL; | ||||
|  wiphy_out: | ||||
|  	brcmf_free_wiphy(wiphy); | ||||
| -ops_out:
 | ||||
| -	kfree(ops);
 | ||||
| +	kfree(cfg);
 | ||||
|  	return NULL; | ||||
|  } | ||||
|   | ||||
| @@ -7059,4 +7052,5 @@ void brcmf_cfg80211_detach(struct brcmf_
 | ||||
|  	kfree(cfg->ops); | ||||
|  	wl_deinit_priv(cfg); | ||||
|  	brcmf_free_wiphy(cfg->wiphy); | ||||
| +	kfree(cfg);
 | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h
 | ||||
| @@ -355,20 +355,24 @@ static inline struct wiphy *cfg_to_wiphy
 | ||||
|   | ||||
|  static inline struct brcmf_cfg80211_info *wiphy_to_cfg(struct wiphy *w) | ||||
|  { | ||||
| -	return (struct brcmf_cfg80211_info *)(wiphy_priv(w));
 | ||||
| +	struct brcmf_pub *drvr = wiphy_priv(w);
 | ||||
| +	return drvr->config;
 | ||||
|  } | ||||
|   | ||||
|  static inline struct brcmf_cfg80211_info *wdev_to_cfg(struct wireless_dev *wd) | ||||
|  { | ||||
| -	return (struct brcmf_cfg80211_info *)(wdev_priv(wd));
 | ||||
| +	return wiphy_to_cfg(wd->wiphy);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static inline struct brcmf_cfg80211_vif *wdev_to_vif(struct wireless_dev *wdev)
 | ||||
| +{
 | ||||
| +	return container_of(wdev, struct brcmf_cfg80211_vif, wdev);
 | ||||
|  } | ||||
|   | ||||
|  static inline | ||||
|  struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_vif *vif;
 | ||||
| -	vif = list_first_entry(&cfg->vif_list, struct brcmf_cfg80211_vif, list);
 | ||||
| -	return vif->wdev.netdev;
 | ||||
| +	return brcmf_get_ifp(cfg->pub, 0)->ndev;
 | ||||
|  } | ||||
|   | ||||
|  static inline struct brcmf_cfg80211_info *ndev_to_cfg(struct net_device *ndev) | ||||
| @@ -395,11 +399,12 @@ brcmf_cfg80211_connect_info *cfg_to_conn
 | ||||
|  } | ||||
|   | ||||
|  struct brcmf_cfg80211_info *brcmf_cfg80211_attach(struct brcmf_pub *drvr, | ||||
| -						  struct device *busdev,
 | ||||
| +						  struct cfg80211_ops *ops,
 | ||||
|  						  bool p2pdev_forced); | ||||
|  void brcmf_cfg80211_detach(struct brcmf_cfg80211_info *cfg); | ||||
|  s32 brcmf_cfg80211_up(struct net_device *ndev); | ||||
|  s32 brcmf_cfg80211_down(struct net_device *ndev); | ||||
| +struct cfg80211_ops *brcmf_cfg80211_get_ops(void);
 | ||||
|  enum nl80211_iftype brcmf_cfg80211_get_iftype(struct brcmf_if *ifp); | ||||
|   | ||||
|  struct brcmf_cfg80211_vif *brcmf_alloc_vif(struct brcmf_cfg80211_info *cfg, | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -252,6 +252,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  		brcmf_err("Retreiving cur_etheraddr failed, %d\n", err); | ||||
|  		goto done; | ||||
|  	} | ||||
| +	memcpy(ifp->drvr->wiphy->perm_addr, ifp->drvr->mac, ETH_ALEN);
 | ||||
|  	memcpy(ifp->drvr->mac, ifp->mac_addr, sizeof(ifp->drvr->mac)); | ||||
|   | ||||
|  	bus = ifp->drvr->bus_if; | ||||
| @@ -279,6 +280,7 @@ int brcmf_c_preinit_dcmds(struct brcmf_i
 | ||||
|  		ri->chippkg = le32_to_cpu(revinfo.chippkg); | ||||
|  		ri->nvramrev = le32_to_cpu(revinfo.nvramrev); | ||||
|   | ||||
| +		/* use revinfo if not known yet */
 | ||||
|  		if (!bus->chip) { | ||||
|  			bus->chip = le32_to_cpu(revinfo.chipnum); | ||||
|  			bus->chiprev = le32_to_cpu(revinfo.chiprev); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1021,7 +1021,7 @@ static int brcmf_revinfo_read(struct seq
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_bus_started(struct brcmf_pub *drvr)
 | ||||
| +static int brcmf_bus_started(struct brcmf_pub *drvr, struct cfg80211_ops *ops)
 | ||||
|  { | ||||
|  	int ret = -1; | ||||
|  	struct brcmf_bus *bus_if = drvr->bus_if; | ||||
| @@ -1060,7 +1060,7 @@ static int brcmf_bus_started(struct brcm
 | ||||
|   | ||||
|  	brcmf_proto_add_if(drvr, ifp); | ||||
|   | ||||
| -	drvr->config = brcmf_cfg80211_attach(drvr, bus_if->dev,
 | ||||
| +	drvr->config = brcmf_cfg80211_attach(drvr, ops,
 | ||||
|  					     drvr->settings->p2p_enable); | ||||
|  	if (drvr->config == NULL) { | ||||
|  		ret = -ENOMEM; | ||||
| @@ -1115,17 +1115,26 @@ fail:
 | ||||
|   | ||||
|  int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings) | ||||
|  { | ||||
| +	struct wiphy *wiphy;
 | ||||
| +	struct cfg80211_ops *ops;
 | ||||
|  	struct brcmf_pub *drvr = NULL; | ||||
|  	int ret = 0; | ||||
|  	int i; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
| -	/* Allocate primary brcmf_info */
 | ||||
| -	drvr = kzalloc(sizeof(*drvr), GFP_ATOMIC);
 | ||||
| -	if (!drvr)
 | ||||
| +	ops = brcmf_cfg80211_get_ops();
 | ||||
| +	if (!ops)
 | ||||
|  		return -ENOMEM; | ||||
|   | ||||
| +	wiphy = wiphy_new(ops, sizeof(*drvr));
 | ||||
| +	if (!wiphy)
 | ||||
| +		return -ENOMEM;
 | ||||
| +
 | ||||
| +	set_wiphy_dev(wiphy, dev);
 | ||||
| +	drvr = wiphy_priv(wiphy);
 | ||||
| +	drvr->wiphy = wiphy;
 | ||||
| +
 | ||||
|  	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++) | ||||
|  		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID; | ||||
|   | ||||
| @@ -1154,15 +1163,18 @@ int brcmf_attach(struct device *dev, str
 | ||||
|  	/* attach firmware event handler */ | ||||
|  	brcmf_fweh_attach(drvr); | ||||
|   | ||||
| -	ret = brcmf_bus_started(drvr);
 | ||||
| +	ret = brcmf_bus_started(drvr, ops);
 | ||||
|  	if (ret != 0) { | ||||
|  		brcmf_err("dongle is not responding: err=%d\n", ret); | ||||
|  		goto fail; | ||||
|  	} | ||||
| +
 | ||||
| +	drvr->config->ops = ops;
 | ||||
|  	return 0; | ||||
|   | ||||
|  fail: | ||||
|  	brcmf_detach(dev); | ||||
| +	kfree(ops);
 | ||||
|   | ||||
|  	return ret; | ||||
|  } | ||||
| @@ -1220,6 +1232,7 @@ void brcmf_detach(struct device *dev)
 | ||||
|  		brcmf_remove_interface(drvr->iflist[i], false); | ||||
|   | ||||
|  	brcmf_cfg80211_detach(drvr->config); | ||||
| +	drvr->config = NULL;
 | ||||
|   | ||||
|  	brcmf_bus_stop(drvr->bus_if); | ||||
|   | ||||
| @@ -1227,7 +1240,7 @@ void brcmf_detach(struct device *dev)
 | ||||
|   | ||||
|  	brcmf_debug_detach(drvr); | ||||
|  	bus_if->drvr = NULL; | ||||
| -	kfree(drvr);
 | ||||
| +	wiphy_free(drvr->wiphy);
 | ||||
|  } | ||||
|   | ||||
|  s32 brcmf_iovar_data_set(struct device *dev, char *name, void *data, u32 len) | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.h
 | ||||
| @@ -107,6 +107,7 @@ struct brcmf_pub {
 | ||||
|  	/* Linkage ponters */ | ||||
|  	struct brcmf_bus *bus_if; | ||||
|  	struct brcmf_proto *proto; | ||||
| +	struct wiphy *wiphy;
 | ||||
|  	struct brcmf_cfg80211_info *config; | ||||
|   | ||||
|  	/* Internal brcmf items */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| @@ -2229,7 +2229,7 @@ fail:
 | ||||
|   */ | ||||
|  int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) | ||||
|  { | ||||
| -	struct brcmf_cfg80211_info *cfg = wiphy_priv(wiphy);
 | ||||
| +	struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
 | ||||
|  	struct brcmf_p2p_info *p2p = &cfg->p2p; | ||||
|  	struct brcmf_cfg80211_vif *vif; | ||||
|  	enum nl80211_iftype iftype; | ||||
| @ -1,349 +0,0 @@ | ||||
| From 34789d0cf682c643862792750a06c31ccf016cbc Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:24 +0100 | ||||
| Subject: [PATCH] brcmfmac: use wiphy debugfs dir entry | ||||
| 
 | ||||
| The driver used to create a brcmfmac dir entry at the top level | ||||
| debugfs mount point. This moves the debugfs entries into the | ||||
| wiphy debugfs dir entry. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/bcdc.c    |  6 ++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  |  5 --- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/core.c    | 11 +++--- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/debug.c   | 42 ++-------------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/debug.h   | 17 --------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/feature.c |  3 ++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/feature.h |  7 ++++ | ||||
|  .../broadcom/brcm80211/brcmfmac/fwsignal.c         | 11 +++--- | ||||
|  .../broadcom/brcm80211/brcmfmac/fwsignal.h         |  1 + | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |  8 +++-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/proto.c   |  3 +- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/proto.h   |  7 ++++ | ||||
|  12 files changed, 47 insertions(+), 74 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
 | ||||
| @@ -445,6 +445,11 @@ brcmf_proto_bcdc_init_done(struct brcmf_
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static void brcmf_proto_bcdc_debugfs_create(struct brcmf_pub *drvr)
 | ||||
| +{
 | ||||
| +	brcmf_fws_debugfs_create(drvr);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) | ||||
|  { | ||||
|  	struct brcmf_bcdc *bcdc; | ||||
| @@ -472,6 +477,7 @@ int brcmf_proto_bcdc_attach(struct brcmf
 | ||||
|  	drvr->proto->del_if = brcmf_proto_bcdc_del_if; | ||||
|  	drvr->proto->reset_if = brcmf_proto_bcdc_reset_if; | ||||
|  	drvr->proto->init_done = brcmf_proto_bcdc_init_done; | ||||
| +	drvr->proto->debugfs_create = brcmf_proto_bcdc_debugfs_create;
 | ||||
|  	drvr->proto->pd = bcdc; | ||||
|   | ||||
|  	drvr->hdrlen += BCDC_HEADER_LEN + BRCMF_PROT_FW_SIGNAL_MAX_TXBYTES; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -529,9 +529,6 @@ static int __init brcmfmac_module_init(v
 | ||||
|  { | ||||
|  	int err; | ||||
|   | ||||
| -	/* Initialize debug system first */
 | ||||
| -	brcmf_debugfs_init();
 | ||||
| -
 | ||||
|  	/* Get the platform data (if available) for our devices */ | ||||
|  	err = platform_driver_probe(&brcmf_pd, brcmf_common_pd_probe); | ||||
|  	if (err == -ENODEV) | ||||
| @@ -543,7 +540,6 @@ static int __init brcmfmac_module_init(v
 | ||||
|  	/* Continue the initialization by registering the different busses */ | ||||
|  	err = brcmf_core_init(); | ||||
|  	if (err) { | ||||
| -		brcmf_debugfs_exit();
 | ||||
|  		if (brcmfmac_pdata) | ||||
|  			platform_driver_unregister(&brcmf_pd); | ||||
|  	} | ||||
| @@ -556,7 +552,6 @@ static void __exit brcmfmac_module_exit(
 | ||||
|  	brcmf_core_exit(); | ||||
|  	if (brcmfmac_pdata) | ||||
|  		platform_driver_unregister(&brcmf_pd); | ||||
| -	brcmf_debugfs_exit();
 | ||||
|  } | ||||
|   | ||||
|  module_init(brcmfmac_module_init); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
 | ||||
| @@ -1050,8 +1050,6 @@ static int brcmf_bus_started(struct brcm
 | ||||
|  	if (ret < 0) | ||||
|  		goto fail; | ||||
|   | ||||
| -	brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
 | ||||
| -
 | ||||
|  	brcmf_feat_attach(drvr); | ||||
|   | ||||
|  	ret = brcmf_proto_init_done(drvr); | ||||
| @@ -1094,6 +1092,11 @@ static int brcmf_bus_started(struct brcm
 | ||||
|  #endif | ||||
|  #endif /* CONFIG_INET */ | ||||
|   | ||||
| +	/* populate debugfs */
 | ||||
| +	brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
 | ||||
| +	brcmf_feat_debugfs_create(drvr);
 | ||||
| +	brcmf_proto_debugfs_create(drvr);
 | ||||
| +
 | ||||
|  	return 0; | ||||
|   | ||||
|  fail: | ||||
| @@ -1146,9 +1149,6 @@ int brcmf_attach(struct device *dev, str
 | ||||
|  	drvr->bus_if->drvr = drvr; | ||||
|  	drvr->settings = settings; | ||||
|   | ||||
| -	/* attach debug facilities */
 | ||||
| -	brcmf_debug_attach(drvr);
 | ||||
| -
 | ||||
|  	/* Attach and link in the protocol */ | ||||
|  	ret = brcmf_proto_attach(drvr); | ||||
|  	if (ret != 0) { | ||||
| @@ -1238,7 +1238,6 @@ void brcmf_detach(struct device *dev)
 | ||||
|   | ||||
|  	brcmf_proto_detach(drvr); | ||||
|   | ||||
| -	brcmf_debug_detach(drvr);
 | ||||
|  	bus_if->drvr = NULL; | ||||
|  	wiphy_free(drvr->wiphy); | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.c
 | ||||
| @@ -25,8 +25,6 @@
 | ||||
|  #include "fweh.h" | ||||
|  #include "debug.h" | ||||
|   | ||||
| -static struct dentry *root_folder;
 | ||||
| -
 | ||||
|  int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data, | ||||
|  			       size_t len) | ||||
|  { | ||||
| @@ -54,44 +52,9 @@ int brcmf_debug_create_memdump(struct br
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -void brcmf_debugfs_init(void)
 | ||||
| -{
 | ||||
| -	root_folder = debugfs_create_dir(KBUILD_MODNAME, NULL);
 | ||||
| -	if (IS_ERR(root_folder))
 | ||||
| -		root_folder = NULL;
 | ||||
| -}
 | ||||
| -
 | ||||
| -void brcmf_debugfs_exit(void)
 | ||||
| -{
 | ||||
| -	if (!root_folder)
 | ||||
| -		return;
 | ||||
| -
 | ||||
| -	debugfs_remove_recursive(root_folder);
 | ||||
| -	root_folder = NULL;
 | ||||
| -}
 | ||||
| -
 | ||||
| -int brcmf_debug_attach(struct brcmf_pub *drvr)
 | ||||
| -{
 | ||||
| -	struct device *dev = drvr->bus_if->dev;
 | ||||
| -
 | ||||
| -	if (!root_folder)
 | ||||
| -		return -ENODEV;
 | ||||
| -
 | ||||
| -	drvr->dbgfs_dir = debugfs_create_dir(dev_name(dev), root_folder);
 | ||||
| -	return PTR_ERR_OR_ZERO(drvr->dbgfs_dir);
 | ||||
| -}
 | ||||
| -
 | ||||
| -void brcmf_debug_detach(struct brcmf_pub *drvr)
 | ||||
| -{
 | ||||
| -	brcmf_fweh_unregister(drvr, BRCMF_E_PSM_WATCHDOG);
 | ||||
| -
 | ||||
| -	if (!IS_ERR_OR_NULL(drvr->dbgfs_dir))
 | ||||
| -		debugfs_remove_recursive(drvr->dbgfs_dir);
 | ||||
| -}
 | ||||
| -
 | ||||
|  struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr) | ||||
|  { | ||||
| -	return drvr->dbgfs_dir;
 | ||||
| +	return drvr->wiphy->debugfsdir;
 | ||||
|  } | ||||
|   | ||||
|  int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, | ||||
| @@ -99,7 +62,8 @@ int brcmf_debugfs_add_entry(struct brcmf
 | ||||
|  { | ||||
|  	struct dentry *e; | ||||
|   | ||||
| +	WARN(!drvr->wiphy->debugfsdir, "wiphy not (yet) registered\n");
 | ||||
|  	e = debugfs_create_devm_seqfile(drvr->bus_if->dev, fn, | ||||
| -					drvr->dbgfs_dir, read_fn);
 | ||||
| +					drvr->wiphy->debugfsdir, read_fn);
 | ||||
|  	return PTR_ERR_OR_ZERO(e); | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/debug.h
 | ||||
| @@ -113,29 +113,12 @@ extern int brcmf_msg_level;
 | ||||
|  struct brcmf_bus; | ||||
|  struct brcmf_pub; | ||||
|  #ifdef DEBUG | ||||
| -void brcmf_debugfs_init(void);
 | ||||
| -void brcmf_debugfs_exit(void);
 | ||||
| -int brcmf_debug_attach(struct brcmf_pub *drvr);
 | ||||
| -void brcmf_debug_detach(struct brcmf_pub *drvr);
 | ||||
|  struct dentry *brcmf_debugfs_get_devdir(struct brcmf_pub *drvr); | ||||
|  int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, | ||||
|  			    int (*read_fn)(struct seq_file *seq, void *data)); | ||||
|  int brcmf_debug_create_memdump(struct brcmf_bus *bus, const void *data, | ||||
|  			       size_t len); | ||||
|  #else | ||||
| -static inline void brcmf_debugfs_init(void)
 | ||||
| -{
 | ||||
| -}
 | ||||
| -static inline void brcmf_debugfs_exit(void)
 | ||||
| -{
 | ||||
| -}
 | ||||
| -static inline int brcmf_debug_attach(struct brcmf_pub *drvr)
 | ||||
| -{
 | ||||
| -	return 0;
 | ||||
| -}
 | ||||
| -static inline void brcmf_debug_detach(struct brcmf_pub *drvr)
 | ||||
| -{
 | ||||
| -}
 | ||||
|  static inline | ||||
|  int brcmf_debugfs_add_entry(struct brcmf_pub *drvr, const char *fn, | ||||
|  			    int (*read_fn)(struct seq_file *seq, void *data)) | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
 | ||||
| @@ -228,7 +228,10 @@ void brcmf_feat_attach(struct brcmf_pub
 | ||||
|  		/* no quirks */ | ||||
|  		break; | ||||
|  	} | ||||
| +}
 | ||||
|   | ||||
| +void brcmf_feat_debugfs_create(struct brcmf_pub *drvr)
 | ||||
| +{
 | ||||
|  	brcmf_debugfs_add_entry(drvr, "features", brcmf_feat_debugfs_read); | ||||
|  } | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.h
 | ||||
| @@ -90,6 +90,13 @@ enum brcmf_feat_quirk {
 | ||||
|  void brcmf_feat_attach(struct brcmf_pub *drvr); | ||||
|   | ||||
|  /** | ||||
| + * brcmf_feat_debugfs_create() - create debugfs entries.
 | ||||
| + *
 | ||||
| + * @drvr: driver instance.
 | ||||
| + */
 | ||||
| +void brcmf_feat_debugfs_create(struct brcmf_pub *drvr);
 | ||||
| +
 | ||||
| +/**
 | ||||
|   * brcmf_feat_is_enabled() - query feature. | ||||
|   * | ||||
|   * @ifp: interface instance. | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | ||||
| @@ -2399,10 +2399,6 @@ struct brcmf_fws_info *brcmf_fws_attach(
 | ||||
|  	brcmu_pktq_init(&fws->desc.other.psq, BRCMF_FWS_PSQ_PREC_COUNT, | ||||
|  			BRCMF_FWS_PSQ_LEN); | ||||
|   | ||||
| -	/* create debugfs file for statistics */
 | ||||
| -	brcmf_debugfs_add_entry(drvr, "fws_stats",
 | ||||
| -				brcmf_debugfs_fws_stats_read);
 | ||||
| -
 | ||||
|  	brcmf_dbg(INFO, "%s bdcv2 tlv signaling [%x]\n", | ||||
|  		  fws->fw_signals ? "enabled" : "disabled", tlv); | ||||
|  	return fws; | ||||
| @@ -2429,6 +2425,13 @@ void brcmf_fws_detach(struct brcmf_fws_i
 | ||||
|  	kfree(fws); | ||||
|  } | ||||
|   | ||||
| +void brcmf_fws_debugfs_create(struct brcmf_pub *drvr)
 | ||||
| +{
 | ||||
| +	/* create debugfs file for statistics */
 | ||||
| +	brcmf_debugfs_add_entry(drvr, "fws_stats",
 | ||||
| +				brcmf_debugfs_fws_stats_read);
 | ||||
| +}
 | ||||
| +
 | ||||
|  bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws) | ||||
|  { | ||||
|  	return !fws->avoid_queueing; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
 | ||||
| @@ -20,6 +20,7 @@
 | ||||
|   | ||||
|  struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr); | ||||
|  void brcmf_fws_detach(struct brcmf_fws_info *fws); | ||||
| +void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
 | ||||
|  bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws); | ||||
|  bool brcmf_fws_fc_active(struct brcmf_fws_info *fws); | ||||
|  void brcmf_fws_hdrpull(struct brcmf_if *ifp, s16 siglen, struct sk_buff *skb); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
 | ||||
| @@ -1418,6 +1418,11 @@ static int brcmf_msgbuf_stats_read(struc
 | ||||
|  } | ||||
|  #endif | ||||
|   | ||||
| +static void brcmf_msgbuf_debugfs_create(struct brcmf_pub *drvr)
 | ||||
| +{
 | ||||
| +	brcmf_debugfs_add_entry(drvr, "msgbuf_stats", brcmf_msgbuf_stats_read);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr) | ||||
|  { | ||||
|  	struct brcmf_bus_msgbuf *if_msgbuf; | ||||
| @@ -1472,6 +1477,7 @@ int brcmf_proto_msgbuf_attach(struct brc
 | ||||
|  	drvr->proto->delete_peer = brcmf_msgbuf_delete_peer; | ||||
|  	drvr->proto->add_tdls_peer = brcmf_msgbuf_add_tdls_peer; | ||||
|  	drvr->proto->rxreorder = brcmf_msgbuf_rxreorder; | ||||
| +	drvr->proto->debugfs_create = brcmf_msgbuf_debugfs_create;
 | ||||
|  	drvr->proto->pd = msgbuf; | ||||
|   | ||||
|  	init_waitqueue_head(&msgbuf->ioctl_resp_wait); | ||||
| @@ -1525,8 +1531,6 @@ int brcmf_proto_msgbuf_attach(struct brc
 | ||||
|  	spin_lock_init(&msgbuf->flowring_work_lock); | ||||
|  	INIT_LIST_HEAD(&msgbuf->work_queue); | ||||
|   | ||||
| -	brcmf_debugfs_add_entry(drvr, "msgbuf_stats", brcmf_msgbuf_stats_read);
 | ||||
| -
 | ||||
|  	return 0; | ||||
|   | ||||
|  fail: | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
 | ||||
| @@ -54,7 +54,8 @@ int brcmf_proto_attach(struct brcmf_pub
 | ||||
|  	if (!proto->tx_queue_data || (proto->hdrpull == NULL) || | ||||
|  	    (proto->query_dcmd == NULL) || (proto->set_dcmd == NULL) || | ||||
|  	    (proto->configure_addr_mode == NULL) || | ||||
| -	    (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL)) {
 | ||||
| +	    (proto->delete_peer == NULL) || (proto->add_tdls_peer == NULL) ||
 | ||||
| +	    (proto->debugfs_create == NULL)) {
 | ||||
|  		brcmf_err("Not all proto handlers have been installed\n"); | ||||
|  		goto fail; | ||||
|  	} | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h
 | ||||
| @@ -48,6 +48,7 @@ struct brcmf_proto {
 | ||||
|  	void (*del_if)(struct brcmf_if *ifp); | ||||
|  	void (*reset_if)(struct brcmf_if *ifp); | ||||
|  	int (*init_done)(struct brcmf_pub *drvr); | ||||
| +	void (*debugfs_create)(struct brcmf_pub *drvr);
 | ||||
|  	void *pd; | ||||
|  }; | ||||
|   | ||||
| @@ -156,4 +157,10 @@ brcmf_proto_init_done(struct brcmf_pub *
 | ||||
|  	return drvr->proto->init_done(drvr); | ||||
|  } | ||||
|   | ||||
| +static inline void
 | ||||
| +brcmf_proto_debugfs_create(struct brcmf_pub *drvr)
 | ||||
| +{
 | ||||
| +	drvr->proto->debugfs_create(drvr);
 | ||||
| +}
 | ||||
| +
 | ||||
|  #endif /* BRCMFMAC_PROTO_H */ | ||||
| @ -1,286 +0,0 @@ | ||||
| From 41f573dbb534f14e62a4a5411f602c970cad1d77 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:25 +0100 | ||||
| Subject: [PATCH] brcmfmac: derive firmware filenames from basename mapping | ||||
| 
 | ||||
| Instead of defining individual filenames for firmware and nvram | ||||
| use a basename and derive the names from that. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.c         | 31 ++++++--- | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.h         | 24 ++----- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 56 ++++++++--------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 73 +++++++++++----------- | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 10 +-- | ||||
|  5 files changed, 96 insertions(+), 98 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -563,6 +563,13 @@ int brcmf_fw_get_firmwares(struct device
 | ||||
|  					   0); | ||||
|  } | ||||
|   | ||||
| +static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN],
 | ||||
| +				   const char *fw_base, const char *extension)
 | ||||
| +{
 | ||||
| +	strlcat(fw_name, fw_base, BRCMF_FW_NAME_LEN);
 | ||||
| +	strlcat(fw_name, extension, BRCMF_FW_NAME_LEN);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev, | ||||
|  			      struct brcmf_firmware_mapping mapping_table[], | ||||
|  			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN], | ||||
| @@ -587,25 +594,31 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|   | ||||
|  	/* check if firmware path is provided by module parameter */ | ||||
|  	if (brcmf_mp_global.firmware_path[0] != '\0') { | ||||
| -		strlcpy(fw_name, brcmf_mp_global.firmware_path,
 | ||||
| -			BRCMF_FW_NAME_LEN);
 | ||||
| -		if ((nvram_name) && (mapping_table[i].nvram))
 | ||||
| +		if (fw_name)
 | ||||
| +			strlcpy(fw_name, brcmf_mp_global.firmware_path,
 | ||||
| +				BRCMF_FW_NAME_LEN);
 | ||||
| +		if (nvram_name)
 | ||||
|  			strlcpy(nvram_name, brcmf_mp_global.firmware_path, | ||||
|  				BRCMF_FW_NAME_LEN); | ||||
|   | ||||
|  		end = brcmf_mp_global.firmware_path[ | ||||
|  				strlen(brcmf_mp_global.firmware_path) - 1]; | ||||
|  		if (end != '/') { | ||||
| -			strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
 | ||||
| -			if ((nvram_name) && (mapping_table[i].nvram))
 | ||||
| +			if (fw_name)
 | ||||
| +				strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
 | ||||
| +			if (nvram_name)
 | ||||
|  				strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN); | ||||
|  		} | ||||
|  	} | ||||
| -	strlcat(fw_name, mapping_table[i].fw, BRCMF_FW_NAME_LEN);
 | ||||
| -	if ((nvram_name) && (mapping_table[i].nvram))
 | ||||
| -		strlcat(nvram_name, mapping_table[i].nvram, BRCMF_FW_NAME_LEN);
 | ||||
|   | ||||
| -	brcmf_info("using %s for chip %s\n", fw_name, chipname);
 | ||||
| +	brcmf_info("using %s for chip %s\n",
 | ||||
| +		   mapping_table[i].fw_base, chipname);
 | ||||
| +	if (fw_name)
 | ||||
| +		brcmf_fw_get_full_name(fw_name,
 | ||||
| +				       mapping_table[i].fw_base, ".bin");
 | ||||
| +	if (nvram_name)
 | ||||
| +		brcmf_fw_get_full_name(nvram_name,
 | ||||
| +				       mapping_table[i].fw_base, ".txt");
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| @@ -38,28 +38,16 @@
 | ||||
|  struct brcmf_firmware_mapping { | ||||
|  	u32 chipid; | ||||
|  	u32 revmask; | ||||
| -	const char *fw;
 | ||||
| -	const char *nvram;
 | ||||
| +	const char *fw_base;
 | ||||
|  }; | ||||
|   | ||||
| -#define BRCMF_FW_NVRAM_DEF(fw_nvram_name, fw, nvram) \
 | ||||
| -static const char BRCM_ ## fw_nvram_name ## _FIRMWARE_NAME[] = \
 | ||||
| -	BRCMF_FW_DEFAULT_PATH fw; \
 | ||||
| -static const char BRCM_ ## fw_nvram_name ## _NVRAM_NAME[] = \
 | ||||
| -	BRCMF_FW_DEFAULT_PATH nvram; \
 | ||||
| -MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw);
 | ||||
| -
 | ||||
| -#define BRCMF_FW_DEF(fw_name, fw) \
 | ||||
| -static const char BRCM_ ## fw_name ## _FIRMWARE_NAME[] = \
 | ||||
| -	BRCMF_FW_DEFAULT_PATH fw; \
 | ||||
| -MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw) \
 | ||||
| -
 | ||||
| -#define BRCMF_FW_NVRAM_ENTRY(chipid, mask, name) \
 | ||||
| -	{ chipid, mask, \
 | ||||
| -	  BRCM_ ## name ## _FIRMWARE_NAME, BRCM_ ## name ## _NVRAM_NAME }
 | ||||
| +#define BRCMF_FW_DEF(fw_name, fw_base) \
 | ||||
| +static const char BRCM_ ## fw_name ## _FIRMWARE_BASENAME[] = \
 | ||||
| +	BRCMF_FW_DEFAULT_PATH fw_base; \
 | ||||
| +MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw_base ".bin")
 | ||||
|   | ||||
|  #define BRCMF_FW_ENTRY(chipid, mask, name) \ | ||||
| -	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_NAME, NULL }
 | ||||
| +	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME }
 | ||||
|   | ||||
|  int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev, | ||||
|  			      struct brcmf_firmware_mapping mapping_table[], | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -46,36 +46,36 @@ enum brcmf_pcie_state {
 | ||||
|  	BRCMFMAC_PCIE_STATE_UP | ||||
|  }; | ||||
|   | ||||
| -BRCMF_FW_NVRAM_DEF(43602, "brcmfmac43602-pcie.bin", "brcmfmac43602-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4350, "brcmfmac4350-pcie.bin", "brcmfmac4350-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4350C, "brcmfmac4350c2-pcie.bin", "brcmfmac4350c2-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-pcie.bin", "brcmfmac4356-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43570, "brcmfmac43570-pcie.bin", "brcmfmac43570-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4358, "brcmfmac4358-pcie.bin", "brcmfmac4358-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4359, "brcmfmac4359-pcie.bin", "brcmfmac4359-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4365B, "brcmfmac4365b-pcie.bin", "brcmfmac4365b-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4365C, "brcmfmac4365c-pcie.bin", "brcmfmac4365c-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4366B, "brcmfmac4366b-pcie.bin", "brcmfmac4366b-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4366C, "brcmfmac4366c-pcie.bin", "brcmfmac4366c-pcie.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4371, "brcmfmac4371-pcie.bin", "brcmfmac4371-pcie.txt");
 | ||||
| +BRCMF_FW_DEF(43602, "brcmfmac43602-pcie");
 | ||||
| +BRCMF_FW_DEF(4350, "brcmfmac4350-pcie");
 | ||||
| +BRCMF_FW_DEF(4350C, "brcmfmac4350c2-pcie");
 | ||||
| +BRCMF_FW_DEF(4356, "brcmfmac4356-pcie");
 | ||||
| +BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
 | ||||
| +BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
 | ||||
| +BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
 | ||||
| +BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
 | ||||
| +BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
 | ||||
| +BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
 | ||||
| +BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie");
 | ||||
| +BRCMF_FW_DEF(4371, "brcmfmac4371-pcie");
 | ||||
|   | ||||
|  static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = { | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0xFFFFFF00, 4350),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43525_CHIP_ID, 0xFFFFFFF0, 4365C),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43567_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
 | ||||
|  }; | ||||
|   | ||||
|  #define BRCMF_PCIE_FW_UP_TIMEOUT		2000 /* msec */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -600,47 +600,44 @@ static const struct sdiod_drive_str sdio
 | ||||
|  	{4,  0x1} | ||||
|  }; | ||||
|   | ||||
| -BRCMF_FW_NVRAM_DEF(43143, "brcmfmac43143-sdio.bin", "brcmfmac43143-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43241B0, "brcmfmac43241b0-sdio.bin",
 | ||||
| -		   "brcmfmac43241b0-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43241B4, "brcmfmac43241b4-sdio.bin",
 | ||||
| -		   "brcmfmac43241b4-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43241B5, "brcmfmac43241b5-sdio.bin",
 | ||||
| -		   "brcmfmac43241b5-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4329, "brcmfmac4329-sdio.bin", "brcmfmac4329-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4330, "brcmfmac4330-sdio.bin", "brcmfmac4330-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4334, "brcmfmac4334-sdio.bin", "brcmfmac4334-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43340, "brcmfmac43340-sdio.bin", "brcmfmac43340-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4335, "brcmfmac4335-sdio.bin", "brcmfmac4335-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43362, "brcmfmac43362-sdio.bin", "brcmfmac43362-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4339, "brcmfmac4339-sdio.bin", "brcmfmac4339-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43430A0, "brcmfmac43430a0-sdio.bin", "brcmfmac43430a0-sdio.txt");
 | ||||
| +BRCMF_FW_DEF(43143, "brcmfmac43143-sdio");
 | ||||
| +BRCMF_FW_DEF(43241B0, "brcmfmac43241b0-sdio");
 | ||||
| +BRCMF_FW_DEF(43241B4, "brcmfmac43241b4-sdio");
 | ||||
| +BRCMF_FW_DEF(43241B5, "brcmfmac43241b5-sdio");
 | ||||
| +BRCMF_FW_DEF(4329, "brcmfmac4329-sdio");
 | ||||
| +BRCMF_FW_DEF(4330, "brcmfmac4330-sdio");
 | ||||
| +BRCMF_FW_DEF(4334, "brcmfmac4334-sdio");
 | ||||
| +BRCMF_FW_DEF(43340, "brcmfmac43340-sdio");
 | ||||
| +BRCMF_FW_DEF(4335, "brcmfmac4335-sdio");
 | ||||
| +BRCMF_FW_DEF(43362, "brcmfmac43362-sdio");
 | ||||
| +BRCMF_FW_DEF(4339, "brcmfmac4339-sdio");
 | ||||
| +BRCMF_FW_DEF(43430A0, "brcmfmac43430a0-sdio");
 | ||||
|  /* Note the names are not postfixed with a1 for backward compatibility */ | ||||
| -BRCMF_FW_NVRAM_DEF(43430A1, "brcmfmac43430-sdio.bin", "brcmfmac43430-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(43455, "brcmfmac43455-sdio.bin", "brcmfmac43455-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4354, "brcmfmac4354-sdio.bin", "brcmfmac4354-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4356, "brcmfmac4356-sdio.bin", "brcmfmac4356-sdio.txt");
 | ||||
| -BRCMF_FW_NVRAM_DEF(4373, "brcmfmac4373-sdio.bin", "brcmfmac4373-sdio.txt");
 | ||||
| +BRCMF_FW_DEF(43430A1, "brcmfmac43430-sdio");
 | ||||
| +BRCMF_FW_DEF(43455, "brcmfmac43455-sdio");
 | ||||
| +BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
 | ||||
| +BRCMF_FW_DEF(4356, "brcmfmac4356-sdio");
 | ||||
| +BRCMF_FW_DEF(4373, "brcmfmac4373-sdio");
 | ||||
|   | ||||
|  static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = { | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43340),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
 | ||||
| -	BRCMF_FW_NVRAM_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0xFFFFFFC0, 43241B5),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4329_CHIP_ID, 0xFFFFFFFF, 4329),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4330_CHIP_ID, 0xFFFFFFFF, 4330),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4334_CHIP_ID, 0xFFFFFFFF, 4334),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43340_CHIP_ID, 0xFFFFFFFF, 43340),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43341_CHIP_ID, 0xFFFFFFFF, 43340),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, 4335),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0x00000001, 43430A0),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43430_CHIP_ID, 0xFFFFFFFE, 43430A1),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, 43455),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, 4354),
 | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_4356_CHIP_ID, 0xFFFFFFFF, 4356),
 | ||||
| +	BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
 | ||||
|  }; | ||||
|   | ||||
|  static void pkt_align(struct sk_buff *p, int len, int align) | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -46,11 +46,11 @@
 | ||||
|  #define BRCMF_USB_CBCTL_READ		1 | ||||
|  #define BRCMF_USB_MAX_PKT_SIZE		1600 | ||||
|   | ||||
| -BRCMF_FW_DEF(43143, "brcmfmac43143.bin");
 | ||||
| -BRCMF_FW_DEF(43236B, "brcmfmac43236b.bin");
 | ||||
| -BRCMF_FW_DEF(43242A, "brcmfmac43242a.bin");
 | ||||
| -BRCMF_FW_DEF(43569, "brcmfmac43569.bin");
 | ||||
| -BRCMF_FW_DEF(4373, "brcmfmac4373.bin");
 | ||||
| +BRCMF_FW_DEF(43143, "brcmfmac43143");
 | ||||
| +BRCMF_FW_DEF(43236B, "brcmfmac43236b");
 | ||||
| +BRCMF_FW_DEF(43242A, "brcmfmac43242a");
 | ||||
| +BRCMF_FW_DEF(43569, "brcmfmac43569");
 | ||||
| +BRCMF_FW_DEF(4373, "brcmfmac4373");
 | ||||
|   | ||||
|  static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = { | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143), | ||||
| @ -1,574 +0,0 @@ | ||||
| From d09ae51a4b676151edaf572bcd5f272b5532639f Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:26 +0100 | ||||
| Subject: [PATCH] brcmfmac: pass struct in brcmf_fw_get_firmwares() | ||||
| 
 | ||||
| Make the function brcmf_fw_get_firmwares() a bit more easy to extend | ||||
| using a structure to pass the request parameters. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.c         | 175 ++++++++++++++------- | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.h         |  43 +++-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    |  38 ++++- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    |  32 +++- | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c |  43 ++++- | ||||
|  5 files changed, 245 insertions(+), 86 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -438,18 +438,31 @@ void brcmf_fw_nvram_free(void *nvram)
 | ||||
|   | ||||
|  struct brcmf_fw { | ||||
|  	struct device *dev; | ||||
| -	u16 flags;
 | ||||
| -	const struct firmware *code;
 | ||||
| -	const char *nvram_name;
 | ||||
| -	u16 domain_nr;
 | ||||
| -	u16 bus_nr;
 | ||||
| -	void (*done)(struct device *dev, int err, const struct firmware *fw,
 | ||||
| -		     void *nvram_image, u32 nvram_len);
 | ||||
| +	struct brcmf_fw_request *req;
 | ||||
| +	u32 curpos;
 | ||||
| +	void (*done)(struct device *dev, int err, struct brcmf_fw_request *req);
 | ||||
|  }; | ||||
|   | ||||
| +static void brcmf_fw_request_done(const struct firmware *fw, void *ctx);
 | ||||
| +
 | ||||
| +static void brcmf_fw_free_request(struct brcmf_fw_request *req)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_item *item;
 | ||||
| +	int i;
 | ||||
| +
 | ||||
| +	for (i = 0, item = &req->items[0]; i < req->n_items; i++, item++) {
 | ||||
| +		if (item->type == BRCMF_FW_TYPE_BINARY)
 | ||||
| +			release_firmware(item->binary);
 | ||||
| +		else if (item->type == BRCMF_FW_TYPE_NVRAM)
 | ||||
| +			brcmf_fw_nvram_free(item->nv_data.data);
 | ||||
| +	}
 | ||||
| +	kfree(req);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx) | ||||
|  { | ||||
|  	struct brcmf_fw *fwctx = ctx; | ||||
| +	struct brcmf_fw_item *cur;
 | ||||
|  	u32 nvram_length = 0; | ||||
|  	void *nvram = NULL; | ||||
|  	u8 *data = NULL; | ||||
| @@ -457,83 +470,150 @@ static void brcmf_fw_request_nvram_done(
 | ||||
|  	bool raw_nvram; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev)); | ||||
| +
 | ||||
| +	cur = &fwctx->req->items[fwctx->curpos];
 | ||||
| +
 | ||||
|  	if (fw && fw->data) { | ||||
|  		data = (u8 *)fw->data; | ||||
|  		data_len = fw->size; | ||||
|  		raw_nvram = false; | ||||
|  	} else { | ||||
|  		data = bcm47xx_nvram_get_contents(&data_len); | ||||
| -		if (!data && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
 | ||||
| +		if (!data && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
 | ||||
|  			goto fail; | ||||
|  		raw_nvram = true; | ||||
|  	} | ||||
|   | ||||
|  	if (data) | ||||
|  		nvram = brcmf_fw_nvram_strip(data, data_len, &nvram_length, | ||||
| -					     fwctx->domain_nr, fwctx->bus_nr);
 | ||||
| +					     fwctx->req->domain_nr,
 | ||||
| +					     fwctx->req->bus_nr);
 | ||||
|   | ||||
|  	if (raw_nvram) | ||||
|  		bcm47xx_nvram_release_contents(data); | ||||
|  	release_firmware(fw); | ||||
| -	if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
 | ||||
| +	if (!nvram && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
 | ||||
|  		goto fail; | ||||
|   | ||||
| -	fwctx->done(fwctx->dev, 0, fwctx->code, nvram, nvram_length);
 | ||||
| -	kfree(fwctx);
 | ||||
| +	brcmf_dbg(TRACE, "nvram %p len %d\n", nvram, nvram_length);
 | ||||
| +	cur->nv_data.data = nvram;
 | ||||
| +	cur->nv_data.len = nvram_length;
 | ||||
|  	return; | ||||
|   | ||||
|  fail: | ||||
|  	brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev)); | ||||
| -	release_firmware(fwctx->code);
 | ||||
| -	fwctx->done(fwctx->dev, -ENOENT, NULL, NULL, 0);
 | ||||
| +	fwctx->done(fwctx->dev, -ENOENT, NULL);
 | ||||
| +	brcmf_fw_free_request(fwctx->req);
 | ||||
|  	kfree(fwctx); | ||||
|  } | ||||
|   | ||||
| -static void brcmf_fw_request_code_done(const struct firmware *fw, void *ctx)
 | ||||
| +static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_item *cur;
 | ||||
| +	const struct firmware *fw = NULL;
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	cur = &fwctx->req->items[fwctx->curpos];
 | ||||
| +
 | ||||
| +	brcmf_dbg(TRACE, "%srequest for %s\n", async ? "async " : "",
 | ||||
| +		  cur->path);
 | ||||
| +
 | ||||
| +	if (async)
 | ||||
| +		ret = request_firmware_nowait(THIS_MODULE, true, cur->path,
 | ||||
| +					      fwctx->dev, GFP_KERNEL, fwctx,
 | ||||
| +					      brcmf_fw_request_done);
 | ||||
| +	else
 | ||||
| +		ret = request_firmware(&fw, cur->path, fwctx->dev);
 | ||||
| +
 | ||||
| +	if (ret < 0) {
 | ||||
| +		brcmf_fw_request_done(NULL, fwctx);
 | ||||
| +	} else if (!async && fw) {
 | ||||
| +		brcmf_dbg(TRACE, "firmware %s %sfound\n", cur->path,
 | ||||
| +			  fw ? "" : "not ");
 | ||||
| +		if (cur->type == BRCMF_FW_TYPE_BINARY)
 | ||||
| +			cur->binary = fw;
 | ||||
| +		else if (cur->type == BRCMF_FW_TYPE_NVRAM)
 | ||||
| +			brcmf_fw_request_nvram_done(fw, fwctx);
 | ||||
| +		else
 | ||||
| +			release_firmware(fw);
 | ||||
| +
 | ||||
| +		return -EAGAIN;
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
| +static void brcmf_fw_request_done(const struct firmware *fw, void *ctx)
 | ||||
|  { | ||||
|  	struct brcmf_fw *fwctx = ctx; | ||||
| +	struct brcmf_fw_item *cur;
 | ||||
|  	int ret = 0; | ||||
|   | ||||
| -	brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(fwctx->dev));
 | ||||
| -	if (!fw) {
 | ||||
| +	cur = &fwctx->req->items[fwctx->curpos];
 | ||||
| +
 | ||||
| +	brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path,
 | ||||
| +		  fw ? "" : "not ");
 | ||||
| +
 | ||||
| +	if (fw) {
 | ||||
| +		if (cur->type == BRCMF_FW_TYPE_BINARY)
 | ||||
| +			cur->binary = fw;
 | ||||
| +		else if (cur->type == BRCMF_FW_TYPE_NVRAM)
 | ||||
| +			brcmf_fw_request_nvram_done(fw, fwctx);
 | ||||
| +		else
 | ||||
| +			release_firmware(fw);
 | ||||
| +	} else if (cur->type == BRCMF_FW_TYPE_NVRAM) {
 | ||||
| +		brcmf_fw_request_nvram_done(NULL, fwctx);
 | ||||
| +	} else if (!(cur->flags & BRCMF_FW_REQF_OPTIONAL)) {
 | ||||
|  		ret = -ENOENT; | ||||
|  		goto fail; | ||||
|  	} | ||||
| -	/* only requested code so done here */
 | ||||
| -	if (!(fwctx->flags & BRCMF_FW_REQUEST_NVRAM))
 | ||||
| -		goto done;
 | ||||
| -
 | ||||
| -	fwctx->code = fw;
 | ||||
| -	ret = request_firmware_nowait(THIS_MODULE, true, fwctx->nvram_name,
 | ||||
| -				      fwctx->dev, GFP_KERNEL, fwctx,
 | ||||
| -				      brcmf_fw_request_nvram_done);
 | ||||
|   | ||||
| -	/* pass NULL to nvram callback for bcm47xx fallback */
 | ||||
| -	if (ret)
 | ||||
| -		brcmf_fw_request_nvram_done(NULL, fwctx);
 | ||||
| +	do {
 | ||||
| +		if (++fwctx->curpos == fwctx->req->n_items) {
 | ||||
| +			ret = 0;
 | ||||
| +			goto done;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		ret = brcmf_fw_request_next_item(fwctx, false);
 | ||||
| +	} while (ret == -EAGAIN);
 | ||||
| +
 | ||||
|  	return; | ||||
|   | ||||
|  fail: | ||||
| -	brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
 | ||||
| +	brcmf_dbg(TRACE, "failed err=%d: dev=%s, fw=%s\n", ret,
 | ||||
| +		  dev_name(fwctx->dev), cur->path);
 | ||||
| +	brcmf_fw_free_request(fwctx->req);
 | ||||
| +	fwctx->req = NULL;
 | ||||
|  done: | ||||
| -	fwctx->done(fwctx->dev, ret, fw, NULL, 0);
 | ||||
| +	fwctx->done(fwctx->dev, ret, fwctx->req);
 | ||||
|  	kfree(fwctx); | ||||
|  } | ||||
|   | ||||
| -int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
 | ||||
| -				const char *code, const char *nvram,
 | ||||
| -				void (*fw_cb)(struct device *dev, int err,
 | ||||
| -					      const struct firmware *fw,
 | ||||
| -					      void *nvram_image, u32 nvram_len),
 | ||||
| -				u16 domain_nr, u16 bus_nr)
 | ||||
| +static bool brcmf_fw_request_is_valid(struct brcmf_fw_request *req)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_item *item;
 | ||||
| +	int i;
 | ||||
| +
 | ||||
| +	if (!req->n_items)
 | ||||
| +		return false;
 | ||||
| +
 | ||||
| +	for (i = 0, item = &req->items[0]; i < req->n_items; i++, item++) {
 | ||||
| +		if (!item->path)
 | ||||
| +			return false;
 | ||||
| +	}
 | ||||
| +	return true;
 | ||||
| +}
 | ||||
| +
 | ||||
| +int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
 | ||||
| +			   void (*fw_cb)(struct device *dev, int err,
 | ||||
| +					 struct brcmf_fw_request *req))
 | ||||
|  { | ||||
|  	struct brcmf_fw *fwctx; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev)); | ||||
| -	if (!fw_cb || !code)
 | ||||
| +	if (!fw_cb)
 | ||||
|  		return -EINVAL; | ||||
|   | ||||
| -	if ((flags & BRCMF_FW_REQUEST_NVRAM) && !nvram)
 | ||||
| +	if (!brcmf_fw_request_is_valid(req))
 | ||||
|  		return -EINVAL; | ||||
|   | ||||
|  	fwctx = kzalloc(sizeof(*fwctx), GFP_KERNEL); | ||||
| @@ -541,26 +621,11 @@ int brcmf_fw_get_firmwares_pcie(struct d
 | ||||
|  		return -ENOMEM; | ||||
|   | ||||
|  	fwctx->dev = dev; | ||||
| -	fwctx->flags = flags;
 | ||||
| +	fwctx->req = req;
 | ||||
|  	fwctx->done = fw_cb; | ||||
| -	if (flags & BRCMF_FW_REQUEST_NVRAM)
 | ||||
| -		fwctx->nvram_name = nvram;
 | ||||
| -	fwctx->domain_nr = domain_nr;
 | ||||
| -	fwctx->bus_nr = bus_nr;
 | ||||
| -
 | ||||
| -	return request_firmware_nowait(THIS_MODULE, true, code, dev,
 | ||||
| -				       GFP_KERNEL, fwctx,
 | ||||
| -				       brcmf_fw_request_code_done);
 | ||||
| -}
 | ||||
|   | ||||
| -int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
 | ||||
| -			   const char *code, const char *nvram,
 | ||||
| -			   void (*fw_cb)(struct device *dev, int err,
 | ||||
| -					 const struct firmware *fw,
 | ||||
| -					 void *nvram_image, u32 nvram_len))
 | ||||
| -{
 | ||||
| -	return brcmf_fw_get_firmwares_pcie(dev, flags, code, nvram, fw_cb, 0,
 | ||||
| -					   0);
 | ||||
| +	brcmf_fw_request_next_item(fwctx, true);
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|  static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN], | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| @@ -16,10 +16,7 @@
 | ||||
|  #ifndef BRCMFMAC_FIRMWARE_H | ||||
|  #define BRCMFMAC_FIRMWARE_H | ||||
|   | ||||
| -#define BRCMF_FW_REQUEST		0x000F
 | ||||
| -#define  BRCMF_FW_REQUEST_NVRAM		0x0001
 | ||||
| -#define BRCMF_FW_REQ_FLAGS		0x00F0
 | ||||
| -#define  BRCMF_FW_REQ_NV_OPTIONAL	0x0010
 | ||||
| +#define BRCMF_FW_REQF_OPTIONAL		0x0001
 | ||||
|   | ||||
|  #define	BRCMF_FW_NAME_LEN		320 | ||||
|   | ||||
| @@ -54,21 +51,39 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|  			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN], | ||||
|  			      char nvram_name[BRCMF_FW_NAME_LEN]); | ||||
|  void brcmf_fw_nvram_free(void *nvram); | ||||
| +
 | ||||
| +enum brcmf_fw_type {
 | ||||
| +	BRCMF_FW_TYPE_BINARY,
 | ||||
| +	BRCMF_FW_TYPE_NVRAM
 | ||||
| +};
 | ||||
| +
 | ||||
| +struct brcmf_fw_item {
 | ||||
| +	const char *path;
 | ||||
| +	enum brcmf_fw_type type;
 | ||||
| +	u16 flags;
 | ||||
| +	union {
 | ||||
| +		const struct firmware *binary;
 | ||||
| +		struct {
 | ||||
| +			void *data;
 | ||||
| +			u32 len;
 | ||||
| +		} nv_data;
 | ||||
| +	};
 | ||||
| +};
 | ||||
| +
 | ||||
| +struct brcmf_fw_request {
 | ||||
| +	u16 domain_nr;
 | ||||
| +	u16 bus_nr;
 | ||||
| +	u32 n_items;
 | ||||
| +	struct brcmf_fw_item items[0];
 | ||||
| +};
 | ||||
| +
 | ||||
|  /* | ||||
|   * Request firmware(s) asynchronously. When the asynchronous request | ||||
|   * fails it will not use the callback, but call device_release_driver() | ||||
|   * instead which will call the driver .remove() callback. | ||||
|   */ | ||||
| -int brcmf_fw_get_firmwares_pcie(struct device *dev, u16 flags,
 | ||||
| -				const char *code, const char *nvram,
 | ||||
| -				void (*fw_cb)(struct device *dev, int err,
 | ||||
| -					      const struct firmware *fw,
 | ||||
| -					      void *nvram_image, u32 nvram_len),
 | ||||
| -				u16 domain_nr, u16 bus_nr);
 | ||||
| -int brcmf_fw_get_firmwares(struct device *dev, u16 flags,
 | ||||
| -			   const char *code, const char *nvram,
 | ||||
| +int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
 | ||||
|  			   void (*fw_cb)(struct device *dev, int err, | ||||
| -					 const struct firmware *fw,
 | ||||
| -					 void *nvram_image, u32 nvram_len));
 | ||||
| +					 struct brcmf_fw_request *req));
 | ||||
|   | ||||
|  #endif /* BRCMFMAC_FIRMWARE_H */ | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1651,15 +1651,19 @@ static const struct brcmf_buscore_ops br
 | ||||
|  	.write32 = brcmf_pcie_buscore_write32, | ||||
|  }; | ||||
|   | ||||
| +#define BRCMF_PCIE_FW_CODE	0
 | ||||
| +#define BRCMF_PCIE_FW_NVRAM	1
 | ||||
| +
 | ||||
|  static void brcmf_pcie_setup(struct device *dev, int ret, | ||||
| -			     const struct firmware *fw,
 | ||||
| -			     void *nvram, u32 nvram_len)
 | ||||
| +			     struct brcmf_fw_request *fwreq)
 | ||||
|  { | ||||
| +	const struct firmware *fw;
 | ||||
| +	void *nvram;
 | ||||
|  	struct brcmf_bus *bus; | ||||
|  	struct brcmf_pciedev *pcie_bus_dev; | ||||
|  	struct brcmf_pciedev_info *devinfo; | ||||
|  	struct brcmf_commonring **flowrings; | ||||
| -	u32 i;
 | ||||
| +	u32 i, nvram_len;
 | ||||
|   | ||||
|  	/* check firmware loading result */ | ||||
|  	if (ret) | ||||
| @@ -1670,6 +1674,11 @@ static void brcmf_pcie_setup(struct devi
 | ||||
|  	devinfo = pcie_bus_dev->devinfo; | ||||
|  	brcmf_pcie_attach(devinfo); | ||||
|   | ||||
| +	fw = fwreq->items[BRCMF_PCIE_FW_CODE].binary;
 | ||||
| +	nvram = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.data;
 | ||||
| +	nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len;
 | ||||
| +	kfree(fwreq);
 | ||||
| +
 | ||||
|  	/* Some of the firmwares have the size of the memory of the device | ||||
|  	 * defined inside the firmware. This is because part of the memory in | ||||
|  	 * the device is shared and the devision is determined by FW. Parse | ||||
| @@ -1730,6 +1739,7 @@ static int
 | ||||
|  brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||||
|  { | ||||
|  	int ret; | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
|  	struct brcmf_pciedev_info *devinfo; | ||||
|  	struct brcmf_pciedev *pcie_bus_dev; | ||||
|  	struct brcmf_bus *bus; | ||||
| @@ -1800,12 +1810,26 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
 | ||||
|  	if (ret) | ||||
|  		goto fail_bus; | ||||
|   | ||||
| -	ret = brcmf_fw_get_firmwares_pcie(bus->dev, BRCMF_FW_REQUEST_NVRAM |
 | ||||
| -						    BRCMF_FW_REQ_NV_OPTIONAL,
 | ||||
| -					  devinfo->fw_name, devinfo->nvram_name,
 | ||||
| -					  brcmf_pcie_setup, domain_nr, bus_nr);
 | ||||
| +	fwreq = kzalloc(sizeof(*fwreq) + 2 * sizeof(struct brcmf_fw_item),
 | ||||
| +			GFP_KERNEL);
 | ||||
| +	if (!fwreq) {
 | ||||
| +		ret = -ENOMEM;
 | ||||
| +		goto fail_bus;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_CODE].path = devinfo->fw_name;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_NVRAM].path = devinfo->nvram_name;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
 | ||||
| +	fwreq->n_items = 2;
 | ||||
| +	fwreq->domain_nr = domain_nr;
 | ||||
| +	fwreq->bus_nr = bus_nr;
 | ||||
| +	ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup);
 | ||||
|  	if (ret == 0) | ||||
|  		return 0; | ||||
| +
 | ||||
| +	kfree(fwreq);
 | ||||
|  fail_bus: | ||||
|  	kfree(bus->msgbuf); | ||||
|  	kfree(bus); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4031,14 +4031,19 @@ static const struct brcmf_bus_ops brcmf_
 | ||||
|  	.get_fwname = brcmf_sdio_get_fwname, | ||||
|  }; | ||||
|   | ||||
| +#define BRCMF_SDIO_FW_CODE	0
 | ||||
| +#define BRCMF_SDIO_FW_NVRAM	1
 | ||||
| +
 | ||||
|  static void brcmf_sdio_firmware_callback(struct device *dev, int err, | ||||
| -					 const struct firmware *code,
 | ||||
| -					 void *nvram, u32 nvram_len)
 | ||||
| +					 struct brcmf_fw_request *fwreq)
 | ||||
|  { | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
|  	struct brcmf_sdio_dev *sdiod = bus_if->bus_priv.sdio; | ||||
|  	struct brcmf_sdio *bus = sdiod->bus; | ||||
|  	struct brcmf_core *core = bus->sdio_core; | ||||
| +	const struct firmware *code;
 | ||||
| +	void *nvram;
 | ||||
| +	u32 nvram_len;
 | ||||
|  	u8 saveclk; | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err); | ||||
| @@ -4046,6 +4051,11 @@ static void brcmf_sdio_firmware_callback
 | ||||
|  	if (err) | ||||
|  		goto fail; | ||||
|   | ||||
| +	code = fwreq->items[BRCMF_SDIO_FW_CODE].binary;
 | ||||
| +	nvram = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.data;
 | ||||
| +	nvram_len = fwreq->items[BRCMF_SDIO_FW_NVRAM].nv_data.len;
 | ||||
| +	kfree(fwreq);
 | ||||
| +
 | ||||
|  	/* try to download image and nvram to the dongle */ | ||||
|  	bus->alp_only = true; | ||||
|  	err = brcmf_sdio_download_firmware(bus, code, nvram, nvram_len); | ||||
| @@ -4150,6 +4160,7 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	int ret; | ||||
|  	struct brcmf_sdio *bus; | ||||
|  	struct workqueue_struct *wq; | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
| @@ -4240,11 +4251,24 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|  	if (ret) | ||||
|  		goto fail; | ||||
|   | ||||
| -	ret = brcmf_fw_get_firmwares(sdiodev->dev, BRCMF_FW_REQUEST_NVRAM,
 | ||||
| -				     sdiodev->fw_name, sdiodev->nvram_name,
 | ||||
| +	fwreq = kzalloc(sizeof(fwreq) + 2 * sizeof(struct brcmf_fw_item),
 | ||||
| +			GFP_KERNEL);
 | ||||
| +	if (!fwreq) {
 | ||||
| +		ret = -ENOMEM;
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_CODE].path = sdiodev->fw_name;
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_NVRAM].path = sdiodev->nvram_name;
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| +	fwreq->n_items = 2;
 | ||||
| +
 | ||||
| +	ret = brcmf_fw_get_firmwares(sdiodev->dev, fwreq,
 | ||||
|  				     brcmf_sdio_firmware_callback); | ||||
|  	if (ret != 0) { | ||||
|  		brcmf_err("async firmware request failed: %d\n", ret); | ||||
| +		kfree(fwreq);
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1155,18 +1155,23 @@ static const struct brcmf_bus_ops brcmf_
 | ||||
|  	.get_fwname = brcmf_usb_get_fwname, | ||||
|  }; | ||||
|   | ||||
| +#define BRCMF_USB_FW_CODE	0
 | ||||
| +
 | ||||
|  static void brcmf_usb_probe_phase2(struct device *dev, int ret, | ||||
| -				   const struct firmware *fw,
 | ||||
| -				   void *nvram, u32 nvlen)
 | ||||
| +				   struct brcmf_fw_request *fwreq)
 | ||||
|  { | ||||
|  	struct brcmf_bus *bus = dev_get_drvdata(dev); | ||||
|  	struct brcmf_usbdev_info *devinfo = bus->bus_priv.usb->devinfo; | ||||
| +	const struct firmware *fw;
 | ||||
|   | ||||
|  	if (ret) | ||||
|  		goto error; | ||||
|   | ||||
|  	brcmf_dbg(USB, "Start fw downloading\n"); | ||||
|   | ||||
| +	fw = fwreq->items[BRCMF_USB_FW_CODE].binary;
 | ||||
| +	kfree(fwreq);
 | ||||
| +
 | ||||
|  	ret = check_file(fw->data); | ||||
|  	if (ret < 0) { | ||||
|  		brcmf_err("invalid firmware\n"); | ||||
| @@ -1200,6 +1205,7 @@ static int brcmf_usb_probe_cb(struct brc
 | ||||
|  	struct brcmf_bus *bus = NULL; | ||||
|  	struct brcmf_usbdev *bus_pub = NULL; | ||||
|  	struct device *dev = devinfo->dev; | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
|  	int ret; | ||||
|   | ||||
|  	brcmf_dbg(USB, "Enter\n"); | ||||
| @@ -1250,11 +1256,22 @@ static int brcmf_usb_probe_cb(struct brc
 | ||||
|  	if (ret) | ||||
|  		goto fail; | ||||
|   | ||||
| +	fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
 | ||||
| +			GFP_KERNEL);
 | ||||
| +	if (!fwreq) {
 | ||||
| +		ret = -ENOMEM;
 | ||||
| +		goto fail;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
 | ||||
| +	fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->n_items = 1;
 | ||||
| +
 | ||||
|  	/* request firmware here */ | ||||
| -	ret = brcmf_fw_get_firmwares(dev, 0, devinfo->fw_name, NULL,
 | ||||
| -				     brcmf_usb_probe_phase2);
 | ||||
| +	ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2);
 | ||||
|  	if (ret) { | ||||
|  		brcmf_err("firmware request failed: %d\n", ret); | ||||
| +		kfree(fwreq);
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| @@ -1447,11 +1464,25 @@ static int brcmf_usb_reset_resume(struct
 | ||||
|  { | ||||
|  	struct usb_device *usb = interface_to_usbdev(intf); | ||||
|  	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	int ret;
 | ||||
|   | ||||
|  	brcmf_dbg(USB, "Enter\n"); | ||||
|   | ||||
| -	return brcmf_fw_get_firmwares(&usb->dev, 0, devinfo->fw_name, NULL,
 | ||||
| -				      brcmf_usb_probe_phase2);
 | ||||
| +	fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
 | ||||
| +			GFP_KERNEL);
 | ||||
| +	if (!fwreq)
 | ||||
| +		return -ENOMEM;
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
 | ||||
| +	fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->n_items = 1;
 | ||||
| +
 | ||||
| +	ret = brcmf_fw_get_firmwares(&usb->dev, fwreq, brcmf_usb_probe_phase2);
 | ||||
| +	if (ret < 0)
 | ||||
| +		kfree(fwreq);
 | ||||
| +
 | ||||
| +	return ret;
 | ||||
|  } | ||||
|   | ||||
|  #define BRCMF_USB_DEVICE(dev_id)	\ | ||||
| @ -1,328 +0,0 @@ | ||||
| From 2baa3aaee27f137b8db9a9224d0fe9b281d28e34 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:27 +0100 | ||||
| Subject: [PATCH] brcmfmac: introduce brcmf_fw_alloc_request() function | ||||
| 
 | ||||
| The function brcmf_fw_alloc_request() takes a list of required files | ||||
| and allocated the struct brcmf_fw_request instance accordingly. The | ||||
| request can be modified by the caller before being passed to the | ||||
| brcmf_fw_request_firmwares() function. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.c         | 58 ++++++++++++++++++++++ | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.h         | 11 ++++ | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 58 ++++++++++++---------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 38 ++++++++------ | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 42 +++++++++------- | ||||
|  5 files changed, 147 insertions(+), 60 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -688,3 +688,61 @@ int brcmf_fw_map_chip_to_name(u32 chip,
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +struct brcmf_fw_request *
 | ||||
| +brcmf_fw_alloc_request(u32 chip, u32 chiprev,
 | ||||
| +		       struct brcmf_firmware_mapping mapping_table[],
 | ||||
| +		       u32 table_size, struct brcmf_fw_name *fwnames,
 | ||||
| +		       u32 n_fwnames)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	char chipname[12];
 | ||||
| +	const char *mp_path;
 | ||||
| +	u32 i, j;
 | ||||
| +	char end;
 | ||||
| +	size_t reqsz;
 | ||||
| +
 | ||||
| +	for (i = 0; i < table_size; i++) {
 | ||||
| +		if (mapping_table[i].chipid == chip &&
 | ||||
| +		    mapping_table[i].revmask & BIT(chiprev))
 | ||||
| +			break;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	if (i == table_size) {
 | ||||
| +		brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
 | ||||
| +		return NULL;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	reqsz = sizeof(*fwreq) + n_fwnames * sizeof(struct brcmf_fw_item);
 | ||||
| +	fwreq = kzalloc(reqsz, GFP_KERNEL);
 | ||||
| +	if (!fwreq)
 | ||||
| +		return NULL;
 | ||||
| +
 | ||||
| +	brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
 | ||||
| +
 | ||||
| +	brcmf_info("using %s for chip %s\n",
 | ||||
| +		   mapping_table[i].fw_base, chipname);
 | ||||
| +
 | ||||
| +	mp_path = brcmf_mp_global.firmware_path;
 | ||||
| +	end = mp_path[strlen(mp_path) - 1];
 | ||||
| +	fwreq->n_items = n_fwnames;
 | ||||
| +
 | ||||
| +	for (j = 0; j < n_fwnames; j++) {
 | ||||
| +		fwreq->items[j].path = fwnames[j].path;
 | ||||
| +		/* check if firmware path is provided by module parameter */
 | ||||
| +		if (brcmf_mp_global.firmware_path[0] != '\0') {
 | ||||
| +			strlcpy(fwnames[j].path, mp_path,
 | ||||
| +				BRCMF_FW_NAME_LEN);
 | ||||
| +
 | ||||
| +			if (end != '/') {
 | ||||
| +				strlcat(fwnames[j].path, "/",
 | ||||
| +					BRCMF_FW_NAME_LEN);
 | ||||
| +			}
 | ||||
| +		}
 | ||||
| +		brcmf_fw_get_full_name(fwnames[j].path,
 | ||||
| +				       mapping_table[i].fw_base,
 | ||||
| +				       fwnames[j].extension);
 | ||||
| +		fwreq->items[j].path = fwnames[j].path;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return fwreq;
 | ||||
| +}
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| @@ -77,6 +77,17 @@ struct brcmf_fw_request {
 | ||||
|  	struct brcmf_fw_item items[0]; | ||||
|  }; | ||||
|   | ||||
| +struct brcmf_fw_name {
 | ||||
| +	const char *extension;
 | ||||
| +	char *path;
 | ||||
| +};
 | ||||
| +
 | ||||
| +struct brcmf_fw_request *
 | ||||
| +brcmf_fw_alloc_request(u32 chip, u32 chiprev,
 | ||||
| +		       struct brcmf_firmware_mapping mapping_table[],
 | ||||
| +		       u32 table_size, struct brcmf_fw_name *fwnames,
 | ||||
| +		       u32 n_fwnames);
 | ||||
| +
 | ||||
|  /* | ||||
|   * Request firmware(s) asynchronously. When the asynchronous request | ||||
|   * fails it will not use the callback, but call device_release_driver() | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1735,6 +1735,31 @@ fail:
 | ||||
|  	device_release_driver(dev); | ||||
|  } | ||||
|   | ||||
| +static struct brcmf_fw_request *
 | ||||
| +brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ".bin", devinfo->fw_name },
 | ||||
| +		{ ".txt", devinfo->nvram_name },
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	fwreq = brcmf_fw_alloc_request(devinfo->ci->chip, devinfo->ci->chiprev,
 | ||||
| +				       brcmf_pcie_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_pcie_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return NULL;
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| +	fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
 | ||||
| +	fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus);
 | ||||
| +	fwreq->bus_nr = devinfo->pdev->bus->number;
 | ||||
| +
 | ||||
| +	return fwreq;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int | ||||
|  brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||||
|  { | ||||
| @@ -1743,13 +1768,8 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
 | ||||
|  	struct brcmf_pciedev_info *devinfo; | ||||
|  	struct brcmf_pciedev *pcie_bus_dev; | ||||
|  	struct brcmf_bus *bus; | ||||
| -	u16 domain_nr;
 | ||||
| -	u16 bus_nr;
 | ||||
|   | ||||
| -	domain_nr = pci_domain_nr(pdev->bus) + 1;
 | ||||
| -	bus_nr = pdev->bus->number;
 | ||||
| -	brcmf_dbg(PCIE, "Enter %x:%x (%d/%d)\n", pdev->vendor, pdev->device,
 | ||||
| -		  domain_nr, bus_nr);
 | ||||
| +	brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
 | ||||
|   | ||||
|  	ret = -ENOMEM; | ||||
|  	devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL); | ||||
| @@ -1803,33 +1823,19 @@ brcmf_pcie_probe(struct pci_dev *pdev, c
 | ||||
|  	bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot); | ||||
|  	dev_set_drvdata(&pdev->dev, bus); | ||||
|   | ||||
| -	ret = brcmf_fw_map_chip_to_name(devinfo->ci->chip, devinfo->ci->chiprev,
 | ||||
| -					brcmf_pcie_fwnames,
 | ||||
| -					ARRAY_SIZE(brcmf_pcie_fwnames),
 | ||||
| -					devinfo->fw_name, devinfo->nvram_name);
 | ||||
| -	if (ret)
 | ||||
| -		goto fail_bus;
 | ||||
| -
 | ||||
| -	fwreq = kzalloc(sizeof(*fwreq) + 2 * sizeof(struct brcmf_fw_item),
 | ||||
| -			GFP_KERNEL);
 | ||||
| +	fwreq = brcmf_pcie_prepare_fw_request(devinfo);
 | ||||
|  	if (!fwreq) { | ||||
|  		ret = -ENOMEM; | ||||
|  		goto fail_bus; | ||||
|  	} | ||||
|   | ||||
| -	fwreq->items[BRCMF_PCIE_FW_CODE].path = devinfo->fw_name;
 | ||||
| -	fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| -	fwreq->items[BRCMF_PCIE_FW_NVRAM].path = devinfo->nvram_name;
 | ||||
| -	fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| -	fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
 | ||||
| -	fwreq->n_items = 2;
 | ||||
| -	fwreq->domain_nr = domain_nr;
 | ||||
| -	fwreq->bus_nr = bus_nr;
 | ||||
|  	ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup); | ||||
| -	if (ret == 0)
 | ||||
| -		return 0;
 | ||||
| +	if (ret < 0) {
 | ||||
| +		kfree(fwreq);
 | ||||
| +		goto fail_bus;
 | ||||
| +	}
 | ||||
| +	return 0;
 | ||||
|   | ||||
| -	kfree(fwreq);
 | ||||
|  fail_bus: | ||||
|  	kfree(bus->msgbuf); | ||||
|  	kfree(bus); | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4155,6 +4155,28 @@ fail:
 | ||||
|  	device_release_driver(dev); | ||||
|  } | ||||
|   | ||||
| +static struct brcmf_fw_request *
 | ||||
| +brcmf_sdio_prepare_fw_request(struct brcmf_sdio *bus)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ".bin", bus->sdiodev->fw_name },
 | ||||
| +		{ ".txt", bus->sdiodev->nvram_name },
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	fwreq = brcmf_fw_alloc_request(bus->ci->chip, bus->ci->chiprev,
 | ||||
| +				       brcmf_sdio_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_sdio_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return NULL;
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +	fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| +
 | ||||
| +	return fwreq;
 | ||||
| +}
 | ||||
| +
 | ||||
|  struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev) | ||||
|  { | ||||
|  	int ret; | ||||
| @@ -4244,26 +4266,12 @@ struct brcmf_sdio *brcmf_sdio_probe(stru
 | ||||
|   | ||||
|  	brcmf_dbg(INFO, "completed!!\n"); | ||||
|   | ||||
| -	ret = brcmf_fw_map_chip_to_name(bus->ci->chip, bus->ci->chiprev,
 | ||||
| -					brcmf_sdio_fwnames,
 | ||||
| -					ARRAY_SIZE(brcmf_sdio_fwnames),
 | ||||
| -					sdiodev->fw_name, sdiodev->nvram_name);
 | ||||
| -	if (ret)
 | ||||
| -		goto fail;
 | ||||
| -
 | ||||
| -	fwreq = kzalloc(sizeof(fwreq) + 2 * sizeof(struct brcmf_fw_item),
 | ||||
| -			GFP_KERNEL);
 | ||||
| +	fwreq = brcmf_sdio_prepare_fw_request(bus);
 | ||||
|  	if (!fwreq) { | ||||
|  		ret = -ENOMEM; | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| -	fwreq->items[BRCMF_SDIO_FW_CODE].path = sdiodev->fw_name;
 | ||||
| -	fwreq->items[BRCMF_SDIO_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| -	fwreq->items[BRCMF_SDIO_FW_NVRAM].path = sdiodev->nvram_name;
 | ||||
| -	fwreq->items[BRCMF_SDIO_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
 | ||||
| -	fwreq->n_items = 2;
 | ||||
| -
 | ||||
|  	ret = brcmf_fw_get_firmwares(sdiodev->dev, fwreq, | ||||
|  				     brcmf_sdio_firmware_callback); | ||||
|  	if (ret != 0) { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1200,6 +1200,27 @@ error:
 | ||||
|  	device_release_driver(dev); | ||||
|  } | ||||
|   | ||||
| +static struct brcmf_fw_request *
 | ||||
| +brcmf_usb_prepare_fw_request(struct brcmf_usbdev_info *devinfo)
 | ||||
| +{
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ".bin", devinfo->fw_name },
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	fwreq = brcmf_fw_alloc_request(devinfo->bus_pub.devid,
 | ||||
| +				       devinfo->bus_pub.chiprev,
 | ||||
| +				       brcmf_usb_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_usb_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return NULL;
 | ||||
| +
 | ||||
| +	fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| +
 | ||||
| +	return fwreq;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) | ||||
|  { | ||||
|  	struct brcmf_bus *bus = NULL; | ||||
| @@ -1249,24 +1270,12 @@ static int brcmf_usb_probe_cb(struct brc
 | ||||
|  	bus->chip = bus_pub->devid; | ||||
|  	bus->chiprev = bus_pub->chiprev; | ||||
|   | ||||
| -	ret = brcmf_fw_map_chip_to_name(bus_pub->devid, bus_pub->chiprev,
 | ||||
| -					brcmf_usb_fwnames,
 | ||||
| -					ARRAY_SIZE(brcmf_usb_fwnames),
 | ||||
| -					devinfo->fw_name, NULL);
 | ||||
| -	if (ret)
 | ||||
| -		goto fail;
 | ||||
| -
 | ||||
| -	fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
 | ||||
| -			GFP_KERNEL);
 | ||||
| +	fwreq = brcmf_usb_prepare_fw_request(devinfo);
 | ||||
|  	if (!fwreq) { | ||||
|  		ret = -ENOMEM; | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| -	fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
 | ||||
| -	fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| -	fwreq->n_items = 1;
 | ||||
| -
 | ||||
|  	/* request firmware here */ | ||||
|  	ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2); | ||||
|  	if (ret) { | ||||
| @@ -1469,15 +1478,10 @@ static int brcmf_usb_reset_resume(struct
 | ||||
|   | ||||
|  	brcmf_dbg(USB, "Enter\n"); | ||||
|   | ||||
| -	fwreq = kzalloc(sizeof(*fwreq) + sizeof(struct brcmf_fw_item),
 | ||||
| -			GFP_KERNEL);
 | ||||
| +	fwreq = brcmf_usb_prepare_fw_request(devinfo);
 | ||||
|  	if (!fwreq) | ||||
|  		return -ENOMEM; | ||||
|   | ||||
| -	fwreq->items[BRCMF_USB_FW_CODE].path = devinfo->fw_name;
 | ||||
| -	fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
 | ||||
| -	fwreq->n_items = 1;
 | ||||
| -
 | ||||
|  	ret = brcmf_fw_get_firmwares(&usb->dev, fwreq, brcmf_usb_probe_phase2); | ||||
|  	if (ret < 0) | ||||
|  		kfree(fwreq); | ||||
| @ -1,231 +0,0 @@ | ||||
| From bf7a7b37f6ef5090a2bae7e7ae23cd26b741cca4 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:28 +0100 | ||||
| Subject: [PATCH] brcmfmac: add extension to .get_fwname() callbacks | ||||
| 
 | ||||
| This changes the bus layer api by having the caller provide an | ||||
| extension. With this the callback can use brcmf_fw_alloc_request() | ||||
| to get the needed firmware name. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  6 +-- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/common.c  | 43 +++------------------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 27 +++++++------- | ||||
|  .../wireless/broadcom/brcm80211/brcmfmac/sdio.c    | 26 +++++++------ | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/usb.c | 27 ++++++++------ | ||||
|  5 files changed, 51 insertions(+), 78 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| @@ -88,7 +88,7 @@ struct brcmf_bus_ops {
 | ||||
|  	void (*wowl_config)(struct device *dev, bool enabled); | ||||
|  	size_t (*get_ramsize)(struct device *dev); | ||||
|  	int (*get_memdump)(struct device *dev, void *data, size_t len); | ||||
| -	int (*get_fwname)(struct device *dev, uint chip, uint chiprev,
 | ||||
| +	int (*get_fwname)(struct device *dev, const char *ext,
 | ||||
|  			  unsigned char *fw_name); | ||||
|  }; | ||||
|   | ||||
| @@ -228,10 +228,10 @@ int brcmf_bus_get_memdump(struct brcmf_b
 | ||||
|  } | ||||
|   | ||||
|  static inline | ||||
| -int brcmf_bus_get_fwname(struct brcmf_bus *bus, uint chip, uint chiprev,
 | ||||
| +int brcmf_bus_get_fwname(struct brcmf_bus *bus, const char *ext,
 | ||||
|  			 unsigned char *fw_name) | ||||
|  { | ||||
| -	return bus->ops->get_fwname(bus->dev, chip, chiprev, fw_name);
 | ||||
| +	return bus->ops->get_fwname(bus->dev, ext, fw_name);
 | ||||
|  } | ||||
|   | ||||
|  /* | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
 | ||||
| @@ -129,42 +129,9 @@ static int brcmf_c_download(struct brcmf
 | ||||
|  	return err; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_c_get_clm_name(struct brcmf_if *ifp, u8 *clm_name)
 | ||||
| -{
 | ||||
| -	struct brcmf_bus *bus = ifp->drvr->bus_if;
 | ||||
| -	u8 fw_name[BRCMF_FW_NAME_LEN];
 | ||||
| -	u8 *ptr;
 | ||||
| -	size_t len;
 | ||||
| -	s32 err;
 | ||||
| -
 | ||||
| -	memset(fw_name, 0, BRCMF_FW_NAME_LEN);
 | ||||
| -	err = brcmf_bus_get_fwname(bus, bus->chip, bus->chiprev, fw_name);
 | ||||
| -	if (err) {
 | ||||
| -		brcmf_err("get firmware name failed (%d)\n", err);
 | ||||
| -		goto done;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	/* generate CLM blob file name */
 | ||||
| -	ptr = strrchr(fw_name, '.');
 | ||||
| -	if (!ptr) {
 | ||||
| -		err = -ENOENT;
 | ||||
| -		goto done;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	len = ptr - fw_name + 1;
 | ||||
| -	if (len + strlen(".clm_blob") > BRCMF_FW_NAME_LEN) {
 | ||||
| -		err = -E2BIG;
 | ||||
| -	} else {
 | ||||
| -		strlcpy(clm_name, fw_name, len);
 | ||||
| -		strlcat(clm_name, ".clm_blob", BRCMF_FW_NAME_LEN);
 | ||||
| -	}
 | ||||
| -done:
 | ||||
| -	return err;
 | ||||
| -}
 | ||||
| -
 | ||||
|  static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) | ||||
|  { | ||||
| -	struct device *dev = ifp->drvr->bus_if->dev;
 | ||||
| +	struct brcmf_bus *bus = ifp->drvr->bus_if;
 | ||||
|  	struct brcmf_dload_data_le *chunk_buf; | ||||
|  	const struct firmware *clm = NULL; | ||||
|  	u8 clm_name[BRCMF_FW_NAME_LEN]; | ||||
| @@ -177,16 +144,16 @@ static int brcmf_c_process_clm_blob(stru
 | ||||
|   | ||||
|  	brcmf_dbg(TRACE, "Enter\n"); | ||||
|   | ||||
| -	memset(clm_name, 0, BRCMF_FW_NAME_LEN);
 | ||||
| -	err = brcmf_c_get_clm_name(ifp, clm_name);
 | ||||
| +	memset(clm_name, 0, sizeof(clm_name));
 | ||||
| +	err = brcmf_bus_get_fwname(bus, ".clm_blob", clm_name);
 | ||||
|  	if (err) { | ||||
|  		brcmf_err("get CLM blob file name failed (%d)\n", err); | ||||
|  		return err; | ||||
|  	} | ||||
|   | ||||
| -	err = request_firmware(&clm, clm_name, dev);
 | ||||
| +	err = request_firmware(&clm, clm_name, bus->dev);
 | ||||
|  	if (err) { | ||||
| -		brcmf_info("no clm_blob available(err=%d), device may have limited channels available\n",
 | ||||
| +		brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n",
 | ||||
|  			   err); | ||||
|  		return 0; | ||||
|  	} | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -1350,23 +1350,24 @@ static int brcmf_pcie_get_memdump(struct
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -static int brcmf_pcie_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| -				 u8 *fw_name)
 | ||||
| +static
 | ||||
| +int brcmf_pcie_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
 | ||||
|  { | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
| -	struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
 | ||||
| -	struct brcmf_pciedev_info *devinfo = buspub->devinfo;
 | ||||
| -	int ret = 0;
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ext, fw_name },
 | ||||
| +	};
 | ||||
|   | ||||
| -	if (devinfo->fw_name[0] != '\0')
 | ||||
| -		strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| -	else
 | ||||
| -		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| -						brcmf_pcie_fwnames,
 | ||||
| -						ARRAY_SIZE(brcmf_pcie_fwnames),
 | ||||
| -						fw_name, NULL);
 | ||||
| +	fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
 | ||||
| +				       brcmf_pcie_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_pcie_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return -ENOMEM;
 | ||||
|   | ||||
| -	return ret;
 | ||||
| +	kfree(fwreq);
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|  static const struct brcmf_bus_ops brcmf_pcie_bus_ops = { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -4000,22 +4000,24 @@ brcmf_sdio_watchdog(unsigned long data)
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| -static int brcmf_sdio_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| -				 u8 *fw_name)
 | ||||
| +static
 | ||||
| +int brcmf_sdio_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
 | ||||
|  { | ||||
|  	struct brcmf_bus *bus_if = dev_get_drvdata(dev); | ||||
| -	struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
 | ||||
| -	int ret = 0;
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ext, fw_name },
 | ||||
| +	};
 | ||||
|   | ||||
| -	if (sdiodev->fw_name[0] != '\0')
 | ||||
| -		strlcpy(fw_name, sdiodev->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| -	else
 | ||||
| -		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| -						brcmf_sdio_fwnames,
 | ||||
| -						ARRAY_SIZE(brcmf_sdio_fwnames),
 | ||||
| -						fw_name, NULL);
 | ||||
| +	fwreq = brcmf_fw_alloc_request(bus_if->chip, bus_if->chiprev,
 | ||||
| +				       brcmf_sdio_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_sdio_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return -ENOMEM;
 | ||||
|   | ||||
| -	return ret;
 | ||||
| +	kfree(fwreq);
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|  static const struct brcmf_bus_ops brcmf_sdio_bus_ops = { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -1128,21 +1128,24 @@ static void brcmf_usb_wowl_config(struct
 | ||||
|  		device_set_wakeup_enable(devinfo->dev, false); | ||||
|  } | ||||
|   | ||||
| -static int brcmf_usb_get_fwname(struct device *dev, u32 chip, u32 chiprev,
 | ||||
| -				u8 *fw_name)
 | ||||
| +static
 | ||||
| +int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
 | ||||
|  { | ||||
| -	struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
 | ||||
| -	int ret = 0;
 | ||||
| +	struct brcmf_bus *bus = dev_get_drvdata(dev);
 | ||||
| +	struct brcmf_fw_request *fwreq;
 | ||||
| +	struct brcmf_fw_name fwnames[] = {
 | ||||
| +		{ ext, fw_name },
 | ||||
| +	};
 | ||||
|   | ||||
| -	if (devinfo->fw_name[0] != '\0')
 | ||||
| -		strlcpy(fw_name, devinfo->fw_name, BRCMF_FW_NAME_LEN);
 | ||||
| -	else
 | ||||
| -		ret = brcmf_fw_map_chip_to_name(chip, chiprev,
 | ||||
| -						brcmf_usb_fwnames,
 | ||||
| -						ARRAY_SIZE(brcmf_usb_fwnames),
 | ||||
| -						fw_name, NULL);
 | ||||
| +	fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev,
 | ||||
| +				       brcmf_usb_fwnames,
 | ||||
| +				       ARRAY_SIZE(brcmf_usb_fwnames),
 | ||||
| +				       fwnames, ARRAY_SIZE(fwnames));
 | ||||
| +	if (!fwreq)
 | ||||
| +		return -ENOMEM;
 | ||||
|   | ||||
| -	return ret;
 | ||||
| +	kfree(fwreq);
 | ||||
| +	return 0;
 | ||||
|  } | ||||
|   | ||||
|  static const struct brcmf_bus_ops brcmf_usb_bus_ops = { | ||||
| @ -1,92 +0,0 @@ | ||||
| From 18c2b20e276e04476a3350b4a92c1dfad725d45d Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:29 +0100 | ||||
| Subject: [PATCH] brcmfmac: get rid of brcmf_fw_map_chip_to_name() | ||||
| 
 | ||||
| The function is no longer used so removing it. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.c         | 53 ---------------------- | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.h         |  4 -- | ||||
|  2 files changed, 57 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -635,59 +635,6 @@ static void brcmf_fw_get_full_name(char
 | ||||
|  	strlcat(fw_name, extension, BRCMF_FW_NAME_LEN); | ||||
|  } | ||||
|   | ||||
| -int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
 | ||||
| -			      struct brcmf_firmware_mapping mapping_table[],
 | ||||
| -			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
 | ||||
| -			      char nvram_name[BRCMF_FW_NAME_LEN])
 | ||||
| -{
 | ||||
| -	char chipname[12];
 | ||||
| -	u32 i;
 | ||||
| -	char end;
 | ||||
| -
 | ||||
| -	for (i = 0; i < table_size; i++) {
 | ||||
| -		if (mapping_table[i].chipid == chip &&
 | ||||
| -		    mapping_table[i].revmask & BIT(chiprev))
 | ||||
| -			break;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	if (i == table_size) {
 | ||||
| -		brcmf_err("Unknown chipid %d [%d]\n", chip, chiprev);
 | ||||
| -		return -ENODEV;
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	brcmf_chip_name(chip, chiprev, chipname, sizeof(chipname));
 | ||||
| -
 | ||||
| -	/* check if firmware path is provided by module parameter */
 | ||||
| -	if (brcmf_mp_global.firmware_path[0] != '\0') {
 | ||||
| -		if (fw_name)
 | ||||
| -			strlcpy(fw_name, brcmf_mp_global.firmware_path,
 | ||||
| -				BRCMF_FW_NAME_LEN);
 | ||||
| -		if (nvram_name)
 | ||||
| -			strlcpy(nvram_name, brcmf_mp_global.firmware_path,
 | ||||
| -				BRCMF_FW_NAME_LEN);
 | ||||
| -
 | ||||
| -		end = brcmf_mp_global.firmware_path[
 | ||||
| -				strlen(brcmf_mp_global.firmware_path) - 1];
 | ||||
| -		if (end != '/') {
 | ||||
| -			if (fw_name)
 | ||||
| -				strlcat(fw_name, "/", BRCMF_FW_NAME_LEN);
 | ||||
| -			if (nvram_name)
 | ||||
| -				strlcat(nvram_name, "/", BRCMF_FW_NAME_LEN);
 | ||||
| -		}
 | ||||
| -	}
 | ||||
| -
 | ||||
| -	brcmf_info("using %s for chip %s\n",
 | ||||
| -		   mapping_table[i].fw_base, chipname);
 | ||||
| -	if (fw_name)
 | ||||
| -		brcmf_fw_get_full_name(fw_name,
 | ||||
| -				       mapping_table[i].fw_base, ".bin");
 | ||||
| -	if (nvram_name)
 | ||||
| -		brcmf_fw_get_full_name(nvram_name,
 | ||||
| -				       mapping_table[i].fw_base, ".txt");
 | ||||
| -
 | ||||
| -	return 0;
 | ||||
| -}
 | ||||
| -
 | ||||
|  struct brcmf_fw_request * | ||||
|  brcmf_fw_alloc_request(u32 chip, u32 chiprev, | ||||
|  		       struct brcmf_firmware_mapping mapping_table[], | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| @@ -46,10 +46,6 @@ MODULE_FIRMWARE(BRCMF_FW_DEFAULT_PATH fw
 | ||||
|  #define BRCMF_FW_ENTRY(chipid, mask, name) \ | ||||
|  	{ chipid, mask, BRCM_ ## name ## _FIRMWARE_BASENAME } | ||||
|   | ||||
| -int brcmf_fw_map_chip_to_name(u32 chip, u32 chiprev,
 | ||||
| -			      struct brcmf_firmware_mapping mapping_table[],
 | ||||
| -			      u32 table_size, char fw_name[BRCMF_FW_NAME_LEN],
 | ||||
| -			      char nvram_name[BRCMF_FW_NAME_LEN]);
 | ||||
|  void brcmf_fw_nvram_free(void *nvram); | ||||
|   | ||||
|  enum brcmf_fw_type { | ||||
| @ -1,44 +0,0 @@ | ||||
| From bf291b7247e53f52a4236c0b55a5df046d6177df Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:30 +0100 | ||||
| Subject: [PATCH] brcmfmac: get rid of brcmf_fw_get_full_name() | ||||
| 
 | ||||
| The function was pretty minimal and now it is called only from one | ||||
| place so just get rid of it. | ||||
| 
 | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../net/wireless/broadcom/brcm80211/brcmfmac/firmware.c    | 14 ++++---------- | ||||
|  1 file changed, 4 insertions(+), 10 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -628,13 +628,6 @@ int brcmf_fw_get_firmwares(struct device
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| -static void brcmf_fw_get_full_name(char fw_name[BRCMF_FW_NAME_LEN],
 | ||||
| -				   const char *fw_base, const char *extension)
 | ||||
| -{
 | ||||
| -	strlcat(fw_name, fw_base, BRCMF_FW_NAME_LEN);
 | ||||
| -	strlcat(fw_name, extension, BRCMF_FW_NAME_LEN);
 | ||||
| -}
 | ||||
| -
 | ||||
|  struct brcmf_fw_request * | ||||
|  brcmf_fw_alloc_request(u32 chip, u32 chiprev, | ||||
|  		       struct brcmf_firmware_mapping mapping_table[], | ||||
| @@ -685,9 +678,10 @@ brcmf_fw_alloc_request(u32 chip, u32 chi
 | ||||
|  					BRCMF_FW_NAME_LEN); | ||||
|  			} | ||||
|  		} | ||||
| -		brcmf_fw_get_full_name(fwnames[j].path,
 | ||||
| -				       mapping_table[i].fw_base,
 | ||||
| -				       fwnames[j].extension);
 | ||||
| +		strlcat(fwnames[j].path, mapping_table[i].fw_base,
 | ||||
| +			BRCMF_FW_NAME_LEN);
 | ||||
| +		strlcat(fwnames[j].path, fwnames[j].extension,
 | ||||
| +			BRCMF_FW_NAME_LEN);
 | ||||
|  		fwreq->items[j].path = fwnames[j].path; | ||||
|  	} | ||||
|   | ||||
| @ -1,23 +0,0 @@ | ||||
| From 48eaee3f272a5bfe6986d07c51f6975d3c2f74d1 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 22 Mar 2018 21:28:31 +0100 | ||||
| Subject: [PATCH] brcmfmac: add kerneldoc for struct brcmf_bus::msgbuf | ||||
| 
 | ||||
| This field did not have kerneldoc description so adding it now. | ||||
| 
 | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 1 + | ||||
|  1 file changed, 1 insertion(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
 | ||||
| @@ -140,6 +140,7 @@ struct brcmf_bus_stats {
 | ||||
|   * @always_use_fws_queue: bus wants use queue also when fwsignal is inactive. | ||||
|   * @wowl_supported: is wowl supported by bus driver. | ||||
|   * @chiprev: revision of the dongle chip. | ||||
| + * @msgbuf: msgbuf protocol parameters provided by bus layer.
 | ||||
|   */ | ||||
|  struct brcmf_bus { | ||||
|  	union { | ||||
| @ -1,81 +0,0 @@ | ||||
| From 0b5c0305e57ca940713bcb2b202fd2b412c62f31 Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Tue, 3 Apr 2018 10:18:15 +0200 | ||||
| Subject: [PATCH] brcmfmac: fix firmware request processing if nvram load fails | ||||
| 
 | ||||
| When nvram loading fails a double free occurred. Fix this and reorg the | ||||
| code a little. | ||||
| 
 | ||||
| Fixes: d09ae51a4b67 ("brcmfmac: pass struct in brcmf_fw_get_firmwares()") | ||||
| Reported-by: Dan Carpenter <dan.carpenter@oracle.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/firmware.c         | 36 ++++++++++++---------- | ||||
|  1 file changed, 20 insertions(+), 16 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -459,7 +459,7 @@ static void brcmf_fw_free_request(struct
 | ||||
|  	kfree(req); | ||||
|  } | ||||
|   | ||||
| -static void brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
 | ||||
| +static int brcmf_fw_request_nvram_done(const struct firmware *fw, void *ctx)
 | ||||
|  { | ||||
|  	struct brcmf_fw *fwctx = ctx; | ||||
|  	struct brcmf_fw_item *cur; | ||||
| @@ -498,13 +498,10 @@ static void brcmf_fw_request_nvram_done(
 | ||||
|  	brcmf_dbg(TRACE, "nvram %p len %d\n", nvram, nvram_length); | ||||
|  	cur->nv_data.data = nvram; | ||||
|  	cur->nv_data.len = nvram_length; | ||||
| -	return;
 | ||||
| +	return 0;
 | ||||
|   | ||||
|  fail: | ||||
| -	brcmf_dbg(TRACE, "failed: dev=%s\n", dev_name(fwctx->dev));
 | ||||
| -	fwctx->done(fwctx->dev, -ENOENT, NULL);
 | ||||
| -	brcmf_fw_free_request(fwctx->req);
 | ||||
| -	kfree(fwctx);
 | ||||
| +	return -ENOENT;
 | ||||
|  } | ||||
|   | ||||
|  static int brcmf_fw_request_next_item(struct brcmf_fw *fwctx, bool async) | ||||
| @@ -553,20 +550,27 @@ static void brcmf_fw_request_done(const
 | ||||
|  	brcmf_dbg(TRACE, "enter: firmware %s %sfound\n", cur->path, | ||||
|  		  fw ? "" : "not "); | ||||
|   | ||||
| -	if (fw) {
 | ||||
| -		if (cur->type == BRCMF_FW_TYPE_BINARY)
 | ||||
| -			cur->binary = fw;
 | ||||
| -		else if (cur->type == BRCMF_FW_TYPE_NVRAM)
 | ||||
| -			brcmf_fw_request_nvram_done(fw, fwctx);
 | ||||
| -		else
 | ||||
| -			release_firmware(fw);
 | ||||
| -	} else if (cur->type == BRCMF_FW_TYPE_NVRAM) {
 | ||||
| -		brcmf_fw_request_nvram_done(NULL, fwctx);
 | ||||
| -	} else if (!(cur->flags & BRCMF_FW_REQF_OPTIONAL)) {
 | ||||
| +	if (!fw)
 | ||||
|  		ret = -ENOENT; | ||||
| +
 | ||||
| +	switch (cur->type) {
 | ||||
| +	case BRCMF_FW_TYPE_NVRAM:
 | ||||
| +		ret = brcmf_fw_request_nvram_done(fw, fwctx);
 | ||||
| +		break;
 | ||||
| +	case BRCMF_FW_TYPE_BINARY:
 | ||||
| +		cur->binary = fw;
 | ||||
| +		break;
 | ||||
| +	default:
 | ||||
| +		/* something fishy here so bail out early */
 | ||||
| +		brcmf_err("unknown fw type: %d\n", cur->type);
 | ||||
| +		release_firmware(fw);
 | ||||
| +		ret = -EINVAL;
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| +	if (ret < 0 && !(cur->flags & BRCMF_FW_REQF_OPTIONAL))
 | ||||
| +		goto fail;
 | ||||
| +
 | ||||
|  	do { | ||||
|  		if (++fwctx->curpos == fwctx->req->n_items) { | ||||
|  			ret = 0; | ||||
| @ -1,48 +0,0 @@ | ||||
| From 1f589e2510d5df1192dca7c089103a2cbd028101 Mon Sep 17 00:00:00 2001 | ||||
| From: Dan Haab <dhaab@luxul.com> | ||||
| Date: Tue, 3 Apr 2018 10:21:56 +0200 | ||||
| Subject: [PATCH] brcmfmac: add support for BCM4366E chipset | ||||
| 
 | ||||
| BCM4366E is a wireless chipset with a BCM43664 ChipCommon. It's | ||||
| supported by the same firmware as 4366c0. | ||||
| 
 | ||||
| Signed-off-by: Dan Haab <dan.haab@luxul.com> | ||||
| [arend: rebase patch and remove unnecessary definition] | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c       | 1 + | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c       | 1 + | ||||
|  drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h | 1 + | ||||
|  3 files changed, 3 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/chip.c
 | ||||
| @@ -689,6 +689,7 @@ static u32 brcmf_chip_tcm_rambase(struct
 | ||||
|  	case BRCM_CC_43525_CHIP_ID: | ||||
|  	case BRCM_CC_4365_CHIP_ID: | ||||
|  	case BRCM_CC_4366_CHIP_ID: | ||||
| +	case BRCM_CC_43664_CHIP_ID:
 | ||||
|  		return 0x200000; | ||||
|  	case CY_CC_4373_CHIP_ID: | ||||
|  		return 0x160000; | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -75,6 +75,7 @@ static struct brcmf_firmware_mapping brc
 | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0xFFFFFFF0, 4366C), | ||||
| +	BRCMF_FW_ENTRY(BRCM_CC_43664_CHIP_ID, 0xFFFFFFF0, 4366C),
 | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371), | ||||
|  }; | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/include/brcm_hw_ids.h
 | ||||
| @@ -57,6 +57,7 @@
 | ||||
|  #define BRCM_CC_43602_CHIP_ID		43602 | ||||
|  #define BRCM_CC_4365_CHIP_ID		0x4365 | ||||
|  #define BRCM_CC_4366_CHIP_ID		0x4366 | ||||
| +#define BRCM_CC_43664_CHIP_ID		43664
 | ||||
|  #define BRCM_CC_4371_CHIP_ID		0x4371 | ||||
|  #define CY_CC_4373_CHIP_ID		0x4373 | ||||
|   | ||||
| @ -1,34 +0,0 @@ | ||||
| From cb746e47837ad0f35c8ae28e9aacc8eb07916d2a Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 26 Apr 2018 12:16:47 +0200 | ||||
| Subject: [PATCH] brcmfmac: check p2pdev mac address uniqueness | ||||
| 
 | ||||
| The mac address for p2pdev must be different from the primary interface | ||||
| due to firmware requirement. Add an explicit check for this requirement | ||||
| if user-space provides a mac address. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c | 7 +++++++ | ||||
|  1 file changed, 7 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c
 | ||||
| @@ -2073,6 +2073,13 @@ static struct wireless_dev *brcmf_p2p_cr
 | ||||
|  	} | ||||
|   | ||||
|  	pri_ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; | ||||
| +
 | ||||
| +	/* firmware requires unique mac address for p2pdev interface */
 | ||||
| +	if (addr && ether_addr_equal(addr, pri_ifp->mac_addr)) {
 | ||||
| +		brcmf_err("discovery vif must be different from primary interface\n");
 | ||||
| +		return ERR_PTR(-EINVAL);
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	brcmf_p2p_generate_bss_mac(p2p, addr); | ||||
|  	brcmf_p2p_set_firmware(pri_ifp, p2p->dev_addr); | ||||
|   | ||||
| @ -1,76 +0,0 @@ | ||||
| From 7742fce4c007141617dab9bcb90034b3c0fe2347 Mon Sep 17 00:00:00 2001 | ||||
| From: Franky Lin <franky.lin@broadcom.com> | ||||
| Date: Thu, 26 Apr 2018 12:18:35 +0200 | ||||
| Subject: [PATCH] brcmfmac: reports boottime_ns while informing bss | ||||
| 
 | ||||
| Provides a timestamp in bss information so user space can see when the | ||||
| bss info was updated. Since tsf is not available from the dongle events | ||||
| boottime is reported instead. | ||||
| 
 | ||||
| Reported-by: Dmitry Shmidt <dimitrysh@google.com> | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  .../broadcom/brcm80211/brcmfmac/cfg80211.c         | 26 +++++++++++----------- | ||||
|  1 file changed, 13 insertions(+), 13 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -2728,7 +2728,6 @@ static s32 brcmf_inform_single_bss(struc
 | ||||
|  				   struct brcmf_bss_info_le *bi) | ||||
|  { | ||||
|  	struct wiphy *wiphy = cfg_to_wiphy(cfg); | ||||
| -	struct ieee80211_channel *notify_channel;
 | ||||
|  	struct cfg80211_bss *bss; | ||||
|  	struct ieee80211_supported_band *band; | ||||
|  	struct brcmu_chan ch; | ||||
| @@ -2738,7 +2737,7 @@ static s32 brcmf_inform_single_bss(struc
 | ||||
|  	u16 notify_interval; | ||||
|  	u8 *notify_ie; | ||||
|  	size_t notify_ielen; | ||||
| -	s32 notify_signal;
 | ||||
| +	struct cfg80211_inform_bss bss_data = { 0 };
 | ||||
|   | ||||
|  	if (le32_to_cpu(bi->length) > WL_BSS_INFO_MAX) { | ||||
|  		brcmf_err("Bss info is larger than buffer. Discarding\n"); | ||||
| @@ -2758,27 +2757,28 @@ static s32 brcmf_inform_single_bss(struc
 | ||||
|  		band = wiphy->bands[NL80211_BAND_5GHZ]; | ||||
|   | ||||
|  	freq = ieee80211_channel_to_frequency(channel, band->band); | ||||
| -	notify_channel = ieee80211_get_channel(wiphy, freq);
 | ||||
| +	bss_data.chan = ieee80211_get_channel(wiphy, freq);
 | ||||
| +	bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20;
 | ||||
| +	bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime());
 | ||||
|   | ||||
|  	notify_capability = le16_to_cpu(bi->capability); | ||||
|  	notify_interval = le16_to_cpu(bi->beacon_period); | ||||
|  	notify_ie = (u8 *)bi + le16_to_cpu(bi->ie_offset); | ||||
|  	notify_ielen = le32_to_cpu(bi->ie_length); | ||||
| -	notify_signal = (s16)le16_to_cpu(bi->RSSI) * 100;
 | ||||
| +	bss_data.signal = (s16)le16_to_cpu(bi->RSSI) * 100;
 | ||||
|   | ||||
|  	brcmf_dbg(CONN, "bssid: %pM\n", bi->BSSID); | ||||
|  	brcmf_dbg(CONN, "Channel: %d(%d)\n", channel, freq); | ||||
|  	brcmf_dbg(CONN, "Capability: %X\n", notify_capability); | ||||
|  	brcmf_dbg(CONN, "Beacon interval: %d\n", notify_interval); | ||||
| -	brcmf_dbg(CONN, "Signal: %d\n", notify_signal);
 | ||||
| +	brcmf_dbg(CONN, "Signal: %d\n", bss_data.signal);
 | ||||
|   | ||||
| -	bss = cfg80211_inform_bss(wiphy, notify_channel,
 | ||||
| -				  CFG80211_BSS_FTYPE_UNKNOWN,
 | ||||
| -				  (const u8 *)bi->BSSID,
 | ||||
| -				  0, notify_capability,
 | ||||
| -				  notify_interval, notify_ie,
 | ||||
| -				  notify_ielen, notify_signal,
 | ||||
| -				  GFP_KERNEL);
 | ||||
| +	bss = cfg80211_inform_bss_data(wiphy, &bss_data,
 | ||||
| +				       CFG80211_BSS_FTYPE_UNKNOWN,
 | ||||
| +				       (const u8 *)bi->BSSID,
 | ||||
| +				       0, notify_capability,
 | ||||
| +				       notify_interval, notify_ie,
 | ||||
| +				       notify_ielen, GFP_KERNEL);
 | ||||
|   | ||||
|  	if (!bss) | ||||
|  		return -ENOMEM; | ||||
| @ -1,43 +0,0 @@ | ||||
| From aed14219067ab96e5eeb7730e9bceed10d9be989 Mon Sep 17 00:00:00 2001 | ||||
| From: Franky Lin <franky.lin@broadcom.com> | ||||
| Date: Thu, 26 Apr 2018 12:16:48 +0200 | ||||
| Subject: [PATCH] brcmfmac: use nl80211_band directly to get ieee80211 channel | ||||
| 
 | ||||
| The enum nl80211_band used to retrieve wiphy->bands is the same as | ||||
| wiphy->bands->band which is checked by wiphy_register(). So it can be used | ||||
| directly as parameter of ieee80211_channel_to_frequency(). | ||||
| 
 | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 8 ++++---- | ||||
|  1 file changed, 4 insertions(+), 4 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
 | ||||
| @@ -2729,7 +2729,7 @@ static s32 brcmf_inform_single_bss(struc
 | ||||
|  { | ||||
|  	struct wiphy *wiphy = cfg_to_wiphy(cfg); | ||||
|  	struct cfg80211_bss *bss; | ||||
| -	struct ieee80211_supported_band *band;
 | ||||
| +	enum nl80211_band band;
 | ||||
|  	struct brcmu_chan ch; | ||||
|  	u16 channel; | ||||
|  	u32 freq; | ||||
| @@ -2752,11 +2752,11 @@ static s32 brcmf_inform_single_bss(struc
 | ||||
|  	channel = bi->ctl_ch; | ||||
|   | ||||
|  	if (channel <= CH_MAX_2G_CHANNEL) | ||||
| -		band = wiphy->bands[NL80211_BAND_2GHZ];
 | ||||
| +		band = NL80211_BAND_2GHZ;
 | ||||
|  	else | ||||
| -		band = wiphy->bands[NL80211_BAND_5GHZ];
 | ||||
| +		band = NL80211_BAND_5GHZ;
 | ||||
|   | ||||
| -	freq = ieee80211_channel_to_frequency(channel, band->band);
 | ||||
| +	freq = ieee80211_channel_to_frequency(channel, band);
 | ||||
|  	bss_data.chan = ieee80211_get_channel(wiphy, freq); | ||||
|  	bss_data.scan_width = NL80211_BSS_CHAN_WIDTH_20; | ||||
|  	bss_data.boottime_ns = ktime_to_ns(ktime_get_boottime()); | ||||
| @ -1,76 +0,0 @@ | ||||
| From ff68c9f9c06d1fd437c8f90fc05ca28c47f7d85e Mon Sep 17 00:00:00 2001 | ||||
| From: Arend Van Spriel <arend.vanspriel@broadcom.com> | ||||
| Date: Thu, 26 Apr 2018 12:16:49 +0200 | ||||
| Subject: [PATCH] brcmfmac: constify firmware mapping tables | ||||
| 
 | ||||
| The information in the firmware mapping does not need to be modified | ||||
| so it can be static const. | ||||
| 
 | ||||
| Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> | ||||
| Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> | ||||
| Reviewed-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c | 2 +- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h | 2 +- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c     | 2 +- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c     | 2 +- | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c      | 2 +- | ||||
|  5 files changed, 5 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
 | ||||
| @@ -634,7 +634,7 @@ int brcmf_fw_get_firmwares(struct device
 | ||||
|   | ||||
|  struct brcmf_fw_request * | ||||
|  brcmf_fw_alloc_request(u32 chip, u32 chiprev, | ||||
| -		       struct brcmf_firmware_mapping mapping_table[],
 | ||||
| +		       const struct brcmf_firmware_mapping mapping_table[],
 | ||||
|  		       u32 table_size, struct brcmf_fw_name *fwnames, | ||||
|  		       u32 n_fwnames) | ||||
|  { | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.h
 | ||||
| @@ -80,7 +80,7 @@ struct brcmf_fw_name {
 | ||||
|   | ||||
|  struct brcmf_fw_request * | ||||
|  brcmf_fw_alloc_request(u32 chip, u32 chiprev, | ||||
| -		       struct brcmf_firmware_mapping mapping_table[],
 | ||||
| +		       const struct brcmf_firmware_mapping mapping_table[],
 | ||||
|  		       u32 table_size, struct brcmf_fw_name *fwnames, | ||||
|  		       u32 n_fwnames); | ||||
|   | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -59,7 +59,7 @@ BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie"
 | ||||
|  BRCMF_FW_DEF(4366C, "brcmfmac4366c-pcie"); | ||||
|  BRCMF_FW_DEF(4371, "brcmfmac4371-pcie"); | ||||
|   | ||||
| -static struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
 | ||||
| +static const struct brcmf_firmware_mapping brcmf_pcie_fwnames[] = {
 | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43602_CHIP_ID, 0xFFFFFFFF, 43602), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43465_CHIP_ID, 0xFFFFFFF0, 4366C), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_4350_CHIP_ID, 0x000000FF, 4350C), | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
 | ||||
| @@ -619,7 +619,7 @@ BRCMF_FW_DEF(4354, "brcmfmac4354-sdio");
 | ||||
|  BRCMF_FW_DEF(4356, "brcmfmac4356-sdio"); | ||||
|  BRCMF_FW_DEF(4373, "brcmfmac4373-sdio"); | ||||
|   | ||||
| -static struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
 | ||||
| +static const struct brcmf_firmware_mapping brcmf_sdio_fwnames[] = {
 | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x0000001F, 43241B0), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43241_CHIP_ID, 0x00000020, 43241B4), | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
 | ||||
| @@ -52,7 +52,7 @@ BRCMF_FW_DEF(43242A, "brcmfmac43242a");
 | ||||
|  BRCMF_FW_DEF(43569, "brcmfmac43569"); | ||||
|  BRCMF_FW_DEF(4373, "brcmfmac4373"); | ||||
|   | ||||
| -static struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
 | ||||
| +static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
 | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B), | ||||
|  	BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B), | ||||
| @ -1,74 +0,0 @@ | ||||
| From 84ad327d18debe19b8d509059b61db445d048b02 Mon Sep 17 00:00:00 2001 | ||||
| From: Franky Lin <franky.lin@broadcom.com> | ||||
| Date: Thu, 26 Apr 2018 12:16:50 +0200 | ||||
| Subject: [PATCH] brcmfmac: add hostready indication | ||||
| 
 | ||||
| A hostready signal is introduced to inform firmware through mailbox | ||||
| doorbell1 when common ring initialized or D3 exited. | ||||
| 
 | ||||
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Franky Lin <franky.lin@broadcom.com> | ||||
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> | ||||
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org> | ||||
| ---
 | ||||
|  drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c | 14 ++++++++++++-- | ||||
|  1 file changed, 12 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
 | ||||
| @@ -105,7 +105,8 @@ static const struct brcmf_firmware_mappi
 | ||||
|  #define BRCMF_PCIE_PCIE2REG_MAILBOXMASK		0x4C | ||||
|  #define BRCMF_PCIE_PCIE2REG_CONFIGADDR		0x120 | ||||
|  #define BRCMF_PCIE_PCIE2REG_CONFIGDATA		0x124 | ||||
| -#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX		0x140
 | ||||
| +#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0	0x140
 | ||||
| +#define BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1	0x144
 | ||||
|   | ||||
|  #define BRCMF_PCIE2_INTA			0x01 | ||||
|  #define BRCMF_PCIE2_INTB			0x02 | ||||
| @@ -140,6 +141,7 @@ static const struct brcmf_firmware_mappi
 | ||||
|  #define BRCMF_PCIE_SHARED_VERSION_MASK		0x00FF | ||||
|  #define BRCMF_PCIE_SHARED_DMA_INDEX		0x10000 | ||||
|  #define BRCMF_PCIE_SHARED_DMA_2B_IDX		0x100000 | ||||
| +#define BRCMF_PCIE_SHARED_HOSTRDY_DB1		0x10000000
 | ||||
|   | ||||
|  #define BRCMF_PCIE_FLAGS_HTOD_SPLIT		0x4000 | ||||
|  #define BRCMF_PCIE_FLAGS_DTOH_SPLIT		0x8000 | ||||
| @@ -782,6 +784,12 @@ static void brcmf_pcie_intr_enable(struc
 | ||||
|  			       BRCMF_PCIE_MB_INT_FN0_1); | ||||
|  } | ||||
|   | ||||
| +static void brcmf_pcie_hostready(struct brcmf_pciedev_info *devinfo)
 | ||||
| +{
 | ||||
| +	if (devinfo->shared.flags & BRCMF_PCIE_SHARED_HOSTRDY_DB1)
 | ||||
| +		brcmf_pcie_write_reg32(devinfo,
 | ||||
| +				       BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_1, 1);
 | ||||
| +}
 | ||||
|   | ||||
|  static irqreturn_t brcmf_pcie_quick_check_isr(int irq, void *arg) | ||||
|  { | ||||
| @@ -924,7 +932,7 @@ static int brcmf_pcie_ring_mb_ring_bell(
 | ||||
|   | ||||
|  	brcmf_dbg(PCIE, "RING !\n"); | ||||
|  	/* Any arbitrary value will do, lets use 1 */ | ||||
| -	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX, 1);
 | ||||
| +	brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_H2D_MAILBOX_0, 1);
 | ||||
|   | ||||
|  	return 0; | ||||
|  } | ||||
| @@ -1728,6 +1736,7 @@ static void brcmf_pcie_setup(struct devi
 | ||||
|  	init_waitqueue_head(&devinfo->mbdata_resp_wait); | ||||
|   | ||||
|  	brcmf_pcie_intr_enable(devinfo); | ||||
| +	brcmf_pcie_hostready(devinfo);
 | ||||
|  	if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0) | ||||
|  		return; | ||||
|   | ||||
| @@ -1950,6 +1959,7 @@ static int brcmf_pcie_pm_leave_D3(struct
 | ||||
|  		brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2); | ||||
|  		brcmf_bus_change_state(bus, BRCMF_BUS_UP); | ||||
|  		brcmf_pcie_intr_enable(devinfo); | ||||
| +		brcmf_pcie_hostready(devinfo);
 | ||||
|  		return 0; | ||||
|  	} | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user