mlx5-fixes-2017-05-12
Misc fixes for mlx5 driver -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJZGDM8AAoJEEg/ir3gV/o+svMH/1lAl+FIGCWgZ82/UbFHCZCW SIXEnP2id+Nic7JxQSa/RVQ43I75wkM8pN929hFoyz8p/pPLhZkpo7vX6yLWG2SL fTx/4Qn5jR/eow/D+fdrlyKMPg0A7fijY+ZnvDPsQkjtakIedCgc/A1xDufpKi7+ I7nOJa4yACuZK0gzy32VGgpJw02q32eRTJjKHRiEYdmNQSIJpmRbG2m4e0z/me2s hrMt358/llPOZNwkAPD2SHZxH68oSq5EbSRmz5jDwXfTVFkjWNQVowwm3pCFjsQn 3xDtkjakVPVBUagR3hngtLPcsDpUR4GU3tHr4l/UPp0wFBXVKgdupC7B+mCkSp4= =ubJG -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2017-05-12-V2' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2017-05-12 This series contains some mlx5 fixes for net. Please pull and let me know if there's any problem. For -stable: ("net/mlx5e: Fix ethtool pause support and advertise reporting") kernels >= 4.8 ("net/mlx5e: Use the correct pause values for ethtool advertising") kernels >= 4.8 v1->v2: Dropped statistics spinlock patch, it needs some extra work. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
42a928ced3
@ -1003,7 +1003,7 @@ int mlx5e_create_direct_tirs(struct mlx5e_priv *priv);
|
||||
void mlx5e_destroy_direct_tirs(struct mlx5e_priv *priv);
|
||||
void mlx5e_destroy_rqt(struct mlx5e_priv *priv, struct mlx5e_rqt *rqt);
|
||||
|
||||
int mlx5e_create_ttc_table(struct mlx5e_priv *priv, u32 underlay_qpn);
|
||||
int mlx5e_create_ttc_table(struct mlx5e_priv *priv);
|
||||
void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv);
|
||||
|
||||
int mlx5e_create_tis(struct mlx5_core_dev *mdev, int tc,
|
||||
|
@ -794,7 +794,6 @@ static void get_supported(u32 eth_proto_cap,
|
||||
ptys2ethtool_supported_port(link_ksettings, eth_proto_cap);
|
||||
ptys2ethtool_supported_link(supported, eth_proto_cap);
|
||||
ethtool_link_ksettings_add_link_mode(link_ksettings, supported, Pause);
|
||||
ethtool_link_ksettings_add_link_mode(link_ksettings, supported, Asym_Pause);
|
||||
}
|
||||
|
||||
static void get_advertising(u32 eth_proto_cap, u8 tx_pause,
|
||||
@ -804,7 +803,7 @@ static void get_advertising(u32 eth_proto_cap, u8 tx_pause,
|
||||
unsigned long *advertising = link_ksettings->link_modes.advertising;
|
||||
|
||||
ptys2ethtool_adver_link(advertising, eth_proto_cap);
|
||||
if (tx_pause)
|
||||
if (rx_pause)
|
||||
ethtool_link_ksettings_add_link_mode(link_ksettings, advertising, Pause);
|
||||
if (tx_pause ^ rx_pause)
|
||||
ethtool_link_ksettings_add_link_mode(link_ksettings, advertising, Asym_Pause);
|
||||
@ -849,6 +848,8 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5_core_dev *mdev = priv->mdev;
|
||||
u32 out[MLX5_ST_SZ_DW(ptys_reg)] = {0};
|
||||
u32 rx_pause = 0;
|
||||
u32 tx_pause = 0;
|
||||
u32 eth_proto_cap;
|
||||
u32 eth_proto_admin;
|
||||
u32 eth_proto_lp;
|
||||
@ -871,11 +872,13 @@ static int mlx5e_get_link_ksettings(struct net_device *netdev,
|
||||
an_disable_admin = MLX5_GET(ptys_reg, out, an_disable_admin);
|
||||
an_status = MLX5_GET(ptys_reg, out, an_status);
|
||||
|
||||
mlx5_query_port_pause(mdev, &rx_pause, &tx_pause);
|
||||
|
||||
ethtool_link_ksettings_zero_link_mode(link_ksettings, supported);
|
||||
ethtool_link_ksettings_zero_link_mode(link_ksettings, advertising);
|
||||
|
||||
get_supported(eth_proto_cap, link_ksettings);
|
||||
get_advertising(eth_proto_admin, 0, 0, link_ksettings);
|
||||
get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings);
|
||||
get_speed_duplex(netdev, eth_proto_oper, link_ksettings);
|
||||
|
||||
eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap;
|
||||
|
@ -800,7 +800,7 @@ void mlx5e_destroy_ttc_table(struct mlx5e_priv *priv)
|
||||
mlx5e_destroy_flow_table(&ttc->ft);
|
||||
}
|
||||
|
||||
int mlx5e_create_ttc_table(struct mlx5e_priv *priv, u32 underlay_qpn)
|
||||
int mlx5e_create_ttc_table(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct mlx5e_ttc_table *ttc = &priv->fs.ttc;
|
||||
struct mlx5_flow_table_attr ft_attr = {};
|
||||
@ -810,7 +810,6 @@ int mlx5e_create_ttc_table(struct mlx5e_priv *priv, u32 underlay_qpn)
|
||||
ft_attr.max_fte = MLX5E_TTC_TABLE_SIZE;
|
||||
ft_attr.level = MLX5E_TTC_FT_LEVEL;
|
||||
ft_attr.prio = MLX5E_NIC_PRIO;
|
||||
ft_attr.underlay_qpn = underlay_qpn;
|
||||
|
||||
ft->t = mlx5_create_flow_table(priv->fs.ns, &ft_attr);
|
||||
if (IS_ERR(ft->t)) {
|
||||
@ -1147,7 +1146,7 @@ int mlx5e_create_flow_steering(struct mlx5e_priv *priv)
|
||||
priv->netdev->hw_features &= ~NETIF_F_NTUPLE;
|
||||
}
|
||||
|
||||
err = mlx5e_create_ttc_table(priv, 0);
|
||||
err = mlx5e_create_ttc_table(priv);
|
||||
if (err) {
|
||||
netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
|
||||
err);
|
||||
|
@ -2976,7 +2976,7 @@ static int mlx5e_setup_tc(struct net_device *netdev, u8 tc)
|
||||
new_channels.params = priv->channels.params;
|
||||
new_channels.params.num_tc = tc ? tc : 1;
|
||||
|
||||
if (test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
|
||||
priv->channels.params = new_channels.params;
|
||||
goto out;
|
||||
}
|
||||
|
@ -40,28 +40,25 @@
|
||||
#include "eswitch.h"
|
||||
|
||||
int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
|
||||
struct mlx5_flow_table *ft)
|
||||
struct mlx5_flow_table *ft, u32 underlay_qpn)
|
||||
{
|
||||
u32 in[MLX5_ST_SZ_DW(set_flow_table_root_in)] = {0};
|
||||
u32 out[MLX5_ST_SZ_DW(set_flow_table_root_out)] = {0};
|
||||
|
||||
if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_IB) &&
|
||||
ft->underlay_qpn == 0)
|
||||
underlay_qpn == 0)
|
||||
return 0;
|
||||
|
||||
MLX5_SET(set_flow_table_root_in, in, opcode,
|
||||
MLX5_CMD_OP_SET_FLOW_TABLE_ROOT);
|
||||
MLX5_SET(set_flow_table_root_in, in, table_type, ft->type);
|
||||
MLX5_SET(set_flow_table_root_in, in, table_id, ft->id);
|
||||
MLX5_SET(set_flow_table_root_in, in, underlay_qpn, underlay_qpn);
|
||||
if (ft->vport) {
|
||||
MLX5_SET(set_flow_table_root_in, in, vport_number, ft->vport);
|
||||
MLX5_SET(set_flow_table_root_in, in, other_vport, 1);
|
||||
}
|
||||
|
||||
if ((MLX5_CAP_GEN(dev, port_type) == MLX5_CAP_PORT_TYPE_IB) &&
|
||||
ft->underlay_qpn != 0)
|
||||
MLX5_SET(set_flow_table_root_in, in, underlay_qpn, ft->underlay_qpn);
|
||||
|
||||
return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
|
||||
}
|
||||
|
||||
|
@ -71,7 +71,8 @@ int mlx5_cmd_delete_fte(struct mlx5_core_dev *dev,
|
||||
unsigned int index);
|
||||
|
||||
int mlx5_cmd_update_root_ft(struct mlx5_core_dev *dev,
|
||||
struct mlx5_flow_table *ft);
|
||||
struct mlx5_flow_table *ft,
|
||||
u32 underlay_qpn);
|
||||
|
||||
int mlx5_cmd_fc_alloc(struct mlx5_core_dev *dev, u16 *id);
|
||||
int mlx5_cmd_fc_free(struct mlx5_core_dev *dev, u16 id);
|
||||
|
@ -650,7 +650,7 @@ static int update_root_ft_create(struct mlx5_flow_table *ft, struct fs_prio
|
||||
if (ft->level >= min_level)
|
||||
return 0;
|
||||
|
||||
err = mlx5_cmd_update_root_ft(root->dev, ft);
|
||||
err = mlx5_cmd_update_root_ft(root->dev, ft, root->underlay_qpn);
|
||||
if (err)
|
||||
mlx5_core_warn(root->dev, "Update root flow table of id=%u failed\n",
|
||||
ft->id);
|
||||
@ -818,8 +818,6 @@ static struct mlx5_flow_table *__mlx5_create_flow_table(struct mlx5_flow_namespa
|
||||
goto unlock_root;
|
||||
}
|
||||
|
||||
ft->underlay_qpn = ft_attr->underlay_qpn;
|
||||
|
||||
tree_init_node(&ft->node, 1, del_flow_table);
|
||||
log_table_sz = ft->max_fte ? ilog2(ft->max_fte) : 0;
|
||||
next_ft = find_next_chained_ft(fs_prio);
|
||||
@ -1489,7 +1487,8 @@ static int update_root_ft_destroy(struct mlx5_flow_table *ft)
|
||||
|
||||
new_root_ft = find_next_ft(ft);
|
||||
if (new_root_ft) {
|
||||
int err = mlx5_cmd_update_root_ft(root->dev, new_root_ft);
|
||||
int err = mlx5_cmd_update_root_ft(root->dev, new_root_ft,
|
||||
root->underlay_qpn);
|
||||
|
||||
if (err) {
|
||||
mlx5_core_warn(root->dev, "Update root flow table of id=%u failed\n",
|
||||
@ -2062,3 +2061,21 @@ err:
|
||||
mlx5_cleanup_fs(dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn)
|
||||
{
|
||||
struct mlx5_flow_root_namespace *root = dev->priv.steering->root_ns;
|
||||
|
||||
root->underlay_qpn = underlay_qpn;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_fs_add_rx_underlay_qpn);
|
||||
|
||||
int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn)
|
||||
{
|
||||
struct mlx5_flow_root_namespace *root = dev->priv.steering->root_ns;
|
||||
|
||||
root->underlay_qpn = 0;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_fs_remove_rx_underlay_qpn);
|
||||
|
@ -118,7 +118,6 @@ struct mlx5_flow_table {
|
||||
/* FWD rules that point on this flow table */
|
||||
struct list_head fwd_rules;
|
||||
u32 flags;
|
||||
u32 underlay_qpn;
|
||||
};
|
||||
|
||||
struct mlx5_fc_cache {
|
||||
@ -195,6 +194,7 @@ struct mlx5_flow_root_namespace {
|
||||
struct mlx5_flow_table *root_ft;
|
||||
/* Should be held when chaining flow tables */
|
||||
struct mutex chain_lock;
|
||||
u32 underlay_qpn;
|
||||
};
|
||||
|
||||
int mlx5_init_fc_stats(struct mlx5_core_dev *dev);
|
||||
|
@ -66,6 +66,10 @@ static void mlx5i_init(struct mlx5_core_dev *mdev,
|
||||
|
||||
mlx5e_build_nic_params(mdev, &priv->channels.params, profile->max_nch(mdev));
|
||||
|
||||
/* Override RQ params as IPoIB supports only LINKED LIST RQ for now */
|
||||
mlx5e_set_rq_type_params(mdev, &priv->channels.params, MLX5_WQ_TYPE_LINKED_LIST);
|
||||
priv->channels.params.lro_en = false;
|
||||
|
||||
mutex_init(&priv->state_lock);
|
||||
|
||||
netdev->hw_features |= NETIF_F_SG;
|
||||
@ -156,6 +160,8 @@ out:
|
||||
|
||||
static void mlx5i_destroy_underlay_qp(struct mlx5_core_dev *mdev, struct mlx5_core_qp *qp)
|
||||
{
|
||||
mlx5_fs_remove_rx_underlay_qpn(mdev, qp->qpn);
|
||||
|
||||
mlx5_core_destroy_qp(mdev, qp);
|
||||
}
|
||||
|
||||
@ -170,6 +176,8 @@ static int mlx5i_init_tx(struct mlx5e_priv *priv)
|
||||
return err;
|
||||
}
|
||||
|
||||
mlx5_fs_add_rx_underlay_qpn(priv->mdev, ipriv->qp.qpn);
|
||||
|
||||
err = mlx5e_create_tis(priv->mdev, 0 /* tc */, ipriv->qp.qpn, &priv->tisn[0]);
|
||||
if (err) {
|
||||
mlx5_core_warn(priv->mdev, "create tis failed, %d\n", err);
|
||||
@ -189,7 +197,6 @@ static void mlx5i_cleanup_tx(struct mlx5e_priv *priv)
|
||||
|
||||
static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
|
||||
{
|
||||
struct mlx5i_priv *ipriv = priv->ppriv;
|
||||
int err;
|
||||
|
||||
priv->fs.ns = mlx5_get_flow_namespace(priv->mdev,
|
||||
@ -205,7 +212,7 @@ static int mlx5i_create_flow_steering(struct mlx5e_priv *priv)
|
||||
priv->netdev->hw_features &= ~NETIF_F_NTUPLE;
|
||||
}
|
||||
|
||||
err = mlx5e_create_ttc_table(priv, ipriv->qp.qpn);
|
||||
err = mlx5e_create_ttc_table(priv);
|
||||
if (err) {
|
||||
netdev_err(priv->netdev, "Failed to create ttc table, err=%d\n",
|
||||
err);
|
||||
|
@ -109,7 +109,6 @@ struct mlx5_flow_table_attr {
|
||||
int max_fte;
|
||||
u32 level;
|
||||
u32 flags;
|
||||
u32 underlay_qpn;
|
||||
};
|
||||
|
||||
struct mlx5_flow_table *
|
||||
@ -167,4 +166,7 @@ struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging);
|
||||
void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter);
|
||||
void mlx5_fc_query_cached(struct mlx5_fc *counter,
|
||||
u64 *bytes, u64 *packets, u64 *lastuse);
|
||||
int mlx5_fs_add_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
|
||||
int mlx5_fs_remove_rx_underlay_qpn(struct mlx5_core_dev *dev, u32 underlay_qpn);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user