svn commit: r363636 - in head/sys: conf dev/smc

Andrew Turner andrew at FreeBSD.org
Tue Jul 28 09:29:58 UTC 2020


Author: andrew
Date: Tue Jul 28 09:29:56 2020
New Revision: 363636
URL: https://svnweb.freebsd.org/changeset/base/363636

Log:
  Add an ACPI attachment for if_smc
  
  This is needed by some of the Arm simulators as they implement a smc based
  network interface, but use ACPI rather than FDT.
  
  Sponsored by:	Innovate UK

Added:
  head/sys/dev/smc/if_smc_acpi.c
     - copied, changed from r363635, head/sys/dev/smc/if_smc_fdt.c
Modified:
  head/sys/conf/files
  head/sys/dev/smc/if_smc.c
  head/sys/dev/smc/if_smc_fdt.c
  head/sys/dev/smc/if_smcvar.h

Modified: head/sys/conf/files
==============================================================================
--- head/sys/conf/files	Tue Jul 28 07:07:38 2020	(r363635)
+++ head/sys/conf/files	Tue Jul 28 09:29:56 2020	(r363636)
@@ -3029,6 +3029,7 @@ dev/smbus/smbconf.c		optional smbus
 dev/smbus/smbus.c		optional smbus
 dev/smbus/smbus_if.m		optional smbus
 dev/smc/if_smc.c		optional smc
+dev/smc/if_smc_acpi.c		optional smc acpi
 dev/smc/if_smc_fdt.c		optional smc fdt
 dev/snp/snp.c			optional snp
 dev/sound/clone.c		optional sound

Modified: head/sys/dev/smc/if_smc.c
==============================================================================
--- head/sys/dev/smc/if_smc.c	Tue Jul 28 07:07:38 2020	(r363635)
+++ head/sys/dev/smc/if_smc.c	Tue Jul 28 09:29:56 2020	(r363636)
@@ -80,6 +80,8 @@ __FBSDID("$FreeBSD$");
 #include <dev/mii/mii_bitbang.h>
 #include <dev/mii/miivar.h>
 
+#include "miibus_if.h"
+
 #define	SMC_LOCK(sc)		mtx_lock(&(sc)->smc_mtx)
 #define	SMC_UNLOCK(sc)		mtx_unlock(&(sc)->smc_mtx)
 #define	SMC_ASSERT_LOCKED(sc)	mtx_assert(&(sc)->smc_mtx, MA_OWNED)
@@ -479,6 +481,27 @@ smc_detach(device_t dev)
 
 	return (0);
 }
+
+static device_method_t smc_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_attach,	smc_attach),
+	DEVMETHOD(device_detach,	smc_detach),
+
+	/* MII interface */
+	DEVMETHOD(miibus_readreg,	smc_miibus_readreg),
+	DEVMETHOD(miibus_writereg,	smc_miibus_writereg),
+	DEVMETHOD(miibus_statchg,	smc_miibus_statchg),
+
+	{ 0, 0 }
+};
+
+driver_t smc_driver = {
+	"smc",
+	smc_methods,
+	sizeof(struct smc_softc),
+};
+
+DRIVER_MODULE(miibus, smc, miibus_driver, miibus_devclass, 0, 0);
 
 static void
 smc_start(struct ifnet *ifp)

Copied and modified: head/sys/dev/smc/if_smc_acpi.c (from r363635, head/sys/dev/smc/if_smc_fdt.c)
==============================================================================
--- head/sys/dev/smc/if_smc_fdt.c	Tue Jul 28 07:07:38 2020	(r363635, copy source)
+++ head/sys/dev/smc/if_smc_acpi.c	Tue Jul 28 09:29:56 2020	(r363636)
@@ -1,6 +1,7 @@
 /*-
  * Copyright (c) 2008 Benno Rice
  * All rights reserved.
+ * Copyright (c) 2020 Andrew Turner
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -35,92 +36,45 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/taskqueue.h>
 
-#include <machine/bus.h>
-#include <machine/resource.h>
-
-#include <net/ethernet.h>
 #include <net/if.h>
-#include <net/if_arp.h>
-#include <net/if_media.h>
 
 #include <dev/smc/if_smcvar.h>
 
-#include <dev/mii/mii.h>
-#include <dev/mii/miivar.h>
+#include <contrib/dev/acpica/include/acpi.h>
+#include <dev/acpica/acpivar.h>
 
-#include <dev/fdt/fdt_common.h>
-#include <dev/ofw/openfirm.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
+static int		smc_acpi_probe(device_t);
 
-#include "miibus_if.h"
-
-static int		smc_fdt_probe(device_t);
-static int		smc_fdt_attach(device_t);
-static int		smc_fdt_detach(device_t);
-
 static int
-smc_fdt_probe(device_t dev)
+smc_acpi_probe(device_t dev)
 {
 	struct	smc_softc *sc;
+	ACPI_HANDLE h;
 
-	if (!ofw_bus_status_okay(dev))
+	if ((h = acpi_get_handle(dev)) == NULL)
 		return (ENXIO);
 
-	if (ofw_bus_is_compatible(dev, "smsc,lan91c111")) {
-		sc = device_get_softc(dev);
-		sc->smc_usemem = 1;
+	if (!acpi_MatchHid(h, "LNRO0003"))
+		return (ENXIO);
 
-		if (smc_probe(dev) != 0) {
-			return (ENXIO);
-		}
+	sc = device_get_softc(dev);
+	sc->smc_usemem = 1;
 
-		return (0);
-	}
-
-	return (ENXIO);
+	return (smc_probe(dev));
 }
 
-static int
-smc_fdt_attach(device_t dev)
-{
-
-	return smc_attach(dev);
-}
-
-static int
-smc_fdt_detach(device_t dev)
-{
-
-	smc_detach(dev);
-
-	return (0);
-}
-
-static device_method_t smc_fdt_methods[] = {
+static device_method_t smc_acpi_methods[] = {
 	/* Device interface */
