From: Bin Meng Date: Tue, 12 Jan 2016 06:41:19 +0000 (-0800) Subject: net: tsec: Move rx_idx and tx_idx to struct tsec_private X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fu-boot.git;a=commitdiff_plain;h=362b123f473cbc72d43720f9245c68d174439310 net: tsec: Move rx_idx and tx_idx to struct tsec_private At present rx_idx and tx_idx are declared as static variables in the driver codes. To support multiple interfaces, move it to struct tsec_private. Signed-off-by: Bin Meng Acked-by: Joe Hershberger --- diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c index 4aeb387acb..943c4b3711 100644 --- a/drivers/net/tsec.c +++ b/drivers/net/tsec.c @@ -23,9 +23,6 @@ DECLARE_GLOBAL_DATA_PTR; #define TX_BUF_CNT 2 -static uint rx_idx; /* index of the current RX buffer */ -static uint tx_idx; /* index of the current TX buffer */ - #ifdef __GNUC__ static struct txbd8 __iomem txbd[TX_BUF_CNT] __aligned(8); static struct rxbd8 __iomem rxbd[PKTBUFSRX] __aligned(8); @@ -280,22 +277,23 @@ void redundant_init(struct eth_device *dev) tsec_send(dev, (void *)pkt, sizeof(pkt)); /* Wait for buffer to be received */ - for (t = 0; in_be16(&rxbd[rx_idx].status) & RXBD_EMPTY; t++) { + for (t = 0; in_be16(&rxbd[priv->rx_idx].status) & RXBD_EMPTY; + t++) { if (t >= 10 * TOUT_LOOP) { printf("%s: tsec: rx error\n", dev->name); break; } } - if (!memcmp(pkt, (void *)net_rx_packets[rx_idx], sizeof(pkt))) + if (!memcmp(pkt, net_rx_packets[priv->rx_idx], sizeof(pkt))) fail = 0; - out_be16(&rxbd[rx_idx].length, 0); + out_be16(&rxbd[priv->rx_idx].length, 0); status = RXBD_EMPTY; - if ((rx_idx + 1) == PKTBUFSRX) + if ((priv->rx_idx + 1) == PKTBUFSRX) status |= RXBD_WRAP; - out_be16(&rxbd[rx_idx].status, status); - rx_idx = (rx_idx + 1) % PKTBUFSRX; + out_be16(&rxbd[priv->rx_idx].status, status); + priv->rx_idx = (priv->rx_idx + 1) % PKTBUFSRX; if (in_be32(®s->ievent) & IEVENT_BSY) { out_be32(®s->ievent, IEVENT_BSY); @@ -330,8 +328,8 @@ static void startup_tsec(struct eth_device *dev) int i; /* reset the indices to zero */ - rx_idx = 0; - tx_idx = 0; + priv->rx_idx = 0; + priv->tx_idx = 0; #ifdef CONFIG_SYS_FSL_ERRATUM_NMG_ETSEC129 uint svr; #endif @@ -388,32 +386,32 @@ static int tsec_send(struct eth_device *dev, void *packet, int length) int i; /* Find an empty buffer descriptor */ - for (i = 0; in_be16(&txbd[tx_idx].status) & TXBD_READY; i++) { + for (i = 0; in_be16(&txbd[priv->tx_idx].status) & TXBD_READY; i++) { if (i >= TOUT_LOOP) { debug("%s: tsec: tx buffers full\n", dev->name); return result; } } - out_be32(&txbd[tx_idx].bufptr, (u32)packet); - out_be16(&txbd[tx_idx].length, length); - status = in_be16(&txbd[tx_idx].status); - out_be16(&txbd[tx_idx].status, status | + out_be32(&txbd[priv->tx_idx].bufptr, (u32)packet); + out_be16(&txbd[priv->tx_idx].length, length); + status = in_be16(&txbd[priv->tx_idx].status); + out_be16(&txbd[priv->tx_idx].status, status | (TXBD_READY | TXBD_LAST | TXBD_CRC | TXBD_INTERRUPT)); /* Tell the DMA to go */ out_be32(®s->tstat, TSTAT_CLEAR_THALT); /* Wait for buffer to be transmitted */ - for (i = 0; in_be16(&txbd[tx_idx].status) & TXBD_READY; i++) { + for (i = 0; in_be16(&txbd[priv->tx_idx].status) & TXBD_READY; i++) { if (i >= TOUT_LOOP) { debug("%s: tsec: tx error\n", dev->name); return result; } } - tx_idx = (tx_idx + 1) % TX_BUF_CNT; - result = in_be16(&txbd[tx_idx].status) & TXBD_STATS; + priv->tx_idx = (priv->tx_idx + 1) % TX_BUF_CNT; + result = in_be16(&txbd[priv->tx_idx].status) & TXBD_STATS; return result; } @@ -423,26 +421,26 @@ static int tsec_recv(struct eth_device *dev) struct tsec_private *priv = (struct tsec_private *)dev->priv; struct tsec __iomem *regs = priv->regs; - while (!(in_be16(&rxbd[rx_idx].status) & RXBD_EMPTY)) { - int length = in_be16(&rxbd[rx_idx].length); - uint16_t status = in_be16(&rxbd[rx_idx].status); + while (!(in_be16(&rxbd[priv->rx_idx].status) & RXBD_EMPTY)) { + int length = in_be16(&rxbd[priv->rx_idx].length); + uint16_t status = in_be16(&rxbd[priv->rx_idx].status); + uchar *packet = net_rx_packets[priv->rx_idx]; /* Send the packet up if there were no errors */ if (!(status & RXBD_STATS)) - net_process_received_packet(net_rx_packets[rx_idx], - length - 4); + net_process_received_packet(packet, length - 4); else printf("Got error %x\n", (status & RXBD_STATS)); - out_be16(&rxbd[rx_idx].length, 0); + out_be16(&rxbd[priv->rx_idx].length, 0); status = RXBD_EMPTY; /* Set the wrap bit if this is the last element in the list */ - if ((rx_idx + 1) == PKTBUFSRX) + if ((priv->rx_idx + 1) == PKTBUFSRX) status |= RXBD_WRAP; - out_be16(&rxbd[rx_idx].status, status); + out_be16(&rxbd[priv->rx_idx].status, status); - rx_idx = (rx_idx + 1) % PKTBUFSRX; + priv->rx_idx = (priv->rx_idx + 1) % PKTBUFSRX; } if (in_be32(®s->ievent) & IEVENT_BSY) { diff --git a/include/tsec.h b/include/tsec.h index f2aa11abe6..023f095427 100644 --- a/include/tsec.h +++ b/include/tsec.h @@ -396,6 +396,8 @@ struct tsec_private { uint phyaddr; char mii_devname[16]; u32 flags; + uint rx_idx; /* index of the current RX buffer */ + uint tx_idx; /* index of the current TX buffer */ }; struct tsec_info_struct {