Skip to content

Commit

Permalink
net: calxedaxgmac: use raw i/o accessors in rx and tx paths
Browse files Browse the repository at this point in the history
The standard readl/writel accessors involve a spinlock and cache sync
operation on ARM platforms with an outer cache. Only DMA triggering
accesses need this, so use the raw variants instead in the critical paths.

The relaxed variants would be more appropriate, but don't exist on all
arches.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Rob Herring authored and David S. Miller committed Nov 7, 2012
1 parent b821bd8 commit 0ec6d34
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions drivers/net/ethernet/calxeda/xgmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1203,7 +1203,7 @@ static int xgmac_poll(struct napi_struct *napi, int budget)

if (work_done < budget) {
napi_complete(napi);
writel(DMA_INTR_DEFAULT_MASK, priv->base + XGMAC_DMA_INTR_ENA);
__raw_writel(DMA_INTR_DEFAULT_MASK, priv->base + XGMAC_DMA_INTR_ENA);
}
return work_done;
}
Expand Down Expand Up @@ -1348,7 +1348,7 @@ static irqreturn_t xgmac_pmt_interrupt(int irq, void *dev_id)
struct xgmac_priv *priv = netdev_priv(dev);
void __iomem *ioaddr = priv->base;

intr_status = readl(ioaddr + XGMAC_INT_STAT);
intr_status = __raw_readl(ioaddr + XGMAC_INT_STAT);
if (intr_status & XGMAC_INT_STAT_PMT) {
netdev_dbg(priv->dev, "received Magic frame\n");
/* clear the PMT bits 5 and 6 by reading the PMT */
Expand All @@ -1366,9 +1366,9 @@ static irqreturn_t xgmac_interrupt(int irq, void *dev_id)
struct xgmac_extra_stats *x = &priv->xstats;

/* read the status register (CSR5) */
intr_status = readl(priv->base + XGMAC_DMA_STATUS);
intr_status &= readl(priv->base + XGMAC_DMA_INTR_ENA);
writel(intr_status, priv->base + XGMAC_DMA_STATUS);
intr_status = __raw_readl(priv->base + XGMAC_DMA_STATUS);
intr_status &= __raw_readl(priv->base + XGMAC_DMA_INTR_ENA);
__raw_writel(intr_status, priv->base + XGMAC_DMA_STATUS);

/* It displays the DMA process states (CSR5 register) */
/* ABNORMAL interrupts */
Expand Down Expand Up @@ -1404,7 +1404,7 @@ static irqreturn_t xgmac_interrupt(int irq, void *dev_id)

/* TX/RX NORMAL interrupts */
if (intr_status & (DMA_STATUS_RI | DMA_STATUS_TU)) {
writel(DMA_INTR_ABNORMAL, priv->base + XGMAC_DMA_INTR_ENA);
__raw_writel(DMA_INTR_ABNORMAL, priv->base + XGMAC_DMA_INTR_ENA);
napi_schedule(&priv->napi);
}

Expand Down

0 comments on commit 0ec6d34

Please sign in to comment.