Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae8c2366 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by Kalle Valo
Browse files

brcmfmac: simplify check stripping v2 NVRAM



Comparing NVRAM entry with a full filtering string is simpler than
comparing it with a short prefix and then checking random chars at magic
offsets. The cost of snprintf relatively low, we execute it just once.
Tested on BCM43602 with NVRAM hacked to use V2 format.

Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent c869f77d
Loading
Loading
Loading
Loading
+8 −7
Original line number Original line Diff line number Diff line
@@ -25,7 +25,7 @@


#define BRCMF_FW_MAX_NVRAM_SIZE			64000
#define BRCMF_FW_MAX_NVRAM_SIZE			64000
#define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
#define BRCMF_FW_NVRAM_DEVPATH_LEN		19	/* devpath0=pcie/1/4/ */
#define BRCMF_FW_NVRAM_PCIEDEV_LEN		9	/* pcie/1/4/ */
#define BRCMF_FW_NVRAM_PCIEDEV_LEN		10	/* pcie/1/4/ + \0 */


char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
char brcmf_firmware_path[BRCMF_FW_PATH_LEN];
module_param_string(firmware_path, brcmf_firmware_path,
module_param_string(firmware_path, brcmf_firmware_path,
@@ -297,6 +297,8 @@ static void brcmf_fw_strip_multi_v1(struct nvram_parser *nvp, u16 domain_nr,
static void brcmf_fw_strip_multi_v2(struct nvram_parser *nvp, u16 domain_nr,
static void brcmf_fw_strip_multi_v2(struct nvram_parser *nvp, u16 domain_nr,
				    u16 bus_nr)
				    u16 bus_nr)
{
{
	char prefix[BRCMF_FW_NVRAM_PCIEDEV_LEN];
	size_t len;
	u32 i, j;
	u32 i, j;
	u8 *nvram;
	u8 *nvram;


@@ -308,14 +310,13 @@ static void brcmf_fw_strip_multi_v2(struct nvram_parser *nvp, u16 domain_nr,
	 * Valid entries are of type pcie/X/Y/ where X = domain_nr and
	 * Valid entries are of type pcie/X/Y/ where X = domain_nr and
	 * Y = bus_nr.
	 * Y = bus_nr.
	 */
	 */
	snprintf(prefix, sizeof(prefix), "pcie/%d/%d/", domain_nr, bus_nr);
	len = strlen(prefix);
	i = 0;
	i = 0;
	j = 0;
	j = 0;
	while (i < nvp->nvram_len - BRCMF_FW_NVRAM_PCIEDEV_LEN) {
	while (i < nvp->nvram_len - len) {
		if ((strncmp(&nvp->nvram[i], "pcie/", 5) == 0) &&
		if (strncmp(&nvp->nvram[i], prefix, len) == 0) {
		    (nvp->nvram[i + 6] == '/') && (nvp->nvram[i + 8] == '/') &&
			i += len;
		    ((nvp->nvram[i + 5] - '0') == domain_nr) &&
		    ((nvp->nvram[i + 7] - '0') == bus_nr)) {
			i += BRCMF_FW_NVRAM_PCIEDEV_LEN;
			while (nvp->nvram[i] != 0) {
			while (nvp->nvram[i] != 0) {
				nvram[j] = nvp->nvram[i];
				nvram[j] = nvp->nvram[i];
				i++;
				i++;