]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
qtnfmac: fix handling of iftype mask reported by firmware
authorSergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Thu, 27 Jul 2017 23:06:52 +0000 (02:06 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 3 Aug 2017 09:58:14 +0000 (12:58 +0300)
Firmware sends supported interface type rather than mask. As a result,
types field of ieee80211_iface_limit structure may end up having
multiple iftype bits set. This leads to WARN_ON from
wiphy_verify_combinations.

Signed-off-by: Igor Mitsyanko <igor.mitsyanko.os@quantenna.com>
Signed-off-by: Sergey Matyukevich <sergey.matyukevich.os@quantenna.com>
Signed-off-by: Avinash Patil <avinashp@quantenna.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/quantenna/qtnfmac/commands.c
drivers/net/wireless/quantenna/qtnfmac/qlink.h
drivers/net/wireless/quantenna/qtnfmac/qlink_util.c
drivers/net/wireless/quantenna/qtnfmac/qlink_util.h

index 524269d2c30c1e62e096e291fb65c6f737882d93..94656106b496650e87a74bae0359f3082c5a749b 100644 (file)
@@ -989,7 +989,7 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
        struct ieee80211_iface_limit *limits = NULL;
        const struct qlink_iface_limit *limit_record;
        size_t record_count = 0, rec = 0;
-       u16 tlv_type, tlv_value_len, mask;
+       u16 tlv_type, tlv_value_len;
        struct qlink_iface_comb_num *comb;
        size_t tlv_full_len;
        const struct qlink_tlv_hdr *tlv;
@@ -1042,9 +1042,10 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
 
                        limit_record = (void *)tlv->val;
                        limits[rec].max = le16_to_cpu(limit_record->max_num);
-                       mask = le16_to_cpu(limit_record->type_mask);
-                       limits[rec].types = qlink_iface_type_mask_to_nl(mask);
-                       /* only AP and STA modes are supported */
+                       limits[rec].types = qlink_iface_type_to_nl_mask(
+                               le16_to_cpu(limit_record->type));
+
+                       /* supported modes: STA, AP */
                        limits[rec].types &= BIT(NL80211_IFTYPE_AP) |
                                             BIT(NL80211_IFTYPE_STATION);
 
index c529cc1994b4a5552521fc187dfec83179c2c107..ec51263624940d51ab00b83f32bb1a04f1c2d424 100644 (file)
@@ -873,7 +873,7 @@ struct qlink_tlv_hdr {
 
 struct qlink_iface_limit {
        __le16 max_num;
-       __le16 type_mask;
+       __le16 type;
 } __packed;
 
 struct qlink_iface_comb_num {
index 49ae652ad9a3e4e46efec124c9ad28b01abce300..22fa631d692da8b06680d90e9586201ae2e2f8ec 100644 (file)
 
 #include "qlink_util.h"
 
-u16 qlink_iface_type_mask_to_nl(u16 qlink_mask)
+u16 qlink_iface_type_to_nl_mask(u16 qlink_type)
 {
        u16 result = 0;
 
-       if (qlink_mask & QLINK_IFTYPE_AP)
+       switch (qlink_type) {
+       case QLINK_IFTYPE_AP:
                result |= BIT(NL80211_IFTYPE_AP);
-
-       if (qlink_mask & QLINK_IFTYPE_STATION)
+               break;
+       case QLINK_IFTYPE_STATION:
                result |= BIT(NL80211_IFTYPE_STATION);
-
-       if (qlink_mask & QLINK_IFTYPE_ADHOC)
+               break;
+       case QLINK_IFTYPE_ADHOC:
                result |= BIT(NL80211_IFTYPE_ADHOC);
-
-       if (qlink_mask & QLINK_IFTYPE_MONITOR)
+               break;
+       case QLINK_IFTYPE_MONITOR:
                result |= BIT(NL80211_IFTYPE_MONITOR);
-
-       if (qlink_mask & QLINK_IFTYPE_WDS)
+               break;
+       case QLINK_IFTYPE_WDS:
                result |= BIT(NL80211_IFTYPE_WDS);
+               break;
+       }
 
        return result;
 }
index 90d7d09a6c6329493482a5fb0cc70835edadd602..c9e882a3a9916e69b0bef1878407ba1ff4c3c96b 100644 (file)
@@ -68,7 +68,7 @@ static inline void qtnf_cmd_skb_put_tlv_u16(struct sk_buff *skb,
        memcpy(hdr->val, &tmp, sizeof(tmp));
 }
 
-u16 qlink_iface_type_mask_to_nl(u16 qlink_mask);
+u16 qlink_iface_type_to_nl_mask(u16 qlink_type);
 u8 qlink_chan_width_mask_to_nl(u16 qlink_mask);
 
 #endif /* _QTN_FMAC_QLINK_UTIL_H_ */