~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/drivers/net/sunhme.c

Version: ~ [ 2.2.5 ] ~ [ 2.4.1 ] ~ [ 2.4.9 ] ~ [ 2.6.17.10 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* $Id: sunhme.c,v 1.122 2001/08/13 14:40:07 davem Exp $
  2  * sunhme.c: Sparc HME/BigMac 10/100baseT half/full duplex auto switching,
  3  *           auto carrier detecting ethernet driver.  Also known as the
  4  *           "Happy Meal Ethernet" found on SunSwift SBUS cards.
  5  *
  6  * Copyright (C) 1996, 1998, 1999 David S. Miller (davem@redhat.com)
  7  *
  8  * Changes :
  9  * 2000/11/11 Willy Tarreau <willy AT meta-x.org>
 10  *   - port to non-sparc architectures. Tested only on x86 and
 11  *     only currently works with QFE PCI cards.
 12  *   - ability to specify the MAC address at module load time by passing this
 13  *     argument : macaddr=0x00,0x10,0x20,0x30,0x40,0x50
 14  */
 15 
 16 static char version[] =
 17         "sunhme.c:v1.99 12/Sep/99 David S. Miller (davem@redhat.com)\n";
 18 
 19 #include <linux/module.h>
 20 
 21 #include <linux/config.h>
 22 #include <linux/kernel.h>
 23 #include <linux/sched.h>
 24 #include <linux/types.h>
 25 #include <linux/fcntl.h>
 26 #include <linux/interrupt.h>
 27 #include <linux/ptrace.h>
 28 #include <linux/ioport.h>
 29 #include <linux/in.h>
 30 #include <linux/slab.h>
 31 #include <linux/string.h>
 32 #include <linux/delay.h>
 33 #include <linux/init.h>
 34 #include <linux/ethtool.h>
 35 #include <linux/mii.h>
 36 #include <asm/system.h>
 37 #include <asm/bitops.h>
 38 #include <asm/io.h>
 39 #include <asm/dma.h>
 40 #include <linux/errno.h>
 41 #include <asm/byteorder.h>
 42 
 43 #ifdef __sparc__
 44 #include <asm/idprom.h>
 45 #include <asm/sbus.h>
 46 #include <asm/openprom.h>
 47 #include <asm/oplib.h>
 48 #include <asm/auxio.h>
 49 #ifndef __sparc_v9__
 50 #include <asm/io-unit.h>
 51 #endif
 52 #endif
 53 #include <asm/uaccess.h>
 54 
 55 #include <asm/pgtable.h>
 56 #include <asm/irq.h>
 57 
 58 #include <linux/netdevice.h>
 59 #include <linux/etherdevice.h>
 60 #include <linux/skbuff.h>
 61 
 62 #ifdef CONFIG_PCI
 63 #include <linux/pci.h>
 64 #ifdef __sparc__
 65 #include <asm/pbm.h>
 66 #endif
 67 #endif
 68 
 69 #include "sunhme.h"
 70 
 71 
 72 static int macaddr[6];
 73 
 74 /* accept MAC address of the form macaddr=0x08,0x00,0x20,0x30,0x40,0x50 */
 75 MODULE_PARM(macaddr, "6i");
 76 MODULE_PARM_DESC(macaddr, "Happy Meal MAC address to set");
 77 
 78 static struct happy_meal *root_happy_dev;
 79 
 80 #ifdef CONFIG_SBUS
 81 static struct quattro *qfe_sbus_list;
 82 #endif
 83 
 84 #ifdef CONFIG_PCI
 85 static struct quattro *qfe_pci_list;
 86 #endif
 87 
 88 #undef HMEDEBUG
 89 #undef SXDEBUG
 90 #undef RXDEBUG
 91 #undef TXDEBUG
 92 #undef TXLOGGING
 93 
 94 #ifdef TXLOGGING
 95 struct hme_tx_logent {
 96         unsigned int tstamp;
 97         int tx_new, tx_old;
 98         unsigned int action;
 99 #define TXLOG_ACTION_IRQ        0x01
100 #define TXLOG_ACTION_TXMIT      0x02
101 #define TXLOG_ACTION_TBUSY      0x04
102 #define TXLOG_ACTION_NBUFS      0x08
103         unsigned int status;
104 };
105 #define TX_LOG_LEN      128
106 static struct hme_tx_logent tx_log[TX_LOG_LEN];
107 static int txlog_cur_entry;
108 static __inline__ void tx_add_log(struct happy_meal *hp, unsigned int a, unsigned int s)
109 {
110         struct hme_tx_logent *tlp;
111         unsigned long flags;
112 
113         save_and_cli(flags);
114         tlp = &tx_log[txlog_cur_entry];
115         tlp->tstamp = (unsigned int)jiffies;
116         tlp->tx_new = hp->tx_new;
117         tlp->tx_old = hp->tx_old;
118         tlp->action = a;
119         tlp->status = s;
120         txlog_cur_entry = (txlog_cur_entry + 1) & (TX_LOG_LEN - 1);
121         restore_flags(flags);
122 }
123 static __inline__ void tx_dump_log(void)
124 {
125         int i, this;
126 
127         this = txlog_cur_entry;
128         for (i = 0; i < TX_LOG_LEN; i++) {
129                 printk("TXLOG[%d]: j[%08x] tx[N(%d)O(%d)] action[%08x] stat[%08x]\n", i,
130                        tx_log[this].tstamp,
131                        tx_log[this].tx_new, tx_log[this].tx_old,
132                        tx_log[this].action, tx_log[this].status);
133                 this = (this + 1) & (TX_LOG_LEN - 1);
134         }
135 }
136 static __inline__ void tx_dump_ring(struct happy_meal *hp)
137 {
138         struct hmeal_init_block *hb = hp->happy_block;
139         struct happy_meal_txd *tp = &hb->happy_meal_txd[0];
140         int i;
141 
142         for (i = 0; i < TX_RING_SIZE; i+=4) {
143                 printk("TXD[%d..%d]: [%08x:%08x] [%08x:%08x] [%08x:%08x] [%08x:%08x]\n",
144                        i, i + 4,
145                        le32_to_cpu(tp[i].tx_flags), le32_to_cpu(tp[i].tx_addr),
146                        le32_to_cpu(tp[i + 1].tx_flags), le32_to_cpu(tp[i + 1].tx_addr),
147                        le32_to_cpu(tp[i + 2].tx_flags), le32_to_cpu(tp[i + 2].tx_addr),
148                        le32_to_cpu(tp[i + 3].tx_flags), le32_to_cpu(tp[i + 3].tx_addr));
149         }
150 }
151 #else
152 #define tx_add_log(hp, a, s)            do { } while(0)
153 #define tx_dump_log()                   do { } while(0)
154 #define tx_dump_ring(hp)                do { } while(0)
155 #endif
156 
157 #ifdef HMEDEBUG
158 #define HMD(x)  printk x
159 #else
160 #define HMD(x)
161 #endif
162 
163 /* #define AUTO_SWITCH_DEBUG */
164 
165 #ifdef AUTO_SWITCH_DEBUG
166 #define ASD(x)  printk x
167 #else
168 #define ASD(x)
169 #endif
170 
171 #define DEFAULT_IPG0      16 /* For lance-mode only */
172 #define DEFAULT_IPG1       8 /* For all modes */
173 #define DEFAULT_IPG2       4 /* For all modes */
174 #define DEFAULT_JAMSIZE    4 /* Toe jam */
175 
176 #ifdef CONFIG_PCI
177 /* This happy_pci_ids is declared __initdata because it is only used
178    as an advisory to depmod.  If this is ported to the new PCI interface
179    where it could be referenced at any time due to hot plugging,
180    it should be changed to __devinitdata. */
181 
182 struct pci_device_id happymeal_pci_ids[] __initdata = {
183         {
184           vendor: PCI_VENDOR_ID_SUN,
185           device: PCI_DEVICE_ID_SUN_HAPPYMEAL,
186           subvendor: PCI_ANY_ID,
187           subdevice: PCI_ANY_ID,
188         },
189         { }                     /* Terminating entry */
190 };
191 
192 MODULE_DEVICE_TABLE(pci, happymeal_pci_ids);
193 #endif
194 
195 /* NOTE: In the descriptor writes one _must_ write the address
196  *       member _first_.  The card must not be allowed to see
197  *       the updated descriptor flags until the address is
198  *       correct.  I've added a write memory barrier between
199  *       the two stores so that I can sleep well at night... -DaveM
200  */
201 
202 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
203 static void sbus_hme_write32(unsigned long reg, u32 val)
204 {
205         sbus_writel(val, reg);
206 }
207 
208 static u32 sbus_hme_read32(unsigned long reg)
209 {
210         return sbus_readl(reg);
211 }
212 
213 static void sbus_hme_write_rxd(struct happy_meal_rxd *rxd, u32 flags, u32 addr)
214 {
215         rxd->rx_addr = addr;
216         wmb();
217         rxd->rx_flags = flags;
218 }
219 
220 static void sbus_hme_write_txd(struct happy_meal_txd *txd, u32 flags, u32 addr)
221 {
222         txd->tx_addr = addr;
223         wmb();
224         txd->tx_flags = flags;
225 }
226 
227 static u32 sbus_hme_read_desc32(u32 *p)
228 {
229         return *p;
230 }
231 
232 static void pci_hme_write32(unsigned long reg, u32 val)
233 {
234         writel(val, reg);
235 }
236 
237 static u32 pci_hme_read32(unsigned long reg)
238 {
239         return readl(reg);
240 }
241 
242 static void pci_hme_write_rxd(struct happy_meal_rxd *rxd, u32 flags, u32 addr)
243 {
244         rxd->rx_addr = cpu_to_le32(addr);
245         wmb();
246         rxd->rx_flags = cpu_to_le32(flags);
247 }
248 
249 static void pci_hme_write_txd(struct happy_meal_txd *txd, u32 flags, u32 addr)
250 {
251         txd->tx_addr = cpu_to_le32(addr);
252         wmb();
253         txd->tx_flags = cpu_to_le32(flags);
254 }
255 
256 static u32 pci_hme_read_desc32(u32 *p)
257 {
258         return cpu_to_le32p(p);
259 }
260 
261 #define hme_write32(__hp, __reg, __val) \
262         ((__hp)->write32((__reg), (__val)))
263 #define hme_read32(__hp, __reg) \
264         ((__hp)->read32(__reg))
265 #define hme_write_rxd(__hp, __rxd, __flags, __addr) \
266         ((__hp)->write_rxd((__rxd), (__flags), (__addr)))
267 #define hme_write_txd(__hp, __txd, __flags, __addr) \
268         ((__hp)->write_txd((__txd), (__flags), (__addr)))
269 #define hme_read_desc32(__hp, __p) \
270         ((__hp)->read_desc32(__p))
271 #define hme_dma_map(__hp, __ptr, __size, __dir) \
272         ((__hp)->dma_map((__hp)->happy_dev, (__ptr), (__size), (__dir)))
273 #define hme_dma_unmap(__hp, __addr, __size, __dir) \
274         ((__hp)->dma_unmap((__hp)->happy_dev, (__addr), (__size), (__dir)))
275 #define hme_dma_sync(__hp, __addr, __size, __dir) \
276         ((__hp)->dma_sync((__hp)->happy_dev, (__addr), (__size), (__dir)))
277 #else
278 #ifdef CONFIG_SBUS
279 /* SBUS only compilation */
280 #define hme_write32(__hp, __reg, __val) \
281         sbus_writel((__val), (__reg))
282 #define hme_read32(__hp, __reg) \
283         sbus_readl(__reg)
284 #define hme_write_rxd(__hp, __rxd, __flags, __addr) \
285 do {    (__rxd)->rx_addr = (__addr); \
286         wmb(); \
287         (__rxd)->rx_flags = (__flags); \
288 } while(0)
289 #define hme_write_txd(__hp, __txd, __flags, __addr) \
290 do {    (__txd)->tx_addr = (__addr); \
291         wmb(); \
292         (__txd)->tx_flags = (__flags); \
293 } while(0)
294 #define hme_read_desc32(__hp, __p)      (*(__p))
295 #define hme_dma_map(__hp, __ptr, __size, __dir) \
296         sbus_map_single((__hp)->happy_dev, (__ptr), (__size), (__dir))
297 #define hme_dma_unmap(__hp, __addr, __size, __dir) \
298         sbus_unmap_single((__hp)->happy_dev, (__addr), (__size), (__dir))
299 #define hme_dma_sync(__hp, __addr, __size, __dir) \
300         sbus_dma_sync_single((__hp)->happy_dev, (__addr), (__size), (__dir))
301 #else
302 /* PCI only compilation */
303 #define hme_write32(__hp, __reg, __val) \
304         writel((__val), (__reg))
305 #define hme_read32(__hp, __reg) \
306         readl(__reg)
307 #define hme_write_rxd(__hp, __rxd, __flags, __addr) \
308 do {    (__rxd)->rx_addr = cpu_to_le32(__addr); \
309         wmb(); \
310         (__rxd)->rx_flags = cpu_to_le32(__flags); \
311 } while(0)
312 #define hme_write_txd(__hp, __txd, __flags, __addr) \
313 do {    (__txd)->tx_addr = cpu_to_le32(__addr); \
314         wmb(); \
315         (__txd)->tx_flags = cpu_to_le32(__flags); \
316 } while(0)
317 #define hme_read_desc32(__hp, __p)      cpu_to_le32p(__p)
318 #define hme_dma_map(__hp, __ptr, __size, __dir) \
319         pci_map_single((__hp)->happy_dev, (__ptr), (__size), (__dir))
320 #define hme_dma_unmap(__hp, __addr, __size, __dir) \
321         pci_unmap_single((__hp)->happy_dev, (__addr), (__size), (__dir))
322 #define hme_dma_sync(__hp, __addr, __size, __dir) \
323         pci_dma_sync_single((__hp)->happy_dev, (__addr), (__size), (__dir))
324 #endif
325 #endif
326 
327 
328 #ifdef SBUS_DMA_BIDIRECTIONAL
329 #       define DMA_BIDIRECTIONAL        SBUS_DMA_BIDIRECTIONAL
330 #else
331 #       define DMA_BIDIRECTIONAL        0
332 #endif
333 
334 #ifdef SBUS_DMA_FROMDEVICE
335 #       define DMA_FROMDEVICE           SBUS_DMA_FROMDEVICE
336 #else
337 #       define DMA_TODEVICE             1
338 #endif
339 
340 #ifdef SBUS_DMA_TODEVICE
341 #       define DMA_TODEVICE             SBUS_DMA_TODEVICE
342 #else
343 #       define DMA_FROMDEVICE           2
344 #endif
345 
346 
347 /* Oh yes, the MIF BitBang is mighty fun to program.  BitBucket is more like it. */
348 static void BB_PUT_BIT(struct happy_meal *hp, unsigned long tregs, int bit)
349 {
350         hme_write32(hp, tregs + TCVR_BBDATA, bit);
351         hme_write32(hp, tregs + TCVR_BBCLOCK, 0);
352         hme_write32(hp, tregs + TCVR_BBCLOCK, 1);
353 }
354 
355 #if 0
356 static u32 BB_GET_BIT(struct happy_meal *hp, unsigned long tregs, int internal)
357 {
358         u32 ret;
359 
360         hme_write32(hp, tregs + TCVR_BBCLOCK, 0);
361         hme_write32(hp, tregs + TCVR_BBCLOCK, 1);
362         ret = hme_read32(hp, tregs + TCVR_CFG);
363         if (internal)
364                 ret &= TCV_CFG_MDIO0;
365         else
366                 ret &= TCV_CFG_MDIO1;
367 
368         return ret;
369 }
370 #endif
371 
372 static u32 BB_GET_BIT2(struct happy_meal *hp, unsigned long tregs, int internal)
373 {
374         u32 retval;
375 
376         hme_write32(hp, tregs + TCVR_BBCLOCK, 0);
377         udelay(1);
378         retval = hme_read32(hp, tregs + TCVR_CFG);
379         if (internal)
380                 retval &= TCV_CFG_MDIO0;
381         else
382                 retval &= TCV_CFG_MDIO1;
383         hme_write32(hp, tregs + TCVR_BBCLOCK, 1);
384 
385         return retval;
386 }
387 
388 #define TCVR_FAILURE      0x80000000     /* Impossible MIF read value */
389 
390 static int happy_meal_bb_read(struct happy_meal *hp,
391                               unsigned long tregs, int reg)
392 {
393         u32 tmp;
394         int retval = 0;
395         int i;
396 
397         ASD(("happy_meal_bb_read: reg=%d ", reg));
398 
399         /* Enable the MIF BitBang outputs. */
400         hme_write32(hp, tregs + TCVR_BBOENAB, 1);
401 
402         /* Force BitBang into the idle state. */
403         for (i = 0; i < 32; i++)
404                 BB_PUT_BIT(hp, tregs, 1);
405 
406         /* Give it the read sequence. */
407         BB_PUT_BIT(hp, tregs, 0);
408         BB_PUT_BIT(hp, tregs, 1);
409         BB_PUT_BIT(hp, tregs, 1);
410         BB_PUT_BIT(hp, tregs, 0);
411 
412         /* Give it the PHY address. */
413         tmp = hp->paddr & 0xff;
414         for (i = 4; i >= 0; i--)
415                 BB_PUT_BIT(hp, tregs, ((tmp >> i) & 1));
416 
417         /* Tell it what register we want to read. */
418         tmp = (reg & 0xff);
419         for (i = 4; i >= 0; i--)
420                 BB_PUT_BIT(hp, tregs, ((tmp >> i) & 1));
421 
422         /* Close down the MIF BitBang outputs. */
423         hme_write32(hp, tregs + TCVR_BBOENAB, 0);
424 
425         /* Now read in the value. */
426         (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal));
427         for (i = 15; i >= 0; i--)
428                 retval |= BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal));
429         (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal));
430         (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal));
431         (void) BB_GET_BIT2(hp, tregs, (hp->tcvr_type == internal));
432         ASD(("value=%x\n", retval));
433         return retval;
434 }
435 
436 static void happy_meal_bb_write(struct happy_meal *hp,
437                                 unsigned long tregs, int reg,
438                                 unsigned short value)
439 {
440         u32 tmp;
441         int i;
442 
443         ASD(("happy_meal_bb_write: reg=%d value=%x\n", reg, value));
444 
445         /* Enable the MIF BitBang outputs. */
446         hme_write32(hp, tregs + TCVR_BBOENAB, 1);
447 
448         /* Force BitBang into the idle state. */
449         for (i = 0; i < 32; i++)
450                 BB_PUT_BIT(hp, tregs, 1);
451 
452         /* Give it write sequence. */
453         BB_PUT_BIT(hp, tregs, 0);
454         BB_PUT_BIT(hp, tregs, 1);
455         BB_PUT_BIT(hp, tregs, 0);
456         BB_PUT_BIT(hp, tregs, 1);
457 
458         /* Give it the PHY address. */
459         tmp = (hp->paddr & 0xff);
460         for (i = 4; i >= 0; i--)
461                 BB_PUT_BIT(hp, tregs, ((tmp >> i) & 1));
462 
463         /* Tell it what register we will be writing. */
464         tmp = (reg & 0xff);
465         for (i = 4; i >= 0; i--)
466                 BB_PUT_BIT(hp, tregs, ((tmp >> i) & 1));
467 
468         /* Tell it to become ready for the bits. */
469         BB_PUT_BIT(hp, tregs, 1);
470         BB_PUT_BIT(hp, tregs, 0);
471 
472         for (i = 15; i >= 0; i--)
473                 BB_PUT_BIT(hp, tregs, ((value >> i) & 1));
474 
475         /* Close down the MIF BitBang outputs. */
476         hme_write32(hp, tregs + TCVR_BBOENAB, 0);
477 }
478 
479 #define TCVR_READ_TRIES   16
480 
481 static int happy_meal_tcvr_read(struct happy_meal *hp,
482                                 unsigned long tregs, int reg)
483 {
484         int tries = TCVR_READ_TRIES;
485         int retval;
486 
487         ASD(("happy_meal_tcvr_read: reg=0x%02x ", reg));
488         if (hp->tcvr_type == none) {
489                 ASD(("no transceiver, value=TCVR_FAILURE\n"));
490                 return TCVR_FAILURE;
491         }
492 
493         if (!(hp->happy_flags & HFLAG_FENABLE)) {
494                 ASD(("doing bit bang\n"));
495                 return happy_meal_bb_read(hp, tregs, reg);
496         }
497 
498         hme_write32(hp, tregs + TCVR_FRAME,
499                     (FRAME_READ | (hp->paddr << 23) | ((reg & 0xff) << 18)));
500         while (!(hme_read32(hp, tregs + TCVR_FRAME) & 0x10000) && --tries)
501                 udelay(20);
502         if (!tries) {
503                 printk(KERN_ERR "happy meal: Aieee, transceiver MIF read bolixed\n");
504                 return TCVR_FAILURE;
505         }
506         retval = hme_read32(hp, tregs + TCVR_FRAME) & 0xffff;
507         ASD(("value=%04x\n", retval));
508         return retval;
509 }
510 
511 #define TCVR_WRITE_TRIES  16
512 
513 static void happy_meal_tcvr_write(struct happy_meal *hp,
514                                   unsigned long tregs, int reg,
515                                   unsigned short value)
516 {
517         int tries = TCVR_WRITE_TRIES;
518         
519         ASD(("happy_meal_tcvr_write: reg=0x%02x value=%04x\n", reg, value));
520 
521         /* Welcome to Sun Microsystems, can I take your order please? */
522         if (!hp->happy_flags & HFLAG_FENABLE)
523                 return happy_meal_bb_write(hp, tregs, reg, value);
524 
525         /* Would you like fries with that? */
526         hme_write32(hp, tregs + TCVR_FRAME,
527                     (FRAME_WRITE | (hp->paddr << 23) |
528                      ((reg & 0xff) << 18) | (value & 0xffff)));
529         while (!(hme_read32(hp, tregs + TCVR_FRAME) & 0x10000) && --tries)
530                 udelay(20);
531 
532         /* Anything else? */
533         if (!tries)
534                 printk(KERN_ERR "happy meal: Aieee, transceiver MIF write bolixed\n");
535 
536         /* Fifty-two cents is your change, have a nice day. */
537 }
538 
539 /* Auto negotiation.  The scheme is very simple.  We have a timer routine
540  * that keeps watching the auto negotiation process as it progresses.
541  * The DP83840 is first told to start doing it's thing, we set up the time
542  * and place the timer state machine in it's initial state.
543  *
544  * Here the timer peeks at the DP83840 status registers at each click to see
545  * if the auto negotiation has completed, we assume here that the DP83840 PHY
546  * will time out at some point and just tell us what (didn't) happen.  For
547  * complete coverage we only allow so many of the ticks at this level to run,
548  * when this has expired we print a warning message and try another strategy.
549  * This "other" strategy is to force the interface into various speed/duplex
550  * configurations and we stop when we see a link-up condition before the
551  * maximum number of "peek" ticks have occurred.
552  *
553  * Once a valid link status has been detected we configure the BigMAC and
554  * the rest of the Happy Meal to speak the most efficient protocol we could
555  * get a clean link for.  The priority for link configurations, highest first
556  * is:
557  *                 100 Base-T Full Duplex
558  *                 100 Base-T Half Duplex
559  *                 10 Base-T Full Duplex
560  *                 10 Base-T Half Duplex
561  *
562  * We start a new timer now, after a successful auto negotiation status has
563  * been detected.  This timer just waits for the link-up bit to get set in
564  * the BMCR of the DP83840.  When this occurs we print a kernel log message
565  * describing the link type in use and the fact that it is up.
566  *
567  * If a fatal error of some sort is signalled and detected in the interrupt
568  * service routine, and the chip is reset, or the link is ifconfig'd down
569  * and then back up, this entire process repeats itself all over again.
570  */
571 static int try_next_permutation(struct happy_meal *hp, unsigned long tregs)
572 {
573         hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
574 
575         /* Downgrade from full to half duplex.  Only possible
576          * via ethtool.
577          */
578         if (hp->sw_bmcr & BMCR_FULLDPLX) {
579                 hp->sw_bmcr &= ~(BMCR_FULLDPLX);
580                 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
581                 return 0;
582         }
583 
584         /* Downgrade from 100 to 10. */
585         if (hp->sw_bmcr & BMCR_SPEED100) {
586                 hp->sw_bmcr &= ~(BMCR_SPEED100);
587                 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
588                 return 0;
589         }
590 
591         /* We've tried everything. */
592         return -1;
593 }
594 
595 static void display_link_mode(struct happy_meal *hp, unsigned long tregs)
596 {
597         printk(KERN_INFO "%s: Link is up using ", hp->dev->name);
598         if (hp->tcvr_type == external)
599                 printk("external ");
600         else
601                 printk("internal ");
602         printk("transceiver at ");
603         hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA);
604         if (hp->sw_lpa & (LPA_100HALF | LPA_100FULL)) {
605                 if (hp->sw_lpa & LPA_100FULL)
606                         printk("100Mb/s, Full Duplex.\n");
607                 else
608                         printk("100Mb/s, Half Duplex.\n");
609         } else {
610                 if (hp->sw_lpa & LPA_10FULL)
611                         printk("10Mb/s, Full Duplex.\n");
612                 else
613                         printk("10Mb/s, Half Duplex.\n");
614         }
615 }
616 
617 static void display_forced_link_mode(struct happy_meal *hp, unsigned long tregs)
618 {
619         printk(KERN_INFO "%s: Link has been forced up using ", hp->dev->name);
620         if (hp->tcvr_type == external)
621                 printk("external ");
622         else
623                 printk("internal ");
624         printk("transceiver at ");
625         hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
626         if (hp->sw_bmcr & BMCR_SPEED100)
627                 printk("100Mb/s, ");
628         else
629                 printk("10Mb/s, ");
630         if (hp->sw_bmcr & BMCR_FULLDPLX)
631                 printk("Full Duplex.\n");
632         else
633                 printk("Half Duplex.\n");
634 }
635 
636 static int set_happy_link_modes(struct happy_meal *hp, unsigned long tregs)
637 {
638         int full;
639 
640         /* All we care about is making sure the bigmac tx_cfg has a
641          * proper duplex setting.
642          */
643         if (hp->timer_state == arbwait) {
644                 hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA);
645                 if (!(hp->sw_lpa & (LPA_10HALF | LPA_10FULL | LPA_100HALF | LPA_100FULL)))
646                         goto no_response;
647                 if (hp->sw_lpa & LPA_100FULL)
648                         full = 1;
649                 else if (hp->sw_lpa & LPA_100HALF)
650                         full = 0;
651                 else if (hp->sw_lpa & LPA_10FULL)
652                         full = 1;
653                 else
654                         full = 0;
655         } else {
656                 /* Forcing a link mode. */
657                 hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
658                 if (hp->sw_bmcr & BMCR_FULLDPLX)
659                         full = 1;
660                 else
661                         full = 0;
662         }
663 
664         /* Before changing other bits in the tx_cfg register, and in
665          * general any of other the TX config registers too, you
666          * must:
667          * 1) Clear Enable
668          * 2) Poll with reads until that bit reads back as zero
669          * 3) Make TX configuration changes
670          * 4) Set Enable once more
671          */
672         hme_write32(hp, hp->bigmacregs + BMAC_TXCFG,
673                     hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) &
674                     ~(BIGMAC_TXCFG_ENABLE));
675         while (hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) & BIGMAC_TXCFG_ENABLE)
676                 barrier();
677         if (full) {
678                 hp->happy_flags |= HFLAG_FULL;
679                 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG,
680                             hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) |
681                             BIGMAC_TXCFG_FULLDPLX);
682         } else {
683                 hp->happy_flags &= ~(HFLAG_FULL);
684                 hme_write32(hp, hp->bigmacregs + BMAC_TXCFG,
685                             hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) &
686                             ~(BIGMAC_TXCFG_FULLDPLX));
687         }
688         hme_write32(hp, hp->bigmacregs + BMAC_TXCFG,
689                     hme_read32(hp, hp->bigmacregs + BMAC_TXCFG) |
690                     BIGMAC_TXCFG_ENABLE);
691         return 0;
692 no_response:
693         return 1;
694 }
695 
696 static int happy_meal_init(struct happy_meal *hp, int from_irq);
697 
698 static int is_lucent_phy(struct happy_meal *hp)
699 {
700         unsigned long tregs = hp->tcvregs;
701         unsigned short mr2, mr3;
702         int ret = 0;
703 
704         mr2 = happy_meal_tcvr_read(hp, tregs, 2);
705         mr3 = happy_meal_tcvr_read(hp, tregs, 3);
706         if ((mr2 & 0xffff) == 0x0180 &&
707             ((mr3 & 0xffff) >> 10) == 0x1d) {
708 #if 0
709                 printk("HMEDEBUG: Lucent PHY detected.\n");
710 #endif
711                 ret = 1;
712         }
713 
714         return ret;
715 }
716 
717 static void happy_meal_timer(unsigned long data)
718 {
719         struct happy_meal *hp = (struct happy_meal *) data;
720         unsigned long tregs = hp->tcvregs;
721         int restart_timer = 0;
722 
723         hp->timer_ticks++;
724         switch(hp->timer_state) {
725         case arbwait:
726                 /* Only allow for 5 ticks, thats 10 seconds and much too
727                  * long to wait for arbitration to complete.
728                  */
729                 if (hp->timer_ticks >= 10) {
730                         /* Enter force mode. */
731         do_force_mode:
732                         hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
733                         printk(KERN_NOTICE "%s: Auto-Negotiation unsuccessful, trying force link mode\n",
734                                hp->dev->name);
735                         hp->sw_bmcr = BMCR_SPEED100;
736                         happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
737 
738                         if (!is_lucent_phy(hp)) {
739                                 /* OK, seems we need do disable the transceiver for the first
740                                  * tick to make sure we get an accurate link state at the
741                                  * second tick.
742                                  */
743                                 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, DP83840_CSCONFIG);
744                                 hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB);
745                                 happy_meal_tcvr_write(hp, tregs, DP83840_CSCONFIG, hp->sw_csconfig);
746                         }
747                         hp->timer_state = ltrywait;
748                         hp->timer_ticks = 0;
749                         restart_timer = 1;
750                 } else {
751                         /* Anything interesting happen? */
752                         hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
753                         if (hp->sw_bmsr & BMSR_ANEGCOMPLETE) {
754                                 int ret;
755 
756                                 /* Just what we've been waiting for... */
757                                 ret = set_happy_link_modes(hp, tregs);
758                                 if (ret) {
759                                         /* Ooops, something bad happened, go to force
760                                          * mode.
761                                          *
762                                          * XXX Broken hubs which don't support 802.3u
763                                          * XXX auto-negotiation make this happen as well.
764                                          */
765                                         goto do_force_mode;
766                                 }
767 
768                                 /* Success, at least so far, advance our state engine. */
769                                 hp->timer_state = lupwait;
770                                 restart_timer = 1;
771                         } else {
772                                 restart_timer = 1;
773                         }
774                 }
775                 break;
776 
777         case lupwait:
778                 /* Auto negotiation was successful and we are awaiting a
779                  * link up status.  I have decided to let this timer run
780                  * forever until some sort of error is signalled, reporting
781                  * a message to the user at 10 second intervals.
782                  */
783                 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
784                 if (hp->sw_bmsr & BMSR_LSTATUS) {
785                         /* Wheee, it's up, display the link mode in use and put
786                          * the timer to sleep.
787                          */
788                         display_link_mode(hp, tregs);
789                         hp->timer_state = asleep;
790                         restart_timer = 0;
791                 } else {
792                         if (hp->timer_ticks >= 10) {
793                                 printk(KERN_NOTICE "%s: Auto negotiation successful, link still "
794                                        "not completely up.\n", hp->dev->name);
795                                 hp->timer_ticks = 0;
796                                 restart_timer = 1;
797                         } else {
798                                 restart_timer = 1;
799                         }
800                 }
801                 break;
802 
803         case ltrywait:
804                 /* Making the timeout here too long can make it take
805                  * annoyingly long to attempt all of the link mode
806                  * permutations, but then again this is essentially
807                  * error recovery code for the most part.
808                  */
809                 hp->sw_bmsr = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
810                 hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs, DP83840_CSCONFIG);
811                 if (hp->timer_ticks == 1) {
812                         if (!is_lucent_phy(hp)) {
813                                 /* Re-enable transceiver, we'll re-enable the transceiver next
814                                  * tick, then check link state on the following tick.
815                                  */
816                                 hp->sw_csconfig |= CSCONFIG_TCVDISAB;
817                                 happy_meal_tcvr_write(hp, tregs,
818                                                       DP83840_CSCONFIG, hp->sw_csconfig);
819                         }
820                         restart_timer = 1;
821                         break;
822                 }
823                 if (hp->timer_ticks == 2) {
824                         if (!is_lucent_phy(hp)) {
825                                 hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB);
826                                 happy_meal_tcvr_write(hp, tregs,
827                                                       DP83840_CSCONFIG, hp->sw_csconfig);
828                         }
829                         restart_timer = 1;
830                         break;
831                 }
832                 if (hp->sw_bmsr & BMSR_LSTATUS) {
833                         /* Force mode selection success. */
834                         display_forced_link_mode(hp, tregs);
835                         set_happy_link_modes(hp, tregs); /* XXX error? then what? */
836                         hp->timer_state = asleep;
837                         restart_timer = 0;
838                 } else {
839                         if (hp->timer_ticks >= 4) { /* 6 seconds or so... */
840                                 int ret;
841 
842                                 ret = try_next_permutation(hp, tregs);
843                                 if (ret == -1) {
844                                         /* Aieee, tried them all, reset the
845                                          * chip and try all over again.
846                                          */
847 
848                                         /* Let the user know... */
849                                         printk(KERN_NOTICE "%s: Link down, cable problem?\n",
850                                                hp->dev->name);
851 
852                                         ret = happy_meal_init(hp, 0);
853                                         if (ret) {
854                                                 /* ho hum... */
855                                                 printk(KERN_ERR "%s: Error, cannot re-init the "
856                                                        "Happy Meal.\n", hp->dev->name);
857                                         }
858                                         return;
859                                 }
860                                 if (!is_lucent_phy(hp)) {
861                                         hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs,
862                                                                                DP83840_CSCONFIG);
863                                         hp->sw_csconfig |= CSCONFIG_TCVDISAB;
864                                         happy_meal_tcvr_write(hp, tregs,
865                                                               DP83840_CSCONFIG, hp->sw_csconfig);
866                                 }
867                                 hp->timer_ticks = 0;
868                                 restart_timer = 1;
869                         } else {
870                                 restart_timer = 1;
871                         }
872                 }
873                 break;
874 
875         case asleep:
876         default:
877                 /* Can't happens.... */
878                 printk(KERN_ERR "%s: Aieee, link timer is asleep but we got one anyways!\n",
879                        hp->dev->name);
880                 restart_timer = 0;
881                 hp->timer_ticks = 0;
882                 hp->timer_state = asleep; /* foo on you */
883                 break;
884         };
885 
886         if (restart_timer) {
887                 hp->happy_timer.expires = jiffies + ((12 * HZ)/10); /* 1.2 sec. */
888                 add_timer(&hp->happy_timer);
889         }
890 }
891 
892 #define TX_RESET_TRIES     32
893 #define RX_RESET_TRIES     32
894 
895 static void happy_meal_tx_reset(struct happy_meal *hp, unsigned long bregs)
896 {
897         int tries = TX_RESET_TRIES;
898 
899         HMD(("happy_meal_tx_reset: reset, "));
900 
901         /* Would you like to try our SMCC Delux? */
902         hme_write32(hp, bregs + BMAC_TXSWRESET, 0);
903         while ((hme_read32(hp, bregs + BMAC_TXSWRESET) & 1) && --tries)
904                 udelay(20);
905 
906         /* Lettuce, tomato, buggy hardware (no extra charge)? */
907         if (!tries)
908                 printk(KERN_ERR "happy meal: Transceiver BigMac ATTACK!");
909 
910         /* Take care. */
911         HMD(("done\n"));
912 }
913 
914 static void happy_meal_rx_reset(struct happy_meal *hp, unsigned long bregs)
915 {
916         int tries = RX_RESET_TRIES;
917 
918         HMD(("happy_meal_rx_reset: reset, "));
919 
920         /* We have a special on GNU/Viking hardware bugs today. */
921         hme_write32(hp, bregs + BMAC_RXSWRESET, 0);
922         while ((hme_read32(hp, bregs + BMAC_RXSWRESET) & 1) && --tries)
923                 udelay(20);
924 
925         /* Will that be all? */
926         if (!tries)
927                 printk(KERN_ERR "happy meal: Receiver BigMac ATTACK!");
928 
929         /* Don't forget your vik_1137125_wa.  Have a nice day. */
930         HMD(("done\n"));
931 }
932 
933 #define STOP_TRIES         16
934 
935 static void happy_meal_stop(struct happy_meal *hp, unsigned long gregs)
936 {
937         int tries = STOP_TRIES;
938 
939         HMD(("happy_meal_stop: reset, "));
940 
941         /* We're consolidating our STB products, it's your lucky day. */
942         hme_write32(hp, gregs + GREG_SWRESET, GREG_RESET_ALL);
943         while (hme_read32(hp, gregs + GREG_SWRESET) && --tries)
944                 udelay(20);
945 
946         /* Come back next week when we are "Sun Microelectronics". */
947         if (!tries)
948                 printk(KERN_ERR "happy meal: Fry guys.");
949 
950         /* Remember: "Different name, same old buggy as shit hardware." */
951         HMD(("done\n"));
952 }
953 
954 static void happy_meal_get_counters(struct happy_meal *hp, unsigned long bregs)
955 {
956         struct net_device_stats *stats = &hp->net_stats;
957 
958         stats->rx_crc_errors += hme_read32(hp, bregs + BMAC_RCRCECTR);
959         hme_write32(hp, bregs + BMAC_RCRCECTR, 0);
960 
961         stats->rx_frame_errors += hme_read32(hp, bregs + BMAC_UNALECTR);
962         hme_write32(hp, bregs + BMAC_UNALECTR, 0);
963 
964         stats->rx_length_errors += hme_read32(hp, bregs + BMAC_GLECTR);
965         hme_write32(hp, bregs + BMAC_GLECTR, 0);
966 
967         stats->tx_aborted_errors += hme_read32(hp, bregs + BMAC_EXCTR);
968 
969         stats->collisions +=
970                 (hme_read32(hp, bregs + BMAC_EXCTR) +
971                  hme_read32(hp, bregs + BMAC_LTCTR));
972         hme_write32(hp, bregs + BMAC_EXCTR, 0);
973         hme_write32(hp, bregs + BMAC_LTCTR, 0);
974 }
975 
976 #if 0
977 static void happy_meal_poll_start(struct happy_meal *hp, unsigned long tregs)
978 {
979         u32 tmp;
980         int speed;
981 
982         ASD(("happy_meal_poll_start: "));
983         if (!(hp->happy_flags & HFLAG_POLLENABLE)) {
984                 HMD(("polling disabled, return\n"));
985                 return;
986         }
987 
988         /* Start the MIF polling on the external transceiver. */
989         ASD(("polling on, "));
990         tmp = hme_read32(hp, tregs + TCVR_CFG);
991         tmp &= ~(TCV_CFG_PDADDR | TCV_CFG_PREGADDR);
992         tmp |= ((hp->paddr & 0x1f) << 10);
993         tmp |= (TCV_PADDR_ETX << 3);
994         tmp |= TCV_CFG_PENABLE;
995         hme_write32(hp, tregs + TCVR_CFG, tmp);
996 
997         /* Let the bits set. */
998         udelay(200);
999 
1000         /* We are polling now. */
1001         ASD(("now polling, "));
1002         hp->happy_flags |= HFLAG_POLL;
1003 
1004         /* Clear the poll flags, get the basic status as of now. */
1005         hp->poll_flag = 0;
1006         hp->poll_data = hme_read32(hp, tregs + TCVR_STATUS) >> 16;
1007 
1008         if (hp->happy_flags & HFLAG_AUTO)
1009                 speed = hp->auto_speed;
1010         else
1011                 speed = hp->forced_speed;
1012 
1013         /* Listen only for the MIF interrupts we want to hear. */
1014         ASD(("mif ints on, "));
1015         if (speed == 100)
1016                 hme_write32(hp, tregs + TCVR_IMASK, 0xfffb);
1017         else
1018                 hme_write32(hp, tregs + TCVR_IMASK, 0xfff9);
1019         ASD(("done\n"));
1020 }
1021 #endif
1022 
1023 static void happy_meal_poll_stop(struct happy_meal *hp, unsigned long tregs)
1024 {
1025         ASD(("happy_meal_poll_stop: "));
1026 
1027         /* If polling disabled or not polling already, nothing to do. */
1028         if ((hp->happy_flags & (HFLAG_POLLENABLE | HFLAG_POLL)) !=
1029            (HFLAG_POLLENABLE | HFLAG_POLL)) {
1030                 HMD(("not polling, return\n"));
1031                 return;
1032         }
1033 
1034         /* Shut up the MIF. */
1035         ASD(("were polling, mif ints off, "));
1036         hme_write32(hp, tregs + TCVR_IMASK, 0xffff);
1037 
1038         /* Turn off polling. */
1039         ASD(("polling off, "));
1040         hme_write32(hp, tregs + TCVR_CFG,
1041                     hme_read32(hp, tregs + TCVR_CFG) & ~(TCV_CFG_PENABLE));
1042 
1043         /* We are no longer polling. */
1044         hp->happy_flags &= ~(HFLAG_POLL);
1045 
1046         /* Let the bits set. */
1047         udelay(200);
1048         ASD(("done\n"));
1049 }
1050 
1051 /* Only Sun can take such nice parts and fuck up the programming interface
1052  * like this.  Good job guys...
1053  */
1054 #define TCVR_RESET_TRIES       16 /* It should reset quickly        */
1055 #define TCVR_UNISOLATE_TRIES   32 /* Dis-isolation can take longer. */
1056 
1057 static int happy_meal_tcvr_reset(struct happy_meal *hp, unsigned long tregs)
1058 {
1059         u32 tconfig;
1060         int result, tries = TCVR_RESET_TRIES;
1061 
1062         tconfig = hme_read32(hp, tregs + TCVR_CFG);
1063         ASD(("happy_meal_tcvr_reset: tcfg<%08lx> ", tconfig));
1064         if (hp->tcvr_type == external) {
1065                 ASD(("external<"));
1066                 hme_write32(hp, tregs + TCVR_CFG, tconfig & ~(TCV_CFG_PSELECT));
1067                 hp->tcvr_type = internal;
1068                 hp->paddr = TCV_PADDR_ITX;
1069                 ASD(("ISOLATE,"));
1070                 happy_meal_tcvr_write(hp, tregs, MII_BMCR,
1071                                       (BMCR_LOOPBACK|BMCR_PDOWN|BMCR_ISOLATE));
1072                 result = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1073                 if (result == TCVR_FAILURE) {
1074                         ASD(("phyread_fail>\n"));
1075                         return -1;
1076                 }
1077                 ASD(("phyread_ok,PSELECT>"));
1078                 hme_write32(hp, tregs + TCVR_CFG, tconfig | TCV_CFG_PSELECT);
1079                 hp->tcvr_type = external;
1080                 hp->paddr = TCV_PADDR_ETX;
1081         } else {
1082                 if (tconfig & TCV_CFG_MDIO1) {
1083                         ASD(("internal<PSELECT,"));
1084                         hme_write32(hp, tregs + TCVR_CFG, (tconfig | TCV_CFG_PSELECT));
1085                         ASD(("ISOLATE,"));
1086                         happy_meal_tcvr_write(hp, tregs, MII_BMCR,
1087                                               (BMCR_LOOPBACK|BMCR_PDOWN|BMCR_ISOLATE));
1088                         result = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1089                         if (result == TCVR_FAILURE) {
1090                                 ASD(("phyread_fail>\n"));
1091                                 return -1;
1092                         }
1093                         ASD(("phyread_ok,~PSELECT>"));
1094                         hme_write32(hp, tregs + TCVR_CFG, (tconfig & ~(TCV_CFG_PSELECT)));
1095                         hp->tcvr_type = internal;
1096                         hp->paddr = TCV_PADDR_ITX;
1097                 }
1098         }
1099 
1100         ASD(("BMCR_RESET "));
1101         happy_meal_tcvr_write(hp, tregs, MII_BMCR, BMCR_RESET);
1102 
1103         while (--tries) {
1104                 result = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1105                 if (result == TCVR_FAILURE)
1106                         return -1;
1107                 hp->sw_bmcr = result;
1108                 if (!(result & BMCR_RESET))
1109                         break;
1110                 udelay(20);
1111         }
1112         if (!tries) {
1113                 ASD(("BMCR RESET FAILED!\n"));
1114                 return -1;
1115         }
1116         ASD(("RESET_OK\n"));
1117 
1118         /* Get fresh copies of the PHY registers. */
1119         hp->sw_bmsr      = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
1120         hp->sw_physid1   = happy_meal_tcvr_read(hp, tregs, MII_PHYSID1);
1121         hp->sw_physid2   = happy_meal_tcvr_read(hp, tregs, MII_PHYSID2);
1122         hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE);
1123 
1124         ASD(("UNISOLATE"));
1125         hp->sw_bmcr &= ~(BMCR_ISOLATE);
1126         happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
1127 
1128         tries = TCVR_UNISOLATE_TRIES;
1129         while (--tries) {
1130                 result = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1131                 if (result == TCVR_FAILURE)
1132                         return -1;
1133                 if (!(result & BMCR_ISOLATE))
1134                         break;
1135                 udelay(20);
1136         }
1137         if (!tries) {
1138                 ASD((" FAILED!\n"));
1139                 return -1;
1140         }
1141         ASD((" SUCCESS and CSCONFIG_DFBYPASS\n"));
1142         if (!is_lucent_phy(hp)) {
1143                 result = happy_meal_tcvr_read(hp, tregs,
1144                                               DP83840_CSCONFIG);
1145                 happy_meal_tcvr_write(hp, tregs,
1146                                       DP83840_CSCONFIG, (result | CSCONFIG_DFBYPASS));
1147         }
1148         return 0;
1149 }
1150 
1151 /* Figure out whether we have an internal or external transceiver. */
1152 static void happy_meal_transceiver_check(struct happy_meal *hp, unsigned long tregs)
1153 {
1154         unsigned long tconfig = hme_read32(hp, tregs + TCVR_CFG);
1155 
1156         ASD(("happy_meal_transceiver_check: tcfg=%08lx ", tconfig));
1157         if (hp->happy_flags & HFLAG_POLL) {
1158                 /* If we are polling, we must stop to get the transceiver type. */
1159                 ASD(("<polling> "));
1160                 if (hp->tcvr_type == internal) {
1161                         if (tconfig & TCV_CFG_MDIO1) {
1162                                 ASD(("<internal> <poll stop> "));
1163                                 happy_meal_poll_stop(hp, tregs);
1164                                 hp->paddr = TCV_PADDR_ETX;
1165                                 hp->tcvr_type = external;
1166                                 ASD(("<external>\n"));
1167                                 tconfig &= ~(TCV_CFG_PENABLE);
1168                                 tconfig |= TCV_CFG_PSELECT;
1169                                 hme_write32(hp, tregs + TCVR_CFG, tconfig);
1170                         }
1171                 } else {
1172                         if (hp->tcvr_type == external) {
1173                                 ASD(("<external> "));
1174                                 if (!(hme_read32(hp, tregs + TCVR_STATUS) >> 16)) {
1175                                         ASD(("<poll stop> "));
1176                                         happy_meal_poll_stop(hp, tregs);
1177                                         hp->paddr = TCV_PADDR_ITX;
1178                                         hp->tcvr_type = internal;
1179                                         ASD(("<internal>\n"));
1180                                         hme_write32(hp, tregs + TCVR_CFG,
1181                                                     hme_read32(hp, tregs + TCVR_CFG) &
1182                                                     ~(TCV_CFG_PSELECT));
1183                                 }
1184                                 ASD(("\n"));
1185                         } else {
1186                                 ASD(("<none>\n"));
1187                         }
1188                 }
1189         } else {
1190                 u32 reread = hme_read32(hp, tregs + TCVR_CFG);
1191 
1192                 /* Else we can just work off of the MDIO bits. */
1193                 ASD(("<not polling> "));
1194                 if (reread & TCV_CFG_MDIO1) {
1195                         hme_write32(hp, tregs + TCVR_CFG, tconfig | TCV_CFG_PSELECT);
1196                         hp->paddr = TCV_PADDR_ETX;
1197                         hp->tcvr_type = external;
1198                         ASD(("<external>\n"));
1199                 } else {
1200                         if (reread & TCV_CFG_MDIO0) {
1201                                 hme_write32(hp, tregs + TCVR_CFG,
1202                                             tconfig & ~(TCV_CFG_PSELECT));
1203                                 hp->paddr = TCV_PADDR_ITX;
1204                                 hp->tcvr_type = internal;
1205                                 ASD(("<internal>\n"));
1206                         } else {
1207                                 printk(KERN_ERR "happy meal: Transceiver and a coke please.");
1208                                 hp->tcvr_type = none; /* Grrr... */
1209                                 ASD(("<none>\n"));
1210                         }
1211                 }
1212         }
1213 }
1214 
1215 /* The receive ring buffers are a bit tricky to get right.  Here goes...
1216  *
1217  * The buffers we dma into must be 64 byte aligned.  So we use a special
1218  * alloc_skb() routine for the happy meal to allocate 64 bytes more than
1219  * we really need.
1220  *
1221  * We use skb_reserve() to align the data block we get in the skb.  We
1222  * also program the etxregs->cfg register to use an offset of 2.  This
1223  * imperical constant plus the ethernet header size will always leave
1224  * us with a nicely aligned ip header once we pass things up to the
1225  * protocol layers.
1226  *
1227  * The numbers work out to:
1228  *
1229  *         Max ethernet frame size         1518
1230  *         Ethernet header size              14
1231  *         Happy Meal base offset             2
1232  *
1233  * Say a skb data area is at 0xf001b010, and its size alloced is
1234  * (ETH_FRAME_LEN + 64 + 2) = (1514 + 64 + 2) = 1580 bytes.
1235  *
1236  * First our alloc_skb() routine aligns the data base to a 64 byte
1237  * boundry.  We now have 0xf001b040 as our skb data address.  We
1238  * plug this into the receive descriptor address.
1239  *
1240  * Next, we skb_reserve() 2 bytes to account for the Happy Meal offset.
1241  * So now the data we will end up looking at starts at 0xf001b042.  When
1242  * the packet arrives, we will check out the size received and subtract
1243  * this from the skb->length.  Then we just pass the packet up to the
1244  * protocols as is, and allocate a new skb to replace this slot we have
1245  * just received from.
1246  *
1247  * The ethernet layer will strip the ether header from the front of the
1248  * skb we just sent to it, this leaves us with the ip header sitting
1249  * nicely aligned at 0xf001b050.  Also, for tcp and udp packets the
1250  * Happy Meal has even checksummed the tcp/udp data for us.  The 16
1251  * bit checksum is obtained from the low bits of the receive descriptor
1252  * flags, thus:
1253  *
1254  *      skb->csum = rxd->rx_flags & 0xffff;
1255  *      skb->ip_summed = CHECKSUM_HW;
1256  *
1257  * before sending off the skb to the protocols, and we are good as gold.
1258  */
1259 static void happy_meal_clean_rings(struct happy_meal *hp)
1260 {
1261         int i;
1262 
1263         for (i = 0; i < RX_RING_SIZE; i++) {
1264                 if (hp->rx_skbs[i] != NULL) {
1265                         struct sk_buff *skb = hp->rx_skbs[i];
1266                         struct happy_meal_rxd *rxd;
1267                         u32 dma_addr;
1268 
1269                         rxd = &hp->happy_block->happy_meal_rxd[i];
1270                         dma_addr = hme_read_desc32(hp, &rxd->rx_addr);
1271                         hme_dma_unmap(hp, dma_addr, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE);
1272                         dev_kfree_skb_any(skb);
1273                         hp->rx_skbs[i] = NULL;
1274                 }
1275         }
1276 
1277         for (i = 0; i < TX_RING_SIZE; i++) {
1278                 if (hp->tx_skbs[i] != NULL) {
1279                         struct sk_buff *skb = hp->tx_skbs[i];
1280                         struct happy_meal_txd *txd;
1281                         u32 dma_addr;
1282                         int frag;
1283 
1284                         hp->tx_skbs[i] = NULL;
1285 
1286                         for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) {
1287                                 txd = &hp->happy_block->happy_meal_txd[i];
1288                                 dma_addr = hme_read_desc32(hp, &txd->tx_addr);
1289                                 hme_dma_unmap(hp, dma_addr,
1290                                               (hme_read_desc32(hp, &txd->tx_flags)
1291                                                & TXFLAG_SIZE),
1292                                               DMA_TODEVICE);
1293 
1294                                 if (frag != skb_shinfo(skb)->nr_frags)
1295                                         i++;
1296                         }
1297 
1298                         dev_kfree_skb_any(skb);
1299                 }
1300         }
1301 }
1302 
1303 static void happy_meal_init_rings(struct happy_meal *hp, int from_irq)
1304 {
1305         struct hmeal_init_block *hb = hp->happy_block;
1306         struct net_device *dev = hp->dev;
1307         int i, gfp_flags = GFP_KERNEL;
1308 
1309         if (from_irq || in_interrupt())
1310                 gfp_flags = GFP_ATOMIC;
1311 
1312         HMD(("happy_meal_init_rings: counters to zero, "));
1313         hp->rx_new = hp->rx_old = hp->tx_new = hp->tx_old = 0;
1314 
1315         /* Free any skippy bufs left around in the rings. */
1316         HMD(("clean, "));
1317         happy_meal_clean_rings(hp);
1318 
1319         /* Now get new skippy bufs for the receive ring. */
1320         HMD(("init rxring, "));
1321         for (i = 0; i < RX_RING_SIZE; i++) {
1322                 struct sk_buff *skb;
1323 
1324                 skb = happy_meal_alloc_skb(RX_BUF_ALLOC_SIZE, gfp_flags);
1325                 if (!skb) {
1326                         hme_write_rxd(hp, &hb->happy_meal_rxd[i], 0, 0);
1327                         continue;
1328                 }
1329                 hp->rx_skbs[i] = skb;
1330                 skb->dev = dev;
1331 
1332                 /* Because we reserve afterwards. */
1333                 skb_put(skb, (ETH_FRAME_LEN + RX_OFFSET));
1334                 hme_write_rxd(hp, &hb->happy_meal_rxd[i],
1335                               (RXFLAG_OWN | ((RX_BUF_ALLOC_SIZE - RX_OFFSET) << 16)),
1336                               hme_dma_map(hp, skb->data, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE));
1337                 skb_reserve(skb, RX_OFFSET);
1338         }
1339 
1340         HMD(("init txring, "));
1341         for (i = 0; i < TX_RING_SIZE; i++)
1342                 hme_write_txd(hp, &hb->happy_meal_txd[i], 0, 0);
1343 
1344         HMD(("done\n"));
1345 }
1346 
1347 static void happy_meal_begin_auto_negotiation(struct happy_meal *hp,
1348                                               unsigned long tregs,
1349                                               struct ethtool_cmd *ep)
1350 {
1351         int timeout;
1352 
1353         /* Read all of the registers we are interested in now. */
1354         hp->sw_bmsr      = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
1355         hp->sw_bmcr      = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1356         hp->sw_physid1   = happy_meal_tcvr_read(hp, tregs, MII_PHYSID1);
1357         hp->sw_physid2   = happy_meal_tcvr_read(hp, tregs, MII_PHYSID2);
1358 
1359         /* XXX Check BMSR_ANEGCAPABLE, should not be necessary though. */
1360 
1361         hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE);
1362         if (ep == NULL || ep->autoneg == AUTONEG_ENABLE) {
1363                 /* Advertise everything we can support. */
1364                 if (hp->sw_bmsr & BMSR_10HALF)
1365                         hp->sw_advertise |= (ADVERTISE_10HALF);
1366                 else
1367                         hp->sw_advertise &= ~(ADVERTISE_10HALF);
1368 
1369                 if (hp->sw_bmsr & BMSR_10FULL)
1370                         hp->sw_advertise |= (ADVERTISE_10FULL);
1371                 else
1372                         hp->sw_advertise &= ~(ADVERTISE_10FULL);
1373                 if (hp->sw_bmsr & BMSR_100HALF)
1374                         hp->sw_advertise |= (ADVERTISE_100HALF);
1375                 else
1376                         hp->sw_advertise &= ~(ADVERTISE_100HALF);
1377                 if (hp->sw_bmsr & BMSR_100FULL)
1378                         hp->sw_advertise |= (ADVERTISE_100FULL);
1379                 else
1380                         hp->sw_advertise &= ~(ADVERTISE_100FULL);
1381                 happy_meal_tcvr_write(hp, tregs, MII_ADVERTISE, hp->sw_advertise);
1382 
1383                 /* XXX Currently no Happy Meal cards I know off support 100BaseT4,
1384                  * XXX and this is because the DP83840 does not support it, changes
1385                  * XXX would need to be made to the tx/rx logic in the driver as well
1386                  * XXX so I completely skip checking for it in the BMSR for now.
1387                  */
1388 
1389 #ifdef AUTO_SWITCH_DEBUG
1390                 ASD(("%s: Advertising [ ", hp->dev->name));
1391                 if (hp->sw_advertise & ADVERTISE_10HALF)
1392                         ASD(("10H "));
1393                 if (hp->sw_advertise & ADVERTISE_10FULL)
1394                         ASD(("10F "));
1395                 if (hp->sw_advertise & ADVERTISE_100HALF)
1396                         ASD(("100H "));
1397                 if (hp->sw_advertise & ADVERTISE_100FULL)
1398                         ASD(("100F "));
1399 #endif
1400 
1401                 /* Enable Auto-Negotiation, this is usually on already... */
1402                 hp->sw_bmcr |= BMCR_ANENABLE;
1403                 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
1404 
1405                 /* Restart it to make sure it is going. */
1406                 hp->sw_bmcr |= BMCR_ANRESTART;
1407                 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
1408 
1409                 /* BMCR_ANRESTART self clears when the process has begun. */
1410 
1411                 timeout = 64;  /* More than enough. */
1412                 while (--timeout) {
1413                         hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1414                         if (!(hp->sw_bmcr & BMCR_ANRESTART))
1415                                 break; /* got it. */
1416                         udelay(10);
1417                 }
1418                 if (!timeout) {
1419                         printk(KERN_ERR "%s: Happy Meal would not start auto negotiation "
1420                                "BMCR=0x%04x\n", hp->dev->name, hp->sw_bmcr);
1421                         printk(KERN_NOTICE "%s: Performing force link detection.\n",
1422                                hp->dev->name);
1423                         goto force_link;
1424                 } else {
1425                         hp->timer_state = arbwait;
1426                 }
1427         } else {
1428 force_link:
1429                 /* Force the link up, trying first a particular mode.
1430                  * Either we are here at the request of ethtool or
1431                  * because the Happy Meal would not start to autoneg.
1432                  */
1433 
1434                 /* Disable auto-negotiation in BMCR, enable the duplex and
1435                  * speed setting, init the timer state machine, and fire it off.
1436                  */
1437                 if (ep == NULL || ep->autoneg == AUTONEG_ENABLE) {
1438                         hp->sw_bmcr = BMCR_SPEED100;
1439                 } else {
1440                         if (ep->speed == SPEED_100)
1441                                 hp->sw_bmcr = BMCR_SPEED100;
1442                         else
1443                                 hp->sw_bmcr = 0;
1444                         if (ep->duplex == DUPLEX_FULL)
1445                                 hp->sw_bmcr |= BMCR_FULLDPLX;
1446                 }
1447                 happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
1448 
1449                 if (!is_lucent_phy(hp)) {
1450                         /* OK, seems we need do disable the transceiver for the first
1451                          * tick to make sure we get an accurate link state at the
1452                          * second tick.
1453                          */
1454                         hp->sw_csconfig = happy_meal_tcvr_read(hp, tregs,
1455                                                                DP83840_CSCONFIG);
1456                         hp->sw_csconfig &= ~(CSCONFIG_TCVDISAB);
1457                         happy_meal_tcvr_write(hp, tregs, DP83840_CSCONFIG,
1458                                               hp->sw_csconfig);
1459                 }
1460                 hp->timer_state = ltrywait;
1461         }
1462 
1463         hp->timer_ticks = 0;
1464         hp->happy_timer.expires = jiffies + (12 * HZ)/10;  /* 1.2 sec. */
1465         hp->happy_timer.data = (unsigned long) hp;
1466         hp->happy_timer.function = &happy_meal_timer;
1467         add_timer(&hp->happy_timer);
1468 }
1469 
1470 #define CRC_POLYNOMIAL_BE 0x04c11db7UL  /* Ethernet CRC, big endian */
1471 #define CRC_POLYNOMIAL_LE 0xedb88320UL  /* Ethernet CRC, little endian */
1472 
1473 static int happy_meal_init(struct happy_meal *hp, int from_irq)
1474 {
1475         unsigned long gregs        = hp->gregs;
1476         unsigned long etxregs      = hp->etxregs;
1477         unsigned long erxregs      = hp->erxregs;
1478         unsigned long bregs        = hp->bigmacregs;
1479         unsigned long tregs        = hp->tcvregs;
1480         u32 regtmp, rxcfg;
1481         unsigned char *e = &hp->dev->dev_addr[0];
1482 
1483         /* If auto-negotiation timer is running, kill it. */
1484         del_timer(&hp->happy_timer);
1485 
1486         HMD(("happy_meal_init: happy_flags[%08x] ",
1487              hp->happy_flags));
1488         if (!(hp->happy_flags & HFLAG_INIT)) {
1489                 HMD(("set HFLAG_INIT, "));
1490                 hp->happy_flags |= HFLAG_INIT;
1491                 happy_meal_get_counters(hp, bregs);
1492         }
1493 
1494         /* Stop polling. */
1495         HMD(("to happy_meal_poll_stop\n"));
1496         happy_meal_poll_stop(hp, tregs);
1497 
1498         /* Stop transmitter and receiver. */
1499         HMD(("happy_meal_init: to happy_meal_stop\n"));
1500         happy_meal_stop(hp, gregs);
1501 
1502         /* Alloc and reset the tx/rx descriptor chains. */
1503         HMD(("happy_meal_init: to happy_meal_init_rings\n"));
1504         happy_meal_init_rings(hp, from_irq);
1505 
1506         /* Shut up the MIF. */
1507         HMD(("happy_meal_init: Disable all MIF irqs (old[%08x]), ",
1508              hme_read32(hp, tregs + TCVR_IMASK)));
1509         hme_write32(hp, tregs + TCVR_IMASK, 0xffff);
1510 
1511         /* See if we can enable the MIF frame on this card to speak to the DP83840. */
1512         if (hp->happy_flags & HFLAG_FENABLE) {
1513                 HMD(("use frame old[%08x], ",
1514                      hme_read32(hp, tregs + TCVR_CFG)));
1515                 hme_write32(hp, tregs + TCVR_CFG,
1516                             hme_read32(hp, tregs + TCVR_CFG) & ~(TCV_CFG_BENABLE));
1517         } else {
1518                 HMD(("use bitbang old[%08x], ",
1519                      hme_read32(hp, tregs + TCVR_CFG)));
1520                 hme_write32(hp, tregs + TCVR_CFG,
1521                             hme_read32(hp, tregs + TCVR_CFG) | TCV_CFG_BENABLE);
1522         }
1523 
1524         /* Check the state of the transceiver. */
1525         HMD(("to happy_meal_transceiver_check\n"));
1526         happy_meal_transceiver_check(hp, tregs);
1527 
1528         /* Put the Big Mac into a sane state. */
1529         HMD(("happy_meal_init: "));
1530         switch(hp->tcvr_type) {
1531         case none:
1532                 /* Cannot operate if we don't know the transceiver type! */
1533                 HMD(("AAIEEE no transceiver type, EAGAIN"));
1534                 return -EAGAIN;
1535 
1536         case internal:
1537                 /* Using the MII buffers. */
1538                 HMD(("internal, using MII, "));
1539                 hme_write32(hp, bregs + BMAC_XIFCFG, 0);
1540                 break;
1541 
1542         case external:
1543                 /* Not using the MII, disable it. */
1544                 HMD(("external, disable MII, "));
1545                 hme_write32(hp, bregs + BMAC_XIFCFG, BIGMAC_XCFG_MIIDISAB);
1546                 break;
1547         };
1548 
1549         if (happy_meal_tcvr_reset(hp, tregs))
1550                 return -EAGAIN;
1551 
1552         /* Reset the Happy Meal Big Mac transceiver and the receiver. */
1553         HMD(("tx/rx reset, "));
1554         happy_meal_tx_reset(hp, bregs);
1555         happy_meal_rx_reset(hp, bregs);
1556 
1557         /* Set jam size and inter-packet gaps to reasonable defaults. */
1558         HMD(("jsize/ipg1/ipg2, "));
1559         hme_write32(hp, bregs + BMAC_JSIZE, DEFAULT_JAMSIZE);
1560         hme_write32(hp, bregs + BMAC_IGAP1, DEFAULT_IPG1);
1561         hme_write32(hp, bregs + BMAC_IGAP2, DEFAULT_IPG2);
1562 
1563         /* Load up the MAC address and random seed. */
1564         HMD(("rseed/macaddr, "));
1565 
1566         /* The docs recommend to use the 10LSB of our MAC here. */
1567         hme_write32(hp, bregs + BMAC_RSEED, ((e[5] | e[4]<<8)&0x3ff));
1568 
1569         hme_write32(hp, bregs + BMAC_MACADDR2, ((e[4] << 8) | e[5]));
1570         hme_write32(hp, bregs + BMAC_MACADDR1, ((e[2] << 8) | e[3]));
1571         hme_write32(hp, bregs + BMAC_MACADDR0, ((e[0] << 8) | e[1]));
1572 
1573         HMD(("htable, "));
1574         if ((hp->dev->flags & IFF_ALLMULTI) ||
1575             (hp->dev->mc_count > 64)) {
1576                 hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff);
1577                 hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff);
1578                 hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff);
1579                 hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff);
1580         } else if ((hp->dev->flags & IFF_PROMISC) == 0) {
1581                 u16 hash_table[4];
1582                 struct dev_mc_list *dmi = hp->dev->mc_list;
1583                 char *addrs;
1584                 int i, j, bit, byte;
1585                 u32 crc, poly = CRC_POLYNOMIAL_LE;
1586 
1587                 for (i = 0; i < 4; i++)
1588                         hash_table[i] = 0;
1589 
1590                 for (i = 0; i < hp->dev->mc_count; i++) {
1591                         addrs = dmi->dmi_addr;
1592                         dmi = dmi->next;
1593 
1594                         if (!(*addrs & 1))
1595                                 continue;
1596 
1597                         crc = 0xffffffffU;
1598                         for (byte = 0; byte < 6; byte++) {
1599                                 for (bit = *addrs++, j = 0; j < 8; j++, bit >>= 1) {
1600                                         int test;
1601 
1602                                         test = ((bit ^ crc) & 0x01);
1603                                         crc >>= 1;
1604                                         if (test)
1605                                                 crc = crc ^ poly;
1606                                 }
1607                         }
1608                         crc >>= 26;
1609                         hash_table[crc >> 4] |= 1 << (crc & 0xf);
1610                 }
1611                 hme_write32(hp, bregs + BMAC_HTABLE0, hash_table[0]);
1612                 hme_write32(hp, bregs + BMAC_HTABLE1, hash_table[1]);
1613                 hme_write32(hp, bregs + BMAC_HTABLE2, hash_table[2]);
1614                 hme_write32(hp, bregs + BMAC_HTABLE3, hash_table[3]);
1615         } else {
1616                 hme_write32(hp, bregs + BMAC_HTABLE3, 0);
1617                 hme_write32(hp, bregs + BMAC_HTABLE2, 0);
1618                 hme_write32(hp, bregs + BMAC_HTABLE1, 0);
1619                 hme_write32(hp, bregs + BMAC_HTABLE0, 0);
1620         }
1621 
1622         /* Set the RX and TX ring ptrs. */
1623         HMD(("ring ptrs rxr[%08x] txr[%08x]\n",
1624              (hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0)),
1625              (hp->hblock_dvma + hblock_offset(happy_meal_txd, 0))));
1626         hme_write32(hp, erxregs + ERX_RING,
1627                     (hp->hblock_dvma + hblock_offset(happy_meal_rxd, 0)));
1628         hme_write32(hp, etxregs + ETX_RING,
1629                     (hp->hblock_dvma + hblock_offset(happy_meal_txd, 0)));
1630 
1631         /* Set the supported burst sizes. */
1632         HMD(("happy_meal_init: old[%08x] bursts<",
1633              hme_read32(hp, gregs + GREG_CFG)));
1634 
1635 #ifndef __sparc__
1636         /* It is always PCI and can handle 64byte bursts. */
1637         hme_write32(hp, gregs + GREG_CFG, GREG_CFG_BURST64);
1638 #else
1639         if ((hp->happy_bursts & DMA_BURST64) &&
1640             ((hp->happy_flags & HFLAG_PCI) != 0
1641 #ifdef CONFIG_SBUS
1642              || sbus_can_burst64(hp->happy_dev)
1643 #endif
1644              || 0)) {
1645                 u32 gcfg = GREG_CFG_BURST64;
1646 
1647                 /* I have no idea if I should set the extended
1648                  * transfer mode bit for Cheerio, so for now I
1649                  * do not.  -DaveM
1650                  */
1651 #ifdef CONFIG_SBUS
1652                 if ((hp->happy_flags & HFLAG_PCI) == 0 &&
1653                     sbus_can_dma_64bit(hp->happy_dev)) {
1654                         sbus_set_sbus64(hp->happy_dev,
1655                                         hp->happy_bursts);
1656                         gcfg |= GREG_CFG_64BIT;
1657                 }
1658 #endif
1659 
1660                 HMD(("64>"));
1661                 hme_write32(hp, gregs + GREG_CFG, gcfg);
1662         } else if (hp->happy_bursts & DMA_BURST32) {
1663                 HMD(("32>"));
1664                 hme_write32(hp, gregs + GREG_CFG, GREG_CFG_BURST32);
1665         } else if (hp->happy_bursts & DMA_BURST16) {
1666                 HMD(("16>"));
1667                 hme_write32(hp, gregs + GREG_CFG, GREG_CFG_BURST16);
1668         } else {
1669                 HMD(("XXX>"));
1670                 hme_write32(hp, gregs + GREG_CFG, 0);
1671         }
1672 #endif /* __sparc__ */
1673 
1674         /* Turn off interrupts we do not want to hear. */
1675         HMD((", enable global interrupts, "));
1676         hme_write32(hp, gregs + GREG_IMASK,
1677                     (GREG_IMASK_GOTFRAME | GREG_IMASK_RCNTEXP |
1678                      GREG_IMASK_SENTFRAME | GREG_IMASK_TXPERR));
1679 
1680         /* Set the transmit ring buffer size. */
1681         HMD(("tx rsize=%d oreg[%08x], ", (int)TX_RING_SIZE,
1682              hme_read32(hp, etxregs + ETX_RSIZE)));
1683         hme_write32(hp, etxregs + ETX_RSIZE, (TX_RING_SIZE >> ETX_RSIZE_SHIFT) - 1);
1684 
1685         /* Enable transmitter DVMA. */
1686         HMD(("tx dma enable old[%08x], ",
1687              hme_read32(hp, etxregs + ETX_CFG)));
1688         hme_write32(hp, etxregs + ETX_CFG,
1689                     hme_read32(hp, etxregs + ETX_CFG) | ETX_CFG_DMAENABLE);
1690 
1691         /* This chip really rots, for the receiver sometimes when you
1692          * write to it's control registers not all the bits get there
1693          * properly.  I cannot think of a sane way to provide complete
1694          * coverage for this hardware bug yet.
1695          */
1696         HMD(("erx regs bug old[%08x]\n",
1697              hme_read32(hp, erxregs + ERX_CFG)));
1698         hme_write32(hp, erxregs + ERX_CFG, ERX_CFG_DEFAULT(RX_OFFSET));
1699         regtmp = hme_read32(hp, erxregs + ERX_CFG);
1700         hme_write32(hp, erxregs + ERX_CFG, ERX_CFG_DEFAULT(RX_OFFSET));
1701         if (hme_read32(hp, erxregs + ERX_CFG) != ERX_CFG_DEFAULT(RX_OFFSET)) {
1702                 printk(KERN_ERR "happy meal: Eieee, rx config register gets greasy fries.\n");
1703                 printk(KERN_ERR "happy meal: Trying to set %08x, reread gives %08x\n",
1704                        ERX_CFG_DEFAULT(RX_OFFSET), regtmp);
1705                 /* XXX Should return failure here... */
1706         }
1707 
1708         /* Enable Big Mac hash table filter. */
1709         HMD(("happy_meal_init: enable hash rx_cfg_old[%08x], ",
1710              hme_read32(hp, bregs + BMAC_RXCFG)));
1711         rxcfg = BIGMAC_RXCFG_HENABLE;
1712         if (hp->dev->flags & IFF_PROMISC)
1713                 rxcfg |= BIGMAC_RXCFG_PMISC;
1714         hme_write32(hp, bregs + BMAC_RXCFG, rxcfg);
1715 
1716         /* Let the bits settle in the chip. */
1717         udelay(10);
1718 
1719         /* Ok, configure the Big Mac transmitter. */
1720         HMD(("BIGMAC init, "));
1721         regtmp = 0;
1722         if (hp->happy_flags & HFLAG_FULL)
1723                 regtmp |= BIGMAC_TXCFG_FULLDPLX;
1724         hme_write32(hp, bregs + BMAC_TXCFG, regtmp | BIGMAC_TXCFG_DGIVEUP);
1725 
1726         /* Enable the output drivers no matter what. */
1727         regtmp = BIGMAC_XCFG_ODENABLE;
1728 
1729         /* If card can do lance mode, enable it. */
1730         if (hp->happy_flags & HFLAG_LANCE)
1731                 regtmp |= (DEFAULT_IPG0 << 5) | BIGMAC_XCFG_LANCE;
1732 
1733         /* Disable the MII buffers if using external transceiver. */
1734         if (hp->tcvr_type == external)
1735                 regtmp |= BIGMAC_XCFG_MIIDISAB;
1736 
1737         HMD(("XIF config old[%08x], ",
1738              hme_read32(hp, bregs + BMAC_XIFCFG)));
1739         hme_write32(hp, bregs + BMAC_XIFCFG, regtmp);
1740 
1741         /* Start things up. */
1742         HMD(("tx old[%08x] and rx [%08x] ON!\n",
1743              hme_read32(hp, bregs + BMAC_TXCFG),
1744              hme_read32(hp, bregs + BMAC_RXCFG)));
1745         hme_write32(hp, bregs + BMAC_TXCFG,
1746                     hme_read32(hp, bregs + BMAC_TXCFG) | BIGMAC_TXCFG_ENABLE);
1747         hme_write32(hp, bregs + BMAC_RXCFG,
1748                     hme_read32(hp, bregs + BMAC_RXCFG) | BIGMAC_RXCFG_ENABLE);
1749 
1750         /* Get the autonegotiation started, and the watch timer ticking. */
1751         happy_meal_begin_auto_negotiation(hp, tregs, NULL);
1752 
1753         /* Success. */
1754         return 0;
1755 }
1756 
1757 static void happy_meal_set_initial_advertisement(struct happy_meal *hp)
1758 {
1759         unsigned long tregs     = hp->tcvregs;
1760         unsigned long bregs     = hp->bigmacregs;
1761         unsigned long gregs     = hp->gregs;
1762 
1763         happy_meal_stop(hp, gregs);
1764         hme_write32(hp, tregs + TCVR_IMASK, 0xffff);
1765         if (hp->happy_flags & HFLAG_FENABLE)
1766                 hme_write32(hp, tregs + TCVR_CFG,
1767                             hme_read32(hp, tregs + TCVR_CFG) & ~(TCV_CFG_BENABLE));
1768         else
1769                 hme_write32(hp, tregs + TCVR_CFG,
1770                             hme_read32(hp, tregs + TCVR_CFG) | TCV_CFG_BENABLE);
1771         happy_meal_transceiver_check(hp, tregs);
1772         switch(hp->tcvr_type) {
1773         case none:
1774                 return;
1775         case internal:
1776                 hme_write32(hp, bregs + BMAC_XIFCFG, 0);
1777                 break;
1778         case external:
1779                 hme_write32(hp, bregs + BMAC_XIFCFG, BIGMAC_XCFG_MIIDISAB);
1780                 break;
1781         };
1782         if (happy_meal_tcvr_reset(hp, tregs))
1783                 return;
1784 
1785         /* Latch PHY registers as of now. */
1786         hp->sw_bmsr      = happy_meal_tcvr_read(hp, tregs, MII_BMSR);
1787         hp->sw_advertise = happy_meal_tcvr_read(hp, tregs, MII_ADVERTISE);
1788 
1789         /* Advertise everything we can support. */
1790         if (hp->sw_bmsr & BMSR_10HALF)
1791                 hp->sw_advertise |= (ADVERTISE_10HALF);
1792         else
1793                 hp->sw_advertise &= ~(ADVERTISE_10HALF);
1794 
1795         if (hp->sw_bmsr & BMSR_10FULL)
1796                 hp->sw_advertise |= (ADVERTISE_10FULL);
1797         else
1798                 hp->sw_advertise &= ~(ADVERTISE_10FULL);
1799         if (hp->sw_bmsr & BMSR_100HALF)
1800                 hp->sw_advertise |= (ADVERTISE_100HALF);
1801         else
1802                 hp->sw_advertise &= ~(ADVERTISE_100HALF);
1803         if (hp->sw_bmsr & BMSR_100FULL)
1804                 hp->sw_advertise |= (ADVERTISE_100FULL);
1805         else
1806                 hp->sw_advertise &= ~(ADVERTISE_100FULL);
1807 
1808         /* Update the PHY advertisement register. */
1809         happy_meal_tcvr_write(hp, tregs, MII_ADVERTISE, hp->sw_advertise);
1810 }
1811 
1812 /* Once status is latched (by happy_meal_interrupt) it is cleared by
1813  * the hardware, so we cannot re-read it and get a correct value.
1814  */
1815 static int happy_meal_is_not_so_happy(struct happy_meal *hp, u32 status)
1816 {
1817         int reset = 0;
1818         
1819         /* Only print messages for non-counter related interrupts. */
1820         if (status & (GREG_STAT_STSTERR | GREG_STAT_TFIFO_UND |
1821                       GREG_STAT_MAXPKTERR | GREG_STAT_RXERR |
1822                       GREG_STAT_RXPERR | GREG_STAT_RXTERR | GREG_STAT_EOPERR |
1823                       GREG_STAT_MIFIRQ | GREG_STAT_TXEACK | GREG_STAT_TXLERR |
1824                       GREG_STAT_TXPERR | GREG_STAT_TXTERR | GREG_STAT_SLVERR |
1825                       GREG_STAT_SLVPERR))
1826                 printk(KERN_ERR "%s: Error interrupt for happy meal, status = %08x\n",
1827                        hp->dev->name, status);
1828 
1829         if (status & GREG_STAT_RFIFOVF) {
1830                 /* Receive FIFO overflow is harmless and the hardware will take
1831                    care of it, just some packets are lost. Who cares. */
1832                 printk(KERN_DEBUG "%s: Happy Meal receive FIFO overflow.\n", hp->dev->name);
1833         }
1834 
1835         if (status & GREG_STAT_STSTERR) {
1836                 /* BigMAC SQE link test failed. */
1837                 printk(KERN_ERR "%s: Happy Meal BigMAC SQE test failed.\n", hp->dev->name);
1838                 reset = 1;
1839         }
1840 
1841         if (status & GREG_STAT_TFIFO_UND) {
1842                 /* Transmit FIFO underrun, again DMA error likely. */
1843                 printk(KERN_ERR "%s: Happy Meal transmitter FIFO underrun, DMA error.\n",
1844                        hp->dev->name);
1845                 reset = 1;
1846         }
1847 
1848         if (status & GREG_STAT_MAXPKTERR) {
1849                 /* Driver error, tried to transmit something larger
1850                  * than ethernet max mtu.
1851                  */
1852                 printk(KERN_ERR "%s: Happy Meal MAX Packet size error.\n", hp->dev->name);
1853                 reset = 1;
1854         }
1855 
1856         if (status & GREG_STAT_NORXD) {
1857                 /* This is harmless, it just means the system is
1858                  * quite loaded and the incoming packet rate was
1859                  * faster than the interrupt handler could keep up
1860                  * with.
1861                  */
1862                 printk(KERN_INFO "%s: Happy Meal out of receive "
1863                        "descriptors, packet dropped.\n",
1864                        hp->dev->name);
1865         }
1866 
1867         if (status & (GREG_STAT_RXERR|GREG_STAT_RXPERR|GREG_STAT_RXTERR)) {
1868                 /* All sorts of DMA receive errors. */
1869                 printk(KERN_ERR "%s: Happy Meal rx DMA errors [ ", hp->dev->name);
1870                 if (status & GREG_STAT_RXERR)
1871                         printk("GenericError ");
1872                 if (status & GREG_STAT_RXPERR)
1873                         printk("ParityError ");
1874                 if (status & GREG_STAT_RXTERR)
1875                         printk("RxTagBotch ");
1876                 printk("]\n");
1877                 reset = 1;
1878         }
1879 
1880         if (status & GREG_STAT_EOPERR) {
1881                 /* Driver bug, didn't set EOP bit in tx descriptor given
1882                  * to the happy meal.
1883                  */
1884                 printk(KERN_ERR "%s: EOP not set in happy meal transmit descriptor!\n",
1885                        hp->dev->name);
1886                 reset = 1;
1887         }
1888 
1889         if (status & GREG_STAT_MIFIRQ) {
1890                 /* MIF signalled an interrupt, were we polling it? */
1891                 printk(KERN_ERR "%s: Happy Meal MIF interrupt.\n", hp->dev->name);
1892         }
1893 
1894         if (status &
1895             (GREG_STAT_TXEACK|GREG_STAT_TXLERR|GREG_STAT_TXPERR|GREG_STAT_TXTERR)) {
1896                 /* All sorts of transmit DMA errors. */
1897                 printk(KERN_ERR "%s: Happy Meal tx DMA errors [ ", hp->dev->name);
1898                 if (status & GREG_STAT_TXEACK)
1899                         printk("GenericError ");
1900                 if (status & GREG_STAT_TXLERR)
1901                         printk("LateError ");
1902                 if (status & GREG_STAT_TXPERR)
1903                         printk("ParityErro ");
1904                 if (status & GREG_STAT_TXTERR)
1905                         printk("TagBotch ");
1906                 printk("]\n");
1907                 reset = 1;
1908         }
1909 
1910         if (status & (GREG_STAT_SLVERR|GREG_STAT_SLVPERR)) {
1911                 /* Bus or parity error when cpu accessed happy meal registers
1912                  * or it's internal FIFO's.  Should never see this.
1913                  */
1914                 printk(KERN_ERR "%s: Happy Meal register access SBUS slave (%s) error.\n",
1915                        hp->dev->name,
1916                        (status & GREG_STAT_SLVPERR) ? "parity" : "generic");
1917                 reset = 1;
1918         }
1919 
1920         if (reset) {
1921                 printk(KERN_NOTICE "%s: Resetting...\n", hp->dev->name);
1922                 happy_meal_init(hp, 1);
1923                 return 1;
1924         }
1925         return 0;
1926 }
1927 
1928 static void happy_meal_mif_interrupt(struct happy_meal *hp)
1929 {
1930         unsigned long tregs = hp->tcvregs;
1931 
1932         printk(KERN_INFO "%s: Link status change.\n", hp->dev->name);
1933         hp->sw_bmcr = happy_meal_tcvr_read(hp, tregs, MII_BMCR);
1934         hp->sw_lpa = happy_meal_tcvr_read(hp, tregs, MII_LPA);
1935 
1936         /* Use the fastest transmission protocol possible. */
1937         if (hp->sw_lpa & LPA_100FULL) {
1938                 printk(KERN_INFO "%s: Switching to 100Mbps at full duplex.", hp->dev->name);
1939                 hp->sw_bmcr |= (BMCR_FULLDPLX | BMCR_SPEED100);
1940         } else if (hp->sw_lpa & LPA_100HALF) {
1941                 printk(KERN_INFO "%s: Switching to 100MBps at half duplex.", hp->dev->name);
1942                 hp->sw_bmcr |= BMCR_SPEED100;
1943         } else if (hp->sw_lpa & LPA_10FULL) {
1944                 printk(KERN_INFO "%s: Switching to 10MBps at full duplex.", hp->dev->name);
1945                 hp->sw_bmcr |= BMCR_FULLDPLX;
1946         } else {
1947                 printk(KERN_INFO "%s: Using 10Mbps at half duplex.", hp->dev->name);
1948         }
1949         happy_meal_tcvr_write(hp, tregs, MII_BMCR, hp->sw_bmcr);
1950 
1951         /* Finally stop polling and shut up the MIF. */
1952         happy_meal_poll_stop(hp, tregs);
1953 }
1954 
1955 #ifdef TXDEBUG
1956 #define TXD(x) printk x
1957 #else
1958 #define TXD(x)
1959 #endif
1960 
1961 static void happy_meal_tx(struct happy_meal *hp)
1962 {
1963         struct happy_meal_txd *txbase = &hp->happy_block->happy_meal_txd[0];
1964         struct happy_meal_txd *this;
1965         struct net_device *dev = hp->dev;
1966         int elem;
1967 
1968         spin_lock(&hp->happy_lock);
1969 
1970         elem = hp->tx_old;
1971         TXD(("TX<"));
1972         while (elem != hp->tx_new) {
1973                 struct sk_buff *skb;
1974                 u32 flags, dma_addr, dma_len;
1975                 int frag;
1976 
1977                 TXD(("[%d]", elem));
1978                 this = &txbase[elem];
1979                 flags = hme_read_desc32(hp, &this->tx_flags);
1980                 if (flags & TXFLAG_OWN)
1981                         break;
1982                 skb = hp->tx_skbs[elem];
1983                 if (skb_shinfo(skb)->nr_frags) {
1984                         int last;
1985 
1986                         last = elem + skb_shinfo(skb)->nr_frags;
1987                         last &= (TX_RING_SIZE - 1);
1988                         flags = hme_read_desc32(hp, &txbase[last].tx_flags);
1989                         if (flags & TXFLAG_OWN)
1990                                 break;
1991                 }
1992                 hp->tx_skbs[elem] = NULL;
1993                 hp->net_stats.tx_bytes += skb->len;
1994 
1995                 for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) {
1996                         dma_addr = hme_read_desc32(hp, &this->tx_addr);
1997                         dma_len = hme_read_desc32(hp, &this->tx_flags);
1998 
1999                         dma_len &= TXFLAG_SIZE;
2000                         hme_dma_unmap(hp, dma_addr, dma_len, DMA_TODEVICE);
2001 
2002                         elem = NEXT_TX(elem);
2003                         this = &txbase[elem];
2004                 }
2005 
2006                 dev_kfree_skb_irq(skb);
2007                 hp->net_stats.tx_packets++;
2008         }
2009         hp->tx_old = elem;
2010         TXD((">"));
2011 
2012         if (netif_queue_stopped(dev) &&
2013             TX_BUFFS_AVAIL(hp) > 0)
2014                 netif_wake_queue(dev);
2015 
2016         spin_unlock(&hp->happy_lock);
2017 }
2018 
2019 #ifdef RXDEBUG
2020 #define RXD(x) printk x
2021 #else
2022 #define RXD(x)
2023 #endif
2024 
2025 /* Originally I used to handle the allocation failure by just giving back just
2026  * that one ring buffer to the happy meal.  Problem is that usually when that
2027  * condition is triggered, the happy meal expects you to do something reasonable
2028  * with all of the packets it has DMA'd in.  So now I just drop the entire
2029  * ring when we cannot get a new skb and give them all back to the happy meal,
2030  * maybe things will be "happier" now.
2031  */
2032 static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev)
2033 {
2034         struct happy_meal_rxd *rxbase = &hp->happy_block->happy_meal_rxd[0];
2035         struct happy_meal_rxd *this;
2036         int elem = hp->rx_new, drops = 0;
2037         u32 flags;
2038 
2039         RXD(("RX<"));
2040         this = &rxbase[elem];
2041         while (!((flags = hme_read_desc32(hp, &this->rx_flags)) & RXFLAG_OWN)) {
2042                 struct sk_buff *skb;
2043                 int len = flags >> 16;
2044                 u16 csum = flags & RXFLAG_CSUM;
2045                 u32 dma_addr = hme_read_desc32(hp, &this->rx_addr);
2046 
2047                 RXD(("[%d ", elem));
2048 
2049                 /* Check for errors. */
2050                 if ((len < ETH_ZLEN) || (flags & RXFLAG_OVERFLOW)) {
2051                         RXD(("ERR(%08x)]", flags));
2052                         hp->net_stats.rx_errors++;
2053                         if (len < ETH_ZLEN)
2054                                 hp->net_stats.rx_length_errors++;
2055                         if (len & (RXFLAG_OVERFLOW >> 16)) {
2056                                 hp->net_stats.rx_over_errors++;
2057                                 hp->net_stats.rx_fifo_errors++;
2058                         }
2059 
2060                         /* Return it to the Happy meal. */
2061         drop_it:
2062                         hp->net_stats.rx_dropped++;
2063                         hme_write_rxd(hp, this,
2064                                       (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),
2065                                       dma_addr);
2066                         goto next;
2067                 }
2068                 skb = hp->rx_skbs[elem];
2069                 if (len > RX_COPY_THRESHOLD) {
2070                         struct sk_buff *new_skb;
2071 
2072                         /* Now refill the entry, if we can. */
2073                         new_skb = happy_meal_alloc_skb(RX_BUF_ALLOC_SIZE, GFP_ATOMIC);
2074                         if (new_skb == NULL) {
2075                                 drops++;
2076                                 goto drop_it;
2077                         }
2078                         hme_dma_unmap(hp, dma_addr, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE);
2079                         hp->rx_skbs[elem] = new_skb;
2080                         new_skb->dev = dev;
2081                         skb_put(new_skb, (ETH_FRAME_LEN + RX_OFFSET));
2082                         hme_write_rxd(hp, this,
2083                                       (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),
2084                                       hme_dma_map(hp, new_skb->data, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE));
2085                         skb_reserve(new_skb, RX_OFFSET);
2086 
2087                         /* Trim the original skb for the netif. */
2088                         skb_trim(skb, len);
2089                 } else {
2090                         struct sk_buff *copy_skb = dev_alloc_skb(len + 2);
2091 
2092                         if (copy_skb == NULL) {
2093                                 drops++;
2094                                 goto drop_it;
2095                         }
2096 
2097                         copy_skb->dev = dev;
2098                         skb_reserve(copy_skb, 2);
2099                         skb_put(copy_skb, len);
2100                         hme_dma_sync(hp, dma_addr, len, DMA_FROMDEVICE);
2101                         memcpy(copy_skb->data, skb->data, len);
2102 
2103                         /* Reuse original ring buffer. */
2104                         hme_write_rxd(hp, this,
2105                                       (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),
2106                                       dma_addr);
2107 
2108                         skb = copy_skb;
2109                 }
2110 
2111                 /* This card is _fucking_ hot... */
2112                 skb->csum = ntohs(csum ^ 0xffff);
2113                 skb->ip_summed = CHECKSUM_HW;
2114 
2115                 RXD(("len=%d csum=%4x]", len, csum));
2116                 skb->protocol = eth_type_trans(skb, dev);
2117                 netif_rx(skb);
2118 
2119                 dev->last_rx = jiffies;
2120                 hp->net_stats.rx_packets++;
2121                 hp->net_stats.rx_bytes += len;
2122         next:
2123                 elem = NEXT_RX(elem);
2124                 this = &rxbase[elem];
2125         }
2126         hp->rx_new = elem;
2127         if (drops)
2128                 printk(KERN_INFO "%s: Memory squeeze, deferring packet.\n", hp->dev->name);
2129         RXD((">"));
2130 }
2131 
2132 static void happy_meal_interrupt(int irq, void *dev_id, struct pt_regs *regs)
2133 {
2134         struct net_device *dev = (struct net_device *) dev_id;
2135         struct happy_meal *hp  = dev->priv;
2136         u32 happy_status       = hme_read32(hp, hp->gregs + GREG_STAT);
2137 
2138         HMD(("happy_meal_interrupt: status=%08x ", happy_status));
2139 
2140         if (happy_status & GREG_STAT_ERRORS) {
2141                 HMD(("ERRORS "));
2142                 if (happy_meal_is_not_so_happy(hp, /* un- */ happy_status))
2143                         return;
2144         }
2145 
2146         if (happy_status & GREG_STAT_MIFIRQ) {
2147                 HMD(("MIFIRQ "));
2148                 happy_meal_mif_interrupt(hp);
2149         }
2150 
2151         if (happy_status & GREG_STAT_TXALL) {
2152                 HMD(("TXALL "));
2153                 happy_meal_tx(hp);
2154         }
2155 
2156         if (happy_status & GREG_STAT_RXTOHOST) {
2157                 HMD(("RXTOHOST "));
2158                 happy_meal_rx(hp, dev);
2159         }
2160 
2161         HMD(("done\n"));
2162 }
2163 
2164 #ifdef CONFIG_SBUS
2165 static void quattro_sbus_interrupt(int irq, void *cookie, struct pt_regs *ptregs)
2166 {
2167         struct quattro *qp = (struct quattro *) cookie;
2168         int i;
2169 
2170         for (i = 0; i < 4; i++) {
2171                 struct net_device *dev = qp->happy_meals[i];
2172                 struct happy_meal *hp  = dev->priv;
2173                 u32 happy_status       = hme_read32(hp, hp->gregs + GREG_STAT);
2174 
2175                 HMD(("quattro_interrupt: status=%08x ", happy_status));
2176 
2177                 if (!(happy_status & (GREG_STAT_ERRORS |
2178                                       GREG_STAT_MIFIRQ |
2179                                       GREG_STAT_TXALL |
2180                                       GREG_STAT_RXTOHOST)))
2181                         continue;
2182 
2183                 if (happy_status & GREG_STAT_ERRORS) {
2184                         HMD(("ERRORS "));
2185                         if (happy_meal_is_not_so_happy(hp, happy_status))
2186                                 break;
2187                 }
2188 
2189                 if (happy_status & GREG_STAT_MIFIRQ) {
2190                         HMD(("MIFIRQ "));
2191                         happy_meal_mif_interrupt(hp);
2192                 }
2193 
2194                 if (happy_status & GREG_STAT_TXALL) {
2195                         HMD(("TXALL "));
2196                         happy_meal_tx(hp);
2197                 }
2198 
2199                 if (happy_status & GREG_STAT_RXTOHOST) {
2200                         HMD(("RXTOHOST "));
2201                         happy_meal_rx(hp, dev);
2202                 }
2203         }
2204         HMD(("done\n"));
2205 }
2206 #endif
2207 
2208 static int happy_meal_open(struct net_device *dev)
2209 {
2210         struct happy_meal *hp = dev->priv;
2211         int res;
2212 
2213         HMD(("happy_meal_open: "));
2214 
2215         /* On SBUS Quattro QFE cards, all hme interrupts are concentrated
2216          * into a single source which we register handling at probe time.
2217          */
2218         if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) {
2219                 if (request_irq(dev->irq, &happy_meal_interrupt,
2220                                 SA_SHIRQ, "HAPPY MEAL", (void *)dev)) {
2221                         HMD(("EAGAIN\n"));
2222 #ifdef __sparc__
2223                         printk(KERN_ERR "happy_meal(SBUS): Can't order irq %s to go.\n",
2224                                __irq_itoa(dev->irq));
2225 #else
2226                         printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n",
2227                                dev->irq);
2228 #endif
2229 
2230                         return -EAGAIN;
2231                 }
2232         }
2233 
2234         HMD(("to happy_meal_init\n"));
2235         res = happy_meal_init(hp, 0);
2236         if (res && ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO))
2237                 free_irq(dev->irq, dev);
2238         return res;
2239 }
2240 
2241 static int happy_meal_close(struct net_device *dev)
2242 {
2243         struct happy_meal *hp = dev->priv;
2244 
2245         happy_meal_stop(hp, hp->gregs);
2246         happy_meal_clean_rings(hp);
2247 
2248         /* If auto-negotiation timer is running, kill it. */
2249         del_timer(&hp->happy_timer);
2250 
2251         /* On Quattro QFE cards, all hme interrupts are concentrated
2252          * into a single source which we register handling at probe
2253          * time and never unregister.
2254          */
2255         if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO)
2256                 free_irq(dev->irq, dev);
2257 
2258         return 0;
2259 }
2260 
2261 #ifdef SXDEBUG
2262 #define SXD(x) printk x
2263 #else
2264 #define SXD(x)
2265 #endif
2266 
2267 #ifdef CONFIG_SBUS
2268 static void happy_meal_tx_timeout(struct net_device *dev)
2269 {
2270         struct happy_meal *hp = dev->priv;
2271 
2272         printk (KERN_ERR "%s: transmit timed out, resetting\n", dev->name);
2273         tx_dump_log();
2274         printk (KERN_ERR "%s: Happy Status %08x TX[%08x:%08x]\n", dev->name,
2275                 hme_read32(hp, hp->gregs + GREG_STAT),
2276                 hme_read32(hp, hp->etxregs + ETX_CFG),
2277                 hme_read32(hp, hp->bigmacregs + BMAC_TXCFG));
2278         happy_meal_init(hp, 0);
2279         netif_wake_queue(dev);
2280 }
2281 #endif
2282 
2283 static int happy_meal_start_xmit(struct sk_buff *skb, struct net_device *dev)
2284 {
2285         struct happy_meal *hp = dev->priv;
2286         int entry;
2287         u32 tx_flags;
2288 
2289         tx_flags = TXFLAG_OWN;
2290         if (skb->ip_summed == CHECKSUM_HW) {
2291                 u32 csum_start_off, csum_stuff_off;
2292 
2293                 csum_start_off = (u32) (skb->h.raw - skb->data);
2294                 csum_stuff_off = (u32) ((skb->h.raw + skb->csum) - skb->data);
2295 
2296                 tx_flags = (TXFLAG_OWN | TXFLAG_CSENABLE |
2297                             ((csum_start_off << 14) & TXFLAG_CSBUFBEGIN) |
2298                             ((csum_stuff_off << 20) & TXFLAG_CSLOCATION));
2299         }
2300 
2301         spin_lock_irq(&hp->happy_lock);
2302 
2303         if (TX_BUFFS_AVAIL(hp) <= (skb_shinfo(skb)->nr_frags + 1)) {
2304                 netif_stop_queue(dev);
2305                 spin_unlock_irq(&hp->happy_lock);
2306                 return 1;
2307         }
2308 
2309         entry = hp->tx_new;
2310         SXD(("SX<l[%d]e[%d]>", len, entry));
2311         hp->tx_skbs[entry] = skb;
2312 
2313         if (skb_shinfo(skb)->nr_frags == 0) {
2314                 u32 mapping, len;
2315 
2316                 len = skb->len;
2317                 mapping = hme_dma_map(hp, skb->data, len, DMA_TODEVICE);
2318                 tx_flags |= (TXFLAG_SOP | TXFLAG_EOP);
2319                 hme_write_txd(hp, &hp->happy_block->happy_meal_txd[entry],
2320                               (tx_flags | (len & TXFLAG_SIZE)),
2321                               mapping);
2322                 entry = NEXT_TX(entry);
2323         } else {
2324                 u32 first_len, first_mapping;
2325                 int frag, first_entry = entry;
2326 
2327                 /* We must give this initial chunk to the device last.
2328                  * Otherwise we could race with the device.
2329                  */
2330                 first_len = skb->len - skb->data_len;
2331                 first_mapping = hme_dma_map(hp, skb->data, first_len, DMA_TODEVICE);
2332                 entry = NEXT_TX(entry);
2333 
2334                 for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
2335                         skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag];
2336                         u32 len, mapping, this_txflags;
2337 
2338                         len = this_frag->size;
2339                         mapping = hme_dma_map(hp,
2340                                               ((void *) page_address(this_frag->page) +
2341                                                this_frag->page_offset),
2342                                               len, DMA_TODEVICE);
2343                         this_txflags = tx_flags;
2344                         if (frag == skb_shinfo(skb)->nr_frags - 1)
2345                                 this_txflags |= TXFLAG_EOP;
2346                         hme_write_txd(hp, &hp->happy_block->happy_meal_txd[entry],
2347                                       (this_txflags | (len & TXFLAG_SIZE)),
2348                                       mapping);
2349                         entry = NEXT_TX(entry);
2350                 }
2351                 hme_write_txd(hp, &hp->happy_block->happy_meal_txd[first_entry],
2352                               (tx_flags | TXFLAG_SOP | (first_len & TXFLAG_SIZE)),
2353                               first_mapping);
2354         }
2355 
2356         hp->tx_new = entry;
2357 
2358         if (TX_BUFFS_AVAIL(hp) <= 0)
2359                 netif_stop_queue(dev);
2360 
2361         /* Get it going. */
2362         hme_write32(hp, hp->etxregs + ETX_PENDING, ETX_TP_DMAWAKEUP);
2363 
2364         spin_unlock_irq(&hp->happy_lock);
2365 
2366         dev->trans_start = jiffies;
2367 
2368         tx_add_log(hp, TXLOG_ACTION_TXMIT, 0);
2369         return 0;
2370 }
2371 
2372 static struct net_device_stats *happy_meal_get_stats(struct net_device *dev)
2373 {
2374         struct happy_meal *hp = dev->priv;
2375 
2376         happy_meal_get_counters(hp, hp->bigmacregs);
2377         return &hp->net_stats;
2378 }
2379 
2380 static void happy_meal_set_multicast(struct net_device *dev)
2381 {
2382         struct happy_meal *hp = dev->priv;
2383         unsigned long bregs = hp->bigmacregs;
2384         struct dev_mc_list *dmi = dev->mc_list;
2385         char *addrs;
2386         int i, j, bit, byte;
2387         u32 crc, poly = CRC_POLYNOMIAL_LE;
2388 
2389         /* Lock out others. */
2390         netif_stop_queue(dev);
2391 
2392         if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 64)) {
2393                 hme_write32(hp, bregs + BMAC_HTABLE0, 0xffff);
2394                 hme_write32(hp, bregs + BMAC_HTABLE1, 0xffff);
2395                 hme_write32(hp, bregs + BMAC_HTABLE2, 0xffff);
2396                 hme_write32(hp, bregs + BMAC_HTABLE3, 0xffff);
2397         } else if (dev->flags & IFF_PROMISC) {
2398                 hme_write32(hp, bregs + BMAC_RXCFG,
2399                             hme_read32(hp, bregs + BMAC_RXCFG) | BIGMAC_RXCFG_PMISC);
2400         } else {
2401                 u16 hash_table[4];
2402 
2403                 for (i = 0; i < 4; i++)
2404                         hash_table[i] = 0;
2405 
2406                 for (i = 0; i < dev->mc_count; i++) {
2407                         addrs = dmi->dmi_addr;
2408                         dmi = dmi->next;
2409 
2410                         if (!(*addrs & 1))
2411                                 continue;
2412 
2413                         crc = 0xffffffffU;
2414                         for (byte = 0; byte < 6; byte++) {
2415                                 for (bit = *addrs++, j = 0; j < 8; j++, bit >>= 1) {
2416                                         int test;
2417 
2418                                         test = ((bit ^ crc) & 0x01);
2419                                         crc >>= 1;
2420                                         if (test)
2421                                                 crc = crc ^ poly;
2422                                 }
2423                         }
2424                         crc >>= 26;
2425                         hash_table[crc >> 4] |= 1 << (crc & 0xf);
2426                 }
2427                 hme_write32(hp, bregs + BMAC_HTABLE0, hash_table[0]);
2428                 hme_write32(hp, bregs + BMAC_HTABLE1, hash_table[1]);
2429                 hme_write32(hp, bregs + BMAC_HTABLE2, hash_table[2]);
2430                 hme_write32(hp, bregs + BMAC_HTABLE3, hash_table[3]);
2431         }
2432 
2433         /* Let us get going again. */
2434         netif_wake_queue(dev);
2435 }
2436 
2437 /* Ethtool support... */
2438 static int happy_meal_ioctl(struct net_device *dev,
2439                             struct ifreq *rq, int cmd)
2440 {
2441         struct happy_meal *hp = dev->priv;
2442         struct ethtool_cmd *ep_user = (struct ethtool_cmd *) rq->ifr_data;
2443         struct ethtool_cmd ecmd;
2444 
2445         if (cmd != SIOCETHTOOL)
2446                 return -EOPNOTSUPP;
2447         if (copy_from_user(&ecmd, ep_user, sizeof(ecmd)))
2448                 return -EFAULT;
2449 
2450         if (ecmd.cmd == ETHTOOL_GSET) {
2451                 ecmd.supported =
2452                         (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
2453                          SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
2454                          SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII);
2455 
2456                 /* XXX hardcoded stuff for now */
2457                 ecmd.port = PORT_TP; /* XXX no MII support */
2458                 ecmd.transceiver = XCVR_INTERNAL; /* XXX no external xcvr support */
2459                 ecmd.phy_address = 0; /* XXX fixed PHYAD */
2460 
2461                 /* Record PHY settings. */
2462                 hp->sw_bmcr = happy_meal_tcvr_read(hp, hp->tcvregs, MII_BMCR);
2463                 hp->sw_lpa = happy_meal_tcvr_read(hp, hp->tcvregs, MII_LPA);
2464                 if (hp->sw_bmcr & BMCR_ANENABLE) {
2465                         ecmd.autoneg = AUTONEG_ENABLE;
2466                         ecmd.speed =
2467                                 (hp->sw_lpa & (LPA_100HALF | LPA_100FULL)) ?
2468                                 SPEED_100 : SPEED_10;
2469                         if (ecmd.speed == SPEED_100)
2470                                 ecmd.duplex =
2471                                         (hp->sw_lpa & (LPA_100FULL)) ?
2472                                         DUPLEX_FULL : DUPLEX_HALF;
2473                         else
2474                                 ecmd.duplex =
2475                                         (hp->sw_lpa & (LPA_10FULL)) ?
2476                                         DUPLEX_FULL : DUPLEX_HALF;
2477                 } else {
2478                         ecmd.autoneg = AUTONEG_DISABLE;
2479                         ecmd.speed =
2480                                 (hp->sw_bmcr & BMCR_SPEED100) ?
2481                                 SPEED_100 : SPEED_10;
2482                         ecmd.duplex =
2483                                 (hp->sw_bmcr & BMCR_FULLDPLX) ?
2484                                 DUPLEX_FULL : DUPLEX_HALF;
2485                 }
2486                 if (copy_to_user(ep_user, &ecmd, sizeof(ecmd)))
2487                         return -EFAULT;
2488                 return 0;
2489         } else if (ecmd.cmd == ETHTOOL_SSET) {
2490                 if (!capable(CAP_NET_ADMIN))
2491                         return -EPERM;
2492 
2493                 /* Verify the settings we care about. */
2494                 if (ecmd.autoneg != AUTONEG_ENABLE &&
2495                     ecmd.autoneg != AUTONEG_DISABLE)
2496                         return -EINVAL;
2497                 if (ecmd.autoneg == AUTONEG_DISABLE &&
2498                     ((ecmd.speed != SPEED_100 &&
2499                       ecmd.speed != SPEED_10) ||
2500                      (ecmd.duplex != DUPLEX_HALF &&
2501                       ecmd.duplex != DUPLEX_FULL)))
2502                         return -EINVAL;
2503 
2504                 /* Ok, do it to it. */
2505                 del_timer(&hp->happy_timer);
2506                 happy_meal_begin_auto_negotiation(hp,
2507                                                   hp->tcvregs,
2508                                                   &ecmd);
2509 
2510                 return 0;
2511         } else
2512                 return -EOPNOTSUPP;
2513 }
2514 
2515 static int hme_version_printed;
2516 
2517 #ifdef CONFIG_SBUS
2518 void __init quattro_get_ranges(struct quattro *qp)
2519 {
2520         struct sbus_dev *sdev = qp->quattro_dev;
2521         int err;
2522 
2523         err = prom_getproperty(sdev->prom_node,
2524                                "ranges",
2525                                (char *)&qp->ranges[0],
2526                                sizeof(qp->ranges));
2527         if (err == 0 || err == -1) {
2528                 qp->nranges = 0;
2529                 return;
2530         }
2531         qp->nranges = (err / sizeof(struct linux_prom_ranges));
2532 }
2533 
2534 static void __init quattro_apply_ranges(struct quattro *qp, struct happy_meal *hp)
2535 {
2536         struct sbus_dev *sdev = hp->happy_dev;
2537         int rng;
2538 
2539         for (rng = 0; rng < qp->nranges; rng++) {
2540                 struct linux_prom_ranges *rngp = &qp->ranges[rng];
2541                 int reg;
2542 
2543                 for (reg = 0; reg < 5; reg++) {
2544                         if (sdev->reg_addrs[reg].which_io ==
2545                             rngp->ot_child_space)
2546                                 break;
2547                 }
2548                 if (reg == 5)
2549                         continue;
2550 
2551                 sdev->reg_addrs[reg].which_io = rngp->ot_parent_space;
2552                 sdev->reg_addrs[reg].phys_addr += rngp->ot_parent_base;
2553         }
2554 }
2555 
2556 /* Given a happy meal sbus device, find it's quattro parent.
2557  * If none exist, allocate and return a new one.
2558  *
2559  * Return NULL on failure.
2560  */
2561 static struct quattro * __init quattro_sbus_find(struct sbus_dev *goal_sdev)
2562 {
2563         struct sbus_bus *sbus;
2564         struct sbus_dev *sdev;
2565         struct quattro *qp;
2566         int i;
2567 
2568         if (qfe_sbus_list == NULL)
2569                 goto found;
2570 
2571         for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
2572                 for (i = 0, sdev = qp->quattro_dev;
2573                      (sdev != NULL) && (i < 4);
2574                      sdev = sdev->next, i++) {
2575                         if (sdev == goal_sdev)
2576                                 return qp;
2577                 }
2578         }
2579         for_each_sbus(sbus) {
2580                 for_each_sbusdev(sdev, sbus) {
2581                         if (sdev == goal_sdev)
2582                                 goto found;
2583                 }
2584         }
2585 
2586         /* Cannot find quattro parent, fail. */
2587         return NULL;
2588 
2589 found:
2590         qp = kmalloc(sizeof(struct quattro), GFP_KERNEL);
2591         if (qp != NULL) {
2592                 int i;
2593 
2594                 for (i = 0; i < 4; i++)
2595                         qp->happy_meals[i] = NULL;
2596 
2597                 qp->quattro_dev = goal_sdev;
2598                 qp->next = qfe_sbus_list;
2599                 qfe_sbus_list = qp;
2600                 quattro_get_ranges(qp);
2601         }
2602         return qp;
2603 }
2604 
2605 /* After all quattro cards have been probed, we call these functions
2606  * to register the IRQ handlers.
2607  */
2608 static void __init quattro_sbus_register_irqs(void)
2609 {
2610         struct quattro *qp;
2611 
2612         for (qp = qfe_sbus_list; qp != NULL; qp = qp->next) {
2613                 struct sbus_dev *sdev = qp->quattro_dev;
2614                 int err;
2615 
2616                 err = request_irq(sdev->irqs[0],
2617                                   quattro_sbus_interrupt,
2618                                   SA_SHIRQ, "Quattro",
2619                                   qp);
2620                 if (err != 0) {
2621                         printk(KERN_ERR "Quattro: Fatal IRQ registery error %d.\n", err);
2622                         panic("QFE request irq");
2623                 }
2624         }
2625 }
2626 #endif /* CONFIG_SBUS */
2627 
2628 #ifdef CONFIG_PCI
2629 static struct quattro * __init quattro_pci_find(struct pci_dev *pdev)
2630 {
2631         struct pci_dev *bdev = pdev->bus->self;
2632         struct quattro *qp;
2633 
2634         if (!bdev) return NULL;
2635         for (qp = qfe_pci_list; qp != NULL; qp = qp->next) {
2636                 struct pci_dev *qpdev = qp->quattro_dev;
2637 
2638                 if (qpdev == bdev)
2639                         return qp;
2640         }
2641         qp = kmalloc(sizeof(struct quattro), GFP_KERNEL);
2642         if (qp != NULL) {
2643                 int i;
2644 
2645                 for (i = 0; i < 4; i++)
2646                         qp->happy_meals[i] = NULL;
2647 
2648                 qp->quattro_dev = bdev;
2649                 qp->next = qfe_pci_list;
2650                 qfe_pci_list = qp;
2651 
2652                 /* No range tricks necessary on PCI. */
2653                 qp->nranges = 0;
2654         }
2655         return qp;
2656 }
2657 #endif /* CONFIG_PCI */
2658 
2659 #ifdef CONFIG_SBUS
2660 static int __init happy_meal_sbus_init(struct sbus_dev *sdev, int is_qfe)
2661 {
2662         struct quattro *qp = NULL;
2663         struct happy_meal *hp;
2664         struct net_device *dev;
2665         int i, qfe_slot = -1;
2666 
2667         if (is_qfe) {
2668                 qp = quattro_sbus_find(sdev);
2669                 if (qp == NULL)
2670                         return -ENODEV;
2671                 for (qfe_slot = 0; qfe_slot < 4; qfe_slot++)
2672                         if (qp->happy_meals[qfe_slot] == NULL)
2673                                 break;
2674                 if (qfe_slot == 4)
2675                         return -ENODEV;
2676         }
2677 
2678         dev = init_etherdev(NULL, sizeof(struct happy_meal));
2679         if (!dev)
2680                 return -ENOMEM;
2681         SET_MODULE_OWNER(dev);
2682 
2683         if (hme_version_printed++ == 0)
2684                 printk(KERN_INFO "%s", version);
2685 
2686         if (qfe_slot != -1)
2687                 printk(KERN_INFO "%s: Quattro HME slot %d (SBUS) 10/100baseT Ethernet ",
2688                        dev->name, qfe_slot);
2689         else
2690                 printk(KERN_INFO "%s: HAPPY MEAL (SBUS) 10/100baseT Ethernet ",
2691                        dev->name);
2692 
2693         /* If user did not specify a MAC address specifically, use
2694          * the Quattro local-mac-address property...
2695          */
2696         for (i = 0; i < 6; i++) {
2697                 if (macaddr[i] != 0)
2698                         break;
2699         }
2700         if (i < 6) { /* a mac address was given */
2701                 for (i = 0; i < 6; i++)
2702                         dev->dev_addr[i] = macaddr[i];
2703         } else if (qfe_slot != -1 &&
2704                    prom_getproplen(sdev->prom_node,
2705                                    "local-mac-address") == 6) {
2706                 prom_getproperty(sdev->prom_node, "local-mac-address",
2707                                  dev->dev_addr, 6);
2708         } else {
2709                 memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
2710         }
2711 
2712         for (i = 0; i < 6; i++)
2713                 printk("%2.2x%c",
2714                        dev->dev_addr[i], i == 5 ? ' ' : ':');
2715         printk("\n");
2716 
2717         hp = dev->priv;
2718         memset(hp, 0, sizeof(*hp));
2719 
2720         hp->happy_dev = sdev;
2721 
2722         spin_lock_init(&hp->happy_lock);
2723 
2724         if (sdev->num_registers != 5) {
2725                 printk(KERN_ERR "happymeal: Device does not have 5 regs, it has %d.\n",
2726                        sdev->num_registers);
2727                 printk(KERN_ERR "happymeal: Would you like that for here or to go?\n");
2728                 return -ENODEV;
2729         }
2730 
2731         if (qp != NULL) {
2732                 hp->qfe_parent = qp;
2733                 hp->qfe_ent = qfe_slot;
2734                 qp->happy_meals[qfe_slot] = dev;
2735                 quattro_apply_ranges(qp, hp);
2736         }
2737 
2738         hp->gregs = sbus_ioremap(&sdev->resource[0], 0,
2739                                  GREG_REG_SIZE, "HME Global Regs");
2740         if (!hp->gregs) {
2741                 printk(KERN_ERR "happymeal: Cannot map Happy Meal global registers.\n");
2742                 return -ENODEV;
2743         }
2744 
2745         hp->etxregs = sbus_ioremap(&sdev->resource[1], 0,
2746                                    ETX_REG_SIZE, "HME TX Regs");
2747         if (!hp->etxregs) {
2748                 printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Transmit registers.\n");
2749                 return -ENODEV;
2750         }
2751 
2752         hp->erxregs = sbus_ioremap(&sdev->resource[2], 0,
2753                                    ERX_REG_SIZE, "HME RX Regs");
2754         if (!hp->erxregs) {
2755                 printk(KERN_ERR "happymeal: Cannot map Happy Meal MAC Receive registers.\n");
2756                 return -ENODEV;
2757         }
2758 
2759         hp->bigmacregs = sbus_ioremap(&sdev->resource[3], 0,
2760                                       BMAC_REG_SIZE, "HME BIGMAC Regs");
2761         if (!hp->bigmacregs) {
2762                 printk(KERN_ERR "happymeal: Cannot map Happy Meal BIGMAC registers.\n");
2763                 return -ENODEV;
2764         }
2765 
2766         hp->tcvregs = sbus_ioremap(&sdev->resource[4], 0,
2767                                    TCVR_REG_SIZE, "HME Tranceiver Regs");
2768         if (!hp->tcvregs) {
2769                 printk(KERN_ERR "happymeal: Cannot map Happy Meal Tranceiver registers.\n");
2770                 return -ENODEV;
2771         }
2772 
2773         hp->hm_revision = prom_getintdefault(sdev->prom_node, "hm-rev", 0xff);
2774         if (hp->hm_revision == 0xff)
2775                 hp->hm_revision = 0xa0;
2776 
2777         /* Now enable the feature flags we can. */
2778         if (hp->hm_revision == 0x20 || hp->hm_revision == 0x21)
2779                 hp->happy_flags = HFLAG_20_21;
2780         else if (hp->hm_revision != 0xa0)
2781                 hp->happy_flags = HFLAG_NOT_A0;
2782 
2783         if (qp != NULL)
2784                 hp->happy_flags |= HFLAG_QUATTRO;
2785 
2786         /* Get the supported DVMA burst sizes from our Happy SBUS. */
2787         hp->happy_bursts = prom_getintdefault(sdev->bus->prom_node,
2788                                               "burst-sizes", 0x00);
2789 
2790         hp->happy_block = sbus_alloc_consistent(hp->happy_dev,
2791                                                 PAGE_SIZE,
2792                                                 &hp->hblock_dvma);
2793 
2794         /* Force check of the link first time we are brought up. */
2795         hp->linkcheck = 0;
2796 
2797         /* Force timer state to 'asleep' with count of zero. */
2798         hp->timer_state = asleep;
2799         hp->timer_ticks = 0;
2800 
2801         init_timer(&hp->happy_timer);
2802 
2803         hp->dev = dev;
2804         dev->open = &happy_meal_open;
2805         dev->stop = &happy_meal_close;
2806         dev->hard_start_xmit = &happy_meal_start_xmit;
2807         dev->get_stats = &happy_meal_get_stats;
2808         dev->set_multicast_list = &happy_meal_set_multicast;
2809         dev->tx_timeout = &happy_meal_tx_timeout;
2810         dev->watchdog_timeo = 5*HZ;
2811         dev->do_ioctl = &happy_meal_ioctl;
2812 
2813         /* Happy Meal can do it all... */
2814         dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
2815 
2816         dev->irq = sdev->irqs[0];
2817 
2818 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
2819         /* Hook up PCI register/dma accessors. */
2820         hp->read_desc32 = sbus_hme_read_desc32;
2821         hp->write_txd = sbus_hme_write_txd;
2822         hp->write_rxd = sbus_hme_write_rxd;
2823         hp->dma_map = (u32 (*)(void *, void *, long, int))sbus_map_single;
2824         hp->dma_unmap = (void (*)(void *, u32, long, int))sbus_unmap_single;
2825         hp->dma_sync = (void (*)(void *, u32, long, int))sbus_dma_sync_single;
2826         hp->read32 = sbus_hme_read32;
2827         hp->write32 = sbus_hme_write32;
2828 #endif
2829 
2830         /* Grrr, Happy Meal comes up by default not advertising
2831          * full duplex 100baseT capabilities, fix this.
2832          */
2833         happy_meal_set_initial_advertisement(hp);
2834 
2835         ether_setup(dev);
2836 
2837         /* We are home free at this point, link us in to the happy
2838          * device list.
2839          */
2840         dev->ifindex = dev_new_index();
2841         hp->next_module = root_happy_dev;
2842         root_happy_dev = hp;
2843 
2844         return 0;
2845 }
2846 #endif
2847 
2848 #ifdef CONFIG_PCI
2849 static int __init happy_meal_pci_init(struct pci_dev *pdev)
2850 {
2851         struct quattro *qp = NULL;
2852 #ifdef __sparc__
2853         struct pcidev_cookie *pcp;
2854         int node;
2855 #endif
2856         struct happy_meal *hp;
2857         struct net_device *dev;
2858         unsigned long hpreg_base;
2859         int i, qfe_slot = -1;
2860         char prom_name[64];
2861 
2862         /* Now make sure pci_dev cookie is there. */
2863 #ifdef __sparc__
2864         pcp = pdev->sysdata;
2865         if (pcp == NULL || pcp->prom_node == -1) {
2866                 printk(KERN_ERR "happymeal(PCI): Some PCI device info missing\n");
2867                 return -ENODEV;
2868         }
2869         node = pcp->prom_node;
2870         
2871         prom_getstring(node, "name", prom_name, sizeof(prom_name));
2872 #else
2873 /* This needs to be corrected... -DaveM */
2874         strcpy(prom_name, "qfe");
2875 #endif
2876 
2877         if (!strcmp(prom_name, "SUNW,qfe") || !strcmp(prom_name, "qfe")) {
2878                 qp = quattro_pci_find(pdev);
2879                 if (qp == NULL)
2880                         return -ENODEV;
2881                 for (qfe_slot = 0; qfe_slot < 4; qfe_slot++)
2882                         if (qp->happy_meals[qfe_slot] == NULL)
2883                                 break;
2884                 if (qfe_slot == 4)
2885                         return -ENODEV;
2886         }
2887 
2888         dev = init_etherdev(NULL, sizeof(struct happy_meal));
2889         if (!dev)
2890                 return -ENOMEM;
2891         SET_MODULE_OWNER(dev);
2892 
2893         if (hme_version_printed++ == 0)
2894                 printk(KERN_INFO "%s", version);
2895 
2896         if (!qfe_slot) {
2897                 struct pci_dev *qpdev = qp->quattro_dev;
2898 
2899                 prom_name[0] = 0;
2900                 if (!strncmp(dev->name, "eth", 3)) {
2901                         int i = simple_strtoul(dev->name + 3, NULL, 10);
2902                         sprintf(prom_name, "-%d", i + 3);
2903                 }
2904                 printk(KERN_INFO "%s%s: Quattro HME (PCI/CheerIO) 10/100baseT Ethernet ", dev->name, prom_name);
2905                 if (qpdev->vendor == PCI_VENDOR_ID_DEC &&
2906                     qpdev->device == PCI_DEVICE_ID_DEC_21153)
2907                         printk("DEC 21153 PCI Bridge\n");
2908                 else
2909                         printk("unknown bridge %04x.%04x\n", 
2910                                 qpdev->vendor, qpdev->device);
2911         }
2912         if (qfe_slot != -1)
2913                 printk(KERN_INFO "%s: Quattro HME slot %d (PCI/CheerIO) 10/100baseT Ethernet ",
2914                        dev->name, qfe_slot);
2915         else
2916                 printk(KERN_INFO "%s: HAPPY MEAL (PCI/CheerIO) 10/100BaseT Ethernet ",
2917                        dev->name);
2918 
2919         dev->base_addr = (long) pdev;
2920 
2921         hp = (struct happy_meal *)dev->priv;
2922         memset(hp, 0, sizeof(*hp));
2923 
2924         hp->happy_dev = pdev;
2925 
2926         spin_lock_init(&hp->happy_lock);
2927 
2928         if (qp != NULL) {
2929                 hp->qfe_parent = qp;
2930                 hp->qfe_ent = qfe_slot;
2931                 qp->happy_meals[qfe_slot] = dev;
2932         }               
2933 
2934         hpreg_base = pci_resource_start(pdev, 0);
2935         if ((pci_resource_flags(pdev, 0) & IORESOURCE_IO) != 0) {
2936                 printk(KERN_ERR "happymeal(PCI): Cannot find proper PCI device base address.\n");
2937                 return -ENODEV;
2938         }
2939         if ((hpreg_base = (unsigned long) ioremap(hpreg_base, 0x8000)) == 0) {
2940                 printk(KERN_ERR "happymeal(PCI): Unable to remap card memory.\n");
2941                 return -ENODEV;
2942         }
2943 
2944         for (i = 0; i < 6; i++) {
2945                 if (macaddr[i] != 0)
2946                         break;
2947         }
2948         if (i < 6) { /* a mac address was given */
2949                 for (i = 0; i < 6; i++)
2950                         dev->dev_addr[i] = macaddr[i];
2951         } else {
2952 #ifdef __sparc__
2953                 if (qfe_slot != -1 &&
2954                     prom_getproplen(node, "local-mac-address") == 6) {
2955                         prom_getproperty(node, "local-mac-address",
2956                                          dev->dev_addr, 6);
2957                 } else {
2958                         memcpy(dev->dev_addr, idprom->id_ethaddr, 6);
2959                 }
2960 #else
2961                 memset(dev->dev_addr, 0, 6);
2962 #endif
2963         }
2964         
2965         for (i = 0; i < 6; i++)
2966                 printk("%2.2x%c", dev->dev_addr[i], i == 5 ? ' ' : ':');
2967 
2968         printk("\n");
2969 
2970         /* Layout registers. */
2971         hp->gregs      = (hpreg_base + 0x0000UL);
2972         hp->etxregs    = (hpreg_base + 0x2000UL);
2973         hp->erxregs    = (hpreg_base + 0x4000UL);
2974         hp->bigmacregs = (hpreg_base + 0x6000UL);
2975         hp->tcvregs    = (hpreg_base + 0x7000UL);
2976 
2977 #ifdef __sparc__
2978         hp->hm_revision = prom_getintdefault(node, "hm-rev", 0xff);
2979         if (hp->hm_revision == 0xff)
2980                 hp->hm_revision = 0xa0;
2981 #else
2982         /* works with this on non-sparc hosts */
2983         hp->hm_revision = 0x20;
2984 #endif
2985 
2986         /* Now enable the feature flags we can. */
2987         if (hp->hm_revision == 0x20 || hp->hm_revision == 0x21)
2988                 hp->happy_flags = HFLAG_20_21;
2989         else if (hp->hm_revision != 0xa0)
2990                 hp->happy_flags = HFLAG_NOT_A0;
2991 
2992         if (qp != NULL)
2993                 hp->happy_flags |= HFLAG_QUATTRO;
2994 
2995         /* And of course, indicate this is PCI. */
2996         hp->happy_flags |= HFLAG_PCI;
2997 
2998 #ifdef __sparc__
2999         /* Assume PCI happy meals can handle all burst sizes. */
3000         hp->happy_bursts = DMA_BURSTBITS;
3001 #endif
3002 
3003         hp->happy_block = (struct hmeal_init_block *)
3004                 pci_alloc_consistent(pdev, PAGE_SIZE, &hp->hblock_dvma);
3005 
3006         if (!hp->happy_block) {
3007                 printk(KERN_ERR "happymeal(PCI): Cannot get hme init block.\n");
3008                 return -ENODEV;
3009         }
3010 
3011         hp->linkcheck = 0;
3012         hp->timer_state = asleep;
3013         hp->timer_ticks = 0;
3014 
3015         init_timer(&hp->happy_timer);
3016 
3017         hp->dev = dev;
3018         dev->open = &happy_meal_open;
3019         dev->stop = &happy_meal_close;
3020         dev->hard_start_xmit = &happy_meal_start_xmit;
3021         dev->get_stats = &happy_meal_get_stats;
3022         dev->set_multicast_list = &happy_meal_set_multicast;
3023         dev->do_ioctl = &happy_meal_ioctl;
3024         dev->irq = pdev->irq;
3025         dev->dma = 0;
3026 
3027         /* Happy Meal can do it all... */
3028         dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;
3029 
3030 #if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
3031         /* Hook up PCI register/dma accessors. */
3032         hp->read_desc32 = pci_hme_read_desc32;
3033         hp->write_txd = pci_hme_write_txd;
3034         hp->write_rxd = pci_hme_write_rxd;
3035         hp->dma_map = (u32 (*)(void *, void *, long, int))pci_map_single;
3036         hp->dma_unmap = (void (*)(void *, u32, long, int))pci_unmap_single;
3037         hp->dma_sync = (void (*)(void *, u32, long, int))pci_dma_sync_single;
3038         hp->read32 = pci_hme_read32;
3039         hp->write32 = pci_hme_write32;
3040 #endif
3041 
3042         /* Grrr, Happy Meal comes up by default not advertising
3043          * full duplex 100baseT capabilities, fix this.
3044          */
3045         happy_meal_set_initial_advertisement(hp);
3046 
3047         ether_setup(dev);
3048 
3049         /* We are home free at this point, link us in to the happy
3050          * device list.
3051          */
3052         dev->ifindex = dev_new_index();
3053         hp->next_module = root_happy_dev;
3054         root_happy_dev = hp;
3055 
3056         return 0;
3057 }
3058 #endif
3059 
3060 #ifdef CONFIG_SBUS
3061 static int __init happy_meal_sbus_probe(void)
3062 {
3063         struct sbus_bus *sbus;
3064         struct sbus_dev *sdev;
3065         int cards = 0;
3066         char model[128];
3067 
3068         for_each_sbus(sbus) {
3069                 for_each_sbusdev(sdev, sbus) {
3070                         char *name = sdev->prom_name;
3071 
3072                         if (!strcmp(name, "SUNW,hme")) {
3073                                 cards++;
3074                                 prom_getstring(sdev->prom_node, "model",
3075                                                model, sizeof(model));
3076                                 if (!strcmp(model, "SUNW,sbus-qfe"))
3077                                         happy_meal_sbus_init(sdev, 1);
3078                                 else
3079                                         happy_meal_sbus_init(sdev, 0);
3080                         } else if (!strcmp(name, "qfe") ||
3081                                    !strcmp(name, "SUNW,qfe")) {
3082                                 cards++;
3083                                 happy_meal_sbus_init(sdev, 1);
3084                         }
3085                 }
3086         }
3087         if (cards != 0)
3088                 quattro_sbus_register_irqs();
3089         return cards;
3090 }
3091 #endif
3092 
3093 #ifdef CONFIG_PCI
3094 static int __init happy_meal_pci_probe(void)
3095 {
3096         struct pci_dev *pdev = NULL;
3097         int cards = 0;
3098 
3099         while ((pdev = pci_find_device(PCI_VENDOR_ID_SUN,
3100                                        PCI_DEVICE_ID_SUN_HAPPYMEAL, pdev)) != NULL) {
3101                 if (pci_enable_device(pdev))
3102                         continue;
3103                 cards++;
3104                 happy_meal_pci_init(pdev);
3105         }
3106         return cards;
3107 }
3108 #endif
3109 
3110 static int __init happy_meal_probe(void)
3111 {
3112         static int called = 0;
3113         int cards;
3114 
3115         root_happy_dev = NULL;
3116 
3117         if (called)
3118                 return -ENODEV;
3119         called++;
3120 
3121         cards = 0;
3122 #ifdef CONFIG_SBUS
3123         cards += happy_meal_sbus_probe();
3124 #endif
3125 #ifdef CONFIG_PCI
3126         cards += happy_meal_pci_probe();
3127 #endif
3128         if (!cards)
3129                 return -ENODEV;
3130         return 0;
3131 }
3132 
3133 
3134 static void __exit happy_meal_cleanup_module(void)
3135 {
3136 #ifdef CONFIG_SBUS
3137         struct quattro *last_seen_qfe = NULL;
3138 #endif
3139 
3140         while (root_happy_dev) {
3141                 struct happy_meal *hp = root_happy_dev;
3142                 struct happy_meal *next = root_happy_dev->next_module;
3143 
3144 #ifdef CONFIG_SBUS
3145                 if (!(hp->happy_flags & HFLAG_PCI)) {
3146                         if (hp->happy_flags & HFLAG_QUATTRO) {
3147                                 if (hp->qfe_parent != last_seen_qfe) {
3148                                         free_irq(hp->dev->irq, hp->qfe_parent);
3149                                         last_seen_qfe = hp->qfe_parent;
3150                                 }
3151                         }
3152 
3153                         sbus_iounmap(hp->gregs, GREG_REG_SIZE);
3154                         sbus_iounmap(hp->etxregs, ETX_REG_SIZE);
3155                         sbus_iounmap(hp->erxregs, ERX_REG_SIZE);
3156                         sbus_iounmap(hp->bigmacregs, BMAC_REG_SIZE);
3157                         sbus_iounmap(hp->tcvregs, TCVR_REG_SIZE);
3158                         sbus_free_consistent(hp->happy_dev,
3159                                              PAGE_SIZE,
3160                                              hp->happy_block,
3161                                              hp->hblock_dvma);
3162                 }
3163 #endif
3164 #ifdef CONFIG_PCI
3165                 if ((hp->happy_flags & HFLAG_PCI)) {
3166                         pci_free_consistent(hp->happy_dev,
3167                                             PAGE_SIZE,
3168                                             hp->happy_block,
3169                                             hp->hblock_dvma);
3170                         iounmap((void *)hp->gregs);
3171                 }
3172 #endif
3173                 unregister_netdev(hp->dev);
3174                 kfree(hp->dev);
3175                 root_happy_dev = next;
3176         }
3177 }
3178 
3179 module_init(happy_meal_probe);
3180 module_exit(happy_meal_cleanup_module);
3181 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.