[dpdk-dev] [PATCH v2 26/40] bnxt: add HWRM stat context free function

2016-05-26 Thread Bruce Richardson
On Fri, May 13, 2016 at 03:46:15PM -0700, Stephen Hurd wrote:
> Add function and associated structures and definitions as well as
> some convenienct functions for manipulating the state of the entire
> function.
> 
Again, I think more explanation is needed in the commit message. The commit
title refers to freeing stat contexts, but the patch itself contains functions
working on filters. Either the filter functions belong in a different patch,
or we need more explanation as to why they would belong in this one.

I'd also question if the ordering of the patches should be changed. In other
cases you have a single patch adding allocation and free functions together, but
for these stats contexts there are two patches which are separated in the 
series.
Logically, if they are not merged, it would be good if they could be at least
sequential commits.

Thanks,
/Bruce



[dpdk-dev] [PATCH v2 26/40] bnxt: add HWRM stat context free function

2016-05-13 Thread Stephen Hurd
Add function and associated structures and definitions as well as
some convenienct functions for manipulating the state of the entire
function.

Signed-off-by: Stephen Hurd 
Reviewed-by: Ajit Kumar Khaparde 
---
 drivers/net/bnxt/bnxt_hwrm.c   | 219 +
 drivers/net/bnxt/bnxt_hwrm.h   |  10 ++
 drivers/net/bnxt/hsi_struct_def_dpdk.h |  81 
 3 files changed, 310 insertions(+)

diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 027a2e8..b5bc473 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -43,8 +43,10 @@
 #include "bnxt_filter.h"
 #include "bnxt_hwrm.h"
 #include "bnxt_rxq.h"
+#include "bnxt_rxr.h"
 #include "bnxt_ring.h"
 #include "bnxt_txq.h"
+#include "bnxt_txr.h"
 #include "bnxt_vnic.h"
 #include "hsi_struct_def_dpdk.h"

@@ -206,6 +208,49 @@ int bnxt_hwrm_clear_filter(struct bnxt *bp,
return 0;
 }

+int bnxt_hwrm_set_filter(struct bnxt *bp,
+struct bnxt_vnic_info *vnic,
+struct bnxt_filter_info *filter)
+{
+   int rc = 0;
+   struct hwrm_cfa_l2_filter_alloc_input req = {.req_type = 0 };
+   struct hwrm_cfa_l2_filter_alloc_output *resp = bp->hwrm_cmd_resp_addr;
+   uint32_t enables = 0;
+
+   HWRM_PREP(req, CFA_L2_FILTER_ALLOC, -1, resp);
+
+   req.flags = rte_cpu_to_le_32(filter->flags);
+
+   enables = filter->enables |
+ HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_DST_ID;
+   req.dst_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
+
+   if (enables &
+   HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR)
+   memcpy(req.l2_addr, filter->l2_addr,
+  ETHER_ADDR_LEN);
+   if (enables &
+   HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_ADDR_MASK)
+   memcpy(req.l2_addr_mask, filter->l2_addr_mask,
+  ETHER_ADDR_LEN);
+   if (enables &
+   HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN)
+   req.l2_ovlan = filter->l2_ovlan;
+   if (enables &
+   HWRM_CFA_L2_FILTER_ALLOC_INPUT_ENABLES_L2_OVLAN_MASK)
+   req.l2_ovlan_mask = filter->l2_ovlan_mask;
+
+   req.enables = rte_cpu_to_le_32(enables);
+
+   rc = bnxt_hwrm_send_message(bp, , sizeof(req));
+
+   HWRM_CHECK_RESULT;
+
+   filter->fw_l2_filter_id = rte_le_to_cpu_64(resp->l2_filter_id);
+
+   return rc;
+}
+
 int bnxt_hwrm_exec_fwd_resp(struct bnxt *bp, void *fwd_cmd)
 {
int rc;
@@ -699,6 +744,28 @@ int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp,
return rc;
 }

+int bnxt_hwrm_stat_ctx_free(struct bnxt *bp,
+   struct bnxt_cp_ring_info *cpr, unsigned idx)
+{
+   int rc;
+   struct hwrm_stat_ctx_free_input req = {.req_type = 0 };
+   struct hwrm_stat_ctx_free_output *resp = bp->hwrm_cmd_resp_addr;
+
+   HWRM_PREP(req, STAT_CTX_FREE, -1, resp);
+
+   req.stat_ctx_id = rte_cpu_to_le_16(cpr->hw_stats_ctx_id);
+   req.seq_id = rte_cpu_to_le_16(bp->hwrm_cmd_seq++);
+
+   rc = bnxt_hwrm_send_message(bp, , sizeof(req));
+
+   HWRM_CHECK_RESULT;
+
+   cpr->hw_stats_ctx_id = HWRM_NA_SIGNATURE;
+   bp->grp_info[idx].fw_stats_ctx = cpr->hw_stats_ctx_id;
+
+   return rc;
+}
+
 int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 {
int rc = 0, i, j;
@@ -875,6 +942,28 @@ int bnxt_clear_all_hwrm_stat_ctxs(struct bnxt *bp)
return 0;
 }

+int bnxt_free_all_hwrm_stat_ctxs(struct bnxt *bp)
+{
+   int rc;
+   unsigned i;
+   struct bnxt_cp_ring_info *cpr;
+
+   for (i = 0; i < bp->rx_cp_nr_rings + bp->tx_cp_nr_rings; i++) {
+   unsigned idx = i + 1;
+
+   if (i >= bp->rx_cp_nr_rings)
+   cpr = bp->tx_queues[i - bp->rx_cp_nr_rings]->cp_ring;
+   else
+   cpr = bp->rx_queues[i]->cp_ring;
+   if (cpr->hw_stats_ctx_id != HWRM_NA_SIGNATURE) {
+   rc = bnxt_hwrm_stat_ctx_free(bp, cpr, idx);
+   if (rc)
+   return rc;
+   }
+   }
+   return 0;
+}
+
 int bnxt_alloc_all_hwrm_stat_ctxs(struct bnxt *bp)
 {
unsigned i;
@@ -925,6 +1014,84 @@ int bnxt_free_all_hwrm_ring_grps(struct bnxt *bp)
return rc;
 }

+static void bnxt_free_cp_ring(struct bnxt *bp,
+ struct bnxt_cp_ring_info *cpr, unsigned idx)
+{
+   struct bnxt_ring_struct *cp_ring = cpr->cp_ring_struct;
+
+   bnxt_hwrm_ring_free(bp, cp_ring,
+   HWRM_RING_FREE_INPUT_RING_TYPE_CMPL);
+   cp_ring->fw_ring_id = INVALID_HW_RING_ID;
+   bp->grp_info[idx].cp_fw_ring_id = INVALID_HW_RING_ID;
+   memset(cpr->cp_desc_ring, 0, cpr->cp_ring_struct->ring_size *
+   sizeof(*cpr->cp_desc_ring));
+   cpr->cp_raw_cons = 0;
+}
+
+int bnxt_free_all_hwrm_rings(struct bnxt *bp)
+{
+