IGB driver version 2.0.7. I'm working from the release version of FreeBSD v7.4. I'm not entirely sure what would be correct here, but in the function igb_setup_receive_structures() in the e1000 igb driver (if_igb.c), the fail condition looks wrong. At first glance, it looks like rxr should get rx_rings[j], not [i]. Also, that code will never be run since the condition on the for loop is j > i, i will be >= zero, and j starts at zero. -STX How-To-Repeat: I have not hit this code on a running system; just looked suspicious.
The code appears to not match the description in this ticket anymore. Closing it out. static int igb_setup_receive_structures(struct adapter *adapter) { struct rx_ring *rxr = adapter->rx_rings; int i; for (i = 0; i < adapter->num_queues; i++, rxr++) if (igb_setup_receive_ring(rxr)) goto fail; return (0); fail: /* * Free RX buffers allocated so far, we will only handle * the rings that completed, the failing case will have * cleaned up for itself. 'i' is the endpoint. */ for (int j = 0; j < i; ++j) { rxr = &adapter->rx_rings[j]; IGB_RX_LOCK(rxr); igb_free_receive_ring(rxr); IGB_RX_UNLOCK(rxr); } return (ENOBUFS); }