1. 01 2月, 2016 1 次提交
  2. 31 1月, 2016 1 次提交
    • E
      iwlwifi: pcie: buffer packets to avoid overflowing Tx queues · 3955525d
      Emmanuel Grumbach 提交于
      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: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      3955525d
  3. 21 12月, 2015 2 次提交
    • E
      iwlwifi: remove unused parameter from grab_nic_access · 23ba9340
      Emmanuel Grumbach 提交于
      All the callers used silent = false.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      23ba9340
    • E
      iwlwifi: pcie: build an A-MSDU using TSO core · 6eb5e529
      Emmanuel Grumbach 提交于
      When the op_mode sends an skb whose payload is bigger than
      MSS, PCIe will create an A-MSDU out of it. PCIe assumes
      that the skb that is coming from the op_mode can fit in one
      A-MSDU. It is the op_mode's responsibility to make sure
      that this guarantee holds.
      
      Additional headers need to be built for the subframes.
      The TSO core code takes care of the IP / TCP headers and
      the driver takes care of the 802.11 subframe headers.
      
      These headers are stored on a per-cpu page that is re-used
      for all the packets handled on that same CPU. Each skb
      holds a reference to that page and releases the page when
      it is reclaimed. When the page gets full, it is released
      and a new one is allocated.
      
      Since any SKB that doesn't go through the fast-xmit path
      of mac80211 will be segmented, we can assume here that the
      packet is not WEP / TKIP and has a proper SNAP header.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      6eb5e529
  4. 20 12月, 2015 3 次提交
  5. 13 12月, 2015 3 次提交
  6. 18 11月, 2015 1 次提交
  7. 05 8月, 2015 1 次提交
  8. 04 8月, 2015 6 次提交
  9. 31 7月, 2015 1 次提交
    • E
      iwlwifi: pcie: fix stuck queue detection for sleeping clients · aecdc63d
      Emmanuel Grumbach 提交于
      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: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      aecdc63d
  10. 28 5月, 2015 2 次提交
  11. 12 3月, 2015 2 次提交
    • E
      iwlwifi: pcie: allow the op_mode to freeze the stuck queue timer · e0b8d405
      Emmanuel Grumbach 提交于
      This allows the op_mode to let the transport know that a
      queue is currently frozen and that its timer should be
      stopped.
      When the queue is unfrozen, its timer should be set to
      expire after the remainder of the timeout has elapsed.
      This can be used when stations go to sleep. When a station
      goes to sleep, the op_mode can freeze the timer so that the
      queue will never be considered as stuck. When the station
      wakes up, the queue will be unfrozen.
      This is meant to avoid false positives that would happen if
      a buggy station goes to sleep for a very long time. In case
      we have a dedicated queue for this station (BA agreement)
      and it goes to sleep for a very long time, the queue would
      rightfully be stopped during all that time. In this case,
      the stuck queue timer could fire and that would be a false
      positive.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      e0b8d405
    • E
      iwlwifi: pcie: speed up the Tx DMA stop flow · 36277234
      Emmanuel Grumbach 提交于
      We don't need to acquire MAC access for each access, it
      makes much more sense to keep the MAC access. This speeds
      up the Tx DMA stop flow significantly.
      Moreover, if one channel can't be stopped, stop the others
      but don't poll for them to avoid being stuck there for a
      long time.
      
      This solves a situation in which we were stuck in that flow
      for way too long with a spinlock held which led to a kernel
      panic.
      Reviewed-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      36277234
  12. 01 2月, 2015 5 次提交
  13. 22 1月, 2015 1 次提交
  14. 29 12月, 2014 1 次提交
  15. 01 12月, 2014 1 次提交
  16. 11 11月, 2014 1 次提交
    • E
      iwlwifi: pcie: introduce delay when waking up the device · 01e58a28
      Emmanuel Grumbach 提交于
      In some rare cases, the firmware can put the device to
      sleep after the driver requested the access. This is
      because the access request can take a short time to be
      propagated to the firmware.
      
      If that happens, the driver may think that it has access
      since the firmware hasn't put the device to sleep yet, but
      right after the driver's check, the firmware might put the
      device to sleep.
      
      Warn when this happens by allowing the firmware to finish
      the "put the device sleep" flow so that the driver will
      not get access to the device. This will make the issue
      visible.
      
      This still doesn't fix the race, but at least it makes
      it more visible.
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      01e58a28
  17. 14 9月, 2014 2 次提交
  18. 04 9月, 2014 6 次提交