diff options
Diffstat (limited to 'drivers/net/ethernet/mellanox/mlx4')
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 10 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_tx.c | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/fw.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 14 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4.h | 4 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 6 |
6 files changed, 36 insertions, 13 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index fad45316200a..84a96f70dfb5 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -742,6 +742,14 @@ static int mlx4_en_replace_mac(struct mlx4_en_priv *priv, int qpn, | |||
| 742 | err = mlx4_en_uc_steer_add(priv, new_mac, | 742 | err = mlx4_en_uc_steer_add(priv, new_mac, |
| 743 | &qpn, | 743 | &qpn, |
| 744 | &entry->reg_id); | 744 | &entry->reg_id); |
| 745 | if (err) | ||
| 746 | return err; | ||
| 747 | if (priv->tunnel_reg_id) { | ||
| 748 | mlx4_flow_detach(priv->mdev->dev, priv->tunnel_reg_id); | ||
| 749 | priv->tunnel_reg_id = 0; | ||
| 750 | } | ||
| 751 | err = mlx4_en_tunnel_steer_add(priv, new_mac, qpn, | ||
| 752 | &priv->tunnel_reg_id); | ||
| 745 | return err; | 753 | return err; |
| 746 | } | 754 | } |
| 747 | } | 755 | } |
| @@ -1792,6 +1800,8 @@ void mlx4_en_stop_port(struct net_device *dev, int detach) | |||
| 1792 | mc_list[5] = priv->port; | 1800 | mc_list[5] = priv->port; |
| 1793 | mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, | 1801 | mlx4_multicast_detach(mdev->dev, &priv->rss_map.indir_qp, |
| 1794 | mc_list, MLX4_PROT_ETH, mclist->reg_id); | 1802 | mc_list, MLX4_PROT_ETH, mclist->reg_id); |
| 1803 | if (mclist->tunnel_reg_id) | ||
| 1804 | mlx4_flow_detach(mdev->dev, mclist->tunnel_reg_id); | ||
| 1795 | } | 1805 | } |
| 1796 | mlx4_en_clear_list(dev); | 1806 | mlx4_en_clear_list(dev); |
| 1797 | list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { | 1807 | list_for_each_entry_safe(mclist, tmp, &priv->curr_list, list) { |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c index 8e8a7eb43a2c..13457032d15f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c | |||
| @@ -629,7 +629,7 @@ static void build_inline_wqe(struct mlx4_en_tx_desc *tx_desc, struct sk_buff *sk | |||
| 629 | } | 629 | } |
| 630 | 630 | ||
| 631 | u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, | 631 | u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, |
| 632 | void *accel_priv) | 632 | void *accel_priv, select_queue_fallback_t fallback) |
| 633 | { | 633 | { |
| 634 | struct mlx4_en_priv *priv = netdev_priv(dev); | 634 | struct mlx4_en_priv *priv = netdev_priv(dev); |
| 635 | u16 rings_p_up = priv->num_tx_rings_p_up; | 635 | u16 rings_p_up = priv->num_tx_rings_p_up; |
| @@ -641,7 +641,7 @@ u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, | |||
| 641 | if (vlan_tx_tag_present(skb)) | 641 | if (vlan_tx_tag_present(skb)) |
| 642 | up = vlan_tx_tag_get(skb) >> VLAN_PRIO_SHIFT; | 642 | up = vlan_tx_tag_get(skb) >> VLAN_PRIO_SHIFT; |
| 643 | 643 | ||
| 644 | return __netdev_pick_tx(dev, skb) % rings_p_up + up * rings_p_up; | 644 | return fallback(dev, skb) % rings_p_up + up * rings_p_up; |
| 645 | } | 645 | } |
| 646 | 646 | ||
| 647 | static void mlx4_bf_copy(void __iomem *dst, unsigned long *src, unsigned bytecnt) | 647 | static void mlx4_bf_copy(void __iomem *dst, unsigned long *src, unsigned bytecnt) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 91b69ff4b4a2..7e2995ecea6f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -129,13 +129,14 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags) | |||
| 129 | [0] = "RSS support", | 129 | [0] = "RSS support", |
| 130 | [1] = "RSS Toeplitz Hash Function support", | 130 | [1] = "RSS Toeplitz Hash Function support", |
| 131 | [2] = "RSS XOR Hash Function support", | 131 | [2] = "RSS XOR Hash Function support", |
| 132 | [3] = "Device manage flow steering support", | 132 | [3] = "Device managed flow steering support", |
| 133 | [4] = "Automatic MAC reassignment support", | 133 | [4] = "Automatic MAC reassignment support", |
| 134 | [5] = "Time stamping support", | 134 | [5] = "Time stamping support", |
| 135 | [6] = "VST (control vlan insertion/stripping) support", | 135 | [6] = "VST (control vlan insertion/stripping) support", |
| 136 | [7] = "FSM (MAC anti-spoofing) support", | 136 | [7] = "FSM (MAC anti-spoofing) support", |
| 137 | [8] = "Dynamic QP updates support", | 137 | [8] = "Dynamic QP updates support", |
| 138 | [9] = "TCP/IP offloads/flow-steering for VXLAN support" | 138 | [9] = "Device managed flow steering IPoIB support", |
| 139 | [10] = "TCP/IP offloads/flow-steering for VXLAN support" | ||
| 139 | }; | 140 | }; |
| 140 | int i; | 141 | int i; |
| 141 | 142 | ||
| @@ -859,7 +860,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 859 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_CQ_TS_SUPPORT_OFFSET); | 860 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_CQ_TS_SUPPORT_OFFSET); |
| 860 | 861 | ||
| 861 | /* For guests, disable vxlan tunneling */ | 862 | /* For guests, disable vxlan tunneling */ |
| 862 | MLX4_GET(field, outbox, QUERY_DEV_CAP_VXLAN); | 863 | MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_VXLAN); |
| 863 | field &= 0xf7; | 864 | field &= 0xf7; |
| 864 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_VXLAN); | 865 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_VXLAN); |
| 865 | 866 | ||
| @@ -869,7 +870,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 869 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET); | 870 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_BF_OFFSET); |
| 870 | 871 | ||
| 871 | /* For guests, disable mw type 2 */ | 872 | /* For guests, disable mw type 2 */ |
| 872 | MLX4_GET(bmme_flags, outbox, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); | 873 | MLX4_GET(bmme_flags, outbox->buf, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); |
| 873 | bmme_flags &= ~MLX4_BMME_FLAG_TYPE_2_WIN; | 874 | bmme_flags &= ~MLX4_BMME_FLAG_TYPE_2_WIN; |
| 874 | MLX4_PUT(outbox->buf, bmme_flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); | 875 | MLX4_PUT(outbox->buf, bmme_flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET); |
| 875 | 876 | ||
| @@ -883,7 +884,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave, | |||
| 883 | } | 884 | } |
| 884 | 885 | ||
| 885 | /* turn off ipoib managed steering for guests */ | 886 | /* turn off ipoib managed steering for guests */ |
| 886 | MLX4_GET(field, outbox, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); | 887 | MLX4_GET(field, outbox->buf, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); |
| 887 | field &= ~0x80; | 888 | field &= ~0x80; |
| 888 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); | 889 | MLX4_PUT(outbox->buf, field, QUERY_DEV_CAP_FLOW_STEERING_IPOIB_OFFSET); |
| 889 | 890 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index d711158b0d4b..936c15364739 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -150,6 +150,8 @@ struct mlx4_port_config { | |||
| 150 | struct pci_dev *pdev; | 150 | struct pci_dev *pdev; |
| 151 | }; | 151 | }; |
| 152 | 152 | ||
| 153 | static atomic_t pf_loading = ATOMIC_INIT(0); | ||
| 154 | |||
| 153 | int mlx4_check_port_params(struct mlx4_dev *dev, | 155 | int mlx4_check_port_params(struct mlx4_dev *dev, |
| 154 | enum mlx4_port_type *port_type) | 156 | enum mlx4_port_type *port_type) |
| 155 | { | 157 | { |
| @@ -749,7 +751,7 @@ static void mlx4_request_modules(struct mlx4_dev *dev) | |||
| 749 | has_eth_port = true; | 751 | has_eth_port = true; |
| 750 | } | 752 | } |
| 751 | 753 | ||
| 752 | if (has_ib_port) | 754 | if (has_ib_port || (dev->caps.flags & MLX4_DEV_CAP_FLAG_IBOE)) |
| 753 | request_module_nowait(IB_DRV_NAME); | 755 | request_module_nowait(IB_DRV_NAME); |
| 754 | if (has_eth_port) | 756 | if (has_eth_port) |
| 755 | request_module_nowait(EN_DRV_NAME); | 757 | request_module_nowait(EN_DRV_NAME); |
| @@ -1407,6 +1409,11 @@ static int mlx4_init_slave(struct mlx4_dev *dev) | |||
| 1407 | u32 slave_read; | 1409 | u32 slave_read; |
| 1408 | u32 cmd_channel_ver; | 1410 | u32 cmd_channel_ver; |
| 1409 | 1411 | ||
| 1412 | if (atomic_read(&pf_loading)) { | ||
| 1413 | mlx4_warn(dev, "PF is not ready. Deferring probe\n"); | ||
| 1414 | return -EPROBE_DEFER; | ||
| 1415 | } | ||
| 1416 | |||
| 1410 | mutex_lock(&priv->cmd.slave_cmd_mutex); | 1417 | mutex_lock(&priv->cmd.slave_cmd_mutex); |
| 1411 | priv->cmd.max_cmds = 1; | 1418 | priv->cmd.max_cmds = 1; |
| 1412 | mlx4_warn(dev, "Sending reset\n"); | 1419 | mlx4_warn(dev, "Sending reset\n"); |
| @@ -2319,7 +2326,11 @@ static int __mlx4_init_one(struct pci_dev *pdev, int pci_dev_data) | |||
| 2319 | 2326 | ||
| 2320 | if (num_vfs) { | 2327 | if (num_vfs) { |
| 2321 | mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", num_vfs); | 2328 | mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", num_vfs); |
| 2329 | |||
| 2330 | atomic_inc(&pf_loading); | ||
| 2322 | err = pci_enable_sriov(pdev, num_vfs); | 2331 | err = pci_enable_sriov(pdev, num_vfs); |
| 2332 | atomic_dec(&pf_loading); | ||
| 2333 | |||
| 2323 | if (err) { | 2334 | if (err) { |
| 2324 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", | 2335 | mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d).\n", |
| 2325 | err); | 2336 | err); |
| @@ -2684,6 +2695,7 @@ static struct pci_driver mlx4_driver = { | |||
| 2684 | .name = DRV_NAME, | 2695 | .name = DRV_NAME, |
| 2685 | .id_table = mlx4_pci_table, | 2696 | .id_table = mlx4_pci_table, |
| 2686 | .probe = mlx4_init_one, | 2697 | .probe = mlx4_init_one, |
| 2698 | .shutdown = mlx4_remove_one, | ||
| 2687 | .remove = mlx4_remove_one, | 2699 | .remove = mlx4_remove_one, |
| 2688 | .err_handler = &mlx4_err_handler, | 2700 | .err_handler = &mlx4_err_handler, |
| 2689 | }; | 2701 | }; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 6b65f7795215..7aec6c833973 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -51,8 +51,8 @@ | |||
| 51 | 51 | ||
| 52 | #define DRV_NAME "mlx4_core" | 52 | #define DRV_NAME "mlx4_core" |
| 53 | #define PFX DRV_NAME ": " | 53 | #define PFX DRV_NAME ": " |
| 54 | #define DRV_VERSION "1.1" | 54 | #define DRV_VERSION "2.2-1" |
| 55 | #define DRV_RELDATE "Dec, 2011" | 55 | #define DRV_RELDATE "Feb, 2014" |
| 56 | 56 | ||
| 57 | #define MLX4_FS_UDP_UC_EN (1 << 1) | 57 | #define MLX4_FS_UDP_UC_EN (1 << 1) |
| 58 | #define MLX4_FS_TCP_UC_EN (1 << 2) | 58 | #define MLX4_FS_TCP_UC_EN (1 << 2) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index 3af04c3f42ea..b57e8c87a34e 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -57,8 +57,8 @@ | |||
| 57 | #include "en_port.h" | 57 | #include "en_port.h" |
| 58 | 58 | ||
| 59 | #define DRV_NAME "mlx4_en" | 59 | #define DRV_NAME "mlx4_en" |
| 60 | #define DRV_VERSION "2.0" | 60 | #define DRV_VERSION "2.2-1" |
| 61 | #define DRV_RELDATE "Dec 2011" | 61 | #define DRV_RELDATE "Feb 2014" |
| 62 | 62 | ||
| 63 | #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) | 63 | #define MLX4_EN_MSG_LEVEL (NETIF_MSG_LINK | NETIF_MSG_IFDOWN) |
| 64 | 64 | ||
| @@ -723,7 +723,7 @@ int mlx4_en_arm_cq(struct mlx4_en_priv *priv, struct mlx4_en_cq *cq); | |||
| 723 | 723 | ||
| 724 | void mlx4_en_tx_irq(struct mlx4_cq *mcq); | 724 | void mlx4_en_tx_irq(struct mlx4_cq *mcq); |
| 725 | u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, | 725 | u16 mlx4_en_select_queue(struct net_device *dev, struct sk_buff *skb, |
| 726 | void *accel_priv); | 726 | void *accel_priv, select_queue_fallback_t fallback); |
| 727 | netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev); | 727 | netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev); |
| 728 | 728 | ||
| 729 | int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, | 729 | int mlx4_en_create_tx_ring(struct mlx4_en_priv *priv, |
