qcacmn: Add support for WMI_TWT_NUDGE_DIALOG_CMDID

Add support for WMI_TWT_NUDGE_DIALOG_CMDID and
WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID.

Change-Id: I9d4bf1061f6f08479967619ce50d2756c062f55f
CRs-Fixed: 2825138
This commit is contained in:
Paul Zhang
2020-12-15 10:58:26 +08:00
committed by snandini
parent 1e98fba13b
commit 59ef5a49a8
7 changed files with 255 additions and 18 deletions

View File

@@ -4725,6 +4725,7 @@ typedef enum {
wmi_twt_del_dialog_complete_event_id,
wmi_twt_pause_dialog_complete_event_id,
wmi_twt_resume_dialog_complete_event_id,
wmi_twt_nudge_dialog_complete_event_id,
wmi_twt_session_stats_event_id,
#endif
wmi_apf_get_vdev_work_memory_resp_event_id,

View File

@@ -2205,6 +2205,9 @@ QDF_STATUS (*send_twt_del_dialog_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*send_twt_pause_dialog_cmd)(wmi_unified_t wmi_handle,
struct wmi_twt_pause_dialog_cmd_param *params);
QDF_STATUS (*send_twt_nudge_dialog_cmd)(wmi_unified_t wmi_handle,
struct wmi_twt_nudge_dialog_cmd_param *params);
QDF_STATUS (*send_twt_resume_dialog_cmd)(wmi_unified_t wmi_handle,
struct wmi_twt_resume_dialog_cmd_param *params);
@@ -2243,6 +2246,10 @@ QDF_STATUS (*extract_twt_pause_dialog_comp_event)(wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_pause_dialog_complete_event_param *params);
QDF_STATUS (*extract_twt_nudge_dialog_comp_event)(wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_nudge_dialog_complete_event_param *params);
QDF_STATUS (*extract_twt_resume_dialog_comp_event)(wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_resume_dialog_complete_event_param *params);

View File

@@ -81,6 +81,17 @@ QDF_STATUS
wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle,
struct wmi_twt_pause_dialog_cmd_param *params);
/**
* wmi_unified_twt_nudge_dialog_cmd() - Send WMI command to nudge TWT dialog
* @wmi_handle: wmi handle
* @params: Parameters to be configured
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS
wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle,
struct wmi_twt_nudge_dialog_cmd_param *params);
/**
* wmi_unified_twt_resume_dialog_cmd() - Send WMI command to resume TWT dialog
* @wmi_handle: wmi handle
@@ -203,6 +214,20 @@ QDF_STATUS wmi_extract_twt_pause_dialog_comp_event(
uint8_t *evt_buf,
struct wmi_twt_pause_dialog_complete_event_param *params);
/**
* wmi_extract_twt_nudge_dialog_comp_event() - Extract WMI event params for TWT
* nudge dialog completion event
* @wmi_handle: wmi handle
* @evt_buf: Pointer event buffer
* @params: Parameters to extract
*
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
*/
QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event(
wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_nudge_dialog_complete_event_param *params);
/**
* wmi_extract_twt_resume_dialog_comp_event() - Extract WMI event params for TWT
* resume dialog completion event

View File

@@ -129,7 +129,8 @@ enum WMI_HOST_ENABLE_TWT_STATUS {
WMI_HOST_ENABLE_TWT_STATUS_UNKNOWN_ERROR,
};
/** struct wmi_twt_enable_complete_event_param:
/**
* struct wmi_twt_enable_complete_event_param:
* @pdev_is: pdev_id for identifying the MAC.
* @status: From enum WMI_HOST_ENABLE_TWT_STATUS
*/
@@ -139,7 +140,7 @@ struct wmi_twt_enable_complete_event_param {
};
/**
*struct wmi_twt_disable_param:
* struct wmi_twt_disable_param:
* @pdev_id: pdev_id for identifying the MAC.
* @ext_conf_present: If requestor/responder extend config is present.
* @twt_role: values from enum WMI_TWT_ROLE.
@@ -152,7 +153,8 @@ struct wmi_twt_disable_param {
enum WMI_TWT_OPERATION twt_oper;
};
/** struct wmi_twt_disable_complete_event:
/**
* struct wmi_twt_disable_complete_event:
* @pdev_id: pdev_id for identifying the MAC.
*/
struct wmi_twt_disable_complete_event {
@@ -204,7 +206,8 @@ struct wmi_host_twt_session_stats_info {
uint32_t sp_tsf_us_hi;
};
/** struct wmi_twt_session_stats_event:
/**
* struct wmi_twt_session_stats_event:
* @pdev_id: pdev_id for identifying the MAC.
* @num_sessions: number of TWT sessions
* @twt_sessions: received TWT sessions
@@ -226,7 +229,8 @@ enum WMI_HOST_TWT_COMMAND {
WMI_HOST_TWT_COMMAND_REJECT_TWT = 7,
};
/** struct wmi_twt_add_dialog_param -
/**
* struct wmi_twt_add_dialog_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: peer MAC address when vdev is AP VDEV
* @dialog_id: diaglog_id (TWT dialog ID)
@@ -341,7 +345,8 @@ struct wmi_twt_add_dialog_additional_params {
uint32_t sp_tsf_us_hi;
};
/** struct wmi_twt_add_dialog_complete_param -
/**
* struct wmi_twt_add_dialog_complete_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -356,7 +361,8 @@ struct wmi_twt_add_dialog_complete_event_param {
uint32_t num_additional_twt_params;
};
/** struct wmi_twt_del_dialog_param -
/**
* struct wmi_twt_del_dialog_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -393,7 +399,8 @@ enum WMI_HOST_DEL_TWT_STATUS {
WMI_HOST_DEL_TWT_STATUS_UNKNOWN_ERROR,
};
/** struct wmi_twt_del_dialog_complete_event_param -
/**
* struct wmi_twt_del_dialog_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -410,7 +417,8 @@ struct wmi_twt_del_dialog_complete_event_param {
uint32_t status;
};
/** struct wmi_twt_pause_dialog_cmd_param -
/**
* struct wmi_twt_pause_dialog_cmd_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -421,6 +429,22 @@ struct wmi_twt_pause_dialog_cmd_param {
uint32_t dialog_id;
};
/**
* struct wmi_twt_nudge_dialog_cmd_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
* @suspend_duration: TWT suspend duration in microseconds
* @next_twt_size: next TWT size
*/
struct wmi_twt_nudge_dialog_cmd_param {
uint32_t vdev_id;
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
uint32_t dialog_id;
uint32_t suspend_duration;
uint32_t next_twt_size;
};
/* enum WMI_HOST_PAUSE_TWT_STATUS - status code of pausing TWT dialog
* WMI_HOST_PAUSE_TWT_STATUS_OK: pausing TWT dialog successfully completed
* WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST: TWT dialog ID not exists
@@ -445,7 +469,8 @@ enum WMI_HOST_PAUSE_TWT_STATUS {
WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED,
};
/** struct wmi_twt_pause_dialog_complete_event_param -
/**
* struct wmi_twt_pause_dialog_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -455,10 +480,47 @@ struct wmi_twt_pause_dialog_complete_event_param {
uint32_t vdev_id;
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
uint32_t dialog_id;
uint32_t status;
enum WMI_HOST_PAUSE_TWT_STATUS status;
};
/** struct wmi_twt_resume_dialog_cmd_param -
/* enum WMI_HOST_NUDGE_TWT_STATUS - status code of nudge TWT dialog
* WMI_HOST_NUDGE_TWT_STATUS_OK: nudge TWT dialog successfully completed
* WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST: TWT dialog ID not exists
* WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM: invalid parameters
* WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY: FW is in the process of handling
* this dialog
* WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE: FW resource exhausted
* WMI_HOST_NUDGE_TWT_STATUS_NO_ACK: peer AP/STA did not ACK the
* request/response frame
* WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR: nudge TWT dialog failed with an
* unknown reason
*/
enum WMI_HOST_NUDGE_TWT_STATUS {
WMI_HOST_NUDGE_TWT_STATUS_OK,
WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST,
WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM,
WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY,
WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE,
WMI_HOST_NUDGE_TWT_STATUS_NO_ACK,
WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR,
};
/**
* struct wmi_twt_nudge_dialog_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
* @status: refer to WMI_HOST_PAUSE_TWT_STATUS
*/
struct wmi_twt_nudge_dialog_complete_event_param {
uint32_t vdev_id;
uint8_t peer_macaddr[QDF_MAC_ADDR_SIZE];
uint32_t dialog_id;
enum WMI_HOST_NUDGE_TWT_STATUS status;
};
/**
* struct wmi_twt_resume_dialog_cmd_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -498,7 +560,8 @@ enum WMI_HOST_RESUME_TWT_STATUS {
WMI_HOST_RESUME_TWT_STATUS_UNKNOWN_ERROR,
};
/** struct wmi_twt_resume_dialog_complete_event_param -
/**
* struct wmi_twt_resume_dialog_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -512,7 +575,8 @@ struct wmi_twt_resume_dialog_complete_event_param {
};
#ifdef WLAN_SUPPORT_BCAST_TWT
/** struct wmi_twt_btwt_invite_sta_cmd_param -
/**
* struct wmi_twt_btwt_invite_sta_cmd_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: TWT dialog ID
@@ -548,7 +612,8 @@ enum WMI_HOST_INVITATION_TWT_BTWT_STATUS {
WMI_HOST_INVITATION_TWT_BTWT_STATUS_UNKNOWN_ERROR,
};
/** struct wmi_twt_btwt_invite_sta_complete_event_param -
/**
* struct wmi_twt_btwt_invite_sta_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: BTWT dialog ID
@@ -561,7 +626,8 @@ struct wmi_twt_btwt_invite_sta_complete_event_param {
uint32_t status;
};
/** struct wmi_twt_btwt_remove_sta_cmd_param -
/**
* struct wmi_twt_btwt_remove_sta_cmd_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: BTWT dialog ID
@@ -597,7 +663,8 @@ enum WMI_HOST_KICKOFF_TWT_BTWT_STATUS {
WMI_HOST_KICKOFF_TWT_BTWT_STATUS_UNKNOWN_ERROR,
};
/** struct wmi_twt_btwt_remove_sta_complete_event_param -
/**
* struct wmi_twt_btwt_remove_sta_complete_event_param -
* @vdev_id: VDEV identifier
* @peer_macaddr: Peer mac address
* @dialog_id: BTWT dialog ID

View File

@@ -14829,6 +14829,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID;
event_ids[wmi_twt_resume_dialog_complete_event_id] =
WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID;
event_ids[wmi_twt_nudge_dialog_complete_event_id] =
WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID;
event_ids[wmi_twt_session_stats_event_id] =
WMI_TWT_SESSION_STATS_EVENTID;
#endif

View File

@@ -78,6 +78,17 @@ wmi_unified_twt_pause_dialog_cmd(wmi_unified_t wmi_handle,
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_twt_nudge_dialog_cmd(wmi_unified_t wmi_handle,
struct wmi_twt_nudge_dialog_cmd_param *params)
{
if (wmi_handle->ops->send_twt_nudge_dialog_cmd)
return wmi_handle->ops->send_twt_nudge_dialog_cmd(
wmi_handle, params);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS wmi_unified_twt_resume_dialog_cmd(
wmi_unified_t wmi_handle,
struct wmi_twt_resume_dialog_cmd_param *params)
@@ -187,6 +198,18 @@ QDF_STATUS wmi_extract_twt_pause_dialog_comp_event(
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS wmi_extract_twt_nudge_dialog_comp_event(
wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_nudge_dialog_complete_event_param *params)
{
if (wmi_handle->ops->extract_twt_nudge_dialog_comp_event)
return wmi_handle->ops->extract_twt_nudge_dialog_comp_event(
wmi_handle, evt_buf, params);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS wmi_extract_twt_resume_dialog_comp_event(
wmi_unified_t wmi_handle,
uint8_t *evt_buf,

View File

@@ -276,6 +276,43 @@ send_twt_pause_dialog_cmd_tlv(wmi_unified_t wmi_handle,
return status;
}
static QDF_STATUS
send_twt_nudge_dialog_cmd_tlv(wmi_unified_t wmi_handle,
struct wmi_twt_nudge_dialog_cmd_param *params)
{
wmi_twt_nudge_dialog_cmd_fixed_param *cmd;
wmi_buf_t buf;
QDF_STATUS status;
buf = wmi_buf_alloc(wmi_handle, sizeof(*cmd));
if (!buf)
return QDF_STATUS_E_FAILURE;
cmd = (wmi_twt_nudge_dialog_cmd_fixed_param *) wmi_buf_data(buf);
WMITLV_SET_HDR(&cmd->tlv_header,
WMITLV_TAG_STRUC_wmi_twt_nudge_dialog_cmd_fixed_param,
WMITLV_GET_STRUCT_TLVLEN
(wmi_twt_nudge_dialog_cmd_fixed_param));
cmd->vdev_id = params->vdev_id;
WMI_CHAR_ARRAY_TO_MAC_ADDR(params->peer_macaddr, &cmd->peer_macaddr);
cmd->dialog_id = params->dialog_id;
cmd->suspend_duration_ms = params->suspend_duration / 1000;
cmd->next_twt_size = params->next_twt_size;
wmi_debug("vdev_id: %d dialog_id: %d duration(in ms): %u next_twt_size: %d "
"peer_macaddr: "QDF_MAC_ADDR_FMT, cmd->vdev_id,
cmd->dialog_id, cmd->suspend_duration_ms, cmd->next_twt_size,
QDF_MAC_ADDR_REF(params->peer_macaddr));
status = wmi_unified_cmd_send(wmi_handle, buf, sizeof(*cmd),
WMI_TWT_NUDGE_DIALOG_CMDID);
if (QDF_IS_STATUS_ERROR(status))
wmi_buf_free(buf);
return status;
}
static QDF_STATUS send_twt_resume_dialog_cmd_tlv(wmi_unified_t wmi_handle,
struct wmi_twt_resume_dialog_cmd_param *params)
{
@@ -570,6 +607,31 @@ static QDF_STATUS extract_twt_del_dialog_comp_event_tlv(
return QDF_STATUS_SUCCESS;
}
static enum WMI_HOST_PAUSE_TWT_STATUS
wmi_twt_pause_status_to_host_twt_status(WMI_PAUSE_TWT_STATUS_T status)
{
switch (status) {
case WMI_PAUSE_TWT_STATUS_OK:
return WMI_HOST_PAUSE_TWT_STATUS_OK;
case WMI_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
case WMI_PAUSE_TWT_STATUS_INVALID_PARAM:
return WMI_HOST_PAUSE_TWT_STATUS_INVALID_PARAM;
case WMI_PAUSE_TWT_STATUS_DIALOG_ID_BUSY:
return WMI_HOST_PAUSE_TWT_STATUS_DIALOG_ID_BUSY;
case WMI_PAUSE_TWT_STATUS_NO_RESOURCE:
return WMI_HOST_PAUSE_TWT_STATUS_NO_RESOURCE;
case WMI_PAUSE_TWT_STATUS_NO_ACK:
return WMI_HOST_PAUSE_TWT_STATUS_NO_ACK;
case WMI_PAUSE_TWT_STATUS_UNKNOWN_ERROR:
return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
case WMI_PAUSE_TWT_STATUS_ALREADY_PAUSED:
return WMI_HOST_PAUSE_TWT_STATUS_ALREADY_PAUSED;
default:
return WMI_HOST_PAUSE_TWT_STATUS_UNKNOWN_ERROR;
}
}
static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
wmi_unified_t wmi_handle,
uint8_t *evt_buf,
@@ -588,7 +650,54 @@ static QDF_STATUS extract_twt_pause_dialog_comp_event_tlv(
params->vdev_id = ev->vdev_id;
WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
params->status = ev->status;
params->status = wmi_twt_pause_status_to_host_twt_status(ev->status);
params->dialog_id = ev->dialog_id;
return QDF_STATUS_SUCCESS;
}
static enum WMI_HOST_NUDGE_TWT_STATUS
wmi_twt_nudge_status_to_host_twt_status(WMI_TWT_NUDGE_STATUS_T status)
{
switch (status) {
case WMI_NUDGE_TWT_STATUS_OK:
return WMI_HOST_NUDGE_TWT_STATUS_OK;
case WMI_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST:
return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_NOT_EXIST;
case WMI_NUDGE_TWT_STATUS_INVALID_PARAM:
return WMI_HOST_NUDGE_TWT_STATUS_INVALID_PARAM;
case WMI_NUDGE_TWT_STATUS_DIALOG_ID_BUSY:
return WMI_HOST_NUDGE_TWT_STATUS_DIALOG_ID_BUSY;
case WMI_NUDGE_TWT_STATUS_NO_RESOURCE:
return WMI_HOST_NUDGE_TWT_STATUS_NO_RESOURCE;
case WMI_NUDGE_TWT_STATUS_NO_ACK:
return WMI_HOST_NUDGE_TWT_STATUS_NO_ACK;
case WMI_NUDGE_TWT_STATUS_UNKNOWN_ERROR:
return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
default:
return WMI_HOST_NUDGE_TWT_STATUS_UNKNOWN_ERROR;
}
}
static QDF_STATUS extract_twt_nudge_dialog_comp_event_tlv(
wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct wmi_twt_nudge_dialog_complete_event_param *params)
{
WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *param_buf;
wmi_twt_nudge_dialog_complete_event_fixed_param *ev;
param_buf = (WMI_TWT_NUDGE_DIALOG_COMPLETE_EVENTID_param_tlvs *)evt_buf;
if (!param_buf) {
wmi_err("evt_buf is NULL");
return QDF_STATUS_E_INVAL;
}
ev = param_buf->fixed_param;
params->vdev_id = ev->vdev_id;
WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->peer_macaddr, params->peer_macaddr);
params->status = wmi_twt_nudge_status_to_host_twt_status(ev->status);
params->dialog_id = ev->dialog_id;
return QDF_STATUS_SUCCESS;
@@ -793,6 +902,7 @@ void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
ops->send_twt_add_dialog_cmd = send_twt_add_dialog_cmd_tlv;
ops->send_twt_del_dialog_cmd = send_twt_del_dialog_cmd_tlv;
ops->send_twt_pause_dialog_cmd = send_twt_pause_dialog_cmd_tlv;
ops->send_twt_nudge_dialog_cmd = send_twt_nudge_dialog_cmd_tlv;
ops->send_twt_resume_dialog_cmd = send_twt_resume_dialog_cmd_tlv;
ops->extract_twt_enable_comp_event = extract_twt_enable_comp_event_tlv;
ops->extract_twt_disable_comp_event =
@@ -805,6 +915,8 @@ void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
extract_twt_del_dialog_comp_event_tlv;
ops->extract_twt_pause_dialog_comp_event =
extract_twt_pause_dialog_comp_event_tlv;
ops->extract_twt_nudge_dialog_comp_event =
extract_twt_nudge_dialog_comp_event_tlv;
ops->extract_twt_resume_dialog_comp_event =
extract_twt_resume_dialog_comp_event_tlv;
ops->extract_twt_session_stats_event =