1f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger/******************************************************************************
2f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
3f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
5f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * This program is free software; you can redistribute it and/or modify it
6f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * under the terms of version 2 of the GNU General Public License as
7f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * published by the Free Software Foundation.
8f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
9f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT
10f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger * more details.
13f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger *
14f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger ******************************************************************************/
15f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#define _RTL8723A_SRESET_C_
16f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
17f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#include <rtl8723a_sreset.h>
18f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger#include <rtl8723a_hal.h>
19050abc45833c6a66501cb3f938ef6e93ac18da8dJes Sorensen#include <usb_ops_linux.h>
20f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
21f7c92d2cc2beb3367f244480300eaecdd9502932Larry Fingervoid rtl8723a_sreset_xmit_status_check(struct rtw_adapter *padapter)
22f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger{
23f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct hal_data_8723a	*pHalData = GET_HAL_DATA(padapter);
24f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct sreset_priv *psrtpriv = &pHalData->srestpriv;
25f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
26f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	unsigned long current_time;
27f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	struct xmit_priv	*pxmitpriv = &padapter->xmitpriv;
28f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	unsigned int diff_time;
29f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	u32 txdma_status;
30f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
31050abc45833c6a66501cb3f938ef6e93ac18da8dJes Sorensen	txdma_status = rtl8723au_read32(padapter, REG_TXDMA_STATUS);
32f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (txdma_status != 0) {
33f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		DBG_8723A("%s REG_TXDMA_STATUS:0x%08x\n", __func__, txdma_status);
34b7c19c276a230aee012ba7adef036689633c4cd8Jes Sorensen		rtw_sreset_reset(padapter);
35f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
36f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
37f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	current_time = jiffies;
38f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
39f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) {
40f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
41f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		diff_time = jiffies_to_msecs(jiffies - psrtpriv->last_tx_time);
42f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger
43f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		if (diff_time > 2000) {
44f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			if (psrtpriv->last_tx_complete_time == 0) {
45f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				psrtpriv->last_tx_complete_time = current_time;
46f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			} else {
47f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				diff_time = jiffies_to_msecs(jiffies - psrtpriv->last_tx_complete_time);
48f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				if (diff_time > 4000) {
49f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger					DBG_8723A("%s tx hang\n", __func__);
50b7c19c276a230aee012ba7adef036689633c4cd8Jes Sorensen					rtw_sreset_reset(padapter);
51f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger				}
52f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger			}
53f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger		}
54f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger	}
55f7c92d2cc2beb3367f244480300eaecdd9502932Larry Finger}
56