/* * 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 #include #include #include "nvram.h" /* brcmf_nvram_strip :Takes a buffer of "=\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); }