svn commit: r347385 - head/sys/compat/linuxkpi/common/src

Hans Petter Selasky hselasky at FreeBSD.org
Thu May 9 09:45:20 UTC 2019


Author: hselasky
Date: Thu May  9 09:45:19 2019
New Revision: 347385
URL: https://svnweb.freebsd.org/changeset/base/347385

Log:
  Fix regression issue after r346645 in the LinuxKPI.
  Make sure LinuxKPI PCI devices get a default BUSDMA tag.
  
  Found by:	Thomas Laus <lausts at acm.org>
  Sponsored by:	Mellanox Technologies

Modified:
  head/sys/compat/linuxkpi/common/src/linux_pci.c

Modified: head/sys/compat/linuxkpi/common/src/linux_pci.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_pci.c	Thu May  9 08:35:50 2019	(r347384)
+++ head/sys/compat/linuxkpi/common/src/linux_pci.c	Thu May  9 09:45:19 2019	(r347385)
@@ -89,6 +89,7 @@ static int
 linux_pdev_dma_init(struct pci_dev *pdev)
 {
 	struct linux_dma_priv *priv;
+	int error;
 
 	priv = malloc(sizeof(*priv), M_DEVBUF, M_WAITOK | M_ZERO);
 	pdev->dev.dma_priv = priv;
@@ -97,7 +98,14 @@ linux_pdev_dma_init(struct pci_dev *pdev)
 
 	pctrie_init(&priv->ptree);
 
-	return (0);
+	/* create a default DMA tag */
+	error = linux_dma_tag_init(&pdev->dev, DMA_BIT_MASK(64));
+	if (error) {
+		mtx_destroy(&priv->lock);
+		free(priv, M_DEVBUF);
+		pdev->dev.dma_priv = NULL;
+	}
+	return (error);
 }
 
 static int
@@ -241,7 +249,7 @@ linux_pci_attach(device_t dev)
 	pdev->irq = pdev->dev.irq;
 	error = linux_pdev_dma_init(pdev);
 	if (error)
-		goto out;
+		goto out_dma_init;
 
 	if (pdev->bus == NULL) {
 		pbus = malloc(sizeof(*pbus), M_DEVBUF, M_WAITOK | M_ZERO);
@@ -255,15 +263,18 @@ linux_pci_attach(device_t dev)
 	spin_unlock(&pci_lock);
 
 	error = pdrv->probe(pdev, id);
-out:
-	if (error) {
-		spin_lock(&pci_lock);
-		list_del(&pdev->links);
-		spin_unlock(&pci_lock);
-		put_device(&pdev->dev);
-		error = -error;
-	}
-	return (error);
+	if (error)
+		goto out_probe;
+	return (0);
+
+out_probe:
+	linux_pdev_dma_uninit(pdev);
+out_dma_init:
+	spin_lock(&pci_lock);
+	list_del(&pdev->links);
+	spin_unlock(&pci_lock);
+	put_device(&pdev->dev);
+	return (-error);
 }
 
 static int


More information about the svn-src-head mailing list