95 lines
2.3 KiB
C
95 lines
2.3 KiB
C
|
/*
|
||
|
* Copyright (c) 2013 Broadcom Corporation
|
||
|
*
|
||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||
|
* purpose with or without fee is hereby granted, provided that the above
|
||
|
* copyright notice and this permission notice appear in all copies.
|
||
|
*
|
||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||
|
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||
|
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||
|
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||
|
*/
|
||
|
|
||
|
#include <linux/kernel.h>
|
||
|
#include <linux/slab.h>
|
||
|
#include <linux/firmware.h>
|
||
|
|
||
|
#include "nvram.h"
|
||
|
|
||
|
/* brcmf_nvram_strip :Takes a buffer of "<var>=<value>\n" lines read from a file
|
||
|
* and ending in a NUL. Removes carriage returns, empty lines, comment lines,
|
||
|
* and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
|
||
|
* End of buffer is completed with token identifying length of buffer.
|
||
|
*/
|
||
|
void *brcmf_nvram_strip(const struct firmware *nv, u32 *new_length)
|
||
|
{
|
||
|
u8 *nvram;
|
||
|
u32 i;
|
||
|
u32 len;
|
||
|
u32 column;
|
||
|
u8 val;
|
||
|
bool comment;
|
||
|
u32 token;
|
||
|
__le32 token_le;
|
||
|
|
||
|
/* Alloc for extra 0 byte + roundup by 4 + length field */
|
||
|
nvram = kmalloc(nv->size + 1 + 3 + sizeof(token_le), GFP_KERNEL);
|
||
|
if (!nvram)
|
||
|
return NULL;
|
||
|
|
||
|
len = 0;
|
||
|
column = 0;
|
||
|
comment = false;
|
||
|
for (i = 0; i < nv->size; i++) {
|
||
|
val = nv->data[i];
|
||
|
if (val == 0)
|
||
|
break;
|
||
|
if (val == '\r')
|
||
|
continue;
|
||
|
if (comment && (val != '\n'))
|
||
|
continue;
|
||
|
comment = false;
|
||
|
if (val == '#') {
|
||
|
comment = true;
|
||
|
continue;
|
||
|
}
|
||
|
if (val == '\n') {
|
||
|
if (column == 0)
|
||
|
continue;
|
||
|
nvram[len] = 0;
|
||
|
len++;
|
||
|
column = 0;
|
||
|
continue;
|
||
|
}
|
||
|
nvram[len] = val;
|
||
|
len++;
|
||
|
column++;
|
||
|
}
|
||
|
column = len;
|
||
|
*new_length = roundup(len + 1, 4);
|
||
|
while (column != *new_length) {
|
||
|
nvram[column] = 0;
|
||
|
column++;
|
||
|
}
|
||
|
|
||
|
token = *new_length / 4;
|
||
|
token = (~token << 16) | (token & 0x0000FFFF);
|
||
|
token_le = cpu_to_le32(token);
|
||
|
|
||
|
memcpy(&nvram[*new_length], &token_le, sizeof(token_le));
|
||
|
*new_length += sizeof(token_le);
|
||
|
|
||
|
return nvram;
|
||
|
}
|
||
|
|
||
|
void brcmf_nvram_free(void *nvram)
|
||
|
{
|
||
|
kfree(nvram);
|
||
|
}
|
||
|
|
||
|
|