25 Apr, 2007

1 commit


02 Feb, 2007

1 commit


03 Dec, 2006

5 commits


14 Sep, 2006

1 commit


18 Aug, 2006

1 commit

  • 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: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     

30 Jun, 2006

1 commit


18 Jun, 2006

3 commits

  • Use CPU native page size to determine various ring sizes. This allows
    order-0 memory allocations on all systems.

    Added check to limit the page size to 16K since that's the maximum rx
    ring size that will be used. This will prevent using unnecessarily
    large page sizes on some architectures with large page sizes.
    [Suggested by David Miller]

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     
  • Add functions to decompress firmware before loading to the internal
    CPUs. Compressing the firmware reduces the driver size significantly.

    Added file name length sanity check in the gzip header to prevent
    going past the end of buffer [suggested by DaveM].

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     
  • Add a counter for packets dropped by firmware.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     

23 Mar, 2006

4 commits


21 Mar, 2006

2 commits

  • Include so that it compiles properly on all archs.

    Update version to 1.4.38.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     
  • Increase maximum receive ring size from 255 to 1020 by supporting
    up to 4 linked pages of receive descriptors. To accomodate the
    higher memory usage, each physical descriptor page is allocated
    separately and the software ring that keeps track of the SKBs and the
    DMA addresses is allocated using vmalloc.

    Some of the receive-related fields in the bp structure are re-
    organized a bit for better locality of reference.

    The max. was reduced to 1020 from 4080 after discussion with David
    Miller.

    This patch contains ring init code changes only. This next patch
    contains rx data path code changes.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     

24 Jan, 2006

6 commits


06 Nov, 2005

4 commits

  • Refine bnx2_poll() logic to write back the most up-to-date status tag
    when all work has been processed. This eliminates some occasional
    extra interrupts when a older status tag is written even though all
    work has been processed.

    The idea is to read the status tag just before exiting bnx2_poll() and
    then check again for any new work. If no new work is pending, the
    status tag written back will not generate any extra interrupt. This
    logic is similar to the changes David Miller did to tg3_poll().

    Signed-off-by: Michael Chan
    Signed-off-by: John W. Linville

    Michael Chan
     
  • Dynamically determine the shared memory location where eeprom
    parameters are stored instead of using a fixed location.

    Add speed reporting to management firmware. This allows management
    firmware to know the current speed without contending for MII
    registers.

    Signed-off-by: Michael Chan
    Signed-off-by: John W. Linville

    Michael Chan
     
  • Update bnx2 nvram code with support for 5708.

    Signed-off-by: Michael Chan
    Signed-off-by: John W. Linville

    Michael Chan
     
  • Add 5708 copper and serdes basic support, including 2.5 Gbps support
    on 5708 serdes. SPEED_2500 is also added to ethtool.h

    Signed-off-by: Michael Chan
    Signed-off-by: John W. Linville

    Michael Chan
     

09 Sep, 2005

1 commit

  • Fix bug in bnx2_interrupt() that caused an unnecessary register read.
    The BNX2_PCICFG_MISC_STATUS should only be read when the status tag
    has not changed.

    Add prefetch of the status block in bnx2_msi() similar to tg3_msi().
    The status block is not touched in bnx2_msi() and prefetching it will
    speed up bnx2_poll() that will run on the same CPU that received the
    MSI.

    Update version.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     

30 Aug, 2005

3 commits

  • Remove atomic operations in the fast tx path. Expensive atomic
    operations were used to keep track of the number of available tx
    descriptors. The new code uses the difference between the consumer
    and producer index to determine the number of free tx descriptors.

    As suggested by Jeff Garzik, the name of the inline function is
    changed to all lower case.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     
  • This speeds up link-up time on 5706 SerDes if the link partner does
    not autoneg, a rather common scenario in blade servers. Some blade
    servers use IPMI for keyboard input and it's important to minimize
    link disruptions.

    The speedup is achieved by shortening the timer to (HZ / 3) during
    the transient period right after initiating a SerDes autoneg. If
    autoneg does not complete, parallel detect can be done sooner. After
    the transient period is over, the timer goes back to its normal HZ
    interval.

    As suggested by Jeff Garzik, the timer initialization is moved to
    bnx2_init_board() from bnx2_open().

    An eeprom bit is also added to allow default forced SerDes speed for
    even faster link-up time.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     
  • This fixes an rtnl deadlock problem when flush_scheduled_work() is
    called from bnx2_close(). In rare cases, linkwatch_event() may be on
    the workqueue from a previous close of a different device and it will
    try to get the rtnl lock which is already held by dev_close().

    The fix is to set a flag if we are in the reset task which is run
    from the workqueue. bnx2_close() will loop until the flag is cleared.
    As suggested by Jeff Garzik, the loop is changed to call msleep(1)
    instead of yield() in the original patch.

    flush_scheduled_work() is also moved to bnx2_remove_one() before the
    netdev is freed.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan
     

27 May, 2005

1 commit

  • A new driver bnx2 for Broadcom bcm5706 is available.

    The patch also includes new 1000BASE-X advertisement bit definitions in
    mii.h

    Thanks to David Miller and Jeff Garzik for reviewing and their valuable
    feedback.

    Signed-off-by: Michael Chan
    Signed-off-by: David S. Miller

    Michael Chan