Patch "scsi: ufs: Introduce a quirk to allow only page-aligned sg entries" has been added to the 5.10-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: ufs: Introduce a quirk to allow only page-aligned sg entries

to the 5.10-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-ufs-introduce-a-quirk-to-allow-only-page-aligne.patch
and it can be found in the queue-5.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ea192eb2ec9a16cb556029a3f1409b9165f604e5
Author: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
Date:   Tue Jan 19 12:33:41 2021 +0900

    scsi: ufs: Introduce a quirk to allow only page-aligned sg entries
    
    [ Upstream commit 2b2bfc8aa519f696087475ed8e8c61850c673272 ]
    
    Some SoCs require a single scatterlist entry for smaller than page size,
    i.e. 4KB. When dispatching commands with more than one scatterlist entry
    under 4KB in size the following behavior is observed:
    
    A command to read a block range is dispatched with two scatterlist entries
    that are named AAA and BBB. After dispatching, the host builds two PRDT
    entries and during transmission, device sends just one DATA IN because
    device doesn't care about host DMA. The host then transfers the combined
    amount of data from start address of the area named AAA. As a consequence,
    the area that follows AAA in memory would be corrupted.
    
        |<------------->|
        +-------+------------         +-------+
        +  AAA  + (corrupted)   ...   +  BBB  +
        +-------+------------         +-------+
    
    To avoid this we need to enforce page size alignment for sg entries.
    
    Link: https://lore.kernel.org/r/56dddef94f60bd9466fd77e69f64bbbd657ed2a1.1611026909.git.kwmad.kim@xxxxxxxxxxx
    Signed-off-by: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 379d44d6b9eb..5a7cc2e42ffd 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -4748,6 +4748,8 @@ static int ufshcd_slave_configure(struct scsi_device *sdev)
 	struct request_queue *q = sdev->request_queue;
 
 	blk_queue_update_dma_pad(q, PRDT_DATA_BYTE_COUNT_PAD - 1);
+	if (hba->quirks & UFSHCD_QUIRK_ALIGN_SG_WITH_PAGE_SIZE)
+		blk_queue_update_dma_alignment(q, PAGE_SIZE - 1);
 
 	if (ufshcd_is_rpm_autosuspend_allowed(hba))
 		sdev->rpm_autosuspend = 1;
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index fcca4e15c8cd..a0bc118f9188 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -550,6 +550,10 @@ enum ufshcd_quirks {
 	 */
 	UFSHCD_QUIRK_SKIP_DEF_UNIPRO_TIMEOUT_SETTING = 1 << 13,
 
+	/*
+	 * This quirk allows only sg entries aligned with page size.
+	 */
+	UFSHCD_QUIRK_ALIGN_SG_WITH_PAGE_SIZE		= 1 << 13,
 };
 
 enum ufshcd_caps {



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux