Skip to content

Commit

Permalink
net: macb: Add on the fly CPU endianness detection
Browse files Browse the repository at this point in the history
Program management descriptor's access mode according to the
dynamically detected CPU endianness.

Signed-off-by: Arun Chandran <achandran@mvista.com>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Tested-by: Michal Simek <michal.simek@xilinx.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arun Chandran authored and David S. Miller committed Mar 2, 2015
1 parent 759c935 commit 62f6924
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions drivers/net/ethernet/cadence/macb.c
Original file line number Diff line number Diff line change
Expand Up @@ -1578,6 +1578,7 @@ static u32 macb_dbw(struct macb *bp)
static void macb_configure_dma(struct macb *bp)
{
u32 dmacfg;
u32 tmp, ncr;

if (macb_is_gem(bp)) {
dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L);
Expand All @@ -1586,10 +1587,23 @@ static void macb_configure_dma(struct macb *bp)
dmacfg = GEM_BFINS(FBLDO, bp->dma_burst_length, dmacfg);
dmacfg |= GEM_BIT(TXPBMS) | GEM_BF(RXBMS, -1L);
dmacfg &= ~GEM_BIT(ENDIA_PKT);
/* Tell the chip to byteswap descriptors on big-endian hosts */
#ifdef __BIG_ENDIAN
dmacfg |= GEM_BIT(ENDIA_DESC);
#endif

/* Find the CPU endianness by using the loopback bit of net_ctrl
* register. save it first. When the CPU is in big endian we
* need to program swaped mode for management descriptor access.
*/
ncr = macb_readl(bp, NCR);
__raw_writel(MACB_BIT(LLB), bp->regs + MACB_NCR);
tmp = __raw_readl(bp->regs + MACB_NCR);

if (tmp == MACB_BIT(LLB))
dmacfg &= ~GEM_BIT(ENDIA_DESC);
else
dmacfg |= GEM_BIT(ENDIA_DESC); /* CPU in big endian */

/* Restore net_ctrl */
macb_writel(bp, NCR, ncr);

if (bp->dev->features & NETIF_F_HW_CSUM)
dmacfg |= GEM_BIT(TXCOEN);
else
Expand Down

0 comments on commit 62f6924

Please sign in to comment.