aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/calxeda/xgmac.c
diff options
context:
space:
mode:
authorRob Herring <rob.herring@calxeda.com>2012-11-05 01:22:21 -0500
committerDavid S. Miller <davem@davemloft.net>2012-11-07 03:51:13 -0500
commit0ec6d343f7bcf9e0944aa9ff65287b987ec00c0f (patch)
tree7ac7a7216579c1e480de333f223811e92ffa3033 /drivers/net/ethernet/calxeda/xgmac.c
parentb821bd8e5a4413c8e28e64d878720978883ebfc8 (diff)
net: calxedaxgmac: use raw i/o accessors in rx and tx paths
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>
Diffstat (limited to 'drivers/net/ethernet/calxeda/xgmac.c')
-rw-r--r--drivers/net/ethernet/calxeda/xgmac.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/net/ethernet/calxeda/xgmac.c b/drivers/net/ethernet/calxeda/xgmac.c
index 728fcef4e685..84cd40e4f081 100644
--- a/drivers/net/ethernet/calxeda/xgmac.c
+++ b/drivers/net/ethernet/calxeda/xgmac.c
@@ -1203,7 +1203,7 @@ static int xgmac_poll(struct napi_struct *napi, int budget)
1203 1203
1204 if (work_done < budget) { 1204 if (work_done < budget) {
1205 napi_complete(napi); 1205 napi_complete(napi);
1206 writel(DMA_INTR_DEFAULT_MASK, priv->base + XGMAC_DMA_INTR_ENA); 1206 __raw_writel(DMA_INTR_DEFAULT_MASK, priv->base + XGMAC_DMA_INTR_ENA);
1207 } 1207 }
1208 return work_done; 1208 return work_done;
1209} 1209}
@@ -1348,7 +1348,7 @@ static irqreturn_t xgmac_pmt_interrupt(int irq, void *dev_id)
1348 struct xgmac_priv *priv = netdev_priv(dev); 1348 struct xgmac_priv *priv = netdev_priv(dev);
1349 void __iomem *ioaddr = priv->base; 1349 void __iomem *ioaddr = priv->base;
1350 1350
1351 intr_status = readl(ioaddr + XGMAC_INT_STAT); 1351 intr_status = __raw_readl(ioaddr + XGMAC_INT_STAT);
1352 if (intr_status & XGMAC_INT_STAT_PMT) { 1352 if (intr_status & XGMAC_INT_STAT_PMT) {
1353 netdev_dbg(priv->dev, "received Magic frame\n"); 1353 netdev_dbg(priv->dev, "received Magic frame\n");
1354 /* clear the PMT bits 5 and 6 by reading the PMT */ 1354 /* clear the PMT bits 5 and 6 by reading the PMT */
@@ -1366,9 +1366,9 @@ static irqreturn_t xgmac_interrupt(int irq, void *dev_id)
1366 struct xgmac_extra_stats *x = &priv->xstats; 1366 struct xgmac_extra_stats *x = &priv->xstats;
1367 1367
1368 /* read the status register (CSR5) */ 1368 /* read the status register (CSR5) */
1369 intr_status = readl(priv->base + XGMAC_DMA_STATUS); 1369 intr_status = __raw_readl(priv->base + XGMAC_DMA_STATUS);
1370 intr_status &= readl(priv->base + XGMAC_DMA_INTR_ENA); 1370 intr_status &= __raw_readl(priv->base + XGMAC_DMA_INTR_ENA);
1371 writel(intr_status, priv->base + XGMAC_DMA_STATUS); 1371 __raw_writel(intr_status, priv->base + XGMAC_DMA_STATUS);
1372 1372
1373 /* It displays the DMA process states (CSR5 register) */ 1373 /* It displays the DMA process states (CSR5 register) */
1374 /* ABNORMAL interrupts */ 1374 /* ABNORMAL interrupts */
@@ -1404,7 +1404,7 @@ static irqreturn_t xgmac_interrupt(int irq, void *dev_id)
1404 1404
1405 /* TX/RX NORMAL interrupts */ 1405 /* TX/RX NORMAL interrupts */
1406 if (intr_status & (DMA_STATUS_RI | DMA_STATUS_TU)) { 1406 if (intr_status & (DMA_STATUS_RI | DMA_STATUS_TU)) {
1407 writel(DMA_INTR_ABNORMAL, priv->base + XGMAC_DMA_INTR_ENA); 1407 __raw_writel(DMA_INTR_ABNORMAL, priv->base + XGMAC_DMA_INTR_ENA);
1408 napi_schedule(&priv->napi); 1408 napi_schedule(&priv->napi);
1409 } 1409 }
1410 1410