mac80211: backport today's brcmfmac changes
[openwrt/staging/chunkeey.git] / package / kernel / mac80211 / patches / 382-brcmfmac-use-direct-data-pointer-in-NVRAM-parser-str.patch
1 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
2 Date: Thu, 4 Jun 2015 22:11:07 +0200
3 Subject: [PATCH] brcmfmac: use direct data pointer in NVRAM parser struct
4 MIME-Version: 1.0
5 Content-Type: text/plain; charset=UTF-8
6 Content-Transfer-Encoding: 8bit
7
8 As we plan to add support for platform NVRAM we should store direct
9 data pointer without the extra struct firmware layer. This will allow
10 us to support other sources with the only requirement being u8 buffer.
11
12 Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
13 Acked-by: Arend van Spriel <arend@broadcom.com>
14 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
15 ---
16
17 --- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
18 +++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
19 @@ -43,7 +43,7 @@ enum nvram_parser_state {
20 * struct nvram_parser - internal info for parser.
21 *
22 * @state: current parser state.
23 - * @fwnv: input buffer being parsed.
24 + * @data: input buffer being parsed.
25 * @nvram: output buffer with parse result.
26 * @nvram_len: lenght of parse result.
27 * @line: current line.
28 @@ -55,7 +55,7 @@ enum nvram_parser_state {
29 */
30 struct nvram_parser {
31 enum nvram_parser_state state;
32 - const struct firmware *fwnv;
33 + const u8 *data;
34 u8 *nvram;
35 u32 nvram_len;
36 u32 line;
37 @@ -91,7 +91,7 @@ static enum nvram_parser_state brcmf_nvr
38 {
39 char c;
40
41 - c = nvp->fwnv->data[nvp->pos];
42 + c = nvp->data[nvp->pos];
43 if (c == '\n')
44 return COMMENT;
45 if (is_whitespace(c))
46 @@ -115,16 +115,16 @@ static enum nvram_parser_state brcmf_nvr
47 enum nvram_parser_state st = nvp->state;
48 char c;
49
50 - c = nvp->fwnv->data[nvp->pos];
51 + c = nvp->data[nvp->pos];
52 if (c == '=') {
53 /* ignore RAW1 by treating as comment */
54 - if (strncmp(&nvp->fwnv->data[nvp->entry], "RAW1", 4) == 0)
55 + if (strncmp(&nvp->data[nvp->entry], "RAW1", 4) == 0)
56 st = COMMENT;
57 else
58 st = VALUE;
59 - if (strncmp(&nvp->fwnv->data[nvp->entry], "devpath", 7) == 0)
60 + if (strncmp(&nvp->data[nvp->entry], "devpath", 7) == 0)
61 nvp->multi_dev_v1 = true;
62 - if (strncmp(&nvp->fwnv->data[nvp->entry], "pcie/", 5) == 0)
63 + if (strncmp(&nvp->data[nvp->entry], "pcie/", 5) == 0)
64 nvp->multi_dev_v2 = true;
65 } else if (!is_nvram_char(c) || c == ' ') {
66 brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
67 @@ -145,11 +145,11 @@ brcmf_nvram_handle_value(struct nvram_pa
68 char *ekv;
69 u32 cplen;
70
71 - c = nvp->fwnv->data[nvp->pos];
72 + c = nvp->data[nvp->pos];
73 if (!is_nvram_char(c)) {
74 /* key,value pair complete */
75 - ekv = (u8 *)&nvp->fwnv->data[nvp->pos];
76 - skv = (u8 *)&nvp->fwnv->data[nvp->entry];
77 + ekv = (u8 *)&nvp->data[nvp->pos];
78 + skv = (u8 *)&nvp->data[nvp->entry];
79 cplen = ekv - skv;
80 if (nvp->nvram_len + cplen + 1 >= BRCMF_FW_MAX_NVRAM_SIZE)
81 return END;
82 @@ -170,7 +170,7 @@ brcmf_nvram_handle_comment(struct nvram_
83 {
84 char *eoc, *sol;
85
86 - sol = (char *)&nvp->fwnv->data[nvp->pos];
87 + sol = (char *)&nvp->data[nvp->pos];
88 eoc = strchr(sol, '\n');
89 if (!eoc) {
90 eoc = strchr(sol, '\0');
91 @@ -201,17 +201,17 @@ static enum nvram_parser_state
92 };
93
94 static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
95 - const struct firmware *nv)
96 + const u8 *data, size_t data_len)
97 {
98 size_t size;
99
100 memset(nvp, 0, sizeof(*nvp));
101 - nvp->fwnv = nv;
102 + nvp->data = data;
103 /* Limit size to MAX_NVRAM_SIZE, some files contain lot of comment */
104 - if (nv->size > BRCMF_FW_MAX_NVRAM_SIZE)
105 + if (data_len > BRCMF_FW_MAX_NVRAM_SIZE)
106 size = BRCMF_FW_MAX_NVRAM_SIZE;
107 else
108 - size = nv->size;
109 + size = data_len;
110 /* Alloc for extra 0 byte + roundup by 4 + length field */
111 size += 1 + 3 + sizeof(u32);
112 nvp->nvram = kzalloc(size, GFP_KERNEL);
113 @@ -362,18 +362,18 @@ fail:
114 * and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
115 * End of buffer is completed with token identifying length of buffer.
116 */
117 -static void *brcmf_fw_nvram_strip(const struct firmware *nv, u32 *new_length,
118 - u16 domain_nr, u16 bus_nr)
119 +static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len,
120 + u32 *new_length, u16 domain_nr, u16 bus_nr)
121 {
122 struct nvram_parser nvp;
123 u32 pad;
124 u32 token;
125 __le32 token_le;
126
127 - if (brcmf_init_nvram_parser(&nvp, nv) < 0)
128 + if (brcmf_init_nvram_parser(&nvp, data, data_len) < 0)
129 return NULL;
130
131 - while (nvp.pos < nv->size) {
132 + while (nvp.pos < data_len) {
133 nvp.state = nv_parser_states[nvp.state](&nvp);
134 if (nvp.state == END)
135 break;
136 @@ -432,7 +432,7 @@ static void brcmf_fw_request_nvram_done(
137 goto fail;
138
139 if (fw) {
140 - nvram = brcmf_fw_nvram_strip(fw, &nvram_length,
141 + nvram = brcmf_fw_nvram_strip(fw->data, fw->size, &nvram_length,
142 fwctx->domain_nr, fwctx->bus_nr);
143 release_firmware(fw);
144 if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))