diff -up net-tools-1.60/mii-tool.c.mii-refactor net-tools-1.60/mii-tool.c --- net-tools-1.60/mii-tool.c.mii-refactor 2009-10-30 16:25:23.000000000 +0100 +++ net-tools-1.60/mii-tool.c 2009-10-30 16:45:01.000000000 +0100 @@ -50,9 +50,11 @@ static char version[] = #include #include #endif -#include "mii.h" +#include +#include #define MAX_ETH 8 /* Maximum # of interfaces */ +#define LPA_ABILITY_MASK 0x07e0 /* Table of known MII's */ static struct { @@ -112,7 +114,7 @@ static struct ifreq ifr; static int mdio_read(int skfd, int location) { - struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; mii->reg_num = location; if (ioctl(skfd, SIOCGMIIREG, &ifr) < 0) { fprintf(stderr, "SIOCGMIIREG on %s failed: %s\n", ifr.ifr_name, @@ -124,7 +126,7 @@ static int mdio_read(int skfd, int locat static void mdio_write(int skfd, int location, int value) { - struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; mii->reg_num = location; mii->val_in = value; if (ioctl(skfd, SIOCSMIIREG, &ifr) < 0) { @@ -140,13 +142,13 @@ const struct { u_short value; } media[] = { /* The order through 100baseT4 matches bits in the BMSR */ - { "10baseT-HD", MII_AN_10BASET_HD }, - { "10baseT-FD", MII_AN_10BASET_FD }, - { "100baseTx-HD", MII_AN_100BASETX_HD }, - { "100baseTx-FD", MII_AN_100BASETX_FD }, - { "100baseT4", MII_AN_100BASET4 }, - { "100baseTx", MII_AN_100BASETX_FD | MII_AN_100BASETX_HD }, - { "10baseT", MII_AN_10BASET_FD | MII_AN_10BASET_HD }, + { "10baseT-HD", LPA_10HALF }, + { "10baseT-FD", LPA_10FULL }, + { "100baseTx-HD", LPA_100HALF }, + { "100baseTx-FD", LPA_100FULL }, + { "100baseT4", LPA_100BASE4 }, + { "100baseTx", LPA_100FULL | LPA_100HALF }, + { "10baseT", LPA_10FULL | LPA_10HALF }, }; #define NMEDIA (sizeof(media)/sizeof(media[0])) @@ -157,8 +159,8 @@ static int parse_media(char *arg) char *s; mask = strtoul(arg, &s, 16); if ((*arg != '\0') && (*s == '\0')) { - if ((mask & MII_AN_ABILITY_MASK) && - !(mask & ~MII_AN_ABILITY_MASK)) + if ((mask & LPA_ABILITY_MASK) && + !(mask & ~LPA_ABILITY_MASK)) return mask; goto failed; } else { @@ -202,13 +204,22 @@ int show_basic_mii(int sock, int phy_id) char buf[100]; int i, mii_val[32]; int bmcr, bmsr, advert, lkpar; - /* Some bits in the BMSR are latched, but we can't rely on being the only reader, so only the current values are meaningful */ mdio_read(sock, MII_BMSR); - for (i = 0; i < ((verbose > 1) ? 32 : 8); i++) - mii_val[i] = mdio_read(sock, i); - + for (i = 0; i < ((verbose > 1) ? 32 : 8); i++) { + if ((i == MII_BMCR) || (i == MII_BMSR) || (i == MII_PHYSID1) || + (i == MII_PHYSID2) || (i == MII_ADVERTISE) || (i == MII_LPA) || + (i == MII_EXPANSION) || (i == MII_CTRL1000) || (i == MII_STAT1000) || + (i == MII_ESTATUS) || (i == MII_DCOUNTER) || (i == MII_FCSCOUNTER) || + (i == MII_NWAYTEST) || (i == MII_RERRCOUNTER) || + (i == MII_SREVISION) || (i == MII_RESV1) || (i == MII_LBRERROR) || + (i == MII_PHYADDR) || (i == MII_RESV2) || + (i == MII_TPISTATUS) || (i == MII_NCONFIG)) + mii_val[i] = mdio_read(sock, i); + else + mii_val[i] = 0; + } if (mii_val[MII_BMCR] == 0xffff) { fprintf(stderr, " No MII transceiver present!.\n"); return -1; @@ -216,28 +227,28 @@ int show_basic_mii(int sock, int phy_id) /* Descriptive rename. */ bmcr = mii_val[MII_BMCR]; bmsr = mii_val[MII_BMSR]; - advert = mii_val[MII_ANAR]; lkpar = mii_val[MII_ANLPAR]; + advert = mii_val[MII_ADVERTISE]; lkpar = mii_val[MII_LPA]; sprintf(buf, "%s: ", ifr.ifr_name); - if (bmcr & MII_BMCR_AN_ENA) { - if (bmsr & MII_BMSR_AN_COMPLETE) { + if (bmcr & BMCR_ANENABLE) { + if (bmsr & BMSR_ANEGCOMPLETE) { if (advert & lkpar) { - strcat(buf, (lkpar & MII_AN_ACK) ? + strcat(buf, (lkpar & LPA_LPACK) ? "negotiated" : "no autonegotiation,"); strcat(buf, media_list(advert & lkpar, 1)); strcat(buf, ", "); } else { strcat(buf, "autonegotiation failed, "); } - } else if (bmcr & MII_BMCR_RESTART) { + } else if (bmcr & BMCR_ANRESTART) { strcat(buf, "autonegotiation restarted, "); } } else { sprintf(buf+strlen(buf), "%s Mbit, %s duplex, ", - (bmcr & MII_BMCR_100MBIT) ? "100" : "10", - (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); + (bmcr & BMCR_SPEED100) ? "100" : "10", + (bmcr & BMCR_FULLDPLX) ? "full" : "half"); } - strcat(buf, (bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); + strcat(buf, (bmsr & BMSR_LSTATUS) ? "link ok" : "no link"); if (opt_watch) { if (opt_log) { @@ -273,32 +284,32 @@ int show_basic_mii(int sock, int phy_id) ((mii_val[2]<<6)|(mii_val[3]>>10))&0xff, (mii_val[3]>>4)&0x3f, mii_val[3]&0x0f); printf(" basic mode: "); - if (bmcr & MII_BMCR_RESET) + if (bmcr & BMCR_RESET) printf("software reset, "); - if (bmcr & MII_BMCR_LOOPBACK) + if (bmcr & BMCR_LOOPBACK) printf("loopback, "); - if (bmcr & MII_BMCR_ISOLATE) + if (bmcr & BMCR_ISOLATE) printf("isolate, "); - if (bmcr & MII_BMCR_COLTEST) + if (bmcr & BMCR_CTST) printf("collision test, "); - if (bmcr & MII_BMCR_AN_ENA) { + if (bmcr & BMCR_ANENABLE) { printf("autonegotiation enabled\n"); } else { printf("%s Mbit, %s duplex\n", - (bmcr & MII_BMCR_100MBIT) ? "100" : "10", - (bmcr & MII_BMCR_DUPLEX) ? "full" : "half"); + (bmcr & BMCR_SPEED100) ? "100" : "10", + (bmcr & BMCR_FULLDPLX) ? "full" : "half"); } printf(" basic status: "); - if (bmsr & MII_BMSR_AN_COMPLETE) + if (bmsr & BMSR_ANEGCOMPLETE) printf("autonegotiation complete, "); - else if (bmcr & MII_BMCR_RESTART) + else if (bmcr & BMCR_ANRESTART) printf("autonegotiation restarted, "); - if (bmsr & MII_BMSR_REMOTE_FAULT) + if (bmsr & BMSR_RFAULT) printf("remote fault, "); - printf((bmsr & MII_BMSR_LINK_VALID) ? "link ok" : "no link"); + printf((bmsr & BMSR_LSTATUS) ? "link ok" : "no link"); printf("\n capabilities:%s", media_list(bmsr >> 6, 0)); printf("\n advertising: %s", media_list(advert, 0)); - if (lkpar & MII_AN_ABILITY_MASK) + if (lkpar & LPA_ABILITY_MASK) printf("\n link partner:%s", media_list(lkpar, 0)); printf("\n"); } @@ -310,7 +321,7 @@ int show_basic_mii(int sock, int phy_id) static int do_one_xcvr(int skfd, char *ifname, int maybe) { - struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; /* Get the vitals from the interface. */ strncpy(ifr.ifr_name, ifname, IFNAMSIZ); @@ -328,23 +339,23 @@ static int do_one_xcvr(int skfd, char *i if (opt_reset) { printf("resetting the transceiver...\n"); - mdio_write(skfd, MII_BMCR, MII_BMCR_RESET); + mdio_write(skfd, MII_BMCR, BMCR_RESET); } if (nway_advertise) { - mdio_write(skfd, MII_ANAR, nway_advertise | 1); + mdio_write(skfd, MII_ADVERTISE, nway_advertise | 1); opt_restart = 1; } if (opt_restart) { printf("restarting autonegotiation...\n"); mdio_write(skfd, MII_BMCR, 0x0000); - mdio_write(skfd, MII_BMCR, MII_BMCR_AN_ENA|MII_BMCR_RESTART); + mdio_write(skfd, MII_BMCR, BMCR_ANENABLE|BMCR_ANRESTART); } if (fixed_speed) { int bmcr = 0; - if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_100BASETX_HD)) - bmcr |= MII_BMCR_100MBIT; - if (fixed_speed & (MII_AN_100BASETX_FD|MII_AN_10BASET_FD)) - bmcr |= MII_BMCR_DUPLEX; + if (fixed_speed & (LPA_100FULL|LPA_100HALF)) + bmcr |= BMCR_SPEED100; + if (fixed_speed & (LPA_100FULL|LPA_10FULL)) + bmcr |= BMCR_FULLDPLX; mdio_write(skfd, MII_BMCR, bmcr); } @@ -358,7 +369,7 @@ static int do_one_xcvr(int skfd, char *i static void watch_one_xcvr(int skfd, char *ifname, int index) { - struct mii_data *mii = (struct mii_data *)&ifr.ifr_data; + struct mii_ioctl_data *mii = (struct mii_ioctl_data *)&ifr.ifr_data; static int status[MAX_ETH] = { 0, /* ... */ }; int now;