mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 08:44:41 +00:00 
			
		
		
		
	mtd: bcm47xxpart: look for NVRAM at the end of device
NVRAM is always placed at the end of device and it does not have to start at the beginning of a block, so check few possible offsets. Signed-off-by: Rafał Miłecki <zajec5@gmail.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
		
							parent
							
								
									5ca1088f10
								
							
						
					
					
						commit
						91d542f4dc
					
				
					 1 changed files with 25 additions and 7 deletions
				
			
		|  | @ -63,6 +63,7 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
| 	struct trx_header *trx; | ||||
| 	int trx_part = -1; | ||||
| 	int last_trx_part = -1; | ||||
| 	int possible_nvram_sizes[] = { 0x8000, 0xF000, 0x10000, }; | ||||
| 
 | ||||
| 	if (blocksize <= 0x10000) | ||||
| 		blocksize = 0x10000; | ||||
|  | @ -99,13 +100,6 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Standard NVRAM */ | ||||
| 		if (buf[0x000 / 4] == NVRAM_HEADER) { | ||||
| 			bcm47xxpart_add_part(&parts[curr_part++], "nvram", | ||||
| 					     offset, 0); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		/*
 | ||||
| 		 * board_data starts with board_id which differs across boards, | ||||
| 		 * but we can use 'MPFR' (hopefully) magic at 0x100 | ||||
|  | @ -174,6 +168,30 @@ static int bcm47xxpart_parse(struct mtd_info *master, | |||
| 			continue; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* Look for NVRAM at the end of the last block. */ | ||||
| 	for (i = 0; i < ARRAY_SIZE(possible_nvram_sizes); i++) { | ||||
| 		if (curr_part > BCM47XXPART_MAX_PARTS) { | ||||
| 			pr_warn("Reached maximum number of partitions, scanning stopped!\n"); | ||||
| 			break; | ||||
| 		} | ||||
| 
 | ||||
| 		offset = master->size - possible_nvram_sizes[i]; | ||||
| 		if (mtd_read(master, offset, 0x4, &bytes_read, | ||||
| 			     (uint8_t *)buf) < 0) { | ||||
| 			pr_err("mtd_read error while reading at offset 0x%X!\n", | ||||
| 			       offset); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Standard NVRAM */ | ||||
| 		if (buf[0] == NVRAM_HEADER) { | ||||
| 			bcm47xxpart_add_part(&parts[curr_part++], "nvram", | ||||
| 					     master->size - blocksize, 0); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	kfree(buf); | ||||
| 
 | ||||
| 	/*
 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Rafał Miłecki
						Rafał Miłecki