add chaos_calmer branch
[15.05/openwrt.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))