As TODO file suggested, drop packet instead of return NETDEV_TX_BUSY
when tx failed.

et131x_tx calls function et131x_send_packets, I put the work of
et131x_send_packets directly into et131x_tx, and made some changes to
let the code more readable.

Signed-off-by: ZHAO Gang <gamer...@gmail.com>
---
 drivers/staging/et131x/et131x.c | 84 +++++++++++------------------------------
 1 file changed, 22 insertions(+), 62 deletions(-)

diff --git a/drivers/staging/et131x/et131x.c b/drivers/staging/et131x/et131x.c
index f4ab56a..6441e25 100644
--- a/drivers/staging/et131x/et131x.c
+++ b/drivers/staging/et131x/et131x.c
@@ -3128,55 +3128,6 @@ static int send_packet(struct sk_buff *skb, struct 
et131x_adapter *adapter)
        return 0;
 }
 
-/* et131x_send_packets - This function is called by the OS to send packets
- * @skb: the packet(s) to send
- * @netdev:device on which to TX the above packet(s)
- *
- * Return 0 in almost all cases; non-zero value in extreme hard failure only
- */
-static int et131x_send_packets(struct sk_buff *skb, struct net_device *netdev)
-{
-       int status = 0;
-       struct et131x_adapter *adapter = netdev_priv(netdev);
-
-       /* Send these packets
-        *
-        * NOTE: The Linux Tx entry point is only given one packet at a time
-        * to Tx, so the PacketCount and it's array used makes no sense here
-        */
-
-       /* TCB is not available */
-       if (adapter->tx_ring.used >= NUM_TCB) {
-               /* NOTE: If there's an error on send, no need to queue the
-                * packet under Linux; if we just send an error up to the
-                * netif layer, it will resend the skb to us.
-                */
-               status = -ENOMEM;
-       } else {
-               /* We need to see if the link is up; if it's not, make the
-                * netif layer think we're good and drop the packet
-                */
-               if ((adapter->flags & FMP_ADAPTER_FAIL_SEND_MASK) ||
-                                       !netif_carrier_ok(netdev)) {
-                       dev_kfree_skb_any(skb);
-                       skb = NULL;
-
-                       adapter->net_stats.tx_dropped++;
-               } else {
-                       status = send_packet(skb, adapter);
-                       if (status != 0 && status != -ENOMEM) {
-                               /* On any other error, make netif think we're
-                                * OK and drop the packet
-                                */
-                               dev_kfree_skb_any(skb);
-                               skb = NULL;
-                               adapter->net_stats.tx_dropped++;
-                       }
-               }
-       }
-       return status;
-}
-
 /* free_send_packet - Recycle a struct tcb
  * @adapter: pointer to our adapter
  * @tcb: pointer to struct tcb
@@ -4534,10 +4485,8 @@ static void et131x_multicast(struct net_device *netdev)
 /* et131x_tx - The handler to tx a packet on the device
  * @skb: data to be Tx'd
  * @netdev: device on which data is to be Tx'd
- *
- * Returns 0 on success, errno on failure (as defined in errno.h)
  */
-static int et131x_tx(struct sk_buff *skb, struct net_device *netdev)
+static netdev_tx_t et131x_tx(struct sk_buff *skb, struct net_device *netdev)
 {
        int status = 0;
        struct et131x_adapter *adapter = netdev_priv(netdev);
@@ -4550,17 +4499,28 @@ static int et131x_tx(struct sk_buff *skb, struct 
net_device *netdev)
        /* Save the timestamp for the TX timeout watchdog */
        netdev->trans_start = jiffies;
 
-       /* Call the device-specific data Tx routine */
-       status = et131x_send_packets(skb, netdev);
+       /* TCB is not available */
+       if (adapter->tx_ring.used >= NUM_TCB)
+               goto drop;
 
-       /* Check status and manage the netif queue if necessary */
-       if (status != 0) {
-               if (status == -ENOMEM)
-                       status = NETDEV_TX_BUSY;
-               else
-                       status = NETDEV_TX_OK;
-       }
-       return status;
+       /* We need to see if the link is up; if it's not, make the
+        * netif layer think we're good and drop the packet
+        */
+       if ((adapter->flags & FMP_ADAPTER_FAIL_SEND_MASK) ||
+           !netif_carrier_ok(netdev))
+               goto drop;
+
+       status = send_packet(skb, adapter);
+       if (status)
+               goto drop;
+
+       return NETDEV_TX_OK;
+
+drop:
+       dev_kfree_skb_any(skb);
+       adapter->net_stats.tx_dropped++;
+       /* return success to make netif layer happy */
+       return NETDEV_TX_OK;
 }
 
 /* et131x_tx_timeout - Timeout handler
-- 
1.8.3.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to