Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Jan 2018 22:22:03 +0000 (UTC)
From:      "Landon J. Fuller" <landonf@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r328180 - head/sys/dev/bhnd/bhndb
Message-ID:  <201801192222.w0JMM3gk042431@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: landonf
Date: Fri Jan 19 22:22:02 2018
New Revision: 328180
URL: https://svnweb.freebsd.org/changeset/base/328180

Log:
  bhndb_pci(4): Implement bridge support for CardBus-attached devices.
  
   - Extend the probe method to accept devclasses that inherit from the pci
     devclass (e.g. cardbus).
   - Some BCM4306-based CardBus adapters appear to advertise 4K SPROM, but
     only the first 2K is mapped into BAR0. We can safely assume that the
     SPROM data fits within the first 2K of the SPROM, rather than rejecting
     the SPROM mapping as invalid.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  head/sys/dev/bhnd/bhndb/bhndb_pci.c

Modified: head/sys/dev/bhnd/bhndb/bhndb_pci.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb_pci.c	Fri Jan 19 22:19:50 2018	(r328179)
+++ head/sys/dev/bhnd/bhndb/bhndb_pci.c	Fri Jan 19 22:22:02 2018	(r328180)
@@ -264,8 +264,8 @@ bhndb_pci_probe(device_t dev)
 	struct bhndb_pci_probe	*probe;
 	struct bhndb_pci_core	*entry;
 	bhnd_devclass_t		 hostb_devclass;
-	device_t		 parent;
-	devclass_t		 parent_bus, pci;
+	device_t		 parent, parent_bus;
+	devclass_t		 pci, bus_devclass;
 	int			 error;
 
 	probe = NULL;
@@ -273,9 +273,20 @@ bhndb_pci_probe(device_t dev)
 	/* Our parent must be a PCI/PCIe device. */
 	pci = devclass_find("pci");
 	parent = device_get_parent(dev);
-	parent_bus = device_get_devclass(device_get_parent(parent));
+	parent_bus = device_get_parent(parent);
+	if (parent_bus == NULL)
+		return (ENXIO);
 
-	if (parent_bus != pci)
+	/* The bus device class may inherit from 'pci' */
+	for (bus_devclass = device_get_devclass(parent_bus);
+	    bus_devclass != NULL;
+	    bus_devclass = devclass_get_parent(bus_devclass))
+	{
+		if (bus_devclass == pci)
+			break;
+	}
+
+	if (bus_devclass != pci)
 		return (ENXIO);
 
 	/* Enable clocks */
@@ -629,12 +640,10 @@ bhndb_pci_sprom_size(struct bhndb_pci_softc *sc)
 		return (0);
 	}
 
-	if (sprom_sz > sprom_win->win_size) {
-		device_printf(sc->dev,
-		    "PCI sprom size (0x%x) overruns defined register window\n",
-		    sctl);
-		return (0);
-	}
+	/* If the device has a larger SPROM than can be addressed via our SPROM
+	 * register window, the SPROM image data will still be located within
+	 * the window's addressable range */
+	sprom_sz = MIN(sprom_sz, sprom_win->win_size);
 
 	return (sprom_sz);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801192222.w0JMM3gk042431>