qtnfmac: make regulatory notifier work on per-phy basis
authorIgor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Wed, 20 Mar 2019 10:03:48 +0000 (10:03 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 4 Apr 2019 09:57:24 +0000 (12:57 +0300)
Wireless core calls regulatory notifier for each wiphy and it only
guarantees that bands info is updated for this particular wiphy prior
to calling a notifier. Hence updating all wiphy which belong to driver
in a single notifier callback is redundant and incorrect.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/cfg80211.c
drivers/net/wireless/quantenna/qtnfmac/commands.c
drivers/net/wireless/quantenna/qtnfmac/commands.h

index dcb0991432f4ef657866747089f1c343319c154b..295890b2673ca16ea3845f2746d6092b06c8de50 100644 (file)
@@ -993,20 +993,17 @@ static struct cfg80211_ops qtn_cfg80211_ops = {
 #endif
 };
 
-static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy_in,
+static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy,
                                       struct regulatory_request *req)
 {
-       struct qtnf_wmac *mac = wiphy_priv(wiphy_in);
-       struct qtnf_bus *bus = mac->bus;
-       struct wiphy *wiphy;
-       unsigned int mac_idx;
+       struct qtnf_wmac *mac = wiphy_priv(wiphy);
        enum nl80211_band band;
        int ret;
 
        pr_debug("MAC%u: initiator=%d alpha=%c%c\n", mac->macid, req->initiator,
                 req->alpha2[0], req->alpha2[1]);
 
-       ret = qtnf_cmd_reg_notify(bus, req);
+       ret = qtnf_cmd_reg_notify(mac, req);
        if (ret) {
                if (ret == -EOPNOTSUPP) {
                        pr_warn("reg update not supported\n");
@@ -1021,25 +1018,14 @@ static void qtnf_cfg80211_reg_notifier(struct wiphy *wiphy_in,
                return;
        }
 
-       for (mac_idx = 0; mac_idx < QTNF_MAX_MAC; ++mac_idx) {
-               if (!(bus->hw_info.mac_bitmap & (1 << mac_idx)))
-                       continue;
-
-               mac = bus->mac[mac_idx];
-               if (!mac)
+       for (band = 0; band < NUM_NL80211_BANDS; ++band) {
+               if (!wiphy->bands[band])
                        continue;
 
-               wiphy = priv_to_wiphy(mac);
-
-               for (band = 0; band < NUM_NL80211_BANDS; ++band) {
-                       if (!wiphy->bands[band])
-                               continue;
-
-                       ret = qtnf_cmd_band_info_get(mac, wiphy->bands[band]);
-                       if (ret)
-                               pr_err("failed to get chan info for mac %u band %u\n",
-                                      mac_idx, band);
-               }
+               ret = qtnf_cmd_band_info_get(mac, wiphy->bands[band]);
+               if (ret)
+                       pr_err("MAC%u: failed to update band %u\n",
+                              mac->macid, band);
        }
 }
 
index 85a2a58f4c168bf6ece7845e1a701f3570cab0ed..9aabba7429edfb86c4a3b67e57cc340bd34d74f3 100644 (file)
@@ -2404,13 +2404,14 @@ out:
        return ret;
 }
 
-int qtnf_cmd_reg_notify(struct qtnf_bus *bus, struct regulatory_request *req)
+int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req)
 {
+       struct qtnf_bus *bus = mac->bus;
        struct sk_buff *cmd_skb;
        int ret;
        struct qlink_cmd_reg_notify *cmd;
 
-       cmd_skb = qtnf_cmd_alloc_new_cmdskb(QLINK_MACID_RSVD, QLINK_VIFID_RSVD,
+       cmd_skb = qtnf_cmd_alloc_new_cmdskb(mac->macid, QLINK_VIFID_RSVD,
                                            QLINK_CMD_REG_NOTIFY,
                                            sizeof(*cmd));
        if (!cmd_skb)
@@ -2449,10 +2450,6 @@ int qtnf_cmd_reg_notify(struct qtnf_bus *bus, struct regulatory_request *req)
 
        qtnf_bus_lock(bus);
        ret = qtnf_cmd_send(bus, cmd_skb);
-       if (ret)
-               goto out;
-
-out:
        qtnf_bus_unlock(bus);
 
        return ret;
index 64f0b9dc8a1440ae90e5e3998336bfd546901b85..050f9a49d16c93046e0d03e8786e6cd49bf83663 100644 (file)
@@ -57,7 +57,7 @@ int qtnf_cmd_send_disconnect(struct qtnf_vif *vif,
                             u16 reason_code);
 int qtnf_cmd_send_updown_intf(struct qtnf_vif *vif,
                              bool up);
-int qtnf_cmd_reg_notify(struct qtnf_bus *bus, struct regulatory_request *req);
+int qtnf_cmd_reg_notify(struct qtnf_wmac *mac, struct regulatory_request *req);
 int qtnf_cmd_get_chan_stats(struct qtnf_wmac *mac, u16 channel,
                            struct qtnf_chan_stats *stats);
 int qtnf_cmd_send_chan_switch(struct qtnf_vif *vif,