High level summary:
A) FreeBSD network interface configuration requires that device setup happens synchronously.
B) The INTC and BRCM drivers poll hardware for up to hundreds of ms waiting for firmware setting a completion bit when the driver interacts with hardware for anything other than transmit / receive. drewg encountered problems caused by this at NFLX when iflib increased the stats update from hz to hz/2.
C) A logical approach would be to yield the processor while waiting for completion. However, this is not possible while holding a default mutex as is the current convention in essentially all network drivers.
In short, the current locking convention is incompatible with meeting both upper stack requirements and driver requirements while maintain reasonable latency. This change attempts to deal with the issue by change the softc lock to be an sx lock and making changes that previously happened synchronously with a default mutex held asynchronous.
I've fixed all the problems I've encountered, but make no claim to have tested comprehensively.