* (you will need to reboot afterwards) */
 /* #define BNX2X_STOP_ON_ERROR */
 
-#define DRV_MODULE_VERSION      "1.52.53-6"
-#define DRV_MODULE_RELDATE      "2010/09/07"
+#define DRV_MODULE_VERSION      "1.52.53-7"
+#define DRV_MODULE_RELDATE      "2010/09/12"
 #define BNX2X_BC_VER            0x040200
 
 #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE)
 #define NUM_RX_BD                      (RX_DESC_CNT * NUM_RX_RINGS)
 #define MAX_RX_BD                      (NUM_RX_BD - 1)
 #define MAX_RX_AVAIL                   (MAX_RX_DESC_CNT * NUM_RX_RINGS - 2)
+#define MIN_RX_AVAIL                   128
 #define NEXT_RX_IDX(x)         ((((x) & RX_DESC_MASK) == \
                                  (MAX_RX_DESC_CNT - 1)) ? (x) + 3 : (x) + 1)
 #define RX_BD(x)                       ((x) & MAX_RX_BD)
 
                                              ETH_MAX_AGGREGATION_QUEUES_E1H;
        u16 ring_prod, cqe_ring_prod;
        int i, j;
+       int rx_ring_size = bp->rx_ring_size ? bp->rx_ring_size :
+                                             MAX_RX_AVAIL/bp->num_queues;
+
+       rx_ring_size = max_t(int, MIN_RX_AVAIL, rx_ring_size);
 
        bp->rx_buf_size = bp->dev->mtu + ETH_OVREHEAD + BNX2X_RX_ALIGN;
        DP(NETIF_MSG_IFUP,
                /* Allocate BDs and initialize BD ring */
                fp->rx_comp_cons = 0;
                cqe_ring_prod = ring_prod = 0;
-               for (i = 0; i < bp->rx_ring_size; i++) {
+               for (i = 0; i < rx_ring_size; i++) {
                        if (bnx2x_alloc_rx_skb(bp, fp, ring_prod) < 0) {
                                BNX2X_ERR("was only able to allocate "
                                          "%d rx skbs on queue[%d]\n", i, j);
 
        ering->rx_mini_max_pending = 0;
        ering->rx_jumbo_max_pending = 0;
 
-       ering->rx_pending = bp->rx_ring_size;
+       if (bp->rx_ring_size)
+               ering->rx_pending = bp->rx_ring_size;
+       else
+               if (bp->state == BNX2X_STATE_OPEN && bp->num_queues)
+                       ering->rx_pending = MAX_RX_AVAIL/bp->num_queues;
+               else
+                       ering->rx_pending = MAX_RX_AVAIL;
+
        ering->rx_mini_pending = 0;
        ering->rx_jumbo_pending = 0;
 
        }
 
        if ((ering->rx_pending > MAX_RX_AVAIL) ||
+           (ering->rx_pending < MIN_RX_AVAIL) ||
            (ering->tx_pending > MAX_TX_AVAIL) ||
            (ering->tx_pending <= MAX_SKB_FRAGS + 4))
                return -EINVAL;
 
        bp->mrrs = mrrs;
 
        bp->tx_ring_size = MAX_TX_AVAIL;
-       bp->rx_ring_size = MAX_RX_AVAIL;
 
        bp->rx_csum = 1;