kern/112179: [sis] [patch] sis driver for natsemi DP83815D autonegotiate failure

Mark Willson mark at hydrus.org.uk
Wed Jul 30 12:40:04 UTC 2008


The following reply was made to PR kern/112179; it has been noted by GNATS.

From: Mark Willson <mark at hydrus.org.uk>
To: bug-followup at FreeBSD.org, jhb at FreeBSD.org
Cc: phk at FreeBSD.org
Subject: Re: kern/112179: [sis] [patch] sis driver for natsemi DP83815D autonegotiate failure
Date: Wed, 30 Jul 2008 13:04:59 +0100 (BST)

 > From: John Baldwin <jhb at FreeBSD.org>
 > Subject: Re: kern/112179: [sis] [patch] sis driver for natsemi DP83815D
 > 	autonegotiate failure
 > Date: Tue, 29 Jul 2008 11:56:38 -0400
 > Cc: phk at FreeBSD.org
 >
 > How about the patch below.  This makes the driver match the behavior of the 
 > Linux driver (and also fixes a harmless weirdness phk@ introduced.. I think 
 > because he thought SIS_SETBIT was CSR_WRITE_4 rather than a RMW op).
 >
 > Index: if_sis.c
 > ===================================================================
 > --- if_sis.c	(revision 180877)
 > +++ if_sis.c	(working copy)
 > @@ -1904,14 +1904,15 @@
 >  	if (sc->sis_type == SIS_TYPE_83815 && sc->sis_srr <= NS_SRR_15D) {
 >  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0x0001);
 >  		CSR_WRITE_4(sc, NS_PHY_CR, 0x189C);
 > -		if (sc->sis_srr == NS_SRR_15C) {
 > -			/* set val for c2 */
 > -			CSR_WRITE_4(sc, NS_PHY_TDATA, 0x0000);
 > +		/* set val for c2 */
 > +		CSR_WRITE_4(sc, NS_PHY_TDATA, 0x0000);
 > +		if (sc->sis_srr <= NS_SRR_15C)
 >  			/* load/kill c2 */
 >  			CSR_WRITE_4(sc, NS_PHY_DSPCFG, 0x5040);
 > -			/* rais SD off, from 4 to c */
 > -			CSR_WRITE_4(sc, NS_PHY_SDCFG, 0x008C);
 > -		}
 > +		else
 > +			SIS_SETBIT(sc, NS_PHY_DSPCFG, 0x1000);
 > +		/* rais SD off, from 4 to c */
 > +		CSR_WRITE_4(sc, NS_PHY_SDCFG, 0x008C);
 >  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0);
 >  	}
 >  
 > @@ -2011,12 +2012,11 @@
 >  		CSR_WRITE_4(sc, NS_PHY_DSPCFG, reg | 0x1000);
 >  		DELAY(100000);
 >  		reg = CSR_READ_4(sc, NS_PHY_TDATA) & 0xff;
 > -		if ((reg & 0x0080) == 0 || (reg > 0xd8 && reg <= 0xff)) {
 > +		if ((reg & 0x0080) == 0 || (reg >= 0xd8 && reg <= 0xff)) {
 >  			device_printf(sc->sis_dev,
 >  			    "Applying short cable fix (reg=%x)\n", reg);
 >  			CSR_WRITE_4(sc, NS_PHY_TDATA, 0x00e8);
 > -			reg = CSR_READ_4(sc, NS_PHY_DSPCFG);
 > -			SIS_SETBIT(sc, NS_PHY_DSPCFG, reg | 0x20);
 > +			SIS_SETBIT(sc, NS_PHY_DSPCFG, 0x20);
 >  		}
 >  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0);
 >  	}
 >
 
 John,
 
 Thanks for the patch.  I tried it out on my system, but it did not fix
 the problem.  However, if I make a small change, it works fine.
 
 It seems the call  "CSR_WRITE_4(sc, NS_PHY_DSPCFG, 0x5040);" is
 necessary for the NS_SRR_15D revision of the card.
 
 Here's the modified patch:
 
 --- if_sis.c.orig	2008-07-30 11:04:53.000000000 +0100
 +++ if_sis.c	2008-07-30 11:08:15.000000000 +0100
 @@ -1904,14 +1904,14 @@
  	if (sc->sis_type == SIS_TYPE_83815 && sc->sis_srr <= NS_SRR_15D) {
  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0x0001);
  		CSR_WRITE_4(sc, NS_PHY_CR, 0x189C);
 -		if (sc->sis_srr == NS_SRR_15C) {
 -			/* set val for c2 */
 -			CSR_WRITE_4(sc, NS_PHY_TDATA, 0x0000);
 -			/* load/kill c2 */
 -			CSR_WRITE_4(sc, NS_PHY_DSPCFG, 0x5040);
 -			/* rais SD off, from 4 to c */
 -			CSR_WRITE_4(sc, NS_PHY_SDCFG, 0x008C);
 -		}
 +		/* set val for c2 */
 +		CSR_WRITE_4(sc, NS_PHY_TDATA, 0x0000);
 +        /* load/kill c2 */
 +        CSR_WRITE_4(sc, NS_PHY_DSPCFG, 0x5040);
 +		if (sc->sis_srr > NS_SRR_15C)
 +			SIS_SETBIT(sc, NS_PHY_DSPCFG, 0x1000);
 +		/* rais SD off, from 4 to c */
 +		CSR_WRITE_4(sc, NS_PHY_SDCFG, 0x008C);
  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0);
  	}
  
 @@ -2011,12 +2011,11 @@
  		CSR_WRITE_4(sc, NS_PHY_DSPCFG, reg | 0x1000);
  		DELAY(100000);
  		reg = CSR_READ_4(sc, NS_PHY_TDATA) & 0xff;
 -		if ((reg & 0x0080) == 0 || (reg > 0xd8 && reg <= 0xff)) {
 +		if ((reg & 0x0080) == 0 || (reg >= 0xd8 && reg <= 0xff)) {
  			device_printf(sc->sis_dev,
  			    "Applying short cable fix (reg=%x)\n", reg);
  			CSR_WRITE_4(sc, NS_PHY_TDATA, 0x00e8);
 -			reg = CSR_READ_4(sc, NS_PHY_DSPCFG);
 -			SIS_SETBIT(sc, NS_PHY_DSPCFG, reg | 0x20);
 +			SIS_SETBIT(sc, NS_PHY_DSPCFG, 0x20);
  		}
  		CSR_WRITE_4(sc, NS_PHY_PAGE, 0);
  	}
 
 -mark


More information about the freebsd-net mailing list