diff options
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 20 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ctx.c | 13 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hdr.h | 1 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 9 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 123 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 77 |
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); | |||
1387 | int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); | 1402 | int netxen_initialize_adapter_offload(struct netxen_adapter *adapter); |
1388 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); | 1403 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); |
1389 | int netxen_load_firmware(struct netxen_adapter *adapter); | 1404 | int netxen_load_firmware(struct netxen_adapter *adapter); |
1405 | int netxen_need_fw_reset(struct netxen_adapter *adapter); | ||
1390 | void netxen_request_firmware(struct netxen_adapter *adapter); | 1406 | void netxen_request_firmware(struct netxen_adapter *adapter); |
1391 | void netxen_release_firmware(struct netxen_adapter *adapter); | 1407 | void netxen_release_firmware(struct netxen_adapter *adapter); |
1392 | int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); | 1408 | int 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 | ||
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 | /* |
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 | ||
224 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | 224 | static 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 | |||
256 | nx_update_dma_mask(struct netxen_adapter *adapter) | 254 | nx_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 | |||
292 | err_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 | ||
285 | static void netxen_check_options(struct netxen_adapter *adapter) | 298 | static 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) | |||
847 | static void | 864 | static void |
848 | netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev) | 865 | netxen_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: | |||
939 | static void | 958 | static void |
940 | netxen_nic_detach(struct netxen_adapter *adapter) | 959 | netxen_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; |