diff options
| -rw-r--r-- | drivers/net/s2io.c | 386 | ||||
| -rw-r--r-- | drivers/net/s2io.h | 30 |
2 files changed, 208 insertions, 208 deletions
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c index 1dcda887cef7..078a49e85936 100644 --- a/drivers/net/s2io.c +++ b/drivers/net/s2io.c | |||
| @@ -223,9 +223,7 @@ static void s2io_vlan_rx_kill_vid(struct net_device *dev, unsigned long vid) | |||
| 223 | * the XAUI. | 223 | * the XAUI. |
| 224 | */ | 224 | */ |
| 225 | 225 | ||
| 226 | #define SWITCH_SIGN 0xA5A5A5A5A5A5A5A5ULL | ||
| 227 | #define END_SIGN 0x0 | 226 | #define END_SIGN 0x0 |
| 228 | |||
| 229 | static const u64 herc_act_dtx_cfg[] = { | 227 | static const u64 herc_act_dtx_cfg[] = { |
| 230 | /* Set address */ | 228 | /* Set address */ |
| 231 | 0x8000051536750000ULL, 0x80000515367500E0ULL, | 229 | 0x8000051536750000ULL, 0x80000515367500E0ULL, |
| @@ -247,37 +245,19 @@ static const u64 herc_act_dtx_cfg[] = { | |||
| 247 | END_SIGN | 245 | END_SIGN |
| 248 | }; | 246 | }; |
| 249 | 247 | ||
| 250 | static const u64 xena_mdio_cfg[] = { | ||
| 251 | /* Reset PMA PLL */ | ||
| 252 | 0xC001010000000000ULL, 0xC0010100000000E0ULL, | ||
| 253 | 0xC0010100008000E4ULL, | ||
| 254 | /* Remove Reset from PMA PLL */ | ||
| 255 | 0xC001010000000000ULL, 0xC0010100000000E0ULL, | ||
| 256 | 0xC0010100000000E4ULL, | ||
| 257 | END_SIGN | ||
| 258 | }; | ||
| 259 | |||
| 260 | static const u64 xena_dtx_cfg[] = { | 248 | static const u64 xena_dtx_cfg[] = { |
| 249 | /* Set address */ | ||
| 261 | 0x8000051500000000ULL, 0x80000515000000E0ULL, | 250 | 0x8000051500000000ULL, 0x80000515000000E0ULL, |
| 262 | 0x80000515D93500E4ULL, 0x8001051500000000ULL, | 251 | /* Write data */ |
| 263 | 0x80010515000000E0ULL, 0x80010515001E00E4ULL, | 252 | 0x80000515D9350004ULL, 0x80000515D93500E4ULL, |
| 264 | 0x8002051500000000ULL, 0x80020515000000E0ULL, | 253 | /* Set address */ |
| 265 | 0x80020515F21000E4ULL, | 254 | 0x8001051500000000ULL, 0x80010515000000E0ULL, |
| 266 | /* Set PADLOOPBACKN */ | 255 | /* Write data */ |
| 267 | 0x8002051500000000ULL, 0x80020515000000E0ULL, | 256 | 0x80010515001E0004ULL, 0x80010515001E00E4ULL, |
| 268 | 0x80020515B20000E4ULL, 0x8003051500000000ULL, | 257 | /* Set address */ |
| 269 | 0x80030515000000E0ULL, 0x80030515B20000E4ULL, | ||
| 270 | 0x8004051500000000ULL, 0x80040515000000E0ULL, | ||
| 271 | 0x80040515B20000E4ULL, 0x8005051500000000ULL, | ||
| 272 | 0x80050515000000E0ULL, 0x80050515B20000E4ULL, | ||
| 273 | SWITCH_SIGN, | ||
| 274 | /* Remove PADLOOPBACKN */ | ||
| 275 | 0x8002051500000000ULL, 0x80020515000000E0ULL, | 258 | 0x8002051500000000ULL, 0x80020515000000E0ULL, |
| 276 | 0x80020515F20000E4ULL, 0x8003051500000000ULL, | 259 | /* Write data */ |
| 277 | 0x80030515000000E0ULL, 0x80030515F20000E4ULL, | 260 | 0x80020515F2100004ULL, 0x80020515F21000E4ULL, |
| 278 | 0x8004051500000000ULL, 0x80040515000000E0ULL, | ||
| 279 | 0x80040515F20000E4ULL, 0x8005051500000000ULL, | ||
| 280 | 0x80050515000000E0ULL, 0x80050515F20000E4ULL, | ||
| 281 | END_SIGN | 261 | END_SIGN |
| 282 | }; | 262 | }; |
| 283 | 263 | ||
| @@ -552,11 +532,6 @@ static int init_shared_mem(struct s2io_nic *nic) | |||
| 552 | rx_blocks->block_dma_addr + | 532 | rx_blocks->block_dma_addr + |
| 553 | (rxd_size[nic->rxd_mode] * l); | 533 | (rxd_size[nic->rxd_mode] * l); |
| 554 | } | 534 | } |
| 555 | |||
| 556 | mac_control->rings[i].rx_blocks[j].block_virt_addr = | ||
| 557 | tmp_v_addr; | ||
| 558 | mac_control->rings[i].rx_blocks[j].block_dma_addr = | ||
| 559 | tmp_p_addr; | ||
| 560 | } | 535 | } |
| 561 | /* Interlinking all Rx Blocks */ | 536 | /* Interlinking all Rx Blocks */ |
| 562 | for (j = 0; j < blk_cnt; j++) { | 537 | for (j = 0; j < blk_cnt; j++) { |
| @@ -775,7 +750,21 @@ static int s2io_verify_pci_mode(nic_t *nic) | |||
| 775 | return mode; | 750 | return mode; |
| 776 | } | 751 | } |
| 777 | 752 | ||
| 753 | #define NEC_VENID 0x1033 | ||
| 754 | #define NEC_DEVID 0x0125 | ||
| 755 | static int s2io_on_nec_bridge(struct pci_dev *s2io_pdev) | ||
| 756 | { | ||
| 757 | struct pci_dev *tdev = NULL; | ||
| 758 | while ((tdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, tdev)) != NULL) { | ||
| 759 | if ((tdev->vendor == NEC_VENID) && (tdev->device == NEC_DEVID)){ | ||
| 760 | if (tdev->bus == s2io_pdev->bus->parent) | ||
| 761 | return 1; | ||
| 762 | } | ||
| 763 | } | ||
| 764 | return 0; | ||
| 765 | } | ||
| 778 | 766 | ||
| 767 | int bus_speed[8] = {33, 133, 133, 200, 266, 133, 200, 266}; | ||
| 779 | /** | 768 | /** |
| 780 | * s2io_print_pci_mode - | 769 | * s2io_print_pci_mode - |
| 781 | */ | 770 | */ |
| @@ -792,6 +781,14 @@ static int s2io_print_pci_mode(nic_t *nic) | |||
| 792 | if ( val64 & PCI_MODE_UNKNOWN_MODE) | 781 | if ( val64 & PCI_MODE_UNKNOWN_MODE) |
| 793 | return -1; /* Unknown PCI mode */ | 782 | return -1; /* Unknown PCI mode */ |
| 794 | 783 | ||
| 784 | config->bus_speed = bus_speed[mode]; | ||
| 785 | |||
| 786 | if (s2io_on_nec_bridge(nic->pdev)) { | ||
| 787 | DBG_PRINT(ERR_DBG, "%s: Device is on PCI-E bus\n", | ||
| 788 | nic->dev->name); | ||
| 789 | return mode; | ||
| 790 | } | ||
| 791 | |||
| 795 | if (val64 & PCI_MODE_32_BITS) { | 792 | if (val64 & PCI_MODE_32_BITS) { |
| 796 | DBG_PRINT(ERR_DBG, "%s: Device is on 32 bit ", nic->dev->name); | 793 | DBG_PRINT(ERR_DBG, "%s: Device is on 32 bit ", nic->dev->name); |
| 797 | } else { | 794 | } else { |
| @@ -801,35 +798,27 @@ static int s2io_print_pci_mode(nic_t *nic) | |||
| 801 | switch(mode) { | 798 | switch(mode) { |
| 802 | case PCI_MODE_PCI_33: | 799 | case PCI_MODE_PCI_33: |
| 803 | DBG_PRINT(ERR_DBG, "33MHz PCI bus\n"); | 800 | DBG_PRINT(ERR_DBG, "33MHz PCI bus\n"); |
| 804 | config->bus_speed = 33; | ||
| 805 | break; | 801 | break; |
| 806 | case PCI_MODE_PCI_66: | 802 | case PCI_MODE_PCI_66: |
| 807 | DBG_PRINT(ERR_DBG, "66MHz PCI bus\n"); | 803 | DBG_PRINT(ERR_DBG, "66MHz PCI bus\n"); |
| 808 | config->bus_speed = 133; | ||
| 809 | break; | 804 | break; |
| 810 | case PCI_MODE_PCIX_M1_66: | 805 | case PCI_MODE_PCIX_M1_66: |
| 811 | DBG_PRINT(ERR_DBG, "66MHz PCIX(M1) bus\n"); | 806 | DBG_PRINT(ERR_DBG, "66MHz PCIX(M1) bus\n"); |
| 812 | config->bus_speed = 133; /* Herc doubles the clock rate */ | ||
| 813 | break; | 807 | break; |
| 814 | case PCI_MODE_PCIX_M1_100: | 808 | case PCI_MODE_PCIX_M1_100: |
| 815 | DBG_PRINT(ERR_DBG, "100MHz PCIX(M1) bus\n"); | 809 | DBG_PRINT(ERR_DBG, "100MHz PCIX(M1) bus\n"); |
| 816 | config->bus_speed = 200; | ||
| 817 | break; | 810 | break; |
| 818 | case PCI_MODE_PCIX_M1_133: | 811 | case PCI_MODE_PCIX_M1_133: |
| 819 | DBG_PRINT(ERR_DBG, "133MHz PCIX(M1) bus\n"); | 812 | DBG_PRINT(ERR_DBG, "133MHz PCIX(M1) bus\n"); |
| 820 | config->bus_speed = 266; | ||
| 821 | break; | 813 | break; |
| 822 | case PCI_MODE_PCIX_M2_66: | 814 | case PCI_MODE_PCIX_M2_66: |
| 823 | DBG_PRINT(ERR_DBG, "133MHz PCIX(M2) bus\n"); | 815 | DBG_PRINT(ERR_DBG, "133MHz PCIX(M2) bus\n"); |
| 824 | config->bus_speed = 133; | ||
| 825 | break; | 816 | break; |
| 826 | case PCI_MODE_PCIX_M2_100: | 817 | case PCI_MODE_PCIX_M2_100: |
| 827 | DBG_PRINT(ERR_DBG, "200MHz PCIX(M2) bus\n"); | 818 | DBG_PRINT(ERR_DBG, "200MHz PCIX(M2) bus\n"); |
| 828 | config->bus_speed = 200; | ||
| 829 | break; | 819 | break; |
| 830 | case PCI_MODE_PCIX_M2_133: | 820 | case PCI_MODE_PCIX_M2_133: |
| 831 | DBG_PRINT(ERR_DBG, "266MHz PCIX(M2) bus\n"); | 821 | DBG_PRINT(ERR_DBG, "266MHz PCIX(M2) bus\n"); |
| 832 | config->bus_speed = 266; | ||
| 833 | break; | 822 | break; |
| 834 | default: | 823 | default: |
| 835 | return -1; /* Unsupported bus speed */ | 824 | return -1; /* Unsupported bus speed */ |
| @@ -857,7 +846,7 @@ static int init_nic(struct s2io_nic *nic) | |||
| 857 | int i, j; | 846 | int i, j; |
| 858 | mac_info_t *mac_control; | 847 | mac_info_t *mac_control; |
| 859 | struct config_param *config; | 848 | struct config_param *config; |
| 860 | int mdio_cnt = 0, dtx_cnt = 0; | 849 | int dtx_cnt = 0; |
| 861 | unsigned long long mem_share; | 850 | unsigned long long mem_share; |
| 862 | int mem_size; | 851 | int mem_size; |
| 863 | 852 | ||
| @@ -904,20 +893,6 @@ static int init_nic(struct s2io_nic *nic) | |||
| 904 | val64 = dev->mtu; | 893 | val64 = dev->mtu; |
| 905 | writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len); | 894 | writeq(vBIT(val64, 2, 14), &bar0->rmac_max_pyld_len); |
| 906 | 895 | ||
| 907 | /* | ||
| 908 | * Configuring the XAUI Interface of Xena. | ||
| 909 | * *************************************** | ||
| 910 | * To Configure the Xena's XAUI, one has to write a series | ||
| 911 | * of 64 bit values into two registers in a particular | ||
| 912 | * sequence. Hence a macro 'SWITCH_SIGN' has been defined | ||
| 913 | * which will be defined in the array of configuration values | ||
| 914 | * (xena_dtx_cfg & xena_mdio_cfg) at appropriate places | ||
| 915 | * to switch writing from one regsiter to another. We continue | ||
| 916 | * writing these values until we encounter the 'END_SIGN' macro. | ||
| 917 | * For example, After making a series of 21 writes into | ||
| 918 | * dtx_control register the 'SWITCH_SIGN' appears and hence we | ||
| 919 | * start writing into mdio_control until we encounter END_SIGN. | ||
| 920 | */ | ||
| 921 | if (nic->device_type & XFRAME_II_DEVICE) { | 896 | if (nic->device_type & XFRAME_II_DEVICE) { |
| 922 | while (herc_act_dtx_cfg[dtx_cnt] != END_SIGN) { | 897 | while (herc_act_dtx_cfg[dtx_cnt] != END_SIGN) { |
| 923 | SPECIAL_REG_WRITE(herc_act_dtx_cfg[dtx_cnt], | 898 | SPECIAL_REG_WRITE(herc_act_dtx_cfg[dtx_cnt], |
| @@ -927,35 +902,11 @@ static int init_nic(struct s2io_nic *nic) | |||
| 927 | dtx_cnt++; | 902 | dtx_cnt++; |
| 928 | } | 903 | } |
| 929 | } else { | 904 | } else { |
| 930 | while (1) { | 905 | while (xena_dtx_cfg[dtx_cnt] != END_SIGN) { |
| 931 | dtx_cfg: | 906 | SPECIAL_REG_WRITE(xena_dtx_cfg[dtx_cnt], |
| 932 | while (xena_dtx_cfg[dtx_cnt] != END_SIGN) { | 907 | &bar0->dtx_control, UF); |
| 933 | if (xena_dtx_cfg[dtx_cnt] == SWITCH_SIGN) { | 908 | val64 = readq(&bar0->dtx_control); |
| 934 | dtx_cnt++; | 909 | dtx_cnt++; |
| 935 | goto mdio_cfg; | ||
| 936 | } | ||
| 937 | SPECIAL_REG_WRITE(xena_dtx_cfg[dtx_cnt], | ||
| 938 | &bar0->dtx_control, UF); | ||
| 939 | val64 = readq(&bar0->dtx_control); | ||
| 940 | dtx_cnt++; | ||
| 941 | } | ||
| 942 | mdio_cfg: | ||
| 943 | while (xena_mdio_cfg[mdio_cnt] != END_SIGN) { | ||
| 944 | if (xena_mdio_cfg[mdio_cnt] == SWITCH_SIGN) { | ||
| 945 | mdio_cnt++; | ||
| 946 | goto dtx_cfg; | ||
| 947 | } | ||
| 948 | SPECIAL_REG_WRITE(xena_mdio_cfg[mdio_cnt], | ||
| 949 | &bar0->mdio_control, UF); | ||
| 950 | val64 = readq(&bar0->mdio_control); | ||
| 951 | mdio_cnt++; | ||
| 952 | } | ||
| 953 | if ((xena_dtx_cfg[dtx_cnt] == END_SIGN) && | ||
| 954 | (xena_mdio_cfg[mdio_cnt] == END_SIGN)) { | ||
| 955 | break; | ||
| 956 | } else { | ||
| 957 | goto dtx_cfg; | ||
| 958 | } | ||
| 959 | } | 910 | } |
| 960 | } | 911 | } |
| 961 | 912 | ||
| @@ -1565,11 +1516,9 @@ static int init_nic(struct s2io_nic *nic) | |||
| 1565 | val64 &= ~(BIT(13)|BIT(14)|BIT(15)); | 1516 | val64 &= ~(BIT(13)|BIT(14)|BIT(15)); |
| 1566 | writeq(val64, &bar0->pic_control2); | 1517 | writeq(val64, &bar0->pic_control2); |
| 1567 | } | 1518 | } |
| 1568 | 1519 | if (strstr(nic->product_name, "CX4")) { | |
| 1569 | /* Setting Link stability period to 64 ms */ | 1520 | val64 = TMAC_AVG_IPG(0x17); |
| 1570 | if (nic->device_type == XFRAME_II_DEVICE) { | 1521 | writeq(val64, &bar0->tmac_avg_ipg); |
| 1571 | val64 = MISC_LINK_STABILITY_PRD(3); | ||
| 1572 | writeq(val64, &bar0->misc_control); | ||
| 1573 | } | 1522 | } |
| 1574 | 1523 | ||
| 1575 | return SUCCESS; | 1524 | return SUCCESS; |
| @@ -2034,6 +1983,13 @@ static int start_nic(struct s2io_nic *nic) | |||
| 2034 | val64 |= ADAPTER_EOI_TX_ON; | 1983 | val64 |= ADAPTER_EOI_TX_ON; |
| 2035 | writeq(val64, &bar0->adapter_control); | 1984 | writeq(val64, &bar0->adapter_control); |
| 2036 | 1985 | ||
| 1986 | if (s2io_link_fault_indication(nic) == MAC_RMAC_ERR_TIMER) { | ||
| 1987 | /* | ||
| 1988 | * Dont see link state interrupts initally on some switches, | ||
| 1989 | * so directly scheduling the link state task here. | ||
| 1990 | */ | ||
| 1991 | schedule_work(&nic->set_link_task); | ||
| 1992 | } | ||
| 2037 | /* SXE-002: Initialize link and activity LED */ | 1993 | /* SXE-002: Initialize link and activity LED */ |
| 2038 | subid = nic->pdev->subsystem_device; | 1994 | subid = nic->pdev->subsystem_device; |
| 2039 | if (((subid & 0xFF) >= 0x07) && | 1995 | if (((subid & 0xFF) >= 0x07) && |
| @@ -2045,12 +2001,6 @@ static int start_nic(struct s2io_nic *nic) | |||
| 2045 | writeq(val64, (void __iomem *)bar0 + 0x2700); | 2001 | writeq(val64, (void __iomem *)bar0 + 0x2700); |
| 2046 | } | 2002 | } |
| 2047 | 2003 | ||
| 2048 | /* | ||
| 2049 | * Don't see link state interrupts on certain switches, so | ||
| 2050 | * directly scheduling a link state task from here. | ||
| 2051 | */ | ||
| 2052 | schedule_work(&nic->set_link_task); | ||
| 2053 | |||
| 2054 | return SUCCESS; | 2004 | return SUCCESS; |
| 2055 | } | 2005 | } |
| 2056 | /** | 2006 | /** |
| @@ -2569,7 +2519,8 @@ static int s2io_poll(struct net_device *dev, int *budget) | |||
| 2569 | } | 2519 | } |
| 2570 | } | 2520 | } |
| 2571 | /* Re enable the Rx interrupts. */ | 2521 | /* Re enable the Rx interrupts. */ |
| 2572 | en_dis_able_nic_intrs(nic, RX_TRAFFIC_INTR, ENABLE_INTRS); | 2522 | writeq(0x0, &bar0->rx_traffic_mask); |
| 2523 | val64 = readl(&bar0->rx_traffic_mask); | ||
| 2573 | atomic_dec(&nic->isr_cnt); | 2524 | atomic_dec(&nic->isr_cnt); |
| 2574 | return 0; | 2525 | return 0; |
| 2575 | 2526 | ||
| @@ -2881,23 +2832,26 @@ static void alarm_intr_handler(struct s2io_nic *nic) | |||
| 2881 | * SUCCESS on success and FAILURE on failure. | 2832 | * SUCCESS on success and FAILURE on failure. |
| 2882 | */ | 2833 | */ |
| 2883 | 2834 | ||
| 2884 | static int wait_for_cmd_complete(nic_t * sp) | 2835 | static int wait_for_cmd_complete(void *addr, u64 busy_bit) |
| 2885 | { | 2836 | { |
| 2886 | XENA_dev_config_t __iomem *bar0 = sp->bar0; | ||
| 2887 | int ret = FAILURE, cnt = 0; | 2837 | int ret = FAILURE, cnt = 0; |
| 2888 | u64 val64; | 2838 | u64 val64; |
| 2889 | 2839 | ||
| 2890 | while (TRUE) { | 2840 | while (TRUE) { |
| 2891 | val64 = readq(&bar0->rmac_addr_cmd_mem); | 2841 | val64 = readq(addr); |
| 2892 | if (!(val64 & RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { | 2842 | if (!(val64 & busy_bit)) { |
| 2893 | ret = SUCCESS; | 2843 | ret = SUCCESS; |
| 2894 | break; | 2844 | break; |
| 2895 | } | 2845 | } |
| 2896 | msleep(50); | 2846 | |
| 2847 | if(in_interrupt()) | ||
| 2848 | mdelay(50); | ||
| 2849 | else | ||
| 2850 | msleep(50); | ||
| 2851 | |||
| 2897 | if (cnt++ > 10) | 2852 | if (cnt++ > 10) |
| 2898 | break; | 2853 | break; |
| 2899 | } | 2854 | } |
| 2900 | |||
| 2901 | return ret; | 2855 | return ret; |
| 2902 | } | 2856 | } |
| 2903 | 2857 | ||
| @@ -2936,6 +2890,9 @@ static void s2io_reset(nic_t * sp) | |||
| 2936 | * PCI write to sw_reset register is done by this time. | 2890 | * PCI write to sw_reset register is done by this time. |
| 2937 | */ | 2891 | */ |
| 2938 | msleep(250); | 2892 | msleep(250); |
| 2893 | if (strstr(sp->product_name, "CX4")) { | ||
| 2894 | msleep(750); | ||
| 2895 | } | ||
| 2939 | 2896 | ||
| 2940 | /* Restore the PCI state saved during initialization. */ | 2897 | /* Restore the PCI state saved during initialization. */ |
| 2941 | pci_restore_state(sp->pdev); | 2898 | pci_restore_state(sp->pdev); |
| @@ -3154,7 +3111,7 @@ static void restore_xmsi_data(nic_t *nic) | |||
| 3154 | u64 val64; | 3111 | u64 val64; |
| 3155 | int i; | 3112 | int i; |
| 3156 | 3113 | ||
| 3157 | for (i=0; i< MAX_REQUESTED_MSI_X; i++) { | 3114 | for (i=0; i< nic->avail_msix_vectors; i++) { |
| 3158 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); | 3115 | writeq(nic->msix_info[i].addr, &bar0->xmsi_address); |
| 3159 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); | 3116 | writeq(nic->msix_info[i].data, &bar0->xmsi_data); |
| 3160 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); | 3117 | val64 = (BIT(7) | BIT(15) | vBIT(i, 26, 6)); |
| @@ -3173,7 +3130,7 @@ static void store_xmsi_data(nic_t *nic) | |||
| 3173 | int i; | 3130 | int i; |
| 3174 | 3131 | ||
| 3175 | /* Store and display */ | 3132 | /* Store and display */ |
| 3176 | for (i=0; i< MAX_REQUESTED_MSI_X; i++) { | 3133 | for (i=0; i< nic->avail_msix_vectors; i++) { |
| 3177 | val64 = (BIT(15) | vBIT(i, 26, 6)); | 3134 | val64 = (BIT(15) | vBIT(i, 26, 6)); |
| 3178 | writeq(val64, &bar0->xmsi_access); | 3135 | writeq(val64, &bar0->xmsi_access); |
| 3179 | if (wait_for_msix_trans(nic, i)) { | 3136 | if (wait_for_msix_trans(nic, i)) { |
| @@ -3301,15 +3258,24 @@ static int s2io_enable_msi_x(nic_t *nic) | |||
| 3301 | writeq(tx_mat, &bar0->tx_mat0_n[7]); | 3258 | writeq(tx_mat, &bar0->tx_mat0_n[7]); |
| 3302 | } | 3259 | } |
| 3303 | 3260 | ||
| 3261 | nic->avail_msix_vectors = 0; | ||
| 3304 | ret = pci_enable_msix(nic->pdev, nic->entries, MAX_REQUESTED_MSI_X); | 3262 | ret = pci_enable_msix(nic->pdev, nic->entries, MAX_REQUESTED_MSI_X); |
| 3263 | /* We fail init if error or we get less vectors than min required */ | ||
| 3264 | if (ret >= (nic->config.tx_fifo_num + nic->config.rx_ring_num + 1)) { | ||
| 3265 | nic->avail_msix_vectors = ret; | ||
| 3266 | ret = pci_enable_msix(nic->pdev, nic->entries, ret); | ||
| 3267 | } | ||
| 3305 | if (ret) { | 3268 | if (ret) { |
| 3306 | DBG_PRINT(ERR_DBG, "%s: Enabling MSIX failed\n", nic->dev->name); | 3269 | DBG_PRINT(ERR_DBG, "%s: Enabling MSIX failed\n", nic->dev->name); |
| 3307 | kfree(nic->entries); | 3270 | kfree(nic->entries); |
| 3308 | kfree(nic->s2io_entries); | 3271 | kfree(nic->s2io_entries); |
| 3309 | nic->entries = NULL; | 3272 | nic->entries = NULL; |
| 3310 | nic->s2io_entries = NULL; | 3273 | nic->s2io_entries = NULL; |
| 3274 | nic->avail_msix_vectors = 0; | ||
| 3311 | return -ENOMEM; | 3275 | return -ENOMEM; |
| 3312 | } | 3276 | } |
| 3277 | if (!nic->avail_msix_vectors) | ||
| 3278 | nic->avail_msix_vectors = MAX_REQUESTED_MSI_X; | ||
| 3313 | 3279 | ||
| 3314 | /* | 3280 | /* |
| 3315 | * To enable MSI-X, MSI also needs to be enabled, due to a bug | 3281 | * To enable MSI-X, MSI also needs to be enabled, due to a bug |
| @@ -3342,8 +3308,6 @@ static int s2io_open(struct net_device *dev) | |||
| 3342 | { | 3308 | { |
| 3343 | nic_t *sp = dev->priv; | 3309 | nic_t *sp = dev->priv; |
| 3344 | int err = 0; | 3310 | int err = 0; |
| 3345 | int i; | ||
| 3346 | u16 msi_control; /* Temp variable */ | ||
| 3347 | 3311 | ||
| 3348 | /* | 3312 | /* |
| 3349 | * Make sure you have link off by default every time | 3313 | * Make sure you have link off by default every time |
| @@ -3353,11 +3317,14 @@ static int s2io_open(struct net_device *dev) | |||
| 3353 | sp->last_link_state = 0; | 3317 | sp->last_link_state = 0; |
| 3354 | 3318 | ||
| 3355 | /* Initialize H/W and enable interrupts */ | 3319 | /* Initialize H/W and enable interrupts */ |
| 3356 | if (s2io_card_up(sp)) { | 3320 | err = s2io_card_up(sp); |
| 3321 | if (err) { | ||
| 3357 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", | 3322 | DBG_PRINT(ERR_DBG, "%s: H/W initialization failed\n", |
| 3358 | dev->name); | 3323 | dev->name); |
| 3359 | err = -ENODEV; | 3324 | if (err == -ENODEV) |
| 3360 | goto hw_init_failed; | 3325 | goto hw_init_failed; |
| 3326 | else | ||
| 3327 | goto hw_enable_failed; | ||
| 3361 | } | 3328 | } |
| 3362 | 3329 | ||
| 3363 | /* Store the values of the MSIX table in the nic_t structure */ | 3330 | /* Store the values of the MSIX table in the nic_t structure */ |
| @@ -3374,6 +3341,8 @@ failed\n", dev->name); | |||
| 3374 | } | 3341 | } |
| 3375 | } | 3342 | } |
| 3376 | if (sp->intr_type == MSI_X) { | 3343 | if (sp->intr_type == MSI_X) { |
| 3344 | int i; | ||
| 3345 | |||
| 3377 | for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { | 3346 | for (i=1; (sp->s2io_entries[i].in_use == MSIX_FLG); i++) { |
| 3378 | if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { | 3347 | if (sp->s2io_entries[i].type == MSIX_FIFO_TYPE) { |
| 3379 | sprintf(sp->desc1, "%s:MSI-X-%d-TX", | 3348 | sprintf(sp->desc1, "%s:MSI-X-%d-TX", |
| @@ -3426,24 +3395,25 @@ setting_mac_address_failed: | |||
| 3426 | isr_registration_failed: | 3395 | isr_registration_failed: |
| 3427 | del_timer_sync(&sp->alarm_timer); | 3396 | del_timer_sync(&sp->alarm_timer); |
| 3428 | if (sp->intr_type == MSI_X) { | 3397 | if (sp->intr_type == MSI_X) { |
| 3429 | if (sp->device_type == XFRAME_II_DEVICE) { | 3398 | int i; |
| 3430 | for (i=1; (sp->s2io_entries[i].in_use == | 3399 | u16 msi_control; /* Temp variable */ |
| 3400 | for (i=1; (sp->s2io_entries[i].in_use == | ||
| 3431 | MSIX_REGISTERED_SUCCESS); i++) { | 3401 | MSIX_REGISTERED_SUCCESS); i++) { |
| 3432 | int vector = sp->entries[i].vector; | 3402 | int vector = sp->entries[i].vector; |
| 3433 | void *arg = sp->s2io_entries[i].arg; | 3403 | void *arg = sp->s2io_entries[i].arg; |
| 3434 | |||
| 3435 | free_irq(vector, arg); | ||
| 3436 | } | ||
| 3437 | pci_disable_msix(sp->pdev); | ||
| 3438 | 3404 | ||
| 3439 | /* Temp */ | 3405 | free_irq(vector, arg); |
| 3440 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
| 3441 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
| 3442 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
| 3443 | } | 3406 | } |
| 3407 | pci_disable_msix(sp->pdev); | ||
| 3408 | |||
| 3409 | /* Temp */ | ||
| 3410 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
| 3411 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
| 3412 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
| 3444 | } | 3413 | } |
| 3445 | else if (sp->intr_type == MSI) | 3414 | else if (sp->intr_type == MSI) |
| 3446 | pci_disable_msi(sp->pdev); | 3415 | pci_disable_msi(sp->pdev); |
| 3416 | hw_enable_failed: | ||
| 3447 | s2io_reset(sp); | 3417 | s2io_reset(sp); |
| 3448 | hw_init_failed: | 3418 | hw_init_failed: |
| 3449 | if (sp->intr_type == MSI_X) { | 3419 | if (sp->intr_type == MSI_X) { |
| @@ -3471,35 +3441,12 @@ hw_init_failed: | |||
| 3471 | static int s2io_close(struct net_device *dev) | 3441 | static int s2io_close(struct net_device *dev) |
| 3472 | { | 3442 | { |
| 3473 | nic_t *sp = dev->priv; | 3443 | nic_t *sp = dev->priv; |
| 3474 | int i; | ||
| 3475 | u16 msi_control; | ||
| 3476 | 3444 | ||
| 3477 | flush_scheduled_work(); | 3445 | flush_scheduled_work(); |
| 3478 | netif_stop_queue(dev); | 3446 | netif_stop_queue(dev); |
| 3479 | /* Reset card, kill tasklet and free Tx and Rx buffers. */ | 3447 | /* Reset card, kill tasklet and free Tx and Rx buffers. */ |
| 3480 | s2io_card_down(sp); | 3448 | s2io_card_down(sp, 1); |
| 3481 | |||
| 3482 | if (sp->intr_type == MSI_X) { | ||
| 3483 | if (sp->device_type == XFRAME_II_DEVICE) { | ||
| 3484 | for (i=1; (sp->s2io_entries[i].in_use == | ||
| 3485 | MSIX_REGISTERED_SUCCESS); i++) { | ||
| 3486 | int vector = sp->entries[i].vector; | ||
| 3487 | void *arg = sp->s2io_entries[i].arg; | ||
| 3488 | |||
| 3489 | free_irq(vector, arg); | ||
| 3490 | } | ||
| 3491 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
| 3492 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
| 3493 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
| 3494 | 3449 | ||
| 3495 | pci_disable_msix(sp->pdev); | ||
| 3496 | } | ||
| 3497 | } | ||
| 3498 | else { | ||
| 3499 | free_irq(sp->pdev->irq, dev); | ||
| 3500 | if (sp->intr_type == MSI) | ||
| 3501 | pci_disable_msi(sp->pdev); | ||
| 3502 | } | ||
| 3503 | sp->device_close_flag = TRUE; /* Device is shut down. */ | 3450 | sp->device_close_flag = TRUE; /* Device is shut down. */ |
| 3504 | return 0; | 3451 | return 0; |
| 3505 | } | 3452 | } |
| @@ -3825,41 +3772,56 @@ static void s2io_txpic_intr_handle(nic_t *sp) | |||
| 3825 | val64 = readq(&bar0->gpio_int_reg); | 3772 | val64 = readq(&bar0->gpio_int_reg); |
| 3826 | if ((val64 & GPIO_INT_REG_LINK_DOWN) && | 3773 | if ((val64 & GPIO_INT_REG_LINK_DOWN) && |
| 3827 | (val64 & GPIO_INT_REG_LINK_UP)) { | 3774 | (val64 & GPIO_INT_REG_LINK_UP)) { |
| 3775 | /* | ||
| 3776 | * This is unstable state so clear both up/down | ||
| 3777 | * interrupt and adapter to re-evaluate the link state. | ||
| 3778 | */ | ||
| 3828 | val64 |= GPIO_INT_REG_LINK_DOWN; | 3779 | val64 |= GPIO_INT_REG_LINK_DOWN; |
| 3829 | val64 |= GPIO_INT_REG_LINK_UP; | 3780 | val64 |= GPIO_INT_REG_LINK_UP; |
| 3830 | writeq(val64, &bar0->gpio_int_reg); | 3781 | writeq(val64, &bar0->gpio_int_reg); |
| 3831 | goto masking; | ||
| 3832 | } | ||
| 3833 | |||
| 3834 | if (((sp->last_link_state == LINK_UP) && | ||
| 3835 | (val64 & GPIO_INT_REG_LINK_DOWN)) || | ||
| 3836 | ((sp->last_link_state == LINK_DOWN) && | ||
| 3837 | (val64 & GPIO_INT_REG_LINK_UP))) { | ||
| 3838 | val64 = readq(&bar0->gpio_int_mask); | 3782 | val64 = readq(&bar0->gpio_int_mask); |
| 3839 | val64 |= GPIO_INT_MASK_LINK_DOWN; | 3783 | val64 &= ~(GPIO_INT_MASK_LINK_UP | |
| 3840 | val64 |= GPIO_INT_MASK_LINK_UP; | 3784 | GPIO_INT_MASK_LINK_DOWN); |
| 3841 | writeq(val64, &bar0->gpio_int_mask); | 3785 | writeq(val64, &bar0->gpio_int_mask); |
| 3842 | s2io_set_link((unsigned long)sp); | ||
| 3843 | } | 3786 | } |
| 3844 | masking: | 3787 | else if (val64 & GPIO_INT_REG_LINK_UP) { |
| 3845 | if (sp->last_link_state == LINK_UP) { | 3788 | val64 = readq(&bar0->adapter_status); |
| 3846 | /*enable down interrupt */ | 3789 | if (verify_xena_quiescence(sp, val64, |
| 3847 | val64 = readq(&bar0->gpio_int_mask); | 3790 | sp->device_enabled_once)) { |
| 3848 | /* unmasks link down intr */ | 3791 | /* Enable Adapter */ |
| 3849 | val64 &= ~GPIO_INT_MASK_LINK_DOWN; | 3792 | val64 = readq(&bar0->adapter_control); |
| 3850 | /* masks link up intr */ | 3793 | val64 |= ADAPTER_CNTL_EN; |
| 3851 | val64 |= GPIO_INT_MASK_LINK_UP; | 3794 | writeq(val64, &bar0->adapter_control); |
| 3852 | writeq(val64, &bar0->gpio_int_mask); | 3795 | val64 |= ADAPTER_LED_ON; |
| 3853 | } else { | 3796 | writeq(val64, &bar0->adapter_control); |
| 3854 | /*enable UP Interrupt */ | 3797 | if (!sp->device_enabled_once) |
| 3855 | val64 = readq(&bar0->gpio_int_mask); | 3798 | sp->device_enabled_once = 1; |
| 3856 | /* unmasks link up interrupt */ | 3799 | |
| 3857 | val64 &= ~GPIO_INT_MASK_LINK_UP; | 3800 | s2io_link(sp, LINK_UP); |
| 3858 | /* masks link down interrupt */ | 3801 | /* |
| 3859 | val64 |= GPIO_INT_MASK_LINK_DOWN; | 3802 | * unmask link down interrupt and mask link-up |
| 3860 | writeq(val64, &bar0->gpio_int_mask); | 3803 | * intr |
| 3804 | */ | ||
| 3805 | val64 = readq(&bar0->gpio_int_mask); | ||
| 3806 | val64 &= ~GPIO_INT_MASK_LINK_DOWN; | ||
| 3807 | val64 |= GPIO_INT_MASK_LINK_UP; | ||
| 3808 | writeq(val64, &bar0->gpio_int_mask); | ||
| 3809 | |||
| 3810 | } | ||
| 3811 | }else if (val64 & GPIO_INT_REG_LINK_DOWN) { | ||
| 3812 | val64 = readq(&bar0->adapter_status); | ||
| 3813 | if (verify_xena_quiescence(sp, val64, | ||
| 3814 | sp->device_enabled_once)) { | ||
| 3815 | s2io_link(sp, LINK_DOWN); | ||
| 3816 | /* Link is down so unmaks link up interrupt */ | ||
| 3817 | val64 = readq(&bar0->gpio_int_mask); | ||
| 3818 | val64 &= ~GPIO_INT_MASK_LINK_UP; | ||
| 3819 | val64 |= GPIO_INT_MASK_LINK_DOWN; | ||
| 3820 | writeq(val64, &bar0->gpio_int_mask); | ||
| 3821 | } | ||
| 3861 | } | 3822 | } |
| 3862 | } | 3823 | } |
| 3824 | val64 = readq(&bar0->gpio_int_mask); | ||
| 3863 | } | 3825 | } |
| 3864 | 3826 | ||
| 3865 | /** | 3827 | /** |
| @@ -4080,7 +4042,8 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4080 | RMAC_ADDR_CMD_MEM_OFFSET(MAC_MC_ALL_MC_ADDR_OFFSET); | 4042 | RMAC_ADDR_CMD_MEM_OFFSET(MAC_MC_ALL_MC_ADDR_OFFSET); |
| 4081 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 4043 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 4082 | /* Wait till command completes */ | 4044 | /* Wait till command completes */ |
| 4083 | wait_for_cmd_complete(sp); | 4045 | wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 4046 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); | ||
| 4084 | 4047 | ||
| 4085 | sp->m_cast_flg = 1; | 4048 | sp->m_cast_flg = 1; |
| 4086 | sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET; | 4049 | sp->all_multi_pos = MAC_MC_ALL_MC_ADDR_OFFSET; |
| @@ -4095,7 +4058,8 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4095 | RMAC_ADDR_CMD_MEM_OFFSET(sp->all_multi_pos); | 4058 | RMAC_ADDR_CMD_MEM_OFFSET(sp->all_multi_pos); |
| 4096 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 4059 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 4097 | /* Wait till command completes */ | 4060 | /* Wait till command completes */ |
| 4098 | wait_for_cmd_complete(sp); | 4061 | wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 4062 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); | ||
| 4099 | 4063 | ||
| 4100 | sp->m_cast_flg = 0; | 4064 | sp->m_cast_flg = 0; |
| 4101 | sp->all_multi_pos = 0; | 4065 | sp->all_multi_pos = 0; |
| @@ -4160,7 +4124,8 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4160 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 4124 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 4161 | 4125 | ||
| 4162 | /* Wait for command completes */ | 4126 | /* Wait for command completes */ |
| 4163 | if (wait_for_cmd_complete(sp)) { | 4127 | if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 4128 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { | ||
| 4164 | DBG_PRINT(ERR_DBG, "%s: Adding ", | 4129 | DBG_PRINT(ERR_DBG, "%s: Adding ", |
| 4165 | dev->name); | 4130 | dev->name); |
| 4166 | DBG_PRINT(ERR_DBG, "Multicasts failed\n"); | 4131 | DBG_PRINT(ERR_DBG, "Multicasts failed\n"); |
| @@ -4190,7 +4155,8 @@ static void s2io_set_multicast(struct net_device *dev) | |||
| 4190 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 4155 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 4191 | 4156 | ||
| 4192 | /* Wait for command completes */ | 4157 | /* Wait for command completes */ |
| 4193 | if (wait_for_cmd_complete(sp)) { | 4158 | if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 4159 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { | ||
| 4194 | DBG_PRINT(ERR_DBG, "%s: Adding ", | 4160 | DBG_PRINT(ERR_DBG, "%s: Adding ", |
| 4195 | dev->name); | 4161 | dev->name); |
| 4196 | DBG_PRINT(ERR_DBG, "Multicasts failed\n"); | 4162 | DBG_PRINT(ERR_DBG, "Multicasts failed\n"); |
| @@ -4235,7 +4201,8 @@ static int s2io_set_mac_addr(struct net_device *dev, u8 * addr) | |||
| 4235 | RMAC_ADDR_CMD_MEM_OFFSET(0); | 4201 | RMAC_ADDR_CMD_MEM_OFFSET(0); |
| 4236 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 4202 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 4237 | /* Wait till command completes */ | 4203 | /* Wait till command completes */ |
| 4238 | if (wait_for_cmd_complete(sp)) { | 4204 | if (wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 4205 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING)) { | ||
| 4239 | DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name); | 4206 | DBG_PRINT(ERR_DBG, "%s: set_mac_addr failed\n", dev->name); |
| 4240 | return FAILURE; | 4207 | return FAILURE; |
| 4241 | } | 4208 | } |
| @@ -4632,7 +4599,6 @@ static int write_eeprom(nic_t * sp, int off, u64 data, int cnt) | |||
| 4632 | } | 4599 | } |
| 4633 | return ret; | 4600 | return ret; |
| 4634 | } | 4601 | } |
| 4635 | |||
| 4636 | static void s2io_vpd_read(nic_t *nic) | 4602 | static void s2io_vpd_read(nic_t *nic) |
| 4637 | { | 4603 | { |
| 4638 | u8 vpd_data[256],data; | 4604 | u8 vpd_data[256],data; |
| @@ -4983,8 +4949,10 @@ static int s2io_link_test(nic_t * sp, uint64_t * data) | |||
| 4983 | u64 val64; | 4949 | u64 val64; |
| 4984 | 4950 | ||
| 4985 | val64 = readq(&bar0->adapter_status); | 4951 | val64 = readq(&bar0->adapter_status); |
| 4986 | if (val64 & ADAPTER_STATUS_RMAC_LOCAL_FAULT) | 4952 | if(!(LINK_IS_UP(val64))) |
| 4987 | *data = 1; | 4953 | *data = 1; |
| 4954 | else | ||
| 4955 | *data = 0; | ||
| 4988 | 4956 | ||
| 4989 | return 0; | 4957 | return 0; |
| 4990 | } | 4958 | } |
| @@ -5403,7 +5371,7 @@ static int s2io_change_mtu(struct net_device *dev, int new_mtu) | |||
| 5403 | 5371 | ||
| 5404 | dev->mtu = new_mtu; | 5372 | dev->mtu = new_mtu; |
| 5405 | if (netif_running(dev)) { | 5373 | if (netif_running(dev)) { |
| 5406 | s2io_card_down(sp); | 5374 | s2io_card_down(sp, 0); |
| 5407 | netif_stop_queue(dev); | 5375 | netif_stop_queue(dev); |
| 5408 | if (s2io_card_up(sp)) { | 5376 | if (s2io_card_up(sp)) { |
| 5409 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", | 5377 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", |
| @@ -5541,12 +5509,13 @@ static void s2io_set_link(unsigned long data) | |||
| 5541 | clear_bit(0, &(nic->link_state)); | 5509 | clear_bit(0, &(nic->link_state)); |
| 5542 | } | 5510 | } |
| 5543 | 5511 | ||
| 5544 | static void s2io_card_down(nic_t * sp) | 5512 | static void s2io_card_down(nic_t * sp, int flag) |
| 5545 | { | 5513 | { |
| 5546 | int cnt = 0; | 5514 | int cnt = 0; |
| 5547 | XENA_dev_config_t __iomem *bar0 = sp->bar0; | 5515 | XENA_dev_config_t __iomem *bar0 = sp->bar0; |
| 5548 | unsigned long flags; | 5516 | unsigned long flags; |
| 5549 | register u64 val64 = 0; | 5517 | register u64 val64 = 0; |
| 5518 | struct net_device *dev = sp->dev; | ||
| 5550 | 5519 | ||
| 5551 | del_timer_sync(&sp->alarm_timer); | 5520 | del_timer_sync(&sp->alarm_timer); |
| 5552 | /* If s2io_set_link task is executing, wait till it completes. */ | 5521 | /* If s2io_set_link task is executing, wait till it completes. */ |
| @@ -5557,6 +5526,36 @@ static void s2io_card_down(nic_t * sp) | |||
| 5557 | 5526 | ||
| 5558 | /* disable Tx and Rx traffic on the NIC */ | 5527 | /* disable Tx and Rx traffic on the NIC */ |
| 5559 | stop_nic(sp); | 5528 | stop_nic(sp); |
| 5529 | if (flag) { | ||
| 5530 | if (sp->intr_type == MSI_X) { | ||
| 5531 | int i; | ||
| 5532 | u16 msi_control; | ||
| 5533 | |||
| 5534 | for (i=1; (sp->s2io_entries[i].in_use == | ||
| 5535 | MSIX_REGISTERED_SUCCESS); i++) { | ||
| 5536 | int vector = sp->entries[i].vector; | ||
| 5537 | void *arg = sp->s2io_entries[i].arg; | ||
| 5538 | |||
| 5539 | free_irq(vector, arg); | ||
| 5540 | } | ||
| 5541 | pci_read_config_word(sp->pdev, 0x42, &msi_control); | ||
| 5542 | msi_control &= 0xFFFE; /* Disable MSI */ | ||
| 5543 | pci_write_config_word(sp->pdev, 0x42, msi_control); | ||
| 5544 | pci_disable_msix(sp->pdev); | ||
| 5545 | } else { | ||
| 5546 | free_irq(sp->pdev->irq, dev); | ||
| 5547 | if (sp->intr_type == MSI) | ||
| 5548 | pci_disable_msi(sp->pdev); | ||
| 5549 | } | ||
| 5550 | } | ||
| 5551 | /* Waiting till all Interrupt handlers are complete */ | ||
| 5552 | cnt = 0; | ||
| 5553 | do { | ||
| 5554 | msleep(10); | ||
| 5555 | if (!atomic_read(&sp->isr_cnt)) | ||
| 5556 | break; | ||
| 5557 | cnt++; | ||
| 5558 | } while(cnt < 5); | ||
| 5560 | 5559 | ||
| 5561 | /* Kill tasklet. */ | 5560 | /* Kill tasklet. */ |
| 5562 | tasklet_kill(&sp->task); | 5561 | tasklet_kill(&sp->task); |
| @@ -5580,15 +5579,6 @@ static void s2io_card_down(nic_t * sp) | |||
| 5580 | } while (1); | 5579 | } while (1); |
| 5581 | s2io_reset(sp); | 5580 | s2io_reset(sp); |
| 5582 | 5581 | ||
| 5583 | /* Waiting till all Interrupt handlers are complete */ | ||
| 5584 | cnt = 0; | ||
| 5585 | do { | ||
| 5586 | msleep(10); | ||
| 5587 | if (!atomic_read(&sp->isr_cnt)) | ||
| 5588 | break; | ||
| 5589 | cnt++; | ||
| 5590 | } while(cnt < 5); | ||
| 5591 | |||
| 5592 | spin_lock_irqsave(&sp->tx_lock, flags); | 5582 | spin_lock_irqsave(&sp->tx_lock, flags); |
| 5593 | /* Free all Tx buffers */ | 5583 | /* Free all Tx buffers */ |
| 5594 | free_tx_buffers(sp); | 5584 | free_tx_buffers(sp); |
| @@ -5689,7 +5679,7 @@ static void s2io_restart_nic(unsigned long data) | |||
| 5689 | struct net_device *dev = (struct net_device *) data; | 5679 | struct net_device *dev = (struct net_device *) data; |
| 5690 | nic_t *sp = dev->priv; | 5680 | nic_t *sp = dev->priv; |
| 5691 | 5681 | ||
| 5692 | s2io_card_down(sp); | 5682 | s2io_card_down(sp, 0); |
| 5693 | if (s2io_card_up(sp)) { | 5683 | if (s2io_card_up(sp)) { |
| 5694 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", | 5684 | DBG_PRINT(ERR_DBG, "%s: Device bring up failed\n", |
| 5695 | dev->name); | 5685 | dev->name); |
| @@ -5751,6 +5741,7 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) | |||
| 5751 | lro_t *lro; | 5741 | lro_t *lro; |
| 5752 | 5742 | ||
| 5753 | skb->dev = dev; | 5743 | skb->dev = dev; |
| 5744 | |||
| 5754 | if (err) { | 5745 | if (err) { |
| 5755 | /* | 5746 | /* |
| 5756 | * Drop the packet if bad transfer code. Exception being | 5747 | * Drop the packet if bad transfer code. Exception being |
| @@ -5853,6 +5844,9 @@ static int rx_osm_handler(ring_info_t *ring_data, RxD_t * rxdp) | |||
| 5853 | clear_lro_session(lro); | 5844 | clear_lro_session(lro); |
| 5854 | goto send_up; | 5845 | goto send_up; |
| 5855 | case 0: /* sessions exceeded */ | 5846 | case 0: /* sessions exceeded */ |
| 5847 | case -1: /* non-TCP or not | ||
| 5848 | * L2 aggregatable | ||
| 5849 | */ | ||
| 5856 | case 5: /* | 5850 | case 5: /* |
| 5857 | * First pkt in session not | 5851 | * First pkt in session not |
| 5858 | * L3/L4 aggregatable | 5852 | * L3/L4 aggregatable |
| @@ -6351,8 +6345,8 @@ s2io_init_nic(struct pci_dev *pdev, const struct pci_device_id *pre) | |||
| 6351 | val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD | | 6345 | val64 = RMAC_ADDR_CMD_MEM_RD | RMAC_ADDR_CMD_MEM_STROBE_NEW_CMD | |
| 6352 | RMAC_ADDR_CMD_MEM_OFFSET(0 + MAC_MAC_ADDR_START_OFFSET); | 6346 | RMAC_ADDR_CMD_MEM_OFFSET(0 + MAC_MAC_ADDR_START_OFFSET); |
| 6353 | writeq(val64, &bar0->rmac_addr_cmd_mem); | 6347 | writeq(val64, &bar0->rmac_addr_cmd_mem); |
| 6354 | wait_for_cmd_complete(sp); | 6348 | wait_for_cmd_complete(&bar0->rmac_addr_cmd_mem, |
| 6355 | 6349 | RMAC_ADDR_CMD_MEM_STROBE_CMD_EXECUTING); | |
| 6356 | tmp64 = readq(&bar0->rmac_addr_data0_mem); | 6350 | tmp64 = readq(&bar0->rmac_addr_data0_mem); |
| 6357 | mac_down = (u32) tmp64; | 6351 | mac_down = (u32) tmp64; |
| 6358 | mac_up = (u32) (tmp64 >> 32); | 6352 | mac_up = (u32) (tmp64 >> 32); |
diff --git a/drivers/net/s2io.h b/drivers/net/s2io.h index a83a1d85f72e..fb46a4fed334 100644 --- a/drivers/net/s2io.h +++ b/drivers/net/s2io.h | |||
| @@ -661,8 +661,8 @@ typedef struct { | |||
| 661 | /* Default Tunable parameters of the NIC. */ | 661 | /* Default Tunable parameters of the NIC. */ |
| 662 | #define DEFAULT_FIFO_0_LEN 4096 | 662 | #define DEFAULT_FIFO_0_LEN 4096 |
| 663 | #define DEFAULT_FIFO_1_7_LEN 512 | 663 | #define DEFAULT_FIFO_1_7_LEN 512 |
| 664 | #define SMALL_BLK_CNT 30 | 664 | #define SMALL_BLK_CNT 30 |
| 665 | #define LARGE_BLK_CNT 100 | 665 | #define LARGE_BLK_CNT 100 |
| 666 | 666 | ||
| 667 | /* | 667 | /* |
| 668 | * Structure to keep track of the MSI-X vectors and the corresponding | 668 | * Structure to keep track of the MSI-X vectors and the corresponding |
| @@ -733,7 +733,7 @@ struct s2io_nic { | |||
| 733 | int device_close_flag; | 733 | int device_close_flag; |
| 734 | int device_enabled_once; | 734 | int device_enabled_once; |
| 735 | 735 | ||
| 736 | char name[50]; | 736 | char name[60]; |
| 737 | struct tasklet_struct task; | 737 | struct tasklet_struct task; |
| 738 | volatile unsigned long tasklet_status; | 738 | volatile unsigned long tasklet_status; |
| 739 | 739 | ||
| @@ -804,6 +804,8 @@ struct s2io_nic { | |||
| 804 | char desc1[35]; | 804 | char desc1[35]; |
| 805 | char desc2[35]; | 805 | char desc2[35]; |
| 806 | 806 | ||
| 807 | int avail_msix_vectors; /* No. of MSI-X vectors granted by system */ | ||
| 808 | |||
| 807 | struct msix_info_st msix_info[0x3f]; | 809 | struct msix_info_st msix_info[0x3f]; |
| 808 | 810 | ||
| 809 | #define XFRAME_I_DEVICE 1 | 811 | #define XFRAME_I_DEVICE 1 |
| @@ -851,28 +853,32 @@ static inline void writeq(u64 val, void __iomem *addr) | |||
| 851 | writel((u32) (val), addr); | 853 | writel((u32) (val), addr); |
| 852 | writel((u32) (val >> 32), (addr + 4)); | 854 | writel((u32) (val >> 32), (addr + 4)); |
| 853 | } | 855 | } |
| 856 | #endif | ||
| 854 | 857 | ||
| 855 | /* In 32 bit modes, some registers have to be written in a | 858 | /* |
| 856 | * particular order to expect correct hardware operation. The | 859 | * Some registers have to be written in a particular order to |
| 857 | * macro SPECIAL_REG_WRITE is used to perform such ordered | 860 | * expect correct hardware operation. The macro SPECIAL_REG_WRITE |
| 858 | * writes. Defines UF (Upper First) and LF (Lower First) will | 861 | * is used to perform such ordered writes. Defines UF (Upper First) |
| 859 | * be used to specify the required write order. | 862 | * and LF (Lower First) will be used to specify the required write order. |
| 860 | */ | 863 | */ |
| 861 | #define UF 1 | 864 | #define UF 1 |
| 862 | #define LF 2 | 865 | #define LF 2 |
| 863 | static inline void SPECIAL_REG_WRITE(u64 val, void __iomem *addr, int order) | 866 | static inline void SPECIAL_REG_WRITE(u64 val, void __iomem *addr, int order) |
| 864 | { | 867 | { |
| 868 | u32 ret; | ||
| 869 | |||
| 865 | if (order == LF) { | 870 | if (order == LF) { |
| 866 | writel((u32) (val), addr); | 871 | writel((u32) (val), addr); |
| 872 | ret = readl(addr); | ||
| 867 | writel((u32) (val >> 32), (addr + 4)); | 873 | writel((u32) (val >> 32), (addr + 4)); |
| 874 | ret = readl(addr + 4); | ||
| 868 | } else { | 875 | } else { |
| 869 | writel((u32) (val >> 32), (addr + 4)); | 876 | writel((u32) (val >> 32), (addr + 4)); |
| 877 | ret = readl(addr + 4); | ||
| 870 | writel((u32) (val), addr); | 878 | writel((u32) (val), addr); |
| 879 | ret = readl(addr); | ||
| 871 | } | 880 | } |
| 872 | } | 881 | } |
| 873 | #else | ||
| 874 | #define SPECIAL_REG_WRITE(val, addr, dummy) writeq(val, addr) | ||
| 875 | #endif | ||
| 876 | 882 | ||
| 877 | /* Interrupt related values of Xena */ | 883 | /* Interrupt related values of Xena */ |
| 878 | 884 | ||
| @@ -968,7 +974,7 @@ static int verify_xena_quiescence(nic_t *sp, u64 val64, int flag); | |||
| 968 | static struct ethtool_ops netdev_ethtool_ops; | 974 | static struct ethtool_ops netdev_ethtool_ops; |
| 969 | static void s2io_set_link(unsigned long data); | 975 | static void s2io_set_link(unsigned long data); |
| 970 | static int s2io_set_swapper(nic_t * sp); | 976 | static int s2io_set_swapper(nic_t * sp); |
| 971 | static void s2io_card_down(nic_t *nic); | 977 | static void s2io_card_down(nic_t *nic, int flag); |
| 972 | static int s2io_card_up(nic_t *nic); | 978 | static int s2io_card_up(nic_t *nic); |
| 973 | static int get_xena_rev_id(struct pci_dev *pdev); | 979 | static int get_xena_rev_id(struct pci_dev *pdev); |
| 974 | static void restore_xmsi_data(nic_t *nic); | 980 | static void restore_xmsi_data(nic_t *nic); |
