qcacld-3.0: Update netif queue timestamp to avoid watchdog

Update netif queue timestamp while stopping queues
to avoid NETDEV watchdog

CRs-Fixed: 983687
Change-Id: Ifb0777001fead64836f1ea38eb8a3becc47ecac2
This commit is contained in:
Nirav Shah
2016-03-01 18:10:38 +05:30
committed by Gerrit - the friendly Code Review server
parent 13644679a2
commit 89223f7e36
2 changed files with 59 additions and 8 deletions

View File

@@ -370,11 +370,11 @@ static void __hdd_softap_tx_timeout(struct net_device *dev)
{
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *hdd_ctx;
struct netdev_queue *txq;
int i;
DPTRACE(qdf_dp_trace(NULL, QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT,
NULL, 0));
QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_ERROR,
"%s: Transmission timeout occurred", __func__);
/* Getting here implies we disabled the TX queues for too
* long. Queues are disabled either because of disassociation
* or low resource scenarios. In case of disassociation it is
@@ -387,6 +387,24 @@ static void __hdd_softap_tx_timeout(struct net_device *dev)
"%s: Recovery in Progress. Ignore!!!", __func__);
return;
}
QDF_TRACE(QDF_MODULE_ID_HDD_SAP_DATA, QDF_TRACE_LEVEL_ERROR,
"%s: Transmission timeout occurred jiffies %lu trans_start %lu"
, __func__, jiffies, dev->trans_start);
for (i = 0; i < NUM_TX_QUEUES; i++) {
txq = netdev_get_tx_queue(dev, i);
QDF_TRACE(QDF_MODULE_ID_HDD_DATA,
QDF_TRACE_LEVEL_ERROR,
"Queue%d status: %d txq->trans_start %lu",
i, netif_tx_queue_stopped(txq), txq->trans_start);
}
wlan_hdd_display_netif_queue_history(hdd_ctx);
ol_tx_dump_flow_pool_info();
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR,
"carrier state: %d", netif_carrier_ok(dev));
}
/**

View File

@@ -583,6 +583,8 @@ QDF_STATUS hdd_ibss_get_sta_id(hdd_station_ctx_t *pHddStaCtx,
*/
static void __hdd_tx_timeout(struct net_device *dev)
{
hdd_adapter_t *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
hdd_context_t *hdd_ctx;
struct netdev_queue *txq;
int i = 0;
@@ -601,13 +603,16 @@ static void __hdd_tx_timeout(struct net_device *dev)
for (i = 0; i < NUM_TX_QUEUES; i++) {
txq = netdev_get_tx_queue(dev, i);
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_INFO,
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR,
"Queue%d status: %d txq->trans_start %lu",
i, netif_tx_queue_stopped(txq), txq->trans_start);
}
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_INFO,
"carrier state: %d", netif_carrier_ok(dev));
hdd_ctx = WLAN_HDD_GET_CTX(adapter);
wlan_hdd_display_netif_queue_history(hdd_ctx);
ol_tx_dump_flow_pool_info();
}
/**
@@ -980,6 +985,27 @@ static void wlan_hdd_update_queue_oper_stats(hdd_adapter_t *adapter,
return;
}
/**
* wlan_hdd_update_txq_timestamp() - update txq timestamp
* @dev: net device
*
* Return: none
*/
void wlan_hdd_update_txq_timestamp(struct net_device *dev)
{
struct netdev_queue *txq;
int i;
bool unlock;
for (i = 0; i < NUM_TX_QUEUES; i++) {
txq = netdev_get_tx_queue(dev, i);
unlock = __netif_tx_trylock(txq);
txq_trans_update(txq);
if (unlock == true)
__netif_tx_unlock(txq);
}
}
/**
* wlan_hdd_netif_queue_control() - Use for netif_queue related actions
* @adapter: adapter handle
@@ -1014,8 +1040,10 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
case WLAN_STOP_ALL_NETIF_QUEUE:
spin_lock_bh(&adapter->pause_map_lock);
if (!adapter->pause_map)
if (!adapter->pause_map) {
netif_tx_stop_all_queues(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
}
adapter->pause_map |= (1 << reason);
spin_unlock_bh(&adapter->pause_map_lock);
break;
@@ -1038,8 +1066,10 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
case WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER:
spin_lock_bh(&adapter->pause_map_lock);
if (!adapter->pause_map)
if (!adapter->pause_map) {
netif_tx_stop_all_queues(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
}
adapter->pause_map |= (1 << reason);
netif_carrier_off(adapter->dev);
spin_unlock_bh(&adapter->pause_map_lock);
@@ -1056,16 +1086,20 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
case WLAN_NETIF_TX_DISABLE:
spin_lock_bh(&adapter->pause_map_lock);
if (!adapter->pause_map)
if (!adapter->pause_map) {
netif_tx_disable(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
}
adapter->pause_map |= (1 << reason);
spin_unlock_bh(&adapter->pause_map_lock);
break;
case WLAN_NETIF_TX_DISABLE_N_CARRIER:
spin_lock_bh(&adapter->pause_map_lock);
if (!adapter->pause_map)
if (!adapter->pause_map) {
netif_tx_disable(adapter->dev);
wlan_hdd_update_txq_timestamp(adapter->dev);
}
adapter->pause_map |= (1 << reason);
netif_carrier_off(adapter->dev);
spin_unlock_bh(&adapter->pause_map_lock);
@@ -1080,7 +1114,6 @@ void wlan_hdd_netif_queue_control(hdd_adapter_t *adapter,
wlan_hdd_process_peer_unauthorised_pause(adapter);
spin_unlock_bh(&adapter->pause_map_lock);
wlan_hdd_update_queue_oper_stats(adapter, action, reason);
adapter->queue_oper_history[adapter->history_index].time =