lkml.org 
[lkml]   [2012]   [Mar]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH v3 2/5] [SCSI] ufshcd: UFS UTP Transfer requests handling
    Santosh Y wrote:
    > + ucd_cmd_ptr->exp_data_transfer_len =
    > + cpu_to_be32(lrbp->cmd->transfersize);
    > +
    > + memcpy(ucd_cmd_ptr->cdb,
    > + lrbp->cmd->cmnd,
    > + (min_t(unsigned short,
    > + lrbp->cmd->cmd_len,
    > + MAX_CDB_SIZE)));

    "Exptected Data Transfer Length" field contains a value that
    represents the number of bytes that are required to complete the
    SCSI command request and the number of bytes that the Initiator
    expects to be transferred to/from the Target.
    (JEDEC Standard 220 Table7-7)
    On the other hand, "transfersize" in a scsi_cmnd struct is trimmed
    to the sector size when requested transfer length exceeds it.
    You may derive the actual transfer length from SCSI command itself like following.

    diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
    index feffe65..e63fecb 100644
    --- a/drivers/scsi/ufs/ufshcd.c
    +++ b/drivers/scsi/ufs/ufshcd.c
    @@ -647,6 +647,34 @@ static void ufshcd_compose_upiu(struct ufshcd_lrb *lrbp)
    (min_t(unsigned short,
    lrbp->cmd->cmd_len,
    MAX_CDB_SIZE)));
    +
    + /* Overwrite exptected transfer length by using TRANSFER_LENGTH in SCSI commands */
    + switch(ucd_cmd_ptr->cdb[0]) {
    + case READ_6:
    + case WRITE_6:
    + ucd_cmd_ptr->exp_data_transfer_len =
    + cpu_to_be32(lrbp->cmd->transfersize *
    + ucd_cmd_ptr->cdb[4]);
    + break;
    + case READ_10:
    + case WRITE_10:
    + ucd_cmd_ptr->exp_data_transfer_len =
    + cpu_to_be32(lrbp->cmd->transfersize *
    + ((ucd_cmd_ptr->cdb[7] << 8) |
    + ucd_cmd_ptr->cdb[8]));
    + break;
    + case READ_12:
    + case WRITE_12:
    + ucd_cmd_ptr->exp_data_transfer_len =
    + cpu_to_be32(lrbp->cmd->transfersize *
    + ((ucd_cmd_ptr->cdb[10] << 24) |
    + (ucd_cmd_ptr->cdb[11] << 16) |
    + (ucd_cmd_ptr->cdb[12] << 8) |
    + ucd_cmd_ptr->cdb[13]));
    + break;
    + default:
    + break;
    + }
    break;
    case UTP_CMD_TYPE_DEV_MANAGE:
    /* For query function implementation */


    \
     
     \ /
      Last update: 2012-03-26 07:25    [W:0.028 / U:31.788 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site