brcmfmac: simplify check finding NVRAM v1 device path
authorRafał Miłecki <zajec5@gmail.com>
Wed, 20 May 2015 09:01:08 +0000 (11:01 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 28 May 2015 08:49:44 +0000 (11:49 +0300)
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>
drivers/net/wireless/brcm80211/brcmfmac/firmware.c

index 181a0e84858228ced2c74672b1465de2daf359b4..a1e1253a06c858d693137ab0ae7f96979f433476 100644 (file)
@@ -222,6 +222,10 @@ static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
 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(struct nvram_parser *nvp, u16 domain_nr,
        /* 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(struct nvram_parser *nvp, u16 domain_nr,
                 * 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++;