1. 11 12月, 2007 1 次提交
    • M
      [BNX2]: Fix RX packet rot. · c09c2627
      Michael Chan 提交于
      Packets can be left in the RX ring if the NAPI budget is reached.
      This is caused by storing the latest rx index at the beginning of
      bnx2_rx_int().  We may not process all the work up to this index
      if the budget is reached and so some packets in the RX ring may rot
      when we later check for more work using this stored rx index.
      
      The fix is to not store this latest hw index and only store the
      processed rx index.  We use a new function bnx2_get_hw_rx_cons()
      to fetch the latest hw rx index.
      Signed-off-by: NMichael Chan <mchan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      c09c2627
  2. 11 10月, 2007 4 次提交
    • M
      [BNX2]: Fix default WoL setting. · 846f5c62
      Michael Chan 提交于
      Change the default WoL setting to match the NVRAM's setting.  It
      always defaulted to WoL disabled before and caused a lot of confusion
      for users.
      Signed-off-by: NMichael Chan <mchan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      846f5c62
    • M
      [BNX2]: Optimize firmware loading. · ea1f8d5c
      Michael Chan 提交于
      This is a follow up to the patches from Denys Vlasenkos
      <vda.linux@googlemail.com> to further optimize firmware loading.
      
      1. In bnx2_init_cpus(), we allocate memory for decompression once
      and use it repeatedly instead of doing this for every firmware image.
      
      2. We eliminate the BSS and SBSS firmware sections in bnx2_fw*.h since
      these are always zeros.
      Signed-off-by: NMichael Chan <mchan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      ea1f8d5c
    • D
      [BNX2]: factor out gzip unpacker · b3448b0b
      Denys Vlasenko 提交于
      This patch modifies gzip unpacking code in bnx2 driver so that
      it does not depend on bnx2 internals. I will move this code
      out of the driver and into zlib in follow-on patch.
      
      It can be useful in other drivers which need to store firmwares
      or any other relatively big binary blobs - fonts, cursor bitmaps,
      whatever.
      
      Patch is run tested by Michael Chan (driver author).
      Signed-off-by: NDenys Vlasenko <vda.linux@googlemail.com>
      Acked-by: NMichael Chan <mchan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b3448b0b
    • S
      [NET]: Make NAPI polling independent of struct net_device objects. · bea3348e
      Stephen Hemminger 提交于
      Several devices have multiple independant RX queues per net
      device, and some have a single interrupt doorbell for several
      queues.
      
      In either case, it's easier to support layouts like that if the
      structure representing the poll is independant from the net
      device itself.
      
      The signature of the ->poll() call back goes from:
      
      	int foo_poll(struct net_device *dev, int *budget)
      
      to
      
      	int foo_poll(struct napi_struct *napi, int budget)
      
      The caller is returned the number of RX packets processed (or
      the number of "NAPI credits" consumed if you want to get
      abstract).  The callee no longer messes around bumping
      dev->quota, *budget, etc. because that is all handled in the
      caller upon return.
      
      The napi_struct is to be embedded in the device driver private data
      structures.
      
      Furthermore, it is the driver's responsibility to disable all NAPI
      instances in it's ->stop() device close handler.  Since the
      napi_struct is privatized into the driver's private data structures,
      only the driver knows how to get at all of the napi_struct instances
      it may have per-device.
      
      With lots of help and suggestions from Rusty Russell, Roland Dreier,
      Michael Chan, Jeff Garzik, and Jamal Hadi Salim.
      
      Bug fixes from Thomas Graf, Roland Dreier, Peter Zijlstra,
      Joseph Fannin, Scott Wood, Hans J. Koch, and Michael Chan.
      
      [ Ported to current tree and all drivers converted.  Integrated
        Stephen's follow-on kerneldoc additions, and restored poll_list
        handling to the old style to fix mutual exclusion issues.  -DaveM ]
      Signed-off-by: NStephen Hemminger <shemminger@linux-foundation.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      bea3348e
  3. 18 7月, 2007 1 次提交
  4. 11 7月, 2007 3 次提交
  5. 08 6月, 2007 1 次提交
  6. 04 5月, 2007 8 次提交
  7. 25 4月, 2007 1 次提交
  8. 02 2月, 2007 1 次提交
  9. 03 12月, 2006 5 次提交
  10. 14 9月, 2006 1 次提交
  11. 18 8月, 2006 1 次提交
    • M
      [BNX2]: Fix tx race condition. · 2f8af120
      Michael Chan 提交于
      Fix a subtle race condition between bnx2_start_xmit() and bnx2_tx_int()
      similar to the one in tg3 discovered by Herbert Xu:
      
      CPU0					CPU1
      bnx2_start_xmit()
      	if (tx_ring_full) {
      		tx_lock
      					bnx2_tx()
      						if (!netif_queue_stopped)
      		netif_stop_queue()
      		if (!tx_ring_full)
      						update_tx_ring
      			netif_wake_queue()
      		tx_unlock
      	}
      
      Even though tx_ring is updated before the if statement in bnx2_tx_int() in
      program order, it can be re-ordered by the CPU as shown above.  This
      scenario can cause the tx queue to be stopped forever if bnx2_tx_int() has
      just freed up the entire tx_ring.  The possibility of this happening
      should be very rare though.
      
      The following changes are made, very much identical to the tg3 fix:
      
      1. Add memory barrier to fix the above race condition.
      
      2. Eliminate the private tx_lock altogether and rely solely on
      netif_tx_lock.  This eliminates one spinlock in bnx2_start_xmit()
      when the ring is full.
      
      3. Because of 2, use netif_tx_lock in bnx2_tx_int() before calling
      netif_wake_queue().
      
      4. Add memory barrier to bnx2_tx_avail().
      
      5. Add bp->tx_wake_thresh which is set to half the tx ring size.
      
      6. Check for the full wake queue condition before getting
      netif_tx_lock in tg3_tx().  This reduces the number of unnecessary
      spinlocks when the tx ring is full in a steady-state condition.
      Signed-off-by: NMichael Chan <mchan@broadcom.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      2f8af120
  12. 30 6月, 2006 1 次提交
  13. 18 6月, 2006 3 次提交
  14. 23 3月, 2006 4 次提交
  15. 21 3月, 2006 2 次提交
  16. 24 1月, 2006 3 次提交