Commit 851639fd authored by Taehee Yoo's avatar Taehee Yoo Committed by Kalle Valo
Browse files

rtlwifi: Modify some USB de-initialize code.



Delete SET_USB_STOP macro and rtl_usb_deinit because
those are called twice in USB de-initialize routine.
Add some de-initialize workqueue function in USB disconnect routine.

Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 0088d27b
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -701,12 +701,18 @@ static void _rtl_rx_completed(struct urb *_urb)


static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw)
static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw)
{
{
	struct rtl_priv *rtlpriv = rtl_priv(hw);
	struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
	struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
	struct urb *urb;
	struct urb *urb;


	usb_kill_anchored_urbs(&rtlusb->rx_submitted);
	usb_kill_anchored_urbs(&rtlusb->rx_submitted);


	tasklet_kill(&rtlusb->rx_work_tasklet);
	tasklet_kill(&rtlusb->rx_work_tasklet);
	cancel_work_sync(&rtlpriv->works.lps_change_work);

	flush_workqueue(rtlpriv->works.rtl_wq);
	destroy_workqueue(rtlpriv->works.rtl_wq);

	skb_queue_purge(&rtlusb->rx_queue);
	skb_queue_purge(&rtlusb->rx_queue);


	while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {
	while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {
@@ -794,8 +800,6 @@ static void rtl_usb_cleanup(struct ieee80211_hw *hw)
	struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
	struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
	struct ieee80211_tx_info *txinfo;
	struct ieee80211_tx_info *txinfo;


	SET_USB_STOP(rtlusb);

	/* clean up rx stuff. */
	/* clean up rx stuff. */
	_rtl_usb_cleanup_rx(hw);
	_rtl_usb_cleanup_rx(hw);


@@ -834,7 +838,6 @@ static void rtl_usb_stop(struct ieee80211_hw *hw)
	cancel_work_sync(&rtlpriv->works.fill_h2c_cmd);
	cancel_work_sync(&rtlpriv->works.fill_h2c_cmd);
	/* Enable software */
	/* Enable software */
	SET_USB_STOP(rtlusb);
	SET_USB_STOP(rtlusb);
	rtl_usb_deinit(hw);
	rtlpriv->cfg->ops->hw_disable(hw);
	rtlpriv->cfg->ops->hw_disable(hw);
}
}


@@ -1147,9 +1150,9 @@ void rtl_usb_disconnect(struct usb_interface *intf)


	if (unlikely(!rtlpriv))
	if (unlikely(!rtlpriv))
		return;
		return;

	/* just in case driver is removed before firmware callback */
	/* just in case driver is removed before firmware callback */
	wait_for_completion(&rtlpriv->firmware_loading_complete);
	wait_for_completion(&rtlpriv->firmware_loading_complete);
	clear_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
	/*ieee80211_unregister_hw will call ops_stop */
	/*ieee80211_unregister_hw will call ops_stop */
	if (rtlmac->mac80211_registered == 1) {
	if (rtlmac->mac80211_registered == 1) {
		ieee80211_unregister_hw(hw);
		ieee80211_unregister_hw(hw);