Changeset 22eccd1 in libbsdport


Ignore:
Timestamp:
Feb 20, 2009, 7:07:46 PM (10 years ago)
Author:
Till Straumann <strauman@…>
Branches:
master
Children:
1df069b
Parents:
881e388
Message:
  • added mdio callbacks and rtems specific code to poll the phy.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • bsd_eth_drivers/if_re/if_re.c

    r881e388 r22eccd1  
    292292static void re_eeprom_getword   (struct rl_softc *, int, u_int16_t *);
    293293static void re_read_eeprom      (struct rl_softc *, caddr_t, int, int);
    294 #ifndef __rtems__
    295294static int re_gmii_readreg      (device_t, int, int);
    296 #endif
    297295static int re_gmii_writereg     (device_t, int, int, int);
    298296
    299 #ifndef __rtems__
    300297static int re_miibus_readreg    (device_t, int, int);
    301298static int re_miibus_writereg   (device_t, int, int, int);
     299#ifndef __rtems__
    302300static void re_miibus_statchg   (device_t);
    303301#endif
     
    368366        sizeof(struct rl_softc)
    369367};
     368
     369static int
     370mdio_r(int phy, void *uarg, unsigned reg, uint32_t *pval)
     371{
     372struct rl_softc *sc = uarg;
     373
     374        if ( phy != 0 )
     375                return EINVAL;
     376
     377        *pval = (uint32_t) re_miibus_readreg(sc->rl_dev, phy, reg);
     378
     379        return 0;
     380}
     381
     382static int
     383mdio_w(int phy, void *uarg, unsigned reg, uint32_t val)
     384{
     385struct rl_softc *sc = uarg;
     386
     387        if ( phy != 0 )
     388                return EINVAL;
     389
     390        re_miibus_writereg(sc->rl_dev, phy, reg, val);
     391
     392        return 0;
     393}
     394
     395struct rtems_mdio_info re_mdio_100 = {
     396        mdio_r   : mdio_r,
     397        mdio_w   : mdio_w,
     398        has_gmii : 0
     399};
     400
     401struct rtems_mdio_info re_mdio_1000 = {
     402        mdio_r   : mdio_r,
     403        mdio_w   : mdio_w,
     404        has_gmii : 1
     405};
     406
     407#define RE_MDIO(sc) ((sc)->rl_type == RL_8169 ? &re_mdio_1000 : & re_mdio_100)
    370408
    371409#endif
     
    475513}
    476514
    477 #ifndef __rtems__
    478515static int
    479516re_gmii_readreg(dev, phy, reg)
     
    514551        return (rval & RL_PHYAR_PHYDATA);
    515552}
    516 #endif
    517553
    518554static int
     
    546582}
    547583
    548 #ifndef __rtems__
    549584static int
    550585re_miibus_readreg(dev, phy, reg)
     
    606641        return (rval);
    607642}
    608 #endif
    609 
    610 #ifndef __rtems__
     643
    611644static int
    612645re_miibus_writereg(dev, phy, reg, data)
     
    660693        return (0);
    661694}
    662 #endif
    663695
    664696#ifndef __rtems__
     
    20062038        }
    20072039#else
    2008 #warning "MII stuff needs to be implemented!"
    2009         /* Just fake an OK link for now... */
    2010         sc->rl_link = 1;
     2040        {
     2041        int med, err;
     2042
     2043        med = IFM_MAKEWORD(0,0,0,0);
     2044
     2045        if ( (err = rtems_mii_ioctl( RE_MDIO(sc), sc, SIOCGIFMEDIA, &med)) ) {
     2046                device_printf(sc->rl_dev, "WARNING: mii ioctl failed; unable to determine link status -- fake ON\n");
     2047                med = IFM_LINK_OK;
     2048        }
     2049
     2050        /* link just died */
     2051        if ( sc->rl_link & !(IFM_LINK_OK & med) ) {
     2052                sc->rl_link = 0;
     2053        }
     2054
     2055        /* link just came up, restart */
     2056        if ( !sc->rl_link && (IFM_LINK_OK & med) ) {
     2057                sc->rl_link = 1;
     2058                if ( ifp->if_snd.ifq_head != NULL ) {
     2059                        taskqueue_enqueue_fast(taskqueue_fast,
     2060                            &sc->rl_txtask);
     2061                }
     2062        }
     2063        }
    20112064#endif
    20122065        callout_reset(&sc->rl_stat_callout, hz, re_tick, sc);
     
    26922745#ifndef __rtems__
    26932746                error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
     2747#else
     2748                error = rtems_mii_ioctl( RE_MDIO(sc), sc, command, &ifr->ifr_media);
    26942749#endif
    26952750                break;
Note: See TracChangeset for help on using the changeset viewer.