lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 7 Mar 2012 11:09:23 +0100 (CET)
From:	Geert Uytterhoeven <geert@...ux-m68k.org>
To:	Michael Schmitz <schmitzmic@...glemail.com>
cc:	linux-m68k@...r.kernel.org, netdev@...r.kernel.org
Subject: Re: [PATCH] m68k/atari: EtherNEC - rewrite to use mainstream ne.c

On Mon, 27 Feb 2012, Michael Schmitz wrote:
> after much prodding from Geert, and a bit of bouncing ideas back and forth,
> I've rewritten the Atari EtherNEC ethercard driver to use work with only
> minimal patches to ne.c (instead of duplicating ne.c as atari_ethernec.c).
> 
> The EtherNEC adapter is a solution to use a RTL8019 ISA card on the cartridge
> (ROM) port of m68k Atari computers. The cartridge port does not support
> generating interrupts. To service card interrupts, the 8390 interrupt handler
> is called periodically from a dedicated hardware timer which needs to be
> shared with other users (the SMC91C111 EtherNAT driver, and a dummy handler
> dedicated to preventing interference from the interrupt watchdog if the card
> is idle).
> 
> netdev subscribers please focus on the patch to ne.c at the top. Changes to
> ne.c are twofold: to select 8-bit mode for the driver, and to ensure the
> interrupt can be shared with aforementioned other users if the driver is used
> on Atari.
> 
> This patch applies on top of Geert's current linux-m68k. It won't cleanly
> apply on top of, or work if built from Linus' tree, as it relies on further
> patches relating to bus access quirks that are pending in Geert's tree.
> 
> The old EtherNEC driver is retained as-is, to be removed from Geert's tree
> after this code has been accepted. It can still be built by selecting the
> CONFIG_ATARI_ETHERNEC_OLD option.
> 
> Comments to linux-m68k or me, please - I'm not subscribed to netdev.
> 
> Cheers,
> 
>   Michael
> 
> 
> diff --git a/drivers/net/ethernet/8390/ne.c b/drivers/net/ethernet/8390/ne.c
> index f92ea2a..28b8781 100644
> --- a/drivers/net/ethernet/8390/ne.c
> +++ b/drivers/net/ethernet/8390/ne.c
> @@ -55,6 +55,9 @@ static const char version2[] =
> 
>  #include <asm/system.h>
>  #include <asm/io.h>
> +#if IS_ENABLED(CONFIG_ATARI_ETHERNEC)
> +#include <asm/atariints.h>
> +#endif
> 
>  #include "8390.h"
> 
> @@ -165,7 +168,8 @@ bad_clone_list[] __initdata = {
>  #if defined(CONFIG_PLAT_MAPPI)
>  #  define DCR_VAL 0x4b
>  #elif defined(CONFIG_PLAT_OAKS32R)  || \
> -   defined(CONFIG_MACH_TX49XX)
> +   defined(CONFIG_MACH_TX49XX) || \
> +   IS_ENABLED(CONFIG_ATARI_ETHERNEC)
>  #  define DCR_VAL 0x48        /* 8-bit mode */
>  #else
>  #  define DCR_VAL 0x49
> @@ -492,7 +496,16 @@ static int __init ne_probe1(struct net_device *dev,
> unsigned long ioaddr)
> 
>      /* Snarf the interrupt now.  There's no point in waiting since we cannot
>         share and the board will usually be enabled. */
> -    ret = request_irq(dev->irq, eip_interrupt, 0, name, dev);
> +#if IS_ENABLED(CONFIG_ATARI_ETHERNEC)
> +    if (MACH_IS_ATARI) {
> +        /* Atari EtherNEC emulates the card interrupt via a timer -
> +           this needs to be shared with the smc91C111 driver and with
> +           a dummy handler to catch unhandled interrupts ! */
> +        ret = request_irq(dev->irq, eip_interrupt, IRQF_SHARED, name, dev);
> +    } else
> +#endif
> +        ret = request_irq(dev->irq, eip_interrupt, 0, name, dev);
> +
>      if (ret) {
>          printk (" unable to get IRQ %d (errno=%d).\n", dev->irq, ret);
>          goto err_out;

Netdev people: are these changes to ne.c acceptable?

If yes, I'll split everything and queue it up (the ne.c part through netdev,
the rest through m68k).
If not, do you have a better solution[*]?
Are there other network drivers using/requiring a similar approach?

Thanks!

[*] I can imagine an alternative, which could be generalized for other
    platforms:
      - Leave the irq at zero to indicate polling.
      - In the driver, do

	if (!dev->irq) {
		ret = -E...;
#ifdef CONFIG_ATARI
		if (MACH_IS_ATARI) {
			ret = atari_request_poll(eip_interrupt, name, dev);
		}
#endif
	} else {
		ret = request_irq(dev->irq, ...);
		...
	}

	and a similar thing for free_irq().

This has the advantage that atari_request_poll() can decide to register the
timer interrupt only when EtherNEC or EtherNAT are active.

Gr{oetje,eeting}s,

						Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@...ux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
							    -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