Daily meeting, thanks to Stefan transmit seems to work now, even with 1GBit/s.
In the meeting yesterday we discussed moving all functions relevant to rx ring and other memory allocations to tg3_main.c. I implemented this change today and also implemented the tx completion code. It seems to work so far, but isn't fully tested yet. The NIC hardware forces us to use a ring size of 512 ring entries, I haven't transmitted > 512 packets yet to see if wrapping around the end of the ring works.
Went through tg3_reset_hw() and similar init functions to revisit code parts that have been commented-out so far. I added them back in so we don't accidentally miss some required initializations. After we have a know-working driver we can start removing unnecessary parts again.
Enabled RX in the NIC registers again. Also re-enabled the rx ring alloc and io_buffer allocation functions. After I tracked down and fixed a memory issue last week there was another similar issue that I fixed today. Started implementing RX completion code.
The tg3 driver is using a more complex RX ring handling code than other drivers. I initially thought the whole complexity of the linux driver's ring handling is required to handle the card properly. While the cards RX ring handling is more complex than for other cards(e.g. the HW requires us to use 2 rings for RX, one to place our io_buffers, and another one to indicate the RX status), I realized that parts of the complexity were introduced by some linux-isms that we already removed earlier. As a consequence I started reimplementing the RX ring handling code from scratch in a simpler way.