Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
Pull rdma updates from Doug Ledford: "This is my initial round of 4.4 merge window patches. There are a few other things I wish to get in for 4.4 that aren't in this pull, as this represents what has gone through merge/build/run testing and not what is the last few items for which testing is not yet complete. - "Checksum offload support in user space" enablement - Misc cxgb4 fixes, add T6 support - Misc usnic fixes - 32 bit build warning fixes - Misc ocrdma fixes - Multicast loopback prevention extension - Extend the GID cache to store and return attributes of GIDs - Misc iSER updates - iSER clustering update - Network NameSpace support for rdma CM - Work Request cleanup series - New Memory Registration API" * tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (76 commits) IB/core, cma: Make __attribute_const__ declarations sparse-friendly IB/core: Remove old fast registration API IB/ipath: Remove fast registration from the code IB/hfi1: Remove fast registration from the code RDMA/nes: Remove old FRWR API IB/qib: Remove old FRWR API iw_cxgb4: Remove old FRWR API RDMA/cxgb3: Remove old FRWR API RDMA/ocrdma: Remove old FRWR API IB/mlx4: Remove old FRWR API support IB/mlx5: Remove old FRWR API support IB/srp: Dont allocate a page vector when using fast_reg IB/srp: Remove srp_finish_mapping IB/srp: Convert to new registration API IB/srp: Split srp_map_sg RDS/IW: Convert to new memory registration API svcrdma: Port to new memory registration API xprtrdma: Port to new memory registration API iser-target: Port to new memory registration API IB/iser: Port to new fast registration API ...
This commit is contained in:
@@ -49,6 +49,7 @@
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/net_tstamp.h>
|
||||
#include <asm/io.h>
|
||||
#include "t4_chip_type.h"
|
||||
#include "cxgb4_uld.h"
|
||||
|
||||
#define CH_WARN(adap, fmt, ...) dev_warn(adap->pdev_dev, fmt, ## __VA_ARGS__)
|
||||
@@ -291,31 +292,6 @@ struct pci_params {
|
||||
unsigned char width;
|
||||
};
|
||||
|
||||
#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
|
||||
#define CHELSIO_CHIP_FPGA 0x100
|
||||
#define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf)
|
||||
#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
|
||||
|
||||
#define CHELSIO_T4 0x4
|
||||
#define CHELSIO_T5 0x5
|
||||
#define CHELSIO_T6 0x6
|
||||
|
||||
enum chip_type {
|
||||
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
|
||||
T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
|
||||
T4_FIRST_REV = T4_A1,
|
||||
T4_LAST_REV = T4_A2,
|
||||
|
||||
T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
|
||||
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
|
||||
T5_FIRST_REV = T5_A0,
|
||||
T5_LAST_REV = T5_A1,
|
||||
|
||||
T6_A0 = CHELSIO_CHIP_CODE(CHELSIO_T6, 0),
|
||||
T6_FIRST_REV = T6_A0,
|
||||
T6_LAST_REV = T6_A0,
|
||||
};
|
||||
|
||||
struct devlog_params {
|
||||
u32 memtype; /* which memory (EDC0, EDC1, MC) */
|
||||
u32 start; /* start of log in firmware memory */
|
||||
@@ -909,21 +885,6 @@ static inline int is_offload(const struct adapter *adap)
|
||||
return adap->params.offload;
|
||||
}
|
||||
|
||||
static inline int is_t6(enum chip_type chip)
|
||||
{
|
||||
return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T6;
|
||||
}
|
||||
|
||||
static inline int is_t5(enum chip_type chip)
|
||||
{
|
||||
return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T5;
|
||||
}
|
||||
|
||||
static inline int is_t4(enum chip_type chip)
|
||||
{
|
||||
return CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4;
|
||||
}
|
||||
|
||||
static inline u32 t4_read_reg(struct adapter *adap, u32 reg_addr)
|
||||
{
|
||||
return readl(adap->regs + reg_addr);
|
||||
|
||||
@@ -1940,6 +1940,28 @@ unsigned int cxgb4_best_aligned_mtu(const unsigned short *mtus,
|
||||
}
|
||||
EXPORT_SYMBOL(cxgb4_best_aligned_mtu);
|
||||
|
||||
/**
|
||||
* cxgb4_tp_smt_idx - Get the Source Mac Table index for this VI
|
||||
* @chip: chip type
|
||||
* @viid: VI id of the given port
|
||||
*
|
||||
* Return the SMT index for this VI.
|
||||
*/
|
||||
unsigned int cxgb4_tp_smt_idx(enum chip_type chip, unsigned int viid)
|
||||
{
|
||||
/* In T4/T5, SMT contains 256 SMAC entries organized in
|
||||
* 128 rows of 2 entries each.
|
||||
* In T6, SMT contains 256 SMAC entries in 256 rows.
|
||||
* TODO: The below code needs to be updated when we add support
|
||||
* for 256 VFs.
|
||||
*/
|
||||
if (CHELSIO_CHIP_VERSION(chip) <= CHELSIO_T5)
|
||||
return ((viid & 0x7f) << 1);
|
||||
else
|
||||
return (viid & 0x7f);
|
||||
}
|
||||
EXPORT_SYMBOL(cxgb4_tp_smt_idx);
|
||||
|
||||
/**
|
||||
* cxgb4_port_chan - get the HW channel of a port
|
||||
* @dev: the net device for the port
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/inetdevice.h>
|
||||
#include <linux/atomic.h>
|
||||
#include "cxgb4.h"
|
||||
|
||||
/* CPL message priority levels */
|
||||
enum {
|
||||
@@ -290,6 +291,7 @@ int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb);
|
||||
unsigned int cxgb4_dbfifo_count(const struct net_device *dev, int lpfifo);
|
||||
unsigned int cxgb4_port_chan(const struct net_device *dev);
|
||||
unsigned int cxgb4_port_viid(const struct net_device *dev);
|
||||
unsigned int cxgb4_tp_smt_idx(enum chip_type chip, unsigned int viid);
|
||||
unsigned int cxgb4_port_idx(const struct net_device *dev);
|
||||
unsigned int cxgb4_best_mtu(const unsigned short *mtus, unsigned short mtu,
|
||||
unsigned int *idx);
|
||||
|
||||
85
drivers/net/ethernet/chelsio/cxgb4/t4_chip_type.h
Normal file
85
drivers/net/ethernet/chelsio/cxgb4/t4_chip_type.h
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* This file is part of the Chelsio T4 Ethernet driver for Linux.
|
||||
*
|
||||
* Copyright (c) 2003-2015 Chelsio Communications, Inc. All rights reserved.
|
||||
*
|
||||
* This software is available to you under a choice of one of two
|
||||
* licenses. You may choose to be licensed under the terms of the GNU
|
||||
* General Public License (GPL) Version 2, available from the file
|
||||
* COPYING in the main directory of this source tree, or the
|
||||
* OpenIB.org BSD license below:
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or
|
||||
* without modification, are permitted provided that the following
|
||||
* conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer.
|
||||
*
|
||||
* - Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
#ifndef __T4_CHIP_TYPE_H__
|
||||
#define __T4_CHIP_TYPE_H__
|
||||
|
||||
#define CHELSIO_T4 0x4
|
||||
#define CHELSIO_T5 0x5
|
||||
#define CHELSIO_T6 0x6
|
||||
|
||||
/* We code the Chelsio T4 Family "Chip Code" as a tuple:
|
||||
*
|
||||
* (Chip Version, Chip Revision)
|
||||
*
|
||||
* where:
|
||||
*
|
||||
* Chip Version: is T4, T5, etc.
|
||||
* Chip Revision: is the FAB "spin" of the Chip Version.
|
||||
*/
|
||||
#define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision))
|
||||
#define CHELSIO_CHIP_VERSION(code) (((code) >> 4) & 0xf)
|
||||
#define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf)
|
||||
|
||||
enum chip_type {
|
||||
T4_A1 = CHELSIO_CHIP_CODE(CHELSIO_T4, 1),
|
||||
T4_A2 = CHELSIO_CHIP_CODE(CHELSIO_T4, 2),
|
||||
T4_FIRST_REV = T4_A1,
|
||||
T4_LAST_REV = T4_A2,
|
||||
|
||||
T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0),
|
||||
T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1),
|
||||
T5_FIRST_REV = T5_A0,
|
||||
T5_LAST_REV = T5_A1,
|
||||
|
||||
T6_A0 = CHELSIO_CHIP_CODE(CHELSIO_T6, 0),
|
||||
T6_FIRST_REV = T6_A0,
|
||||
T6_LAST_REV = T6_A0,
|
||||
};
|
||||
|
||||
static inline int is_t4(enum chip_type chip)
|
||||
{
|
||||
return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4);
|
||||
}
|
||||
|
||||
static inline int is_t5(enum chip_type chip)
|
||||
{
|
||||
return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T5);
|
||||
}
|
||||
|
||||
static inline int is_t6(enum chip_type chip)
|
||||
{
|
||||
return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T6);
|
||||
}
|
||||
|
||||
#endif /* __T4_CHIP_TYPE_H__ */
|
||||
@@ -417,6 +417,21 @@ struct cpl_t5_act_open_req {
|
||||
__be64 params;
|
||||
};
|
||||
|
||||
struct cpl_t6_act_open_req {
|
||||
WR_HDR;
|
||||
union opcode_tid ot;
|
||||
__be16 local_port;
|
||||
__be16 peer_port;
|
||||
__be32 local_ip;
|
||||
__be32 peer_ip;
|
||||
__be64 opt0;
|
||||
__be32 rsvd;
|
||||
__be32 opt2;
|
||||
__be64 params;
|
||||
__be32 rsvd2;
|
||||
__be32 opt3;
|
||||
};
|
||||
|
||||
struct cpl_act_open_req6 {
|
||||
WR_HDR;
|
||||
union opcode_tid ot;
|
||||
@@ -446,6 +461,23 @@ struct cpl_t5_act_open_req6 {
|
||||
__be64 params;
|
||||
};
|
||||
|
||||
struct cpl_t6_act_open_req6 {
|
||||
WR_HDR;
|
||||
union opcode_tid ot;
|
||||
__be16 local_port;
|
||||
__be16 peer_port;
|
||||
__be64 local_ip_hi;
|
||||
__be64 local_ip_lo;
|
||||
__be64 peer_ip_hi;
|
||||
__be64 peer_ip_lo;
|
||||
__be64 opt0;
|
||||
__be32 rsvd;
|
||||
__be32 opt2;
|
||||
__be64 params;
|
||||
__be32 rsvd2;
|
||||
__be32 opt3;
|
||||
};
|
||||
|
||||
struct cpl_act_open_rpl {
|
||||
union opcode_tid ot;
|
||||
__be32 atid_status;
|
||||
@@ -504,6 +536,19 @@ struct cpl_pass_establish {
|
||||
#define TCPOPT_MSS_M 0xF
|
||||
#define TCPOPT_MSS_G(x) (((x) >> TCPOPT_MSS_S) & TCPOPT_MSS_M)
|
||||
|
||||
#define T6_TCP_HDR_LEN_S 8
|
||||
#define T6_TCP_HDR_LEN_V(x) ((x) << T6_TCP_HDR_LEN_S)
|
||||
#define T6_TCP_HDR_LEN_G(x) (((x) >> T6_TCP_HDR_LEN_S) & TCP_HDR_LEN_M)
|
||||
|
||||
#define T6_IP_HDR_LEN_S 14
|
||||
#define T6_IP_HDR_LEN_V(x) ((x) << T6_IP_HDR_LEN_S)
|
||||
#define T6_IP_HDR_LEN_G(x) (((x) >> T6_IP_HDR_LEN_S) & IP_HDR_LEN_M)
|
||||
|
||||
#define T6_ETH_HDR_LEN_S 24
|
||||
#define T6_ETH_HDR_LEN_M 0xFF
|
||||
#define T6_ETH_HDR_LEN_V(x) ((x) << T6_ETH_HDR_LEN_S)
|
||||
#define T6_ETH_HDR_LEN_G(x) (((x) >> T6_ETH_HDR_LEN_S) & T6_ETH_HDR_LEN_M)
|
||||
|
||||
struct cpl_act_establish {
|
||||
union opcode_tid ot;
|
||||
__be32 rsvd;
|
||||
@@ -833,6 +878,9 @@ struct cpl_rx_pkt {
|
||||
__be16 err_vec;
|
||||
};
|
||||
|
||||
#define RX_T6_ETHHDR_LEN_M 0xFF
|
||||
#define RX_T6_ETHHDR_LEN_G(x) (((x) >> RX_ETHHDR_LEN_S) & RX_T6_ETHHDR_LEN_M)
|
||||
|
||||
#define RXF_PSH_S 20
|
||||
#define RXF_PSH_V(x) ((x) << RXF_PSH_S)
|
||||
#define RXF_PSH_F RXF_PSH_V(1U)
|
||||
|
||||
@@ -123,6 +123,28 @@ void mlx4_en_update_loopback_state(struct net_device *dev,
|
||||
*/
|
||||
if (mlx4_is_mfunc(priv->mdev->dev) || priv->validate_loopback)
|
||||
priv->flags |= MLX4_EN_FLAG_ENABLE_HW_LOOPBACK;
|
||||
|
||||
mutex_lock(&priv->mdev->state_lock);
|
||||
if (priv->mdev->dev->caps.flags2 &
|
||||
MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB &&
|
||||
priv->rss_map.indir_qp.qpn) {
|
||||
int i;
|
||||
int err = 0;
|
||||
int loopback = !!(features & NETIF_F_LOOPBACK);
|
||||
|
||||
for (i = 0; i < priv->rx_ring_num; i++) {
|
||||
int ret;
|
||||
|
||||
ret = mlx4_en_change_mcast_lb(priv,
|
||||
&priv->rss_map.qps[i],
|
||||
loopback);
|
||||
if (!err)
|
||||
err = ret;
|
||||
}
|
||||
if (err)
|
||||
mlx4_warn(priv->mdev, "failed to change mcast loopback\n");
|
||||
}
|
||||
mutex_unlock(&priv->mdev->state_lock);
|
||||
}
|
||||
|
||||
static int mlx4_en_get_profile(struct mlx4_en_dev *mdev)
|
||||
|
||||
@@ -69,6 +69,15 @@ void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride,
|
||||
context->pri_path.counter_index = priv->counter_index;
|
||||
context->cqn_send = cpu_to_be32(cqn);
|
||||
context->cqn_recv = cpu_to_be32(cqn);
|
||||
if (!rss &&
|
||||
(mdev->dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_LB_SRC_CHK) &&
|
||||
context->pri_path.counter_index !=
|
||||
MLX4_SINK_COUNTER_INDEX(mdev->dev)) {
|
||||
/* disable multicast loopback to qp with same counter */
|
||||
if (!(dev->features & NETIF_F_LOOPBACK))
|
||||
context->pri_path.fl |= MLX4_FL_ETH_SRC_CHECK_MC_LB;
|
||||
context->pri_path.control |= MLX4_CTRL_ETH_SRC_CHECK_IF_COUNTER;
|
||||
}
|
||||
context->db_rec_addr = cpu_to_be64(priv->res.db.dma << 2);
|
||||
if (!(dev->features & NETIF_F_HW_VLAN_CTAG_RX))
|
||||
context->param3 |= cpu_to_be32(1 << 30);
|
||||
@@ -80,6 +89,22 @@ void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride,
|
||||
}
|
||||
}
|
||||
|
||||
int mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp,
|
||||
int loopback)
|
||||
{
|
||||
int ret;
|
||||
struct mlx4_update_qp_params qp_params;
|
||||
|
||||
memset(&qp_params, 0, sizeof(qp_params));
|
||||
if (!loopback)
|
||||
qp_params.flags = MLX4_UPDATE_QP_PARAMS_FLAGS_ETH_CHECK_MC_LB;
|
||||
|
||||
ret = mlx4_update_qp(priv->mdev->dev, qp->qpn,
|
||||
MLX4_UPDATE_QP_ETH_SRC_CHECK_MC_LB,
|
||||
&qp_params);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mlx4_en_map_buffer(struct mlx4_buf *buf)
|
||||
{
|
||||
|
||||
@@ -155,6 +155,8 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
|
||||
[27] = "Port beacon support",
|
||||
[28] = "RX-ALL support",
|
||||
[29] = "802.1ad offload support",
|
||||
[31] = "Modifying loopback source checks using UPDATE_QP support",
|
||||
[32] = "Loopback source checks support",
|
||||
};
|
||||
int i;
|
||||
|
||||
@@ -964,6 +966,10 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
MLX4_GET(field32, outbox, QUERY_DEV_CAP_EXT_2_FLAGS_OFFSET);
|
||||
if (field32 & (1 << 16))
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_UPDATE_QP;
|
||||
if (field32 & (1 << 18))
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB;
|
||||
if (field32 & (1 << 19))
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_LB_SRC_CHK;
|
||||
if (field32 & (1 << 26))
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_VLAN_CONTROL;
|
||||
if (field32 & (1 << 20))
|
||||
|
||||
@@ -798,7 +798,8 @@ void mlx4_en_fill_qp_context(struct mlx4_en_priv *priv, int size, int stride,
|
||||
void mlx4_en_sqp_event(struct mlx4_qp *qp, enum mlx4_event event);
|
||||
int mlx4_en_map_buffer(struct mlx4_buf *buf);
|
||||
void mlx4_en_unmap_buffer(struct mlx4_buf *buf);
|
||||
|
||||
int mlx4_en_change_mcast_lb(struct mlx4_en_priv *priv, struct mlx4_qp *qp,
|
||||
int loopback);
|
||||
void mlx4_en_calc_rx_buf(struct net_device *dev);
|
||||
int mlx4_en_config_rss_steer(struct mlx4_en_priv *priv);
|
||||
void mlx4_en_release_rss_steer(struct mlx4_en_priv *priv);
|
||||
|
||||
@@ -436,6 +436,23 @@ int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn,
|
||||
cmd->qp_context.pri_path.grh_mylmc = params->smac_index;
|
||||
}
|
||||
|
||||
if (attr & MLX4_UPDATE_QP_ETH_SRC_CHECK_MC_LB) {
|
||||
if (!(dev->caps.flags2
|
||||
& MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB)) {
|
||||
mlx4_warn(dev,
|
||||
"Trying to set src check LB, but it isn't supported\n");
|
||||
err = -ENOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
pri_addr_path_mask |=
|
||||
1ULL << MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB;
|
||||
if (params->flags &
|
||||
MLX4_UPDATE_QP_PARAMS_FLAGS_ETH_CHECK_MC_LB) {
|
||||
cmd->qp_context.pri_path.fl |=
|
||||
MLX4_FL_ETH_SRC_CHECK_MC_LB;
|
||||
}
|
||||
}
|
||||
|
||||
if (attr & MLX4_UPDATE_QP_VSD) {
|
||||
qp_mask |= 1ULL << MLX4_UPD_QP_MASK_VSD;
|
||||
if (params->flags & MLX4_UPDATE_QP_PARAMS_FLAGS_VSD_ENABLE)
|
||||
@@ -458,7 +475,7 @@ int mlx4_update_qp(struct mlx4_dev *dev, u32 qpn,
|
||||
err = mlx4_cmd(dev, mailbox->dma, qpn & 0xffffff, 0,
|
||||
MLX4_CMD_UPDATE_QP, MLX4_CMD_TIME_CLASS_A,
|
||||
MLX4_CMD_NATIVE);
|
||||
|
||||
out:
|
||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -770,9 +770,12 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
|
||||
}
|
||||
}
|
||||
|
||||
/* preserve IF_COUNTER flag */
|
||||
qpc->pri_path.vlan_control &=
|
||||
MLX4_CTRL_ETH_SRC_CHECK_IF_COUNTER;
|
||||
if (vp_oper->state.link_state == IFLA_VF_LINK_STATE_DISABLE &&
|
||||
dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_UPDATE_QP) {
|
||||
qpc->pri_path.vlan_control =
|
||||
qpc->pri_path.vlan_control |=
|
||||
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_TX_BLOCK_PRIO_TAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_TX_BLOCK_UNTAGGED |
|
||||
@@ -780,12 +783,12 @@ static int update_vport_qp_param(struct mlx4_dev *dev,
|
||||
MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED;
|
||||
} else if (0 != vp_oper->state.default_vlan) {
|
||||
qpc->pri_path.vlan_control =
|
||||
qpc->pri_path.vlan_control |=
|
||||
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_RX_BLOCK_PRIO_TAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_RX_BLOCK_UNTAGGED;
|
||||
} else { /* priority tagged */
|
||||
qpc->pri_path.vlan_control =
|
||||
qpc->pri_path.vlan_control |=
|
||||
MLX4_VLAN_CTRL_ETH_TX_BLOCK_TAGGED |
|
||||
MLX4_VLAN_CTRL_ETH_RX_BLOCK_TAGGED;
|
||||
}
|
||||
@@ -3764,9 +3767,6 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
|
||||
update_gid(dev, inbox, (u8)slave);
|
||||
adjust_proxy_tun_qkey(dev, vhcr, qpc);
|
||||
orig_sched_queue = qpc->pri_path.sched_queue;
|
||||
err = update_vport_qp_param(dev, inbox, slave, qpn);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = get_res(dev, slave, qpn, RES_QP, &qp);
|
||||
if (err)
|
||||
@@ -3776,6 +3776,10 @@ int mlx4_INIT2RTR_QP_wrapper(struct mlx4_dev *dev, int slave,
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = update_vport_qp_param(dev, inbox, slave, qpn);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = mlx4_DMA_wrapper(dev, slave, vhcr, inbox, outbox, cmd);
|
||||
out:
|
||||
/* if no error, save sched queue value passed in by VF. This is
|
||||
@@ -4210,7 +4214,9 @@ static int add_eth_header(struct mlx4_dev *dev, int slave,
|
||||
|
||||
}
|
||||
|
||||
#define MLX4_UPD_QP_PATH_MASK_SUPPORTED (1ULL << MLX4_UPD_QP_PATH_MASK_MAC_INDEX)
|
||||
#define MLX4_UPD_QP_PATH_MASK_SUPPORTED ( \
|
||||
1ULL << MLX4_UPD_QP_PATH_MASK_MAC_INDEX |\
|
||||
1ULL << MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB)
|
||||
int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
|
||||
struct mlx4_vhcr *vhcr,
|
||||
struct mlx4_cmd_mailbox *inbox,
|
||||
@@ -4233,6 +4239,16 @@ int mlx4_UPDATE_QP_wrapper(struct mlx4_dev *dev, int slave,
|
||||
(pri_addr_path_mask & ~MLX4_UPD_QP_PATH_MASK_SUPPORTED))
|
||||
return -EPERM;
|
||||
|
||||
if ((pri_addr_path_mask &
|
||||
(1ULL << MLX4_UPD_QP_PATH_MASK_ETH_SRC_CHECK_MC_LB)) &&
|
||||
!(dev->caps.flags2 &
|
||||
MLX4_DEV_CAP_FLAG2_UPDATE_QP_SRC_CHECK_LB)) {
|
||||
mlx4_warn(dev,
|
||||
"Src check LB for slave %d isn't supported\n",
|
||||
slave);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
/* Just change the smac for the QP */
|
||||
err = get_res(dev, slave, qpn, RES_QP, &rqp);
|
||||
if (err) {
|
||||
|
||||
Reference in New Issue
Block a user