|
@@ -683,12 +683,85 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int
|
|
|
+netxen_need_fw_reset(struct netxen_adapter *adapter)
|
|
|
+{
|
|
|
+ u32 count, old_count;
|
|
|
+ u32 val, version, major, minor, build;
|
|
|
+ int i, timeout;
|
|
|
+ u8 fw_type;
|
|
|
+
|
|
|
+ /* NX2031 firmware doesn't support heartbit */
|
|
|
+ if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /* last attempt had failed */
|
|
|
+ if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
|
|
|
+
|
|
|
+ for (i = 0; i < 10; i++) {
|
|
|
+
|
|
|
+ timeout = msleep_interruptible(200);
|
|
|
+ if (timeout) {
|
|
|
+ NXWR32(adapter, CRB_CMDPEG_STATE,
|
|
|
+ PHAN_INITIALIZE_FAILED);
|
|
|
+ return -EINTR;
|
|
|
+ }
|
|
|
+
|
|
|
+ count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
|
|
|
+ if (count != old_count)
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* firmware is dead */
|
|
|
+ if (count == old_count)
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ /* check if we have got newer or different file firmware */
|
|
|
+ if (adapter->fw) {
|
|
|
+
|
|
|
+ const struct firmware *fw = adapter->fw;
|
|
|
+
|
|
|
+ val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]);
|
|
|
+ version = NETXEN_DECODE_VERSION(val);
|
|
|
+
|
|
|
+ major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
|
|
|
+ minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
|
|
|
+ build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
|
|
|
+
|
|
|
+ if (version > NETXEN_VERSION_CODE(major, minor, build))
|
|
|
+ return 1;
|
|
|
+
|
|
|
+ if (version == NETXEN_VERSION_CODE(major, minor, build)) {
|
|
|
+
|
|
|
+ val = NXRD32(adapter, NETXEN_MIU_MN_CONTROL);
|
|
|
+ fw_type = (val & 0x4) ?
|
|
|
+ NX_P3_CT_ROMIMAGE : NX_P3_MN_ROMIMAGE;
|
|
|
+
|
|
|
+ if (adapter->fw_type != fw_type)
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static char *fw_name[] = {
|
|
|
+ "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash",
|
|
|
+};
|
|
|
+
|
|
|
int
|
|
|
netxen_load_firmware(struct netxen_adapter *adapter)
|
|
|
{
|
|
|
u64 *ptr64;
|
|
|
u32 i, flashaddr, size;
|
|
|
const struct firmware *fw = adapter->fw;
|
|
|
+ struct pci_dev *pdev = adapter->pdev;
|
|
|
+
|
|
|
+ dev_info(&pdev->dev, "loading firmware from %s\n",
|
|
|
+ fw_name[adapter->fw_type]);
|
|
|
|
|
|
if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
|
|
|
NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1);
|
|
@@ -806,12 +879,10 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" };
|
|
|
-
|
|
|
void netxen_request_firmware(struct netxen_adapter *adapter)
|
|
|
{
|
|
|
u32 capability, flashed_ver;
|
|
|
- int fw_type;
|
|
|
+ u8 fw_type;
|
|
|
struct pci_dev *pdev = adapter->pdev;
|
|
|
int rc = 0;
|
|
|
|
|
@@ -838,6 +909,7 @@ request_mn:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ fw_type = NX_FLASH_ROMIMAGE;
|
|
|
adapter->fw = NULL;
|
|
|
goto done;
|
|
|
|
|
@@ -849,6 +921,7 @@ request_fw:
|
|
|
goto request_mn;
|
|
|
}
|
|
|
|
|
|
+ fw_type = NX_FLASH_ROMIMAGE;
|
|
|
adapter->fw = NULL;
|
|
|
goto done;
|
|
|
}
|
|
@@ -862,16 +935,13 @@ request_fw:
|
|
|
goto request_mn;
|
|
|
}
|
|
|
|
|
|
+ fw_type = NX_FLASH_ROMIMAGE;
|
|
|
adapter->fw = NULL;
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
done:
|
|
|
- if (adapter->fw)
|
|
|
- dev_info(&pdev->dev, "loading firmware from file %s\n",
|
|
|
- fw_name[fw_type]);
|
|
|
- else
|
|
|
- dev_info(&pdev->dev, "loading firmware from flash\n");
|
|
|
+ adapter->fw_type = fw_type;
|
|
|
}
|
|
|
|
|
|
|