1. 30 3月, 2016 1 次提交
  2. 10 3月, 2016 2 次提交
    • G
      iwlwifi: pcie: avoid restocks inside rx loop if not emergency · e0e168dc
      Gregory Greenman 提交于
      When trying to reach high Rx throughput of more than 500Mbps on
      a device with a relatively weak CPU (Atom x5-Z8500), CPU utilization
      may become a bottleneck. Analysis showed that we are looping in
      iwl_pcie_rx_handle for very long periods which led to starvation
      of other threads (iwl_pcie_rx_handle runs with _bh disabled).
      We were handling Rx and allocating new buffers and the new buffers
      were ready quickly enough to be available before we had finished
      handling all the buffers available in the hardware. As a
      consequence, we called iwl_pcie_rxq_restock to refill the hardware
      with the new buffers, and start again handling new buffers without
      exiting the function. Since we read the hardware pointer again when
      we goto restart, new buffers were handled immediately instead of
      exiting the function.
      
      This patch avoids refilling RBs inside rx handling loop, unless an
      emergency situation is reached. It also doesn't read the hardware
      pointer again unless we are in an emergency (unlikely) case.
      This significantly reduce the maximal time we spend in
      iwl_pcie_rx_handle with _bh disabled.
      Signed-off-by: NGregory Greenman <gregory.greenman@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      e0e168dc
    • S
      iwlwifi: pcie: fine tune number of rxbs · 7b542436
      Sara Sharon 提交于
      We kick the allocator when we have 2 RBDs that don't have
      attached RBs, and the allocator allocates 8 RBs meaning
      that it needs another 6 RBDs to attach the RBs to.
      The design is that allocator should always have enough RBDs
      to fulfill requests, so we give in advance 6 RBDs to the
      allocator so that when it is kicked, it gets additional 2 RBDs
      and has enough RBDs.
      These RBDs were taken from the Rx queue itself, meaning
      that each Rx queue didn't have the maximal number of
      RBDs, but MAX - 6.
      Change initial number of RBDs in the system to include both
      queue size and allocator reserves.
      Note the multi-queue is always 511 instead of 512 to avoid a
      full queue since we cannot detect this state easily enough in
      the 9000 arch.
      Signed-off-by: NSara Sharon <sara.sharon@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      7b542436
  3. 07 3月, 2016 2 次提交
  4. 02 3月, 2016 1 次提交
  5. 28 2月, 2016 2 次提交
  6. 15 2月, 2016 1 次提交
    • E
      iwlwifi: pcie: fix RF-Kill vs. firmware load race · a6bd005f
      Emmanuel Grumbach 提交于
      When we load the firmware, we hold trans_pcie->mutex to
      avoid nested flows. We also rely on the ISR to wake up the
      thread when the DMA has finished copying a chunk. During
      this flow, we enable the RF-Kill interrupt.
      
      The problem is that the RF-Kill interrupt handler can take
      the mutex and bring the device down. This means that if
      we load the firmware while the RF-Kill switch is enabled
      (which will happen when we load the INIT firmware to read
      the device's capabilities and register to mac80211), we
      may get an RF-Kill interrupt immediately and the ISR will
      be waiting for the mutex held by the thread that is
      currently loading the firmware. At this stage, the ISR
      won't be able to service the DMA's interrupt needed to
      wake up the thread that load the firmware. We are in a
      deadlock situation which ends when the thread that loads
      the firmware fails on timeout and releases the mutex.
      
      To fix this, take the mutex later in the flow, disable
      the interrupts and synchronize_irq() to give a chance to
      the RF-Kill interrupt to run and complete.
      After that, mask all the interrupts besides the DMA
      interrupt and proceed with firmware load. Make sure to
      check that there was no RF-Kill interrupt when the
      interrupts were disabled.
      
      This fixes https://bugzilla.kernel.org/show_bug.cgi?id=111361Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      a6bd005f
  7. 01 2月, 2016 1 次提交
  8. 31 1月, 2016 2 次提交
    • S
      iwlwifi: pcie: add 9000 series multi queue rx DMA support · 96a6497b
      Sara Sharon 提交于
      The 9000 series introduces several changes in the device
      DMA operation.
      As the device now supports multi-queue rx, several DMA channels
      should be configured.
      The flows of providing the device with the allocated RBDs now
      changes as well - the device maintains a separate table of used
      and free table.
      
      The hardware may use the free table to feed RBDs to any queue.
      This requires maintaing a shared table to map returned RBDs to
      the original RXB - for that purpose the VID is introduced - an
      internal identifier of the RB placed in the lower 12 bits and
      returned by HW in the used data.
      
      Another change is the support of 64 bit DMA address.
      Signed-off-by: NSara Sharon <sara.sharon@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      96a6497b
    • S
      iwlwifi: pcie: add infrastructure for multi-queue rx · 78485054
      Sara Sharon 提交于
      The 9000 series devices will support multi rx queues.
      Current code has one static rx queue - change it to allocate
      a number of queues per the device capability (pre-9000 devices
      have the number of rx queues set to one).
      
      Subsequent generalizations are:
      
      Change the code to access an explicit numbered rx queue only
      when the queue number is known - when handling interrupt, when
      accessing the default queue and when iterating the queues.
      The rest of the functions will receive the rx queue as a pointer.
      
      Generalize the warning in allocation failure to consider the
      allocator status instead of a single rx queue status.
      
      Move the rx initial pool of memory buffers to be shared among
      all the queues and allocated to the default queue on init.
      Signed-off-by: NSara Sharon <sara.sharon@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      78485054
  9. 13 12月, 2015 1 次提交
  10. 02 12月, 2015 2 次提交
  11. 26 11月, 2015 2 次提交
  12. 18 11月, 2015 1 次提交
  13. 16 8月, 2015 1 次提交
  14. 05 8月, 2015 1 次提交
    • S
      iwlwifi: pcie: New RBD allocation model · 26d535ae
      Sara Sharon 提交于
      As a preperation for multiple RX queues change the RBD
      allocation model.
      
      The new model includes a background allocator. The allocator is
      called by the interrupt handler when there are two released
      buffers by the queue, and the allocator starts allocating eight
      pages per request.
      When the queue has released 8 pages it tries claiming the
      request. If the pages are not ready - it keeps claiming.
      This new model should make sure that RBDs are always available
      across the multiple queues.
      
      The RBDs are transferred between the allocator and the queue.
      The queue moves the free RBDs upon freeing them to the allocator.
      The allocator moves them back to the queue's possession when the
      request is claimed.
      The allocator has an initial pool to make sure there are always RBDs
      available for the request completion.
      Release of the buffers at exit is done per pools - the allocator
      frees its own initial pool and the queue frees its own pool.
      
      Existing code refactor -
      -Queue's initial pool is the size of the queue only as the allocation
      of the new buffers no longer uses this pool.
      -Removal of replenish background work, and replenish calls in the
      interrupt handler and restock().
      -The replenish() and the rxq used_list are used only during
      initialization.
      -Moved page allocation to a new function for code reuse.
      
      New code -
      Allocator code - new structure and functions.
      Interrupt handler uses the allocator functions for replenishing buffers.
      Reuse of the restock() method.
      Signed-off-by: NSara Sharon <sara.sharon@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      26d535ae
  15. 04 8月, 2015 3 次提交
  16. 13 7月, 2015 1 次提交
  17. 26 6月, 2015 1 次提交
  18. 03 6月, 2015 2 次提交
    • S
      iwlwifi: pcie: New RBD allocation model · 5f175703
      Sara Sharon 提交于
      As a preperation for multiple RX queues change the RBD
      allocation model.
      
      The new model includes a background allocator. The allocator is
      called by the interrupt handler when there are two released
      buffers by the queue, and the allocator starts allocating eight
      pages per request.
      When the queue has released 8 pages it tries claiming the
      request. If the pages are not ready - it keeps claiming.
      This new model should make sure that RBDs are always available
      across the multiple queues.
      
      The RBDs are transferred between the allocator and the queue.
      The queue moves the free RBDs upon freeing them to the allocator.
      The allocator moves them back to the queue's possession when the
      request is claimed.
      The allocator has an initial pool to make sure there are always RBDs
      available for the request completion.
      Release of the buffers at exit is done per pools - the allocator
      frees its own initial pool and the queue frees its own pool.
      
      Existing code refactor -
      -Queue's initial pool is the size of the queue only as the allocation
      of the new buffers no longer uses this pool.
      -Removal of replenish background work, and replenish calls in the
      interrupt handler and restock().
      -The replenish() and the rxq used_list are used only during
      initialization.
      -Moved page allocation to a new function for code reuse.
      
      New code -
      Allocator code - new structure and functions.
      Interrupt handler uses the allocator functions for replenishing buffers.
      Reuse of the restock() method.
      Signed-off-by: NSara Sharon <sara.sharon@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      5f175703
    • A
      iwlwifi: pcie: Control access to the NIC's PM registers via iwl_cfg · 95411d04
      Avri Altman 提交于
      Allow a cleaner way to access those hw-dependent registers,
      instead of using the product family type etc.
      Signed-off-by: NAvri Altman <avri.altman@intel.com>
      Reviewed-by: NJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: NEmmanuel Grumbach <emmanuel.grumbach@intel.com>
      95411d04
  19. 18 3月, 2015 1 次提交
  20. 14 9月, 2014 1 次提交
  21. 04 9月, 2014 1 次提交
  22. 07 5月, 2014 1 次提交
  23. 13 4月, 2014 5 次提交
  24. 10 3月, 2014 1 次提交
  25. 13 2月, 2014 1 次提交
  26. 04 2月, 2014 1 次提交
  27. 14 1月, 2014 1 次提交