qcacld-3.0: Send IPA UC disconnect events during SSR
Currently during SSR IPA events such as AP DISCONNECT/ STA DISCONNECT are not sent and also wlan ipa interafces are not deregistered. After SSR when host sends AP CONNECT/ STA CONNECT and register interafce IPACM will reject as for previous events before SSR there are no disconnect events. This leads to data come via exception path instead taking IPA HW route as interface headers are not registered. In this fix send IPA UC disconnect events and deregister interafces during SSR. Change-Id: I6e617261ec53b7d572023613d212eae057b13b03 CRs-Fixed: 2315828
This commit is contained in:

committed by
nshrivas

parent
1692545a0b
commit
f3c95eb167
@@ -642,5 +642,13 @@ QDF_STATUS wlan_ipa_uc_disconnect_ap(struct wlan_ipa_priv *ipa_ctx,
|
||||
*/
|
||||
void wlan_ipa_cleanup_dev_iface(struct wlan_ipa_priv *ipa_ctx,
|
||||
qdf_netdev_t net_dev);
|
||||
|
||||
/**
|
||||
* wlan_ipa_uc_ssr_cleanup() - handle IPA UC clean up during SSR
|
||||
* @ipa_ctx: IPA context
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void wlan_ipa_uc_ssr_cleanup(struct wlan_ipa_priv *ipa_ctx);
|
||||
#endif /* IPA_OFFLOAD */
|
||||
#endif /* _WLAN_IPA_CORE_H_ */
|
||||
|
@@ -401,10 +401,17 @@ QDF_STATUS ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev,
|
||||
* @pdev: pdev obj
|
||||
* @net_dev: Interface net device
|
||||
*
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
|
||||
qdf_netdev_t net_dev);
|
||||
|
||||
/**
|
||||
* ipa_uc_ssr_cleanup() - handle IPA UC cleanup during SSR
|
||||
* @pdev: pdev obj
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev);
|
||||
#endif /* IPA_OFFLOAD */
|
||||
#endif /* end of _WLAN_IPA_MAIN_H_ */
|
||||
|
@@ -2981,3 +2981,26 @@ void wlan_ipa_cleanup_dev_iface(struct wlan_ipa_priv *ipa_ctx,
|
||||
if (iface_ctx)
|
||||
wlan_ipa_cleanup_iface(iface_ctx);
|
||||
}
|
||||
|
||||
void wlan_ipa_uc_ssr_cleanup(struct wlan_ipa_priv *ipa_ctx)
|
||||
{
|
||||
struct wlan_ipa_iface_context *iface;
|
||||
int i;
|
||||
|
||||
ipa_info("enter");
|
||||
|
||||
for (i = 0; i < WLAN_IPA_MAX_IFACE; i++) {
|
||||
iface = &ipa_ctx->iface_context[i];
|
||||
if (iface->dev) {
|
||||
if (iface->device_mode == QDF_SAP_MODE)
|
||||
wlan_ipa_uc_send_evt(iface->dev,
|
||||
QDF_IPA_AP_DISCONNECT,
|
||||
iface->dev->dev_addr);
|
||||
else if (iface->device_mode == QDF_STA_MODE)
|
||||
wlan_ipa_uc_send_evt(iface->dev,
|
||||
QDF_IPA_STA_DISCONNECT,
|
||||
iface->dev->dev_addr);
|
||||
wlan_ipa_cleanup_iface(iface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -576,3 +576,16 @@ void ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
|
||||
|
||||
return wlan_ipa_cleanup_dev_iface(ipa_obj, net_dev);
|
||||
}
|
||||
|
||||
void ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev)
|
||||
{
|
||||
struct wlan_ipa_priv *ipa_obj;
|
||||
|
||||
ipa_obj = ipa_pdev_get_priv_obj(pdev);
|
||||
if (!ipa_obj) {
|
||||
ipa_err("IPA object is NULL");
|
||||
return;
|
||||
}
|
||||
|
||||
return wlan_ipa_uc_ssr_cleanup(ipa_obj);
|
||||
}
|
||||
|
@@ -312,6 +312,17 @@ QDF_STATUS ucfg_ipa_uc_disconnect_ap(struct wlan_objmgr_pdev *pdev,
|
||||
*/
|
||||
void ucfg_ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
|
||||
qdf_netdev_t net_dev);
|
||||
|
||||
/**
|
||||
* ucfg_ipa_uc_ssr_cleanup() - Handle IPA cleanup for SSR
|
||||
* @pdev: pdev obj
|
||||
*
|
||||
* From hostside do cleanup such as deregister IPA interafces
|
||||
* and send disconnect events so that it will be sync after SSR
|
||||
*
|
||||
* Return: None
|
||||
*/
|
||||
void ucfg_ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev);
|
||||
#else
|
||||
|
||||
static inline bool ucfg_ipa_is_present(void)
|
||||
@@ -487,5 +498,10 @@ void ucfg_ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
|
||||
qdf_netdev_t net_dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline
|
||||
void ucfg_ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev)
|
||||
{
|
||||
}
|
||||
#endif /* IPA_OFFLOAD */
|
||||
#endif /* _WLAN_IPA_UCFG_API_H_ */
|
||||
|
@@ -186,3 +186,8 @@ void ucfg_ipa_cleanup_dev_iface(struct wlan_objmgr_pdev *pdev,
|
||||
{
|
||||
return ipa_cleanup_dev_iface(pdev, net_dev);
|
||||
}
|
||||
|
||||
void ucfg_ipa_uc_ssr_cleanup(struct wlan_objmgr_pdev *pdev)
|
||||
{
|
||||
return ipa_uc_ssr_cleanup(pdev);
|
||||
}
|
||||
|
Reference in New Issue
Block a user