diff options
author | Amit Kumar Salecha <amit.salecha@qlogic.com> | 2011-07-19 20:08:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-07-22 00:32:54 -0400 |
commit | e933d0198d399842f075c2c8af0f38630e7e4bee (patch) | |
tree | b0130a366d7b8d7ef2e5d79675a175ea3f18308a | |
parent | 2dc1deb659d1fc29aaafc2c0b987547d6b383602 (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.h | 5 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 72 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 4 |
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); | |||
1302 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); | 1302 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); |
1303 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); | 1303 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); |
1304 | 1304 | ||
1305 | int netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter); | ||
1305 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); | 1306 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); |
1306 | int netxen_load_firmware(struct netxen_adapter *adapter); | 1307 | int netxen_load_firmware(struct netxen_adapter *adapter); |
1307 | int netxen_need_fw_reset(struct netxen_adapter *adapter); | 1308 | int 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 | |||
969 | int | ||
970 | netxen_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 | |||
967 | static char *fw_name[] = { | 996 | static 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 | |||
1071 | netxen_validate_firmware(struct netxen_adapter *adapter) | 1100 | netxen_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) { |