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.c116
1 files changed, 95 insertions, 21 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 055bb61d6e77..5d3343ef3d86 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -214,6 +214,7 @@ int netxen_alloc_sw_resources(struct netxen_adapter *adapter)
214 adapter->tx_ring = tx_ring; 214 adapter->tx_ring = tx_ring;
215 215
216 tx_ring->num_desc = adapter->num_txd; 216 tx_ring->num_desc = adapter->num_txd;
217 tx_ring->txq = netdev_get_tx_queue(netdev, 0);
217 218
218 cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring)); 219 cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring));
219 if (cmd_buf_arr == NULL) { 220 if (cmd_buf_arr == NULL) {
@@ -684,11 +685,84 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
684} 685}
685 686
686int 687int
688netxen_need_fw_reset(struct netxen_adapter *adapter)
689{
690 u32 count, old_count;
691 u32 val, version, major, minor, build;
692 int i, timeout;
693 u8 fw_type;
694
695 /* NX2031 firmware doesn't support heartbit */
696 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
697 return 1;
698
699 /* last attempt had failed */
700 if (NXRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED)
701 return 1;
702
703 old_count = count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
704
705 for (i = 0; i < 10; i++) {
706
707 timeout = msleep_interruptible(200);
708 if (timeout) {
709 NXWR32(adapter, CRB_CMDPEG_STATE,
710 PHAN_INITIALIZE_FAILED);
711 return -EINTR;
712 }
713
714 count = NXRD32(adapter, NETXEN_PEG_ALIVE_COUNTER);
715 if (count != old_count)
716 break;
717 }
718
719 /* firmware is dead */
720 if (count == old_count)
721 return 1;
722
723 /* check if we have got newer or different file firmware */
724 if (adapter->fw) {
725
726 const struct firmware *fw = adapter->fw;
727
728 val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]);
729 version = NETXEN_DECODE_VERSION(val);
730
731 major = NXRD32(adapter, NETXEN_FW_VERSION_MAJOR);
732 minor = NXRD32(adapter, NETXEN_FW_VERSION_MINOR);
733 build = NXRD32(adapter, NETXEN_FW_VERSION_SUB);
734
735 if (version > NETXEN_VERSION_CODE(major, minor, build))
736 return 1;
737
738 if (version == NETXEN_VERSION_CODE(major, minor, build)) {
739
740 val = NXRD32(adapter, NETXEN_MIU_MN_CONTROL);
741 fw_type = (val & 0x4) ?
742 NX_P3_CT_ROMIMAGE : NX_P3_MN_ROMIMAGE;
743
744 if (adapter->fw_type != fw_type)
745 return 1;
746 }
747 }
748
749 return 0;
750}
751
752static char *fw_name[] = {
753 "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin", "flash",
754};
755
756int
687netxen_load_firmware(struct netxen_adapter *adapter) 757netxen_load_firmware(struct netxen_adapter *adapter)
688{ 758{
689 u64 *ptr64; 759 u64 *ptr64;
690 u32 i, flashaddr, size; 760 u32 i, flashaddr, size;
691 const struct firmware *fw = adapter->fw; 761 const struct firmware *fw = adapter->fw;
762 struct pci_dev *pdev = adapter->pdev;
763
764 dev_info(&pdev->dev, "loading firmware from %s\n",
765 fw_name[adapter->fw_type]);
692 766
693 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) 767 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
694 NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1); 768 NXWR32(adapter, NETXEN_ROMUSB_GLB_CAS_RST, 1);
@@ -756,7 +830,7 @@ static int
756netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname) 830netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
757{ 831{
758 __le32 val; 832 __le32 val;
759 u32 major, minor, build, ver, min_ver, bios; 833 u32 ver, min_ver, bios;
760 struct pci_dev *pdev = adapter->pdev; 834 struct pci_dev *pdev = adapter->pdev;
761 const struct firmware *fw = adapter->fw; 835 const struct firmware *fw = adapter->fw;
762 836
@@ -768,21 +842,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
768 return -EINVAL; 842 return -EINVAL;
769 843
770 val = cpu_to_le32(*(u32 *)&fw->data[NX_FW_VERSION_OFFSET]); 844 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 845
775 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 846 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
776 min_ver = NETXEN_VERSION_CODE(4, 0, 216); 847 min_ver = NETXEN_VERSION_CODE(4, 0, 216);
777 else 848 else
778 min_ver = NETXEN_VERSION_CODE(3, 4, 216); 849 min_ver = NETXEN_VERSION_CODE(3, 4, 216);
779 850
780 ver = NETXEN_VERSION_CODE(major, minor, build); 851 ver = NETXEN_DECODE_VERSION(val);
781 852
782 if ((major > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { 853 if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) {
783 dev_err(&pdev->dev, 854 dev_err(&pdev->dev,
784 "%s: firmware version %d.%d.%d unsupported\n", 855 "%s: firmware version %d.%d.%d unsupported\n",
785 fwname, major, minor, build); 856 fwname, _major(ver), _minor(ver), _build(ver));
786 return -EINVAL; 857 return -EINVAL;
787 } 858 }
788 859
@@ -798,22 +869,21 @@ netxen_validate_firmware(struct netxen_adapter *adapter, const char *fwname)
798 if (netxen_rom_fast_read(adapter, 869 if (netxen_rom_fast_read(adapter,
799 NX_FW_VERSION_OFFSET, (int *)&val)) 870 NX_FW_VERSION_OFFSET, (int *)&val))
800 return -EIO; 871 return -EIO;
801 major = (__force u32)val & 0xff; 872 val = NETXEN_DECODE_VERSION(val);
802 minor = ((__force u32)val >> 8) & 0xff; 873 if (val > ver) {
803 build = (__force u32)val >> 16; 874 dev_info(&pdev->dev, "%s: firmware is older than flash\n",
804 if (NETXEN_VERSION_CODE(major, minor, build) > ver) 875 fwname);
805 return -EINVAL; 876 return -EINVAL;
877 }
806 878
807 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); 879 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
808 return 0; 880 return 0;
809} 881}
810 882
811static char *fw_name[] = { "nxromimg.bin", "nx3fwct.bin", "nx3fwmn.bin" };
812
813void netxen_request_firmware(struct netxen_adapter *adapter) 883void netxen_request_firmware(struct netxen_adapter *adapter)
814{ 884{
815 u32 capability, flashed_ver; 885 u32 capability, flashed_ver;
816 int fw_type; 886 u8 fw_type;
817 struct pci_dev *pdev = adapter->pdev; 887 struct pci_dev *pdev = adapter->pdev;
818 int rc = 0; 888 int rc = 0;
819 889
@@ -830,6 +900,8 @@ request_mn:
830 900
831 netxen_rom_fast_read(adapter, 901 netxen_rom_fast_read(adapter,
832 NX_FW_VERSION_OFFSET, (int *)&flashed_ver); 902 NX_FW_VERSION_OFFSET, (int *)&flashed_ver);
903 flashed_ver = NETXEN_DECODE_VERSION(flashed_ver);
904
833 if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) { 905 if (flashed_ver >= NETXEN_VERSION_CODE(4, 0, 220)) {
834 capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY); 906 capability = NXRD32(adapter, NX_PEG_TUNE_CAPABILITY);
835 if (capability & NX_PEG_TUNE_MN_PRESENT) { 907 if (capability & NX_PEG_TUNE_MN_PRESENT) {
@@ -838,6 +910,10 @@ request_mn:
838 } 910 }
839 } 911 }
840 912
913 fw_type = NX_FLASH_ROMIMAGE;
914 adapter->fw = NULL;
915 goto done;
916
841request_fw: 917request_fw:
842 rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev); 918 rc = request_firmware(&adapter->fw, fw_name[fw_type], &pdev->dev);
843 if (rc != 0) { 919 if (rc != 0) {
@@ -846,6 +922,7 @@ request_fw:
846 goto request_mn; 922 goto request_mn;
847 } 923 }
848 924
925 fw_type = NX_FLASH_ROMIMAGE;
849 adapter->fw = NULL; 926 adapter->fw = NULL;
850 goto done; 927 goto done;
851 } 928 }
@@ -859,16 +936,13 @@ request_fw:
859 goto request_mn; 936 goto request_mn;
860 } 937 }
861 938
939 fw_type = NX_FLASH_ROMIMAGE;
862 adapter->fw = NULL; 940 adapter->fw = NULL;
863 goto done; 941 goto done;
864 } 942 }
865 943
866done: 944done:
867 if (adapter->fw) 945 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} 946}
873 947
874 948
@@ -1327,10 +1401,10 @@ int netxen_process_cmd_ring(struct netxen_adapter *adapter)
1327 smp_mb(); 1401 smp_mb();
1328 1402
1329 if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) { 1403 if (netif_queue_stopped(netdev) && netif_carrier_ok(netdev)) {
1330 netif_tx_lock(netdev); 1404 __netif_tx_lock(tx_ring->txq, smp_processor_id());
1331 if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH) 1405 if (netxen_tx_avail(tx_ring) > TX_STOP_THRESH)
1332 netif_wake_queue(netdev); 1406 netif_wake_queue(netdev);
1333 netif_tx_unlock(netdev); 1407 __netif_tx_unlock(tx_ring->txq);
1334 } 1408 }
1335 } 1409 }
1336 /* 1410 /*