diff options
| author | David S. Miller <davem@davemloft.net> | 2017-02-23 10:57:58 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-02-23 10:57:58 -0500 |
| commit | e65ade77e87fd206bb78fae32ab7b604b01fade0 (patch) | |
| tree | e6c093d33d61dd9c2eeb7c7f77c9f4c26aea3655 | |
| parent | c12f4d761dd2313ae4f457041df3ec0c603aa76a (diff) | |
| parent | 7f0137e2ef9f32143df623001a96f7aab61a9595 (diff) | |
Merge branch 'mlx4-misc-fixes'
Tariq Toukan says:
====================
mlx4 misc fixes
This patchset contains misc bug fixes from Eric Dumazet and our team
to the mlx4 Core and Eth drivers.
Series generated against net commit:
eee2faabc63d tcp: account for ts offset only if tsecr not zero
v3:
* Rebased, conflict solved.
v2:
* Added Eric's fix (patch 5/5).
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/cmd.c | 22 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/en_rx.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/eq.c | 5 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/fw.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/intf.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/main.c | 11 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/mr.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/qp.c | 2 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | 2 | ||||
| -rw-r--r-- | include/linux/mlx4/cmd.h | 2 | ||||
| -rw-r--r-- | include/linux/mlx4/driver.h | 10 |
13 files changed, 49 insertions, 27 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx4/cmd.c b/drivers/net/ethernet/mellanox/mlx4/cmd.c index a49072b4fa52..e8c105164931 100644 --- a/drivers/net/ethernet/mellanox/mlx4/cmd.c +++ b/drivers/net/ethernet/mellanox/mlx4/cmd.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/semaphore.h> | 43 | #include <linux/semaphore.h> |
| 44 | #include <rdma/ib_smi.h> | 44 | #include <rdma/ib_smi.h> |
| 45 | #include <linux/delay.h> | 45 | #include <linux/delay.h> |
| 46 | #include <linux/etherdevice.h> | ||
| 46 | 47 | ||
| 47 | #include <asm/io.h> | 48 | #include <asm/io.h> |
| 48 | 49 | ||
| @@ -2955,7 +2956,7 @@ static bool mlx4_valid_vf_state_change(struct mlx4_dev *dev, int port, | |||
| 2955 | return false; | 2956 | return false; |
| 2956 | } | 2957 | } |
| 2957 | 2958 | ||
| 2958 | int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac) | 2959 | int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u8 *mac) |
| 2959 | { | 2960 | { |
| 2960 | struct mlx4_priv *priv = mlx4_priv(dev); | 2961 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 2961 | struct mlx4_vport_state *s_info; | 2962 | struct mlx4_vport_state *s_info; |
| @@ -2964,13 +2965,22 @@ int mlx4_set_vf_mac(struct mlx4_dev *dev, int port, int vf, u64 mac) | |||
| 2964 | if (!mlx4_is_master(dev)) | 2965 | if (!mlx4_is_master(dev)) |
| 2965 | return -EPROTONOSUPPORT; | 2966 | return -EPROTONOSUPPORT; |
| 2966 | 2967 | ||
| 2968 | if (is_multicast_ether_addr(mac)) | ||
| 2969 | return -EINVAL; | ||
| 2970 | |||
| 2967 | slave = mlx4_get_slave_indx(dev, vf); | 2971 | slave = mlx4_get_slave_indx(dev, vf); |
| 2968 | if (slave < 0) | 2972 | if (slave < 0) |
| 2969 | return -EINVAL; | 2973 | return -EINVAL; |
| 2970 | 2974 | ||
| 2971 | port = mlx4_slaves_closest_port(dev, slave, port); | 2975 | port = mlx4_slaves_closest_port(dev, slave, port); |
| 2972 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; | 2976 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; |
| 2973 | s_info->mac = mac; | 2977 | |
| 2978 | if (s_info->spoofchk && is_zero_ether_addr(mac)) { | ||
| 2979 | mlx4_info(dev, "MAC invalidation is not allowed when spoofchk is on\n"); | ||
| 2980 | return -EPERM; | ||
| 2981 | } | ||
| 2982 | |||
| 2983 | s_info->mac = mlx4_mac_to_u64(mac); | ||
| 2974 | mlx4_info(dev, "default mac on vf %d port %d to %llX will take effect only after vf restart\n", | 2984 | mlx4_info(dev, "default mac on vf %d port %d to %llX will take effect only after vf restart\n", |
| 2975 | vf, port, s_info->mac); | 2985 | vf, port, s_info->mac); |
| 2976 | return 0; | 2986 | return 0; |
| @@ -3143,6 +3153,7 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting) | |||
| 3143 | struct mlx4_priv *priv = mlx4_priv(dev); | 3153 | struct mlx4_priv *priv = mlx4_priv(dev); |
| 3144 | struct mlx4_vport_state *s_info; | 3154 | struct mlx4_vport_state *s_info; |
| 3145 | int slave; | 3155 | int slave; |
| 3156 | u8 mac[ETH_ALEN]; | ||
| 3146 | 3157 | ||
| 3147 | if ((!mlx4_is_master(dev)) || | 3158 | if ((!mlx4_is_master(dev)) || |
| 3148 | !(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_FSM)) | 3159 | !(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_FSM)) |
| @@ -3154,6 +3165,13 @@ int mlx4_set_vf_spoofchk(struct mlx4_dev *dev, int port, int vf, bool setting) | |||
| 3154 | 3165 | ||
| 3155 | port = mlx4_slaves_closest_port(dev, slave, port); | 3166 | port = mlx4_slaves_closest_port(dev, slave, port); |
| 3156 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; | 3167 | s_info = &priv->mfunc.master.vf_admin[slave].vport[port]; |
| 3168 | |||
| 3169 | mlx4_u64_to_mac(mac, s_info->mac); | ||
| 3170 | if (setting && !is_valid_ether_addr(mac)) { | ||
| 3171 | mlx4_info(dev, "Illegal MAC with spoofchk\n"); | ||
| 3172 | return -EPERM; | ||
| 3173 | } | ||
| 3174 | |||
| 3157 | s_info->spoofchk = setting; | 3175 | s_info->spoofchk = setting; |
| 3158 | 3176 | ||
| 3159 | return 0; | 3177 | return 0; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c index b04760a5034b..1dae8e40fb25 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_dcb_nl.c | |||
| @@ -319,7 +319,7 @@ static int mlx4_en_ets_validate(struct mlx4_en_priv *priv, struct ieee_ets *ets) | |||
| 319 | default: | 319 | default: |
| 320 | en_err(priv, "TC[%d]: Not supported TSA: %d\n", | 320 | en_err(priv, "TC[%d]: Not supported TSA: %d\n", |
| 321 | i, ets->tc_tsa[i]); | 321 | i, ets->tc_tsa[i]); |
| 322 | return -ENOTSUPP; | 322 | return -EOPNOTSUPP; |
| 323 | } | 323 | } |
| 324 | } | 324 | } |
| 325 | 325 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index afe4444e5434..61420473fe5f 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -2485,12 +2485,8 @@ static int mlx4_en_set_vf_mac(struct net_device *dev, int queue, u8 *mac) | |||
| 2485 | { | 2485 | { |
| 2486 | struct mlx4_en_priv *en_priv = netdev_priv(dev); | 2486 | struct mlx4_en_priv *en_priv = netdev_priv(dev); |
| 2487 | struct mlx4_en_dev *mdev = en_priv->mdev; | 2487 | struct mlx4_en_dev *mdev = en_priv->mdev; |
| 2488 | u64 mac_u64 = mlx4_mac_to_u64(mac); | ||
| 2489 | 2488 | ||
| 2490 | if (is_multicast_ether_addr(mac)) | 2489 | return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac); |
| 2491 | return -EINVAL; | ||
| 2492 | |||
| 2493 | return mlx4_set_vf_mac(mdev->dev, en_priv->port, queue, mac_u64); | ||
| 2494 | } | 2490 | } |
| 2495 | 2491 | ||
| 2496 | static int mlx4_en_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, | 2492 | static int mlx4_en_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos, |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index d85e6446f9d9..867292880c07 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c | |||
| @@ -604,10 +604,10 @@ static int mlx4_en_complete_rx_desc(struct mlx4_en_priv *priv, | |||
| 604 | dma_sync_single_for_cpu(priv->ddev, dma, frag_info->frag_size, | 604 | dma_sync_single_for_cpu(priv->ddev, dma, frag_info->frag_size, |
| 605 | DMA_FROM_DEVICE); | 605 | DMA_FROM_DEVICE); |
| 606 | 606 | ||
| 607 | /* Save page reference in skb */ | 607 | __skb_fill_page_desc(skb, nr, frags[nr].page, |
| 608 | __skb_frag_set_page(&skb_frags_rx[nr], frags[nr].page); | 608 | frags[nr].page_offset, |
| 609 | skb_frag_size_set(&skb_frags_rx[nr], frag_info->frag_size); | 609 | frag_info->frag_size); |
| 610 | skb_frags_rx[nr].page_offset = frags[nr].page_offset; | 610 | |
| 611 | skb->truesize += frag_info->frag_stride; | 611 | skb->truesize += frag_info->frag_stride; |
| 612 | frags[nr].page = NULL; | 612 | frags[nr].page = NULL; |
| 613 | } | 613 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/eq.c b/drivers/net/ethernet/mellanox/mlx4/eq.c index 39232b6a974f..07406cf2eacd 100644 --- a/drivers/net/ethernet/mellanox/mlx4/eq.c +++ b/drivers/net/ethernet/mellanox/mlx4/eq.c | |||
| @@ -1249,9 +1249,8 @@ int mlx4_init_eq_table(struct mlx4_dev *dev) | |||
| 1249 | mlx4_warn(dev, "Failed adding irq rmap\n"); | 1249 | mlx4_warn(dev, "Failed adding irq rmap\n"); |
| 1250 | } | 1250 | } |
| 1251 | #endif | 1251 | #endif |
| 1252 | err = mlx4_create_eq(dev, dev->caps.num_cqs - | 1252 | err = mlx4_create_eq(dev, dev->quotas.cq + |
| 1253 | dev->caps.reserved_cqs + | 1253 | MLX4_NUM_SPARE_EQE, |
| 1254 | MLX4_NUM_SPARE_EQE, | ||
| 1255 | (dev->flags & MLX4_FLAG_MSI_X) ? | 1254 | (dev->flags & MLX4_FLAG_MSI_X) ? |
| 1256 | i + 1 - !!(i > MLX4_EQ_ASYNC) : 0, | 1255 | i + 1 - !!(i > MLX4_EQ_ASYNC) : 0, |
| 1257 | eq); | 1256 | eq); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c index 3fe885ce1902..37e84a59e751 100644 --- a/drivers/net/ethernet/mellanox/mlx4/fw.c +++ b/drivers/net/ethernet/mellanox/mlx4/fw.c | |||
| @@ -2436,7 +2436,7 @@ int mlx4_config_dev_retrieval(struct mlx4_dev *dev, | |||
| 2436 | #define CONFIG_DEV_RX_CSUM_MODE_PORT2_BIT_OFFSET 4 | 2436 | #define CONFIG_DEV_RX_CSUM_MODE_PORT2_BIT_OFFSET 4 |
| 2437 | 2437 | ||
| 2438 | if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_CONFIG_DEV)) | 2438 | if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_CONFIG_DEV)) |
| 2439 | return -ENOTSUPP; | 2439 | return -EOPNOTSUPP; |
| 2440 | 2440 | ||
| 2441 | err = mlx4_CONFIG_DEV_get(dev, &config_dev); | 2441 | err = mlx4_CONFIG_DEV_get(dev, &config_dev); |
| 2442 | if (err) | 2442 | if (err) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/intf.c b/drivers/net/ethernet/mellanox/mlx4/intf.c index 8258d08acd8c..e00f627331cb 100644 --- a/drivers/net/ethernet/mellanox/mlx4/intf.c +++ b/drivers/net/ethernet/mellanox/mlx4/intf.c | |||
| @@ -136,7 +136,7 @@ int mlx4_do_bond(struct mlx4_dev *dev, bool enable) | |||
| 136 | LIST_HEAD(bond_list); | 136 | LIST_HEAD(bond_list); |
| 137 | 137 | ||
| 138 | if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PORT_REMAP)) | 138 | if (!(dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_PORT_REMAP)) |
