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.
This commit is contained in:
parent
3d509bf21a
commit
083d0f1bd4
@ -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
|
||||
|
@ -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,49 +385,31 @@ fman_error_callback(t_Handle app_handle, e_FmPortType port_type,
|
||||
*/
|
||||
|
||||
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 = fm_sc->fm_handle;
|
||||
*fmh = 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 = fm_sc->muram_handle;
|
||||
*muramh = 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(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;
|
||||
*fm_base = rman_get_bushandle(sc->mem_res);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -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) {
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user