Verified Commit 884aa987 authored by Marek Vasut's avatar Marek Vasut Committed by Sebastian Krzyszkowiak

redpine: Clean up loop in the interrupt handler

The inner do { ... } while loop is completely useless, all it does
is iterate over a switch-case statement, one bit at a time. This
can easily be replaced by simple if (status & bit) { ... } tests
for each bit. No functional change.
Signed-off-by: default avatarMarek Vasut <marex@denx.de>
parent d7429134
......@@ -333,73 +333,74 @@ static void rsi_rx_handler(struct rsi_hw *adapter)
__func__, isr_status, (1 << MSDU_PKT_PENDING),
(1 << FW_ASSERT_IND));
do {
RSI_GET_SDIO_INTERRUPT_TYPE(isr_status, isr_type);
switch (isr_type) {
case BUFFER_AVAILABLE:
status = rsi_sdio_check_buffer_status(adapter, 0);
if (status < 0)
redpine_dbg(ERR_ZONE,
"%s: Failed to check buffer status\n",
__func__);
rsi_sdio_ack_intr(common->priv,
(1 << PKT_BUFF_AVAILABLE));
rsi_set_event(&common->tx_thread.event);
if (isr_status & BIT(PKT_BUFF_AVAILABLE)) {
status = rsi_sdio_check_buffer_status(adapter, 0);
if (status < 0)
redpine_dbg(ERR_ZONE,
"%s: Failed to check buffer status\n",
__func__);
rsi_sdio_ack_intr(common->priv,
(1 << PKT_BUFF_AVAILABLE));
rsi_set_event(&common->tx_thread.event);
redpine_dbg(ISR_ZONE,
"%s: Buffer full/available\n",
__func__);
dev->buff_status_updated = 1;
redpine_dbg(ISR_ZONE,
"%s: Buffer full/available\n",
isr_status &= ~BIT(PKT_BUFF_AVAILABLE);
}
if (isr_status & BIT(FW_ASSERT_IND)) {
redpine_dbg(ERR_ZONE,
"%s: ==> FIRMWARE Assert <==\n",
__func__);
status = rsi_sdio_read_register(common->priv,
SDIO_FW_STATUS_REG,
&fw_status);
if (status) {
redpine_dbg(ERR_ZONE,
"%s: Failed to read f/w reg\n",
__func__);
dev->buff_status_updated = 1;
break;
} else {
redpine_dbg(ERR_ZONE,
"%s: Firmware Status is 0x%x\n",
__func__, fw_status);
rsi_sdio_ack_intr(common->priv,
(1 << FW_ASSERT_IND));
}
common->fsm_state = FSM_CARD_NOT_READY;
isr_status &= ~BIT(FW_ASSERT_IND);
}
if (isr_status & BIT(MSDU_PKT_PENDING)) {
redpine_dbg(ISR_ZONE, "Pkt pending interrupt\n");
dev->rx_info.total_sdio_msdu_pending_intr++;
case FIRMWARE_ASSERT_IND:
status = rsi_process_pkt(common);
if (status) {
redpine_dbg(ERR_ZONE,
"%s: ==> FIRMWARE Assert <==\n",
"%s: Failed to read pkt\n",
__func__);
status = rsi_sdio_read_register(common->priv,
SDIO_FW_STATUS_REG,
&fw_status);
if (status) {
redpine_dbg(ERR_ZONE,
"%s: Failed to read f/w reg\n",
__func__);
} else {
redpine_dbg(ERR_ZONE,
"%s: Firmware Status is 0x%x\n",
__func__, fw_status);
rsi_sdio_ack_intr(common->priv,
(1 << FW_ASSERT_IND));
}
common->fsm_state = FSM_CARD_NOT_READY;
break;
case MSDU_PACKET_PENDING:
redpine_dbg(ISR_ZONE, "Pkt pending interrupt\n");
dev->rx_info.total_sdio_msdu_pending_intr++;
status = rsi_process_pkt(common);
if (status) {
redpine_dbg(ERR_ZONE,
"%s: Failed to read pkt\n",
__func__);
mutex_unlock(&common->rx_lock);
common->rx_in_prog = false;
return;
}
break;
default:
rsi_sdio_ack_intr(common->priv, isr_status);
dev->rx_info.total_sdio_unknown_intr++;
isr_status = 0;
redpine_dbg(ISR_ZONE,
"Unknown Interrupt %x\n",
isr_status);
break;
mutex_unlock(&common->rx_lock);
common->rx_in_prog = false;
return;
}
isr_status ^= BIT(isr_type - 1);
} while (isr_status);
isr_status &= ~BIT(MSDU_PKT_PENDING);
}
if (isr_status) {
rsi_sdio_ack_intr(common->priv, isr_status);
dev->rx_info.total_sdio_unknown_intr++;
isr_status = 0;
redpine_dbg(ISR_ZONE,
"Unknown Interrupt %x\n",
isr_status);
}
mutex_unlock(&common->rx_lock);
} while (1);
common->rx_in_prog = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment