summaryrefslogtreecommitdiff
path: root/c
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2012-03-21 16:41:29 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2012-03-27 15:20:19 +0200
commit359282828924fce78c58c57411dbad4a5c28b191 (patch)
treeff47632e741310f5f9ed32bfe8349d0478dbf3c3 /c
parentac2e8a7375b61dcd1c609ad53444775906f7ac69 (diff)
GRETH-DRVMGR: removed the use of rtems_set_clock() in auto-nego timeout
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/sparc/shared/net/greth.c49
1 files changed, 19 insertions, 30 deletions
diff --git a/c/src/lib/libbsp/sparc/shared/net/greth.c b/c/src/lib/libbsp/sparc/shared/net/greth.c
index e1c0088640..a4ab6bfa02 100644
--- a/c/src/lib/libbsp/sparc/shared/net/greth.c
+++ b/c/src/lib/libbsp/sparc/shared/net/greth.c
@@ -110,6 +110,10 @@ static inline unsigned int sparc_load_no_cache(unsigned int addr)
#ifndef GRETH_AUTONEGO_TIMEOUT_MS
#define GRETH_AUTONEGO_TIMEOUT_MS 4000
#endif
+const struct timespec greth_tan = {
+ GRETH_AUTONEGO_TIMEOUT_MS/1000,
+ GRETH_AUTONEGO_TIMEOUT_MS*1000000
+};
/* For optimizing the autonegotiation time */
#define GRETH_AUTONEGO_PRINT_TIME
@@ -166,8 +170,8 @@ struct greth_softc
int gb;
int gbit_mac;
int auto_neg;
- unsigned int auto_neg_time;
-
+ struct timespec auto_neg_time;
+
/*
* Statistics
*/
@@ -281,8 +285,9 @@ static void print_init_info(struct greth_softc *sc)
printf("Half Duplex\n");
}
#ifdef GRETH_AUTONEGO_PRINT_TIME
- if ( sc->auto_neg ){
- printf("Autonegotiation Time: %dms\n",sc->auto_neg_time);
+ if ( sc->auto_neg ) {
+ printf("Autonegotiation Time: %dms\n", sc->auto_neg_time.tv_sec * 1000 +
+ sc->auto_neg_time.tv_nsec / 1000000);
}
#endif
}
@@ -301,8 +306,7 @@ greth_initialize_hardware (struct greth_softc *sc)
int phystatus;
int tmp1;
int tmp2;
- unsigned int msecs;
- struct timeval tstart, tnow;
+ struct timespec tstart, tnow;
greth_regs *regs;
@@ -341,33 +345,17 @@ greth_initialize_hardware (struct greth_softc *sc)
sc->fd = 0;
sc->sp = 0;
sc->auto_neg = 0;
- sc->auto_neg_time = 0;
+ _Timespec_Set_to_zero(&sc->auto_neg_time);
if ((phyctrl >> 12) & 1) {
/*wait for auto negotiation to complete*/
- msecs = 0;
sc->auto_neg = 1;
- if ( rtems_clock_get_tod_timeval(&tstart) == RTEMS_NOT_DEFINED){
- /* Not inited, set to epoch */
- rtems_time_of_day time;
- time.year = 1988;
- time.month = 1;
- time.day = 1;
- time.hour = 0;
- time.minute = 0;
- time.second = 0;
- time.ticks = 0;
- rtems_clock_set(&time);
-
- tstart.tv_sec = 0;
- tstart.tv_usec = 0;
- rtems_clock_get_tod_timeval(&tstart);
- }
+ if (rtems_clock_get_uptime(&tstart) != RTEMS_SUCCESSFUL)
+ printk("rtems_clock_get_uptime failed\n");
while (!(((phystatus = read_mii(sc, phyaddr, 1)) >> 5) & 1)) {
- if ( rtems_clock_get_tod_timeval(&tnow) != RTEMS_SUCCESSFUL )
- printk("rtems_clock_get_tod_timeval failed\n\r");
- msecs = (tnow.tv_sec-tstart.tv_sec)*1000+(tnow.tv_usec-tstart.tv_usec)/1000;
- if ( msecs > GRETH_AUTONEGO_TIMEOUT_MS ){
- sc->auto_neg_time = msecs;
+ if (rtems_clock_get_uptime(&tnow) != RTEMS_SUCCESSFUL)
+ printk("rtems_clock_get_uptime failed\n");
+ _Timespec_Subtract(&tstart, &tnow, &sc->auto_neg_time);
+ if (_Timespec_Greater_than(&sc->auto_neg_time, &greth_tan)) {
sc->auto_neg = -1; /* Failed */
tmp1 = read_mii(sc, phyaddr, 0);
sc->gb = ((phyctrl >> 6) & 1) && !((phyctrl >> 13) & 1);
@@ -375,8 +363,9 @@ greth_initialize_hardware (struct greth_softc *sc)
sc->fd = (phyctrl >> 8) & 1;
goto auto_neg_done;
}
+ /* Wait about 30ms, time is PHY dependent */
+ rtems_task_wake_after(rtems_clock_get_ticks_per_second()/32);
}
- sc->auto_neg_time = msecs;
sc->phydev.adv = read_mii(sc, phyaddr, 4);
sc->phydev.part = read_mii(sc, phyaddr, 5);
if ((phystatus >> 8) & 1) {