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 17fb732b0aSNélio Laranjeiro /** 18fb732b0aSNélio Laranjeiro * Stop traffic on Tx queues. 19fb732b0aSNélio Laranjeiro * 20fb732b0aSNélio Laranjeiro * @param dev 21fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 22fb732b0aSNélio Laranjeiro */ 236e78005aSNélio Laranjeiro static void 24*af4f09f2SNélio Laranjeiro mlx5_txq_stop(struct rte_eth_dev *dev) 256e78005aSNélio Laranjeiro { 26*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 276e78005aSNélio Laranjeiro unsigned int i; 286e78005aSNélio Laranjeiro 296e78005aSNélio Laranjeiro for (i = 0; i != priv->txqs_n; ++i) 30*af4f09f2SNélio Laranjeiro mlx5_txq_release(dev, i); 316e78005aSNélio Laranjeiro } 326e78005aSNélio Laranjeiro 33fb732b0aSNélio Laranjeiro /** 34fb732b0aSNélio Laranjeiro * Start traffic on Tx queues. 35fb732b0aSNélio Laranjeiro * 36fb732b0aSNélio Laranjeiro * @param dev 37fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 38fb732b0aSNélio Laranjeiro * 39fb732b0aSNélio Laranjeiro * @return 40fb732b0aSNélio Laranjeiro * 0 on success, errno on error. 41fb732b0aSNélio Laranjeiro */ 426e78005aSNélio Laranjeiro static int 43*af4f09f2SNélio Laranjeiro mlx5_txq_start(struct rte_eth_dev *dev) 446e78005aSNélio Laranjeiro { 45*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 466e78005aSNélio Laranjeiro unsigned int i; 476e78005aSNélio Laranjeiro int ret = 0; 486e78005aSNélio Laranjeiro 496e78005aSNélio Laranjeiro /* Add memory regions to Tx queues. */ 506e78005aSNélio Laranjeiro for (i = 0; i != priv->txqs_n; ++i) { 516e78005aSNélio Laranjeiro unsigned int idx = 0; 526e78005aSNélio Laranjeiro struct mlx5_mr *mr; 53*af4f09f2SNélio Laranjeiro struct mlx5_txq_ctrl *txq_ctrl = mlx5_txq_get(dev, i); 546e78005aSNélio Laranjeiro 556e78005aSNélio Laranjeiro if (!txq_ctrl) 566e78005aSNélio Laranjeiro continue; 57de48f165SYongseok Koh LIST_FOREACH(mr, &priv->mr, next) { 58*af4f09f2SNélio Laranjeiro mlx5_txq_mp2mr_reg(&txq_ctrl->txq, mr->mp, idx++); 59de48f165SYongseok Koh if (idx == MLX5_PMD_TX_MP_CACHE) 60de48f165SYongseok Koh break; 61de48f165SYongseok Koh } 626e78005aSNélio Laranjeiro txq_alloc_elts(txq_ctrl); 63*af4f09f2SNélio Laranjeiro txq_ctrl->ibv = mlx5_txq_ibv_new(dev, i); 646e78005aSNélio Laranjeiro if (!txq_ctrl->ibv) { 656e78005aSNélio Laranjeiro ret = ENOMEM; 666e78005aSNélio Laranjeiro goto error; 676e78005aSNélio Laranjeiro } 686e78005aSNélio Laranjeiro } 69*af4f09f2SNélio Laranjeiro ret = mlx5_tx_uar_remap(dev, priv->ctx->cmd_fd); 704a984153SXueming Li if (ret) 714a984153SXueming Li goto error; 724a984153SXueming Li return ret; 736e78005aSNélio Laranjeiro error: 74*af4f09f2SNélio Laranjeiro mlx5_txq_stop(dev); 754a984153SXueming Li return ret; 766e78005aSNélio Laranjeiro } 776e78005aSNélio Laranjeiro 78fb732b0aSNélio Laranjeiro /** 79fb732b0aSNélio Laranjeiro * Stop traffic on Rx queues. 80fb732b0aSNélio Laranjeiro * 81fb732b0aSNélio Laranjeiro * @param dev 82fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 83fb732b0aSNélio Laranjeiro */ 84a1366b1aSNélio Laranjeiro static void 85*af4f09f2SNélio Laranjeiro mlx5_rxq_stop(struct rte_eth_dev *dev) 86a1366b1aSNélio Laranjeiro { 87*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 88a1366b1aSNélio Laranjeiro unsigned int i; 89a1366b1aSNélio Laranjeiro 90a1366b1aSNélio Laranjeiro for (i = 0; i != priv->rxqs_n; ++i) 91*af4f09f2SNélio Laranjeiro mlx5_rxq_release(dev, i); 92a1366b1aSNélio Laranjeiro } 93a1366b1aSNélio Laranjeiro 94fb732b0aSNélio Laranjeiro /** 95fb732b0aSNélio Laranjeiro * Start traffic on Rx queues. 96fb732b0aSNélio Laranjeiro * 97fb732b0aSNélio Laranjeiro * @param dev 98fb732b0aSNélio Laranjeiro * Pointer to Ethernet device structure. 99fb732b0aSNélio Laranjeiro * 100fb732b0aSNélio Laranjeiro * @return 101fb732b0aSNélio Laranjeiro * 0 on success, errno on error. 102fb732b0aSNélio Laranjeiro */ 103a1366b1aSNélio Laranjeiro static int 104*af4f09f2SNélio Laranjeiro mlx5_rxq_start(struct rte_eth_dev *dev) 105a1366b1aSNélio Laranjeiro { 106*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 107a1366b1aSNélio Laranjeiro unsigned int i; 108a1366b1aSNélio Laranjeiro int ret = 0; 109a1366b1aSNélio Laranjeiro 110a1366b1aSNélio Laranjeiro for (i = 0; i != priv->rxqs_n; ++i) { 111*af4f09f2SNélio Laranjeiro struct mlx5_rxq_ctrl *rxq_ctrl = mlx5_rxq_get(dev, i); 112a1366b1aSNélio Laranjeiro 113a1366b1aSNélio Laranjeiro if (!rxq_ctrl) 114a1366b1aSNélio Laranjeiro continue; 115a1366b1aSNélio Laranjeiro ret = rxq_alloc_elts(rxq_ctrl); 116a1366b1aSNélio Laranjeiro if (ret) 117a1366b1aSNélio Laranjeiro goto error; 118*af4f09f2SNélio Laranjeiro rxq_ctrl->ibv = mlx5_rxq_ibv_new(dev, i); 119a1366b1aSNélio Laranjeiro if (!rxq_ctrl->ibv) { 120a1366b1aSNélio Laranjeiro ret = ENOMEM; 121a1366b1aSNélio Laranjeiro goto error; 122a1366b1aSNélio Laranjeiro } 123a1366b1aSNélio Laranjeiro } 124a1366b1aSNélio Laranjeiro return -ret; 125a1366b1aSNélio Laranjeiro error: 126*af4f09f2SNélio Laranjeiro mlx5_rxq_stop(dev); 127a1366b1aSNélio Laranjeiro return -ret; 128a1366b1aSNélio Laranjeiro } 129a1366b1aSNélio Laranjeiro 130e60fbd5bSAdrien Mazarguil /** 131e60fbd5bSAdrien Mazarguil * DPDK callback to start the device. 132e60fbd5bSAdrien Mazarguil * 133e60fbd5bSAdrien Mazarguil * Simulate device start by attaching all configured flows. 134e60fbd5bSAdrien Mazarguil * 135e60fbd5bSAdrien Mazarguil * @param dev 136e60fbd5bSAdrien Mazarguil * Pointer to Ethernet device structure. 137e60fbd5bSAdrien Mazarguil * 138e60fbd5bSAdrien Mazarguil * @return 139e60fbd5bSAdrien Mazarguil * 0 on success, negative errno value on failure. 140e60fbd5bSAdrien Mazarguil */ 141e60fbd5bSAdrien Mazarguil int 142e60fbd5bSAdrien Mazarguil mlx5_dev_start(struct rte_eth_dev *dev) 143e60fbd5bSAdrien Mazarguil { 144e60fbd5bSAdrien Mazarguil struct priv *priv = dev->data->dev_private; 1456e78005aSNélio Laranjeiro struct mlx5_mr *mr = NULL; 146ecc1c29dSAdrien Mazarguil int err; 147e60fbd5bSAdrien Mazarguil 148272733b5SNélio Laranjeiro dev->data->dev_started = 1; 149*af4f09f2SNélio Laranjeiro err = mlx5_flow_create_drop_queue(dev); 150272733b5SNélio Laranjeiro if (err) { 151272733b5SNélio Laranjeiro ERROR("%p: Drop queue allocation failed: %s", 152272733b5SNélio Laranjeiro (void *)dev, strerror(err)); 153272733b5SNélio Laranjeiro goto error; 154272733b5SNélio Laranjeiro } 155ecc1c29dSAdrien Mazarguil DEBUG("%p: allocating and configuring hash RX queues", (void *)dev); 1566e78005aSNélio Laranjeiro rte_mempool_walk(mlx5_mp2mr_iter, priv); 157*af4f09f2SNélio Laranjeiro err = mlx5_txq_start(dev); 1586e78005aSNélio Laranjeiro if (err) { 1596e78005aSNélio Laranjeiro ERROR("%p: TXQ allocation failed: %s", 1606e78005aSNélio Laranjeiro (void *)dev, strerror(err)); 1616e78005aSNélio Laranjeiro goto error; 1626e78005aSNélio Laranjeiro } 163*af4f09f2SNélio Laranjeiro err = mlx5_rxq_start(dev); 164a1366b1aSNélio Laranjeiro if (err) { 165a1366b1aSNélio Laranjeiro ERROR("%p: RXQ allocation failed: %s", 166a1366b1aSNélio Laranjeiro (void *)dev, strerror(err)); 167a1366b1aSNélio Laranjeiro goto error; 168a1366b1aSNélio Laranjeiro } 169*af4f09f2SNélio Laranjeiro err = mlx5_rx_intr_vec_enable(dev); 170e1016cb7SAdrien Mazarguil if (err) { 171e1016cb7SAdrien Mazarguil ERROR("%p: RX interrupt vector creation failed", 172e1016cb7SAdrien Mazarguil (void *)priv); 173e1016cb7SAdrien Mazarguil goto error; 1743c7d44afSShahaf Shuler } 175*af4f09f2SNélio Laranjeiro mlx5_xstats_init(dev); 176c7bf6225SYongseok Koh /* Update link status and Tx/Rx callbacks for the first time. */ 177c7bf6225SYongseok Koh memset(&dev->data->dev_link, 0, sizeof(struct rte_eth_link)); 178e313ef4cSShahaf Shuler INFO("Forcing port %u link to be up", dev->data->port_id); 179*af4f09f2SNélio Laranjeiro err = mlx5_force_link_status_change(dev, ETH_LINK_UP); 180e313ef4cSShahaf Shuler if (err) { 181e313ef4cSShahaf Shuler DEBUG("Failed to set port %u link to be up", 182e313ef4cSShahaf Shuler dev->data->port_id); 183e313ef4cSShahaf Shuler goto error; 184e313ef4cSShahaf Shuler } 185*af4f09f2SNélio Laranjeiro mlx5_dev_interrupt_handler_install(dev); 186c8d4ee50SNélio Laranjeiro return 0; 187c8d4ee50SNélio Laranjeiro error: 188e60fbd5bSAdrien Mazarguil /* Rollback. */ 189272733b5SNélio Laranjeiro dev->data->dev_started = 0; 1905f64e6bfSNélio Laranjeiro for (mr = LIST_FIRST(&priv->mr); mr; mr = LIST_FIRST(&priv->mr)) 191*af4f09f2SNélio Laranjeiro mlx5_mr_release(mr); 192*af4f09f2SNélio Laranjeiro mlx5_flow_stop(dev, &priv->flows); 193*af4f09f2SNélio Laranjeiro mlx5_traffic_disable(dev); 194*af4f09f2SNélio Laranjeiro mlx5_txq_stop(dev); 195*af4f09f2SNélio Laranjeiro mlx5_rxq_stop(dev); 196*af4f09f2SNélio Laranjeiro mlx5_flow_delete_drop_queue(dev); 19780554894SOlivier Matz return err; 198e60fbd5bSAdrien Mazarguil } 199e60fbd5bSAdrien Mazarguil 200e60fbd5bSAdrien Mazarguil /** 201e60fbd5bSAdrien Mazarguil * DPDK callback to stop the device. 202e60fbd5bSAdrien Mazarguil * 203e60fbd5bSAdrien Mazarguil * Simulate device stop by detaching all configured flows. 204e60fbd5bSAdrien Mazarguil * 205e60fbd5bSAdrien Mazarguil * @param dev 206e60fbd5bSAdrien Mazarguil * Pointer to Ethernet device structure. 207e60fbd5bSAdrien Mazarguil */ 208e60fbd5bSAdrien Mazarguil void 209e60fbd5bSAdrien Mazarguil mlx5_dev_stop(struct rte_eth_dev *dev) 210e60fbd5bSAdrien Mazarguil { 211e60fbd5bSAdrien Mazarguil struct priv *priv = dev->data->dev_private; 2126e78005aSNélio Laranjeiro struct mlx5_mr *mr; 213e60fbd5bSAdrien Mazarguil 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); 221*af4f09f2SNélio Laranjeiro mlx5_flow_stop(dev, &priv->flows); 222*af4f09f2SNélio Laranjeiro mlx5_traffic_disable(dev); 223*af4f09f2SNélio Laranjeiro mlx5_rx_intr_vec_disable(dev); 224*af4f09f2SNélio Laranjeiro mlx5_dev_interrupt_handler_uninstall(dev); 225*af4f09f2SNélio Laranjeiro mlx5_txq_stop(dev); 226*af4f09f2SNélio Laranjeiro mlx5_rxq_stop(dev); 2275f64e6bfSNélio Laranjeiro for (mr = LIST_FIRST(&priv->mr); mr; mr = LIST_FIRST(&priv->mr)) 228*af4f09f2SNélio Laranjeiro mlx5_mr_release(mr); 229*af4f09f2SNélio Laranjeiro mlx5_flow_delete_drop_queue(dev); 230e60fbd5bSAdrien Mazarguil } 231272733b5SNélio Laranjeiro 232272733b5SNélio Laranjeiro /** 233272733b5SNélio Laranjeiro * Enable traffic flows configured by control plane 234272733b5SNélio Laranjeiro * 235*af4f09f2SNélio Laranjeiro * @param dev 236272733b5SNélio Laranjeiro * Pointer to Ethernet device private data. 237272733b5SNélio Laranjeiro * @param dev 238272733b5SNélio Laranjeiro * Pointer to Ethernet device structure. 239272733b5SNélio Laranjeiro * 240272733b5SNélio Laranjeiro * @return 241272733b5SNélio Laranjeiro * 0 on success. 242272733b5SNélio Laranjeiro */ 243272733b5SNélio Laranjeiro int 244*af4f09f2SNélio Laranjeiro mlx5_traffic_enable(struct rte_eth_dev *dev) 245272733b5SNélio Laranjeiro { 246*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 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 dev 365*af4f09f2SNélio Laranjeiro * Pointer to Ethernet device private data. 366272733b5SNélio Laranjeiro * 367272733b5SNélio Laranjeiro * @return 368272733b5SNélio Laranjeiro * 0 on success. 369272733b5SNélio Laranjeiro */ 370272733b5SNélio Laranjeiro int 371*af4f09f2SNélio Laranjeiro mlx5_traffic_disable(struct rte_eth_dev *dev) 372272733b5SNélio Laranjeiro { 373*af4f09f2SNélio Laranjeiro struct priv *priv = dev->data->dev_private; 374272733b5SNélio Laranjeiro 375*af4f09f2SNélio Laranjeiro mlx5_flow_list_flush(dev, &priv->ctrl_flows); 376272733b5SNélio Laranjeiro return 0; 377272733b5SNélio Laranjeiro } 378272733b5SNélio Laranjeiro 379272733b5SNélio Laranjeiro /** 380272733b5SNélio Laranjeiro * Restart traffic flows configured by control plane 381272733b5SNélio Laranjeiro * 382272733b5SNélio Laranjeiro * @param dev 383*af4f09f2SNélio Laranjeiro * Pointer to Ethernet device private data. 384272733b5SNélio Laranjeiro * 385272733b5SNélio Laranjeiro * @return 386272733b5SNélio Laranjeiro * 0 on success. 387272733b5SNélio Laranjeiro */ 388272733b5SNélio Laranjeiro int 389272733b5SNélio Laranjeiro mlx5_traffic_restart(struct rte_eth_dev *dev) 390272733b5SNélio Laranjeiro { 391*af4f09f2SNélio Laranjeiro if (dev->data->dev_started) { 392*af4f09f2SNélio Laranjeiro mlx5_traffic_disable(dev); 393*af4f09f2SNélio Laranjeiro mlx5_traffic_enable(dev); 394*af4f09f2SNélio Laranjeiro } 395272733b5SNélio Laranjeiro return 0; 396272733b5SNélio Laranjeiro } 397