On Thu, Aug 16, 2018 at 12:31:07PM +0200, Stanislaw Gruszka wrote:
> I prepared a patch that count EPROTO errors and if it's bigger
> than 10 mark device as gone. It should not make a problem
> when we will get one time random error.  I'm attaching it,
> please test.

Forgot to compile the patch, here is one that compiles.

Cheers
Stanislaw
diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c 
b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c
index 086aad2..60b8bcc 100644
--- 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)
+               rt2x00dev->num_proto_errs++;
+       else
+               rt2x00dev->num_proto_errs = 0;
+
+       if (rt2x00dev->num_proto_errs > 10)
+               return true;
+
+       return false;
+}
+
 /*
  * Interfacing with the HW.
  */
@@ -57,7 +73,7 @@ int rt2x00usb_vendor_request(struct rt2x00_dev *rt2x00dev,
                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(struct queue_entry 
*entry, void *data)
 
        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(struct queue_entry 
*entry, void *data)
 
        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);

Reply via email to