7 #include <linux/kernel.h>
8 #include <linux/sched.h>
9 #include <linux/types.h>
11 #include <linux/string.h>
13 #include <linux/errno.h>
15 #include <linux/netdevice.h>
18 #include <linux/if_ether.h>
19 #include <linux/if_arp.h>
22 #include <linux/bitops.h>
28 #define SIMETH_RECV_MAX 10
37 #define SIMETH_FRAME_SIZE ETH_FRAME_LEN
40 #define NETWORK_INTR 8
47 static int simeth_probe1(
void);
57 static char *simeth_version=
"0.3";
74 static char *simeth_device=
"eth0";
78 static volatile unsigned int card_count;
79 static int simeth_debug;
96 simeth_setup(
char *
str)
102 __setup(
"simeth=", simeth_setup);
124 netdev_probe(
char *
name,
unsigned char *
ether)
131 netdev_attach(
int fd,
int irq,
unsigned int ipaddr)
139 netdev_detach(
int fd)
147 netdev_send(
int fd,
unsigned char *
buf,
unsigned int len)
153 netdev_read(
int fd,
unsigned char *buf,
unsigned int len)
159 .ndo_open = simeth_open,
160 .ndo_stop = simeth_close,
161 .ndo_start_xmit = simeth_tx,
162 .ndo_get_stats = simeth_get_stats,
163 .ndo_set_rx_mode = set_multicast_list,
196 fd = netdev_probe(simeth_device, mac_addr);
206 local = netdev_priv(dev);
222 panic(
"%s: out of interrupt vectors!\n", __func__);
242 netif_start_queue(dev);
273 struct in_device *in_dev;
274 struct in_ifaddr **ifap =
NULL;
275 struct in_ifaddr *ifa =
NULL;
295 if ( !dev_is_ethdev(dev) )
return NOTIFY_DONE;
298 for (ifap=&in_dev->ifa_list; (ifa=*ifap) !=
NULL; ifap=&ifa->ifa_next)
299 if (
strcmp(dev->
name, ifa->ifa_label) == 0)
break;
315 local = netdev_priv(dev);
318 netdev_attach(local->
simfd, dev->
irq,
ntohl(ifa->ifa_local)):
319 netdev_detach(local->simfd);
322 event ==
NETDEV_UP ?
"attach":
"detach", r);
330 netif_stop_queue(dev);
341 frame_print(
unsigned char *
from,
unsigned char *
frame,
int len)
345 printk(
"%s: (%d) %02x", from, len, frame[0] & 0xff);
346 for(i=1; i < 6; i++ ) {
347 printk(
":%02x", frame[i] &0xff);
349 printk(
" %2x", frame[6] &0xff);
350 for(i=7; i < 12; i++ ) {
351 printk(
":%02x", frame[i] &0xff);
353 printk(
" [%02x%02x]\n", frame[12], frame[13]);
355 for(i=14; i < len; i++ ) {
356 printk(
"%02x ", frame[i] &0xff);
357 if ( (i%10)==0)
printk(
"\n");
380 unsigned int length = skb->
len;
384 local->
stats.tx_packets++;
387 if (simeth_debug > 5) frame_print(
"simeth_tx", skb->
data, length);
389 netdev_send(local->
simfd, skb->
data, length);
410 if ( nskb ==
NULL ) {
415 skb_reserve(nskb, 2);
433 local = netdev_priv(dev);
441 if ( (skb=make_new_skb(dev)) ==
NULL ) {
443 local->
stats.rx_dropped++;
460 skb_copy_to_linear_data(skb, frame, len);
464 if ( simeth_debug > 6 ) frame_print(
"simeth_rx", skb->
data, len);
471 local->
stats.rx_packets++;
474 }
while ( --rcv_count );
483 simeth_interrupt(
int irq,
void *
dev_id)
490 while (simeth_rx(dev));
499 return &local->
stats;