Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 1 Nov 2017 00:46:48 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r325255 - in head: share/man/man4/man4.powerpc sys/dev/dpaa
Message-ID:  <201711010046.vA10kmGS005870@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Wed Nov  1 00:46:48 2017
New Revision: 325255
URL: https://svnweb.freebsd.org/changeset/base/325255

Log:
  Remove a singleton in the DPAA driver, to allow multiple fman instances
  
  Some devices (P5040, P4080) have multiple frame managers in their DPAA
  subsystems.  This was prevented by use of a softc singleton in the DPAA
  driver.  Since if_dtsec(4) has moved to be a child of fman, it can access
  the fman device data via the parent object.

Modified:
  head/share/man/man4/man4.powerpc/dtsec.4
  head/sys/dev/dpaa/fman.c
  head/sys/dev/dpaa/fman.h
  head/sys/dev/dpaa/fman_mdio.c
  head/sys/dev/dpaa/if_dtsec.c

Modified: head/share/man/man4/man4.powerpc/dtsec.4
==============================================================================
--- head/share/man/man4/man4.powerpc/dtsec.4	Wed Nov  1 00:33:54 2017	(r325254)
+++ head/share/man/man4/man4.powerpc/dtsec.4	Wed Nov  1 00:46:48 2017	(r325255)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 16, 2017
+.Dd October 31, 2017
 .Dt DTSEC 4
 .Os
 .Sh NAME
@@ -89,6 +89,14 @@ P2041, P3041
 .It
 P5010, P5020
 .El
+.Pp
+Additionally, the following devices are expected to work, but are untested:
+.Bl -bullet -compact
+.It
+P4080, P4040
+.It
+P5040
+.El
 .Sh SEE ALSO
 .Xr altq 4 ,
 .Xr arp 4 ,
@@ -96,13 +104,6 @@ P5010, P5020
 .Xr netintro 4 ,
 .Xr ng_ether 4 ,
 .Xr ifconfig 8
-.Sh BUGS
-The
-.Nm
-driver assumes that there is only one Frame Manager, and that dtsec0 controls
-the MDIO interface.  Though this is the case for the supported devices, other
-SoCs with the DPAA controller may not work correctly.  Particularly, the P5040
-and P4080 SoCs have two frame managers, which breaks this assumption.
 .Sh HISTORY
 The
 .Nm

