mirror of https://gitee.com/openkylin/linux.git
ath6kl: support fw reporting phy capabilities
Currently the supported bands are just hard coded in the driver. However, the ath6kl FW will include its 11n and band capabilites in a WMI_READY event. Handle this and report capabilites to cfg80211 accordingly. Signed-off-by: Thomas Pedersen <c_tpeder@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
5699257f69
commit
d92917e4db
|
@ -3419,6 +3419,7 @@ struct net_device *ath6kl_interface_add(struct ath6kl *ar, char *name,
|
||||||
int ath6kl_cfg80211_init(struct ath6kl *ar)
|
int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||||
{
|
{
|
||||||
struct wiphy *wiphy = ar->wiphy;
|
struct wiphy *wiphy = ar->wiphy;
|
||||||
|
bool band_2gig = false, band_5gig = false, ht = false;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
|
wiphy->mgmt_stypes = ath6kl_mgmt_stypes;
|
||||||
|
@ -3439,8 +3440,39 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
|
||||||
/* max num of ssids that can be probed during scanning */
|
/* max num of ssids that can be probed during scanning */
|
||||||
wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
|
wiphy->max_scan_ssids = MAX_PROBED_SSID_INDEX;
|
||||||
wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
|
wiphy->max_scan_ie_len = 1000; /* FIX: what is correct limit? */
|
||||||
wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
|
switch (ar->hw.cap) {
|
||||||
wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
|
case WMI_11AN_CAP:
|
||||||
|
ht = true;
|
||||||
|
case WMI_11A_CAP:
|
||||||
|
band_5gig = true;
|
||||||
|
break;
|
||||||
|
case WMI_11GN_CAP:
|
||||||
|
ht = true;
|
||||||
|
case WMI_11G_CAP:
|
||||||
|
band_2gig = true;
|
||||||
|
break;
|
||||||
|
case WMI_11AGN_CAP:
|
||||||
|
ht = true;
|
||||||
|
case WMI_11AG_CAP:
|
||||||
|
band_2gig = true;
|
||||||
|
band_5gig = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ath6kl_err("invalid phy capability!\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ht) {
|
||||||
|
ath6kl_band_2ghz.ht_cap.cap = 0;
|
||||||
|
ath6kl_band_2ghz.ht_cap.ht_supported = false;
|
||||||
|
ath6kl_band_5ghz.ht_cap.cap = 0;
|
||||||
|
ath6kl_band_5ghz.ht_cap.ht_supported = false;
|
||||||
|
}
|
||||||
|
if (band_2gig)
|
||||||
|
wiphy->bands[IEEE80211_BAND_2GHZ] = &ath6kl_band_2ghz;
|
||||||
|
if (band_5gig)
|
||||||
|
wiphy->bands[IEEE80211_BAND_5GHZ] = &ath6kl_band_5ghz;
|
||||||
|
|
||||||
wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
|
wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
|
||||||
|
|
||||||
wiphy->cipher_suites = cipher_suites;
|
wiphy->cipher_suites = cipher_suites;
|
||||||
|
|
|
@ -683,6 +683,7 @@ struct ath6kl {
|
||||||
u32 refclk_hz;
|
u32 refclk_hz;
|
||||||
u32 uarttx_pin;
|
u32 uarttx_pin;
|
||||||
u32 testscript_addr;
|
u32 testscript_addr;
|
||||||
|
enum wmi_phy_cap cap;
|
||||||
|
|
||||||
struct ath6kl_hw_fw {
|
struct ath6kl_hw_fw {
|
||||||
const char *dir;
|
const char *dir;
|
||||||
|
@ -816,7 +817,8 @@ void aggr_reset_state(struct aggr_info_conn *aggr_conn);
|
||||||
struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 *node_addr);
|
struct ath6kl_sta *ath6kl_find_sta(struct ath6kl_vif *vif, u8 *node_addr);
|
||||||
struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid);
|
struct ath6kl_sta *ath6kl_find_sta_by_aid(struct ath6kl *ar, u8 aid);
|
||||||
|
|
||||||
void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver);
|
void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver,
|
||||||
|
enum wmi_phy_cap cap);
|
||||||
int ath6kl_control_tx(void *devt, struct sk_buff *skb,
|
int ath6kl_control_tx(void *devt, struct sk_buff *skb,
|
||||||
enum htc_endpoint_id eid);
|
enum htc_endpoint_id eid);
|
||||||
void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel,
|
void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel,
|
||||||
|
|
|
@ -548,7 +548,8 @@ void ath6kl_disconnect(struct ath6kl_vif *vif)
|
||||||
|
|
||||||
/* WMI Event handlers */
|
/* WMI Event handlers */
|
||||||
|
|
||||||
void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver)
|
void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver,
|
||||||
|
enum wmi_phy_cap cap)
|
||||||
{
|
{
|
||||||
struct ath6kl *ar = devt;
|
struct ath6kl *ar = devt;
|
||||||
|
|
||||||
|
@ -558,6 +559,7 @@ void ath6kl_ready_event(void *devt, u8 *datap, u32 sw_ver, u32 abi_ver)
|
||||||
|
|
||||||
ar->version.wlan_ver = sw_ver;
|
ar->version.wlan_ver = sw_ver;
|
||||||
ar->version.abi_ver = abi_ver;
|
ar->version.abi_ver = abi_ver;
|
||||||
|
ar->hw.cap = cap;
|
||||||
|
|
||||||
snprintf(ar->wiphy->fw_version,
|
snprintf(ar->wiphy->fw_version,
|
||||||
sizeof(ar->wiphy->fw_version),
|
sizeof(ar->wiphy->fw_version),
|
||||||
|
|
|
@ -690,7 +690,7 @@ static int ath6kl_wmi_ready_event_rx(struct wmi *wmi, u8 *datap, int len)
|
||||||
|
|
||||||
ath6kl_ready_event(wmi->parent_dev, ev->mac_addr,
|
ath6kl_ready_event(wmi->parent_dev, ev->mac_addr,
|
||||||
le32_to_cpu(ev->sw_version),
|
le32_to_cpu(ev->sw_version),
|
||||||
le32_to_cpu(ev->abi_version));
|
le32_to_cpu(ev->abi_version), ev->phy_cap);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1417,6 +1417,16 @@ struct wmi_ready_event_2 {
|
||||||
u8 phy_cap;
|
u8 phy_cap;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
/* WMI_PHY_CAPABILITY */
|
||||||
|
enum wmi_phy_cap {
|
||||||
|
WMI_11A_CAP = 0x01,
|
||||||
|
WMI_11G_CAP = 0x02,
|
||||||
|
WMI_11AG_CAP = 0x03,
|
||||||
|
WMI_11AN_CAP = 0x04,
|
||||||
|
WMI_11GN_CAP = 0x05,
|
||||||
|
WMI_11AGN_CAP = 0x06,
|
||||||
|
};
|
||||||
|
|
||||||
/* Connect Event */
|
/* Connect Event */
|
||||||
struct wmi_connect_event {
|
struct wmi_connect_event {
|
||||||
union {
|
union {
|
||||||
|
|
Loading…
Reference in New Issue