Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / drivers / net / ethernet / renesas / ravb_main.c
index 86449c357168ebb4cd6c6fa25d1503583b8cd82d..8f2c4fb4c7246d6cae26e09c33a31c0573c85b00 100644 (file)
@@ -2,7 +2,7 @@
  *
  * Copyright (C) 2014-2015 Renesas Electronics Corporation
  * Copyright (C) 2015 Renesas Solutions Corp.
- * Copyright (C) 2015 Cogent Embedded, Inc. <source@cogentembedded.com>
+ * Copyright (C) 2015-2016 Cogent Embedded, Inc. <source@cogentembedded.com>
  *
  * Based on the SuperH Ethernet driver
  *
                 NETIF_MSG_RX_ERR | \
                 NETIF_MSG_TX_ERR)
 
+void ravb_modify(struct net_device *ndev, enum ravb_reg reg, u32 clear,
+                u32 set)
+{
+       ravb_write(ndev, (ravb_read(ndev, reg) & ~clear) | set, reg);
+}
+
 int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value)
 {
        int i;
@@ -59,8 +65,7 @@ static int ravb_config(struct net_device *ndev)
        int error;
 
        /* Set config mode */
-       ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) | CCC_OPC_CONFIG,
-                  CCC);
+       ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
        /* Check if the operating mode is changed to the config mode */
        error = ravb_wait(ndev, CSR, CSR_OPS, CSR_OPS_CONFIG);
        if (error)
@@ -72,13 +77,8 @@ static int ravb_config(struct net_device *ndev)
 static void ravb_set_duplex(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
-       u32 ecmr = ravb_read(ndev, ECMR);
 
-       if (priv->duplex)       /* Full */
-               ecmr |=  ECMR_DM;
-       else                    /* Half */
-               ecmr &= ~ECMR_DM;
-       ravb_write(ndev, ecmr, ECMR);
+       ravb_modify(ndev, ECMR, ECMR_DM, priv->duplex ? ECMR_DM : 0);
 }
 
 static void ravb_set_rate(struct net_device *ndev)
@@ -92,8 +92,6 @@ static void ravb_set_rate(struct net_device *ndev)
        case 1000:              /* 1000BASE */
                ravb_write(ndev, GECMR_SPEED_1000, GECMR);
                break;
-       default:
-               break;
        }
 }
 
@@ -131,13 +129,8 @@ static void ravb_mdio_ctrl(struct mdiobb_ctrl *ctrl, u32 mask, int set)
 {
        struct ravb_private *priv = container_of(ctrl, struct ravb_private,
                                                 mdiobb);
-       u32 pir = ravb_read(priv->ndev, PIR);
 
-       if (set)
-               pir |=  mask;
-       else
-               pir &= ~mask;
-       ravb_write(priv->ndev, pir, PIR);
+       ravb_modify(priv->ndev, PIR, mask, set ? mask : 0);
 }
 
 /* MDC pin control */
@@ -393,9 +386,9 @@ static int ravb_dmac_init(struct net_device *ndev)
        ravb_ring_format(ndev, RAVB_NC);
 
 #if defined(__LITTLE_ENDIAN)
-       ravb_write(ndev, ravb_read(ndev, CCC) & ~CCC_BOC, CCC);
+       ravb_modify(ndev, CCC, CCC_BOC, 0);
 #else
-       ravb_write(ndev, ravb_read(ndev, CCC) | CCC_BOC, CCC);
+       ravb_modify(ndev, CCC, CCC_BOC, CCC_BOC);
 #endif
 
        /* Set AVB RX */
@@ -418,8 +411,7 @@ static int ravb_dmac_init(struct net_device *ndev)
        ravb_write(ndev, TIC_FTE0 | TIC_FTE1 | TIC_TFUE, TIC);
 
        /* Setting the control will start the AVB-DMAC process. */
-       ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) | CCC_OPC_OPERATION,
-                  CCC);
+       ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_OPERATION);
 
        return 0;
 }
@@ -493,7 +485,7 @@ static void ravb_get_tx_tstamp(struct net_device *ndev)
                                break;
                        }
                }
-               ravb_write(ndev, ravb_read(ndev, TCCR) | TCCR_TFR, TCCR);
+               ravb_modify(ndev, TCCR, TCCR_TFR, TCCR_TFR);
        }
 }
 
