Skip to content

Commit

Permalink
bus/dpaa: fix statistics reading
Browse files Browse the repository at this point in the history
[ upstream commit e62a3f4 ]

Reading of word un-aligned values after reading word aligned
values lead to corruption of memory.
This patch make changes such that word aligned access is made,
before making an un-aligned access

Fixes: 6d6b4f4 ("bus/dpaa: add FMAN hardware operations")

Signed-off-by: Nipun Gupta <nipun.gupta@nxp.com>
Acked-by: Hemant Agrawal <hemant.agrawal@nxp.com>
  • Loading branch information
nipungupta87 authored and cpaelzer committed May 11, 2021
1 parent b32efbd commit fa5027d
Showing 1 changed file with 16 additions and 17 deletions.
33 changes: 16 additions & 17 deletions drivers/bus/dpaa/base/fman/fman_hw.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright 2017 NXP
* Copyright 2017,2020 NXP
*
*/

Expand Down Expand Up @@ -219,20 +219,20 @@ fman_if_stats_get(struct fman_if *p, struct rte_eth_stats *stats)
struct memac_regs *regs = m->ccsr_map;

/* read recved packet count */
stats->ipackets = ((u64)in_be32(&regs->rfrm_u)) << 32 |
in_be32(&regs->rfrm_l);
stats->ibytes = ((u64)in_be32(&regs->roct_u)) << 32 |
in_be32(&regs->roct_l);
stats->ierrors = ((u64)in_be32(&regs->rerr_u)) << 32 |
in_be32(&regs->rerr_l);
stats->ipackets = (u64)in_be32(&regs->rfrm_l) |
((u64)in_be32(&regs->rfrm_u)) << 32;
stats->ibytes = (u64)in_be32(&regs->roct_l) |
((u64)in_be32(&regs->roct_u)) << 32;
stats->ierrors = (u64)in_be32(&regs->rerr_l) |
((u64)in_be32(&regs->rerr_u)) << 32;

/* read xmited packet count */
stats->opackets = ((u64)in_be32(&regs->tfrm_u)) << 32 |
in_be32(&regs->tfrm_l);
stats->obytes = ((u64)in_be32(&regs->toct_u)) << 32 |
in_be32(&regs->toct_l);
stats->oerrors = ((u64)in_be32(&regs->terr_u)) << 32 |
in_be32(&regs->terr_l);
stats->opackets = (u64)in_be32(&regs->tfrm_l) |
((u64)in_be32(&regs->tfrm_u)) << 32;
stats->obytes = (u64)in_be32(&regs->toct_l) |
((u64)in_be32(&regs->toct_u)) << 32;
stats->oerrors = (u64)in_be32(&regs->terr_l) |
((u64)in_be32(&regs->terr_u)) << 32;
}

void
Expand All @@ -244,10 +244,9 @@ fman_if_stats_get_all(struct fman_if *p, uint64_t *value, int n)
uint64_t base_offset = offsetof(struct memac_regs, reoct_l);

for (i = 0; i < n; i++)
value[i] = ((u64)in_be32((char *)regs
+ base_offset + 8 * i + 4)) << 32 |
((u64)in_be32((char *)regs
+ base_offset + 8 * i));
value[i] = (((u64)in_be32((char *)regs + base_offset + 8 * i) |
(u64)in_be32((char *)regs + base_offset +
8 * i + 4)) << 32);
}

void
Expand Down

0 comments on commit fa5027d

Please sign in to comment.