diff options
Diffstat (limited to 'drivers/net/netxen')
| -rw-r--r-- | drivers/net/netxen/netxen_nic.h | 17 | ||||
| -rw-r--r-- | drivers/net/netxen/netxen_nic_hdr.h | 1 | ||||
| -rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 111 | ||||
| -rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 4 |
4 files changed, 112 insertions, 21 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 970cedeb5f37..e1cdba752e09 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
| @@ -60,7 +60,18 @@ | |||
| 60 | #define _NETXEN_NIC_LINUX_SUBVERSION 30 | 60 | #define _NETXEN_NIC_LINUX_SUBVERSION 30 |
| 61 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.30" | 61 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.30" |
| 62 | 62 | ||
| 63 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c)) | 63 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) |
| 64 | #define _major(v) (((v) >> 24) & 0xff) | ||
| 65 | #define _minor(v) (((v) >> 16) & 0xff) | ||
| 66 | #define _build(v) ((v) & 0xffff) | ||
| 67 | |||
| 68 | /* version in image has weird encoding: | ||
| 69 | * 7:0 - major | ||
| 70 | * 15:8 - minor | ||
| 71 | * 31:16 - build (little endian) | ||
| 72 | */ | ||
| 73 | #define NETXEN_DECODE_VERSION(v) \ | ||
| 74 | NETXEN_VERSION_CODE(((v) & 0xff), (((v) >> 8) & 0xff), ((v) >> 16)) | ||
| 64 | 75 | ||
| 65 | #define NETXEN_NUM_FLASH_SECTORS (64) | 76 | #define NETXEN_NUM_FLASH_SECTORS (64) |
| 66 | #define NETXEN_FLASH_SECTOR_SIZE (64 * 1024) | 77 | #define NETXEN_FLASH_SECTOR_SIZE (64 * 1024) |
| @@ -614,6 +625,7 @@ struct netxen_new_user_info { | |||
| 614 | #define NX_P2_MN_ROMIMAGE 0 | 625 | #define NX_P2_MN_ROMIMAGE 0 |
| 615 | #define NX_P3_CT_ROMIMAGE 1 | 626 | #define NX_P3_CT_ROMIMAGE 1 |
| 616 | #define NX_P3_MN_ROMIMAGE 2 | 627 | #define NX_P3_MN_ROMIMAGE 2 |
| 628 | #define NX_FLASH_ROMIMAGE 3 | ||
| 617 | 629 | ||
| 618 | #define NETXEN_USER_START_OLD NETXEN_PXE_START /* for backward compatibility */ | 630 | #define NETXEN_USER_START_OLD NETXEN_PXE_START /* for backward compatibility */ |
| 619 | 631 | ||
| @@ -1243,7 +1255,7 @@ struct netxen_adapter { | |||
| 1243 | u32 resv3; | 1255 | u32 resv3; |
| 1244 | 1256 | ||
| 1245 | u8 has_link_events; | 1257 | u8 has_link_events; |
| 1246 | u8 resv1; | 1258 | u8 fw_type; |
| 1247 | u16 tx_context_id; | 1259 | u16 tx_context_id; |
| 1248 | u16 mtu; | 1260 | u16 mtu; |
| 1249 | u16 is_up; | 1261 | u16 is_up; |
| @@ -1387,6 +1399,7 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter); | |||
| 1387 | int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); | 1399 | int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); |
| 1388 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); | 1400 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); |
| 1389 | int netxen_load_firmware(struct netxen_adapter *adapter); | 1401 | int netxen_load_firmware(struct netxen_adapter *adapter); |
| 1402 | int netxen_need_fw_reset(struct netxen_adapter *adapter); | ||
| 1390 | void netxen_request_firmware(struct netxen_adapter *adapter); | 1403 | void netxen_request_firmware(struct netxen_adapter *adapter); |
| 1391 | void netxen_release_firmware(struct netxen_adapter *adapter); | 1404 | void netxen_release_firmware(struct netxen_adapter *adapter); |
| 1392 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); | 1405 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); |
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index 3cc047844af3..824103675648 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
| @@ -853,6 +853,7 @@ enum { | |||
| 853 | #define NX_PEG_TUNE_CAPABILITY (NETXEN_CAM_RAM(0x02c)) | 853 | #define NX_PEG_TUNE_CAPABILITY (NETXEN_CAM_RAM(0x02c)) |
| 854 | 854 | ||
| 855 | #define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14) | 855 | #define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14) |
| 856 | #define NETXEN_PEG_ALIVE_COUNTER (NETXEN_CAM_RAM(0xb0)) | ||
| 856 | 857 | ||
| 857 | #define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC))) | 858 | #define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC))) |
| 858 | #define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200) | 859 | #define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200) |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 055bb61d6e77..b899bd51fcd8 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
| @@ -684,11 +684,84 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
| 684 | } | 684 | } |
| 685 | 685 | ||
| 686 | int | 686 | int |
| 687 | netxen_need_fw_reset(struct netxen_adapter *adapter) | ||
| 688 | { | ||
| 689 | u32 count, old_count; | ||
| 690 | u32 val, version, major, minor, build; | ||
| 691 | int i, timeout; | ||
| 692 | u8 fw_type; | ||
| 693 | |||
| 694 | /* NX2031 firmware doesn't support heartbit */ | ||
| 695 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
| 696 | return 1; | ||
| 697 | |||
| 698 | /* last attempt had failed */ | ||
| 699 | if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED) | ||
| 700 | return 1; | ||
| 701 | |||
| 702 | old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
| 703 | |||
| 704 | for (i = 0; i < 10; i++) { | ||
| 705 | |||
| 706 | timeout = msleep_interruptible(200); | ||
| 707 | if (timeout) { | ||
| 708 | NXWR32(adapter, CRB_CMDPEG_STATE, | ||
| 709 | PHAN_INITIALIZE_FAILED); | ||
| 710 | return -EINTR; | ||
| 711 | } | ||
| 712 | |||
| 713 | count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
| 714 | if (count != old_count) | ||
| 715 | break; | ||
| 716 | } | ||
| 717 | |||
| 718 | /* firmware is dead */ | ||
| 719 | if (count == old_count) | ||
| 720 | return 1; | ||
| 721 | |||
| 722 | /* check if we have got newer or different file firmware */ | ||
| 723 | if (adapter->fw) { | ||
| 724 | |||
| 725 | const struct firmware *fw = adapter->fw; | ||
| 726 | |||
| 727 | val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); | ||
| 728 | version = NETXEN_DECODE_VERSION(val); | ||
| 729 | |||
| 730 | major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | ||
| 731 | minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | ||
| 732 | build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | ||
| 733 | |||
| 734 | if (version > NETXEN_VERSION_CODE(major, minor, build)) | ||
| 735 | return 1; | ||
| 736 | |||
| 737 | if (version == NETXEN_VERSION_CODE(major, minor, build)) { | ||
| 738 | |||
| 739 | val = NXRD32(adapter, NETXEN_MIU_MN_CONTROL); | ||
| 740 | fw_type = (val & 0x4) ? | ||
| 741 | NX_P3_CT_ROMIMAGE : NX_P3_MN_ROMIMAGE; | ||
| 742 | |||
| 743 | if (adapter->fw_type != fw_type) | ||
| 744 | return 1; | ||
| 745 | } | ||
| 746 | } | ||
| 747 | |||
| 748 | return 0; | ||
| 749 | } | ||
| 750 | |||
| 751 | static char *fw_name[] = { | ||
| 752 | "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash", | ||
| 753 | }; | ||
| 754 | |||
| 755 | int | ||
| 687 | netxen_load_firmware(struct netxen_adapter *adapter) | 756 | netxen_load_firmware(struct netxen_adapter *adapter) |
| 688 | { | 757 | { |
| 689 | u64 *ptr64; | 758 | u64 *ptr64; |
| 690 | u32 i, flashaddr, size; | 759 | u32 i, flashaddr, size; |
| 691 | const struct firmware *fw = adapter->fw; | 760 | const struct firmware *fw = adapter->fw; |
| 761 | struct pci_dev *pdev = adapter->pdev; | ||
| 762 | |||
| 763 | dev_info(&pdev->dev, "loading firmware from %s\n", | ||
| 764 | fw_name[adapter->fw_type]); | ||
| 692 | 765 | ||
| 693 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | 766 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) |
| 694 | NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1); | 767 | NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1); |
| @@ -756,7 +829,7 @@ static int | |||
| 756 | netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | 829 | netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) |
| 757 | { | 830 | { |
| 758 | __le32 val; | 831 | __le32 val; |
| 759 | u32 major, minor, build, ver, min_ver, bios; | 832 | u32 ver, min_ver, bios; |
| 760 | struct pci_dev *pdev = adapter->pdev; | 833 | struct pci_dev *pdev = adapter->pdev; |
| 761 | const struct firmware *fw = adapter->fw; | 834 | const struct firmware *fw = adapter->fw; |
| 762 | 835 | ||
| @@ -768,21 +841,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | |||
| 768 | return -EINVAL; | 841 | return -EINVAL; |
| 769 | 842 | ||
| 770 | val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); | 843 | val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); |
| 771 | major = (__force u32)val & 0xff; | ||
| 772 | minor = ((__force u32)val >> 8) & 0xff; | ||
| 773 | build = (__force u32)val >> 16; | ||
| 774 | 844 | ||
| 775 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) | 845 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) |
| 776 | min_ver = NETXEN_VERSION_CODE(4, 0, 216); | 846 | min_ver = NETXEN_VERSION_CODE(4, 0, 216); |
| 777 | else | 847 | else |
| 778 | min_ver = NETXEN_VERSION_CODE(3, 4, 216); | 848 | min_ver = NETXEN_VERSION_CODE(3, 4, 216); |
| 779 | 849 | ||
| 780 | ver = NETXEN_VERSION_CODE(major, minor, build); | 850 | ver = NETXEN_DECODE_VERSION(val); |
| 781 | 851 | ||
| 782 | if ((major > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { | 852 | if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { |
| 783 | dev_err(&pdev->dev, | 853 | dev_err(&pdev->dev, |
| 784 | "%s: firmware version %d.%d.%d unsupported\n", | 854 | "%s: firmware version %d.%d.%d unsupported\n", |
| 785 | fwname, major, minor, build); | 855 | fwname, _major(ver), _minor(ver), _build(ver)); |
| 786 | return -EINVAL; | 856 | return -EINVAL; |
| 787 | } | 857 | } |
| 788 | 858 | ||
| @@ -798,22 +868,21 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | |||
| 798 | if (netxen_rom_fast_read(adapter, | 868 | if (netxen_rom_fast_read(adapter, |
| 799 | NX_FW_VERSION_OFFSET, (int *)&val)) | 869 | NX_FW_VERSION_OFFSET, (int *)&val)) |
| 800 | return -EIO; | 870 | return -EIO; |
| 801 | major = (__force u32)val & 0xff; | 871 | val = NETXEN_DECODE_VERSION(val); |
| 802 | minor = ((__force u32)val >> 8) & 0xff; | 872 | if (val > ver) { |
| 803 | build = (__force u32)val >> 16; | 873 | dev_info(&pdev->dev, "%s: firmware is older than flash\n", |
| 804 | if (NETXEN_VERSION_CODE(major, minor, build) > ver) | 874 | fwname); |
| 805 | return -EINVAL; | 875 | return -EINVAL; |
| 876 | } | ||
| 806 | 877 | ||
| 807 | NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); | 878 | NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); |
| 808 | return 0; | 879 | return 0; |
| 809 | } | 880 | } |
| 810 | 881 | ||
| 811 | static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" }; | ||
| 812 | |||
| 813 | void netxen_request_firmware(struct netxen_adapter *adapter) | 882 | void netxen_request_firmware(struct netxen_adapter *adapter) |
| 814 | { | 883 | { |
| 815 | u32 capability, flashed_ver; | 884 | u32 capability, flashed_ver; |
| 816 | int fw_type; | 885 | u8 fw_type; |
| 817 | struct pci_dev *pdev = adapter->pdev; | 886 | struct pci_dev *pdev = adapter->pdev; |
| 818 | int rc = 0; | 887 | int rc = 0; |
| 819 | 888 | ||
| @@ -830,6 +899,8 @@ request_mn: | |||
| 830 | 899 | ||
| 831 | netxen_rom_fast_read(adapter, | 900 | netxen_rom_fast_read(adapter, |
| 832 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); | 901 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); |
| 902 | flashed_ver = NETXEN_DECODE_VERSION(flashed_ver); | ||
| 903 | |||
| 833 | if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) { | 904 | if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) { |
| 834 | capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY); | 905 | capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY); |
| 835 | if (capability & NX_PEG_TUNE_MN_PRESENT) { | 906 | if (capability & NX_PEG_TUNE_MN_PRESENT) { |
| @@ -838,6 +909,10 @@ request_mn: | |||
| 838 | } | 909 | } |
| 839 | } | 910 | } |
| 840 | 911 | ||
| 912 | fw_type = NX_FLASH_ROMIMAGE; | ||
| 913 | adapter->fw = NULL; | ||
| 914 | goto done; | ||
| 915 | |||
| 841 | request_fw: | 916 | request_fw: |
| 842 | rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev); | 917 | rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev); |
| 843 | if (rc != 0) { | 918 | if (rc != 0) { |
| @@ -846,6 +921,7 @@ request_fw: | |||
| 846 | goto request_mn; | 921 | goto request_mn; |
| 847 | } | 922 | } |
| 848 | 923 | ||
| 924 | fw_type = NX_FLASH_ROMIMAGE; | ||
| 849 | adapter->fw = NULL; | 925 | adapter->fw = NULL; |
| 850 | goto done; | 926 | goto done; |
| 851 | } | 927 | } |
| @@ -859,16 +935,13 @@ request_fw: | |||
| 859 | goto request_mn; | 935 | goto request_mn; |
| 860 | } | 936 | } |
| 861 | 937 | ||
| 938 | fw_type = NX_FLASH_ROMIMAGE; | ||
| 862 | adapter->fw = NULL; | 939 | adapter->fw = NULL; |
| 863 | goto done; | 940 | goto done; |
| 864 | } | 941 | } |
| 865 | 942 | ||
| 866 | done: | 943 | done: |
| 867 | if (adapter->fw) | 944 | adapter->fw_type = fw_type; |
| 868 | dev_info(&pdev->dev, "loading firmware from file %s\n", | ||
| 869 | fw_name[fw_type]); | ||
| 870 | else | ||
| 871 | dev_info(&pdev->dev, "loading firmware from flash\n"); | ||
| 872 | } | 945 | } |
| 873 | 946 | ||
| 874 | 947 | ||
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 2919a2d12bf4..27539ddf94c4 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
| @@ -718,6 +718,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw) | |||
| 718 | if (request_fw) | 718 | if (request_fw) |
| 719 | netxen_request_firmware(adapter); | 719 | netxen_request_firmware(adapter); |
| 720 | 720 | ||
| 721 | err = netxen_need_fw_reset(adapter); | ||
| 722 | if (err <= 0) | ||
| 723 | return err; | ||
| 724 | |||
| 721 | if (first_boot != 0x55555555) { | 725 | if (first_boot != 0x55555555) { |
| 722 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); | 726 | NXWR32(adapter, CRB_CMDPEG_STATE, 0); |
| 723 | netxen_pinit_from_rom(adapter, 0); | 727 | netxen_pinit_from_rom(adapter, 0); |
