qcacmn: Add appropriate hang reason codes for various scenarios
Presently, the reason codes for driver to trigger recovery on are limited in their scope; most of the scenarios are not correctly capture. Add new reason codes to cover all the possible scenarios where the driver has need to trigger recovery. Change-Id: Ia257855bc30cd0bc7e81b9d0e21e4b84427d546b CRs-Fixed: 2630951
This commit is contained in:

committed by
nshrivas

parent
1f21eadadf
commit
bdcd6ce25e
@@ -1188,19 +1188,37 @@ enum qdf_suspend_type {
|
|||||||
* @QDF_SUSPEND_TIMEOUT: Timeout for an ACK from FW for suspend request
|
* @QDF_SUSPEND_TIMEOUT: Timeout for an ACK from FW for suspend request
|
||||||
* @QDF_RESUME_TIMEOUT: Timeout for an ACK from FW for resume request
|
* @QDF_RESUME_TIMEOUT: Timeout for an ACK from FW for resume request
|
||||||
* @QDF_WMI_EXCEED_MAX_PENDING_CMDS: wmi exceed max pending cmd
|
* @QDF_WMI_EXCEED_MAX_PENDING_CMDS: wmi exceed max pending cmd
|
||||||
|
* @QDF_AP_STA_CONNECT_REQ_TIMEOUT: SAP peer assoc timeout from FW
|
||||||
|
* @QDF_STA_AP_CONNECT_REQ_TIMEOUT: STA peer assoc timeout from FW
|
||||||
|
* @QDF_MAC_HW_MODE_CHANGE_TIMEOUT: HW mode change timeout from FW
|
||||||
|
* @QDF_MAC_HW_MODE_CONFIG_TIMEOUT: HW dual mac cfg timeout from FW
|
||||||
|
* @QDF_VDEV_START_RESPONSE_TIMED_OUT: Start response timeout from FW
|
||||||
|
* @QDF_VDEV_RESTART_RESPONSE_TIMED_OUT: Restart response timeout from FW
|
||||||
|
* @QDF_VDEV_STOP_RESPONSE_TIMED_OUT: Stop response timeout from FW
|
||||||
|
* @QDF_VDEV_DELETE_RESPONSE_TIMED_OUT: Delete response timeout from FW
|
||||||
|
* @QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT: Peer delete all resp timeout
|
||||||
*/
|
*/
|
||||||
enum qdf_hang_reason {
|
enum qdf_hang_reason {
|
||||||
QDF_REASON_UNSPECIFIED = 0,
|
QDF_REASON_UNSPECIFIED,
|
||||||
QDF_RX_HASH_NO_ENTRY_FOUND = 1,
|
QDF_RX_HASH_NO_ENTRY_FOUND,
|
||||||
QDF_PEER_DELETION_TIMEDOUT = 2,
|
QDF_PEER_DELETION_TIMEDOUT,
|
||||||
QDF_PEER_UNMAP_TIMEDOUT = 3,
|
QDF_PEER_UNMAP_TIMEDOUT,
|
||||||
QDF_SCAN_REQ_EXPIRED = 4,
|
QDF_SCAN_REQ_EXPIRED,
|
||||||
QDF_SCAN_ATTEMPT_FAILURES = 5,
|
QDF_SCAN_ATTEMPT_FAILURES,
|
||||||
QDF_GET_MSG_BUFF_FAILURE = 6,
|
QDF_GET_MSG_BUFF_FAILURE,
|
||||||
QDF_ACTIVE_LIST_TIMEOUT = 7,
|
QDF_ACTIVE_LIST_TIMEOUT,
|
||||||
QDF_SUSPEND_TIMEOUT = 8,
|
QDF_SUSPEND_TIMEOUT,
|
||||||
QDF_RESUME_TIMEOUT = 9,
|
QDF_RESUME_TIMEOUT,
|
||||||
QDF_WMI_EXCEED_MAX_PENDING_CMDS = 10,
|
QDF_WMI_EXCEED_MAX_PENDING_CMDS,
|
||||||
|
QDF_AP_STA_CONNECT_REQ_TIMEOUT,
|
||||||
|
QDF_STA_AP_CONNECT_REQ_TIMEOUT,
|
||||||
|
QDF_MAC_HW_MODE_CHANGE_TIMEOUT,
|
||||||
|
QDF_MAC_HW_MODE_CONFIG_TIMEOUT,
|
||||||
|
QDF_VDEV_START_RESPONSE_TIMED_OUT,
|
||||||
|
QDF_VDEV_RESTART_RESPONSE_TIMED_OUT,
|
||||||
|
QDF_VDEV_STOP_RESPONSE_TIMED_OUT,
|
||||||
|
QDF_VDEV_DELETE_RESPONSE_TIMED_OUT,
|
||||||
|
QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -40,6 +40,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
struct vdev_stop_response stop_rsp = {0};
|
struct vdev_stop_response stop_rsp = {0};
|
||||||
struct vdev_delete_response del_rsp = {0};
|
struct vdev_delete_response del_rsp = {0};
|
||||||
struct peer_delete_all_response peer_del_all_rsp = {0};
|
struct peer_delete_all_response peer_del_all_rsp = {0};
|
||||||
|
enum qdf_hang_reason recovery_reason;
|
||||||
uint8_t vdev_id;
|
uint8_t vdev_id;
|
||||||
uint16_t rsp_pos = RESPONSE_BIT_MAX;
|
uint16_t rsp_pos = RESPONSE_BIT_MAX;
|
||||||
|
|
||||||
@@ -91,10 +92,12 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
start_rsp.resp_type =
|
start_rsp.resp_type =
|
||||||
WMI_HOST_VDEV_START_RESP_EVENT;
|
WMI_HOST_VDEV_START_RESP_EVENT;
|
||||||
rsp_pos = START_RESPONSE_BIT;
|
rsp_pos = START_RESPONSE_BIT;
|
||||||
|
recovery_reason = QDF_VDEV_START_RESPONSE_TIMED_OUT;
|
||||||
} else {
|
} else {
|
||||||
start_rsp.resp_type =
|
start_rsp.resp_type =
|
||||||
WMI_HOST_VDEV_RESTART_RESP_EVENT;
|
WMI_HOST_VDEV_RESTART_RESP_EVENT;
|
||||||
rsp_pos = RESTART_RESPONSE_BIT;
|
rsp_pos = RESTART_RESPONSE_BIT;
|
||||||
|
recovery_reason = QDF_VDEV_RESTART_RESPONSE_TIMED_OUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
||||||
@@ -104,6 +107,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
&vdev_rsp->rsp_status)) {
|
&vdev_rsp->rsp_status)) {
|
||||||
rsp_pos = STOP_RESPONSE_BIT;
|
rsp_pos = STOP_RESPONSE_BIT;
|
||||||
stop_rsp.vdev_id = vdev_id;
|
stop_rsp.vdev_id = vdev_id;
|
||||||
|
recovery_reason = QDF_VDEV_STOP_RESPONSE_TIMED_OUT;
|
||||||
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
||||||
|
|
||||||
rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp);
|
rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp);
|
||||||
@@ -111,6 +115,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
&vdev_rsp->rsp_status)) {
|
&vdev_rsp->rsp_status)) {
|
||||||
del_rsp.vdev_id = vdev_id;
|
del_rsp.vdev_id = vdev_id;
|
||||||
rsp_pos = DELETE_RESPONSE_BIT;
|
rsp_pos = DELETE_RESPONSE_BIT;
|
||||||
|
recovery_reason = QDF_VDEV_DELETE_RESPONSE_TIMED_OUT;
|
||||||
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
||||||
|
|
||||||
rx_ops->vdev_mgr_delete_response(psoc, &del_rsp);
|
rx_ops->vdev_mgr_delete_response(psoc, &del_rsp);
|
||||||
@@ -118,6 +123,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
&vdev_rsp->rsp_status)) {
|
&vdev_rsp->rsp_status)) {
|
||||||
peer_del_all_rsp.vdev_id = vdev_id;
|
peer_del_all_rsp.vdev_id = vdev_id;
|
||||||
rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT;
|
rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT;
|
||||||
|
recovery_reason = QDF_VDEV_PEER_DELETE_ALL_RESPONSE_TIMED_OUT;
|
||||||
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
|
||||||
|
|
||||||
rx_ops->vdev_mgr_peer_delete_all_response(
|
rx_ops->vdev_mgr_peer_delete_all_response(
|
||||||
@@ -140,7 +146,7 @@ void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
|
|||||||
wlan_psoc_get_id(psoc), vdev_id,
|
wlan_psoc_get_id(psoc), vdev_id,
|
||||||
string_from_rsp_bit(rsp_pos));
|
string_from_rsp_bit(rsp_pos));
|
||||||
|
|
||||||
qdf_trigger_self_recovery(psoc, QDF_REASON_UNSPECIFIED);
|
qdf_trigger_self_recovery(psoc, recovery_reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SERIALIZE_VDEV_RESP
|
#ifdef SERIALIZE_VDEV_RESP
|
||||||
|
Reference in New Issue
Block a user