Browse Source

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
Nirav Shah 9 years ago
parent
commit
89223f7e36
2 changed files with 59 additions and 8 deletions
  1. 20 2
      core/hdd/src/wlan_hdd_softap_tx_rx.c
  2. 39 6
      core/hdd/src/wlan_hdd_tx_rx.c

+ 20 - 2
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -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));
+
 }
 
 /**

+ 39 - 6
core/hdd/src/wlan_hdd_tx_rx.c

@@ -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 =