Re: iwlagn is getting very shaky

From: Emmanuel Grumbach
Date: Thu Nov 24 2011 - 23:50:06 EST


On Fri, Nov 25, 2011 at 01:02, Norbert Preining <preining@xxxxxxxx> wrote:
> On Do, 24 Nov 2011, Emmanuel Grumbach wrote:
>> Please apply the patch attached on top of the one I previously sent.
>> Let me know I you have trouble with patch.
>
> Which patch? Nothing attached, I also checked in the mail archives
> in case I had again problems with attached patches. Nothing.
> Please resend.
>

Oh well... Sorry again....
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 8efa10f..4f7c758 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -1596,6 +1596,7 @@ void iwl_start_tx_ba_trans_ready(struct iwl_priv *priv,
ctx = priv->stations[sta_id].ctxid;
vif = priv->contexts[ctx].vif;

+ IWL_DEBUG_TX_QUEUES(priv, "Telling mac start BA ready tid: %d", tid);
ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);
}

@@ -1610,6 +1611,7 @@ void iwl_stop_tx_ba_trans_ready(struct iwl_priv *priv,
ctx = priv->stations[sta_id].ctxid;
vif = priv->contexts[ctx].vif;

+ IWL_DEBUG_TX_QUEUES(priv, "Telling mac stop BA ready tid: %d", tid);
ieee80211_stop_tx_ba_cb_irqsafe(vif, addr, tid);
}

diff --git a/drivers/net/wireless/iwlwifi/iwl-mac80211.c b/drivers/net/wireless/iwlwifi/iwl-mac80211.c
index ec31482..14f89ee 100644
--- a/drivers/net/wireless/iwlwifi/iwl-mac80211.c
+++ b/drivers/net/wireless/iwlwifi/iwl-mac80211.c
@@ -632,6 +632,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
break;
case IEEE80211_AMPDU_TX_STOP:
IWL_DEBUG_HT(priv, "stop Tx\n");
+ IWL_DEBUG_TX_QUEUES(priv, "Stop Tx agg for tid %d", tid);
ret = iwlagn_tx_agg_stop(priv, vif, sta, tid);
if ((ret == 0) && (priv->agg_tids_count > 0)) {
priv->agg_tids_count--;
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
index 84cf641..17e793f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
@@ -424,12 +424,14 @@ static inline void iwl_stop_queue(struct iwl_trans *trans,
static inline void iwl_txq_ctx_activate(struct iwl_trans_pcie *trans_pcie,
int txq_id)
{
+ IWL_DEBUG_TX_QUEUES(trans_pcie->trans, "Activate txq %d", txq_id);
set_bit(txq_id, &trans_pcie->txq_ctx_active_msk);
}

static inline void iwl_txq_ctx_deactivate(struct iwl_trans_pcie *trans_pcie,
int txq_id)
{
+ IWL_DEBUG_TX_QUEUES(trans_pcie->trans, "Deactivate txq %d", txq_id);
clear_bit(txq_id, &trans_pcie->txq_ctx_active_msk);
}

diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
index 049e3b6..11e0b56 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
+++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
@@ -472,6 +472,8 @@ void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans,
return;
}

+ IWL_DEBUG_TX_QUEUES(trans, "Setup AGG for tid %d", tid);
+
spin_lock_irqsave(&trans->shrd->sta_lock, flags);
tid_data = &trans->shrd->tid_data[sta_id][tid];
ssn_idx = SEQ_TO_SN(tid_data->seq_number);
@@ -536,8 +538,10 @@ static int iwlagn_txq_ctx_activate_free(struct iwl_trans *trans)

for (txq_id = 0; txq_id < hw_params(trans).max_txq_num; txq_id++)
if (!test_and_set_bit(txq_id,
- &trans_pcie->txq_ctx_active_msk))
+ &trans_pcie->txq_ctx_active_msk)) {
+ IWL_DEBUG_TX_QUEUES(trans, "Activate txq %d", txq_id);
return txq_id;
+ }
return -1;
}

@@ -582,6 +586,8 @@ void iwl_trans_pcie_txq_agg_disable(struct iwl_trans *trans, int txq_id)
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
iwlagn_tx_queue_stop_scheduler(trans, txq_id);

+ IWL_DEBUG_TX_QUEUES(trans, "Disable AGG txq_id %d", txq_id);
+
iwl_clear_bits_prph(bus(trans), SCD_AGGR_SEL, (1 << txq_id));

trans_pcie->txq[txq_id].q.read_ptr = 0;