libertas: Retry frame transmission when driver is busy.
PATCH 1/1 libertas: Retry frame transmission when driver is busy.
The driver silently discards frames when some command is pending -- returns NETDEV_TX_OK to kernel. The following patch fixes this problem. This significantly improves file transfers while scanning (ticket #3341).
drivers/net/wireless/libertas/main.c +10 -7
@@ -509,22 +509,25 @@ static int libertas_close(struct net_device *dev)static int libertas_hard_start_xmit (struct sk_buff *skb,struct net_device *dev) { -int ret =0 ; +int ret =NETDEV_TX_OK ;wlan_private *priv = dev->priv;lbs_deb_enter (LBS_DEB_NET ); -if (priv->dnld_sent || priv->adapter->TxLockFlag) { - priv->stats.tx_dropped++; - goto done; - } -netif_stop_queue (priv->dev);if (priv->mesh_dev)netif_stop_queue (priv->mesh_dev); -if (libertas_process_tx (priv, skb) ==0 ) +if (priv->dnld_sent || priv->adapter->TxLockFlag) { + ret =NETDEV_TX_BUSY ; + goto done; + } + + ret =libertas_process_tx (priv, skb); +if (ret ==NETDEV_TX_OK ) dev->trans_start = jiffies; +else if (ret ==-1 ) + ret =NETDEV_TX_OK ; done:lbs_deb_leave_args (LBS_DEB_NET ,"ret %d" , ret);return ret;
drivers/net/wireless/libertas/tx.c +1 -0
@@ -218,6 +218,7 @@ int libertas_process_tx(wlan_private * priv, struct sk_buff *skb)if (priv->dnld_sent) {lbs_pr_alert ("TX error: dnld_sent = %d, not sending\n" , priv->dnld_sent); + ret =NETDEV_TX_BUSY ; goto done; }
Signature · 1 line
1.5.2.4
Quoted 30 lines · Ashish Shukla
The driver silently discards frames when some command is pending -- returns
NETDEV_TX_OKto kernel. The following patch fixes this problem. This significantly improves file transfers while scanning (ticket #3341).Signed-off-by Javier Cardona <[email protected]>drivers/net/wireless/libertas/main.c +1
-7@@ -509,22 +509,25 @@ static int libertas_close(struct net_device *dev)static int libertas_hard_start_xmit (struct sk_buff *skb,struct net_device *dev) { -int ret =0 ; +int ret =NETDEV_TX_OK ;wlan_private *priv = dev->priv;lbs_deb_enter (LBS_DEB_NET ); -if (priv->dnld_sent || priv->adapter->TxLockFlag) { - priv->stats.tx_dropped++; - goto done; - } -netif_stop_queue (priv->dev);if (priv->mesh_dev)netif_stop_queue (priv->mesh_dev); -if (libertas_process_tx (priv, skb) ==0 )
drivers/net/wireless/libertas/main.c static int libertas_close(struct net_device *dev) · line 530
Quoted 10 lines
drivers/net/wireless/libertas/main.c +9
-0+if (priv->dnld_sent || priv->adapter->TxLockFlag) { + ret =NETDEV_TX_BUSY ; + goto done; + } + + ret =libertas_process_tx (priv, skb); +if (ret ==NETDEV_TX_OK ) dev->trans_start = jiffies; +else if (ret ==-1 ) + ret =NETDEV_TX_OK ;
The one concern I have here (and I admit I don't know much about network driver TX paths) is that SendSinglePacket() will return -1 on error (like adapter got removed), which returns to libertas_process_tx() which returns here and would then return NETDEV_TX_OK. Is that an OK thing to do?
Dan
Quoted 15 lines
drivers/net/wireless/libertas/main.c +0
-0done:lbs_deb_leave_args (LBS_DEB_NET ,"ret %d" , ret);return ret;drivers/net/wireless/libertas/tx.c +1
-0@@ -218,6 +218,7 @@ int libertas_process_tx(wlan_private * priv, struct sk_buff *skb)if (priv->dnld_sent) {lbs_pr_alert ("TX error: dnld_sent = %d, not sending\n" , priv->dnld_sent); + ret =NETDEV_TX_BUSY ; goto done; }