18fd92a66SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause 2e60fbd5bSAdrien Mazarguil * Copyright 2015 6WIND S.A. 3e60fbd5bSAdrien Mazarguil * Copyright 2015 Mellanox. 4e60fbd5bSAdrien Mazarguil */ 58fd92a66SOlivier Matz 63f2fe392SNélio Laranjeiro #include <unistd.h> 7e60fbd5bSAdrien Mazarguil 8e60fbd5bSAdrien Mazarguil #include <rte_ether.h> 9ffc905f3SFerruh Yigit #include <rte_ethdev_driver.h> 10198a3c33SNelio Laranjeiro #include <rte_interrupts.h> 11198a3c33SNelio Laranjeiro #include <rte_alarm.h> 12e60fbd5bSAdrien Mazarguil 13e60fbd5bSAdrien Mazarguil #include "mlx5.h" 14e60fbd5bSAdrien Mazarguil #include "mlx5_rxtx.h" 15e60fbd5bSAdrien Mazarguil #include "mlx5_utils.h" 16e60fbd5bSAdrien Mazarguil 17*fb732b0aSNélio Laranjeiro /** 18*fb732b0aSNélio Laranjeiro * Stop traffic on Tx queues. 19*fb732b0aSNélio Laranjeiro * 20*fb732b0aSNélio Laranjeiro * @param dev 21*fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 22*fb732b0aSNélio Laranjeiro */ 236e78005aSNélio Laranjeiro static void 246e78005aSNélio Laranjeiro priv_txq_stop(struct priv *priv) 256e78005aSNélio Laranjeiro { 266e78005aSNélio Laranjeiro unsigned int i; 276e78005aSNélio Laranjeiro 286e78005aSNélio Laranjeiro for (i = 0; i != priv->txqs_n; ++i) 296e78005aSNélio Laranjeiro mlx5_priv_txq_release(priv, i); 306e78005aSNélio Laranjeiro } 316e78005aSNélio Laranjeiro 32*fb732b0aSNélio Laranjeiro /** 33*fb732b0aSNélio Laranjeiro * Start traffic on Tx queues. 34*fb732b0aSNélio Laranjeiro * 35*fb732b0aSNélio Laranjeiro * @param dev 36*fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 37*fb732b0aSNélio Laranjeiro * 38*fb732b0aSNélio Laranjeiro * @return 39*fb732b0aSNélio Laranjeiro * 0 on success, errno on error. 40*fb732b0aSNélio Laranjeiro */ 416e78005aSNélio Laranjeiro static int 426e78005aSNélio Laranjeiro priv_txq_start(struct priv *priv) 436e78005aSNélio Laranjeiro { 446e78005aSNélio Laranjeiro unsigned int i; 456e78005aSNélio Laranjeiro int ret = 0; 466e78005aSNélio Laranjeiro 476e78005aSNélio Laranjeiro /* Add memory regions to Tx queues. */ 486e78005aSNélio Laranjeiro for (i = 0; i != priv->txqs_n; ++i) { 496e78005aSNélio Laranjeiro unsigned int idx = 0; 506e78005aSNélio Laranjeiro struct mlx5_mr *mr; 516e78005aSNélio Laranjeiro struct mlx5_txq_ctrl *txq_ctrl = mlx5_priv_txq_get(priv, i); 526e78005aSNélio Laranjeiro 536e78005aSNélio Laranjeiro if (!txq_ctrl) 546e78005aSNélio Laranjeiro continue; 55de48f165SYongseok Koh LIST_FOREACH(mr, &priv->mr, next) { 566e78005aSNélio Laranjeiro priv_txq_mp2mr_reg(priv, &txq_ctrl->txq, mr->mp, idx++); 57de48f165SYongseok Koh if (idx == MLX5_PMD_TX_MP_CACHE) 58de48f165SYongseok Koh break; 59de48f165SYongseok Koh } 606e78005aSNélio Laranjeiro txq_alloc_elts(txq_ctrl); 616e78005aSNélio Laranjeiro txq_ctrl->ibv = mlx5_priv_txq_ibv_new(priv, i); 626e78005aSNélio Laranjeiro if (!txq_ctrl->ibv) { 636e78005aSNélio Laranjeiro ret = ENOMEM; 646e78005aSNélio Laranjeiro goto error; 656e78005aSNélio Laranjeiro } 666e78005aSNélio Laranjeiro } 674a984153SXueming Li ret = priv_tx_uar_remap(priv, priv->ctx->cmd_fd); 684a984153SXueming Li if (ret) 694a984153SXueming Li goto error; 704a984153SXueming Li return ret; 716e78005aSNélio Laranjeiro error: 726e78005aSNélio Laranjeiro priv_txq_stop(priv); 734a984153SXueming Li return ret; 746e78005aSNélio Laranjeiro } 756e78005aSNélio Laranjeiro 76*fb732b0aSNélio Laranjeiro /** 77*fb732b0aSNélio Laranjeiro * Stop traffic on Rx queues. 78*fb732b0aSNélio Laranjeiro * 79*fb732b0aSNélio Laranjeiro * @param dev 80*fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 81*fb732b0aSNélio Laranjeiro */ 82a1366b1aSNélio Laranjeiro static void 83a1366b1aSNélio Laranjeiro priv_rxq_stop(struct priv *priv) 84a1366b1aSNélio Laranjeiro { 85a1366b1aSNélio Laranjeiro unsigned int i; 86a1366b1aSNélio Laranjeiro 87a1366b1aSNélio Laranjeiro for (i = 0; i != priv->rxqs_n; ++i) 88a1366b1aSNélio Laranjeiro mlx5_priv_rxq_release(priv, i); 89a1366b1aSNélio Laranjeiro } 90a1366b1aSNélio Laranjeiro 91*fb732b0aSNélio Laranjeiro /** 92*fb732b0aSNélio Laranjeiro * Start traffic on Rx queues. 93*fb732b0aSNélio Laranjeiro * 94*fb732b0aSNélio Laranjeiro * @param dev 95*fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 96*fb732b0aSNélio Laranjeiro * 97*fb732b0aSNélio Laranjeiro * @return 98*fb732b0aSNélio Laranjeiro * 0 on success, errno on error. 99*fb732b0aSNélio Laranjeiro */ 100a1366b1aSNélio Laranjeiro static int 101a1366b1aSNélio Laranjeiro priv_rxq_start(struct priv *priv) 102a1366b1aSNélio Laranjeiro { 103a1366b1aSNélio Laranjeiro unsigned int i; 104a1366b1aSNélio Laranjeiro int ret = 0; 105a1366b1aSNélio Laranjeiro 106a1366b1aSNélio Laranjeiro for (i = 0; i != priv->rxqs_n; ++i) { 107a1366b1aSNélio Laranjeiro struct mlx5_rxq_ctrl *rxq_ctrl = mlx5_priv_rxq_get(priv, i); 108a1366b1aSNélio Laranjeiro 109a1366b1aSNélio Laranjeiro if (!rxq_ctrl) 110a1366b1aSNélio Laranjeiro continue; 111a1366b1aSNélio Laranjeiro ret = rxq_alloc_elts(rxq_ctrl); 112a1366b1aSNélio Laranjeiro if (ret) 113a1366b1aSNélio Laranjeiro goto error; 114a1366b1aSNélio Laranjeiro rxq_ctrl->ibv = mlx5_priv_rxq_ibv_new(priv, i); 115a1366b1aSNélio Laranjeiro if (!rxq_ctrl->ibv) { 116a1366b1aSNélio Laranjeiro ret = ENOMEM; 117a1366b1aSNélio Laranjeiro goto error; 118a1366b1aSNélio Laranjeiro } 119a1366b1aSNélio Laranjeiro } 120a1366b1aSNélio Laranjeiro return -ret; 121a1366b1aSNélio Laranjeiro error: 122a1366b1aSNélio Laranjeiro priv_rxq_stop(priv); 123a1366b1aSNélio Laranjeiro return -ret; 124a1366b1aSNélio Laranjeiro } 125a1366b1aSNélio Laranjeiro 126e60fbd5bSAdrien Mazarguil /** 127e60fbd5bSAdrien Mazarguil * DPDK callback to start the device. 128e60fbd5bSAdrien Mazarguil * 129e60fbd5bSAdrien Mazarguil * Simulate device start by attaching all configured flows. 130e60fbd5bSAdrien Mazarguil * 131e60fbd5bSAdrien Mazarguil * @param dev 132e60fbd5bSAdrien Mazarguil * Pointer to Ethernet device structure. 133e60fbd5bSAdrien Mazarguil * 134e60fbd5bSAdrien Mazarguil * @return 135e60fbd5bSAdrien Mazarguil * 0 on success, negative errno value on failure. 136e60fbd5bSAdrien Mazarguil */ 137e60fbd5bSAdrien Mazarguil int 138e60fbd5bSAdrien Mazarguil mlx5_dev_start(struct rte_eth_dev *dev) 139e60fbd5bSAdrien Mazarguil { 140e60fbd5bSAdrien Mazarguil struct priv *priv = dev->data->dev_private; 1416e78005aSNélio Laranjeiro struct mlx5_mr *mr = NULL; 142ecc1c29dSAdrien Mazarguil int err; 143e60fbd5bSAdrien Mazarguil 144272733b5SNélio Laranjeiro dev->data->dev_started = 1; 145e60fbd5bSAdrien Mazarguil priv_lock(priv); 146272733b5SNélio Laranjeiro err = priv_flow_create_drop_queue(priv); 147272733b5SNélio Laranjeiro if (err) { 148272733b5SNélio Laranjeiro ERROR("%p: Drop queue allocation failed: %s", 149272733b5SNélio Laranjeiro (void *)dev, strerror(err)); 150272733b5SNélio Laranjeiro goto error; 151272733b5SNélio Laranjeiro } 152ecc1c29dSAdrien Mazarguil DEBUG("%p: allocating and configuring hash RX queues", (void *)dev); 1536e78005aSNélio Laranjeiro rte_mempool_walk(mlx5_mp2mr_iter, priv); 1546e78005aSNélio Laranjeiro err = priv_txq_start(priv); 1556e78005aSNélio Laranjeiro if (err) { 1566e78005aSNélio Laranjeiro ERROR("%p: TXQ allocation failed: %s", 1576e78005aSNélio Laranjeiro (void *)dev, strerror(err)); 1586e78005aSNélio Laranjeiro goto error; 1596e78005aSNélio Laranjeiro } 160a1366b1aSNélio Laranjeiro err = priv_rxq_start(priv); 161a1366b1aSNélio Laranjeiro if (err) { 162a1366b1aSNélio Laranjeiro ERROR("%p: RXQ allocation failed: %s", 163a1366b1aSNélio Laranjeiro (void *)dev, strerror(err)); 164a1366b1aSNélio Laranjeiro goto error; 165a1366b1aSNélio Laranjeiro } 166e1016cb7SAdrien Mazarguil err = priv_rx_intr_vec_enable(priv); 167e1016cb7SAdrien Mazarguil if (err) { 168e1016cb7SAdrien Mazarguil ERROR("%p: RX interrupt vector creation failed", 169e1016cb7SAdrien Mazarguil (void *)priv); 170e1016cb7SAdrien Mazarguil goto error; 1713c7d44afSShahaf Shuler } 172c8d4ee50SNélio Laranjeiro priv_xstats_init(priv); 173c7bf6225SYongseok Koh /* Update link status and Tx/Rx callbacks for the first time. */ 174c7bf6225SYongseok Koh memset(&dev->data->dev_link, 0, sizeof(struct rte_eth_link)); 175e313ef4cSShahaf Shuler INFO("Forcing port %u link to be up", dev->data->port_id); 176e313ef4cSShahaf Shuler err = priv_force_link_status_change(priv, ETH_LINK_UP); 177e313ef4cSShahaf Shuler if (err) { 178e313ef4cSShahaf Shuler DEBUG("Failed to set port %u link to be up", 179e313ef4cSShahaf Shuler dev->data->port_id); 180e313ef4cSShahaf Shuler goto error; 181e313ef4cSShahaf Shuler } 182c7bf6225SYongseok Koh priv_dev_interrupt_handler_install(priv, dev); 183c8d4ee50SNélio Laranjeiro priv_unlock(priv); 184c8d4ee50SNélio Laranjeiro return 0; 185c8d4ee50SNélio Laranjeiro error: 186e60fbd5bSAdrien Mazarguil /* Rollback. */ 187272733b5SNélio Laranjeiro dev->data->dev_started = 0; 1885f64e6bfSNélio Laranjeiro for (mr = LIST_FIRST(&priv->mr); mr; mr = LIST_FIRST(&priv->mr)) 1896e78005aSNélio Laranjeiro priv_mr_release(priv, mr); 1901b37f5d8SNélio Laranjeiro priv_flow_stop(priv, &priv->flows); 19129957ec4SNélio Laranjeiro priv_dev_traffic_disable(priv, dev); 1926e78005aSNélio Laranjeiro priv_txq_stop(priv); 193272733b5SNélio Laranjeiro priv_rxq_stop(priv); 194272733b5SNélio Laranjeiro priv_flow_delete_drop_queue(priv); 1955e0fbcf9SYongseok Koh priv_unlock(priv); 19680554894SOlivier Matz return err; 197e60fbd5bSAdrien Mazarguil } 198e60fbd5bSAdrien Mazarguil 199e60fbd5bSAdrien Mazarguil /** 200e60fbd5bSAdrien Mazarguil * DPDK callback to stop the device. 201e60fbd5bSAdrien Mazarguil * 202e60fbd5bSAdrien Mazarguil * Simulate device stop by detaching all configured flows. 203e60fbd5bSAdrien Mazarguil * 204e60fbd5bSAdrien Mazarguil * @param dev 205e60fbd5bSAdrien Mazarguil * Pointer to Ethernet device structure. 206e60fbd5bSAdrien Mazarguil */ 207e60fbd5bSAdrien Mazarguil void 208e60fbd5bSAdrien Mazarguil mlx5_dev_stop(struct rte_eth_dev *dev) 209e60fbd5bSAdrien Mazarguil { 210e60fbd5bSAdrien Mazarguil struct priv *priv = dev->data->dev_private; 2116e78005aSNélio Laranjeiro struct mlx5_mr *mr; 212e60fbd5bSAdrien Mazarguil 213e60fbd5bSAdrien Mazarguil priv_lock(priv); 2143f2fe392SNélio Laranjeiro dev->data->dev_started = 0; 2153f2fe392SNélio Laranjeiro /* Prevent crashes when queues are still in use. */ 2163f2fe392SNélio Laranjeiro dev->rx_pkt_burst = removed_rx_burst; 2173f2fe392SNélio Laranjeiro dev->tx_pkt_burst = removed_tx_burst; 2183f2fe392SNélio Laranjeiro rte_wmb(); 2193f2fe392SNélio Laranjeiro usleep(1000 * priv->rxqs_n); 220ecc1c29dSAdrien Mazarguil DEBUG("%p: cleaning up and destroying hash RX queues", (void *)dev); 2211b37f5d8SNélio Laranjeiro priv_flow_stop(priv, &priv->flows); 22229957ec4SNélio Laranjeiro priv_dev_traffic_disable(priv, dev); 223e1016cb7SAdrien Mazarguil priv_rx_intr_vec_disable(priv); 2241b37f5d8SNélio Laranjeiro priv_dev_interrupt_handler_uninstall(priv, dev); 2256e78005aSNélio Laranjeiro priv_txq_stop(priv); 226a1366b1aSNélio Laranjeiro priv_rxq_stop(priv); 2275f64e6bfSNélio Laranjeiro for (mr = LIST_FIRST(&priv->mr); mr; mr = LIST_FIRST(&priv->mr)) 2286e78005aSNélio Laranjeiro priv_mr_release(priv, mr); 229272733b5SNélio Laranjeiro priv_flow_delete_drop_queue(priv); 230e60fbd5bSAdrien Mazarguil priv_unlock(priv); 231e60fbd5bSAdrien Mazarguil } 232272733b5SNélio Laranjeiro 233272733b5SNélio Laranjeiro /** 234272733b5SNélio Laranjeiro * Enable traffic flows configured by control plane 235272733b5SNélio Laranjeiro * 236272733b5SNélio Laranjeiro * @param priv 237272733b5SNélio Laranjeiro * Pointer to Ethernet device private data. 238272733b5SNélio Laranjeiro * @param dev 239272733b5SNélio Laranjeiro * Pointer to Ethernet device structure. 240272733b5SNélio Laranjeiro * 241272733b5SNélio Laranjeiro * @return 242272733b5SNélio Laranjeiro * 0 on success. 243272733b5SNélio Laranjeiro */ 244272733b5SNélio Laranjeiro int 245272733b5SNélio Laranjeiro priv_dev_traffic_enable(struct priv *priv, struct rte_eth_dev *dev) 246272733b5SNélio Laranjeiro { 247272733b5SNélio Laranjeiro struct rte_flow_item_eth bcast = { 248272733b5SNélio Laranjeiro .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff", 249272733b5SNélio Laranjeiro }; 250272733b5SNélio Laranjeiro struct rte_flow_item_eth ipv6_multi_spec = { 251272733b5SNélio Laranjeiro .dst.addr_bytes = "\x33\x33\x00\x00\x00\x00", 252272733b5SNélio Laranjeiro }; 253272733b5SNélio Laranjeiro struct rte_flow_item_eth ipv6_multi_mask = { 254272733b5SNélio Laranjeiro .dst.addr_bytes = "\xff\xff\x00\x00\x00\x00", 255272733b5SNélio Laranjeiro }; 256272733b5SNélio Laranjeiro struct rte_flow_item_eth unicast = { 257272733b5SNélio Laranjeiro .src.addr_bytes = "\x00\x00\x00\x00\x00\x00", 258272733b5SNélio Laranjeiro }; 259272733b5SNélio Laranjeiro struct rte_flow_item_eth unicast_mask = { 260272733b5SNélio Laranjeiro .dst.addr_bytes = "\xff\xff\xff\xff\xff\xff", 261272733b5SNélio Laranjeiro }; 262272733b5SNélio Laranjeiro const unsigned int vlan_filter_n = priv->vlan_filter_n; 263272733b5SNélio Laranjeiro const struct ether_addr cmp = { 264272733b5SNélio Laranjeiro .addr_bytes = "\x00\x00\x00\x00\x00\x00", 265272733b5SNélio Laranjeiro }; 266272733b5SNélio Laranjeiro unsigned int i; 267272733b5SNélio Laranjeiro unsigned int j; 268272733b5SNélio Laranjeiro int ret; 269272733b5SNélio Laranjeiro 270f8cb4b57SNélio Laranjeiro if (priv->isolated) 271f8cb4b57SNélio Laranjeiro return 0; 272f8cb4b57SNélio Laranjeiro if (dev->data->promiscuous) { 273f8cb4b57SNélio Laranjeiro struct rte_flow_item_eth promisc = { 274f8cb4b57SNélio Laranjeiro .dst.addr_bytes = "\x00\x00\x00\x00\x00\x00", 275f8cb4b57SNélio Laranjeiro .src.addr_bytes = "\x00\x00\x00\x00\x00\x00", 276f8cb4b57SNélio Laranjeiro .type = 0, 277f8cb4b57SNélio Laranjeiro }; 278f8cb4b57SNélio Laranjeiro 279f8cb4b57SNélio Laranjeiro claim_zero(mlx5_ctrl_flow(dev, &promisc, &promisc)); 280f8cb4b57SNélio Laranjeiro return 0; 281f8cb4b57SNélio Laranjeiro } 282f8cb4b57SNélio Laranjeiro if (dev->data->all_multicast) { 283f8cb4b57SNélio Laranjeiro struct rte_flow_item_eth multicast = { 284f8cb4b57SNélio Laranjeiro .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00", 285f8cb4b57SNélio Laranjeiro .src.addr_bytes = "\x00\x00\x00\x00\x00\x00", 286f8cb4b57SNélio Laranjeiro .type = 0, 287f8cb4b57SNélio Laranjeiro }; 288f8cb4b57SNélio Laranjeiro 289f8cb4b57SNélio Laranjeiro claim_zero(mlx5_ctrl_flow(dev, &multicast, &multicast)); 290f8cb4b57SNélio Laranjeiro } else { 291f8cb4b57SNélio Laranjeiro /* Add broadcast/multicast flows. */ 292f8cb4b57SNélio Laranjeiro for (i = 0; i != vlan_filter_n; ++i) { 293f8cb4b57SNélio Laranjeiro uint16_t vlan = priv->vlan_filter[i]; 294f8cb4b57SNélio Laranjeiro 295f8cb4b57SNélio Laranjeiro struct rte_flow_item_vlan vlan_spec = { 296f8cb4b57SNélio Laranjeiro .tci = rte_cpu_to_be_16(vlan), 297f8cb4b57SNélio Laranjeiro }; 298f8cb4b57SNélio Laranjeiro struct rte_flow_item_vlan vlan_mask = { 299f8cb4b57SNélio Laranjeiro .tci = 0xffff, 300f8cb4b57SNélio Laranjeiro }; 301f8cb4b57SNélio Laranjeiro 302f8cb4b57SNélio Laranjeiro ret = mlx5_ctrl_flow_vlan(dev, &bcast, &bcast, 303f8cb4b57SNélio Laranjeiro &vlan_spec, &vlan_mask); 304f8cb4b57SNélio Laranjeiro if (ret) 305f8cb4b57SNélio Laranjeiro goto error; 306f8cb4b57SNélio Laranjeiro ret = mlx5_ctrl_flow_vlan(dev, &ipv6_multi_spec, 307f8cb4b57SNélio Laranjeiro &ipv6_multi_mask, 308f8cb4b57SNélio Laranjeiro &vlan_spec, &vlan_mask); 309f8cb4b57SNélio Laranjeiro if (ret) 310f8cb4b57SNélio Laranjeiro goto error; 311f8cb4b57SNélio Laranjeiro } 312f8cb4b57SNélio Laranjeiro if (!vlan_filter_n) { 313f8cb4b57SNélio Laranjeiro ret = mlx5_ctrl_flow(dev, &bcast, &bcast); 314f8cb4b57SNélio Laranjeiro if (ret) 315f8cb4b57SNélio Laranjeiro goto error; 316f8cb4b57SNélio Laranjeiro ret = mlx5_ctrl_flow(dev, &ipv6_multi_spec, 317f8cb4b57SNélio Laranjeiro &ipv6_multi_mask); 318f8cb4b57SNélio Laranjeiro if (ret) 319f8cb4b57SNélio Laranjeiro goto error; 320f8cb4b57SNélio Laranjeiro } 321f8cb4b57SNélio Laranjeiro } 322f8cb4b57SNélio Laranjeiro /* Add MAC address flows. */ 323272733b5SNélio Laranjeiro for (i = 0; i != MLX5_MAX_MAC_ADDRESSES; ++i) { 324272733b5SNélio Laranjeiro struct ether_addr *mac = &dev->data->mac_addrs[i]; 325272733b5SNélio Laranjeiro 326272733b5SNélio Laranjeiro if (!memcmp(mac, &cmp, sizeof(*mac))) 327272733b5SNélio Laranjeiro continue; 328272733b5SNélio Laranjeiro memcpy(&unicast.dst.addr_bytes, 329272733b5SNélio Laranjeiro mac->addr_bytes, 330272733b5SNélio Laranjeiro ETHER_ADDR_LEN); 331272733b5SNélio Laranjeiro for (j = 0; j != vlan_filter_n; ++j) { 332272733b5SNélio Laranjeiro uint16_t vlan = priv->vlan_filter[j]; 333272733b5SNélio Laranjeiro 334272733b5SNélio Laranjeiro struct rte_flow_item_vlan vlan_spec = { 335272733b5SNélio Laranjeiro .tci = rte_cpu_to_be_16(vlan), 336272733b5SNélio Laranjeiro }; 337272733b5SNélio Laranjeiro struct rte_flow_item_vlan vlan_mask = { 338272733b5SNélio Laranjeiro .tci = 0xffff, 339272733b5SNélio Laranjeiro }; 340272733b5SNélio Laranjeiro 341272733b5SNélio Laranjeiro ret = mlx5_ctrl_flow_vlan(dev, &unicast, 342272733b5SNélio Laranjeiro &unicast_mask, 343272733b5SNélio Laranjeiro &vlan_spec, 344272733b5SNélio Laranjeiro &vlan_mask); 345272733b5SNélio Laranjeiro if (ret) 346272733b5SNélio Laranjeiro goto error; 347272733b5SNélio Laranjeiro } 348272733b5SNélio Laranjeiro if (!vlan_filter_n) { 349272733b5SNélio Laranjeiro ret = mlx5_ctrl_flow(dev, &unicast, 350272733b5SNélio Laranjeiro &unicast_mask); 351272733b5SNélio Laranjeiro if (ret) 352272733b5SNélio Laranjeiro goto error; 353272733b5SNélio Laranjeiro } 354272733b5SNélio Laranjeiro } 355272733b5SNélio Laranjeiro return 0; 356272733b5SNélio Laranjeiro error: 357272733b5SNélio Laranjeiro return rte_errno; 358272733b5SNélio Laranjeiro } 359272733b5SNélio Laranjeiro 360272733b5SNélio Laranjeiro 361272733b5SNélio Laranjeiro /** 362272733b5SNélio Laranjeiro * Disable traffic flows configured by control plane 363272733b5SNélio Laranjeiro * 364272733b5SNélio Laranjeiro * @param priv 365272733b5SNélio Laranjeiro * Pointer to Ethernet device private data. 366272733b5SNélio Laranjeiro * @param dev 367272733b5SNélio Laranjeiro * Pointer to Ethernet device structure. 368272733b5SNélio Laranjeiro * 369272733b5SNélio Laranjeiro * @return 370272733b5SNélio Laranjeiro * 0 on success. 371272733b5SNélio Laranjeiro */ 372272733b5SNélio Laranjeiro int 37356f08e16SNélio Laranjeiro priv_dev_traffic_disable(struct priv *priv, 37456f08e16SNélio Laranjeiro struct rte_eth_dev *dev __rte_unused) 375272733b5SNélio Laranjeiro { 376272733b5SNélio Laranjeiro priv_flow_flush(priv, &priv->ctrl_flows); 377272733b5SNélio Laranjeiro return 0; 378272733b5SNélio Laranjeiro } 379272733b5SNélio Laranjeiro 380272733b5SNélio Laranjeiro /** 381272733b5SNélio Laranjeiro * Restart traffic flows configured by control plane 382272733b5SNélio Laranjeiro * 383272733b5SNélio Laranjeiro * @param priv 384272733b5SNélio Laranjeiro * Pointer to Ethernet device private data. 385272733b5SNélio Laranjeiro * @param dev 386272733b5SNélio Laranjeiro * Pointer to Ethernet device structure. 387272733b5SNélio Laranjeiro * 388272733b5SNélio Laranjeiro * @return 389272733b5SNélio Laranjeiro * 0 on success. 390272733b5SNélio Laranjeiro */ 391272733b5SNélio Laranjeiro int 392272733b5SNélio Laranjeiro priv_dev_traffic_restart(struct priv *priv, struct rte_eth_dev *dev) 393272733b5SNélio Laranjeiro { 394272733b5SNélio Laranjeiro if (dev->data->dev_started) { 395272733b5SNélio Laranjeiro priv_dev_traffic_disable(priv, dev); 396272733b5SNélio Laranjeiro priv_dev_traffic_enable(priv, dev); 397272733b5SNélio Laranjeiro } 398272733b5SNélio Laranjeiro return 0; 399272733b5SNélio Laranjeiro } 400272733b5SNélio Laranjeiro 401272733b5SNélio Laranjeiro /** 402272733b5SNélio Laranjeiro * Restart traffic flows configured by control plane 403272733b5SNélio Laranjeiro * 404272733b5SNélio Laranjeiro * @param dev 405272733b5SNélio Laranjeiro * Pointer to Ethernet device structure. 406272733b5SNélio Laranjeiro * 407272733b5SNélio Laranjeiro * @return 408272733b5SNélio Laranjeiro * 0 on success. 409272733b5SNélio Laranjeiro */ 410272733b5SNélio Laranjeiro int 411272733b5SNélio Laranjeiro mlx5_traffic_restart(struct rte_eth_dev *dev) 412272733b5SNélio Laranjeiro { 413272733b5SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 414272733b5SNélio Laranjeiro 415272733b5SNélio Laranjeiro priv_lock(priv); 416272733b5SNélio Laranjeiro priv_dev_traffic_restart(priv, dev); 417272733b5SNélio Laranjeiro priv_unlock(priv); 418272733b5SNélio Laranjeiro return 0; 419272733b5SNélio Laranjeiro } 420