svn commit: r299000 - head/sys/dev/pci

John Baldwin jhb at FreeBSD.org
Tue May 3 19:37:26 UTC 2016


Author: jhb
Date: Tue May  3 19:37:25 2016
New Revision: 299000
URL: https://svnweb.freebsd.org/changeset/base/299000

Log:
  Use the correct location of the SRIOV capability when enabling ARI.
  
  While here, check if ARI was enabled by re-reading the config register
  after writing it and return an error if the write fails.
  
  Reviewed by:	rstone, vangyzen

Modified:
  head/sys/dev/pci/pci_iov.c

Modified: head/sys/dev/pci/pci_iov.c
==============================================================================
--- head/sys/dev/pci/pci_iov.c	Tue May  3 18:54:20 2016	(r298999)
+++ head/sys/dev/pci/pci_iov.c	Tue May  3 19:37:25 2016	(r299000)
@@ -442,6 +442,7 @@ pci_iov_set_ari(device_t bus)
 			}
 		}
 	}
+	free(devlist, M_TEMP);
 
 	/*
 	 * If we called this function some device must have the SR-IOV
@@ -451,10 +452,14 @@ pci_iov_set_ari(device_t bus)
 	    ("Could not find child of %s with SR-IOV capability",
 	    device_get_nameunit(bus)));
 
-	iov_ctl = pci_read_config(lowest, iov_pos + PCIR_SRIOV_CTL, 2);
+	iov_ctl = pci_read_config(lowest, lowest_pos + PCIR_SRIOV_CTL, 2);
 	iov_ctl |= PCIM_SRIOV_ARI_EN;
-	pci_write_config(lowest, iov_pos + PCIR_SRIOV_CTL, iov_ctl, 2);
-	free(devlist, M_TEMP);
+	pci_write_config(lowest, lowest_pos + PCIR_SRIOV_CTL, iov_ctl, 2);
+	if ((pci_read_config(lowest, lowest_pos + PCIR_SRIOV_CTL, 2) &
+	    PCIM_SRIOV_ARI_EN) == 0) {
+		device_printf(lowest, "failed to enable ARI\n");
+		return (ENXIO);
+	}
 	return (0);
 }
 


More information about the svn-src-head mailing list