if (!dev) {
                mwifiex_dbg(adapter, ERROR,
                            "no memory available for netdevice\n");
-               memset(&priv->wdev, 0, sizeof(priv->wdev));
-               priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
-               priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
-               return ERR_PTR(-ENOMEM);
+               ret = -ENOMEM;
+               goto err_alloc_netdev;
        }
 
        mwifiex_init_priv_params(priv, dev);
        ret = mwifiex_send_cmd(priv, HostCmd_CMD_SET_BSS_MODE,
                               HostCmd_ACT_GEN_SET, 0, NULL, true);
        if (ret)
-               return ERR_PTR(ret);
+               goto err_set_bss_mode;
 
        ret = mwifiex_sta_init_cmd(priv, false, false);
        if (ret)
-               return ERR_PTR(ret);
+               goto err_sta_init;
 
        mwifiex_setup_ht_caps(&wiphy->bands[NL80211_BAND_2GHZ]->ht_cap, priv);
        if (adapter->is_hw_11ac_capable)
 
        SET_NETDEV_DEV(dev, adapter->dev);
 
-       /* Register network device */
-       if (register_netdevice(dev)) {
-               mwifiex_dbg(adapter, ERROR,
-                           "cannot register virtual network device\n");
-               free_netdev(dev);
-               priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
-               priv->netdev = NULL;
-               memset(&priv->wdev, 0, sizeof(priv->wdev));
-               priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
-               return ERR_PTR(-EFAULT);
-       }
-
        priv->dfs_cac_workqueue = alloc_workqueue("MWIFIEX_DFS_CAC%s",
                                                  WQ_HIGHPRI |
                                                  WQ_MEM_RECLAIM |
                                                  WQ_UNBOUND, 1, name);
        if (!priv->dfs_cac_workqueue) {
-               mwifiex_dbg(adapter, ERROR,
-                           "cannot register virtual network device\n");
-               free_netdev(dev);
-               priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
-               priv->netdev = NULL;
-               memset(&priv->wdev, 0, sizeof(priv->wdev));
-               priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
-               return ERR_PTR(-ENOMEM);
+               mwifiex_dbg(adapter, ERROR, "cannot alloc DFS CAC queue\n");
+               ret = -ENOMEM;
+               goto err_alloc_cac;
        }
 
        INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue);
                                                      WQ_HIGHPRI | WQ_UNBOUND |
                                                      WQ_MEM_RECLAIM, 1, name);
        if (!priv->dfs_chan_sw_workqueue) {
-               mwifiex_dbg(adapter, ERROR,
-                           "cannot register virtual network device\n");
-               free_netdev(dev);
-               priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
-               priv->netdev = NULL;
-               memset(&priv->wdev, 0, sizeof(priv->wdev));
-               priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
-               destroy_workqueue(priv->dfs_cac_workqueue);
-               priv->dfs_cac_workqueue = NULL;
-               return ERR_PTR(-ENOMEM);
+               mwifiex_dbg(adapter, ERROR, "cannot alloc DFS channel sw queue\n");
+               ret = -ENOMEM;
+               goto err_alloc_chsw;
        }
 
        INIT_DELAYED_WORK(&priv->dfs_chan_sw_work,
 
        sema_init(&priv->async_sem, 1);
 
+       /* Register network device */
+       if (register_netdevice(dev)) {
+               mwifiex_dbg(adapter, ERROR, "cannot register network device\n");
+               ret = -EFAULT;
+               goto err_reg_netdev;
+       }
+
        mwifiex_dbg(adapter, INFO,
                    "info: %s: Marvell 802.11 Adapter\n", dev->name);
 
                adapter->curr_iface_comb.p2p_intf++;
                break;
        default:
+               /* This should be dead code; checked above */
                mwifiex_dbg(adapter, ERROR, "type not supported\n");
                return ERR_PTR(-EINVAL);
        }
 
        return &priv->wdev;
+
+err_reg_netdev:
+       destroy_workqueue(priv->dfs_chan_sw_workqueue);
+       priv->dfs_chan_sw_workqueue = NULL;
+err_alloc_chsw:
+       destroy_workqueue(priv->dfs_cac_workqueue);
+       priv->dfs_cac_workqueue = NULL;
+err_alloc_cac:
+       free_netdev(dev);
+       priv->netdev = NULL;
+err_sta_init:
+err_set_bss_mode:
+err_alloc_netdev:
+       memset(&priv->wdev, 0, sizeof(priv->wdev));
+       priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
+       priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
+       return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(mwifiex_add_virtual_intf);