• Daniel Halperin's avatar
    iwlwifi: parse block ack responses correctly · 02cd8dee
    Daniel Halperin authored
    Compressed BlockAck frames store the ACKs/NACKs in a 64-bit bitmap that starts
    at the sequence number of the first frame sent in the aggregated batch. Note
    that this is a selective ACKnowledgement following selective retransmission;
    e.g., if frames 1,4-5 in a batch are ACKed then the next transmission will
    include frames 2-3,6-10 (7 frames). In this latter case, the Compressed
    BlockAck will not have all meaningful information in the low order bits -- the
    semantically meaningful bits of the BA will be 0x1f3 (where the low-order frame
    is seq 2).
    
    The driver code originally just looked at the lower (in this case, 7) bits of
    the BlockAck. In this case, the lower 7 bits of 0x1f3 => only 5 packets,
    maximum, could ever be ACKed. In reality it should be looking at all of the
    bits, filtered by those corresponding to packets that were actually sent. This
    flaw meant that the number of correctly ACked packets could be significantly
    underreported and might result in asynchronous state between TX and RX sides as
    well as driver and uCode.
    
    Fix this and also add a shortcut that doesn't require the code to loop through
    all 64 bits of the bitmap but rather stops when no higher packets are ACKed.
    
    In my experiments this fix greatly reduces throughput swing, making throughput
    stable and high. It is also likely related to some of the stalls observed in
    aggregation mode and maybe some of the buffer underruns observed, e.g.,
    
    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=1968
    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2098
    http://bugzilla.intellinuxwireless.org/show_bug.cgi?id=2018Signed-off-by: default avatarDaniel Halperin <dhalperi@cs.washington.edu>
    Signed-off-by: default avatarReinette Chatre <reinette.chatre@intel.com>
    02cd8dee
iwl-agn-tx.c 39.5 KB