diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_nx.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index 5cbf33a50b14..049807cda419 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
@@ -2208,6 +2208,7 @@ qla82xx_msix_rsp_q(int irq, void *dev_id) | |||
2208 | struct qla_hw_data *ha; | 2208 | struct qla_hw_data *ha; |
2209 | struct rsp_que *rsp; | 2209 | struct rsp_que *rsp; |
2210 | struct device_reg_82xx __iomem *reg; | 2210 | struct device_reg_82xx __iomem *reg; |
2211 | unsigned long flags; | ||
2211 | 2212 | ||
2212 | rsp = (struct rsp_que *) dev_id; | 2213 | rsp = (struct rsp_que *) dev_id; |
2213 | if (!rsp) { | 2214 | if (!rsp) { |
@@ -2218,11 +2219,11 @@ qla82xx_msix_rsp_q(int irq, void *dev_id) | |||
2218 | 2219 | ||
2219 | ha = rsp->hw; | 2220 | ha = rsp->hw; |
2220 | reg = &ha->iobase->isp82; | 2221 | reg = &ha->iobase->isp82; |
2221 | spin_lock_irq(&ha->hardware_lock); | 2222 | spin_lock_irqsave(&ha->hardware_lock, flags); |
2222 | vha = pci_get_drvdata(ha->pdev); | 2223 | vha = pci_get_drvdata(ha->pdev); |
2223 | qla24xx_process_response_queue(vha, rsp); | 2224 | qla24xx_process_response_queue(vha, rsp); |
2224 | WRT_REG_DWORD(®->host_int, 0); | 2225 | WRT_REG_DWORD(®->host_int, 0); |
2225 | spin_unlock_irq(&ha->hardware_lock); | 2226 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
2226 | return IRQ_HANDLED; | 2227 | return IRQ_HANDLED; |
2227 | } | 2228 | } |
2228 | 2229 | ||
@@ -2838,6 +2839,16 @@ sufficient_dsds: | |||
2838 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); | 2839 | int_to_scsilun(sp->cmd->device->lun, &cmd_pkt->lun); |
2839 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); | 2840 | host_to_fcp_swap((uint8_t *)&cmd_pkt->lun, sizeof(cmd_pkt->lun)); |
2840 | 2841 | ||
2842 | /* build FCP_CMND IU */ | ||
2843 | memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); | ||
2844 | int_to_scsilun(sp->cmd->device->lun, &ctx->fcp_cmnd->lun); | ||
2845 | ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; | ||
2846 | |||
2847 | if (cmd->sc_data_direction == DMA_TO_DEVICE) | ||
2848 | ctx->fcp_cmnd->additional_cdb_len |= 1; | ||
2849 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) | ||
2850 | ctx->fcp_cmnd->additional_cdb_len |= 2; | ||
2851 | |||
2841 | /* | 2852 | /* |
2842 | * Update tagged queuing modifier -- default is TSK_SIMPLE (0). | 2853 | * Update tagged queuing modifier -- default is TSK_SIMPLE (0). |
2843 | */ | 2854 | */ |
@@ -2854,16 +2865,6 @@ sufficient_dsds: | |||
2854 | } | 2865 | } |
2855 | } | 2866 | } |
2856 | 2867 | ||
2857 | /* build FCP_CMND IU */ | ||
2858 | memset(ctx->fcp_cmnd, 0, sizeof(struct fcp_cmnd)); | ||
2859 | int_to_scsilun(sp->cmd->device->lun, &ctx->fcp_cmnd->lun); | ||
2860 | ctx->fcp_cmnd->additional_cdb_len = additional_cdb_len; | ||
2861 | |||
2862 | if (cmd->sc_data_direction == DMA_TO_DEVICE) | ||
2863 | ctx->fcp_cmnd->additional_cdb_len |= 1; | ||
2864 | else if (cmd->sc_data_direction == DMA_FROM_DEVICE) | ||
2865 | ctx->fcp_cmnd->additional_cdb_len |= 2; | ||
2866 | |||
2867 | memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); | 2868 | memcpy(ctx->fcp_cmnd->cdb, cmd->cmnd, cmd->cmd_len); |
2868 | 2869 | ||
2869 | fcp_dl = (uint32_t *)(ctx->fcp_cmnd->cdb + 16 + | 2870 | fcp_dl = (uint32_t *)(ctx->fcp_cmnd->cdb + 16 + |