aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r--drivers/net/netxen/netxen_nic.h20
-rw-r--r--drivers/net/netxen/netxen_nic_ctx.c13
-rw-r--r--drivers/net/netxen/netxen_nic_hdr.h1
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c9
-rw-r--r--drivers/net/netxen/netxen_nic_init.c123
-rw-r--r--drivers/net/netxen/netxen_nic_main.c77
6 files changed, 184 insertions, 59 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 970cedeb5f3..f86e05047d1 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)
@@ -199,6 +210,7 @@
199#define NETXEN_CTX_SIGNATURE 0xdee0 210#define NETXEN_CTX_SIGNATURE 0xdee0
200#define NETXEN_CTX_SIGNATURE_V2 0x0002dee0 211#define NETXEN_CTX_SIGNATURE_V2 0x0002dee0
201#define NETXEN_CTX_RESET 0xbad0 212#define NETXEN_CTX_RESET 0xbad0
213#define NETXEN_CTX_D3_RESET 0xacc0
202#define NETXEN_RCV_PRODUCER(ringid) (ringid) 214#define NETXEN_RCV_PRODUCER(ringid) (ringid)
203 215
204#define PHAN_PEG_RCV_INITIALIZED 0xff01 216#define PHAN_PEG_RCV_INITIALIZED 0xff01
@@ -614,6 +626,7 @@ struct netxen_new_user_info {
614#define NX_P2_MN_ROMIMAGE 0 626#define NX_P2_MN_ROMIMAGE 0
615#define NX_P3_CT_ROMIMAGE 1 627#define NX_P3_CT_ROMIMAGE 1
616#define NX_P3_MN_ROMIMAGE 2 628#define NX_P3_MN_ROMIMAGE 2
629#define NX_FLASH_ROMIMAGE 3
617 630
618#define NETXEN_USER_START_OLD NETXEN_PXE_START /* for backward compatibility */ 631#define NETXEN_USER_START_OLD NETXEN_PXE_START /* for backward compatibility */
619 632
@@ -761,6 +774,8 @@ struct nx_host_tx_ring {
761 u32 crb_cmd_consumer; 774 u32 crb_cmd_consumer;
762 u32 num_desc; 775 u32 num_desc;
763 776
777 struct netdev_queue *txq;
778
764 struct netxen_cmd_buffer *cmd_buf_arr; 779 struct netxen_cmd_buffer *cmd_buf_arr;
765 struct cmd_desc_type0 *desc_head; 780 struct cmd_desc_type0 *desc_head;
766 dma_addr_t phys_addr; 781 dma_addr_t phys_addr;
@@ -1243,7 +1258,7 @@ struct netxen_adapter {
1243 u32 resv3; 1258 u32 resv3;
1244 1259
1245 u8 has_link_events; 1260 u8 has_link_events;
1246 u8 resv1; 1261 u8 fw_type;
1247 u16 tx_context_id; 1262 u16 tx_context_id;
1248 u16 mtu; 1263 u16 mtu;
1249 u16 is_up; 1264 u16 is_up;
@@ -1387,6 +1402,7 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter);
1387int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); 1402int netxen_initialize_adapter_offload(struct netxen_adapter *adapter);
1388int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); 1403int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
1389int netxen_load_firmware(struct netxen_adapter *adapter); 1404int netxen_load_firmware(struct netxen_adapter *adapter);
1405int netxen_need_fw_reset(struct netxen_adapter *adapter);
1390void netxen_request_firmware(struct netxen_adapter *adapter); 1406void netxen_request_firmware(struct netxen_adapter *adapter);
1391void netxen_release_firmware(struct netxen_adapter *adapter); 1407void netxen_release_firmware(struct netxen_adapter *adapter);
1392int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); 1408int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose);
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c
index 4754f5cffad..9f8ae4719e2 100644
--- a/drivers/net/netxen/netxen_nic_ctx.c
+++ b/drivers/net/netxen/netxen_nic_ctx.c
@@ -684,10 +684,8 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
684 goto err_out_free; 684 goto err_out_free;
685 } else { 685 } else {
686 err = netxen_init_old_ctx(adapter); 686 err = netxen_init_old_ctx(adapter);
687 if (err) { 687 if (err)
688 netxen_free_hw_resources(adapter); 688 goto err_out_free;
689 return err;
690 }
691 } 689 }
692 690
693 return 0; 691 return 0;
@@ -708,15 +706,18 @@ void netxen_free_hw_resources(struct netxen_adapter *adapter)
708 int port = adapter->portnum; 706 int port = adapter->portnum;
709 707
710 if (adapter->fw_major >= 4) { 708 if (adapter->fw_major >= 4) {
711 nx_fw_cmd_destroy_tx_ctx(adapter);
712 nx_fw_cmd_destroy_rx_ctx(adapter); 709 nx_fw_cmd_destroy_rx_ctx(adapter);
710 nx_fw_cmd_destroy_tx_ctx(adapter);
713 } else { 711 } else {
714 netxen_api_lock(adapter); 712 netxen_api_lock(adapter);
715 NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port), 713 NXWR32(adapter, CRB_CTX_SIGNATURE_REG(port),
716 NETXEN_CTX_RESET | port); 714 NETXEN_CTX_D3_RESET | port);
717 netxen_api_unlock(adapter); 715 netxen_api_unlock(adapter);
718 } 716 }
719 717
718 /* Allow dma queues to drain after context reset */
719 msleep(20);
720
720 recv_ctx = &adapter->recv_ctx; 721 recv_ctx = &adapter->recv_ctx;
721 722
722 if (recv_ctx->hwctx != NULL) { 723 if (recv_ctx->hwctx != NULL) {
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h
index 3cc047844af..82410367564 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_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index ce3b89d2cbb..b9123d445c9 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -461,13 +461,14 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
461 i = 0; 461 i = 0;
462 462
463 tx_ring = adapter->tx_ring; 463 tx_ring = adapter->tx_ring;
464 netif_tx_lock_bh(adapter->netdev); 464 __netif_tx_lock_bh(tx_ring->txq);
465 465
466 producer = tx_ring->producer; 466 producer = tx_ring->producer;
467 consumer = tx_ring->sw_consumer; 467 consumer = tx_ring->sw_consumer;
468 468
469 if (nr_desc >= find_diff_among(producer, consumer, tx_ring->num_desc)) { 469 if (nr_desc >= netxen_tx_avail(tx_ring)) {
470 netif_tx_unlock_bh(adapter->netdev); 470 netif_tx_stop_queue(tx_ring->txq);
471 __netif_tx_unlock_bh(tx_ring->txq);
471 return -EBUSY; 472 return -EBUSY;
472 } 473 }
473 474
@@ -490,7 +491,7 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
490 491
491 netxen_nic_update_cmd_producer(adapter, tx_ring); 492 netxen_nic_update_cmd_producer(adapter, tx_ring);
492 493
493 netif_tx_unlock_bh(adapter->netdev); 494 __netif_tx_unlock_bh(tx_ring->txq);
494 495
495 return 0; 496 return 0;
496} 497}
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 055bb61d6e7..7acf204e38c 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 /*
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index 2919a2d12bf..3cd8cfcf627 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -215,13 +215,13 @@ netxen_napi_disable(struct netxen_adapter *adapter)
215 215
216 for (ring = 0; ring < adapter->max_sds_rings; ring++) { 216 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
217 sds_ring = &recv_ctx->sds_rings[ring]; 217 sds_ring = &recv_ctx->sds_rings[ring];
218 napi_disable(&sds_ring->napi);
219 netxen_nic_disable_int(sds_ring); 218 netxen_nic_disable_int(sds_ring);
220 synchronize_irq(sds_ring->irq); 219 napi_synchronize(&sds_ring->napi);
220 napi_disable(&sds_ring->napi);
221 } 221 }
222} 222}
223 223
224static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) 224static int nx_set_dma_mask(struct netxen_adapter *adapter)
225{ 225{
226 struct pci_dev *pdev = adapter->pdev; 226 struct pci_dev *pdev = adapter->pdev;
227 uint64_t mask, cmask; 227 uint64_t mask, cmask;
@@ -229,19 +229,17 @@ static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id)
229 adapter->pci_using_dac = 0; 229 adapter->pci_using_dac = 0;
230 230
231 mask = DMA_BIT_MASK(32); 231 mask = DMA_BIT_MASK(32);
232 /*
233 * Consistent DMA mask is set to 32 bit because it cannot be set to
234 * 35 bits. For P3 also leave it at 32 bits for now. Only the rings
235 * come off this pool.
236 */
237 cmask = DMA_BIT_MASK(32); 232 cmask = DMA_BIT_MASK(32);
238 233
234 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
239#ifndef CONFIG_IA64 235#ifndef CONFIG_IA64
240 if (revision_id >= NX_P3_B0)
241 mask = DMA_BIT_MASK(39);
242 else if (revision_id == NX_P2_C1)
243 mask = DMA_BIT_MASK(35); 236 mask = DMA_BIT_MASK(35);
244#endif 237#endif
238 } else {
239 mask = DMA_BIT_MASK(39);
240 cmask = mask;
241 }
242
245 if (pci_set_dma_mask(pdev, mask) == 0 && 243 if (pci_set_dma_mask(pdev, mask) == 0 &&
246 pci_set_consistent_dma_mask(pdev, cmask) == 0) { 244 pci_set_consistent_dma_mask(pdev, cmask) == 0) {
247 adapter->pci_using_dac = 1; 245 adapter->pci_using_dac = 1;
@@ -256,7 +254,7 @@ static int
256nx_update_dma_mask(struct netxen_adapter *adapter) 254nx_update_dma_mask(struct netxen_adapter *adapter)
257{ 255{
258 int change, shift, err; 256 int change, shift, err;
259 uint64_t mask, old_mask; 257 uint64_t mask, old_mask, old_cmask;
260 struct pci_dev *pdev = adapter->pdev; 258 struct pci_dev *pdev = adapter->pdev;
261 259
262 change = 0; 260 change = 0;
@@ -272,14 +270,29 @@ nx_update_dma_mask(struct netxen_adapter *adapter)
272 270
273 if (change) { 271 if (change) {
274 old_mask = pdev->dma_mask; 272 old_mask = pdev->dma_mask;
273 old_cmask = pdev->dev.coherent_dma_mask;
274
275 mask = (1ULL<<(32+shift)) - 1; 275 mask = (1ULL<<(32+shift)) - 1;
276 276
277 err = pci_set_dma_mask(pdev, mask); 277 err = pci_set_dma_mask(pdev, mask);
278 if (err) 278 if (err)
279 return pci_set_dma_mask(pdev, old_mask); 279 goto err_out;
280
281 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
282
283 err = pci_set_consistent_dma_mask(pdev, mask);
284 if (err)
285 goto err_out;
286 }
287 dev_info(&pdev->dev, "using %d-bit dma mask\n", 32+shift);
280 } 288 }
281 289
282 return 0; 290 return 0;
291
292err_out:
293 pci_set_dma_mask(pdev, old_mask);
294 pci_set_consistent_dma_mask(pdev, old_cmask);
295 return err;
283} 296}
284 297
285static void netxen_check_options(struct netxen_adapter *adapter) 298static void netxen_check_options(struct netxen_adapter *adapter)
@@ -718,6 +731,10 @@ netxen_start_firmware(struct netxen_adapter *adapter, int request_fw)
718 if (request_fw) 731 if (request_fw)
719 netxen_request_firmware(adapter); 732 netxen_request_firmware(adapter);
720 733
734 err = netxen_need_fw_reset(adapter);
735 if (err <= 0)
736 return err;
737
721 if (first_boot != 0x55555555) { 738 if (first_boot != 0x55555555) {
722 NXWR32(adapter, CRB_CMDPEG_STATE, 0); 739 NXWR32(adapter, CRB_CMDPEG_STATE, 0);
723 netxen_pinit_from_rom(adapter, 0); 740 netxen_pinit_from_rom(adapter, 0);
@@ -829,11 +846,11 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
829 846
830 adapter->ahw.linkup = 0; 847 adapter->ahw.linkup = 0;
831 848
832 netxen_napi_enable(adapter);
833
834 if (adapter->max_sds_rings > 1) 849 if (adapter->max_sds_rings > 1)
835 netxen_config_rss(adapter, 1); 850 netxen_config_rss(adapter, 1);
836 851
852 netxen_napi_enable(adapter);
853
837 if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION) 854 if (adapter->capabilities & NX_FW_CAPABILITY_LINK_NOTIFICATION)
838 netxen_linkevent_request(adapter, 1); 855 netxen_linkevent_request(adapter, 1);
839 else 856 else
@@ -847,8 +864,9 @@ netxen_nic_up(struct netxen_adapter *adapter, struct net_device *netdev)
847static void 864static void
848netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) 865netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
849{ 866{
867 spin_lock(&adapter->tx_clean_lock);
850 netif_carrier_off(netdev); 868 netif_carrier_off(netdev);
851 netif_stop_queue(netdev); 869 netif_tx_disable(netdev);
852 870
853 if (adapter->stop_port) 871 if (adapter->stop_port)
854 adapter->stop_port(adapter); 872 adapter->stop_port(adapter);
@@ -859,9 +877,10 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
859 netxen_napi_disable(adapter); 877 netxen_napi_disable(adapter);
860 878
861 netxen_release_tx_buffers(adapter); 879 netxen_release_tx_buffers(adapter);
880 spin_unlock(&adapter->tx_clean_lock);
862 881
863 FLUSH_SCHEDULED_WORK();
864 del_timer_sync(&adapter->watchdog_timer); 882 del_timer_sync(&adapter->watchdog_timer);
883 FLUSH_SCHEDULED_WORK();
865} 884}
866 885
867 886
@@ -939,8 +958,8 @@ err_out_free_sw:
939static void 958static void
940netxen_nic_detach(struct netxen_adapter *adapter) 959netxen_nic_detach(struct netxen_adapter *adapter)
941{ 960{
942 netxen_release_rx_buffers(adapter);
943 netxen_free_hw_resources(adapter); 961 netxen_free_hw_resources(adapter);
962 netxen_release_rx_buffers(adapter);
944 netxen_nic_free_irq(adapter); 963 netxen_nic_free_irq(adapter);
945 netxen_free_sw_resources(adapter); 964 netxen_free_sw_resources(adapter);
946 965
@@ -1000,7 +1019,7 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1000 revision_id = pdev->revision; 1019 revision_id = pdev->revision;
1001 adapter->ahw.revision_id = revision_id; 1020 adapter->ahw.revision_id = revision_id;
1002 1021
1003 err = nx_set_dma_mask(adapter, revision_id); 1022 err = nx_set_dma_mask(adapter);
1004 if (err) 1023 if (err)
1005 goto err_out_free_netdev; 1024 goto err_out_free_netdev;
1006 1025
@@ -1529,10 +1548,12 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1529 printk(KERN_ALERT 1548 printk(KERN_ALERT
1530 "%s: Device temperature %d degrees C exceeds" 1549 "%s: Device temperature %d degrees C exceeds"
1531 " maximum allowed. Hardware has been shut down.\n", 1550 " maximum allowed. Hardware has been shut down.\n",
1532 netxen_nic_driver_name, temp_val); 1551 netdev->name, temp_val);
1552
1553 netif_device_detach(netdev);
1554 netxen_nic_down(adapter, netdev);
1555 netxen_nic_detach(adapter);
1533 1556
1534 netif_carrier_off(netdev);
1535 netif_stop_queue(netdev);
1536 rv = 1; 1557 rv = 1;
1537 } else if (temp_state == NX_TEMP_WARN) { 1558 } else if (temp_state == NX_TEMP_WARN) {
1538 if (adapter->temp == NX_TEMP_NORMAL) { 1559 if (adapter->temp == NX_TEMP_NORMAL) {
@@ -1540,13 +1561,13 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
1540 "%s: Device temperature %d degrees C " 1561 "%s: Device temperature %d degrees C "
1541 "exceeds operating range." 1562 "exceeds operating range."
1542 " Immediate action needed.\n", 1563 " Immediate action needed.\n",
1543 netxen_nic_driver_name, temp_val); 1564 netdev->name, temp_val);
1544 } 1565 }
1545 } else { 1566 } else {
1546 if (adapter->temp == NX_TEMP_WARN) { 1567 if (adapter->temp == NX_TEMP_WARN) {
1547 printk(KERN_INFO 1568 printk(KERN_INFO
1548 "%s: Device temperature is now %d degrees C" 1569 "%s: Device temperature is now %d degrees C"
1549 " in normal range.\n", netxen_nic_driver_name, 1570 " in normal range.\n", netdev->name,
1550 temp_val); 1571 temp_val);
1551 } 1572 }
1552 } 1573 }
@@ -1619,7 +1640,7 @@ void netxen_watchdog_task(struct work_struct *work)
1619 struct netxen_adapter *adapter = 1640 struct netxen_adapter *adapter =
1620 container_of(work, struct netxen_adapter, watchdog_task); 1641 container_of(work, struct netxen_adapter, watchdog_task);
1621 1642
1622 if ((adapter->portnum == 0) && netxen_nic_check_temp(adapter)) 1643 if (netxen_nic_check_temp(adapter))
1623 return; 1644 return;
1624 1645
1625 if (!adapter->has_link_events) 1646 if (!adapter->has_link_events)
@@ -1641,6 +1662,9 @@ static void netxen_tx_timeout_task(struct work_struct *work)
1641 struct netxen_adapter *adapter = 1662 struct netxen_adapter *adapter =
1642 container_of(work, struct netxen_adapter, tx_timeout_task); 1663 container_of(work, struct netxen_adapter, tx_timeout_task);
1643 1664
1665 if (!netif_running(adapter->netdev))
1666 return;
1667
1644 printk(KERN_ERR "%s %s: transmit timeout, resetting.\n", 1668 printk(KERN_ERR "%s %s: transmit timeout, resetting.\n",
1645 netxen_nic_driver_name, adapter->netdev->name); 1669 netxen_nic_driver_name, adapter->netdev->name);
1646 1670
@@ -1753,7 +1777,8 @@ static int netxen_nic_poll(struct napi_struct *napi, int budget)
1753 1777
1754 if ((work_done < budget) && tx_complete) { 1778 if ((work_done < budget) && tx_complete) {
1755 napi_complete(&sds_ring->napi); 1779 napi_complete(&sds_ring->napi);
1756 netxen_nic_enable_int(sds_ring); 1780 if (netif_running(adapter->netdev))
1781 netxen_nic_enable_int(sds_ring);
1757 } 1782 }
1758 1783
1759 return work_done; 1784 return work_done;