qcacmn: Add support for NLA type CAP_RESP in LOWI

Host driver processes cld80211 vendor sub command
CLD80211_VENDOR_SUB_CMD_GET_CAPS and respond with
NLA type CAP response

CRs-Fixed: 2595140
Change-Id: I5a6aa1fac537ca618404520b81c541a20dafd6fb
This commit is contained in:
Vinay Gannevaram
2019-12-23 21:58:09 +05:30
committed by nshrivas
vanhempi 644413b274
commit 23a3603951
10 muutettua tiedostoa jossa 654 lisäystä ja 151 poistoa

Näytä tiedosto

@@ -24,9 +24,7 @@
#define _WIFI_POS_API_H_
/* Include files */
#include "qdf_types.h"
#include "qdf_status.h"
#include "qdf_trace.h"
#include "wifi_pos_utils_pub.h"
/* forward reference */
struct wlan_objmgr_psoc;
@@ -113,7 +111,7 @@ struct qdf_packed wifi_pos_ch_info_rsp {
};
/**
* struct wmi_pos_peer_status_info - Status information for a given peer
* struct wifi_pos_peer_status_info - Status information for a given peer
* @peer_mac_addr: peer mac address
* @peer_status: peer status: 1: CONNECTED, 2: DISCONNECTED
* @vdev_id: vdev_id for the peer mac
@@ -121,7 +119,7 @@ struct qdf_packed wifi_pos_ch_info_rsp {
* @reserved0: reserved0
* @peer_chan_info: channel info on which peer is connected
*/
struct qdf_packed wmi_pos_peer_status_info {
struct qdf_packed wifi_pos_peer_status_info {
uint8_t peer_mac_addr[ETH_ALEN];
uint8_t peer_status;
uint8_t vdev_id;
@@ -138,15 +136,17 @@ struct qdf_packed wmi_pos_peer_status_info {
* @buf_len: request buffer length
* @field_info_buf: buffer containing field info
* @field_info_buf_len: length of field info buffer
* @rsp_version: nl type or ani type
*
*/
struct wifi_pos_req_msg {
uint32_t msg_type;
enum wifi_pos_cmd_ids msg_type;
uint32_t pid;
uint8_t *buf;
uint32_t buf_len;
struct wifi_pos_field_info *field_info_buf;
uint32_t field_info_buf_len;
uint32_t rsp_version;
};
/**
@@ -340,6 +340,14 @@ void ucfg_wifi_pos_set_ftm_cap(struct wlan_objmgr_psoc *psoc, uint32_t val);
void ucfg_wifi_pos_set_oem_6g_supported(struct wlan_objmgr_psoc *psoc,
bool val);
/**
* ucfg_wifi_pos_is_nl_rsp: API to check if response is nl or ani type
* @psoc: psoc object
*
* Return: true if response is nl type
*/
bool ucfg_wifi_pos_is_nl_rsp(struct wlan_objmgr_psoc *psoc);
/**
* wifi_pos_get_app_pid: returns oem app pid.
* @psoc: pointer to psoc object

Näytä tiedosto

@@ -0,0 +1,129 @@
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: wifi_pos_utils_pub.h
* This file declares public utils of wifi positioning component
*/
#ifndef _WIFI_POS_UTILS_PUB_H_
#define _WIFI_POS_UTILS_PUB_H_
/* Include files */
#include "qdf_types.h"
#include "qdf_status.h"
#include "qdf_trace.h"
#define WIFIPOS_RESERVE_BYTES 100
#define OEM_TARGET_SIGNATURE_LEN 8
#define OEM_TARGET_SIGNATURE "QUALCOMM"
#define OEM_CAP_MAX_NUM_CHANNELS 128
#define WIFI_POS_RSP_V1_FLAT_MEMORY 0x00000001
#define WIFI_POS_RSP_V2_NL 0x00000002
/**
* enum wifi_pos_cmd_ids
* @WIFI_POS_CMD_REGISTRATION: app registration
* @WIFI_POS_CMD_GET_CAPS: get driver capabilities
* @WIFI_POS_CMD_GET_CH_INFO: get channel info
* @WIFI_POS_CMD_OEM_DATA: oem data req/rsp
* @WIFI_POS_CMD_MAX: Max cld80211 vendor sub cmds
*/
enum wifi_pos_cmd_ids {
WIFI_POS_CMD_INVALID = 0,
WIFI_POS_CMD_REGISTRATION = 1,
WIFI_POS_CMD_SET_CAPS = 2,
WIFI_POS_CMD_GET_CAPS = 3,
WIFI_POS_CMD_GET_CH_INFO = 4,
WIFI_POS_CMD_OEM_DATA = 5,
WIFI_POS_CMD_ERROR = 6,
WIFI_POS_PEER_STATUS_IND = 7,
/* keep last */
WIFI_POS_CMD__AFTER_LAST,
WIFI_POS_CMD_MAX =
WIFI_POS_CMD__AFTER_LAST - 1
};
/**
* struct wifi_pos_driver_version - Driver version identifier (w.x.y.z)
* @major: Version ID major number
* @minor: Version ID minor number
* @patch: Version ID patch number
* @build: Version ID build number
*/
struct qdf_packed wifi_pos_driver_version {
uint8_t major;
uint8_t minor;
uint8_t patch;
uint8_t build;
};
/**
* struct wifi_pos_driver_caps - OEM Data Capabilities
* @oem_target_signature: Signature of chipset vendor
* @oem_target_type: Chip type
* @oem_fw_version: Firmware version
* @driver_version: Host software version
* @allowed_dwell_time_min: Channel dwell time - allowed minimum
* @allowed_dwell_time_max: Channel dwell time - allowed maximum
* @curr_dwell_time_min: Channel dwell time - current minimim
* @curr_dwell_time_max: Channel dwell time - current maximum
* @supported_bands: Supported bands, 2.4G or 5G Hz
* @num_channels: Num of channels IDs to follow
* @channel_list: List of channel IDs
*/
struct qdf_packed wifi_pos_driver_caps {
uint8_t oem_target_signature[OEM_TARGET_SIGNATURE_LEN];
uint32_t oem_target_type;
uint32_t oem_fw_version;
struct wifi_pos_driver_version driver_version;
uint16_t allowed_dwell_time_min;
uint16_t allowed_dwell_time_max;
uint16_t curr_dwell_time_min;
uint16_t curr_dwell_time_max;
uint16_t supported_bands;
uint16_t num_channels;
uint8_t channel_list[OEM_CAP_MAX_NUM_CHANNELS];
};
/**
* struct wifi_pos_user_defined_caps - OEM capability to be exchanged between
* host and userspace
* @ftm_rr: FTM range report capability bit
* @lci_capability: LCI capability bit
* @reserved1: reserved
* @reserved2: reserved
*/
struct wifi_pos_user_defined_caps {
uint32_t ftm_rr:1;
uint32_t lci_capability:1;
uint32_t reserved1:30;
uint32_t reserved2;
};
/**
* struct wifi_pos_oem_get_cap_rsp - capabilities set by userspace and target.
* @driver_cap: target capabilities
* @user_defined_cap: capabilities set by userspace via set request
*/
struct qdf_packed wifi_pos_oem_get_cap_rsp {
struct wifi_pos_driver_caps driver_cap;
struct wifi_pos_user_defined_caps user_defined_cap;
};
#endif

Näytä tiedosto

@@ -216,7 +216,7 @@ static QDF_STATUS wifi_pos_process_set_cap_req(struct wlan_objmgr_psoc *psoc,
wifi_pos_obj->lci_capability = caps->lci_capability;
error_code = qdf_status_to_os_return(QDF_STATUS_SUCCESS);
wifi_pos_obj->wifi_pos_send_rsp(wifi_pos_obj->app_pid,
ANI_MSG_SET_OEM_CAP_RSP,
WIFI_POS_CMD_SET_CAPS,
sizeof(error_code),
(uint8_t *)&error_code);
@@ -236,13 +236,14 @@ static QDF_STATUS wifi_pos_process_get_cap_req(struct wlan_objmgr_psoc *psoc,
}
wifi_pos_debug("Received get cap req pid(%d), len(%d)",
req->pid, req->buf_len);
req->pid, req->buf_len);
wifi_pos_populate_caps(psoc, &cap_rsp.driver_cap);
cap_rsp.user_defined_cap.ftm_rr = wifi_pos_obj->ftm_rr;
cap_rsp.user_defined_cap.lci_capability = wifi_pos_obj->lci_capability;
wifi_pos_obj->wifi_pos_send_rsp(wifi_pos_obj->app_pid,
ANI_MSG_GET_OEM_CAP_RSP,
WIFI_POS_CMD_GET_CAPS,
sizeof(cap_rsp),
(uint8_t *)&cap_rsp);
@@ -276,7 +277,7 @@ QDF_STATUS wifi_pos_send_report_resp(struct wlan_objmgr_psoc *psoc,
memcpy(&err_report.err_rpt.dest_mac, dest_mac, QDF_MAC_ADDR_SIZE);
wifi_pos_obj->wifi_pos_send_rsp(wifi_pos_obj->app_pid,
ANI_MSG_OEM_DATA_RSP,
WIFI_POS_CMD_OEM_DATA,
sizeof(err_report),
(uint8_t *)&err_report);
@@ -548,7 +549,7 @@ static QDF_STATUS wifi_pos_process_app_reg_req(struct wlan_objmgr_psoc *psoc,
wifi_pos_debug("no active vdev");
vdev_idx = 0;
wifi_pos_obj->wifi_pos_send_rsp(req->pid, ANI_MSG_APP_REG_RSP,
wifi_pos_obj->wifi_pos_send_rsp(req->pid, WIFI_POS_CMD_REGISTRATION,
rsp_len, (uint8_t *)app_reg_rsp);
qdf_mem_free(app_reg_rsp);
@@ -556,7 +557,7 @@ static QDF_STATUS wifi_pos_process_app_reg_req(struct wlan_objmgr_psoc *psoc,
app_reg_failed:
wifi_pos_obj->wifi_pos_send_rsp(req->pid, ANI_MSG_OEM_ERROR,
wifi_pos_obj->wifi_pos_send_rsp(req->pid, WIFI_POS_CMD_ERROR,
sizeof(err), &err);
return ret;
}
@@ -572,15 +573,15 @@ static QDF_STATUS wifi_pos_tlv_callback(struct wlan_objmgr_psoc *psoc,
{
wifi_pos_debug("enter: msg_type: %d", req->msg_type);
switch (req->msg_type) {
case ANI_MSG_APP_REG_REQ:
case WIFI_POS_CMD_REGISTRATION:
return wifi_pos_process_app_reg_req(psoc, req);
case ANI_MSG_OEM_DATA_REQ:
case WIFI_POS_CMD_OEM_DATA:
return wifi_pos_process_data_req(psoc, req);
case ANI_MSG_CHANNEL_INFO_REQ:
case WIFI_POS_CMD_GET_CH_INFO:
return wifi_pos_process_ch_info_req(psoc, req);
case ANI_MSG_SET_OEM_CAP_REQ:
case WIFI_POS_CMD_SET_CAPS:
return wifi_pos_process_set_cap_req(psoc, req);
case ANI_MSG_GET_OEM_CAP_REQ:
case WIFI_POS_CMD_GET_CAPS:
return wifi_pos_process_get_cap_req(psoc, req);
default:
wifi_pos_err("invalid request type");
@@ -740,10 +741,10 @@ int wifi_pos_oem_rsp_handler(struct wlan_objmgr_psoc *psoc,
qdf_mem_copy(&data[oem_rsp->rsp_len_1 + oem_rsp->dma_len],
oem_rsp->data_2, oem_rsp->rsp_len_2);
wifi_pos_send_rsp(app_pid, ANI_MSG_OEM_DATA_RSP, len, data);
wifi_pos_send_rsp(app_pid, WIFI_POS_CMD_OEM_DATA, len, data);
qdf_mem_free(data);
} else {
wifi_pos_send_rsp(app_pid, ANI_MSG_OEM_DATA_RSP,
wifi_pos_send_rsp(app_pid, WIFI_POS_CMD_OEM_DATA,
oem_rsp->rsp_len_1, oem_rsp->data_1);
}

Näytä tiedosto

@@ -27,7 +27,8 @@
QDF_STATUS ucfg_wifi_pos_process_req(struct wlan_objmgr_psoc *psoc,
struct wifi_pos_req_msg *req,
void (*send_rsp_cb)(uint32_t, uint32_t, uint32_t, uint8_t *))
void (*send_rsp_cb)(uint32_t, enum wifi_pos_cmd_ids,
uint32_t, uint8_t *))
{
uint8_t err;
uint32_t app_pid;
@@ -46,21 +47,22 @@ QDF_STATUS ucfg_wifi_pos_process_req(struct wlan_objmgr_psoc *psoc,
wifi_pos_psoc_obj->wifi_pos_send_rsp = send_rsp_cb;
is_app_registered = wifi_pos_psoc_obj->is_app_registered;
app_pid = wifi_pos_psoc_obj->app_pid;
wifi_pos_psoc_obj->rsp_version = req->rsp_version;
qdf_spin_unlock_bh(&wifi_pos_psoc_obj->wifi_pos_lock);
if (!wifi_pos_psoc_obj->wifi_pos_req_handler) {
wifi_pos_err("wifi_pos_psoc_obj->wifi_pos_req_handler is null");
err = OEM_ERR_NULL_CONTEXT;
send_rsp_cb(app_pid, ANI_MSG_OEM_ERROR, sizeof(err), &err);
send_rsp_cb(app_pid, WIFI_POS_CMD_ERROR, sizeof(err), &err);
return QDF_STATUS_E_NULL_VALUE;
}
if (req->msg_type != ANI_MSG_APP_REG_REQ &&
if (req->msg_type != WIFI_POS_CMD_REGISTRATION &&
(!is_app_registered || app_pid != req->pid)) {
wifi_pos_err("requesting app is not registered, app_registered: %d, requesting pid: %d, stored pid: %d",
is_app_registered, req->pid, app_pid);
err = OEM_ERR_APP_NOT_REGISTERED;
send_rsp_cb(app_pid, ANI_MSG_OEM_ERROR, sizeof(err), &err);
send_rsp_cb(app_pid, WIFI_POS_CMD_ERROR, sizeof(err), &err);
return QDF_STATUS_E_INVAL;
}
@@ -115,3 +117,26 @@ void ucfg_wifi_pos_set_oem_6g_supported(struct wlan_objmgr_psoc *psoc,
wifi_pos_psoc->oem_6g_support_disable = val;
qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
}
bool ucfg_wifi_pos_is_nl_rsp(struct wlan_objmgr_psoc *psoc)
{
uint32_t val = 0;
struct wifi_pos_psoc_priv_obj *wifi_pos_psoc =
wifi_pos_get_psoc_priv_obj(psoc);
if (!wifi_pos_psoc) {
wifi_pos_alert("unable to get wifi_pos psoc obj");
return false;
}
qdf_spin_lock_bh(&wifi_pos_psoc->wifi_pos_lock);
val = wifi_pos_psoc->rsp_version;
qdf_spin_unlock_bh(&wifi_pos_psoc->wifi_pos_lock);
if (val == WIFI_POS_RSP_V2_NL)
return true;
else
return false;
}

Näytä tiedosto

@@ -31,6 +31,7 @@
#include "ol_defines.h"
#include "qdf_trace.h"
#include "qdf_module.h"
#include "wifi_pos_utils_pub.h"
struct wlan_objmgr_psoc;
struct wifi_pos_req_msg;
@@ -60,11 +61,6 @@ struct wifi_pos_req_msg;
#define OEM_APP_SIGNATURE_LEN 16
#define OEM_APP_SIGNATURE_STR "QUALCOMM-OEM-APP"
#define OEM_TARGET_SIGNATURE_LEN 8
#define OEM_TARGET_SIGNATURE "QUALCOMM"
#define OEM_CAP_MAX_NUM_CHANNELS 128
#ifndef OEM_DATA_RSP_SIZE
#define OEM_DATA_RSP_SIZE 1724
#endif
@@ -121,73 +117,6 @@ struct oem_data_rsp {
void *vaddr;
};
/**
* struct wifi_pos_driver_version - Driver version identifier (w.x.y.z)
* @major: Version ID major number
* @minor: Version ID minor number
* @patch: Version ID patch number
* @build: Version ID build number
*/
struct qdf_packed wifi_pos_driver_version {
uint8_t major;
uint8_t minor;
uint8_t patch;
uint8_t build;
};
/**
* struct wifi_pos_driver_caps - OEM Data Capabilities
* @oem_target_signature: Signature of chipset vendor, e.g. QUALCOMM
* @oem_target_type: Chip type
* @oem_fw_version: Firmware version
* @driver_version: Host software version
* @allowed_dwell_time_min: Channel dwell time - allowed minimum
* @allowed_dwell_time_max: Channel dwell time - allowed maximum
* @curr_dwell_time_min: Channel dwell time - current minimim
* @curr_dwell_time_max: Channel dwell time - current maximum
* @supported_bands: Supported bands, 2.4G or 5G Hz
* @num_channels: Num of channels IDs to follow
* @channel_list: List of channel IDs
*/
struct qdf_packed wifi_pos_driver_caps {
uint8_t oem_target_signature[OEM_TARGET_SIGNATURE_LEN];
uint32_t oem_target_type;
uint32_t oem_fw_version;
struct wifi_pos_driver_version driver_version;
uint16_t allowed_dwell_time_min;
uint16_t allowed_dwell_time_max;
uint16_t curr_dwell_time_min;
uint16_t curr_dwell_time_max;
uint16_t supported_bands;
uint16_t num_channels;
uint8_t channel_list[OEM_CAP_MAX_NUM_CHANNELS];
};
/**
* struct wifi_pos_user_defined_caps - OEM capability to be exchanged between
* host and userspace
* @ftm_rr: FTM range report capability bit
* @lci_capability: LCI capability bit
* @reserved1: reserved
* @reserved2: reserved
*/
struct wifi_pos_user_defined_caps {
uint32_t ftm_rr:1;
uint32_t lci_capability:1;
uint32_t reserved1:30;
uint32_t reserved2;
};
/**
* struct wifi_pos_oem_get_cap_rsp - capabilities set by userspace and target.
* @driver_cap: target capabilities
* @user_defined_cap: capabilities set by userspace via set request
*/
struct qdf_packed wifi_pos_oem_get_cap_rsp {
struct wifi_pos_driver_caps driver_cap;
struct wifi_pos_user_defined_caps user_defined_cap;
};
/**
* struct wifi_pos_err_rpt - Error report response for userspace.
* @tag_len: tlv header of the message.
@@ -310,6 +239,7 @@ struct wifi_pos_dma_rings_cfg {
* for given freq and channel width
* @wifi_pos_send_action: function pointer to send registered action frames
* to userspace APP
* @rsp_version: rsp version
*
* wifi pos request messages
* <----- fine_time_meas_cap (in bits) ----->
@@ -348,13 +278,15 @@ struct wifi_pos_psoc_priv_obj {
bool oem_6g_support_disable;
QDF_STATUS (*wifi_pos_req_handler)(struct wlan_objmgr_psoc *psoc,
struct wifi_pos_req_msg *req);
void (*wifi_pos_send_rsp)(uint32_t, uint32_t, uint32_t, uint8_t *);
void (*wifi_pos_send_rsp)(uint32_t, enum wifi_pos_cmd_ids,
uint32_t, uint8_t *);
void (*wifi_pos_get_phy_mode)(uint8_t, uint32_t, uint32_t *);
void (*wifi_pos_get_fw_phy_mode_for_freq)(uint32_t, uint32_t,
uint32_t *);
void (*wifi_pos_send_action)(struct wlan_objmgr_psoc *psoc,
uint32_t oem_subtype, uint8_t *buf,
uint32_t len);
uint32_t rsp_version;
};
/**