 c1cc2217c2
			
		
	
	c1cc2217c2
	
	
	
		
			
			This fixes various problems with parsing platform NVRAM. It's required to get BCM43602 working in most cases. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 45802
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
 | |
| Date: Wed, 20 May 2015 11:01:08 +0200
 | |
| Subject: [PATCH] brcmfmac: simplify check finding NVRAM v1 device path
 | |
| MIME-Version: 1.0
 | |
| Content-Type: text/plain; charset=UTF-8
 | |
| Content-Transfer-Encoding: 8bit
 | |
| 
 | |
| With a simple use of snprintf and small buffer we can compare NVRAM
 | |
| entry value with a full string. This way we avoid checking random chars
 | |
| at magic offsets.
 | |
| Tested on BCM43602 with NVRAM hacked to use v1 format.
 | |
| 
 | |
| Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
 | |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | |
| ---
 | |
| 
 | |
| --- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
 | |
| +++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
 | |
| @@ -222,6 +222,10 @@ static int brcmf_init_nvram_parser(struc
 | |
|  static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
 | |
|  				    u16 bus_nr)
 | |
|  {
 | |
| +	/* Device path with a leading '=' key-value separator */
 | |
| +	char pcie_path[] = "=pcie/?/?";
 | |
| +	size_t pcie_len;
 | |
| +
 | |
|  	u32 i, j;
 | |
|  	bool found;
 | |
|  	u8 *nvram;
 | |
| @@ -238,6 +242,9 @@ static void brcmf_fw_strip_multi_v1(stru
 | |
|  	/* First search for the devpathX and see if it is the configuration
 | |
|  	 * for domain_nr/bus_nr. Search complete nvp
 | |
|  	 */
 | |
| +	snprintf(pcie_path, sizeof(pcie_path), "=pcie/%d/%d", domain_nr,
 | |
| +		 bus_nr);
 | |
| +	pcie_len = strlen(pcie_path);
 | |
|  	found = false;
 | |
|  	i = 0;
 | |
|  	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_DEVPATH_LEN) {
 | |
| @@ -245,13 +252,10 @@ static void brcmf_fw_strip_multi_v1(stru
 | |
|  		 * Y = domain_nr, Z = bus_nr, X = virtual ID
 | |
|  		 */
 | |
|  		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0) &&
 | |
| -		    (strncmp(&nvp->nvram[i + 8], "=pcie/", 6) == 0)) {
 | |
| -			if (((nvp->nvram[i + 14] - '0') == domain_nr) &&
 | |
| -			    ((nvp->nvram[i + 16] - '0') == bus_nr)) {
 | |
| -				id = nvp->nvram[i + 7] - '0';
 | |
| -				found = true;
 | |
| -				break;
 | |
| -			}
 | |
| +		    (strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len) == 0)) {
 | |
| +			id = nvp->nvram[i + 7] - '0';
 | |
| +			found = true;
 | |
| +			break;
 | |
|  		}
 | |
|  		while (nvp->nvram[i] != 0)
 | |
|  			i++;
 |