mirror of https://gitee.com/openkylin/linux.git
mlx5-fixes-2019-05-17
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEGhZs6bAKwk/OTgTpSD+KveBX+j4FAlzfFrEACgkQSD+KveBX +j4zVggAmqybBgCmoz7+XwXK+Loxrd8PeKtDi8UgGTgkS3qf+dzVAlUHKnsx0nzX /VDVCz12SzGZgL7xIdCbrVeD088gWroO+lbwK2ucAt2mBxEsNUAu9y4rXmMu1wQB LPmao5j/v38Ru2lsNnXG8thH1ggGOytsWlBZc7ntC2QDrJp/h+9EOlW9TUFZ+LFr aFrvrXpzctrOlbLRSrfwIwDhOcs6MW0fElDHMSd72Ax1xnw1PZ9/Tv3kBGA/MD3h P0GAwu8jAp7ztfcXarr93J2iSfDjZpkBj6MH15P65Xv1gq3thmv8LgG41zYzw6L+ 34hsPPFb8DBnGWc8usy9Qch2acA6ug== =kTWK -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2019-05-17' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2019-05-17 This series introduces some fixes to mlx5 driver. For more information please see tag log below. Please pull and let me know if there is any problem. For -stable v4.19 net/mlx5e: Fix ethtool rxfh commands when CONFIG_MLX5_EN_RXNFC is disabled net/mlx5: Imply MLXFW in mlx5_core For -stable v5.0 net/mlx5e: Add missing ethtool driver info for representors net/mlx5e: Additional check for flow destination comparison For -stable v5.1 net/mlx5: Fix peer pf disable hca command ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
45c20ebb82
|
@ -109,15 +109,15 @@ u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
|||
}
|
||||
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_index, REP_IB);
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_num, REP_IB);
|
||||
}
|
||||
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_index, REP_ETH);
|
||||
return mlx5_eswitch_get_proto_dev(esw, vport_num, REP_ETH);
|
||||
}
|
||||
|
||||
struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
||||
|
@ -125,9 +125,10 @@ struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
|||
return mlx5_eswitch_uplink_get_proto_dev(esw, REP_IB);
|
||||
}
|
||||
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw, int vport)
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
return mlx5_eswitch_vport_rep(esw, vport);
|
||||
return mlx5_eswitch_vport_rep(esw, vport_num);
|
||||
}
|
||||
|
||||
struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
||||
|
|
|
@ -14,17 +14,17 @@ extern const struct mlx5_ib_profile uplink_rep_profile;
|
|||
|
||||
u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw);
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw);
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
void mlx5_ib_register_vport_reps(struct mlx5_core_dev *mdev);
|
||||
void mlx5_ib_unregister_vport_reps(struct mlx5_core_dev *mdev);
|
||||
struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
||||
struct mlx5_ib_sq *sq,
|
||||
u16 port);
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index);
|
||||
u16 vport_num);
|
||||
#else /* CONFIG_MLX5_ESWITCH */
|
||||
static inline u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
||||
{
|
||||
|
@ -33,7 +33,7 @@ static inline u8 mlx5_ib_eswitch_mode(struct mlx5_eswitch *esw)
|
|||
|
||||
static inline
|
||||
struct mlx5_ib_dev *mlx5_ib_get_rep_ibdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
@ -46,7 +46,7 @@ struct mlx5_ib_dev *mlx5_ib_get_uplink_ibdev(struct mlx5_eswitch *esw)
|
|||
|
||||
static inline
|
||||
struct mlx5_eswitch_rep *mlx5_ib_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ struct mlx5_flow_handle *create_flow_rule_vport_sq(struct mlx5_ib_dev *dev,
|
|||
|
||||
static inline
|
||||
struct net_device *mlx5_ib_get_rep_netdev(struct mlx5_eswitch *esw,
|
||||
int vport_index)
|
||||
u16 vport_num)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ config MLX5_CORE
|
|||
select NET_DEVLINK
|
||||
imply PTP_1588_CLOCK
|
||||
imply VXLAN
|
||||
imply MLXFW
|
||||
default n
|
||||
---help---
|
||||
Core driver for low level functionality of the ConnectX-4 and
|
||||
|
|
|
@ -1604,7 +1604,27 @@ void mlx5_cmd_flush(struct mlx5_core_dev *dev)
|
|||
|
||||
static int status_to_err(u8 status)
|
||||
{
|
||||
return status ? -1 : 0; /* TBD more meaningful codes */
|
||||
switch (status) {
|
||||
case MLX5_CMD_DELIVERY_STAT_OK:
|
||||
case MLX5_DRIVER_STATUS_ABORTED:
|
||||
return 0;
|
||||
case MLX5_CMD_DELIVERY_STAT_SIGNAT_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_TOK_ERR:
|
||||
return -EBADR;
|
||||
case MLX5_CMD_DELIVERY_STAT_BAD_BLK_NUM_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_OUT_PTR_ALIGN_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_IN_PTR_ALIGN_ERR:
|
||||
return -EFAULT; /* Bad address */
|
||||
case MLX5_CMD_DELIVERY_STAT_IN_LENGTH_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_OUT_LENGTH_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_CMD_DESCR_ERR:
|
||||
case MLX5_CMD_DELIVERY_STAT_RES_FLD_NOT_CLR_ERR:
|
||||
return -ENOMSG;
|
||||
case MLX5_CMD_DELIVERY_STAT_FW_ERR:
|
||||
return -EIO;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static struct mlx5_cmd_msg *alloc_msg(struct mlx5_core_dev *dev, int in_size,
|
||||
|
|
|
@ -26,7 +26,7 @@ static int mlx5_peer_pf_disable_hca(struct mlx5_core_dev *dev)
|
|||
|
||||
MLX5_SET(disable_hca_in, in, opcode, MLX5_CMD_OP_DISABLE_HCA);
|
||||
MLX5_SET(disable_hca_in, in, function_id, 0);
|
||||
MLX5_SET(enable_hca_in, in, embedded_cpu_function, 0);
|
||||
MLX5_SET(disable_hca_in, in, embedded_cpu_function, 0);
|
||||
return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||
}
|
||||
|
||||
|
|
|
@ -1901,6 +1901,22 @@ static int mlx5e_flash_device(struct net_device *dev,
|
|||
return mlx5e_ethtool_flash_device(priv, flash);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_MLX5_EN_RXNFC
|
||||
/* When CONFIG_MLX5_EN_RXNFC=n we only support ETHTOOL_GRXRINGS
|
||||
* otherwise this function will be defined from en_fs_ethtool.c
|
||||
*/
|
||||
static int mlx5e_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *info, u32 *rule_locs)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
if (info->cmd != ETHTOOL_GRXRINGS)
|
||||
return -EOPNOTSUPP;
|
||||
/* ring_count is needed by ethtool -x */
|
||||
info->data = priv->channels.params.num_channels;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const struct ethtool_ops mlx5e_ethtool_ops = {
|
||||
.get_drvinfo = mlx5e_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
|
@ -1919,8 +1935,8 @@ const struct ethtool_ops mlx5e_ethtool_ops = {
|
|||
.get_rxfh_indir_size = mlx5e_get_rxfh_indir_size,
|
||||
.get_rxfh = mlx5e_get_rxfh,
|
||||
.set_rxfh = mlx5e_set_rxfh,
|
||||
#ifdef CONFIG_MLX5_EN_RXNFC
|
||||
.get_rxnfc = mlx5e_get_rxnfc,
|
||||
#ifdef CONFIG_MLX5_EN_RXNFC
|
||||
.set_rxnfc = mlx5e_set_rxnfc,
|
||||
#endif
|
||||
.flash_device = mlx5e_flash_device,
|
||||
|
|
|
@ -65,9 +65,26 @@ static void mlx5e_rep_indr_unregister_block(struct mlx5e_rep_priv *rpriv,
|
|||
static void mlx5e_rep_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
|
||||
strlcpy(drvinfo->driver, mlx5e_rep_driver_name,
|
||||
sizeof(drvinfo->driver));
|
||||
strlcpy(drvinfo->version, UTS_RELEASE, sizeof(drvinfo->version));
|
||||
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
|
||||
"%d.%d.%04d (%.16s)",
|
||||
fw_rev_maj(mdev), fw_rev_min(mdev),
|
||||
fw_rev_sub(mdev), mdev->board_id);
|
||||
}
|
||||
|
||||
static void mlx5e_uplink_rep_get_drvinfo(struct net_device *dev,
|
||||
struct ethtool_drvinfo *drvinfo)
|
||||
{
|
||||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
|
||||
mlx5e_rep_get_drvinfo(dev, drvinfo);
|
||||
strlcpy(drvinfo->bus_info, pci_name(priv->mdev->pdev),
|
||||
sizeof(drvinfo->bus_info));
|
||||
}
|
||||
|
||||
static const struct counter_desc sw_rep_stats_desc[] = {
|
||||
|
@ -363,7 +380,7 @@ static const struct ethtool_ops mlx5e_vf_rep_ethtool_ops = {
|
|||
};
|
||||
|
||||
static const struct ethtool_ops mlx5e_uplink_rep_ethtool_ops = {
|
||||
.get_drvinfo = mlx5e_rep_get_drvinfo,
|
||||
.get_drvinfo = mlx5e_uplink_rep_get_drvinfo,
|
||||
.get_link = ethtool_op_get_link,
|
||||
.get_strings = mlx5e_rep_get_strings,
|
||||
.get_sset_count = mlx5e_rep_get_sset_count,
|
||||
|
|
|
@ -1916,6 +1916,19 @@ struct mlx5_fields {
|
|||
offsetof(struct pedit_headers, field) + (off), \
|
||||
MLX5_BYTE_OFF(fte_match_set_lyr_2_4, match_field)}
|
||||
|
||||
/* masked values are the same and there are no rewrites that do not have a
|
||||
* match.
|
||||
*/
|
||||
#define SAME_VAL_MASK(type, valp, maskp, matchvalp, matchmaskp) ({ \
|
||||
type matchmaskx = *(type *)(matchmaskp); \
|
||||
type matchvalx = *(type *)(matchvalp); \
|
||||
type maskx = *(type *)(maskp); \
|
||||
type valx = *(type *)(valp); \
|
||||
\
|
||||
(valx & maskx) == (matchvalx & matchmaskx) && !(maskx & (maskx ^ \
|
||||
matchmaskx)); \
|
||||
})
|
||||
|
||||
static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
|
||||
void *matchmaskp, int size)
|
||||
{
|
||||
|
@ -1923,16 +1936,13 @@ static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
|
|||
|
||||
switch (size) {
|
||||
case sizeof(u8):
|
||||
same = ((*(u8 *)valp) & (*(u8 *)maskp)) ==
|
||||
((*(u8 *)matchvalp) & (*(u8 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u8, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
case sizeof(u16):
|
||||
same = ((*(u16 *)valp) & (*(u16 *)maskp)) ==
|
||||
((*(u16 *)matchvalp) & (*(u16 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u16, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
case sizeof(u32):
|
||||
same = ((*(u32 *)valp) & (*(u32 *)maskp)) ==
|
||||
((*(u32 *)matchvalp) & (*(u32 *)matchmaskp));
|
||||
same = SAME_VAL_MASK(u32, valp, maskp, matchvalp, matchmaskp);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2557,8 +2567,10 @@ static int parse_tc_nic_actions(struct mlx5e_priv *priv,
|
|||
/* in case all pedit actions are skipped, remove the MOD_HDR
|
||||
* flag.
|
||||
*/
|
||||
if (parse_attr->num_mod_hdr_actions == 0)
|
||||
if (parse_attr->num_mod_hdr_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
kfree(parse_attr->mod_hdr_actions);
|
||||
}
|
||||
}
|
||||
|
||||
attr->action = action;
|
||||
|
@ -2995,6 +3007,7 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
|
|||
*/
|
||||
if (parse_attr->num_mod_hdr_actions == 0) {
|
||||
action &= ~MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
|
||||
kfree(parse_attr->mod_hdr_actions);
|
||||
if (!((action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP) ||
|
||||
(action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH)))
|
||||
attr->split_count = 0;
|
||||
|
|
|
@ -361,7 +361,7 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
stats->bytes += num_bytes;
|
||||
stats->xmit_more += netdev_xmit_more();
|
||||
stats->xmit_more += xmit_more;
|
||||
|
||||
headlen = skb->len - ihs - skb->data_len;
|
||||
ds_cnt += !!headlen;
|
||||
|
@ -624,7 +624,8 @@ mlx5i_txwqe_build_datagram(struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
|||
}
|
||||
|
||||
netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey)
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
||||
bool xmit_more)
|
||||
{
|
||||
struct mlx5_wq_cyc *wq = &sq->wq;
|
||||
struct mlx5i_tx_wqe *wqe;
|
||||
|
@ -660,7 +661,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
stats->bytes += num_bytes;
|
||||
stats->xmit_more += netdev_xmit_more();
|
||||
stats->xmit_more += xmit_more;
|
||||
|
||||
headlen = skb->len - ihs - skb->data_len;
|
||||
ds_cnt += !!headlen;
|
||||
|
@ -705,7 +706,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|||
goto err_drop;
|
||||
|
||||
mlx5e_txwqe_complete(sq, skb, opcode, ds_cnt, num_wqebbs, num_bytes,
|
||||
num_dma, wi, cseg, false);
|
||||
num_dma, wi, cseg, xmit_more);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
|
|
|
@ -1526,7 +1526,7 @@ static void node_guid_gen_from_mac(u64 *node_guid, u8 mac[ETH_ALEN])
|
|||
static void esw_apply_vport_conf(struct mlx5_eswitch *esw,
|
||||
struct mlx5_vport *vport)
|
||||
{
|
||||
int vport_num = vport->vport;
|
||||
u16 vport_num = vport->vport;
|
||||
|
||||
if (esw->manager_vport == vport_num)
|
||||
return;
|
||||
|
@ -1915,7 +1915,7 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
|
|||
|
||||
/* Vport Administration */
|
||||
int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
||||
int vport, u8 mac[ETH_ALEN])
|
||||
u16 vport, u8 mac[ETH_ALEN])
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
u64 node_guid;
|
||||
|
@ -1959,7 +1959,7 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
||||
int vport, int link_state)
|
||||
u16 vport, int link_state)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
int err = 0;
|
||||
|
@ -1989,7 +1989,7 @@ int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
||||
int vport, struct ifla_vf_info *ivi)
|
||||
u16 vport, struct ifla_vf_info *ivi)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
|
||||
|
@ -2014,7 +2014,7 @@ int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos, u8 set_flags)
|
||||
u16 vport, u16 vlan, u8 qos, u8 set_flags)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
int err = 0;
|
||||
|
@ -2047,7 +2047,7 @@ int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos)
|
||||
u16 vport, u16 vlan, u8 qos)
|
||||
{
|
||||
u8 set_flags = 0;
|
||||
|
||||
|
@ -2058,7 +2058,7 @@ int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
|
||||
int vport, bool spoofchk)
|
||||
u16 vport, bool spoofchk)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
bool pschk;
|
||||
|
@ -2208,7 +2208,7 @@ int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting)
|
|||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,
|
||||
int vport, bool setting)
|
||||
u16 vport, bool setting)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
|
||||
|
@ -2278,7 +2278,7 @@ static int normalize_vports_min_rate(struct mlx5_eswitch *esw, u32 divider)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport,
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 max_rate, u32 min_rate)
|
||||
{
|
||||
struct mlx5_vport *evport = mlx5_eswitch_get_vport(esw, vport);
|
||||
|
@ -2368,7 +2368,7 @@ static int mlx5_eswitch_query_vport_drop_stats(struct mlx5_core_dev *dev,
|
|||
}
|
||||
|
||||
int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
||||
int vport_num,
|
||||
u16 vport_num,
|
||||
struct ifla_vf_stats *vf_stats)
|
||||
{
|
||||
struct mlx5_vport *vport = mlx5_eswitch_get_vport(esw, vport_num);
|
||||
|
|
|
@ -246,23 +246,23 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw);
|
|||
int mlx5_eswitch_enable_sriov(struct mlx5_eswitch *esw, int nvfs, int mode);
|
||||
void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw);
|
||||
int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
||||
int vport, u8 mac[ETH_ALEN]);
|
||||
u16 vport, u8 mac[ETH_ALEN]);
|
||||
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
|
||||
int vport, int link_state);
|
||||
u16 vport, int link_state);
|
||||
int mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos);
|
||||
u16 vport, u16 vlan, u8 qos);
|
||||
int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
|
||||
int vport, bool spoofchk);
|
||||
u16 vport, bool spoofchk);
|
||||
int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,
|
||||
int vport_num, bool setting);
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, int vport,
|
||||
u16 vport_num, bool setting);
|
||||
int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 max_rate, u32 min_rate);
|
||||
int mlx5_eswitch_set_vepa(struct mlx5_eswitch *esw, u8 setting);
|
||||
int mlx5_eswitch_get_vepa(struct mlx5_eswitch *esw, u8 *setting);
|
||||
int mlx5_eswitch_get_vport_config(struct mlx5_eswitch *esw,
|
||||
int vport, struct ifla_vf_info *ivi);
|
||||
u16 vport, struct ifla_vf_info *ivi);
|
||||
int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport,
|
||||
struct ifla_vf_stats *vf_stats);
|
||||
void mlx5_eswitch_del_send_to_vport_rule(struct mlx5_flow_handle *rule);
|
||||
|
||||
|
@ -296,7 +296,7 @@ u32
|
|||
mlx5_eswitch_get_chain_range(struct mlx5_eswitch *esw);
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport,
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
struct mlx5_flow_destination *dest);
|
||||
|
||||
enum {
|
||||
|
@ -366,7 +366,7 @@ int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
|
|||
int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
|
||||
struct mlx5_esw_flow_attr *attr);
|
||||
int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
|
||||
int vport, u16 vlan, u8 qos, u8 set_flags);
|
||||
u16 vport, u16 vlan, u8 qos, u8 set_flags);
|
||||
|
||||
static inline bool mlx5_eswitch_vlan_actions_supported(struct mlx5_core_dev *dev,
|
||||
u8 vlan_depth)
|
||||
|
@ -430,7 +430,7 @@ static inline int mlx5_eswitch_vport_num_to_index(struct mlx5_eswitch *esw,
|
|||
return vport_num;
|
||||
}
|
||||
|
||||
static inline int mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
|
||||
static inline u16 mlx5_eswitch_index_to_vport_num(struct mlx5_eswitch *esw,
|
||||
int index)
|
||||
{
|
||||
if (index == mlx5_eswitch_ecpf_idx(esw) &&
|
||||
|
|
|
@ -57,7 +57,7 @@
|
|||
static struct mlx5_eswitch_rep *mlx5_eswitch_get_rep(struct mlx5_eswitch *esw,
|
||||
u16 vport_num)
|
||||
{
|
||||
u16 idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
int idx = mlx5_eswitch_vport_num_to_index(esw, vport_num);
|
||||
|
||||
WARN_ON(idx > esw->total_vports - 1);
|
||||
return &esw->offloads.vport_reps[idx];
|
||||
|
@ -515,7 +515,8 @@ int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
|
|||
}
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, int vport, u32 sqn)
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
u32 sqn)
|
||||
{
|
||||
struct mlx5_flow_act flow_act = {0};
|
||||
struct mlx5_flow_destination dest = {};
|
||||
|
@ -1181,7 +1182,7 @@ static void esw_destroy_vport_rx_group(struct mlx5_eswitch *esw)
|
|||
}
|
||||
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, int vport,
|
||||
mlx5_eswitch_create_vport_rx_rule(struct mlx5_eswitch *esw, u16 vport,
|
||||
struct mlx5_flow_destination *dest)
|
||||
{
|
||||
struct mlx5_flow_act flow_act = {0};
|
||||
|
@ -1731,13 +1732,14 @@ static void esw_prio_tag_acls_cleanup(struct mlx5_eswitch *esw)
|
|||
struct mlx5_vport *vport;
|
||||
int i;
|
||||
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->nvports) {
|
||||
mlx5_esw_for_each_vf_vport(esw, i, vport, esw->dev->priv.sriov.num_vfs) {
|
||||
esw_vport_disable_egress_acl(esw, vport);
|
||||
esw_vport_disable_ingress_acl(esw, vport);
|
||||
}
|
||||
}
|
||||
|
||||
static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int nvports)
|
||||
static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int vf_nvports,
|
||||
int nvports)
|
||||
{
|
||||
int err;
|
||||
|
||||
|
@ -1745,7 +1747,7 @@ static int esw_offloads_steering_init(struct mlx5_eswitch *esw, int nvports)
|
|||
mutex_init(&esw->fdb_table.offloads.fdb_prio_lock);
|
||||
|
||||
if (MLX5_CAP_GEN(esw->dev, prio_tag_required)) {
|
||||
err = esw_prio_tag_acls_config(esw, nvports);
|
||||
err = esw_prio_tag_acls_config(esw, vf_nvports);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
@ -1838,7 +1840,7 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports,
|
|||
{
|
||||
int err;
|
||||
|
||||
err = esw_offloads_steering_init(esw, total_nvports);
|
||||
err = esw_offloads_steering_init(esw, vf_nvports, total_nvports);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@ -2243,7 +2245,7 @@ void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type)
|
|||
}
|
||||
|
||||
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport,
|
||||
u8 rep_type)
|
||||
{
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
|
@ -2264,7 +2266,7 @@ void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type)
|
|||
EXPORT_SYMBOL(mlx5_eswitch_uplink_get_proto_dev);
|
||||
|
||||
struct mlx5_eswitch_rep *mlx5_eswitch_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport)
|
||||
u16 vport)
|
||||
{
|
||||
return mlx5_eswitch_get_rep(esw, vport);
|
||||
}
|
||||
|
|
|
@ -1380,6 +1380,8 @@ static bool mlx5_flow_dests_cmp(struct mlx5_flow_destination *d1,
|
|||
if ((d1->type == MLX5_FLOW_DESTINATION_TYPE_VPORT &&
|
||||
d1->vport.num == d2->vport.num &&
|
||||
d1->vport.flags == d2->vport.flags &&
|
||||
((d1->vport.flags & MLX5_FLOW_DEST_VPORT_VHCA_ID) ?
|
||||
(d1->vport.vhca_id == d2->vport.vhca_id) : true) &&
|
||||
((d1->vport.flags & MLX5_FLOW_DEST_VPORT_REFORMAT_ID) ?
|
||||
(d1->vport.reformat_id == d2->vport.reformat_id) : true)) ||
|
||||
(d1->type == MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE &&
|
||||
|
|
|
@ -619,7 +619,7 @@ static int mlx5i_xmit(struct net_device *dev, struct sk_buff *skb,
|
|||
struct mlx5_ib_ah *mah = to_mah(address);
|
||||
struct mlx5i_priv *ipriv = epriv->ppriv;
|
||||
|
||||
return mlx5i_sq_xmit(sq, skb, &mah->av, dqpn, ipriv->qkey);
|
||||
return mlx5i_sq_xmit(sq, skb, &mah->av, dqpn, ipriv->qkey, netdev_xmit_more());
|
||||
}
|
||||
|
||||
static void mlx5i_set_pkey_index(struct net_device *netdev, int id)
|
||||
|
|
|
@ -119,7 +119,8 @@ static inline void mlx5i_sq_fetch_wqe(struct mlx5e_txqsq *sq,
|
|||
}
|
||||
|
||||
netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey);
|
||||
struct mlx5_av *av, u32 dqpn, u32 dqkey,
|
||||
bool xmit_more);
|
||||
void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe);
|
||||
void mlx5i_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats);
|
||||
|
||||
|
|
|
@ -51,13 +51,13 @@ void mlx5_eswitch_register_vport_reps(struct mlx5_eswitch *esw,
|
|||
u8 rep_type);
|
||||
void mlx5_eswitch_unregister_vport_reps(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
void *mlx5_eswitch_get_proto_dev(struct mlx5_eswitch *esw,
|
||||
int vport,
|
||||
u16 vport_num,
|
||||
u8 rep_type);
|
||||
struct mlx5_eswitch_rep *mlx5_eswitch_vport_rep(struct mlx5_eswitch *esw,
|
||||
int vport);
|
||||
u16 vport_num);
|
||||
void *mlx5_eswitch_uplink_get_proto_dev(struct mlx5_eswitch *esw, u8 rep_type);
|
||||
u8 mlx5_eswitch_mode(struct mlx5_eswitch *esw);
|
||||
struct mlx5_flow_handle *
|
||||
mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *esw,
|
||||
int vport, u32 sqn);
|
||||
u16 vport_num, u32 sqn);
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue