2006-01-04 04:15:15

by Zhu Yi

[permalink] [raw]
Subject: [PATCH] ipw2200: Fix NETDEV_TX_BUSY erroneous returned


This patch fixes the warning below warning for the ipw2200 driver.

NETDEV_TX_BUSY returned; driver should report queue full via
ieee_device->is_queue_full.

Signed-off-by: Hong Liu <[email protected]>
Signed-off-by: Zhu Yi <[email protected]>
--

diff -urp linux.orig/drivers/net/wireless/ipw2200.c linux/drivers/net/wireless/ipw2200.c
--- linux.orig/drivers/net/wireless/ipw2200.c 2005-10-21 05:35:24.000000000 +0800
+++ linux/drivers/net/wireless/ipw2200.c 2005-10-25 13:22:38.000000000
+0800
@@ -9649,11 +9649,6 @@ static inline int ipw_tx_skb(struct ipw_
u16 remaining_bytes;
int fc;

- /* If there isn't room in the queue, we return busy and let the
- * network stack requeue the packet for us */
- if (ipw_queue_space(q) < q->high_mark)
- return NETDEV_TX_BUSY;
-
switch (priv->ieee->iw_mode) {
case IW_MODE_ADHOC:
hdr_len = IEEE80211_3ADDR_LEN;
@@ -9871,7 +9866,7 @@ static int ipw_net_hard_start_xmit(struc

fail_unlock:
spin_unlock_irqrestore(&priv->lock, flags);
- return 1;
+ return -1;
}

static struct net_device_stats *ipw_net_get_stats(struct net_device *dev)


2006-01-04 17:58:13

by Stephen Hemminger

[permalink] [raw]
Subject: Re: [PATCH] ipw2200: Fix NETDEV_TX_BUSY erroneous returned

On Wed, 4 Jan 2006 12:09:54 +0800
Zhu Yi <[email protected]> wrote:

>
> This patch fixes the warning below warning for the ipw2200 driver.
>
> NETDEV_TX_BUSY returned; driver should report queue full via
> ieee_device->is_queue_full.
>
> Signed-off-by: Hong Liu <[email protected]>
> Signed-off-by: Zhu Yi <[email protected]>
> --
>
> diff -urp linux.orig/drivers/net/wireless/ipw2200.c linux/drivers/net/wireless/ipw2200.c
> --- linux.orig/drivers/net/wireless/ipw2200.c 2005-10-21 05:35:24.000000000 +0800
> +++ linux/drivers/net/wireless/ipw2200.c 2005-10-25 13:22:38.000000000
> +0800
> @@ -9649,11 +9649,6 @@ static inline int ipw_tx_skb(struct ipw_
> u16 remaining_bytes;
> int fc;
>
> - /* If there isn't room in the queue, we return busy and let the
> - * network stack requeue the packet for us */
> - if (ipw_queue_space(q) < q->high_mark)
> - return NETDEV_TX_BUSY;
> -
> switch (priv->ieee->iw_mode) {
> case IW_MODE_ADHOC:
> hdr_len = IEEE80211_3ADDR_LEN;
> @@ -9871,7 +9866,7 @@ static int ipw_net_hard_start_xmit(struc
>
> fail_unlock:
> spin_unlock_irqrestore(&priv->lock, flags);
> - return 1;
> + return -1;

That's not right... -1 is NETDEV_TX_LOCKED, which is not what you want.
Also, please use NETDEV_TX_ values for return values from transmit routine.

You should post this to [email protected] and [email protected]
for discussion there.
--
Stephen Hemminger <[email protected]>
OSDL http://developer.osdl.org/~shemminger

2006-01-04 23:56:57

by Francois Romieu

[permalink] [raw]
Subject: Re: [PATCH] ipw2200: Fix NETDEV_TX_BUSY erroneous returned

Zhu Yi <[email protected]> :
>
> This patch fixes the warning below warning for the ipw2200 driver.
>
> NETDEV_TX_BUSY returned; driver should report queue full via
> ieee_device->is_queue_full.

Beyond what was said by Stephen Hemminger, the driver reports a
NETDEV_TX_BUSY when !STATUS_ASSOCIATED: neither this patch nor mine
fix it.

Btw the patch that I posted earlier forgets to protect against
every undue wake-up through:

ipw_rx
-> ipw_rx_notification
-> priv->link_up (work_queue)
-> ipw_bg_link_up
-> ipw_link_up

It will need some extra care to correctly play the
netif_{stop/wake}_queue dance.

--
Ueimor