Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28c9195a authored by Bruce Allan's avatar Bruce Allan Committed by David S. Miller
Browse files

e1000e: prevent NVM corruption on sectors larger than 4K



Limit NVM writes to 4K sections to prevent NVM corruption on larger
sector allocations (up to 64K).

Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 60f1292f
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -338,6 +338,7 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
{
	struct e1000_nvm_info *nvm = &hw->nvm;
	struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan;
	union ich8_hws_flash_status hsfsts;
	u32 gfpreg;
	u32 sector_base_addr;
	u32 sector_end_addr;
@@ -374,6 +375,20 @@ static s32 e1000_init_nvm_params_ich8lan(struct e1000_hw *hw)
	/* Adjust to word count */
	nvm->flash_bank_size /= sizeof(u16);

	/*
	 * Make sure the flash bank size does not overwrite the 4k
	 * sector ranges. We may have 64k allotted to us but we only care
	 * about the first 2 4k sectors. Therefore, if we have anything less
	 * than 64k set in the HSFSTS register, we will reduce the bank size
	 * down to 4k and let the rest remain unused. If berasesz == 3, then
	 * we are working in 64k mode. Otherwise we are not.
	 */
	if (nvm->flash_bank_size > E1000_ICH8_SHADOW_RAM_WORDS) {
		hsfsts.regval = er16flash(ICH_FLASH_HSFSTS);
		if (hsfsts.hsf_status.berasesz != 3)
			nvm->flash_bank_size = E1000_ICH8_SHADOW_RAM_WORDS;
	}

	nvm->word_size = E1000_ICH8_SHADOW_RAM_WORDS;

	/* Clear shadow ram */
@@ -1932,7 +1947,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
		break;
	case 1:
		sector_size = ICH_FLASH_SEG_SIZE_4K;
		iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_4K;
		iteration = 1;
		break;
	case 2:
		if (hw->mac.type == e1000_ich9lan) {
@@ -1944,7 +1959,7 @@ static s32 e1000_erase_flash_bank_ich8lan(struct e1000_hw *hw, u32 bank)
		break;
	case 3:
		sector_size = ICH_FLASH_SEG_SIZE_64K;
		iteration = flash_bank_size / ICH_FLASH_SEG_SIZE_64K;
		iteration = 1;
		break;
	default:
		return -E1000_ERR_NVM;