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); | ||
|  | } | ||
|  | 
 | ||
|  | 
 |