Modified: head/sys/dev/dpaa/fman.c
==============================================================================
--- head/sys/dev/dpaa/fman.c	Wed Nov  1 00:33:54 2017	(r325254)
+++ head/sys/dev/dpaa/fman.c	Wed Nov  1 00:46:48 2017	(r325255)
@@ -87,7 +87,6 @@ struct fman_config {
  */
 const uint32_t fman_firmware[] = FMAN_UC_IMG;
 const uint32_t fman_firmware_size = sizeof(fman_firmware);
-static struct fman_softc *fm_sc = NULL;
 
 int
 fman_activate_resource(device_t bus, device_t child, int type, int rid,
@@ -386,54 +385,36 @@ fman_error_callback(t_Handle app_handle, e_FmPortType 
  */
 
 int
-fman_get_handle(t_Handle *fmh)
+fman_get_handle(device_t dev, t_Handle *fmh)
 {
+	struct fman_softc *sc = device_get_softc(dev);
 
-	if (fm_sc == NULL)
-		return (ENOMEM);
+	*fmh = sc->fm_handle;
 
-	*fmh = fm_sc->fm_handle;
-
 	return (0);
 }
 
 int
-fman_get_muram_handle(t_Handle *muramh)
+fman_get_muram_handle(device_t dev, t_Handle *muramh)
 {
+	struct fman_softc *sc = device_get_softc(dev);
 
-	if (fm_sc == NULL)
-		return (ENOMEM);
+	*muramh = sc->muram_handle;
 
-	*muramh = fm_sc->muram_handle;
-
 	return (0);
 }
 
 int
-fman_get_bushandle(vm_offset_t *fm_base)
+fman_get_bushandle(device_t dev, vm_offset_t *fm_base)
 {
+	struct fman_softc *sc = device_get_softc(dev);
 
-	if (fm_sc == NULL)
-		return (ENOMEM);
+	*fm_base = rman_get_bushandle(sc->mem_res);
 
-	*fm_base = rman_get_bushandle(fm_sc->mem_res);
-
 	return (0);
 }
 
 int
-fman_get_dev(device_t *fm_dev)
-{
-
-	if (fm_sc == NULL)
-		return (ENOMEM);
-
-	*fm_dev = fm_sc->sc_base.dev;
-
-	return (0);
-}
-
-int
 fman_attach(device_t dev)
 {
 	struct fman_softc *sc;
@@ -443,7 +424,6 @@ fman_attach(device_t dev)
 
 	sc = device_get_softc(dev);
 	sc->sc_base.dev = dev;
-	fm_sc = sc;
 
 	/* Check if MallocSmart allocator is ready */
 	if (XX_MallocSmartInit() != E_OK) {

Modified: head/sys/dev/dpaa/fman.h
==============================================================================
--- head/sys/dev/dpaa/fman.h	Wed Nov  1 00:33:54 2017	(r325254)
+++ head/sys/dev/dpaa/fman.h	Wed Nov  1 00:46:48 2017	(r325255)
@@ -72,9 +72,8 @@ int	fman_qman_channel_id(device_t, int);
 /** @} */
 
 uint32_t	fman_get_clock(struct fman_softc *sc);
-int	fman_get_handle(t_Handle *fmh);
-int	fman_get_muram_handle(t_Handle *muramh);
-int	fman_get_bushandle(vm_offset_t *fm_base);
-int	fman_get_dev(device_t *fmd);
+int	fman_get_handle(device_t dev, t_Handle *fmh);
+int	fman_get_muram_handle(device_t dev, t_Handle *muramh);
+int	fman_get_bushandle(device_t dev, vm_offset_t *fm_base);
 
 #endif /* FMAN_H_ */

Modified: head/sys/dev/dpaa/fman_mdio.c
==============================================================================
--- head/sys/dev/dpaa/fman_mdio.c	Wed Nov  1 00:33:54 2017	(r325254)
+++ head/sys/dev/dpaa/fman_mdio.c	Wed Nov  1 00:46:48 2017	(r325255)
@@ -130,7 +130,7 @@ pqmdio_fdt_attach(device_t dev)
 
 	sc = device_get_softc(dev);
 
-	fman_get_bushandle(&sc->sc_handle);
+	fman_get_bushandle(device_get_parent(dev), &sc->sc_handle);
 	bus_get_resource(dev, SYS_RES_MEMORY, 0, &start, &count);
 	sc->sc_offset = start;
 

Modified: head/sys/dev/dpaa/if_dtsec.c
==============================================================================
--- head/sys/dev/dpaa/if_dtsec.c	Wed Nov  1 00:33:54 2017	(r325254)
+++ head/sys/dev/dpaa/if_dtsec.c	Wed Nov  1 00:46:48 2017	(r325255)
@@ -569,11 +569,13 @@ int
 dtsec_attach(device_t dev)
 {
 	struct dtsec_softc *sc;
+	device_t parent;
 	int error;
 	struct ifnet *ifp;
 
 	sc = device_get_softc(dev);
 
+	parent = device_get_parent(dev);
 	sc->sc_dev = dev;
 	sc->sc_mac_mdio_irq = NO_IRQ;
 	sc->sc_eth_id = device_get_unit(dev);
@@ -594,13 +596,13 @@ dtsec_attach(device_t dev)
 	callout_init(&sc->sc_tick_callout, CALLOUT_MPSAFE);
 
 	/* Read configuraton */
-	if ((error = fman_get_handle(&sc->sc_fmh)) != 0)
+	if ((error = fman_get_handle(parent, &sc->sc_fmh)) != 0)
 		return (error);
 
-	if ((error = fman_get_muram_handle(&sc->sc_muramh)) != 0)
+	if ((error = fman_get_muram_handle(parent, &sc->sc_muramh)) != 0)
 		return (error);
 
-	if ((error = fman_get_bushandle(&sc->sc_fm_base)) != 0)
+	if ((error = fman_get_bushandle(parent, &sc->sc_fm_base)) != 0)
 		return (error);
 
 	/* Configure working mode */



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