コード例 #1
0
ファイル: ql4_iocb.c プロジェクト: 3sOx/asuswrt-merlin
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);
	}
}
コード例 #2
0
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++;
    }