/** * qla24xx_process_response_queue() - Process response queue entries. * @ha: SCSI driver HA context */ void qla24xx_process_response_queue(struct scsi_qla_host *ha) { struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; struct sts_entry_24xx *pkt; if (!ha->flags.online) return; while (ha->response_ring_ptr->signature != RESPONSE_PROCESSED) { pkt = (struct sts_entry_24xx *)ha->response_ring_ptr; ha->rsp_ring_index++; if (ha->rsp_ring_index == ha->response_q_length) { ha->rsp_ring_index = 0; ha->response_ring_ptr = ha->response_ring; } else { ha->response_ring_ptr++; } if (pkt->entry_status != 0) { DEBUG3(printk(KERN_INFO "scsi(%ld): Process error entry.\n", ha->host_no)); qla2x00_error_entry(ha, (sts_entry_t *) pkt); ((response_t *)pkt)->signature = RESPONSE_PROCESSED; wmb(); continue; } switch (pkt->entry_type) { case STATUS_TYPE: qla2x00_status_entry(ha, pkt); break; case STATUS_CONT_TYPE: qla2x00_status_cont_entry(ha, (sts_cont_entry_t *)pkt); break; case MS_IOCB_TYPE: qla24xx_ms_entry(ha, (struct ct_entry_24xx *)pkt); break; default: /* Type Not Supported. */ DEBUG4(printk(KERN_WARNING "scsi(%ld): Received unknown response pkt type %x " "entry status=%x.\n", ha->host_no, pkt->entry_type, pkt->entry_status)); break; } ((response_t *)pkt)->signature = RESPONSE_PROCESSED; wmb(); } /* Adjust ring index */ WRT_REG_DWORD(®->rsp_q_out, ha->rsp_ring_index); }
/** * qla2x00_process_response_queue() - Process response queue entries. * @ha: SCSI driver HA context */ void qla2x00_process_response_queue(struct scsi_qla_host *ha) { device_reg_t *reg = ha->iobase; sts_entry_t *pkt; uint16_t handle_cnt; uint16_t cnt; if (!ha->flags.online) return; while (ha->response_ring_ptr->signature != RESPONSE_PROCESSED) { pkt = (sts_entry_t *)ha->response_ring_ptr; ha->rsp_ring_index++; if (ha->rsp_ring_index == ha->response_q_length) { ha->rsp_ring_index = 0; ha->response_ring_ptr = ha->response_ring; } else { ha->response_ring_ptr++; } if (pkt->entry_status != 0) { DEBUG3(printk(KERN_INFO "scsi(%ld): Process error entry.\n", ha->host_no)); qla2x00_error_entry(ha, pkt); ((response_t *)pkt)->signature = RESPONSE_PROCESSED; wmb(); continue; } switch (pkt->entry_type) { case STATUS_TYPE: qla2x00_status_entry(ha, pkt); break; case STATUS_TYPE_21: handle_cnt = ((sts21_entry_t *)pkt)->handle_count; for (cnt = 0; cnt < handle_cnt; cnt++) { qla2x00_process_completed_request(ha, ((sts21_entry_t *)pkt)->handle[cnt]); } break; case STATUS_TYPE_22: handle_cnt = ((sts22_entry_t *)pkt)->handle_count; for (cnt = 0; cnt < handle_cnt; cnt++) { qla2x00_process_completed_request(ha, ((sts22_entry_t *)pkt)->handle[cnt]); } break; case STATUS_CONT_TYPE: qla2x00_status_cont_entry(ha, (sts_cont_entry_t *)pkt); break; case MS_IOCB_TYPE: qla2x00_ms_entry(ha, (ms_iocb_entry_t *)pkt); break; case MBX_IOCB_TYPE: if (!IS_QLA2100(ha) && !IS_QLA2200(ha) && !IS_QLA6312(ha) && !IS_QLA6322(ha)) { if (pkt->sys_define == SOURCE_ASYNC_IOCB) { qla2x00_process_iodesc(ha, (struct mbx_entry *)pkt); } else { /* MBX IOCB Type Not Supported. */ DEBUG4(printk(KERN_WARNING "scsi(%ld): Received unknown MBX " "IOCB response pkt type=%x " "source=%x entry status=%x.\n", ha->host_no, pkt->entry_type, pkt->sys_define, pkt->entry_status)); } break; } /* Fallthrough. */ default: /* Type Not Supported. */ DEBUG4(printk(KERN_WARNING "scsi(%ld): Received unknown response pkt type %x " "entry status=%x.\n", ha->host_no, pkt->entry_type, pkt->entry_status)); break; } ((response_t *)pkt)->signature = RESPONSE_PROCESSED; wmb(); } /* Adjust ring index */ WRT_REG_WORD(ISP_RSP_Q_OUT(ha, reg), ha->rsp_ring_index); }