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#include <linux/config.h>
32#include <linux/kernel.h>
33#include <linux/sched.h>
34#include <linux/string.h>
35#include <linux/ptrace.h>
36#include <linux/errno.h>
37#include <linux/ioport.h>
38#include <linux/slab.h>
39#include <linux/interrupt.h>
40#include <linux/pci.h>
41#include <linux/init.h>
42#include <linux/delay.h>
43#include <linux/netdevice.h>
44#include <linux/etherdevice.h>
45#include <linux/skbuff.h>
46#include <linux/spinlock.h>
47#ifdef CONFIG_FEC_PACKETHOOK
48#include <linux/pkthook.h>
49#endif
50
51#include <asm/8xx_immap.h>
52#include <asm/pgtable.h>
53#include <asm/mpc8xx.h>
54#include <asm/irq.h>
55#include <asm/bitops.h>
56#include <asm/uaccess.h>
57#include <asm/commproc.h>
58
59#ifdef CONFIG_USE_MDIO
60
61
62
63typedef struct {
64 uint mii_data;
65 void (*funct)(uint mii_reg, struct net_device *dev);
66} phy_cmd_t;
67
68typedef struct {
69 uint id;
70 char *name;
71
72 const phy_cmd_t *config;
73 const phy_cmd_t *startup;
74 const phy_cmd_t *ack_int;
75 const phy_cmd_t *shutdown;
76} phy_info_t;
77#endif
78
79
80
81
82
83
84
85#ifdef CONFIG_ENET_BIG_BUFFERS
86#define FEC_ENET_RX_PAGES 16
87#define FEC_ENET_RX_FRSIZE 2048
88#define FEC_ENET_RX_FRPPG (PAGE_SIZE / FEC_ENET_RX_FRSIZE)
89#define RX_RING_SIZE (FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
90#define TX_RING_SIZE 16
91#define TX_RING_MOD_MASK 15
92#else
93#define FEC_ENET_RX_PAGES 4
94#define FEC_ENET_RX_FRSIZE 2048
95#define FEC_ENET_RX_FRPPG (PAGE_SIZE / FEC_ENET_RX_FRSIZE)
96#define RX_RING_SIZE (FEC_ENET_RX_FRPPG * FEC_ENET_RX_PAGES)
97#define TX_RING_SIZE 8
98#define TX_RING_MOD_MASK 7
99#endif
100
101
102
103#define FEC_ENET_HBERR ((uint)0x80000000)
104#define FEC_ENET_BABR ((uint)0x40000000)
105#define FEC_ENET_BABT ((uint)0x20000000)
106#define FEC_ENET_GRA ((uint)0x10000000)
107#define FEC_ENET_TXF ((uint)0x08000000)
108#define FEC_ENET_TXB ((uint)0x04000000)
109#define FEC_ENET_RXF ((uint)0x02000000)
110#define FEC_ENET_RXB ((uint)0x01000000)
111#define FEC_ENET_MII ((uint)0x00800000)
112#define FEC_ENET_EBERR ((uint)0x00400000)
113
114
115
116#define FEC_ECNTRL_PINMUX 0x00000004
117#define FEC_ECNTRL_ETHER_EN 0x00000002
118#define FEC_ECNTRL_RESET 0x00000001
119
120#define FEC_RCNTRL_BC_REJ 0x00000010
121#define FEC_RCNTRL_PROM 0x00000008
122#define FEC_RCNTRL_MII_MODE 0x00000004
123#define FEC_RCNTRL_DRT 0x00000002
124#define FEC_RCNTRL_LOOP 0x00000001
125
126#define FEC_TCNTRL_FDEN 0x00000004
127#define FEC_TCNTRL_HBC 0x00000002
128#define FEC_TCNTRL_GTS 0x00000001
129
130
131
132#define FEC_RESET_DELAY 50
133
134
135
136#define PKT_MAXBUF_SIZE 1518
137#define PKT_MINBUF_SIZE 64
138#define PKT_MAXBLR_SIZE 1520
139
140
141
142
143
144
145
146
147
148struct fec_enet_private {
149
150 struct sk_buff* tx_skbuff[TX_RING_SIZE];
151 ushort skb_cur;
152 ushort skb_dirty;
153
154
155
156 cbd_t *rx_bd_base;
157 cbd_t *tx_bd_base;
158 cbd_t *cur_rx, *cur_tx;
159 cbd_t *dirty_tx;
160
161
162
163
164 unsigned char *rx_vaddr[RX_RING_SIZE];
165
166 struct net_device_stats stats;
167 uint tx_full;
168 spinlock_t lock;
169
170#ifdef CONFIG_USE_MDIO
171 uint phy_id;
172 uint phy_id_done;
173 uint phy_status;
174 uint phy_speed;
175 phy_info_t *phy;
176 struct tq_struct phy_task;
177
178 uint sequence_done;
179
180 uint phy_addr;
181#endif
182
183 int link;
184 int old_link;
185 int full_duplex;
186
187#ifdef CONFIG_FEC_PACKETHOOK
188 unsigned long ph_lock;
189 fec_ph_func *ph_rxhandler;
190 fec_ph_func *ph_txhandler;
191 __u16 ph_proto;
192 volatile __u32 *ph_regaddr;
193 void *ph_priv;
194#endif
195};
196
197static int fec_enet_open(struct net_device *dev);
198static int fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev);
199#ifdef CONFIG_USE_MDIO
200static void fec_enet_mii(struct net_device *dev);
201#endif
202static void fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs);
203#ifdef CONFIG_FEC_PACKETHOOK
204static void fec_enet_tx(struct net_device *dev, __u32 regval);
205static void fec_enet_rx(struct net_device *dev, __u32 regval);
206#else
207static void fec_enet_tx(struct net_device *dev);
208static void fec_enet_rx(struct net_device *dev);
209#endif
210static int fec_enet_close(struct net_device *dev);
211static struct net_device_stats *fec_enet_get_stats(struct net_device *dev);
212static void set_multicast_list(struct net_device *dev);
213static void fec_restart(struct net_device *dev, int duplex);
214static void fec_stop(struct net_device *dev);
215static ushort my_enet_addr[3];
216
217#ifdef CONFIG_USE_MDIO
218
219
220
221
222typedef struct mii_list {
223 uint mii_regval;
224 void (*mii_func)(uint val, struct net_device *dev);
225 struct mii_list *mii_next;
226} mii_list_t;
227
228#define NMII 20
229mii_list_t mii_cmds[NMII];
230mii_list_t *mii_free;
231mii_list_t *mii_head;
232mii_list_t *mii_tail;
233
234static int mii_queue(struct net_device *dev, int request,
235 void (*func)(uint, struct net_device *));
236
237
238
239#define mk_mii_read(REG) (0x60020000 | ((REG & 0x1f) << 18))
240#define mk_mii_write(REG, VAL) (0x50020000 | ((REG & 0x1f) << 18) | \
241 (VAL & 0xffff))
242#define mk_mii_end 0
243#endif
244
245
246
247#define TX_TIMEOUT (2*HZ)
248
249#ifdef CONFIG_USE_MDIO
250
251
252
253#define MII_REG_CR 0
254#define MII_REG_SR 1
255#define MII_REG_PHYIR1 2
256#define MII_REG_PHYIR2 3
257#define MII_REG_ANAR 4
258#define MII_REG_ANLPAR 5
259#define MII_REG_ANER 6
260#define MII_REG_ANNPTR 7
261#define MII_REG_ANLPRNPR 8
262
263
264
265#define PHY_CONF_ANE 0x0001
266#define PHY_CONF_LOOP 0x0002
267#define PHY_CONF_SPMASK 0x00f0
268#define PHY_CONF_10HDX 0x0010
269#define PHY_CONF_10FDX 0x0020
270#define PHY_CONF_100HDX 0x0040
271#define PHY_CONF_100FDX 0x0080
272
273#define PHY_STAT_LINK 0x0100
274#define PHY_STAT_FAULT 0x0200
275#define PHY_STAT_ANC 0x0400
276#define PHY_STAT_SPMASK 0xf000
277#define PHY_STAT_10HDX 0x1000
278#define PHY_STAT_10FDX 0x2000
279#define PHY_STAT_100HDX 0x4000
280#define PHY_STAT_100FDX 0x8000
281#endif
282
283#ifdef CONFIG_FEC_PACKETHOOK
284int
285fec_register_ph(struct net_device *dev, fec_ph_func *rxfun, fec_ph_func *txfun,
286 __u16 proto, volatile __u32 *regaddr, void *priv)
287{
288 struct fec_enet_private *fep;
289 int retval = 0;
290
291 fep = dev->priv;
292
293 if (test_and_set_bit(0, (void*)&fep->ph_lock) != 0) {
294
295 return -EAGAIN;
296 }
297 if (fep->ph_rxhandler != NULL || fep->ph_txhandler != NULL) {
298 retval = -EBUSY;
299 goto out;
300 }
301 fep->ph_rxhandler = rxfun;
302 fep->ph_txhandler = txfun;
303 fep->ph_proto = proto;
304 fep->ph_regaddr = regaddr;
305 fep->ph_priv = priv;
306
307 out:
308 fep->ph_lock = 0;
309
310 return retval;
311}
312
313
314int
315fec_unregister_ph(struct net_device *dev)
316{
317 struct fec_enet_private *fep;
318 int retval = 0;
319
320 fep = dev->priv;
321
322 if (test_and_set_bit(0, (void*)&fep->ph_lock) != 0) {
323
324 return -EAGAIN;
325 }
326
327 fep->ph_rxhandler = fep->ph_txhandler = NULL;
328 fep->ph_proto = 0;
329 fep->ph_regaddr = NULL;
330 fep->ph_priv = NULL;
331
332 fep->ph_lock = 0;
333
334 return retval;
335}
336
337EXPORT_SYMBOL(fec_register_ph);
338EXPORT_SYMBOL(fec_unregister_ph);
339
340#endif
341
342static int
343fec_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
344{
345 struct fec_enet_private *fep;
346 volatile fec_t *fecp;
347 volatile cbd_t *bdp;
348
349 fep = dev->priv;
350 fecp = (volatile fec_t*)dev->base_addr;
351
352 if (!fep->link) {
353
354 return 1;
355 }
356
357
358 bdp = fep->cur_tx;
359
360#ifndef final_version
361 if (bdp->cbd_sc & BD_ENET_TX_READY) {
362
363
364
365 printk("%s: tx queue full!.\n", dev->name);
366 return 1;
367 }
368#endif
369
370
371
372 bdp->cbd_sc &= ~BD_ENET_TX_STATS;
373
374
375
376 bdp->cbd_bufaddr = __pa(skb->data);
377 bdp->cbd_datlen = skb->len;
378
379
380
381 fep->tx_skbuff[fep->skb_cur] = skb;
382
383 fep->stats.tx_bytes += skb->len;
384 fep->skb_cur = (fep->skb_cur+1) & TX_RING_MOD_MASK;
385
386
387
388
389 flush_dcache_range((unsigned long)skb->data,
390 (unsigned long)skb->data + skb->len);
391
392 spin_lock_irq(&fep->lock);
393
394
395
396
397
398 bdp->cbd_sc |= (BD_ENET_TX_READY | BD_ENET_TX_INTR
399 | BD_ENET_TX_LAST | BD_ENET_TX_TC);
400
401 dev->trans_start = jiffies;
402
403
404 fecp->fec_x_des_active = 0x01000000;
405
406
407
408 if (bdp->cbd_sc & BD_ENET_TX_WRAP) {
409 bdp = fep->tx_bd_base;
410 } else {
411 bdp++;
412 }
413
414 if (bdp->cbd_sc & BD_ENET_TX_READY) {
415 netif_stop_queue(dev);
416 fep->tx_full = 1;
417 }
418
419 fep->cur_tx = (cbd_t *)bdp;
420
421 spin_unlock_irq(&fep->lock);
422
423 return 0;
424}
425
426static void
427fec_timeout(struct net_device *dev)
428{
429 struct fec_enet_private *fep = dev->priv;
430
431 printk("%s: transmit timed out.\n", dev->name);
432 fep->stats.tx_errors++;
433#ifndef final_version
434 {
435 int i;
436 cbd_t *bdp;
437
438 printk("Ring data dump: cur_tx %lx%s, dirty_tx %lx cur_rx: %lx\n",
439 (unsigned long)fep->cur_tx, fep->tx_full ? " (full)" : "",
440 (unsigned long)fep->dirty_tx,
441 (unsigned long)fep->cur_rx);
442
443 bdp = fep->tx_bd_base;
444 printk(" tx: %u buffers\n", TX_RING_SIZE);
445 for (i = 0 ; i < TX_RING_SIZE; i++) {
446 printk(" %08x: %04x %04x %08x\n",
447 (uint) bdp,
448 bdp->cbd_sc,
449 bdp->cbd_datlen,
450 bdp->cbd_bufaddr);
451 bdp++;
452 }
453
454 bdp = fep->rx_bd_base;
455 printk(" rx: %lu buffers\n", RX_RING_SIZE);
456 for (i = 0 ; i < RX_RING_SIZE; i++) {
457 printk(" %08x: %04x %04x %08x\n",
458 (uint) bdp,
459 bdp->cbd_sc,
460 bdp->cbd_datlen,
461 bdp->cbd_bufaddr);
462 bdp++;
463 }
464 }
465#endif
466 if (!fep->tx_full)
467 netif_wake_queue(dev);
468}
469
470
471
472
473static void
474fec_enet_interrupt(int irq, void * dev_id, struct pt_regs * regs)
475{
476 struct net_device *dev = dev_id;
477 volatile fec_t *fecp;
478 uint int_events;
479#ifdef CONFIG_FEC_PACKETHOOK
480 struct fec_enet_private *fep = dev->priv;
481 __u32 regval;
482
483 if (fep->ph_regaddr) regval = *fep->ph_regaddr;
484#endif
485 fecp = (volatile fec_t*)dev->base_addr;
486
487
488
489 while ((int_events = fecp->fec_ievent) != 0) {
490 fecp->fec_ievent = int_events;
491 if ((int_events & (FEC_ENET_HBERR | FEC_ENET_BABR |
492 FEC_ENET_BABT | FEC_ENET_EBERR)) != 0) {
493 printk("FEC ERROR %x\n", int_events);
494 }
495
496
497
498 if (int_events & FEC_ENET_RXF) {
499#ifdef CONFIG_FEC_PACKETHOOK
500 fec_enet_rx(dev, regval);
501#else
502 fec_enet_rx(dev);
503#endif
504 }
505
506
507
508
509
510 if (int_events & FEC_ENET_TXF) {
511#ifdef CONFIG_FEC_PACKETHOOK
512 fec_enet_tx(dev, regval);
513#else
514 fec_enet_tx(dev);
515#endif
516 }
517
518 if (int_events & FEC_ENET_MII) {
519#ifdef CONFIG_USE_MDIO
520 fec_enet_mii(dev);
521#else
522printk("%s[%d] %s: unexpected FEC_ENET_MII event\n", __FILE__,__LINE__,__FUNCTION__);
523#endif
524 }
525
526 }
527}
528
529
530static void
531#ifdef CONFIG_FEC_PACKETHOOK
532fec_enet_tx(struct net_device *dev, __u32 regval)
533#else
534fec_enet_tx(struct net_device *dev)
535#endif
536{
537 struct fec_enet_private *fep;
538 volatile cbd_t *bdp;
539 struct sk_buff *skb;
540
541 fep = dev->priv;
542 spin_lock(&fep->lock);
543 bdp = fep->dirty_tx;
544
545 while ((bdp->cbd_sc&BD_ENET_TX_READY) == 0) {
546 if (bdp == fep->cur_tx && fep->tx_full == 0) break;
547
548 skb = fep->tx_skbuff[fep->skb_dirty];
549
550 if (bdp->cbd_sc & (BD_ENET_TX_HB | BD_ENET_TX_LC |
551 BD_ENET_TX_RL | BD_ENET_TX_UN |
552 BD_ENET_TX_CSL)) {
553 fep->stats.tx_errors++;
554 if (bdp->cbd_sc & BD_ENET_TX_HB)
555 fep->stats.tx_heartbeat_errors++;
556 if (bdp->cbd_sc & BD_ENET_TX_LC)
557 fep->stats.tx_window_errors++;
558 if (bdp->cbd_sc & BD_ENET_TX_RL)
559 fep->stats.tx_aborted_errors++;
560 if (bdp->cbd_sc & BD_ENET_TX_UN)
561 fep->stats.tx_fifo_errors++;
562 if (bdp->cbd_sc & BD_ENET_TX_CSL)
563 fep->stats.tx_carrier_errors++;
564 } else {
565#ifdef CONFIG_FEC_PACKETHOOK
566
567 if (fep->ph_txhandler &&
568 ((struct ethhdr *)skb->data)->h_proto
569 == fep->ph_proto) {
570 fep->ph_txhandler((__u8*)skb->data, skb->len,
571 regval, fep->ph_priv);
572 }
573#endif
574 fep->stats.tx_packets++;
575 }
576
577#ifndef final_version
578 if (bdp->cbd_sc & BD_ENET_TX_READY)
579 printk("HEY! Enet xmit interrupt and TX_READY.\n");
580#endif
581
582
583
584 if (bdp->cbd_sc & BD_ENET_TX_DEF)
585 fep->stats.collisions++;
586
587
588
589#if 0
590printk("TXI: %x %x %x\n", bdp, skb, fep->skb_dirty);
591#endif
592 dev_kfree_skb_irq (skb);
593 fep->tx_skbuff[fep->skb_dirty] = NULL;
594 fep->skb_dirty = (fep->skb_dirty + 1) & TX_RING_MOD_MASK;
595
596
597
598 if (bdp->cbd_sc & BD_ENET_TX_WRAP)
599 bdp = fep->tx_bd_base;
600 else
601 bdp++;
602
603
604
605
606 if (fep->tx_full) {
607 fep->tx_full = 0;
608 if (netif_queue_stopped(dev))
609 netif_wake_queue(dev);
610 }
611#ifdef CONFIG_FEC_PACKETHOOK
612
613
614 if (fep->ph_regaddr) regval = *fep->ph_regaddr;
615#endif
616 }
617 fep->dirty_tx = (cbd_t *)bdp;
618 spin_unlock(&fep->lock);
619}
620
621
622
623
624
625
626
627static void
628#ifdef CONFIG_FEC_PACKETHOOK
629fec_enet_rx(struct net_device *dev, __u32 regval)
630#else
631fec_enet_rx(struct net_device *dev)
632#endif
633{
634 struct fec_enet_private *fep;
635 volatile fec_t *fecp;
636 volatile cbd_t *bdp;
637 struct sk_buff *skb;
638 ushort pkt_len;
639 __u8 *data;
640
641 fep = dev->priv;
642 fecp = (volatile fec_t*)dev->base_addr;
643
644
645
646
647 bdp = fep->cur_rx;
648
649while (!(bdp->cbd_sc & BD_ENET_RX_EMPTY)) {
650
651#ifndef final_version
652
653
654
655 if ((bdp->cbd_sc & BD_ENET_RX_LAST) == 0)
656 printk("FEC ENET: rcv is not +last\n");
657#endif
658
659
660 if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH | BD_ENET_RX_NO |
661 BD_ENET_RX_CR | BD_ENET_RX_OV)) {
662 fep->stats.rx_errors++;
663 if (bdp->cbd_sc & (BD_ENET_RX_LG | BD_ENET_RX_SH)) {
664
665 fep->stats.rx_length_errors++;
666 }
667 if (bdp->cbd_sc & BD_ENET_RX_NO)
668 fep->stats.rx_frame_errors++;
669 if (bdp->cbd_sc & BD_ENET_RX_CR)
670 fep->stats.rx_crc_errors++;
671 if (bdp->cbd_sc & BD_ENET_RX_OV)
672 fep->stats.rx_crc_errors++;
673 }
674
675
676
677
678
679 if (bdp->cbd_sc & BD_ENET_RX_CL) {
680 fep->stats.rx_errors++;
681 fep->stats.rx_frame_errors++;
682 goto rx_processing_done;
683 }
684
685
686
687 fep->stats.rx_packets++;
688 pkt_len = bdp->cbd_datlen;
689 fep->stats.rx_bytes += pkt_len;
690 data = fep->rx_vaddr[bdp - fep->rx_bd_base];
691
692#ifdef CONFIG_FEC_PACKETHOOK
693
694 if (fep->ph_rxhandler) {
695 if (((struct ethhdr *)data)->h_proto == fep->ph_proto) {
696 switch (fep->ph_rxhandler(data, pkt_len, regval,
697 fep->ph_priv)) {
698 case 1:
699 goto rx_processing_done;
700 break;
701 case 0:
702 break;
703 default:
704 fep->stats.rx_errors++;
705 goto rx_processing_done;
706 }
707 }
708 }
709
710
711#endif
712
713
714
715
716
717
718 skb = dev_alloc_skb(pkt_len-4);
719
720 if (skb == NULL) {
721 printk("%s: Memory squeeze, dropping packet.\n", dev->name);
722 fep->stats.rx_dropped++;
723 } else {
724 skb->dev = dev;
725 skb_put(skb,pkt_len-4);
726 eth_copy_and_sum(skb, data, pkt_len-4, 0);
727 skb->protocol=eth_type_trans(skb,dev);
728 netif_rx(skb);
729 }
730 rx_processing_done:
731
732
733
734 bdp->cbd_sc &= ~BD_ENET_RX_STATS;
735
736
737
738 bdp->cbd_sc |= BD_ENET_RX_EMPTY;
739
740
741
742 if (bdp->cbd_sc & BD_ENET_RX_WRAP)
743 bdp = fep->rx_bd_base;
744 else
745 bdp++;
746
747#if 1
748
749
750
751
752 fecp->fec_r_des_active = 0x01000000;
753#endif
754#ifdef CONFIG_FEC_PACKETHOOK
755
756
757 if (fep->ph_regaddr) regval = *fep->ph_regaddr;
758#endif
759 }
760 fep->cur_rx = (cbd_t *)bdp;
761
762#if 0
763
764
765
766
767
768
769
770 fecp->fec_r_des_active = 0x01000000;
771#endif
772}
773
774
775#ifdef CONFIG_USE_MDIO
776static void
777fec_enet_mii(struct net_device *dev)
778{
779 struct fec_enet_private *fep;
780 volatile fec_t *ep;
781 mii_list_t *mip;
782 uint mii_reg;
783
784 fep = (struct fec_enet_private *)dev->priv;
785 ep = &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec);
786 mii_reg = ep->fec_mii_data;
787
788 if ((mip = mii_head) == NULL) {
789 printk("MII and no head!\n");
790 return;
791 }
792
793 if (mip->mii_func != NULL)
794 (*(mip->mii_func))(mii_reg, dev);
795
796 mii_head = mip->mii_next;
797 mip->mii_next = mii_free;
798 mii_free = mip;
799
800 if ((mip = mii_head) != NULL) {
801 ep->fec_mii_data = mip->mii_regval;
802 }
803}
804
805static int
806mii_queue(struct net_device *dev, int regval, void (*func)(uint, struct net_device *))
807{
808 struct fec_enet_private *fep;
809 unsigned long flags;
810 mii_list_t *mip;
811 int retval;
812
813
814
815 fep = dev->priv;
816 regval |= fep->phy_addr << 23;
817
818 retval = 0;
819
820 save_flags(flags);
821 cli();
822
823 if ((mip = mii_free) != NULL) {
824 mii_free = mip->mii_next;
825 mip->mii_regval = regval;
826 mip->mii_func = func;
827 mip->mii_next = NULL;
828 if (mii_head) {
829 mii_tail->mii_next = mip;
830 mii_tail = mip;
831 } else {
832 mii_head = mii_tail = mip;
833 (&(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec))->fec_mii_data = regval;
834 }
835 } else {
836 retval = 1;
837 }
838
839 restore_flags(flags);
840
841 return(retval);
842}
843
844static void mii_do_cmd(struct net_device *dev, const phy_cmd_t *c)
845{
846 int k;
847
848 if(!c)
849 return;
850
851 for(k = 0; (c+k)->mii_data != mk_mii_end; k++)
852 mii_queue(dev, (c+k)->mii_data, (c+k)->funct);
853}
854
855static void mii_parse_sr(uint mii_reg, struct net_device *dev)
856{
857 struct fec_enet_private *fep = dev->priv;
858 volatile uint *s = &(fep->phy_status);
859
860 *s &= ~(PHY_STAT_LINK | PHY_STAT_FAULT | PHY_STAT_ANC);
861
862 if (mii_reg & 0x0004)
863 *s |= PHY_STAT_LINK;
864 if (mii_reg & 0x0010)
865 *s |= PHY_STAT_FAULT;
866 if (mii_reg & 0x0020)
867 *s |= PHY_STAT_ANC;
868
869 fep->link = (*s & PHY_STAT_LINK) ? 1 : 0;
870}
871
872static void mii_parse_cr(uint mii_reg, struct net_device *dev)
873{
874 struct fec_enet_private *fep = dev->priv;
875 volatile uint *s = &(fep->phy_status);
876
877 *s &= ~(PHY_CONF_ANE | PHY_CONF_LOOP);
878
879 if (mii_reg & 0x1000)
880 *s |= PHY_CONF_ANE;
881 if (mii_reg & 0x4000)
882 *s |= PHY_CONF_LOOP;
883}
884
885static void mii_parse_anar(uint mii_reg, struct net_device *dev)
886{
887 struct fec_enet_private *fep = dev->priv;
888 volatile uint *s = &(fep->phy_status);
889
890 *s &= ~(PHY_CONF_SPMASK);
891
892 if (mii_reg & 0x0020)
893 *s |= PHY_CONF_10HDX;
894 if (mii_reg & 0x0040)
895 *s |= PHY_CONF_10FDX;
896 if (mii_reg & 0x0080)
897 *s |= PHY_CONF_100HDX;
898 if (mii_reg & 0x00100)
899 *s |= PHY_CONF_100FDX;
900}
901#if 0
902static void mii_disp_reg(uint mii_reg, struct net_device *dev)
903{
904 printk("reg %u = 0x%04x\n", (mii_reg >> 18) & 0x1f, mii_reg & 0xffff);
905}
906#endif
907
908
909
910
911#ifdef CONFIG_FEC_LXT970
912
913#define MII_LXT970_MIRROR 16
914#define MII_LXT970_IER 17
915#define MII_LXT970_ISR 18
916#define MII_LXT970_CONFIG 19
917#define MII_LXT970_CSR 20
918
919static void mii_parse_lxt970_csr(uint mii_reg, struct net_device *dev)
920{
921 struct fec_enet_private *fep = dev->priv;
922 volatile uint *s = &(fep->phy_status);
923
924 *s &= ~(PHY_STAT_SPMASK);
925
926 if (mii_reg & 0x0800) {
927 if (mii_reg & 0x1000)
928 *s |= PHY_STAT_100FDX;
929 else
930 *s |= PHY_STAT_100HDX;
931 }
932 else {
933 if (mii_reg & 0x1000)
934 *s |= PHY_STAT_10FDX;
935 else
936 *s |= PHY_STAT_10HDX;
937 }
938}
939
940static phy_info_t phy_info_lxt970 = {
941 0x07810000,
942 "LXT970",
943
944 (const phy_cmd_t []) {
945#if 0
946
947
948
949
950
951 { mk_mii_write(MII_LXT970_CONFIG, 0), NULL },
952#endif
953 { mk_mii_read(MII_REG_CR), mii_parse_cr },
954 { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
955 { mk_mii_end, }
956 },
957 (const phy_cmd_t []) {
958 { mk_mii_write(MII_LXT970_IER, 0x0002), NULL },
959 { mk_mii_write(MII_REG_CR, 0x1200), NULL },
960 { mk_mii_end, }
961 },
962 (const phy_cmd_t []) {
963
964
965 { mk_mii_read(MII_REG_SR), mii_parse_sr },
966 { mk_mii_read(MII_LXT970_ISR), NULL },
967
968
969
970 { mk_mii_read(MII_LXT970_CSR), mii_parse_lxt970_csr },
971 { mk_mii_end, }
972 },
973 (const phy_cmd_t []) {
974 { mk_mii_write(MII_LXT970_IER, 0x0000), NULL },
975 { mk_mii_end, }
976 },
977};
978
979#endif
980
981
982
983
984#ifdef CONFIG_FEC_LXT971
985
986
987
988#define MII_LXT971_PCR 16
989#define MII_LXT971_SR2 17
990#define MII_LXT971_IER 18
991#define MII_LXT971_ISR 19
992#define MII_LXT971_LCR 20
993#define MII_LXT971_TCR 30
994
995
996
997
998
999
1000
1001static void mii_parse_lxt971_sr2(uint mii_reg, struct net_device *dev)
1002{
1003 struct fec_enet_private *fep = dev->priv;
1004 volatile uint *s = &(fep->phy_status);
1005
1006 *s &= ~(PHY_STAT_SPMASK);
1007
1008 if (mii_reg & 0x4000) {
1009 if (mii_reg & 0x0200)
1010 *s |= PHY_STAT_100FDX;
1011 else
1012 *s |= PHY_STAT_100HDX;
1013 }
1014 else {
1015 if (mii_reg & 0x0200)
1016 *s |= PHY_STAT_10FDX;
1017 else
1018 *s |= PHY_STAT_10HDX;
1019 }
1020 if (mii_reg & 0x0008)
1021 *s |= PHY_STAT_FAULT;
1022}
1023
1024static phy_info_t phy_info_lxt971 = {
1025 0x0001378e,
1026 "LXT971",
1027
1028 (const phy_cmd_t []) {
1029
1030 { mk_mii_read(MII_REG_CR), mii_parse_cr },
1031 { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
1032 { mk_mii_end, }
1033 },
1034 (const phy_cmd_t []) {
1035 { mk_mii_write(MII_LXT971_IER, 0x00f2), NULL },
1036 { mk_mii_write(MII_REG_CR, 0x1200), NULL },
1037
1038
1039
1040
1041
1042 { mk_mii_read(MII_REG_SR), mii_parse_sr },
1043 { mk_mii_end, }
1044 },
1045 (const phy_cmd_t []) {
1046
1047
1048 { mk_mii_read(MII_REG_SR), mii_parse_sr },
1049 { mk_mii_read(MII_LXT971_SR2), mii_parse_lxt971_sr2 },
1050
1051
1052
1053 { mk_mii_read(MII_LXT971_ISR), NULL },
1054 { mk_mii_end, }
1055 },
1056 (const phy_cmd_t []) {
1057 { mk_mii_write(MII_LXT971_IER, 0x0000), NULL },
1058 { mk_mii_end, }
1059 },
1060};
1061
1062#endif
1063
1064
1065
1066
1067
1068#ifdef CONFIG_FEC_QS6612
1069
1070
1071
1072#define MII_QS6612_MCR 17
1073#define MII_QS6612_FTR 27
1074#define MII_QS6612_MCO 28
1075#define MII_QS6612_ISR 29
1076#define MII_QS6612_IMR 30
1077#define MII_QS6612_PCR 31
1078
1079static void mii_parse_qs6612_pcr(uint mii_reg, struct net_device *dev)
1080{
1081 struct fec_enet_private *fep = dev->priv;
1082 volatile uint *s = &(fep->phy_status);
1083
1084 *s &= ~(PHY_STAT_SPMASK);
1085
1086 switch((mii_reg >> 2) & 7) {
1087 case 1: *s |= PHY_STAT_10HDX; break;
1088 case 2: *s |= PHY_STAT_100HDX; break;
1089 case 5: *s |= PHY_STAT_10FDX; break;
1090 case 6: *s |= PHY_STAT_100FDX; break;
1091 }
1092}
1093
1094static phy_info_t phy_info_qs6612 = {
1095 0x00181440,
1096 "QS6612",
1097
1098 (const phy_cmd_t []) {
1099
1100
1101
1102
1103
1104
1105 { mk_mii_write(MII_QS6612_PCR, 0x0dc0), NULL },
1106
1107
1108
1109 { mk_mii_read(MII_REG_CR), mii_parse_cr },
1110 { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
1111 { mk_mii_end, }
1112 },
1113 (const phy_cmd_t []) {
1114 { mk_mii_write(MII_QS6612_IMR, 0x003a), NULL },
1115 { mk_mii_write(MII_REG_CR, 0x1200), NULL },
1116 { mk_mii_end, }
1117 },
1118 (const phy_cmd_t []) {
1119
1120
1121
1122 { mk_mii_read(MII_QS6612_ISR), NULL },
1123 { mk_mii_read(MII_REG_SR), mii_parse_sr },
1124 { mk_mii_read(MII_REG_ANER), NULL },
1125
1126
1127
1128 { mk_mii_read(MII_QS6612_PCR), mii_parse_qs6612_pcr },
1129 { mk_mii_end, }
1130 },
1131 (const phy_cmd_t []) {
1132 { mk_mii_write(MII_QS6612_IMR, 0x0000), NULL },
1133 { mk_mii_end, }
1134 },
1135};
1136
1137#endif
1138
1139
1140
1141
1142#ifdef CONFIG_FEC_AM79C874
1143
1144
1145
1146#define MII_AM79C874_MFR 16
1147#define MII_AM79C874_ICSR 17
1148#define MII_AM79C874_DR 18
1149#define MII_AM79C874_PMLR 19
1150#define MII_AM79C874_MCR 21
1151#define MII_AM79C874_DC 23
1152#define MII_AM79C874_REC 24
1153
1154static void mii_parse_amd79c874_dr(uint mii_reg, struct net_device *dev, uint data)
1155{
1156 volatile struct fec_enet_private *fep = dev->priv;
1157 uint s = fep->phy_status;
1158
1159 s &= ~(PHY_STAT_SPMASK);
1160
1161
1162 switch ((mii_reg >> 10) & 3) {
1163 case 0: s |= PHY_STAT_10HDX; break;
1164 case 1: s |= PHY_STAT_100HDX; break;
1165 case 2: s |= PHY_STAT_10FDX; break;
1166 case 3: s |= PHY_STAT_100FDX; break;
1167 }
1168
1169 fep->phy_status = s;
1170}
1171
1172static phy_info_t phy_info_amd79c874 = {
1173 0x00022561,
1174 "AM79C874",
1175
1176 (const phy_cmd_t []) {
1177
1178 { mk_mii_read(MII_REG_CR), mii_parse_cr },
1179 { mk_mii_read(MII_REG_ANAR), mii_parse_anar },
1180 { mk_mii_end, }
1181 },
1182 (const phy_cmd_t []) {
1183 { mk_mii_write(MII_AM79C874_ICSR, 0xff00), NULL },
1184 { mk_mii_write(MII_REG_CR, 0x1200), NULL },
1185 { mk_mii_end, }
1186 },
1187 (const phy_cmd_t []) {
1188
1189
1190 { mk_mii_read(MII_REG_SR), mii_parse_sr },
1191 { mk_mii_read(MII_AM79C874_DR), mii_parse_amd79c874_dr },
1192
1193
1194
1195 { mk_mii_read(MII_AM79C874_ICSR), NULL },
1196 { mk_mii_end, }
1197 },
1198 (const phy_cmd_t []) {
1199 { mk_mii_write(MII_AM79C874_ICSR, 0x0000), NULL },
1200 { mk_mii_end, }
1201 },
1202};
1203
1204#endif
1205
1206static phy_info_t *phy_info[] = {
1207
1208#ifdef CONFIG_FEC_LXT970
1209 &phy_info_lxt970,
1210#endif
1211
1212#ifdef CONFIG_FEC_LXT971
1213 &phy_info_lxt971,
1214#endif
1215
1216#ifdef CONFIG_FEC_QS6612
1217 &phy_info_qs6612,
1218#endif
1219
1220#ifdef CONFIG_FEC_AM79C874
1221 &phy_info_amd79c874,
1222#endif
1223
1224 NULL
1225};
1226
1227static void mii_display_status(struct net_device *dev)
1228{
1229 struct fec_enet_private *fep = dev->priv;
1230 volatile uint *s = &(fep->phy_status);
1231
1232 if (!fep->link && !fep->old_link) {
1233
1234 return;
1235 }
1236
1237 printk("%s: status: ", dev->name);
1238
1239 if (!fep->link) {
1240 printk("link down");
1241 } else {
1242 printk("link up");
1243
1244 switch(*s & PHY_STAT_SPMASK) {
1245 case PHY_STAT_100FDX: printk(", 100 Mbps Full Duplex"); break;
1246 case PHY_STAT_100HDX: printk(", 100 Mbps Half Duplex"); break;
1247 case PHY_STAT_10FDX: printk(", 10 Mbps Full Duplex"); break;
1248 case PHY_STAT_10HDX: printk(", 10 Mbps Half Duplex"); break;
1249 default:
1250 printk(", Unknown speed/duplex");
1251 }
1252
1253 if (*s & PHY_STAT_ANC)
1254 printk(", auto-negotiation complete");
1255 }
1256
1257 if (*s & PHY_STAT_FAULT)
1258 printk(", remote fault");
1259
1260 printk(".\n");
1261}
1262
1263static void mii_display_config(struct net_device *dev)
1264{
1265 struct fec_enet_private *fep = dev->priv;
1266 volatile uint *s = &(fep->phy_status);
1267
1268 printk("%s: config: auto-negotiation ", dev->name);
1269
1270 if (*s & PHY_CONF_ANE)
1271 printk("on");
1272 else
1273 printk("off");
1274
1275 if (*s & PHY_CONF_100FDX)
1276 printk(", 100FDX");
1277 if (*s & PHY_CONF_100HDX)
1278 printk(", 100HDX");
1279 if (*s & PHY_CONF_10FDX)
1280 printk(", 10FDX");
1281 if (*s & PHY_CONF_10HDX)
1282 printk(", 10HDX");
1283 if (!(*s & PHY_CONF_SPMASK))
1284 printk(", No speed/duplex selected?");
1285
1286 if (*s & PHY_CONF_LOOP)
1287 printk(", loopback enabled");
1288
1289 printk(".\n");
1290
1291 fep->sequence_done = 1;
1292}
1293
1294static void mii_relink(struct net_device *dev)
1295{
1296 struct fec_enet_private *fep = dev->priv;
1297 int duplex;
1298
1299 fep->link = (fep->phy_status & PHY_STAT_LINK) ? 1 : 0;
1300 mii_display_status(dev);
1301 fep->old_link = fep->link;
1302
1303 if (fep->link) {
1304 duplex = 0;
1305 if (fep->phy_status
1306 & (PHY_STAT_100FDX | PHY_STAT_10FDX))
1307 duplex = 1;
1308 fec_restart(dev, duplex);
1309 }
1310 else
1311 fec_stop(dev);
1312
1313#if 0
1314 enable_irq(fep->mii_irq);
1315#endif
1316
1317}
1318
1319static void mii_queue_relink(uint mii_reg, struct net_device *dev)
1320{
1321 struct fec_enet_private *fep = dev->priv;
1322
1323 fep->phy_task.routine = (void *)mii_relink;
1324 fep->phy_task.data = dev;
1325 schedule_task(&fep->phy_task);
1326}
1327
1328static void mii_queue_config(uint mii_reg, struct net_device *dev)
1329{
1330 struct fec_enet_private *fep = dev->priv;
1331
1332 fep->phy_task.routine = (void *)mii_display_config;
1333 fep->phy_task.data = dev;
1334 schedule_task(&fep->phy_task);
1335}
1336
1337
1338
1339phy_cmd_t phy_cmd_relink[] = { { mk_mii_read(MII_REG_CR), mii_queue_relink },
1340 { mk_mii_end, } };
1341phy_cmd_t phy_cmd_config[] = { { mk_mii_read(MII_REG_CR), mii_queue_config },
1342 { mk_mii_end, } };
1343
1344
1345
1346
1347
1348static void
1349mii_discover_phy3(uint mii_reg, struct net_device *dev)
1350{
1351 struct fec_enet_private *fep;
1352 int i;
1353
1354 fep = dev->priv;
1355 fep->phy_id |= (mii_reg & 0xffff);
1356
1357 for(i = 0; phy_info[i]; i++)
1358 if(phy_info[i]->id == (fep->phy_id >> 4))
1359 break;
1360
1361 if(!phy_info[i])
1362 panic("%s: PHY id 0x%08x is not supported!\n",
1363 dev->name, fep->phy_id);
1364
1365 fep->phy = phy_info[i];
1366 fep->phy_id_done = 1;
1367
1368 printk("%s: Phy @ 0x%x, type %s (0x%08x)\n",
1369 dev->name, fep->phy_addr, fep->phy->name, fep->phy_id);
1370}
1371
1372
1373
1374
1375static void
1376mii_discover_phy(uint mii_reg, struct net_device *dev)
1377{
1378 struct fec_enet_private *fep;
1379 uint phytype;
1380
1381 fep = dev->priv;
1382
1383 if ((phytype = (mii_reg & 0xffff)) != 0xffff) {
1384
1385
1386
1387 fep->phy_id = phytype << 16;
1388 mii_queue(dev, mk_mii_read(MII_REG_PHYIR2), mii_discover_phy3);
1389 } else {
1390 fep->phy_addr++;
1391 if (fep->phy_addr < 32) {
1392 mii_queue(dev, mk_mii_read(MII_REG_PHYIR1),
1393 mii_discover_phy);
1394 } else {
1395 printk("fec: No PHY device found.\n");
1396 }
1397 }
1398}
1399#endif
1400
1401
1402
1403static void
1404#ifdef CONFIG_RPXCLASSIC
1405mii_link_interrupt(void *dev_id)
1406#else
1407mii_link_interrupt(int irq, void * dev_id, struct pt_regs * regs)
1408#endif
1409{
1410#ifdef CONFIG_USE_MDIO
1411 struct net_device *dev = dev_id;
1412 struct fec_enet_private *fep = dev->priv;
1413 volatile immap_t *immap = (immap_t *)IMAP_ADDR;
1414 volatile fec_t *fecp = &(immap->im_cpm.cp_fec);
1415 unsigned int ecntrl = fecp->fec_ecntrl;
1416
1417
1418
1419 if ((ecntrl & FEC_ECNTRL_ETHER_EN) == 0) {
1420 fecp->fec_ecntrl |= FEC_ECNTRL_ETHER_EN;
1421 }
1422#endif
1423
1424#if 0
1425 disable_irq(fep->mii_irq);
1426#endif
1427
1428
1429#ifdef CONFIG_USE_MDIO
1430 mii_do_cmd(dev, fep->phy->ack_int);
1431 mii_do_cmd(dev, phy_cmd_relink);
1432
1433 if ((ecntrl & FEC_ECNTRL_ETHER_EN) == 0) {
1434 fecp->fec_ecntrl = ecntrl;
1435 }
1436#else
1437printk("%s[%d] %s: unexpected Link interrupt\n", __FILE__,__LINE__,__FUNCTION__);
1438#endif
1439
1440}
1441
1442static int
1443fec_enet_open(struct net_device *dev)
1444{
1445 struct fec_enet_private *fep = dev->priv;
1446
1447
1448
1449
1450
1451#ifdef CONFIG_USE_MDIO
1452 fep->sequence_done = 0;
1453 fep->link = 0;
1454
1455 if (fep->phy) {
1456 mii_do_cmd(dev, fep->phy->ack_int);
1457 mii_do_cmd(dev, fep->phy->config);
1458 mii_do_cmd(dev, phy_cmd_config);
1459 while(!fep->sequence_done)
1460 schedule();
1461
1462 mii_do_cmd(dev, fep->phy->startup);
1463 netif_start_queue(dev);
1464 return 0;
1465 }
1466 return -ENODEV;
1467#else
1468 fep->link = 1;
1469 netif_start_queue(dev);
1470 return 0;
1471#endif
1472
1473}
1474
1475static int
1476fec_enet_close(struct net_device *dev)
1477{
1478
1479
1480 netif_stop_queue(dev);
1481 fec_stop(dev);
1482
1483 return 0;
1484}
1485
1486static struct net_device_stats *fec_enet_get_stats(struct net_device *dev)
1487{
1488 struct fec_enet_private *fep = (struct fec_enet_private *)dev->priv;
1489
1490 return &fep->stats;
1491}
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503static void set_multicast_list(struct net_device *dev)
1504{
1505 struct fec_enet_private *fep;
1506 volatile fec_t *ep;
1507
1508 fep = (struct fec_enet_private *)dev->priv;
1509 ep = &(((immap_t *)IMAP_ADDR)->im_cpm.cp_fec);
1510
1511 if (dev->flags&IFF_PROMISC) {
1512
1513
1514 printk("%s: Promiscuous mode enabled.\n", dev->name);
1515 ep->fec_r_cntrl |= FEC_RCNTRL_PROM;
1516 } else {
1517
1518 ep->fec_r_cntrl &= ~FEC_RCNTRL_PROM;
1519
1520 if (dev->flags & IFF_ALLMULTI) {
1521
1522
1523
1524 ep->fec_hash_table_high = 0xffffffff;
1525 ep->fec_hash_table_low = 0xffffffff;
1526 }
1527#if 0
1528 else {
1529
1530
1531 ep->sen_gaddr1 = 0;
1532 ep->sen_gaddr2 = 0;
1533 ep->sen_gaddr3 = 0;
1534 ep->sen_gaddr4 = 0;
1535
1536 dmi = dev->mc_list;
1537
1538 for (i=0; i<dev->mc_count; i++) {
1539
1540
1541
1542 if (!(dmi->dmi_addr[0] & 1))
1543 continue;
1544
1545
1546
1547
1548
1549 mcptr = (u_char *)dmi->dmi_addr + 5;
1550 tdptr = (u_char *)&ep->sen_taddrh;
1551 for (j=0; j<6; j++)
1552 *tdptr++ = *mcptr--;
1553
1554
1555
1556
1557 cpmp->cp_cpcr = mk_cr_cmd(CPM_CR_CH_SCC1, CPM_CR_SET_GADDR) | CPM_CR_FLG;
1558
1559 udelay(10);
1560 while (cpmp->cp_cpcr & CPM_CR_FLG);
1561 }
1562 }
1563#endif
1564 }
1565}
1566
1567
1568
1569static int __init fec_enet_init(void)
1570{
1571 struct net_device *dev;
1572 struct fec_enet_private *fep;
1573 int i, j, k, err;
1574 unsigned char *eap, *iap, *ba;
1575 unsigned long mem_addr;
1576 volatile cbd_t *bdp;
1577 cbd_t *cbd_base;
1578 volatile immap_t *immap;
1579 volatile fec_t *fecp;
1580 bd_t *bd;
1581#ifdef CONFIG_SCC_ENET
1582 unsigned char tmpaddr[6];
1583#endif
1584
1585 immap = (immap_t *)IMAP_ADDR;
1586
1587 bd = (bd_t *)__res;
1588
1589 dev = alloc_etherdev(sizeof(*fep));
1590 if (!dev)
1591 return -ENOMEM;
1592
1593 fep = dev->priv;
1594
1595 fecp = &(immap->im_cpm.cp_fec);
1596
1597
1598
1599 fecp->fec_ecntrl = FEC_ECNTRL_PINMUX | FEC_ECNTRL_RESET;
1600 for (i = 0;
1601 (fecp->fec_ecntrl & FEC_ECNTRL_RESET) && (i < FEC_RESET_DELAY);
1602 ++i) {
1603 udelay(1);
1604 }
1605 if (i == FEC_RESET_DELAY) {
1606 printk ("FEC Reset timeout!\n");
1607 }
1608
1609
1610
1611
1612 eap = (unsigned char *)my_enet_addr;
1613 iap = bd->bi_enetaddr;
1614
1615#ifdef CONFIG_SCC_ENET
1616
1617
1618
1619
1620
1621
1622
1623 for (i=0; i<6; i++)
1624 tmpaddr[i] = *iap++;
1625 tmpaddr[3] |= 0x80;
1626 iap = tmpaddr;
1627#endif
1628
1629 for (i=0; i<6; i++) {
1630 dev->dev_addr[i] = *eap++ = *iap++;
1631 }
1632
1633
1634
1635 if (((RX_RING_SIZE + TX_RING_SIZE) * sizeof(cbd_t)) > PAGE_SIZE) {
1636 printk("FEC init error. Need more space.\n");
1637 printk("FEC initialization failed.\n");
1638 return 1;
1639 }
1640 cbd_base = (cbd_t *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
1641
1642
1643
1644 fep->rx_bd_base = cbd_base;
1645 fep->tx_bd_base = cbd_base + RX_RING_SIZE;
1646
1647 fep->skb_cur = fep->skb_dirty = 0;
1648
1649
1650
1651 bdp = fep->rx_bd_base;
1652 k = 0;
1653 for (i=0; i<FEC_ENET_RX_PAGES; i++) {
1654
1655
1656
1657 ba = (unsigned char *)consistent_alloc(GFP_KERNEL, PAGE_SIZE, &mem_addr);
1658
1659
1660
1661
1662 for (j=0; j<FEC_ENET_RX_FRPPG; j++) {
1663 bdp->cbd_sc = BD_ENET_RX_EMPTY;
1664 bdp->cbd_bufaddr = mem_addr;
1665 fep->rx_vaddr[k++] = ba;
1666 mem_addr += FEC_ENET_RX_FRSIZE;
1667 ba += FEC_ENET_RX_FRSIZE;
1668 bdp++;
1669 }
1670 }
1671
1672
1673
1674 bdp--;
1675 bdp->cbd_sc |= BD_SC_WRAP;
1676
1677#ifdef CONFIG_FEC_PACKETHOOK
1678 fep->ph_lock = 0;
1679 fep->ph_rxhandler = fep->ph_txhandler = NULL;
1680 fep->ph_proto = 0;
1681 fep->ph_regaddr = NULL;
1682 fep->ph_priv = NULL;
1683#endif
1684
1685
1686
1687 if (request_8xxirq(FEC_INTERRUPT, fec_enet_interrupt, 0, "fec", dev) != 0)
1688 panic("Could not allocate FEC IRQ!");
1689
1690#ifdef CONFIG_RPXCLASSIC
1691
1692
1693 immap->im_ioport.iop_pcpar &= ~0x0001;
1694 immap->im_ioport.iop_pcdir &= ~0x0001;
1695 immap->im_ioport.iop_pcso &= ~0x0001;
1696 immap->im_ioport.iop_pcint |= 0x0001;
1697 cpm_install_handler(CPMVEC_PIO_PC15, mii_link_interrupt, dev);
1698
1699
1700
1701 *((uint *) RPX_CSR_ADDR) &= ~BCSR2_FETHLEDMODE;
1702#endif
1703
1704#ifdef PHY_INTERRUPT
1705 ((immap_t *)IMAP_ADDR)->im_siu_conf.sc_siel |=
1706 (0x80000000 >> PHY_INTERRUPT);
1707
1708 if (request_8xxirq(PHY_INTERRUPT, mii_link_interrupt, 0, "mii", dev) != 0)
1709 panic("Could not allocate MII IRQ!");
1710#endif
1711
1712 dev->base_addr = (unsigned long)fecp;
1713
1714
1715 dev->open = fec_enet_open;
1716 dev->hard_start_xmit = fec_enet_start_xmit;
1717 dev->tx_timeout = fec_timeout;
1718 dev->watchdog_timeo = TX_TIMEOUT;
1719 dev->stop = fec_enet_close;
1720 dev->get_stats = fec_enet_get_stats;
1721 dev->set_multicast_list = set_multicast_list;
1722
1723#ifdef CONFIG_USE_MDIO
1724 for (i=0; i<NMII-1; i++)
1725 mii_cmds[i].mii_next = &mii_cmds[i+1];
1726 mii_free = mii_cmds;
1727#endif
1728
1729
1730
1731 immap->im_ioport.iop_pdpar = 0x1fff;
1732
1733
1734
1735 if ((mfspr(IMMR) & 0xffff) < 0x0501)
1736 immap->im_ioport.iop_pddir = 0x1c58;
1737 else
1738 immap->im_ioport.iop_pddir = 0x1fff;
1739
1740#ifdef CONFIG_USE_MDIO
1741
1742
1743 fecp->fec_mii_speed = fep->phy_speed =
1744 (( (bd->bi_intfreq + 500000) / 2500000 / 2 ) & 0x3F ) << 1;
1745#else
1746 fecp->fec_mii_speed = 0;
1747#endif
1748
1749 err = register_netdev(dev);
1750 if (err) {
1751 kfree(dev);
1752 return err;
1753 }
1754
1755 printk ("%s: FEC ENET Version 0.2, FEC irq %d"
1756#ifdef PHY_INTERRUPT
1757 ", MII irq %d"
1758#endif
1759 ", addr ",
1760 dev->name, FEC_INTERRUPT
1761#ifdef PHY_INTERRUPT
1762 , PHY_INTERRUPT
1763#endif
1764 );
1765 for (i=0; i<6; i++)
1766 printk("%02x%c", dev->dev_addr[i], (i==5) ? '\n' : ':');
1767
1768#ifdef CONFIG_USE_MDIO
1769 fec_restart (dev, 1);
1770#else
1771 fec_restart (dev, 0);
1772#endif
1773
1774#ifdef CONFIG_USE_MDIO
1775
1776
1777
1778 fep->phy_id_done = 0;
1779 fep->phy_addr = 0;
1780 mii_queue(dev, mk_mii_read(MII_REG_PHYIR1), mii_discover_phy);
1781#endif
1782
1783 return 0;
1784}
1785module_init(fec_enet_init);
1786
1787
1788
1789
1790
1791static void
1792fec_restart(struct net_device *dev, int duplex)
1793{
1794 struct fec_enet_private *fep;
1795 int i;
1796 volatile cbd_t *bdp;
1797 volatile immap_t *immap;
1798 volatile fec_t *fecp;
1799
1800 immap = (immap_t *)IMAP_ADDR;
1801
1802 fecp = &(immap->im_cpm.cp_fec);
1803
1804 fep = dev->priv;
1805
1806
1807
1808 fecp->fec_ecntrl = FEC_ECNTRL_PINMUX | FEC_ECNTRL_RESET;
1809 for (i = 0;
1810 (fecp->fec_ecntrl & FEC_ECNTRL_RESET) && (i < FEC_RESET_DELAY);
1811 ++i) {
1812 udelay(1);
1813 }
1814 if (i == FEC_RESET_DELAY) {
1815 printk ("FEC Reset timeout!\n");
1816 }
1817
1818
1819
1820 fecp->fec_addr_low = (my_enet_addr[0] << 16) | my_enet_addr[1];
1821 fecp->fec_addr_high = my_enet_addr[2];
1822
1823
1824
1825 fecp->fec_hash_table_high = 0;
1826 fecp->fec_hash_table_low = 0;
1827
1828
1829
1830 fecp->fec_r_buff_size = PKT_MAXBLR_SIZE;
1831 fecp->fec_r_hash = PKT_MAXBUF_SIZE;
1832
1833
1834
1835 fecp->fec_r_des_start = iopa((uint)(fep->rx_bd_base));
1836 fecp->fec_x_des_start = iopa((uint)(fep->tx_bd_base));
1837
1838 fep->dirty_tx = fep->cur_tx = fep->tx_bd_base;
1839 fep->cur_rx = fep->rx_bd_base;
1840
1841
1842
1843 fep->skb_cur = fep->skb_dirty = 0;
1844 for (i=0; i<=TX_RING_MOD_MASK; i++) {
1845 if (fep->tx_skbuff[i] != NULL) {
1846 dev_kfree_skb(fep->tx_skbuff[i]);
1847 fep->tx_skbuff[i] = NULL;
1848 }
1849 }
1850
1851
1852
1853 bdp = fep->rx_bd_base;
1854 for (i=0; i<RX_RING_SIZE; i++) {
1855
1856
1857
1858 bdp->cbd_sc = BD_ENET_RX_EMPTY;
1859 bdp++;
1860 }
1861
1862
1863
1864 bdp--;
1865 bdp->cbd_sc |= BD_SC_WRAP;
1866
1867
1868
1869 bdp = fep->tx_bd_base;
1870 for (i=0; i<TX_RING_SIZE; i++) {
1871
1872
1873
1874 bdp->cbd_sc = 0;
1875 bdp->cbd_bufaddr = 0;
1876 bdp++;
1877 }
1878
1879
1880
1881 bdp--;
1882 bdp->cbd_sc |= BD_SC_WRAP;
1883
1884
1885
1886 if (duplex) {
1887 fecp->fec_r_cntrl = FEC_RCNTRL_MII_MODE;
1888 fecp->fec_x_cntrl = FEC_TCNTRL_FDEN;
1889 }
1890 else {
1891 fecp->fec_r_cntrl = FEC_RCNTRL_MII_MODE | FEC_RCNTRL_DRT;
1892 fecp->fec_x_cntrl = 0;
1893 }
1894 fep->full_duplex = duplex;
1895
1896
1897
1898 fecp->fec_fun_code = 0x78000000;
1899
1900#ifdef CONFIG_USE_MDIO
1901
1902
1903 fecp->fec_mii_speed = fep->phy_speed;
1904#endif
1905
1906
1907
1908 fecp->fec_ievent = 0xffc0;
1909
1910 fecp->fec_ivec = (FEC_INTERRUPT/2) << 29;
1911
1912
1913
1914 fecp->fec_imask = ( FEC_ENET_TXF | FEC_ENET_TXB |
1915 FEC_ENET_RXF | FEC_ENET_RXB | FEC_ENET_MII );
1916
1917
1918
1919 fecp->fec_ecntrl = FEC_ECNTRL_PINMUX | FEC_ECNTRL_ETHER_EN;
1920 fecp->fec_r_des_active = 0x01000000;
1921}
1922
1923static void
1924fec_stop(struct net_device *dev)
1925{
1926 volatile immap_t *immap;
1927 volatile fec_t *fecp;
1928 struct fec_enet_private *fep;
1929 int i;
1930
1931 immap = (immap_t *)IMAP_ADDR;
1932
1933 fecp = &(immap->im_cpm.cp_fec);
1934
1935 if ((fecp->fec_ecntrl & FEC_ECNTRL_ETHER_EN) == 0)
1936 return;
1937
1938 fep = dev->priv;
1939
1940
1941 fecp->fec_x_cntrl = 0x01;
1942
1943 for (i = 0;
1944 ((fecp->fec_ievent & 0x10000000) == 0) && (i < FEC_RESET_DELAY);
1945 ++i) {
1946 udelay(1);
1947 }
1948 if (i == FEC_RESET_DELAY) {
1949 printk ("FEC timeout on graceful transmit stop\n");
1950 }
1951
1952
1953
1954 fecp->fec_ievent = FEC_ENET_MII;
1955
1956
1957
1958 fecp->fec_ivec = (FEC_INTERRUPT/2) << 29;
1959 fecp->fec_imask = FEC_ENET_MII;
1960
1961#ifdef CONFIG_USE_MDIO
1962
1963
1964 fecp->fec_mii_speed = fep->phy_speed;
1965#endif
1966
1967
1968
1969 fecp->fec_ecntrl &= ~(FEC_ECNTRL_ETHER_EN);
1970}
1971