rpms/net-tools/F-13 net-tools-1.60-mii-gigabit.patch, NONE, 1.1 net-tools.spec, 1.108, 1.109

Jiří Popelka jpopelka at fedoraproject.org
Mon Jun 14 15:29:57 UTC 2010


Author: jpopelka

Update of /cvs/pkgs/rpms/net-tools/F-13
In directory cvs01.phx2.fedoraproject.org:/tmp/cvs-serv28550

Modified Files:
	net-tools.spec 
Added Files:
	net-tools-1.60-mii-gigabit.patch 
Log Message:
* Mon Jun 14 2010  Jiri Popelka <jpopelka at redhat.com> - 1.60-103
- updated mii-tool to support gigabit links (#539575)


net-tools-1.60-mii-gigabit.patch:
 mii-tool.c |  112 +++++++++++++++++++++++++++++++++++++++----------------------
 1 file changed, 73 insertions(+), 39 deletions(-)

--- NEW FILE net-tools-1.60-mii-gigabit.patch ---
diff -up net-tools-1.60/mii-tool.c.mii-gigabit net-tools-1.60/mii-tool.c
--- net-tools-1.60/mii-tool.c.mii-gigabit	2010-06-14 15:51:23.000000000 +0200
+++ net-tools-1.60/mii-tool.c	2010-06-14 16:10:34.000000000 +0200
@@ -57,7 +57,7 @@ static char version[] =
 #define LPA_ABILITY_MASK	0x07e0
 
 /* Table of known MII's */
-static struct {
+static const struct {
     u_short	id1, id2;
     char	*name;
 } mii_id[] = {
@@ -76,6 +76,9 @@ static struct {
     { 0x0181, 0x4410, "Quality QS6612" },
     { 0x0282, 0x1c50, "SMSC 83C180" },
     { 0x0300, 0xe540, "TDK 78Q2120" },
+    { 0x0141, 0x0c20, "Yukon 88E1011" },
+    { 0x0141, 0x0cc0, "Yukon-EC 88E1111" },
+    { 0x0141, 0x0c90, "Yukon-2 88E1112" },
 };
 #define NMII (sizeof(mii_id)/sizeof(mii_id[0]))
 
@@ -139,40 +142,47 @@ static void mdio_write(int skfd, int loc
 
 const struct {
     char	*name;
-    u_short	value;
+    u_short	value[2];
 } media[] = {
     /* The order through 100baseT4 matches bits in the BMSR */
-    { "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 },
+    { "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} },
+    { "1000baseT-HD",   {0, ADVERTISE_1000HALF} },
+    { "1000baseT-FD",   {0, ADVERTISE_1000FULL} },
+    { "1000baseT",      {0, ADVERTISE_1000HALF|ADVERTISE_1000FULL} },
 };
 #define NMEDIA (sizeof(media)/sizeof(media[0]))
 	
 /* Parse an argument list of media types */
-static int parse_media(char *arg)
+static int parse_media(char *arg, unsigned *bmcr2)
 {
     int mask, i;
     char *s;
     mask = strtoul(arg, &s, 16);
     if ((*arg != '\0') && (*s == '\0')) {
-	if ((mask & LPA_ABILITY_MASK) &&
-	    !(mask & ~LPA_ABILITY_MASK))
-	    return mask;
-	goto failed;
-    } else {
-	mask = 0;
-	s = strtok(arg, ", ");
-	do {
-	    for (i = 0; i < NMEDIA; i++)
-		if (strcasecmp(media[i].name, s) == 0) break;
-	    if (i == NMEDIA) goto failed;
-	    mask |= media[i].value;
-	} while ((s = strtok(NULL, ", ")) != NULL);
-    }
+        if ((mask & LPA_ABILITY_MASK) &&
+            !(mask & ~LPA_ABILITY_MASK)) {
+            *bmcr2 = 0;
+            return mask;
+        }
+        goto failed;
+    }
+    mask = 0;
+    *bmcr2 = 0;
+    s = strtok(arg, ", ");
+    do {
+        for (i = 0; i < NMEDIA; i++)
+        if (s && strcasecmp(media[i].name, s) == 0) break;
+        if (i == NMEDIA) goto failed;
+        mask |= media[i].value[0];
+        *bmcr2 |= media[i].value[1];
+    } while ((s = strtok(NULL, ", ")) != NULL);
+
     return mask;
 failed:
     fprintf(stderr, "Invalid media specification '%s'.\n", arg);
@@ -181,11 +191,25 @@ failed:
 
 /*--------------------------------------------------------------------*/
 
-static char *media_list(int mask, int best)
+static const char *media_list(unsigned mask, unsigned mask2, int best)
 {
     static char buf[100];
     int i;
     *buf = '\0';
+
+    if (mask & BMCR_SPEED1000) {
+        if (mask2 & ADVERTISE_1000HALF) {
+            strcat(buf, " ");
+            strcat(buf, "1000baseT-HD");
+            if (best) goto out;
+        }
+        if (mask2 & ADVERTISE_1000FULL) {
+            strcat(buf, " ");
+            strcat(buf, "1000baseT-FD");
+            if (best) goto out;
+        }
+    }
+
     mask >>= 5;
     for (i = 4; i >= 0; i--) {
 	if (mask & (1<<i)) {
@@ -194,6 +218,7 @@ static char *media_list(int mask, int be
 	    if (best) break;
 	}
     }
+out:
     if (mask & (1<<5))
 	strcat(buf, " flow-control");
     return buf;
@@ -203,11 +228,11 @@ int show_basic_mii(int sock, int phy_id)
 {
     char buf[100];
     int i, mii_val[32];
-    int bmcr, bmsr, advert, lkpar;
+    unsigned bmcr, bmsr, advert, lkpar, bmcr2, lpa2;
     /* 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++) {
+    for (i = 0; i < ((verbose > 1) ? 32 : (MII_STAT1000+1)); 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) ||
@@ -220,7 +245,7 @@ int show_basic_mii(int sock, int phy_id)
         else
             mii_val[i] = 0;
     }
-    if (mii_val[MII_BMCR] == 0xffff) {
+    if (mii_val[MII_BMCR] == 0xffff  || mii_val[MII_BMSR] == 0x0000) {
 	fprintf(stderr, "  No MII transceiver present!.\n");
 	return -1;
     }
@@ -228,6 +253,7 @@ 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_ADVERTISE]; lkpar = mii_val[MII_LPA];
+    bmcr2 = mii_val[MII_CTRL1000]; lpa2 = mii_val[MII_STAT1000];
 
     sprintf(buf, "%s: ", ifr.ifr_name);
     if (bmcr & BMCR_ANENABLE) {
@@ -235,7 +261,7 @@ int show_basic_mii(int sock, int phy_id)
 	    if (advert & lkpar) {
 		strcat(buf, (lkpar & LPA_LPACK) ?
 		       "negotiated" : "no autonegotiation,");
-		strcat(buf, media_list(advert & lkpar, 1));
+		strcat(buf, media_list(advert & lkpar, bmcr2 & lpa2>>2, 1));
 		strcat(buf, ", ");
 	    } else {
 		strcat(buf, "autonegotiation failed, ");
@@ -245,8 +271,10 @@ int show_basic_mii(int sock, int phy_id)
 	}
     } else {
 	sprintf(buf+strlen(buf), "%s Mbit, %s duplex, ",
-	       (bmcr & BMCR_SPEED100) ? "100" : "10",
-	       (bmcr & BMCR_FULLDPLX) ? "full" : "half");
+		((bmcr2 & (ADVERTISE_1000HALF | ADVERTISE_1000FULL)) & lpa2 >> 2)
+		? "1000"
+		: (bmcr & BMCR_SPEED100) ? "100" : "10",
+		(bmcr & BMCR_FULLDPLX) ? "full" : "half");
     }
     strcat(buf, (bmsr & BMSR_LSTATUS) ? "link ok" : "no link");
 
@@ -307,10 +335,10 @@ int show_basic_mii(int sock, int phy_id)
 	if (bmsr & BMSR_RFAULT)
 	    printf("remote fault, ");
 	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));
+	printf("\n  capabilities:%s", media_list(bmsr >> 6, bmcr2, 0));
+	printf("\n  advertising: %s", media_list(advert, lpa2 >> 2, 0));
 	if (lkpar & LPA_ABILITY_MASK)
-	    printf("\n  link partner:%s", media_list(lkpar, 0));
+	    printf("\n  link partner:%s", media_list(lkpar, bmcr2, 0));
 	printf("\n");
     }
     fflush(stdout);
@@ -341,7 +369,7 @@ static int do_one_xcvr(int skfd, char *i
 	printf("resetting the transceiver...\n");
 	mdio_write(skfd, MII_BMCR, BMCR_RESET);
     }
-    if (nway_advertise) {
+    if (nway_advertise > 0) {
 	mdio_write(skfd, MII_ADVERTISE, nway_advertise | 1);
 	opt_restart = 1;
     }
@@ -400,18 +428,20 @@ usage: %s [-VvRrwl] [-A media,... | -F m
        -l, --log                   with -w, write events to syslog\n\
        -A, --advertise=media,...   advertise only specified media\n\
        -F, --force=media           force specified media technology\n\
-media: 100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD,\n\
+media: 1000baseTx-HD, 1000baseTx-FD,\n\
+       100baseT4, 100baseTx-FD, 100baseTx-HD, 10baseT-FD, 10baseT-HD,\n\
        (to advertise both HD and FD) 100baseTx, 10baseT\n";
 
 int main(int argc, char **argv)
 {
     int i, c, ret, errflag = 0;
     char s[6];
-    
+    unsigned ctrl1000 = 0;
+
     while ((c = getopt_long(argc, argv, "A:F:p:lrRvVw?", longopts, 0)) != EOF)
 	switch (c) {
-	case 'A': nway_advertise = parse_media(optarg); break;
-	case 'F': fixed_speed = parse_media(optarg); break;
+	case 'A': nway_advertise = parse_media(optarg, &ctrl1000); break;
+	case 'F': fixed_speed = parse_media(optarg, &ctrl1000); break;
 	case 'p': override_phy = atoi(optarg); break;
 	case 'r': opt_restart++;	break;
 	case 'R': opt_reset++;		break;
@@ -423,6 +453,10 @@ int main(int argc, char **argv)
 	}
     /* Check for a few inappropriate option combinations */
     if (opt_watch) verbose = 0;
+
+    if ((nway_advertise < 0) || (fixed_speed < 0))
+        return 2;
+
     if (errflag || (fixed_speed & (fixed_speed-1)) ||
 	(fixed_speed && (opt_restart || nway_advertise))) {
 	fprintf(stderr, usage, argv[0]);


Index: net-tools.spec
===================================================================
RCS file: /cvs/pkgs/rpms/net-tools/F-13/net-tools.spec,v
retrieving revision 1.108
retrieving revision 1.109
diff -u -p -r1.108 -r1.109
--- net-tools.spec	7 Apr 2010 11:40:12 -0000	1.108
+++ net-tools.spec	14 Jun 2010 15:29:56 -0000	1.109
@@ -1,7 +1,7 @@
 Summary: Basic networking tools
 Name: net-tools
 Version: 1.60
-Release: 102%{?dist}
+Release: 103%{?dist}
 License: GPL+
 Group: System Environment/Base
 URL: http://net-tools.berlios.de/
@@ -127,6 +127,9 @@ Patch85: net-tools-1.60-large-indexes.pa
 # netstat -s (statistics.c) now uses unsigned long long (instead of int) to handle 64 bit integers (Bug #579854, Debian #561161)
 Patch86: net-tools-1.60-statistics-doubleword.patch
 
+# update mii-tool to support gigabit links (#539575)
+Patch87: net-tools-1.60-mii-gigabit.patch
+
 BuildRequires: gettext, libselinux
 BuildRequires: libselinux-devel
 Requires: hostname
@@ -218,6 +221,7 @@ Most of them are obsolete. For replaceme
 %patch84 -p1 -b .IA64
 %patch85 -p1 -b .large-indexes
 %patch86 -p1 -b .doubleword
+%patch87 -p1 -b .mii-gigabit
 
 cp %SOURCE1 ./config.h
 cp %SOURCE2 ./config.make
@@ -317,6 +321,9 @@ rm -rf %{buildroot}
 %config(noreplace) %{_sysconfdir}/ethers
 
 %changelog
+* Mon Jun 14 2010  Jiri Popelka <jpopelka at redhat.com> - 1.60-103
+- updated mii-tool to support gigabit links (#539575)
+
 * Wed Apr  7 2010  Jiri Popelka <jpopelka at redhat.com> - 1.60-102
 - fixed statistics.c to use unsigned long long (instead of int) to handle 64 bit integers (Bug #579854, Debian #561161)
 - fixed typo in statistics.c (Bug #579855)



More information about the scm-commits mailing list