Commit af20bb73 authored by Justin Tee's avatar Justin Tee Committed by Martin K. Petersen

scsi: lpfc: Add support for 32 byte CDBs

The driver's I/O path is updated to support 32 byte CDBs.

Changes to accommodate 32 byte CDBs include:

 - Updating various size fields to allow for the larger 32 byte CDB.

 - Starting the FCP command payload at an earlier offset in WQE submission
   to fit the 32 byte CDB.

 - Redefining relevant structs to __le32/__be32 data types for proper cpu
   endianness macro usage.
Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
Link: https://lore.kernel.org/r/20240429221547.6842-7-justintee8345@gmail.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent e780c942
...@@ -2146,6 +2146,14 @@ struct sli4_sge { /* SLI-4 */ ...@@ -2146,6 +2146,14 @@ struct sli4_sge { /* SLI-4 */
uint32_t sge_len; uint32_t sge_len;
}; };
struct sli4_sge_le {
__le32 addr_hi;
__le32 addr_lo;
__le32 word2;
__le32 sge_len;
};
struct sli4_hybrid_sgl { struct sli4_hybrid_sgl {
struct list_head list_node; struct list_head list_node;
struct sli4_sge *dma_sgl; struct sli4_sge *dma_sgl;
......
...@@ -4773,7 +4773,10 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev) ...@@ -4773,7 +4773,10 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
shost->max_id = LPFC_MAX_TARGET; shost->max_id = LPFC_MAX_TARGET;
shost->max_lun = vport->cfg_max_luns; shost->max_lun = vport->cfg_max_luns;
shost->this_id = -1; shost->this_id = -1;
shost->max_cmd_len = 16; if (phba->sli_rev == LPFC_SLI_REV4)
shost->max_cmd_len = LPFC_FCP_CDB_LEN_32;
else
shost->max_cmd_len = LPFC_FCP_CDB_LEN;
if (phba->sli_rev == LPFC_SLI_REV4) { if (phba->sli_rev == LPFC_SLI_REV4) {
if (!phba->cfg_fcp_mq_threshold || if (!phba->cfg_fcp_mq_threshold ||
...@@ -8231,7 +8234,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) ...@@ -8231,7 +8234,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
* our max amount and we need to limit lpfc_sg_seg_cnt * our max amount and we need to limit lpfc_sg_seg_cnt
* to minimize the risk of running out. * to minimize the risk of running out.
*/ */
phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd32) +
sizeof(struct fcp_rsp) + max_buf_size; sizeof(struct fcp_rsp) + max_buf_size;
/* Total SGEs for scsi_sg_list and scsi_sg_prot_list */ /* Total SGEs for scsi_sg_list and scsi_sg_prot_list */
...@@ -8253,7 +8256,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) ...@@ -8253,7 +8256,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
* the FCP rsp, a SGE for each, and a SGE for up to * the FCP rsp, a SGE for each, and a SGE for up to
* cfg_sg_seg_cnt data segments. * cfg_sg_seg_cnt data segments.
*/ */
phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd32) +
sizeof(struct fcp_rsp) + sizeof(struct fcp_rsp) +
((phba->cfg_sg_seg_cnt + extra) * ((phba->cfg_sg_seg_cnt + extra) *
sizeof(struct sli4_sge)); sizeof(struct sli4_sge));
...@@ -8316,7 +8319,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba) ...@@ -8316,7 +8319,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
phba->lpfc_cmd_rsp_buf_pool = phba->lpfc_cmd_rsp_buf_pool =
dma_pool_create("lpfc_cmd_rsp_buf_pool", dma_pool_create("lpfc_cmd_rsp_buf_pool",
&phba->pcidev->dev, &phba->pcidev->dev,
sizeof(struct fcp_cmnd) + sizeof(struct fcp_cmnd32) +
sizeof(struct fcp_rsp), sizeof(struct fcp_rsp),
i, 0); i, 0);
if (!phba->lpfc_cmd_rsp_buf_pool) { if (!phba->lpfc_cmd_rsp_buf_pool) {
......
...@@ -600,7 +600,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp, ...@@ -600,7 +600,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
{ {
struct lpfc_io_buf *lpfc_cmd; struct lpfc_io_buf *lpfc_cmd;
struct lpfc_sli4_hdw_queue *qp; struct lpfc_sli4_hdw_queue *qp;
struct sli4_sge *sgl; struct sli4_sge_le *sgl;
dma_addr_t pdma_phys_fcp_rsp; dma_addr_t pdma_phys_fcp_rsp;
dma_addr_t pdma_phys_fcp_cmd; dma_addr_t pdma_phys_fcp_cmd;
uint32_t cpu, idx; uint32_t cpu, idx;
...@@ -651,23 +651,23 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp, ...@@ -651,23 +651,23 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
* The balance are sg list bdes. Initialize the * The balance are sg list bdes. Initialize the
* first two and leave the rest for queuecommand. * first two and leave the rest for queuecommand.
*/ */
sgl = (struct sli4_sge *)lpfc_cmd->dma_sgl; sgl = (struct sli4_sge_le *)lpfc_cmd->dma_sgl;
pdma_phys_fcp_cmd = tmp->fcp_cmd_rsp_dma_handle; pdma_phys_fcp_cmd = tmp->fcp_cmd_rsp_dma_handle;
sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_cmd)); sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_cmd));
sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_cmd)); sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_cmd));
sgl->word2 = le32_to_cpu(sgl->word2); bf_set_le32(lpfc_sli4_sge_last, sgl, 0);
bf_set(lpfc_sli4_sge_last, sgl, 0); if (cmnd && cmnd->cmd_len > LPFC_FCP_CDB_LEN)
sgl->word2 = cpu_to_le32(sgl->word2); sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd32));
sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd)); else
sgl->sge_len = cpu_to_le32(sizeof(struct fcp_cmnd));
sgl++; sgl++;
/* Setup the physical region for the FCP RSP */ /* Setup the physical region for the FCP RSP */
pdma_phys_fcp_rsp = pdma_phys_fcp_cmd + sizeof(struct fcp_cmnd); pdma_phys_fcp_rsp = pdma_phys_fcp_cmd + sizeof(struct fcp_cmnd32);
sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_rsp)); sgl->addr_hi = cpu_to_le32(putPaddrHigh(pdma_phys_fcp_rsp));
sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_rsp)); sgl->addr_lo = cpu_to_le32(putPaddrLow(pdma_phys_fcp_rsp));
sgl->word2 = le32_to_cpu(sgl->word2); bf_set_le32(lpfc_sli4_sge_last, sgl, 1);
bf_set(lpfc_sli4_sge_last, sgl, 1);
sgl->word2 = cpu_to_le32(sgl->word2);
sgl->sge_len = cpu_to_le32(sizeof(struct fcp_rsp)); sgl->sge_len = cpu_to_le32(sizeof(struct fcp_rsp));
if (lpfc_ndlp_check_qdepth(phba, ndlp)) { if (lpfc_ndlp_check_qdepth(phba, ndlp)) {
...@@ -2608,7 +2608,7 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, ...@@ -2608,7 +2608,7 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba,
iocb_cmd->ulpLe = 1; iocb_cmd->ulpLe = 1;
fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd); fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
fcp_cmnd->fcpDl = be32_to_cpu(fcpdl); fcp_cmnd->fcpDl = cpu_to_be32(fcpdl);
/* /*
* Due to difference in data length between DIF/non-DIF paths, * Due to difference in data length between DIF/non-DIF paths,
...@@ -3225,14 +3225,18 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd) ...@@ -3225,14 +3225,18 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd)
* explicitly reinitialized. * explicitly reinitialized.
* all iocb memory resources are reused. * all iocb memory resources are reused.
*/ */
fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd)); if (scsi_cmnd->cmd_len > LPFC_FCP_CDB_LEN)
((struct fcp_cmnd32 *)fcp_cmnd)->fcpDl =
cpu_to_be32(scsi_bufflen(scsi_cmnd));
else
fcp_cmnd->fcpDl = cpu_to_be32(scsi_bufflen(scsi_cmnd));
/* Set first-burst provided it was successfully negotiated */ /* Set first-burst provided it was successfully negotiated */
if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) && if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) &&
vport->cfg_first_burst_size && vport->cfg_first_burst_size &&
scsi_cmnd->sc_data_direction == DMA_TO_DEVICE) { scsi_cmnd->sc_data_direction == DMA_TO_DEVICE) {
u32 init_len, total_len; u32 init_len, total_len;
total_len = be32_to_cpu(fcp_cmnd->fcpDl); total_len = scsi_bufflen(scsi_cmnd);
init_len = min(total_len, vport->cfg_first_burst_size); init_len = min(total_len, vport->cfg_first_burst_size);
/* Word 4 & 5 */ /* Word 4 & 5 */
...@@ -3420,7 +3424,10 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, ...@@ -3420,7 +3424,10 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
} }
fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd); fcpdl = lpfc_bg_scsi_adjust_dl(phba, lpfc_cmd);
fcp_cmnd->fcpDl = be32_to_cpu(fcpdl); if (lpfc_cmd->pCmd->cmd_len > LPFC_FCP_CDB_LEN)
((struct fcp_cmnd32 *)fcp_cmnd)->fcpDl = cpu_to_be32(fcpdl);
else
fcp_cmnd->fcpDl = cpu_to_be32(fcpdl);
/* Set first-burst provided it was successfully negotiated */ /* Set first-burst provided it was successfully negotiated */
if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) && if (!test_bit(HBA_FCOE_MODE, &phba->hba_flag) &&
...@@ -3428,7 +3435,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, ...@@ -3428,7 +3435,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
scsi_cmnd->sc_data_direction == DMA_TO_DEVICE) { scsi_cmnd->sc_data_direction == DMA_TO_DEVICE) {
u32 init_len, total_len; u32 init_len, total_len;
total_len = be32_to_cpu(fcp_cmnd->fcpDl); total_len = fcpdl;
init_len = min(total_len, vport->cfg_first_burst_size); init_len = min(total_len, vport->cfg_first_burst_size);
/* Word 4 & 5 */ /* Word 4 & 5 */
...@@ -3436,8 +3443,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, ...@@ -3436,8 +3443,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba,
wqe->fcp_iwrite.total_xfer_len = total_len; wqe->fcp_iwrite.total_xfer_len = total_len;
} else { } else {
/* Word 4 */ /* Word 4 */
wqe->fcp_iwrite.total_xfer_len = wqe->fcp_iwrite.total_xfer_len = fcpdl;
be32_to_cpu(fcp_cmnd->fcpDl);
} }
/* /*
...@@ -3894,7 +3900,10 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_io_buf *lpfc_cmd, ...@@ -3894,7 +3900,10 @@ lpfc_handle_fcp_err(struct lpfc_vport *vport, struct lpfc_io_buf *lpfc_cmd,
fcprsp->rspInfo3); fcprsp->rspInfo3);
scsi_set_resid(cmnd, 0); scsi_set_resid(cmnd, 0);
fcpDl = be32_to_cpu(fcpcmd->fcpDl); if (cmnd->cmd_len > LPFC_FCP_CDB_LEN)
fcpDl = be32_to_cpu(((struct fcp_cmnd32 *)fcpcmd)->fcpDl);
else
fcpDl = be32_to_cpu(fcpcmd->fcpDl);
if (resp_info & RESID_UNDER) { if (resp_info & RESID_UNDER) {
scsi_set_resid(cmnd, be32_to_cpu(fcprsp->rspResId)); scsi_set_resid(cmnd, be32_to_cpu(fcprsp->rspResId));
...@@ -4723,6 +4732,14 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport, ...@@ -4723,6 +4732,14 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport,
bf_set(wqe_iod, &wqe->fcp_iread.wqe_com, bf_set(wqe_iod, &wqe->fcp_iread.wqe_com,
LPFC_WQE_IOD_NONE); LPFC_WQE_IOD_NONE);
} }
/* Additional fcp cdb length field calculation.
* LPFC_FCP_CDB_LEN_32 - normal 16 byte cdb length,
* then divide by 4 for the word count.
* shift 2 because of the RDDATA/WRDATA.
*/
if (scsi_cmnd->cmd_len > LPFC_FCP_CDB_LEN)
fcp_cmnd->fcpCntl3 |= 4 << 2;
} else { } else {
/* From the icmnd template, initialize words 4 - 11 */ /* From the icmnd template, initialize words 4 - 11 */
memcpy(&wqe->words[4], &lpfc_icmnd_cmd_template.words[4], memcpy(&wqe->words[4], &lpfc_icmnd_cmd_template.words[4],
...@@ -4743,7 +4760,7 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport, ...@@ -4743,7 +4760,7 @@ static int lpfc_scsi_prep_cmnd_buf_s4(struct lpfc_vport *vport,
/* Word 3 */ /* Word 3 */
bf_set(payload_offset_len, &wqe->fcp_icmd, bf_set(payload_offset_len, &wqe->fcp_icmd,
sizeof(struct fcp_cmnd) + sizeof(struct fcp_rsp)); sizeof(struct fcp_cmnd32) + sizeof(struct fcp_rsp));
/* Word 6 */ /* Word 6 */
bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com, bf_set(wqe_ctxt_tag, &wqe->generic.wqe_com,
...@@ -4798,7 +4815,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_io_buf *lpfc_cmd, ...@@ -4798,7 +4815,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_io_buf *lpfc_cmd,
int_to_scsilun(lpfc_cmd->pCmd->device->lun, int_to_scsilun(lpfc_cmd->pCmd->device->lun,
&lpfc_cmd->fcp_cmnd->fcp_lun); &lpfc_cmd->fcp_cmnd->fcp_lun);
ptr = &fcp_cmnd->fcpCdb[0]; ptr = &((struct fcp_cmnd32 *)fcp_cmnd)->fcpCdb[0];
memcpy(ptr, scsi_cmnd->cmnd, scsi_cmnd->cmd_len); memcpy(ptr, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
if (scsi_cmnd->cmd_len < LPFC_FCP_CDB_LEN) { if (scsi_cmnd->cmd_len < LPFC_FCP_CDB_LEN) {
ptr += scsi_cmnd->cmd_len; ptr += scsi_cmnd->cmd_len;
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
struct lpfc_hba; struct lpfc_hba;
#define LPFC_FCP_CDB_LEN 16 #define LPFC_FCP_CDB_LEN 16
#define LPFC_FCP_CDB_LEN_32 32
#define list_remove_head(list, entry, type, member) \ #define list_remove_head(list, entry, type, member) \
do { \ do { \
...@@ -99,17 +100,11 @@ struct fcp_rsp { ...@@ -99,17 +100,11 @@ struct fcp_rsp {
#define SNSCOD_BADCMD 0x20 /* sense code is byte 13 ([12]) */ #define SNSCOD_BADCMD 0x20 /* sense code is byte 13 ([12]) */
}; };
struct fcp_cmnd {
struct scsi_lun fcp_lun;
uint8_t fcpCntl0; /* FCP_CNTL byte 0 (reserved) */
uint8_t fcpCntl1; /* FCP_CNTL byte 1 task codes */
#define SIMPLE_Q 0x00 #define SIMPLE_Q 0x00
#define HEAD_OF_Q 0x01 #define HEAD_OF_Q 0x01
#define ORDERED_Q 0x02 #define ORDERED_Q 0x02
#define ACA_Q 0x04 #define ACA_Q 0x04
#define UNTAGGED 0x05 #define UNTAGGED 0x05
uint8_t fcpCntl2; /* FCP_CTL byte 2 task management codes */
#define FCP_ABORT_TASK_SET 0x02 /* Bit 1 */ #define FCP_ABORT_TASK_SET 0x02 /* Bit 1 */
#define FCP_CLEAR_TASK_SET 0x04 /* bit 2 */ #define FCP_CLEAR_TASK_SET 0x04 /* bit 2 */
#define FCP_BUS_RESET 0x08 /* bit 3 */ #define FCP_BUS_RESET 0x08 /* bit 3 */
...@@ -117,12 +112,31 @@ struct fcp_cmnd { ...@@ -117,12 +112,31 @@ struct fcp_cmnd {
#define FCP_TARGET_RESET 0x20 /* bit 5 */ #define FCP_TARGET_RESET 0x20 /* bit 5 */
#define FCP_CLEAR_ACA 0x40 /* bit 6 */ #define FCP_CLEAR_ACA 0x40 /* bit 6 */
#define FCP_TERMINATE_TASK 0x80 /* bit 7 */ #define FCP_TERMINATE_TASK 0x80 /* bit 7 */
uint8_t fcpCntl3;
#define WRITE_DATA 0x01 /* Bit 0 */ #define WRITE_DATA 0x01 /* Bit 0 */
#define READ_DATA 0x02 /* Bit 1 */ #define READ_DATA 0x02 /* Bit 1 */
struct fcp_cmnd {
struct scsi_lun fcp_lun;
uint8_t fcpCntl0; /* FCP_CNTL byte 0 (reserved) */
uint8_t fcpCntl1; /* FCP_CNTL byte 1 task codes */
uint8_t fcpCntl2; /* FCP_CTL byte 2 task management codes */
uint8_t fcpCntl3;
uint8_t fcpCdb[LPFC_FCP_CDB_LEN]; /* SRB cdb field is copied here */ uint8_t fcpCdb[LPFC_FCP_CDB_LEN]; /* SRB cdb field is copied here */
uint32_t fcpDl; /* Total transfer length */ __be32 fcpDl; /* Total transfer length */
};
struct fcp_cmnd32 {
struct scsi_lun fcp_lun;
uint8_t fcpCntl0; /* FCP_CNTL byte 0 (reserved) */
uint8_t fcpCntl1; /* FCP_CNTL byte 1 task codes */
uint8_t fcpCntl2; /* FCP_CTL byte 2 task management codes */
uint8_t fcpCntl3;
uint8_t fcpCdb[LPFC_FCP_CDB_LEN_32]; /* SRB cdb field is copied here */
__be32 fcpDl; /* Total transfer length */
}; };
......
...@@ -10595,18 +10595,18 @@ lpfc_prep_embed_io(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd) ...@@ -10595,18 +10595,18 @@ lpfc_prep_embed_io(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd)
BUFF_TYPE_BDE_IMMED; BUFF_TYPE_BDE_IMMED;
wqe->generic.bde.tus.f.bdeSize = sgl->sge_len; wqe->generic.bde.tus.f.bdeSize = sgl->sge_len;
wqe->generic.bde.addrHigh = 0; wqe->generic.bde.addrHigh = 0;
wqe->generic.bde.addrLow = 88; /* Word 22 */ wqe->generic.bde.addrLow = 72; /* Word 18 */
bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1); bf_set(wqe_wqes, &wqe->fcp_iwrite.wqe_com, 1);
bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 0); bf_set(wqe_dbde, &wqe->fcp_iwrite.wqe_com, 0);
/* Word 22-29 FCP CMND Payload */ /* Word 18-29 FCP CMND Payload */
ptr = &wqe->words[22]; ptr = &wqe->words[18];
memcpy(ptr, fcp_cmnd, sizeof(struct fcp_cmnd)); memcpy(ptr, fcp_cmnd, sgl->sge_len);
} else { } else {
/* Word 0-2 - Inline BDE */ /* Word 0-2 - Inline BDE */
wqe->generic.bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64; wqe->generic.bde.tus.f.bdeFlags = BUFF_TYPE_BDE_64;
wqe->generic.bde.tus.f.bdeSize = sizeof(struct fcp_cmnd); wqe->generic.bde.tus.f.bdeSize = sgl->sge_len;
wqe->generic.bde.addrHigh = sgl->addr_hi; wqe->generic.bde.addrHigh = sgl->addr_hi;
wqe->generic.bde.addrLow = sgl->addr_lo; wqe->generic.bde.addrLow = sgl->addr_lo;
...@@ -22469,7 +22469,7 @@ lpfc_get_cmd_rsp_buf_per_hdwq(struct lpfc_hba *phba, ...@@ -22469,7 +22469,7 @@ lpfc_get_cmd_rsp_buf_per_hdwq(struct lpfc_hba *phba,
} }
tmp->fcp_rsp = (struct fcp_rsp *)((uint8_t *)tmp->fcp_cmnd + tmp->fcp_rsp = (struct fcp_rsp *)((uint8_t *)tmp->fcp_cmnd +
sizeof(struct fcp_cmnd)); sizeof(struct fcp_cmnd32));
spin_lock_irqsave(&hdwq->hdwq_lock, iflags); spin_lock_irqsave(&hdwq->hdwq_lock, iflags);
list_add_tail(&tmp->list_node, &lpfc_buf->dma_cmd_rsp_list); list_add_tail(&tmp->list_node, &lpfc_buf->dma_cmd_rsp_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment