summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmit Kumar Salecha <amit.salecha@qlogic.com>2011-07-19 20:08:53 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-22 00:32:54 -0400
commite933d0198d399842f075c2c8af0f38630e7e4bee (patch)
treeb0130a366d7b8d7ef2e5d79675a175ea3f18308a
parent2dc1deb659d1fc29aaafc2c0b987547d6b383602 (diff)
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>
-rw-r--r--drivers/net/netxen/netxen_nic.h5
-rw-r--r--drivers/net/netxen/netxen_nic_init.c72
-rw-r--r--drivers/net/netxen/netxen_nic_main.c4
3 files changed, 68 insertions, 13 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 77220687b92a..f744d291218a 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -53,8 +53,8 @@
53 53
54#define _NETXEN_NIC_LINUX_MAJOR 4 54#define _NETXEN_NIC_LINUX_MAJOR 4
55#define _NETXEN_NIC_LINUX_MINOR 0 55#define _NETXEN_NIC_LINUX_MINOR 0
56#define _NETXEN_NIC_LINUX_SUBVERSION 75 56#define _NETXEN_NIC_LINUX_SUBVERSION 76
57#define NETXEN_NIC_LINUX_VERSIONID "4.0.75" 57#define NETXEN_NIC_LINUX_VERSIONID "4.0.76"
58 58
59#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) 59#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c))
60#define _major(v) (((v) >> 24) & 0xff) 60#define _major(v) (((v) >> 24) & 0xff)
@@ -1302,6 +1302,7 @@ int netxen_nic_wol_supported(struct netxen_adapter *adapter);
1302int netxen_init_dummy_dma(struct netxen_adapter *adapter); 1302int netxen_init_dummy_dma(struct netxen_adapter *adapter);
1303void netxen_free_dummy_dma(struct netxen_adapter *adapter); 1303void netxen_free_dummy_dma(struct netxen_adapter *adapter);
1304 1304
1305int netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter);
1305int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); 1306int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
1306int netxen_load_firmware(struct netxen_adapter *adapter); 1307int netxen_load_firmware(struct netxen_adapter *adapter);
1307int netxen_need_fw_reset(struct netxen_adapter *adapter); 1308int netxen_need_fw_reset(struct netxen_adapter *adapter);
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index ca59b4f026f0..e8993a76a080 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -964,6 +964,35 @@ netxen_need_fw_reset(struct netxen_adapter *adapter)
964 return 0; 964 return 0;
965} 965}
966 966
967#define NETXEN_MIN_P3_FW_SUPP NETXEN_VERSION_CODE(4, 0, 505)
968
969int
970netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter)
971{
972 u32 flash_fw_ver, min_fw_ver;
973
974 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
975 return 0;
976
977 if (netxen_rom_fast_read(adapter,
978 NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
979 dev_err(&adapter->pdev->dev, "Unable to read flash fw"
980 "version\n");
981 return -EIO;
982 }
983
984 flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
985 min_fw_ver = NETXEN_MIN_P3_FW_SUPP;
986 if (flash_fw_ver >= min_fw_ver)
987 return 0;
988
989 dev_info(&adapter->pdev->dev, "Flash fw[%d.%d.%d] is < min fw supported"
990 "[4.0.505]. Please update firmware on flash\n",
991 _major(flash_fw_ver), _minor(flash_fw_ver),
992 _build(flash_fw_ver));
993 return -EINVAL;
994}
995
967static char *fw_name[] = { 996static char *fw_name[] = {
968 NX_P2_MN_ROMIMAGE_NAME, 997 NX_P2_MN_ROMIMAGE_NAME,
969 NX_P3_CT_ROMIMAGE_NAME, 998 NX_P3_CT_ROMIMAGE_NAME,
@@ -1071,10 +1100,12 @@ static int
1071netxen_validate_firmware(struct netxen_adapter *adapter) 1100netxen_validate_firmware(struct netxen_adapter *adapter)
1072{ 1101{
1073 __le32 val; 1102 __le32 val;
1074 u32 ver, min_ver, bios; 1103 __le32 flash_fw_ver;
1104 u32 file_fw_ver, min_ver, bios;
1075 struct pci_dev *pdev = adapter->pdev; 1105 struct pci_dev *pdev = adapter->pdev;
1076 const struct firmware *fw = adapter->fw; 1106 const struct firmware *fw = adapter->fw;
1077 u8 fw_type = adapter->fw_type; 1107 u8 fw_type = adapter->fw_type;
1108 u32 crbinit_fix_fw;
1078 1109
1079 if (fw_type == NX_UNIFIED_ROMIMAGE) { 1110 if (fw_type == NX_UNIFIED_ROMIMAGE) {
1080 if (netxen_nic_validate_unified_romimage(adapter)) 1111 if (netxen_nic_validate_unified_romimage(adapter))
@@ -1091,16 +1122,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
1091 val = nx_get_fw_version(adapter); 1122 val = nx_get_fw_version(adapter);
1092 1123
1093 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 1124 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1094 min_ver = NETXEN_VERSION_CODE(4, 0, 216); 1125 min_ver = NETXEN_MIN_P3_FW_SUPP;
1095 else 1126 else
1096 min_ver = NETXEN_VERSION_CODE(3, 4, 216); 1127 min_ver = NETXEN_VERSION_CODE(3, 4, 216);
1097 1128
1098 ver = NETXEN_DECODE_VERSION(val); 1129 file_fw_ver = NETXEN_DECODE_VERSION(val);
1099 1130
1100 if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { 1131 if ((_major(file_fw_ver) > _NETXEN_NIC_LINUX_MAJOR) ||
1132 (file_fw_ver < min_ver)) {
1101 dev_err(&pdev->dev, 1133 dev_err(&pdev->dev,
1102 "%s: firmware version %d.%d.%d unsupported\n", 1134 "%s: firmware version %d.%d.%d unsupported\n",
1103 fw_name[fw_type], _major(ver), _minor(ver), _build(ver)); 1135 fw_name[fw_type], _major(file_fw_ver), _minor(file_fw_ver),
1136 _build(file_fw_ver));
1104 return -EINVAL; 1137 return -EINVAL;
1105 } 1138 }
1106 1139
@@ -1112,17 +1145,34 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
1112 return -EINVAL; 1145 return -EINVAL;
1113 } 1146 }
1114 1147
1115 /* check if flashed firmware is newer */
1116 if (netxen_rom_fast_read(adapter, 1148 if (netxen_rom_fast_read(adapter,
1117 NX_FW_VERSION_OFFSET, (int *)&val)) 1149 NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
1150 dev_err(&pdev->dev, "Unable to read flash fw version\n");
1118 return -EIO; 1151 return -EIO;
1119 val = NETXEN_DECODE_VERSION(val); 1152 }
1120 if (val > ver) { 1153 flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
1121 dev_info(&pdev->dev, "%s: firmware is older than flash\n", 1154
1122 fw_name[fw_type]); 1155 /* New fw from file is not allowed, if fw on flash is < 4.0.554 */
1156 crbinit_fix_fw = NETXEN_VERSION_CODE(4, 0, 554);
1157 if (file_fw_ver >= crbinit_fix_fw && flash_fw_ver < crbinit_fix_fw &&
1158 NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1159 dev_err(&pdev->dev, "Incompatibility detected between driver "
1160 "and firmware version on flash. This configuration "
1161 "is not recommended. Please update the firmware on "
1162 "flash immediately\n");
1123 return -EINVAL; 1163 return -EINVAL;
1124 } 1164 }
1125 1165
1166 /* check if flashed firmware is newer only for no-mn and P2 case*/
1167 if (!netxen_p3_has_mn(adapter) ||
1168 NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1169 if (flash_fw_ver > file_fw_ver) {
1170 dev_info(&pdev->dev, "%s: firmware is older than flash\n",
1171 fw_name[fw_type]);
1172 return -EINVAL;
1173 }
1174 }
1175
1126 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); 1176 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
1127 return 0; 1177 return 0;
1128} 1178}
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 30f41e62049a..f574edff7fcb 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -1388,6 +1388,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1388 break; 1388 break;
1389 } 1389 }
1390 1390
1391 err = netxen_check_flash_fw_compatibility(adapter);
1392 if (err)
1393 goto err_out_iounmap;
1394
1391 if (adapter->portnum == 0) { 1395 if (adapter->portnum == 0) {
1392 val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); 1396 val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
1393 if (val != 0xffffffff && val != 0) { 1397 if (val != 0xffffffff && val != 0) {