diff options
Diffstat (limited to 'drivers/net/ethernet')
39 files changed, 655 insertions, 246 deletions
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c index eedf2a5fc2be..eeecc29cf5b7 100644 --- a/drivers/net/ethernet/arc/emac_main.c +++ b/drivers/net/ethernet/arc/emac_main.c | |||
@@ -555,6 +555,8 @@ static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev) | |||
555 | /* Make sure pointer to data buffer is set */ | 555 | /* Make sure pointer to data buffer is set */ |
556 | wmb(); | 556 | wmb(); |
557 | 557 | ||
558 | skb_tx_timestamp(skb); | ||
559 | |||
558 | *info = cpu_to_le32(FOR_EMAC | FIRST_OR_LAST_MASK | len); | 560 | *info = cpu_to_le32(FOR_EMAC | FIRST_OR_LAST_MASK | len); |
559 | 561 | ||
560 | /* Increment index to point to the next BD */ | 562 | /* Increment index to point to the next BD */ |
@@ -569,8 +571,6 @@ static int arc_emac_tx(struct sk_buff *skb, struct net_device *ndev) | |||
569 | 571 | ||
570 | arc_reg_set(priv, R_STATUS, TXPL_MASK); | 572 | arc_reg_set(priv, R_STATUS, TXPL_MASK); |
571 | 573 | ||
572 | skb_tx_timestamp(skb); | ||
573 | |||
574 | return NETDEV_TX_OK; | 574 | return NETDEV_TX_OK; |
575 | } | 575 | } |
576 | 576 | ||
diff --git a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c index a36a760ada28..29801750f239 100644 --- a/drivers/net/ethernet/atheros/atl1c/atl1c_main.c +++ b/drivers/net/ethernet/atheros/atl1c/atl1c_main.c | |||
@@ -145,9 +145,11 @@ static void atl1c_reset_pcie(struct atl1c_hw *hw, u32 flag) | |||
145 | * Mask some pcie error bits | 145 | * Mask some pcie error bits |
146 | */ | 146 | */ |
147 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR); | 147 | pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR); |
148 | pci_read_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, &data); | 148 | if (pos) { |
149 | data &= ~(PCI_ERR_UNC_DLP | PCI_ERR_UNC_FCP); | 149 | pci_read_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, &data); |
150 | pci_write_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, data); | 150 | data &= ~(PCI_ERR_UNC_DLP | PCI_ERR_UNC_FCP); |
151 | pci_write_config_dword(pdev, pos + PCI_ERR_UNCOR_SEVER, data); | ||
152 | } | ||
151 | /* clear error status */ | 153 | /* clear error status */ |
152 | pcie_capability_write_word(pdev, PCI_EXP_DEVSTA, | 154 | pcie_capability_write_word(pdev, PCI_EXP_DEVSTA, |
153 | PCI_EXP_DEVSTA_NFED | | 155 | PCI_EXP_DEVSTA_NFED | |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index dad67905f4e2..eb105abcf0e7 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
@@ -1250,7 +1250,10 @@ struct bnx2x_slowpath { | |||
1250 | * Therefore, if they would have been defined in the same union, | 1250 | * Therefore, if they would have been defined in the same union, |
1251 | * data can get corrupted. | 1251 | * data can get corrupted. |
1252 | */ | 1252 | */ |
1253 | struct afex_vif_list_ramrod_data func_afex_rdata; | 1253 | union { |
1254 | struct afex_vif_list_ramrod_data viflist_data; | ||
1255 | struct function_update_data func_update; | ||
1256 | } func_afex_rdata; | ||
1254 | 1257 | ||
1255 | /* used by dmae command executer */ | 1258 | /* used by dmae command executer */ |
1256 | struct dmae_command dmae[MAX_DMAE_C]; | 1259 | struct dmae_command dmae[MAX_DMAE_C]; |
@@ -2501,4 +2504,6 @@ void bnx2x_set_local_cmng(struct bnx2x *bp); | |||
2501 | #define MCPR_SCRATCH_BASE(bp) \ | 2504 | #define MCPR_SCRATCH_BASE(bp) \ |
2502 | (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH) | 2505 | (CHIP_IS_E1x(bp) ? MCP_REG_MCPR_SCRATCH : MCP_A_REG_MCPR_SCRATCH) |
2503 | 2506 | ||
2507 | #define E1H_MAX_MF_SB_COUNT (HC_SB_MAX_SB_E1X/(E1HVN_MAX * PORT_MAX)) | ||
2508 | |||
2504 | #endif /* bnx2x.h */ | 2509 | #endif /* bnx2x.h */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index 20dcc02431ca..11fc79585491 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
@@ -3865,6 +3865,19 @@ static void bnx2x_warpcore_enable_AN_KR(struct bnx2x_phy *phy, | |||
3865 | 3865 | ||
3866 | bnx2x_warpcore_enable_AN_KR2(phy, params, vars); | 3866 | bnx2x_warpcore_enable_AN_KR2(phy, params, vars); |
3867 | } else { | 3867 | } else { |
3868 | /* Enable Auto-Detect to support 1G over CL37 as well */ | ||
3869 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3870 | MDIO_WC_REG_SERDESDIGITAL_CONTROL1000X1, 0x10); | ||
3871 | |||
3872 | /* Force cl48 sync_status LOW to avoid getting stuck in CL73 | ||
3873 | * parallel-detect loop when CL73 and CL37 are enabled. | ||
3874 | */ | ||
3875 | CL22_WR_OVER_CL45(bp, phy, MDIO_REG_BANK_AER_BLOCK, | ||
3876 | MDIO_AER_BLOCK_AER_REG, 0); | ||
3877 | bnx2x_cl45_write(bp, phy, MDIO_WC_DEVAD, | ||
3878 | MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI, 0x0800); | ||
3879 | bnx2x_set_aer_mmd(params, phy); | ||
3880 | |||
3868 | bnx2x_disable_kr2(params, vars, phy); | 3881 | bnx2x_disable_kr2(params, vars, phy); |
3869 | } | 3882 | } |
3870 | 3883 | ||
@@ -8120,17 +8133,20 @@ static int bnx2x_get_edc_mode(struct bnx2x_phy *phy, | |||
8120 | *edc_mode = EDC_MODE_ACTIVE_DAC; | 8133 | *edc_mode = EDC_MODE_ACTIVE_DAC; |
8121 | else | 8134 | else |
8122 | check_limiting_mode = 1; | 8135 | check_limiting_mode = 1; |
8123 | } else if (copper_module_type & | 8136 | } else { |
8124 | SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { | 8137 | *edc_mode = EDC_MODE_PASSIVE_DAC; |
8138 | /* Even in case PASSIVE_DAC indication is not set, | ||
8139 | * treat it as a passive DAC cable, since some cables | ||
8140 | * don't have this indication. | ||
8141 | */ | ||
8142 | if (copper_module_type & | ||
8143 | SFP_EEPROM_FC_TX_TECH_BITMASK_COPPER_PASSIVE) { | ||
8125 | DP(NETIF_MSG_LINK, | 8144 | DP(NETIF_MSG_LINK, |
8126 | "Passive Copper cable detected\n"); | 8145 | "Passive Copper cable detected\n"); |
8127 | *edc_mode = | 8146 | } else { |
8128 | EDC_MODE_PASSIVE_DAC; | 8147 | DP(NETIF_MSG_LINK, |
8129 | } else { | 8148 | "Unknown copper-cable-type\n"); |
8130 | DP(NETIF_MSG_LINK, | 8149 | } |
8131 | "Unknown copper-cable-type 0x%x !!!\n", | ||
8132 | copper_module_type); | ||
8133 | return -EINVAL; | ||
8134 | } | 8150 | } |
8135 | break; | 8151 | break; |
8136 | } | 8152 | } |
@@ -10825,9 +10841,9 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy, | |||
10825 | (1<<11)); | 10841 | (1<<11)); |
10826 | 10842 | ||
10827 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | 10843 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && |
10828 | (phy->speed_cap_mask & | 10844 | (phy->speed_cap_mask & |
10829 | PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || | 10845 | PORT_HW_CFG_SPEED_CAPABILITY_D0_1G)) || |
10830 | (phy->req_line_speed == SPEED_1000)) { | 10846 | (phy->req_line_speed == SPEED_1000)) { |
10831 | an_1000_val |= (1<<8); | 10847 | an_1000_val |= (1<<8); |
10832 | autoneg_val |= (1<<9 | 1<<12); | 10848 | autoneg_val |= (1<<9 | 1<<12); |
10833 | if (phy->req_duplex == DUPLEX_FULL) | 10849 | if (phy->req_duplex == DUPLEX_FULL) |
@@ -10843,30 +10859,32 @@ static int bnx2x_54618se_config_init(struct bnx2x_phy *phy, | |||
10843 | 0x09, | 10859 | 0x09, |
10844 | &an_1000_val); | 10860 | &an_1000_val); |
10845 | 10861 | ||
10846 | /* Set 100 speed advertisement */ | 10862 | /* Advertise 10/100 link speed */ |
10847 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | 10863 | if (phy->req_line_speed == SPEED_AUTO_NEG) { |
10848 | (phy->speed_cap_mask & | 10864 | if (phy->speed_cap_mask & |
10849 | (PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL | | 10865 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF) { |
10850 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF)))) { | 10866 | an_10_100_val |= (1<<5); |
10851 | an_10_100_val |= (1<<7); | 10867 | autoneg_val |= (1<<9 | 1<<12); |
10852 | /* Enable autoneg and restart autoneg for legacy speeds */ | 10868 | DP(NETIF_MSG_LINK, "Advertising 10M-HD\n"); |
10853 | autoneg_val |= (1<<9 | 1<<12); | 10869 | } |
10854 | 10870 | if (phy->speed_cap_mask & | |
10855 | if (phy->req_duplex == DUPLEX_FULL) | 10871 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL) { |
10856 | an_10_100_val |= (1<<8); | ||
10857 | DP(NETIF_MSG_LINK, "Advertising 100M\n"); | ||
10858 | } | ||
10859 | |||
10860 | /* Set 10 speed advertisement */ | ||
10861 | if (((phy->req_line_speed == SPEED_AUTO_NEG) && | ||
10862 | (phy->speed_cap_mask & | ||
10863 | (PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_FULL | | ||
10864 | PORT_HW_CFG_SPEED_CAPABILITY_D0_10M_HALF)))) { | ||
10865 | an_10_100_val |= (1<<5); | ||
10866 | autoneg_val |= (1<<9 | 1<<12); | ||
10867 | if (phy->req_duplex == DUPLEX_FULL) | ||
10868 | an_10_100_val |= (1<<6); | 10872 | an_10_100_val |= (1<<6); |
10869 | DP(NETIF_MSG_LINK, "Advertising 10M\n"); | 10873 | autoneg_val |= (1<<9 | 1<<12); |
10874 | DP(NETIF_MSG_LINK, "Advertising 10M-FD\n"); | ||
10875 | } | ||
10876 | if (phy->speed_cap_mask & | ||
10877 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_HALF) { | ||
10878 | an_10_100_val |= (1<<7); | ||
10879 | autoneg_val |= (1<<9 | 1<<12); | ||
10880 | DP(NETIF_MSG_LINK, "Advertising 100M-HD\n"); | ||
10881 | } | ||
10882 | if (phy->speed_cap_mask & | ||
10883 | PORT_HW_CFG_SPEED_CAPABILITY_D0_100M_FULL) { | ||
10884 | an_10_100_val |= (1<<8); | ||
10885 | autoneg_val |= (1<<9 | 1<<12); | ||
10886 | DP(NETIF_MSG_LINK, "Advertising 100M-FD\n"); | ||
10887 | } | ||
10870 | } | 10888 | } |
10871 | 10889 | ||
10872 | /* Only 10/100 are allowed to work in FORCE mode */ | 10890 | /* Only 10/100 are allowed to work in FORCE mode */ |
@@ -13342,6 +13360,10 @@ static u8 bnx2x_analyze_link_error(struct link_params *params, | |||
13342 | DP(NETIF_MSG_LINK, "Link changed:[%x %x]->%x\n", vars->link_up, | 13360 | DP(NETIF_MSG_LINK, "Link changed:[%x %x]->%x\n", vars->link_up, |
13343 | old_status, status); | 13361 | old_status, status); |
13344 | 13362 | ||
13363 | /* Do not touch the link in case physical link down */ | ||
13364 | if ((vars->phy_flags & PHY_PHYSICAL_LINK_FLAG) == 0) | ||
13365 | return 1; | ||
13366 | |||
13345 | /* a. Update shmem->link_status accordingly | 13367 | /* a. Update shmem->link_status accordingly |
13346 | * b. Update link_vars->link_up | 13368 | * b. Update link_vars->link_up |
13347 | */ | 13369 | */ |
@@ -13550,7 +13572,7 @@ static void bnx2x_check_kr2_wa(struct link_params *params, | |||
13550 | */ | 13572 | */ |
13551 | not_kr2_device = (((base_page & 0x8000) == 0) || | 13573 | not_kr2_device = (((base_page & 0x8000) == 0) || |
13552 | (((base_page & 0x8000) && | 13574 | (((base_page & 0x8000) && |
13553 | ((next_page & 0xe0) == 0x2)))); | 13575 | ((next_page & 0xe0) == 0x20)))); |
13554 | 13576 | ||
13555 | /* In case KR2 is already disabled, check if we need to re-enable it */ | 13577 | /* In case KR2 is already disabled, check if we need to re-enable it */ |
13556 | if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { | 13578 | if (!(vars->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index d3748bf3ac7b..18498fed520b 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -11517,9 +11517,9 @@ static int bnx2x_get_hwinfo(struct bnx2x *bp) | |||
11517 | } | 11517 | } |
11518 | } | 11518 | } |
11519 | 11519 | ||
11520 | /* adjust igu_sb_cnt to MF for E1x */ | 11520 | /* adjust igu_sb_cnt to MF for E1H */ |
11521 | if (CHIP_IS_E1x(bp) && IS_MF(bp)) | 11521 | if (CHIP_IS_E1H(bp) && IS_MF(bp)) |
11522 | bp->igu_sb_cnt /= E1HVN_MAX; | 11522 | bp->igu_sb_cnt = min_t(u8, bp->igu_sb_cnt, E1H_MAX_MF_SB_COUNT); |
11523 | 11523 | ||
11524 | /* port info */ | 11524 | /* port info */ |
11525 | bnx2x_get_port_hwinfo(bp); | 11525 | bnx2x_get_port_hwinfo(bp); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h index 08f8047188e9..2beb5430b876 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_reg.h | |||
@@ -7180,6 +7180,7 @@ Theotherbitsarereservedandshouldbezero*/ | |||
7180 | #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca | 7180 | #define MDIO_WC_REG_RX1_PCI_CTRL 0x80ca |
7181 | #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da | 7181 | #define MDIO_WC_REG_RX2_PCI_CTRL 0x80da |
7182 | #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea | 7182 | #define MDIO_WC_REG_RX3_PCI_CTRL 0x80ea |
7183 | #define MDIO_WC_REG_RXB_ANA_RX_CONTROL_PCI 0x80fa | ||
7183 | #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 | 7184 | #define MDIO_WC_REG_XGXSBLK2_UNICORE_MODE_10G 0x8104 |
7184 | #define MDIO_WC_REG_XGXS_STATUS3 0x8129 | 7185 | #define MDIO_WC_REG_XGXS_STATUS3 0x8129 |
7185 | #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 | 7186 | #define MDIO_WC_REG_PAR_DET_10G_STATUS 0x8130 |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c index babf7b954ae6..98cccd487fc2 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.c | |||
@@ -2036,6 +2036,7 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
2036 | struct bnx2x_vlan_mac_ramrod_params p; | 2036 | struct bnx2x_vlan_mac_ramrod_params p; |
2037 | struct bnx2x_exe_queue_obj *exeq = &o->exe_queue; | 2037 | struct bnx2x_exe_queue_obj *exeq = &o->exe_queue; |
2038 | struct bnx2x_exeq_elem *exeq_pos, *exeq_pos_n; | 2038 | struct bnx2x_exeq_elem *exeq_pos, *exeq_pos_n; |
2039 | unsigned long flags; | ||
2039 | int read_lock; | 2040 | int read_lock; |
2040 | int rc = 0; | 2041 | int rc = 0; |
2041 | 2042 | ||
@@ -2044,8 +2045,9 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
2044 | spin_lock_bh(&exeq->lock); | 2045 | spin_lock_bh(&exeq->lock); |
2045 | 2046 | ||
2046 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { | 2047 | list_for_each_entry_safe(exeq_pos, exeq_pos_n, &exeq->exe_queue, link) { |
2047 | if (exeq_pos->cmd_data.vlan_mac.vlan_mac_flags == | 2048 | flags = exeq_pos->cmd_data.vlan_mac.vlan_mac_flags; |
2048 | *vlan_mac_flags) { | 2049 | if (BNX2X_VLAN_MAC_CMP_FLAGS(flags) == |
2050 | BNX2X_VLAN_MAC_CMP_FLAGS(*vlan_mac_flags)) { | ||
2049 | rc = exeq->remove(bp, exeq->owner, exeq_pos); | 2051 | rc = exeq->remove(bp, exeq->owner, exeq_pos); |
2050 | if (rc) { | 2052 | if (rc) { |
2051 | BNX2X_ERR("Failed to remove command\n"); | 2053 | BNX2X_ERR("Failed to remove command\n"); |
@@ -2078,7 +2080,9 @@ static int bnx2x_vlan_mac_del_all(struct bnx2x *bp, | |||
2078 | return read_lock; | 2080 | return read_lock; |
2079 | 2081 | ||
2080 | list_for_each_entry(pos, &o->head, link) { | 2082 | list_for_each_entry(pos, &o->head, link) { |
2081 | if (pos->vlan_mac_flags == *vlan_mac_flags) { | 2083 | flags = pos->vlan_mac_flags; |
2084 | if (BNX2X_VLAN_MAC_CMP_FLAGS(flags) == | ||
2085 | BNX2X_VLAN_MAC_CMP_FLAGS(*vlan_mac_flags)) { | ||
2082 | p.user_req.vlan_mac_flags = pos->vlan_mac_flags; | 2086 | p.user_req.vlan_mac_flags = pos->vlan_mac_flags; |
2083 | memcpy(&p.user_req.u, &pos->u, sizeof(pos->u)); | 2087 | memcpy(&p.user_req.u, &pos->u, sizeof(pos->u)); |
2084 | rc = bnx2x_config_vlan_mac(bp, &p); | 2088 | rc = bnx2x_config_vlan_mac(bp, &p); |
@@ -4380,8 +4384,11 @@ int bnx2x_config_rss(struct bnx2x *bp, | |||
4380 | struct bnx2x_raw_obj *r = &o->raw; | 4384 | struct bnx2x_raw_obj *r = &o->raw; |
4381 | 4385 | ||
4382 | /* Do nothing if only driver cleanup was requested */ | 4386 | /* Do nothing if only driver cleanup was requested */ |
4383 | if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) | 4387 | if (test_bit(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) { |
4388 | DP(BNX2X_MSG_SP, "Not configuring RSS ramrod_flags=%lx\n", | ||
4389 | p->ramrod_flags); | ||
4384 | return 0; | 4390 | return 0; |
4391 | } | ||
4385 | 4392 | ||
4386 | r->set_pending(r); | 4393 | r->set_pending(r); |
4387 | 4394 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h index 658f4e33abf9..6a53c15c85a3 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sp.h | |||
@@ -266,6 +266,13 @@ enum { | |||
266 | BNX2X_DONT_CONSUME_CAM_CREDIT, | 266 | BNX2X_DONT_CONSUME_CAM_CREDIT, |
267 | BNX2X_DONT_CONSUME_CAM_CREDIT_DEST, | 267 | BNX2X_DONT_CONSUME_CAM_CREDIT_DEST, |
268 | }; | 268 | }; |
269 | /* When looking for matching filters, some flags are not interesting */ | ||
270 | #define BNX2X_VLAN_MAC_CMP_MASK (1 << BNX2X_UC_LIST_MAC | \ | ||
271 | 1 << BNX2X_ETH_MAC | \ | ||
272 | 1 << BNX2X_ISCSI_ETH_MAC | \ | ||
273 | 1 << BNX2X_NETQ_ETH_MAC) | ||
274 | #define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \ | ||
275 | ((flags) & BNX2X_VLAN_MAC_CMP_MASK) | ||
269 | 276 | ||
270 | struct bnx2x_vlan_mac_ramrod_params { | 277 | struct bnx2x_vlan_mac_ramrod_params { |
271 | /* Object to run the command from */ | 278 | /* Object to run the command from */ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c index 6fe52d301dfe..31ab924600c1 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | |||
@@ -1213,6 +1213,11 @@ static void bnx2x_vfop_rxmode(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
1213 | /* next state */ | 1213 | /* next state */ |
1214 | vfop->state = BNX2X_VFOP_RXMODE_DONE; | 1214 | vfop->state = BNX2X_VFOP_RXMODE_DONE; |
1215 | 1215 | ||
1216 | /* record the accept flags in vfdb so hypervisor can modify them | ||
1217 | * if necessary | ||
1218 | */ | ||
1219 | bnx2x_vfq(vf, ramrod->cl_id - vf->igu_base_id, accept_flags) = | ||
1220 | ramrod->rx_accept_flags; | ||
1216 | vfop->rc = bnx2x_config_rx_mode(bp, ramrod); | 1221 | vfop->rc = bnx2x_config_rx_mode(bp, ramrod); |
1217 | bnx2x_vfop_finalize(vf, vfop->rc, VFOP_DONE); | 1222 | bnx2x_vfop_finalize(vf, vfop->rc, VFOP_DONE); |
1218 | op_err: | 1223 | op_err: |
@@ -1228,39 +1233,43 @@ op_pending: | |||
1228 | return; | 1233 | return; |
1229 | } | 1234 | } |
1230 | 1235 | ||
1236 | static void bnx2x_vf_prep_rx_mode(struct bnx2x *bp, u8 qid, | ||
1237 | struct bnx2x_rx_mode_ramrod_params *ramrod, | ||
1238 | struct bnx2x_virtf *vf, | ||
1239 | unsigned long accept_flags) | ||
1240 | { | ||
1241 | struct bnx2x_vf_queue *vfq = vfq_get(vf, qid); | ||
1242 | |||
1243 | memset(ramrod, 0, sizeof(*ramrod)); | ||
1244 | ramrod->cid = vfq->cid; | ||
1245 | ramrod->cl_id = vfq_cl_id(vf, vfq); | ||
1246 | ramrod->rx_mode_obj = &bp->rx_mode_obj; | ||
1247 | ramrod->func_id = FW_VF_HANDLE(vf->abs_vfid); | ||
1248 | ramrod->rx_accept_flags = accept_flags; | ||
1249 | ramrod->tx_accept_flags = accept_flags; | ||
1250 | ramrod->pstate = &vf->filter_state; | ||
1251 | ramrod->state = BNX2X_FILTER_RX_MODE_PENDING; | ||
1252 | |||
1253 | set_bit(BNX2X_FILTER_RX_MODE_PENDING, &vf->filter_state); | ||
1254 | set_bit(RAMROD_RX, &ramrod->ramrod_flags); | ||
1255 | set_bit(RAMROD_TX, &ramrod->ramrod_flags); | ||
1256 | |||
1257 | ramrod->rdata = bnx2x_vf_sp(bp, vf, rx_mode_rdata.e2); | ||
1258 | ramrod->rdata_mapping = bnx2x_vf_sp_map(bp, vf, rx_mode_rdata.e2); | ||
1259 | } | ||
1260 | |||
1231 | int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, | 1261 | int bnx2x_vfop_rxmode_cmd(struct bnx2x *bp, |
1232 | struct bnx2x_virtf *vf, | 1262 | struct bnx2x_virtf *vf, |
1233 | struct bnx2x_vfop_cmd *cmd, | 1263 | struct bnx2x_vfop_cmd *cmd, |
1234 | int qid, unsigned long accept_flags) | 1264 | int qid, unsigned long accept_flags) |
1235 | { | 1265 | { |
1236 | struct bnx2x_vf_queue *vfq = vfq_get(vf, qid); | ||
1237 | struct bnx2x_vfop *vfop = bnx2x_vfop_add(bp, vf); | 1266 | struct bnx2x_vfop *vfop = bnx2x_vfop_add(bp, vf); |
1238 | 1267 | ||
1239 | if (vfop) { | 1268 | if (vfop) { |
1240 | struct bnx2x_rx_mode_ramrod_params *ramrod = | 1269 | struct bnx2x_rx_mode_ramrod_params *ramrod = |
1241 | &vf->op_params.rx_mode; | 1270 | &vf->op_params.rx_mode; |
1242 | 1271 | ||
1243 | memset(ramrod, 0, sizeof(*ramrod)); | 1272 | bnx2x_vf_prep_rx_mode(bp, qid, ramrod, vf, accept_flags); |
1244 | |||
1245 | /* Prepare ramrod parameters */ | ||
1246 | ramrod->cid = vfq->cid; | ||
1247 | ramrod->cl_id = vfq_cl_id(vf, vfq); | ||
1248 | ramrod->rx_mode_obj = &bp->rx_mode_obj; | ||
1249 | ramrod->func_id = FW_VF_HANDLE(vf->abs_vfid); | ||
1250 | |||
1251 | ramrod->rx_accept_flags = accept_flags; | ||
1252 | ramrod->tx_accept_flags = accept_flags; | ||
1253 | ramrod->pstate = &vf->filter_state; | ||
1254 | ramrod->state = BNX2X_FILTER_RX_MODE_PENDING; | ||
1255 | |||
1256 | set_bit(BNX2X_FILTER_RX_MODE_PENDING, &vf->filter_state); | ||
1257 | set_bit(RAMROD_RX, &ramrod->ramrod_flags); | ||
1258 | set_bit(RAMROD_TX, &ramrod->ramrod_flags); | ||
1259 | |||
1260 | ramrod->rdata = | ||
1261 | bnx2x_vf_sp(bp, vf, rx_mode_rdata.e2); | ||
1262 | ramrod->rdata_mapping = | ||
1263 | bnx2x_vf_sp_map(bp, vf, rx_mode_rdata.e2); | ||
1264 | 1273 | ||
1265 | bnx2x_vfop_opset(BNX2X_VFOP_RXMODE_CONFIG, | 1274 | bnx2x_vfop_opset(BNX2X_VFOP_RXMODE_CONFIG, |
1266 | bnx2x_vfop_rxmode, cmd->done); | 1275 | bnx2x_vfop_rxmode, cmd->done); |
@@ -3213,13 +3222,16 @@ int bnx2x_enable_sriov(struct bnx2x *bp) | |||
3213 | bnx2x_iov_static_resc(bp, vf); | 3222 | bnx2x_iov_static_resc(bp, vf); |
3214 | } | 3223 | } |
3215 | 3224 | ||
3216 | /* prepare msix vectors in VF configuration space */ | 3225 | /* prepare msix vectors in VF configuration space - the value in the |
3226 | * PCI configuration space should be the index of the last entry, | ||
3227 | * namely one less than the actual size of the table | ||
3228 | */ | ||
3217 | for (vf_idx = first_vf; vf_idx < first_vf + req_vfs; vf_idx++) { | 3229 | for (vf_idx = first_vf; vf_idx < first_vf + req_vfs; vf_idx++) { |
3218 | bnx2x_pretend_func(bp, HW_VF_HANDLE(bp, vf_idx)); | 3230 | bnx2x_pretend_func(bp, HW_VF_HANDLE(bp, vf_idx)); |
3219 | REG_WR(bp, PCICFG_OFFSET + GRC_CONFIG_REG_VF_MSIX_CONTROL, | 3231 | REG_WR(bp, PCICFG_OFFSET + GRC_CONFIG_REG_VF_MSIX_CONTROL, |
3220 | num_vf_queues); | 3232 | num_vf_queues - 1); |
3221 | DP(BNX2X_MSG_IOV, "set msix vec num in VF %d cfg space to %d\n", | 3233 | DP(BNX2X_MSG_IOV, "set msix vec num in VF %d cfg space to %d\n", |
3222 | vf_idx, num_vf_queues); | 3234 | vf_idx, num_vf_queues - 1); |
3223 | } | 3235 | } |
3224 | bnx2x_pretend_func(bp, BP_ABS_FUNC(bp)); | 3236 | bnx2x_pretend_func(bp, BP_ABS_FUNC(bp)); |
3225 | 3237 | ||
@@ -3447,10 +3459,18 @@ out: | |||
3447 | 3459 | ||
3448 | int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) | 3460 | int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) |
3449 | { | 3461 | { |
3462 | struct bnx2x_queue_state_params q_params = {NULL}; | ||
3463 | struct bnx2x_vlan_mac_ramrod_params ramrod_param; | ||
3464 | struct bnx2x_queue_update_params *update_params; | ||
3465 | struct pf_vf_bulletin_content *bulletin = NULL; | ||
3466 | struct bnx2x_rx_mode_ramrod_params rx_ramrod; | ||
3450 | struct bnx2x *bp = netdev_priv(dev); | 3467 | struct bnx2x *bp = netdev_priv(dev); |
3451 | int rc, q_logical_state; | 3468 | struct bnx2x_vlan_mac_obj *vlan_obj; |
3469 | unsigned long vlan_mac_flags = 0; | ||
3470 | unsigned long ramrod_flags = 0; | ||
3452 | struct bnx2x_virtf *vf = NULL; | 3471 | struct bnx2x_virtf *vf = NULL; |
3453 | struct pf_vf_bulletin_content *bulletin = NULL; | 3472 | unsigned long accept_flags; |
3473 | int rc; | ||
3454 | 3474 | ||
3455 | /* sanity and init */ | 3475 | /* sanity and init */ |
3456 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); | 3476 | rc = bnx2x_vf_ndo_prep(bp, vfidx, &vf, &bulletin); |
@@ -3468,104 +3488,118 @@ int bnx2x_set_vf_vlan(struct net_device *dev, int vfidx, u16 vlan, u8 qos) | |||
3468 | /* update PF's copy of the VF's bulletin. No point in posting the vlan | 3488 | /* update PF's copy of the VF's bulletin. No point in posting the vlan |
3469 | * to the VF since it doesn't have anything to do with it. But it useful | 3489 | * to the VF since it doesn't have anything to do with it. But it useful |
3470 | * to store it here in case the VF is not up yet and we can only | 3490 | * to store it here in case the VF is not up yet and we can only |
3471 | * configure the vlan later when it does. | 3491 | * configure the vlan later when it does. Treat vlan id 0 as remove the |
3492 | * Host tag. | ||
3472 | */ | 3493 | */ |
3473 | bulletin->valid_bitmap |= 1 << VLAN_VALID; | 3494 | if (vlan > 0) |
3495 | bulletin->valid_bitmap |= 1 << VLAN_VALID; | ||
3496 | else | ||
3497 | bulletin->valid_bitmap &= ~(1 << VLAN_VALID); | ||
3474 | bulletin->vlan = vlan; | 3498 | bulletin->vlan = vlan; |
3475 | 3499 | ||
3476 | /* is vf initialized and queue set up? */ | 3500 | /* is vf initialized and queue set up? */ |
3477 | q_logical_state = | 3501 | if (vf->state != VF_ENABLED || |
3478 | bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)); | 3502 | bnx2x_get_q_logical_state(bp, &bnx2x_leading_vfq(vf, sp_obj)) != |
3479 | if (vf->state == VF_ENABLED && | 3503 | BNX2X_Q_LOGICAL_STATE_ACTIVE) |
3480 | q_logical_state == BNX2X_Q_LOGICAL_STATE_ACTIVE) { | 3504 | return rc; |
3481 | /* configure the vlan in device on this vf's queue */ | ||
3482 | unsigned long ramrod_flags = 0; | ||
3483 | unsigned long vlan_mac_flags = 0; | ||
3484 | struct bnx2x_vlan_mac_obj *vlan_obj = | ||
3485 | &bnx2x_leading_vfq(vf, vlan_obj); | ||
3486 | struct bnx2x_vlan_mac_ramrod_params ramrod_param; | ||
3487 | struct bnx2x_queue_state_params q_params = {NULL}; | ||
3488 | struct bnx2x_queue_update_params *update_params; | ||
3489 | 3505 | ||
3490 | rc = validate_vlan_mac(bp, &bnx2x_leading_vfq(vf, mac_obj)); | 3506 | /* configure the vlan in device on this vf's queue */ |
3491 | if (rc) | 3507 | vlan_obj = &bnx2x_leading_vfq(vf, vlan_obj); |
3492 | return rc; | 3508 | rc = validate_vlan_mac(bp, &bnx2x_leading_vfq(vf, mac_obj)); |
3493 | memset(&ramrod_param, 0, sizeof(ramrod_param)); | 3509 | if (rc) |
3510 | return rc; | ||
3494 | 3511 | ||
3495 | /* must lock vfpf channel to protect against vf flows */ | 3512 | /* must lock vfpf channel to protect against vf flows */ |
3496 | bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); | 3513 | bnx2x_lock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); |
3497 | 3514 | ||
3498 | /* remove existing vlans */ | 3515 | /* remove existing vlans */ |
3499 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | 3516 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); |
3500 | rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_mac_flags, | 3517 | rc = vlan_obj->delete_all(bp, vlan_obj, &vlan_mac_flags, |
3501 | &ramrod_flags); | 3518 | &ramrod_flags); |
3502 | if (rc) { | 3519 | if (rc) { |
3503 | BNX2X_ERR("failed to delete vlans\n"); | 3520 | BNX2X_ERR("failed to delete vlans\n"); |
3504 | rc = -EINVAL; | 3521 | rc = -EINVAL; |
3505 | goto out; | 3522 | goto out; |
3506 | } | 3523 | } |
3524 | |||
3525 | /* need to remove/add the VF's accept_any_vlan bit */ | ||
3526 | accept_flags = bnx2x_leading_vfq(vf, accept_flags); | ||
3527 | if (vlan) | ||
3528 | clear_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags); | ||
3529 | else | ||
3530 | set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags); | ||
3531 | |||
3532 | bnx2x_vf_prep_rx_mode(bp, LEADING_IDX, &rx_ramrod, vf, | ||
3533 | accept_flags); | ||
3534 | bnx2x_leading_vfq(vf, accept_flags) = accept_flags; | ||
3535 | bnx2x_config_rx_mode(bp, &rx_ramrod); | ||
3536 | |||
3537 | /* configure the new vlan to device */ | ||
3538 | memset(&ramrod_param, 0, sizeof(ramrod_param)); | ||
3539 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | ||
3540 | ramrod_param.vlan_mac_obj = vlan_obj; | ||
3541 | ramrod_param.ramrod_flags = ramrod_flags; | ||
3542 | set_bit(BNX2X_DONT_CONSUME_CAM_CREDIT, | ||
3543 | &ramrod_param.user_req.vlan_mac_flags); | ||
3544 | ramrod_param.user_req.u.vlan.vlan = vlan; | ||
3545 | ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD; | ||
3546 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); | ||
3547 | if (rc) { | ||
3548 | BNX2X_ERR("failed to configure vlan\n"); | ||
3549 | rc = -EINVAL; | ||
3550 | goto out; | ||
3551 | } | ||
3507 | 3552 | ||
3508 | /* send queue update ramrod to configure default vlan and silent | 3553 | /* send queue update ramrod to configure default vlan and silent |
3509 | * vlan removal | 3554 | * vlan removal |
3555 | */ | ||
3556 | __set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags); | ||
3557 | q_params.cmd = BNX2X_Q_CMD_UPDATE; | ||
3558 | q_params.q_obj = &bnx2x_leading_vfq(vf, sp_obj); | ||
3559 | update_params = &q_params.params.update; | ||
3560 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG, | ||
3561 | &update_params->update_flags); | ||
3562 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG, | ||
3563 | &update_params->update_flags); | ||
3564 | if (vlan == 0) { | ||
3565 | /* if vlan is 0 then we want to leave the VF traffic | ||
3566 | * untagged, and leave the incoming traffic untouched | ||
3567 | * (i.e. do not remove any vlan tags). | ||
3510 | */ | 3568 | */ |
3511 | __set_bit(RAMROD_COMP_WAIT, &q_params.ramrod_flags); | 3569 | __clear_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, |
3512 | q_params.cmd = BNX2X_Q_CMD_UPDATE; | 3570 | &update_params->update_flags); |
3513 | q_params.q_obj = &bnx2x_leading_vfq(vf, sp_obj); | 3571 | __clear_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, |
3514 | update_params = &q_params.params.update; | 3572 | &update_params->update_flags); |
3515 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG, | 3573 | } else { |
3574 | /* configure default vlan to vf queue and set silent | ||
3575 | * vlan removal (the vf remains unaware of this vlan). | ||
3576 | */ | ||
3577 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | ||
3516 | &update_params->update_flags); | 3578 | &update_params->update_flags); |
3517 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG, | 3579 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, |
3518 | &update_params->update_flags); | 3580 | &update_params->update_flags); |
3581 | update_params->def_vlan = vlan; | ||
3582 | update_params->silent_removal_value = | ||
3583 | vlan & VLAN_VID_MASK; | ||
3584 | update_params->silent_removal_mask = VLAN_VID_MASK; | ||
3585 | } | ||
3519 | 3586 | ||
3520 | if (vlan == 0) { | 3587 | /* Update the Queue state */ |
3521 | /* if vlan is 0 then we want to leave the VF traffic | 3588 | rc = bnx2x_queue_state_change(bp, &q_params); |
3522 | * untagged, and leave the incoming traffic untouched | 3589 | if (rc) { |
3523 | * (i.e. do not remove any vlan tags). | 3590 | BNX2X_ERR("Failed to configure default VLAN\n"); |
3524 | */ | 3591 | goto out; |
3525 | __clear_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | 3592 | } |
3526 | &update_params->update_flags); | ||
3527 | __clear_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, | ||
3528 | &update_params->update_flags); | ||
3529 | } else { | ||
3530 | /* configure the new vlan to device */ | ||
3531 | __set_bit(RAMROD_COMP_WAIT, &ramrod_flags); | ||
3532 | ramrod_param.vlan_mac_obj = vlan_obj; | ||
3533 | ramrod_param.ramrod_flags = ramrod_flags; | ||
3534 | ramrod_param.user_req.u.vlan.vlan = vlan; | ||
3535 | ramrod_param.user_req.cmd = BNX2X_VLAN_MAC_ADD; | ||
3536 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); | ||
3537 | if (rc) { | ||
3538 | BNX2X_ERR("failed to configure vlan\n"); | ||
3539 | rc = -EINVAL; | ||
3540 | goto out; | ||
3541 | } | ||
3542 | |||
3543 | /* configure default vlan to vf queue and set silent | ||
3544 | * vlan removal (the vf remains unaware of this vlan). | ||
3545 | */ | ||
3546 | update_params = &q_params.params.update; | ||
3547 | __set_bit(BNX2X_Q_UPDATE_DEF_VLAN_EN, | ||
3548 | &update_params->update_flags); | ||
3549 | __set_bit(BNX2X_Q_UPDATE_SILENT_VLAN_REM, | ||
3550 | &update_params->update_flags); | ||
3551 | update_params->def_vlan = vlan; | ||
3552 | } | ||
3553 | 3593 | ||
3554 | /* Update the Queue state */ | ||
3555 | rc = bnx2x_queue_state_change(bp, &q_params); | ||
3556 | if (rc) { | ||
3557 | BNX2X_ERR("Failed to configure default VLAN\n"); | ||
3558 | goto out; | ||
3559 | } | ||
3560 | 3594 | ||
3561 | /* clear the flag indicating that this VF needs its vlan | 3595 | /* clear the flag indicating that this VF needs its vlan |
3562 | * (will only be set if the HV configured the Vlan before vf was | 3596 | * (will only be set if the HV configured the Vlan before vf was |
3563 | * up and we were called because the VF came up later | 3597 | * up and we were called because the VF came up later |
3564 | */ | 3598 | */ |
3565 | out: | 3599 | out: |
3566 | vf->cfg_flags &= ~VF_CFG_VLAN; | 3600 | vf->cfg_flags &= ~VF_CFG_VLAN; |
3567 | bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); | 3601 | bnx2x_unlock_vf_pf_channel(bp, vf, CHANNEL_TLV_PF_SET_VLAN); |
3568 | } | 3602 | |
3569 | return rc; | 3603 | return rc; |
3570 | } | 3604 | } |
3571 | 3605 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h index a5c84a7d454c..d72ab7e24de0 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.h | |||
@@ -74,6 +74,7 @@ struct bnx2x_vf_queue { | |||
74 | /* VLANs object */ | 74 | /* VLANs object */ |
75 | struct bnx2x_vlan_mac_obj vlan_obj; | 75 | struct bnx2x_vlan_mac_obj vlan_obj; |
76 | atomic_t vlan_count; /* 0 means vlan-0 is set ~ untagged */ | 76 | atomic_t vlan_count; /* 0 means vlan-0 is set ~ untagged */ |
77 | unsigned long accept_flags; /* last accept flags configured */ | ||
77 | 78 | ||
78 | /* Queue Slow-path State object */ | 79 | /* Queue Slow-path State object */ |
79 | struct bnx2x_queue_sp_obj sp_obj; | 80 | struct bnx2x_queue_sp_obj sp_obj; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c index e5f7985a372c..1b1ad31b4553 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_vfpf.c | |||
@@ -208,7 +208,7 @@ static int bnx2x_get_vf_id(struct bnx2x *bp, u32 *vf_id) | |||
208 | return -EINVAL; | 208 | return -EINVAL; |
209 | } | 209 | } |
210 | 210 | ||
211 | BNX2X_ERR("valid ME register value: 0x%08x\n", me_reg); | 211 | DP(BNX2X_MSG_IOV, "valid ME register value: 0x%08x\n", me_reg); |
212 | 212 | ||
213 | *vf_id = (me_reg & ME_REG_VF_NUM_MASK) >> ME_REG_VF_NUM_SHIFT; | 213 | *vf_id = (me_reg & ME_REG_VF_NUM_MASK) >> ME_REG_VF_NUM_SHIFT; |
214 | 214 | ||
@@ -1610,6 +1610,8 @@ static void bnx2x_vfop_mbx_qfilters(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
1610 | 1610 | ||
1611 | if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) { | 1611 | if (msg->flags & VFPF_SET_Q_FILTERS_RX_MASK_CHANGED) { |
1612 | unsigned long accept = 0; | 1612 | unsigned long accept = 0; |
1613 | struct pf_vf_bulletin_content *bulletin = | ||
1614 | BP_VF_BULLETIN(bp, vf->index); | ||
1613 | 1615 | ||
1614 | /* covert VF-PF if mask to bnx2x accept flags */ | 1616 | /* covert VF-PF if mask to bnx2x accept flags */ |
1615 | if (msg->rx_mask & VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST) | 1617 | if (msg->rx_mask & VFPF_RX_MASK_ACCEPT_MATCHED_UNICAST) |
@@ -1629,9 +1631,11 @@ static void bnx2x_vfop_mbx_qfilters(struct bnx2x *bp, struct bnx2x_virtf *vf) | |||
1629 | __set_bit(BNX2X_ACCEPT_BROADCAST, &accept); | 1631 | __set_bit(BNX2X_ACCEPT_BROADCAST, &accept); |
1630 | 1632 | ||
1631 | /* A packet arriving the vf's mac should be accepted | 1633 | /* A packet arriving the vf's mac should be accepted |
1632 | * with any vlan | 1634 | * with any vlan, unless a vlan has already been |
1635 | * configured. | ||
1633 | */ | 1636 | */ |
1634 | __set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept); | 1637 | if (!(bulletin->valid_bitmap & (1 << VLAN_VALID))) |
1638 | __set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept); | ||
1635 | 1639 | ||
1636 | /* set rx-mode */ | 1640 | /* set rx-mode */ |
1637 | rc = bnx2x_vfop_rxmode_cmd(bp, vf, &cmd, | 1641 | rc = bnx2x_vfop_rxmode_cmd(bp, vf, &cmd, |
@@ -1722,6 +1726,21 @@ static void bnx2x_vf_mbx_set_q_filters(struct bnx2x *bp, | |||
1722 | goto response; | 1726 | goto response; |
1723 | } | 1727 | } |
1724 | } | 1728 | } |
1729 | /* if vlan was set by hypervisor we don't allow guest to config vlan */ | ||
1730 | if (bulletin->valid_bitmap & 1 << VLAN_VALID) { | ||
1731 | int i; | ||
1732 | |||
1733 | /* search for vlan filters */ | ||
1734 | for (i = 0; i < filters->n_mac_vlan_filters; i++) { | ||
1735 | if (filters->filters[i].flags & | ||
1736 | VFPF_Q_FILTER_VLAN_TAG_VALID) { | ||
1737 | BNX2X_ERR("VF[%d] attempted to configure vlan but one was already set by Hypervisor. Aborting request\n", | ||
1738 | vf->abs_vfid); | ||
1739 | vf->op_rc = -EPERM; | ||
1740 | goto response; | ||
1741 | } | ||
1742 | } | ||
1743 | } | ||
1725 | 1744 | ||
1726 | /* verify vf_qid */ | 1745 | /* verify vf_qid */ |
1727 | if (filters->vf_qid > vf_rxq_count(vf)) | 1746 | if (filters->vf_qid > vf_rxq_count(vf)) |
@@ -1817,6 +1836,9 @@ static void bnx2x_vf_mbx_update_rss(struct bnx2x *bp, struct bnx2x_virtf *vf, | |||
1817 | vf_op_params->rss_result_mask = rss_tlv->rss_result_mask; | 1836 | vf_op_params->rss_result_mask = rss_tlv->rss_result_mask; |
1818 | 1837 | ||
1819 | /* flags handled individually for backward/forward compatability */ | 1838 | /* flags handled individually for backward/forward compatability */ |
1839 | vf_op_params->rss_flags = 0; | ||
1840 | vf_op_params->ramrod_flags = 0; | ||
1841 | |||
1820 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_DISABLED) | 1842 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_DISABLED) |
1821 | __set_bit(BNX2X_RSS_MODE_DISABLED, &vf_op_params->rss_flags); | 1843 | __set_bit(BNX2X_RSS_MODE_DISABLED, &vf_op_params->rss_flags); |
1822 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_REGULAR) | 1844 | if (rss_tlv->rss_flags & VFPF_RSS_MODE_REGULAR) |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index d88ef551dfcd..c37e9f27ff6d 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -7638,7 +7638,7 @@ static inline int tg3_4g_overflow_test(dma_addr_t mapping, int len) | |||
7638 | { | 7638 | { |
7639 | u32 base = (u32) mapping & 0xffffffff; | 7639 | u32 base = (u32) mapping & 0xffffffff; |
7640 | 7640 | ||
7641 | return (base > 0xffffdcc0) && (base + len + 8 < base); | 7641 | return base + len + 8 < base; |
7642 | } | 7642 | } |
7643 | 7643 | ||
7644 | /* Test for TSO DMA buffers that cross into regions which are within MSS bytes | 7644 | /* Test for TSO DMA buffers that cross into regions which are within MSS bytes |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h index 17fe50b91523..b97e35c33d17 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4.h | |||
@@ -228,6 +228,25 @@ struct tp_params { | |||
228 | 228 | ||
229 | uint32_t dack_re; /* DACK timer resolution */ | 229 | uint32_t dack_re; /* DACK timer resolution */ |
230 | unsigned short tx_modq[NCHAN]; /* channel to modulation queue map */ | 230 | unsigned short tx_modq[NCHAN]; /* channel to modulation queue map */ |
231 | |||
232 | u32 vlan_pri_map; /* cached TP_VLAN_PRI_MAP */ | ||
233 | u32 ingress_config; /* cached TP_INGRESS_CONFIG */ | ||
234 | |||
235 | /* TP_VLAN_PRI_MAP Compressed Filter Tuple field offsets. This is a | ||
236 | * subset of the set of fields which may be present in the Compressed | ||
237 | * Filter Tuple portion of filters and TCP TCB connections. The | ||
238 | * fields which are present are controlled by the TP_VLAN_PRI_MAP. | ||
239 | * Since a variable number of fields may or may not be present, their | ||
240 | * shifted field positions within the Compressed Filter Tuple may | ||
241 | * vary, or not even be present if the field isn't selected in | ||
242 | * TP_VLAN_PRI_MAP. Since some of these fields are needed in various | ||
243 | * places we store their offsets here, or a -1 if the field isn't | ||
244 | * present. | ||
245 | */ | ||
246 | int vlan_shift; | ||
247 | int vnic_shift; | ||
248 | int port_shift; | ||
249 | int protocol_shift; | ||
231 | }; | 250 | }; |
232 | 251 | ||
233 | struct vpd_params { | 252 | struct vpd_params { |
@@ -925,6 +944,8 @@ int t4_prep_fw(struct adapter *adap, struct fw_info *fw_info, | |||
925 | const u8 *fw_data, unsigned int fw_size, | 944 | const u8 *fw_data, unsigned int fw_size, |
926 | struct fw_hdr *card_fw, enum dev_state state, int *reset); | 945 | struct fw_hdr *card_fw, enum dev_state state, int *reset); |
927 | int t4_prep_adapter(struct adapter *adapter); | 946 | int t4_prep_adapter(struct adapter *adapter); |
947 | int t4_init_tp_params(struct adapter *adap); | ||
948 | int t4_filter_field_shift(const struct adapter *adap, int filter_sel); | ||
928 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); | 949 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf); |
929 | void t4_fatal_err(struct adapter *adapter); | 950 | void t4_fatal_err(struct adapter *adapter); |
930 | int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid, | 951 | int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index d6b12e035a7d..fff02ed1295e 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
@@ -2986,7 +2986,14 @@ int cxgb4_alloc_stid(struct tid_info *t, int family, void *data) | |||
2986 | if (stid >= 0) { | 2986 | if (stid >= 0) { |
2987 | t->stid_tab[stid].data = data; | 2987 | t->stid_tab[stid].data = data; |
2988 | stid += t->stid_base; | 2988 | stid += t->stid_base; |
2989 | t->stids_in_use++; | 2989 | /* IPv6 requires max of 520 bits or 16 cells in TCAM |
2990 | * This is equivalent to 4 TIDs. With CLIP enabled it | ||
2991 | * needs 2 TIDs. | ||
2992 | */ | ||
2993 | if (family == PF_INET) | ||
2994 | t->stids_in_use++; | ||
2995 | else | ||
2996 | t->stids_in_use += 4; | ||
2990 | } | 2997 | } |
2991 | spin_unlock_bh(&t->stid_lock); | 2998 | spin_unlock_bh(&t->stid_lock); |
2992 | return stid; | 2999 | return stid; |
@@ -3012,7 +3019,8 @@ int cxgb4_alloc_sftid(struct tid_info *t, int family, void *data) | |||
3012 | } | 3019 | } |
3013 | if (stid >= 0) { | 3020 | if (stid >= 0) { |
3014 | t->stid_tab[stid].data = data; | 3021 | t->stid_tab[stid].data = data; |
3015 | stid += t->stid_base; | 3022 | stid -= t->nstids; |
3023 | stid += t->sftid_base; | ||
3016 | t->stids_in_use++; | 3024 | t->stids_in_use++; |
3017 | } | 3025 | } |
3018 | spin_unlock_bh(&t->stid_lock); | 3026 | spin_unlock_bh(&t->stid_lock); |
@@ -3024,14 +3032,24 @@ EXPORT_SYMBOL(cxgb4_alloc_sftid); | |||
3024 | */ | 3032 | */ |
3025 | void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family) | 3033 | void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family) |
3026 | { | 3034 | { |
3027 | stid -= t->stid_base; | 3035 | /* Is it a server filter TID? */ |
3036 | if (t->nsftids && (stid >= t->sftid_base)) { | ||
3037 | stid -= t->sftid_base; | ||
3038 | stid += t->nstids; | ||
3039 | } else { | ||
3040 | stid -= t->stid_base; | ||
3041 | } | ||
3042 | |||
3028 | spin_lock_bh(&t->stid_lock); | 3043 | spin_lock_bh(&t->stid_lock); |
3029 | if (family == PF_INET) | 3044 | if (family == PF_INET) |
3030 | __clear_bit(stid, t->stid_bmap); | 3045 | __clear_bit(stid, t->stid_bmap); |
3031 | else | 3046 | else |
3032 | bitmap_release_region(t->stid_bmap, stid, 2); | 3047 | bitmap_release_region(t->stid_bmap, stid, 2); |
3033 | t->stid_tab[stid].data = NULL; | 3048 | t->stid_tab[stid].data = NULL; |
3034 | t->stids_in_use--; | 3049 | if (family == PF_INET) |
3050 | t->stids_in_use--; | ||
3051 | else | ||
3052 | t->stids_in_use -= 4; | ||
3035 | spin_unlock_bh(&t->stid_lock); | 3053 | spin_unlock_bh(&t->stid_lock); |
3036 | } | 3054 | } |
3037 | EXPORT_SYMBOL(cxgb4_free_stid); | 3055 | EXPORT_SYMBOL(cxgb4_free_stid); |
@@ -3134,6 +3152,7 @@ static int tid_init(struct tid_info *t) | |||
3134 | size_t size; | 3152 | size_t size; |
3135 | unsigned int stid_bmap_size; | 3153 | unsigned int stid_bmap_size; |
3136 | unsigned int natids = t->natids; | 3154 | unsigned int natids = t->natids; |
3155 | struct adapter *adap = container_of(t, struct adapter, tids); | ||
3137 | 3156 | ||
3138 | stid_bmap_size = BITS_TO_LONGS(t->nstids + t->nsftids); | 3157 | stid_bmap_size = BITS_TO_LONGS(t->nstids + t->nsftids); |
3139 | size = t->ntids * sizeof(*t->tid_tab) + | 3158 | size = t->ntids * sizeof(*t->tid_tab) + |
@@ -3167,6 +3186,11 @@ static int tid_init(struct tid_info *t) | |||
3167 | t->afree = t->atid_tab; | 3186 | t->afree = t->atid_tab; |
3168 | } | 3187 | } |
3169 | bitmap_zero(t->stid_bmap, t->nstids + t->nsftids); | 3188 | bitmap_zero(t->stid_bmap, t->nstids + t->nsftids); |
3189 | /* Reserve stid 0 for T4/T5 adapters */ | ||
3190 | if (!t->stid_base && | ||
3191 | (is_t4(adap->params.chip) || is_t5(adap->params.chip))) | ||
3192 | __set_bit(0, t->stid_bmap); | ||
3193 | |||
3170 | return 0; | 3194 | return 0; |
3171 | } | 3195 | } |
3172 | 3196 | ||
@@ -3731,7 +3755,7 @@ static void uld_attach(struct adapter *adap, unsigned int uld) | |||
3731 | lli.ucq_density = 1 << QUEUESPERPAGEPF0_GET( | 3755 | lli.ucq_density = 1 << QUEUESPERPAGEPF0_GET( |
3732 | t4_read_reg(adap, SGE_INGRESS_QUEUES_PER_PAGE_PF) >> | 3756 | t4_read_reg(adap, SGE_INGRESS_QUEUES_PER_PAGE_PF) >> |
3733 | (adap->fn * 4)); | 3757 | (adap->fn * 4)); |
3734 | lli.filt_mode = adap->filter_mode; | 3758 | lli.filt_mode = adap->params.tp.vlan_pri_map; |
3735 | /* MODQ_REQ_MAP sets queues 0-3 to chan 0-3 */ | 3759 | /* MODQ_REQ_MAP sets queues 0-3 to chan 0-3 */ |
3736 | for (i = 0; i < NCHAN; i++) | 3760 | for (i = 0; i < NCHAN; i++) |
3737 | lli.tx_modq[i] = i; | 3761 | lli.tx_modq[i] = i; |
@@ -4179,7 +4203,7 @@ int cxgb4_create_server_filter(const struct net_device *dev, unsigned int stid, | |||
4179 | adap = netdev2adap(dev); | 4203 | adap = netdev2adap(dev); |
4180 | 4204 | ||
4181 | /* Adjust stid to correct filter index */ | 4205 | /* Adjust stid to correct filter index */ |
4182 | stid -= adap->tids.nstids; | 4206 | stid -= adap->tids.sftid_base; |
4183 | stid += adap->tids.nftids; | 4207 | stid += adap->tids.nftids; |
4184 | 4208 | ||
4185 | /* Check to make sure the filter requested is writable ... | 4209 | /* Check to make sure the filter requested is writable ... |
@@ -4205,12 +4229,17 @@ int cxgb4_create_server_filter(const struct net_device *dev, unsigned int stid, | |||
4205 | f->fs.val.lip[i] = val[i]; | 4229 | f->fs.val.lip[i] = val[i]; |
4206 | f->fs.mask.lip[i] = ~0; | 4230 | f->fs.mask.lip[i] = ~0; |
4207 | } | 4231 | } |
4208 | if (adap->filter_mode & F_PORT) { | 4232 | if (adap->params.tp.vlan_pri_map & F_PORT) { |
4209 | f->fs.val.iport = port; | 4233 | f->fs.val.iport = port; |
4210 | f->fs.mask.iport = mask; | 4234 | f->fs.mask.iport = mask; |
4211 | } | 4235 | } |
4212 | } | 4236 | } |
4213 | 4237 | ||
4238 | if (adap->params.tp.vlan_pri_map & F_PROTOCOL) { | ||
4239 | f->fs.val.proto = IPPROTO_TCP; | ||
4240 | f->fs.mask.proto = ~0; | ||
4241 | } | ||
4242 | |||
4214 | f->fs.dirsteer = 1; | 4243 | f->fs.dirsteer = 1; |
4215 | f->fs.iq = queue; | 4244 | f->fs.iq = queue; |
4216 | /* Mark filter as locked */ | 4245 | /* Mark filter as locked */ |
@@ -4237,7 +4266,7 @@ int cxgb4_remove_server_filter(const struct net_device *dev, unsigned int stid, | |||
4237 | adap = netdev2adap(dev); | 4266 | adap = netdev2adap(dev); |
4238 | 4267 | ||
4239 | /* Adjust stid to correct filter index */ | 4268 | /* Adjust stid to correct filter index */ |
4240 | stid -= adap->tids.nstids; | 4269 | stid -= adap->tids.sftid_base; |
4241 | stid += adap->tids.nftids; | 4270 | stid += adap->tids.nftids; |
4242 | 4271 | ||
4243 | f = &adap->tids.ftid_tab[stid]; | 4272 | f = &adap->tids.ftid_tab[stid]; |
@@ -5092,7 +5121,7 @@ static int adap_init0(struct adapter *adap) | |||
5092 | enum dev_state state; | 5121 | enum dev_state state; |
5093 | u32 params[7], val[7]; | 5122 | u32 params[7], val[7]; |
5094 | struct fw_caps_config_cmd caps_cmd; | 5123 | struct fw_caps_config_cmd caps_cmd; |
5095 | int reset = 1, j; | 5124 | int reset = 1; |
5096 | 5125 | ||
5097 | /* | 5126 | /* |
5098 | * Contact FW, advertising Master capability (and potentially forcing | 5127 | * Contact FW, advertising Master capability (and potentially forcing |
@@ -5434,21 +5463,11 @@ static int adap_init0(struct adapter *adap) | |||
5434 | /* | 5463 | /* |
5435 | * These are finalized by FW initialization, load their values now. | 5464 | * These are finalized by FW initialization, load their values now. |
5436 | */ | 5465 | */ |
5437 | v = t4_read_reg(adap, TP_TIMER_RESOLUTION); | ||
5438 | adap->params.tp.tre = TIMERRESOLUTION_GET(v); | ||
5439 | adap->params.tp.dack_re = DELAYEDACKRESOLUTION_GET(v); | ||
5440 | t4_read_mtu_tbl(adap, adap->params.mtus, NULL); | 5466 | t4_read_mtu_tbl(adap, adap->params.mtus, NULL); |
5441 | t4_load_mtus(adap, adap->params.mtus, adap->params.a_wnd, | 5467 | t4_load_mtus(adap, adap->params.mtus, adap->params.a_wnd, |
5442 | adap->params.b_wnd); | 5468 | adap->params.b_wnd); |
5443 | 5469 | ||
5444 | /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */ | 5470 | t4_init_tp_params(adap); |
5445 | for (j = 0; j < NCHAN; j++) | ||
5446 | adap->params.tp.tx_modq[j] = j; | ||
5447 | |||
5448 | t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA, | ||
5449 | &adap->filter_mode, 1, | ||
5450 | TP_VLAN_PRI_MAP); | ||
5451 | |||
5452 | adap->flags |= FW_OK; | 5471 | adap->flags |= FW_OK; |
5453 | return 0; | 5472 | return 0; |
5454 | 5473 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h index 6f21f2451c30..4dd0a82533e4 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_uld.h | |||
@@ -131,7 +131,14 @@ static inline void *lookup_atid(const struct tid_info *t, unsigned int atid) | |||
131 | 131 | ||
132 | static inline void *lookup_stid(const struct tid_info *t, unsigned int stid) | 132 | static inline void *lookup_stid(const struct tid_info *t, unsigned int stid) |
133 | { | 133 | { |
134 | stid -= t->stid_base; | 134 | /* Is it a server filter TID? */ |
135 | if (t->nsftids && (stid >= t->sftid_base)) { | ||
136 | stid -= t->sftid_base; | ||
137 | stid += t->nstids; | ||
138 | } else { | ||
139 | stid -= t->stid_base; | ||
140 | } | ||
141 | |||
135 | return stid < (t->nstids + t->nsftids) ? t->stid_tab[stid].data : NULL; | 142 | return stid < (t->nstids + t->nsftids) ? t->stid_tab[stid].data : NULL; |
136 | } | 143 | } |
137 | 144 | ||
diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c b/drivers/net/ethernet/chelsio/cxgb4/l2t.c index 29878098101e..cb05be905def 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c +++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include "l2t.h" | 45 | #include "l2t.h" |
46 | #include "t4_msg.h" | 46 | #include "t4_msg.h" |
47 | #include "t4fw_api.h" | 47 | #include "t4fw_api.h" |
48 | #include "t4_regs.h" | ||
48 | 49 | ||
49 | #define VLAN_NONE 0xfff | 50 | #define VLAN_NONE 0xfff |
50 | 51 | ||
@@ -411,6 +412,40 @@ done: | |||
411 | } | 412 | } |
412 | EXPORT_SYMBOL(cxgb4_l2t_get); | 413 | EXPORT_SYMBOL(cxgb4_l2t_get); |
413 | 414 | ||
415 | u64 cxgb4_select_ntuple(struct net_device *dev, | ||
416 | const struct l2t_entry *l2t) | ||
417 | { | ||
418 | struct adapter *adap = netdev2adap(dev); | ||
419 | struct tp_params *tp = &adap->params.tp; | ||
420 | u64 ntuple = 0; | ||
421 | |||
422 | /* Initialize each of the fields which we care about which are present | ||
423 | * in the Compressed Filter Tuple. | ||
424 | */ | ||
425 | if (tp->vlan_shift >= 0 && l2t->vlan != VLAN_NONE) | ||
426 | ntuple |= (F_FT_VLAN_VLD | l2t->vlan) << tp->vlan_shift; | ||
427 | |||
428 | if (tp->port_shift >= 0) | ||
429 | ntuple |= (u64)l2t->lport << tp->port_shift; | ||
430 | |||
431 | if (tp->protocol_shift >= 0) | ||
432 | ntuple |= (u64)IPPROTO_TCP << tp->protocol_shift; | ||
433 | |||
434 | if (tp->vnic_shift >= 0) { | ||
435 | u32 viid = cxgb4_port_viid(dev); | ||
436 | u32 vf = FW_VIID_VIN_GET(viid); | ||
437 | u32 pf = FW_VIID_PFN_GET(viid); | ||
438 | u32 vld = FW_VIID_VIVLD_GET(viid); | ||
439 | |||
440 | ntuple |= (u64)(V_FT_VNID_ID_VF(vf) | | ||
441 | V_FT_VNID_ID_PF(pf) | | ||
442 | V_FT_VNID_ID_VLD(vld)) << tp->vnic_shift; | ||
443 | } | ||
444 | |||
445 | return ntuple; | ||
446 | } | ||
447 | EXPORT_SYMBOL(cxgb4_select_ntuple); | ||
448 | |||
414 | /* | 449 | /* |
415 | * Called when address resolution fails for an L2T entry to handle packets | 450 | * Called when address resolution fails for an L2T entry to handle packets |
416 | * on the arpq head. If a packet specifies a failure handler it is invoked, | 451 | * on the arpq head. If a packet specifies a failure handler it is invoked, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.h b/drivers/net/ethernet/chelsio/cxgb4/l2t.h index 108c0f1fce1c..85eb5c71358d 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/l2t.h +++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.h | |||
@@ -98,7 +98,8 @@ int cxgb4_l2t_send(struct net_device *dev, struct sk_buff *skb, | |||
98 | struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh, | 98 | struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh, |
99 | const struct net_device *physdev, | 99 | const struct net_device *physdev, |
100 | unsigned int priority); | 100 | unsigned int priority); |
101 | 101 | u64 cxgb4_select_ntuple(struct net_device *dev, | |
102 | const struct l2t_entry *l2t); | ||
102 | void t4_l2t_update(struct adapter *adap, struct neighbour *neigh); | 103 | void t4_l2t_update(struct adapter *adap, struct neighbour *neigh); |
103 | struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d); | 104 | struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d); |
104 | int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan, | 105 | int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan, |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c index 42745438c1e0..47ffa64fcf19 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/sge.c +++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c | |||
@@ -2583,7 +2583,7 @@ static int t4_sge_init_soft(struct adapter *adap) | |||
2583 | #undef READ_FL_BUF | 2583 | #undef READ_FL_BUF |
2584 | 2584 | ||
2585 | if (fl_small_pg != PAGE_SIZE || | 2585 | if (fl_small_pg != PAGE_SIZE || |
2586 | (fl_large_pg != 0 && (fl_large_pg <= fl_small_pg || | 2586 | (fl_large_pg != 0 && (fl_large_pg < fl_small_pg || |
2587 | (fl_large_pg & (fl_large_pg-1)) != 0))) { | 2587 | (fl_large_pg & (fl_large_pg-1)) != 0))) { |
2588 | dev_err(adap->pdev_dev, "bad SGE FL page buffer sizes [%d, %d]\n", | 2588 | dev_err(adap->pdev_dev, "bad SGE FL page buffer sizes [%d, %d]\n", |
2589 | fl_small_pg, fl_large_pg); | 2589 | fl_small_pg, fl_large_pg); |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c index 9903a66b7bad..a3964753935c 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c | |||
@@ -3682,6 +3682,109 @@ int t4_prep_adapter(struct adapter *adapter) | |||
3682 | return 0; | 3682 | return 0; |
3683 | } | 3683 | } |
3684 | 3684 | ||
3685 | /** | ||
3686 | * t4_init_tp_params - initialize adap->params.tp | ||
3687 | * @adap: the adapter | ||
3688 | * | ||
3689 | * Initialize various fields of the adapter's TP Parameters structure. | ||
3690 | */ | ||
3691 | int t4_init_tp_params(struct adapter *adap) | ||
3692 | { | ||
3693 | int chan; | ||
3694 | u32 v; | ||
3695 | |||
3696 | v = t4_read_reg(adap, TP_TIMER_RESOLUTION); | ||
3697 | adap->params.tp.tre = TIMERRESOLUTION_GET(v); | ||
3698 | adap->params.tp.dack_re = DELAYEDACKRESOLUTION_GET(v); | ||
3699 | |||
3700 | /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */ | ||
3701 | for (chan = 0; chan < NCHAN; chan++) | ||
3702 | adap->params.tp.tx_modq[chan] = chan; | ||
3703 | |||
3704 | /* Cache the adapter's Compressed Filter Mode and global Incress | ||
3705 | * Configuration. | ||
3706 | */ | ||
3707 | t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA, | ||
3708 | &adap->params.tp.vlan_pri_map, 1, | ||
3709 | TP_VLAN_PRI_MAP); | ||
3710 | t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA, | ||
3711 | &adap->params.tp.ingress_config, 1, | ||
3712 | TP_INGRESS_CONFIG); | ||
3713 | |||
3714 | /* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field | ||
3715 | * shift positions of several elements of the Compressed Filter Tuple | ||
3716 | * for this adapter which we need frequently ... | ||
3717 | */ | ||
3718 | adap->params.tp.vlan_shift = t4_filter_field_shift(adap, F_VLAN); | ||
3719 | adap->params.tp.vnic_shift = t4_filter_field_shift(adap, F_VNIC_ID); | ||
3720 | adap->params.tp.port_shift = t4_filter_field_shift(adap, F_PORT); | ||
3721 | adap->params.tp.protocol_shift = t4_filter_field_shift(adap, | ||
3722 | F_PROTOCOL); | ||
3723 | |||
3724 | /* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID | ||
3725 | * represents the presense of an Outer VLAN instead of a VNIC ID. | ||
3726 | */ | ||
3727 | if ((adap->params.tp.ingress_config & F_VNIC) == 0) | ||
3728 | adap->params.tp.vnic_shift = -1; | ||
3729 | |||
3730 | return 0; | ||
3731 | } | ||
3732 | |||
3733 | /** | ||
3734 | * t4_filter_field_shift - calculate filter field shift | ||
3735 | * @adap: the adapter | ||
3736 | * @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits) | ||
3737 | * | ||
3738 | * Return the shift position of a filter field within the Compressed | ||
3739 | * Filter Tuple. The filter field is specified via its selection bit | ||
3740 | * within TP_VLAN_PRI_MAL (filter mode). E.g. F_VLAN. | ||
3741 | */ | ||
3742 | int t4_filter_field_shift(const struct adapter *adap, int filter_sel) | ||
3743 | { | ||
3744 | unsigned int filter_mode = adap->params.tp.vlan_pri_map; | ||
3745 | unsigned int sel; | ||
3746 | int field_shift; | ||
3747 | |||
3748 | if ((filter_mode & filter_sel) == 0) | ||
3749 | return -1; | ||
3750 | |||
3751 | for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) { | ||
3752 | switch (filter_mode & sel) { | ||
3753 | case F_FCOE: | ||
3754 | field_shift += W_FT_FCOE; | ||
3755 | break; | ||
3756 | case F_PORT: | ||
3757 | field_shift += W_FT_PORT; | ||
3758 | break; | ||
3759 | case F_VNIC_ID: | ||
3760 | field_shift += W_FT_VNIC_ID; | ||
3761 | break; | ||
3762 | case F_VLAN: | ||
3763 | field_shift += W_FT_VLAN; | ||
3764 | break; | ||
3765 | case F_TOS: | ||
3766 | field_shift += W_FT_TOS; | ||
3767 | break; | ||
3768 | case F_PROTOCOL: | ||
3769 | field_shift += W_FT_PROTOCOL; | ||
3770 | break; | ||
3771 | case F_ETHERTYPE: | ||
3772 | field_shift += W_FT_ETHERTYPE; | ||
3773 | break; | ||
3774 | case F_MACMATCH: | ||
3775 | field_shift += W_FT_MACMATCH; | ||
3776 | break; | ||
3777 | case F_MPSHITTYPE: | ||
3778 | field_shift += W_FT_MPSHITTYPE; | ||
3779 | break; | ||
3780 | case F_FRAGMENTATION: | ||
3781 | field_shift += W_FT_FRAGMENTATION; | ||
3782 | break; | ||
3783 | } | ||
3784 | } | ||
3785 | return field_shift; | ||
3786 | } | ||
3787 | |||
3685 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf) | 3788 | int t4_port_init(struct adapter *adap, int mbox, int pf, int vf) |
3686 | { | 3789 | { |
3687 | u8 addr[6]; | 3790 | u8 addr[6]; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h b/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h index 0a8205d69d2c..4082522d8140 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h +++ b/drivers/net/ethernet/chelsio/cxgb4/t4_regs.h | |||
@@ -1171,10 +1171,50 @@ | |||
1171 | 1171 | ||
1172 | #define A_TP_TX_SCHED_PCMD 0x25 | 1172 | #define A_TP_TX_SCHED_PCMD 0x25 |
1173 | 1173 | ||
1174 | #define S_VNIC 11 | ||
1175 | #define V_VNIC(x) ((x) << S_VNIC) | ||
1176 | #define F_VNIC V_VNIC(1U) | ||
1177 | |||
1178 | #define S_FRAGMENTATION 9 | ||
1179 | #define V_FRAGMENTATION(x) ((x) << S_FRAGMENTATION) | ||
1180 | #define F_FRAGMENTATION V_FRAGMENTATION(1U) | ||
1181 | |||
1182 | #define S_MPSHITTYPE 8 | ||
1183 | #define V_MPSHITTYPE(x) ((x) << S_MPSHITTYPE) | ||
1184 | #define F_MPSHITTYPE V_MPSHITTYPE(1U) | ||
1185 | |||
1186 | #define S_MACMATCH 7 | ||
1187 | #define V_MACMATCH(x) ((x) << S_MACMATCH) | ||
1188 | #define F_MACMATCH V_MACMATCH(1U) | ||
1189 | |||
1190 | #define S_ETHERTYPE 6 | ||
1191 | #define V_ETHERTYPE(x) ((x) << S_ETHERTYPE) | ||
1192 | #define F_ETHERTYPE V_ETHERTYPE(1U) | ||
1193 | |||
1194 | #define S_PROTOCOL 5 | ||
1195 | #define V_PROTOCOL(x) ((x) << S_PROTOCOL) | ||
1196 | #define F_PROTOCOL V_PROTOCOL(1U) | ||
1197 | |||
1198 | #define S_TOS 4 | ||
1199 | #define V_TOS(x) ((x) << S_TOS) | ||
1200 | #define F_TOS V_TOS(1U) | ||
1201 | |||
1202 | #define S_VLAN 3 | ||
1203 | #define V_VLAN(x) ((x) << S_VLAN) | ||
1204 | #define F_VLAN V_VLAN(1U) | ||
1205 | |||
1206 | #define S_VNIC_ID 2 | ||
1207 | #define V_VNIC_ID(x) ((x) << S_VNIC_ID) | ||
1208 | #define F_VNIC_ID V_VNIC_ID(1U) | ||
1209 | |||
1174 | #define S_PORT 1 | 1210 | #define S_PORT 1 |
1175 | #define V_PORT(x) ((x) << S_PORT) | 1211 | #define V_PORT(x) ((x) << S_PORT) |
1176 | #define F_PORT V_PORT(1U) | 1212 | #define F_PORT V_PORT(1U) |
1177 | 1213 | ||
1214 | #define S_FCOE 0 | ||
1215 | #define V_FCOE(x) ((x) << S_FCOE) | ||
1216 | #define F_FCOE V_FCOE(1U) | ||
1217 | |||
1178 | #define NUM_MPS_CLS_SRAM_L_INSTANCES 336 | 1218 | #define NUM_MPS_CLS_SRAM_L_INSTANCES 336 |
1179 | #define NUM_MPS_T5_CLS_SRAM_L_INSTANCES 512 | 1219 | #define NUM_MPS_T5_CLS_SRAM_L_INSTANCES 512 |
1180 | 1220 | ||
@@ -1213,4 +1253,37 @@ | |||
1213 | #define V_CHIPID(x) ((x) << S_CHIPID) | 1253 | #define V_CHIPID(x) ((x) << S_CHIPID) |
1214 | #define G_CHIPID(x) (((x) >> S_CHIPID) & M_CHIPID) | 1254 | #define G_CHIPID(x) (((x) >> S_CHIPID) & M_CHIPID) |
1215 | 1255 | ||
1256 | /* TP_VLAN_PRI_MAP controls which subset of fields will be present in the | ||
1257 | * Compressed Filter Tuple for LE filters. Each bit set in TP_VLAN_PRI_MAP | ||
1258 | * selects for a particular field being present. These fields, when present | ||
1259 | * in the Compressed Filter Tuple, have the following widths in bits. | ||
1260 | */ | ||
1261 | #define W_FT_FCOE 1 | ||
1262 | #define W_FT_PORT 3 | ||
1263 | #define W_FT_VNIC_ID 17 | ||
1264 | #define W_FT_VLAN 17 | ||
1265 | #define W_FT_TOS 8 | ||
1266 | #define W_FT_PROTOCOL 8 | ||
1267 | #define W_FT_ETHERTYPE 16 | ||
1268 | #define W_FT_MACMATCH 9 | ||
1269 | #define W_FT_MPSHITTYPE 3 | ||
1270 | #define W_FT_FRAGMENTATION 1 | ||
1271 | |||
1272 | /* Some of the Compressed Filter Tuple fields have internal structure. These | ||
1273 | * bit shifts/masks describe those structures. All shifts are relative to the | ||
1274 | * base position of the fields within the Compressed Filter Tuple | ||
1275 | */ | ||
1276 | #define S_FT_VLAN_VLD 16 | ||
1277 | #define V_FT_VLAN_VLD(x) ((x) << S_FT_VLAN_VLD) | ||
1278 | #define F_FT_VLAN_VLD V_FT_VLAN_VLD(1U) | ||
1279 | |||
1280 | #define S_FT_VNID_ID_VF 0 | ||
1281 | #define V_FT_VNID_ID_VF(x) ((x) << S_FT_VNID_ID_VF) | ||
1282 | |||
1283 | #define S_FT_VNID_ID_PF 7 | ||
1284 | #define V_FT_VNID_ID_PF(x) ((x) << S_FT_VNID_ID_PF) | ||
1285 | |||
1286 | #define S_FT_VNID_ID_VLD 16 | ||
1287 | #define V_FT_VNID_ID_VLD(x) ((x) << S_FT_VNID_ID_VLD) | ||
1288 | |||
1216 | #endif /* __T4_REGS_H */ | 1289 | #endif /* __T4_REGS_H */ |
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index 5878df619b53..4ccaf9af6fc9 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -104,6 +104,7 @@ static inline char *nic_name(struct pci_dev *pdev) | |||
104 | #define BE3_MAX_RSS_QS 16 | 104 | #define BE3_MAX_RSS_QS 16 |
105 | #define BE3_MAX_TX_QS 16 | 105 | #define BE3_MAX_TX_QS 16 |
106 | #define BE3_MAX_EVT_QS 16 | 106 | #define BE3_MAX_EVT_QS 16 |
107 | #define BE3_SRIOV_MAX_EVT_QS 8 | ||
107 | 108 | ||
108 | #define MAX_RX_QS 32 | 109 | #define MAX_RX_QS 32 |
109 | #define MAX_EVT_QS 32 | 110 | #define MAX_EVT_QS 32 |
@@ -480,7 +481,7 @@ struct be_adapter { | |||
480 | struct list_head entry; | 481 | struct list_head entry; |
481 | 482 | ||
482 | u32 flash_status; | 483 | u32 flash_status; |
483 | struct completion flash_compl; | 484 | struct completion et_cmd_compl; |
484 | 485 | ||
485 | struct be_resources res; /* resources available for the func */ | 486 | struct be_resources res; /* resources available for the func */ |
486 | u16 num_vfs; /* Number of VFs provisioned by PF */ | 487 | u16 num_vfs; /* Number of VFs provisioned by PF */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index e0e8bc1ef14c..94c35c8d799d 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -141,11 +141,17 @@ static int be_mcc_compl_process(struct be_adapter *adapter, | |||
141 | subsystem = resp_hdr->subsystem; | 141 | subsystem = resp_hdr->subsystem; |
142 | } | 142 | } |
143 | 143 | ||
144 | if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST && | ||
145 | subsystem == CMD_SUBSYSTEM_LOWLEVEL) { | ||
146 | complete(&adapter->et_cmd_compl); | ||
147 | return 0; | ||
148 | } | ||
149 | |||
144 | if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) || | 150 | if (((opcode == OPCODE_COMMON_WRITE_FLASHROM) || |
145 | (opcode == OPCODE_COMMON_WRITE_OBJECT)) && | 151 | (opcode == OPCODE_COMMON_WRITE_OBJECT)) && |
146 | (subsystem == CMD_SUBSYSTEM_COMMON)) { | 152 | (subsystem == CMD_SUBSYSTEM_COMMON)) { |
147 | adapter->flash_status = compl_status; | 153 | adapter->flash_status = compl_status; |
148 | complete(&adapter->flash_compl); | 154 | complete(&adapter->et_cmd_compl); |
149 | } | 155 | } |
150 | 156 | ||
151 | if (compl_status == MCC_STATUS_SUCCESS) { | 157 | if (compl_status == MCC_STATUS_SUCCESS) { |
@@ -2017,6 +2023,9 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, | |||
2017 | 0x3ea83c02, 0x4a110304}; | 2023 | 0x3ea83c02, 0x4a110304}; |
2018 | int status; | 2024 | int status; |
2019 | 2025 | ||
2026 | if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS)) | ||
2027 | return 0; | ||
2028 | |||
2020 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | 2029 | if (mutex_lock_interruptible(&adapter->mbox_lock)) |
2021 | return -1; | 2030 | return -1; |
2022 | 2031 | ||
@@ -2160,7 +2169,7 @@ int lancer_cmd_write_object(struct be_adapter *adapter, struct be_dma_mem *cmd, | |||
2160 | be_mcc_notify(adapter); | 2169 | be_mcc_notify(adapter); |
2161 | spin_unlock_bh(&adapter->mcc_lock); | 2170 | spin_unlock_bh(&adapter->mcc_lock); |
2162 | 2171 | ||
2163 | if (!wait_for_completion_timeout(&adapter->flash_compl, | 2172 | if (!wait_for_completion_timeout(&adapter->et_cmd_compl, |
2164 | msecs_to_jiffies(60000))) | 2173 | msecs_to_jiffies(60000))) |
2165 | status = -1; | 2174 | status = -1; |
2166 | else | 2175 | else |
@@ -2255,8 +2264,8 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd, | |||
2255 | be_mcc_notify(adapter); | 2264 | be_mcc_notify(adapter); |
2256 | spin_unlock_bh(&adapter->mcc_lock); | 2265 | spin_unlock_bh(&adapter->mcc_lock); |
2257 | 2266 | ||
2258 | if (!wait_for_completion_timeout(&adapter->flash_compl, | 2267 | if (!wait_for_completion_timeout(&adapter->et_cmd_compl, |
2259 | msecs_to_jiffies(40000))) | 2268 | msecs_to_jiffies(40000))) |
2260 | status = -1; | 2269 | status = -1; |
2261 | else | 2270 | else |
2262 | status = adapter->flash_status; | 2271 | status = adapter->flash_status; |
@@ -2367,6 +2376,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
2367 | { | 2376 | { |
2368 | struct be_mcc_wrb *wrb; | 2377 | struct be_mcc_wrb *wrb; |
2369 | struct be_cmd_req_loopback_test *req; | 2378 | struct be_cmd_req_loopback_test *req; |
2379 | struct be_cmd_resp_loopback_test *resp; | ||
2370 | int status; | 2380 | int status; |
2371 | 2381 | ||
2372 | spin_lock_bh(&adapter->mcc_lock); | 2382 | spin_lock_bh(&adapter->mcc_lock); |
@@ -2381,8 +2391,8 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
2381 | 2391 | ||
2382 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, | 2392 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, |
2383 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL); | 2393 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb, NULL); |
2384 | req->hdr.timeout = cpu_to_le32(4); | ||
2385 | 2394 | ||
2395 | req->hdr.timeout = cpu_to_le32(15); | ||
2386 | req->pattern = cpu_to_le64(pattern); | 2396 | req->pattern = cpu_to_le64(pattern); |
2387 | req->src_port = cpu_to_le32(port_num); | 2397 | req->src_port = cpu_to_le32(port_num); |
2388 | req->dest_port = cpu_to_le32(port_num); | 2398 | req->dest_port = cpu_to_le32(port_num); |
@@ -2390,12 +2400,15 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
2390 | req->num_pkts = cpu_to_le32(num_pkts); | 2400 | req->num_pkts = cpu_to_le32(num_pkts); |
2391 | req->loopback_type = cpu_to_le32(loopback_type); | 2401 | req->loopback_type = cpu_to_le32(loopback_type); |
2392 | 2402 | ||
2393 | status = be_mcc_notify_wait(adapter); | 2403 | be_mcc_notify(adapter); |
2394 | if (!status) { | 2404 | |
2395 | struct be_cmd_resp_loopback_test *resp = embedded_payload(wrb); | 2405 | spin_unlock_bh(&adapter->mcc_lock); |
2396 | status = le32_to_cpu(resp->status); | ||
2397 | } | ||
2398 | 2406 | ||
2407 | wait_for_completion(&adapter->et_cmd_compl); | ||
2408 | resp = embedded_payload(wrb); | ||
2409 | status = le32_to_cpu(resp->status); | ||
2410 | |||
2411 | return status; | ||
2399 | err: | 2412 | err: |
2400 | spin_unlock_bh(&adapter->mcc_lock); | 2413 | spin_unlock_bh(&adapter->mcc_lock); |
2401 | return status; | 2414 | return status; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index b5c238aa6861..3acf137b5784 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -2744,13 +2744,16 @@ static int be_rx_qs_create(struct be_adapter *adapter) | |||
2744 | if (!BEx_chip(adapter)) | 2744 | if (!BEx_chip(adapter)) |
2745 | adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 | | 2745 | adapter->rss_flags |= RSS_ENABLE_UDP_IPV4 | |
2746 | RSS_ENABLE_UDP_IPV6; | 2746 | RSS_ENABLE_UDP_IPV6; |
2747 | } else { | ||
2748 | /* Disable RSS, if only default RX Q is created */ | ||
2749 | adapter->rss_flags = RSS_ENABLE_NONE; | ||
2750 | } | ||
2747 | 2751 | ||
2748 | rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags, | 2752 | rc = be_cmd_rss_config(adapter, rsstable, adapter->rss_flags, |
2749 | 128); | 2753 | 128); |
2750 | if (rc) { | 2754 | if (rc) { |
2751 | adapter->rss_flags = 0; | 2755 | adapter->rss_flags = RSS_ENABLE_NONE; |
2752 | return rc; | 2756 | return rc; |
2753 | } | ||
2754 | } | 2757 | } |
2755 | 2758 | ||
2756 | /* First time posting */ | 2759 | /* First time posting */ |
@@ -3124,11 +3127,11 @@ static void BEx_get_resources(struct be_adapter *adapter, | |||
3124 | { | 3127 | { |
3125 | struct pci_dev *pdev = adapter->pdev; | 3128 | struct pci_dev *pdev = adapter->pdev; |
3126 | bool use_sriov = false; | 3129 | bool use_sriov = false; |
3130 | int max_vfs; | ||
3127 | 3131 | ||
3128 | if (BE3_chip(adapter) && sriov_want(adapter)) { | 3132 | max_vfs = pci_sriov_get_totalvfs(pdev); |
3129 | int max_vfs; | ||
3130 | 3133 | ||
3131 | max_vfs = pci_sriov_get_totalvfs(pdev); | 3134 | if (BE3_chip(adapter) && sriov_want(adapter)) { |
3132 | res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0; | 3135 | res->max_vfs = max_vfs > 0 ? min(MAX_VFS, max_vfs) : 0; |
3133 | use_sriov = res->max_vfs; | 3136 | use_sriov = res->max_vfs; |
3134 | } | 3137 | } |
@@ -3159,7 +3162,11 @@ static void BEx_get_resources(struct be_adapter *adapter, | |||
3159 | BE3_MAX_RSS_QS : BE2_MAX_RSS_QS; | 3162 | BE3_MAX_RSS_QS : BE2_MAX_RSS_QS; |
3160 | res->max_rx_qs = res->max_rss_qs + 1; | 3163 | res->max_rx_qs = res->max_rss_qs + 1; |
3161 | 3164 | ||
3162 | res->max_evt_qs = be_physfn(adapter) ? BE3_MAX_EVT_QS : 1; | 3165 | if (be_physfn(adapter)) |
3166 | res->max_evt_qs = (max_vfs > 0) ? | ||
3167 | BE3_SRIOV_MAX_EVT_QS : BE3_MAX_EVT_QS; | ||
3168 | else | ||
3169 | res->max_evt_qs = 1; | ||
3163 | 3170 | ||
3164 | res->if_cap_flags = BE_IF_CAP_FLAGS_WANT; | 3171 | res->if_cap_flags = BE_IF_CAP_FLAGS_WANT; |
3165 | if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) | 3172 | if (!(adapter->function_caps & BE_FUNCTION_CAPS_RSS)) |
@@ -4205,7 +4212,7 @@ static int be_ctrl_init(struct be_adapter *adapter) | |||
4205 | spin_lock_init(&adapter->mcc_lock); | 4212 | spin_lock_init(&adapter->mcc_lock); |
4206 | spin_lock_init(&adapter->mcc_cq_lock); | 4213 | spin_lock_init(&adapter->mcc_cq_lock); |
4207 | 4214 | ||
4208 | init_completion(&adapter->flash_compl); | 4215 | init_completion(&adapter->et_cmd_compl); |
4209 | pci_save_state(adapter->pdev); | 4216 | pci_save_state(adapter->pdev); |
4210 | return 0; | 4217 | return 0; |
4211 | 4218 | ||
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 05cd81aa9813..6530177d53e7 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -428,6 +428,8 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
428 | /* If this was the last BD in the ring, start at the beginning again. */ | 428 | /* If this was the last BD in the ring, start at the beginning again. */ |
429 | bdp = fec_enet_get_nextdesc(bdp, fep); | 429 | bdp = fec_enet_get_nextdesc(bdp, fep); |
430 | 430 | ||
431 | skb_tx_timestamp(skb); | ||
432 | |||
431 | fep->cur_tx = bdp; | 433 | fep->cur_tx = bdp; |
432 | 434 | ||
433 | if (fep->cur_tx == fep->dirty_tx) | 435 | if (fep->cur_tx == fep->dirty_tx) |
@@ -436,8 +438,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) | |||
436 | /* Trigger transmission start */ | 438 | /* Trigger transmission start */ |
437 | writel(0, fep->hwp + FEC_X_DES_ACTIVE); | 439 | writel(0, fep->hwp + FEC_X_DES_ACTIVE); |
438 | 440 | ||
439 | skb_tx_timestamp(skb); | ||
440 | |||
441 | return NETDEV_TX_OK; | 441 | return NETDEV_TX_OK; |
442 | } | 442 | } |
443 | 443 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/80003es2lan.c b/drivers/net/ethernet/intel/e1000e/80003es2lan.c index 895450e9bb3c..ff2d806eaef7 100644 --- a/drivers/net/ethernet/intel/e1000e/80003es2lan.c +++ b/drivers/net/ethernet/intel/e1000e/80003es2lan.c | |||
@@ -718,8 +718,11 @@ static s32 e1000_reset_hw_80003es2lan(struct e1000_hw *hw) | |||
718 | e1000_release_phy_80003es2lan(hw); | 718 | e1000_release_phy_80003es2lan(hw); |
719 | 719 | ||
720 | /* Disable IBIST slave mode (far-end loopback) */ | 720 | /* Disable IBIST slave mode (far-end loopback) */ |
721 | e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, | 721 | ret_val = |
722 | &kum_reg_data); | 722 | e1000_read_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, |
723 | &kum_reg_data); | ||
724 | if (ret_val) | ||
725 | return ret_val; | ||
723 | kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE; | 726 | kum_reg_data |= E1000_KMRNCTRLSTA_IBIST_DISABLE; |
724 | e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, | 727 | e1000_write_kmrn_reg_80003es2lan(hw, E1000_KMRNCTRLSTA_INBAND_PARAM, |
725 | kum_reg_data); | 728 | kum_reg_data); |
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 051d1583e211..d6570b2d5a6b 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
@@ -6184,7 +6184,7 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
6184 | return 0; | 6184 | return 0; |
6185 | } | 6185 | } |
6186 | 6186 | ||
6187 | #ifdef CONFIG_PM_SLEEP | 6187 | #ifdef CONFIG_PM |
6188 | static int e1000_suspend(struct device *dev) | 6188 | static int e1000_suspend(struct device *dev) |
6189 | { | 6189 | { |
6190 | struct pci_dev *pdev = to_pci_dev(dev); | 6190 | struct pci_dev *pdev = to_pci_dev(dev); |
@@ -6203,7 +6203,7 @@ static int e1000_resume(struct device *dev) | |||
6203 | 6203 | ||
6204 | return __e1000_resume(pdev); | 6204 | return __e1000_resume(pdev); |
6205 | } | 6205 | } |
6206 | #endif /* CONFIG_PM_SLEEP */ | 6206 | #endif /* CONFIG_PM */ |
6207 | 6207 | ||
6208 | #ifdef CONFIG_PM_RUNTIME | 6208 | #ifdef CONFIG_PM_RUNTIME |
6209 | static int e1000_runtime_suspend(struct device *dev) | 6209 | static int e1000_runtime_suspend(struct device *dev) |
diff --git a/drivers/net/ethernet/intel/e1000e/phy.c b/drivers/net/ethernet/intel/e1000e/phy.c index da2be59505c0..20e71f4ca426 100644 --- a/drivers/net/ethernet/intel/e1000e/phy.c +++ b/drivers/net/ethernet/intel/e1000e/phy.c | |||
@@ -1757,19 +1757,23 @@ s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, | |||
1757 | * it across the board. | 1757 | * it across the board. |
1758 | */ | 1758 | */ |
1759 | ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); | 1759 | ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); |
1760 | if (ret_val) | 1760 | if (ret_val) { |
1761 | /* If the first read fails, another entity may have | 1761 | /* If the first read fails, another entity may have |
1762 | * ownership of the resources, wait and try again to | 1762 | * ownership of the resources, wait and try again to |
1763 | * see if they have relinquished the resources yet. | 1763 | * see if they have relinquished the resources yet. |
1764 | */ | 1764 | */ |
1765 | udelay(usec_interval); | 1765 | if (usec_interval >= 1000) |
1766 | msleep(usec_interval / 1000); | ||
1767 | else | ||
1768 | udelay(usec_interval); | ||
1769 | } | ||
1766 | ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); | 1770 | ret_val = e1e_rphy(hw, MII_BMSR, &phy_status); |
1767 | if (ret_val) | 1771 | if (ret_val) |
1768 | break; | 1772 | break; |
1769 | if (phy_status & BMSR_LSTATUS) | 1773 | if (phy_status & BMSR_LSTATUS) |
1770 | break; | 1774 | break; |
1771 | if (usec_interval >= 1000) | 1775 | if (usec_interval >= 1000) |
1772 | mdelay(usec_interval / 1000); | 1776 | msleep(usec_interval / 1000); |
1773 | else | 1777 | else |
1774 | udelay(usec_interval); | 1778 | udelay(usec_interval); |
1775 | } | 1779 | } |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index 9ce07f3ef62d..359f6e60320d 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | |||
@@ -291,7 +291,9 @@ static int ixgbe_pci_sriov_disable(struct pci_dev *dev) | |||
291 | { | 291 | { |
292 | struct ixgbe_adapter *adapter = pci_get_drvdata(dev); | 292 | struct ixgbe_adapter *adapter = pci_get_drvdata(dev); |
293 | int err; | 293 | int err; |
294 | #ifdef CONFIG_PCI_IOV | ||
294 | u32 current_flags = adapter->flags; | 295 | u32 current_flags = adapter->flags; |
296 | #endif | ||
295 | 297 | ||
296 | err = ixgbe_disable_sriov(adapter); | 298 | err = ixgbe_disable_sriov(adapter); |
297 | 299 | ||
diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c index 7354960b583b..c4eeb69a5bee 100644 --- a/drivers/net/ethernet/marvell/mvmdio.c +++ b/drivers/net/ethernet/marvell/mvmdio.c | |||
@@ -92,6 +92,12 @@ static int orion_mdio_wait_ready(struct mii_bus *bus) | |||
92 | if (time_is_before_jiffies(end)) | 92 | if (time_is_before_jiffies(end)) |
93 | ++timedout; | 93 | ++timedout; |
94 | } else { | 94 | } else { |
95 | /* wait_event_timeout does not guarantee a delay of at | ||
96 | * least one whole jiffie, so timeout must be no less | ||
97 | * than two. | ||
98 | */ | ||
99 | if (timeout < 2) | ||
100 | timeout = 2; | ||
95 | wait_event_timeout(dev->smi_busy_wait, | 101 | wait_event_timeout(dev->smi_busy_wait, |
96 | orion_mdio_smi_is_done(dev), | 102 | orion_mdio_smi_is_done(dev), |
97 | timeout); | 103 | timeout); |
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c index 3010abb55fbd..32058614151a 100644 --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_init.c | |||
@@ -1602,13 +1602,13 @@ netxen_process_lro(struct netxen_adapter *adapter, | |||
1602 | u32 seq_number; | 1602 | u32 seq_number; |
1603 | u8 vhdr_len = 0; | 1603 | u8 vhdr_len = 0; |
1604 | 1604 | ||
1605 | if (unlikely(ring > adapter->max_rds_rings)) | 1605 | if (unlikely(ring >= adapter->max_rds_rings)) |
1606 | return NULL; | 1606 | return NULL; |
1607 | 1607 | ||
1608 | rds_ring = &recv_ctx->rds_rings[ring]; | 1608 | rds_ring = &recv_ctx->rds_rings[ring]; |
1609 | 1609 | ||
1610 | index = netxen_get_lro_sts_refhandle(sts_data0); | 1610 | index = netxen_get_lro_sts_refhandle(sts_data0); |
1611 | if (unlikely(index > rds_ring->num_desc)) | 1611 | if (unlikely(index >= rds_ring->num_desc)) |
1612 | return NULL; | 1612 | return NULL; |
1613 | 1613 | ||
1614 | buffer = &rds_ring->rx_buf_arr[index]; | 1614 | buffer = &rds_ring->rx_buf_arr[index]; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 4afdef0cc175..35d48766d842 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -493,6 +493,7 @@ struct qlcnic_hardware_context { | |||
493 | struct qlcnic_mailbox *mailbox; | 493 | struct qlcnic_mailbox *mailbox; |
494 | u8 extend_lb_time; | 494 | u8 extend_lb_time; |
495 | u8 phys_port_id[ETH_ALEN]; | 495 | u8 phys_port_id[ETH_ALEN]; |
496 | u8 lb_mode; | ||
496 | }; | 497 | }; |
497 | 498 | ||
498 | struct qlcnic_adapter_stats { | 499 | struct qlcnic_adapter_stats { |
@@ -584,6 +585,8 @@ struct qlcnic_host_tx_ring { | |||
584 | dma_addr_t phys_addr; | 585 | dma_addr_t phys_addr; |
585 | dma_addr_t hw_cons_phys_addr; | 586 | dma_addr_t hw_cons_phys_addr; |
586 | struct netdev_queue *txq; | 587 | struct netdev_queue *txq; |
588 | /* Lock to protect Tx descriptors cleanup */ | ||
589 | spinlock_t tx_clean_lock; | ||
587 | } ____cacheline_internodealigned_in_smp; | 590 | } ____cacheline_internodealigned_in_smp; |
588 | 591 | ||
589 | /* | 592 | /* |
@@ -815,6 +818,7 @@ struct qlcnic_mac_vlan_list { | |||
815 | 818 | ||
816 | #define QLCNIC_ILB_MODE 0x1 | 819 | #define QLCNIC_ILB_MODE 0x1 |
817 | #define QLCNIC_ELB_MODE 0x2 | 820 | #define QLCNIC_ELB_MODE 0x2 |
821 | #define QLCNIC_LB_MODE_MASK 0x3 | ||
818 | 822 | ||
819 | #define QLCNIC_LINKEVENT 0x1 | 823 | #define QLCNIC_LINKEVENT 0x1 |
820 | #define QLCNIC_LB_RESPONSE 0x2 | 824 | #define QLCNIC_LB_RESPONSE 0x2 |
@@ -1100,7 +1104,6 @@ struct qlcnic_adapter { | |||
1100 | struct qlcnic_filter_hash rx_fhash; | 1104 | struct qlcnic_filter_hash rx_fhash; |
1101 | struct list_head vf_mc_list; | 1105 | struct list_head vf_mc_list; |
1102 | 1106 | ||
1103 | spinlock_t tx_clean_lock; | ||
1104 | spinlock_t mac_learn_lock; | 1107 | spinlock_t mac_learn_lock; |
1105 | /* spinlock for catching rcv filters for eswitch traffic */ | 1108 | /* spinlock for catching rcv filters for eswitch traffic */ |
1106 | spinlock_t rx_mac_learn_lock; | 1109 | spinlock_t rx_mac_learn_lock; |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index b3fd1605773e..03eb2ad9611a 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
@@ -1685,12 +1685,6 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode) | |||
1685 | } | 1685 | } |
1686 | } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); | 1686 | } while ((adapter->ahw->linkup && ahw->has_link_events) != 1); |
1687 | 1687 | ||
1688 | /* Make sure carrier is off and queue is stopped during loopback */ | ||
1689 | if (netif_running(netdev)) { | ||
1690 | netif_carrier_off(netdev); | ||
1691 | netif_tx_stop_all_queues(netdev); | ||
1692 | } | ||
1693 | |||
1694 | ret = qlcnic_do_lb_test(adapter, mode); | 1688 | ret = qlcnic_do_lb_test(adapter, mode); |
1695 | 1689 | ||
1696 | qlcnic_83xx_clear_lb_mode(adapter, mode); | 1690 | qlcnic_83xx_clear_lb_mode(adapter, mode); |
@@ -2122,6 +2116,7 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, | |||
2122 | ahw->link_autoneg = MSB(MSW(data[3])); | 2116 | ahw->link_autoneg = MSB(MSW(data[3])); |
2123 | ahw->module_type = MSB(LSW(data[3])); | 2117 | ahw->module_type = MSB(LSW(data[3])); |
2124 | ahw->has_link_events = 1; | 2118 | ahw->has_link_events = 1; |
2119 | ahw->lb_mode = data[4] & QLCNIC_LB_MODE_MASK; | ||
2125 | qlcnic_advert_link_change(adapter, link_status); | 2120 | qlcnic_advert_link_change(adapter, link_status); |
2126 | } | 2121 | } |
2127 | 2122 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c index e9c21e5d0ca9..c4262c23ed7c 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c | |||
@@ -134,6 +134,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter, | |||
134 | struct qlcnic_skb_frag *buffrag; | 134 | struct qlcnic_skb_frag *buffrag; |
135 | int i, j; | 135 | int i, j; |
136 | 136 | ||
137 | spin_lock(&tx_ring->tx_clean_lock); | ||
138 | |||
137 | cmd_buf = tx_ring->cmd_buf_arr; | 139 | cmd_buf = tx_ring->cmd_buf_arr; |
138 | for (i = 0; i < tx_ring->num_desc; i++) { | 140 | for (i = 0; i < tx_ring->num_desc; i++) { |
139 | buffrag = cmd_buf->frag_array; | 141 | buffrag = cmd_buf->frag_array; |
@@ -157,6 +159,8 @@ void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter, | |||
157 | } | 159 | } |
158 | cmd_buf++; | 160 | cmd_buf++; |
159 | } | 161 | } |
162 | |||
163 | spin_unlock(&tx_ring->tx_clean_lock); | ||
160 | } | 164 | } |
161 | 165 | ||
162 | void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter) | 166 | void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter) |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c index a215e0f69335..6373f6022486 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c | |||
@@ -689,6 +689,10 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup) | |||
689 | adapter->ahw->linkup = 0; | 689 | adapter->ahw->linkup = 0; |
690 | netif_carrier_off(netdev); | 690 | netif_carrier_off(netdev); |
691 | } else if (!adapter->ahw->linkup && linkup) { | 691 | } else if (!adapter->ahw->linkup && linkup) { |
692 | /* Do not advertise Link up if the port is in loopback mode */ | ||
693 | if (qlcnic_83xx_check(adapter) && adapter->ahw->lb_mode) | ||
694 | return; | ||
695 | |||
692 | netdev_info(netdev, "NIC Link is up\n"); | 696 | netdev_info(netdev, "NIC Link is up\n"); |
693 | adapter->ahw->linkup = 1; | 697 | adapter->ahw->linkup = 1; |
694 | netif_carrier_on(netdev); | 698 | netif_carrier_on(netdev); |
@@ -778,7 +782,7 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
778 | struct net_device *netdev = adapter->netdev; | 782 | struct net_device *netdev = adapter->netdev; |
779 | struct qlcnic_skb_frag *frag; | 783 | struct qlcnic_skb_frag *frag; |
780 | 784 | ||
781 | if (!spin_trylock(&adapter->tx_clean_lock)) | 785 | if (!spin_trylock(&tx_ring->tx_clean_lock)) |
782 | return 1; | 786 | return 1; |
783 | 787 | ||
784 | sw_consumer = tx_ring->sw_consumer; | 788 | sw_consumer = tx_ring->sw_consumer; |
@@ -807,8 +811,9 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
807 | break; | 811 | break; |
808 | } | 812 | } |
809 | 813 | ||
814 | tx_ring->sw_consumer = sw_consumer; | ||
815 | |||
810 | if (count && netif_running(netdev)) { | 816 | if (count && netif_running(netdev)) { |
811 | tx_ring->sw_consumer = sw_consumer; | ||
812 | smp_mb(); | 817 | smp_mb(); |
813 | if (netif_tx_queue_stopped(tx_ring->txq) && | 818 | if (netif_tx_queue_stopped(tx_ring->txq) && |
814 | netif_carrier_ok(netdev)) { | 819 | netif_carrier_ok(netdev)) { |
@@ -834,7 +839,8 @@ static int qlcnic_process_cmd_ring(struct qlcnic_adapter *adapter, | |||
834 | */ | 839 | */ |
835 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); | 840 | hw_consumer = le32_to_cpu(*(tx_ring->hw_consumer)); |
836 | done = (sw_consumer == hw_consumer); | 841 | done = (sw_consumer == hw_consumer); |
837 | spin_unlock(&adapter->tx_clean_lock); | 842 | |
843 | spin_unlock(&tx_ring->tx_clean_lock); | ||
838 | 844 | ||
839 | return done; | 845 | return done; |
840 | } | 846 | } |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c index d131ec1321e8..eeec83a0e664 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c | |||
@@ -1757,7 +1757,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
1757 | if (qlcnic_sriov_vf_check(adapter)) | 1757 | if (qlcnic_sriov_vf_check(adapter)) |
1758 | qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); | 1758 | qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc); |
1759 | smp_mb(); | 1759 | smp_mb(); |
1760 | spin_lock(&adapter->tx_clean_lock); | ||
1761 | netif_carrier_off(netdev); | 1760 | netif_carrier_off(netdev); |
1762 | adapter->ahw->linkup = 0; | 1761 | adapter->ahw->linkup = 0; |
1763 | netif_tx_disable(netdev); | 1762 | netif_tx_disable(netdev); |
@@ -1778,7 +1777,6 @@ void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev) | |||
1778 | 1777 | ||
1779 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) | 1778 | for (ring = 0; ring < adapter->drv_tx_rings; ring++) |
1780 | qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); | 1779 | qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]); |
1781 | spin_unlock(&adapter->tx_clean_lock); | ||
1782 | } | 1780 | } |
1783 | 1781 | ||
1784 | /* Usage: During suspend and firmware recovery module */ | 1782 | /* Usage: During suspend and firmware recovery module */ |
@@ -2173,6 +2171,7 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter, | |||
2173 | } | 2171 | } |
2174 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); | 2172 | memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring)); |
2175 | tx_ring->cmd_buf_arr = cmd_buf_arr; | 2173 | tx_ring->cmd_buf_arr = cmd_buf_arr; |
2174 | spin_lock_init(&tx_ring->tx_clean_lock); | ||
2176 | } | 2175 | } |
2177 | 2176 | ||
2178 | if (qlcnic_83xx_check(adapter) || | 2177 | if (qlcnic_83xx_check(adapter) || |
@@ -2300,7 +2299,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
2300 | rwlock_init(&adapter->ahw->crb_lock); | 2299 | rwlock_init(&adapter->ahw->crb_lock); |
2301 | mutex_init(&adapter->ahw->mem_lock); | 2300 | mutex_init(&adapter->ahw->mem_lock); |
2302 | 2301 | ||
2303 | spin_lock_init(&adapter->tx_clean_lock); | ||
2304 | INIT_LIST_HEAD(&adapter->mac_list); | 2302 | INIT_LIST_HEAD(&adapter->mac_list); |
2305 | 2303 | ||
2306 | qlcnic_register_dcb(adapter); | 2304 | qlcnic_register_dcb(adapter); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c index 98b621fb1227..d14d9a139eef 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c | |||
@@ -81,9 +81,12 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
81 | if (qlcnic_83xx_pf_check(adapter)) | 81 | if (qlcnic_83xx_pf_check(adapter)) |
82 | num_macs = 1; | 82 | num_macs = 1; |
83 | 83 | ||
84 | info->max_rx_mcast_mac_filters = res->num_rx_mcast_mac_filters; | ||
85 | |||
84 | if (adapter->ahw->pci_func == func) { | 86 | if (adapter->ahw->pci_func == func) { |
85 | info->min_tx_bw = 0; | 87 | info->min_tx_bw = 0; |
86 | info->max_tx_bw = MAX_BW; | 88 | info->max_tx_bw = MAX_BW; |
89 | |||
87 | temp = res->num_rx_ucast_mac_filters - num_macs * num_vfs; | 90 | temp = res->num_rx_ucast_mac_filters - num_macs * num_vfs; |
88 | info->max_rx_ucast_mac_filters = temp; | 91 | info->max_rx_ucast_mac_filters = temp; |
89 | temp = res->num_tx_mac_filters - num_macs * num_vfs; | 92 | temp = res->num_tx_mac_filters - num_macs * num_vfs; |
@@ -92,6 +95,7 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
92 | temp = res->num_rx_mcast_mac_filters - temp; | 95 | temp = res->num_rx_mcast_mac_filters - temp; |
93 | info->max_rx_mcast_mac_filters = temp; | 96 | info->max_rx_mcast_mac_filters = temp; |
94 | 97 | ||
98 | info->max_tx_ques = res->num_tx_queues - sriov->num_vfs; | ||
95 | } else { | 99 | } else { |
96 | id = qlcnic_sriov_func_to_index(adapter, func); | 100 | id = qlcnic_sriov_func_to_index(adapter, func); |
97 | if (id < 0) | 101 | if (id < 0) |
@@ -99,10 +103,13 @@ static int qlcnic_sriov_pf_cal_res_limit(struct qlcnic_adapter *adapter, | |||
99 | vp = sriov->vf_info[id].vp; | 103 | vp = sriov->vf_info[id].vp; |
100 | info->min_tx_bw = vp->min_tx_bw; | 104 | info->min_tx_bw = vp->min_tx_bw; |
101 | info->max_tx_bw = vp->max_tx_bw; | 105 | info->max_tx_bw = vp->max_tx_bw; |
106 | |||
102 | info->max_rx_ucast_mac_filters = num_macs; | 107 | info->max_rx_ucast_mac_filters = num_macs; |
103 | info->max_tx_mac_filters = num_macs; | 108 | info->max_tx_mac_filters = num_macs; |
104 | temp = num_macs * QLCNIC_SRIOV_VF_MAX_MAC; | 109 | temp = num_macs * QLCNIC_SRIOV_VF_MAX_MAC; |
105 | info->max_rx_mcast_mac_filters = temp; | 110 | info->max_rx_mcast_mac_filters = temp; |
111 | |||
112 | info->max_tx_ques = QLCNIC_SINGLE_RING; | ||
106 | } | 113 | } |
107 | 114 | ||
108 | info->max_rx_ip_addr = res->num_destip / max; | 115 | info->max_rx_ip_addr = res->num_destip / max; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 216141028125..b8e3a4ce24b0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
@@ -622,17 +622,15 @@ static int stmmac_init_ptp(struct stmmac_priv *priv) | |||
622 | if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) | 622 | if (!(priv->dma_cap.time_stamp || priv->dma_cap.atime_stamp)) |
623 | return -EOPNOTSUPP; | 623 | return -EOPNOTSUPP; |
624 | 624 | ||
625 | if (netif_msg_hw(priv)) { | 625 | priv->adv_ts = 0; |
626 | if (priv->dma_cap.time_stamp) { | 626 | if (priv->dma_cap.atime_stamp && priv->extend_desc) |
627 | pr_debug("IEEE 1588-2002 Time Stamp supported\n"); | 627 | priv->adv_ts = 1; |
628 | priv->adv_ts = 0; | 628 | |
629 | } | 629 | if (netif_msg_hw(priv) && priv->dma_cap.time_stamp) |
630 | if (priv->dma_cap.atime_stamp && priv->extend_desc) { | 630 | pr_debug("IEEE 1588-2002 Time Stamp supported\n"); |
631 | pr_debug | 631 | |
632 | ("IEEE 1588-2008 Advanced Time Stamp supported\n"); | 632 | if (netif_msg_hw(priv) && priv->adv_ts) |
633 | priv->adv_ts = 1; | 633 | pr_debug("IEEE 1588-2008 Advanced Time Stamp supported\n"); |
634 | } | ||
635 | } | ||
636 | 634 | ||
637 | priv->hw->ptp = &stmmac_ptp; | 635 | priv->hw->ptp = &stmmac_ptp; |
638 | priv->hwts_tx_en = 0; | 636 | priv->hwts_tx_en = 0; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c index b8b0eeed0f92..7680581ebe12 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c | |||
@@ -56,7 +56,7 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb) | |||
56 | 56 | ||
57 | priv->hw->ptp->config_addend(priv->ioaddr, addend); | 57 | priv->hw->ptp->config_addend(priv->ioaddr, addend); |
58 | 58 | ||
59 | spin_unlock_irqrestore(&priv->lock, flags); | 59 | spin_unlock_irqrestore(&priv->ptp_lock, flags); |
60 | 60 | ||
61 | return 0; | 61 | return 0; |
62 | } | 62 | } |
@@ -91,7 +91,7 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta) | |||
91 | 91 | ||
92 | priv->hw->ptp->adjust_systime(priv->ioaddr, sec, nsec, neg_adj); | 92 | priv->hw->ptp->adjust_systime(priv->ioaddr, sec, nsec, neg_adj); |
93 | 93 | ||
94 | spin_unlock_irqrestore(&priv->lock, flags); | 94 | spin_unlock_irqrestore(&priv->ptp_lock, flags); |
95 | 95 | ||
96 | return 0; | 96 | return 0; |
97 | } | 97 | } |
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c index 243fffbe18e8..e8bb77d25d98 100644 --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c | |||
@@ -740,6 +740,8 @@ static void _cpsw_adjust_link(struct cpsw_slave *slave, | |||
740 | /* set speed_in input in case RMII mode is used in 100Mbps */ | 740 | /* set speed_in input in case RMII mode is used in 100Mbps */ |
741 | if (phy->speed == 100) | 741 | if (phy->speed == 100) |
742 | mac_control |= BIT(15); | 742 | mac_control |= BIT(15); |
743 | else if (phy->speed == 10) | ||
744 | mac_control |= BIT(18); /* In Band mode */ | ||
743 | 745 | ||
744 | *link = true; | 746 | *link = true; |
745 | } else { | 747 | } else { |
@@ -2126,7 +2128,7 @@ static int cpsw_probe(struct platform_device *pdev) | |||
2126 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { | 2128 | while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { |
2127 | for (i = res->start; i <= res->end; i++) { | 2129 | for (i = res->start; i <= res->end; i++) { |
2128 | if (devm_request_irq(&pdev->dev, i, cpsw_interrupt, 0, | 2130 | if (devm_request_irq(&pdev->dev, i, cpsw_interrupt, 0, |
2129 | dev_name(priv->dev), priv)) { | 2131 | dev_name(&pdev->dev), priv)) { |
2130 | dev_err(priv->dev, "error attaching irq\n"); | 2132 | dev_err(priv->dev, "error attaching irq\n"); |
2131 | goto clean_ale_ret; | 2133 | goto clean_ale_ret; |
2132 | } | 2134 | } |