aboutsummaryrefslogtreecommitdiff
path: root/sys/pci
Commit message (Collapse)AuthorAgeFilesLines
* Close a race where SIOCGIFMEDIA ioctl get inconsistent link status.Pyun YongHyeon2011-10-171-1/+1
| | | | | | | | | | | Because driver is accessing a common MII structure in mii_pollstat(), updating user supplied structure should be done before dropping a driver lock. Reported by: Karim (fodillemlinkarimi <> gmail dot com) Notes: svn path=/head/; revision=226478
* Add new device id of D-Link DGE-530T Rev. C controller. DGE-503TPyun YongHyeon2011-07-301-0/+1
| | | | | | | | | | | 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) Notes: svn path=/head/; revision=224506
* Do a sweep of the tree replacing calls to pci_find_extcap() with calls toJohn Baldwin2011-03-231-3/+3
| | | | | | | pci_find_cap() instead. Notes: svn path=/head/; revision=219902
* Add initial support for RTL8401E PCIe Fast Ethernet.Pyun YongHyeon2011-02-161-0/+1
| | | | | | | PR: 154789 Notes: svn path=/head/; revision=218760
* Add support for RTL8105E PCIe Fast Ethernet controller. It seemsPyun YongHyeon2011-01-261-0/+1
| | | | | | | | | | | | | | | | | 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. Notes: svn path=/head/; revision=217911
* Do not use interrupt taskqueue on controllers with MSI/MSI-XPyun YongHyeon2011-01-261-0/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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. Notes: svn path=/head/; revision=217902
* Remove TX taskqueue and directly invoke re_start in interrupt task.Pyun YongHyeon2011-01-251-1/+0
| | | | Notes: svn path=/head/; revision=217868
* Prefer MSI-X to MSI on controllers that support MSI-X. AllPyun YongHyeon2011-01-251-0/+2
| | | | | | | | | | 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. Notes: svn path=/head/; revision=217857
* Change model names of controller RTL_HWREV_8168_SPIN[123] to real ones.Pyun YongHyeon2011-01-181-3/+3
| | | | | | | | | | 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. Notes: svn path=/head/; revision=217524
* Implement initial jumbo frame support for RTL8168/8111 C/D/E PCIePyun YongHyeon2011-01-171-5/+16
| | | | | | | | | | | | | | | | | | | | | | | | | | | 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. Notes: svn path=/head/; revision=217499
* Add initial support for RTL8168E/8111E-VL PCIe GbE.Pyun YongHyeon2011-01-171-0/+1
| | | | | | | H/W donated by: Realtek Semiconductor Corp. Notes: svn path=/head/; revision=217498
* Implement TSO on RealTek RTL8168/8111 C or later controllers.Pyun YongHyeon2011-01-101-0/+2
| | | | | | | | | | | | | | | 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 Notes: svn path=/head/; revision=217246
* Remove standard PCI configuration space register definitions.Pyun YongHyeon2010-11-081-35/+0
| | | | Notes: svn path=/head/; revision=215020
* Remove trailing white spaces.Pyun YongHyeon2010-11-081-7/+7
| | | | Notes: svn path=/head/; revision=215019
* Consistently use tab character instead of using space character.Pyun YongHyeon2010-11-081-500/+500
| | | | | | | No functional changes. Notes: svn path=/head/; revision=215018
* Follow the lead of vendor's interrupt moderation mechanism.Pyun YongHyeon2010-11-081-1/+2
| | | | | | | | | | | | | | | | | 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 Notes: svn path=/head/; revision=215017
* Add simple MAC statistics counter reading support. UnfortunatelyPyun YongHyeon2010-11-051-9/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 Notes: svn path=/head/; revision=214844
* Convert the PHY drivers to honor the mii_flags passed down and convertMarius Strobl2010-10-151-13/+10
| | | | | | | | | | | | | | | | | | | | | | | | | | the NIC drivers as well as the PHY drivers to take advantage of the mii_attach() introduced in r213878 to get rid of certain hacks. For the most part these were: - Artificially limiting miibus_{read,write}reg methods to certain PHY addresses; we now let mii_attach() only probe the PHY at the desired address(es) instead. - PHY drivers setting MIIF_* flags based on the NIC driver they hang off from, partly even based on grabbing and using the softc of the parent; we now pass these flags down from the NIC to the PHY drivers via mii_attach(). This got us rid of all such hacks except those of brgphy() in combination with bce(4) and bge(4), which is way beyond what can be expressed with simple flags. While at it, I took the opportunity to change the NIC drivers to pass up the error returned by mii_attach() (previously by mii_phy_probe()) and unify the error message used in this case where and as appropriate as mii_attach() actually can fail for a number of reasons, not just because of no PHY(s) being present at the expected address(es). Reviewed by: jhb, yongari Notes: svn path=/head/; revision=213893
* Rewrite interrupt handler to give fairness for both RX and TX.Pyun YongHyeon2010-10-131-16/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously rl(4) continuously checked whether there are RX events or TX completions in forever loop. This caused TX starvation under high RX load as well as consuming too much CPU cycles in the interrupt handler. If interrupt was shared with other devices which may be always true due to USB devices in these days, rl(4) also tried to process the interrupt. This means polling(4) was the only way to mitigate the these issues. To address these issues, rl(4) now disables interrupts when it knows the interrupt is ours and limit the number of iteration of the loop to 16. The interrupt would be enabled again before exiting interrupt handler if the driver is still running. Because RX buffer is 64KB in size, the number of iterations in the loop has nothing to do with number of RX packets being processed. This change ensures sending TX frames under high RX load. RX handler drops a driver lock to pass received frames to upper stack such that there is a window that user can down the interface. So rl(4) now checks whether driver is still running before serving RX or TX completion in the loop. While I'm here, exit interrupt handler when driver initialized controller. With this change, now rl(4) can send frames under high RX load even though the TX performance is still not good(rl(4) controllers can't queue more than 4 frames at a time so low TX performance was one of design issue of rl(4) controllers). It's much better than previous TX starvation and you should not notice RX performance drop with this change. Controller still shows poor performance under high network load but for many cases it's now usable without resorting to polling(4). MFC after: 2 weeks Notes: svn path=/head/; revision=213796
* Rename rl_setmulti() to rl_rxfilter() as rl_rxfilter() will handlePyun YongHyeon2010-09-301-66/+42
| | | | | | | | | | | | | | | | | | | | | | | IFF_ALLMULTI/IFF_PROMISC as well as multicast filter configuration. Rewrite RX filter logic to reduce number of register accesses and make it handle promiscuous/allmulti toggling without controller reinitialization. Previously rl(4) counted on controller reinitialization to reprogram promiscuous configuration but r211767 resulted in avoiding controller reinitialization whenever promiscuous mode is toggled. To address this, keep track of driver's view of interface state and handle IFF_ALLMULTI/IFF_PROMISC changes without reinitializing controller. This should fix a regression introduced in r211267. While I'm here remove unnecessary variable reassignment in ioctl handler. PR: kern/151079 MFC after: 1 week Notes: svn path=/head/; revision=213306
* Remove unnecessary controller reinitialization.Pyun YongHyeon2010-08-241-2/+12
| | | | | | | PR: kern/87506 Notes: svn path=/head/; revision=211767
* It seems some newer RTL8139 controllers provides only memory spacePyun YongHyeon2010-08-221-23/+27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | register mapping. I'm not sure whether it comes from the fact that controllers live behind certain PCI brdge(PLX PCI 6152 33BC) and the bridge has some issues in handling I/O space register mapping. Unfortunately it's not possible to narrow down to an exact controller that shows this issue because RealTek used the same PCI device/revision id again. In theory, it's possible to check parent PCI bridge device and change rl(4) to use memory space register mapping if the parent PCI bridge is PLX PCI 6152. But I didn't try to do that and we wouldn't get much benefit with added complexity. Blindly switching to use memory space register mapping for rl(4) may make most old controllers not to work. At least, I don't want to take potential risk from such change. So use I/O space register mapping by default but give users chance to override it via a tunable. The tunable to use memory space register mapping would be given by adding the following line to /boot/loader.conf file. dev.rl.%d.prefer_iomap="0" This change makes P811B quad-port work with this tunable. Tested by: Nikola Kalpazanov ( n.kalpazanov <> gmail dot com ) MFC after: 1 week Notes: svn path=/head/; revision=211648
* Implement WOL. WOL is supported on RTL8139B or newer controllers.Pyun YongHyeon2010-07-191-2/+139
| | | | | | | PR: kern/148013 Notes: svn path=/head/; revision=210244
* Add new tunable 'net.link.ifqmaxlen' to set default send interfaceMaxim Sobolev2010-05-031-2/+2
| | | | | | | | | | | | | queue length. The default value for this parameter is 50, which is quite low for many of today's uses and the only way to modify this parameter right now is to edit if_var.h file. Also add read-only sysctl with the same name, so that it's possible to retrieve the current value. MFC after: 1 month Notes: svn path=/head/; revision=207554
* Consistently use capital letters.Pyun YongHyeon2010-04-091-2/+2
| | | | Notes: svn path=/head/; revision=206436
* Add preliminary support for 8168E/8111E PCIe controller.Pyun YongHyeon2010-04-091-0/+3
| | | | | | | | | | While I'm here simplify device description string. Tested by: Michael Beckmann < michael <> apfel dot de > MFC after: 5 days Notes: svn path=/head/; revision=206433
* Add initial support for RTL8103E PCIe fastethernet.Pyun YongHyeon2010-01-271-0/+1
| | | | | | | PR: kern/142974 Notes: svn path=/head/; revision=203082
* Add support for four more nfsmb controllers, shipping on at least theGavin Atkinson2010-01-241-0/+12
| | | | | | | | | | | | ASUS Atom ION boards. PR: kern/142571 Submitted by: oliver Approved by: ed (mentor) MFC after: 1 week Notes: svn path=/head/; revision=202931
* Remove extraneous semicolons, no functional changes.Martin Blapp2010-01-071-1/+1
| | | | | | | | Submitted by: Marc Balmer <marc@msys.ch> MFC after: 1 week Notes: svn path=/head/; revision=201758
* intpm/sb700: force polling mode if configured interrupt is SMIAndriy Gapon2009-09-191-0/+6
| | | | | | | instead of failing to attach Notes: svn path=/head/; revision=197325
* intpm: add support for smbus controller found in AMD SB700Andriy Gapon2009-09-122-13/+43
| | | | | | | | | | | | | | | | | | | According to the specifications AMD/ATI SMBus controller is very similar to SMBus controller found in PIIX4. Some notable differences: o different bit for enabling/signalling regular interrupt mode o in practice seems to support only polling mode Thus, intpm driver is modified to support polling-only mode and to recognize SB700 PCI ID and differences. Tested on: SB700 and PIIX4E platforms Reviewed by: jhb MFC after: 2 weeks X-Perhaps-ToDo: rename the driver to reflect its function and supported hardware Notes: svn path=/head/; revision=197128
* Add RTL8168DP/RTL8111DP device id. While I'm here append "8111D" toPyun YongHyeon2009-08-241-0/+1
| | | | | | | | | | | the description of RTL8168D as RL_HWREV_8168D can be either RTL8168D or RTL8111D. PR: kern/137672 MFC after: 3 days Notes: svn path=/head/; revision=196516
* Adding hardware ID for RTL810x PCIe found on HP Pavilion DV2-1022AX.Tai-hwa Liang2009-07-141-0/+1
| | | | | | | | Reviewed by: yongari Approved by: re (kib, kensmith) Notes: svn path=/head/; revision=195675
* Use if_maddr_rlock()/if_maddr_runlock() rather than IF_ADDR_LOCK()/Robert Watson2009-06-261-2/+2
| | | | | | | | | | | | | | | | IF_ADDR_UNLOCK() across network device drivers when accessing the per-interface multicast address list, if_multiaddrs. This will allow us to change the locking strategy without affecting our driver programming interface or binary interface. For two wireless drivers, remove unnecessary locking, since they don't actually access the multicast address list. Approved by: re (kib) MFC after: 6 weeks Notes: svn path=/head/; revision=195049
* When user_frac in the polling subsystem is low it is going to busy theAttilio Rao2009-05-301-10/+17
| | | | | | | | | | | | | | | | | | | | | | | | CPU for too long period than necessary. Additively, interfaces are kept polled (in the tick) even if no more packets are available. In order to avoid such situations a new generic mechanism can be implemented in proactive way, keeping track of the time spent on any packet and fragmenting the time for any tick, stopping the processing as soon as possible. In order to implement such mechanism, the polling handler needs to change, returning the number of packets processed. While the intended logic is not part of this patch, the polling KPI is broken by this commit, adding an int return value and the new flag IFCAP_POLLING_NOCOUNT (which will signal that the return value is meaningless for the installed handler and checking should be skipped). Bump __FreeBSD_version in order to signal such situation. Reviewed by: emaste Sponsored by: Sandvine Incorporated Notes: svn path=/head/; revision=193096
* For RTL8139C+ controllers, have controller handle padding shortPyun YongHyeon2009-04-201-0/+1
| | | | | | | | | | | | | | | | 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 > Notes: svn path=/head/; revision=191301
* intpm: minor enhancementsAndriy Gapon2009-03-161-8/+8
| | | | | | | | | | | | | | 1. fix nointr check in intsmb_start, matters only if ENABLE_ALART is defined (by default, it is not); 2. drop unnecessary inspection/reporting of power-management io registers base address; 3. in verbose mode report errors from SMBus host controller and their mapping to smbus(4) errors; Approved by: jhb (mentor) Notes: svn path=/head/; revision=189882
* The callback takes a void *, not a caddr_t * (sic).Warner Losh2009-03-031-2/+2
| | | | | | | Except for the bb callback, which takes a caddr_t and not a caddr_t *. Notes: svn path=/head/; revision=189317
* Allocating 2 MSI messages do not seem to work on certain controllersPyun YongHyeon2009-02-111-1/+1
| | | | | | | | | | so use just 1 MSI message. This fixes regression introduced in r188381. Tested by: many Notes: svn path=/head/; revision=188474
* Destroy TX tag outside of loop scope.Max Khon2009-02-091-1/+1
| | | | | | | | Found with: Coverity Prevent(tm) CID: 3886 Notes: svn path=/head/; revision=188392
* - Add support for 8110SCe part. Some magic registers were taken fromJung-uk Kim2009-01-201-4/+4
| | | | | | | | | | Linux driver. - Swap hardware revisions for 8110S and 8169S as Linux driver claims. Reviewed by: yongari (early version) Notes: svn path=/head/; revision=187483
* Retire RL_FLAG_INVMAR bit to match its comment and reality.Jung-uk Kim2009-01-201-1/+0
| | | | Notes: svn path=/head/; revision=187482
* Sometimes RTL8168B seems to take long time to access GMII registersPyun YongHyeon2009-01-191-0/+1
| | | | | | | | | | | in device attach phase. Double GMII register access timeout value to fix the issue. Reported by: wkoszek Tested by: wkoszek Notes: svn path=/head/; revision=187417
* Since we don't request reset for rlphy(4), the link state 'UP'Pyun YongHyeon2008-12-221-0/+2
| | | | | | | | | | | | event from mii(4) may not be delivered if valid link was already established. To address the issue, check current link state after driving MII_TICK. This should fix a regression introduced in r184245. PR: kern/129647 Notes: svn path=/head/; revision=186390
* It seems that RealTek PCIe controllers require an explicit Tx pollPyun YongHyeon2008-12-171-0/+1
| | | | | | | | | | | | | | | | | | | | | | 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 > Notes: svn path=/head/; revision=186214
* For RTL8168C SPIN2 controllers, make sure to take the controllerPyun YongHyeon2008-12-171-0/+3
| | | | | | | | | | | 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 Notes: svn path=/head/; revision=186210
* By default assume a 8139 chip if the EEPROM contents prove inconclusive. TheWilko Bulte2008-12-151-3/+9
| | | | | | | | | | | | | | same LOM hardware with goofed-up EEPROM programming also needed reading the Ethernet address from the chips registers as the EEPROM did not have a sensible address programmed. Patch developed by: pyun@ Funky hardware on loan: www.id-it.nl MFC after: 2 weeks Notes: svn path=/head/; revision=186142
* Make WOL work on RTL8168B. This controller seems to requirePyun YongHyeon2008-12-111-0/+1
| | | | | | | | | explicit command to enable Rx MAC prior to entering D3. Tested by: Cyrus Rahman <crahman <> gmail DOT com> Notes: svn path=/head/; revision=185903
* Don't access undocumented register 0x82 on controllers thatPyun YongHyeon2008-12-111-0/+2
| | | | | | | | | | have no such register. While here clear undocumented PHY register 0x0B for RTL8110S. Obtained from: RealTek FreeBSD driver Notes: svn path=/head/; revision=185901
* Newer RealTek controllers requires setting stop request bit toPyun YongHyeon2008-12-111-0/+2
| | | | | | | terminate active Tx/Rx operation. Notes: svn path=/head/; revision=185900