From d3ab1004fea895dd7bf3a15e7aa6f08b4850142a Mon Sep 17 00:00:00 2001 From: Sathish Kumar Date: Tue, 7 Feb 2017 17:10:59 +0530 Subject: [PATCH] qcacmn: Add TLV extraction APIs for WIN specific WMI events Converged FW has few left-over WIN specfic WMI events that need to be implemented in TLV method. WMI Extraction APIs implemented through this change - WMI_PDEV_CHANNEL_HOPPING_EVENTID WMI_PDEV_TPC_EVENTID WMI_WDS_PEER_EVENTID WMI_PEER_STA_PS_STATECHG_EVENTID WMI_INST_RSSI_STATS_EVENTID Change-Id: I7d312e40023fb10f71953b34d16b10ddf2a82f9c CRs-Fixed: 1115239 --- wmi_unified_tlv.c | 192 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 178 insertions(+), 14 deletions(-) diff --git a/wmi_unified_tlv.c b/wmi_unified_tlv.c index cb1f17c9f8..f6da28bed4 100644 --- a/wmi_unified_tlv.c +++ b/wmi_unified_tlv.c @@ -14492,20 +14492,6 @@ static QDF_STATUS extract_pdev_utf_event_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } -/** - * extract_channel_hopping_event_tlv() - extract channel hopping param - * from event - * @wmi_handle: wmi handle - * @param evt_buf: pointer to event buffer - * @param ch_hopping: Pointer to hold channel hopping param - * - * Return: QDF_STATUS_SUCCESS for success or error code - */ -static QDF_STATUS extract_channel_hopping_event_tlv(wmi_unified_t wmi_handle, - void *evt_buf, wmi_host_pdev_channel_hopping_event *chan_info) -{ - return QDF_STATUS_SUCCESS; -} /** * extract_service_ready_ext_tlv() - extract basic extended service ready params @@ -15069,6 +15055,179 @@ static uint16_t wmi_set_htc_tx_tag_tlv(wmi_unified_t wmi_handle, return htc_tx_tag; } +/** + * extract_channel_hopping_event_tlv() - extract channel hopping param + * from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param ch_hopping: Pointer to hold channel hopping param + * + * @return QDF_STATUS_SUCCESS on success and -ve on failure. + */ +static QDF_STATUS extract_channel_hopping_event_tlv( + wmi_unified_t wmi_handle, void *evt_buf, + wmi_host_pdev_channel_hopping_event *ch_hopping) +{ + WMI_PDEV_CHANNEL_HOPPING_EVENTID_param_tlvs *param_buf; + wmi_pdev_channel_hopping_event_fixed_param *event; + + param_buf = (WMI_PDEV_CHANNEL_HOPPING_EVENTID_param_tlvs *)evt_buf; + event = (wmi_pdev_channel_hopping_event_fixed_param *) + param_buf->fixed_param; + + ch_hopping->noise_floor_report_iter = event->noise_floor_report_iter; + ch_hopping->noise_floor_total_iter = event->noise_floor_total_iter; + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_pdev_tpc_ev_param_tlv() - extract tpc param from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param param: Pointer to hold tpc param + * + * @return QDF_STATUS_SUCCESS on success and -ve on failure. + */ +static QDF_STATUS extract_pdev_tpc_ev_param_tlv(wmi_unified_t wmi_handle, + void *evt_buf, + wmi_host_pdev_tpc_event *param) +{ + WMI_PDEV_TPC_EVENTID_param_tlvs *param_buf; + wmi_pdev_tpc_event_fixed_param *event; + + param_buf = (WMI_PDEV_TPC_EVENTID_param_tlvs *)evt_buf; + event = (wmi_pdev_tpc_event_fixed_param *)param_buf->fixed_param; + + qdf_mem_copy(param->tpc, param_buf->tpc, sizeof(param->tpc)); + + return QDF_STATUS_SUCCESS; +} + + +#ifdef BIG_ENDIAN_HOST +/** + * wds_addr_ev_conv_data_be() - LE to BE conversion of wds addr event + * @param data_len - data length + * @param data - pointer to data + * + * Return: QDF_STATUS - success or error status + */ +static QDF_STATUS wds_addr_ev_conv_data_be(uint16_t data_len, uint8_t *ev) +{ + uint8_t *datap = (uint8_t *)ev; + /* Skip swapping the first word */ + datap += sizeof(uint32_t); + for (i = 0; i < ((data_len / sizeof(uint32_t))-1); + i++, datap += sizeof(uint32_t)) { + *(uint32_t *)datap = qdf_le32_to_cpu(*(uint32_t *)datap); + } + + return QDF_STATUS_SUCCESS; +} +#else +/** + * wds_addr_ev_conv_data_be() - Dummy operation for LE platforms + * @param data_len - data length + * @param data - pointer to data + * + * Return: QDF_STATUS - success or error status + */ +static QDF_STATUS wds_addr_ev_conv_data_be(uint32_t data_len, uint8_t *ev) +{ + return QDF_STATUS_SUCCESS; +} +#endif + +/** + * extract_wds_addr_event_tlv() - extract wds address from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param wds_ev: Pointer to hold wds address + * + * @return QDF_STATUS_SUCCESS on success and -ve on failure. + */ +static QDF_STATUS extract_wds_addr_event_tlv(wmi_unified_t wmi_handle, + void *evt_buf, + uint16_t len, wds_addr_event_t *wds_ev) +{ + WMI_WDS_PEER_EVENTID_param_tlvs *param_buf; + wmi_wds_addr_event_fixed_param *ev; + int i; + + param_buf = (WMI_WDS_PEER_EVENTID_param_tlvs *)evt_buf; + ev = (wmi_wds_addr_event_fixed_param *)param_buf->fixed_param; + + if (wds_addr_ev_conv_data_be(len, (uint8_t *)ev) != QDF_STATUS_SUCCESS) + return QDF_STATUS_E_FAILURE; + + qdf_mem_copy(wds_ev->event_type, ev->event_type, + sizeof(wds_ev->event_type)); + for (i = 0; i < 4; i++) { + wds_ev->peer_mac[i] = + ((u_int8_t *)&(ev->peer_mac.mac_addr31to0))[i]; + wds_ev->dest_mac[i] = + ((u_int8_t *)&(ev->dest_mac.mac_addr31to0))[i]; + } + for (i = 0; i < 2; i++) { + wds_ev->peer_mac[4+i] = + ((u_int8_t *)&(ev->peer_mac.mac_addr47to32))[i]; + wds_ev->dest_mac[4+i] = + ((u_int8_t *)&(ev->dest_mac.mac_addr47to32))[i]; + } + return QDF_STATUS_SUCCESS; +} + +/** + * extract_peer_sta_ps_statechange_ev_tlv() - extract peer sta ps state + * from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param ev: Pointer to hold peer param and ps state + * + * @return QDF_STATUS_SUCCESS on success and -ve on failure. + */ +static QDF_STATUS extract_peer_sta_ps_statechange_ev_tlv(wmi_unified_t wmi_handle, + void *evt_buf, wmi_host_peer_sta_ps_statechange_event *ev) +{ + WMI_PEER_STA_PS_STATECHG_EVENTID_param_tlvs *param_buf; + wmi_peer_sta_ps_statechange_event_fixed_param *event; + + param_buf = (WMI_PEER_STA_PS_STATECHG_EVENTID_param_tlvs *)evt_buf; + event = (wmi_peer_sta_ps_statechange_event_fixed_param *) + param_buf->fixed_param; + + WMI_MAC_ADDR_TO_CHAR_ARRAY(&event->peer_macaddr, ev->peer_macaddr); + ev->peer_ps_state = event->peer_ps_state; + + return QDF_STATUS_SUCCESS; +} + +/** + * extract_inst_rssi_stats_event_tlv() - extract inst rssi stats from event + * @wmi_handle: wmi handle + * @param evt_buf: pointer to event buffer + * @param inst_rssi_resp: Pointer to hold inst rssi response + * + * @return QDF_STATUS_SUCCESS on success and -ve on failure. + */ +static QDF_STATUS extract_inst_rssi_stats_event_tlv( + wmi_unified_t wmi_handle, void *evt_buf, + wmi_host_inst_stats_resp *inst_rssi_resp) +{ + WMI_INST_RSSI_STATS_EVENTID_param_tlvs *param_buf; + wmi_inst_rssi_stats_resp_fixed_param *event; + + param_buf = (WMI_INST_RSSI_STATS_EVENTID_param_tlvs *)evt_buf; + event = (wmi_inst_rssi_stats_resp_fixed_param *)param_buf->fixed_param; + + qdf_mem_copy(&(inst_rssi_resp->peer_macaddr), + &(event->peer_macaddr), sizeof(wmi_mac_addr)); + inst_rssi_resp->iRSSI = event->iRSSI; + + return QDF_STATUS_SUCCESS; +} + struct wmi_ops tlv_ops = { .send_vdev_create_cmd = send_vdev_create_cmd_tlv, .send_vdev_delete_cmd = send_vdev_delete_cmd_tlv, @@ -15379,6 +15538,11 @@ struct wmi_ops tlv_ops = { .is_management_record = is_management_record_tlv, .extract_pdev_csa_switch_count_status = extract_pdev_csa_switch_count_status_tlv, + .extract_pdev_tpc_ev_param = extract_pdev_tpc_ev_param_tlv, + .extract_wds_addr_event = extract_wds_addr_event_tlv, + .extract_peer_sta_ps_statechange_ev = + extract_peer_sta_ps_statechange_ev_tlv, + .extract_inst_rssi_stats_event = extract_inst_rssi_stats_event_tlv, }; #ifndef CONFIG_MCL