net/mlx5e: Remove redundant active_channels indication
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_rep.c
index 876c3e4c61932c59d4617b6355eebbc2b0c65ed3..1fb4835eac72424a24163a3395e25ef7bc8a02c3 100644 (file)
@@ -66,18 +66,36 @@ static const struct counter_desc sw_rep_stats_desc[] = {
        { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_bytes) },
 };
 
-#define NUM_VPORT_REP_COUNTERS ARRAY_SIZE(sw_rep_stats_desc)
+struct vport_stats {
+       u64 vport_rx_packets;
+       u64 vport_tx_packets;
+       u64 vport_rx_bytes;
+       u64 vport_tx_bytes;
+};
+
+static const struct counter_desc vport_rep_stats_desc[] = {
+       { MLX5E_DECLARE_STAT(struct vport_stats, vport_rx_packets) },
+       { MLX5E_DECLARE_STAT(struct vport_stats, vport_rx_bytes) },
+       { MLX5E_DECLARE_STAT(struct vport_stats, vport_tx_packets) },
+       { MLX5E_DECLARE_STAT(struct vport_stats, vport_tx_bytes) },
+};
+
+#define NUM_VPORT_REP_SW_COUNTERS ARRAY_SIZE(sw_rep_stats_desc)
+#define NUM_VPORT_REP_HW_COUNTERS ARRAY_SIZE(vport_rep_stats_desc)
 
 static void mlx5e_rep_get_strings(struct net_device *dev,
                                  u32 stringset, uint8_t *data)
 {
-       int i;
+       int i, j;
 
        switch (stringset) {
        case ETH_SS_STATS:
-               for (i = 0; i < NUM_VPORT_REP_COUNTERS; i++)
+               for (i = 0; i < NUM_VPORT_REP_SW_COUNTERS; i++)
                        strcpy(data + (i * ETH_GSTRING_LEN),
                               sw_rep_stats_desc[i].format);
+               for (j = 0; j < NUM_VPORT_REP_HW_COUNTERS; j++, i++)
+                       strcpy(data + (i * ETH_GSTRING_LEN),
+                              vport_rep_stats_desc[j].format);
                break;
        }
 }
@@ -116,13 +134,13 @@ static void mlx5e_rep_update_sw_counters(struct mlx5e_priv *priv)
        for (i = 0; i < priv->channels.num; i++) {
                struct mlx5e_channel *c = priv->channels.c[i];
 
-               rq_stats = &c->rq.stats;
+               rq_stats = c->rq.stats;
 
                s->rx_packets   += rq_stats->packets;
                s->rx_bytes     += rq_stats->bytes;
 
                for (j = 0; j < priv->channels.params.num_tc; j++) {
-                       sq_stats = &c->sq[j].stats;
+                       sq_stats = c->sq[j].stats;
 
                        s->tx_packets           += sq_stats->packets;
                        s->tx_bytes             += sq_stats->bytes;
@@ -130,17 +148,11 @@ static void mlx5e_rep_update_sw_counters(struct mlx5e_priv *priv)
        }
 }
 
-static void mlx5e_rep_update_stats(struct mlx5e_priv *priv)
-{
-       mlx5e_rep_update_sw_counters(priv);
-       mlx5e_rep_update_hw_counters(priv);
-}
-
 static void mlx5e_rep_get_ethtool_stats(struct net_device *dev,
                                        struct ethtool_stats *stats, u64 *data)
 {
        struct mlx5e_priv *priv = netdev_priv(dev);
-       int i;
+       int i, j;
 
        if (!data)
                return;
@@ -148,18 +160,23 @@ static void mlx5e_rep_get_ethtool_stats(struct net_device *dev,
        mutex_lock(&priv->state_lock);
        if (test_bit(MLX5E_STATE_OPENED, &priv->state))
                mlx5e_rep_update_sw_counters(priv);
+       mlx5e_rep_update_hw_counters(priv);
        mutex_unlock(&priv->state_lock);
 
-       for (i = 0; i < NUM_VPORT_REP_COUNTERS; i++)
+       for (i = 0; i < NUM_VPORT_REP_SW_COUNTERS; i++)
                data[i] = MLX5E_READ_CTR64_CPU(&priv->stats.sw,
                                               sw_rep_stats_desc, i);
+
+       for (j = 0; j < NUM_VPORT_REP_HW_COUNTERS; j++, i++)
+               data[i] = MLX5E_READ_CTR64_CPU(&priv->stats.vf_vport,
+                                              vport_rep_stats_desc, j);
 }
 
 static int mlx5e_rep_get_sset_count(struct net_device *dev, int sset)
 {
        switch (sset) {
        case ETH_SS_STATS:
-               return NUM_VPORT_REP_COUNTERS;
+               return NUM_VPORT_REP_SW_COUNTERS + NUM_VPORT_REP_HW_COUNTERS;
        default:
                return -EOPNOTSUPP;
        }
@@ -681,8 +698,8 @@ static int mlx5e_rep_open(struct net_device *dev)
                goto unlock;
 
        if (!mlx5_modify_vport_admin_state(priv->mdev,
-                       MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT,
-                       rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_UP))
+                                          MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT,
+                                          rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_UP))
                netif_carrier_on(dev);
 
 unlock:
