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#include <linux/kernel.h>
28#include <linux/sched.h>
29#include <linux/string.h>
30#include <linux/ptrace.h>
31#include <linux/errno.h>
32#include <linux/ioport.h>
33#include <linux/slab.h>
34#include <linux/interrupt.h>
35#include <linux/pci.h>
36#include <linux/init.h>
37#include <linux/delay.h>
38#include <linux/netdevice.h>
39#include <linux/etherdevice.h>
40#include <linux/skbuff.h>
41#include <linux/spinlock.h>
42
43#include <asm/immap_8260.h>
44#include <asm/pgtable.h>
45#include <asm/mpc8260.h>
46#include <asm/bitops.h>
47#include <asm/uaccess.h>
48#include <asm/cpm_8260.h>
49#include <asm/irq.h>
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#define TX_TIMEOUT (2*HZ)
76
77
78
79
80
81
82
83#define CPM_ENET_RX_PAGES 4
84#define CPM_ENET_RX_FRSIZE 2048
85#define CPM_ENET_RX_FRPPG (PAGE_SIZE / CPM_ENET_RX_FRSIZE)
86#define RX_RING_SIZE (CPM_ENET_RX_FRPPG * CPM_ENET_RX_PAGES)
87#define TX_RING_SIZE 8
88#define TX_RING_MOD_MASK 7
89
90
91
92#define PKT_MAXBUF_SIZE 1518
93#define PKT_MINBUF_SIZE 64
94#define PKT_MAXBLR_SIZE 1520
95
96
97
98
99
100
101
102
103
104struct scc_enet_private {
105
106 struct sk_buff* tx_skbuff[TX_RING_SIZE];
107 ushort skb_cur;
108 ushort skb_dirty;
109
110
111
112 cbd_t *rx_bd_base;
113 cbd_t *tx_bd_base;
114 cbd_t *cur_rx, *cur_tx;
115 cbd_t *dirty_tx;
116 scc_t *sccp;
117 struct net_device_stats stats;
118 uint tx_full;
119 spinlock_t lock;
120};
121
122static int scc_enet_open(struct net_device *dev);
123static int scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
124static int scc_enet_rx(struct net_device *dev);
125static irqreturn_t scc_enet_interrupt(int irq, void *dev_id, struct pt_regs *);
126static int scc_enet_close(struct net_device *dev);
127static struct net_device_stats *scc_enet_get_stats(struct net_device *dev);
128static void set_multicast_list(struct net_device *dev);
129
130
131
132#define CPM_ENET_BLOCK CPM_CR_SCC1_SBLOCK
133#define CPM_ENET_PAGE CPM_CR_SCC1_PAGE
134#define PROFF_ENET PROFF_SCC1
135#define SCC_ENET 0
136#define SIU_INT_ENET SIU_INT_SCC1
137
138
139
140#define PD_ENET_RXD ((uint)0x00000001)
141#define PD_ENET_TXD ((uint)0x00000002)
142#define PD_ENET_TENA ((uint)0x00000004)
143#define PC_ENET_RENA ((uint)0x00020000)
144#define PC_ENET_CLSN ((uint)0x00000004)
145#define PC_ENET_TXCLK ((uint)0x00000800)
146#define PC_ENET_RXCLK ((uint)0x00000400)
147#define CMX_CLK_ROUTE ((uint)0x25000000)
148#define CMX_CLK_MASK ((uint)0xff000000)
149
150
151
152#define PC_EST8260_ENET_LOOPBACK ((uint)0x80000000)
153#define PC_EST8260_ENET_SQE ((uint)0x40000000)
154#define PC_EST8260_ENET_NOTFD ((uint)0x20000000)
155
156static int
157scc_enet_open(struct net_device *dev)
158{
159
160
161
162
163 netif_start_queue(dev);
164 return 0;
165}
166
167static int
168scc_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
169{
170 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
171 volatile cbd_t *bdp;
172
173
174
175 bdp = cep->cur_tx;
176
177#ifndef final_version
178 if (bdp->cbd_sc & BD_ENET_TX_READY) {
179
180
181
182 printk("%s: tx queue full!.\n", dev->name);
183 return 1;
184 }
185#endif
186
187
188
189 bdp->cbd_sc &= ~BD_ENET_TX_STATS;
190
191
192
193 if (skb->len <= ETH_ZLEN)
194 bdp->cbd_sc |= BD_ENET_TX_PAD;
195 else
196 bdp->cbd_sc &= ~BD_ENET_TX_PAD;
197
198
199
200 bdp->cbd_datlen = skb->len;
201 bdp->cbd_bufaddr = __pa(skb->data);
202
203
204
205 cep->tx_skbuff[cep->skb_cur] = skb;
206
207 cep->stats.tx_bytes += skb->len;
208 cep->skb_cur = (cep->skb_cur+1) & TX_RING_MOD_MASK;
209
210 spin_lock_irq(&cep->lock);
211
212
213
214
215 bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC);
216
217 dev->trans_start = jiffies;
218
219
220
221 if (bdp->cbd_sc & BD_ENET_TX_WRAP)
222 bdp = cep->tx_bd_base;
223 else
224 bdp++;
225
226 if (bdp->cbd_sc & BD_ENET_TX_READY) {
227 netif_stop_queue(dev);
228 cep->tx_full = 1;
229 }
230
231 cep->cur_tx = (cbd_t *)bdp;
232
233 spin_unlock_irq(&cep->lock);
234
235 return 0;
236}
237
238static void
239scc_enet_timeout(struct net_device *dev)
240{
241 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
242
243 printk("%s: transmit timed out.\n", dev->name);
244 cep->stats.tx_errors++;
245#ifndef final_version
246 {
247 int i;
248 cbd_t *bdp;
249 printk(" Ring data dump: cur_tx %p%s cur_rx %p.\n",
250 cep->cur_tx, cep->tx_full ? " (full)" : "",
251 cep->cur_rx);
252 bdp = cep->tx_bd_base;
253 printk(" Tx @base %p :\n", bdp);
254 for (i = 0 ; i < TX_RING_SIZE; i++, bdp++)
255 printk("%04x %04x %08x\n",
256 bdp->cbd_sc,
257 bdp->cbd_datlen,
258 bdp->cbd_bufaddr);
259 bdp = cep->rx_bd_base;
260 printk(" Rx @base %p :\n", bdp);
261 for (i = 0 ; i < RX_RING_SIZE; i++, bdp++)
262 printk("%04x %04x %08x\n",
263 bdp->cbd_sc,
264 bdp->cbd_datlen,
265 bdp->cbd_bufaddr);
266 }
267#endif
268 if (!cep->tx_full)
269 netif_wake_queue(dev);
270}
271
272
273
274
275static irqreturn_t
276scc_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
277{
278 struct net_device *dev = dev_id;
279 volatile struct scc_enet_private *cep;
280 volatile cbd_t *bdp;
281 ushort int_events;
282 int must_restart;
283
284 cep = (struct scc_enet_private *)dev->priv;
285
286
287
288 int_events = cep->sccp->scc_scce;
289 cep->sccp->scc_scce = int_events;
290 must_restart = 0;
291
292
293
294 if (int_events & SCCE_ENET_RXF)
295 scc_enet_rx(dev_id);
296
297
298
299
300
301
302
303
304
305
306
307
308 if (int_events & (SCCE_ENET_TXE | SCCE_ENET_TXB)) {
309 spin_lock(&cep->lock);
310 bdp = cep->dirty_tx;
311 while ((bdp->cbd_sc&BD_ENET_TX_READY)==0) {
312 if ((bdp==cep->cur_tx) && (cep->tx_full == 0))
313 break;
314
315 if (bdp->cbd_sc & BD_ENET_TX_HB)
316 cep->stats.tx_heartbeat_errors++;
317 if (bdp->cbd_sc & BD_ENET_TX_LC)
318 cep->stats.tx_window_errors++;
319 if (bdp->cbd_sc & BD_ENET_TX_RL)
320 cep->stats.tx_aborted_errors++;
321 if (bdp->cbd_sc & BD_ENET_TX_UN)
322 cep->stats.tx_fifo_errors++;
323 if (bdp->cbd_sc & BD_ENET_TX_CSL)
324 cep->stats.tx_carrier_errors++;
325
326
327
328
329
330 if (bdp->cbd_sc &
331 (BD_ENET_TX_LC | BD_ENET_TX_RL | BD_ENET_TX_UN)) {
332 must_restart = 1;
333 cep->stats.tx_errors++;
334 }
335
336 cep->stats.tx_packets++;
337
338
339
340
341 if (bdp->cbd_sc & BD_ENET_TX_DEF)
342 cep->stats.collisions++;
343
344
345
346 dev_kfree_skb_irq(cep->tx_skbuff[cep->skb_dirty]);
347 cep->skb_dirty = (cep->skb_dirty + 1) & TX_RING_MOD_MASK;
348
349
350
351 if (bdp->cbd_sc & BD_ENET_TX_WRAP)
352 bdp = cep->tx_bd_base;
353 else
354 bdp++;
355
356
357
358
359
360
361
362
363
364
365
366
367
368 if (cep->tx_full) {
369 cep->tx_full = 0;
370 if (netif_queue_stopped(dev)) {
371 netif_wake_queue(dev);
372 }
373 }
374
375 cep->dirty_tx = (cbd_t *)bdp;
376 }
377
378 if (must_restart) {
379 volatile cpm8260_t *cp;
380
381
382
383
384
385
386
387
388 cp = cpmp;
389 cp->cp_cpcr =
390 mk_cr_cmd(CPM_ENET_PAGE, CPM_ENET_BLOCK, 0,
391 CPM_CR_RESTART_TX) | CPM_CR_FLG;
392 while (cp->cp_cpcr & CPM_CR_FLG);
393 }
394 spin_unlock(&cep->lock);
395 }
396
397
398
399
400
401 if (int_events & SCCE_ENET_BSY) {
402 cep->stats.rx_dropped++;
403 printk("SCC ENET: BSY can't happen.\n");
404 }
405
406 return IRQ_HANDLED;
407}
408
409
410
411
412
413
414static int
415scc_enet_rx(struct net_device *dev)
416{
417 struct scc_enet_private *cep;
418 volatile cbd_t *bdp;
419 struct sk_buff *skb;
420 ushort pkt_len;
421
422 cep = (struct scc_enet_private *)dev->priv;
423
424
425
426
427 bdp = cep->cur_rx;
428
429for (;;) {
430 if (bdp->cbd_sc & BD_ENET_RX_EMPTY)
431 break;
432
433#ifndef final_version
434
435
436
437 if ((bdp->cbd_sc & (BD_ENET_RX_FIRST | BD_ENET_RX_LAST)) !=
438 (BD_ENET_RX_FIRST | BD_ENET_RX_LAST))
439 printk("CPM ENET: rcv is not first+last\n");
440#endif
441
442
443
444 if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH))
445 cep->stats.rx_length_errors++;
446 if (bdp->cbd_sc & BD_ENET_RX_NO)
447 cep->stats.rx_frame_errors++;
448 if (bdp->cbd_sc & BD_ENET_RX_CR)
449 cep->stats.rx_crc_errors++;
450 if (bdp->cbd_sc & BD_ENET_RX_OV)
451 cep->stats.rx_crc_errors++;
452
453
454
455
456
457 if (bdp->cbd_sc & BD_ENET_RX_CL) {
458 cep->stats.rx_frame_errors++;
459 }
460 else {
461
462
463
464 cep->stats.rx_packets++;
465 pkt_len = bdp->cbd_datlen;
466 cep->stats.rx_bytes += pkt_len;
467
468
469
470
471
472
473 skb = dev_alloc_skb(pkt_len-4);
474
475 if (skb == NULL) {
476 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
477 cep->stats.rx_dropped++;
478 }
479 else {
480 skb->dev = dev;
481 skb_put(skb,pkt_len-4);
482 eth_copy_and_sum(skb,
483 (unsigned char *)__va(bdp->cbd_bufaddr),
484 pkt_len-4, 0);
485 skb->protocol=eth_type_trans(skb,dev);
486 netif_rx(skb);
487 }
488 }
489
490
491
492 bdp->cbd_sc &= ~BD_ENET_RX_STATS;
493
494
495
496 bdp->cbd_sc |= BD_ENET_RX_EMPTY;
497
498
499
500 if (bdp->cbd_sc & BD_ENET_RX_WRAP)
501 bdp = cep->rx_bd_base;
502 else
503 bdp++;
504
505 }
506 cep->cur_rx = (cbd_t *)bdp;
507
508 return 0;
509}
510
511static int
512scc_enet_close(struct net_device *dev)
513{
514
515
516 netif_stop_queue(dev);
517
518 return 0;
519}
520
521static struct net_device_stats *scc_enet_get_stats(struct net_device *dev)
522{
523 struct scc_enet_private *cep = (struct scc_enet_private *)dev->priv;
524
525 return &cep->stats;
526}
527
528
529
530
531
532
533
534
535
536
537
538static void set_multicast_list(struct net_device *dev)
539{
540 struct scc_enet_private *cep;
541 struct dev_mc_list *dmi;
542 u_char *mcptr, *tdptr;
543 volatile scc_enet_t *ep;
544 int i, j;
545 cep = (struct scc_enet_private *)dev->priv;
546
547
548
549 ep = (scc_enet_t *)dev->base_addr;
550
551 if (dev->flags&IFF_PROMISC) {
552
553
554 printk("%s: Promiscuous mode enabled.\n", dev->name);
555 cep->sccp->scc_pmsr |= SCC_PSMR_PRO;
556 } else {
557
558 cep->sccp->scc_pmsr &= ~SCC_PSMR_PRO;
559
560 if (dev->flags & IFF_ALLMULTI) {
561
562
563
564 ep->sen_gaddr1 = 0xffff;
565 ep->sen_gaddr2 = 0xffff;
566 ep->sen_gaddr3 = 0xffff;
567 ep->sen_gaddr4 = 0xffff;
568 }
569 else {
570
571
572 ep->sen_gaddr1 = 0;
573 ep->sen_gaddr2 = 0;
574 ep->sen_gaddr3 = 0;
575 ep->sen_gaddr4 = 0;
576
577 dmi = dev->mc_list;
578
579 for (i=0; i<dev->mc_count; i++) {
580
581
582
583 if (!(dmi->dmi_addr[0] & 1))
584 continue;
585
586
587
588
589
590 mcptr = (u_char *)dmi->dmi_addr + 5;
591 tdptr = (u_char *)&ep->sen_taddrh;
592 for (j=0; j<6; j++)
593 *tdptr++ = *mcptr--;
594
595
596
597
598 cpmp->cp_cpcr = mk_cr_cmd(CPM_ENET_PAGE,
599 CPM_ENET_BLOCK, 0,
600 CPM_CR_SET_GADDR) | CPM_CR_FLG;
601
602 udelay(10);
603 while (cpmp->cp_cpcr & CPM_CR_FLG);
604 }
605 }
606 }
607}
608
609
610
611static int __init scc_enet_init(void)
612{
613 struct net_device *dev;
614 struct scc_enet_private *cep;
615 int i, j;
616 unsigned char *eap;
617 unsigned long mem_addr;
618 bd_t *bd;
619 volatile cbd_t *bdp;
620 volatile cpm8260_t *cp;
621 volatile scc_t *sccp;
622 volatile scc_enet_t *ep;
623 volatile immap_t *immap;
624 volatile iop8260_t *io;
625
626 cp = cpmp;
627
628 immap = (immap_t *)IMAP_ADDR;
629 io = &immap->im_ioport;
630
631 bd = (bd_t *)__res;
632
633
634
635 dev = alloc_etherdev(sizeof(*cep));
636 if (!dev)
637 return -ENOMEM;
638
639 cep = dev->priv;
640 spin_lock_init(&cep->lock);
641
642
643
644 ep = (scc_enet_t *)(&immap->im_dprambase[PROFF_ENET]);
645
646
647
648 sccp = (volatile scc_t *)(&immap->im_scc[SCC_ENET]);
649 cep->sccp = (scc_t *)sccp;
650
651
652
653 sccp->scc_gsmrl &= ~(SCC_GSMRL_ENR | SCC_GSMRL_ENT);
654
655
656
657
658
659 io->iop_pparc |=
660 (PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
661 io->iop_pdirc &=
662 ~(PC_ENET_RENA | PC_ENET_CLSN | PC_ENET_TXCLK | PC_ENET_RXCLK);
663 io->iop_psorc &=
664 ~(PC_ENET_RENA | PC_ENET_TXCLK | PC_ENET_RXCLK);
665 io->iop_psorc |= PC_ENET_CLSN;
666
667 io->iop_ppard |= (PD_ENET_RXD | PD_ENET_TXD | PD_ENET_TENA);
668 io->iop_pdird |= (PD_ENET_TXD | PD_ENET_TENA);
669 io->iop_pdird &= ~PD_ENET_RXD;
670 io->iop_psord |= PD_ENET_TXD;
671 io->iop_psord &= ~(PD_ENET_RXD | PD_ENET_TENA);
672
673
674
675
676 immap->im_cpmux.cmx_scr &= ~CMX_CLK_MASK;
677 immap->im_cpmux.cmx_scr |= CMX_CLK_ROUTE;
678
679
680
681
682
683 i = m8260_cpm_dpalloc(sizeof(cbd_t) * RX_RING_SIZE, 8);
684 ep->sen_genscc.scc_rbase = i;
685 cep->rx_bd_base = (cbd_t *)&immap->im_dprambase[i];
686
687 i = m8260_cpm_dpalloc(sizeof(cbd_t) * TX_RING_SIZE, 8);
688 ep->sen_genscc.scc_tbase = i;
689 cep->tx_bd_base = (cbd_t *)&immap->im_dprambase[i];
690
691 cep->dirty_tx = cep->cur_tx = cep->tx_bd_base;
692 cep->cur_rx = cep->rx_bd_base;
693
694 ep->sen_genscc.scc_rfcr = CPMFCR_GBL | CPMFCR_EB;
695 ep->sen_genscc.scc_tfcr = CPMFCR_GBL | CPMFCR_EB;
696
697
698
699
700
701 ep->sen_genscc.scc_mrblr = PKT_MAXBLR_SIZE;
702
703
704
705 ep->sen_cpres = 0xffffffff;
706 ep->sen_cmask = 0xdebb20e3;
707
708 ep->sen_crcec = 0;
709 ep->sen_alec = 0;
710 ep->sen_disfc = 0;
711
712 ep->sen_pads = 0x8888;
713 ep->sen_retlim = 15;
714
715 ep->sen_maxflr = PKT_MAXBUF_SIZE;
716 ep->sen_minflr = PKT_MINBUF_SIZE;
717
718 ep->sen_maxd1 = PKT_MAXBLR_SIZE;
719 ep->sen_maxd2 = PKT_MAXBLR_SIZE;
720
721
722
723 ep->sen_gaddr1 = 0;
724 ep->sen_gaddr2 = 0;
725 ep->sen_gaddr3 = 0;
726 ep->sen_gaddr4 = 0;
727 ep->sen_iaddr1 = 0;
728 ep->sen_iaddr2 = 0;
729 ep->sen_iaddr3 = 0;
730 ep->sen_iaddr4 = 0;
731
732
733
734
735
736
737 eap = (unsigned char *)&(ep->sen_paddrh);
738 for (i=5; i>=0; i--)
739 *eap++ = dev->dev_addr[i] = bd->bi_enetaddr[i];
740
741 ep->sen_pper = 0;
742 ep->sen_taddrl = 0;
743 ep->sen_taddrm = 0;
744 ep->sen_taddrh = 0;
745
746
747
748
749 bdp = cep->tx_bd_base;
750 for (i=0; i<TX_RING_SIZE; i++) {
751
752
753
754 bdp->cbd_sc = 0;
755 bdp->cbd_bufaddr = 0;
756 bdp++;
757 }
758
759
760
761 bdp--;
762 bdp->cbd_sc |= BD_SC_WRAP;
763
764 bdp = cep->rx_bd_base;
765 for (i=0; i<CPM_ENET_RX_PAGES; i++) {
766
767
768
769 mem_addr = __get_free_page(GFP_KERNEL);
770
771
772
773
774 for (j=0; j<CPM_ENET_RX_FRPPG; j++) {
775 bdp->cbd_sc = BD_ENET_RX_EMPTY | BD_ENET_RX_INTR;
776 bdp->cbd_bufaddr = __pa(mem_addr);
777 mem_addr += CPM_ENET_RX_FRSIZE;
778 bdp++;
779 }
780 }
781
782
783
784 bdp--;
785 bdp->cbd_sc |= BD_SC_WRAP;
786
787
788
789
790
791 cpmp->cp_cpcr = mk_cr_cmd(CPM_ENET_PAGE, CPM_ENET_BLOCK, 0,
792 CPM_CR_INIT_TRX) | CPM_CR_FLG;
793 while (cp->cp_cpcr & CPM_CR_FLG);
794
795 cep->skb_cur = cep->skb_dirty = 0;
796
797 sccp->scc_scce = 0xffff;
798
799
800
801
802
803 sccp->scc_sccm = (SCCE_ENET_TXE | SCCE_ENET_RXF | SCCE_ENET_TXB);
804
805
806
807 request_irq(SIU_INT_ENET, scc_enet_interrupt, 0, "enet", dev);
808
809
810
811
812
813 sccp->scc_gsmrh = 0;
814 sccp->scc_gsmrl = (SCC_GSMRL_TCI | SCC_GSMRL_TPL_48 | SCC_GSMRL_TPP_10 | SCC_GSMRL_MODE_ENET);
815
816
817
818 sccp->scc_dsr = 0xd555;
819
820
821
822
823 sccp->scc_pmsr = (SCC_PSMR_ENCRC | SCC_PSMR_NIB22);
824
825
826
827
828 io->iop_pparc &= ~(PC_EST8260_ENET_LOOPBACK |
829 PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
830 io->iop_psorc &= ~(PC_EST8260_ENET_LOOPBACK |
831 PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
832 io->iop_pdirc |= (PC_EST8260_ENET_LOOPBACK |
833 PC_EST8260_ENET_SQE | PC_EST8260_ENET_NOTFD);
834 io->iop_pdatc &= ~(PC_EST8260_ENET_LOOPBACK | PC_EST8260_ENET_SQE);
835 io->iop_pdatc |= PC_EST8260_ENET_NOTFD;
836
837 dev->base_addr = (unsigned long)ep;
838
839
840 dev->open = scc_enet_open;
841 dev->hard_start_xmit = scc_enet_start_xmit;
842 dev->tx_timeout = scc_enet_timeout;
843 dev->watchdog_timeo = TX_TIMEOUT;
844 dev->stop = scc_enet_close;
845 dev->get_stats = scc_enet_get_stats;
846 dev->set_multicast_list = set_multicast_list;
847
848
849
850 sccp->scc_gsmrl |= (SCC_GSMRL_ENR | SCC_GSMRL_ENT);
851
852 err = register_netdev(dev);
853 if (err) {
854 kfree(dev);
855 return err;
856 }
857
858 printk("%s: SCC ENET Version 0.1, ", dev->name);
859 for (i=0; i<5; i++)
860 printk("%02x:", dev->dev_addr[i]);
861 printk("%02x\n", dev->dev_addr[5]);
862
863 return 0;
864}
865
866module_init(scc_enet_init);
867