diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_init.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 123 |
1 files changed, 102 insertions, 21 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 055bb61d6e77..7acf204e38c9 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -184,6 +184,13 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter) | |||
184 | kfree(recv_ctx->rds_rings); | 184 | kfree(recv_ctx->rds_rings); |
185 | 185 | ||
186 | skip_rds: | 186 | skip_rds: |
187 | if (recv_ctx->sds_rings == NULL) | ||
188 | goto skip_sds; | ||
189 | |||
190 | for(ring = 0; ring < adapter->max_sds_rings; ring++) | ||
191 | recv_ctx->sds_rings[ring].consumer = 0; | ||
192 | |||
193 | skip_sds: | ||
187 | if (adapter->tx_ring == NULL) | 194 | if (adapter->tx_ring == NULL) |
188 | return; | 195 | return; |
189 | 196 | ||
@@ -214,6 +221,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter) | |||
214 | adapter->tx_ring = tx_ring; | 221 | adapter->tx_ring = tx_ring; |
215 | 222 | ||
216 | tx_ring->num_desc = adapter->num_txd; | 223 | tx_ring->num_desc = adapter->num_txd; |
224 | tx_ring->txq = netdev_get_tx_queue(netdev, 0); | ||
217 | 225 | ||
218 | cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring)); | 226 | cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring)); |
219 | if (cmd_buf_arr == NULL) { | 227 | if (cmd_buf_arr == NULL) { |
@@ -684,11 +692,84 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
684 | } | 692 | } |
685 | 693 | ||
686 | int | 694 | int |
695 | netxen_need_fw_reset(struct netxen_adapter *adapter) | ||
696 | { | ||
697 | u32 count, old_count; | ||
698 | u32 val, version, major, minor, build; | ||
699 | int i, timeout; | ||
700 | u8 fw_type; | ||
701 | |||
702 | /* NX2031 firmware doesn't support heartbit */ | ||
703 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | ||
704 | return 1; | ||
705 | |||
706 | /* last attempt had failed */ | ||
707 | if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED) | ||
708 | return 1; | ||
709 | |||
710 | old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
711 | |||
712 | for (i = 0; i < 10; i++) { | ||
713 | |||
714 | timeout = msleep_interruptible(200); | ||
715 | if (timeout) { | ||
716 | NXWR32(adapter, CRB_CMDPEG_STATE, | ||
717 | PHAN_INITIALIZE_FAILED); | ||
718 | return -EINTR; | ||
719 | } | ||
720 | |||
721 | count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER); | ||
722 | if (count != old_count) | ||
723 | break; | ||
724 | } | ||
725 | |||
726 | /* firmware is dead */ | ||
727 | if (count == old_count) | ||
728 | return 1; | ||
729 | |||
730 | /* check if we have got newer or different file firmware */ | ||
731 | if (adapter->fw) { | ||
732 | |||
733 | const struct firmware *fw = adapter->fw; | ||
734 | |||
735 | val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); | ||
736 | version = NETXEN_DECODE_VERSION(val); | ||
737 | |||
738 | major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR); | ||
739 | minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR); | ||
740 | build = NXRD32(adapter, NETXEN_FW_VERSION_SUB); | ||
741 | |||
742 | if (version > NETXEN_VERSION_CODE(major, minor, build)) | ||
743 | return 1; | ||
744 | |||
745 | if (version == NETXEN_VERSION_CODE(major, minor, build)) { | ||
746 | |||
747 | val = NXRD32(adapter, NETXEN_MIU_MN_CONTROL); | ||
748 | fw_type = (val & 0x4) ? | ||
749 | NX_P3_CT_ROMIMAGE : NX_P3_MN_ROMIMAGE; | ||
750 | |||
751 | if (adapter->fw_type != fw_type) | ||
752 | return 1; | ||
753 | } | ||
754 | } | ||
755 | |||
756 | return 0; | ||
757 | } | ||
758 | |||
759 | static char *fw_name[] = { | ||
760 | "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash", | ||
761 | }; | ||
762 | |||
763 | int | ||
687 | netxen_load_firmware(struct netxen_adapter *adapter) | 764 | netxen_load_firmware(struct netxen_adapter *adapter) |
688 | { | 765 | { |
689 | u64 *ptr64; | 766 | u64 *ptr64; |
690 | u32 i, flashaddr, size; | 767 | u32 i, flashaddr, size; |
691 | const struct firmware *fw = adapter->fw; | 768 | const struct firmware *fw = adapter->fw; |
769 | struct pci_dev *pdev = adapter->pdev; | ||
770 | |||
771 | dev_info(&pdev->dev, "loading firmware from %s\n", | ||
772 | fw_name[adapter->fw_type]); | ||
692 | 773 | ||
693 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) | 774 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) |
694 | NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1); | 775 | NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1); |
@@ -756,7 +837,7 @@ static int | |||
756 | netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | 837 | netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) |
757 | { | 838 | { |
758 | __le32 val; | 839 | __le32 val; |
759 | u32 major, minor, build, ver, min_ver, bios; | 840 | u32 ver, min_ver, bios; |
760 | struct pci_dev *pdev = adapter->pdev; | 841 | struct pci_dev *pdev = adapter->pdev; |
761 | const struct firmware *fw = adapter->fw; | 842 | const struct firmware *fw = adapter->fw; |
762 | 843 | ||
@@ -768,21 +849,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | |||
768 | return -EINVAL; | 849 | return -EINVAL; |
769 | 850 | ||
770 | val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); | 851 | 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 | 852 | ||
775 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) | 853 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) |
776 | min_ver = NETXEN_VERSION_CODE(4, 0, 216); | 854 | min_ver = NETXEN_VERSION_CODE(4, 0, 216); |
777 | else | 855 | else |
778 | min_ver = NETXEN_VERSION_CODE(3, 4, 216); | 856 | min_ver = NETXEN_VERSION_CODE(3, 4, 216); |
779 | 857 | ||
780 | ver = NETXEN_VERSION_CODE(major, minor, build); | 858 | ver = NETXEN_DECODE_VERSION(val); |
781 | 859 | ||
782 | if ((major > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { | 860 | if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { |
783 | dev_err(&pdev->dev, | 861 | dev_err(&pdev->dev, |
784 | "%s: firmware version %d.%d.%d unsupported\n", | 862 | "%s: firmware version %d.%d.%d unsupported\n", |
785 | fwname, major, minor, build); | 863 | fwname, _major(ver), _minor(ver), _build(ver)); |
786 | return -EINVAL; | 864 | return -EINVAL; |
787 | } | 865 | } |
788 | 866 | ||
@@ -798,22 +876,21 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) | |||
798 | if (netxen_rom_fast_read(adapter, | 876 | if (netxen_rom_fast_read(adapter, |
799 | NX_FW_VERSION_OFFSET, (int *)&val)) | 877 | NX_FW_VERSION_OFFSET, (int *)&val)) |
800 | return -EIO; | 878 | return -EIO; |
801 | major = (__force u32)val & 0xff; | 879 | val = NETXEN_DECODE_VERSION(val); |
802 | minor = ((__force u32)val >> 8) & 0xff; | 880 | if (val > ver) { |
803 | build = (__force u32)val >> 16; | 881 | dev_info(&pdev->dev, "%s: firmware is older than flash\n", |
804 | if (NETXEN_VERSION_CODE(major, minor, build) > ver) | 882 | fwname); |
805 | return -EINVAL; | 883 | return -EINVAL; |
884 | } | ||
806 | 885 | ||
807 | NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); | 886 | NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); |
808 | return 0; | 887 | return 0; |
809 | } | 888 | } |
810 | 889 | ||
811 | static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" }; | ||
812 | |||
813 | void netxen_request_firmware(struct netxen_adapter *adapter) | 890 | void netxen_request_firmware(struct netxen_adapter *adapter) |
814 | { | 891 | { |
815 | u32 capability, flashed_ver; | 892 | u32 capability, flashed_ver; |
816 | int fw_type; | 893 | u8 fw_type; |
817 | struct pci_dev *pdev = adapter->pdev; | 894 | struct pci_dev *pdev = adapter->pdev; |
818 | int rc = 0; | 895 | int rc = 0; |
819 | 896 | ||
@@ -830,6 +907,8 @@ request_mn: | |||
830 | 907 | ||
831 | netxen_rom_fast_read(adapter, | 908 | netxen_rom_fast_read(adapter, |
832 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); | 909 | NX_FW_VERSION_OFFSET, (int *)&flashed_ver); |
910 | flashed_ver = NETXEN_DECODE_VERSION(flashed_ver); | ||
911 | |||
833 | if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) { | 912 | if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) { |
834 | capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY); | 913 | capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY); |
835 | if (capability & NX_PEG_TUNE_MN_PRESENT) { | 914 | if (capability & NX_PEG_TUNE_MN_PRESENT) { |
@@ -838,6 +917,10 @@ request_mn: | |||
838 | } | 917 | } |
839 | } | 918 | } |
840 | 919 | ||
920 | fw_type = NX_FLASH_ROMIMAGE; | ||
921 | adapter->fw = NULL; | ||
922 | goto done; | ||
923 | |||
841 | request_fw: | 924 | request_fw: |
842 | rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev); | 925 | rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev); |
843 | if (rc != 0) { | 926 | if (rc != 0) { |
@@ -846,6 +929,7 @@ request_fw: | |||
846 | goto request_mn; | 929 | goto request_mn; |
847 | } | 930 | } |
848 | 931 | ||
932 | fw_type = NX_FLASH_ROMIMAGE; | ||
849 | adapter->fw = NULL; | 933 | adapter->fw = NULL; |
850 | goto done; | 934 | goto done; |
851 | } | 935 | } |
@@ -859,16 +943,13 @@ request_fw: | |||
859 | goto request_mn; | 943 | goto request_mn; |
860 | } | 944 | } |
861 | 945 | ||
946 | fw_type = NX_FLASH_ROMIMAGE; | ||
862 | adapter->fw = NULL; | 947 | adapter->fw = NULL; |
863 | goto done; | 948 | goto done; |
864 | } | 949 | } |
865 | 950 | ||
866 | done: | 951 | done: |
867 | if (adapter->fw) | 952 | 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 | } | 953 | } |
873 | 954 | ||
874 | 955 | ||
@@ -1327,10 +1408,10 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter) | |||
1327 | smp_mb(); | 1408 | smp_mb(); |
1328 | 1409 | ||
1329 | if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) { | 1410 | if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) { |
1330 | netif_tx_lock(netdev); | 1411 | __netif_tx_lock(tx_ring->txq, smp_processor_id()); |
1331 | if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH) | 1412 | if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH) |
1332 | netif_wake_queue(netdev); | 1413 | netif_wake_queue(netdev); |
1333 | netif_tx_unlock(netdev); | 1414 | __netif_tx_unlock(tx_ring->txq); |
1334 | } | 1415 | } |
1335 | } | 1416 | } |
1336 | /* | 1417 | /* |