mirror of
https://abf.rosa.ru/djam/kernel-5.13.git
synced 2025-02-25 16:12:50 +00:00
56 lines
1.9 KiB
Diff
56 lines
1.9 KiB
Diff
From 575ddce0507789bf9830d089557d2199d2f91865 Mon Sep 17 00:00:00 2001
|
|
From: Michael Schenk <michael.schenk@albis-elcon.com>
|
|
Date: Thu, 26 Jan 2017 11:25:04 -0600
|
|
Subject: rtlwifi: rtl_usb: Fix for URB leaking when doing ifconfig up/down
|
|
|
|
From: Michael Schenk <michael.schenk@albis-elcon.com>
|
|
|
|
commit 575ddce0507789bf9830d089557d2199d2f91865 upstream.
|
|
|
|
In the function rtl_usb_start we pre-allocate a certain number of urbs
|
|
for RX path but they will not be freed when calling rtl_usb_stop. This
|
|
results in leaking urbs when doing ifconfig up and down. Eventually,
|
|
the system has no available urbs.
|
|
|
|
Signed-off-by: Michael Schenk <michael.schenk@albis-elcon.com>
|
|
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
|
|
---
|
|
drivers/net/wireless/realtek/rtlwifi/usb.c | 18 ++++++++++++++++++
|
|
1 file changed, 18 insertions(+)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtlwifi/usb.c
|
|
+++ b/drivers/net/wireless/realtek/rtlwifi/usb.c
|
|
@@ -831,12 +831,30 @@ static void rtl_usb_stop(struct ieee8021
|
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
|
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
|
struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
|
|
+ struct urb *urb;
|
|
|
|
/* should after adapter start and interrupt enable. */
|
|
set_hal_stop(rtlhal);
|
|
cancel_work_sync(&rtlpriv->works.fill_h2c_cmd);
|
|
/* Enable software */
|
|
SET_USB_STOP(rtlusb);
|
|
+
|
|
+ /* free pre-allocated URBs from rtl_usb_start() */
|
|
+ usb_kill_anchored_urbs(&rtlusb->rx_submitted);
|
|
+
|
|
+ tasklet_kill(&rtlusb->rx_work_tasklet);
|
|
+ cancel_work_sync(&rtlpriv->works.lps_change_work);
|
|
+
|
|
+ flush_workqueue(rtlpriv->works.rtl_wq);
|
|
+
|
|
+ skb_queue_purge(&rtlusb->rx_queue);
|
|
+
|
|
+ while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {
|
|
+ usb_free_coherent(urb->dev, urb->transfer_buffer_length,
|
|
+ urb->transfer_buffer, urb->transfer_dma);
|
|
+ usb_free_urb(urb);
|
|
+ }
|
|
+
|
|
rtlpriv->cfg->ops->hw_disable(hw);
|
|
}
|
|
|