[patch] fix ether= kernel parameter

From: Andrew Morton (andrewm@uow.edu.au)
Date: Mon Feb 26 2001 - 08:20:04 EST


A few people have reported that 3c509.c is incorrectly selecting
the BNC connector when used non-modularly.

This is due to 2.2-vs-2.4 incompatibility in the handling
of the `ether=' kernel option. The `ether=' option takes
up to five args. If any are omitted, they default to zero
in kernel 2.2 and to -1 in kernel 2.4. This will break
a lot more drivers than just 3c509 - five or six, including
natsemi.c and hamachi.c.

This patch restores the 2.2 behaviour.

Notes:

- The `netdev=' and `ether=' kernel options are identical.
  So `ether_setup()' is removed, and the `ether=' option
  calls netdev_boot_setup() instead. We can re-fork the
  implementation later if these options become different.

- drivers/net/net_init.c:ether_config() isn't used
  anywhere. It has been removed.

- In 3c59x.c and starfire.c: remove the recently-added
  workarounds for dev->mem_start == -1.

Patch is against 2.4.2-ac4. It also applies to 2.4.2 (ignore
the rejects).

--- linux-2.4.2-ac4/include/linux/netdevice.h Mon Feb 26 23:18:02 2001
+++ lk/include/linux/netdevice.h Mon Feb 26 23:36:39 2001
@@ -630,7 +630,6 @@
 extern void tr_setup(struct net_device *dev);
 extern void fc_setup(struct net_device *dev);
 extern void fc_freedev(struct net_device *dev);
-extern int ether_config(struct net_device *dev, struct ifmap *map);
 /* Support for loadable net-drivers */
 extern int register_netdev(struct net_device *dev);
 extern void unregister_netdev(struct net_device *dev);
--- linux-2.4.2-ac4/drivers/net/net_init.c Sun Feb 25 17:37:06 2001
+++ lk/drivers/net/net_init.c Mon Feb 26 23:36:34 2001
@@ -390,23 +390,6 @@
 
 #endif /* CONFIG_ATALK || CONFIG_ATALK_MODULE */
 
-int ether_config(struct net_device *dev, struct ifmap *map)
-{
- if (map->mem_start != (u_long)(-1))
- dev->mem_start = map->mem_start;
- if (map->mem_end != (u_long)(-1))
- dev->mem_end = map->mem_end;
- if (map->base_addr != (u_short)(-1))
- dev->base_addr = map->base_addr;
- if (map->irq != (u_char)(-1))
- dev->irq = map->irq;
- if (map->dma != (u_char)(-1))
- dev->dma = map->dma;
- if (map->port != (u_char)(-1))
- dev->if_port = map->port;
- return 0;
-}
-
 int register_netdev(struct net_device *dev)
 {
         int err;
--- linux-2.4.2-ac4/drivers/net/3c59x.c Mon Feb 26 23:17:41 2001
+++ lk/drivers/net/3c59x.c Mon Feb 26 23:36:34 2001
@@ -1003,7 +1003,7 @@
                 pdev->driver_data = dev;
 
         /* The lower four bits are the media type. */
- if (dev->mem_start && dev->mem_start != ~0UL) {
+ if (dev->mem_start) {
                 /*
                  * AKPM: ewww.. The 'options' param is passed in as the third arg to the
                  * LILO 'ether=' argument for non-modular use
--- linux-2.4.2-ac4/drivers/net/starfire.c Mon Feb 26 23:17:44 2001
+++ lk/drivers/net/starfire.c Mon Feb 26 23:36:34 2001
@@ -836,7 +836,7 @@
         np->pci_dev = pdev;
         drv_flags = netdrv_tbl[chip_idx].drv_flags;
 
- if (dev->mem_start && dev->mem_start != ~0UL)
+ if (dev->mem_start)
                 option = dev->mem_start;
 
         /* The lower four bits are the media type. */
--- linux-2.4.2-ac4/net/ethernet/eth.c Wed Aug 23 01:59:00 2000
+++ lk/net/ethernet/eth.c Mon Feb 26 23:58:09 2001
@@ -30,6 +30,7 @@
  * Alan Cox : Protect against forwarding explosions with
  * older network drivers and IFF_ALLMULTI.
  * Christer Weinigel : Better rebuild header message.
+ * Andrew Morton : 26Feb01: kill ether_setup() - use netdev_boot_setup().
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -60,31 +61,9 @@
 #include <asm/system.h>
 #include <asm/checksum.h>
 
-static int __init eth_setup(char *str)
-{
- int ints[5];
- struct ifmap map;
+extern int __init netdev_boot_setup(char *str);
 
- str = get_options(str, ARRAY_SIZE(ints), ints);
- if (!str || !*str)
- return 0;
-
- /* Save settings */
- memset(&map, -1, sizeof(map));
- if (ints[0] > 0)
- map.irq = ints[1];
- if (ints[0] > 1)
- map.base_addr = ints[2];
- if (ints[0] > 2)
- map.mem_start = ints[3];
- if (ints[0] > 3)
- map.mem_end = ints[4];
-
- /* Add new entry to the list */
- return netdev_boot_setup_add(str, &map);
-}
-
-__setup("ether=", eth_setup);
+__setup("ether=", netdev_boot_setup);
 
 /*
  * Create the Ethernet MAC header for an arbitrary protocol layer
--- linux-2.4.2-ac4/Documentation/kernel-parameters.txt Sun Dec 31 06:23:13 2000
+++ lk/Documentation/kernel-parameters.txt Mon Feb 26 23:55:41 2001
@@ -188,8 +188,10 @@
 
         es1371= [HW,SOUND]
  
- ether= [HW,NET] Ethernet cards parameters (iomem, irq,
- dev_name).
+ ether= [HW,NET] Ethernet cards parameters (irq,
+ base_io_addr, mem_start, mem_end, name.
+ (mem_start is often overloaded to mean something
+ different and driver-specific).
 
         fd_mcs= [HW,SCSI]
 
@@ -328,7 +330,11 @@
 
         ncr53c8xx= [HW,SCSI]
 
- netdev= [NET]
+ netdev= [NET] Ethernet cards parameters (irq,
+ base_io_addr, mem_start, mem_end, name.
+ (mem_start is often overloaded to mean something
+ different and driver-specific).
+ (cf: ether=)
  
         nfsaddrs= [NFS]
 
--- linux-2.4.2-ac4/net/core/dev.c Mon Feb 26 23:18:06 2001
+++ lk/net/core/dev.c Mon Feb 26 23:56:30 2001
@@ -351,7 +351,7 @@
 /*
  * Saves at boot time configured settings for any netdevice.
  */
-static int __init netdev_boot_setup(char *str)
+int __init netdev_boot_setup(char *str)
 {
         int ints[5];
         struct ifmap map;
@@ -361,7 +361,7 @@
                 return 0;
 
         /* Save settings */
- memset(&map, -1, sizeof(map));
+ memset(&map, 0, sizeof(map));
         if (ints[0] > 0)
                 map.irq = ints[1];
         if (ints[0] > 1)

-
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Wed Feb 28 2001 - 21:00:11 EST