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