1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80#define MAX_POLL_TIME 10
81
82static char version[] =
83 "bionet.c:v1.0 06-feb-96 (c) Hartmut Laue.\n";
84
85#include <linux/module.h>
86
87#include <linux/errno.h>
88#include <linux/kernel.h>
89#include <linux/jiffies.h>
90#include <linux/types.h>
91#include <linux/fcntl.h>
92#include <linux/interrupt.h>
93#include <linux/ioport.h>
94#include <linux/in.h>
95#include <linux/slab.h>
96#include <linux/string.h>
97#include <linux/delay.h>
98#include <linux/timer.h>
99#include <linux/init.h>
100
101#include <linux/netdevice.h>
102#include <linux/etherdevice.h>
103#include <linux/skbuff.h>
104
105#include <asm/setup.h>
106#include <asm/pgtable.h>
107#include <asm/system.h>
108#include <asm/bitops.h>
109#include <asm/io.h>
110#include <asm/dma.h>
111#include <asm/atarihw.h>
112#include <asm/atariints.h>
113#include <asm/atari_acsi.h>
114#include <asm/atari_stdma.h>
115
116
117extern struct net_device *init_etherdev(struct net_device *dev, int sizeof_private);
118
119
120
121#ifndef NET_DEBUG
122#define NET_DEBUG 0
123#endif
124
125
126
127unsigned int bionet_debug = NET_DEBUG;
128MODULE_PARM(bionet_debug, "i");
129MODULE_PARM_DESC(bionet_debug, "bionet debug level (0-2)");
130MODULE_LICENSE("GPL");
131
132static unsigned int bionet_min_poll_time = 2;
133
134
135
136
137struct net_local {
138 struct net_device_stats stats;
139 long open_time;
140 int poll_time;
141};
142
143static struct nic_pkt_s {
144 unsigned char status;
145 unsigned char dummy;
146 unsigned char l_lo, l_hi;
147 unsigned char buffer[3000];
148} *nic_packet;
149unsigned char *phys_nic_packet;
150
151
152
153extern int bionet_probe(struct net_device *dev);
154
155static int bionet_open(struct net_device *dev);
156static int bionet_send_packet(struct sk_buff *skb, struct net_device *dev);
157static void bionet_poll_rx(struct net_device *);
158static int bionet_close(struct net_device *dev);
159static struct net_device_stats *net_get_stats(struct net_device *dev);
160static void bionet_tick(unsigned long);
161
162static struct timer_list bionet_timer = { function: bionet_tick };
163
164#define STRAM_ADDR(a) (((a) & 0xff000000) == 0)
165
166
167
168
169#define NODE_ADR 0x60
170
171#define C_READ 8
172#define C_WRITE 0x0a
173#define C_GETEA 0x0f
174#define C_SETCR 0x0e
175
176static int
177sendcmd(unsigned int a0, unsigned int mod, unsigned int cmd) {
178 unsigned int c;
179
180 dma_wd.dma_mode_status = (mod | ((a0) ? 2 : 0) | 0x88);
181 dma_wd.fdc_acces_seccount = cmd;
182 dma_wd.dma_mode_status = (mod | 0x8a);
183
184 if( !acsi_wait_for_IRQ(HZ/2) )
185 return -1;
186
187 c = dma_wd.fdc_acces_seccount;
188 return (c & 0xff);
189}
190
191
192static void
193set_status(int cr) {
194 sendcmd(0,0x100,NODE_ADR | C_SETCR);
195 sendcmd(1,0x100,cr);
196
197 dma_wd.dma_mode_status = 0x80;
198}
199
200static int
201get_status(unsigned char *adr) {
202 int i,c;
203
204 DISABLE_IRQ();
205 c = sendcmd(0,0x00,NODE_ADR | C_GETEA);
206 if( c < 0 ) goto gsend;
207
208
209
210 for (i=0; i<6; i++) {
211 dma_wd.fdc_acces_seccount = 0;
212
213 if( !acsi_wait_for_IRQ(HZ/2) ) {
214 c = -1;
215 goto gsend;
216 }
217 c = dma_wd.fdc_acces_seccount;
218 *adr++ = (unsigned char)c;
219 }
220 c = 1;
221gsend:
222 dma_wd.dma_mode_status = 0x80;
223 return c;
224}
225
226static void
227bionet_intr(int irq, void *data, struct pt_regs *fp) {
228 return;
229}
230
231
232static int
233get_frame(unsigned long paddr, int odd) {
234 int c;
235 unsigned long flags;
236
237 DISABLE_IRQ();
238 save_flags(flags);
239 cli();
240
241 dma_wd.dma_mode_status = 0x9a;
242 dma_wd.dma_mode_status = 0x19a;
243 dma_wd.dma_mode_status = 0x9a;
244 dma_wd.fdc_acces_seccount = 0x04;
245 dma_wd.dma_lo = (unsigned char)paddr;
246 paddr >>= 8;
247 dma_wd.dma_md = (unsigned char)paddr;
248 paddr >>= 8;
249 dma_wd.dma_hi = (unsigned char)paddr;
250 restore_flags(flags);
251
252 c = sendcmd(0,0x00,NODE_ADR | C_READ);
253 if( c < 128 ) goto rend;
254
255
256
257 c = sendcmd(1,0x00,odd);
258 dma_wd.dma_mode_status = 0x0a;
259
260 if( !acsi_wait_for_IRQ(100) ) {
261 c = -1;
262 goto rend;
263 }
264 dma_wd.dma_mode_status = 0x8a;
265 dma_wd.dma_mode_status = 0x18a;
266 dma_wd.dma_mode_status = 0x8a;
267 c = dma_wd.fdc_acces_seccount;
268
269 dma_wd.dma_mode_status = 0x88;
270 c = dma_wd.fdc_acces_seccount;
271 c = 1;
272
273rend:
274 dma_wd.dma_mode_status = 0x80;
275 udelay(40);
276 acsi_wait_for_noIRQ(20);
277 return c;
278}
279
280
281static int
282hardware_send_packet(unsigned long paddr, int cnt) {
283 unsigned int c;
284 unsigned long flags;
285
286 DISABLE_IRQ();
287 save_flags(flags);
288 cli();
289
290 dma_wd.dma_mode_status = 0x19a;
291 dma_wd.dma_mode_status = 0x9a;
292 dma_wd.dma_mode_status = 0x19a;
293 dma_wd.dma_lo = (unsigned char)paddr;
294 paddr >>= 8;
295 dma_wd.dma_md = (unsigned char)paddr;
296 paddr >>= 8;
297 dma_wd.dma_hi = (unsigned char)paddr;
298
299 dma_wd.fdc_acces_seccount = 0x4;
300 restore_flags(flags);
301
302 c = sendcmd(0,0x100,NODE_ADR | C_WRITE);
303 c = sendcmd(1,0x100,cnt&0xff);
304 c = sendcmd(1,0x100,cnt>>8);
305
306
307
308 dma_wd.dma_mode_status = 0x10a;
309 if( !acsi_wait_for_IRQ(100) )
310 goto end;
311
312 dma_wd.dma_mode_status = 0x19a;
313 c = dma_wd.fdc_acces_seccount;
314
315end:
316 c = sendcmd(1,0x100,0);
317 c = sendcmd(1,0x100,0);
318
319 dma_wd.dma_mode_status = 0x180;
320 udelay(40);
321 acsi_wait_for_noIRQ(20);
322 return( c & 0x02);
323}
324
325
326
327
328int __init
329bionet_probe(struct net_device *dev){
330 unsigned char station_addr[6];
331 static unsigned version_printed;
332 static int no_more_found;
333 int i;
334
335 if (!MACH_IS_ATARI || no_more_found)
336 return -ENODEV;
337
338 printk("Probing for BioNet 100 Adapter...\n");
339
340 stdma_lock(bionet_intr, NULL);
341 i = get_status(station_addr);
342 ENABLE_IRQ();
343 stdma_release();
344
345
346
347
348 if( i < 0
349 || station_addr[0] != 'B'
350 || station_addr[1] != 'I'
351 || station_addr[2] != 'O' ) {
352 no_more_found = 1;
353 printk( "No BioNet 100 found.\n" );
354 return -ENODEV;
355 }
356
357 SET_MODULE_OWNER(dev);
358
359 if (bionet_debug > 0 && version_printed++ == 0)
360 printk(version);
361
362 printk("%s: %s found, eth-addr: %02x-%02x-%02x:%02x-%02x-%02x.\n",
363 dev->name, "BioNet 100",
364 station_addr[0], station_addr[1], station_addr[2],
365 station_addr[3], station_addr[4], station_addr[5]);
366
367
368
369 nic_packet = (struct nic_pkt_s *)acsi_buffer;
370 phys_nic_packet = (unsigned char *)phys_acsi_buffer;
371 if (bionet_debug > 0) {
372 printk("nic_packet at 0x%p, phys at 0x%p\n",
373 nic_packet, phys_nic_packet );
374 }
375
376 if (dev->priv == NULL)
377 dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
378 if (!dev->priv)
379 return -ENOMEM;
380 memset(dev->priv, 0, sizeof(struct net_local));
381
382 dev->open = bionet_open;
383 dev->stop = bionet_close;
384 dev->hard_start_xmit = bionet_send_packet;
385 dev->get_stats = net_get_stats;
386
387
388
389
390
391 for (i = 0; i < ETH_ALEN; i++) {
392#if 0
393 dev->broadcast[i] = 0xff;
394#endif
395 dev->dev_addr[i] = station_addr[i];
396 }
397 ether_setup(dev);
398 return 0;
399}
400
401
402
403
404
405
406
407
408static int
409bionet_open(struct net_device *dev) {
410 struct net_local *lp = (struct net_local *)dev->priv;
411
412 if (bionet_debug > 0)
413 printk("bionet_open\n");
414 stdma_lock(bionet_intr, NULL);
415
416
417
418 set_status(4);
419 lp->open_time = 0;
420 lp->poll_time = MAX_POLL_TIME;
421
422 dev->tbusy = 0;
423 dev->interrupt = 0;
424 dev->start = 1;
425
426 stdma_release();
427 bionet_timer.data = (long)dev;
428 bionet_timer.expires = jiffies + lp->poll_time;
429 add_timer(&bionet_timer);
430 return 0;
431}
432
433static int
434bionet_send_packet(struct sk_buff *skb, struct net_device *dev) {
435 struct net_local *lp = (struct net_local *)dev->priv;
436 unsigned long flags;
437
438
439
440
441 save_flags(flags);
442 cli();
443
444 if (stdma_islocked()) {
445 restore_flags(flags);
446 lp->stats.tx_errors++;
447 }
448 else {
449 int length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
450 unsigned long buf = virt_to_phys(skb->data);
451 int stat;
452
453 stdma_lock(bionet_intr, NULL);
454 restore_flags(flags);
455 if( !STRAM_ADDR(buf+length-1) ) {
456 memcpy(nic_packet->buffer, skb->data, length);
457 buf = (unsigned long)&((struct nic_pkt_s *)phys_nic_packet)->buffer;
458 }
459
460 if (bionet_debug >1) {
461 u_char *data = nic_packet->buffer, *p;
462 int i;
463
464 printk( "%s: TX pkt type 0x%4x from ", dev->name,
465 ((u_short *)data)[6]);
466
467 for( p = &data[6], i = 0; i < 6; i++ )
468 printk("%02x%s", *p++,i != 5 ? ":" : "" );
469 printk(" to ");
470
471 for( p = data, i = 0; i < 6; i++ )
472 printk("%02x%s", *p++,i != 5 ? ":" : "" "\n" );
473
474 printk( "%s: ", dev->name );
475 printk(" data %02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x"
476 " %02x%02x%02x%02x len %d\n",
477 data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19],
478 data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27],
479 data[28], data[29], data[30], data[31], data[32], data[33],
480 length );
481 }
482 dma_cache_maintenance(buf, length, 1);
483
484 stat = hardware_send_packet(buf, length);
485 ENABLE_IRQ();
486 stdma_release();
487
488 dev->trans_start = jiffies;
489 dev->tbusy = 0;
490 lp->stats.tx_packets++;
491 lp->stats.tx_bytes+=length;
492 }
493 dev_kfree_skb(skb);
494
495 return 0;
496}
497
498
499
500static void
501bionet_poll_rx(struct net_device *dev) {
502 struct net_local *lp = (struct net_local *)dev->priv;
503 int boguscount = 10;
504 int pkt_len, status;
505 unsigned long flags;
506
507 save_flags(flags);
508 cli();
509
510
511
512
513
514 if (stdma_islocked()) {
515 restore_flags(flags);
516 return;
517 }
518 stdma_lock(bionet_intr, NULL);
519 DISABLE_IRQ();
520 restore_flags(flags);
521
522 if( lp->poll_time < MAX_POLL_TIME ) lp->poll_time++;
523
524 while(boguscount--) {
525 status = get_frame((unsigned long)phys_nic_packet, 0);
526
527 if( status == 0 ) break;
528
529
530
531 dma_cache_maintenance((unsigned long)phys_nic_packet, 1520, 0);
532
533 pkt_len = (nic_packet->l_hi << 8) | nic_packet->l_lo;
534
535 lp->poll_time = bionet_min_poll_time;
536 if( pkt_len >= 60 && pkt_len <= 1520 ) {
537
538
539
540 struct sk_buff *skb = dev_alloc_skb( pkt_len + 2 );
541 if (skb == NULL) {
542 printk("%s: Memory squeeze, dropping packet.\n",
543 dev->name);
544 lp->stats.rx_dropped++;
545 break;
546 }
547
548 skb->dev = dev;
549 skb_reserve( skb, 2 );
550 skb_put( skb, pkt_len );
551
552
553
554 memcpy(skb->data, nic_packet->buffer, pkt_len);
555 skb->protocol = eth_type_trans( skb, dev );
556 netif_rx(skb);
557 dev->last_rx = jiffies;
558 lp->stats.rx_packets++;
559 lp->stats.rx_bytes+=pkt_len;
560
561
562
563
564
565
566 if (bionet_debug >1) {
567 u_char *data = nic_packet->buffer, *p;
568 int i;
569
570 printk( "%s: RX pkt type 0x%4x from ", dev->name,
571 ((u_short *)data)[6]);
572
573
574 for( p = &data[6], i = 0; i < 6; i++ )
575 printk("%02x%s", *p++,i != 5 ? ":" : "" );
576 printk(" to ");
577 for( p = data, i = 0; i < 6; i++ )
578 printk("%02x%s", *p++,i != 5 ? ":" : "" "\n" );
579
580 printk( "%s: ", dev->name );
581 printk(" data %02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x %02x%02x%02x%02x"
582 " %02x%02x%02x%02x len %d\n",
583 data[12], data[13], data[14], data[15], data[16], data[17], data[18], data[19],
584 data[20], data[21], data[22], data[23], data[24], data[25], data[26], data[27],
585 data[28], data[29], data[30], data[31], data[32], data[33],
586 pkt_len );
587 }
588 }
589 else {
590 printk(" Packet has wrong length: %04d bytes\n", pkt_len);
591 lp->stats.rx_errors++;
592 }
593 }
594 stdma_release();
595 ENABLE_IRQ();
596 return;
597}
598
599
600
601
602static void
603bionet_tick(unsigned long data) {
604 struct net_device *dev = (struct net_device *)data;
605 struct net_local *lp = (struct net_local *)dev->priv;
606
607 if( bionet_debug > 0 && (lp->open_time++ & 7) == 8 )
608 printk("bionet_tick: %ld\n", lp->open_time);
609
610 if( !stdma_islocked() ) bionet_poll_rx(dev);
611
612 bionet_timer.expires = jiffies + lp->poll_time;
613 add_timer(&bionet_timer);
614}
615
616
617
618static int
619bionet_close(struct net_device *dev) {
620 struct net_local *lp = (struct net_local *)dev->priv;
621
622 if (bionet_debug > 0)
623 printk("bionet_close, open_time=%ld\n", lp->open_time);
624 del_timer(&bionet_timer);
625 stdma_lock(bionet_intr, NULL);
626
627 set_status(0);
628 lp->open_time = 0;
629
630 dev->tbusy = 1;
631 dev->start = 0;
632
633 stdma_release();
634 return 0;
635}
636
637
638
639
640static struct net_device_stats *net_get_stats(struct net_device *dev)
641{
642 struct net_local *lp = (struct net_local *)dev->priv;
643 return &lp->stats;
644}
645
646
647#ifdef MODULE
648
649static struct net_device bio_dev;
650
651int
652init_module(void) {
653 int err;
654
655 bio_dev.init = bionet_probe;
656 if ((err = register_netdev(&bio_dev))) {
657 if (err == -EEXIST) {
658 printk("BIONET: devices already present. Module not loaded.\n");
659 }
660 return err;
661 }
662 return 0;
663}
664
665void
666cleanup_module(void) {
667 unregister_netdev(&bio_dev);
668}
669
670#endif
671
672
673
674
675
676
677
678
679
680
681