@@ -613,13 +605,13 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q)
 static void ravb_rcv_snd_disable(struct net_device *ndev)
 {
        /* Disable TX and RX */
-       ravb_write(ndev, ravb_read(ndev, ECMR) & ~(ECMR_RE | ECMR_TE), ECMR);
+       ravb_modify(ndev, ECMR, ECMR_RE | ECMR_TE, 0);
 }
 
 static void ravb_rcv_snd_enable(struct net_device *ndev)
 {
        /* Enable TX and RX */
-       ravb_write(ndev, ravb_read(ndev, ECMR) | ECMR_RE | ECMR_TE, ECMR);
+       ravb_modify(ndev, ECMR, ECMR_RE | ECMR_TE, ECMR_RE | ECMR_TE);
 }
 
 /* function for waiting dma process finished */
@@ -812,8 +804,8 @@ static int ravb_poll(struct napi_struct *napi, int budget)
 
        /* Re-enable RX/TX interrupts */
        spin_lock_irqsave(&priv->lock, flags);
-       ravb_write(ndev, ravb_read(ndev, RIC0) | mask, RIC0);
-       ravb_write(ndev, ravb_read(ndev, TIC)  | mask,  TIC);
+       ravb_modify(ndev, RIC0, mask, mask);
+       ravb_modify(ndev, TIC,  mask, mask);
        mmiowb();
        spin_unlock_irqrestore(&priv->lock, flags);
 
@@ -852,8 +844,7 @@ static void ravb_adjust_link(struct net_device *ndev)
                        ravb_set_rate(ndev);
                }
                if (!priv->link) {
-                       ravb_write(ndev, ravb_read(ndev, ECMR) & ~ECMR_TXF,
-                                  ECMR);
+                       ravb_modify(ndev, ECMR, ECMR_TXF, 0);
                        new_state = true;
                        priv->link = phydev->link;
                        if (priv->no_avb_link)
@@ -1397,7 +1388,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
        desc--;
        desc->die_dt = DT_FSTART;
 
-       ravb_write(ndev, ravb_read(ndev, TCCR) | (TCCR_TSRQ0 << q), TCCR);
+       ravb_modify(ndev, TCCR, TCCR_TSRQ0 << q, TCCR_TSRQ0 << q);
 
        priv->cur_tx[q] += NUM_TX_DESC;
        if (priv->cur_tx[q] - priv->dirty_tx[q] >
@@ -1472,15 +1463,10 @@ static void ravb_set_rx_mode(struct net_device *ndev)
 {
        struct ravb_private *priv = netdev_priv(ndev);
        unsigned long flags;
-       u32 ecmr;
 
        spin_lock_irqsave(&priv->lock, flags);
-       ecmr = ravb_read(ndev, ECMR);
-       if (ndev->flags & IFF_PROMISC)
-               ecmr |=  ECMR_PRM;
-       else
-               ecmr &= ~ECMR_PRM;
-       ravb_write(ndev, ecmr, ECMR);
+       ravb_modify(ndev, ECMR, ECMR_PRM,
+                   ndev->flags & IFF_PROMISC ? ECMR_PRM : 0);
        mmiowb();
        spin_unlock_irqrestore(&priv->lock, flags);
 }
@@ -1806,14 +1792,12 @@ static int ravb_probe(struct platform_device *pdev)
 
        /* Set AVB config mode */
        if (chip_id == RCAR_GEN2) {
-               ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) |
-                          CCC_OPC_CONFIG, CCC);
+               ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
                /* Set CSEL value */
-               ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_CSEL) |
-                          CCC_CSEL_HPB, CCC);
+               ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB);
        } else {
-               ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) |
-                          CCC_OPC_CONFIG | CCC_GAC | CCC_CSEL_HPB, CCC);
+               ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG |
+                           CCC_GAC | CCC_CSEL_HPB);
        }
 
        /* Set GTI value */
@@ -1822,7 +1806,7 @@ static int ravb_probe(struct platform_device *pdev)
                goto out_release;
 
        /* Request GTI loading */
-       ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR);
+       ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
 
        /* Allocate descriptor base address table */
        priv->desc_bat_size = sizeof(struct ravb_desc) * DBAT_ENTRY_NUM;