|
@@ -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
|
|
|
*
|
|
@@ -42,6 +42,12 @@
|
|
|
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)
|
|
@@ -131,13 +131,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 +388,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 +413,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 +487,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 +607,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 +806,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 +846,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)
|
|
@@ -1393,7 +1386,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] >
|
|
@@ -1468,15 +1461,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);
|
|
|
}
|
|
@@ -1804,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 CSEL value */
|
|
@@ -1824,7 +1810,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;
|