]> pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
qlge: bugfix: Add missing rx buf clean index on early exit.
authorRon Mercer <ron.mercer@qlogic.com>
Fri, 13 Feb 2009 00:38:34 +0000 (16:38 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Feb 2009 00:38:34 +0000 (16:38 -0800)
The large receive buffer queue is not properly tracking the current
index in the case where an early exit occurs.  This can happen when a
page alloc or dma mapping fails.  If this occurs the queue will get
out of sync and invalid indexes can be written to the hardware.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge_main.c

index 3ab03695aaf0a1b92537e8c6359666be6054d3c6..8ea72dc60f79f96276659da86ad5c6a9228f30d3 100644 (file)
@@ -898,6 +898,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
                                        lbq_desc->index);
                                lbq_desc->p.lbq_page = alloc_page(GFP_ATOMIC);
                                if (lbq_desc->p.lbq_page == NULL) {
+                                       rx_ring->lbq_clean_idx = clean_idx;
                                        QPRINTK(qdev, RX_STATUS, ERR,
                                                "Couldn't get a page.\n");
                                        return;
@@ -907,6 +908,7 @@ static void ql_update_lbq(struct ql_adapter *qdev, struct rx_ring *rx_ring)
                                                   0, PAGE_SIZE,
                                                   PCI_DMA_FROMDEVICE);
                                if (pci_dma_mapping_error(qdev->pdev, map)) {
+                                       rx_ring->lbq_clean_idx = clean_idx;
                                        put_page(lbq_desc->p.lbq_page);
                                        lbq_desc->p.lbq_page = NULL;
                                        QPRINTK(qdev, RX_STATUS, ERR,