Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9cbd5999 authored by Vasily Ulyanov's avatar Vasily Ulyanov Committed by Kalle Valo
Browse files

qtnfmac: fill wiphy's extended capabilities



These are needed to inform userspace about features the hardware
supports (e.g. BSS Transition Management 802.11v)

Signed-off-by: default avatarVasily Ulyanov <vulyanov@quantenna.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent fbad963a
Loading
Loading
Loading
Loading
+44 −0
Original line number Original line Diff line number Diff line
@@ -1029,6 +1029,10 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
	struct qlink_iface_comb_num *comb;
	struct qlink_iface_comb_num *comb;
	size_t tlv_full_len;
	size_t tlv_full_len;
	const struct qlink_tlv_hdr *tlv;
	const struct qlink_tlv_hdr *tlv;
	u8 *ext_capa = NULL;
	u8 *ext_capa_mask = NULL;
	u8 ext_capa_len = 0;
	u8 ext_capa_mask_len = 0;


	mac->macinfo.n_limits = 0;
	mac->macinfo.n_limits = 0;


@@ -1092,6 +1096,18 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
			if (limits[rec].types)
			if (limits[rec].types)
				rec++;
				rec++;
			break;
			break;
		case WLAN_EID_EXT_CAPABILITY:
			if (unlikely(tlv_value_len > U8_MAX))
				return -EINVAL;
			ext_capa = (u8 *)tlv->val;
			ext_capa_len = tlv_value_len;
			break;
		case QTN_TLV_ID_EXT_CAPABILITY_MASK:
			if (unlikely(tlv_value_len > U8_MAX))
				return -EINVAL;
			ext_capa_mask = (u8 *)tlv->val;
			ext_capa_mask_len = tlv_value_len;
			break;
		default:
		default:
			break;
			break;
		}
		}
@@ -1112,6 +1128,34 @@ static int qtnf_parse_variable_mac_info(struct qtnf_wmac *mac,
		return -EINVAL;
		return -EINVAL;
	}
	}


	if (ext_capa_len != ext_capa_mask_len) {
		pr_err("MAC%u: ext_capa/_mask lengths mismatch: %u != %u\n",
		       mac->macid, ext_capa_len, ext_capa_mask_len);
		return -EINVAL;
	}

	if (ext_capa_len > 0) {
		ext_capa = kmemdup(ext_capa, ext_capa_len, GFP_KERNEL);
		if (!ext_capa)
			return -ENOMEM;

		ext_capa_mask =
			kmemdup(ext_capa_mask, ext_capa_mask_len, GFP_KERNEL);
		if (!ext_capa_mask) {
			kfree(ext_capa);
			return -ENOMEM;
		}
	} else {
		ext_capa = NULL;
		ext_capa_mask = NULL;
	}

	kfree(mac->macinfo.extended_capabilities);
	kfree(mac->macinfo.extended_capabilities_mask);
	mac->macinfo.extended_capabilities = ext_capa;
	mac->macinfo.extended_capabilities_mask = ext_capa_mask;
	mac->macinfo.extended_capabilities_len = ext_capa_len;

	return 0;
	return 0;
}
}


+2 −0
Original line number Original line Diff line number Diff line
@@ -381,6 +381,8 @@ static void qtnf_core_mac_detach(struct qtnf_bus *bus, unsigned int macid)
	}
	}


	kfree(mac->macinfo.limits);
	kfree(mac->macinfo.limits);
	kfree(mac->macinfo.extended_capabilities);
	kfree(mac->macinfo.extended_capabilities_mask);
	kfree(wiphy->iface_combinations);
	kfree(wiphy->iface_combinations);
	wiphy_free(wiphy);
	wiphy_free(wiphy);
	bus->mac[macid] = NULL;
	bus->mac[macid] = NULL;
+3 −0
Original line number Original line Diff line number Diff line
@@ -106,6 +106,9 @@ struct qtnf_mac_info {
	struct ieee80211_vht_cap vht_cap_mod_mask;
	struct ieee80211_vht_cap vht_cap_mod_mask;
	struct ieee80211_iface_limit *limits;
	struct ieee80211_iface_limit *limits;
	size_t n_limits;
	size_t n_limits;
	u8 *extended_capabilities;
	u8 *extended_capabilities_mask;
	u8 extended_capabilities_len;
};
};


struct qtnf_chan_stats {
struct qtnf_chan_stats {
+1 −0
Original line number Original line Diff line number Diff line
@@ -1020,6 +1020,7 @@ enum qlink_tlv_id {
	QTN_TLV_ID_KEY			= 0x0302,
	QTN_TLV_ID_KEY			= 0x0302,
	QTN_TLV_ID_SEQ			= 0x0303,
	QTN_TLV_ID_SEQ			= 0x0303,
	QTN_TLV_ID_IE_SET		= 0x0305,
	QTN_TLV_ID_IE_SET		= 0x0305,
	QTN_TLV_ID_EXT_CAPABILITY_MASK	= 0x0306,
};
};


struct qlink_tlv_hdr {
struct qlink_tlv_hdr {