net/macb: improve big endian CPU support

The commit a50dad355a (net: macb: Add big endian CPU support) converted I/O
accessors to readl_relaxed() and writel_relaxed() and consequentially broke
MACB driver on AVR32 platforms such as ATNGW100.

This patch improves I/O access by checking endiannes first and use the
corresponding methods.

Fixes: a50dad355a (net: macb: Add big endian CPU support)
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Andy Shevchenko
2015-07-24 21:23:59 +03:00
committed by David S. Miller
parent dfbafc9953
commit f2ce8a9e48
2 changed files with 87 additions and 44 deletions

View File

@@ -429,18 +429,12 @@
| GEM_BF(name, value))
/* Register access macros */
#define macb_readl(port,reg) \
readl_relaxed((port)->regs + MACB_##reg)
#define macb_writel(port,reg,value) \
writel_relaxed((value), (port)->regs + MACB_##reg)
#define gem_readl(port, reg) \
readl_relaxed((port)->regs + GEM_##reg)
#define gem_writel(port, reg, value) \
writel_relaxed((value), (port)->regs + GEM_##reg)
#define queue_readl(queue, reg) \
readl_relaxed((queue)->bp->regs + (queue)->reg)
#define queue_writel(queue, reg, value) \
writel_relaxed((value), (queue)->bp->regs + (queue)->reg)
#define macb_readl(port, reg) (port)->readl((port), MACB_##reg)
#define macb_writel(port, reg, value) (port)->writel((port), MACB_##reg, (value))
#define gem_readl(port, reg) (port)->readl((port), GEM_##reg)
#define gem_writel(port, reg, value) (port)->writel((port), GEM_##reg, (value))
#define queue_readl(queue, reg) (queue)->bp->readl((queue)->bp, (queue)->reg)
#define queue_writel(queue, reg, value) (queue)->bp->writel((queue)->bp, (queue)->reg, (value))
/* Conditional GEM/MACB macros. These perform the operation to the correct
* register dependent on whether the device is a GEM or a MACB. For registers
@@ -785,6 +779,11 @@ struct macb_queue {
struct macb {
void __iomem *regs;
bool native_io;
/* hardware IO accessors */
u32 (*readl)(struct macb *bp, int offset);
void (*writel)(struct macb *bp, int offset, u32 value);
unsigned int rx_tail;
unsigned int rx_prepared_head;
@@ -843,9 +842,4 @@ static inline bool macb_is_gem(struct macb *bp)
return !!(bp->caps & MACB_CAPS_MACB_IS_GEM);
}
static inline bool macb_is_gem_hw(void __iomem *addr)
{
return !!(MACB_BFEXT(IDNUM, readl_relaxed(addr + MACB_MID)) >= 0x2);
}
#endif /* _MACB_H */