|
@@ -911,6 +911,7 @@ void iwl_rx_handle(struct iwl_priv *priv)
|
|
IWL_DEBUG_RX(priv, "r = %d, i = %d, %s, 0x%02x\n", r,
|
|
IWL_DEBUG_RX(priv, "r = %d, i = %d, %s, 0x%02x\n", r,
|
|
i, get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
|
|
i, get_cmd_string(pkt->hdr.cmd), pkt->hdr.cmd);
|
|
priv->rx_handlers[pkt->hdr.cmd] (priv, rxb);
|
|
priv->rx_handlers[pkt->hdr.cmd] (priv, rxb);
|
|
|
|
+ priv->isr_stats.rx_handlers[pkt->hdr.cmd]++;
|
|
} else {
|
|
} else {
|
|
/* No handling needed */
|
|
/* No handling needed */
|
|
IWL_DEBUG_RX(priv,
|
|
IWL_DEBUG_RX(priv,
|
|
@@ -1035,6 +1036,7 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
/* Tell the device to stop sending interrupts */
|
|
/* Tell the device to stop sending interrupts */
|
|
iwl_disable_interrupts(priv);
|
|
iwl_disable_interrupts(priv);
|
|
|
|
|
|
|
|
+ priv->isr_stats.hw++;
|
|
iwl_irq_handle_error(priv);
|
|
iwl_irq_handle_error(priv);
|
|
|
|
|
|
handled |= CSR_INT_BIT_HW_ERR;
|
|
handled |= CSR_INT_BIT_HW_ERR;
|
|
@@ -1047,13 +1049,17 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
|
if (priv->debug_level & (IWL_DL_ISR)) {
|
|
if (priv->debug_level & (IWL_DL_ISR)) {
|
|
/* NIC fires this, but we don't use it, redundant with WAKEUP */
|
|
/* NIC fires this, but we don't use it, redundant with WAKEUP */
|
|
- if (inta & CSR_INT_BIT_SCD)
|
|
|
|
|
|
+ if (inta & CSR_INT_BIT_SCD) {
|
|
IWL_DEBUG_ISR(priv, "Scheduler finished to transmit "
|
|
IWL_DEBUG_ISR(priv, "Scheduler finished to transmit "
|
|
"the frame/frames.\n");
|
|
"the frame/frames.\n");
|
|
|
|
+ priv->isr_stats.sch++;
|
|
|
|
+ }
|
|
|
|
|
|
/* Alive notification via Rx interrupt will do the real work */
|
|
/* Alive notification via Rx interrupt will do the real work */
|
|
- if (inta & CSR_INT_BIT_ALIVE)
|
|
|
|
|
|
+ if (inta & CSR_INT_BIT_ALIVE) {
|
|
IWL_DEBUG_ISR(priv, "Alive interrupt\n");
|
|
IWL_DEBUG_ISR(priv, "Alive interrupt\n");
|
|
|
|
+ priv->isr_stats.alive++;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
/* Safely ignore these bits for debug checks below */
|
|
/* Safely ignore these bits for debug checks below */
|
|
@@ -1069,6 +1075,8 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
IWL_DEBUG_RF_KILL(priv, "RF_KILL bit toggled to %s.\n",
|
|
IWL_DEBUG_RF_KILL(priv, "RF_KILL bit toggled to %s.\n",
|
|
hw_rf_kill ? "disable radio" : "enable radio");
|
|
hw_rf_kill ? "disable radio" : "enable radio");
|
|
|
|
|
|
|
|
+ priv->isr_stats.rfkill++;
|
|
|
|
+
|
|
/* driver only loads ucode once setting the interface up.
|
|
/* driver only loads ucode once setting the interface up.
|
|
* the driver allows loading the ucode even if the radio
|
|
* the driver allows loading the ucode even if the radio
|
|
* is killed. Hence update the killswitch state here. The
|
|
* is killed. Hence update the killswitch state here. The
|
|
@@ -1088,6 +1096,7 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
/* Chip got too hot and stopped itself */
|
|
/* Chip got too hot and stopped itself */
|
|
if (inta & CSR_INT_BIT_CT_KILL) {
|
|
if (inta & CSR_INT_BIT_CT_KILL) {
|
|
IWL_ERR(priv, "Microcode CT kill error detected.\n");
|
|
IWL_ERR(priv, "Microcode CT kill error detected.\n");
|
|
|
|
+ priv->isr_stats.ctkill++;
|
|
handled |= CSR_INT_BIT_CT_KILL;
|
|
handled |= CSR_INT_BIT_CT_KILL;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1095,6 +1104,8 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
if (inta & CSR_INT_BIT_SW_ERR) {
|
|
if (inta & CSR_INT_BIT_SW_ERR) {
|
|
IWL_ERR(priv, "Microcode SW error detected. "
|
|
IWL_ERR(priv, "Microcode SW error detected. "
|
|
" Restarting 0x%X.\n", inta);
|
|
" Restarting 0x%X.\n", inta);
|
|
|
|
+ priv->isr_stats.sw++;
|
|
|
|
+ priv->isr_stats.sw_err = inta;
|
|
iwl_irq_handle_error(priv);
|
|
iwl_irq_handle_error(priv);
|
|
handled |= CSR_INT_BIT_SW_ERR;
|
|
handled |= CSR_INT_BIT_SW_ERR;
|
|
}
|
|
}
|
|
@@ -1110,6 +1121,8 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
iwl_txq_update_write_ptr(priv, &priv->txq[4]);
|
|
iwl_txq_update_write_ptr(priv, &priv->txq[4]);
|
|
iwl_txq_update_write_ptr(priv, &priv->txq[5]);
|
|
iwl_txq_update_write_ptr(priv, &priv->txq[5]);
|
|
|
|
|
|
|
|
+ priv->isr_stats.wakeup++;
|
|
|
|
+
|
|
handled |= CSR_INT_BIT_WAKEUP;
|
|
handled |= CSR_INT_BIT_WAKEUP;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1118,19 +1131,23 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
* notifications from uCode come through here*/
|
|
* notifications from uCode come through here*/
|
|
if (inta & (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX)) {
|
|
if (inta & (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX)) {
|
|
iwl_rx_handle(priv);
|
|
iwl_rx_handle(priv);
|
|
|
|
+ priv->isr_stats.rx++;
|
|
handled |= (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX);
|
|
handled |= (CSR_INT_BIT_FH_RX | CSR_INT_BIT_SW_RX);
|
|
}
|
|
}
|
|
|
|
|
|
if (inta & CSR_INT_BIT_FH_TX) {
|
|
if (inta & CSR_INT_BIT_FH_TX) {
|
|
IWL_DEBUG_ISR(priv, "Tx interrupt\n");
|
|
IWL_DEBUG_ISR(priv, "Tx interrupt\n");
|
|
|
|
+ priv->isr_stats.tx++;
|
|
handled |= CSR_INT_BIT_FH_TX;
|
|
handled |= CSR_INT_BIT_FH_TX;
|
|
/* FH finished to write, send event */
|
|
/* FH finished to write, send event */
|
|
priv->ucode_write_complete = 1;
|
|
priv->ucode_write_complete = 1;
|
|
wake_up_interruptible(&priv->wait_command_queue);
|
|
wake_up_interruptible(&priv->wait_command_queue);
|
|
}
|
|
}
|
|
|
|
|
|
- if (inta & ~handled)
|
|
|
|
|
|
+ if (inta & ~handled) {
|
|
IWL_ERR(priv, "Unhandled INTA bits 0x%08x\n", inta & ~handled);
|
|
IWL_ERR(priv, "Unhandled INTA bits 0x%08x\n", inta & ~handled);
|
|
|
|
+ priv->isr_stats.unhandled++;
|
|
|
|
+ }
|
|
|
|
|
|
if (inta & ~CSR_INI_SET_MASK) {
|
|
if (inta & ~CSR_INI_SET_MASK) {
|
|
IWL_WARN(priv, "Disabled INTA bits 0x%08x were pending\n",
|
|
IWL_WARN(priv, "Disabled INTA bits 0x%08x were pending\n",
|
|
@@ -1155,6 +1172,7 @@ static void iwl_irq_tasklet(struct iwl_priv *priv)
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
spin_unlock_irqrestore(&priv->lock, flags);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
/******************************************************************************
|
|
/******************************************************************************
|
|
*
|
|
*
|
|
* uCode download functions
|
|
* uCode download functions
|
|
@@ -1983,6 +2001,8 @@ static int iwl_mac_start(struct ieee80211_hw *hw)
|
|
|
|
|
|
out:
|
|
out:
|
|
priv->is_open = 1;
|
|
priv->is_open = 1;
|
|
|
|
+ /* default to MONITOR mode */
|
|
|
|
+ priv->iw_mode = NL80211_IFTYPE_MONITOR;
|
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|