diff mbox

brcmfmac: support NVRAMs containing pci devpaths (instead of pcie)

Message ID 1432815561-6639-1-git-send-email-zajec5@gmail.com (mailing list archive)
State Accepted
Delegated to: Kalle Valo
Headers show

Commit Message

Rafał Miłecki May 28, 2015, 12:19 p.m. UTC
Recently Broadcom added support for NVRAMs with entries for multiple
PCIe devices. One of the supported formats is based on prefixes defined
like: devpath0=pcie/1/4/ and entries like 0:foo=bar 0:baz=qux etc.

Unfortunately there are also a bit older devices using different way of
defining prefixes, e.g. SmartRG SR400ac (2 x BCM43602) with entries:
devpath0=pci/1/1/
devpath1=pci/2/1
Broadcom stated this old format will never be used/supported by brcmfmac
but given the simplicity of this patch I'll insist on supporting it.

Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>
---
 drivers/net/wireless/brcm80211/brcmfmac/firmware.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Arend van Spriel June 1, 2015, 11:59 a.m. UTC | #1
On 05/28/15 14:19, Rafa? Mi?ecki wrote:
> Recently Broadcom added support for NVRAMs with entries for multiple
> PCIe devices. One of the supported formats is based on prefixes defined
> like: devpath0=pcie/1/4/ and entries like 0:foo=bar 0:baz=qux etc.
>
> Unfortunately there are also a bit older devices using different way of
> defining prefixes, e.g. SmartRG SR400ac (2 x BCM43602) with entries:
> devpath0=pci/1/1/
> devpath1=pci/2/1
> Broadcom stated this old format will never be used/supported by brcmfmac
> but given the simplicity of this patch I'll insist on supporting it.

Well, if you insist :-p

Acked-by: Arend van Spriel <arend@broadcom.com>
> Signed-off-by: Rafa? Mi?ecki<zajec5@gmail.com>
> ---
>   drivers/net/wireless/brcm80211/brcmfmac/firmware.c | 10 ++++++++--
>   1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
> index b72df87..743f16b 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
> @@ -232,6 +232,8 @@ 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 pci_path[] = "=pci/?/?";
> +	size_t pci_len;
>   	char pcie_path[] = "=pcie/?/?";
>   	size_t pcie_len;
>
> @@ -251,6 +253,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(pci_path, sizeof(pci_path), "=pci/%d/%d", domain_nr,
> +		 bus_nr);
> +	pci_len = strlen(pci_path);
>   	snprintf(pcie_path, sizeof(pcie_path), "=pcie/%d/%d", domain_nr,
>   		 bus_nr);
>   	pcie_len = strlen(pcie_path);
> @@ -260,8 +265,9 @@ static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
>   		/* Format: devpathX=pcie/Y/Z/
>   		 * Y = domain_nr, Z = bus_nr, X = virtual ID
>   		 */
> -		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0)&&
> -		    (strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len) == 0)) {
> +		if (strncmp(&nvp->nvram[i], "devpath", 7) == 0&&
> +		    (!strncmp(&nvp->nvram[i + 8], pci_path, pci_len) ||
> +		     !strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len))) {
>   			id = nvp->nvram[i + 7] - '0';
>   			found = true;
>   			break;

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Rafał Miłecki June 1, 2015, 12:32 p.m. UTC | #2
On 1 June 2015 at 13:59, Arend van Spriel <arend@broadcom.com> wrote:
> On 05/28/15 14:19, Rafa? Mi?ecki wrote:
>>
>> Recently Broadcom added support for NVRAMs with entries for multiple
>> PCIe devices. One of the supported formats is based on prefixes defined
>> like: devpath0=pcie/1/4/ and entries like 0:foo=bar 0:baz=qux etc.
>>
>> Unfortunately there are also a bit older devices using different way of
>> defining prefixes, e.g. SmartRG SR400ac (2 x BCM43602) with entries:
>> devpath0=pci/1/1/
>> devpath1=pci/2/1
>> Broadcom stated this old format will never be used/supported by brcmfmac
>> but given the simplicity of this patch I'll insist on supporting it.
>
>
> Well, if you insist :-p
>
> Acked-by: Arend van Spriel <arend@broadcom.com>

Haha, thanks :) This will make SR400ac my primary home router for
sure. A great piece of hardware :)
Kalle Valo June 8, 2015, 11:26 a.m. UTC | #3
Rafa? Mi?ecki <zajec5@gmail.com> writes:

> Recently Broadcom added support for NVRAMs with entries for multiple
> PCIe devices. One of the supported formats is based on prefixes defined
> like: devpath0=pcie/1/4/ and entries like 0:foo=bar 0:baz=qux etc.
>
> Unfortunately there are also a bit older devices using different way of
> defining prefixes, e.g. SmartRG SR400ac (2 x BCM43602) with entries:
> devpath0=pci/1/1/
> devpath1=pci/2/1
> Broadcom stated this old format will never be used/supported by brcmfmac
> but given the simplicity of this patch I'll insist on supporting it.
>
> Signed-off-by: Rafa? Mi?ecki <zajec5@gmail.com>

Thanks, applied manually.
diff mbox

Patch

diff --git a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
index b72df87..743f16b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
@@ -232,6 +232,8 @@  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 pci_path[] = "=pci/?/?";
+	size_t pci_len;
 	char pcie_path[] = "=pcie/?/?";
 	size_t pcie_len;
 
@@ -251,6 +253,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(pci_path, sizeof(pci_path), "=pci/%d/%d", domain_nr,
+		 bus_nr);
+	pci_len = strlen(pci_path);
 	snprintf(pcie_path, sizeof(pcie_path), "=pcie/%d/%d", domain_nr,
 		 bus_nr);
 	pcie_len = strlen(pcie_path);
@@ -260,8 +265,9 @@  static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
 		/* Format: devpathX=pcie/Y/Z/
 		 * Y = domain_nr, Z = bus_nr, X = virtual ID
 		 */
-		if ((strncmp(&nvp->nvram[i], "devpath", 7) == 0) &&
-		    (strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len) == 0)) {
+		if (strncmp(&nvp->nvram[i], "devpath", 7) == 0 &&
+		    (!strncmp(&nvp->nvram[i + 8], pci_path, pci_len) ||
+		     !strncmp(&nvp->nvram[i + 8], pcie_path, pcie_len))) {
 			id = nvp->nvram[i + 7] - '0';
 			found = true;
 			break;