NetBSD Wiki/users/msaitoh/
Comparison of implementations of Ethernet drivers
| driver | where dmamem is allocated in | variations of mutex | if_init lock | if_start lock | if_stop lock | if_ioctl lock | softint(9)based TX and RX? | TX and TX are locked with mutex | callout lock | MSI / MSI-X support | Multi-queue support | notes | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wm | in attach() | tx, rx, core | CORE_LOCK(spin mutex) | TX_LOCK(spin mutex) + sc_stopping flag | CORE_LOCK(spin mutex)+sc_stopping flag | use CORE_LOCK(spin mutex) and TX_LOCK(spin mutex) partially | Yes by default. It can be changed by kernel options. See wm.4. | TX and RX differently | TX_LOCK(mutex) and check sc_stopping in the beginning | Yes | TX and RX | |
| vioif | in attach() | tx, rx, ctrl_wait | not taken? | TX_LOCK(mutex)+sc_stopping check | TX, RX + sc_stopping check | splnet() | only RX is softint'ed | TX and RX differently | callout isn't used | Yes (MSI-X only) | No | |
| vmxnet | ||||||||||||
| pq3etsec | in attach() | lock, hwlock, mdio_lock | not taken? | not taken. Set flag with atomic_or_uint() and call softintr_schedule() | not taken? | splnet() | Yes | sc_hwlock is for hard interrput. sc_lock is for software interrupt. TX and RX use the same lock | mutex_enter(sc_lock) | |||
| bcmeth(4) | in attach() | lock, hwlock | not taken? | not taken. Set flag with atomic_or_uint() and call softintr_schedule() | not taken? | splnet() | Yes. The interrupt handler calls softint or workqueue depending on the load. | sc_hwlock is for hard interrput. sc_lock is for software interrupt. TX and RX use the same lock | callout isn't used | |||
| ixg | in init() for rx jumbo, in attach() for others | tx, rx, core | CORE_LOCK(adaptive mutex) | TX_LOCK(spin mutex) | CORE_LOCK(spin mutex) | use core lock for init() and set_multi() | Yes. Only one time is execulted in the interupt context. If more request exist, softint is issued. | TX and RX differently | CORE_LOCK() in the beginning | |||
| bnx | in attach() | tx | splnet() in the beginning | not taken? | not taken? | splnet() in the beginning | No | only TX uses mutex | splnet() in the beginning | |||
| bge | in attach() | none | splnet() in the beginning | not taken? | not taken? | splnet() in the beginning | No | No | splnet() in the beginning | mutex is not used at all | 
