ret = usb_submit_urb(urb, GFP_KERNEL);
        if (ret) {
                usb_unanchor_urb(urb);
-               usb_free_urb(urb);
                goto error;
        }
 
        rtl8xxxu_write32(priv, REG_USB_HIMR, val32);
 
 error:
+       usb_free_urb(urb);
        return ret;
 }
 
        struct rtl8xxxu_priv *priv = hw->priv;
        struct rtl8xxxu_rx_urb *rx_urb;
        struct rtl8xxxu_tx_urb *tx_urb;
+       struct sk_buff *skb;
        unsigned long flags;
        int ret, i;
 
                rx_urb->hw = hw;
 
                ret = rtl8xxxu_submit_rx_urb(priv, rx_urb);
+               if (ret) {
+                       if (ret != -ENOMEM) {
+                               skb = (struct sk_buff *)rx_urb->urb.context;
+                               dev_kfree_skb(skb);
+                       }
+                       rtl8xxxu_queue_rx_urb(priv, rx_urb);
+               }
        }
 exit:
        /*