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:

cometido por
Madan Koyyalamudi

ascendente
e5375669f2
cometimento
72c3404391
@@ -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, ¶ms->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(¶ms->peer_macaddr, &twt_vdev_priv->peer_macaddr);
|
||||
params->dialog_id = twt_vdev_priv->dialog_id;
|
||||
*next_action = twt_vdev_priv->next_action;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador