Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[netdevice] Make netdev_irq_enabled() independent of netdev_irq_suppo…
…rted()

The UNDI layer uses the NETDEV_IRQ_ENABLED flag to choose whether to
return PXENV_UNDI_ISR_OUT_OURS or PXENV_UNDI_ISR_OUT_NOT_OURS for a
given interrupt.  For a network device that does not support
interrupts, the flag will never be set and so pxenv_undi_isr() will
always return PXENV_UNDI_ISR_OUT_NOT_OURS.  This causes some NBPs
(such as lpxelinux.0) to hang.

Redefine NETDEV_IRQ_ENABLED as a simple administrative flag which can
be set even on network devices that do not support interrupts.  This
allows pxenv_undi_isr() (which is the sole user of NETDEV_IRQ_ENABLED)
to function as expected by lpxelinux.0.

Signed-off-by: Martin Habets <mhabets@solarflare.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
habetsm-xilinx authored and mcb30 committed Jan 14, 2018
1 parent 08db2fd commit 70189a8
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions src/net/netdevice.c
Expand Up @@ -874,12 +874,9 @@ void unregister_netdev ( struct net_device *netdev ) {
*/
void netdev_irq ( struct net_device *netdev, int enable ) {

/* Do nothing if device does not support interrupts */
if ( ! netdev_irq_supported ( netdev ) )
return;

/* Enable or disable device interrupts */
netdev->op->irq ( netdev, enable );
/* Enable or disable device interrupts, if applicable */
if ( netdev_irq_supported ( netdev ) )
netdev->op->irq ( netdev, enable );

/* Record interrupt enabled state */
netdev->state &= ~NETDEV_IRQ_ENABLED;
Expand Down

0 comments on commit 70189a8

Please sign in to comment.