145 lines
4.6 KiB
Diff
145 lines
4.6 KiB
Diff
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
|
||
|
Date: Thu, 4 Jun 2015 22:11:07 +0200
|
||
|
Subject: [PATCH] brcmfmac: use direct data pointer in NVRAM parser struct
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
As we plan to add support for platform NVRAM we should store direct
|
||
|
data pointer without the extra struct firmware layer. This will allow
|
||
|
us to support other sources with the only requirement being u8 buffer.
|
||
|
|
||
|
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
|
||
|
Acked-by: Arend van Spriel <arend@broadcom.com>
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
|
||
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
|
||
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/firmware.c
|
||
|
@@ -43,7 +43,7 @@ enum nvram_parser_state {
|
||
|
* struct nvram_parser - internal info for parser.
|
||
|
*
|
||
|
* @state: current parser state.
|
||
|
- * @fwnv: input buffer being parsed.
|
||
|
+ * @data: input buffer being parsed.
|
||
|
* @nvram: output buffer with parse result.
|
||
|
* @nvram_len: lenght of parse result.
|
||
|
* @line: current line.
|
||
|
@@ -55,7 +55,7 @@ enum nvram_parser_state {
|
||
|
*/
|
||
|
struct nvram_parser {
|
||
|
enum nvram_parser_state state;
|
||
|
- const struct firmware *fwnv;
|
||
|
+ const u8 *data;
|
||
|
u8 *nvram;
|
||
|
u32 nvram_len;
|
||
|
u32 line;
|
||
|
@@ -91,7 +91,7 @@ static enum nvram_parser_state brcmf_nvr
|
||
|
{
|
||
|
char c;
|
||
|
|
||
|
- c = nvp->fwnv->data[nvp->pos];
|
||
|
+ c = nvp->data[nvp->pos];
|
||
|
if (c == '\n')
|
||
|
return COMMENT;
|
||
|
if (is_whitespace(c))
|
||
|
@@ -115,16 +115,16 @@ static enum nvram_parser_state brcmf_nvr
|
||
|
enum nvram_parser_state st = nvp->state;
|
||
|
char c;
|
||
|
|
||
|
- c = nvp->fwnv->data[nvp->pos];
|
||
|
+ c = nvp->data[nvp->pos];
|
||
|
if (c == '=') {
|
||
|
/* ignore RAW1 by treating as comment */
|
||
|
- if (strncmp(&nvp->fwnv->data[nvp->entry], "RAW1", 4) == 0)
|
||
|
+ if (strncmp(&nvp->data[nvp->entry], "RAW1", 4) == 0)
|
||
|
st = COMMENT;
|
||
|
else
|
||
|
st = VALUE;
|
||
|
- if (strncmp(&nvp->fwnv->data[nvp->entry], "devpath", 7) == 0)
|
||
|
+ if (strncmp(&nvp->data[nvp->entry], "devpath", 7) == 0)
|
||
|
nvp->multi_dev_v1 = true;
|
||
|
- if (strncmp(&nvp->fwnv->data[nvp->entry], "pcie/", 5) == 0)
|
||
|
+ if (strncmp(&nvp->data[nvp->entry], "pcie/", 5) == 0)
|
||
|
nvp->multi_dev_v2 = true;
|
||
|
} else if (!is_nvram_char(c) || c == ' ') {
|
||
|
brcmf_dbg(INFO, "warning: ln=%d:col=%d: '=' expected, skip invalid key entry\n",
|
||
|
@@ -145,11 +145,11 @@ brcmf_nvram_handle_value(struct nvram_pa
|
||
|
char *ekv;
|
||
|
u32 cplen;
|
||
|
|
||
|
- c = nvp->fwnv->data[nvp->pos];
|
||
|
+ c = nvp->data[nvp->pos];
|
||
|
if (!is_nvram_char(c)) {
|
||
|
/* key,value pair complete */
|
||
|
- ekv = (u8 *)&nvp->fwnv->data[nvp->pos];
|
||
|
- skv = (u8 *)&nvp->fwnv->data[nvp->entry];
|
||
|
+ ekv = (u8 *)&nvp->data[nvp->pos];
|
||
|
+ skv = (u8 *)&nvp->data[nvp->entry];
|
||
|
cplen = ekv - skv;
|
||
|
if (nvp->nvram_len + cplen + 1 >= BRCMF_FW_MAX_NVRAM_SIZE)
|
||
|
return END;
|
||
|
@@ -170,7 +170,7 @@ brcmf_nvram_handle_comment(struct nvram_
|
||
|
{
|
||
|
char *eoc, *sol;
|
||
|
|
||
|
- sol = (char *)&nvp->fwnv->data[nvp->pos];
|
||
|
+ sol = (char *)&nvp->data[nvp->pos];
|
||
|
eoc = strchr(sol, '\n');
|
||
|
if (!eoc) {
|
||
|
eoc = strchr(sol, '\0');
|
||
|
@@ -201,17 +201,17 @@ static enum nvram_parser_state
|
||
|
};
|
||
|
|
||
|
static int brcmf_init_nvram_parser(struct nvram_parser *nvp,
|
||
|
- const struct firmware *nv)
|
||
|
+ const u8 *data, size_t data_len)
|
||
|
{
|
||
|
size_t size;
|
||
|
|
||
|
memset(nvp, 0, sizeof(*nvp));
|
||
|
- nvp->fwnv = nv;
|
||
|
+ nvp->data = data;
|
||
|
/* Limit size to MAX_NVRAM_SIZE, some files contain lot of comment */
|
||
|
- if (nv->size > BRCMF_FW_MAX_NVRAM_SIZE)
|
||
|
+ if (data_len > BRCMF_FW_MAX_NVRAM_SIZE)
|
||
|
size = BRCMF_FW_MAX_NVRAM_SIZE;
|
||
|
else
|
||
|
- size = nv->size;
|
||
|
+ size = data_len;
|
||
|
/* Alloc for extra 0 byte + roundup by 4 + length field */
|
||
|
size += 1 + 3 + sizeof(u32);
|
||
|
nvp->nvram = kzalloc(size, GFP_KERNEL);
|
||
|
@@ -362,18 +362,18 @@ fail:
|
||
|
* and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
|
||
|
* End of buffer is completed with token identifying length of buffer.
|
||
|
*/
|
||
|
-static void *brcmf_fw_nvram_strip(const struct firmware *nv, u32 *new_length,
|
||
|
- u16 domain_nr, u16 bus_nr)
|
||
|
+static void *brcmf_fw_nvram_strip(const u8 *data, size_t data_len,
|
||
|
+ u32 *new_length, u16 domain_nr, u16 bus_nr)
|
||
|
{
|
||
|
struct nvram_parser nvp;
|
||
|
u32 pad;
|
||
|
u32 token;
|
||
|
__le32 token_le;
|
||
|
|
||
|
- if (brcmf_init_nvram_parser(&nvp, nv) < 0)
|
||
|
+ if (brcmf_init_nvram_parser(&nvp, data, data_len) < 0)
|
||
|
return NULL;
|
||
|
|
||
|
- while (nvp.pos < nv->size) {
|
||
|
+ while (nvp.pos < data_len) {
|
||
|
nvp.state = nv_parser_states[nvp.state](&nvp);
|
||
|
if (nvp.state == END)
|
||
|
break;
|
||
|
@@ -432,7 +432,7 @@ static void brcmf_fw_request_nvram_done(
|
||
|
goto fail;
|
||
|
|
||
|
if (fw) {
|
||
|
- nvram = brcmf_fw_nvram_strip(fw, &nvram_length,
|
||
|
+ nvram = brcmf_fw_nvram_strip(fw->data, fw->size, &nvram_length,
|
||
|
fwctx->domain_nr, fwctx->bus_nr);
|
||
|
release_firmware(fw);
|
||
|
if (!nvram && !(fwctx->flags & BRCMF_FW_REQ_NV_OPTIONAL))
|