[rt2x00-users] [PATCH 7/7] rt2x00: Fix URB error handling

Helmut Schaa helmut.schaa at googlemail.com
Mon Oct 11 07:15:39 UTC 2010


Am Sonntag 10 Oktober 2010 schrieb Ivo van Doorn:
> kill_urb guarentees that when the function returns, the URB has
> been fully killed. This means we don't need the extra sleeping
> after the call to kill_urb.
> 
> kill_urb can however also guarentee the submit_urb to fail, as
> a result, we must catch the return value from submit_urb an
> correctly mark the entry as owned by the driver, and the
> status as broken.
> 
> Signed-off-by: Ivo van Doorn <IvDoorn at gmail.com>

I cannot give you a qualified comment on that one as I'm not familiar
enough with the rt2x00 USB code ...

Helmut

> ---
>  drivers/net/wireless/rt2x00/rt2x00dev.c |    1 +
>  drivers/net/wireless/rt2x00/rt2x00usb.c |   18 ++++++++----------
>  2 files changed, 9 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c
> index e5e8ba3..5ba79b9 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
> @@ -253,6 +253,7 @@ EXPORT_SYMBOL_GPL(rt2x00lib_pretbtt);
>  
>  void rt2x00lib_dmadone(struct queue_entry *entry)
>  {
> +	clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
>  	rt2x00queue_index_inc(entry->queue, Q_INDEX_DMA_DONE);
>  }
>  EXPORT_SYMBOL_GPL(rt2x00lib_dmadone);
> diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c
> index 89d77f5..b3317df 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c
> @@ -253,7 +253,10 @@ static void rt2x00usb_kick_tx_entry(struct queue_entry *entry)
>  			  entry->skb->data, length,
>  			  rt2x00usb_interrupt_txdone, entry);
>  
> -	usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
> +	if (usb_submit_urb(entry_priv->urb, GFP_ATOMIC)) {
> +		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
> +		rt2x00lib_dmadone(entry);
> +	}
>  }
>  
>  void rt2x00usb_kick_tx_queue(struct data_queue *queue)
> @@ -280,14 +283,6 @@ static void rt2x00usb_kill_tx_entry(struct queue_entry *entry)
>  	if ((entry->queue->qid == QID_BEACON) &&
>  	    (test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags)))
>  		usb_kill_urb(bcn_priv->guardian_urb);
> -
> -	/*
> -	 * We need a short delay here to wait for
> -	 * the URB to be canceled
> -	 */
> -	do {
> -		udelay(100);
> -	} while (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags));
>  }
>  
>  void rt2x00usb_kill_tx_queue(struct data_queue *queue)
> @@ -469,7 +464,10 @@ void rt2x00usb_clear_entry(struct queue_entry *entry)
>  				rt2x00usb_interrupt_rxdone, entry);
>  
>  		set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags);
> -		usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
> +		if (usb_submit_urb(entry_priv->urb, GFP_ATOMIC)) {
> +			set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
> +			rt2x00lib_dmadone(entry);
> +		}
>  	}
>  }
>  EXPORT_SYMBOL_GPL(rt2x00usb_clear_entry);
> 




More information about the users mailing list