iwlwifi: pcie: buffer packets to avoid overflowing Tx queues
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 14 Jan 2016 07:39:21 +0000 (09:39 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 31 Jan 2016 10:42:52 +0000 (12:42 +0200)
commit3955525d5d17118ed8900e9e79753057120eb02a
tree633b1d71d690e231e21bf9f0d0e4bf190b86dc3e
parentaee3bfa3307cd0da2126bdc0ea359dabea5ee8f7
iwlwifi: pcie: buffer packets to avoid overflowing Tx queues

When the Tx queues are full above a threshold, we
immediately stop the mac80211's queue to stop getting new
packets. This worked until TSO was enabled.
With TSO, one single packet from mac80211 can use many
descriptors since a large send needs to be split into
several segments.
This means that stopping mac80211's queues is not enough
and we also need to ensure that we don't overflow the Tx
queues with one single packet from mac80211.
Add code to transport layer to do just that. Stop
mac80211's queue as soon as the queue is full above the
same threshold as before, and keep pushing the current
packet along with its segments on the queue, but check
that we don't overflow. If that would happen, buffer the
segments, and send them when there is room in the Tx queue
again. Of course, we first need to send the buffered
segments and only then, wake up mac80211's queues.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/internal.h
drivers/net/wireless/intel/iwlwifi/pcie/tx.c