[PATCH 26/30] net: eepro100: Add RX/TX rings into the private data
Ramon Fried
rfried.dev at gmail.com
Sat May 23 19:23:15 CEST 2020
On Sat, May 23, 2020 at 7:44 PM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> The RX/TX DMA descriptor rings are per-device-instance private data,
> so move them into the private data.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> ---
> drivers/net/eepro100.c | 59 +++++++++++++++++++++++++-----------------
> 1 file changed, 35 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
> index 78dedbdcc9..ed6bbd5cf8 100644
> --- a/drivers/net/eepro100.c
> +++ b/drivers/net/eepro100.c
> @@ -183,12 +183,6 @@ struct descriptor { /* A generic descriptor. */
>
> #define TOUT_LOOP 1000000
>
> -static struct eepro100_rxfd rx_ring[NUM_RX_DESC]; /* RX descriptor ring */
> -static struct eepro100_txfd tx_ring[NUM_TX_DESC]; /* TX descriptor ring */
> -static int rx_next; /* RX descriptor ring pointer */
> -static int tx_next; /* TX descriptor ring pointer */
> -static int tx_threshold;
> -
> /*
> * The parameters for a CmdConfigure operation.
> * There are so many options that it would be difficult to document
> @@ -202,6 +196,15 @@ static const char i82558_config_cmd[] = {
> };
>
> struct eepro100_priv {
> + /* RX descriptor ring */
> + struct eepro100_rxfd rx_ring[NUM_RX_DESC];
> + /* TX descriptor ring */
> + struct eepro100_txfd tx_ring[NUM_TX_DESC];
> + /* RX descriptor ring pointer */
> + int rx_next;
> + /* TX descriptor ring pointer */
> + int tx_next;
> + int tx_threshold;
> struct eth_device dev;
> pci_dev_t devno;
> char *name;
> @@ -348,6 +351,7 @@ static int eepro100_miiphy_write(struct mii_dev *bus, int addr, int devad,
>
> static void init_rx_ring(struct eepro100_priv *priv)
> {
> + struct eepro100_rxfd *rx_ring = priv->rx_ring;
> int i;
>
> for (i = 0; i < NUM_RX_DESC; i++) {
> @@ -366,13 +370,15 @@ static void init_rx_ring(struct eepro100_priv *priv)
> (unsigned long)rx_ring +
> (sizeof(*rx_ring) * NUM_RX_DESC));
>
> - rx_next = 0;
> + priv->rx_next = 0;
> }
>
> static void purge_tx_ring(struct eepro100_priv *priv)
> {
> - tx_next = 0;
> - tx_threshold = 0x01208000;
> + struct eepro100_txfd *tx_ring = priv->tx_ring;
> +
> + priv->tx_next = 0;
> + priv->tx_threshold = 0x01208000;
> memset(tx_ring, 0, sizeof(*tx_ring) * NUM_TX_DESC);
>
> flush_dcache_range((unsigned long)tx_ring,
> @@ -533,6 +539,8 @@ static int eepro100_init(struct eth_device *dev, bd_t *bis)
> {
> struct eepro100_priv *priv =
> container_of(dev, struct eepro100_priv, dev);
> + struct eepro100_rxfd *rx_ring = priv->rx_ring;
> + struct eepro100_txfd *tx_ring = priv->tx_ring;
> struct eepro100_txfd *ias_cmd, *cfg_cmd;
> int ret, status = -1;
> int tx_cur;
> @@ -569,20 +577,20 @@ static int eepro100_init(struct eth_device *dev, bd_t *bis)
> }
>
> /* RX ring cache was already flushed in init_rx_ring() */
> - OUTL(priv, phys_to_bus(priv->devno, (u32)&rx_ring[rx_next]),
> + OUTL(priv, phys_to_bus(priv->devno, (u32)&rx_ring[priv->rx_next]),
> SCB_POINTER);
> OUTW(priv, SCB_M | RUC_START, SCB_CMD);
>
> /* Send the Configure frame */
> - tx_cur = tx_next;
> - tx_next = ((tx_next + 1) % NUM_TX_DESC);
> + tx_cur = priv->tx_next;
> + priv->tx_next = ((priv->tx_next + 1) % NUM_TX_DESC);
>
> cfg_cmd = &tx_ring[tx_cur];
> cfg_cmd->command = cpu_to_le16(CONFIG_SYS_CMD_SUSPEND |
> CONFIG_SYS_CMD_CONFIGURE);
> cfg_cmd->status = 0;
> cfg_cmd->link = cpu_to_le32(phys_to_bus(priv->devno,
> - (u32)&tx_ring[tx_next]));
> + (u32)&tx_ring[priv->tx_next]));
>
> memcpy(((struct descriptor *)cfg_cmd)->params, i82558_config_cmd,
> sizeof(i82558_config_cmd));
> @@ -595,15 +603,15 @@ static int eepro100_init(struct eth_device *dev, bd_t *bis)
> }
>
> /* Send the Individual Address Setup frame */
> - tx_cur = tx_next;
> - tx_next = ((tx_next + 1) % NUM_TX_DESC);
> + tx_cur = priv->tx_next;
> + priv->tx_next = ((priv->tx_next + 1) % NUM_TX_DESC);
>
> ias_cmd = &tx_ring[tx_cur];
> ias_cmd->command = cpu_to_le16(CONFIG_SYS_CMD_SUSPEND |
> CONFIG_SYS_CMD_IAS);
> ias_cmd->status = 0;
> ias_cmd->link = cpu_to_le32(phys_to_bus(priv->devno,
> - (u32)&tx_ring[tx_next]));
> + (u32)&tx_ring[priv->tx_next]));
>
> memcpy(((struct descriptor *)ias_cmd)->params, priv->enetaddr, 6);
>
> @@ -624,6 +632,7 @@ static int eepro100_send(struct eth_device *dev, void *packet, int length)
> {
> struct eepro100_priv *priv =
> container_of(dev, struct eepro100_priv, dev);
> + struct eepro100_txfd *tx_ring = priv->tx_ring;
> struct eepro100_txfd *desc;
> int ret, status = -1;
> int tx_cur;
> @@ -633,16 +642,16 @@ static int eepro100_send(struct eth_device *dev, void *packet, int length)
> goto done;
> }
>
> - tx_cur = tx_next;
> - tx_next = (tx_next + 1) % NUM_TX_DESC;
> + tx_cur = priv->tx_next;
> + priv->tx_next = (priv->tx_next + 1) % NUM_TX_DESC;
>
> desc = &tx_ring[tx_cur];
> desc->command = cpu_to_le16(TXCB_CMD_TRANSMIT | TXCB_CMD_SF |
> TXCB_CMD_S | TXCB_CMD_EL);
> desc->status = 0;
> - desc->count = cpu_to_le32(tx_threshold);
> + desc->count = cpu_to_le32(priv->tx_threshold);
> desc->link = cpu_to_le32(phys_to_bus(priv->devno,
> - (u32)&tx_ring[tx_next]));
> + (u32)&tx_ring[priv->tx_next]));
> desc->tx_desc_addr = cpu_to_le32(phys_to_bus(priv->devno,
> (u32)&desc->tx_buf_addr0));
> desc->tx_buf_addr0 = cpu_to_le32(phys_to_bus(priv->devno,
> @@ -667,6 +676,7 @@ static int eepro100_recv(struct eth_device *dev)
> {
> struct eepro100_priv *priv =
> container_of(dev, struct eepro100_priv, dev);
> + struct eepro100_rxfd *rx_ring = priv->rx_ring;
> struct eepro100_rxfd *desc;
> int rx_prev, length = 0;
> u16 status, stat;
> @@ -675,7 +685,7 @@ static int eepro100_recv(struct eth_device *dev)
> OUTW(priv, stat & SCB_STATUS_RNR, SCB_STATUS);
>
> for (;;) {
> - desc = &rx_ring[rx_next];
> + desc = &rx_ring[priv->rx_next];
> invalidate_dcache_range((unsigned long)desc,
> (unsigned long)desc + sizeof(*desc));
> status = le16_to_cpu(desc->status);
> @@ -701,14 +711,14 @@ static int eepro100_recv(struct eth_device *dev)
> flush_dcache_range((unsigned long)desc,
> (unsigned long)desc + sizeof(*desc));
>
> - rx_prev = (rx_next + NUM_RX_DESC - 1) % NUM_RX_DESC;
> + rx_prev = (priv->rx_next + NUM_RX_DESC - 1) % NUM_RX_DESC;
> desc = &rx_ring[rx_prev];
> desc->control = 0;
> flush_dcache_range((unsigned long)desc,
> (unsigned long)desc + sizeof(*desc));
>
> /* Update entry information. */
> - rx_next = (rx_next + 1) % NUM_RX_DESC;
> + priv->rx_next = (priv->rx_next + 1) % NUM_RX_DESC;
> }
>
> if (stat & SCB_STATUS_RNR) {
> @@ -724,7 +734,8 @@ static int eepro100_recv(struct eth_device *dev)
>
> /* RX ring cache was already flushed in init_rx_ring() */
> OUTL(priv, phys_to_bus(priv->devno,
> - (u32)&rx_ring[rx_next]), SCB_POINTER);
> + (u32)&rx_ring[priv->rx_next]),
> + SCB_POINTER);
> OUTW(priv, SCB_M | RUC_START, SCB_CMD);
> }
>
> --
> 2.25.1
>
Reviewed-By: Ramon Fried <rfried.dev at gmail.com>
More information about the U-Boot
mailing list