octeon: enable ethernet pause frame support 87/41587/5
authorAlok Mishra <[email protected]>
Fri, 9 Aug 2024 08:29:24 +0000 (13:29 +0500)
committerDamjan Marion <[email protected]>
Tue, 24 Sep 2024 10:18:05 +0000 (10:18 +0000)
This patch adds support for MAC pause flow control.
By default, pause flow control is enabled in the device
configuration.

Type: feature

Signed-off-by: Alok Mishra <[email protected]>
Change-Id: I0f448479a38fae615d87af7e736c6053ada89cca

src/plugins/dev_octeon/port.c

index 6cf58fe..1a60581 100644 (file)
@@ -52,6 +52,72 @@ oct_roc_err (vnet_dev_t *dev, int rv, char *fmt, ...)
   return VNET_DEV_ERR_INTERNAL;
 }
 
+vnet_dev_rv_t
+oct_port_pause_flow_control_init (vlib_main_t *vm, vnet_dev_port_t *port)
+{
+  vnet_dev_t *dev = port->dev;
+  oct_device_t *cd = vnet_dev_get_data (dev);
+  struct roc_nix *nix = cd->nix;
+  struct roc_nix_fc_cfg fc_cfg;
+  struct roc_nix_sq *sq;
+  struct roc_nix_cq *cq;
+  struct roc_nix_rq *rq;
+  int rrv;
+
+  if (roc_nix_is_sdp (nix) || roc_nix_is_lbk (nix))
+    return VNET_DEV_ERR_UNSUPPORTED_DEVICE;
+
+  fc_cfg.type = ROC_NIX_FC_RXCHAN_CFG;
+  fc_cfg.rxchan_cfg.enable = true;
+  rrv = roc_nix_fc_config_set (nix, &fc_cfg);
+  if (rrv)
+    return oct_roc_err (dev, rrv, "roc_nix_fc_config_set failed");
+
+  memset (&fc_cfg, 0, sizeof (struct roc_nix_fc_cfg));
+  fc_cfg.type = ROC_NIX_FC_RQ_CFG;
+  fc_cfg.rq_cfg.enable = true;
+  fc_cfg.rq_cfg.tc = 0;
+
+  foreach_vnet_dev_port_rx_queue (rxq, port)
+    {
+      oct_rxq_t *crq = vnet_dev_get_rx_queue_data (rxq);
+
+      rq = &crq->rq;
+      cq = &crq->cq;
+
+      fc_cfg.rq_cfg.rq = rq->qid;
+      fc_cfg.rq_cfg.cq_drop = cq->drop_thresh;
+
+      rrv = roc_nix_fc_config_set (nix, &fc_cfg);
+      if (rrv)
+       return oct_roc_err (dev, rrv, "roc_nix_fc_config_set failed");
+    }
+
+  memset (&fc_cfg, 0, sizeof (struct roc_nix_fc_cfg));
+  fc_cfg.type = ROC_NIX_FC_TM_CFG;
+  fc_cfg.tm_cfg.tc = 0;
+  fc_cfg.tm_cfg.enable = true;
+
+  foreach_vnet_dev_port_tx_queue (txq, port)
+    {
+      oct_txq_t *ctq = vnet_dev_get_tx_queue_data (txq);
+
+      sq = &ctq->sq;
+
+      fc_cfg.tm_cfg.sq = sq->qid;
+      rrv = roc_nix_fc_config_set (nix, &fc_cfg);
+      if (rrv)
+       return oct_roc_err (dev, rrv, "roc_nix_fc_config_set failed");
+    }
+
+  /* By default, enable pause flow control */
+  rrv = roc_nix_fc_mode_set (nix, ROC_NIX_FC_FULL);
+  if (rrv)
+    return oct_roc_err (dev, rrv, "roc_nix_fc_mode_set failed");
+
+  return VNET_DEV_OK;
+}
+
 vnet_dev_rv_t
 oct_port_init (vlib_main_t *vm, vnet_dev_port_t *port)
 {
@@ -148,6 +214,13 @@ oct_port_init (vlib_main_t *vm, vnet_dev_port_t *port)
       return rv;
     }
 
+  /* Configure pause frame flow control*/
+  if ((rv = oct_port_pause_flow_control_init (vm, port)))
+    {
+      oct_port_deinit (vm, port);
+      return rv;
+    }
+
   return VNET_DEV_OK;
 }