]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Revert "brcmfmac: fix NULL pointer derefence during USB disconnect"
authorArend van Spriel <arend.vanspriel@broadcom.com>
Thu, 11 Jul 2019 09:05:06 +0000 (11:05 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 24 Jul 2019 11:51:21 +0000 (14:51 +0300)
This reverts commit 5cdb0ef6144f47440850553579aa923c20a63f23. Subsequent
changes make rework the driver code fixing the issue differently.

Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcdc.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/proto.h

index 322e913ca7aa507f900725a9176135d5c8469a1b..2c95a08a5871175394e3353cbac4476f43d4ee2a 100644 (file)
@@ -479,18 +479,11 @@ fail:
        return -ENOMEM;
 }
 
-void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr)
-{
-       struct brcmf_bcdc *bcdc = drvr->proto->pd;
-
-       brcmf_fws_detach_pre_delif(bcdc->fws);
-}
-
-void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr)
+void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
 {
        struct brcmf_bcdc *bcdc = drvr->proto->pd;
 
        drvr->proto->pd = NULL;
-       brcmf_fws_detach_post_delif(bcdc->fws);
+       brcmf_fws_detach(bcdc->fws);
        kfree(bcdc);
 }
index 102e6938905cd7f764b856810cb9c669445c628a..b051d2860cd106e49536ec24077d4bc1d1f36970 100644 (file)
@@ -7,16 +7,14 @@
 
 #ifdef CONFIG_BRCMFMAC_PROTO_BCDC
 int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
-void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr);
-void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr);
+void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
 void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
 void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
                                 bool success);
 struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr);
 #else
 static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
-static void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr) {};
-static inline void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr) {}
+static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
 #endif
 
 #endif /* BRCMFMAC_BCDC_H */
index bf18491a33a5aa69d1dfe60d26d6b410a6ee3f32..fda604426e46f3061cd6cbe5e8fdab2fe866a20a 100644 (file)
@@ -1314,8 +1314,6 @@ void brcmf_detach(struct device *dev)
 
        brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
 
-       brcmf_proto_detach_pre_delif(drvr);
-
        /* make sure primary interface removed last */
        for (i = BRCMF_MAX_IFS-1; i > -1; i--)
                brcmf_remove_interface(drvr->iflist[i], false);
@@ -1325,7 +1323,7 @@ void brcmf_detach(struct device *dev)
 
        brcmf_bus_stop(drvr->bus_if);
 
-       brcmf_proto_detach_post_delif(drvr);
+       brcmf_proto_detach(drvr);
 
        bus_if->drvr = NULL;
        wiphy_free(drvr->wiphy);
index b8452cb46297a8a98b7f184301d617548918253b..2bd892df83cc5baae5d44d9383d20ecaa0573549 100644 (file)
@@ -2432,25 +2432,17 @@ struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
        return fws;
 
 fail:
-       brcmf_fws_detach_pre_delif(fws);
-       brcmf_fws_detach_post_delif(fws);
+       brcmf_fws_detach(fws);
        return ERR_PTR(rc);
 }
 
-void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws)
+void brcmf_fws_detach(struct brcmf_fws_info *fws)
 {
        if (!fws)
                return;
-       if (fws->fws_wq) {
-               destroy_workqueue(fws->fws_wq);
-               fws->fws_wq = NULL;
-       }
-}
 
-void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws)
-{
-       if (!fws)
-               return;
+       if (fws->fws_wq)
+               destroy_workqueue(fws->fws_wq);
 
        /* cleanup */
        brcmf_fws_lock(fws);
index 10184eeaad94956f478af993c13b52b009fcbac6..b486d578ec96354c70e66ef644366327cef14067 100644 (file)
@@ -7,8 +7,7 @@
 #define FWSIGNAL_H_
 
 struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
-void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws);
-void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws);
+void brcmf_fws_detach(struct brcmf_fws_info *fws);
 void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
 bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
 bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
index e3d1b075044b90710691f479bdf0be489d00a123..2e911d4874af04e74c2109e7f0cf0050839b7754 100644 (file)
@@ -56,22 +56,16 @@ fail:
        return -ENOMEM;
 }
 
-void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr)
+void brcmf_proto_detach(struct brcmf_pub *drvr)
 {
        brcmf_dbg(TRACE, "Enter\n");
 
        if (drvr->proto) {
                if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
-                       brcmf_proto_bcdc_detach_post_delif(drvr);
+                       brcmf_proto_bcdc_detach(drvr);
                else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF)
                        brcmf_proto_msgbuf_detach(drvr);
                kfree(drvr->proto);
                drvr->proto = NULL;
        }
 }
-
-void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr)
-{
-       if (drvr->proto && drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
-               brcmf_proto_bcdc_detach_pre_delif(drvr);
-}
index 8d55fad531d0b4359261e800aaa6613aae40f6a3..bd08d3aaa8f4a16a2baeccf8c5bc9d1c8ac004b5 100644 (file)
@@ -43,8 +43,7 @@ struct brcmf_proto {
 
 
 int brcmf_proto_attach(struct brcmf_pub *drvr);
-void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr);
-void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr);
+void brcmf_proto_detach(struct brcmf_pub *drvr);
 
 static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
                                      struct sk_buff *skb,