• Avri Altman's avatar
    scsi: ufs: ufshpb: Use a correct max multi chunk · 07106f86
    Avri Altman authored
    In HPB2.0, if pre_req_min_tr_len < transfer_len < pre_req_max_tr_len, the
    driver is expected to send a HPB-WRITE-BUFFER companion to HPB-READ.
    
    The upper bound should fit into a single byte, regardless of bMAX_
    DATA_SIZE_FOR_HPB_SINGLE_CMD which being an attribute (u32) can be
    significantly larger.
    
    To further illustrate the issue, consider the following scenario:
    
     - SCSI_DEFAULT_MAX_SECTORS is 1024 limiting the I/O chunks to 512KB
    
     - The OEM changes scsi_host_template .max_sectors to be 2048 which allows
       for 1MB requests: transfer_len = 256
    
     - pre_req_max_tr_len = HPB_MULTI_CHUNK_HIGH = 256
    
     - ufshpb_is_supported_chunk() returns true (256 <= 256)
    
     - WARN_ON_ONCE(256 > 256) doesn't warn
    
     - ufshpb_set_hpb_read_to_upiu() casts transfer_len to u8: transfer_len = 0
    
     - The command is failing with ILLEGAL REQUEST
    
    Link: https://lore.kernel.org/r/20210808090024.21721-3-avri.altman@wdc.com
    Fixes: 41d8a933 (scsi: ufs: ufshpb: Add HPB 2.0 support)
    Signed-off-by: default avatarAvri Altman <avri.altman@wdc.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    07106f86
ufshpb.h 8.66 KB