mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Imported from patchwork, patches marked with '=' have already been in our tree: [v3,1/4] cfg80211: add ratelimited variants of err and warn [v3,2/4] rt2x00: use ratelimited variants dev_warn/dev_err [v3,3/4] rt2x00: check number of EPROTO errors =[v3,4/4] rt2x00: do not print error when queue is full Signed-off-by: Daniel Golle <daniel@makrotopia.org>
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From patchwork Tue Mar 12 09:51:42 2019
 | |
| Content-Type: text/plain; charset="utf-8"
 | |
| MIME-Version: 1.0
 | |
| Content-Transfer-Encoding: 7bit
 | |
| X-Patchwork-Submitter: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| X-Patchwork-Id: 10848961
 | |
| X-Patchwork-Delegate: kvalo@adurom.com
 | |
| From: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| To: linux-wireless@vger.kernel.org
 | |
| Cc: =?utf-8?q?Tomislav_Po=C5=BEega?= <pozega.tomislav@gmail.com>,
 | |
|  Daniel Golle <daniel@makrotopia.org>, Felix Fietkau <nbd@nbd.name>,
 | |
|  Mathias Kresin <dev@kresin.me>
 | |
| Subject: [PATCH v3 3/4] rt2x00: check number of EPROTO errors
 | |
| Date: Tue, 12 Mar 2019 10:51:42 +0100
 | |
| Message-Id: <1552384303-29529-4-git-send-email-sgruszka@redhat.com>
 | |
| In-Reply-To: <1552384303-29529-1-git-send-email-sgruszka@redhat.com>
 | |
| References: <1552384303-29529-1-git-send-email-sgruszka@redhat.com>
 | |
| 
 | |
| Some USB host devices/drivers on some conditions can always return
 | |
| EPROTO error on submitted URBs. That can cause infinity loop in the
 | |
| rt2x00 driver.
 | |
| 
 | |
| Since we can have single EPROTO errors we can not mark as device as
 | |
| removed to avoid infinity loop. However we can count consecutive
 | |
| EPROTO errors and mark device as removed if get lot of it.
 | |
| I choose number 10 as threshold.
 | |
| 
 | |
| Reported-and-tested-by: Randy Oostdyk <linux-kernel@oostdyk.com>
 | |
| Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
 | |
| ---
 | |
|  drivers/net/wireless/ralink/rt2x00/rt2x00.h    |  1 +
 | |
|  drivers/net/wireless/ralink/rt2x00/rt2x00usb.c | 22 +++++++++++++++++++---
 | |
|  2 files changed, 20 insertions(+), 3 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | |
| +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00.h
 | |
| @@ -1017,6 +1017,7 @@ struct rt2x00_dev {
 | |
|  	unsigned int extra_tx_headroom;
 | |
|  
 | |
|  	struct usb_anchor *anchor;
 | |
| +	unsigned int num_proto_errs;
 | |
|  
 | |
|  	/* Clock for System On Chip devices. */
 | |
|  	struct clk *clk;
 | |
| --- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
 | |
| +++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
 | |
| @@ -31,6 +31,22 @@
 | |
|  #include "rt2x00.h"
 | |
|  #include "rt2x00usb.h"
 | |
|  
 | |
| +static bool rt2x00usb_check_usb_error(struct rt2x00_dev *rt2x00dev, int status)
 | |
| +{
 | |
| +	if (status == -ENODEV || status == -ENOENT)
 | |
| +		return true;
 | |
| +
 | |
| +	if (status == -EPROTO || status == -ETIMEDOUT)
 | |
| +		rt2x00dev->num_proto_errs++;
 | |
| +	else
 | |
| +		rt2x00dev->num_proto_errs = 0;
 | |
| +
 | |
| +	if (rt2x00dev->num_proto_errs > 3)
 | |
| +		return true;
 | |
| +
 | |
| +	return false;
 | |
| +}
 | |
| +
 | |
|  /*
 | |
|   * Interfacing with the HW.
 | |
|   */
 | |
| @@ -57,7 +73,7 @@ int rt2x00usb_vendor_request(struct rt2x
 | |
|  		if (status >= 0)
 | |
|  			return 0;
 | |
|  
 | |
| -		if (status == -ENODEV || status == -ENOENT) {
 | |
| +		if (rt2x00usb_check_usb_error(rt2x00dev, status)) {
 | |
|  			/* Device has disappeared. */
 | |
|  			clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
 | |
|  			break;
 | |
| @@ -321,7 +337,7 @@ static bool rt2x00usb_kick_tx_entry(stru
 | |
|  
 | |
|  	status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
 | |
|  	if (status) {
 | |
| -		if (status == -ENODEV || status == -ENOENT)
 | |
| +		if (rt2x00usb_check_usb_error(rt2x00dev, status))
 | |
|  			clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
 | |
|  		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
 | |
|  		rt2x00lib_dmadone(entry);
 | |
| @@ -410,7 +426,7 @@ static bool rt2x00usb_kick_rx_entry(stru
 | |
|  
 | |
|  	status = usb_submit_urb(entry_priv->urb, GFP_ATOMIC);
 | |
|  	if (status) {
 | |
| -		if (status == -ENODEV || status == -ENOENT)
 | |
| +		if (rt2x00usb_check_usb_error(rt2x00dev, status))
 | |
|  			clear_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags);
 | |
|  		set_bit(ENTRY_DATA_IO_FAILED, &entry->flags);
 | |
|  		rt2x00lib_dmadone(entry);
 |