static void qla4xxx_build_scsi_iocbs(struct srb *srb, struct command_t3_entry *cmd_entry, uint16_t tot_dsds) { struct scsi_qla_host *ha; uint16_t avail_dsds; struct data_seg_a64 *cur_dsd; struct scsi_cmnd *cmd; cmd = srb->cmd; ha = srb->ha; if (cmd->request_bufflen == 0 || cmd->sc_data_direction == DMA_NONE) { /* No data being transferred */ cmd_entry->ttlByteCnt = __constant_cpu_to_le32(0); return; } avail_dsds = COMMAND_SEG; cur_dsd = (struct data_seg_a64 *) & (cmd_entry->dataseg[0]); /* Load data segments */ if (cmd->use_sg) { struct scatterlist *cur_seg; struct scatterlist *end_seg; cur_seg = (struct scatterlist *)cmd->request_buffer; end_seg = cur_seg + tot_dsds; while (cur_seg < end_seg) { dma_addr_t sle_dma; /* Allocate additional continuation packets? */ if (avail_dsds == 0) { struct continuation_t1_entry *cont_entry; cont_entry = qla4xxx_alloc_cont_entry(ha); cur_dsd = (struct data_seg_a64 *) &cont_entry->dataseg[0]; avail_dsds = CONTINUE_SEG; } sle_dma = sg_dma_address(cur_seg); cur_dsd->base.addrLow = cpu_to_le32(LSDW(sle_dma)); cur_dsd->base.addrHigh = cpu_to_le32(MSDW(sle_dma)); cur_dsd->count = cpu_to_le32(sg_dma_len(cur_seg)); avail_dsds--; cur_dsd++; cur_seg++; } } else { cur_dsd->base.addrLow = cpu_to_le32(LSDW(srb->dma_handle)); cur_dsd->base.addrHigh = cpu_to_le32(MSDW(srb->dma_handle)); cur_dsd->count = cpu_to_le32(cmd->request_bufflen); } }
static void qla4xxx_build_scsi_iocbs(struct srb *srb, struct command_t3_entry *cmd_entry, uint16_t tot_dsds) { struct scsi_qla_host *ha; uint16_t avail_dsds; struct data_seg_a64 *cur_dsd; struct scsi_cmnd *cmd; struct scatterlist *sg; int i; cmd = srb->cmd; ha = srb->ha; if (!scsi_bufflen(cmd) || cmd->sc_data_direction == DMA_NONE) { /* No data being transferred */ cmd_entry->ttlByteCnt = __constant_cpu_to_le32(0); return; } avail_dsds = COMMAND_SEG; cur_dsd = (struct data_seg_a64 *) & (cmd_entry->dataseg[0]); scsi_for_each_sg(cmd, sg, tot_dsds, i) { dma_addr_t sle_dma; /* Allocate additional continuation packets? */ if (avail_dsds == 0) { struct continuation_t1_entry *cont_entry; cont_entry = qla4xxx_alloc_cont_entry(ha); cur_dsd = (struct data_seg_a64 *) &cont_entry->dataseg[0]; avail_dsds = CONTINUE_SEG; } sle_dma = sg_dma_address(sg); cur_dsd->base.addrLow = cpu_to_le32(LSDW(sle_dma)); cur_dsd->base.addrHigh = cpu_to_le32(MSDW(sle_dma)); cur_dsd->count = cpu_to_le32(sg_dma_len(sg)); avail_dsds--; cur_dsd++; }