- if (IS_QLA2100(ha) || IS_QLA2200(ha)) {
- if ((RD_REG_WORD(®->istatus) & ISR_RISC_INT) == 0)
- break;
-
- if (RD_REG_WORD(®->semaphore) & BIT_0) {
- WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
- RD_REG_WORD(®->hccr);
-
- /* Get mailbox data. */
- mbx = RD_MAILBOX_REG(ha, reg, 0);
- if (mbx > 0x3fff && mbx < 0x8000) {
- qla2x00_mbx_completion(ha,
- (uint16_t)mbx);
- status |= MBX_INTERRUPT;
- } else if (mbx > 0x7fff && mbx < 0xc000) {
- qla2x00_async_event(ha, mbx);
- } else {
- /*EMPTY*/
- DEBUG2(printk("scsi(%ld): Unrecognized "
- "interrupt type (%d)\n",
- ha->host_no, mbx));
- }
- /* Release mailbox registers. */
- WRT_REG_WORD(®->semaphore, 0);
- /* Workaround for ISP2100 chip. */
- if (IS_QLA2100(ha))
- RD_REG_WORD(®->semaphore);
- } else {
- qla2x00_process_response_queue(ha);
-
- WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
- RD_REG_WORD(®->hccr);
- }
- } else /* IS_QLA23XX(ha) */ {
- stat = RD_REG_DWORD(®->u.isp2300.host_status);
- if (stat & HSR_RISC_PAUSED) {
- hccr = RD_REG_WORD(®->hccr);
- if (hccr & (BIT_15 | BIT_13 | BIT_11 | BIT_8))
- qla_printk(KERN_INFO, ha,
- "Parity error -- HCCR=%x.\n", hccr);
- else
- qla_printk(KERN_INFO, ha,
- "RISC paused -- HCCR=%x\n", hccr);
-
- /*
- * Issue a "HARD" reset in order for the RISC
- * interrupt bit to be cleared. Schedule a big
- * hammmer to get out of the RISC PAUSED state.
- */
- WRT_REG_WORD(®->hccr, HCCR_RESET_RISC);
- RD_REG_WORD(®->hccr);
- set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
- break;
- } else if ((stat & HSR_RISC_INT) == 0)
- break;