Fix a couple of problems that may make gem(4) get stuck:
authorkettenis <kettenis@openbsd.org>
Tue, 26 Aug 2008 21:06:29 +0000 (21:06 +0000)
committerkettenis <kettenis@openbsd.org>
Tue, 26 Aug 2008 21:06:29 +0000 (21:06 +0000)
commitbb05d10042a6c350e230c8a1ad775174ef6d01c7
tree65b865dcc09b6f925bc77deae87a460163550ed8
parent6131dddaabd08aecc112e1130b71ce04ed03fcf1
Fix a couple of problems that may make gem(4) get stuck:

1. If bus_dmamap_load_mbuf() fails because there are not enough
   segments in the map, defrag the mbuf.

2. If there are not enough free (hardware ring) descriptors, set
   IFF_OACTIVE and keep the packet on the queue.

3. If there is some other resource starvation that makes
   bus_dmamap_load_mbuf() or defragmentation fail, drop the packet.
   Don't set IFF_OACTIVE, since the Tx ring could be empty and we'd be
   stuck.

4. Only pass packets that are actually handed off to the hardware to
   BPF.  Do so before handing them off to the hardware to make sure
   the packet isn't freed behind our back.

ok dlg@
sys/dev/ic/gem.c