PERFORCE change 175744 for review
Rafal Jaworowski
raj at FreeBSD.org
Tue Mar 16 21:24:19 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=175744
Change 175744 by raj at raj_fdt on 2010/03/16 21:24:15
Refactor PHY address processing area.
o Make the main routine shared accross plaforms
o Improve validation
Affected files ...
.. //depot/projects/fdt/sys/dev/fdt/fdt_common.c#11 edit
.. //depot/projects/fdt/sys/dev/fdt/fdt_common.h#9 edit
.. //depot/projects/fdt/sys/dev/mge/if_mge.c#7 edit
.. //depot/projects/fdt/sys/dev/mge/if_mgevar.h#3 edit
Differences ...
==== //depot/projects/fdt/sys/dev/fdt/fdt_common.c#11 (text+ko) ====
@@ -462,3 +462,26 @@
free(intr, M_OFWPROP);
return (rv);
}
+
+int
+fdt_get_phyaddr(phandle_t node, int *phy_addr)
+{
+ phandle_t phy_node;
+ ihandle_t phy_ihandle;
+ pcell_t phy_handle, phy_reg;
+
+ if (OF_getprop(node, "phy-handle", (void *)&phy_handle,
+ sizeof(phy_handle)) <= 0)
+ return (ENXIO);
+
+ phy_ihandle = (ihandle_t)phy_handle;
+ phy_ihandle = fdt32_to_cpu(phy_ihandle);
+ phy_node = OF_instance_to_package(phy_ihandle);
+
+ if (OF_getprop(phy_node, "reg", (void *)&phy_reg,
+ sizeof(phy_reg)) <= 0)
+ return (ENXIO);
+
+ *phy_addr = fdt32_to_cpu(phy_reg);
+ return (0);
+}
==== //depot/projects/fdt/sys/dev/fdt/fdt_common.h#9 (text+ko) ====
@@ -58,16 +58,17 @@
int fdt_addrsize_cells(phandle_t, int *, int *);
u_long fdt_data_get(void *, int);
-int fdt_parent_addr_cells(phandle_t);
-void fdt_ranges_dump(pcell_t *, int, int, int, int);
-int fdt_ranges_verify(pcell_t *, int, int, int, int);
+int fdt_data_to_res(pcell_t *, int, int, u_long *, u_long *);
+phandle_t fdt_find_compatible(phandle_t, const char *, int);
+int fdt_get_phyaddr(phandle_t node, int *);
int fdt_get_regsize(phandle_t, u_long *, u_long *);
-int fdt_reg_to_rl(phandle_t, struct resource_list *, u_long);
int fdt_intr_to_rl(phandle_t, struct resource_list *, struct sense_level *);
-int fdt_data_to_res(pcell_t *, int, int, u_long *, u_long *);
int fdt_is_compatible(phandle_t, const char *);
int fdt_is_compatible_strict(phandle_t, const char *);
int fdt_is_enabled(phandle_t);
-phandle_t fdt_find_compatible(phandle_t, const char *, int);
+int fdt_parent_addr_cells(phandle_t);
+void fdt_ranges_dump(pcell_t *, int, int, int, int);
+int fdt_ranges_verify(pcell_t *, int, int, int, int);
+int fdt_reg_to_rl(phandle_t, struct resource_list *, u_long);
#endif /* _FDT_COMMON_H_ */
==== //depot/projects/fdt/sys/dev/mge/if_mge.c#7 (text+ko) ====
@@ -190,48 +190,29 @@
{ mge_intr_err, "GbE error interrupt" },
};
-static __inline int
-mge_phyaddr_from_dt(struct mge_softc *sc)
-{
- ihandle_t phy_ihandle;
- pcell_t phy_handle;
- pcell_t phy_reg;
-
- if (OF_getprop(sc->node, "phy-handle", (void *)&phy_handle,
- sizeof(phy_handle)) <= 0) {
- device_printf(sc->dev, "Could not get phy-handle\n");
- return (ENXIO);
- }
-
- phy_ihandle = (ihandle_t)phy_handle;
- phy_ihandle = fdt32_to_cpu(phy_ihandle);
- sc->phy_node = OF_instance_to_package(phy_ihandle);
-
- if (OF_getprop(sc->phy_node, "reg", (void *)&phy_reg,
- sizeof(phy_reg)) <= 0) {
- device_printf(sc->dev, "Could not get 'reg' property "
- "from phy node\n");
- return (ENXIO);
- }
- sc->phy_addr = phy_reg;
-
- return (0);
-}
-
static void
mge_get_mac_address(struct mge_softc *sc, uint8_t *addr)
{
uint32_t mac_l, mac_h;
uint8_t lmac[6];
- int i;
+ int i, valid;
/*
* Retrieve hw address from the device tree.
*/
i = OF_getprop(sc->node, "local-mac-address", (void *)lmac, 6);
if (i == 6) {
- bcopy(lmac, addr, 6);
- return;
+ valid = 0;
+ for (i = 0; i < 6; i++)
+ if (lmac[i] != 0) {
+ valid = 1;
+ break;
+ }
+
+ if (valid) {
+ bcopy(lmac, addr, 6);
+ return;
+ }
}
/*
@@ -660,8 +641,8 @@
/* Set chip version-dependent parameters */
mge_ver_params(sc);
- /* Get phy address from fdt*/
- if (mge_phyaddr_from_dt(sc) != 0)
+ /* Get phy address from fdt */
+ if (fdt_get_phyaddr(sc->node, &sc->phyaddr) != 0)
return (ENXIO);
/* Initialize mutexes */
@@ -1312,7 +1293,7 @@
sc = device_get_softc(dev);
- if (sc->phy_addr != phy)
+ if (sc->phyaddr != phy)
return (0);
MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff &
@@ -1336,7 +1317,7 @@
sc = device_get_softc(dev);
- if (sc->phy_addr != phy)
+ if (sc->phyaddr != phy)
return (0);
MGE_WRITE(sc_mge0, MGE_REG_SMI, 0x1fffffff &
==== //depot/projects/fdt/sys/dev/mge/if_mgevar.h#3 (text+ko) ====
@@ -66,7 +66,6 @@
struct ifnet *ifp; /* per-interface network data */
phandle_t node;
- phandle_t phy_node;
device_t dev;
device_t miibus;
@@ -105,7 +104,7 @@
uint16_t mge_mtu;
int mge_ver;
- int phy_addr;
+ int phyaddr;
};
More information about the p4-projects
mailing list