diff options
author | Marian-Cristian Rotariu <marian.rotariu@freescale.com> | 2014-10-31 15:26:46 (GMT) |
---|---|---|
committer | Madalin Bucur <madalin.bucur@freescale.com> | 2015-03-11 16:05:52 (GMT) |
commit | 9d039899453ec385f1b0949457800d15b25d95ee (patch) | |
tree | 12bf106924cd83a1676dbe63b07b058317293738 /drivers/net/ethernet/freescale/dpa | |
parent | 36f096f59e4804b37ddc200d7770380f622fd4ca (diff) | |
download | linux-fsl-qoriq-9d039899453ec385f1b0949457800d15b25d95ee.tar.xz |
dpaa_eth: make the S/G rx routine endian portable
This patch modifies the shared S/G rx routine used by shared and macless driver
to properly receive the S/G frames from FMan.
Signed-off-by: Marian-Cristian Rotariu <marian.rotariu@freescale.com>
Change-Id: Icc467cb9ced12db75db28876e606e23fd3ee7788
Reviewed-on: http://git.am.freescale.net:8181/22852
Reviewed-by: Madalin-Cristian Bucur <madalin.bucur@freescale.com>
Reviewed-on: http://git.am.freescale.net:8181/32502
Diffstat (limited to 'drivers/net/ethernet/freescale/dpa')
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c index ea88db2..1ac0007 100644 --- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c +++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_shared.c @@ -269,18 +269,19 @@ shared_rx_dqrr(struct qman_portal *portal, struct qman_fq *fq, if (fd->format == qm_fd_sg) { if (dpa_bp->vaddr) { - sgt = dpa_phys2virt(dpa_bp, - qm_fd_addr(fd)) + dpa_fd_offset(fd); + sgt = dpa_phys2virt(dpa_bp, qm_fd_addr(fd)) + + dpa_fd_offset(fd); for (i = 0; i < DPA_SGT_MAX_ENTRIES; i++) { + void *frag_addr = dpa_phys2virt(dpa_bp, + qm_sg_addr(&sgt[i]) + + be16_to_cpu(sgt[i].offset)); + u32 frag_length = be32_to_cpu(sgt[i].length); BUG_ON(sgt[i].extension); /* copy from sgt[i] */ - memcpy(skb_put(skb, sgt[i].length), - dpa_phys2virt(dpa_bp, - qm_sg_addr(&sgt[i]) + - sgt[i].offset), - sgt[i].length); + memcpy(skb_put(skb, frag_length), frag_addr, + frag_length); if (sgt[i].final) break; } @@ -300,12 +301,13 @@ shared_rx_dqrr(struct qman_portal *portal, struct qman_fq *fq, dpa_bp->size)); for (i = 0; i < DPA_SGT_MAX_ENTRIES; i++) { + u32 frag_length = be32_to_cpu(sgt[i].length); BUG_ON(sgt[i].extension); - copy_from_unmapped_area( - skb_put(skb, sgt[i].length), - qm_sg_addr(&sgt[i]) + sgt[i].offset, - sgt[i].length); + skb_put(skb, frag_length), + qm_sg_addr(&sgt[i]) + + be16_to_cpu(sgt[i].offset), + frag_length); if (sgt[i].final) break; |