netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Anton Vorontsov <avorontsov@ru.mvista.com>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: netdev@vger.kernel.org,
	Florian Fainelli <florian.fainelli@telecomint.eu>
Subject: [PATCH v2] [NET] uli526x: add support for netpoll
Date: Fri, 16 May 2008 23:04:51 +0400	[thread overview]
Message-ID: <20080516190451.GA20860@polina.dev.rtsoft.ru> (raw)
In-Reply-To: <20080516111349.GA27587@polina.dev.rtsoft.ru>

This patch adds netpoll support for the uli526x ethernet driver --
simply call the interrupt handler for polling.

To do this without disable_irq()/enable_irq() pair we should fully
protect the handler. Luckily, it's already using irqsave spinlock,
the only unprotected place is interrupts re-enabling write. It was
safe to re-enable interrupts without holding the spinlock, but with
netpoll possibility now it doesn't seem so.

Patch was tested using netconsole and KGDBoE.

Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com>
---

On Fri, May 16, 2008 at 03:13:49PM +0400, Anton Vorontsov wrote:
> On Thu, May 15, 2008 at 10:51:23PM +0200, Florian Fainelli wrote:
> > Hello Anton,
> > 
> > Le Thursday 15 May 2008 17:12:55 Anton Vorontsov, vous avez écrit :
> > > +#ifdef CONFIG_NET_POLL_CONTROLLER
> > > +static void uli526x_poll(struct net_device *dev)
> > > +{
> > > +	/* ISR grabs the irqsave lock, so this should be safe */
> > > +	uli526x_interrupt(dev->irq, dev);
> > > +}
> > > +#endif
> > 
> > You do not need to wrap this function into the ifdef, since setting the poll 
> > callback is between ifdef. Otherwise patch looks good.
> 
> Nope, I need this #ifdef, otherwise gcc will warn about unused function
> if netpoll is not selected.

Even more, I need #ifdef the declaration, because gcc will warn too. :-)
Oops. Here is v2.

 drivers/net/tulip/uli526x.c |   16 +++++++++++++++-
 1 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/drivers/net/tulip/uli526x.c b/drivers/net/tulip/uli526x.c
index 2511ca7..e9e6286 100644
--- a/drivers/net/tulip/uli526x.c
+++ b/drivers/net/tulip/uli526x.c
@@ -225,6 +225,9 @@ static void uli526x_set_filter_mode(struct net_device *);
 static const struct ethtool_ops netdev_ethtool_ops;
 static u16 read_srom_word(long, int);
 static irqreturn_t uli526x_interrupt(int, void *);
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void uli526x_poll(struct net_device *dev);
+#endif
 static void uli526x_descriptor_init(struct uli526x_board_info *, unsigned long);
 static void allocate_rx_buffer(struct uli526x_board_info *);
 static void update_cr6(u32, unsigned long);
@@ -339,6 +342,9 @@ static int __devinit uli526x_init_one (struct pci_dev *pdev,
 	dev->get_stats = &uli526x_get_stats;
 	dev->set_multicast_list = &uli526x_set_filter_mode;
 	dev->ethtool_ops = &netdev_ethtool_ops;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	dev->poll_controller = &uli526x_poll;
+#endif
 	spin_lock_init(&db->lock);
 
 
@@ -681,8 +687,9 @@ static irqreturn_t uli526x_interrupt(int irq, void *dev_id)
 	db->cr5_data = inl(ioaddr + DCR5);
 	outl(db->cr5_data, ioaddr + DCR5);
 	if ( !(db->cr5_data & 0x180c1) ) {
-		spin_unlock_irqrestore(&db->lock, flags);
+		/* Restore CR7 to enable interrupt mask */
 		outl(db->cr7_data, ioaddr + DCR7);
+		spin_unlock_irqrestore(&db->lock, flags);
 		return IRQ_HANDLED;
 	}
 
@@ -715,6 +722,13 @@ static irqreturn_t uli526x_interrupt(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void uli526x_poll(struct net_device *dev)
+{
+	/* ISR grabs the irqsave lock, so this should be safe */
+	uli526x_interrupt(dev->irq, dev);
+}
+#endif
 
 /*
  *	Free TX resource after TX complete
-- 
1.5.5.1


  reply	other threads:[~2008-05-16 19:04 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-15 15:12 [PATCH] [NET] uli526x: add support for netpoll Anton Vorontsov
2008-05-15 20:51 ` Florian Fainelli
2008-05-16 11:13   ` Anton Vorontsov
2008-05-16 19:04     ` Anton Vorontsov [this message]
2008-05-22 10:21       ` [PATCH v2] " Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080516190451.GA20860@polina.dev.rtsoft.ru \
    --to=avorontsov@ru.mvista.com \
    --cc=florian.fainelli@telecomint.eu \
    --cc=jgarzik@pobox.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).