iwlwifi: pcie: fix stuck queue detection for sleeping clients
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 29 Jul 2015 20:06:41 +0000 (23:06 +0300)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Thu, 30 Jul 2015 18:38:14 +0000 (21:38 +0300)
commitaecdc63d87891c75e60906973c7b7c9cd58403d6
tree3e6d357e6ef08784d6f4d0fd680e5fca907b0d4a
parentdc9f69b907f3853952d3ffb7918d05a662146712
iwlwifi: pcie: fix stuck queue detection for sleeping clients

The stuck queue detection mechanism allows to detect queues
that are stuck. For sleeping clients, a queue may rightfully
be stuck: if a poor client implementation stays asleep for
more than 10s, then we don't want to trigger recovery flows
because of that client.
In order to cope with this, I added a mechanism that
monitors the state of the client: when a client goes to
sleep, the timer of his queues is frozen. When he wakes up,
the timer is reset to the right value so that if a client
was awake for more than 10s and the queues are stuck, only
then, the recovery flow will kick in.
This is valid only on non-shared queues: A-MPDU queues.

There was a bug in case we Tx to a sleeping client that has
an empty A-MPDU queue: the timer was armed to now + 10s.
This is bad, but pretty harmless.
The problem is that when the client wakes up, the timer is
modified to be now + remainder. But remainder is 0 since the
queue was empty when that client went to sleep...

Fix this by checking the state of the client before playing
with the timer when we add a packet to an empty queue.

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