When PCIe FLR code was added, it explicitly copy-and-pasted much of
mwifiex_remove_card() into mwifiex_shutdown_sw(). This is unnecessary,
as almost all of the code should be reused.

Let's reunite what we can for now.

The only functional changes for now:

 * call netif_device_detach() in the remove() code path -- this wasn't
   done before, but it really should be a no-op, when the device is
   getting totally unregistered soon anyway

 * call the ->down_dev() driver callback only after we've finished all
   SW teardown -- this should have no significant effect, since the only
   user (pcie.c) does very minimal work there, and it doesn't matter
   that we reorder this

Signed-off-by: Brian Norris <briannor...@chromium.org>
---
 drivers/net/wireless/marvell/mwifiex/main.c | 104 ++++++++--------------------
 1 file changed, 28 insertions(+), 76 deletions(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/main.c 
b/drivers/net/wireless/marvell/mwifiex/main.c
index dd87b9ff64c3..a1e98e36c1ce 100644
--- a/drivers/net/wireless/marvell/mwifiex/main.c
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
@@ -1348,26 +1348,12 @@ static void mwifiex_main_work_queue(struct work_struct 
*work)
        mwifiex_main_process(adapter);
 }
 
-/*
- * This function gets called during PCIe function level reset. Required
- * code is extracted from mwifiex_remove_card()
- */
-int
-mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
+/* Common teardown code used for both device removal and reset */
+static void mwifiex_uninit_sw(struct mwifiex_adapter *adapter)
 {
        struct mwifiex_private *priv;
        int i;
 
-       if (!adapter)
-               goto exit_return;
-
-       wait_for_completion(adapter->fw_done);
-       /* Caller should ensure we aren't suspending while this happens */
-       reinit_completion(adapter->fw_done);
-
-       priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
-       mwifiex_deauthenticate(priv, NULL);
-
        /* We can no longer handle interrupts once we start doing the teardown
         * below.
         */
@@ -1389,12 +1375,9 @@ mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
        }
 
        mwifiex_dbg(adapter, CMD, "cmd: calling mwifiex_shutdown_drv...\n");
-
        mwifiex_shutdown_drv(adapter);
-       if (adapter->if_ops.down_dev)
-               adapter->if_ops.down_dev(adapter);
-
        mwifiex_dbg(adapter, CMD, "cmd: mwifiex_shutdown_drv done\n");
+
        if (atomic_read(&adapter->rx_pending) ||
            atomic_read(&adapter->tx_pending) ||
            atomic_read(&adapter->cmd_pending)) {
@@ -1417,9 +1400,30 @@ mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
                rtnl_unlock();
        }
        vfree(adapter->chan_stats);
+}
+
+/*
+ * This function gets called during PCIe function level reset.
+ */
+int mwifiex_shutdown_sw(struct mwifiex_adapter *adapter)
+{
+       struct mwifiex_private *priv;
+
+       if (!adapter)
+               return 0;
+
+       wait_for_completion(adapter->fw_done);
+       /* Caller should ensure we aren't suspending while this happens */
+       reinit_completion(adapter->fw_done);
+
+       priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
+       mwifiex_deauthenticate(priv, NULL);
+
+       mwifiex_uninit_sw(adapter);
+
+       if (adapter->if_ops.down_dev)
+               adapter->if_ops.down_dev(adapter);
 
-       mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
-exit_return:
        return 0;
 }
 EXPORT_SYMBOL_GPL(mwifiex_shutdown_sw);
@@ -1672,61 +1676,10 @@ EXPORT_SYMBOL_GPL(mwifiex_add_card);
  */
 int mwifiex_remove_card(struct mwifiex_adapter *adapter)
 {
-       struct mwifiex_private *priv = NULL;
-       int i;
-
        if (!adapter)
-               goto exit_remove;
-
-       /* We can no longer handle interrupts once we start doing the teardown
-        * below. */
-       if (adapter->if_ops.disable_int)
-               adapter->if_ops.disable_int(adapter);
-
-       adapter->surprise_removed = true;
-
-       mwifiex_terminate_workqueue(adapter);
-
-       /* Stop data */
-       for (i = 0; i < adapter->priv_num; i++) {
-               priv = adapter->priv[i];
-               if (priv && priv->netdev) {
-                       mwifiex_stop_net_dev_queue(priv->netdev, adapter);
-                       if (netif_carrier_ok(priv->netdev))
-                               netif_carrier_off(priv->netdev);
-               }
-       }
-
-       mwifiex_dbg(adapter, CMD,
-                   "cmd: calling mwifiex_shutdown_drv...\n");
-
-       mwifiex_shutdown_drv(adapter);
-       mwifiex_dbg(adapter, CMD,
-                   "cmd: mwifiex_shutdown_drv done\n");
-       if (atomic_read(&adapter->rx_pending) ||
-           atomic_read(&adapter->tx_pending) ||
-           atomic_read(&adapter->cmd_pending)) {
-               mwifiex_dbg(adapter, ERROR,
-                           "rx_pending=%d, tx_pending=%d,\t"
-                           "cmd_pending=%d\n",
-                           atomic_read(&adapter->rx_pending),
-                           atomic_read(&adapter->tx_pending),
-                           atomic_read(&adapter->cmd_pending));
-       }
-
-       for (i = 0; i < adapter->priv_num; i++) {
-               priv = adapter->priv[i];
-
-               if (!priv)
-                       continue;
+               return 0;
 
-               rtnl_lock();
-               if (priv->netdev &&
-                   priv->wdev.iftype != NL80211_IFTYPE_UNSPECIFIED)
-                       mwifiex_del_virtual_intf(adapter->wiphy, &priv->wdev);
-               rtnl_unlock();
-       }
-       vfree(adapter->chan_stats);
+       mwifiex_uninit_sw(adapter);
 
        wiphy_unregister(adapter->wiphy);
        wiphy_free(adapter->wiphy);
@@ -1744,7 +1697,6 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter)
                    "info: free adapter\n");
        mwifiex_free_adapter(adapter);
 
-exit_remove:
        return 0;
 }
 EXPORT_SYMBOL_GPL(mwifiex_remove_card);
-- 
2.13.0.219.gdb65acc882-goog

Reply via email to