From: till straumann <till.straum...@alumni.tu-berlin.de> Remove any calls to mii_ioctl from the low-level driver. Instead, the caller must determine the current speed and communicate to init_hw().
Update #4344 --- .../powerpc/beatnik/include/bsp/mv643xx_eth.h | 2 +- bsps/powerpc/beatnik/net/if_mve/mv643xx_eth.c | 12 ++--- .../beatnik/net/if_mve/mv643xx_eth_bsdnet.c | 54 ++++++++++++------- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/bsps/powerpc/beatnik/include/bsp/mv643xx_eth.h b/bsps/powerpc/beatnik/include/bsp/mv643xx_eth.h index 160cadbc82..5bfcd9b26a 100644 --- a/bsps/powerpc/beatnik/include/bsp/mv643xx_eth.h +++ b/bsps/powerpc/beatnik/include/bsp/mv643xx_eth.h @@ -301,7 +301,7 @@ BSP_mve_dump_stats(struct mveth_private *mp, FILE *f); * are programmed to accept all multicast frames. */ void -BSP_mve_init_hw(struct mveth_private *mp, int promisc, unsigned char *enaddr); +BSP_mve_init_hw(struct mveth_private *mp, int promisc, unsigned char *enaddr, int speed); /* * Update the serial port to a new speed (e.g., result of a PHY IRQ) diff --git a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth.c b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth.c index f786b66c5c..35ef6622d9 100644 --- a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth.c +++ b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth.c @@ -2063,7 +2063,7 @@ uint32_t mveth_serial_ctrl_config_val = MVETH_SERIAL_CTRL_CONFIG_VAL; */ void -BSP_mve_init_hw(struct mveth_private *mp, int promisc, unsigned char *enaddr) +BSP_mve_init_hw(struct mveth_private *mp, int promisc, unsigned char *enaddr, int media) { int i; uint32_t v; @@ -2173,15 +2173,9 @@ static int inited = 0; v |= mveth_serial_ctrl_config_val; MV_WRITE(MV643XX_ETH_SERIAL_CONTROL_R(mp->port_num), v); -#ifdef BSDMII -#warning FIXME - i = IFM_MAKEWORD(0, 0, 0, 0); - if ( 0 == BSP_mve_media_ioctl(mp, SIOCGIFMEDIA, &i) ) { - if ( (IFM_LINK_OK & i) ) { - mveth_update_serial_port(mp, i); - } + if ( (MV643XX_MEDIA_LINK & media) ) { + BSP_mve_update_serial_port(mp, media); } -#endif /* enable serial port */ v = MV_READ(MV643XX_ETH_SERIAL_CONTROL_R(mp->port_num)); diff --git a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c index 0a42dc4190..cdec5c6e14 100644 --- a/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c +++ b/bsps/powerpc/beatnik/net/if_mve/mv643xx_eth_bsdnet.c @@ -563,6 +563,34 @@ int rval; return rval; } +/* Translate IFFLAGS to low-level driver representation */ +static int +xlateMediaFlags(int media) +{ +int lowLevelFlags = 0; + + if ( IFM_LINK_OK & media ) { + lowLevelFlags |= MV643XX_MEDIA_LINK; + + if ( IFM_FDX & media ) { + lowLevelFlags |= MV643XX_MEDIA_FD; + } + + switch ( IFM_SUBTYPE(media) ) { + default: /* treat as 10 */ + lowLevelFlags |= MV643XX_MEDIA_10; + break; + case IFM_100_TX: + lowLevelFlags |= MV643XX_MEDIA_100; + break; + case IFM_1000_T: + lowLevelFlags |= MV643XX_MEDIA_1000; + break; + } + } + return lowLevelFlags; +} + int BSP_mve_ack_link_chg(struct mveth_private *mp, int *pmedia) { @@ -570,23 +598,7 @@ int media = IFM_MAKEWORD(0,0,0,0); if ( 0 == BSP_mve_media_ioctl(mp, SIOCGIFMEDIA, &media)) { if ( IFM_LINK_OK & media ) { - int serport_cfg = 0; - - if ( IFM_FDX & media ) { - serport_cfg |= MV643XX_MEDIA_FD; - } - - switch ( IFM_SUBTYPE(media) ) { - default: /* treat as 10 */ - serport_cfg |= MV643XX_MEDIA_10; - break; - case IFM_100_TX: - serport_cfg |= MV643XX_MEDIA_100; - break; - case IFM_1000_T: - serport_cfg |= MV643XX_MEDIA_1000; - break; - } + int serport_cfg = xlateMediaFlags( media ); BSP_mve_update_serial_port(mp, serport_cfg); } @@ -713,8 +725,7 @@ mveth_init(void *arg) struct mveth_softc *sc = arg; struct ifnet *ifp = &sc->arpcom.ac_if; int media; - - BSP_mve_init_hw(sc->pvt, ifp->if_flags & IFF_PROMISC, sc->arpcom.ac_enaddr); +int lowLevelMediaStatus; media = IFM_MAKEWORD(0, 0, 0, 0); if ( 0 == BSP_mve_media_ioctl(sc->pvt, SIOCGIFMEDIA, &media) ) { @@ -725,6 +736,11 @@ int media; } } + lowLevelMediaStatus = xlateMediaFlags( media ); + + BSP_mve_init_hw(sc->pvt, ifp->if_flags & IFF_PROMISC, sc->arpcom.ac_enaddr, lowLevelMediaStatus); + + /* if promiscuous then there is no need to change */ if ( ! (ifp->if_flags & IFF_PROMISC) ) mveth_set_filters(ifp); -- 2.26.2 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel