dmaengine: ioat: fixing the wrong dma_dev->chancnt
authorYajun Deng <yajun.deng@linux.dev>
Tue, 15 Aug 2023 06:11:51 +0000 (14:11 +0800)
committerVinod Koul <vkoul@kernel.org>
Mon, 21 Aug 2023 13:08:19 +0000 (18:38 +0530)
The chancnt would be updated in __dma_async_device_channel_register(),
but it was assigned in ioat_enumerate_channels(). Therefore chancnt has
the wrong value.

Add chancnt member to the struct ioatdma_device, ioat_dma->chancnt
is used in ioat, dma_dev->chancnt is used in dmaengine.

Signed-off-by: Yajun Deng <yajun.deng@linux.dev>
Reviewed-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/20230815061151.2724474-1-yajun.deng@linux.dev
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/ioat/dma.h
drivers/dma/ioat/init.c

index 35e06b3..a180171 100644 (file)
@@ -74,6 +74,7 @@ struct ioatdma_device {
        struct dca_provider *dca;
        enum ioat_irq_mode irq_mode;
        u32 cap;
+       int chancnt;
 
        /* shadow version for CB3.3 chan reset errata workaround */
        u64 msixtba0;
index c4602bf..9c364e9 100644 (file)
@@ -420,7 +420,7 @@ int ioat_dma_setup_interrupts(struct ioatdma_device *ioat_dma)
 
 msix:
        /* The number of MSI-X vectors should equal the number of channels */
-       msixcnt = ioat_dma->dma_dev.chancnt;
+       msixcnt = ioat_dma->chancnt;
        for (i = 0; i < msixcnt; i++)
                ioat_dma->msix_entries[i].entry = i;
 
@@ -511,7 +511,7 @@ static int ioat_probe(struct ioatdma_device *ioat_dma)
        dma_cap_set(DMA_MEMCPY, dma->cap_mask);
        dma->dev = &pdev->dev;
 
-       if (!dma->chancnt) {
+       if (!ioat_dma->chancnt) {
                dev_err(dev, "channel enumeration error\n");
                goto err_setup_interrupts;
        }
@@ -567,15 +567,16 @@ static void ioat_enumerate_channels(struct ioatdma_device *ioat_dma)
        struct device *dev = &ioat_dma->pdev->dev;
        struct dma_device *dma = &ioat_dma->dma_dev;
        u8 xfercap_log;
+       int chancnt;
        int i;
 
        INIT_LIST_HEAD(&dma->channels);
-       dma->chancnt = readb(ioat_dma->reg_base + IOAT_CHANCNT_OFFSET);
-       dma->chancnt &= 0x1f; /* bits [4:0] valid */
-       if (dma->chancnt > ARRAY_SIZE(ioat_dma->idx)) {
+       chancnt = readb(ioat_dma->reg_base + IOAT_CHANCNT_OFFSET);
+       chancnt &= 0x1f; /* bits [4:0] valid */
+       if (chancnt > ARRAY_SIZE(ioat_dma->idx)) {
                dev_warn(dev, "(%d) exceeds max supported channels (%zu)\n",
-                        dma->chancnt, ARRAY_SIZE(ioat_dma->idx));
-               dma->chancnt = ARRAY_SIZE(ioat_dma->idx);
+                        chancnt, ARRAY_SIZE(ioat_dma->idx));
+               chancnt = ARRAY_SIZE(ioat_dma->idx);
        }
        xfercap_log = readb(ioat_dma->reg_base + IOAT_XFERCAP_OFFSET);
        xfercap_log &= 0x1f; /* bits [4:0] valid */
@@ -583,7 +584,7 @@ static void ioat_enumerate_channels(struct ioatdma_device *ioat_dma)
                return;
        dev_dbg(dev, "%s: xfercap = %d\n", __func__, 1 << xfercap_log);
 
-       for (i = 0; i < dma->chancnt; i++) {
+       for (i = 0; i < chancnt; i++) {
                ioat_chan = kzalloc(sizeof(*ioat_chan), GFP_KERNEL);
                if (!ioat_chan)
                        break;
@@ -596,7 +597,7 @@ static void ioat_enumerate_channels(struct ioatdma_device *ioat_dma)
                        break;
                }
        }
-       dma->chancnt = i;
+       ioat_dma->chancnt = i;
 }
 
 /**