struct scatterlist *sg;
int i;
struct req_que *req;
- uint16_t que_id;
cmd = sp->cmd;
return;
}
- vha = sp->vha;
- que_id = vha->req_ques[0];
- req = vha->hw->req_q_map[que_id];
+ vha = sp->fcport->vha;
+ req = sp->que;
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
struct scatterlist *sg;
int i;
struct req_que *req;
- uint16_t que_id;
cmd = sp->cmd;
return;
}
- vha = sp->vha;
- que_id = vha->req_ques[0];
- req = vha->hw->req_q_map[que_id];
+ vha = sp->fcport->vha;
+ req = sp->que;
cmd_pkt->control_flags |= cpu_to_le16(qla2x00_get_cmd_direction(sp));
/* Setup device pointers. */
ret = 0;
- vha = sp->vha;
+ vha = sp->fcport->vha;
ha = vha->hw;
reg = &ha->iobase->isp;
cmd = sp->cmd;
/* Build command packet */
req->current_outstanding_cmd = handle;
req->outstanding_cmds[handle] = sp;
- sp->vha = vha;
+ sp->que = req;
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
req->cnt -= req_cnt;
{
struct qla_hw_data *ha = vha->hw;
device_reg_t __iomem *reg = ISP_QUE_REG(ha, req->id);
+ struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
DEBUG5(printk("%s(): IOCB data:\n", __func__));
DEBUG5(qla2x00_dump_buffer(
req->ring_ptr++;
/* Set chip new ring index. */
- if (ha->mqenable)
- RD_REG_DWORD(®->isp25mq.req_q_out);
+ if (ha->mqenable) {
+ WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index);
+ RD_REG_DWORD(&ioreg->hccr);
+ }
else {
if (IS_FWI2_CAPABLE(ha)) {
WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);
struct scsi_cmnd *cmd;
struct scatterlist *sg;
int i;
- uint16_t que_id;
struct req_que *req;
cmd = sp->cmd;
return;
}
- vha = sp->vha;
- que_id = vha->req_ques[0];
- req = vha->hw->req_q_map[que_id];
+ vha = sp->fcport->vha;
+ req = sp->que;
/* Set transfer direction */
if (cmd->sc_data_direction == DMA_TO_DEVICE) {
struct req_que *req = NULL;
struct rsp_que *rsp = NULL;
struct scsi_cmnd *cmd = sp->cmd;
- struct scsi_qla_host *vha = sp->vha;
+ struct scsi_qla_host *vha = sp->fcport->vha;
struct qla_hw_data *ha = vha->hw;
- device_reg_t __iomem *reg;
uint16_t que_id;
/* Setup device pointers. */
que_id = vha->req_ques[0];
req = ha->req_q_map[que_id];
- reg = ISP_QUE_REG(ha, req->id);
+ sp->que = req;
if (req->rsp)
rsp = req->rsp;
req_cnt = qla24xx_calc_iocbs(tot_dsds);
if (req->cnt < (req_cnt + 2)) {
- if (ha->mqenable)
- cnt = (uint16_t)
- RD_REG_DWORD_RELAXED(®->isp25mq.req_q_out);
- else
- cnt = (uint16_t)
- RD_REG_DWORD_RELAXED(®->isp24.req_q_out);
+ cnt = ha->isp_ops->rd_req_reg(ha, req->id);
if (req->ring_index < cnt)
req->cnt = cnt - req->ring_index;
/* Build command packet. */
req->current_outstanding_cmd = handle;
req->outstanding_cmds[handle] = sp;
- sp->vha = vha;
sp->cmd->host_scribble = (unsigned char *)(unsigned long)handle;
req->cnt -= req_cnt;
sp->flags |= SRB_DMA_VALID;
/* Set chip new ring index. */
- if (ha->mqenable)
- WRT_REG_DWORD(®->isp25mq.req_q_in, req->ring_index);
- else {
- WRT_REG_DWORD(®->isp24.req_q_in, req->ring_index);
- RD_REG_DWORD_RELAXED(®->isp24.req_q_in);
- }
+ ha->isp_ops->wrt_req_reg(ha, req->id, req->ring_index);
/* Manage unprocessed RIO/ZIO commands in response queue. */
if (vha->flags.process_response_queue &&
return QLA_FUNCTION_FAILED;
}
+uint16_t
+qla24xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id)
+{
+ device_reg_t __iomem *reg = (void *) ha->iobase;
+ return RD_REG_DWORD_RELAXED(®->isp24.req_q_out);
+}
+
+uint16_t
+qla25xx_rd_req_reg(struct qla_hw_data *ha, uint16_t id)
+{
+ device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id;
+ return RD_REG_DWORD_RELAXED(®->isp25mq.req_q_out);
+}
+
+void
+qla24xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
+{
+ device_reg_t __iomem *reg = (void *) ha->iobase;
+ WRT_REG_DWORD(®->isp24.req_q_in, index);
+ RD_REG_DWORD_RELAXED(®->isp24.req_q_in);
+}
+
+void
+qla25xx_wrt_req_reg(struct qla_hw_data *ha, uint16_t id, uint16_t index)
+{
+ device_reg_t __iomem *reg = (void *) ha->mqiobase + QLA_QUE_PAGE * id;
+ struct device_reg_2xxx __iomem *ioreg = &ha->iobase->isp;
+ WRT_REG_DWORD(®->isp25mq.req_q_in, index);
+ RD_REG_DWORD(&ioreg->hccr); /* PCI posting */
+}
+