netxen: add fw version compatibility check
o Minimum fw version supported for P3 chip is 4.0.505 o File Fw > 4.0.554 is not supported if flash fw < 4.0.554. o In mn firmware case, file fw older than flash fw is allowed. o Change variable names for readability o Update driver version 4.0.76 Signed-off-by: Amit Kumar Salecha <amit.salecha@qlogic.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2dc1deb659
commit
e933d0198d
|
@ -53,8 +53,8 @@
|
||||||
|
|
||||||
#define _NETXEN_NIC_LINUX_MAJOR 4
|
#define _NETXEN_NIC_LINUX_MAJOR 4
|
||||||
#define _NETXEN_NIC_LINUX_MINOR 0
|
#define _NETXEN_NIC_LINUX_MINOR 0
|
||||||
#define _NETXEN_NIC_LINUX_SUBVERSION 75
|
#define _NETXEN_NIC_LINUX_SUBVERSION 76
|
||||||
#define NETXEN_NIC_LINUX_VERSIONID "4.0.75"
|
#define NETXEN_NIC_LINUX_VERSIONID "4.0.76"
|
||||||
|
|
||||||
#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c))
|
#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c))
|
||||||
#define _major(v) (((v) >> 24) & 0xff)
|
#define _major(v) (((v) >> 24) & 0xff)
|
||||||
|
@ -1302,6 +1302,7 @@ int netxen_nic_wol_supported(struct netxen_adapter *adapter);
|
||||||
int netxen_init_dummy_dma(struct netxen_adapter *adapter);
|
int netxen_init_dummy_dma(struct netxen_adapter *adapter);
|
||||||
void netxen_free_dummy_dma(struct netxen_adapter *adapter);
|
void netxen_free_dummy_dma(struct netxen_adapter *adapter);
|
||||||
|
|
||||||
|
int netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter);
|
||||||
int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
|
int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
|
||||||
int netxen_load_firmware(struct netxen_adapter *adapter);
|
int netxen_load_firmware(struct netxen_adapter *adapter);
|
||||||
int netxen_need_fw_reset(struct netxen_adapter *adapter);
|
int netxen_need_fw_reset(struct netxen_adapter *adapter);
|
||||||
|
|
|
@ -964,6 +964,35 @@ netxen_need_fw_reset(struct netxen_adapter *adapter)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define NETXEN_MIN_P3_FW_SUPP NETXEN_VERSION_CODE(4, 0, 505)
|
||||||
|
|
||||||
|
int
|
||||||
|
netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter)
|
||||||
|
{
|
||||||
|
u32 flash_fw_ver, min_fw_ver;
|
||||||
|
|
||||||
|
if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (netxen_rom_fast_read(adapter,
|
||||||
|
NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
|
||||||
|
dev_err(&adapter->pdev->dev, "Unable to read flash fw"
|
||||||
|
"version\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
|
||||||
|
min_fw_ver = NETXEN_MIN_P3_FW_SUPP;
|
||||||
|
if (flash_fw_ver >= min_fw_ver)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
dev_info(&adapter->pdev->dev, "Flash fw[%d.%d.%d] is < min fw supported"
|
||||||
|
"[4.0.505]. Please update firmware on flash\n",
|
||||||
|
_major(flash_fw_ver), _minor(flash_fw_ver),
|
||||||
|
_build(flash_fw_ver));
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static char *fw_name[] = {
|
static char *fw_name[] = {
|
||||||
NX_P2_MN_ROMIMAGE_NAME,
|
NX_P2_MN_ROMIMAGE_NAME,
|
||||||
NX_P3_CT_ROMIMAGE_NAME,
|
NX_P3_CT_ROMIMAGE_NAME,
|
||||||
|
@ -1071,10 +1100,12 @@ static int
|
||||||
netxen_validate_firmware(struct netxen_adapter *adapter)
|
netxen_validate_firmware(struct netxen_adapter *adapter)
|
||||||
{
|
{
|
||||||
__le32 val;
|
__le32 val;
|
||||||
u32 ver, min_ver, bios;
|
__le32 flash_fw_ver;
|
||||||
|
u32 file_fw_ver, min_ver, bios;
|
||||||
struct pci_dev *pdev = adapter->pdev;
|
struct pci_dev *pdev = adapter->pdev;
|
||||||
const struct firmware *fw = adapter->fw;
|
const struct firmware *fw = adapter->fw;
|
||||||
u8 fw_type = adapter->fw_type;
|
u8 fw_type = adapter->fw_type;
|
||||||
|
u32 crbinit_fix_fw;
|
||||||
|
|
||||||
if (fw_type == NX_UNIFIED_ROMIMAGE) {
|
if (fw_type == NX_UNIFIED_ROMIMAGE) {
|
||||||
if (netxen_nic_validate_unified_romimage(adapter))
|
if (netxen_nic_validate_unified_romimage(adapter))
|
||||||
|
@ -1091,16 +1122,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
|
||||||
val = nx_get_fw_version(adapter);
|
val = nx_get_fw_version(adapter);
|
||||||
|
|
||||||
if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
|
if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
|
||||||
min_ver = NETXEN_VERSION_CODE(4, 0, 216);
|
min_ver = NETXEN_MIN_P3_FW_SUPP;
|
||||||
else
|
else
|
||||||
min_ver = NETXEN_VERSION_CODE(3, 4, 216);
|
min_ver = NETXEN_VERSION_CODE(3, 4, 216);
|
||||||
|
|
||||||
ver = NETXEN_DECODE_VERSION(val);
|
file_fw_ver = NETXEN_DECODE_VERSION(val);
|
||||||
|
|
||||||
if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
|
if ((_major(file_fw_ver) > _NETXEN_NIC_LINUX_MAJOR) ||
|
||||||
|
(file_fw_ver < min_ver)) {
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"%s: firmware version %d.%d.%d unsupported\n",
|
"%s: firmware version %d.%d.%d unsupported\n",
|
||||||
fw_name[fw_type], _major(ver), _minor(ver), _build(ver));
|
fw_name[fw_type], _major(file_fw_ver), _minor(file_fw_ver),
|
||||||
|
_build(file_fw_ver));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1112,17 +1145,34 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if flashed firmware is newer */
|
|
||||||
if (netxen_rom_fast_read(adapter,
|
if (netxen_rom_fast_read(adapter,
|
||||||
NX_FW_VERSION_OFFSET, (int *)&val))
|
NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
|
||||||
|
dev_err(&pdev->dev, "Unable to read flash fw version\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
val = NETXEN_DECODE_VERSION(val);
|
}
|
||||||
if (val > ver) {
|
flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
|
||||||
dev_info(&pdev->dev, "%s: firmware is older than flash\n",
|
|
||||||
fw_name[fw_type]);
|
/* New fw from file is not allowed, if fw on flash is < 4.0.554 */
|
||||||
|
crbinit_fix_fw = NETXEN_VERSION_CODE(4, 0, 554);
|
||||||
|
if (file_fw_ver >= crbinit_fix_fw && flash_fw_ver < crbinit_fix_fw &&
|
||||||
|
NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
|
||||||
|
dev_err(&pdev->dev, "Incompatibility detected between driver "
|
||||||
|
"and firmware version on flash. This configuration "
|
||||||
|
"is not recommended. Please update the firmware on "
|
||||||
|
"flash immediately\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if flashed firmware is newer only for no-mn and P2 case*/
|
||||||
|
if (!netxen_p3_has_mn(adapter) ||
|
||||||
|
NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
|
||||||
|
if (flash_fw_ver > file_fw_ver) {
|
||||||
|
dev_info(&pdev->dev, "%s: firmware is older than flash\n",
|
||||||
|
fw_name[fw_type]);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
|
NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1388,6 +1388,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = netxen_check_flash_fw_compatibility(adapter);
|
||||||
|
if (err)
|
||||||
|
goto err_out_iounmap;
|
||||||
|
|
||||||
if (adapter->portnum == 0) {
|
if (adapter->portnum == 0) {
|
||||||
val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
|
val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
|
||||||
if (val != 0xffffffff && val != 0) {
|
if (val != 0xffffffff && val != 0) {
|
||||||
|
|
Loading…
Reference in New Issue