| From b5ba6d12bdac21bc0620a5089e0f24e362645efd Mon Sep 17 00:00:00 2001 |
| From: Ivan Vecera <ivecera@redhat.com> |
| Date: Thu, 27 Jan 2011 12:24:11 +0100 |
| Subject: r8169: use RxFIFO overflow workaround for 8168c chipset. |
| |
| From: Ivan Vecera <ivecera@redhat.com> |
| |
| commit b5ba6d12bdac21bc0620a5089e0f24e362645efd upstream. |
| |
| I found that one of the 8168c chipsets (concretely XID 1c4000c0) starts |
| generating RxFIFO overflow errors. The result is an infinite loop in |
| interrupt handler as the RxFIFOOver is handled only for ...MAC_VER_11. |
| With the workaround everything goes fine. |
| |
| Signed-off-by: Ivan Vecera <ivecera@redhat.com> |
| Acked-by: Francois Romieu <romieu@fr.zoreil.com> |
| Cc: Hayes <hayeswang@realtek.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/r8169.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/r8169.c |
| +++ b/drivers/net/r8169.c |
| @@ -3741,7 +3741,8 @@ static void rtl_hw_start_8168(struct net |
| RTL_W16(IntrMitigate, 0x5151); |
| |
| /* Work around for RxFIFO overflow. */ |
| - if (tp->mac_version == RTL_GIGA_MAC_VER_11) { |
| + if (tp->mac_version == RTL_GIGA_MAC_VER_11 || |
| + tp->mac_version == RTL_GIGA_MAC_VER_22) { |
| tp->intr_event |= RxFIFOOver | PCSTimeout; |
| tp->intr_event &= ~RxOverflow; |
| } |
| @@ -4633,7 +4634,8 @@ static irqreturn_t rtl8169_interrupt(int |
| |
| /* Work around for rx fifo overflow */ |
| if (unlikely(status & RxFIFOOver) && |
| - (tp->mac_version == RTL_GIGA_MAC_VER_11)) { |
| + (tp->mac_version == RTL_GIGA_MAC_VER_11 || |
| + tp->mac_version == RTL_GIGA_MAC_VER_22)) { |
| netif_stop_queue(dev); |
| rtl8169_tx_timeout(dev); |
| break; |