diff options
author | adrian <adrian@FreeBSD.org> | 2014-04-21 06:07:08 +0000 |
---|---|---|
committer | adrian <adrian@FreeBSD.org> | 2014-04-21 06:07:08 +0000 |
commit | 613ea3ba08fb754c71e21fb4bfe3806cee0ba1a9 (patch) | |
tree | 012be492a44ab17703215c83f02e4aaf1344db31 /lib/libc/stdio/fdopen.c | |
parent | 614c44f1d6b6c4371f75022a57bdda8ac7aa74da (diff) | |
download | FreeBSD-src-613ea3ba08fb754c71e21fb4bfe3806cee0ba1a9.zip FreeBSD-src-613ea3ba08fb754c71e21fb4bfe3806cee0ba1a9.tar.gz |
Rewrite the cleanup code to, well, actually work right.
The existing cleanup code was based on the Atheros reference driver
from way back and stuff that was in Linux ath9k. It turned out to be ..
rather silly.
Specifically:
* The whole method of determining whether there's hardware-queued frames
was fragile and the BAW would never quite work right afterwards.
* The cleanup path wouldn't correctly pull apart aggregate frames in the
queue, so frames would not be freed and the BAW wouldn't be correctly
updated.
So to implement this:
* Pull the aggregate frames apart correctly and handle each separately;
* Make the atid->incomp counter just track the number of hardware queued
frames rather than try to figure it out from the BAW;
* Modify the aggregate completion path to handle it as a single frame
(atid->incomp tracks the one frame now, not the subframes) and
remove the frames from the BAW before completing them as normal frames;
* Make sure bf->bf_next is NULled out correctly;
* Make both aggregate session and non-aggregate path frames now be
handled via the incompletion path.
TODO:
* kill atid->incomp; the driver tracks the hardware queued frames
for each TID and so we can just use that.
This is a stability fix that should be merged back to stable/10.
Tested:
* AR5416, STA
MFC after: 7 days
Diffstat (limited to 'lib/libc/stdio/fdopen.c')
0 files changed, 0 insertions, 0 deletions