* [PATCH] libertas: Retry frame transmission when driver is busy.
@ 2007-11-04 2:28 Ashish Shukla
2007-11-05 15:20 ` Dan Williams
0 siblings, 1 reply; 2+ messages in thread
From: Ashish Shukla @ 2007-11-04 2:28 UTC (permalink / raw)
To: linux-wireless
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).
Signed-off-by: Javier Cardona <javier@cozybit.com>
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 83d534b..f72ebe2 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -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;
diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
index bc9c2e1..1dc92ee 100644
--- a/drivers/net/wireless/libertas/tx.c
+++ b/drivers/net/wireless/libertas/tx.c
@@ -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;
}
--
1.5.2.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] libertas: Retry frame transmission when driver is busy.
2007-11-04 2:28 [PATCH] libertas: Retry frame transmission when driver is busy Ashish Shukla
@ 2007-11-05 15:20 ` Dan Williams
0 siblings, 0 replies; 2+ messages in thread
From: Dan Williams @ 2007-11-05 15:20 UTC (permalink / raw)
To: Javier Cardona; +Cc: linux-wireless
On Sat, 2007-11-03 at 19:28 -0700, Ashish Shukla wrote:
> 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).
>
> Signed-off-by: Javier Cardona <javier@cozybit.com>
>
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 83d534b..f72ebe2 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -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;
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
> done:
> lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret);
> return ret;
> diff --git a/drivers/net/wireless/libertas/tx.c b/drivers/net/wireless/libertas/tx.c
> index bc9c2e1..1dc92ee 100644
> --- a/drivers/net/wireless/libertas/tx.c
> +++ b/drivers/net/wireless/libertas/tx.c
> @@ -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;
> }
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-11-05 15:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-11-04 2:28 [PATCH] libertas: Retry frame transmission when driver is busy Ashish Shukla
2007-11-05 15:20 ` Dan Williams
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).