1
0

qcacld-3.0: Handle TWT renegotiation failure case

Generally below process should happen in renegotiation failure
case.
1. TWT setup (successful)
2. TWT setup (renegotiation failure)
3. TWT teardown
4. TWT GET STATUS - 0(dialog ID) 0 0 0
5. TWT setup - successful

Since all WMI TWT events gets executed in WMI thread. So when
renegotiation failure case hits, driver sends TWT
teardown to firmware and waits for twt ack in worker thread.
In same worker thread TWT event needs to be processed.
TWT ack event will not process as it's waiting in same worker
thread and it will get timedout.

As part of fix, break the context in renegotiation and
send the teardown in the new worker context.

Change-Id: I13c8d44d6582e39d1cc2c2aa10a500fffbf150b1
CRs-Fixed: 3204750
Este cometimento está contido em:
Jyoti Kumari
2022-05-26 00:25:11 +05:30
cometido por Madan Koyyalamudi
ascendente e5375669f2
cometimento 72c3404391
7 ficheiros modificados com 244 adições e 10 eliminações

Ver ficheiro

@@ -2147,3 +2147,46 @@ QDF_STATUS wlan_twt_update_beacon_template(void)
return status;
}
void wlan_twt_set_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_add_dialog_complete_event_param *params,
uint32_t twt_next_action)
{
struct twt_vdev_priv_obj *twt_vdev_priv;
twt_vdev_priv = wlan_objmgr_vdev_get_comp_private_obj(
vdev, WLAN_UMAC_COMP_TWT);
if (!twt_vdev_priv) {
twt_err("twt vdev private obj is null");
return;
}
qdf_copy_macaddr(&twt_vdev_priv->peer_macaddr, &params->peer_macaddr);
twt_vdev_priv->dialog_id = params->dialog_id;
twt_vdev_priv->next_action = twt_next_action;
twt_debug("renego: twt_terminate: dialog_id:%d next_action:%d peer mac_addr "
QDF_MAC_ADDR_FMT, twt_vdev_priv->dialog_id,
twt_vdev_priv->next_action,
QDF_MAC_ADDR_REF(twt_vdev_priv->peer_macaddr.bytes));
}
void wlan_twt_get_work_params(struct wlan_objmgr_vdev *vdev,
struct twt_work_params *params,
uint32_t *next_action)
{
struct twt_vdev_priv_obj *twt_vdev_priv;
twt_vdev_priv = wlan_objmgr_vdev_get_comp_private_obj(
vdev, WLAN_UMAC_COMP_TWT);
if (!twt_vdev_priv) {
twt_err("twt vdev private obj is null");
return;
}
qdf_copy_macaddr(&params->peer_macaddr, &twt_vdev_priv->peer_macaddr);
params->dialog_id = twt_vdev_priv->dialog_id;
*next_action = twt_vdev_priv->next_action;
}

Ver ficheiro

@@ -287,3 +287,28 @@ bool wlan_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
uint8_t dialog_id,
enum wlan_twt_commands cmd,
enum wlan_twt_commands *pactive_cmd);
/**
* wlan_twt_set_work_params() - Set TWT work params
* @vdev: vdev pointer
* @params: TWT add dialog params
* @twt_next_action: Set next action to do before work scheduled
*
* Return: None
*/
void wlan_twt_set_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_add_dialog_complete_event_param *params,
uint32_t twt_next_action);
/**
* wlan_twt_get_work_params() - Get TWT work params
* @vdev: vdev pointer
* @params: pointer to TWT work params
* @next_action: Get next action to do after work scheduled
*
* Return: None
*/
void wlan_twt_get_work_params(struct wlan_objmgr_vdev *vdev,
struct twt_work_params *params,
uint32_t *next_action);

Ver ficheiro

@@ -270,6 +270,30 @@ bool ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
enum wlan_twt_commands cmd,
enum wlan_twt_commands *pactive_cmd);
/**
* ucfg_twt_set_work_params() - Set TWT work params
* @vdev: Vdev pointer
* @params: TWT params
* @twt_next_action: Set TWT next action to do before work schedule
*
* Return: None
*/
void ucfg_twt_set_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_add_dialog_complete_event_param *params,
uint32_t twt_next_action);
/**
* ucfg_twt_get_work_params() - Get TWT work params
* @vdev: vdev pointer
* @params: TWT work params
* @next_action: Get TWT next action to do after work scheduled
*
* Return: None
*/
void ucfg_twt_get_work_params(struct wlan_objmgr_vdev *vdev,
struct twt_work_params *params,
uint32_t *next_action);
#else
static inline
QDF_STATUS ucfg_twt_psoc_open(struct wlan_objmgr_psoc *psoc)
@@ -359,5 +383,21 @@ ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
{
return false;
}
static inline void
ucfg_twt_set_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_add_dialog_complete_event_param *params,
uint32_t twt_next_action)
{
}
static inline void
ucfg_twt_get_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_work_params *params,
uint32_t *next_action)
{
}
#endif
#endif

Ver ficheiro

@@ -200,3 +200,19 @@ bool ucfg_twt_is_command_in_progress(struct wlan_objmgr_psoc *psoc,
return wlan_twt_is_command_in_progress(psoc, peer_mac, dialog_id, cmd,
pactive_cmd);
}
void ucfg_twt_set_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_add_dialog_complete_event_param *params,
uint32_t twt_next_action)
{
return wlan_twt_set_work_params(vdev, params, twt_next_action);
}
void ucfg_twt_get_work_params(
struct wlan_objmgr_vdev *vdev,
struct twt_work_params *params,
uint32_t *next_action)
{
return wlan_twt_get_work_params(vdev, params, next_action);
}