ath(4) failing with ath_reset for AR9285

Matthew Dillon dillon at apollo.backplane.com
Mon Mar 5 15:30:45 PST 2012


:Hi,
:
:The problem is "dfbsd should port over the ath driver." ;-)
:
:The actual cause is likely radio related - the AR9285 code that Rui
:initially ported over was based on what was in ath9k and it was
:suitably unfinished. (So it's not Rui's fault, he did a great job with
:what he had.) I subsequently found/fixed/ported a bunch of stuff with
:an ath9k developer as we *ahem* discovered the ath9k support was
:incomplete.
:
:In fact, if the dragonfly bsd guys were interested, I could have my
:arm twisted into forking off a "shared" project where we have a shared
:ath driver and HAL, and pull it into *BSD as a contrib project.
:
:That way I'd only have to fix bugs once (hah), and everyone could
:immediately benefit from it.
:
:What do you all think? You'd (mostly) get 802.11n for free. :-)
:
:Adrian

    I'd say we're definitely interested, but I don't know how easy it would
    be to maintain a common infrastructure.  I have to say honestly that it
    might not be worth maintaining a common infrastructure for the driver.
    DragonFly's network subsystem differs hugely from FreeBSD's and the
    wireless infrastructure also has some major differences on top of that.

    We're working with Rui's original port of the 802.11 infrastructure
    to DragonFly, plus various hacks we added afterwords to stabilize it.

    The major differences relative to his port are related to the fact
    that the WLAN pseudo-interfaces and the ATH (and other) physical
    interfaces used different locks, but were able to call each other
    recursively via the 802.11 framework.  This led to the drivers doing
    crazy unlock/relock sequences and STILL hitting deadlocks in some cases.
    But even with the unlock/relock sequences that left the driver open
    to reentrancy issues which we were constantly hitting.

    So in our network infrastructure I basically gave up on the 802_11
    psuedo-vs-phy locking issue and I have a single global serializer
    that covers the *entire* wireless infrastructure on the system...
    all pseudo-interfaces and all physical interfaces use the same
    serializer.

    --

    In our normal network subsystem there are also major differences.
    We have an ifnet serializer that is installed on a per-driver basis
    (but as per above, for the wireless physical interfaces we just specify
    a single global serializer), but the system infrastructure is
    responsible for acquiring the serializer (our version of the driver
    locks) rather than the drivers having to code them up for each entry
    point, which greatly simplifies driver design).  Even the fan-in/fan-out
    locking for multiple rx/tx queues is handled by the higher level
    system for the most part, for things like IF_EMX.

    We also have to always change all the M_NOWAIT allocations in FreeBSD
    drivers that appear to be used for everything, including small one-time
    critical driver structures, to M_INTWAIT in DragonFly.  I guess M_NOWAIT
    in FreeBSD doesn't actually ever return NULL, but in DragonFly it can
    return NULL in virtually any situation (such as if a lock cannot be
    acquired non-blocking).

    Plus some (mostly) minor changes to numerous other things... differences
    in how BUSDMA works, for example.  Other issues such as DragonFly not
    overloading the stdio namespace so kernel printfs in dragonfly are
    'kprintf()' not 'printf()', and allocations are 'kmalloc()' rather
    than 'malloc', and so forth.

    --

    Sorry, don't mean to discourage you.  I'd really love there to be an
    easier way to synchronize driver code too.

						-Matt





More information about the Kernel mailing list