MOXA linux-2.6.x / linux-2.6.9-uc0 from sdlinux-moxaart.tgz
[linux-2.6.9-moxart.git] / drivers / net / bmac.c
blob2b44eeed1e852f6b3e522b99487c6d0c1bdeec09
1 /*
2 * Network device driver for the BMAC ethernet controller on
3 * Apple Powermacs. Assumes it's under a DBDMA controller.
5 * Copyright (C) 1998 Randy Gobbel.
7 * May 1999, Al Viro: proper release of /proc/net/bmac entry, switched to
8 * dynamic procfs inode.
9 */
10 #include <linux/config.h>
11 #include <linux/module.h>
12 #include <linux/kernel.h>
13 #include <linux/netdevice.h>
14 #include <linux/etherdevice.h>
15 #include <linux/delay.h>
16 #include <linux/string.h>
17 #include <linux/timer.h>
18 #include <linux/proc_fs.h>
19 #include <linux/init.h>
20 #include <linux/spinlock.h>
21 #include <linux/crc32.h>
22 #include <asm/prom.h>
23 #include <asm/dbdma.h>
24 #include <asm/io.h>
25 #include <asm/page.h>
26 #include <asm/pgtable.h>
27 #include <asm/machdep.h>
28 #include <asm/pmac_feature.h>
29 #include <asm/macio.h>
30 #include <asm/irq.h>
32 #include "bmac.h"
34 #define trunc_page(x) ((void *)(((unsigned long)(x)) & ~((unsigned long)(PAGE_SIZE - 1))))
35 #define round_page(x) trunc_page(((unsigned long)(x)) + ((unsigned long)(PAGE_SIZE - 1)))
38 * CRC polynomial - used in working out multicast filter bits.
40 #define ENET_CRCPOLY 0x04c11db7
42 /* switch to use multicast code lifted from sunhme driver */
43 #define SUNHME_MULTICAST
45 #define N_RX_RING 64
46 #define N_TX_RING 32
47 #define MAX_TX_ACTIVE 1
48 #define ETHERCRC 4
49 #define ETHERMINPACKET 64
50 #define ETHERMTU 1500
51 #define RX_BUFLEN (ETHERMTU + 14 + ETHERCRC + 2)
52 #define TX_TIMEOUT HZ /* 1 second */
54 /* Bits in transmit DMA status */
55 #define TX_DMA_ERR 0x80
57 #define XXDEBUG(args)
59 struct bmac_data {
60 /* volatile struct bmac *bmac; */
61 struct sk_buff_head *queue;
62 volatile struct dbdma_regs *tx_dma;
63 int tx_dma_intr;
64 volatile struct dbdma_regs *rx_dma;
65 int rx_dma_intr;
66 volatile struct dbdma_cmd *tx_cmds; /* xmit dma command list */
67 volatile struct dbdma_cmd *rx_cmds; /* recv dma command list */
68 struct macio_dev *mdev;
69 int is_bmac_plus;
70 struct sk_buff *rx_bufs[N_RX_RING];
71 int rx_fill;
72 int rx_empty;
73 struct sk_buff *tx_bufs[N_TX_RING];
74 int tx_fill;
75 int tx_empty;
76 unsigned char tx_fullup;
77 struct net_device_stats stats;
78 struct timer_list tx_timeout;
79 int timeout_active;
80 int sleeping;
81 int opened;
82 unsigned short hash_use_count[64];
83 unsigned short hash_table_mask[4];
84 spinlock_t lock;
87 #if 0 /* Move that to ethtool */
89 typedef struct bmac_reg_entry {
90 char *name;
91 unsigned short reg_offset;
92 } bmac_reg_entry_t;
94 #define N_REG_ENTRIES 31
96 static bmac_reg_entry_t reg_entries[N_REG_ENTRIES] = {
97 {"MEMADD", MEMADD},
98 {"MEMDATAHI", MEMDATAHI},
99 {"MEMDATALO", MEMDATALO},
100 {"TXPNTR", TXPNTR},
101 {"RXPNTR", RXPNTR},
102 {"IPG1", IPG1},
103 {"IPG2", IPG2},
104 {"ALIMIT", ALIMIT},
105 {"SLOT", SLOT},
106 {"PALEN", PALEN},
107 {"PAPAT", PAPAT},
108 {"TXSFD", TXSFD},
109 {"JAM", JAM},
110 {"TXCFG", TXCFG},
111 {"TXMAX", TXMAX},
112 {"TXMIN", TXMIN},
113 {"PAREG", PAREG},
114 {"DCNT", DCNT},
115 {"NCCNT", NCCNT},
116 {"NTCNT", NTCNT},
117 {"EXCNT", EXCNT},
118 {"LTCNT", LTCNT},
119 {"TXSM", TXSM},
120 {"RXCFG", RXCFG},
121 {"RXMAX", RXMAX},
122 {"RXMIN", RXMIN},
123 {"FRCNT", FRCNT},
124 {"AECNT", AECNT},
125 {"FECNT", FECNT},
126 {"RXSM", RXSM},
127 {"RXCV", RXCV}
130 #endif
132 static unsigned char *bmac_emergency_rxbuf;
135 * Number of bytes of private data per BMAC: allow enough for
136 * the rx and tx dma commands plus a branch dma command each,
137 * and another 16 bytes to allow us to align the dma command
138 * buffers on a 16 byte boundary.
140 #define PRIV_BYTES (sizeof(struct bmac_data) \
141 + (N_RX_RING + N_TX_RING + 4) * sizeof(struct dbdma_cmd) \
142 + sizeof(struct sk_buff_head))
144 static unsigned char bitrev(unsigned char b);
145 static int bmac_open(struct net_device *dev);
146 static int bmac_close(struct net_device *dev);
147 static int bmac_transmit_packet(struct sk_buff *skb, struct net_device *dev);
148 static struct net_device_stats *bmac_stats(struct net_device *dev);
149 static void bmac_set_multicast(struct net_device *dev);
150 static void bmac_reset_and_enable(struct net_device *dev);
151 static void bmac_start_chip(struct net_device *dev);
152 static void bmac_init_chip(struct net_device *dev);
153 static void bmac_init_registers(struct net_device *dev);
154 static void bmac_enable_and_reset_chip(struct net_device *dev);
155 static int bmac_set_address(struct net_device *dev, void *addr);
156 static irqreturn_t bmac_misc_intr(int irq, void *dev_id, struct pt_regs *regs);
157 static irqreturn_t bmac_txdma_intr(int irq, void *dev_id, struct pt_regs *regs);
158 static irqreturn_t bmac_rxdma_intr(int irq, void *dev_id, struct pt_regs *regs);
159 static void bmac_set_timeout(struct net_device *dev);
160 static void bmac_tx_timeout(unsigned long data);
161 static int bmac_output(struct sk_buff *skb, struct net_device *dev);
162 static void bmac_start(struct net_device *dev);
164 #define DBDMA_SET(x) ( ((x) | (x) << 16) )
165 #define DBDMA_CLEAR(x) ( (x) << 16)
167 static inline void
168 dbdma_st32(volatile unsigned long *a, unsigned long x)
170 __asm__ volatile( "stwbrx %0,0,%1" : : "r" (x), "r" (a) : "memory");
171 return;
174 static inline unsigned long
175 dbdma_ld32(volatile unsigned long *a)
177 unsigned long swap;
178 __asm__ volatile ("lwbrx %0,0,%1" : "=r" (swap) : "r" (a));
179 return swap;
182 static void
183 dbdma_continue(volatile struct dbdma_regs *dmap)
185 dbdma_st32((volatile unsigned long *)&dmap->control,
186 DBDMA_SET(RUN|WAKE) | DBDMA_CLEAR(PAUSE|DEAD));
187 eieio();
190 static void
191 dbdma_reset(volatile struct dbdma_regs *dmap)
193 dbdma_st32((volatile unsigned long *)&dmap->control,
194 DBDMA_CLEAR(ACTIVE|DEAD|WAKE|FLUSH|PAUSE|RUN));
195 eieio();
196 while (dbdma_ld32((volatile unsigned long *)&dmap->status) & RUN)
197 eieio();
200 static void
201 dbdma_setcmd(volatile struct dbdma_cmd *cp,
202 unsigned short cmd, unsigned count, unsigned long addr,
203 unsigned long cmd_dep)
205 out_le16(&cp->command, cmd);
206 out_le16(&cp->req_count, count);
207 out_le32(&cp->phy_addr, addr);
208 out_le32(&cp->cmd_dep, cmd_dep);
209 out_le16(&cp->xfer_status, 0);
210 out_le16(&cp->res_count, 0);
213 static inline
214 void bmwrite(struct net_device *dev, unsigned long reg_offset, unsigned data )
216 out_le16((void *)dev->base_addr + reg_offset, data);
220 static inline
221 volatile unsigned short bmread(struct net_device *dev, unsigned long reg_offset )
223 return in_le16((void *)dev->base_addr + reg_offset);
226 static void
227 bmac_enable_and_reset_chip(struct net_device *dev)
229 struct bmac_data *bp = netdev_priv(dev);
230 volatile struct dbdma_regs *rd = bp->rx_dma;
231 volatile struct dbdma_regs *td = bp->tx_dma;
233 if (rd)
234 dbdma_reset(rd);
235 if (td)
236 dbdma_reset(td);
238 pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 1);
241 #define MIFDELAY udelay(10)
243 static unsigned int
244 bmac_mif_readbits(struct net_device *dev, int nb)
246 unsigned int val = 0;
248 while (--nb >= 0) {
249 bmwrite(dev, MIFCSR, 0);
250 MIFDELAY;
251 if (bmread(dev, MIFCSR) & 8)
252 val |= 1 << nb;
253 bmwrite(dev, MIFCSR, 1);
254 MIFDELAY;
256 bmwrite(dev, MIFCSR, 0);
257 MIFDELAY;
258 bmwrite(dev, MIFCSR, 1);
259 MIFDELAY;
260 return val;
263 static void
264 bmac_mif_writebits(struct net_device *dev, unsigned int val, int nb)
266 int b;
268 while (--nb >= 0) {
269 b = (val & (1 << nb))? 6: 4;
270 bmwrite(dev, MIFCSR, b);
271 MIFDELAY;
272 bmwrite(dev, MIFCSR, b|1);
273 MIFDELAY;
277 static unsigned int
278 bmac_mif_read(struct net_device *dev, unsigned int addr)
280 unsigned int val;
282 bmwrite(dev, MIFCSR, 4);
283 MIFDELAY;
284 bmac_mif_writebits(dev, ~0U, 32);
285 bmac_mif_writebits(dev, 6, 4);
286 bmac_mif_writebits(dev, addr, 10);
287 bmwrite(dev, MIFCSR, 2);
288 MIFDELAY;
289 bmwrite(dev, MIFCSR, 1);
290 MIFDELAY;
291 val = bmac_mif_readbits(dev, 17);
292 bmwrite(dev, MIFCSR, 4);
293 MIFDELAY;
294 return val;
297 static void
298 bmac_mif_write(struct net_device *dev, unsigned int addr, unsigned int val)
300 bmwrite(dev, MIFCSR, 4);
301 MIFDELAY;
302 bmac_mif_writebits(dev, ~0U, 32);
303 bmac_mif_writebits(dev, 5, 4);
304 bmac_mif_writebits(dev, addr, 10);
305 bmac_mif_writebits(dev, 2, 2);
306 bmac_mif_writebits(dev, val, 16);
307 bmac_mif_writebits(dev, 3, 2);
310 static void
311 bmac_init_registers(struct net_device *dev)
313 struct bmac_data *bp = netdev_priv(dev);
314 volatile unsigned short regValue;
315 unsigned short *pWord16;
316 int i;
318 /* XXDEBUG(("bmac: enter init_registers\n")); */
320 bmwrite(dev, RXRST, RxResetValue);
321 bmwrite(dev, TXRST, TxResetBit);
323 i = 100;
324 do {
325 --i;
326 udelay(10000);
327 regValue = bmread(dev, TXRST); /* wait for reset to clear..acknowledge */
328 } while ((regValue & TxResetBit) && i > 0);
330 if (!bp->is_bmac_plus) {
331 regValue = bmread(dev, XCVRIF);
332 regValue |= ClkBit | SerialMode | COLActiveLow;
333 bmwrite(dev, XCVRIF, regValue);
334 udelay(10000);
337 bmwrite(dev, RSEED, (unsigned short)0x1968);
339 regValue = bmread(dev, XIFC);
340 regValue |= TxOutputEnable;
341 bmwrite(dev, XIFC, regValue);
343 bmread(dev, PAREG);
345 /* set collision counters to 0 */
346 bmwrite(dev, NCCNT, 0);
347 bmwrite(dev, NTCNT, 0);
348 bmwrite(dev, EXCNT, 0);
349 bmwrite(dev, LTCNT, 0);
351 /* set rx counters to 0 */
352 bmwrite(dev, FRCNT, 0);
353 bmwrite(dev, LECNT, 0);
354 bmwrite(dev, AECNT, 0);
355 bmwrite(dev, FECNT, 0);
356 bmwrite(dev, RXCV, 0);
358 /* set tx fifo information */
359 bmwrite(dev, TXTH, 4); /* 4 octets before tx starts */
361 bmwrite(dev, TXFIFOCSR, 0); /* first disable txFIFO */
362 bmwrite(dev, TXFIFOCSR, TxFIFOEnable );
364 /* set rx fifo information */
365 bmwrite(dev, RXFIFOCSR, 0); /* first disable rxFIFO */
366 bmwrite(dev, RXFIFOCSR, RxFIFOEnable );
368 //bmwrite(dev, TXCFG, TxMACEnable); /* TxNeverGiveUp maybe later */
369 bmread(dev, STATUS); /* read it just to clear it */
371 /* zero out the chip Hash Filter registers */
372 for (i=0; i<4; i++) bp->hash_table_mask[i] = 0;
373 bmwrite(dev, BHASH3, bp->hash_table_mask[0]); /* bits 15 - 0 */
374 bmwrite(dev, BHASH2, bp->hash_table_mask[1]); /* bits 31 - 16 */
375 bmwrite(dev, BHASH1, bp->hash_table_mask[2]); /* bits 47 - 32 */
376 bmwrite(dev, BHASH0, bp->hash_table_mask[3]); /* bits 63 - 48 */
378 pWord16 = (unsigned short *)dev->dev_addr;
379 bmwrite(dev, MADD0, *pWord16++);
380 bmwrite(dev, MADD1, *pWord16++);
381 bmwrite(dev, MADD2, *pWord16);
383 bmwrite(dev, RXCFG, RxCRCNoStrip | RxHashFilterEnable | RxRejectOwnPackets);
385 bmwrite(dev, INTDISABLE, EnableNormal);
387 return;
390 #if 0
391 static void
392 bmac_disable_interrupts(struct net_device *dev)
394 bmwrite(dev, INTDISABLE, DisableAll);
397 static void
398 bmac_enable_interrupts(struct net_device *dev)
400 bmwrite(dev, INTDISABLE, EnableNormal);
402 #endif
405 static void
406 bmac_start_chip(struct net_device *dev)
408 struct bmac_data *bp = netdev_priv(dev);
409 volatile struct dbdma_regs *rd = bp->rx_dma;
410 unsigned short oldConfig;
412 /* enable rx dma channel */
413 dbdma_continue(rd);
415 oldConfig = bmread(dev, TXCFG);
416 bmwrite(dev, TXCFG, oldConfig | TxMACEnable );
418 /* turn on rx plus any other bits already on (promiscuous possibly) */
419 oldConfig = bmread(dev, RXCFG);
420 bmwrite(dev, RXCFG, oldConfig | RxMACEnable );
421 udelay(20000);
424 static void
425 bmac_init_phy(struct net_device *dev)
427 unsigned int addr;
428 struct bmac_data *bp = netdev_priv(dev);
430 printk(KERN_DEBUG "phy registers:");
431 for (addr = 0; addr < 32; ++addr) {
432 if ((addr & 7) == 0)
433 printk("\n" KERN_DEBUG);
434 printk(" %.4x", bmac_mif_read(dev, addr));
436 printk("\n");
437 if (bp->is_bmac_plus) {
438 unsigned int capable, ctrl;
440 ctrl = bmac_mif_read(dev, 0);
441 capable = ((bmac_mif_read(dev, 1) & 0xf800) >> 6) | 1;
442 if (bmac_mif_read(dev, 4) != capable
443 || (ctrl & 0x1000) == 0) {
444 bmac_mif_write(dev, 4, capable);
445 bmac_mif_write(dev, 0, 0x1200);
446 } else
447 bmac_mif_write(dev, 0, 0x1000);
451 static void bmac_init_chip(struct net_device *dev)
453 bmac_init_phy(dev);
454 bmac_init_registers(dev);
457 #ifdef CONFIG_PM
458 static int bmac_suspend(struct macio_dev *mdev, u32 state)
460 struct net_device* dev = macio_get_drvdata(mdev);
461 struct bmac_data *bp = netdev_priv(dev);
462 unsigned long flags;
463 unsigned short config;
464 int i;
466 netif_device_detach(dev);
467 /* prolly should wait for dma to finish & turn off the chip */
468 spin_lock_irqsave(&bp->lock, flags);
469 if (bp->timeout_active) {
470 del_timer(&bp->tx_timeout);
471 bp->timeout_active = 0;
473 disable_irq(dev->irq);
474 disable_irq(bp->tx_dma_intr);
475 disable_irq(bp->rx_dma_intr);
476 bp->sleeping = 1;
477 spin_unlock_irqrestore(&bp->lock, flags);
478 if (bp->opened) {
479 volatile struct dbdma_regs *rd = bp->rx_dma;
480 volatile struct dbdma_regs *td = bp->tx_dma;
482 config = bmread(dev, RXCFG);
483 bmwrite(dev, RXCFG, (config & ~RxMACEnable));
484 config = bmread(dev, TXCFG);
485 bmwrite(dev, TXCFG, (config & ~TxMACEnable));
486 bmwrite(dev, INTDISABLE, DisableAll); /* disable all intrs */
487 /* disable rx and tx dma */
488 st_le32(&rd->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */
489 st_le32(&td->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */
490 /* free some skb's */
491 for (i=0; i<N_RX_RING; i++) {
492 if (bp->rx_bufs[i] != NULL) {
493 dev_kfree_skb(bp->rx_bufs[i]);
494 bp->rx_bufs[i] = NULL;
497 for (i = 0; i<N_TX_RING; i++) {
498 if (bp->tx_bufs[i] != NULL) {
499 dev_kfree_skb(bp->tx_bufs[i]);
500 bp->tx_bufs[i] = NULL;
504 pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0);
505 return 0;
508 static int bmac_resume(struct macio_dev *mdev)
510 struct net_device* dev = macio_get_drvdata(mdev);
511 struct bmac_data *bp = netdev_priv(dev);
513 /* see if this is enough */
514 if (bp->opened)
515 bmac_reset_and_enable(dev);
517 enable_irq(dev->irq);
518 enable_irq(bp->tx_dma_intr);
519 enable_irq(bp->rx_dma_intr);
520 netif_device_attach(dev);
522 return 0;
524 #endif /* CONFIG_PM */
526 static int bmac_set_address(struct net_device *dev, void *addr)
528 struct bmac_data *bp = netdev_priv(dev);
529 unsigned char *p = addr;
530 unsigned short *pWord16;
531 unsigned long flags;
532 int i;
534 XXDEBUG(("bmac: enter set_address\n"));
535 spin_lock_irqsave(&bp->lock, flags);
537 for (i = 0; i < 6; ++i) {
538 dev->dev_addr[i] = p[i];
540 /* load up the hardware address */
541 pWord16 = (unsigned short *)dev->dev_addr;
542 bmwrite(dev, MADD0, *pWord16++);
543 bmwrite(dev, MADD1, *pWord16++);
544 bmwrite(dev, MADD2, *pWord16);
546 spin_unlock_irqrestore(&bp->lock, flags);
547 XXDEBUG(("bmac: exit set_address\n"));
548 return 0;
551 static inline void bmac_set_timeout(struct net_device *dev)
553 struct bmac_data *bp = netdev_priv(dev);
554 unsigned long flags;
556 spin_lock_irqsave(&bp->lock, flags);
557 if (bp->timeout_active)
558 del_timer(&bp->tx_timeout);
559 bp->tx_timeout.expires = jiffies + TX_TIMEOUT;
560 bp->tx_timeout.function = bmac_tx_timeout;
561 bp->tx_timeout.data = (unsigned long) dev;
562 add_timer(&bp->tx_timeout);
563 bp->timeout_active = 1;
564 spin_unlock_irqrestore(&bp->lock, flags);
567 static void
568 bmac_construct_xmt(struct sk_buff *skb, volatile struct dbdma_cmd *cp)
570 void *vaddr;
571 unsigned long baddr;
572 unsigned long len;
574 len = skb->len;
575 vaddr = skb->data;
576 baddr = virt_to_bus(vaddr);
578 dbdma_setcmd(cp, (OUTPUT_LAST | INTR_ALWAYS | WAIT_IFCLR), len, baddr, 0);
581 static void
582 bmac_construct_rxbuff(struct sk_buff *skb, volatile struct dbdma_cmd *cp)
584 unsigned char *addr = skb? skb->data: bmac_emergency_rxbuf;
586 dbdma_setcmd(cp, (INPUT_LAST | INTR_ALWAYS), RX_BUFLEN,
587 virt_to_bus(addr), 0);
590 /* Bit-reverse one byte of an ethernet hardware address. */
591 static unsigned char
592 bitrev(unsigned char b)
594 int d = 0, i;
596 for (i = 0; i < 8; ++i, b >>= 1)
597 d = (d << 1) | (b & 1);
598 return d;
602 static void
603 bmac_init_tx_ring(struct bmac_data *bp)
605 volatile struct dbdma_regs *td = bp->tx_dma;
607 memset((char *)bp->tx_cmds, 0, (N_TX_RING+1) * sizeof(struct dbdma_cmd));
609 bp->tx_empty = 0;
610 bp->tx_fill = 0;
611 bp->tx_fullup = 0;
613 /* put a branch at the end of the tx command list */
614 dbdma_setcmd(&bp->tx_cmds[N_TX_RING],
615 (DBDMA_NOP | BR_ALWAYS), 0, 0, virt_to_bus(bp->tx_cmds));
617 /* reset tx dma */
618 dbdma_reset(td);
619 out_le32(&td->wait_sel, 0x00200020);
620 out_le32(&td->cmdptr, virt_to_bus(bp->tx_cmds));
623 static int
624 bmac_init_rx_ring(struct bmac_data *bp)
626 volatile struct dbdma_regs *rd = bp->rx_dma;
627 int i;
628 struct sk_buff *skb;
630 /* initialize list of sk_buffs for receiving and set up recv dma */
631 memset((char *)bp->rx_cmds, 0,
632 (N_RX_RING + 1) * sizeof(struct dbdma_cmd));
633 for (i = 0; i < N_RX_RING; i++) {
634 if ((skb = bp->rx_bufs[i]) == NULL) {
635 bp->rx_bufs[i] = skb = dev_alloc_skb(RX_BUFLEN+2);
636 if (skb != NULL)
637 skb_reserve(skb, 2);
639 bmac_construct_rxbuff(skb, &bp->rx_cmds[i]);
642 bp->rx_empty = 0;
643 bp->rx_fill = i;
645 /* Put a branch back to the beginning of the receive command list */
646 dbdma_setcmd(&bp->rx_cmds[N_RX_RING],
647 (DBDMA_NOP | BR_ALWAYS), 0, 0, virt_to_bus(bp->rx_cmds));
649 /* start rx dma */
650 dbdma_reset(rd);
651 out_le32(&rd->cmdptr, virt_to_bus(bp->rx_cmds));
653 return 1;
657 static int bmac_transmit_packet(struct sk_buff *skb, struct net_device *dev)
659 struct bmac_data *bp = netdev_priv(dev);
660 volatile struct dbdma_regs *td = bp->tx_dma;
661 int i;
663 /* see if there's a free slot in the tx ring */
664 /* XXDEBUG(("bmac_xmit_start: empty=%d fill=%d\n", */
665 /* bp->tx_empty, bp->tx_fill)); */
666 i = bp->tx_fill + 1;
667 if (i >= N_TX_RING)
668 i = 0;
669 if (i == bp->tx_empty) {
670 netif_stop_queue(dev);
671 bp->tx_fullup = 1;
672 XXDEBUG(("bmac_transmit_packet: tx ring full\n"));
673 return -1; /* can't take it at the moment */
676 dbdma_setcmd(&bp->tx_cmds[i], DBDMA_STOP, 0, 0, 0);
678 bmac_construct_xmt(skb, &bp->tx_cmds[bp->tx_fill]);
680 bp->tx_bufs[bp->tx_fill] = skb;
681 bp->tx_fill = i;
683 bp->stats.tx_bytes += skb->len;
685 dbdma_continue(td);
687 return 0;
690 static int rxintcount;
692 static irqreturn_t bmac_rxdma_intr(int irq, void *dev_id, struct pt_regs *regs)
694 struct net_device *dev = (struct net_device *) dev_id;
695 struct bmac_data *bp = netdev_priv(dev);
696 volatile struct dbdma_regs *rd = bp->rx_dma;
697 volatile struct dbdma_cmd *cp;
698 int i, nb, stat;
699 struct sk_buff *skb;
700 unsigned int residual;
701 int last;
702 unsigned long flags;
704 spin_lock_irqsave(&bp->lock, flags);
706 if (++rxintcount < 10) {
707 XXDEBUG(("bmac_rxdma_intr\n"));
710 last = -1;
711 i = bp->rx_empty;
713 while (1) {
714 cp = &bp->rx_cmds[i];
715 stat = ld_le16(&cp->xfer_status);
716 residual = ld_le16(&cp->res_count);
717 if ((stat & ACTIVE) == 0)
718 break;
719 nb = RX_BUFLEN - residual - 2;
720 if (nb < (ETHERMINPACKET - ETHERCRC)) {
721 skb = NULL;
722 bp->stats.rx_length_errors++;
723 bp->stats.rx_errors++;
724 } else {
725 skb = bp->rx_bufs[i];
726 bp->rx_bufs[i] = NULL;
728 if (skb != NULL) {
729 nb -= ETHERCRC;
730 skb_put(skb, nb);
731 skb->dev = dev;
732 skb->protocol = eth_type_trans(skb, dev);
733 netif_rx(skb);
734 dev->last_rx = jiffies;
735 ++bp->stats.rx_packets;
736 bp->stats.rx_bytes += nb;
737 } else {
738 ++bp->stats.rx_dropped;
740 dev->last_rx = jiffies;
741 if ((skb = bp->rx_bufs[i]) == NULL) {
742 bp->rx_bufs[i] = skb = dev_alloc_skb(RX_BUFLEN+2);
743 if (skb != NULL)
744 skb_reserve(bp->rx_bufs[i], 2);
746 bmac_construct_rxbuff(skb, &bp->rx_cmds[i]);
747 st_le16(&cp->res_count, 0);
748 st_le16(&cp->xfer_status, 0);
749 last = i;
750 if (++i >= N_RX_RING) i = 0;
753 if (last != -1) {
754 bp->rx_fill = last;
755 bp->rx_empty = i;
758 dbdma_continue(rd);
759 spin_unlock_irqrestore(&bp->lock, flags);
761 if (rxintcount < 10) {
762 XXDEBUG(("bmac_rxdma_intr done\n"));
764 return IRQ_HANDLED;
767 static int txintcount;
769 static irqreturn_t bmac_txdma_intr(int irq, void *dev_id, struct pt_regs *regs)
771 struct net_device *dev = (struct net_device *) dev_id;
772 struct bmac_data *bp = netdev_priv(dev);
773 volatile struct dbdma_cmd *cp;
774 int stat;
775 unsigned long flags;
777 spin_lock_irqsave(&bp->lock, flags);
779 if (txintcount++ < 10) {
780 XXDEBUG(("bmac_txdma_intr\n"));
783 /* del_timer(&bp->tx_timeout); */
784 /* bp->timeout_active = 0; */
786 while (1) {
787 cp = &bp->tx_cmds[bp->tx_empty];
788 stat = ld_le16(&cp->xfer_status);
789 if (txintcount < 10) {
790 XXDEBUG(("bmac_txdma_xfer_stat=%#0x\n", stat));
792 if (!(stat & ACTIVE)) {
794 * status field might not have been filled by DBDMA
796 if (cp == bus_to_virt(in_le32(&bp->tx_dma->cmdptr)))
797 break;
800 if (bp->tx_bufs[bp->tx_empty]) {
801 ++bp->stats.tx_packets;
802 dev_kfree_skb_irq(bp->tx_bufs[bp->tx_empty]);
804 bp->tx_bufs[bp->tx_empty] = NULL;
805 bp->tx_fullup = 0;
806 netif_wake_queue(dev);
807 if (++bp->tx_empty >= N_TX_RING)
808 bp->tx_empty = 0;
809 if (bp->tx_empty == bp->tx_fill)
810 break;
813 spin_unlock_irqrestore(&bp->lock, flags);
815 if (txintcount < 10) {
816 XXDEBUG(("bmac_txdma_intr done->bmac_start\n"));
819 bmac_start(dev);
820 return IRQ_HANDLED;
823 static struct net_device_stats *bmac_stats(struct net_device *dev)
825 struct bmac_data *p = netdev_priv(dev);
827 return &p->stats;
830 #ifndef SUNHME_MULTICAST
831 /* Real fast bit-reversal algorithm, 6-bit values */
832 static int reverse6[64] = {
833 0x0,0x20,0x10,0x30,0x8,0x28,0x18,0x38,
834 0x4,0x24,0x14,0x34,0xc,0x2c,0x1c,0x3c,
835 0x2,0x22,0x12,0x32,0xa,0x2a,0x1a,0x3a,
836 0x6,0x26,0x16,0x36,0xe,0x2e,0x1e,0x3e,
837 0x1,0x21,0x11,0x31,0x9,0x29,0x19,0x39,
838 0x5,0x25,0x15,0x35,0xd,0x2d,0x1d,0x3d,
839 0x3,0x23,0x13,0x33,0xb,0x2b,0x1b,0x3b,
840 0x7,0x27,0x17,0x37,0xf,0x2f,0x1f,0x3f
843 static unsigned int
844 crc416(unsigned int curval, unsigned short nxtval)
846 register unsigned int counter, cur = curval, next = nxtval;
847 register int high_crc_set, low_data_set;
849 /* Swap bytes */
850 next = ((next & 0x00FF) << 8) | (next >> 8);
852 /* Compute bit-by-bit */
853 for (counter = 0; counter < 16; ++counter) {
854 /* is high CRC bit set? */
855 if ((cur & 0x80000000) == 0) high_crc_set = 0;
856 else high_crc_set = 1;
858 cur = cur << 1;
860 if ((next & 0x0001) == 0) low_data_set = 0;
861 else low_data_set = 1;
863 next = next >> 1;
865 /* do the XOR */
866 if (high_crc_set ^ low_data_set) cur = cur ^ ENET_CRCPOLY;
868 return cur;
871 static unsigned int
872 bmac_crc(unsigned short *address)
874 unsigned int newcrc;
876 XXDEBUG(("bmac_crc: addr=%#04x, %#04x, %#04x\n", *address, address[1], address[2]));
877 newcrc = crc416(0xffffffff, *address); /* address bits 47 - 32 */
878 newcrc = crc416(newcrc, address[1]); /* address bits 31 - 16 */
879 newcrc = crc416(newcrc, address[2]); /* address bits 15 - 0 */
881 return(newcrc);
885 * Add requested mcast addr to BMac's hash table filter.
889 static void
890 bmac_addhash(struct bmac_data *bp, unsigned char *addr)
892 unsigned int crc;
893 unsigned short mask;
895 if (!(*addr)) return;
896 crc = bmac_crc((unsigned short *)addr) & 0x3f; /* Big-endian alert! */
897 crc = reverse6[crc]; /* Hyperfast bit-reversing algorithm */
898 if (bp->hash_use_count[crc]++) return; /* This bit is already set */
899 mask = crc % 16;
900 mask = (unsigned char)1 << mask;
901 bp->hash_use_count[crc/16] |= mask;
904 static void
905 bmac_removehash(struct bmac_data *bp, unsigned char *addr)
907 unsigned int crc;
908 unsigned char mask;
910 /* Now, delete the address from the filter copy, as indicated */
911 crc = bmac_crc((unsigned short *)addr) & 0x3f; /* Big-endian alert! */
912 crc = reverse6[crc]; /* Hyperfast bit-reversing algorithm */
913 if (bp->hash_use_count[crc] == 0) return; /* That bit wasn't in use! */
914 if (--bp->hash_use_count[crc]) return; /* That bit is still in use */
915 mask = crc % 16;
916 mask = ((unsigned char)1 << mask) ^ 0xffff; /* To turn off bit */
917 bp->hash_table_mask[crc/16] &= mask;
921 * Sync the adapter with the software copy of the multicast mask
922 * (logical address filter).
925 static void
926 bmac_rx_off(struct net_device *dev)
928 unsigned short rx_cfg;
930 rx_cfg = bmread(dev, RXCFG);
931 rx_cfg &= ~RxMACEnable;
932 bmwrite(dev, RXCFG, rx_cfg);
933 do {
934 rx_cfg = bmread(dev, RXCFG);
935 } while (rx_cfg & RxMACEnable);
938 unsigned short
939 bmac_rx_on(struct net_device *dev, int hash_enable, int promisc_enable)
941 unsigned short rx_cfg;
943 rx_cfg = bmread(dev, RXCFG);
944 rx_cfg |= RxMACEnable;
945 if (hash_enable) rx_cfg |= RxHashFilterEnable;
946 else rx_cfg &= ~RxHashFilterEnable;
947 if (promisc_enable) rx_cfg |= RxPromiscEnable;
948 else rx_cfg &= ~RxPromiscEnable;
949 bmwrite(dev, RXRST, RxResetValue);
950 bmwrite(dev, RXFIFOCSR, 0); /* first disable rxFIFO */
951 bmwrite(dev, RXFIFOCSR, RxFIFOEnable );
952 bmwrite(dev, RXCFG, rx_cfg );
953 return rx_cfg;
956 static void
957 bmac_update_hash_table_mask(struct net_device *dev, struct bmac_data *bp)
959 bmwrite(dev, BHASH3, bp->hash_table_mask[0]); /* bits 15 - 0 */
960 bmwrite(dev, BHASH2, bp->hash_table_mask[1]); /* bits 31 - 16 */
961 bmwrite(dev, BHASH1, bp->hash_table_mask[2]); /* bits 47 - 32 */
962 bmwrite(dev, BHASH0, bp->hash_table_mask[3]); /* bits 63 - 48 */
965 #if 0
966 static void
967 bmac_add_multi(struct net_device *dev,
968 struct bmac_data *bp, unsigned char *addr)
970 /* XXDEBUG(("bmac: enter bmac_add_multi\n")); */
971 bmac_addhash(bp, addr);
972 bmac_rx_off(dev);
973 bmac_update_hash_table_mask(dev, bp);
974 bmac_rx_on(dev, 1, (dev->flags & IFF_PROMISC)? 1 : 0);
975 /* XXDEBUG(("bmac: exit bmac_add_multi\n")); */
978 static void
979 bmac_remove_multi(struct net_device *dev,
980 struct bmac_data *bp, unsigned char *addr)
982 bmac_removehash(bp, addr);
983 bmac_rx_off(dev);
984 bmac_update_hash_table_mask(dev, bp);
985 bmac_rx_on(dev, 1, (dev->flags & IFF_PROMISC)? 1 : 0);
987 #endif
989 /* Set or clear the multicast filter for this adaptor.
990 num_addrs == -1 Promiscuous mode, receive all packets
991 num_addrs == 0 Normal mode, clear multicast list
992 num_addrs > 0 Multicast mode, receive normal and MC packets, and do
993 best-effort filtering.
995 static void bmac_set_multicast(struct net_device *dev)
997 struct dev_mc_list *dmi;
998 struct bmac_data *bp = netdev_priv(dev);
999 int num_addrs = dev->mc_count;
1000 unsigned short rx_cfg;
1001 int i;
1003 if (bp->sleeping)
1004 return;
1006 XXDEBUG(("bmac: enter bmac_set_multicast, n_addrs=%d\n", num_addrs));
1008 if((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) {
1009 for (i=0; i<4; i++) bp->hash_table_mask[i] = 0xffff;
1010 bmac_update_hash_table_mask(dev, bp);
1011 rx_cfg = bmac_rx_on(dev, 1, 0);
1012 XXDEBUG(("bmac: all multi, rx_cfg=%#08x\n"));
1013 } else if ((dev->flags & IFF_PROMISC) || (num_addrs < 0)) {
1014 rx_cfg = bmread(dev, RXCFG);
1015 rx_cfg |= RxPromiscEnable;
1016 bmwrite(dev, RXCFG, rx_cfg);
1017 rx_cfg = bmac_rx_on(dev, 0, 1);
1018 XXDEBUG(("bmac: promisc mode enabled, rx_cfg=%#08x\n", rx_cfg));
1019 } else {
1020 for (i=0; i<4; i++) bp->hash_table_mask[i] = 0;
1021 for (i=0; i<64; i++) bp->hash_use_count[i] = 0;
1022 if (num_addrs == 0) {
1023 rx_cfg = bmac_rx_on(dev, 0, 0);
1024 XXDEBUG(("bmac: multi disabled, rx_cfg=%#08x\n", rx_cfg));
1025 } else {
1026 for (dmi=dev->mc_list; dmi!=NULL; dmi=dmi->next)
1027 bmac_addhash(bp, dmi->dmi_addr);
1028 bmac_update_hash_table_mask(dev, bp);
1029 rx_cfg = bmac_rx_on(dev, 1, 0);
1030 XXDEBUG(("bmac: multi enabled, rx_cfg=%#08x\n", rx_cfg));
1033 /* XXDEBUG(("bmac: exit bmac_set_multicast\n")); */
1035 #else /* ifdef SUNHME_MULTICAST */
1037 /* The version of set_multicast below was lifted from sunhme.c */
1039 static void bmac_set_multicast(struct net_device *dev)
1041 struct dev_mc_list *dmi = dev->mc_list;
1042 char *addrs;
1043 int i;
1044 unsigned short rx_cfg;
1045 u32 crc;
1047 if((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) {
1048 bmwrite(dev, BHASH0, 0xffff);
1049 bmwrite(dev, BHASH1, 0xffff);
1050 bmwrite(dev, BHASH2, 0xffff);
1051 bmwrite(dev, BHASH3, 0xffff);
1052 } else if(dev->flags & IFF_PROMISC) {
1053 rx_cfg = bmread(dev, RXCFG);
1054 rx_cfg |= RxPromiscEnable;
1055 bmwrite(dev, RXCFG, rx_cfg);
1056 } else {
1057 u16 hash_table[4];
1059 rx_cfg = bmread(dev, RXCFG);
1060 rx_cfg &= ~RxPromiscEnable;
1061 bmwrite(dev, RXCFG, rx_cfg);
1063 for(i = 0; i < 4; i++) hash_table[i] = 0;
1065 for(i = 0; i < dev->mc_count; i++) {
1066 addrs = dmi->dmi_addr;
1067 dmi = dmi->next;
1069 if(!(*addrs & 1))
1070 continue;
1072 crc = ether_crc_le(6, addrs);
1073 crc >>= 26;
1074 hash_table[crc >> 4] |= 1 << (crc & 0xf);
1076 bmwrite(dev, BHASH0, hash_table[0]);
1077 bmwrite(dev, BHASH1, hash_table[1]);
1078 bmwrite(dev, BHASH2, hash_table[2]);
1079 bmwrite(dev, BHASH3, hash_table[3]);
1082 #endif /* SUNHME_MULTICAST */
1084 static int miscintcount;
1086 static irqreturn_t bmac_misc_intr(int irq, void *dev_id, struct pt_regs *regs)
1088 struct net_device *dev = (struct net_device *) dev_id;
1089 struct bmac_data *bp = netdev_priv(dev);
1090 unsigned int status = bmread(dev, STATUS);
1091 if (miscintcount++ < 10) {
1092 XXDEBUG(("bmac_misc_intr\n"));
1094 /* XXDEBUG(("bmac_misc_intr, status=%#08x\n", status)); */
1095 /* bmac_txdma_intr_inner(irq, dev_id, regs); */
1096 /* if (status & FrameReceived) bp->stats.rx_dropped++; */
1097 if (status & RxErrorMask) bp->stats.rx_errors++;
1098 if (status & RxCRCCntExp) bp->stats.rx_crc_errors++;
1099 if (status & RxLenCntExp) bp->stats.rx_length_errors++;
1100 if (status & RxOverFlow) bp->stats.rx_over_errors++;
1101 if (status & RxAlignCntExp) bp->stats.rx_frame_errors++;
1103 /* if (status & FrameSent) bp->stats.tx_dropped++; */
1104 if (status & TxErrorMask) bp->stats.tx_errors++;
1105 if (status & TxUnderrun) bp->stats.tx_fifo_errors++;
1106 if (status & TxNormalCollExp) bp->stats.collisions++;
1107 return IRQ_HANDLED;
1111 * Procedure for reading EEPROM
1113 #define SROMAddressLength 5
1114 #define DataInOn 0x0008
1115 #define DataInOff 0x0000
1116 #define Clk 0x0002
1117 #define ChipSelect 0x0001
1118 #define SDIShiftCount 3
1119 #define SD0ShiftCount 2
1120 #define DelayValue 1000 /* number of microseconds */
1121 #define SROMStartOffset 10 /* this is in words */
1122 #define SROMReadCount 3 /* number of words to read from SROM */
1123 #define SROMAddressBits 6
1124 #define EnetAddressOffset 20
1126 static unsigned char
1127 bmac_clock_out_bit(struct net_device *dev)
1129 unsigned short data;
1130 unsigned short val;
1132 bmwrite(dev, SROMCSR, ChipSelect | Clk);
1133 udelay(DelayValue);
1135 data = bmread(dev, SROMCSR);
1136 udelay(DelayValue);
1137 val = (data >> SD0ShiftCount) & 1;
1139 bmwrite(dev, SROMCSR, ChipSelect);
1140 udelay(DelayValue);
1142 return val;
1145 static void
1146 bmac_clock_in_bit(struct net_device *dev, unsigned int val)
1148 unsigned short data;
1150 if (val != 0 && val != 1) return;
1152 data = (val << SDIShiftCount);
1153 bmwrite(dev, SROMCSR, data | ChipSelect );
1154 udelay(DelayValue);
1156 bmwrite(dev, SROMCSR, data | ChipSelect | Clk );
1157 udelay(DelayValue);
1159 bmwrite(dev, SROMCSR, data | ChipSelect);
1160 udelay(DelayValue);
1163 static void
1164 reset_and_select_srom(struct net_device *dev)
1166 /* first reset */
1167 bmwrite(dev, SROMCSR, 0);
1168 udelay(DelayValue);
1170 /* send it the read command (110) */
1171 bmac_clock_in_bit(dev, 1);
1172 bmac_clock_in_bit(dev, 1);
1173 bmac_clock_in_bit(dev, 0);
1176 static unsigned short
1177 read_srom(struct net_device *dev, unsigned int addr, unsigned int addr_len)
1179 unsigned short data, val;
1180 int i;
1182 /* send out the address we want to read from */
1183 for (i = 0; i < addr_len; i++) {
1184 val = addr >> (addr_len-i-1);
1185 bmac_clock_in_bit(dev, val & 1);
1188 /* Now read in the 16-bit data */
1189 data = 0;
1190 for (i = 0; i < 16; i++) {
1191 val = bmac_clock_out_bit(dev);
1192 data <<= 1;
1193 data |= val;
1195 bmwrite(dev, SROMCSR, 0);
1197 return data;
1201 * It looks like Cogent and SMC use different methods for calculating
1202 * checksums. What a pain..
1205 static int
1206 bmac_verify_checksum(struct net_device *dev)
1208 unsigned short data, storedCS;
1210 reset_and_select_srom(dev);
1211 data = read_srom(dev, 3, SROMAddressBits);
1212 storedCS = ((data >> 8) & 0x0ff) | ((data << 8) & 0xff00);
1214 return 0;
1218 static void
1219 bmac_get_station_address(struct net_device *dev, unsigned char *ea)
1221 int i;
1222 unsigned short data;
1224 for (i = 0; i < 6; i++)
1226 reset_and_select_srom(dev);
1227 data = read_srom(dev, i + EnetAddressOffset/2, SROMAddressBits);
1228 ea[2*i] = bitrev(data & 0x0ff);
1229 ea[2*i+1] = bitrev((data >> 8) & 0x0ff);
1233 static void bmac_reset_and_enable(struct net_device *dev)
1235 struct bmac_data *bp = netdev_priv(dev);
1236 unsigned long flags;
1237 struct sk_buff *skb;
1238 unsigned char *data;
1240 spin_lock_irqsave(&bp->lock, flags);
1241 bmac_enable_and_reset_chip(dev);
1242 bmac_init_tx_ring(bp);
1243 bmac_init_rx_ring(bp);
1244 bmac_init_chip(dev);
1245 bmac_start_chip(dev);
1246 bmwrite(dev, INTDISABLE, EnableNormal);
1247 bp->sleeping = 0;
1250 * It seems that the bmac can't receive until it's transmitted
1251 * a packet. So we give it a dummy packet to transmit.
1253 skb = dev_alloc_skb(ETHERMINPACKET);
1254 if (skb != NULL) {
1255 data = skb_put(skb, ETHERMINPACKET);
1256 memset(data, 0, ETHERMINPACKET);
1257 memcpy(data, dev->dev_addr, 6);
1258 memcpy(data+6, dev->dev_addr, 6);
1259 bmac_transmit_packet(skb, dev);
1261 spin_unlock_irqrestore(&bp->lock, flags);
1264 static int __devinit bmac_probe(struct macio_dev *mdev, const struct of_match *match)
1266 int j, rev, ret;
1267 struct bmac_data *bp;
1268 unsigned char *addr;
1269 struct net_device *dev;
1270 int is_bmac_plus = ((int)match->data) != 0;
1272 if (macio_resource_count(mdev) != 3 || macio_irq_count(mdev) != 3) {
1273 printk(KERN_ERR "BMAC: can't use, need 3 addrs and 3 intrs\n");
1274 return -ENODEV;
1276 addr = get_property(macio_get_of_node(mdev), "mac-address", NULL);
1277 if (addr == NULL) {
1278 addr = get_property(macio_get_of_node(mdev), "local-mac-address", NULL);
1279 if (addr == NULL) {
1280 printk(KERN_ERR "BMAC: Can't get mac-address\n");
1281 return -ENODEV;
1285 dev = alloc_etherdev(PRIV_BYTES);
1286 if (!dev) {
1287 printk(KERN_ERR "BMAC: alloc_etherdev failed, out of memory\n");
1288 return -ENOMEM;
1291 bp = netdev_priv(dev);
1292 SET_MODULE_OWNER(dev);
1293 SET_NETDEV_DEV(dev, &mdev->ofdev.dev);
1294 macio_set_drvdata(mdev, dev);
1296 bp->mdev = mdev;
1297 spin_lock_init(&bp->lock);
1299 if (macio_request_resources(mdev, "bmac")) {
1300 printk(KERN_ERR "BMAC: can't request IO resource !\n");
1301 goto out_free;
1304 dev->base_addr = (unsigned long)
1305 ioremap(macio_resource_start(mdev, 0), macio_resource_len(mdev, 0));
1306 if (dev->base_addr == 0)
1307 goto out_release;
1309 dev->irq = macio_irq(mdev, 0);
1311 bmac_enable_and_reset_chip(dev);
1312 bmwrite(dev, INTDISABLE, DisableAll);
1314 rev = addr[0] == 0 && addr[1] == 0xA0;
1315 for (j = 0; j < 6; ++j)
1316 dev->dev_addr[j] = rev? bitrev(addr[j]): addr[j];
1318 /* Enable chip without interrupts for now */
1319 bmac_enable_and_reset_chip(dev);
1320 bmwrite(dev, INTDISABLE, DisableAll);
1322 dev->open = bmac_open;
1323 dev->stop = bmac_close;
1324 dev->hard_start_xmit = bmac_output;
1325 dev->get_stats = bmac_stats;
1326 dev->set_multicast_list = bmac_set_multicast;
1327 dev->set_mac_address = bmac_set_address;
1329 bmac_get_station_address(dev, addr);
1330 if (bmac_verify_checksum(dev) != 0)
1331 goto err_out_iounmap;
1333 bp->is_bmac_plus = is_bmac_plus;
1334 bp->tx_dma = (volatile struct dbdma_regs *)
1335 ioremap(macio_resource_start(mdev, 1), macio_resource_len(mdev, 1));
1336 if (!bp->tx_dma)
1337 goto err_out_iounmap;
1338 bp->tx_dma_intr = macio_irq(mdev, 1);
1339 bp->rx_dma = (volatile struct dbdma_regs *)
1340 ioremap(macio_resource_start(mdev, 2), macio_resource_len(mdev, 2));
1341 if (!bp->rx_dma)
1342 goto err_out_iounmap_tx;
1343 bp->rx_dma_intr = macio_irq(mdev, 2);
1345 bp->tx_cmds = (volatile struct dbdma_cmd *) DBDMA_ALIGN(bp + 1);
1346 bp->rx_cmds = bp->tx_cmds + N_TX_RING + 1;
1348 bp->queue = (struct sk_buff_head *)(bp->rx_cmds + N_RX_RING + 1);
1349 skb_queue_head_init(bp->queue);
1351 init_timer(&bp->tx_timeout);
1353 ret = request_irq(dev->irq, bmac_misc_intr, 0, "BMAC-misc", dev);
1354 if (ret) {
1355 printk(KERN_ERR "BMAC: can't get irq %d\n", dev->irq);
1356 goto err_out_iounmap_rx;
1358 ret = request_irq(bp->tx_dma_intr, bmac_txdma_intr, 0, "BMAC-txdma", dev);
1359 if (ret) {
1360 printk(KERN_ERR "BMAC: can't get irq %d\n", bp->tx_dma_intr);
1361 goto err_out_irq0;
1363 ret = request_irq(bp->rx_dma_intr, bmac_rxdma_intr, 0, "BMAC-rxdma", dev);
1364 if (ret) {
1365 printk(KERN_ERR "BMAC: can't get irq %d\n", bp->rx_dma_intr);
1366 goto err_out_irq1;
1369 /* Mask chip interrupts and disable chip, will be
1370 * re-enabled on open()
1372 disable_irq(dev->irq);
1373 pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0);
1375 if (register_netdev(dev) != 0) {
1376 printk(KERN_ERR "BMAC: Ethernet registration failed\n");
1377 goto err_out_irq2;
1380 printk(KERN_INFO "%s: BMAC%s at", dev->name, (is_bmac_plus? "+": ""));
1381 for (j = 0; j < 6; ++j)
1382 printk("%c%.2x", (j? ':': ' '), dev->dev_addr[j]);
1383 XXDEBUG((", base_addr=%#0lx", dev->base_addr));
1384 printk("\n");
1386 return 0;
1388 err_out_irq2:
1389 free_irq(bp->rx_dma_intr, dev);
1390 err_out_irq1:
1391 free_irq(bp->tx_dma_intr, dev);
1392 err_out_irq0:
1393 free_irq(dev->irq, dev);
1394 err_out_iounmap_rx:
1395 iounmap((void *)bp->rx_dma);
1396 err_out_iounmap_tx:
1397 iounmap((void *)bp->tx_dma);
1398 err_out_iounmap:
1399 iounmap((void *)dev->base_addr);
1400 out_release:
1401 macio_release_resources(mdev);
1402 out_free:
1403 pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0);
1404 free_netdev(dev);
1406 return -ENODEV;
1409 static int bmac_open(struct net_device *dev)
1411 struct bmac_data *bp = netdev_priv(dev);
1412 /* XXDEBUG(("bmac: enter open\n")); */
1413 /* reset the chip */
1414 bp->opened = 1;
1415 bmac_reset_and_enable(dev);
1416 enable_irq(dev->irq);
1417 dev->flags |= IFF_RUNNING;
1418 return 0;
1421 static int bmac_close(struct net_device *dev)
1423 struct bmac_data *bp = netdev_priv(dev);
1424 volatile struct dbdma_regs *rd = bp->rx_dma;
1425 volatile struct dbdma_regs *td = bp->tx_dma;
1426 unsigned short config;
1427 int i;
1429 bp->sleeping = 1;
1430 dev->flags &= ~(IFF_UP | IFF_RUNNING);
1432 /* disable rx and tx */
1433 config = bmread(dev, RXCFG);
1434 bmwrite(dev, RXCFG, (config & ~RxMACEnable));
1436 config = bmread(dev, TXCFG);
1437 bmwrite(dev, TXCFG, (config & ~TxMACEnable));
1439 bmwrite(dev, INTDISABLE, DisableAll); /* disable all intrs */
1441 /* disable rx and tx dma */
1442 st_le32(&rd->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */
1443 st_le32(&td->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE)); /* clear run bit */
1445 /* free some skb's */
1446 XXDEBUG(("bmac: free rx bufs\n"));
1447 for (i=0; i<N_RX_RING; i++) {
1448 if (bp->rx_bufs[i] != NULL) {
1449 dev_kfree_skb(bp->rx_bufs[i]);
1450 bp->rx_bufs[i] = NULL;
1453 XXDEBUG(("bmac: free tx bufs\n"));
1454 for (i = 0; i<N_TX_RING; i++) {
1455 if (bp->tx_bufs[i] != NULL) {
1456 dev_kfree_skb(bp->tx_bufs[i]);
1457 bp->tx_bufs[i] = NULL;
1460 XXDEBUG(("bmac: all bufs freed\n"));
1462 bp->opened = 0;
1463 disable_irq(dev->irq);
1464 pmac_call_feature(PMAC_FTR_BMAC_ENABLE, macio_get_of_node(bp->mdev), 0, 0);
1466 return 0;
1469 static void
1470 bmac_start(struct net_device *dev)
1472 struct bmac_data *bp = netdev_priv(dev);
1473 int i;
1474 struct sk_buff *skb;
1475 unsigned long flags;
1477 if (bp->sleeping)
1478 return;
1480 spin_lock_irqsave(&bp->lock, flags);
1481 while (1) {
1482 i = bp->tx_fill + 1;
1483 if (i >= N_TX_RING)
1484 i = 0;
1485 if (i == bp->tx_empty)
1486 break;
1487 skb = skb_dequeue(bp->queue);
1488 if (skb == NULL)
1489 break;
1490 bmac_transmit_packet(skb, dev);
1492 spin_unlock_irqrestore(&bp->lock, flags);
1495 static int
1496 bmac_output(struct sk_buff *skb, struct net_device *dev)
1498 struct bmac_data *bp = netdev_priv(dev);
1499 skb_queue_tail(bp->queue, skb);
1500 bmac_start(dev);
1501 return 0;
1504 static void bmac_tx_timeout(unsigned long data)
1506 struct net_device *dev = (struct net_device *) data;
1507 struct bmac_data *bp = netdev_priv(dev);
1508 volatile struct dbdma_regs *td = bp->tx_dma;
1509 volatile struct dbdma_regs *rd = bp->rx_dma;
1510 volatile struct dbdma_cmd *cp;
1511 unsigned long flags;
1512 unsigned short config, oldConfig;
1513 int i;
1515 XXDEBUG(("bmac: tx_timeout called\n"));
1516 spin_lock_irqsave(&bp->lock, flags);
1517 bp->timeout_active = 0;
1519 /* update various counters */
1520 /* bmac_handle_misc_intrs(bp, 0); */
1522 cp = &bp->tx_cmds[bp->tx_empty];
1523 /* XXDEBUG((KERN_DEBUG "bmac: tx dmastat=%x %x runt=%d pr=%x fs=%x fc=%x\n", */
1524 /* ld_le32(&td->status), ld_le16(&cp->xfer_status), bp->tx_bad_runt, */
1525 /* mb->pr, mb->xmtfs, mb->fifofc)); */
1527 /* turn off both tx and rx and reset the chip */
1528 config = bmread(dev, RXCFG);
1529 bmwrite(dev, RXCFG, (config & ~RxMACEnable));
1530 config = bmread(dev, TXCFG);
1531 bmwrite(dev, TXCFG, (config & ~TxMACEnable));
1532 out_le32(&td->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE|ACTIVE|DEAD));
1533 printk(KERN_ERR "bmac: transmit timeout - resetting\n");
1534 bmac_enable_and_reset_chip(dev);
1536 /* restart rx dma */
1537 cp = bus_to_virt(ld_le32(&rd->cmdptr));
1538 out_le32(&rd->control, DBDMA_CLEAR(RUN|PAUSE|FLUSH|WAKE|ACTIVE|DEAD));
1539 out_le16(&cp->xfer_status, 0);
1540 out_le32(&rd->cmdptr, virt_to_bus(cp));
1541 out_le32(&rd->control, DBDMA_SET(RUN|WAKE));
1543 /* fix up the transmit side */
1544 XXDEBUG((KERN_DEBUG "bmac: tx empty=%d fill=%d fullup=%d\n",
1545 bp->tx_empty, bp->tx_fill, bp->tx_fullup));
1546 i = bp->tx_empty;
1547 ++bp->stats.tx_errors;
1548 if (i != bp->tx_fill) {
1549 dev_kfree_skb(bp->tx_bufs[i]);
1550 bp->tx_bufs[i] = NULL;
1551 if (++i >= N_TX_RING) i = 0;
1552 bp->tx_empty = i;
1554 bp->tx_fullup = 0;
1555 netif_wake_queue(dev);
1556 if (i != bp->tx_fill) {
1557 cp = &bp->tx_cmds[i];
1558 out_le16(&cp->xfer_status, 0);
1559 out_le16(&cp->command, OUTPUT_LAST);
1560 out_le32(&td->cmdptr, virt_to_bus(cp));
1561 out_le32(&td->control, DBDMA_SET(RUN));
1562 /* bmac_set_timeout(dev); */
1563 XXDEBUG((KERN_DEBUG "bmac: starting %d\n", i));
1566 /* turn it back on */
1567 oldConfig = bmread(dev, RXCFG);
1568 bmwrite(dev, RXCFG, oldConfig | RxMACEnable );
1569 oldConfig = bmread(dev, TXCFG);
1570 bmwrite(dev, TXCFG, oldConfig | TxMACEnable );
1572 spin_unlock_irqrestore(&bp->lock, flags);
1575 #if 0
1576 static void dump_dbdma(volatile struct dbdma_cmd *cp,int count)
1578 int i,*ip;
1580 for (i=0;i< count;i++) {
1581 ip = (int*)(cp+i);
1583 printk("dbdma req 0x%x addr 0x%x baddr 0x%x xfer/res 0x%x\n",
1584 ld_le32(ip+0),
1585 ld_le32(ip+1),
1586 ld_le32(ip+2),
1587 ld_le32(ip+3));
1591 #endif
1593 #if 0
1594 static int
1595 bmac_proc_info(char *buffer, char **start, off_t offset, int length)
1597 int len = 0;
1598 off_t pos = 0;
1599 off_t begin = 0;
1600 int i;
1602 if (bmac_devs == NULL)
1603 return (-ENOSYS);
1605 len += sprintf(buffer, "BMAC counters & registers\n");
1607 for (i = 0; i<N_REG_ENTRIES; i++) {
1608 len += sprintf(buffer + len, "%s: %#08x\n",
1609 reg_entries[i].name,
1610 bmread(bmac_devs, reg_entries[i].reg_offset));
1611 pos = begin + len;
1613 if (pos < offset) {
1614 len = 0;
1615 begin = pos;
1618 if (pos > offset+length) break;
1621 *start = buffer + (offset - begin);
1622 len -= (offset - begin);
1624 if (len > length) len = length;
1626 return len;
1628 #endif
1630 static int __devexit bmac_remove(struct macio_dev *mdev)
1632 struct net_device *dev = macio_get_drvdata(mdev);
1633 struct bmac_data *bp = netdev_priv(dev);
1635 unregister_netdev(dev);
1637 free_irq(dev->irq, dev);
1638 free_irq(bp->tx_dma_intr, dev);
1639 free_irq(bp->rx_dma_intr, dev);
1641 iounmap((void *)dev->base_addr);
1642 iounmap((void *)bp->tx_dma);
1643 iounmap((void *)bp->rx_dma);
1645 macio_release_resources(mdev);
1647 free_netdev(dev);
1649 return 0;
1652 static struct of_match bmac_match[] =
1655 .name = "bmac",
1656 .type = OF_ANY_MATCH,
1657 .compatible = OF_ANY_MATCH,
1658 .data = (void *)0,
1661 .name = OF_ANY_MATCH,
1662 .type = "network",
1663 .compatible = "bmac+",
1664 .data = (void *)1,
1669 static struct macio_driver bmac_driver =
1671 .name = "bmac",
1672 .match_table = bmac_match,
1673 .probe = bmac_probe,
1674 .remove = bmac_remove,
1675 #ifdef CONFIG_PM
1676 .suspend = bmac_suspend,
1677 .resume = bmac_resume,
1678 #endif
1682 static int __init bmac_init(void)
1684 if (bmac_emergency_rxbuf == NULL) {
1685 bmac_emergency_rxbuf = kmalloc(RX_BUFLEN, GFP_KERNEL);
1686 if (bmac_emergency_rxbuf == NULL) {
1687 printk(KERN_ERR "BMAC: can't allocate emergency RX buffer\n");
1688 return -ENOMEM;
1692 return macio_register_driver(&bmac_driver);
1695 static void __exit bmac_exit(void)
1697 macio_unregister_driver(&bmac_driver);
1699 if (bmac_emergency_rxbuf != NULL) {
1700 kfree(bmac_emergency_rxbuf);
1701 bmac_emergency_rxbuf = NULL;
1705 MODULE_AUTHOR("Randy Gobbel/Paul Mackerras");
1706 MODULE_DESCRIPTION("PowerMac BMAC ethernet driver.");
1707 MODULE_LICENSE("GPL");
1709 module_init(bmac_init);
1710 module_exit(bmac_exit);