aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen/netxen_nic_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen/netxen_nic_init.c')
-rw-r--r--drivers/net/netxen/netxen_nic_init.c123
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
186skip_rds: 186skip_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
193skip_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
686int 694int
695netxen_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
759static char *fw_name[] = {
760 "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash",
761};
762
763int
687netxen_load_firmware(struct netxen_adapter *adapter) 764netxen_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
756netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) 837netxen_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
811static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" };
812
813void netxen_request_firmware(struct netxen_adapter *adapter) 890void 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
841request_fw: 924request_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
866done: 951done:
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 /*