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++;
|