1998-11-07 17:40:18 +00:00
|
|
|
.\" Copyright (c) 1997, 1998
|
|
|
|
.\" Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
|
|
.\" must display the following acknowledgement:
|
|
|
|
.\" This product includes software developed by Bill Paul.
|
|
|
|
.\" 4. Neither the name of the author nor the names of any co-contributors
|
|
|
|
.\" may be used to endorse or promote products derived from this software
|
|
|
|
.\" without specific prior written permission.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
|
|
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
|
|
.\" THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
.\"
|
1999-08-28 00:22:10 +00:00
|
|
|
.\" $FreeBSD$
|
1998-11-07 17:40:18 +00:00
|
|
|
.\"
|
1998-11-07 17:54:11 +00:00
|
|
|
.Dd November 4, 1998
|
1999-11-15 23:14:32 +00:00
|
|
|
.Dt RL 4
|
2001-07-10 15:31:11 +00:00
|
|
|
.Os
|
1998-11-07 17:40:18 +00:00
|
|
|
.Sh NAME
|
|
|
|
.Nm rl
|
Take the support for the 8139C+/8169/8169S/8110S chips out of the
rl(4) driver and put it in a new re(4) driver. The re(4) driver shares
the if_rlreg.h file with rl(4) but is a separate module. (Ultimately
I may change this. For now, it's convenient.)
rl(4) has been modified so that it will never attach to an 8139C+
chip, leaving it to re(4) instead. Only re(4) has the PCI IDs to
match the 8169/8169S/8110S gigE chips. if_re.c contains the same
basic code that was originally bolted onto if_rl.c, with the
following updates:
- Added support for jumbo frames. Currently, there seems to be
a limit of approximately 6200 bytes for jumbo frames on transmit.
(This was determined via experimentation.) The 8169S/8110S chips
apparently are limited to 7.5K frames on transmit. This may require
some more work, though the framework to handle jumbo frames on RX
is in place: the re_rxeof() routine will gather up frames than span
multiple 2K clusters into a single mbuf list.
- Fixed bug in re_txeof(): if we reap some of the TX buffers,
but there are still some pending, re-arm the timer before exiting
re_txeof() so that another timeout interrupt will be generated, just
in case re_start() doesn't do it for us.
- Handle the 'link state changed' interrupt
- Fix a detach bug. If re(4) is loaded as a module, and you do
tcpdump -i re0, then you do 'kldunload if_re,' the system will
panic after a few seconds. This happens because ether_ifdetach()
ends up calling the BPF detach code, which notices the interface
is in promiscuous mode and tries to switch promisc mode off while
detaching the BPF listner. This ultimately results in a call
to re_ioctl() (due to SIOCSIFFLAGS), which in turn calls re_init()
to handle the IFF_PROMISC flag change. Unfortunately, calling re_init()
here turns the chip back on and restarts the 1-second timeout loop
that drives re_tick(). By the time the timeout fires, if_re.ko
has been unloaded, which results in a call to invalid code and
blows up the system.
To fix this, I cleared the IFF_UP flag before calling ether_ifdetach(),
which stops the ioctl routine from trying to reset the chip.
- Modified comments in re_rxeof() relating to the difference in
RX descriptor status bit layout between the 8139C+ and the gigE
chips. The layout is different because the frame length field
was expanded from 12 bits to 13, and they got rid of one of the
status bits to make room.
- Add diagnostic code (re_diag()) to test for the case where a user
has installed a broken 32-bit 8169 PCI NIC in a 64-bit slot. Some
NICs have the REQ64# and ACK64# lines connected even though the
board is 32-bit only (in this case, they should be pulled high).
This fools the chip into doing 64-bit DMA transfers even though
there is no 64-bit data path. To detect this, re_diag() puts the
chip into digital loopback mode and sets the receiver to promiscuous
mode, then initiates a single 64-byte packet transmission. The
frame is echoed back to the host, and if the frame contents are
intact, we know DMA is working correctly, otherwise we complain
loudly on the console and abort the device attach. (At the moment,
I don't know of any way to work around the problem other than
physically modifying the board, so until/unless I can think of a
software workaround, this will have do to.)
- Created re(4) man page
- Modified rlphy.c to allow re(4) to attach as well as rl(4).
Note that this code works for the sample 8169/Marvell 88E1000 NIC
that I have, but probably won't work for the 8169S/8110S chips.
RealTek has sent me some sample NICs, but they haven't arrived yet.
I will probably need to add an rlgphy driver to handle the on-board
PHY in the 8169S/8110S (it needs special DSP initialization).
2003-09-08 02:11:25 +00:00
|
|
|
.Nd RealTek 8129/8139 fast ethernet device driver
|
1998-11-07 17:40:18 +00:00
|
|
|
.Sh SYNOPSIS
|
2002-05-30 11:47:19 +00:00
|
|
|
.Cd "device miibus"
|
2000-01-23 16:13:26 +00:00
|
|
|
.Cd "device rl"
|
1998-11-07 17:40:18 +00:00
|
|
|
.Sh DESCRIPTION
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
driver provides support for PCI ethernet adapters and embedded
|
|
|
|
controllers based on the RealTek 8129 and 8139 fast ethernet controller
|
2003-07-10 18:43:17 +00:00
|
|
|
chips, including the following:
|
|
|
|
.Pp
|
|
|
|
.Bl -bullet -compact -offset indent
|
|
|
|
.It
|
|
|
|
Allied Telesyn AT2550
|
|
|
|
.It
|
|
|
|
Farallon NetLINE 10/100 PCI
|
|
|
|
.It
|
2001-11-05 09:17:23 +00:00
|
|
|
Genius GF100TXR,
|
2003-07-10 18:43:17 +00:00
|
|
|
.It
|
|
|
|
NDC Communications NE100TX-E
|
|
|
|
.It
|
|
|
|
OvisLink LEF-8129TX
|
|
|
|
.It
|
|
|
|
OvisLink LEF-8139TX,
|
|
|
|
.It
|
|
|
|
Netronix Inc. EA-1210 NetEther 10/100
|
|
|
|
.It
|
|
|
|
KTX-9130TX 10/100 Fast Ethernet,
|
|
|
|
.It
|
|
|
|
Encore ENL832-TX 10/100 M PCI,
|
|
|
|
.It
|
|
|
|
Longshine LCS-8038TX-R
|
|
|
|
.It
|
|
|
|
SMC EZ Card 10/100 PCI 1211-TX
|
|
|
|
.It
|
|
|
|
Compaq HNE-300
|
|
|
|
.It
|
|
|
|
LevelOne FPC-0106TX
|
|
|
|
.It
|
|
|
|
Edimax EP-4103DL CardBus
|
|
|
|
.It
|
|
|
|
Nortel Networks 10/100BaseTX
|
|
|
|
.It
|
|
|
|
D-Link DFE-690TXD
|
|
|
|
.It
|
|
|
|
D-Link DFE-530TX+
|
|
|
|
.It
|
|
|
|
D-Link DFE-538TX (same as 530+?)
|
|
|
|
.It
|
|
|
|
Corega FEther CB-TXD
|
|
|
|
.It
|
|
|
|
Corega FEtherII CB-TXD
|
|
|
|
.It
|
|
|
|
Peppercon AG ROL-F
|
|
|
|
.It
|
|
|
|
Planex FNW-3800-TX
|
|
|
|
.It
|
|
|
|
Accton EN1207D
|
|
|
|
.It
|
|
|
|
GigaFast Ethernet EE100-AXP
|
|
|
|
.It
|
|
|
|
CompUSA no-name 10/100 PCI ethernet NIC
|
|
|
|
.It
|
|
|
|
Belkin F5D5000
|
|
|
|
.El
|
1998-11-07 17:40:18 +00:00
|
|
|
.Pp
|
2003-07-10 18:43:17 +00:00
|
|
|
The RealTek 8129/8139 series controllers use bus master DMA but do not use a
|
2000-03-01 14:50:24 +00:00
|
|
|
descriptor-based data transfer mechanism.
|
|
|
|
The receiver uses a
|
1998-11-07 17:40:18 +00:00
|
|
|
single fixed size ring buffer from which packets must be copied
|
2000-03-01 14:50:24 +00:00
|
|
|
into mbufs.
|
|
|
|
For transmission, there are only four outbound packet
|
1998-11-07 17:40:18 +00:00
|
|
|
address registers which require all outgoing packets to be stored
|
2000-03-01 14:50:24 +00:00
|
|
|
as contiguous buffers.
|
|
|
|
Furthermore, outbound packet buffers must
|
1998-11-07 17:40:18 +00:00
|
|
|
be longword aligned or else transmission will fail.
|
|
|
|
.Pp
|
1998-12-24 18:52:47 +00:00
|
|
|
The 8129 differs from the 8139 in that the 8139 has an internal
|
1998-11-07 17:40:18 +00:00
|
|
|
PHY which is controlled through special direct access registers
|
2000-03-01 14:50:24 +00:00
|
|
|
whereas the 8129 uses an external PHY via an MII bus.
|
|
|
|
The 8139
|
1998-11-07 17:40:18 +00:00
|
|
|
supports both 10 and 100Mbps speeds in either full or half duplex.
|
|
|
|
The 8129 can support the same speeds and modes given an appropriate
|
|
|
|
PHY chip.
|
|
|
|
.Pp
|
Take the support for the 8139C+/8169/8169S/8110S chips out of the
rl(4) driver and put it in a new re(4) driver. The re(4) driver shares
the if_rlreg.h file with rl(4) but is a separate module. (Ultimately
I may change this. For now, it's convenient.)
rl(4) has been modified so that it will never attach to an 8139C+
chip, leaving it to re(4) instead. Only re(4) has the PCI IDs to
match the 8169/8169S/8110S gigE chips. if_re.c contains the same
basic code that was originally bolted onto if_rl.c, with the
following updates:
- Added support for jumbo frames. Currently, there seems to be
a limit of approximately 6200 bytes for jumbo frames on transmit.
(This was determined via experimentation.) The 8169S/8110S chips
apparently are limited to 7.5K frames on transmit. This may require
some more work, though the framework to handle jumbo frames on RX
is in place: the re_rxeof() routine will gather up frames than span
multiple 2K clusters into a single mbuf list.
- Fixed bug in re_txeof(): if we reap some of the TX buffers,
but there are still some pending, re-arm the timer before exiting
re_txeof() so that another timeout interrupt will be generated, just
in case re_start() doesn't do it for us.
- Handle the 'link state changed' interrupt
- Fix a detach bug. If re(4) is loaded as a module, and you do
tcpdump -i re0, then you do 'kldunload if_re,' the system will
panic after a few seconds. This happens because ether_ifdetach()
ends up calling the BPF detach code, which notices the interface
is in promiscuous mode and tries to switch promisc mode off while
detaching the BPF listner. This ultimately results in a call
to re_ioctl() (due to SIOCSIFFLAGS), which in turn calls re_init()
to handle the IFF_PROMISC flag change. Unfortunately, calling re_init()
here turns the chip back on and restarts the 1-second timeout loop
that drives re_tick(). By the time the timeout fires, if_re.ko
has been unloaded, which results in a call to invalid code and
blows up the system.
To fix this, I cleared the IFF_UP flag before calling ether_ifdetach(),
which stops the ioctl routine from trying to reset the chip.
- Modified comments in re_rxeof() relating to the difference in
RX descriptor status bit layout between the 8139C+ and the gigE
chips. The layout is different because the frame length field
was expanded from 12 bits to 13, and they got rid of one of the
status bits to make room.
- Add diagnostic code (re_diag()) to test for the case where a user
has installed a broken 32-bit 8169 PCI NIC in a 64-bit slot. Some
NICs have the REQ64# and ACK64# lines connected even though the
board is 32-bit only (in this case, they should be pulled high).
This fools the chip into doing 64-bit DMA transfers even though
there is no 64-bit data path. To detect this, re_diag() puts the
chip into digital loopback mode and sets the receiver to promiscuous
mode, then initiates a single 64-byte packet transmission. The
frame is echoed back to the host, and if the frame contents are
intact, we know DMA is working correctly, otherwise we complain
loudly on the console and abort the device attach. (At the moment,
I don't know of any way to work around the problem other than
physically modifying the board, so until/unless I can think of a
software workaround, this will have do to.)
- Created re(4) man page
- Modified rlphy.c to allow re(4) to attach as well as rl(4).
Note that this code works for the sample 8169/Marvell 88E1000 NIC
that I have, but probably won't work for the 8169S/8110S chips.
RealTek has sent me some sample NICs, but they haven't arrived yet.
I will probably need to add an rlgphy driver to handle the on-board
PHY in the 8169S/8110S (it needs special DSP initialization).
2003-09-08 02:11:25 +00:00
|
|
|
Note: support for the 8139C+ chip is provided by the
|
|
|
|
.Xr re 4
|
|
|
|
driver.
|
2003-07-10 18:43:17 +00:00
|
|
|
.Pp
|
1998-11-07 17:40:18 +00:00
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
driver supports the following media types:
|
|
|
|
.Pp
|
|
|
|
.Bl -tag -width xxxxxxxxxxxxxxxxxxxx
|
|
|
|
.It autoselect
|
2000-03-01 14:50:24 +00:00
|
|
|
Enable autoselection of the media type and options.
|
|
|
|
This is only
|
1998-11-07 17:40:18 +00:00
|
|
|
supported if the PHY chip attached to the RealTek controller
|
2000-03-01 14:50:24 +00:00
|
|
|
supports NWAY autonegotiation.
|
|
|
|
The user can manually override
|
1998-11-07 17:40:18 +00:00
|
|
|
the autoselected mode by adding media options to the
|
|
|
|
.Pa /etc/rc.conf
|
1999-03-25 00:52:44 +00:00
|
|
|
file.
|
1998-11-07 17:40:18 +00:00
|
|
|
.It 10baseT/UTP
|
2000-03-01 14:50:24 +00:00
|
|
|
Set 10Mbps operation.
|
|
|
|
The
|
1998-11-07 17:40:18 +00:00
|
|
|
.Ar mediaopt
|
|
|
|
option can also be used to select either
|
|
|
|
.Ar full-duplex
|
|
|
|
or
|
2001-02-01 16:38:02 +00:00
|
|
|
.Ar half-duplex
|
|
|
|
modes.
|
1998-11-07 17:40:18 +00:00
|
|
|
.It 100baseTX
|
2000-03-01 14:50:24 +00:00
|
|
|
Set 100Mbps (fast ethernet) operation.
|
|
|
|
The
|
1998-11-07 17:40:18 +00:00
|
|
|
.Ar mediaopt
|
|
|
|
option can also be used to select either
|
|
|
|
.Ar full-duplex
|
|
|
|
or
|
|
|
|
.Ar half-duplex
|
|
|
|
modes.
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
driver supports the following media options:
|
|
|
|
.Pp
|
|
|
|
.Bl -tag -width xxxxxxxxxxxxxxxxxxxx
|
|
|
|
.It full-duplex
|
|
|
|
Force full duplex operation
|
|
|
|
.It half-duplex
|
|
|
|
Force half duplex operation.
|
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
Note that the 100baseTX media type is only available if supported
|
|
|
|
by the adapter.
|
|
|
|
For more information on configuring this device, see
|
|
|
|
.Xr ifconfig 8 .
|
|
|
|
.Sh DIAGNOSTICS
|
|
|
|
.Bl -diag
|
|
|
|
.It "rl%d: couldn't map memory"
|
|
|
|
A fatal initialization error has occurred.
|
|
|
|
.It "rl%d: couldn't map interrupt"
|
|
|
|
A fatal initialization error has occurred.
|
|
|
|
.It "rl%d: watchdog timeout"
|
|
|
|
The device has stopped responding to the network, or there is a problem with
|
|
|
|
the network connection (cable).
|
|
|
|
.It "rl%d: no memory for rx list"
|
|
|
|
The driver failed to allocate an mbuf for the receiver ring.
|
|
|
|
.It "rl%d: no memory for tx list"
|
1998-12-07 18:14:30 +00:00
|
|
|
The driver failed to allocate an mbuf for the transmitter ring when
|
1998-11-07 17:40:18 +00:00
|
|
|
allocating a pad buffer or collapsing an mbuf chain into a cluster.
|
|
|
|
.It "rl%d: chip is in D3 power state -- setting to D0"
|
|
|
|
This message applies only to adapters which support power
|
2000-03-01 14:50:24 +00:00
|
|
|
management.
|
|
|
|
Some operating systems place the controller in low power
|
1998-11-07 17:40:18 +00:00
|
|
|
mode when shutting down, and some PCI BIOSes fail to bring the chip
|
2000-03-01 14:50:24 +00:00
|
|
|
out of this state before configuring it.
|
|
|
|
The controller loses all of
|
1998-11-07 17:40:18 +00:00
|
|
|
its PCI configuration in the D3 state, so if the BIOS does not set
|
|
|
|
it back to full power mode in time, it won't be able to configure it
|
2000-03-01 14:50:24 +00:00
|
|
|
correctly.
|
|
|
|
The driver tries to detect this condition and bring
|
1998-11-07 17:40:18 +00:00
|
|
|
the adapter back to the D0 (full power) state, but this may not be
|
2000-03-01 14:50:24 +00:00
|
|
|
enough to return the driver to a fully operational condition.
|
|
|
|
If
|
1998-11-07 17:40:18 +00:00
|
|
|
you see this message at boot time and the driver fails to attach
|
|
|
|
the device as a network interface, you will have to perform second
|
|
|
|
warm boot to have the device properly configured.
|
|
|
|
.Pp
|
|
|
|
Note that this condition only occurs when warm booting from another
|
2000-03-01 14:50:24 +00:00
|
|
|
operating system.
|
|
|
|
If you power down your system prior to booting
|
1998-11-07 17:40:18 +00:00
|
|
|
.Fx ,
|
|
|
|
the card should be configured correctly.
|
|
|
|
.El
|
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr arp 4 ,
|
2003-02-15 17:12:53 +00:00
|
|
|
.Xr miibus 4 ,
|
2001-07-14 19:41:16 +00:00
|
|
|
.Xr netintro 4 ,
|
2000-05-04 17:40:13 +00:00
|
|
|
.Xr ng_ether 4 ,
|
|
|
|
.Xr ifconfig 8
|
1998-11-07 17:40:18 +00:00
|
|
|
.Rs
|
2003-07-10 18:43:17 +00:00
|
|
|
.%B The RealTek 8129, 8139 and 8139C+ datasheets
|
|
|
|
.%O http://www.realtek.com.tw
|
1998-11-07 17:40:18 +00:00
|
|
|
.Re
|
|
|
|
.Sh HISTORY
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
device driver first appeared in
|
|
|
|
.Fx 3.0 .
|
1999-08-15 10:48:36 +00:00
|
|
|
.Sh AUTHORS
|
1998-11-07 17:40:18 +00:00
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
driver was written by
|
|
|
|
.An Bill Paul Aq wpaul@ctr.columbia.edu .
|
|
|
|
.Sh BUGS
|
|
|
|
Since outbound packets must be longword aligned, the transmit
|
|
|
|
routine has to copy an unaligned packet into an mbuf cluster buffer
|
2000-03-01 14:50:24 +00:00
|
|
|
before transmission.
|
|
|
|
The driver abuses the fact that the cluster buffer
|
1998-11-07 17:40:18 +00:00
|
|
|
pool is allocated at system startup time in a contiguous region starting
|
2000-03-01 14:50:24 +00:00
|
|
|
at a page boundary.
|
|
|
|
Since cluster buffers are 2048 bytes, they are
|
|
|
|
longword aligned by definition.
|
|
|
|
The driver probably should not be
|
1998-11-07 17:40:18 +00:00
|
|
|
depending on this characteristic.
|
|
|
|
.Pp
|
2002-11-06 18:58:02 +00:00
|
|
|
The RealTek data sheets are of especially poor quality,
|
|
|
|
and there is a lot of information missing
|
|
|
|
particularly concerning the receiver operation.
|
|
|
|
One particularly
|
|
|
|
important fact that the data sheets fail to mention relates to the
|
|
|
|
way in which the chip fills in the receive buffer.
|
2000-03-01 14:50:24 +00:00
|
|
|
When an interrupt
|
1998-11-07 17:40:18 +00:00
|
|
|
is posted to signal that a frame has been received, it is possible that
|
|
|
|
another frame might be in the process of being copied into the receive
|
2000-03-01 14:50:24 +00:00
|
|
|
buffer while the driver is busy handling the first one.
|
|
|
|
If the driver
|
1998-11-07 17:40:18 +00:00
|
|
|
manages to finish processing the first frame before the chip is done
|
|
|
|
DMAing the rest of the next frame, the driver may attempt to process
|
|
|
|
the next frame in the buffer before the chip has had a chance to finish
|
|
|
|
DMAing all of it.
|
|
|
|
.Pp
|
|
|
|
The driver can check for an incomplete frame by inspecting the frame
|
2001-02-18 10:25:42 +00:00
|
|
|
length in the header preceding the actual packet data: an incomplete
|
2000-03-02 14:54:02 +00:00
|
|
|
frame will have the magic length of 0xFFF0.
|
|
|
|
When the driver encounters
|
1998-11-07 17:40:18 +00:00
|
|
|
this value, it knows that it has finished processing all currently
|
2000-03-01 14:50:24 +00:00
|
|
|
available packets.
|
2001-07-14 19:41:16 +00:00
|
|
|
Neither this magic value nor its significance are
|
1998-11-07 17:40:18 +00:00
|
|
|
documented anywhere in the RealTek data sheets.
|