-	DEVMETHOD(device_probe,		smc_fdt_probe),
-	DEVMETHOD(device_attach,	smc_fdt_attach),
-	DEVMETHOD(device_detach,	smc_fdt_detach),
-
-	/* MII interface */
-	DEVMETHOD(miibus_readreg,	smc_miibus_readreg),
-	DEVMETHOD(miibus_writereg,	smc_miibus_writereg),
-	DEVMETHOD(miibus_statchg,	smc_miibus_statchg),
-
+	DEVMETHOD(device_probe,		smc_acpi_probe),
 	{ 0, 0 }
 };
 
-static driver_t smc_fdt_driver = {
-	"smc",
-	smc_fdt_methods,
-	sizeof(struct smc_softc),
-};
+DEFINE_CLASS_1(smc, smc_acpi_driver, smc_acpi_methods,
+    sizeof(struct smc_softc), smc_driver);
 
 extern devclass_t smc_devclass;
 
-DRIVER_MODULE(smc, simplebus, smc_fdt_driver, smc_devclass, 0, 0);
-DRIVER_MODULE(miibus, smc, miibus_driver, miibus_devclass, 0, 0);
-MODULE_DEPEND(smc, fdt, 1, 1, 1);
+DRIVER_MODULE(smc, acpi, smc_acpi_driver, smc_devclass, 0, 0);
+MODULE_DEPEND(smc, acpi, 1, 1, 1);
 MODULE_DEPEND(smc, ether, 1, 1, 1);
 MODULE_DEPEND(smc, miibus, 1, 1, 1);

Modified: head/sys/dev/smc/if_smc_fdt.c
==============================================================================
--- head/sys/dev/smc/if_smc_fdt.c	Tue Jul 28 07:07:38 2020	(r363635)
+++ head/sys/dev/smc/if_smc_fdt.c	Tue Jul 28 09:29:56 2020	(r363636)
@@ -35,29 +35,16 @@ __FBSDID("$FreeBSD$");
 #include <sys/systm.h>
 #include <sys/taskqueue.h>
 
-#include <machine/bus.h>
-#include <machine/resource.h>
-
-#include <net/ethernet.h>
 #include <net/if.h>
-#include <net/if_arp.h>
-#include <net/if_media.h>
 
 #include <dev/smc/if_smcvar.h>
 
-#include <dev/mii/mii.h>
-#include <dev/mii/miivar.h>
-
 #include <dev/fdt/fdt_common.h>
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/ofw_bus_subr.h>
 
-#include "miibus_if.h"
-
 static int		smc_fdt_probe(device_t);
-static int		smc_fdt_attach(device_t);
-static int		smc_fdt_detach(device_t);
 
 static int
 smc_fdt_probe(device_t dev)
@@ -81,46 +68,18 @@ smc_fdt_probe(device_t dev)
 	return (ENXIO);
 }
 
-static int
-smc_fdt_attach(device_t dev)
-{
-
-	return smc_attach(dev);
-}
-
-static int
-smc_fdt_detach(device_t dev)
-{
-
-	smc_detach(dev);
-
-	return (0);
-}
-
 static device_method_t smc_fdt_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		smc_fdt_probe),
-	DEVMETHOD(device_attach,	smc_fdt_attach),
-	DEVMETHOD(device_detach,	smc_fdt_detach),
-
-	/* MII interface */
-	DEVMETHOD(miibus_readreg,	smc_miibus_readreg),
-	DEVMETHOD(miibus_writereg,	smc_miibus_writereg),
-	DEVMETHOD(miibus_statchg,	smc_miibus_statchg),
-
 	{ 0, 0 }
 };
 
-static driver_t smc_fdt_driver = {
-	"smc",
-	smc_fdt_methods,
-	sizeof(struct smc_softc),
-};
+DEFINE_CLASS_1(smc, smc_fdt_driver, smc_fdt_methods,
+    sizeof(struct smc_softc), smc_driver);
 
 extern devclass_t smc_devclass;
 
 DRIVER_MODULE(smc, simplebus, smc_fdt_driver, smc_devclass, 0, 0);
-DRIVER_MODULE(miibus, smc, miibus_driver, miibus_devclass, 0, 0);
 MODULE_DEPEND(smc, fdt, 1, 1, 1);
 MODULE_DEPEND(smc, ether, 1, 1, 1);
 MODULE_DEPEND(smc, miibus, 1, 1, 1);

Modified: head/sys/dev/smc/if_smcvar.h
==============================================================================
--- head/sys/dev/smc/if_smcvar.h	Tue Jul 28 07:07:38 2020	(r363635)
+++ head/sys/dev/smc/if_smcvar.h	Tue Jul 28 09:29:56 2020	(r363636)
@@ -68,6 +68,8 @@ struct smc_softc {
 	void			*smc_read_arg;
 };
 
+DECLARE_CLASS(smc_driver);
+
 int	smc_probe(device_t);
 int	smc_attach(device_t);
 int	smc_detach(device_t);


More information about the svn-src-all mailing list