From patchwork Tue Oct 27 14:02:52 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: santosh shukla X-Patchwork-Id: 37049 X-Patchwork-Delegate: grant.likely@secretlab.ca Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id BAB24B7E93 for ; Wed, 28 Oct 2009 14:16:47 +1100 (EST) X-Greylist: delayed 47500 seconds by postgrey-1.32 at bilbo; Wed, 28 Oct 2009 14:16:40 EST Received: from santosh (unknown [122.166.50.80]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 01A64B7BEB for ; Wed, 28 Oct 2009 14:16:39 +1100 (EST) Received: from santosh (localhost [127.0.0.1]) by santosh (8.14.3/8.14.3) with ESMTP id n9RE2wfM009520; Tue, 27 Oct 2009 19:32:59 +0530 Received: (from santosh@localhost) by santosh (8.14.3/8.14.3/Submit) id n9RE2rhY009518; Tue, 27 Oct 2009 19:32:53 +0530 X-Authentication-Warning: santosh: santosh set sender to sshukla@celestialsys.com using -f Subject: [PATCH] Xilinx LL-TEMAC: Add Netpoll controller support From: santosh shukla To: linuxppc-dev@lists.ozlabs.org Date: Tue, 27 Oct 2009 19:32:52 +0530 Message-Id: <1256652172.2479.6.camel@santosh> Mime-Version: 1.0 X-Mailer: Evolution 2.26.3 (2.26.3-1.fc11) Cc: john.linn@xilinx.com X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: sshukla@celestialsys.com List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org From: Santosh Shukla Date: Tue, 13 Oct 2009 18:55:57 +0530 Subject: [PATCH] Xilinx LL-TEMAC: Add Netpoll controller support Adding Netpoll controller support to Xilinx LL-TEMAC ethernet driver.Replaced Rx, Tx tasklet schedule call with their handlers, Added correct version of call which can execute interrupt on/off context i.e. dev_kfree_skb_any(). --- drivers/net/xilinx_lltemac/xlltemac_main.c | 41 +++++++++++++++++++++++++++- 1 files changed, 40 insertions(+), 1 deletions(-) diff --git a/drivers/net/xilinx_lltemac/xlltemac_main.c b/drivers/net/xilinx_lltemac/xlltemac_main.c index b245422..697f474 100644 --- a/drivers/net/xilinx_lltemac/xlltemac_main.c +++ b/drivers/net/xilinx_lltemac/xlltemac_main.c @@ -87,11 +87,18 @@ #define BUFFER_ALIGNSEND_PERF(adr) ((ALIGNMENT_SEND_PERF - ((u32) adr)) % 32) #define BUFFER_ALIGNRECV(adr) ((ALIGNMENT_RECV - ((u32) adr)) % 32) +#ifndef CONFIG_NET_POLL_CONTROLLER /* Default TX/RX Threshold and waitbound values for SGDMA mode */ #define DFT_TX_THRESHOLD 24 #define DFT_TX_WAITBOUND 254 #define DFT_RX_THRESHOLD 4 #define DFT_RX_WAITBOUND 254 +#else +#define DFT_TX_THRESHOLD 1 +#define DFT_TX_WAITBOUND 0 +#define DFT_RX_THRESHOLD 1 +#define DFT_RX_WAITBOUND 0 +#endif #define XTE_AUTOSTRIPPING 1 @@ -1097,7 +1104,11 @@ static irqreturn_t xenet_dma_rx_interrupt(int irq, void *dev_id) list_add_tail(&lp->rcv, &receivedQueue); XLlDma_mBdRingIntDisable(&lp->Dma.RxBdRing, XLLDMA_CR_IRQ_ALL_EN_MASK); +#ifndef CONFIG_NET_POLL_CONTROLLER tasklet_schedule(&DmaRecvBH); +#else + DmaRecvHandlerBH(0); +#endif } spin_unlock_irqrestore(&receivedQueueSpin, flags); } @@ -1134,7 +1145,11 @@ static irqreturn_t xenet_dma_tx_interrupt(int irq, void *dev_id) list_add_tail(&lp->xmit, &sentQueue); XLlDma_mBdRingIntDisable(&lp->Dma.TxBdRing, XLLDMA_CR_IRQ_ALL_EN_MASK); +#ifndef CONFIG_NET_POLL_CONTROLLER tasklet_schedule(&DmaSendBH); +#else + DmaSendHandlerBH(0); +#endif } spin_unlock_irqrestore(&sentQueueSpin, flags); } @@ -1711,11 +1726,15 @@ static int xenet_DmaSend(struct sk_buff *skb, struct net_device *dev) * SgAlloc, SgCommit sequence, which also exists in DmaSendHandlerBH Bottom * Half, or triggered by other processor in SMP case. */ +#ifndef CONFIG_NET_POLL_CONTROLLER spin_lock_bh(&XTE_tx_spinlock); +#endif xenet_DmaSend_internal(skb, dev); +#ifndef CONFIG_NET_POLL_CONTROLLER spin_unlock_bh(&XTE_tx_spinlock); +#endif return 0; } @@ -1764,7 +1783,7 @@ static void DmaSendHandlerBH(unsigned long p) skb = (struct sk_buff *) XLlDma_mBdGetId(BdCurPtr); if (skb) - dev_kfree_skb(skb); + dev_kfree_skb_any(skb); /* reset BD id */ XLlDma_mBdSetId(BdCurPtr, NULL); @@ -3220,6 +3239,23 @@ static int detect_phy(struct net_local *lp, char *dev_name) return 0; /* default to zero */ } +#ifdef CONFIG_NET_POLL_CONTROLLER +static void +lltemac_poll_controller(struct net_device *ndev) +{ + struct net_local *lp = netdev_priv(ndev); + + disable_irq(lp->dma_irq_s); + disable_irq(lp->dma_irq_r); + + xenet_dma_tx_interrupt(lp->dma_irq_s, ndev); + xenet_dma_rx_interrupt(lp->dma_irq_r, ndev); + + enable_irq(lp->dma_irq_s); + enable_irq(lp->dma_irq_r); +} +#endif + static struct net_device_ops xilinx_netdev_ops; /* From include/linux/ethtool.h */ @@ -3491,6 +3527,9 @@ static struct net_device_ops xilinx_netdev_ops = { .ndo_change_mtu = xenet_change_mtu, .ndo_tx_timeout = xenet_tx_timeout, .ndo_get_stats = xenet_get_stats, +#ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = lltemac_poll_controller, +#endif }; static struct of_device_id xtenet_fifo_of_match[] = {