diff mbox series

[13/30] net: eepro100: Factor out tx_ring command issuing

Message ID 20200523163837.407592-13-marek.vasut+renesas@gmail.com
State New
Headers show
Series [01/30] net: eepro100: Remove EEPRO100_SROM_WRITE | expand

Commit Message

Marek Vasut May 23, 2020, 4:38 p.m. UTC
This code is replicated in the driver thrice almost verbatim, factor
it out into a separate function and clean it up. No functional change.

Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
---
 drivers/net/eepro100.c | 124 ++++++++++++++++++-----------------------
 1 file changed, 53 insertions(+), 71 deletions(-)

Comments

Ramon Fried May 23, 2020, 5:16 p.m. UTC | #1
On Sat, May 23, 2020 at 7:42 PM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> This code is replicated in the driver thrice almost verbatim, factor
> it out into a separate function and clean it up. No functional change.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> ---
>  drivers/net/eepro100.c | 124 ++++++++++++++++++-----------------------
>  1 file changed, 53 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
> index 6fb9192e81..03ba9a41a5 100644
> --- a/drivers/net/eepro100.c
> +++ b/drivers/net/eepro100.c
> @@ -453,11 +453,44 @@ int eepro100_initialize(bd_t *bis)
>         return card_number;
>  }
>
> +static int eepro100_txcmd_send(struct eth_device *dev,
> +                              struct eepro100_txfd *desc)
> +{
> +       u16 rstat;
> +       int i = 0;
> +
> +       if (!wait_for_eepro100(dev))
> +               return -ETIMEDOUT;
> +
> +       OUTL(dev, phys_to_bus((u32)desc), SCB_POINTER);
> +       OUTW(dev, SCB_M | CU_START, SCB_CMD);
> +
> +       while (true) {
> +               rstat = le16_to_cpu(desc->status);
> +               if (rstat & CONFIG_SYS_STATUS_C)
> +                       break;
> +
> +               if (i++ >= TOUT_LOOP) {
> +                       printf("%s: Tx error buffer not ready\n", dev->name);
> +                       return -EINVAL;
> +               }
> +       }
> +
> +       rstat = le16_to_cpu(desc->status);
> +
> +       if (!(rstat & CONFIG_SYS_STATUS_OK)) {
> +               printf("TX error status = 0x%08X\n", rstat);
> +               return -EIO;
> +       }
> +
> +       return 0;
> +}
> +
>  static int eepro100_init(struct eth_device *dev, bd_t *bis)
>  {
> -       int i, status = -1;
> +       struct eepro100_txfd *ias_cmd, *cfg_cmd;
> +       int ret, status = -1;
>         int tx_cur;
> -       struct descriptor *ias_cmd, *cfg_cmd;
>
>         /* Reset the ethernet controller */
>         OUTL(dev, I82559_SELECTIVE_RESET, SCB_PORT);
> @@ -497,35 +530,19 @@ static int eepro100_init(struct eth_device *dev, bd_t *bis)
>         tx_cur = tx_next;
>         tx_next = ((tx_next + 1) % NUM_TX_DESC);
>
> -       cfg_cmd = (struct descriptor *)&tx_ring[tx_cur];
> +       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((u32)&tx_ring[tx_next]));
>
> -       memcpy(cfg_cmd->params, i82558_config_cmd,
> +       memcpy(((struct descriptor *)cfg_cmd)->params, i82558_config_cmd,
>                sizeof(i82558_config_cmd));
>
> -       if (!wait_for_eepro100(dev)) {
> -               printf("Error---CONFIG_SYS_CMD_CONFIGURE: Can not reset ethernet controller.\n");
> -               goto done;
> -       }
> -
> -       OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
> -       OUTW(dev, SCB_M | CU_START, SCB_CMD);
> -
> -       for (i = 0;
> -            !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
> -            i++) {
> -               if (i >= TOUT_LOOP) {
> -                       printf("%s: Tx error buffer not ready\n", dev->name);
> -                       goto done;
> -               }
> -       }
> -
> -       if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
> -               printf("TX error status = 0x%08X\n",
> -                      le16_to_cpu(tx_ring[tx_cur].status));
> +       ret = eepro100_txcmd_send(dev, cfg_cmd);
> +       if (ret) {
> +               if (ret == -ETIMEDOUT)
> +                       printf("Error---CONFIG_SYS_CMD_CONFIGURE: Can not reset ethernet controller.\n");
>                 goto done;
>         }
>
> @@ -533,36 +550,18 @@ static int eepro100_init(struct eth_device *dev, bd_t *bis)
>         tx_cur = tx_next;
>         tx_next = ((tx_next + 1) % NUM_TX_DESC);
>
> -       ias_cmd = (struct descriptor *)&tx_ring[tx_cur];
> +       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((u32)&tx_ring[tx_next]));
>
> -       memcpy(ias_cmd->params, dev->enetaddr, 6);
> -
> -       /* Tell the adapter where the TX ring is located. */
> -       if (!wait_for_eepro100(dev)) {
> -               printf("Error: Can not reset ethernet controller.\n");
> -               goto done;
> -       }
> -
> -       OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
> -       OUTW(dev, SCB_M | CU_START, SCB_CMD);
> -
> -       for (i = 0;
> -            !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
> -            i++) {
> -               if (i >= TOUT_LOOP) {
> -                       printf("%s: Tx error buffer not ready\n",
> -                              dev->name);
> -                       goto done;
> -               }
> -       }
> +       memcpy(((struct descriptor *)ias_cmd)->params, dev->enetaddr, 6);
>
> -       if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
> -               printf("TX error status = 0x%08X\n",
> -                      le16_to_cpu(tx_ring[tx_cur].status));
> +       ret = eepro100_txcmd_send(dev, ias_cmd);
> +       if (ret) {
> +               if (ret == -ETIMEDOUT)
> +                       printf("Error: Can not reset ethernet controller.\n");
>                 goto done;
>         }
>
> @@ -574,7 +573,7 @@ done:
>
>  static int eepro100_send(struct eth_device *dev, void *packet, int length)
>  {
> -       int i, status = -1;
> +       int ret, status = -1;
>         int tx_cur;
>
>         if (length <= 0) {
> @@ -597,28 +596,11 @@ static int eepro100_send(struct eth_device *dev, void *packet, int length)
>                 cpu_to_le32 (phys_to_bus((u_long)packet));
>         tx_ring[tx_cur].tx_buf_size0 = cpu_to_le32 (length);
>
> -       if (!wait_for_eepro100(dev)) {
> -               printf("%s: Tx error ethernet controller not ready.\n",
> -                      dev->name);
> -               goto done;
> -       }
> -
> -       /* Send the packet. */
> -       OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
> -       OUTW(dev, SCB_M | CU_START, SCB_CMD);
> -
> -       for (i = 0;
> -            !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
> -            i++) {
> -               if (i >= TOUT_LOOP) {
> -                       printf("%s: Tx error buffer not ready\n", dev->name);
> -                       goto done;
> -               }
> -       }
> -
> -       if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
> -               printf("TX error status = 0x%08X\n",
> -                      le16_to_cpu(tx_ring[tx_cur].status));
> +       ret = eepro100_txcmd_send(dev, &tx_ring[tx_cur]);
> +       if (ret) {
> +               if (ret == -ETIMEDOUT)
> +                       printf("%s: Tx error ethernet controller not ready.\n",
> +                              dev->name);
>                 goto done;
>         }
>
> --
> 2.25.1
>
Reviewed-By: Ramon Fried <rfried.dev at gmail.com>
diff mbox series

Patch

diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
index 6fb9192e81..03ba9a41a5 100644
--- a/drivers/net/eepro100.c
+++ b/drivers/net/eepro100.c
@@ -453,11 +453,44 @@  int eepro100_initialize(bd_t *bis)
 	return card_number;
 }
 
+static int eepro100_txcmd_send(struct eth_device *dev,
+			       struct eepro100_txfd *desc)
+{
+	u16 rstat;
+	int i = 0;
+
+	if (!wait_for_eepro100(dev))
+		return -ETIMEDOUT;
+
+	OUTL(dev, phys_to_bus((u32)desc), SCB_POINTER);
+	OUTW(dev, SCB_M | CU_START, SCB_CMD);
+
+	while (true) {
+		rstat = le16_to_cpu(desc->status);
+		if (rstat & CONFIG_SYS_STATUS_C)
+			break;
+
+		if (i++ >= TOUT_LOOP) {
+			printf("%s: Tx error buffer not ready\n", dev->name);
+			return -EINVAL;
+		}
+	}
+
+	rstat = le16_to_cpu(desc->status);
+
+	if (!(rstat & CONFIG_SYS_STATUS_OK)) {
+		printf("TX error status = 0x%08X\n", rstat);
+		return -EIO;
+	}
+
+	return 0;
+}
+
 static int eepro100_init(struct eth_device *dev, bd_t *bis)
 {
-	int i, status = -1;
+	struct eepro100_txfd *ias_cmd, *cfg_cmd;
+	int ret, status = -1;
 	int tx_cur;
-	struct descriptor *ias_cmd, *cfg_cmd;
 
 	/* Reset the ethernet controller */
 	OUTL(dev, I82559_SELECTIVE_RESET, SCB_PORT);
@@ -497,35 +530,19 @@  static int eepro100_init(struct eth_device *dev, bd_t *bis)
 	tx_cur = tx_next;
 	tx_next = ((tx_next + 1) % NUM_TX_DESC);
 
-	cfg_cmd = (struct descriptor *)&tx_ring[tx_cur];
+	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((u32)&tx_ring[tx_next]));
 
-	memcpy(cfg_cmd->params, i82558_config_cmd,
+	memcpy(((struct descriptor *)cfg_cmd)->params, i82558_config_cmd,
 	       sizeof(i82558_config_cmd));
 
-	if (!wait_for_eepro100(dev)) {
-		printf("Error---CONFIG_SYS_CMD_CONFIGURE: Can not reset ethernet controller.\n");
-		goto done;
-	}
-
-	OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
-	OUTW(dev, SCB_M | CU_START, SCB_CMD);
-
-	for (i = 0;
-	     !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
-	     i++) {
-		if (i >= TOUT_LOOP) {
-			printf("%s: Tx error buffer not ready\n", dev->name);
-			goto done;
-		}
-	}
-
-	if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
-		printf("TX error status = 0x%08X\n",
-		       le16_to_cpu(tx_ring[tx_cur].status));
+	ret = eepro100_txcmd_send(dev, cfg_cmd);
+	if (ret) {
+		if (ret == -ETIMEDOUT)
+			printf("Error---CONFIG_SYS_CMD_CONFIGURE: Can not reset ethernet controller.\n");
 		goto done;
 	}
 
@@ -533,36 +550,18 @@  static int eepro100_init(struct eth_device *dev, bd_t *bis)
 	tx_cur = tx_next;
 	tx_next = ((tx_next + 1) % NUM_TX_DESC);
 
-	ias_cmd = (struct descriptor *)&tx_ring[tx_cur];
+	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((u32)&tx_ring[tx_next]));
 
-	memcpy(ias_cmd->params, dev->enetaddr, 6);
-
-	/* Tell the adapter where the TX ring is located. */
-	if (!wait_for_eepro100(dev)) {
-		printf("Error: Can not reset ethernet controller.\n");
-		goto done;
-	}
-
-	OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
-	OUTW(dev, SCB_M | CU_START, SCB_CMD);
-
-	for (i = 0;
-	     !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
-	     i++) {
-		if (i >= TOUT_LOOP) {
-			printf("%s: Tx error buffer not ready\n",
-			       dev->name);
-			goto done;
-		}
-	}
+	memcpy(((struct descriptor *)ias_cmd)->params, dev->enetaddr, 6);
 
-	if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
-		printf("TX error status = 0x%08X\n",
-		       le16_to_cpu(tx_ring[tx_cur].status));
+	ret = eepro100_txcmd_send(dev, ias_cmd);
+	if (ret) {
+		if (ret == -ETIMEDOUT)
+			printf("Error: Can not reset ethernet controller.\n");
 		goto done;
 	}
 
@@ -574,7 +573,7 @@  done:
 
 static int eepro100_send(struct eth_device *dev, void *packet, int length)
 {
-	int i, status = -1;
+	int ret, status = -1;
 	int tx_cur;
 
 	if (length <= 0) {
@@ -597,28 +596,11 @@  static int eepro100_send(struct eth_device *dev, void *packet, int length)
 		cpu_to_le32 (phys_to_bus((u_long)packet));
 	tx_ring[tx_cur].tx_buf_size0 = cpu_to_le32 (length);
 
-	if (!wait_for_eepro100(dev)) {
-		printf("%s: Tx error ethernet controller not ready.\n",
-		       dev->name);
-		goto done;
-	}
-
-	/* Send the packet. */
-	OUTL(dev, phys_to_bus((u32)&tx_ring[tx_cur]), SCB_POINTER);
-	OUTW(dev, SCB_M | CU_START, SCB_CMD);
-
-	for (i = 0;
-	     !(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_C);
-	     i++) {
-		if (i >= TOUT_LOOP) {
-			printf("%s: Tx error buffer not ready\n", dev->name);
-			goto done;
-		}
-	}
-
-	if (!(le16_to_cpu(tx_ring[tx_cur].status) & CONFIG_SYS_STATUS_OK)) {
-		printf("TX error status = 0x%08X\n",
-		       le16_to_cpu(tx_ring[tx_cur].status));
+	ret = eepro100_txcmd_send(dev, &tx_ring[tx_cur]);
+	if (ret) {
+		if (ret == -ETIMEDOUT)
+			printf("%s: Tx error ethernet controller not ready.\n",
+			       dev->name);
 		goto done;
 	}