[PATCH] gianfar: descriptors access with I/O accessors
Sascha Hauer
s.hauer at pengutronix.de
Wed Jul 23 00:16:34 PDT 2014
On Tue, Jul 22, 2014 at 03:16:18PM +0100, Renaud Barbier wrote:
> As in U-Boot git-9c9141f, make read/write access to the TX/RX
> descriptors CPU agnostic.
>
> Signed-off-by: Renaud Barbier <renaud.barbier at ge.com>
Applied, thanks
Sascha
> ---
> drivers/net/gianfar.c | 70 +++++++++++++++++++++++++--------------------------
> drivers/net/gianfar.h | 16 ++++++------
> 2 files changed, 43 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c
> index 3370b5c..a308035 100644
> --- a/drivers/net/gianfar.c
> +++ b/drivers/net/gianfar.c
> @@ -199,19 +199,19 @@ static int gfar_open(struct eth_device *edev)
>
> /* Initialize the Rx Buffer descriptors */
> for (ix = 0; ix < RX_BUF_CNT; ix++) {
> - priv->rxbd[ix].status = RXBD_EMPTY;
> - priv->rxbd[ix].length = 0;
> - priv->rxbd[ix].bufPtr = (uint) NetRxPackets[ix];
> + out_be16(&priv->rxbd[ix].status, RXBD_EMPTY);
> + out_be16(&priv->rxbd[ix].length, 0);
> + out_be32(&priv->rxbd[ix].bufPtr, (uint) NetRxPackets[ix]);
> }
> - priv->rxbd[RX_BUF_CNT - 1].status |= RXBD_WRAP;
> + out_be16(&priv->rxbd[RX_BUF_CNT - 1].status, RXBD_EMPTY | RXBD_WRAP);
>
> /* Initialize the TX Buffer Descriptors */
> for (ix = 0; ix < TX_BUF_CNT; ix++) {
> - priv->txbd[ix].status = 0;
> - priv->txbd[ix].length = 0;
> - priv->txbd[ix].bufPtr = 0;
> + out_be16(&priv->txbd[ix].status, 0);
> + out_be16(&priv->txbd[ix].length, 0);
> + out_be32(&priv->txbd[ix].bufPtr, 0);
> }
> - priv->txbd[TX_BUF_CNT - 1].status |= TXBD_WRAP;
> + out_be16(&priv->txbd[TX_BUF_CNT - 1].status, TXBD_WRAP);
>
> /* Enable Transmit and Receive */
> setbits_be32(regs + GFAR_MACCFG1_OFFSET, GFAR_MACCFG1_RX_EN |
> @@ -366,30 +366,32 @@ static int gfar_send(struct eth_device *edev, void *packet, int length)
> struct device_d *dev = edev->parent;
> uint64_t start;
> uint tidx;
> + uint16_t status;
>
> tidx = priv->txidx;
> - priv->txbd[tidx].bufPtr = (uint) packet;
> - priv->txbd[tidx].length = length;
> - priv->txbd[tidx].status |= (TXBD_READY | TXBD_LAST |
> - TXBD_CRC | TXBD_INTERRUPT);
> + out_be32(&priv->txbd[tidx].bufPtr, (u32) packet);
> + out_be16(&priv->txbd[tidx].length, length);
> + out_be16(&priv->txbd[tidx].status,
> + in_be16(&priv->txbd[tidx].status) |
> + (TXBD_READY | TXBD_LAST | TXBD_CRC | TXBD_INTERRUPT));
>
> /* Tell the DMA to go */
> out_be32(regs + GFAR_TSTAT_OFFSET, GFAR_TSTAT_CLEAR_THALT);
>
> /* Wait for buffer to be transmitted */
> start = get_time_ns();
> - while (priv->txbd[tidx].status & TXBD_READY) {
> + while (in_be16(&priv->txbd[tidx].status) & TXBD_READY) {
> if (is_timeout(start, 5 * MSECOND)) {
> break;
> }
> }
>
> - if (priv->txbd[tidx].status & TXBD_READY) {
> - dev_err(dev, "tx timeout: 0x%x\n", priv->txbd[tidx].status);
> + status = in_be16(&priv->txbd[tidx].status);
> + if (status & TXBD_READY) {
> + dev_err(dev, "tx timeout: 0x%x\n", status);
> return -EBUSY;
> - }
> - else if (priv->txbd[tidx].status & TXBD_STATS) {
> - dev_err(dev, "TX error: 0x%x\n", priv->txbd[tidx].status);
> + } else if (status & TXBD_STATS) {
> + dev_err(dev, "TX error: 0x%x\n", status);
> return -EIO;
> }
>
> @@ -403,31 +405,28 @@ static int gfar_recv(struct eth_device *edev)
> struct gfar_private *priv = edev->priv;
> struct device_d *dev = edev->parent;
> void __iomem *regs = priv->regs;
> - int length;
> + uint16_t status, length;
>
> - if (priv->rxbd[priv->rxidx].status & RXBD_EMPTY) {
> - return 0; /* no data */
> - }
> + if (in_be16(&priv->rxbd[priv->rxidx].status) & RXBD_EMPTY)
> + return 0;
>
> - length = priv->rxbd[priv->rxidx].length;
> + length = in_be16(&priv->rxbd[priv->rxidx].length);
>
> /* Send the packet up if there were no errors */
> - if (!(priv->rxbd[priv->rxidx].status & RXBD_STATS)) {
> + status = in_be16(&priv->rxbd[priv->rxidx].status);
> + if (!(status & RXBD_STATS))
> net_receive(edev, NetRxPackets[priv->rxidx], length - 4);
> - } else {
> - dev_err(dev, "Got error %x\n",
> - (priv->rxbd[priv->rxidx].status & RXBD_STATS));
> - }
> + else
> + dev_err(dev, "Got error %x\n", status & RXBD_STATS);
>
> - priv->rxbd[priv->rxidx].length = 0;
> + out_be16(&priv->rxbd[priv->rxidx].length, 0);
>
> + status = RXBD_EMPTY;
> /* Set the wrap bit if this is the last element in the list */
> if ((priv->rxidx + 1) == RX_BUF_CNT)
> - priv->rxbd[priv->rxidx].status = RXBD_WRAP;
> - else
> - priv->rxbd[priv->rxidx].status = 0;
> + status |= RXBD_WRAP;
>
> - priv->rxbd[priv->rxidx].status |= RXBD_EMPTY;
> + out_be16(&priv->rxbd[priv->rxidx].status, status);
> priv->rxidx = (priv->rxidx + 1) % RX_BUF_CNT;
>
> if (in_be32(regs + GFAR_IEVENT_OFFSET) & GFAR_IEVENT_BSY) {
> @@ -517,8 +516,9 @@ static int gfar_probe(struct device_d *dev)
> size = ((TX_BUF_CNT * sizeof(struct txbd8)) +
> (RX_BUF_CNT * sizeof(struct rxbd8))) + BUF_ALIGN;
> p = (char *)xmemalign(BUF_ALIGN, size);
> - priv->txbd = (struct txbd8 *)p;
> - priv->rxbd = (struct rxbd8 *)(p + (TX_BUF_CNT * sizeof(struct txbd8)));
> + priv->txbd = (struct txbd8 __iomem *)p;
> + priv->rxbd = (struct rxbd8 __iomem *)(p +
> + (TX_BUF_CNT * sizeof(struct txbd8)));
>
> edev->priv = priv;
> edev->init = gfar_init;
> diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h
> index 1aac479..c0b9763 100644
> --- a/drivers/net/gianfar.h
> +++ b/drivers/net/gianfar.h
> @@ -188,15 +188,15 @@
> #define RXBD_STATS 0x003f
>
> struct txbd8 {
> - ushort status; /* Status Fields */
> - ushort length; /* Buffer length */
> - uint bufPtr; /* Buffer Pointer */
> + uint16_t status; /* Status Fields */
> + uint16_t length; /* Buffer length */
> + uint32_t bufPtr; /* Buffer Pointer */
> };
>
> struct rxbd8 {
> - ushort status; /* Status Fields */
> - ushort length; /* Buffer Length */
> - uint bufPtr; /* Buffer Pointer */
> + uint16_t status; /* Status Fields */
> + uint16_t length; /* Buffer Length */
> + uint32_t bufPtr; /* Buffer Pointer */
> };
>
> /* eTSEC general control and status registers */
> @@ -275,8 +275,8 @@ struct gfar_private {
> struct gfar_phy *gfar_mdio;
> struct gfar_phy *gfar_tbi;
> struct phy_info *phyinfo;
> - volatile struct txbd8 *txbd;
> - volatile struct rxbd8 *rxbd;
> + struct txbd8 __iomem *txbd;
> + struct rxbd8 __iomem *rxbd;
> uint txidx;
> uint rxidx;
> uint phyaddr;
> --
> 1.8.3.1
>
>
> _______________________________________________
> barebox mailing list
> barebox at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
More information about the barebox
mailing list