cnss2: Add API to send WFC mode to WLAN FW
Add and export API to host driver to send WFC(WiFi Calling) mode to WLAN FW. Change-Id: I92d3d0baad9afc6fdf66f66b847a4e8a90a54341 CRs-Fixed: 3346550
This commit is contained in:

committed by
Madan Koyyalamudi

parent
35fdadc9a2
commit
42fee6ecad
20
cnss2/main.c
20
cnss2/main.c
@@ -4129,6 +4129,26 @@ register_driver:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cnss_wlan_hw_enable);
|
EXPORT_SYMBOL(cnss_wlan_hw_enable);
|
||||||
|
|
||||||
|
int cnss_set_wfc_mode(struct device *dev, struct cnss_wfc_cfg cfg)
|
||||||
|
{
|
||||||
|
struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!plat_priv)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* If IMS server is connected, return success without QMI send */
|
||||||
|
if (test_bit(CNSS_IMS_CONNECTED, &plat_priv->driver_state)) {
|
||||||
|
cnss_pr_dbg("Ignore host request as IMS server is connected");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = cnss_wlfw_send_host_wfc_call_status(plat_priv, cfg);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cnss_set_wfc_mode);
|
||||||
|
|
||||||
static int cnss_probe(struct platform_device *plat_dev)
|
static int cnss_probe(struct platform_device *plat_dev)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
68
cnss2/qmi.c
68
cnss2/qmi.c
@@ -2165,6 +2165,74 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cnss_wlfw_send_host_wfc_call_status(struct cnss_plat_data *plat_priv,
|
||||||
|
struct cnss_wfc_cfg cfg)
|
||||||
|
{
|
||||||
|
struct wlfw_wfc_call_status_req_msg_v01 *req;
|
||||||
|
struct wlfw_wfc_call_status_resp_msg_v01 *resp;
|
||||||
|
struct qmi_txn txn;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!test_bit(CNSS_FW_READY, &plat_priv->driver_state)) {
|
||||||
|
cnss_pr_err("Drop host WFC indication as FW not initialized\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
||||||
|
if (!req)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
resp = kzalloc(sizeof(*resp), GFP_KERNEL);
|
||||||
|
if (!resp) {
|
||||||
|
kfree(req);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
req->wfc_call_active_valid = 1;
|
||||||
|
req->wfc_call_active = cfg.mode;
|
||||||
|
|
||||||
|
cnss_pr_dbg("CNSS->FW: WFC_CALL_REQ: state: 0x%lx\n",
|
||||||
|
plat_priv->driver_state);
|
||||||
|
|
||||||
|
ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
|
||||||
|
wlfw_wfc_call_status_resp_msg_v01_ei, resp);
|
||||||
|
if (ret < 0) {
|
||||||
|
cnss_pr_err("CNSS->FW: WFC_CALL_REQ: QMI Txn Init: Err %d\n",
|
||||||
|
ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
cnss_pr_dbg("Send WFC Mode: %d\n", cfg.mode);
|
||||||
|
ret = qmi_send_request(&plat_priv->qmi_wlfw, NULL, &txn,
|
||||||
|
QMI_WLFW_WFC_CALL_STATUS_REQ_V01,
|
||||||
|
WLFW_WFC_CALL_STATUS_REQ_MSG_V01_MAX_MSG_LEN,
|
||||||
|
wlfw_wfc_call_status_req_msg_v01_ei, req);
|
||||||
|
if (ret < 0) {
|
||||||
|
qmi_txn_cancel(&txn);
|
||||||
|
cnss_pr_err("CNSS->FW: WFC_CALL_REQ: QMI Send Err: %d\n",
|
||||||
|
ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = qmi_txn_wait(&txn, QMI_WLFW_TIMEOUT_JF);
|
||||||
|
if (ret < 0) {
|
||||||
|
cnss_pr_err("FW->CNSS: WFC_CALL_RSP: QMI Wait Err: %d\n",
|
||||||
|
ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
|
||||||
|
cnss_pr_err("FW->CNSS: WFC_CALL_RSP: Result: %d Err: %d\n",
|
||||||
|
resp->resp.result, resp->resp.error);
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
out:
|
||||||
|
kfree(req);
|
||||||
|
kfree(resp);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
}
|
||||||
static int cnss_wlfw_wfc_call_status_send_sync
|
static int cnss_wlfw_wfc_call_status_send_sync
|
||||||
(struct cnss_plat_data *plat_priv,
|
(struct cnss_plat_data *plat_priv,
|
||||||
const struct ims_private_service_wfc_call_status_ind_msg_v01 *ind_msg)
|
const struct ims_private_service_wfc_call_status_ind_msg_v01 *ind_msg)
|
||||||
|
@@ -91,6 +91,8 @@ int cnss_wlfw_cal_report_req_send_sync(struct cnss_plat_data *plat_priv,
|
|||||||
int cnss_send_subsys_restart_level_msg(struct cnss_plat_data *plat_priv);
|
int cnss_send_subsys_restart_level_msg(struct cnss_plat_data *plat_priv);
|
||||||
int cnss_wlfw_ini_file_send_sync(struct cnss_plat_data *plat_priv,
|
int cnss_wlfw_ini_file_send_sync(struct cnss_plat_data *plat_priv,
|
||||||
enum wlfw_ini_file_type_v01 file_type);
|
enum wlfw_ini_file_type_v01 file_type);
|
||||||
|
int cnss_wlfw_send_host_wfc_call_status(struct cnss_plat_data *plat_priv,
|
||||||
|
struct cnss_wfc_cfg cfg);
|
||||||
void cnss_cancel_dms_work(void);
|
void cnss_cancel_dms_work(void);
|
||||||
#else
|
#else
|
||||||
#define QMI_WLFW_TIMEOUT_MS 10000
|
#define QMI_WLFW_TIMEOUT_MS 10000
|
||||||
@@ -323,6 +325,12 @@ int cnss_wlfw_ini_file_send_sync(struct cnss_plat_data *plat_priv,
|
|||||||
static void cnss_cancel_dms_work(void)
|
static void cnss_cancel_dms_work(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cnss_wlfw_send_host_wfc_call_status(struct cnss_plat_data *plat_priv,
|
||||||
|
struct cnss_wfc_cfg cfg)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_CNSS2_QMI */
|
#endif /* CONFIG_CNSS2_QMI */
|
||||||
|
|
||||||
#ifdef CONFIG_CNSS2_DEBUG
|
#ifdef CONFIG_CNSS2_DEBUG
|
||||||
|
10
inc/cnss2.h
10
inc/cnss2.h
@@ -98,6 +98,15 @@ enum cnss_bus_event_type {
|
|||||||
BUS_EVENT_INVALID = 0xFFFF,
|
BUS_EVENT_INVALID = 0xFFFF,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum cnss_wfc_mode {
|
||||||
|
CNSS_WFC_MODE_OFF,
|
||||||
|
CNSS_WFC_MODE_ON,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cnss_wfc_cfg {
|
||||||
|
enum cnss_wfc_mode mode;
|
||||||
|
};
|
||||||
|
|
||||||
struct cnss_hang_event {
|
struct cnss_hang_event {
|
||||||
void *hang_event_data;
|
void *hang_event_data;
|
||||||
u16 hang_event_data_len;
|
u16 hang_event_data_len;
|
||||||
@@ -304,4 +313,5 @@ extern int cnss_send_buffer_to_afcmem(struct device *dev, char *afcdb,
|
|||||||
uint32_t len, uint8_t slotid);
|
uint32_t len, uint8_t slotid);
|
||||||
extern int cnss_reset_afcmem(struct device *dev, uint8_t slotid);
|
extern int cnss_reset_afcmem(struct device *dev, uint8_t slotid);
|
||||||
extern bool cnss_get_fw_cap(struct device *dev, enum cnss_fw_caps fw_cap);
|
extern bool cnss_get_fw_cap(struct device *dev, enum cnss_fw_caps fw_cap);
|
||||||
|
extern int cnss_set_wfc_mode(struct device *dev, struct cnss_wfc_cfg cfg);
|
||||||
#endif /* _NET_CNSS2_H */
|
#endif /* _NET_CNSS2_H */
|
||||||
|
Reference in New Issue
Block a user