Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

NVMe: Use dma_set_mask() correctly

In some circumstances setting a 64-bit DMA mask can fail, as explained
in Documentation/DMA-API-HOWTO.txt. Use the recommended code sequence
to set a 32-bit DMA mask if setting a 64-bit DMA mask fails.

Reported-by: Chayan Biswas <Chayan.Biswas@sandisk.com>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>

+8 -2
+8 -2
drivers/block/nvme-core.c
··· 1927 1927 INIT_LIST_HEAD(&dev->namespaces); 1928 1928 dev->pci_dev = pdev; 1929 1929 pci_set_drvdata(pdev, dev); 1930 - dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); 1931 - dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); 1930 + 1931 + if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64))) 1932 + dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64)); 1933 + else if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) 1934 + dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); 1935 + else 1936 + goto disable; 1937 + 1932 1938 result = nvme_set_instance(dev); 1933 1939 if (result) 1934 1940 goto disable;