cxgb4: Clear On FLASH config file after a FW upgrade
Because Firmware and the Firmware Configuration File need to be in sync; clear out any On-FLASH Firmware Configuration File when new Firmware is loaded. This will avoid difficult to diagnose and fix problems with a mis-matched Firmware Configuration File which prevents the adapter from being initialized. Original work by: Casey Leedom <leedom@chelsio.com> Signed-off-by: Arjun Vynipadath <arjun@chelsio.com> Signed-off-by: Ganesh Goudar <ganeshgr@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7120371c8e
commit
4da1874190
|
@ -1405,6 +1405,7 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
|
||||||
int t4_fl_pkt_align(struct adapter *adap);
|
int t4_fl_pkt_align(struct adapter *adap);
|
||||||
unsigned int t4_flash_cfg_addr(struct adapter *adapter);
|
unsigned int t4_flash_cfg_addr(struct adapter *adapter);
|
||||||
int t4_check_fw_version(struct adapter *adap);
|
int t4_check_fw_version(struct adapter *adap);
|
||||||
|
int t4_load_cfg(struct adapter *adapter, const u8 *cfg_data, unsigned int size);
|
||||||
int t4_get_fw_version(struct adapter *adapter, u32 *vers);
|
int t4_get_fw_version(struct adapter *adapter, u32 *vers);
|
||||||
int t4_get_bs_version(struct adapter *adapter, u32 *vers);
|
int t4_get_bs_version(struct adapter *adapter, u32 *vers);
|
||||||
int t4_get_tp_version(struct adapter *adapter, u32 *vers);
|
int t4_get_tp_version(struct adapter *adapter, u32 *vers);
|
||||||
|
|
|
@ -6663,6 +6663,17 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If there was a Firmware Configuration File stored in FLASH,
|
||||||
|
* there's a good chance that it won't be compatible with the new
|
||||||
|
* Firmware. In order to prevent difficult to diagnose adapter
|
||||||
|
* initialization issues, we clear out the Firmware Configuration File
|
||||||
|
* portion of the FLASH . The user will need to re-FLASH a new
|
||||||
|
* Firmware Configuration File which is compatible with the new
|
||||||
|
* Firmware if that's desired.
|
||||||
|
*/
|
||||||
|
(void)t4_load_cfg(adap, NULL, 0);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Older versions of the firmware don't understand the new
|
* Older versions of the firmware don't understand the new
|
||||||
* PCIE_FW.HALT flag and so won't know to perform a RESET when they
|
* PCIE_FW.HALT flag and so won't know to perform a RESET when they
|
||||||
|
@ -8895,6 +8906,65 @@ void t4_idma_monitor(struct adapter *adapter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* t4_load_cfg - download config file
|
||||||
|
* @adap: the adapter
|
||||||
|
* @cfg_data: the cfg text file to write
|
||||||
|
* @size: text file size
|
||||||
|
*
|
||||||
|
* Write the supplied config text file to the card's serial flash.
|
||||||
|
*/
|
||||||
|
int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size)
|
||||||
|
{
|
||||||
|
int ret, i, n, cfg_addr;
|
||||||
|
unsigned int addr;
|
||||||
|
unsigned int flash_cfg_start_sec;
|
||||||
|
unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
|
||||||
|
|
||||||
|
cfg_addr = t4_flash_cfg_addr(adap);
|
||||||
|
if (cfg_addr < 0)
|
||||||
|
return cfg_addr;
|
||||||
|
|
||||||
|
addr = cfg_addr;
|
||||||
|
flash_cfg_start_sec = addr / SF_SEC_SIZE;
|
||||||
|
|
||||||
|
if (size > FLASH_CFG_MAX_SIZE) {
|
||||||
|
dev_err(adap->pdev_dev, "cfg file too large, max is %u bytes\n",
|
||||||
|
FLASH_CFG_MAX_SIZE);
|
||||||
|
return -EFBIG;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE, /* # of sectors spanned */
|
||||||
|
sf_sec_size);
|
||||||
|
ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec,
|
||||||
|
flash_cfg_start_sec + i - 1);
|
||||||
|
/* If size == 0 then we're simply erasing the FLASH sectors associated
|
||||||
|
* with the on-adapter Firmware Configuration File.
|
||||||
|
*/
|
||||||
|
if (ret || size == 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* this will write to the flash up to SF_PAGE_SIZE at a time */
|
||||||
|
for (i = 0; i < size; i += SF_PAGE_SIZE) {
|
||||||
|
if ((size - i) < SF_PAGE_SIZE)
|
||||||
|
n = size - i;
|
||||||
|
else
|
||||||
|
n = SF_PAGE_SIZE;
|
||||||
|
ret = t4_write_flash(adap, addr, n, cfg_data);
|
||||||
|
if (ret)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
addr += SF_PAGE_SIZE;
|
||||||
|
cfg_data += SF_PAGE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (ret)
|
||||||
|
dev_err(adap->pdev_dev, "config file %s failed %d\n",
|
||||||
|
(size == 0 ? "clear" : "download"), ret);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* t4_set_vf_mac - Set MAC address for the specified VF
|
* t4_set_vf_mac - Set MAC address for the specified VF
|
||||||
* @adapter: The adapter
|
* @adapter: The adapter
|
||||||
|
|
Loading…
Reference in New Issue