Module Name: src Committed By: martin Date: Thu Sep 11 06:56:05 UTC 2014
Modified Files: src/sys/arch/arm/allwinner: awin_gige.c src/sys/dev/ic: dwc_gmac.c dwc_gmac_var.h Log Message: Simplify device property handling by moving it into the core driver. Overriding the MAC address now works again. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/allwinner/awin_gige.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/ic/dwc_gmac.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/dwc_gmac_var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/allwinner/awin_gige.c diff -u src/sys/arch/arm/allwinner/awin_gige.c:1.6 src/sys/arch/arm/allwinner/awin_gige.c:1.7 --- src/sys/arch/arm/allwinner/awin_gige.c:1.6 Tue Sep 9 10:03:43 2014 +++ src/sys/arch/arm/allwinner/awin_gige.c Thu Sep 11 06:56:05 2014 @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: awin_gige.c,v 1.6 2014/09/09 10:03:43 martin Exp $"); +__KERNEL_RCSID(1, "$NetBSD: awin_gige.c,v 1.7 2014/09/11 06:56:05 martin Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -92,11 +92,8 @@ awin_gige_attach(device_t parent, device struct awin_gige_softc * const sc = device_private(self); struct awinio_attach_args * const aio = aux; const struct awin_locators * const loc = &aio->aio_loc; - prop_dictionary_t dict; - uint8_t enaddr[ETHER_ADDR_LEN], *ep = NULL; sc->sc_core.sc_dev = self; - dict = device_properties(sc->sc_core.sc_dev); awin_gpio_pinset_acquire(&awin_gige_gpio_pinset); @@ -107,14 +104,6 @@ awin_gige_attach(device_t parent, device aprint_naive("\n"); aprint_normal(": Gigabit Ethernet Controller\n"); - - prop_data_t ea = dict ? prop_dictionary_get(dict, "mac-address") : NULL; - if (ea != NULL) { - KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); - KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); - memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN); - ep = enaddr; - } /* * Interrupt handler @@ -142,10 +131,9 @@ awin_gige_attach(device_t parent, device awin_reg_set_clear(aio->aio_core_bst, aio->aio_ccm_bsh, AWIN_GMAC_CLK_REG, 2, 0); - dwc_gmac_attach(&sc->sc_core, ep, 2); + dwc_gmac_attach(&sc->sc_core, 2); } - static int awin_gige_intr(void *arg) { Index: src/sys/dev/ic/dwc_gmac.c diff -u src/sys/dev/ic/dwc_gmac.c:1.4 src/sys/dev/ic/dwc_gmac.c:1.5 --- src/sys/dev/ic/dwc_gmac.c:1.4 Tue Sep 9 10:06:47 2014 +++ src/sys/dev/ic/dwc_gmac.c Thu Sep 11 06:56:05 2014 @@ -39,7 +39,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.4 2014/09/09 10:06:47 martin Exp $"); +__KERNEL_RCSID(1, "$NetBSD: dwc_gmac.c,v 1.5 2014/09/11 06:56:05 martin Exp $"); #include "opt_inet.h" @@ -92,22 +92,33 @@ static int dwc_gmac_ioctl(struct ifnet * #define RX_DESC_OFFSET(N) ((N)*sizeof(struct dwc_gmac_dev_dmadesc)) void -dwc_gmac_attach(struct dwc_gmac_softc *sc, uint8_t *ep, uint32_t mii_clk) +dwc_gmac_attach(struct dwc_gmac_softc *sc, uint32_t mii_clk) { uint8_t enaddr[ETHER_ADDR_LEN]; uint32_t maclo, machi; struct mii_data * const mii = &sc->sc_mii; struct ifnet * const ifp = &sc->sc_ec.ec_if; + prop_dictionary_t dict; mutex_init(&sc->sc_mdio_lock, MUTEX_DEFAULT, IPL_NET); sc->sc_mii_clk = mii_clk & 7; - /* - * If the frontend did not pass in a pre-configured ethernet mac - * address, try to read on from the current filter setup, - * before resetting the chip. - */ - if (ep == NULL) { + dict = device_properties(sc->sc_dev); + prop_data_t ea = dict ? prop_dictionary_get(dict, "mac-address") : NULL; + if (ea != NULL) { + /* + * If the MAC address is overriden by a device property, + * use that. + */ + KASSERT(prop_object_type(ea) == PROP_TYPE_DATA); + KASSERT(prop_data_size(ea) == ETHER_ADDR_LEN); + memcpy(enaddr, prop_data_data_nocopy(ea), ETHER_ADDR_LEN); + } else { + /* + * If we did not get an externaly configure address, + * try to read one from the current filter setup, + * before resetting the chip. + */ maclo = bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_MAC_ADDR0LO); machi = bus_space_read_4(sc->sc_bst, sc->sc_bsh, AWIN_GMAC_MAC_ADDR0HI); enaddr[0] = maclo & 0x0ff; @@ -116,7 +127,6 @@ dwc_gmac_attach(struct dwc_gmac_softc *s enaddr[3] = (maclo >> 24) & 0x0ff; enaddr[4] = machi & 0x0ff; enaddr[5] = (machi >> 8) & 0x0ff; - ep = enaddr; } /* @@ -124,7 +134,7 @@ dwc_gmac_attach(struct dwc_gmac_softc *s */ if (dwc_gmac_reset(sc) != 0) return; /* not much to cleanup, haven't attached yet */ - dwc_gmac_write_hwaddr(sc, ep); + dwc_gmac_write_hwaddr(sc, enaddr); aprint_normal_dev(sc->sc_dev, "Ethernet address: %s\n", ether_sprintf(enaddr)); Index: src/sys/dev/ic/dwc_gmac_var.h diff -u src/sys/dev/ic/dwc_gmac_var.h:1.2 src/sys/dev/ic/dwc_gmac_var.h:1.3 --- src/sys/dev/ic/dwc_gmac_var.h:1.2 Tue Sep 9 10:04:19 2014 +++ src/sys/dev/ic/dwc_gmac_var.h Thu Sep 11 06:56:05 2014 @@ -87,5 +87,5 @@ struct dwc_gmac_softc { uint16_t sc_mii_clk; }; -void dwc_gmac_attach(struct dwc_gmac_softc*, uint8_t*, uint32_t); +void dwc_gmac_attach(struct dwc_gmac_softc*, uint32_t /*mii_clk*/); int dwc_gmac_intr(struct dwc_gmac_softc*);