gianfar: Implement workaround for eTSEC-A002 erratum
authorAnton Vorontsov <avorontsov@mvista.com>
Wed, 30 Jun 2010 06:39:15 +0000 (06:39 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Jun 2010 18:35:43 +0000 (11:35 -0700)
commit511d934f4496076898e45aaa09e0c85376eb16ee
treea50a7b366c340a66b7a1f10f59b737f23c370ebc
parentdeb90eacd084d9edfeda2f714d99c29a86360077
gianfar: Implement workaround for eTSEC-A002 erratum

MPC8313ECE says:

"If the controller receives a 1- or 2-byte frame (such as an illegal
 runt packet or a packet with RX_ER asserted) before GRS is asserted
 and does not receive any other frames, the controller may fail to set
 GRSC even when the receive logic is completely idle. Any subsequent
 receive frame that is larger than two bytes will reset the state so
 the graceful stop can complete. A MAC receiver (Rx) reset will also
 reset the state."

This patch implements the proposed workaround:

"If IEVENT[GRSC] is still not set after the timeout, read the eTSEC
 register at offset 0xD1C. If bits 7-14 are the same as bits 23-30,
 the eTSEC Rx is assumed to be idle and the Rx can be safely reset.
 If the register fields are not equal, wait for another timeout
 period and check again."

Signed-off-by: Anton Vorontsov <avorontsov@mvista.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/gianfar.c
drivers/net/gianfar.h