#
259065 |
|
07-Dec-2013 |
gjb |
- Copy stable/10 (r259064) to releng/10.0 as part of the 10.0-RELEASE cycle. - Update __FreeBSD_version [1] - Set branch name to -RC1
[1] 10.0-CURRENT __FreeBSD_version value ended at '55', so start releng/10.0 at '100' so the branch is started with a value ending in zero.
Approved by: re (implicit) Sponsored by: The FreeBSD Foundation |
#
257617 |
|
04-Nov-2013 |
yongari |
MFC r257306: Add preliminary support for RTL8168EP. Approved by: re (delphij)
|
#
257615 |
|
04-Nov-2013 |
yongari |
MFC r257305: Add preliminary support for RTL8168G, RTL8168GU and RTL8411B. RTL8168GU has two variants(GMII and MII) but it uses the same chip revision id. Driver checks PCI device id of controller and sets internal capability flag(i.e. jumbo frame and link speed down in WOL). Approved by: re (delphij)
|
#
257610 |
|
04-Nov-2013 |
yongari |
MFC r256828: Add preliminary support for RTL8106E PCIe FastEthernet. Approved by: re (delphij)
|
#
257608 |
|
04-Nov-2013 |
yongari |
r256827: Correct MAC revision bits. Previously it always cleared bit 20 and bit 21. Approved by: re (delphij)
|
#
256281 |
|
10-Oct-2013 |
gjb |
Copy head (r256279) to stable/10 as part of the 10.0-RELEASE cycle.
Approved by: re (implicit) Sponsored by: The FreeBSD Foundation
|
#
245485 |
|
15-Jan-2013 |
yongari |
Add D-Link DFE-520TX rev C1.
Tested by: Ruslan Makhmatkhanov < cvs-src <> yandex dot ru > MFC After: 1 week
|
#
232145 |
|
25-Feb-2012 |
yongari |
Use correct Config registers for RTL8139 family. Unlike RTL8168 and RTL810x family , RTL8139 has different register map for Config registers.
While here, follow the lead of re(4) in WOL configuration. - Disable WOL_UCAST and WOL_MCAST capabilities by default. - Config5 register write does not need to unlock EEPROM access on RTL8139 family but unlocking EEPROM access does not affect its operation and make it consistent with re(4).
Reported by: Matt Renzelmann mjr <> cs dot wisc dot edu
|
#
227916 |
|
23-Nov-2011 |
yongari |
To save more power, switch to 10/100Mbps link when controller is put into suspend/shutdown. Old PCI controllers performed that operation in firmware but for RTL8111C or newer controllers, it's responsibility of driver. It's not clear whether the firmware of RTL8111B still downgrades its speed to 10/100Mbps so leave it as it was.
|
#
227914 |
|
23-Nov-2011 |
yongari |
Make sure to stop TX MAC before freeing queued TX frames. For RTL8111DP, check if the TX MAC is active by reading RL_GTXSTART register. For RTL8402/8168E-VL/8168F/8411, wait until TX queue is empty.
|
#
227639 |
|
17-Nov-2011 |
yongari |
Add preliminary support for RTL8168/8111F PCIe Gigabit ethernet.
H/W donated by: RealTek Semiconductor Corp.
|
#
227638 |
|
17-Nov-2011 |
yongari |
Add preliminary support for second generation RTL8105E PCIe FastEthernet.
H/W donated by: RealTek Semiconductor Corp.
|
#
227593 |
|
16-Nov-2011 |
yongari |
Disable PCIe ASPM (Active State Power Management) for all controllers. More and more RealTek controllers started to implement EEE feature. Vendor driver seems to load a kind of firmware for EEE with additional PHY fixups. It is known that the EEE feature may need ASPM support. Unfortunately there is no documentation for EEE of the controller so enabling ASPM may cause more problems.
|
#
227590 |
|
16-Nov-2011 |
yongari |
Add preliminary support for RTL8411 PCIe Gigabit ethernet with integrated card reader.
H/W donated by: RealTek Semiconductor Corp.
|
#
227587 |
|
16-Nov-2011 |
yongari |
Add preliminary support for RTL8402 PCIe FastEthernet with integrated card reader.
H/W donated by: RealTek Semiconductor Corp.
|
#
226995 |
|
01-Nov-2011 |
marius |
- Import the common MII bitbang'ing code from NetBSD and convert drivers to take advantage of it instead of duplicating it. This reduces the size of the i386 GENERIC kernel by about 4k. The only potential in-tree user left unconverted is xe(4), which generally should be changed to use miibus(4) instead of implementing PHY handling on its own, as otherwise it makes not much sense to add a dependency on miibus(4)/mii_bitbang(4) to xe(4) just for the MII bitbang'ing code. The common MII bitbang'ing code also is useful in the embedded space for using GPIO pins to implement MII access. - Based on lessons learnt with dc(4) (see r185750), add bus barriers to the MII bitbang read and write functions of the other drivers converted in order to ensure the intended ordering. Given that register access via an index register as well as register bank/window switching is subject to the same problem, also add bus barriers to the respective functions of smc(4), tl(4) and xl(4). - Sprinkle some const.
Thanks to the following testers: Andrew Bliznak (nge(4)), nwhitehorn@ (bm(4)), yongari@ (sis(4) and ste(4)) Thanks to Hans-Joerg Sirtl for supplying hardware to test stge(4).
Reviewed by: yongari (subset of drivers) Obtained from: NetBSD (partially)
|
#
224506 |
|
29-Jul-2011 |
yongari |
Add new device id of D-Link DGE-530T Rev. C controller. DGE-503T Rev A1 and B1 is supported by sk(4) but the DGE-530T Rev. C controller is re-branded RealTek 8169 controller.
PR: kern/159116 Approved by: re (kib)
|
#
218760 |
|
16-Feb-2011 |
yongari |
Add initial support for RTL8401E PCIe Fast Ethernet.
PR: 154789
|
#
217911 |
|
26-Jan-2011 |
yongari |
Add support for RTL8105E PCIe Fast Ethernet controller. It seems the controller has a kind of embedded controller/memory and vendor applies a large set of magic code via undocumented PHY registers in device initialization stage. I guess it's a firmware image for the embedded controller in RTL8105E since the code is too big compared to other DSP fixups. However I have no idea what that magic code does and what's purpose of the embedded controller. Fortunately driver seems to still work without loading the firmware.
While I'm here change device description of RTL810xE controller.
H/W donated by: Realtek Semiconductor Corp.
|
#
217902 |
|
26-Jan-2011 |
yongari |
Do not use interrupt taskqueue on controllers with MSI/MSI-X capability. One of reason using interrupt taskqueue in re(4) was to reduce number of TX/RX interrupts under load because re(4) controllers have no good TX/RX interrupt moderation mechanism. Basic TX interrupt moderation is done by hardware for most controllers but RX interrupt moderation through undocumented register showed poor RX performance so it was disabled in r215025. Using taskqueue to handle RX interrupt greatly reduced number of interrupts but re(4) consumed all available CPU cycles to run the taskqueue under high TX/RX network load. This can happen even with RTL810x fast ethernet controller and I believe this is not acceptable for most systems.
To mitigate the issue, use one-shot timer register to moderate RX interrupts. The timer register provides programmable one-shot timer and can be used to suppress interrupt generation. The timer runs at 125MHZ on PCIe controllers so the minimum time allowed for the timer is 8ns. Data sheet says the register is 32 bits but experimentation shows only lower 13 bits are valid so maximum time that can be programmed is 65.528us. This yields theoretical maximum number of RX interrupts that could be generated per second is about 15260. Combined with TX completion interrupts re(4) shall generate less than 20k interrupts. This number is still slightly high compared to other intelligent ethernet controllers but system is very responsive even under high network load.
Introduce sysctl variable dev.re.%d.int_rx_mod that controls amount of time to delay RX interrupt processing in units of us. Value 0 completely disables RX interrupt moderation. To provide old behavior for controllers that have MSI/MSI-X capability, introduce a new tunable hw.re.intr_filter. If the tunable is set to non-zero value, driver will use interrupt taskqueue. The default value of the tunable is 0. This tunable has no effect on controllers that has no MSI/MSI-X capability or if MSI/MSI-X is explicitly disabled by administrator.
While I'm here cleanup interrupt setup/teardown since re(4) uses single MSI/MSI-X message at this moment.
|
#
217868 |
|
25-Jan-2011 |
yongari |
Remove TX taskqueue and directly invoke re_start in interrupt task.
|
#
217857 |
|
25-Jan-2011 |
yongari |
Prefer MSI-X to MSI on controllers that support MSI-X. All recent PCIe controllers(RTL8102E or later and RTL8168/8111C or later) supports either 2 or 4 MSI-X messages. Unfortunately vendor did not publicly release RSS related information yet. However switching to MSI-X is one-step forward to support RSS.
|
#
217524 |
|
17-Jan-2011 |
yongari |
Change model names of controller RTL_HWREV_8168_SPIN[123] to real ones. s/RL_HWREV_8168_SPIN1/RL_HWREV_8168B_SPIN1/g s/RL_HWREV_8168_SPIN2/RL_HWREV_8168B_SPIN2/g s/RL_HWREV_8168_SPIN3/RL_HWREV_8168B_SPIN3/g No functional changes.
|
#
217499 |
|
17-Jan-2011 |
yongari |
Implement initial jumbo frame support for RTL8168/8111 C/D/E PCIe GbE controllers. It seems these controllers no longer support multi-fragmented RX buffers such that driver have to allocate physically contiguous buffers.
o Retire RL_FLAG_NOJUMBO flag and introduce RL_FLAG_JUMBOV2 to mark controllers that use new jumbo frame scheme. o Configure PCIe max read request size to 4096 for standard frames and reduce it to 512 for jumbo frames. o TSO/checksum offloading is not supported for jumbo frames on these controllers. Reflect it to ioctl handler and driver initialization. o Remove unused rl_stats_no_timeout in softc. o Embed a pointer to structure rl_hwrev into softc to keep track of controller MTU limitation and remove rl_hwrev in softc since that information is available through a pointer to structure rl_hwrev.
Special thanks to Realtek for donating sample hardwares which made this possible.
H/W donated by: Realtek Semiconductor Corp.
|
#
217498 |
|
17-Jan-2011 |
yongari |
Add initial support for RTL8168E/8111E-VL PCIe GbE.
H/W donated by: Realtek Semiconductor Corp.
|
#
217246 |
|
10-Jan-2011 |
yongari |
Implement TSO on RealTek RTL8168/8111 C or later controllers. RealTek changed TX descriptor format for later controllers so these controllers require MSS configuration in different location of TX descriptor. TSO is enabled by default for controllers that use new descriptor format. For old controllers, TSO is still disabled by default due to broken frames under certain conditions but users can enable it. Special thanks to Hayes Wang at RealTek.
MFC after: 2 weeks
|
#
215020 |
|
08-Nov-2010 |
yongari |
Remove standard PCI configuration space register definitions.
|
#
215019 |
|
08-Nov-2010 |
yongari |
Remove trailing white spaces.
|
#
215018 |
|
08-Nov-2010 |
yongari |
Consistently use tab character instead of using space character. No functional changes.
|
#
215017 |
|
08-Nov-2010 |
yongari |
Follow the lead of vendor's interrupt moderation mechanism. It seems RTL8169/RTL8168/RTL810xE has a kind of interrupt moderation mechanism but it is not documented at all. The magic value dramatically reduced number of interrupts without noticeable performance drops so apply it to all RTL8169/RTL8169 controllers. Vendor's FreeBSD driver also applies it to RTL810xE controllers but their Linux driver explicitly cleared the register, so do not enable interrupt moderation for RTL810xE controllers.
While I'm here sort 8169 specific registers.
Obtained from: RealTek FreeBSD driver
|
#
214844 |
|
05-Nov-2010 |
yongari |
Add simple MAC statistics counter reading support. Unfortunately useful counters like rl_missed_pkts is 16 bits quantity which is too small to hold meaningful information happened in a second. This means driver should frequently read these counters in order not to lose accuracy and that approach is too inefficient in driver's view. Moreover it seems there is no way to trigger an interrupt to detect counter near-full or wraparound event as well as lacking clearing the MAC counters. Another limitation of reading the counters from RealTek controllers is lack of interrupt firing at the end of DMA cycle of MAC counter read request such that driver have to poll the end of the DMA which is a time consuming process as well as inefficient. The more severe issue of the MAC counter read request is it takes too long to complete the DMA. All these limitation made maintaining MAC counters in driver impractical. For now, just provide simple sysctl interface to trigger reading the MAC counters. These counters could be used to track down driver issues. Users can read MAC counters maintained in controller with the following command. #sysctl dev.re.0.stats=1
While I'm here add check for validity of dma map and allocated memory before unloading/freeing them.
Tested by: rmacklem
|
#
206436 |
|
09-Apr-2010 |
yongari |
Consistently use capital letters.
|
#
206433 |
|
09-Apr-2010 |
yongari |
Add preliminary support for 8168E/8111E PCIe controller. While I'm here simplify device description string.
Tested by: Michael Beckmann < michael <> apfel dot de > MFC after: 5 days
|
#
203082 |
|
27-Jan-2010 |
yongari |
Add initial support for RTL8103E PCIe fastethernet.
PR: kern/142974
|
#
196516 |
|
24-Aug-2009 |
yongari |
Add RTL8168DP/RTL8111DP device id. While I'm here append "8111D" to the description of RTL8168D as RL_HWREV_8168D can be either RTL8168D or RTL8111D.
PR: kern/137672 MFC after: 3 days
|
#
195675 |
|
14-Jul-2009 |
avatar |
Adding hardware ID for RTL810x PCIe found on HP Pavilion DV2-1022AX.
Reviewed by: yongari Approved by: re (kib, kensmith)
|
#
191301 |
|
20-Apr-2009 |
yongari |
For RTL8139C+ controllers, have controller handle padding short checksum offload frames. Software workaround used for broken controllers(RTL8169, RTL8168, RTL8168B) seem to cause watchdog timeouts on RTL8139C+. Introduce a new flag RL_FLAG_AUTOPAD to mark automatic padding feature of controller and set it for RTL8139C+ and controllers that use new descriptor format. This fixes watchdog timeouts seen on RTL8139C+.
Reported by: Dimitri Rodis < DimitriR <> integritasystems dot com > Tested by: Dimitri Rodis < DimitriR <> integritasystems dot com >
|
#
188474 |
|
10-Feb-2009 |
yongari |
Allocating 2 MSI messages do not seem to work on certain controllers so use just 1 MSI message. This fixes regression introduced in r188381.
Tested by: many
|
#
187483 |
|
20-Jan-2009 |
jkim |
- Add support for 8110SCe part. Some magic registers were taken from Linux driver. - Swap hardware revisions for 8110S and 8169S as Linux driver claims.
Reviewed by: yongari (early version)
|
#
187482 |
|
20-Jan-2009 |
jkim |
Retire RL_FLAG_INVMAR bit to match its comment and reality.
|
#
187417 |
|
19-Jan-2009 |
yongari |
Sometimes RTL8168B seems to take long time to access GMII registers in device attach phase. Double GMII register access timeout value to fix the issue.
Reported by: wkoszek Tested by: wkoszek
|
#
186214 |
|
17-Dec-2008 |
yongari |
It seems that RealTek PCIe controllers require an explicit Tx poll command whenever Tx completion interrupt is raised. The Tx poll bit is cleared when all packets waiting to be transferred have been processed. This means the second Tx poll command can be silently ignored as the Tx poll bit could be still active while processing of previous Tx poll command is in progress. To address the issue re(4) used to invoke the Tx poll command in Tx completion handler whenever it detects there are pending packets in TxQ. However that still does not seem to completely eliminate watchdog timeouts seen on RealTek PCIe controllers. To fix the issue kick Tx poll command only after Tx completion interrupt is raised as this would indicate Tx is now idle state such that it can accept new Tx poll command again. While here apply this workaround for PCIe based controllers as other controllers does not seem to have this limitation.
Tested by: Victor Balada Diaz < victor <> bsdes DOT net >
|
#
186210 |
|
17-Dec-2008 |
yongari |
For RTL8168C SPIN2 controllers, make sure to take the controller out of sleep mode prior to accessing to PHY. This should fix device attach failure seen on these controllers. Also enable the sleep mode when device is put into sleep state.
PR: kern/123123, kern/123053
|
#
185903 |
|
11-Dec-2008 |
yongari |
Make WOL work on RTL8168B. This controller seems to require explicit command to enable Rx MAC prior to entering D3.
Tested by: Cyrus Rahman <crahman <> gmail DOT com>
|
#
185901 |
|
10-Dec-2008 |
yongari |
Don't access undocumented register 0x82 on controllers that have no such register. While here clear undocumented PHY register 0x0B for RTL8110S.
Obtained from: RealTek FreeBSD driver
|
#
185900 |
|
10-Dec-2008 |
yongari |
Newer RealTek controllers requires setting stop request bit to terminate active Tx/Rx operation.
|
#
185753 |
|
08-Dec-2008 |
yongari |
o Implemented miibus_statchg handler. It detects whether re(4) established a valid link or not. In miibus_statchg handler add a check for established link is valid one for the controller(e.g. 1000baseT is not a valid link for fastethernet controllers.) o Added a flag RE_FLAG_FASTETHER to mark fastethernet controllers. o Added additional check to know whether we've really encountered watchdog timeouts or missed Tx completion interrupts. This change may help to track down the cause of watchdog timeouts. o In interrupt handler, removed a check for link state change interrupt. Not all controllers have the bit and re(4) did not rely on the event for a long time. In addition, re(4) didn't request the interrupt in RL_IMR register.
Tested by: rpaulo
|
#
185542 |
|
02-Dec-2008 |
yongari |
Add 8168D support.
Submitted by: Andrew < andrewwtulloch <> gmail DOT com >
|
#
184559 |
|
02-Nov-2008 |
imp |
Make RL_TWISTER_ENABLE a tunable/sysctl. Eliminate it as an option. Fix module build.
Submitted by: Kostik Belousov
|
#
184515 |
|
31-Oct-2008 |
imp |
Add RL_TWISTER_ENABLE option. This enables the magic bits to do long cable tuning. This has helped in some installations for hardware deployed by a former employer. Made optional because the lists aren't full of complaints about these cards... even when they were wildly popular.
Reviewed by: attilio@, jhb@, trhodes@ (all an older version of the patch)
|
#
184240 |
|
25-Oct-2008 |
yongari |
Various bus_dma(9) fixes. - The hardware does not support DAC so limit DMA address space to 4GB. - Removed BUS_DMA_ALLOC_NOW flag. - Created separated Tx buffer and Rx buffer DMA tags. Previously it used to single DMA tag and it was not possible to specify different DMA restrictions. - Apply 4 bytes alignment limitation of Tx buffer. - Apply 8 bytes alignment limitation of Rx buffer. - Tx side bus_dmamap_load_mbuf_sg(9) support. - Preallocate Tx DMA maps as creating DMA maps take very long time on architectures that require real DMA maps. - Adjust guard buffer size to 1522 + 8 as it should include VLAN and additional reserved bytes in Rx buffer. - Plug memory leak in device detach. Previously wrong buffer address was used to free allocated memory. - Added rl_list_rx_init() to clear Rx buffer and cleared the buffer. - Don't destroy DMA maps in rl_txeof() as the DMA map should be reused. There is no reason to destroy/recreate the DMA maps in this driver. - Removed rl_dma_map_rxbuf()/rl_dma_map_txbuf() callbacks. - The hardware does not support descriptor based DMA on Tx side and the Tx buffer address should be aligned on 4 bytes boundary as well as manual padding for short frames. Because of this hardware limitation rl(4) always used to invoke m_defrag(9) to get a 4 bytes aligned single buffer. However m_defrag(9) takes a lot of CPU cycles on slow machines and not all packets need the help of m_defrag(9). Armed with the information, don't invoke m_defrag(9) if the following conditions are true. 1. Buffer is not fragmented. 2. Buffer is aligned on 4 bytes boundary. 3. Manual padding is not necessary. 4. Or padding is necessary but upper stack passed a writable buffer and the space needed for padding is satisfied. This change combined with preallocated DMA maps greatly increased Tx performance of driver on sparc64. - Moved bus_dmamap_sync(9) in rl_start_locked() to rl_encap() and corrected memory synchronization operation specifier of bus_dmamap_sync(9). - Removed bus_dmamap_unload(9) in rl_stop(). There is no need to reload/unload Rx buffer as rl(4) always have to copy from the buffer. It just needs proper bus_dmamap_sync(9) calls before copying the received frame.
With this change rl(4) should work on systems with more than 4GB memory.
PR: kern/128143
|
#
181270 |
|
04-Aug-2008 |
yongari |
The number of bits reserved for MSS in RealTek controllers is 11bits. This limits the maximum interface MTU size in TSO case as upper stack should not generate TCP segments with MSS greater than the limit. Armed with this information, disable TSO if interface MTU is greater than the limit.
|
#
180377 |
|
08-Jul-2008 |
yongari |
Add driver support for RTL8102E and RTL8102EL which is the second generation of RTL810x PCIe fast ethernet controller. Note, Tx/Rx descriptor format is different from that of first generation of RTL8101E series. Jumbo frame is not supported for RTL810x family.
Tested by: NAGATA Shinya ( maya AT negeta DOT com )
|
#
180177 |
|
02-Jul-2008 |
yongari |
Add a new RTL8169 variant, 8169SB(L)/8110SB(L).
Reported by: nork Tested by: nork
|
#
180176 |
|
02-Jul-2008 |
yongari |
Add basic support for RTL8168C, RTL8168CP, RTL8111C and RTL8111CP. ATM Tx/Rx checksum offload is supported but TSO and jumbo frame is not yet supported. Because these newer controllers use different descriptor formats, a flag RL_FLAG_DESCV2 flag was introduced to handle that case in Tx/Rx handler. Also newer controllers seems to require to not touch 'enable Tx/Rx bit' in RL_CPLUS_CMD register so don't blindly try to set that bits.
Note, it seems that there is still power-saving related issue where driver fails to attach PHY. Rebooting seems to fix that issue but number of required reboots varys.
Many thanks to users that helped during developement. I really appreciate their patient and test/feedbacks.
|
#
180171 |
|
02-Jul-2008 |
yongari |
Instead of allocating variables for each events/hardware flags, use a dedicated flag that represents controller capabilities/events. This will simplify many part of code that requires different workaround for each controller revisions and will enhance readability. While I'm here move PHY wakeup code up before mii_phy_probe() which seems to help to wake PHY in some cases.
|
#
180169 |
|
02-Jul-2008 |
yongari |
Switch to memory space register mapping over IO space. If that mapping fails fall back to traditional IO space access.
|
#
179831 |
|
16-Jun-2008 |
remko |
Add another 8139D variant.
PR: 124622 Submitted by: Evgeny Zhirnov <jirnov at gmail dot com> Approved by: imp (mentor, implicit) MFC after: 3 days
|
#
177771 |
|
31-Mar-2008 |
yongari |
Padding more bytes than necessary one broke another variants of PCIe RealTek chips. Only pad IP packets if the payload is less than 28 bytes.
Obtained from: NetBSD PR: kern/122221
|
#
177522 |
|
23-Mar-2008 |
yongari |
For MSI capable hardwares, enable MSI enable bit in RL_CFG2 register. If MSI was disabled by hw.re.msi_disable tunable expliclty clear the MSI enable bit.
|
#
176756 |
|
03-Mar-2008 |
yongari |
Don't allow jumbo frame on 8139C+ controller. While I'm here add a check for minimal MTU length.
|
#
176754 |
|
03-Mar-2008 |
yongari |
Implement WOL.
Tested by: Fabian Keil ( freebsd-listen AT fabienkeli DOT de )
|
#
175337 |
|
14-Jan-2008 |
yongari |
Overhaul re(4). o Increased number of Rx/Tx descriptors to 256 for 8169 GigEs because it's hard to push the hardware to the limit with default 64 descriptors. TSO requires large number of Tx descriptors to pass a full sized TCP segment(65535 bytes IP packet) to hardware. Previously it consumed 32 Tx descriptors, assuming MCLBYTES DMA segment size, to send the TCP segment which means re(4) couldn't queue more than two full sized IP packets. For 8139C+ it still uses 64 Rx/Tx descriptors due to its hardware limitations. With this changes there are (very) small waste of memory for 8139C+ users but I don't think it would affect 8139C+ users for most cases. o Various bus_dma(9) fixes. - The hardware supports DAC so allow 64bit DMA operations. - Removed BUS_DMA_ALLOC_NOW flag. - Increased DMA segment size to 4096 from MCLBYTES because TSO consumes too many descriptors with MCLBYTES DMA segment size. - Tx/Rx side bus_dmamap_load_mbuf_sg(9) support. With these changes the code is more readable than previous one and got a (slightly) better performance as it doesn't need to pass/ decode arguments to/from callback function. - Removed unnecessary callback function re_dmamap_desc() and nuked rl_dmaload_arg structure which was used in the callback. - Additional protection for DMA map load failure. In case of failure reuse current map instead of returning a bogus DMA map. - Deferred DMA map unloading/sync operation for maximum performance until we really need to load new DMA map. If we happen to reuse current map(e.g. input error) there is no need to sync/unload/load again. - The number of allowable Tx DMA segments for a mbuf chains are now 32 instead of magic nseg value. If the number of available Tx descriptors are short enough to send highly fragmented mbuf chains an optimized re_defrag() is called to collapse mbuf chains which is supposed to be much faster than m_defrag(9). re_defrag() was borrowed from ath(4). - Separated Rx/Tx DMA tag from a common DMA tag such that Rx DMA tag correctly uses DMA maps that were created with DMA alignment restriction(8bytes alignments). Tx DMA tag does not have such alignment limitation. - Added additional sanity checks for DMA ring map load failure. - Added additional spare Rx DMA map for graceful handling of Rx DMA map load failure. - Fixed misused bus_dmamap_sync(9) and added missing bus_dmamap_sync(9) in re_encap()/re_txeof()/re_rxeof(). o Enabled TSO again as re(4) have reasonable number of Tx descriptors. o Don't touch DMA address of a Tx descriptor in re_txeof(). It's not needed. o Fix incorrect update of if_ierrors counter. For Rx buffer shortage it should update if_qdrops as the buffer is reused. o Added checks for unsupported H/W revisions and return ENXIO for these hardwares. This is required to remove resource allocation code in re_probe as other drivers do in device probe routine. o Modified descriptor index manipulation macros as it's now possible to have different number of descriptors for Rx/Tx. o In re_start, to save a lock operation, use IFQ_DRV_IS_EMPTY before trying to invoke IFQ_DRV_DEQUEUE. Also don't blindly call re_encap since we already know the number of available Tx descriptors in advance. o Removed RL_TX_DESC_THLD which was used to reserve RL_TX_DESC_THLD descriptors in Tx path. There is no such a limitation mentioned in 8139C+/8169/8110/8168/8101/8111 datasheet and it seems to work ok without reserving RL_TX_DESC_THLD descriptors. o Fix a comment for RL_GTXSTART. The register is 8bits register. o Added comments for 8169/8139C+ hardware restrictions on descriptors. o Removed forward declaration for "struct rl_softc", it's not needed. o Added a new structure rl_txdesc for Tx descriptor managements and a structure rl_rxdesc for Rx descriptor managements. o Removed unused member variable rl_intlock in driver softc. There are still several unused member variables which are supposed to be used to access hardware statistics counters. But it seems that accessing hardware counters were not implemented yet.
|
#
174428 |
|
07-Dec-2007 |
yongari |
Add another RTL8168 revision 3 which is found on RTL8111-GR Gigabit Ethernet Controller. Multicast filtering wasn't tested and needs more expore. While I'm here change complex if statements with switch statement which would improve readability.
Reported by: Abdullah Ibn Hamad Al-Marri < wearabnet AT yahoo DOT ca > Tested by: Abdullah Ibn Hamad Al-Marri < wearabnet AT yahoo DOT ca >
|
#
173948 |
|
26-Nov-2007 |
remko |
Add the FNW3603TX Planex NIC.
PR: 76081 Approved by: imp (mentor) Submitted by: umi at pocke dot org MFC After: 3 days
|
#
171560 |
|
23-Jul-2007 |
yongari |
Add MSI support. Ever since switching to adaptive polling re(4) occasionally spews watchdog timeouts on systems with MSI capability. This change is minimal one for supporting MSI and re(4) also needs MSIX support for RTL8111C in future. Because softc structure of re(4) is shared with rl(4), rl(4) was touched to use the modified softc.
Reported by: cnst Tested by: cnst Approved by: re (kensmith)
|
#
171263 |
|
05-Jul-2007 |
yongari |
re(4) devices requires an external EEPROM. Depending on models it would be 93C46(1Kbit) or 93C56(2Kbit). One of differences between them is number of address lines required to access the EEPROM. For example, 93C56 EEPROM needs 8 address lines to read/write data. If 93C56 recevied premature end of required number of serial clock(CLK) to set OP code/address of EEPROM, the result would be unexpected behavior. Previously it tried to detect 93C46, which requires 6 address lines, and then assumed it would be 93C56 if read data was not expected value. However, this approach didn't work in some models/situations as 93C56 requries 8 address lines to access its data. In order to fix it, change EEPROM probing order such that 93C56 is detected reliably.
While I'm here change hard-coded address line numbers with defined constant to enhance readability.
PR: 112710 Approved by: re (mux)
|
#
168828 |
|
17-Apr-2007 |
yongari |
Don't reinitialize the hardware if only PROMISC flag was changed. Previously whenever PROMISC mode turned on/off link renegotiation occurs and it could resulted in network unavailability for serveral seconds.(Depending on switch STP settings it could last several tens seconds.)
Reported by: Prokofiev S.P. < proks AT logos DOT uptel DOT net > Tested by: Prokofiev S.P. < proks AT logos DOT uptel DOT net >
|
#
166057 |
|
16-Jan-2007 |
marius |
o In re_newbuf() and re_encap() if re_dma_map_desc() aborts the mapping operation as it ran out of free descriptors or if there are too many segments in the first place, call bus_dmamap_unload() in order to unload the already loaded segments. For trying to map the defragmented mbuf (chain) in re_encap() this introduces re_dma_map_desc() setting arg.rl_maxsegs to 0 as a new failure mode. Previously we just ignored this case, corrupting our view of the TX ring. o In re_txeof(): - Don't clear IFF_DRV_OACTIVE unless there are at least 4 free TX descriptors. Further down the road re_encap() will bail if there aren't at least 4 free TX descriptors, causing re_start() to abort and prepend the dequeued mbuf again so it makes no sense to pretend we could process mbufs again when in fact we won't. While at it replace this magic 4 with a macro RL_TX_DESC_THLD throughout this driver. - Don't cancel the watchdog timeout as soon as there's at least one free TX descriptor but instead only if all descriptors have been handled. It's perfectly normal, especially in the DEVICE_POLLING case, that re_txeof() is called when only a part of the enqueued TX descriptors have been handled, causing the watchdog to be disarmed prematurely. o In re_encap(): - If m_defrag() fails just drop the packet like other NIC drivers do. This should only happen when there's a mbuf shortage, in which case it was possible to end up with an IFQ full of packets which couldn't be processed as they couldn't be defragmented as they were taking up all the mbufs themselves. This includes adjusting re_start() to not trying to prepend the mbuf (chain) if re_encap() has freed it. - Remove dupe initialization of members of struct rl_dmaload_arg to values that didn't change since trying to process the fragmented mbuf chain. While at it remove an unused member from struct rl_dmaload_arg. o In re_start() remove a abandoned, banal comment. The corresponding code was moved to re_attach() some time ago.
With these changes re(4) now survives one day (until stopped) of hammering out packets here.
Reviewed by: yongari MFC after: 2 weeks
|
#
164811 |
|
01-Dec-2006 |
ru |
if_watchdog -> rl_watchdog
|
#
164463 |
|
21-Nov-2006 |
yongari |
Add TSO support.
Tested by: wilko, Pieter de Goeje < pieter AT degoeje DOT nl >
|
#
164460 |
|
21-Nov-2006 |
yongari |
Use #ifndef __NO_STRICT_ALIGNMENT rather than #if !defined(__i386__) && !defined(__amd64__) for architectures with alignment constraints.
|
#
160883 |
|
01-Aug-2006 |
wpaul |
Another small update to the re(4) driver:
- Change the workaround for the autopad/checksum offload bug so that instead of lying about the map size, we actually create a properly padded mbuf and map it as usual. The other trick works, but is ugly. This approach also gives us a chance to zero the pad space to avoid possibly leaking data.
- With the PCIe devices, it looks issuing a TX command while there's already a transmission in progress doesn't have any effect. In other words, if you send two packets in rapid succession, the second one may end up sitting in the TX DMA ring until another transmit command is issued later in the future. Basically, if re_txeof() sees that there are still descriptors outstanding, it needs to manually resume the TX DMA channel by issuing another TX command to make sure all transmissions are flushed out. (The PCI devices seem to keep the TX channel moving until all descriptors have been consumed. I'm not sure why the PCIe devices behave differently.)
(You can see this issue if you do the following test: plug an re(4) interface into another host via crossover cable, and from the other host do 'ping -c 2 <host with re(4) NIC>' to prime the ARP cache, then do 'ping -c 1 -s 1473 <host with re(4) NIC>'. You're supposed to see two packets sent in response, but you may only see one. If you do 'ping -c 1 -s 1473 <host with re(4) NIC>' again, you'll see two packets, but one will be the missing fragment from the last ping, followed by one of the fragments from this ping.)
- Add the PCI ID for the US Robotics 997902 NIC, which is based on the RTL8169S.
- Add a tsleep() of 1 second in re_detach() after the interrupt handler is disconnected. This should allow any tasks queued up by the ISR to drain. Now, I know you're supposed to use taskqueue_drain() for this, but something about the way taskqueue_drain() works with taskqueue_fast queues doesn't seem quite right, and I refuse to be tricked into fixing it.
|
#
160843 |
|
30-Jul-2006 |
wpaul |
Fix the following bugs in re(4)
- Correct the PCI ID for the 8169SC/8110SC in the device list (I added the macro for it to if_rlreg.h before, but forgot to use it.)
- Remove the extra interrupt spinlock I added previously. After giving it some more thought, it's not really needed.
- Work around a hardware bug in some versions of the 8169. When sending very small IP datagrams with checksum offload enabled, a conflict can occur between the TX autopadding feature and the hardware checksumming that can corrupt the outbound packet. This is the reason that checksum offload sometimes breaks NFS: if you're using NFS over UDP, and you're very unlucky, you might find yourself doing a fragmented NFS write where the last fragment is smaller than the minimum ethernet frame size (60 bytes). (It's rare, but if you keep NFS running long enough it'll happen.) If checksum offload is enabled, the chip will have to both autopad the fragment and calculate its checksum header. This confuses some revs of the 8169, causing the packet that appears on the wire to be corrupted. (The IP addresses and the checksum field are mangled.) This will cause the NFS write to fail. Unfortunately, when NFS retries, it sends the same write request over and over again, and it keeps failing, so NFS stays wedged.
(A simple way to provoke the failure is to connect the failing system to a network with a known good machine and do "ping -s 1473 <badhost>" from the good system. The ping will fail.)
Someone had previously worked around this using the heavy-handed approahch of just disabling checksum offload. The correct fix is to manually pad short frames where the TCP/IP stack has requested checksum offloading. This allows us to have checksum offload turned on by default but still let NFS work right.
- Not a bug, but change the ID strings for devices with hardware rev 0x30000000 and 0x38000000 to both be 8168B/8111B. According to RealTek, they're both the same device, but 0x30000000 is an earlier silicon spin.
|
#
160008 |
|
28-Jun-2006 |
wpaul |
Properly detect the RTL8168(B?) again. RealTek sent me a bunch of sample cards: the chips are all marked "RTL8111B", but they put stickers on the back that say "RTL8168B/8111B". The manual says there's only one HWREV code for both the 8111B and 8168B devices, which is 0x30000000, but the cards they sent me actually report HWREV of 0x38000000. Deciding to trust the hardware in front of me rather than a possibly incorrect manual (it wouldn't be the first time the HWREVs were incorrectly documented), I changed the 8168 revision code. It turns out this was a mistake though: 0x30000000 really is a valid for the 8168.
There are two possible reasons for there to be two different HWREVs:
1) 0x30000000 is used only for the 8168B and 0x38000000 is only for the 8111B. 2) There were 8111/8168 rev A devices which both used code 0x30000000, and the 8111B/8168B both use 0x38000000.
The product list on the RealTek website doesn't mention the existence of any 8168/8111 rev A chips being in production though, and I've never seen one, so until I get clarification from RealTek, I'm going to assume that 0x30000000 is just for the 8168B and 0x38000000 is for the 8111B only.
So, the HWREV code for the 8168 has been put back to 0x30000000, a new 8111 HWREV code has been added, and there are now separate entries for recognizing both devices in the device list. This will allow all devices to work, though if it turns out I'm wrong I may need to change the ID strings
|
#
159962 |
|
26-Jun-2006 |
wpaul |
Add support for the RealTek 8169SC/8110SC and RTL8101E devices. The latter is a PCIe 10/100 chip.
Finally fix the EEPROM reading code so that we can access the EEPROMs on all devices. In order to access the EEPROM, we must select 'EEPROM programming' mode, and then set the EEPROM chip select bit. Previously, we were setting both bits simultaneously, which doesn't work: they must be set in the right sequence.
Always obtain the station address from the EEPROM, now that EEPROM reading works correctly.
Make the TX interrupt moderation code based on the internal timer optional and turned off by default.
Make the re_diag() routine conditional and off by default. When it is on, only use it for the original 8169, which was the only device that that really needed it.
Modify interrupt handling to use a fast interrupt handler and fast taskqeueue.
Correct the rgephy driver so that it only applies the DSP fixup for PHY revs 0 and 1. Later chips are fixed and don't need the fixup.
Make the rgephy driver advertise both 1000_FD and 1000_HD bits in autoneg mode. A couple of the devices don't autoneg correctly unless configured this way.
|
#
158878 |
|
24-May-2006 |
glebius |
Rename device name in the last commit. According to PR, the ID is more likely to belong to chips of 8168 family.
PR: kern/96734 Submitted by: Sven Petai <hadara bsd.ee>
|
#
156988 |
|
22-Mar-2006 |
glebius |
Add support for RTL8111B chip, that can be found on some mainboards, for example ASUS P5PL2.
Tested by: Vadim Frolov <vadim uch.net>
|
#
151341 |
|
14-Oct-2005 |
jhb |
Only allow the sk(4) driver to attach to revision 2 of the LinkSys EG1032 cards and teach the re(4) driver to attach to revision 3 cards.
Submitted by: Fredrik Lindberg fli+freebsd-current at shapeshifter dot se MFC after: 2 weeks Reviewed by: imp, mdodd
|
#
150720 |
|
29-Sep-2005 |
jhb |
- Use if_printf() and device_printf() in re(4) and remove rl_unit from the softc. - Use callout_init_mtx() and rather than timeout/untimeout in both rl(4) and re(4). - Fix locking for ifmedia by locking the driver in the ifmedia handlers rather than in the miibus functions. (re(4) didn't lock the mii stuff at all!) - Fix some locking in re_ioctl().
Note: the two drivers share the same softc declared in if_rlreg.h, so they had to be change simultaneously.
MFC after: 1 week Tested by: several on rl(4), none on re(4)
|
#
148722 |
|
05-Aug-2005 |
tobez |
Recognize D-Link DGE-528(T) Gigabit as an re(4) device.
Submitted by: Andrus Nomm <andrus@members.ee> PR: 76780 MFC After: 1 week
|
#
147256 |
|
10-Jun-2005 |
brooks |
Stop embedding struct ifnet at the top of driver softcs. Instead the struct ifnet or the layer 2 common structure it was embedded in have been replaced with a struct ifnet pointer to be filled by a call to the new function, if_alloc(). The layer 2 common structure is also allocated via if_alloc() based on the interface type. It is hung off the new struct ifnet member, if_l2com.
This change removes the size of these structures from the kernel ABI and will allow us to better manage them as interfaces come and go.
Other changes of note: - Struct arpcom is no longer referenced in normal interface code. Instead the Ethernet address is accessed via the IFP2ENADDR() macro. To enforce this ac_enaddr has been renamed to _ac_enaddr. - The second argument to ether_ifattach is now always the mac address from driver private storage rather than sometimes being ac_enaddr.
Reviewed by: sobomax, sam
|
#
140642 |
|
22-Jan-2005 |
imp |
Bring in support for SUGOI LAN GIGA NIC made by System TALKS, Inc from a RealTek 8169SB.
PR: 74262 Submitted by: Yoshikazu GOTO-san
# Submitter notes that he's unsure of the revision string for 8169SB
|
#
139825 |
|
07-Jan-2005 |
imp |
/* -> /*- for license, minor formatting changes
|
#
135896 |
|
28-Sep-2004 |
jmg |
fix jumbo frames as much as they can be fixed for re. We now cap the MTU to 7422 since it appears that the 8169S can't transmit anything larger.. The 8169S can receive full jumbo frames, but we don't have an mru to let the upper layers know this...
add fixup so that this driver should work on alignment constrained platforms (!i386 && !amd64)
MFC after: 5 days
|
#
135469 |
|
19-Sep-2004 |
jmg |
fix misspelling of TX...
Submitted by: Johan Karlsson MFC after: 3 days
|
#
135467 |
|
19-Sep-2004 |
jmg |
comment requirement that rx/tx descriptor counts must be equal due to shared code... define rx descriptor count in terms of tx align defines
MFC after: 3 days
|
#
134433 |
|
28-Aug-2004 |
sanpei |
Add support Corega CG-LAPCIGT Gigabit Ethernet(8169S)
PR: [FreeBSD-users-jp 80667] Submitted by: FUJIMOTO Kou <fujimoto@j.dendai.ac.jp> MFC after: 1 week
|
#
131605 |
|
05-Jul-2004 |
bms |
style(9) and whitespace cleanup. Use C99 types. Use ANSI function definitions. Sort prototypes. Split long lines correctly. Punctuate/wordsmith comments. Use device_printf()/if_printf() where possible.
Reviewed by: -net (silence)
|
#
131253 |
|
28-Jun-2004 |
imp |
Remove burn bridges code that saved/restored the pci config registers that are now handled in the pci bus layer. They are no longer necessary.
|
#
129672 |
|
24-May-2004 |
jhb |
Wrap the code to save/restore PCI config registers on suspend/resume in #ifndef BURN_BRIDGES.
Noticed by: phk
|
#
122689 |
|
14-Nov-2003 |
sam |
Drop the driver lock around calls to if_input to avoid a LOR when the packets are immediately returned for sending (e.g. when bridging or packet forwarding). There are more efficient ways to do this but for now use the least intrusive approach.
Reviewed by: imp, rwatson
|
#
120215 |
|
19-Sep-2003 |
wpaul |
Remove jumbo buffer #defines that I ended up not needing.
|
#
120043 |
|
13-Sep-2003 |
wpaul |
Teach the re(4) driver about the CFG2 register, which tells us whether we're on a 32-bit/64-bit bus or not. Use this to decide if we should set the PCI dual-address cycle enable bit in the C+ command register. (Enabling DAC on a 32-bit bus seems to do bad things.)
Also, initialize the C+ command register early in the re_init() routine. The documentation says this register should be configured first.
|
#
119981 |
|
11-Sep-2003 |
wpaul |
- For the 8169 chips, read the station address by forcing an EEPROM autoload and then copying the contends of the station address registers. For some reason, reading the EEPROM on the 8169S doesn't work right. This gets around the problem, and allows us to read the station address correctly on the 8169S.
- Insert a delay after initiating packet transmition in re_diag() to allow lots of time for the frame to echo back to the host, and wait for both the 'RX complete' and 'timeout expired' bits in the ISR register to be set.
- Deal more intelligently with the fact that the frame length field in the RX descriptor is a different width on the 8139C+ than it is on the 8169/8169S/8110S
- For the 8169, you have to set bit 17 in the TX config register to enter digital loopback mode, but for the 8139C+, you have to set both bits 17 and 18. Take this into account so that re_diag() works properly for both types of chips.
|
#
119976 |
|
11-Sep-2003 |
wpaul |
Add a PHY driver to support the built-in gigE PHY in the 8169S/8110S ethernet chips. This driver is pretty simple, however it contains special DSP initialization code which is needed in order to get the chip to negotiate a gigE link. (This special initialization may not be needed in subsequent chip revs.) Also:
- Fix typo in if_rlreg.h (RL_GMEDIASTAT_1000MPS -> RL_GMEDIASTAT_1000MBPS)
- Deal with shared interrupts in re_intr(): if interface isn't up, return.
- Fix another bug in re_gmii_writereg() (properly apply data field mask)
- Allow PHY driver to read the RL_GMEDIASTAT register via the re_gmii_readreg() register (this is register needed to determine real time link/media status).
|
#
119949 |
|
10-Sep-2003 |
wpaul |
Update hardware revision table. 0x04000000 appears to be the revision for the 8169S, according to my sample board. The RealTek Linux driver mentions 0x00800000. I'm assigning this to the 8110S until I get more info on it. (The (preliminary) RealTek docs only say that 8169S/8110S chips will have some combination of those two bits set, but doesn't say exactly what bit combination goes with which chip variant.)
|
#
119868 |
|
08-Sep-2003 |
wpaul |
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).
|
#
119738 |
|
04-Sep-2003 |
tmm |
Use stream bus space accesses to program the ID (station address) registers; otherwise, the byte order of the address is changed on big-endian machines.
|
#
118978 |
|
15-Aug-2003 |
wpaul |
Argh. Last commit only had the __FBSDID() fix. Really add the device ID for the 8100 this time.
|
#
118889 |
|
13-Aug-2003 |
wpaul |
Set the TX hardware checksum offload bits on all the descriptors of a multi-fragment transmission. I'm not sure if this is a bug or a requirement that I overlooked with going through the documentation, but the sample 8169 NIC that I have seems to require it at least some of the time or else it botches TCP checksums on segments that span multiple descriptors.
|
#
118712 |
|
09-Aug-2003 |
wpaul |
- Update some comments regarding hardware details of the 8169 and note the existence of the 8169S and 8110S components. (The 8169 is just a MAC, the 8169S and 8110S contain both a MAC and PHY.)
- Properly handle list and buffer addresses as 64-bit. The RX and TX DMA list addresses should be bus_addr_t's. Added RL_ADDR_HI() and RL_ADDR_LO() macros to obtain values for writing into chip registers.
- Set a slightly different TIMERINT value for 8169 NICs for improved performance.
- Change left out of previous commit log: added some additional hardware rev codes for other 10/100 chips and for the 8169S/8110S 'rev C' gigE MACs.
|
#
118586 |
|
07-Aug-2003 |
wpaul |
Add preliminary support for the RealTek 8169 gigE chip. Changes:
- Fix a bug in rl_dma_map_desc(): set the 'end of ring' bit in the right descriptor (DESC_CNT - 1, not DESC_CNT). The 8139C+ is limited to 64 descriptors and automatically wraps at 64 descriptors even if the EOR bit isn't set, but the 8169 NIC can have up to 1024 descriptors per ring, so we must set the wrap point in the right place.
- RealTek moved the RL_TIMERINT register from offset 0x54 to 0x58 in the 8169 -- account for this.
- Added rl_gmii_readreg() and rl_gmii_writereg() routines.
- Fix rl_probe() to deal with the case where the base type is not RL_8139.
The next step is to add jumbo buffer support.
Tested with the Xterasys XN-152 NIC (hard to beat $29 for a gigE NIC).
|
#
117388 |
|
10-Jul-2003 |
wpaul |
Add support for the 8139C+ chipset. Unlike the other chips in the 8139 series, the 8139C+ has a descriptor-based DMA mechanism, and its performance is actually pretty respectable. Note: the 8139D chip does not support C+ mode. Only the 8139C+ and 8169 gigE chips support C+ mode.
Supported features:
- RX and TX checksum offload - hardware VLAN tag insertion/extraction - TX interrupt moderation using the 8139's on-board timer
Everything should be properly busdma'ed and endian-independent, so things should work ok on non-x86 platforms. Unfortunately, my call for testers on this code was met with deafening silence, and I don't have access to any non-x86 FreeBSD boxes at the moment, so this is speculation.
The device detection code has been cleaned up a little as well (thanks to Michal Mertl) for the patches.
There are also updates to the rl(4) man page (which I accidentally checked in before when I updated the dc(4) man page. Oops.)
Todo: finish support for the 8169 gigabit ethernet chip. This mainly requires writing an rlgphy driver to handle the 8169's built-in PHY. This will have to wait until I actually get my hands on an 8169 card for testing though. (I still can't find a source for one in the U.S. Suggestions/pointers welcome.)
|
#
112379 |
|
18-Mar-2003 |
sanpei |
Add support for Planex FNW-3800-TX(CardBus 100M/10M).
Submitted by: Kunihiro Arai <araik@attglobal.net> Obtained from: [bsd-nomads:16625]
|
#
111381 |
|
23-Feb-2003 |
dan |
Add support for Peppercon ROL-F Card.
Submitted by: Sascha Holzeiter <sascha@root-login.org> PR: 48559
|
#
109095 |
|
11-Jan-2003 |
sanpei |
Add support for Corega FEtherII CB-TXD (CardBus 100M/10M). Fix typo (Coreaga->Corega)
|
#
103020 |
|
06-Sep-2002 |
iwasaki |
Add support for Corega FEther CB-TXD (CardBus 100M/10M).
|
#
96112 |
|
06-May-2002 |
jhb |
Add support for the D-Link DFE-690TXD Cardbus card which has a RealTek 8139 with its own PCI ID.
|
#
94883 |
|
16-Apr-2002 |
luigi |
Add DEVICE_POLLING support to the "rl" driver. The diffs are very similar to the ones for the "sis" driver.
MFC After: 5 days
|
#
94400 |
|
11-Apr-2002 |
wpaul |
Nortel Networks sells a RealTek 8139-based NIC that's basically the same thing as the SMC 1211, but with their own vendor ID. Update the device list to support this NIC. (Discovered these cards lying around the lab at work.)
|
#
86822 |
|
23-Nov-2001 |
iwasaki |
Add suspend/resume code mostly merged from fxp driver.
|
#
81713 |
|
15-Aug-2001 |
wpaul |
Convert the if_sis and if_rl drivers to use the bus_dma API instead of calling vtophys() and contigmalloc()/contigfree() directly. Hopefully, I have shaken out all of the problems with busdma on the alpha now. (Everything seems to work as expected.)
Also, change the max RX DMA limit to 1024 bytes instead of "unlimited," as the latter seems not to work correctly on the alpha that I tested. (At 100Mbps, all attempts to receive frames yield RX errors.)
|
#
72813 |
|
21-Feb-2001 |
wpaul |
Big round of minor updates:
- Use pci_get_powerstate()/pci_set_powerstate() in all the other drivers that need them so we don't have to fiddle with the PCI power management registers directly. - Use pci_enable_busmaster()/pci_enable_io() to turn on busmastering and PIO/memory mapped accesses. - Add support to the RealTek driver for the D-Link DFE-530TX+ which has a RealTek 8139 with its own PCI ID. (Submitted by Jason Wright) - Have the SiS 900/National DP83815 driver be sure to disable PME mode in sis_reset(). This apparently fixes a problem on some motherboards where the DP83815 chip fails to receive packets. (Submitted by Chuck McCrobie <mccrobie@cablespeed.com>)
|
#
72200 |
|
09-Feb-2001 |
bmilekic |
Change and clean the mutex lock interface.
mtx_enter(lock, type) becomes:
mtx_lock(lock) for sleep locks (MTX_DEF-initialized locks) mtx_lock_spin(lock) for spin locks (MTX_SPIN-initialized)
similarily, for releasing a lock, we now have:
mtx_unlock(lock) for MTX_DEF and mtx_unlock_spin(lock) for MTX_SPIN. We change the caller interface for the two different types of locks because the semantics are entirely different for each case, and this makes it explicitly clear and, at the same time, it rids us of the extra `type' argument.
The enter->lock and exit->unlock change has been made with the idea that we're "locking data" and not "entering locked code" in mind.
Further, remove all additional "flags" previously passed to the lock acquire/release routines with the exception of two:
MTX_QUIET and MTX_NOSWITCH
The functionality of these flags is preserved and they can be passed to the lock/unlock routines by calling the corresponding wrappers:
mtx_{lock, unlock}_flags(lock, flag(s)) and mtx_{lock, unlock}_spin_flags(lock, flag(s)) for MTX_DEF and MTX_SPIN locks, respectively.
Re-inline some lock acq/rel code; in the sleep lock case, we only inline the _obtain_lock()s in order to ensure that the inlined code fits into a cache line. In the spin lock case, we inline recursion and actually only perform a function call if we need to spin. This change has been made with the idea that we generally tend to avoid spin locks and that also the spin locks that we do have and are heavily used (i.e. sched_lock) do recurse, and therefore in an effort to reduce function call overhead for some architectures (such as alpha), we inline recursion for this case.
Create a new malloc type for the witness code and retire from using the M_DEV type. The new type is called M_WITNESS and is only declared if WITNESS is enabled.
Begin cleaning up some machdep/mutex.h code - specifically updated the "optimized" inlined code in alpha/mutex.h and wrote MTX_LOCK_SPIN and MTX_UNLOCK_SPIN asm macros for the i386/mutex.h as we presently need those.
Finally, caught up to the interface changes in all sys code.
Contributors: jake, jhb, jasone (in no particular order)
|
#
67931 |
|
30-Oct-2000 |
wpaul |
Fix support for cardbus cards: - Add DRIVER_MODULE() declaration to make this driver a child of cardbus - Handle different width EEPROMs
The CIS parser still barfs when scanning this card, but it seems to probe/attach correctly anyway. I can't do a traffic test just yet since I don't have a proper crossover cable handy.
|
#
67771 |
|
28-Oct-2000 |
wpaul |
Add PCI IDs for some additional cardbus cards. Yes, there really is a RealTek 8139 cardbus device. Unfortunately it doesn't quite work yet because the CIS parser barfs on it.
Submitted by msmith, with some small tweaks by me.
|
#
67087 |
|
13-Oct-2000 |
wpaul |
First round of converting network drivers from spls to mutexes. This takes care of all the 10/100 and gigE PCI drivers that I've done. Next will be the wireless drivers, then the USB ones. I may pick up some stragglers along the way. I'm sort of playing this by ear: if anyone spots any places where I've screwed up horribly, please let me know.
|
#
52426 |
|
21-Oct-1999 |
wpaul |
Make some tweaks to the RealTek driver:
- Fix a bug in rl_rxeof() handler: in the case where the packet wraps from the end of the receive buffer back to the beginning, we need to insure that at least sizeof(ether_header) bytes make it into the first mbuf. If we don't, then doing eh = mtod(m, struct ether_header *) loses. To avoid this, we use m_pullup() to suck at least MHLEN - RL_ETHER_ALIGN bytes into the first mbuf, which should also help small packets fit into a single mbuf.
Pointed out by: Philip A. Prindeville <philipp@zembu.com>
- Make the transmit threshold autotuning: start off with a small value and jack it up when TX underruns are detected.
- Also improve TX error recovery: kick the chip in the head with a reset/init sequence to make sure it recovers afer a transmit error.
|
#
50703 |
|
31-Aug-1999 |
wpaul |
Convert the RealTek 8139 driver to newbus and miibus in one swell foop. Also set it up to be compiled as a module.
|
#
50477 |
|
27-Aug-1999 |
peter |
$Id$ -> $FreeBSD$
|
#
50097 |
|
20-Aug-1999 |
wpaul |
Fix power management register definitions.
|
#
49001 |
|
22-Jul-1999 |
wpaul |
Remove the definitions for the SiS 900 chip. This is not a RealTek clone after all. I have the datasheets for this part; hopefully I can write a proper driver soon.
|
#
48056 |
|
20-Jun-1999 |
wpaul |
Tweak FIFO and DMA thresholds to improve performance and reduce likelyhood of RX FIFO overruns.
Submitted by: bde
|
#
48028 |
|
19-Jun-1999 |
wpaul |
Fix up the RealTek 8139 driver to work on FreeBSD/alpha. This involves a few changes:
- there was a bug in rl_list_tx_init(): it was calculating the registers to initialize incorrectly. Not a problem on the x86 where unaligned access are allowed, but a problem on the alpha.
- set rl_btag accordingly depending on the machine type
- rl_rxeof() needs to be sure to longword-align the packet data. This is a little tricky since we copy the data out of the receive buffer using m_devget(), however there's no way to tell m_devget() to fill in the mbufs starting at a particular offset. To get around this, we tell m_devget to copy bytes+2 bytes starting at offset offset-2. This results in the proper alignment, and we can trim off the two leading bytes afterwards with m_adj(). We also allocate some extra space before the start of the receive buffer so that we don't get into trouble in the case where offset == 0.
- redefine vtophys() in if_rlreg.h for the alpha.
Making this chipset work on the alpha is sort of the inverse of putting a jet engine on a rowboat (putting a propeller on a 747?) but when you can get these things for $5 a pop, it's hard to stop people from buying them.
|
#
47632 |
|
30-May-1999 |
wpaul |
Add support for SiS 900 chipset (PCI ID 0x1039/0x0900), which appears to be yet another rebadged RealTek 8139.
|
#
45633 |
|
12-Apr-1999 |
wpaul |
Merge in some updates for the RealTek driver, mainly:
- Rewrite the transmit section to be a little less bogus. - Set ifq_maxlen correctly. RL_TX_LIST_CNT - 1 is wrong, because for the RealTek, RL_TX_LIST_CNT is 4. Set it to IFQ_MAXLEN instead.
|
#
44238 |
|
23-Feb-1999 |
wpaul |
Add support for still more cheapo 10/100 cards: Delta Electronics and Addtron appear to have their own VIA Rhine II and RealTek 8139 boards with custom PCI vendor and device IDs. This commit updates the PCI vendor and device lists in the vr and rl drivers so that we can probe the additional devices.
Found by: nosing around the PCI vendor and device code list at: http://www.halcyon.com/scripts/jboemler/pci/pcicode
|
#
41656 |
|
10-Dec-1998 |
wpaul |
Silence gcc -Wall -ansi -pedantic.
Pointed out by: Eivind
|
#
41569 |
|
06-Dec-1998 |
wpaul |
if_rl.c: make a small tweak to properly handle the Accton MPX 5030/5038 as a RealTek 8139 if_rlreg.h: use bus_space_read_X() in CSR_READ_X() macros instead of directly calling inb()/outb() etc... rl.4 + RELNOTES.TXT: mention that SMC EtherEZ PCI 1211-TX is supported by the RealTek driver
|
#
41243 |
|
18-Nov-1998 |
wpaul |
The Accton 1207D adapter uses a chip called the MXP 5030 (or 5038) which is either a RealTek 8139 in disguise or a RealTek workalike. This commit fixes the PCI vendor/device ID for this device and updates the description string to reflect the actual identity of the device.
I also changed the transmit encapsulation routine to always to buffer copies on transmit. We end up doing this 99% of the time anyway. I also tweaked the code that pads packets out to the minimum length (60) bytes. I was fixing up the m_pkthdr.len value but not m_len. I don't think this makes that much difference in the grand scheme of things, but it makes me feel better.
|
#
40516 |
|
18-Oct-1998 |
wpaul |
Add driver support for PCI fast ethernet adapters based on the RealTek 8129/8139 chipset like I've been threatening. Update kernel configs, userconfig.c, relnotes and sysinstall. No man page yet; comming soon.
I consider this driver stable enough that I want to give it some exposure in -current.
|