Message ID | 20230523134748.907143-3-ioana.ciornei@nxp.com |
---|---|
State | Accepted |
Commit | 13ca5c2f56a172a3df1d5b84a084ed437ea26cde |
Delegated to: | Peng Fan |
Headers | show |
Series | Add the 'net stats' command to dump network statistics | expand |
On Tue, May 23, 2023 at 4:48 PM Ioana Ciornei <ioana.ciornei@nxp.com> wrote: > > In order to simplify code, dpni_statistics can be written as a union. > Using the raw accessors we can just loop through all the statistics from > a page without trying to access each an every one independently. > Make this change to a union. > > Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> > --- > drivers/net/fsl-mc/dpni.c | 2 +- > drivers/net/ldpaa_eth/ldpaa_eth.c | 4 +- > include/fsl-mc/fsl_dpni.h | 143 +++++++++++++++++++++--------- > 3 files changed, 105 insertions(+), 44 deletions(-) > > diff --git a/drivers/net/fsl-mc/dpni.c b/drivers/net/fsl-mc/dpni.c > index 5290be20c85e..a31abbff71b9 100644 > --- a/drivers/net/fsl-mc/dpni.c > +++ b/drivers/net/fsl-mc/dpni.c > @@ -491,7 +491,7 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io, > uint32_t cmd_flags, > uint16_t token, > uint8_t page, > - struct dpni_statistics *stat) > + union dpni_statistics *stat) > { > struct mc_command cmd = { 0 }; > int err; > diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c > index 2cb6e9b7d705..fe901baf5a4e 100644 > --- a/drivers/net/ldpaa_eth/ldpaa_eth.c > +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c > @@ -68,7 +68,7 @@ static const char *dpni_statistics[][DPNI_STATS_PER_PAGE] = { > }; > > static void print_dpni_stats(const char *strings[], > - struct dpni_statistics dpni_stats) > + union dpni_statistics dpni_stats) > { > uint64_t *stat; > int i; > @@ -86,7 +86,7 @@ static void ldpaa_eth_get_dpni_counter(void) > { > int err = 0; > unsigned int page = 0; > - struct dpni_statistics dpni_stats; > + union dpni_statistics dpni_stats; > > printf("DPNI counters ..\n"); > for (page = 0; page < 3; page++) { > diff --git a/include/fsl-mc/fsl_dpni.h b/include/fsl-mc/fsl_dpni.h > index e5e7338192f6..fc57c375ac14 100644 > --- a/include/fsl-mc/fsl_dpni.h > +++ b/include/fsl-mc/fsl_dpni.h > @@ -258,13 +258,13 @@ do { \ > /* cmd, param, offset, width, type, arg_name */ > #define DPNI_RSP_GET_STATISTICS(cmd, stat) \ > do { \ > - MC_RSP_OP(cmd, 0, 0, 64, uint64_t, (stat)->counter0); \ > - MC_RSP_OP(cmd, 1, 0, 64, uint64_t, (stat)->counter1); \ > - MC_RSP_OP(cmd, 2, 0, 64, uint64_t, (stat)->counter2); \ > - MC_RSP_OP(cmd, 3, 0, 64, uint64_t, (stat)->counter3); \ > - MC_RSP_OP(cmd, 4, 0, 64, uint64_t, (stat)->counter4); \ > - MC_RSP_OP(cmd, 5, 0, 64, uint64_t, (stat)->counter5); \ > - MC_RSP_OP(cmd, 6, 0, 64, uint64_t, (stat)->counter6); \ > + MC_RSP_OP(cmd, 0, 0, 64, uint64_t, (stat)->raw.counter[0]); \ > + MC_RSP_OP(cmd, 1, 0, 64, uint64_t, (stat)->raw.counter[1]); \ > + MC_RSP_OP(cmd, 2, 0, 64, uint64_t, (stat)->raw.counter[2]); \ > + MC_RSP_OP(cmd, 3, 0, 64, uint64_t, (stat)->raw.counter[3]); \ > + MC_RSP_OP(cmd, 4, 0, 64, uint64_t, (stat)->raw.counter[4]); \ > + MC_RSP_OP(cmd, 5, 0, 64, uint64_t, (stat)->raw.counter[5]); \ > + MC_RSP_OP(cmd, 6, 0, 64, uint64_t, (stat)->raw.counter[6]); \ > } while (0) > > enum net_prot { > @@ -1257,40 +1257,101 @@ int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io, > uint32_t cmd_flags, > uint16_t token, > enum dpni_confirmation_mode mode); > -struct dpni_statistics { > - /** > - * Page_0 statistics structure > - * @ingress_all_frames: Ingress frame count > - * @ingress_all_bytes: Ingress byte count > - * @ingress_multicast_frames: Ingress multicast frame count > - * @ingress_multicast_bytes: Ingress multicast byte count > - * @ingress_broadcast_frames: Ingress broadcast frame count > - * @ingress_broadcast_bytes: Ingress broadcast byte count > - * > - * Page_1 statistics structure > - * @egress_all_frames: Egress frame count > - * @egress_all_bytes: Egress byte count > - * @egress_multicast_frames: Egress multicast frame count > - * @egress_multicast_bytes: Egress multicast byte count > - * @egress_broadcast_frames: Egress broadcast frame count > - * @egress_broadcast_bytes: Egress broadcast byte count > - * > - * Page_2 statistics structure > - * @ingress_filtered_frames: Ingress filtered frame count > - * @ingress_discarded_frames: Ingress discarded frame count > - * @ingress_nobuffer_discards: Ingress discarded frame count due to > - * lack of buffers. > - * @egress_discarded_frames: Egress discarded frame count > - * @egress_confirmed_frames: Egress confirmed frame count > - */ > > - uint64_t counter0; > - uint64_t counter1; > - uint64_t counter2; > - uint64_t counter3; > - uint64_t counter4; > - uint64_t counter5; > - uint64_t counter6; > +#define DPNI_STATISTICS_CNT 7 > + > +/** > + * union dpni_statistics - Union describing the DPNI statistics > + * @page_0: Page_0 statistics structure > + * @page_0.ingress_all_frames: Ingress frame count > + * @page_0.ingress_all_bytes: Ingress byte count > + * @page_0.ingress_multicast_frames: Ingress multicast frame count > + * @page_0.ingress_multicast_bytes: Ingress multicast byte count > + * @page_0.ingress_broadcast_frames: Ingress broadcast frame count > + * @page_0.ingress_broadcast_bytes: Ingress broadcast byte count > + * @page_1: Page_1 statistics structure > + * @page_1.egress_all_frames: Egress frame count > + * @page_1.egress_all_bytes: Egress byte count > + * @page_1.egress_multicast_frames: Egress multicast frame count > + * @page_1.egress_multicast_bytes: Egress multicast byte count > + * @page_1.egress_broadcast_frames: Egress broadcast frame count > + * @page_1.egress_broadcast_bytes: Egress broadcast byte count > + * @page_2: Page_2 statistics structure > + * @page_2.ingress_filtered_frames: Ingress filtered frame count > + * @page_2.ingress_discarded_frames: Ingress discarded frame count > + * @page_2.ingress_nobuffer_discards: Ingress discarded frame count due to > + * lack of buffers > + * @page_2.egress_discarded_frames: Egress discarded frame count > + * @page_2.egress_confirmed_frames: Egress confirmed frame count > + * @page_3: Page_3 statistics structure > + * @page_3.egress_dequeue_bytes: Cumulative count of the number of bytes > + * dequeued from egress FQs > + * @page_3.egress_dequeue_frames: Cumulative count of the number of frames > + * dequeued from egress FQs > + * @page_3.egress_reject_bytes: Cumulative count of the number of bytes in > + * egress frames whose enqueue was rejected > + * @page_3.egress_reject_frames: Cumulative count of the number of egress > + * frames whose enqueue was rejected > + * @page_4: Page_4 statistics structure: congestion points > + * @page_4.cgr_reject_frames: number of rejected frames due to congestion point > + * @page_4.cgr_reject_bytes: number of rejected bytes due to congestion point > + * @page_5: Page_5 statistics structure: policer > + * @page_5.policer_cnt_red: NUmber of red colored frames > + * @page_5.policer_cnt_yellow: number of yellow colored frames > + * @page_5.policer_cnt_green: number of green colored frames > + * @page_5.policer_cnt_re_red: number of recolored red frames > + * @page_5.policer_cnt_re_yellow: number of recolored yellow frames > + * @page_6: Page_6 statistics structure > + * @page_6.tx_pending_frames: total number of frames pending in egress FQs > + * @raw: raw statistics structure, used to index counters > + */ > +union dpni_statistics { > + struct { > + u64 ingress_all_frames; > + u64 ingress_all_bytes; > + u64 ingress_multicast_frames; > + u64 ingress_multicast_bytes; > + u64 ingress_broadcast_frames; > + u64 ingress_broadcast_bytes; > + } page_0; > + struct { > + u64 egress_all_frames; > + u64 egress_all_bytes; > + u64 egress_multicast_frames; > + u64 egress_multicast_bytes; > + u64 egress_broadcast_frames; > + u64 egress_broadcast_bytes; > + } page_1; > + struct { > + u64 ingress_filtered_frames; > + u64 ingress_discarded_frames; > + u64 ingress_nobuffer_discards; > + u64 egress_discarded_frames; > + u64 egress_confirmed_frames; > + } page_2; > + struct { > + u64 egress_dequeue_bytes; > + u64 egress_dequeue_frames; > + u64 egress_reject_bytes; > + u64 egress_reject_frames; > + } page_3; > + struct { > + u64 cgr_reject_frames; > + u64 cgr_reject_bytes; > + } page_4; > + struct { > + u64 policer_cnt_red; > + u64 policer_cnt_yellow; > + u64 policer_cnt_green; > + u64 policer_cnt_re_red; > + u64 policer_cnt_re_yellow; > + } page_5; > + struct { > + u64 tx_pending_frames; > + } page_6; > + struct { > + u64 counter[DPNI_STATISTICS_CNT]; > + } raw; > }; > > /** > @@ -1308,7 +1369,7 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io, > uint32_t cmd_flags, > uint16_t token, > uint8_t page, > - struct dpni_statistics *stat); > + union dpni_statistics *stat); > > /** > * dpni_reset_statistics() - Clears DPNI statistics > -- > 2.25.1 > Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
diff --git a/drivers/net/fsl-mc/dpni.c b/drivers/net/fsl-mc/dpni.c index 5290be20c85e..a31abbff71b9 100644 --- a/drivers/net/fsl-mc/dpni.c +++ b/drivers/net/fsl-mc/dpni.c @@ -491,7 +491,7 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, uint8_t page, - struct dpni_statistics *stat) + union dpni_statistics *stat) { struct mc_command cmd = { 0 }; int err; diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c index 2cb6e9b7d705..fe901baf5a4e 100644 --- a/drivers/net/ldpaa_eth/ldpaa_eth.c +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c @@ -68,7 +68,7 @@ static const char *dpni_statistics[][DPNI_STATS_PER_PAGE] = { }; static void print_dpni_stats(const char *strings[], - struct dpni_statistics dpni_stats) + union dpni_statistics dpni_stats) { uint64_t *stat; int i; @@ -86,7 +86,7 @@ static void ldpaa_eth_get_dpni_counter(void) { int err = 0; unsigned int page = 0; - struct dpni_statistics dpni_stats; + union dpni_statistics dpni_stats; printf("DPNI counters ..\n"); for (page = 0; page < 3; page++) { diff --git a/include/fsl-mc/fsl_dpni.h b/include/fsl-mc/fsl_dpni.h index e5e7338192f6..fc57c375ac14 100644 --- a/include/fsl-mc/fsl_dpni.h +++ b/include/fsl-mc/fsl_dpni.h @@ -258,13 +258,13 @@ do { \ /* cmd, param, offset, width, type, arg_name */ #define DPNI_RSP_GET_STATISTICS(cmd, stat) \ do { \ - MC_RSP_OP(cmd, 0, 0, 64, uint64_t, (stat)->counter0); \ - MC_RSP_OP(cmd, 1, 0, 64, uint64_t, (stat)->counter1); \ - MC_RSP_OP(cmd, 2, 0, 64, uint64_t, (stat)->counter2); \ - MC_RSP_OP(cmd, 3, 0, 64, uint64_t, (stat)->counter3); \ - MC_RSP_OP(cmd, 4, 0, 64, uint64_t, (stat)->counter4); \ - MC_RSP_OP(cmd, 5, 0, 64, uint64_t, (stat)->counter5); \ - MC_RSP_OP(cmd, 6, 0, 64, uint64_t, (stat)->counter6); \ + MC_RSP_OP(cmd, 0, 0, 64, uint64_t, (stat)->raw.counter[0]); \ + MC_RSP_OP(cmd, 1, 0, 64, uint64_t, (stat)->raw.counter[1]); \ + MC_RSP_OP(cmd, 2, 0, 64, uint64_t, (stat)->raw.counter[2]); \ + MC_RSP_OP(cmd, 3, 0, 64, uint64_t, (stat)->raw.counter[3]); \ + MC_RSP_OP(cmd, 4, 0, 64, uint64_t, (stat)->raw.counter[4]); \ + MC_RSP_OP(cmd, 5, 0, 64, uint64_t, (stat)->raw.counter[5]); \ + MC_RSP_OP(cmd, 6, 0, 64, uint64_t, (stat)->raw.counter[6]); \ } while (0) enum net_prot { @@ -1257,40 +1257,101 @@ int dpni_set_tx_confirmation_mode(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, enum dpni_confirmation_mode mode); -struct dpni_statistics { - /** - * Page_0 statistics structure - * @ingress_all_frames: Ingress frame count - * @ingress_all_bytes: Ingress byte count - * @ingress_multicast_frames: Ingress multicast frame count - * @ingress_multicast_bytes: Ingress multicast byte count - * @ingress_broadcast_frames: Ingress broadcast frame count - * @ingress_broadcast_bytes: Ingress broadcast byte count - * - * Page_1 statistics structure - * @egress_all_frames: Egress frame count - * @egress_all_bytes: Egress byte count - * @egress_multicast_frames: Egress multicast frame count - * @egress_multicast_bytes: Egress multicast byte count - * @egress_broadcast_frames: Egress broadcast frame count - * @egress_broadcast_bytes: Egress broadcast byte count - * - * Page_2 statistics structure - * @ingress_filtered_frames: Ingress filtered frame count - * @ingress_discarded_frames: Ingress discarded frame count - * @ingress_nobuffer_discards: Ingress discarded frame count due to - * lack of buffers. - * @egress_discarded_frames: Egress discarded frame count - * @egress_confirmed_frames: Egress confirmed frame count - */ - uint64_t counter0; - uint64_t counter1; - uint64_t counter2; - uint64_t counter3; - uint64_t counter4; - uint64_t counter5; - uint64_t counter6; +#define DPNI_STATISTICS_CNT 7 + +/** + * union dpni_statistics - Union describing the DPNI statistics + * @page_0: Page_0 statistics structure + * @page_0.ingress_all_frames: Ingress frame count + * @page_0.ingress_all_bytes: Ingress byte count + * @page_0.ingress_multicast_frames: Ingress multicast frame count + * @page_0.ingress_multicast_bytes: Ingress multicast byte count + * @page_0.ingress_broadcast_frames: Ingress broadcast frame count + * @page_0.ingress_broadcast_bytes: Ingress broadcast byte count + * @page_1: Page_1 statistics structure + * @page_1.egress_all_frames: Egress frame count + * @page_1.egress_all_bytes: Egress byte count + * @page_1.egress_multicast_frames: Egress multicast frame count + * @page_1.egress_multicast_bytes: Egress multicast byte count + * @page_1.egress_broadcast_frames: Egress broadcast frame count + * @page_1.egress_broadcast_bytes: Egress broadcast byte count + * @page_2: Page_2 statistics structure + * @page_2.ingress_filtered_frames: Ingress filtered frame count + * @page_2.ingress_discarded_frames: Ingress discarded frame count + * @page_2.ingress_nobuffer_discards: Ingress discarded frame count due to + * lack of buffers + * @page_2.egress_discarded_frames: Egress discarded frame count + * @page_2.egress_confirmed_frames: Egress confirmed frame count + * @page_3: Page_3 statistics structure + * @page_3.egress_dequeue_bytes: Cumulative count of the number of bytes + * dequeued from egress FQs + * @page_3.egress_dequeue_frames: Cumulative count of the number of frames + * dequeued from egress FQs + * @page_3.egress_reject_bytes: Cumulative count of the number of bytes in + * egress frames whose enqueue was rejected + * @page_3.egress_reject_frames: Cumulative count of the number of egress + * frames whose enqueue was rejected + * @page_4: Page_4 statistics structure: congestion points + * @page_4.cgr_reject_frames: number of rejected frames due to congestion point + * @page_4.cgr_reject_bytes: number of rejected bytes due to congestion point + * @page_5: Page_5 statistics structure: policer + * @page_5.policer_cnt_red: NUmber of red colored frames + * @page_5.policer_cnt_yellow: number of yellow colored frames + * @page_5.policer_cnt_green: number of green colored frames + * @page_5.policer_cnt_re_red: number of recolored red frames + * @page_5.policer_cnt_re_yellow: number of recolored yellow frames + * @page_6: Page_6 statistics structure + * @page_6.tx_pending_frames: total number of frames pending in egress FQs + * @raw: raw statistics structure, used to index counters + */ +union dpni_statistics { + struct { + u64 ingress_all_frames; + u64 ingress_all_bytes; + u64 ingress_multicast_frames; + u64 ingress_multicast_bytes; + u64 ingress_broadcast_frames; + u64 ingress_broadcast_bytes; + } page_0; + struct { + u64 egress_all_frames; + u64 egress_all_bytes; + u64 egress_multicast_frames; + u64 egress_multicast_bytes; + u64 egress_broadcast_frames; + u64 egress_broadcast_bytes; + } page_1; + struct { + u64 ingress_filtered_frames; + u64 ingress_discarded_frames; + u64 ingress_nobuffer_discards; + u64 egress_discarded_frames; + u64 egress_confirmed_frames; + } page_2; + struct { + u64 egress_dequeue_bytes; + u64 egress_dequeue_frames; + u64 egress_reject_bytes; + u64 egress_reject_frames; + } page_3; + struct { + u64 cgr_reject_frames; + u64 cgr_reject_bytes; + } page_4; + struct { + u64 policer_cnt_red; + u64 policer_cnt_yellow; + u64 policer_cnt_green; + u64 policer_cnt_re_red; + u64 policer_cnt_re_yellow; + } page_5; + struct { + u64 tx_pending_frames; + } page_6; + struct { + u64 counter[DPNI_STATISTICS_CNT]; + } raw; }; /** @@ -1308,7 +1369,7 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io, uint32_t cmd_flags, uint16_t token, uint8_t page, - struct dpni_statistics *stat); + union dpni_statistics *stat); /** * dpni_reset_statistics() - Clears DPNI statistics
In order to simplify code, dpni_statistics can be written as a union. Using the raw accessors we can just loop through all the statistics from a page without trying to access each an every one independently. Make this change to a union. Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> --- drivers/net/fsl-mc/dpni.c | 2 +- drivers/net/ldpaa_eth/ldpaa_eth.c | 4 +- include/fsl-mc/fsl_dpni.h | 143 +++++++++++++++++++++--------- 3 files changed, 105 insertions(+), 44 deletions(-)