1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * INET An implementation of the TCP/IP protocol suite for the LINUX 4 * operating system. INET is implemented using the BSD Socket 5 * interface as the means of communication with the user level. 6 * 7 * Holds initial configuration information for devices. 8 * 9 * Version: @(#)Space.c 1.0.7 08/12/93 10 * 11 * Authors: Ross Biro 12 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 13 * Donald J. Becker, <becker@scyld.com> 14 * 15 * Changelog: 16 * Stephen Hemminger (09/2003) 17 * - get rid of pre-linked dev list, dynamic device allocation 18 * Paul Gortmaker (03/2002) 19 * - struct init cleanup, enable multiple ISA autoprobes. 20 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 09/1999 21 * - fix sbni: s/device/net_device/ 22 * Paul Gortmaker (06/98): 23 * - sort probes in a sane way, make sure all (safe) probes 24 * get run once & failed autoprobes don't autoprobe again. 25 */ 26 #include <linux/netdevice.h> 27 #include <linux/etherdevice.h> 28 #include <linux/errno.h> 29 #include <linux/init.h> 30 #include <linux/netlink.h> 31 #include <net/Space.h> 32 33 /* 34 * This structure holds boot-time configured netdevice settings. They 35 * are then used in the device probing. 36 */ 37 struct netdev_boot_setup { 38 char name[IFNAMSIZ]; 39 struct ifmap map; 40 }; 41 #define NETDEV_BOOT_SETUP_MAX 8 42 43 44 /****************************************************************************** 45 * 46 * Device Boot-time Settings Routines 47 * 48 ******************************************************************************/ 49 50 /* Boot time configuration table */ 51 static struct netdev_boot_setup dev_boot_setup[NETDEV_BOOT_SETUP_MAX]; 52 53 /** 54 * netdev_boot_setup_add - add new setup entry 55 * @name: name of the device 56 * @map: configured settings for the device 57 * 58 * Adds new setup entry to the dev_boot_setup list. The function 59 * returns 0 on error and 1 on success. This is a generic routine to 60 * all netdevices. 61 */ 62 static int netdev_boot_setup_add(char *name, struct ifmap *map) 63 { 64 struct netdev_boot_setup *s; 65 int i; 66 67 s = dev_boot_setup; 68 for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { 69 if (s[i].name[0] == '\0' || s[i].name[0] == ' ') { 70 strscpy_pad(s[i].name, name); 71 memcpy(&s[i].map, map, sizeof(s[i].map)); 72 break; 73 } 74 } 75 76 return i >= NETDEV_BOOT_SETUP_MAX ? 0 : 1; 77 } 78 79 /** 80 * netdev_boot_setup_check - check boot time settings 81 * @dev: the netdevice 82 * 83 * Check boot time settings for the device. 84 * The found settings are set for the device to be used 85 * later in the device probing. 86 * Returns 0 if no settings found, 1 if they are. 87 */ 88 int netdev_boot_setup_check(struct net_device *dev) 89 { 90 struct netdev_boot_setup *s = dev_boot_setup; 91 int i; 92 93 for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) { 94 if (s[i].name[0] != '\0' && s[i].name[0] != ' ' && 95 !strcmp(dev->name, s[i].name)) { 96 dev->irq = s[i].map.irq; 97 dev->base_addr = s[i].map.base_addr; 98 dev->mem_start = s[i].map.mem_start; 99 dev->mem_end = s[i].map.mem_end; 100 return 1; 101 } 102 } 103 return 0; 104 } 105 EXPORT_SYMBOL(netdev_boot_setup_check); 106 107 /** 108 * netdev_boot_base - get address from boot time settings 109 * @prefix: prefix for network device 110 * @unit: id for network device 111 * 112 * Check boot time settings for the base address of device. 113 * The found settings are set for the device to be used 114 * later in the device probing. 115 * Returns 0 if no settings found. 116 */ 117 static unsigned long netdev_boot_base(const char *prefix, int unit) 118 { 119 const struct netdev_boot_setup *s = dev_boot_setup; 120 char name[IFNAMSIZ]; 121 int i; 122 123 sprintf(name, "%s%d", prefix, unit); 124 125 /* 126 * If device already registered then return base of 1 127 * to indicate not to probe for this interface 128 */ 129 if (__dev_get_by_name(&init_net, name)) 130 return 1; 131 132 for (i = 0; i < NETDEV_BOOT_SETUP_MAX; i++) 133 if (!strcmp(name, s[i].name)) 134 return s[i].map.base_addr; 135 return 0; 136 } 137 138 /* 139 * Saves at boot time configured settings for any netdevice. 140 */ 141 static int __init netdev_boot_setup(char *str) 142 { 143 int ints[5]; 144 struct ifmap map; 145 146 str = get_options(str, ARRAY_SIZE(ints), ints); 147 if (!str || !*str) 148 return 0; 149 150 /* Save settings */ 151 memset(&map, 0, sizeof(map)); 152 if (ints[0] > 0) 153 map.irq = ints[1]; 154 if (ints[0] > 1) 155 map.base_addr = ints[2]; 156 if (ints[0] > 2) 157 map.mem_start = ints[3]; 158 if (ints[0] > 3) 159 map.mem_end = ints[4]; 160 161 /* Add new entry to the list */ 162 return netdev_boot_setup_add(str, &map); 163 } 164 165 __setup("netdev=", netdev_boot_setup); 166 167 static int __init ether_boot_setup(char *str) 168 { 169 return netdev_boot_setup(str); 170 } 171 __setup("ether=", ether_boot_setup); 172 173 174 /* A unified ethernet device probe. This is the easiest way to have every 175 * ethernet adaptor have the name "eth[0123...]". 176 */ 177 178 struct devprobe2 { 179 struct net_device *(*probe)(int unit); 180 int status; /* non-zero if autoprobe has failed */ 181 }; 182 183 static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe) 184 { 185 struct net_device *dev; 186 187 for (; p->probe; p++) { 188 if (autoprobe && p->status) 189 continue; 190 dev = p->probe(unit); 191 if (!IS_ERR(dev)) 192 return 0; 193 if (autoprobe) 194 p->status = PTR_ERR(dev); 195 } 196 return -ENODEV; 197 } 198 199 /* ISA probes that touch addresses < 0x400 (including those that also 200 * look for EISA/PCI cards in addition to ISA cards). 201 */ 202 static struct devprobe2 isa_probes[] __initdata = { 203 #ifdef CONFIG_3C515 204 {tc515_probe, 0}, 205 #endif 206 #ifdef CONFIG_ULTRA 207 {ultra_probe, 0}, 208 #endif 209 #ifdef CONFIG_WD80x3 210 {wd_probe, 0}, 211 #endif 212 #if defined(CONFIG_NE2000) /* ISA (use ne2k-pci for PCI cards) */ 213 {ne_probe, 0}, 214 #endif 215 #ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */ 216 {lance_probe, 0}, 217 #endif 218 #ifdef CONFIG_SMC9194 219 {smc_init, 0}, 220 #endif 221 #ifdef CONFIG_CS89x0_ISA 222 {cs89x0_probe, 0}, 223 #endif 224 {NULL, 0}, 225 }; 226 227 /* Unified ethernet device probe, segmented per architecture and 228 * per bus interface. This drives the legacy devices only for now. 229 */ 230 231 static void __init ethif_probe2(int unit) 232 { 233 unsigned long base_addr = netdev_boot_base("eth", unit); 234 235 if (base_addr == 1) 236 return; 237 238 probe_list2(unit, isa_probes, base_addr == 0); 239 } 240 241 /* Statically configured drivers -- order matters here. */ 242 static int __init net_olddevs_init(void) 243 { 244 int num; 245 246 for (num = 0; num < 8; ++num) 247 ethif_probe2(num); 248 249 return 0; 250 } 251 252 device_initcall(net_olddevs_init); 253