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
57static const char version[] = "NET3 PLIP version 2.4-parport gniibe@mri.co.jp\n";
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91#include <linux/module.h>
92#include <linux/kernel.h>
93#include <linux/types.h>
94#include <linux/fcntl.h>
95#include <linux/interrupt.h>
96#include <linux/string.h>
97#include <linux/slab.h>
98#include <linux/if_ether.h>
99#include <linux/in.h>
100#include <linux/errno.h>
101#include <linux/delay.h>
102#include <linux/init.h>
103#include <linux/netdevice.h>
104#include <linux/etherdevice.h>
105#include <linux/inetdevice.h>
106#include <linux/skbuff.h>
107#include <linux/if_plip.h>
108#include <linux/workqueue.h>
109#include <linux/spinlock.h>
110#include <linux/completion.h>
111#include <linux/parport.h>
112#include <linux/bitops.h>
113
114#include <net/neighbour.h>
115
116#include <asm/irq.h>
117#include <asm/byteorder.h>
118
119
120#define PLIP_MAX 8
121
122
123#ifndef NET_DEBUG
124#define NET_DEBUG 1
125#endif
126static const unsigned int net_debug = NET_DEBUG;
127
128#define ENABLE(irq) if (irq != -1) enable_irq(irq)
129#define DISABLE(irq) if (irq != -1) disable_irq(irq)
130
131
132#define PLIP_DELAY_UNIT 1
133
134
135#define PLIP_TRIGGER_WAIT 500
136
137
138#define PLIP_NIBBLE_WAIT 3000
139
140
141static void plip_kick_bh(struct work_struct *work);
142static void plip_bh(struct work_struct *work);
143static void plip_timer_bh(struct work_struct *work);
144
145
146static void plip_interrupt(void *dev_id);
147
148
149static int plip_tx_packet(struct sk_buff *skb, struct net_device *dev);
150static int plip_hard_header(struct sk_buff *skb, struct net_device *dev,
151 unsigned short type, const void *daddr,
152 const void *saddr, unsigned len);
153static int plip_hard_header_cache(const struct neighbour *neigh,
154 struct hh_cache *hh, __be16 type);
155static int plip_open(struct net_device *dev);
156static int plip_close(struct net_device *dev);
157static int plip_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
158static int plip_preempt(void *handle);
159static void plip_wakeup(void *handle);
160
161enum plip_connection_state {
162 PLIP_CN_NONE=0,
163 PLIP_CN_RECEIVE,
164 PLIP_CN_SEND,
165 PLIP_CN_CLOSING,
166 PLIP_CN_ERROR
167};
168
169enum plip_packet_state {
170 PLIP_PK_DONE=0,
171 PLIP_PK_TRIGGER,
172 PLIP_PK_LENGTH_LSB,
173 PLIP_PK_LENGTH_MSB,
174 PLIP_PK_DATA,
175 PLIP_PK_CHECKSUM
176};
177
178enum plip_nibble_state {
179 PLIP_NB_BEGIN,
180 PLIP_NB_1,
181 PLIP_NB_2,
182};
183
184struct plip_local {
185 enum plip_packet_state state;
186 enum plip_nibble_state nibble;
187 union {
188 struct {
189#if defined(__LITTLE_ENDIAN)
190 unsigned char lsb;
191 unsigned char msb;
192#elif defined(__BIG_ENDIAN)
193 unsigned char msb;
194 unsigned char lsb;
195#else
196#error "Please fix the endianness defines in <asm/byteorder.h>"
197#endif
198 } b;
199 unsigned short h;
200 } length;
201 unsigned short byte;
202 unsigned char checksum;
203 unsigned char data;
204 struct sk_buff *skb;
205};
206
207struct net_local {
208 struct net_device *dev;
209 struct work_struct immediate;
210 struct delayed_work deferred;
211 struct delayed_work timer;
212 struct plip_local snd_data;
213 struct plip_local rcv_data;
214 struct pardevice *pardev;
215 unsigned long trigger;
216 unsigned long nibble;
217 enum plip_connection_state connection;
218 unsigned short timeout_count;
219 int is_deferred;
220 int port_owner;
221 int should_relinquish;
222 spinlock_t lock;
223 atomic_t kill_timer;
224 struct completion killed_timer_cmp;
225};
226
227static inline void enable_parport_interrupts (struct net_device *dev)
228{
229 if (dev->irq != -1)
230 {
231 struct parport *port =
232 ((struct net_local *)netdev_priv(dev))->pardev->port;
233 port->ops->enable_irq (port);
234 }
235}
236
237static inline void disable_parport_interrupts (struct net_device *dev)
238{
239 if (dev->irq != -1)
240 {
241 struct parport *port =
242 ((struct net_local *)netdev_priv(dev))->pardev->port;
243 port->ops->disable_irq (port);
244 }
245}
246
247static inline void write_data (struct net_device *dev, unsigned char data)
248{
249 struct parport *port =
250 ((struct net_local *)netdev_priv(dev))->pardev->port;
251
252 port->ops->write_data (port, data);
253}
254
255static inline unsigned char read_status (struct net_device *dev)
256{
257 struct parport *port =
258 ((struct net_local *)netdev_priv(dev))->pardev->port;
259
260 return port->ops->read_status (port);
261}
262
263static const struct header_ops plip_header_ops = {
264 .create = plip_hard_header,
265 .cache = plip_hard_header_cache,
266};
267
268static const struct net_device_ops plip_netdev_ops = {
269 .ndo_open = plip_open,
270 .ndo_stop = plip_close,
271 .ndo_start_xmit = plip_tx_packet,
272 .ndo_do_ioctl = plip_ioctl,
273 .ndo_change_mtu = eth_change_mtu,
274 .ndo_set_mac_address = eth_mac_addr,
275 .ndo_validate_addr = eth_validate_addr,
276};
277
278
279
280
281
282
283
284
285
286
287static void
288plip_init_netdev(struct net_device *dev)
289{
290 struct net_local *nl = netdev_priv(dev);
291
292
293 dev->tx_queue_len = 10;
294 dev->flags = IFF_POINTOPOINT|IFF_NOARP;
295 memset(dev->dev_addr, 0xfc, ETH_ALEN);
296
297 dev->netdev_ops = &plip_netdev_ops;
298 dev->header_ops = &plip_header_ops;
299
300
301 nl->port_owner = 0;
302
303
304 nl->trigger = PLIP_TRIGGER_WAIT;
305 nl->nibble = PLIP_NIBBLE_WAIT;
306
307
308 INIT_WORK(&nl->immediate, plip_bh);
309 INIT_DELAYED_WORK(&nl->deferred, plip_kick_bh);
310
311 if (dev->irq == -1)
312 INIT_DELAYED_WORK(&nl->timer, plip_timer_bh);
313
314 spin_lock_init(&nl->lock);
315}
316
317
318
319
320static void
321plip_kick_bh(struct work_struct *work)
322{
323 struct net_local *nl =
324 container_of(work, struct net_local, deferred.work);
325
326 if (nl->is_deferred)
327 schedule_work(&nl->immediate);
328}
329
330
331static int plip_none(struct net_device *, struct net_local *,
332 struct plip_local *, struct plip_local *);
333static int plip_receive_packet(struct net_device *, struct net_local *,
334 struct plip_local *, struct plip_local *);
335static int plip_send_packet(struct net_device *, struct net_local *,
336 struct plip_local *, struct plip_local *);
337static int plip_connection_close(struct net_device *, struct net_local *,
338 struct plip_local *, struct plip_local *);
339static int plip_error(struct net_device *, struct net_local *,
340 struct plip_local *, struct plip_local *);
341static int plip_bh_timeout_error(struct net_device *dev, struct net_local *nl,
342 struct plip_local *snd,
343 struct plip_local *rcv,
344 int error);
345
346#define OK 0
347#define TIMEOUT 1
348#define ERROR 2
349#define HS_TIMEOUT 3
350
351typedef int (*plip_func)(struct net_device *dev, struct net_local *nl,
352 struct plip_local *snd, struct plip_local *rcv);
353
354static const plip_func connection_state_table[] =
355{
356 plip_none,
357 plip_receive_packet,
358 plip_send_packet,
359 plip_connection_close,
360 plip_error
361};
362
363
364static void
365plip_bh(struct work_struct *work)
366{
367 struct net_local *nl = container_of(work, struct net_local, immediate);
368 struct plip_local *snd = &nl->snd_data;
369 struct plip_local *rcv = &nl->rcv_data;
370 plip_func f;
371 int r;
372
373 nl->is_deferred = 0;
374 f = connection_state_table[nl->connection];
375 if ((r = (*f)(nl->dev, nl, snd, rcv)) != OK &&
376 (r = plip_bh_timeout_error(nl->dev, nl, snd, rcv, r)) != OK) {
377 nl->is_deferred = 1;
378 schedule_delayed_work(&nl->deferred, 1);
379 }
380}
381
382static void
383plip_timer_bh(struct work_struct *work)
384{
385 struct net_local *nl =
386 container_of(work, struct net_local, timer.work);
387
388 if (!(atomic_read (&nl->kill_timer))) {
389 plip_interrupt (nl->dev);
390
391 schedule_delayed_work(&nl->timer, 1);
392 }
393 else {
394 complete(&nl->killed_timer_cmp);
395 }
396}
397
398static int
399plip_bh_timeout_error(struct net_device *dev, struct net_local *nl,
400 struct plip_local *snd, struct plip_local *rcv,
401 int error)
402{
403 unsigned char c0;
404
405
406
407
408
409
410
411
412
413
414 spin_lock_irq(&nl->lock);
415 if (nl->connection == PLIP_CN_SEND) {
416
417 if (error != ERROR) {
418 nl->timeout_count++;
419 if ((error == HS_TIMEOUT && nl->timeout_count <= 10) ||
420 nl->timeout_count <= 3) {
421 spin_unlock_irq(&nl->lock);
422
423 return TIMEOUT;
424 }
425 c0 = read_status(dev);
426 printk(KERN_WARNING "%s: transmit timeout(%d,%02x)\n",
427 dev->name, snd->state, c0);
428 } else
429 error = HS_TIMEOUT;
430 dev->stats.tx_errors++;
431 dev->stats.tx_aborted_errors++;
432 } else if (nl->connection == PLIP_CN_RECEIVE) {
433 if (rcv->state == PLIP_PK_TRIGGER) {
434
435 spin_unlock_irq(&nl->lock);
436 return OK;
437 }
438 if (error != ERROR) {
439 if (++nl->timeout_count <= 3) {
440 spin_unlock_irq(&nl->lock);
441
442 return TIMEOUT;
443 }
444 c0 = read_status(dev);
445 printk(KERN_WARNING "%s: receive timeout(%d,%02x)\n",
446 dev->name, rcv->state, c0);
447 }
448 dev->stats.rx_dropped++;
449 }
450 rcv->state = PLIP_PK_DONE;
451 if (rcv->skb) {
452 kfree_skb(rcv->skb);
453 rcv->skb = NULL;
454 }
455 snd->state = PLIP_PK_DONE;
456 if (snd->skb) {
457 dev_kfree_skb(snd->skb);
458 snd->skb = NULL;
459 }
460 spin_unlock_irq(&nl->lock);
461 if (error == HS_TIMEOUT) {
462 DISABLE(dev->irq);
463 synchronize_irq(dev->irq);
464 }
465 disable_parport_interrupts (dev);
466 netif_stop_queue (dev);
467 nl->connection = PLIP_CN_ERROR;
468 write_data (dev, 0x00);
469
470 return TIMEOUT;
471}
472
473static int
474plip_none(struct net_device *dev, struct net_local *nl,
475 struct plip_local *snd, struct plip_local *rcv)
476{
477 return OK;
478}
479
480
481
482static inline int
483plip_receive(unsigned short nibble_timeout, struct net_device *dev,
484 enum plip_nibble_state *ns_p, unsigned char *data_p)
485{
486 unsigned char c0, c1;
487 unsigned int cx;
488
489 switch (*ns_p) {
490 case PLIP_NB_BEGIN:
491 cx = nibble_timeout;
492 while (1) {
493 c0 = read_status(dev);
494 udelay(PLIP_DELAY_UNIT);
495 if ((c0 & 0x80) == 0) {
496 c1 = read_status(dev);
497 if (c0 == c1)
498 break;
499 }
500 if (--cx == 0)
501 return TIMEOUT;
502 }
503 *data_p = (c0 >> 3) & 0x0f;
504 write_data (dev, 0x10);
505 *ns_p = PLIP_NB_1;
506
507 case PLIP_NB_1:
508 cx = nibble_timeout;
509 while (1) {
510 c0 = read_status(dev);
511 udelay(PLIP_DELAY_UNIT);
512 if (c0 & 0x80) {
513 c1 = read_status(dev);
514 if (c0 == c1)
515 break;
516 }
517 if (--cx == 0)
518 return TIMEOUT;
519 }
520 *data_p |= (c0 << 1) & 0xf0;
521 write_data (dev, 0x00);
522 *ns_p = PLIP_NB_BEGIN;
523 case PLIP_NB_2:
524 break;
525 }
526 return OK;
527}
528
529
530
531
532
533
534
535
536
537
538
539
540
541static __be16 plip_type_trans(struct sk_buff *skb, struct net_device *dev)
542{
543 struct ethhdr *eth;
544 unsigned char *rawp;
545
546 skb_reset_mac_header(skb);
547 skb_pull(skb,dev->hard_header_len);
548 eth = eth_hdr(skb);
549
550 if(is_multicast_ether_addr(eth->h_dest))
551 {
552 if(ether_addr_equal_64bits(eth->h_dest, dev->broadcast))
553 skb->pkt_type=PACKET_BROADCAST;
554 else
555 skb->pkt_type=PACKET_MULTICAST;
556 }
557
558
559
560
561
562
563 if (ntohs(eth->h_proto) >= ETH_P_802_3_MIN)
564 return eth->h_proto;
565
566 rawp = skb->data;
567
568
569
570
571
572
573
574 if (*(unsigned short *)rawp == 0xFFFF)
575 return htons(ETH_P_802_3);
576
577
578
579
580 return htons(ETH_P_802_2);
581}
582
583
584static int
585plip_receive_packet(struct net_device *dev, struct net_local *nl,
586 struct plip_local *snd, struct plip_local *rcv)
587{
588 unsigned short nibble_timeout = nl->nibble;
589 unsigned char *lbuf;
590
591 switch (rcv->state) {
592 case PLIP_PK_TRIGGER:
593 DISABLE(dev->irq);
594
595 disable_parport_interrupts (dev);
596 write_data (dev, 0x01);
597 if (net_debug > 2)
598 printk(KERN_DEBUG "%s: receive start\n", dev->name);
599 rcv->state = PLIP_PK_LENGTH_LSB;
600 rcv->nibble = PLIP_NB_BEGIN;
601
602 case PLIP_PK_LENGTH_LSB:
603 if (snd->state != PLIP_PK_DONE) {
604 if (plip_receive(nl->trigger, dev,
605 &rcv->nibble, &rcv->length.b.lsb)) {
606
607 rcv->state = PLIP_PK_DONE;
608 nl->is_deferred = 1;
609 nl->connection = PLIP_CN_SEND;
610 schedule_delayed_work(&nl->deferred, 1);
611 enable_parport_interrupts (dev);
612 ENABLE(dev->irq);
613 return OK;
614 }
615 } else {
616 if (plip_receive(nibble_timeout, dev,
617 &rcv->nibble, &rcv->length.b.lsb))
618 return TIMEOUT;
619 }
620 rcv->state = PLIP_PK_LENGTH_MSB;
621
622 case PLIP_PK_LENGTH_MSB:
623 if (plip_receive(nibble_timeout, dev,
624 &rcv->nibble, &rcv->length.b.msb))
625 return TIMEOUT;
626 if (rcv->length.h > dev->mtu + dev->hard_header_len ||
627 rcv->length.h < 8) {
628 printk(KERN_WARNING "%s: bogus packet size %d.\n", dev->name, rcv->length.h);
629 return ERROR;
630 }
631
632 rcv->skb = dev_alloc_skb(rcv->length.h + 2);
633 if (rcv->skb == NULL) {
634 printk(KERN_ERR "%s: Memory squeeze.\n", dev->name);
635 return ERROR;
636 }
637 skb_reserve(rcv->skb, 2);
638 skb_put(rcv->skb,rcv->length.h);
639 rcv->skb->dev = dev;
640 rcv->state = PLIP_PK_DATA;
641 rcv->byte = 0;
642 rcv->checksum = 0;
643
644 case PLIP_PK_DATA:
645 lbuf = rcv->skb->data;
646 do {
647 if (plip_receive(nibble_timeout, dev,
648 &rcv->nibble, &lbuf[rcv->byte]))
649 return TIMEOUT;
650 } while (++rcv->byte < rcv->length.h);
651 do {
652 rcv->checksum += lbuf[--rcv->byte];
653 } while (rcv->byte);
654 rcv->state = PLIP_PK_CHECKSUM;
655
656 case PLIP_PK_CHECKSUM:
657 if (plip_receive(nibble_timeout, dev,
658 &rcv->nibble, &rcv->data))
659 return TIMEOUT;
660 if (rcv->data != rcv->checksum) {
661 dev->stats.rx_crc_errors++;
662 if (net_debug)
663 printk(KERN_DEBUG "%s: checksum error\n", dev->name);
664 return ERROR;
665 }
666 rcv->state = PLIP_PK_DONE;
667
668 case PLIP_PK_DONE:
669
670 rcv->skb->protocol=plip_type_trans(rcv->skb, dev);
671 netif_rx_ni(rcv->skb);
672 dev->stats.rx_bytes += rcv->length.h;
673 dev->stats.rx_packets++;
674 rcv->skb = NULL;
675 if (net_debug > 2)
676 printk(KERN_DEBUG "%s: receive end\n", dev->name);
677
678
679 write_data (dev, 0x00);
680 spin_lock_irq(&nl->lock);
681 if (snd->state != PLIP_PK_DONE) {
682 nl->connection = PLIP_CN_SEND;
683 spin_unlock_irq(&nl->lock);
684 schedule_work(&nl->immediate);
685 enable_parport_interrupts (dev);
686 ENABLE(dev->irq);
687 return OK;
688 } else {
689 nl->connection = PLIP_CN_NONE;
690 spin_unlock_irq(&nl->lock);
691 enable_parport_interrupts (dev);
692 ENABLE(dev->irq);
693 return OK;
694 }
695 }
696 return OK;
697}
698
699
700
701static inline int
702plip_send(unsigned short nibble_timeout, struct net_device *dev,
703 enum plip_nibble_state *ns_p, unsigned char data)
704{
705 unsigned char c0;
706 unsigned int cx;
707
708 switch (*ns_p) {
709 case PLIP_NB_BEGIN:
710 write_data (dev, data & 0x0f);
711 *ns_p = PLIP_NB_1;
712
713 case PLIP_NB_1:
714 write_data (dev, 0x10 | (data & 0x0f));
715 cx = nibble_timeout;
716 while (1) {
717 c0 = read_status(dev);
718 if ((c0 & 0x80) == 0)
719 break;
720 if (--cx == 0)
721 return TIMEOUT;
722 udelay(PLIP_DELAY_UNIT);
723 }
724 write_data (dev, 0x10 | (data >> 4));
725 *ns_p = PLIP_NB_2;
726
727 case PLIP_NB_2:
728 write_data (dev, (data >> 4));
729 cx = nibble_timeout;
730 while (1) {
731 c0 = read_status(dev);
732 if (c0 & 0x80)
733 break;
734 if (--cx == 0)
735 return TIMEOUT;
736 udelay(PLIP_DELAY_UNIT);
737 }
738 *ns_p = PLIP_NB_BEGIN;
739 return OK;
740 }
741 return OK;
742}
743
744
745static int
746plip_send_packet(struct net_device *dev, struct net_local *nl,
747 struct plip_local *snd, struct plip_local *rcv)
748{
749 unsigned short nibble_timeout = nl->nibble;
750 unsigned char *lbuf;
751 unsigned char c0;
752 unsigned int cx;
753
754 if (snd->skb == NULL || (lbuf = snd->skb->data) == NULL) {
755 printk(KERN_DEBUG "%s: send skb lost\n", dev->name);
756 snd->state = PLIP_PK_DONE;
757 snd->skb = NULL;
758 return ERROR;
759 }
760
761 switch (snd->state) {
762 case PLIP_PK_TRIGGER:
763 if ((read_status(dev) & 0xf8) != 0x80)
764 return HS_TIMEOUT;
765
766
767 write_data (dev, 0x08);
768 cx = nl->trigger;
769 while (1) {
770 udelay(PLIP_DELAY_UNIT);
771 spin_lock_irq(&nl->lock);
772 if (nl->connection == PLIP_CN_RECEIVE) {
773 spin_unlock_irq(&nl->lock);
774
775 dev->stats.collisions++;
776 return OK;
777 }
778 c0 = read_status(dev);
779 if (c0 & 0x08) {
780 spin_unlock_irq(&nl->lock);
781 DISABLE(dev->irq);
782 synchronize_irq(dev->irq);
783 if (nl->connection == PLIP_CN_RECEIVE) {
784
785
786
787
788
789
790 ENABLE(dev->irq);
791 dev->stats.collisions++;
792 return OK;
793 }
794 disable_parport_interrupts (dev);
795 if (net_debug > 2)
796 printk(KERN_DEBUG "%s: send start\n", dev->name);
797 snd->state = PLIP_PK_LENGTH_LSB;
798 snd->nibble = PLIP_NB_BEGIN;
799 nl->timeout_count = 0;
800 break;
801 }
802 spin_unlock_irq(&nl->lock);
803 if (--cx == 0) {
804 write_data (dev, 0x00);
805 return HS_TIMEOUT;
806 }
807 }
808
809 case PLIP_PK_LENGTH_LSB:
810 if (plip_send(nibble_timeout, dev,
811 &snd->nibble, snd->length.b.lsb))
812 return TIMEOUT;
813 snd->state = PLIP_PK_LENGTH_MSB;
814
815 case PLIP_PK_LENGTH_MSB:
816 if (plip_send(nibble_timeout, dev,
817 &snd->nibble, snd->length.b.msb))
818 return TIMEOUT;
819 snd->state = PLIP_PK_DATA;
820 snd->byte = 0;
821 snd->checksum = 0;
822
823 case PLIP_PK_DATA:
824 do {
825 if (plip_send(nibble_timeout, dev,
826 &snd->nibble, lbuf[snd->byte]))
827 return TIMEOUT;
828 } while (++snd->byte < snd->length.h);
829 do {
830 snd->checksum += lbuf[--snd->byte];
831 } while (snd->byte);
832 snd->state = PLIP_PK_CHECKSUM;
833
834 case PLIP_PK_CHECKSUM:
835 if (plip_send(nibble_timeout, dev,
836 &snd->nibble, snd->checksum))
837 return TIMEOUT;
838
839 dev->stats.tx_bytes += snd->skb->len;
840 dev_kfree_skb(snd->skb);
841 dev->stats.tx_packets++;
842 snd->state = PLIP_PK_DONE;
843
844 case PLIP_PK_DONE:
845
846 write_data (dev, 0x00);
847 snd->skb = NULL;
848 if (net_debug > 2)
849 printk(KERN_DEBUG "%s: send end\n", dev->name);
850 nl->connection = PLIP_CN_CLOSING;
851 nl->is_deferred = 1;
852 schedule_delayed_work(&nl->deferred, 1);
853 enable_parport_interrupts (dev);
854 ENABLE(dev->irq);
855 return OK;
856 }
857 return OK;
858}
859
860static int
861plip_connection_close(struct net_device *dev, struct net_local *nl,
862 struct plip_local *snd, struct plip_local *rcv)
863{
864 spin_lock_irq(&nl->lock);
865 if (nl->connection == PLIP_CN_CLOSING) {
866 nl->connection = PLIP_CN_NONE;
867 netif_wake_queue (dev);
868 }
869 spin_unlock_irq(&nl->lock);
870 if (nl->should_relinquish) {
871 nl->should_relinquish = nl->port_owner = 0;
872 parport_release(nl->pardev);
873 }
874 return OK;
875}
876
877
878static int
879plip_error(struct net_device *dev, struct net_local *nl,
880 struct plip_local *snd, struct plip_local *rcv)
881{
882 unsigned char status;
883
884 status = read_status(dev);
885 if ((status & 0xf8) == 0x80) {
886 if (net_debug > 2)
887 printk(KERN_DEBUG "%s: reset interface.\n", dev->name);
888 nl->connection = PLIP_CN_NONE;
889 nl->should_relinquish = 0;
890 netif_start_queue (dev);
891 enable_parport_interrupts (dev);
892 ENABLE(dev->irq);
893 netif_wake_queue (dev);
894 } else {
895 nl->is_deferred = 1;
896 schedule_delayed_work(&nl->deferred, 1);
897 }
898
899 return OK;
900}
901
902
903static void
904plip_interrupt(void *dev_id)
905{
906 struct net_device *dev = dev_id;
907 struct net_local *nl;
908 struct plip_local *rcv;
909 unsigned char c0;
910 unsigned long flags;
911
912 nl = netdev_priv(dev);
913 rcv = &nl->rcv_data;
914
915 spin_lock_irqsave (&nl->lock, flags);
916
917 c0 = read_status(dev);
918 if ((c0 & 0xf8) != 0xc0) {
919 if ((dev->irq != -1) && (net_debug > 1))
920 printk(KERN_DEBUG "%s: spurious interrupt\n", dev->name);
921 spin_unlock_irqrestore (&nl->lock, flags);
922 return;
923 }
924
925 if (net_debug > 3)
926 printk(KERN_DEBUG "%s: interrupt.\n", dev->name);
927
928 switch (nl->connection) {
929 case PLIP_CN_CLOSING:
930 netif_wake_queue (dev);
931 case PLIP_CN_NONE:
932 case PLIP_CN_SEND:
933 rcv->state = PLIP_PK_TRIGGER;
934 nl->connection = PLIP_CN_RECEIVE;
935 nl->timeout_count = 0;
936 schedule_work(&nl->immediate);
937 break;
938
939 case PLIP_CN_RECEIVE:
940
941
942
943 break;
944
945 case PLIP_CN_ERROR:
946 printk(KERN_ERR "%s: receive interrupt in error state\n", dev->name);
947 break;
948 }
949
950 spin_unlock_irqrestore(&nl->lock, flags);
951}
952
953static int
954plip_tx_packet(struct sk_buff *skb, struct net_device *dev)
955{
956 struct net_local *nl = netdev_priv(dev);
957 struct plip_local *snd = &nl->snd_data;
958
959 if (netif_queue_stopped(dev))
960 return NETDEV_TX_BUSY;
961
962
963 if (!nl->port_owner) {
964 if (parport_claim(nl->pardev))
965 return NETDEV_TX_BUSY;
966 nl->port_owner = 1;
967 }
968
969 netif_stop_queue (dev);
970
971 if (skb->len > dev->mtu + dev->hard_header_len) {
972 printk(KERN_WARNING "%s: packet too big, %d.\n", dev->name, (int)skb->len);
973 netif_start_queue (dev);
974 return NETDEV_TX_BUSY;
975 }
976
977 if (net_debug > 2)
978 printk(KERN_DEBUG "%s: send request\n", dev->name);
979
980 spin_lock_irq(&nl->lock);
981 snd->skb = skb;
982 snd->length.h = skb->len;
983 snd->state = PLIP_PK_TRIGGER;
984 if (nl->connection == PLIP_CN_NONE) {
985 nl->connection = PLIP_CN_SEND;
986 nl->timeout_count = 0;
987 }
988 schedule_work(&nl->immediate);
989 spin_unlock_irq(&nl->lock);
990
991 return NETDEV_TX_OK;
992}
993
994static void
995plip_rewrite_address(const struct net_device *dev, struct ethhdr *eth)
996{
997 const struct in_device *in_dev;
998
999 rcu_read_lock();
1000 in_dev = __in_dev_get_rcu(dev);
1001 if (in_dev) {
1002
1003 const struct in_ifaddr *ifa = in_dev->ifa_list;
1004 if (ifa) {
1005 memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
1006 memset(eth->h_dest, 0xfc, 2);
1007 memcpy(eth->h_dest+2, &ifa->ifa_address, 4);
1008 }
1009 }
1010 rcu_read_unlock();
1011}
1012
1013static int
1014plip_hard_header(struct sk_buff *skb, struct net_device *dev,
1015 unsigned short type, const void *daddr,
1016 const void *saddr, unsigned len)
1017{
1018 int ret;
1019
1020 ret = eth_header(skb, dev, type, daddr, saddr, len);
1021 if (ret >= 0)
1022 plip_rewrite_address (dev, (struct ethhdr *)skb->data);
1023
1024 return ret;
1025}
1026
1027static int plip_hard_header_cache(const struct neighbour *neigh,
1028 struct hh_cache *hh, __be16 type)
1029{
1030 int ret;
1031
1032 ret = eth_header_cache(neigh, hh, type);
1033 if (ret == 0) {
1034 struct ethhdr *eth;
1035
1036 eth = (struct ethhdr*)(((u8*)hh->hh_data) +
1037 HH_DATA_OFF(sizeof(*eth)));
1038 plip_rewrite_address (neigh->dev, eth);
1039 }
1040
1041 return ret;
1042}
1043
1044
1045
1046
1047
1048
1049
1050static int
1051plip_open(struct net_device *dev)
1052{
1053 struct net_local *nl = netdev_priv(dev);
1054 struct in_device *in_dev;
1055
1056
1057 if (!nl->port_owner) {
1058 if (parport_claim(nl->pardev)) return -EAGAIN;
1059 nl->port_owner = 1;
1060 }
1061
1062 nl->should_relinquish = 0;
1063
1064
1065 write_data (dev, 0x00);
1066
1067
1068 enable_parport_interrupts (dev);
1069 if (dev->irq == -1)
1070 {
1071 atomic_set (&nl->kill_timer, 0);
1072 schedule_delayed_work(&nl->timer, 1);
1073 }
1074
1075
1076 nl->rcv_data.state = nl->snd_data.state = PLIP_PK_DONE;
1077 nl->rcv_data.skb = nl->snd_data.skb = NULL;
1078 nl->connection = PLIP_CN_NONE;
1079 nl->is_deferred = 0;
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093 in_dev=__in_dev_get_rtnl(dev);
1094 if (in_dev) {
1095
1096
1097
1098 struct in_ifaddr *ifa=in_dev->ifa_list;
1099 if (ifa != NULL) {
1100 memcpy(dev->dev_addr+2, &ifa->ifa_local, 4);
1101 }
1102 }
1103
1104 netif_start_queue (dev);
1105
1106 return 0;
1107}
1108
1109
1110static int
1111plip_close(struct net_device *dev)
1112{
1113 struct net_local *nl = netdev_priv(dev);
1114 struct plip_local *snd = &nl->snd_data;
1115 struct plip_local *rcv = &nl->rcv_data;
1116
1117 netif_stop_queue (dev);
1118 DISABLE(dev->irq);
1119 synchronize_irq(dev->irq);
1120
1121 if (dev->irq == -1)
1122 {
1123 init_completion(&nl->killed_timer_cmp);
1124 atomic_set (&nl->kill_timer, 1);
1125 wait_for_completion(&nl->killed_timer_cmp);
1126 }
1127
1128#ifdef NOTDEF
1129 outb(0x00, PAR_DATA(dev));
1130#endif
1131 nl->is_deferred = 0;
1132 nl->connection = PLIP_CN_NONE;
1133 if (nl->port_owner) {
1134 parport_release(nl->pardev);
1135 nl->port_owner = 0;
1136 }
1137
1138 snd->state = PLIP_PK_DONE;
1139 if (snd->skb) {
1140 dev_kfree_skb(snd->skb);
1141 snd->skb = NULL;
1142 }
1143 rcv->state = PLIP_PK_DONE;
1144 if (rcv->skb) {
1145 kfree_skb(rcv->skb);
1146 rcv->skb = NULL;
1147 }
1148
1149#ifdef NOTDEF
1150
1151 outb(0x00, PAR_CONTROL(dev));
1152#endif
1153 return 0;
1154}
1155
1156static int
1157plip_preempt(void *handle)
1158{
1159 struct net_device *dev = (struct net_device *)handle;
1160 struct net_local *nl = netdev_priv(dev);
1161
1162
1163 if (nl->connection != PLIP_CN_NONE) {
1164 nl->should_relinquish = 1;
1165 return 1;
1166 }
1167
1168 nl->port_owner = 0;
1169 return 0;
1170}
1171
1172static void
1173plip_wakeup(void *handle)
1174{
1175 struct net_device *dev = (struct net_device *)handle;
1176 struct net_local *nl = netdev_priv(dev);
1177
1178 if (nl->port_owner) {
1179
1180 printk(KERN_DEBUG "%s: why am I being woken up?\n", dev->name);
1181 if (!parport_claim(nl->pardev))
1182
1183 printk(KERN_DEBUG "%s: I'm broken.\n", dev->name);
1184 else
1185 return;
1186 }
1187
1188 if (!(dev->flags & IFF_UP))
1189
1190 return;
1191
1192 if (!parport_claim(nl->pardev)) {
1193 nl->port_owner = 1;
1194
1195 write_data (dev, 0x00);
1196 }
1197}
1198
1199static int
1200plip_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1201{
1202 struct net_local *nl = netdev_priv(dev);
1203 struct plipconf *pc = (struct plipconf *) &rq->ifr_ifru;
1204
1205 if (cmd != SIOCDEVPLIP)
1206 return -EOPNOTSUPP;
1207
1208 switch(pc->pcmd) {
1209 case PLIP_GET_TIMEOUT:
1210 pc->trigger = nl->trigger;
1211 pc->nibble = nl->nibble;
1212 break;
1213 case PLIP_SET_TIMEOUT:
1214 if(!capable(CAP_NET_ADMIN))
1215 return -EPERM;
1216 nl->trigger = pc->trigger;
1217 nl->nibble = pc->nibble;
1218 break;
1219 default:
1220 return -EOPNOTSUPP;
1221 }
1222 return 0;
1223}
1224
1225static int parport[PLIP_MAX] = { [0 ... PLIP_MAX-1] = -1 };
1226static int timid;
1227
1228module_param_array(parport, int, NULL, 0);
1229module_param(timid, int, 0);
1230MODULE_PARM_DESC(parport, "List of parport device numbers to use by plip");
1231
1232static struct net_device *dev_plip[PLIP_MAX] = { NULL, };
1233
1234static inline int
1235plip_searchfor(int list[], int a)
1236{
1237 int i;
1238 for (i = 0; i < PLIP_MAX && list[i] != -1; i++) {
1239 if (list[i] == a) return 1;
1240 }
1241 return 0;
1242}
1243
1244
1245
1246static void plip_attach (struct parport *port)
1247{
1248 static int unit;
1249 struct net_device *dev;
1250 struct net_local *nl;
1251 char name[IFNAMSIZ];
1252
1253 if ((parport[0] == -1 && (!timid || !port->devices)) ||
1254 plip_searchfor(parport, port->number)) {
1255 if (unit == PLIP_MAX) {
1256 printk(KERN_ERR "plip: too many devices\n");
1257 return;
1258 }
1259
1260 sprintf(name, "plip%d", unit);
1261 dev = alloc_etherdev(sizeof(struct net_local));
1262 if (!dev)
1263 return;
1264
1265 strcpy(dev->name, name);
1266
1267 dev->irq = port->irq;
1268 dev->base_addr = port->base;
1269 if (port->irq == -1) {
1270 printk(KERN_INFO "plip: %s has no IRQ. Using IRQ-less mode,"
1271 "which is fairly inefficient!\n", port->name);
1272 }
1273
1274 nl = netdev_priv(dev);
1275 nl->dev = dev;
1276 nl->pardev = parport_register_device(port, dev->name, plip_preempt,
1277 plip_wakeup, plip_interrupt,
1278 0, dev);
1279
1280 if (!nl->pardev) {
1281 printk(KERN_ERR "%s: parport_register failed\n", name);
1282 goto err_free_dev;
1283 }
1284
1285 plip_init_netdev(dev);
1286
1287 if (register_netdev(dev)) {
1288 printk(KERN_ERR "%s: network register failed\n", name);
1289 goto err_parport_unregister;
1290 }
1291
1292 printk(KERN_INFO "%s", version);
1293 if (dev->irq != -1)
1294 printk(KERN_INFO "%s: Parallel port at %#3lx, "
1295 "using IRQ %d.\n",
1296 dev->name, dev->base_addr, dev->irq);
1297 else
1298 printk(KERN_INFO "%s: Parallel port at %#3lx, "
1299 "not using IRQ.\n",
1300 dev->name, dev->base_addr);
1301 dev_plip[unit++] = dev;
1302 }
1303 return;
1304
1305err_parport_unregister:
1306 parport_unregister_device(nl->pardev);
1307err_free_dev:
1308 free_netdev(dev);
1309}
1310
1311
1312
1313static void plip_detach (struct parport *port)
1314{
1315
1316}
1317
1318static struct parport_driver plip_driver = {
1319 .name = "plip",
1320 .attach = plip_attach,
1321 .detach = plip_detach
1322};
1323
1324static void __exit plip_cleanup_module (void)
1325{
1326 struct net_device *dev;
1327 int i;
1328
1329 parport_unregister_driver (&plip_driver);
1330
1331 for (i=0; i < PLIP_MAX; i++) {
1332 if ((dev = dev_plip[i])) {
1333 struct net_local *nl = netdev_priv(dev);
1334 unregister_netdev(dev);
1335 if (nl->port_owner)
1336 parport_release(nl->pardev);
1337 parport_unregister_device(nl->pardev);
1338 free_netdev(dev);
1339 dev_plip[i] = NULL;
1340 }
1341 }
1342}
1343
1344#ifndef MODULE
1345
1346static int parport_ptr;
1347
1348static int __init plip_setup(char *str)
1349{
1350 int ints[4];
1351
1352 str = get_options(str, ARRAY_SIZE(ints), ints);
1353
1354
1355 if (!strncmp(str, "parport", 7)) {
1356 int n = simple_strtoul(str+7, NULL, 10);
1357 if (parport_ptr < PLIP_MAX)
1358 parport[parport_ptr++] = n;
1359 else
1360 printk(KERN_INFO "plip: too many ports, %s ignored.\n",
1361 str);
1362 } else if (!strcmp(str, "timid")) {
1363 timid = 1;
1364 } else {
1365 if (ints[0] == 0 || ints[1] == 0) {
1366
1367 parport[0] = -2;
1368 } else {
1369 printk(KERN_WARNING "warning: 'plip=0x%x' ignored\n",
1370 ints[1]);
1371 }
1372 }
1373 return 1;
1374}
1375
1376__setup("plip=", plip_setup);
1377
1378#endif
1379
1380static int __init plip_init (void)
1381{
1382 if (parport[0] == -2)
1383 return 0;
1384
1385 if (parport[0] != -1 && timid) {
1386 printk(KERN_WARNING "plip: warning, ignoring `timid' since specific ports given.\n");
1387 timid = 0;
1388 }
1389
1390 if (parport_register_driver (&plip_driver)) {
1391 printk (KERN_WARNING "plip: couldn't register driver\n");
1392 return 1;
1393 }
1394
1395 return 0;
1396}
1397
1398module_init(plip_init);
1399module_exit(plip_cleanup_module);
1400MODULE_LICENSE("GPL");
1401