1 /* netdrv_init.c: Initialization for network devices. */ 3 Written 1993,1994,1995 by Donald Becker. 5 The author may be reached as becker@cesdis.gsfc.nasa.gov or 6 C/O Center of Excellence in Space Data and Information Sciences 7 Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 9 This file contains the initialization for the "pl14+" style ethernet 10 drivers. It should eventually replace most of drivers/net/Space.c. 11 It's primary advantage is that it's able to allocate low-memory buffers. 12 A secondary advantage is that the dangerous NE*000 netcards can reserve 13 their I/O port region before the SCSI probes start. 15 Modifications/additions by Bjorn Ekwall <bj0rn@blox.se>: 16 ethdev_index[MAX_ETH_CARDS] 17 register_netdev() / unregister_netdev() 19 Modifications by Wolfgang Walter 20 Use dev_close cleanly so we always shut things down tidily. 22 Changed 29/10/95, Alan Cox to pass sockaddr's around for mac addresses. 24 14/06/96 - Paul Gortmaker: Add generic eth_change_mtu() function. 25 24/09/96 - Paul Norton: Add token-ring variants of the netdev functions. 28 #include <linux/config.h> 29 #include <linux/kernel.h> 30 #include <linux/sched.h> 31 #include <linux/types.h> 33 #include <linux/malloc.h> 34 #include <linux/if_ether.h> 35 #include <linux/string.h> 36 #include <linux/netdevice.h> 37 #include <linux/etherdevice.h> 38 #include <linux/trdevice.h> 39 #include <linux/if_arp.h> 40 #include <linux/fddidevice.h> 41 #include <linux/net_alias.h> 42 #include <linux/if_ltalk.h> 44 /* The network devices currently exist only in the socket namespace, so these 45 entries are unused. The only ones that make sense are 46 open start the ethercard 47 close stop the ethercard 48 ioctl To get statistics, perhaps set the interface port (AUI, BNC, etc.) 49 One can also imagine getting raw packets using 51 but this is probably better handled by a raw packet socket. 53 Given that almost all of these functions are handled in the current 54 socket-based scheme, putting ethercard devices in /dev/ seems pointless. 56 [Removed all support for /dev network devices. When someone adds 57 streams then by magic we get them, but otherwise they are un-needed 61 /* The list of used and available "eth" slots (for "eth0", "eth1", etc.) */ 62 #define MAX_ETH_CARDS 16 63 static struct device
*ethdev_index
[MAX_ETH_CARDS
]; 66 /* Fill in the fields of the device structure with ethernet-generic values. 68 If no device structure is passed, a new one is constructed, complete with 69 a SIZEOF_PRIVATE private data area. 71 If an empty string area is passed as dev->name, or a new structure is made, 72 a new name string is constructed. The passed string area should be 8 bytes 77 init_etherdev(struct device
*dev
,int sizeof_priv
) 82 /* Use an existing correctly named device in Space.c:dev_base. */ 84 int alloc_size
=sizeof(struct device
) +sizeof("eth%d ") 86 struct device
*cur_dev
; 87 char pname
[8];/* Putative name for the device. */ 89 for(i
=0; i
< MAX_ETH_CARDS
; ++i
) 90 if(ethdev_index
[i
] == NULL
) { 91 sprintf(pname
,"eth%d", i
); 92 for(cur_dev
= dev_base
; cur_dev
; cur_dev
= cur_dev
->next
) 93 if(strcmp(pname
, cur_dev
->name
) ==0) { 96 sizeof_priv
= (sizeof_priv
+3) & ~3; 97 dev
->priv
= sizeof_priv
98 ?kmalloc(sizeof_priv
, GFP_KERNEL
) 100 if(dev
->priv
)memset(dev
->priv
,0, sizeof_priv
); 105 alloc_size
&= ~3;/* Round to dword boundary. */ 107 dev
= (struct device
*)kmalloc(alloc_size
, GFP_KERNEL
); 108 memset(dev
,0, alloc_size
); 110 dev
->priv
= (void*) (dev
+1); 111 dev
->name
= sizeof_priv
+ (char*)(dev
+1); 115 found
:/* From the double loop above. */ 118 ((dev
->name
[0] =='\0') || (dev
->name
[0] ==' '))) { 119 for(i
=0; i
< MAX_ETH_CARDS
; ++i
) 120 if(ethdev_index
[i
] == NULL
) { 121 sprintf(dev
->name
,"eth%d", i
); 122 ethdev_index
[i
] = dev
; 127 ether_setup(dev
);/* Hmmm, should this be called here? */ 130 /* Append the device to the device queue. */ 131 struct device
**old_devp
= &dev_base
; 132 while((*old_devp
)->next
) 133 old_devp
= & (*old_devp
)->next
; 134 (*old_devp
)->next
= dev
; 141 static inteth_mac_addr(struct device
*dev
,void*p
) 143 struct sockaddr
*addr
=p
; 146 memcpy(dev
->dev_addr
, addr
->sa_data
,dev
->addr_len
); 150 static inteth_change_mtu(struct device
*dev
,int new_mtu
) 152 if((new_mtu
<68) || (new_mtu
>1500)) 160 static intfddi_change_mtu(struct device
*dev
,int new_mtu
) 162 if((new_mtu
< FDDI_K_SNAP_HLEN
) || (new_mtu
> FDDI_K_SNAP_DLEN
)) 171 voidether_setup(struct device
*dev
) 174 /* Fill in the fields of the device structure with ethernet-generic values. 175 This should be in a common file instead of per-driver. */ 177 dev_init_buffers(dev
); 179 /* register boot-defined "eth" devices */ 180 if(dev
->name
&& (strncmp(dev
->name
,"eth",3) ==0)) { 181 i
=simple_strtoul(dev
->name
+3, NULL
,0); 182 if(ethdev_index
[i
] == NULL
) { 183 ethdev_index
[i
] = dev
; 185 else if(dev
!= ethdev_index
[i
]) { 186 /* Really shouldn't happen! */ 187 printk("ether_setup: Ouch! Someone else took %s\n", 192 dev
->change_mtu
= eth_change_mtu
; 193 dev
->hard_header
= eth_header
; 194 dev
->rebuild_header
= eth_rebuild_header
; 195 dev
->set_mac_address
= eth_mac_addr
; 196 dev
->hard_header_cache
= eth_header_cache
; 197 dev
->header_cache_update
= eth_header_cache_update
; 199 dev
->type
= ARPHRD_ETHER
; 200 dev
->hard_header_len
= ETH_HLEN
; 201 dev
->mtu
=1500;/* eth_mtu */ 202 dev
->addr_len
= ETH_ALEN
; 203 dev
->tx_queue_len
=100;/* Ethernet wants good queues */ 205 memset(dev
->broadcast
,0xFF, ETH_ALEN
); 207 /* New-style flags. */ 208 dev
->flags
= IFF_BROADCAST
|IFF_MULTICAST
; 209 dev
->family
= AF_INET
; 218 voidfddi_setup(struct device
*dev
) 221 * Fill in the fields of the device structure with FDDI-generic values. 222 * This should be in a common file instead of per-driver. 225 dev_init_buffers(dev
); 227 dev
->change_mtu
= fddi_change_mtu
; 228 dev
->hard_header
= fddi_header
; 229 dev
->rebuild_header
= fddi_rebuild_header
; 231 dev
->type
= ARPHRD_FDDI
; 232 dev
->hard_header_len
= FDDI_K_SNAP_HLEN
+3;/* Assume 802.2 SNAP hdr len + 3 pad bytes */ 233 dev
->mtu
= FDDI_K_SNAP_DLEN
;/* Assume max payload of 802.2 SNAP frame */ 234 dev
->addr_len
= FDDI_K_ALEN
; 235 dev
->tx_queue_len
=100;/* Long queues on FDDI */ 237 memset(dev
->broadcast
,0xFF, FDDI_K_ALEN
); 239 /* New-style flags */ 240 dev
->flags
= IFF_BROADCAST
| IFF_MULTICAST
; 241 dev
->family
= AF_INET
; 251 #if defined(CONFIG_ATALK) || defined(CONFIG_ATALK_MODULE) 253 static intltalk_change_mtu(struct device
*dev
,int mtu
) 258 static intltalk_mac_addr(struct device
*dev
,void*addr
) 264 voidltalk_setup(struct device
*dev
) 266 /* Fill in the fields of the device structure with localtalk-generic values. */ 268 dev_init_buffers(dev
); 270 dev
->change_mtu
= ltalk_change_mtu
; 271 dev
->hard_header
= NULL
; 272 dev
->rebuild_header
= NULL
; 273 dev
->set_mac_address
= ltalk_mac_addr
; 274 dev
->hard_header_cache
= NULL
; 275 dev
->header_cache_update
= NULL
; 277 dev
->type
= ARPHRD_LOCALTLK
; 278 dev
->hard_header_len
= LTALK_HLEN
; 279 dev
->mtu
= LTALK_MTU
; 280 dev
->addr_len
= LTALK_ALEN
; 281 dev
->tx_queue_len
=10; 283 dev
->broadcast
[0] =0xFF; 285 dev
->flags
= IFF_BROADCAST
|IFF_MULTICAST
|IFF_NOARP
; 286 dev
->family
= AF_APPLETALK
; 295 intether_config(struct device
*dev
,struct ifmap
*map
) 297 if(map
->mem_start
!= (u_long
)(-1)) 298 dev
->mem_start
= map
->mem_start
; 299 if(map
->mem_end
!= (u_long
)(-1)) 300 dev
->mem_end
= map
->mem_end
; 301 if(map
->base_addr
!= (u_short
)(-1)) 302 dev
->base_addr
= map
->base_addr
; 303 if(map
->irq
!= (u_char
)(-1)) 305 if(map
->dma
!= (u_char
)(-1)) 307 if(map
->port
!= (u_char
)(-1)) 308 dev
->if_port
= map
->port
; 312 intregister_netdev(struct device
*dev
) 314 struct device
*d
= dev_base
; 323 ((dev
->name
[0] =='\0') || (dev
->name
[0] ==' '))) { 324 for(i
=0; i
< MAX_ETH_CARDS
; ++i
) 325 if(ethdev_index
[i
] == NULL
) { 326 sprintf(dev
->name
,"eth%d", i
); 327 printk("loading device '%s'...\n", dev
->name
); 328 ethdev_index
[i
] = dev
; 334 sti();/* device probes assume interrupts enabled */ 335 if(dev
->init(dev
) !=0) { 336 if(i
< MAX_ETH_CARDS
) ethdev_index
[i
] = NULL
; 337 restore_flags(flags
); 343 /* Add device to end of chain */ 352 dev
->ifindex
=dev_new_index(); 354 restore_flags(flags
); 358 voidunregister_netdev(struct device
*dev
) 360 struct device
*d
= dev_base
; 369 printk("was NULL\n"); 370 restore_flags(flags
); 375 printk("ERROR '%s' busy and not MOD_IN_USE.\n", dev
->name
); 378 * must jump over main_device+aliases 379 * avoid alias devices unregistration so that only 380 * net_alias module manages them 382 #ifdef CONFIG_NET_ALIAS 384 dev_base
=net_alias_nextdev(dev
); 387 while(d
&& (net_alias_nextdev(d
) != dev
))/* skip aliases */ 388 d
=net_alias_nextdev(d
); 390 if(d
&& (net_alias_nextdev(d
) == dev
)) 393 * Critical: Bypass by consider devices as blocks (maindev+aliases) 395 net_alias_nextdev_set(d
,net_alias_nextdev(dev
)); 399 dev_base
= dev
->next
; 402 while(d
&& (d
->next
!= dev
)) 405 if(d
&& (d
->next
== dev
)) 412 printk("unregister_netdev: '%s' not found\n", dev
->name
); 413 restore_flags(flags
); 417 for(i
=0; i
< MAX_ETH_CARDS
; ++i
) 419 if(ethdev_index
[i
] == dev
) 421 ethdev_index
[i
] = NULL
; 426 restore_flags(flags
); 429 * You can i.e use a interfaces in a route though it is not up. 430 * We call close_dev (which is changed: it will down a device even if 431 * dev->flags==0 (but it will not call dev->stop if IFF_UP 433 * This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev), 434 * dev_mc_discard(dev), .... 441 /* The list of used and available "tr" slots */ 442 #define MAX_TR_CARDS 16 443 static struct device
*trdev_index
[MAX_TR_CARDS
]; 445 struct device
*init_trdev(struct device
*dev
,int sizeof_priv
) 450 /* Use an existing correctly named device in Space.c:dev_base. */ 452 int alloc_size
=sizeof(struct device
) +sizeof("tr%d ") 454 struct device
*cur_dev
; 455 char pname
[8];/* Putative name for the device. */ 457 for(i
=0; i
< MAX_TR_CARDS
; ++i
) 458 if(trdev_index
[i
] == NULL
) { 459 sprintf(pname
,"tr%d", i
); 460 for(cur_dev
= dev_base
; cur_dev
; cur_dev
= cur_dev
->next
) 461 if(strcmp(pname
, cur_dev
->name
) ==0) { 464 sizeof_priv
= (sizeof_priv
+3) & ~3; 465 dev
->priv
= sizeof_priv
466 ?kmalloc(sizeof_priv
, GFP_KERNEL
) 468 if(dev
->priv
)memset(dev
->priv
,0, sizeof_priv
); 473 alloc_size
&= ~3;/* Round to dword boundary. */ 474 dev
= (struct device
*)kmalloc(alloc_size
, GFP_KERNEL
); 475 memset(dev
,0, alloc_size
); 477 dev
->priv
= (void*) (dev
+1); 478 dev
->name
= sizeof_priv
+ (char*)(dev
+1); 482 trfound
:/* From the double loop above. */ 484 for(i
=0; i
< MAX_TR_CARDS
; ++i
) 485 if(trdev_index
[i
] == NULL
) { 486 sprintf(dev
->name
,"tr%d", i
); 487 trdev_index
[i
] = dev
; 492 /* Append the device to the device queue. */ 493 struct device
**old_devp
= &dev_base
; 495 while((*old_devp
)->next
) 496 old_devp
= & (*old_devp
)->next
; 497 (*old_devp
)->next
= dev
; 501 dev
->hard_header
= tr_header
; 502 dev
->rebuild_header
= tr_rebuild_header
; 504 dev
->type
= ARPHRD_IEEE802
; 505 dev
->hard_header_len
= TR_HLEN
; 506 dev
->mtu
=2000;/* bug in fragmenter...*/ 507 dev
->addr_len
= TR_ALEN
; 508 dev
->tx_queue_len
=100;/* Long queues on tr */ 510 memset(dev
->broadcast
,0xFF, TR_ALEN
); 512 /* New-style flags. */ 513 dev
->flags
= IFF_BROADCAST
; 514 dev
->family
= AF_INET
; 523 voidtr_setup(struct device
*dev
) 527 /* register boot-defined "tr" devices */ 528 if(dev
->name
&& (strncmp(dev
->name
,"tr",2) ==0)) { 529 i
=simple_strtoul(dev
->name
+2, NULL
,0); 530 if(trdev_index
[i
] == NULL
) { 531 trdev_index
[i
] = dev
; 533 else if(dev
!= trdev_index
[i
]) { 534 /* Really shouldn't happen! */ 535 printk("tr_setup: Ouch! Someone else took %s\n", 541 voidtr_freedev(struct device
*dev
) 544 for(i
=0; i
< MAX_TR_CARDS
; ++i
) 546 if(trdev_index
[i
] == dev
) 548 trdev_index
[i
] = NULL
; 554 intregister_trdev(struct device
*dev
) 558 dev_init_buffers(dev
); 562 if(dev
&& dev
->init
) { 563 sti();/* device probes assume interrupts enabled */ 564 if(dev
->init(dev
) !=0) { 565 unregister_trdev(dev
); 566 restore_flags(flags
); 572 restore_flags(flags
); 576 voidunregister_trdev(struct device
*dev
) 578 struct device
*d
= dev_base
; 586 printk("was NULL\n"); 587 restore_flags(flags
); 592 printk("ERROR '%s' busy and not MOD_IN_USE.\n", dev
->name
); 595 * must jump over main_device+aliases 596 * avoid alias devices unregistration so that only 597 * net_alias module manages them 599 #ifdef CONFIG_NET_ALIAS 601 dev_base
=net_alias_nextdev(dev
); 604 while(d
&& (net_alias_nextdev(d
) != dev
))/* skip aliases */ 605 d
=net_alias_nextdev(d
); 607 if(d
&& (net_alias_nextdev(d
) == dev
)) 610 * Critical: Bypass by consider devices as blocks (maindev+aliases) 612 net_alias_nextdev_set(d
,net_alias_nextdev(dev
)); 616 dev_base
= dev
->next
; 619 while(d
&& (d
->next
!= dev
)) 622 if(d
&& (d
->next
== dev
)) 629 printk("unregister_trdev: '%s' not found\n", dev
->name
); 630 restore_flags(flags
); 637 restore_flags(flags
); 640 * You can i.e use a interfaces in a route though it is not up. 641 * We call close_dev (which is changed: it will down a device even if 642 * dev->flags==0 (but it will not call dev->stop if IFF_UP 644 * This will call notifier_call_chain(&netdev_chain, NETDEV_DOWN, dev), 645 * dev_mc_discard(dev), .... 655 * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c net_init.c" 657 * kept-new-versions: 5