From 3443d04260af7ff00ddb8da8a04d474b8f0694ac Mon Sep 17 00:00:00 2001 From: msaitoh Date: Mon, 3 Feb 2014 05:56:23 +0000 Subject: [PATCH] Carefully set IFF_OACTIVE in mvgbe_start(). Even if mvgbe_encap() returns other than 0, the TX ring might not full. Check whether the TX ring has one or more packets. If the ring is empty, dont' set IFF_OACTIVE because an TX complete interrupt never occur and IFF_OACTIVE flags is left. The interface's timer isn't reset, so a device timeout desn't occur. Fixes a bug that IFF_OACTIVE flag is left on heavy load. Part of PR#48568. --- sys/dev/marvell/if_mvgbe.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sys/dev/marvell/if_mvgbe.c b/sys/dev/marvell/if_mvgbe.c index b1934780661f..f3dd28a829c9 100644 --- a/sys/dev/marvell/if_mvgbe.c +++ b/sys/dev/marvell/if_mvgbe.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_mvgbe.c,v 1.35 2013/12/23 02:23:25 kiyohara Exp $ */ +/* $NetBSD: if_mvgbe.c,v 1.36 2014/02/03 05:56:23 msaitoh Exp $ */ /* * Copyright (c) 2007, 2008, 2013 KIYOHARA Takashi * All rights reserved. @@ -25,7 +25,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include -__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.35 2013/12/23 02:23:25 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.36 2014/02/03 05:56:23 msaitoh Exp $"); #include "opt_multiprocessor.h" @@ -1059,7 +1059,8 @@ mvgbe_start(struct ifnet *ifp) * for the NIC to drain the ring. */ if (mvgbe_encap(sc, m_head, &idx)) { - ifp->if_flags |= IFF_OACTIVE; + if (sc->sc_cdata.mvgbe_tx_cnt > 0) + ifp->if_flags |= IFF_OACTIVE; break; }