From patchwork Fri Apr 26 08:52:10 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lucas Stach X-Patchwork-Id: 239766 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B8CE82C00F6 for ; Fri, 26 Apr 2013 18:53:37 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759363Ab3DZIx1 (ORCPT ); Fri, 26 Apr 2013 04:53:27 -0400 Received: from metis.ext.pengutronix.de ([92.198.50.35]:50050 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758232Ab3DZIxZ (ORCPT ); Fri, 26 Apr 2013 04:53:25 -0400 Received: from weser.hi.pengutronix.de ([10.1.0.109] helo=weser.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1UVePE-0005sS-5b; Fri, 26 Apr 2013 10:53:24 +0200 From: Lucas Stach To: "netdev@vger.kernel.org" Cc: David Miller , Frank Li , Fabio Estevam , Shawn Guo , Lucas Stach Subject: [PATCH resend 3/3] Revert "net: fec: add napi support to improve proformance" Date: Fri, 26 Apr 2013 10:52:10 +0200 Message-Id: <1366966330-5181-3-git-send-email-l.stach@pengutronix.de> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1366966330-5181-1-git-send-email-l.stach@pengutronix.de> References: <1366966330-5181-1-git-send-email-l.stach@pengutronix.de> X-SA-Exim-Connect-IP: 10.1.0.109 X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This reverts commit dc975382d2ef36be7e78fac3717927de1a5abcd8. This change caused trouble up to kernel OOPSes with NULL-ptr dereferences. The only sane way to get back to a working state is this revert. Signed-off-by: Lucas Stach --- drivers/net/ethernet/freescale/fec.c | 41 ++++++------------------------------ drivers/net/ethernet/freescale/fec.h | 2 -- 2 files changed, 7 insertions(+), 36 deletions(-) diff --git a/drivers/net/ethernet/freescale/fec.c b/drivers/net/ethernet/freescale/fec.c index fa6a999..3d51163 100644 --- a/drivers/net/ethernet/freescale/fec.c +++ b/drivers/net/ethernet/freescale/fec.c @@ -67,7 +67,6 @@ #endif #define DRIVER_NAME "fec" -#define FEC_NAPI_WEIGHT 64 /* Pause frame feild and FIFO threshold */ #define FEC_ENET_FCE (1 << 5) @@ -169,7 +168,6 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address"); #define FEC_ENET_EBERR ((uint)0x00400000) /* SDMA bus error */ #define FEC_DEFAULT_IMASK (FEC_ENET_TXF | FEC_ENET_RXF | FEC_ENET_MII) -#define FEC_RX_DISABLED_IMASK (FEC_DEFAULT_IMASK & (~FEC_ENET_RXF)) /* The FEC stores dest/src/type, data, and checksum for receive packets. */ @@ -703,8 +701,8 @@ fec_enet_tx(struct net_device *ndev) * not been given to the system, we just set the empty indicator, * effectively tossing the packet. */ -static int -fec_enet_rx(struct net_device *ndev, int budget) +static void +fec_enet_rx(struct net_device *ndev) { struct fec_enet_private *fep = netdev_priv(ndev); const struct platform_device_id *id_entry = @@ -714,12 +712,13 @@ fec_enet_rx(struct net_device *ndev, int budget) struct sk_buff *skb; ushort pkt_len; __u8 *data; - int pkt_received = 0; #ifdef CONFIG_M532x flush_cache_all(); #endif + spin_lock(&fep->hw_lock); + /* First, grab all of the stats for the incoming packet. * These get messed up if we get called due to a busy condition. */ @@ -727,10 +726,6 @@ fec_enet_rx(struct net_device *ndev, int budget) while (!((status = bdp->cbd_sc) & BD_ENET_RX_EMPTY)) { - if (pkt_received >= budget) - break; - pkt_received++; - /* Since we have allocated space to hold a complete frame, * the last indicator should be set. */ @@ -812,7 +807,7 @@ fec_enet_rx(struct net_device *ndev, int budget) } if (!skb_defer_rx_timestamp(skb)) - napi_gro_receive(&fep->napi, skb); + netif_rx(skb); } bdp->cbd_bufaddr = dma_map_single(&fep->pdev->dev, data, @@ -846,7 +841,7 @@ rx_processing_done: } fep->cur_rx = bdp; - return pkt_received; + spin_unlock(&fep->hw_lock); } static irqreturn_t @@ -863,13 +858,7 @@ fec_enet_interrupt(int irq, void *dev_id) if (int_events & FEC_ENET_RXF) { ret = IRQ_HANDLED; - - /* Disable the RX interrupt */ - if (napi_schedule_prep(&fep->napi)) { - writel(FEC_RX_DISABLED_IMASK, - fep->hwp + FEC_IMASK); - __napi_schedule(&fep->napi); - } + fec_enet_rx(ndev); } /* Transmit OK, or non-fatal error. Update the buffer @@ -890,18 +879,7 @@ fec_enet_interrupt(int irq, void *dev_id) return ret; } -static int fec_enet_rx_napi(struct napi_struct *napi, int budget) -{ - struct net_device *ndev = napi->dev; - int pkts = fec_enet_rx(ndev, budget); - struct fec_enet_private *fep = netdev_priv(ndev); - if (pkts < budget) { - napi_complete(napi); - writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK); - } - return pkts; -} /* ------------------------------------------------------------------------- */ static void fec_get_mac(struct net_device *ndev) @@ -1464,8 +1442,6 @@ fec_enet_open(struct net_device *ndev) struct fec_enet_private *fep = netdev_priv(ndev); int ret; - napi_enable(&fep->napi); - /* I should reset the ring buffers here, but I don't yet know * a simple way to do that. */ @@ -1677,9 +1653,6 @@ static int fec_enet_init(struct net_device *ndev) ndev->netdev_ops = &fec_netdev_ops; ndev->ethtool_ops = &fec_enet_ethtool_ops; - writel(FEC_RX_DISABLED_IMASK, fep->hwp + FEC_IMASK); - netif_napi_add(ndev, &fep->napi, fec_enet_rx_napi, FEC_NAPI_WEIGHT); - fec_restart(ndev, 0); return 0; diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index b70c3cd..ff79610 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -249,8 +249,6 @@ struct fec_enet_private { int bufdesc_ex; int pause_flag; - struct napi_struct napi; - struct ptp_clock *ptp_clock; struct ptp_clock_info ptp_caps; unsigned long last_overflow_check;