From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755412AbcANUrt (ORCPT ); Thu, 14 Jan 2016 15:47:49 -0500 Received: from skprod2.natinst.com ([130.164.80.23]:53469 "EHLO ni.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755283AbcANUrs (ORCPT ); Thu, 14 Jan 2016 15:47:48 -0500 X-Greylist: delayed 4810 seconds by postgrey-1.27 at vger.kernel.org; Thu, 14 Jan 2016 15:47:48 EST From: Nathan Sullivan To: nicolas.ferre@atmel.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Nathan Sullivan Subject: [PATCH] net: macb: clear interrupts when disabling them Date: Thu, 14 Jan 2016 13:27:27 -0600 Message-Id: <1452799647-1426-1-git-send-email-nathan.sullivan@ni.com> X-Mailer: git-send-email 1.7.10.4 X-MIMETrack: Itemize by SMTP Server on US-AUS-MGWOut1/AUS/H/NIC(Release 8.5.3FP6 HF1218|December 12, 2014) at 01/14/2016 01:27:36 PM, Serialize by Router on US-AUS-MGWOut1/AUS/H/NIC(Release 8.5.3FP6 HF1218|December 12, 2014) at 01/14/2016 01:27:36 PM, Serialize complete at 01/14/2016 01:27:36 PM X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-01-14_11:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Disabling interrupts with the IDR register does not stop the macb hardware from asserting its interrupt line if there are interrupts pending. Always clear the interrupts using ISR, and be sure to write it on hardware that is not read-to-clear, like Zynq. Not doing so will cause interrupts when the driver doesn't expect them. Signed-off-by: Nathan Sullivan --- drivers/net/ethernet/cadence/macb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c index c563475..9d9984a 100644 --- a/drivers/net/ethernet/cadence/macb.c +++ b/drivers/net/ethernet/cadence/macb.c @@ -1040,6 +1040,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) /* close possible race with dev_close */ if (unlikely(!netif_running(dev))) { queue_writel(queue, IDR, -1); + if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) + queue_writel(queue, ISR, -1); break; } @@ -1561,6 +1563,8 @@ static void macb_reset_hw(struct macb *bp) for (q = 0, queue = bp->queues; q < bp->num_queues; ++q, ++queue) { queue_writel(queue, IDR, -1); queue_readl(queue, ISR); + if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) + queue_writel(queue, ISR, -1); } } -- 1.7.10.4