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#include <linux/config.h>
27#include <linux/kernel.h>
28#include <linux/string.h>
29#include <linux/ptrace.h>
30#include <linux/errno.h>
31#include <linux/ioport.h>
32#include <linux/interrupt.h>
33#include <linux/pci.h>
34#include <linux/init.h>
35#include <linux/delay.h>
36#include <linux/netdevice.h>
37#include <linux/etherdevice.h>
38#include <linux/skbuff.h>
39#include <linux/spinlock.h>
40
41#include <asm/irq.h>
42#include <asm/m68360.h>
43
44
45
46#include <asm/bitops.h>
47
48#include <asm/commproc.h>
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
81
82
83
84
85
86
87
88
89
90
91#define TX_TIMEOUT (2*HZ)
92
93
94
95
96
97#ifdef CONFIG_ENET_BIG_BUFFERS
98#define RX_RING_SIZE 64
99#define TX_RING_SIZE 64
100#define TX_RING_MOD_MASK 63
101#else
102#define RX_RING_SIZE 8
103#define TX_RING_SIZE 8
104#define TX_RING_MOD_MASK 7
105#endif
106
107#define CPM_ENET_RX_FRSIZE 2048
108static char rx_buf_pool[RX_RING_SIZE * CPM_ENET_RX_FRSIZE];
109
110
111
112
113#define PKT_MAXBUF_SIZE 1518
114#define PKT_MINBUF_SIZE 64
115#define PKT_MAXBLR_SIZE 1520
116
117
118
119
120
121
122
123
124
125struct scc_enet_private {
126
127 struct sk_buff* tx_skbuff[TX_RING_SIZE];
128 ushort skb_cur;
129 ushort skb_dirty;
130
131
132
133 QUICC_BD *rx_bd_base;
134 QUICC_BD *tx_bd_base;
135 QUICC_BD *cur_rx, *cur_tx;
136 QUICC_BD *dirty_tx;
137 volatile struct scc_regs *sccp;
138
139 struct net_device_stats stats;
140 uint tx_full;
141
142 volatile unsigned int lock;
143};
144
145
146
147static int scc_enet_open(struct net_device *dev);
148static int scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
149static int scc_enet_rx(struct net_device *dev);
150static irqreturn_t scc_enet_interrupt(int vec, void *dev_id, struct pt_regs *fp);
151static int scc_enet_close(struct net_device *dev);
152
153static struct net_device_stats *scc_enet_get_stats(struct net_device *dev);
154static void set_multicast_list(struct net_device *dev);
155
156
157
158
159
160
161
162
163
164#define CONFIG_SCC1_ENET
165
166#ifdef CONFIG_SCC1_ENET
167#define CPM_CR_ENET CPM_CR_CH_SCC1
168#define PROFF_ENET PROFF_SCC1
169#define SCC_ENET 0
170#define CPMVEC_ENET CPMVEC_SCC1
171#endif
172
173#ifdef CONFIG_SCC2_ENET
174#define CPM_CR_ENET CPM_CR_CH_SCC2
175#define PROFF_ENET PROFF_SCC2
176#define SCC_ENET 1
177#define CPMVEC_ENET CPMVEC_SCC2
178#endif
179
180static int
181scc_enet_open(struct net_device *dev)
182{
183
184
185
186
187
188
189
190 return 0;
191}
192
193
194static int
195scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
196{
197 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
198 volatile QUICC_BD *bdp;
199
200
201 bdp = cep->cur_tx;
202
203#ifndef final_version
204 if (bdp->status & BD_ENET_TX_READY) {
205
206
207
208 printk("%s: tx queue full!.\n", dev->name);
209 return 1;
210 }
211#endif
212
213
214
215 bdp->status &= ~BD_ENET_TX_STATS;
216
217
218
219 if (skb->len <= ETH_ZLEN)
220 bdp->status |= BD_ENET_TX_PAD;
221 else
222 bdp->status &= ~BD_ENET_TX_PAD;
223
224
225
226 bdp->length = skb->len;
227
228 bdp->buf = skb->data;
229
230
231
232 cep->tx_skbuff[cep->skb_cur] = skb;
233
234
235
236 cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
237
238
239
240
241
242
243
244
245
246 local_irq_disable();
247 if (cep->lock > 0) {
248 printk ("scc_enet_start_xmit() lock == %d\n", cep->lock);
249 } else {
250 cep->lock++;
251 }
252
253
254
255
256 bdp->status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC);
257
258 dev->trans_start = jiffies;
259
260
261
262 if (bdp->status & BD_ENET_TX_WRAP)
263 bdp = cep->tx_bd_base;
264 else
265 bdp++;
266
267 if (bdp->status & BD_ENET_TX_READY) {
268
269 cep->tx_full = 1;
270 }
271
272 cep->cur_tx = (QUICC_BD *)bdp;
273
274
275 cep->lock--;
276 sti();
277
278 return 0;
279}
280
281#if 0
282static void
283scc_enet_timeout(struct net_device *dev)
284{
285 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
286
287 printk("%s: transmit timed out.\n", dev->name);
288 cep->stats.tx_errors++;
289#ifndef final_version
290 {
291 int i;
292 QUICC_BD *bdp;
293 printk(" Ring data dump: cur_tx %p%s cur_rx %p.\n",
294 cep->cur_tx, cep->tx_full ? " (full)" : "",
295 cep->cur_rx);
296 bdp = cep->tx_bd_base;
297 for (i = 0 ; i < TX_RING_SIZE; i++, bdp++)
298 printk("%04x %04x %08x\n",
299 bdp->status,
300 bdp->length,
301 (int)(bdp->buf));
302 bdp = cep->rx_bd_base;
303 for (i = 0 ; i < RX_RING_SIZE; i++, bdp++)
304 printk("%04x %04x %08x\n",
305 bdp->status,
306 bdp->length,
307 (int)(bdp->buf));
308 }
309#endif
310
311
312}
313#endif
314
315
316
317
318static irqreturn_t scc_enet_interrupt(int vec, void *dev_id, struct pt_regs *fp)
319{
320 struct net_device *dev = (struct net_device *)dev_id;
321 volatile struct scc_enet_private *cep;
322 volatile QUICC_BD *bdp;
323 ushort int_events;
324 int must_restart;
325
326 cep = (struct scc_enet_private *)dev->priv;
327
328
329
330 int_events = cep->sccp->scc_scce;
331 cep->sccp->scc_scce = int_events;
332 must_restart = 0;
333
334
335
336 if (int_events & SCCE_ENET_RXF)
337 scc_enet_rx(dev_id);
338
339
340
341
342
343
344
345
346
347
348
349
350 if (int_events & (SCCE_ENET_TXE | SCCE_ENET_TXB)) {
351
352
353 if (cep->lock > 0) {
354 printk ("scc_enet_interrupt() lock == %d\n", cep->lock);
355 } else {
356 cep->lock++;
357 }
358
359 bdp = cep->dirty_tx;
360 while ((bdp->status&BD_ENET_TX_READY)==0) {
361 if ((bdp==cep->cur_tx) && (cep->tx_full == 0))
362 break;
363
364 if (bdp->status & BD_ENET_TX_HB)
365 cep->stats.tx_heartbeat_errors++;
366 if (bdp->status & BD_ENET_TX_LC)
367 cep->stats.tx_window_errors++;
368 if (bdp->status & BD_ENET_TX_RL)
369 cep->stats.tx_aborted_errors++;
370 if (bdp->status & BD_ENET_TX_UN)
371 cep->stats.tx_fifo_errors++;
372 if (bdp->status & BD_ENET_TX_CSL)
373 cep->stats.tx_carrier_errors++;
374
375
376
377
378
379 if (bdp->status &
380 (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) {
381 must_restart = 1;
382 cep->stats.tx_errors++;
383 }
384
385 cep->stats.tx_packets++;
386
387
388
389
390 if (bdp->status & BD_ENET_TX_DEF)
391 cep->stats.collisions++;
392
393
394
395
396 dev_kfree_skb (cep->tx_skbuff[cep->skb_dirty]);
397 cep->skb_dirty = (cep->skb_dirty + 1) & TX_RING_MOD_MASK;
398
399
400
401 if (bdp->status & BD_ENET_TX_WRAP)
402 bdp = cep->tx_bd_base;
403 else
404 bdp++;
405
406
407
408
409
410
411
412
413
414
415
416
417
418 if (cep->tx_full) {
419 cep->tx_full = 0;
420
421
422 }
423
424 cep->dirty_tx = (QUICC_BD *)bdp;
425 }
426
427 if (must_restart) {
428 volatile QUICC *cp;
429
430
431
432
433
434
435
436 cp = pquicc;
437 cp->cp_cr =
438 mk_cr_cmd(CPM_CR_ENET, CPM_CR_RESTART_TX) | CPM_CR_FLG;
439 while (cp->cp_cr & CPM_CR_FLG);
440 }
441
442
443 cep->lock--;
444 }
445
446
447
448
449
450 if (int_events & SCCE_ENET_BSY) {
451 cep->stats.rx_dropped++;
452 printk("CPM ENET: BSY can't happen.\n");
453 }
454
455 return IRQ_HANDLED;
456}
457
458
459
460
461
462
463static int
464scc_enet_rx(struct net_device *dev)
465{
466 struct scc_enet_private *cep;
467 volatile QUICC_BD *bdp;
468 struct sk_buff *skb;
469 ushort pkt_len;
470
471 cep = (struct scc_enet_private *)dev->priv;
472
473
474
475
476 bdp = cep->cur_rx;
477
478 for (;;) {
479 if (bdp->status & BD_ENET_RX_EMPTY)
480 break;
481
482#ifndef final_version
483
484
485
486 if ((bdp->status & (BD_ENET_RX_FIRST | BD_ENET_RX_LAST)) !=
487 (BD_ENET_RX_FIRST | BD_ENET_RX_LAST))
488 printk("CPM ENET: rcv is not first+last\n");
489#endif
490
491
492
493 if (bdp->status & (BD_ENET_RX_LG | BD_ENET_RX_SH))
494 cep->stats.rx_length_errors++;
495 if (bdp->status & BD_ENET_RX_NO)
496 cep->stats.rx_frame_errors++;
497 if (bdp->status & BD_ENET_RX_CR)
498 cep->stats.rx_crc_errors++;
499 if (bdp->status & BD_ENET_RX_OV)
500 cep->stats.rx_crc_errors++;
501
502
503
504
505
506 if (bdp->status & BD_ENET_RX_CL) {
507 cep->stats.rx_frame_errors++;
508 }
509 else {
510
511
512
513 cep->stats.rx_packets++;
514 pkt_len = bdp->length;
515
516
517
518
519
520
521
522 skb = dev_alloc_skb(pkt_len-4);
523
524 if (skb == NULL) {
525 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
526 cep->stats.rx_dropped++;
527 }
528 else {
529 skb->dev = dev;
530 skb_put(skb,pkt_len-4);
531 eth_copy_and_sum(skb, (unsigned char *)bdp->buf, pkt_len-4, 0);
532 skb->protocol=eth_type_trans(skb,dev);
533 netif_rx(skb);
534 }
535 }
536
537
538
539 bdp->status &= ~BD_ENET_RX_STATS;
540
541
542
543 bdp->status |= BD_ENET_RX_EMPTY;
544
545
546
547 if (bdp->status & BD_ENET_RX_WRAP)
548 bdp = cep->rx_bd_base;
549 else
550 bdp++;
551
552 }
553 cep->cur_rx = (QUICC_BD *)bdp;
554
555 return 0;
556}
557
558static int
559scc_enet_close(struct net_device *dev)
560{
561
562
563
564
565 return 0;
566}
567
568
569static struct net_device_stats *scc_enet_get_stats(struct net_device *dev)
570{
571 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
572
573 return &cep->stats;
574}
575
576
577
578
579
580
581
582
583
584
585
586static void set_multicast_list(struct net_device *dev)
587{
588 struct scc_enet_private *cep;
589 struct dev_mc_list *dmi;
590 u_char *mcptr, *tdptr;
591 volatile scc_enet_t *ep;
592 int i, j;
593 volatile QUICC *cp = pquicc;
594
595 cep = (struct scc_enet_private *)dev->priv;
596
597
598
599 ep = (scc_enet_t *)dev->base_addr;
600
601 if (dev->flags&IFF_PROMISC) {
602
603
604 printk("%s: Promiscuous mode enabled.\n", dev->name);
605 cep->sccp->scc_psmr |= ETHER_PRO;
606 } else {
607
608 cep->sccp->scc_psmr &= ~ETHER_PRO;
609
610 if (dev->flags & IFF_ALLMULTI) {
611
612
613
614 ep->sen_gaddr1 = 0xffff;
615 ep->sen_gaddr2 = 0xffff;
616 ep->sen_gaddr3 = 0xffff;
617 ep->sen_gaddr4 = 0xffff;
618 }
619 else {
620
621
622 ep->sen_gaddr1 = 0;
623 ep->sen_gaddr2 = 0;
624 ep->sen_gaddr3 = 0;
625 ep->sen_gaddr4 = 0;
626
627 dmi = dev->mc_list;
628
629 for (i=0; i<dev->mc_count; i++) {
630
631
632
633 if (!(dmi->dmi_addr[0] & 1))
634 continue;
635
636
637
638
639
640 mcptr = (u_char *)dmi->dmi_addr + 5;
641 tdptr = (u_char *)&ep->sen_taddrh;
642 for (j=0; j<6; j++)
643 *tdptr++ = *mcptr--;
644
645
646
647
648 cp->cp_cr = mk_cr_cmd(CPM_CR_ENET, CPM_CR_SET_GADDR) | CPM_CR_FLG;
649
650 udelay(10);
651 while (cp->cp_cr & CPM_CR_FLG);
652 }
653 }
654 }
655}
656
657
658
659
660int scc_enet_init(void)
661{
662 struct net_device *dev;
663 struct scc_enet_private *cep;
664 int i, j;
665 unsigned char *eap;
666
667
668
669 volatile QUICC_BD *bdp;
670 volatile QUICC *cp;
671 volatile struct scc_regs *sccp;
672 volatile struct ethernet_pram *ep;
673
674
675 cp = pquicc;
676
677
678
679
680
681
682
683 cep = (struct scc_enet_private *)kmalloc(sizeof(*cep), GFP_KERNEL);
684 memset(cep, 0, sizeof(*cep));
685
686
687
688
689
690 dev = init_etherdev(0, 0);
691
692
693
694
695 ep = &pquicc->pram[SCC_ENET].enet_scc;
696
697
698
699 sccp = &pquicc->scc_regs[SCC_ENET];
700 cep->sccp = sccp;
701
702
703
704 sccp->scc_gsmr.w.low &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
705
706
707
708
709
710
711
712 pquicc->pio_papar |= (PA_ENET_RXD | PA_ENET_TXD);
713 pquicc->pio_padir &= ~(PA_ENET_RXD | PA_ENET_TXD);
714 pquicc->pio_paodr &= ~PA_ENET_TXD;
715
716
717
718 pquicc->pio_pcpar &= ~(PC_ENET_CLSN | PC_ENET_RENA);
719 pquicc->pio_pcdir &= ~(PC_ENET_CLSN | PC_ENET_RENA);
720 pquicc->pio_pcso |= (PC_ENET_CLSN | PC_ENET_RENA);
721
722
723
724 pquicc->pio_papar |= (PA_ENET_TCLK | PA_ENET_RCLK);
725 pquicc->pio_padir &= ~(PA_ENET_TCLK | PA_ENET_RCLK);
726
727
728
729
730 pquicc->si_sicr &= ~SICR_ENET_MASK;
731 pquicc->si_sicr |= SICR_ENET_CLKRT;
732
733
734
735
736
737
738 i = m360_cpm_dpalloc(sizeof(QUICC_BD) * RX_RING_SIZE);
739 ep->rbase = i;
740 cep->rx_bd_base = (QUICC_BD *)((uint)pquicc + i);
741
742 i = m360_cpm_dpalloc(sizeof(QUICC_BD) * TX_RING_SIZE);
743 ep->tbase = i;
744 cep->tx_bd_base = (QUICC_BD *)((uint)pquicc + i);
745
746 cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
747 cep->cur_rx = cep->rx_bd_base;
748
749
750
751
752
753
754
755
756
757
758
759
760
761 ep->rfcr = (SCC_EB | SCC_FC_DMA);
762 ep->tfcr = (SCC_EB | SCC_FC_DMA);
763
764
765
766
767
768 ep->mrblr = PKT_MAXBLR_SIZE;
769
770
771
772 ep->c_pres = 0xffffffff;
773 ep->c_mask = 0xdebb20e3;
774
775 ep->crcec = 0;
776 ep->alec = 0;
777 ep->disfc = 0;
778
779 ep->pads = 0x8888;
780 ep->ret_lim = 0x000f;
781
782 ep->mflr = PKT_MAXBUF_SIZE;
783 ep->minflr = PKT_MINBUF_SIZE;
784
785 ep->maxd1 = PKT_MAXBLR_SIZE;
786 ep->maxd2 = PKT_MAXBLR_SIZE;
787
788
789
790 ep->gaddr1 = ep->gaddr2 = ep->gaddr3 = ep->gaddr4 = 0;
791 ep->iaddr1 = ep->iaddr2 = ep->iaddr3 = ep->iaddr4 = 0;
792
793
794
795
796
797
798#if defined (CONFIG_UCQUICC)
799 {
800 extern unsigned char *scc1_hwaddr;
801
802 eap = (char *)ep->paddr.b;
803 for (i=5; i>=0; i--)
804 *eap++ = dev->dev_addr[i] = scc1_hwaddr[i];
805 }
806#endif
807
808
809
810
811
812
813
814
815
816
817
818
819 ep->p_per = 0;
820 ep->taddr_l = 0;
821 ep->taddr_m = 0;
822 ep->taddr_h = 0;
823
824
825
826
827
828 bdp = cep->tx_bd_base;
829 for (j=0; j<(TX_RING_SIZE-1); j++) {
830 bdp->buf = 0;
831 bdp->status = 0;
832 bdp++;
833 }
834 bdp->buf = 0;
835 bdp->status = BD_SC_WRAP;
836
837
838
839 bdp = cep->rx_bd_base;
840 for (j=0; j<(RX_RING_SIZE-1); j++) {
841 bdp->buf = &rx_buf_pool[j * CPM_ENET_RX_FRSIZE];
842 bdp->status = BD_SC_EMPTY | BD_SC_INTRPT;
843 bdp++;
844 }
845 bdp->buf = &rx_buf_pool[j * CPM_ENET_RX_FRSIZE];
846 bdp->status = BD_SC_WRAP | BD_SC_EMPTY | BD_SC_INTRPT;
847
848
849
850
851
852
853
854 cp->cp_cr = mk_cr_cmd(CPM_CR_ENET, CPM_CR_INIT_TRX) | CPM_CR_FLG;
855 while (cp->cp_cr & CPM_CR_FLG);
856
857 cep->skb_cur = cep->skb_dirty = 0;
858
859 sccp->scc_scce = 0xffff;
860
861
862
863
864
865 sccp->scc_sccm = (SCCE_ENET_TXE | SCCE_ENET_RXF | SCCE_ENET_TXB);
866
867
868
869
870 request_irq(CPMVEC_ENET, scc_enet_interrupt,
871 IRQ_FLG_LOCK, dev->name, (void *)dev);
872
873
874
875
876 sccp->scc_gsmr.w.high = 0;
877 sccp->scc_gsmr.w.low = (SCC_GSMRL_TCI | SCC_GSMRL_TPL_48 |
878 SCC_GSMRL_TPP_10 | SCC_GSMRL_MODE_ENET);
879
880
881
882 sccp->scc_dsr = 0xd555;
883
884
885
886
887 sccp->scc_psmr = (SCC_PMSR_ENCRC
888
889
890
891 | ETHER_NIB_22);
892
893
894
895
896
897
898#if defined(CONFIG_UCQUICC)
899
900
901 cp->pio_pcpar |= PC_ENET_TENA;
902 cp->pio_pcdir &= ~PC_ENET_TENA;
903
904 cp->pip_pbpar &= ~(0x00000200);
905 cp->pip_pbdir |= (0x00000200);
906 cp->pip_pbdat |= (0x00000200);
907#endif
908
909
910 dev->base_addr = (unsigned long)ep;
911 dev->priv = cep;
912#if 0
913 dev->name = "CPM_ENET";
914#endif
915
916
917 dev->open = scc_enet_open;
918 dev->hard_start_xmit = scc_enet_start_xmit;
919
920
921 dev->stop = scc_enet_close;
922 dev->get_stats = scc_enet_get_stats;
923 dev->set_multicast_list = set_multicast_list;
924
925
926
927 sccp->scc_gsmr.w.low |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
928
929 printk("%s: CPM ENET Version 0.3, ", dev->name);
930 for (i=0; i<5; i++)
931 printk("%02x:", dev->dev_addr[i]);
932 printk("%02x\n", dev->dev_addr[5]);
933
934 return 0;
935}
936
937
938
939int m68360_enet_probe(struct device *dev)
940{
941 return(scc_enet_init ());
942}
943
944
945
946
947
948
949
950
951
952