cnss2: Add support for async data QMI indication
Add support for async data QMI indication from firmware. Change-Id: I957e5b219d19f7a531dd25133a05da64857d068d CRs-Fixed: 3782100
This commit is contained in:

committed by
Ravindra Konda

parent
6cb33ae73f
commit
085c1c4748
19
cnss2/main.c
19
cnss2/main.c
@@ -2497,6 +2497,25 @@ int cnss_qmi_send(struct device *dev, int type, void *cmd,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cnss_qmi_send);
|
EXPORT_SYMBOL(cnss_qmi_send);
|
||||||
|
|
||||||
|
int cnss_register_driver_async_data_cb(struct device *dev, void *cb_ctx,
|
||||||
|
int (*cb)(void *ctx, uint16_t type,
|
||||||
|
void *event, int event_len))
|
||||||
|
{
|
||||||
|
struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev);
|
||||||
|
|
||||||
|
if (!plat_priv)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (!test_bit(CNSS_QMI_WLFW_CONNECTED, &plat_priv->driver_state))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
plat_priv->get_driver_async_data_cb = cb;
|
||||||
|
plat_priv->get_driver_async_data_ctx = cb_ctx;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cnss_register_driver_async_data_cb);
|
||||||
|
|
||||||
static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv)
|
static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@@ -603,6 +603,8 @@ struct cnss_plat_data {
|
|||||||
u64 dynamic_feature;
|
u64 dynamic_feature;
|
||||||
void *get_info_cb_ctx;
|
void *get_info_cb_ctx;
|
||||||
int (*get_info_cb)(void *ctx, void *event, int event_len);
|
int (*get_info_cb)(void *ctx, void *event, int event_len);
|
||||||
|
void *get_driver_async_data_ctx;
|
||||||
|
int (*get_driver_async_data_cb)(void *ctx, uint16_t type, void *event, int event_len);
|
||||||
bool cbc_enabled;
|
bool cbc_enabled;
|
||||||
u8 use_pm_domain;
|
u8 use_pm_domain;
|
||||||
u8 use_nv_mac;
|
u8 use_nv_mac;
|
||||||
|
@@ -3094,6 +3094,8 @@ int cnss_pci_call_driver_remove(struct cnss_pci_data *pci_priv)
|
|||||||
|
|
||||||
plat_priv->get_info_cb_ctx = NULL;
|
plat_priv->get_info_cb_ctx = NULL;
|
||||||
plat_priv->get_info_cb = NULL;
|
plat_priv->get_info_cb = NULL;
|
||||||
|
plat_priv->get_driver_async_data_ctx = NULL;
|
||||||
|
plat_priv->get_driver_async_data_cb = NULL;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
37
cnss2/qmi.c
37
cnss2/qmi.c
@@ -190,6 +190,8 @@ static int cnss_wlfw_ind_register_send_sync(struct cnss_plat_data *plat_priv)
|
|||||||
req->respond_get_info_enable = 1;
|
req->respond_get_info_enable = 1;
|
||||||
req->wfc_call_twt_config_enable_valid = 1;
|
req->wfc_call_twt_config_enable_valid = 1;
|
||||||
req->wfc_call_twt_config_enable = 1;
|
req->wfc_call_twt_config_enable = 1;
|
||||||
|
req->async_data_enable_valid = 1;
|
||||||
|
req->async_data_enable = 1;
|
||||||
|
|
||||||
ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
|
ret = qmi_txn_init(&plat_priv->qmi_wlfw, &txn,
|
||||||
wlfw_ind_register_resp_msg_v01_ei, resp);
|
wlfw_ind_register_resp_msg_v01_ei, resp);
|
||||||
@@ -3108,6 +3110,33 @@ static void cnss_wlfw_respond_get_info_ind_cb(struct qmi_handle *qmi_wlfw,
|
|||||||
ind_msg->data_len);
|
ind_msg->data_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void cnss_wlfw_driver_async_data_ind_cb(struct qmi_handle *qmi_wlfw,
|
||||||
|
struct sockaddr_qrtr *sq,
|
||||||
|
struct qmi_txn *txn,
|
||||||
|
const void *data)
|
||||||
|
{
|
||||||
|
struct cnss_plat_data *plat_priv =
|
||||||
|
container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw);
|
||||||
|
const struct wlfw_driver_async_data_ind_msg_v01 *ind_msg = data;
|
||||||
|
|
||||||
|
cnss_pr_buf("Received QMI WLFW driver async data indication\n");
|
||||||
|
|
||||||
|
if (!txn) {
|
||||||
|
cnss_pr_err("Spurious indication\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cnss_pr_buf("Extract message with event length: %d, type: %d\n",
|
||||||
|
ind_msg->data_len, ind_msg->type);
|
||||||
|
|
||||||
|
if (plat_priv->get_driver_async_data_ctx &&
|
||||||
|
plat_priv->get_driver_async_data_cb)
|
||||||
|
plat_priv->get_driver_async_data_cb(
|
||||||
|
plat_priv->get_driver_async_data_ctx, ind_msg->type,
|
||||||
|
(void *)ind_msg->data, ind_msg->data_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int cnss_ims_wfc_call_twt_cfg_send_sync
|
static int cnss_ims_wfc_call_twt_cfg_send_sync
|
||||||
(struct cnss_plat_data *plat_priv,
|
(struct cnss_plat_data *plat_priv,
|
||||||
const struct wlfw_wfc_call_twt_config_ind_msg_v01 *ind_msg)
|
const struct wlfw_wfc_call_twt_config_ind_msg_v01 *ind_msg)
|
||||||
@@ -3319,6 +3348,14 @@ static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = {
|
|||||||
sizeof(struct wlfw_wfc_call_twt_config_ind_msg_v01),
|
sizeof(struct wlfw_wfc_call_twt_config_ind_msg_v01),
|
||||||
.fn = cnss_wlfw_process_twt_cfg_ind
|
.fn = cnss_wlfw_process_twt_cfg_ind
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.type = QMI_INDICATION,
|
||||||
|
.msg_id = QMI_WLFW_DRIVER_ASYNC_DATA_IND_V01,
|
||||||
|
.ei = wlfw_driver_async_data_ind_msg_v01_ei,
|
||||||
|
.decoded_size =
|
||||||
|
sizeof(struct wlfw_driver_async_data_ind_msg_v01),
|
||||||
|
.fn = cnss_wlfw_driver_async_data_ind_cb
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -463,4 +463,8 @@ extern int cnss_get_curr_therm_cdev_state(struct device *dev,
|
|||||||
extern int cnss_update_time_sync_period(struct device *dev,
|
extern int cnss_update_time_sync_period(struct device *dev,
|
||||||
uint32_t time_sync_period);
|
uint32_t time_sync_period);
|
||||||
extern int cnss_reset_time_sync_period(struct device *dev);
|
extern int cnss_reset_time_sync_period(struct device *dev);
|
||||||
|
extern int cnss_register_driver_async_data_cb(struct device *dev, void *cb_ctx,
|
||||||
|
int (*cb)(void *ctx,
|
||||||
|
uint16_t type, void *event,
|
||||||
|
int event_len));
|
||||||
#endif /* _NET_CNSS2_H */
|
#endif /* _NET_CNSS2_H */
|
||||||
|
Reference in New Issue
Block a user