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
next prev parent 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.