Error on TX descriptor free
Hello,
I'm currently using the MV643xx Ethernet driver on my board. When I run the command :
# ifconfig eth0 down
I see the following message :
eth0: Error on Tx descriptor free - could not free 1 descriptors
I went through the code, and saw that this message is displayed in mv64340_eth_free_tx_rings(). This function frees all remaining skbs (registered in the mp->tx_skb array), and decrement mp->tx_ring_skbs. Then, it checks if it reached 0. In my case, it is still 1.
In fact, mp->tx_ring_skbs is initialized to 0 and then incremented in mv64340_eth_start_xmit() (when a transmission starts), and is decremented in mv64340_eth_free_tx_queue (when the transmission is done). But the decrementation only occurs if mp->tx_ring_skbs is different from one. I don't understand why.
At the end of mv64340_eth_free_tx_queue(), the following code makes sure that the number of skbs did not reach 0 :
if (mp->tx_ring_skbs == 0)
panic("ERROR - TX outstanding SKBs counter is corrupted");Well, my question is simply : why can't we decrement the mp->tx_ring_skbs counter to 0 ?
What needs to be fixed ? The decrementation of the counter, or the function that frees the TX queue when the interface is stopped ?
I've seen similar code in the Titan GE driver.
Do not hesitate to ask for further details,
Thanks,
Thomas
Signature · 4 lines
PETAZZONI Thomas - [email protected] http://thomas.enix.org - Jabber: [email protected] KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
Hello Thomas
Thats a bug. I dont have a board to try this on. But, can you?
Quoted 14 lines · Thomas Petazzoni
Hello,
I'm currently using the MV643xx Ethernet driver on my board. When I run the command :
# ifconfig eth0 downI see the following message :
eth0: Error on Tx descriptor free - could not free 1 descriptors
I went through the code, and saw that this message is displayed in
mv64340_eth_free_tx_rings(). This function frees all remaining skbs (registered in themp->tx_skbarray), and decrementmp->tx_ring_skbs. Then, it checks if it reached 0. In my case, it is still 1.In fact,
mp->tx_ring_skbsis initialized to 0 and then incremented inmv64340_eth_start_xmit()(when a transmission starts), and is decremented inmv64340_eth_free_tx_queue(when the transmission is done). But the decrementation only occurs ifmp->tx_ring_skbsis different from one. I don't understand why.
Quoted 8 lines
At the end of
mv64340_eth_free_tx_queue(), the following code makes sure that the number of skbs did not reach 0 :if (mp->tx_ring_skbs == 0) panic("ERROR - TX outstanding SKBs counter is corrupted");Well, my question is simply : why can't we decrement the
mp->tx_ring_skbscounter to 0 ?What needs to be fixed ? The decrementation of the counter, or the function that frees the TX queue when the interface is stopped ?
Decrement the counter to zero as you suggested. And remove the panic("..") in mv64340_eth_free_tx_queue(). Let me know if it works fine
Thanks
Manish Lachwani
Quoted 8 lines
I've seen similar code in the Titan GE driver.
Do not hesitate to ask for further details,
Thanks,
Thomas