ath10k: add WMI_SERVICE_AVAILABLE_EVENT support
Add WMI_SERVICE_AVAILABLE_EVENT to extend WMI_SERVICE_READY_EVENT, the 128bit service map in WMI_SERVICE_READY_EVENT is not enough for firmware to notice new WLAN service to host driver. Hereby, for thoese new WLAN service, firmware will notice host driver by WMI_SERVICE_AVAILABLE_EVENT. Signed-off-by: Alan Liu <alanliu@codeaurora.org> Signed-off-by: Carl Huang <cjhuang@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
@@ -594,6 +594,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
|
||||
case WMI_TLV_READY_EVENTID:
|
||||
ath10k_wmi_event_ready(ar, skb);
|
||||
break;
|
||||
case WMI_TLV_SERVICE_AVAILABLE_EVENTID:
|
||||
ath10k_wmi_event_service_available(ar, skb);
|
||||
break;
|
||||
case WMI_TLV_OFFLOAD_BCN_TX_STATUS_EVENTID:
|
||||
ath10k_wmi_tlv_event_bcn_tx_status(ar, skb);
|
||||
break;
|
||||
@@ -1117,6 +1120,39 @@ static int ath10k_wmi_tlv_op_pull_rdy_ev(struct ath10k *ar,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_wmi_tlv_svc_avail_parse(struct ath10k *ar, u16 tag, u16 len,
|
||||
const void *ptr, void *data)
|
||||
{
|
||||
struct wmi_svc_avail_ev_arg *arg = data;
|
||||
|
||||
switch (tag) {
|
||||
case WMI_TLV_TAG_STRUCT_SERVICE_AVAILABLE_EVENT:
|
||||
arg->service_map_ext_len = *(__le32 *)ptr;
|
||||
arg->service_map_ext = ptr + sizeof(__le32);
|
||||
return 0;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
static int ath10k_wmi_tlv_op_pull_svc_avail(struct ath10k *ar,
|
||||
struct sk_buff *skb,
|
||||
struct wmi_svc_avail_ev_arg *arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ath10k_wmi_tlv_iter(ar, skb->data, skb->len,
|
||||
ath10k_wmi_tlv_svc_avail_parse, arg);
|
||||
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to parse svc_avail tlv: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ath10k_wmi_tlv_pull_vdev_stats(const struct wmi_tlv_vdev_stats *src,
|
||||
struct ath10k_fw_stats_vdev *dst)
|
||||
{
|
||||
@@ -3740,6 +3776,7 @@ static struct wmi_vdev_param_map wmi_tlv_vdev_param_map = {
|
||||
static const struct wmi_ops wmi_tlv_ops = {
|
||||
.rx = ath10k_wmi_tlv_op_rx,
|
||||
.map_svc = wmi_tlv_svc_map,
|
||||
.map_svc_ext = wmi_tlv_svc_map_ext,
|
||||
|
||||
.pull_scan = ath10k_wmi_tlv_op_pull_scan_ev,
|
||||
.pull_mgmt_rx = ath10k_wmi_tlv_op_pull_mgmt_rx_ev,
|
||||
@@ -3751,6 +3788,7 @@ static const struct wmi_ops wmi_tlv_ops = {
|
||||
.pull_phyerr = ath10k_wmi_op_pull_phyerr_ev,
|
||||
.pull_svc_rdy = ath10k_wmi_tlv_op_pull_svc_rdy_ev,
|
||||
.pull_rdy = ath10k_wmi_tlv_op_pull_rdy_ev,
|
||||
.pull_svc_avail = ath10k_wmi_tlv_op_pull_svc_avail,
|
||||
.pull_fw_stats = ath10k_wmi_tlv_op_pull_fw_stats,
|
||||
.pull_roam_ev = ath10k_wmi_tlv_op_pull_roam_ev,
|
||||
.pull_wow_event = ath10k_wmi_tlv_op_pull_wow_ev,
|
||||
|
Reference in New Issue
Block a user