Commit fcc481f7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull dmaengine fixes from Vinod Koul:

 - Mediatek flag reuse error fix

 - Array overbound fix for nbpfaxi

 - Frame size warning in driver probe

* tag 'dmaengine-fix-6.16' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine:
  dma: dw-edma: Fix build warning in dw_edma_pcie_probe()
  dmaengine: nbpfaxi: Fix memory corruption in probe()
  dmaengine: mediatek: Fix a flag reuse error in mtk_cqdma_tx_status()
parents 5b35eb84 3df63fa8
Loading
Loading
Loading
Loading
+32 −28
Original line number Diff line number Diff line
@@ -161,12 +161,16 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
			      const struct pci_device_id *pid)
{
	struct dw_edma_pcie_data *pdata = (void *)pid->driver_data;
	struct dw_edma_pcie_data vsec_data;
	struct dw_edma_pcie_data *vsec_data __free(kfree) = NULL;
	struct device *dev = &pdev->dev;
	struct dw_edma_chip *chip;
	int err, nr_irqs;
	int i, mask;

	vsec_data = kmalloc(sizeof(*vsec_data), GFP_KERNEL);
	if (!vsec_data)
		return -ENOMEM;

	/* Enable PCI device */
	err = pcim_enable_device(pdev);
	if (err) {
@@ -174,23 +178,23 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
		return err;
	}

	memcpy(&vsec_data, pdata, sizeof(struct dw_edma_pcie_data));
	memcpy(vsec_data, pdata, sizeof(struct dw_edma_pcie_data));

	/*
	 * Tries to find if exists a PCIe Vendor-Specific Extended Capability
	 * for the DMA, if one exists, then reconfigures it.
	 */
	dw_edma_pcie_get_vsec_dma_data(pdev, &vsec_data);
	dw_edma_pcie_get_vsec_dma_data(pdev, vsec_data);

	/* Mapping PCI BAR regions */
	mask = BIT(vsec_data.rg.bar);
	for (i = 0; i < vsec_data.wr_ch_cnt; i++) {
		mask |= BIT(vsec_data.ll_wr[i].bar);
		mask |= BIT(vsec_data.dt_wr[i].bar);
	mask = BIT(vsec_data->rg.bar);
	for (i = 0; i < vsec_data->wr_ch_cnt; i++) {
		mask |= BIT(vsec_data->ll_wr[i].bar);
		mask |= BIT(vsec_data->dt_wr[i].bar);
	}
	for (i = 0; i < vsec_data.rd_ch_cnt; i++) {
		mask |= BIT(vsec_data.ll_rd[i].bar);
		mask |= BIT(vsec_data.dt_rd[i].bar);
	for (i = 0; i < vsec_data->rd_ch_cnt; i++) {
		mask |= BIT(vsec_data->ll_rd[i].bar);
		mask |= BIT(vsec_data->dt_rd[i].bar);
	}
	err = pcim_iomap_regions(pdev, mask, pci_name(pdev));
	if (err) {
@@ -213,7 +217,7 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
		return -ENOMEM;

	/* IRQs allocation */
	nr_irqs = pci_alloc_irq_vectors(pdev, 1, vsec_data.irqs,
	nr_irqs = pci_alloc_irq_vectors(pdev, 1, vsec_data->irqs,
					PCI_IRQ_MSI | PCI_IRQ_MSIX);
	if (nr_irqs < 1) {
		pci_err(pdev, "fail to alloc IRQ vector (number of IRQs=%u)\n",
@@ -224,22 +228,22 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
	/* Data structure initialization */
	chip->dev = dev;

	chip->mf = vsec_data.mf;
	chip->mf = vsec_data->mf;
	chip->nr_irqs = nr_irqs;
	chip->ops = &dw_edma_pcie_plat_ops;

	chip->ll_wr_cnt = vsec_data.wr_ch_cnt;
	chip->ll_rd_cnt = vsec_data.rd_ch_cnt;
	chip->ll_wr_cnt = vsec_data->wr_ch_cnt;
	chip->ll_rd_cnt = vsec_data->rd_ch_cnt;

	chip->reg_base = pcim_iomap_table(pdev)[vsec_data.rg.bar];
	chip->reg_base = pcim_iomap_table(pdev)[vsec_data->rg.bar];
	if (!chip->reg_base)
		return -ENOMEM;

	for (i = 0; i < chip->ll_wr_cnt; i++) {
		struct dw_edma_region *ll_region = &chip->ll_region_wr[i];
		struct dw_edma_region *dt_region = &chip->dt_region_wr[i];
		struct dw_edma_block *ll_block = &vsec_data.ll_wr[i];
		struct dw_edma_block *dt_block = &vsec_data.dt_wr[i];
		struct dw_edma_block *ll_block = &vsec_data->ll_wr[i];
		struct dw_edma_block *dt_block = &vsec_data->dt_wr[i];

		ll_region->vaddr.io = pcim_iomap_table(pdev)[ll_block->bar];
		if (!ll_region->vaddr.io)
@@ -263,8 +267,8 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
	for (i = 0; i < chip->ll_rd_cnt; i++) {
		struct dw_edma_region *ll_region = &chip->ll_region_rd[i];
		struct dw_edma_region *dt_region = &chip->dt_region_rd[i];
		struct dw_edma_block *ll_block = &vsec_data.ll_rd[i];
		struct dw_edma_block *dt_block = &vsec_data.dt_rd[i];
		struct dw_edma_block *ll_block = &vsec_data->ll_rd[i];
		struct dw_edma_block *dt_block = &vsec_data->dt_rd[i];

		ll_region->vaddr.io = pcim_iomap_table(pdev)[ll_block->bar];
		if (!ll_region->vaddr.io)
@@ -298,31 +302,31 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
		pci_dbg(pdev, "Version:\tUnknown (0x%x)\n", chip->mf);

	pci_dbg(pdev, "Registers:\tBAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p)\n",
		vsec_data.rg.bar, vsec_data.rg.off, vsec_data.rg.sz,
		vsec_data->rg.bar, vsec_data->rg.off, vsec_data->rg.sz,
		chip->reg_base);


	for (i = 0; i < chip->ll_wr_cnt; i++) {
		pci_dbg(pdev, "L. List:\tWRITE CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
			i, vsec_data.ll_wr[i].bar,
			vsec_data.ll_wr[i].off, chip->ll_region_wr[i].sz,
			i, vsec_data->ll_wr[i].bar,
			vsec_data->ll_wr[i].off, chip->ll_region_wr[i].sz,
			chip->ll_region_wr[i].vaddr.io, &chip->ll_region_wr[i].paddr);

		pci_dbg(pdev, "Data:\tWRITE CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
			i, vsec_data.dt_wr[i].bar,
			vsec_data.dt_wr[i].off, chip->dt_region_wr[i].sz,
			i, vsec_data->dt_wr[i].bar,
			vsec_data->dt_wr[i].off, chip->dt_region_wr[i].sz,
			chip->dt_region_wr[i].vaddr.io, &chip->dt_region_wr[i].paddr);
	}

	for (i = 0; i < chip->ll_rd_cnt; i++) {
		pci_dbg(pdev, "L. List:\tREAD CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
			i, vsec_data.ll_rd[i].bar,
			vsec_data.ll_rd[i].off, chip->ll_region_rd[i].sz,
			i, vsec_data->ll_rd[i].bar,
			vsec_data->ll_rd[i].off, chip->ll_region_rd[i].sz,
			chip->ll_region_rd[i].vaddr.io, &chip->ll_region_rd[i].paddr);

		pci_dbg(pdev, "Data:\tREAD CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
			i, vsec_data.dt_rd[i].bar,
			vsec_data.dt_rd[i].off, chip->dt_region_rd[i].sz,
			i, vsec_data->dt_rd[i].bar,
			vsec_data->dt_rd[i].off, chip->dt_region_rd[i].sz,
			chip->dt_region_rd[i].vaddr.io, &chip->dt_region_rd[i].paddr);
	}

+2 −2
Original line number Diff line number Diff line
@@ -449,9 +449,9 @@ static enum dma_status mtk_cqdma_tx_status(struct dma_chan *c,
		return ret;

	spin_lock_irqsave(&cvc->pc->lock, flags);
	spin_lock_irqsave(&cvc->vc.lock, flags);
	spin_lock(&cvc->vc.lock);
	vd = mtk_cqdma_find_active_desc(c, cookie);
	spin_unlock_irqrestore(&cvc->vc.lock, flags);
	spin_unlock(&cvc->vc.lock);
	spin_unlock_irqrestore(&cvc->pc->lock, flags);

	if (vd) {
+5 −6
Original line number Diff line number Diff line
@@ -1351,7 +1351,7 @@ static int nbpf_probe(struct platform_device *pdev)
	if (irqs == 1) {
		eirq = irqbuf[0];

		for (i = 0; i <= num_channels; i++)
		for (i = 0; i < num_channels; i++)
			nbpf->chan[i].irq = irqbuf[0];
	} else {
		eirq = platform_get_irq_byname(pdev, "error");
@@ -1361,16 +1361,15 @@ static int nbpf_probe(struct platform_device *pdev)
		if (irqs == num_channels + 1) {
			struct nbpf_channel *chan;

			for (i = 0, chan = nbpf->chan; i <= num_channels;
			for (i = 0, chan = nbpf->chan; i < num_channels;
			     i++, chan++) {
				/* Skip the error IRQ */
				if (irqbuf[i] == eirq)
					i++;
				if (i >= ARRAY_SIZE(irqbuf))
					return -EINVAL;
				chan->irq = irqbuf[i];
			}

			if (chan != nbpf->chan + num_channels)
				return -EINVAL;
		} else {
			/* 2 IRQs and more than one channel */
			if (irqbuf[0] == eirq)
@@ -1378,7 +1377,7 @@ static int nbpf_probe(struct platform_device *pdev)
			else
				irq = irqbuf[0];

			for (i = 0; i <= num_channels; i++)
			for (i = 0; i < num_channels; i++)
				nbpf->chan[i].irq = irq;
		}
	}