Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Feb 1999 21:20:54 -0500
From:      tcobb@staff.circle.net
To:        wpaul@ctr.columbia.edu
Cc:        freebsd-current@FreeBSD.ORG
Subject:   RE: 3c905B stops responding during ifconfig alias
Message-ID:  <A0CFA284C004D211B7EE0060082F32A412E190@freya.circle.net>

next in thread | raw e-mail | index | archive | help
Bill,
Your patch worked perfectly.  THANK YOU!

By the way, I'd be happy to fedex a 3c905B to
you for your use in testing these sorts of things
if that would be helpful.  We have a fairly large
commitment to this card now (40+) and I'd do this
happily to facilitate continuing performance 
enhancements or other improvements to it.

Sincerely,

-Troy Cobb
 Circle Net, Inc.
 http://www.circle.net

>   -----Original Message-----
>   From: wpaul@ctr.columbia.edu [mailto:wpaul@ctr.columbia.edu]
>   My apologies for not replying to you on this sooner; it 
>   took me a while
>   to locate a machine with which I could do some testing (all 
>   the 3c905B
>   hardware I have is in the form of embedded chipsets in Dell desktop
>   machines, and they've been moving around on me a lot).
>     
>   > This does NOT happen on the:
>   > xl0: <3Com 3c905 Fast Etherlink XL 10/100BaseTX> rev 0x00 
>   int a irq 10 on
>   
>   I think I found the problem. Currently, xl_stop() and xl_init() both
>   issue RX and TX resets. Seems logical doesn't it? I mean, 
>   the purpose
>   of xl_init() is to put the NIC into a known good state, and 
>   the purpose
>   of xl_stop() is to slap it in the face and make it shut up ASAP. The
>   difference between the 3c905 and the 3c905B (well, the important
>   difference in this case) is that the 3c905B's chipset has a 
>   built-in PHY,
>   while the 3c905 requires an external one (3Com uses a 
>   DP83840A for the
>   3c905 boards, judging by the one sample 3c905 card I have). 
>   Apparently,
>   issuing the RX and TX reset commands on the 3c905B causes it to also
>   reset the PHY, which causes the PHY to restart its 
>   autonegotiation session
>   with its link partner. It takes a few seconds for the 
>   autoneg session to
>   finish, and during this time the 3c905B stops receiving packets.
>   
>   This doesn't happen on the 3c905 because issuing the RX and TX reset
>   commands does not have any affect on the external PHY: the only way
>   to reset the PHY is by writing to the PHY's basic mode 
>   control register
>   via the MII management interface.
>   
>   I'm including a patch which should fix this problem. It 
>   just disables
>   the code that does the reset in both xl_stop() and xl_init(). Please
>   try this and let me know if it helps.
>   
>   To apply the patch, do the following:
>   
>   - Make sure you have the kernel source code installed under 
>   /usr/src.
>   - Save this message to a file, i.e. /tmp/xl.patch
>   - Become root.
>   - Run the following commands:
>   	# cd /sys/pci
>   	# patch < /tmp/xl.patch
>   - Compile a new kernel and boot it.
>   
>   This patch was generated using a version of if_xl.c from 
>   FreeBSD-current,
>   but it should work on any version of the driver with only a 
>   couple of
>   mild warnings.
>   
>   -Bill
>   
>   -- 
>   ============================================================
>   =================
>   -Bill Paul            (212) 854-6020 | System Manager, 
>   Master of Unix-Fu
>   Work:         wpaul@ctr.columbia.edu | Center for 
>   Telecommunications Research
>   Home:  wpaul@skynet.ctr.columbia.edu | Columbia University, 
>   New York City
>   ============================================================
>   =================
>   "Mulder, toads just fell from the sky!" "I guess their 
>   parachutes didn't open."
>   ============================================================
>   =================
>   
>   *** ../CVSWORK/sys_pci/if_xl.c	Mon Feb  1 16:25:52 1999
>   --- if_xl.c	Thu Feb 11 18:34:39 1999
>   ***************
>   *** 2363,2373 ****
>   --- 2363,2375 ----
>     	for (i = 0; i < 3; i++)
>     		CSR_WRITE_2(sc, XL_W2_STATION_MASK_LO + (i * 2), 0);
>     
>   + #ifdef notdef
>     	/* Reset TX and RX. */
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_RESET);
>     	xl_wait(sc);
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_TX_RESET);
>     	xl_wait(sc);
>   + #endif
>     
>     	/* Init circular RX list. */
>     	if (xl_list_rx_init(sc) == ENOBUFS) {
>   ***************
>   *** 2715,2724 ****
>   --- 2717,2728 ----
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_TX_DISABLE);
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_COAX_STOP);
>     	DELAY(800);
>   + #ifdef notdef
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_RESET);
>     	xl_wait(sc);
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_TX_RESET);
>     	xl_wait(sc);
>   + #endif
>     	CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_INTR_ACK|XL_STAT_INTLATCH);
>     
>     	/* Stop the stats updater. */
>   

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A0CFA284C004D211B7EE0060082F32A412E190>