lkml.org 
[lkml]   [2019]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.19 042/167] scsi: megaraid_sas: Use 63-bit DMA addressing
    Date
    From: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>

    [ Upstream commit 894169db12463cea08d0e2a9e35f42b291340e5a ]

    Although MegaRAID controllers support 64-bit DMA addressing, as per
    hardware design, DMA address with all 64-bits set
    (0xFFFFFFFF-FFFFFFFF) results in a firmware fault.

    Driver will set 63-bit DMA mask to ensure the above address will not be
    used.

    Cc: stable@vger.kernel.org
    Signed-off-by: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/megaraid/megaraid_sas_base.c | 20 ++++++++++----------
    1 file changed, 10 insertions(+), 10 deletions(-)

    diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
    index 749f10146f630..bc37666f998e6 100644
    --- a/drivers/scsi/megaraid/megaraid_sas_base.c
    +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
    @@ -6056,13 +6056,13 @@ static int megasas_io_attach(struct megasas_instance *instance)
    * @instance: Adapter soft state
    * Description:
    *
    - * For Ventura, driver/FW will operate in 64bit DMA addresses.
    + * For Ventura, driver/FW will operate in 63bit DMA addresses.
    *
    * For invader-
    * By default, driver/FW will operate in 32bit DMA addresses
    * for consistent DMA mapping but if 32 bit consistent
    - * DMA mask fails, driver will try with 64 bit consistent
    - * mask provided FW is true 64bit DMA capable
    + * DMA mask fails, driver will try with 63 bit consistent
    + * mask provided FW is true 63bit DMA capable
    *
    * For older controllers(Thunderbolt and MFI based adapters)-
    * driver/FW will operate in 32 bit consistent DMA addresses.
    @@ -6075,15 +6075,15 @@ megasas_set_dma_mask(struct megasas_instance *instance)
    u32 scratch_pad_2;

    pdev = instance->pdev;
    - consistent_mask = (instance->adapter_type == VENTURA_SERIES) ?
    - DMA_BIT_MASK(64) : DMA_BIT_MASK(32);
    + consistent_mask = (instance->adapter_type >= VENTURA_SERIES) ?
    + DMA_BIT_MASK(63) : DMA_BIT_MASK(32);

    if (IS_DMA64) {
    - if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) &&
    + if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(63)) &&
    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
    goto fail_set_dma_mask;

    - if ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) &&
    + if ((*pdev->dev.dma_mask == DMA_BIT_MASK(63)) &&
    (dma_set_coherent_mask(&pdev->dev, consistent_mask) &&
    dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))) {
    /*
    @@ -6096,7 +6096,7 @@ megasas_set_dma_mask(struct megasas_instance *instance)
    if (!(scratch_pad_2 & MR_CAN_HANDLE_64_BIT_DMA_OFFSET))
    goto fail_set_dma_mask;
    else if (dma_set_mask_and_coherent(&pdev->dev,
    - DMA_BIT_MASK(64)))
    + DMA_BIT_MASK(63)))
    goto fail_set_dma_mask;
    }
    } else if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)))
    @@ -6108,8 +6108,8 @@ megasas_set_dma_mask(struct megasas_instance *instance)
    instance->consistent_mask_64bit = true;

    dev_info(&pdev->dev, "%s bit DMA mask and %s bit consistent mask\n",
    - ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "64" : "32"),
    - (instance->consistent_mask_64bit ? "64" : "32"));
    + ((*pdev->dev.dma_mask == DMA_BIT_MASK(64)) ? "63" : "32"),
    + (instance->consistent_mask_64bit ? "63" : "32"));

    return 0;

    --
    2.20.1
    \
     
     \ /
      Last update: 2019-09-03 18:38    [W:4.053 / U:0.684 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site