|
@@ -69,20 +69,37 @@ int rsi_sdio_master_access_msword(struct rsi_hw *adapter, u16 ms_word)
|
|
|
static int rsi_process_pkt(struct rsi_common *common)
|
|
|
{
|
|
|
struct rsi_hw *adapter = common->priv;
|
|
|
+ struct rsi_91x_sdiodev *dev =
|
|
|
+ (struct rsi_91x_sdiodev *)adapter->rsi_dev;
|
|
|
u8 num_blks = 0;
|
|
|
u32 rcv_pkt_len = 0;
|
|
|
int status = 0;
|
|
|
+ u8 value = 0;
|
|
|
|
|
|
- status = rsi_sdio_read_register(adapter,
|
|
|
- SDIO_RX_NUM_BLOCKS_REG,
|
|
|
- &num_blks);
|
|
|
+ num_blks = ((adapter->interrupt_status & 1) |
|
|
|
+ ((adapter->interrupt_status >> RECV_NUM_BLOCKS) << 1));
|
|
|
|
|
|
- if (status) {
|
|
|
- rsi_dbg(ERR_ZONE,
|
|
|
- "%s: Failed to read pkt length from the card:\n",
|
|
|
- __func__);
|
|
|
- return status;
|
|
|
+ if (!num_blks) {
|
|
|
+ status = rsi_sdio_read_register(adapter,
|
|
|
+ SDIO_RX_NUM_BLOCKS_REG,
|
|
|
+ &value);
|
|
|
+ if (status) {
|
|
|
+ rsi_dbg(ERR_ZONE,
|
|
|
+ "%s: Failed to read pkt length from the card:\n",
|
|
|
+ __func__);
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+ num_blks = value & 0x1f;
|
|
|
}
|
|
|
+
|
|
|
+ if (dev->write_fail == 2)
|
|
|
+ rsi_sdio_ack_intr(common->priv, (1 << MSDU_PKT_PENDING));
|
|
|
+
|
|
|
+ if (unlikely(!num_blks)) {
|
|
|
+ dev->write_fail = 2;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
rcv_pkt_len = (num_blks * 256);
|
|
|
|
|
|
common->rx_data_pkt = kmalloc(rcv_pkt_len, GFP_KERNEL);
|
|
@@ -224,6 +241,7 @@ void rsi_interrupt_handler(struct rsi_hw *adapter)
|
|
|
mutex_unlock(&common->tx_rxlock);
|
|
|
return;
|
|
|
}
|
|
|
+ adapter->interrupt_status = isr_status;
|
|
|
|
|
|
if (isr_status == 0) {
|
|
|
rsi_set_event(&common->tx_thread.event);
|