@@ -699,8 +716,8 @@ static int mlx5e_rep_close(struct net_device *dev)
 
        mutex_lock(&priv->state_lock);
        mlx5_modify_vport_admin_state(priv->mdev,
-                       MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT,
-                       rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_DOWN);
+                                     MLX5_QUERY_VPORT_STATE_IN_OP_MOD_ESW_VPORT,
+                                     rep->vport, MLX5_ESW_VPORT_ADMIN_STATE_DOWN);
        ret = mlx5e_close_locked(dev);
        mutex_unlock(&priv->state_lock);
        return ret;
@@ -723,15 +740,31 @@ static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
 
 static int
 mlx5e_rep_setup_tc_cls_flower(struct mlx5e_priv *priv,
-                             struct tc_cls_flower_offload *cls_flower)
+                             struct tc_cls_flower_offload *cls_flower, int flags)
 {
        switch (cls_flower->command) {
        case TC_CLSFLOWER_REPLACE:
-               return mlx5e_configure_flower(priv, cls_flower);
+               return mlx5e_configure_flower(priv, cls_flower, flags);
        case TC_CLSFLOWER_DESTROY:
-               return mlx5e_delete_flower(priv, cls_flower);
+               return mlx5e_delete_flower(priv, cls_flower, flags);
        case TC_CLSFLOWER_STATS:
-               return mlx5e_stats_flower(priv, cls_flower);
+               return mlx5e_stats_flower(priv, cls_flower, flags);
+       default:
+               return -EOPNOTSUPP;
+       }
+}
+
+static int mlx5e_rep_setup_tc_cb_egdev(enum tc_setup_type type, void *type_data,
+                                      void *cb_priv)
+{
+       struct mlx5e_priv *priv = cb_priv;
+
+       if (!tc_cls_can_offload_and_chain0(priv->netdev, type_data))
+               return -EOPNOTSUPP;
+
+       switch (type) {
+       case TC_SETUP_CLSFLOWER:
+               return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_EGRESS);
        default:
                return -EOPNOTSUPP;
        }
@@ -747,7 +780,7 @@ static int mlx5e_rep_setup_tc_cb(enum tc_setup_type type, void *type_data,
 
        switch (type) {
        case TC_SETUP_CLSFLOWER:
-               return mlx5e_rep_setup_tc_cls_flower(priv, type_data);
+               return mlx5e_rep_setup_tc_cls_flower(priv, type_data, MLX5E_TC_INGRESS);
        default:
                return -EOPNOTSUPP;
        }
@@ -832,6 +865,8 @@ mlx5e_get_sw_stats64(const struct net_device *dev,
        struct mlx5e_priv *priv = netdev_priv(dev);
        struct mlx5e_sw_stats *sstats = &priv->stats.sw;
 
+       mlx5e_rep_update_sw_counters(priv);
+
        stats->rx_packets = sstats->rx_packets;
        stats->rx_bytes   = sstats->rx_bytes;
        stats->tx_packets = sstats->tx_packets;
@@ -965,14 +1000,8 @@ static int mlx5e_init_rep_rx(struct mlx5e_priv *priv)
        }
        rpriv->vport_rx_rule = flow_rule;
 
-       err = mlx5e_tc_init(priv);
-       if (err)
-               goto err_del_flow_rule;
-
        return 0;
 
-err_del_flow_rule:
-       mlx5_del_flow_rules(rpriv->vport_rx_rule);
 err_destroy_direct_tirs:
        mlx5e_destroy_direct_tirs(priv);
 err_destroy_direct_rqts:
@@ -984,7 +1013,6 @@ static void mlx5e_cleanup_rep_rx(struct mlx5e_priv *priv)
 {
        struct mlx5e_rep_priv *rpriv = priv->ppriv;
 
-       mlx5e_tc_cleanup(priv);
        mlx5_del_flow_rules(rpriv->vport_rx_rule);
        mlx5e_destroy_direct_tirs(priv);
        mlx5e_destroy_direct_rqts(priv);
@@ -1014,7 +1042,7 @@ static const struct mlx5e_profile mlx5e_rep_profile = {
        .cleanup_rx             = mlx5e_cleanup_rep_rx,
        .init_tx                = mlx5e_init_rep_tx,
        .cleanup_tx             = mlx5e_cleanup_nic_tx,
-       .update_stats           = mlx5e_rep_update_stats,
+       .update_stats           = mlx5e_rep_update_hw_counters,
        .max_nch                = mlx5e_get_rep_max_num_channels,
        .update_carrier         = NULL,
        .rx_handlers.handle_rx_cqe       = mlx5e_handle_rx_cqe_rep,
@@ -1042,8 +1070,15 @@ mlx5e_nic_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
        if (err)
                goto err_remove_sqs;
 
+       /* init shared tc flow table */
+       err = mlx5e_tc_esw_init(&rpriv->tc_ht);
+       if (err)
+               goto  err_neigh_cleanup;
+
        return 0;
 
+err_neigh_cleanup:
+       mlx5e_rep_neigh_cleanup(rpriv);
 err_remove_sqs:
        mlx5e_remove_sqs_fwd_rules(priv);
        return err;
@@ -1058,9 +1093,8 @@ mlx5e_nic_rep_unload(struct mlx5_eswitch_rep *rep)
        if (test_bit(MLX5E_STATE_OPENED, &priv->state))
                mlx5e_remove_sqs_fwd_rules(priv);
 
-       /* clean (and re-init) existing uplink offloaded TC rules */
-       mlx5e_tc_cleanup(priv);
-       mlx5e_tc_init(priv);
+       /* clean uplink offloaded TC rules, delete shared tc flow table */
+       mlx5e_tc_esw_cleanup(&rpriv->tc_ht);
 
        mlx5e_rep_neigh_cleanup(rpriv);
 }
@@ -1107,7 +1141,7 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
 
        uplink_rpriv = mlx5_eswitch_get_uplink_priv(dev->priv.eswitch, REP_ETH);
        upriv = netdev_priv(uplink_rpriv->netdev);
-       err = tc_setup_cb_egdev_register(netdev, mlx5e_setup_tc_block_cb,
+       err = tc_setup_cb_egdev_register(netdev, mlx5e_rep_setup_tc_cb_egdev,
                                         upriv);
        if (err)
                goto err_neigh_cleanup;
@@ -1122,7 +1156,7 @@ mlx5e_vport_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
        return 0;
 
 err_egdev_cleanup:
-       tc_setup_cb_egdev_unregister(netdev, mlx5e_setup_tc_block_cb,
+       tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
                                     upriv);
 
 err_neigh_cleanup:
@@ -1151,7 +1185,7 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
        uplink_rpriv = mlx5_eswitch_get_uplink_priv(priv->mdev->priv.eswitch,
                                                    REP_ETH);
        upriv = netdev_priv(uplink_rpriv->netdev);
-       tc_setup_cb_egdev_unregister(netdev, mlx5e_setup_tc_block_cb,
+       tc_setup_cb_egdev_unregister(netdev, mlx5e_rep_setup_tc_cb_egdev,
                                     upriv);
        mlx5e_rep_neigh_cleanup(rpriv);
        mlx5e_detach_netdev(priv);