force MII access in AR2313 ethernet to KSEG1 instead of physical addresses - why...
[openwrt.git] / target / linux / atheros-2.6 / patches / 130-ar2313_ethernet.patch
1 diff -urN linux.old/drivers/net/ar2313/ar2313.c linux.eth/drivers/net/ar2313/ar2313.c
2 --- linux.old/drivers/net/ar2313/ar2313.c       1970-01-01 01:00:00.000000000 +0100
3 +++ linux.eth/drivers/net/ar2313/ar2313.c       2006-12-16 04:30:44.000000000 +0100
4 @@ -0,0 +1,1545 @@
5 +/*
6 + * ar2313.c: Linux driver for the Atheros AR231z Ethernet device.
7 + *
8 + * Copyright (C) 2004 by Sameer Dekate <sdekate@arubanetworks.com>
9 + * Copyright (C) 2006 Imre Kaloz <kaloz@openwrt.org>
10 + * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
11 + *
12 + * Thanks to Atheros for providing hardware and documentation
13 + * enabling me to write this driver.
14 + *
15 + * This program is free software; you can redistribute it and/or modify
16 + * it under the terms of the GNU General Public License as published by
17 + * the Free Software Foundation; either version 2 of the License, or
18 + * (at your option) any later version.
19 + *
20 + * Additional credits:
21 + *     This code is taken from John Taylor's Sibyte driver and then 
22 + *     modified for the AR2313.
23 + */
24 +
25 +#include <linux/autoconf.h>
26 +#include <linux/module.h>
27 +#include <linux/version.h>
28 +#include <linux/types.h>
29 +#include <linux/errno.h>
30 +#include <linux/ioport.h>
31 +#include <linux/pci.h>
32 +#include <linux/netdevice.h>
33 +#include <linux/etherdevice.h>
34 +#include <linux/skbuff.h>
35 +#include <linux/init.h>
36 +#include <linux/delay.h>
37 +#include <linux/mm.h>
38 +#include <linux/highmem.h>
39 +#include <linux/sockios.h>
40 +#include <linux/pkt_sched.h>
41 +#include <linux/compile.h>
42 +#include <linux/mii.h>
43 +#include <linux/ethtool.h>
44 +#include <linux/ctype.h>
45 +#include <linux/platform_device.h>
46 +
47 +#include <net/sock.h>
48 +#include <net/ip.h>
49 +
50 +#include <asm/system.h>
51 +#include <asm/io.h>
52 +#include <asm/irq.h>
53 +#include <asm/byteorder.h>
54 +#include <asm/uaccess.h>
55 +#include <asm/bootinfo.h>
56 +
57 +#include <ar531x_platform.h>
58 +
59 +#undef INDEX_DEBUG
60 +#define DEBUG     0
61 +#define DEBUG_TX  0
62 +#define DEBUG_RX  0
63 +#define DEBUG_INT 0
64 +#define DEBUG_MC  0
65 +#define DEBUG_ERR 1
66 +
67 +#ifndef min
68 +#define min(a,b)       (((a)<(b))?(a):(b))
69 +#endif
70 +
71 +#ifndef SMP_CACHE_BYTES
72 +#define SMP_CACHE_BYTES        L1_CACHE_BYTES
73 +#endif
74 +
75 +#ifndef SET_MODULE_OWNER
76 +#define SET_MODULE_OWNER(dev)          {do{} while(0);}
77 +#define AR2313_MOD_INC_USE_COUNT       MOD_INC_USE_COUNT
78 +#define AR2313_MOD_DEC_USE_COUNT       MOD_DEC_USE_COUNT
79 +#else
80 +#define AR2313_MOD_INC_USE_COUNT       {do{} while(0);}
81 +#define AR2313_MOD_DEC_USE_COUNT       {do{} while(0);}
82 +#endif
83 +
84 +#define PHYSADDR(a)            ((_ACAST32_ (a)) & 0x1fffffff)
85 +
86 +static char ifname[5] = "bond";
87 +
88 +module_param_string(ifname, ifname, 5, 0);
89 +
90 +#define AR2313_MBOX_SET_BIT  0x8
91 +
92 +#define BOARD_IDX_STATIC       0
93 +#define BOARD_IDX_OVERFLOW     -1
94 +
95 +#include "ar2313_msg.h"
96 +#include "platform.h"
97 +#include "dma.h"
98 +#include "ar2313.h"
99 +
100 +/*
101 + * New interrupt handler strategy:
102 + *
103 + * An old interrupt handler worked using the traditional method of
104 + * replacing an skbuff with a new one when a packet arrives. However
105 + * the rx rings do not need to contain a static number of buffer
106 + * descriptors, thus it makes sense to move the memory allocation out
107 + * of the main interrupt handler and do it in a bottom half handler
108 + * and only allocate new buffers when the number of buffers in the
109 + * ring is below a certain threshold. In order to avoid starving the
110 + * NIC under heavy load it is however necessary to force allocation
111 + * when hitting a minimum threshold. The strategy for alloction is as
112 + * follows:
113 + *
114 + *     RX_LOW_BUF_THRES    - allocate buffers in the bottom half
115 + *     RX_PANIC_LOW_THRES  - we are very low on buffers, allocate
116 + *                           the buffers in the interrupt handler
117 + *     RX_RING_THRES       - maximum number of buffers in the rx ring
118 + *
119 + * One advantagous side effect of this allocation approach is that the
120 + * entire rx processing can be done without holding any spin lock
121 + * since the rx rings and registers are totally independent of the tx
122 + * ring and its registers.  This of course includes the kmalloc's of
123 + * new skb's. Thus start_xmit can run in parallel with rx processing
124 + * and the memory allocation on SMP systems.
125 + *
126 + * Note that running the skb reallocation in a bottom half opens up
127 + * another can of races which needs to be handled properly. In
128 + * particular it can happen that the interrupt handler tries to run
129 + * the reallocation while the bottom half is either running on another
130 + * CPU or was interrupted on the same CPU. To get around this the
131 + * driver uses bitops to prevent the reallocation routines from being
132 + * reentered.
133 + *
134 + * TX handling can also be done without holding any spin lock, wheee
135 + * this is fun! since tx_csm is only written to by the interrupt
136 + * handler.
137 + */
138 +
139 +/*
140 + * Threshold values for RX buffer allocation - the low water marks for
141 + * when to start refilling the rings are set to 75% of the ring
142 + * sizes. It seems to make sense to refill the rings entirely from the
143 + * intrrupt handler once it gets below the panic threshold, that way
144 + * we don't risk that the refilling is moved to another CPU when the
145 + * one running the interrupt handler just got the slab code hot in its
146 + * cache.
147 + */
148 +#define RX_RING_SIZE           AR2313_DESCR_ENTRIES
149 +#define RX_PANIC_THRES         (RX_RING_SIZE/4)
150 +#define RX_LOW_THRES           ((3*RX_RING_SIZE)/4)
151 +#define CRC_LEN                 4
152 +#define RX_OFFSET               2
153 +
154 +#define AR2313_BUFSIZE         (AR2313_MTU + ETH_HLEN + CRC_LEN + RX_OFFSET)
155 +
156 +#ifdef MODULE
157 +MODULE_AUTHOR("Sameer Dekate <sdekate@arubanetworks.com>, Imre Kaloz <kaloz@openwrt.org>, Felix Fietkau <nbd@openwrt.org>");
158 +MODULE_DESCRIPTION("AR2313 Ethernet driver");
159 +#endif
160 +
161 +#if DEBUG
162 +static char version[] __initdata = 
163 +  "ar2313.c: v0.03 2006/07/12  sdekate@arubanetworks.com\n";
164 +#endif /* DEBUG */
165 +
166 +#define virt_to_phys(x) ((u32)(x) & 0x1fffffff)
167 +
168 +// prototypes
169 +static short armiiread(short phy, short reg);
170 +static void armiiwrite(short phy, short reg, short data);
171 +#ifdef TX_TIMEOUT
172 +static void ar2313_tx_timeout(struct net_device *dev);
173 +#endif
174 +static void ar2313_halt(struct net_device *dev);
175 +static void rx_tasklet_func(unsigned long data);
176 +static void ar2313_multicast_list(struct net_device *dev);
177 +
178 +static int probed __initdata = 0;
179 +static unsigned long ar_eth_base;
180 +static unsigned long ar_dma_base;
181 +static unsigned long ar_int_base;
182 +static unsigned long ar_int_mac_mask;
183 +static unsigned long ar_int_phy_mask;
184 +
185 +#ifndef ERR
186 +#define ERR(fmt, args...) printk("%s: " fmt, __func__, ##args)
187 +#endif
188 +
189 +
190 +int __init ar2313_probe(struct platform_device *pdev)
191 +{
192 +       struct net_device *dev;
193 +       struct ar2313_private *sp;
194 +       struct ar531x_eth *cfg;
195 +       struct resource *res;
196 +       int version_disp;
197 +       char name[64] ;
198 +
199 +       if (probed)
200 +           return -ENODEV;
201 +       probed++;
202 +
203 +       version_disp = 0;
204 +       sprintf(name, "%s%%d", ifname) ;
205 +       dev = alloc_etherdev(sizeof(struct ar2313_private));
206 +
207 +       if (dev == NULL) {
208 +       printk(KERN_ERR "ar2313: Unable to allocate net_device structure!\n");
209 +       return -ENOMEM;
210 +       }
211 +
212 +       SET_MODULE_OWNER(dev);
213 +       platform_set_drvdata(pdev, dev);
214 +
215 +       sp = dev->priv;
216 +       sp->dev = dev;
217 +       cfg = pdev->dev.platform_data;
218 +
219 +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eth_membase");
220 +       if (!res)
221 +               return -ENODEV;
222 +       
223 +       sp->link = 0;
224 +       ar_eth_base = res->start;
225 +       ar_dma_base = ar_eth_base + 0x1000;
226 +       ar_int_base = cfg->reset_base;
227 +       ar_int_mac_mask = cfg->reset_mac;
228 +       ar_int_phy_mask = cfg->reset_phy;
229 +       sp->phy = cfg->phy;
230 +
231 +       dev->irq = platform_get_irq_byname(pdev, "eth_irq");
232 +
233 +       spin_lock_init(&sp->lock);
234 +
235 +       /* initialize func pointers */
236 +       dev->open = &ar2313_open;
237 +       dev->stop = &ar2313_close;
238 +       dev->hard_start_xmit = &ar2313_start_xmit;
239 +
240 +       dev->get_stats = &ar2313_get_stats;
241 +       dev->set_multicast_list = &ar2313_multicast_list;
242 +#ifdef TX_TIMEOUT
243 +       dev->tx_timeout = ar2313_tx_timeout;
244 +       dev->watchdog_timeo = AR2313_TX_TIMEOUT;
245 +#endif
246 +       dev->do_ioctl = &ar2313_ioctl;
247 +
248 +       // SAMEER: do we need this?
249 +       dev->features |= NETIF_F_SG | NETIF_F_HIGHDMA;
250 +
251 +       tasklet_init(&sp->rx_tasklet, rx_tasklet_func, (unsigned long) dev);
252 +       tasklet_disable(&sp->rx_tasklet);
253 +
254 +       /* display version info if adapter is found */
255 +       if (!version_disp) {
256 +           /* set display flag to TRUE so that */
257 +           /* we only display this string ONCE */
258 +       version_disp = 1;
259 +#if DEBUG
260 +       printk(version);
261 +#endif /* DEBUG */
262 +       }
263 +
264 +#if 0
265 +       request_region(PHYSADDR(ar_eth_base), ETHERNET_SIZE*ETHERNET_MACS,
266 +                      "AR2313ENET");
267 +#endif
268 +
269 +       sp->eth_regs = ioremap_nocache(PHYSADDR(ar_eth_base), sizeof(*sp->eth_regs));
270 +       if (!sp->eth_regs) {
271 +               printk("Can't remap eth registers\n");
272 +               return(-ENXIO);
273 +       }
274 +
275 +       sp->dma_regs = ioremap_nocache(PHYSADDR(ar_eth_base + 0x1000), sizeof(*sp->dma_regs));
276 +       dev->base_addr = (unsigned int) sp->dma_regs;
277 +       if (!sp->dma_regs) {
278 +               printk("Can't remap DMA registers\n");
279 +               return(-ENXIO);
280 +       }
281 +
282 +       sp->int_regs = ioremap_nocache(PHYSADDR(ar_int_base), 4);
283 +       if (!sp->int_regs) {
284 +               printk("Can't remap INTERRUPT registers\n");
285 +               return(-ENXIO);
286 +       }
287 +
288 +       strncpy(sp->name, "Atheros AR2313", sizeof (sp->name) - 1);
289 +       sp->name [sizeof (sp->name) - 1] = '\0';
290 +
291 +       {
292 +               /* XXX: Will have to rewrite this part later */
293 +               char *configstart;
294 +               unsigned char def_mac[6] = {0, 0xaa, 0xbb, 0xcc, 0xdd, 0xee};
295 +
296 +               configstart = (char *) cfg->board_config;
297 +
298 +               if (!configstart) {
299 +                       printk("no valid mac found, using defaults");
300 +                       memcpy(dev->dev_addr, def_mac, 6);
301 +               } else {
302 +                       memcpy(dev->dev_addr, ((u8 *)configstart)+102, 6);
303 +           }
304 +       }
305 +
306 +       sp->board_idx = BOARD_IDX_STATIC;
307 +
308 +       if (ar2313_init(dev)) {
309 +           /*
310 +            * ar2313_init() calls ar2313_init_cleanup() on error.
311 +            */
312 +           kfree(dev);
313 +           return -ENODEV;
314 +       }
315 +
316 +       if (register_netdev(dev)){
317 +         printk("%s: register_netdev failed\n", __func__);
318 +         return -1;
319 +       }
320 +
321 +       printk("%s: %s: %02x:%02x:%02x:%02x:%02x:%02x, irq %d\n",
322 +              dev->name, sp->name, 
323 +              dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
324 +              dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5],
325 +              dev->irq);
326 +
327 +       /* start link poll timer */
328 +       ar2313_setup_timer(dev);
329 +
330 +       return 0;
331 +}
332 +
333 +#if 0
334 +static void ar2313_dump_regs(struct net_device *dev)
335 +{
336 +       unsigned int *ptr, i;
337 +       struct ar2313_private *sp = (struct ar2313_private *)dev->priv;
338 +
339 +       ptr = (unsigned int *)sp->eth_regs;
340 +       for(i=0; i< (sizeof(ETHERNET_STRUCT)/ sizeof(unsigned int)); i++, ptr++) {
341 +           printk("ENET: %08x = %08x\n", (int)ptr, *ptr);
342 +       }
343 +
344 +       ptr = (unsigned int *)sp->dma_regs;
345 +       for(i=0; i< (sizeof(DMA)/ sizeof(unsigned int)); i++, ptr++) {
346 +           printk("DMA: %08x = %08x\n", (int)ptr, *ptr);
347 +       }
348 +
349 +       ptr = (unsigned int *)sp->int_regs;
350 +       for(i=0; i< (sizeof(INTERRUPT)/ sizeof(unsigned int)); i++, ptr++){
351 +           printk("INT: %08x = %08x\n", (int)ptr, *ptr);
352 +       }
353 +
354 +       for (i = 0; i < AR2313_DESCR_ENTRIES; i++) {
355 +       ar2313_descr_t *td = &sp->tx_ring[i];
356 +           printk("Tx desc %2d: %08x %08x %08x %08x\n", i,
357 +                  td->status, td->devcs, td->addr, td->descr);
358 +       }
359 +}
360 +#endif
361 +
362 +#ifdef TX_TIMEOUT
363 +static void
364 +ar2313_tx_timeout(struct net_device *dev)
365 +{
366 +       struct ar2313_private *sp = (struct ar2313_private *)dev->priv;
367 +       unsigned long flags;
368 +       
369 +#if DEBUG_TX
370 +       printk("Tx timeout\n");
371 +#endif
372 +       spin_lock_irqsave(&sp->lock, flags);
373 +       ar2313_restart(dev);
374 +       spin_unlock_irqrestore(&sp->lock, flags);
375 +}
376 +#endif
377 +
378 +#if DEBUG_MC
379 +static void
380 +printMcList(struct net_device *dev)
381 +{
382 +       struct dev_mc_list *list = dev->mc_list;
383 +       int num=0, i;
384 +       while(list){
385 +               printk("%d MC ADDR ", num);
386 +               for(i=0;i<list->dmi_addrlen;i++) {
387 +                   printk(":%02x", list->dmi_addr[i]);
388 +               }
389 +       list = list->next;
390 +               printk("\n");
391 +       }
392 +}
393 +#endif
394 +
395 +/*
396 + * Set or clear the multicast filter for this adaptor.
397 + * THIS IS ABSOLUTE CRAP, disabled
398 + */
399 +static void
400 +ar2313_multicast_list(struct net_device *dev)
401 +{   
402 +       /* 
403 +        * Always listen to broadcasts and 
404 +        * treat IFF bits independently 
405 +        */
406 +       struct ar2313_private *sp = (struct ar2313_private *)dev->priv;
407 +       unsigned int recognise;
408 +
409 +       recognise = sp->eth_regs->mac_control;
410 +
411 +       if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
412 +               recognise |= MAC_CONTROL_PR;
413 +       } else {
414 +               recognise &= ~MAC_CONTROL_PR;
415 +       }
416 +
417 +       if ((dev->flags & IFF_ALLMULTI) || (dev->mc_count > 15)) {
418 +#if DEBUG_MC
419 +       printMcList(dev);
420 +               printk("%s: all MULTICAST mc_count %d\n", __FUNCTION__, dev->mc_count);
421 +#endif
422 +               recognise |= MAC_CONTROL_PM;/* all multicast */
423 +       } else if (dev->mc_count > 0) {
424 +#if DEBUG_MC
425 +       printMcList(dev);
426 +               printk("%s: mc_count %d\n", __FUNCTION__, dev->mc_count);
427 +#endif
428 +               recognise |= MAC_CONTROL_PM; /* for the time being */
429 +       }
430 +#if DEBUG_MC
431 +       printk("%s: setting %08x to %08x\n", __FUNCTION__, (int)sp->eth_regs, recognise);
432 +#endif
433 +       
434 +       sp->eth_regs->mac_control = recognise;
435 +}
436 +
437 +static void rx_tasklet_cleanup(struct net_device *dev)
438 +{
439 +       struct ar2313_private *sp = dev->priv;
440 +
441 +       /*
442 +        * Tasklet may be scheduled. Need to get it removed from the list
443 +        * since we're about to free the struct.
444 +        */
445 +
446 +       sp->unloading = 1;
447 +       tasklet_enable(&sp->rx_tasklet);
448 +       tasklet_kill(&sp->rx_tasklet);
449 +}
450 +
451 +static int __exit ar2313_remove(struct platform_device *pdev)
452 +{
453 +       struct net_device *dev = platform_get_drvdata(pdev);
454 +       rx_tasklet_cleanup(dev);
455 +       ar2313_init_cleanup(dev);
456 +       unregister_netdev(dev);
457 +       kfree(dev);
458 +       return 0;
459 +}
460 +
461 +
462 +/*
463 + * Restart the AR2313 ethernet controller. 
464 + */
465 +static int ar2313_restart(struct net_device *dev)
466 +{
467 +       /* disable interrupts */
468 +       disable_irq(dev->irq);
469 +
470 +       /* stop mac */
471 +       ar2313_halt(dev);
472 +       
473 +       /* initialize */
474 +       ar2313_init(dev);
475 +       
476 +       /* enable interrupts */
477 +       enable_irq(dev->irq);
478 +       
479 +       return 0;
480 +}
481 +
482 +static struct platform_driver ar2313_driver = {
483 +       .driver.name = "ar531x-eth",
484 +       .probe = ar2313_probe,
485 +       .remove = ar2313_remove,
486 +};
487 +
488 +int __init ar2313_module_init(void)
489 +{
490 +       return platform_driver_register(&ar2313_driver);
491 +}
492 +
493 +void __exit ar2313_module_cleanup(void)
494 +{
495 +       platform_driver_unregister(&ar2313_driver);
496 +}
497 +
498 +module_init(ar2313_module_init);
499 +module_exit(ar2313_module_cleanup);
500 +
501 +
502 +static void ar2313_free_descriptors(struct net_device *dev)
503 +{
504 +       struct ar2313_private *sp = dev->priv;
505 +       if (sp->rx_ring != NULL) {
506 +       kfree((void*)KSEG0ADDR(sp->rx_ring));
507 +       sp->rx_ring = NULL;
508 +       sp->tx_ring = NULL;
509 +       }
510 +}
511 +
512 +
513 +static int ar2313_allocate_descriptors(struct net_device *dev)
514 +{
515 +       struct ar2313_private *sp = dev->priv;
516 +       int size;
517 +       int j;
518 +       ar2313_descr_t *space;
519 +
520 +       if(sp->rx_ring != NULL){
521 +       printk("%s: already done.\n", __FUNCTION__);
522 +       return 0;
523 +       }
524 +
525 +       size = (sizeof(ar2313_descr_t) * (AR2313_DESCR_ENTRIES * AR2313_QUEUES));
526 +       space = kmalloc(size, GFP_KERNEL);
527 +       if (space == NULL)
528 +           return 1;
529 +
530 +       /* invalidate caches */
531 +       dma_cache_inv((unsigned int)space, size);
532 +
533 +       /* now convert pointer to KSEG1 */
534 +       space = (ar2313_descr_t *)KSEG1ADDR(space);
535 +
536 +       memset((void *)space, 0, size);
537 +
538 +       sp->rx_ring = space;
539 +       space += AR2313_DESCR_ENTRIES;
540 +
541 +       sp->tx_ring = space;
542 +       space += AR2313_DESCR_ENTRIES;
543 +
544 +       /* Initialize the transmit Descriptors */
545 +       for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
546 +       ar2313_descr_t *td = &sp->tx_ring[j];
547 +       td->status = 0;
548 +       td->devcs  = DMA_TX1_CHAINED;
549 +       td->addr   = 0;
550 +       td->descr  = K1_TO_PHYS(&sp->tx_ring[(j+1) & (AR2313_DESCR_ENTRIES-1)]);
551 +       }
552 +
553 +       return 0;
554 +}
555 +
556 +
557 +/*
558 + * Generic cleanup handling data allocated during init. Used when the
559 + * module is unloaded or if an error occurs during initialization
560 + */
561 +static void ar2313_init_cleanup(struct net_device *dev)
562 +{
563 +       struct ar2313_private *sp = dev->priv;
564 +       struct sk_buff *skb;
565 +       int j;
566 +
567 +       ar2313_free_descriptors(dev);
568 +
569 +       if (sp->eth_regs) iounmap((void*)sp->eth_regs);
570 +       if (sp->dma_regs) iounmap((void*)sp->dma_regs);
571 +
572 +       if (sp->rx_skb) {
573 +       for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
574 +           skb = sp->rx_skb[j];
575 +           if (skb) {
576 +               sp->rx_skb[j] = NULL;
577 +               dev_kfree_skb(skb);
578 +           }
579 +       }
580 +       kfree(sp->rx_skb);
581 +       sp->rx_skb = NULL;
582 +       }
583 +
584 +       if (sp->tx_skb) {
585 +       for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
586 +           skb = sp->tx_skb[j];
587 +           if (skb) {
588 +               sp->tx_skb[j] = NULL;
589 +               dev_kfree_skb(skb);
590 +           }
591 +       }
592 +       kfree(sp->tx_skb);
593 +       sp->tx_skb = NULL;
594 +       }
595 +}
596 +
597 +static int ar2313_setup_timer(struct net_device *dev)
598 +{
599 +       struct ar2313_private *sp = dev->priv; 
600 +
601 +       init_timer(&sp->link_timer);
602 +
603 +       sp->link_timer.function = ar2313_link_timer_fn;
604 +       sp->link_timer.data = (int) dev;
605 +       sp->link_timer.expires = jiffies + HZ;
606 +
607 +       add_timer(&sp->link_timer);
608 +       return 0;
609 +
610 +}
611 +
612 +static void ar2313_link_timer_fn(unsigned long data)
613 +{
614 +       struct net_device *dev = (struct net_device *) data;
615 +       struct ar2313_private *sp = dev->priv; 
616 +
617 +       // see if the link status changed
618 +       // This was needed to make sure we set the PHY to the
619 +       // autonegotiated value of half or full duplex.
620 +       ar2313_check_link(dev);
621 +       
622 +       // Loop faster when we don't have link. 
623 +       // This was needed to speed up the AP bootstrap time.
624 +       if(sp->link == 0) {
625 +               mod_timer(&sp->link_timer, jiffies + HZ/2);
626 +       } else {
627 +               mod_timer(&sp->link_timer, jiffies + LINK_TIMER);
628 +       }
629 +}
630 +
631 +static void ar2313_check_link(struct net_device *dev)
632 +{
633 +       struct ar2313_private *sp = dev->priv;
634 +       u16 phyData;
635 +
636 +       phyData = armiiread(sp->phy, MII_BMSR);
637 +       if (sp->phyData != phyData) {
638 +       if (phyData & BMSR_LSTATUS) {
639 +               /* link is present, ready link partner ability to deterine duplexity */
640 +               int duplex = 0;
641 +               u16 reg;
642 +
643 +               sp->link = 1;
644 +               reg = armiiread(sp->phy, MII_BMCR);
645 +               if (reg & BMCR_ANENABLE) {
646 +                   /* auto neg enabled */
647 +                   reg = armiiread(sp->phy, MII_LPA);
648 +                   duplex = (reg & (LPA_100FULL|LPA_10FULL))? 1:0;
649 +               } else {
650 +                   /* no auto neg, just read duplex config */
651 +                   duplex = (reg & BMCR_FULLDPLX)? 1:0;
652 +               }
653 +
654 +               printk(KERN_INFO "%s: Configuring MAC for %s duplex\n", dev->name,
655 +                      (duplex)? "full":"half");
656 +
657 +               if (duplex) {
658 +                   /* full duplex */
659 +                   sp->eth_regs->mac_control = ((sp->eth_regs->mac_control | MAC_CONTROL_F) &
660 +                                                ~MAC_CONTROL_DRO);
661 +               } else {
662 +                   /* half duplex */
663 +                   sp->eth_regs->mac_control = ((sp->eth_regs->mac_control | MAC_CONTROL_DRO) &
664 +                                                ~MAC_CONTROL_F);
665 +               }
666 +               } else {
667 +               /* no link */
668 +               sp->link = 0;
669 +               }
670 +           sp->phyData = phyData;
671 +       }
672 +}
673 +  
674 +static int
675 +ar2313_reset_reg(struct net_device *dev)
676 +{
677 +       struct ar2313_private *sp = (struct ar2313_private *)dev->priv;
678 +       unsigned int ethsal, ethsah;
679 +       unsigned int flags;
680 +
681 +       *sp->int_regs |= ar_int_mac_mask;
682 +       mdelay(10);
683 +       *sp->int_regs &= ~ar_int_mac_mask;
684 +       mdelay(10);
685 +       *sp->int_regs |= ar_int_phy_mask;
686 +       mdelay(10);
687 +       *sp->int_regs &= ~ar_int_phy_mask;
688 +       mdelay(10);
689 +
690 +       sp->dma_regs->bus_mode = (DMA_BUS_MODE_SWR);
691 +       mdelay(10);
692 +       sp->dma_regs->bus_mode = ((32 << DMA_BUS_MODE_PBL_SHIFT) | DMA_BUS_MODE_BLE);
693 +
694 +       /* enable interrupts */
695 +       sp->dma_regs->intr_ena = (DMA_STATUS_AIS |
696 +                             DMA_STATUS_NIS |
697 +                             DMA_STATUS_RI  |
698 +                             DMA_STATUS_TI  |
699 +                             DMA_STATUS_FBE);
700 +       sp->dma_regs->xmt_base = K1_TO_PHYS(sp->tx_ring);
701 +       sp->dma_regs->rcv_base = K1_TO_PHYS(sp->rx_ring);
702 +       sp->dma_regs->control = (DMA_CONTROL_SR | DMA_CONTROL_ST | DMA_CONTROL_SF);
703 +       
704 +       sp->eth_regs->flow_control = (FLOW_CONTROL_FCE);
705 +       sp->eth_regs->vlan_tag = (0x8100);
706 +
707 +       /* Enable Ethernet Interface */
708 +       flags = (MAC_CONTROL_TE  | /* transmit enable */
709 +            MAC_CONTROL_PM  | /* pass mcast */
710 +            MAC_CONTROL_F   | /* full duplex */
711 +            MAC_CONTROL_HBD); /* heart beat disabled */
712 +
713 +       if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */
714 +       flags |= MAC_CONTROL_PR;
715 +       }
716 +       sp->eth_regs->mac_control = flags;
717 +
718 +       /* Set all Ethernet station address registers to their initial values */
719 +       ethsah = ((((u_int)(dev->dev_addr[5]) << 8) & (u_int)0x0000FF00) |
720 +             (((u_int)(dev->dev_addr[4]) << 0) & (u_int)0x000000FF));
721 +
722 +       ethsal = ((((u_int)(dev->dev_addr[3]) << 24) & (u_int)0xFF000000) |
723 +                 (((u_int)(dev->dev_addr[2]) << 16) & (u_int)0x00FF0000) |
724 +                 (((u_int)(dev->dev_addr[1]) <<  8) & (u_int)0x0000FF00) |
725 +                 (((u_int)(dev->dev_addr[0]) <<  0) & (u_int)0x000000FF) );
726 +
727 +       sp->eth_regs->mac_addr[0] = ethsah;
728 +       sp->eth_regs->mac_addr[1] = ethsal;
729 +
730 +       mdelay(10);
731 +
732 +       return(0);
733 +}
734 +
735 +
736 +static int ar2313_init(struct net_device *dev)
737 +{
738 +       struct ar2313_private *sp = dev->priv;
739 +       int ecode=0;
740 +
741 +       /*
742 +        * Allocate descriptors
743 +        */
744 +       if (ar2313_allocate_descriptors(dev)) {
745 +       printk("%s: %s: ar2313_allocate_descriptors failed\n", 
746 +                       dev->name, __FUNCTION__);
747 +       ecode = -EAGAIN;
748 +           goto init_error;
749 +       }
750 +
751 +       /*
752 +        * Get the memory for the skb rings.
753 +        */
754 +       if(sp->rx_skb == NULL) {
755 +       sp->rx_skb = kmalloc(sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES, GFP_KERNEL);
756 +       if (!(sp->rx_skb)) {
757 +           printk("%s: %s: rx_skb kmalloc failed\n", 
758 +                           dev->name, __FUNCTION__);
759 +           ecode = -EAGAIN;
760 +           goto init_error;
761 +       }
762 +       }
763 +       memset(sp->rx_skb, 0, sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES);
764 +
765 +       if(sp->tx_skb == NULL) {
766 +       sp->tx_skb = kmalloc(sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES, GFP_KERNEL);
767 +       if (!(sp->tx_skb)) {
768 +           printk("%s: %s: tx_skb kmalloc failed\n", 
769 +                           dev->name, __FUNCTION__);
770 +           ecode = -EAGAIN;
771 +           goto init_error;
772 +       }
773 +       }
774 +       memset(sp->tx_skb, 0, sizeof(struct sk_buff *) * AR2313_DESCR_ENTRIES);
775 +
776 +       /*
777 +        * Set tx_csm before we start receiving interrupts, otherwise
778 +        * the interrupt handler might think it is supposed to process
779 +        * tx ints before we are up and running, which may cause a null
780 +        * pointer access in the int handler.
781 +        */
782 +       sp->rx_skbprd = 0;
783 +       sp->cur_rx = 0;
784 +       sp->tx_prd = 0;
785 +       sp->tx_csm = 0;
786 +
787 +       /*
788 +        * Zero the stats before starting the interface
789 +        */
790 +       memset(&sp->stats, 0, sizeof(sp->stats));
791 +
792 +       /*
793 +        * We load the ring here as there seem to be no way to tell the
794 +        * firmware to wipe the ring without re-initializing it.
795 +        */
796 +       ar2313_load_rx_ring(dev, RX_RING_SIZE);
797 +
798 +       /* 
799 +        * Init hardware
800 +        */
801 +       ar2313_reset_reg(dev);
802 +
803 +       /*
804 +        * Get the IRQ
805 +        */
806 +       ecode = request_irq(dev->irq, &ar2313_interrupt, IRQF_SHARED | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, dev->name, dev);
807 +       if (ecode) {
808 +           printk(KERN_WARNING "%s: %s: Requested IRQ %d is busy\n",
809 +              dev->name, __FUNCTION__, dev->irq);
810 +       goto init_error;
811 +       }
812 +
813 +
814 +       tasklet_enable(&sp->rx_tasklet);
815 +
816 +       return 0;
817 +
818 + init_error:
819 +       ar2313_init_cleanup(dev);
820 +       return ecode;
821 +}
822 +
823 +/*
824 + * Load the rx ring.
825 + *
826 + * Loading rings is safe without holding the spin lock since this is
827 + * done only before the device is enabled, thus no interrupts are
828 + * generated and by the interrupt handler/tasklet handler.
829 + */
830 +static void ar2313_load_rx_ring(struct net_device *dev, int nr_bufs)
831 +{
832 +
833 +       struct ar2313_private *sp = ((struct net_device *)dev)->priv;
834 +       short i, idx;
835 +
836 +       idx = sp->rx_skbprd;
837 +
838 +       for (i = 0; i < nr_bufs; i++) {
839 +           struct sk_buff *skb;
840 +       ar2313_descr_t *rd;
841 +
842 +       if (sp->rx_skb[idx]) {
843 +#if DEBUG_RX
844 +           printk(KERN_INFO "ar2313 rx refill full\n");
845 +#endif /* DEBUG */
846 +           break;
847 +       }
848 +
849 +           // partha: create additional room for the second GRE fragment
850 +       skb = alloc_skb(AR2313_BUFSIZE+128, GFP_ATOMIC);
851 +       if (!skb) {
852 +           printk("\n\n\n\n %s: No memory in system\n\n\n\n", __FUNCTION__);
853 +           break;
854 +       }
855 +           // partha: create additional room in the front for tx pkt capture
856 +           skb_reserve(skb, 32);
857 +
858 +       /*
859 +        * Make sure IP header starts on a fresh cache line.
860 +        */
861 +       skb->dev = dev;
862 +       skb_reserve(skb, RX_OFFSET);
863 +       sp->rx_skb[idx] = skb;
864 +
865 +       rd = (ar2313_descr_t *) &sp->rx_ring[idx];
866 +
867 +       /* initialize dma descriptor */
868 +       rd->devcs  = ((AR2313_BUFSIZE << DMA_RX1_BSIZE_SHIFT) |
869 +                         DMA_RX1_CHAINED);
870 +       rd->addr   = virt_to_phys(skb->data);
871 +       rd->descr  = virt_to_phys(&sp->rx_ring[(idx+1) & (AR2313_DESCR_ENTRIES-1)]);
872 +       rd->status = DMA_RX_OWN;
873 +
874 +       idx = DSC_NEXT(idx);
875 +       }
876 +
877 +       if (!i) {
878 +#if DEBUG_ERR
879 +           printk(KERN_INFO "Out of memory when allocating standard receive buffers\n");
880 +#endif /* DEBUG */
881 +       } else {
882 +       sp->rx_skbprd = idx;
883 +       }
884 +
885 +       return;
886 +}
887 +
888 +#define AR2313_MAX_PKTS_PER_CALL        64
889 +
890 +static int ar2313_rx_int(struct net_device *dev)
891 +{
892 +       struct ar2313_private *sp = dev->priv;
893 +       struct sk_buff *skb, *skb_new;
894 +       ar2313_descr_t *rxdesc;
895 +       unsigned int status;
896 +       u32 idx;
897 +       int pkts = 0;
898 +       int rval;
899 +
900 +       idx = sp->cur_rx;
901 +
902 +       /* process at most the entire ring and then wait for another interrupt */
903 +       while(1) {
904 +
905 +       rxdesc = &sp->rx_ring[idx];
906 +       status = rxdesc->status;
907 +       if (status & DMA_RX_OWN) {
908 +           /* SiByte owns descriptor or descr not yet filled in */
909 +               rval = 0;
910 +           break;
911 +       }
912 +
913 +           if (++pkts > AR2313_MAX_PKTS_PER_CALL) {
914 +               rval = 1;
915 +               break;
916 +           }
917 +
918 +#if DEBUG_RX
919 +       printk("index %d\n", idx);
920 +       printk("RX status %08x\n", rxdesc->status);
921 +       printk("RX devcs  %08x\n", rxdesc->devcs );
922 +       printk("RX addr   %08x\n", rxdesc->addr  );
923 +       printk("RX descr  %08x\n", rxdesc->descr );
924 +#endif
925 +
926 +           if ((status & (DMA_RX_ERROR|DMA_RX_ERR_LENGTH)) &&
927 +           (!(status & DMA_RX_LONG))){
928 +#if DEBUG_RX
929 +           printk("%s: rx ERROR %08x\n", __FUNCTION__, status);
930 +#endif
931 +           sp->stats.rx_errors++;
932 +           sp->stats.rx_dropped++;
933 +
934 +           /* add statistics counters */
935 +           if (status & DMA_RX_ERR_CRC)    sp->stats.rx_crc_errors++;
936 +           if (status & DMA_RX_ERR_COL)    sp->stats.rx_over_errors++;
937 +           if (status & DMA_RX_ERR_LENGTH)
938 +                   sp->stats.rx_length_errors++;
939 +           if (status & DMA_RX_ERR_RUNT)   sp->stats.rx_over_errors++;
940 +           if (status & DMA_RX_ERR_DESC)   sp->stats.rx_over_errors++;
941 +
942 +       } else {
943 +           /* alloc new buffer. */
944 +           skb_new = dev_alloc_skb(AR2313_BUFSIZE + RX_OFFSET + 128);
945 +           if (skb_new != NULL) {
946 +
947 +                   skb = sp->rx_skb[idx];
948 +               /* set skb */
949 +                   skb_put(skb, ((status >> DMA_RX_LEN_SHIFT) & 0x3fff) - CRC_LEN);
950 +
951 +#ifdef CONFIG_MERLOT
952 +               if ((dev->am_pkt_handler == NULL) || 
953 +                       (dev->am_pkt_handler(skb, dev) == 0)) {
954 +#endif
955 +                     sp->stats.rx_bytes += skb->len;
956 +                     skb->protocol = eth_type_trans(skb, dev);
957 +                     /* pass the packet to upper layers */
958 +
959 +#ifdef CONFIG_MERLOT
960 +                     if (dev->asap_netif_rx)
961 +                         dev->asap_netif_rx(skb);
962 +                     else
963 +#endif
964 +                     netif_rx(skb);
965 +#ifdef CONFIG_MERLOT
966 +               }
967 +#endif
968 +               skb_new->dev = dev;
969 +               /* 16 bit align */
970 +               skb_reserve(skb_new, RX_OFFSET+32);
971 +               /* reset descriptor's curr_addr */
972 +               rxdesc->addr = virt_to_phys(skb_new->data); 
973 +
974 +               sp->stats.rx_packets++;
975 +               sp->rx_skb[idx] = skb_new;
976 +
977 +           } else {
978 +               sp->stats.rx_dropped++;
979 +           }
980 +       }
981 +
982 +       rxdesc->devcs = ((AR2313_BUFSIZE << DMA_RX1_BSIZE_SHIFT) | 
983 +                            DMA_RX1_CHAINED);
984 +       rxdesc->status = DMA_RX_OWN;
985 +
986 +       idx = DSC_NEXT(idx);
987 +       }
988 +
989 +       sp->cur_rx = idx;
990 +
991 +       return rval;
992 +}
993 +
994 +
995 +static void ar2313_tx_int(struct net_device *dev)
996 +{
997 +       struct ar2313_private *sp = dev->priv;
998 +       u32 idx;
999 +       struct sk_buff *skb;
1000 +       ar2313_descr_t *txdesc;
1001 +       unsigned int status=0;
1002 +
1003 +       idx = sp->tx_csm;
1004 +
1005 +       while (idx != sp->tx_prd) {
1006 +
1007 +       txdesc = &sp->tx_ring[idx];
1008 +
1009 +#if DEBUG_TX
1010 +       printk("%s: TXINT: csm=%d idx=%d prd=%d status=%x devcs=%x addr=%08x descr=%x\n", 
1011 +               dev->name, sp->tx_csm, idx, sp->tx_prd,
1012 +               txdesc->status, txdesc->devcs, txdesc->addr, txdesc->descr);
1013 +#endif /* DEBUG */
1014 +
1015 +       if ((status = txdesc->status) & DMA_TX_OWN) {
1016 +           /* ar2313 dma still owns descr */
1017 +           break;
1018 +       }
1019 +       /* done with this descriptor */
1020 +       dma_unmap_single(NULL, txdesc->addr, txdesc->devcs & DMA_TX1_BSIZE_MASK, DMA_TO_DEVICE);
1021 +       txdesc->status = 0;
1022 +
1023 +       if (status & DMA_TX_ERROR){
1024 +               sp->stats.tx_errors++;
1025 +               sp->stats.tx_dropped++;
1026 +               if(status & DMA_TX_ERR_UNDER)
1027 +                       sp->stats.tx_fifo_errors++;
1028 +               if(status & DMA_TX_ERR_HB)
1029 +                       sp->stats.tx_heartbeat_errors++;
1030 +               if(status & (DMA_TX_ERR_LOSS |
1031 +                                DMA_TX_ERR_LINK))
1032 +                       sp->stats.tx_carrier_errors++;
1033 +                   if (status & (DMA_TX_ERR_LATE|
1034 +                                 DMA_TX_ERR_COL |
1035 +                                 DMA_TX_ERR_JABBER |
1036 +                                 DMA_TX_ERR_DEFER))
1037 +                       sp->stats.tx_aborted_errors++;
1038 +       } else {
1039 +               /* transmit OK */
1040 +               sp->stats.tx_packets++;
1041 +       }
1042 +
1043 +       skb = sp->tx_skb[idx];
1044 +       sp->tx_skb[idx] = NULL;
1045 +       idx = DSC_NEXT(idx);
1046 +       sp->stats.tx_bytes += skb->len;
1047 +       dev_kfree_skb_irq(skb);
1048 +       }
1049 +
1050 +       sp->tx_csm = idx;
1051 +
1052 +       return;
1053 +}
1054 +
1055 +
1056 +static void
1057 +rx_tasklet_func(unsigned long data)
1058 +{
1059 +       struct net_device *dev = (struct net_device *) data;
1060 +       struct ar2313_private *sp = dev->priv;
1061 +
1062 +       if (sp->unloading) {
1063 +           return;
1064 +       }
1065 +
1066 +           if (ar2313_rx_int(dev)) {
1067 +               tasklet_hi_schedule(&sp->rx_tasklet);
1068 +           }
1069 +           else {
1070 +               unsigned long flags;
1071 +               spin_lock_irqsave(&sp->lock, flags);
1072 +               sp->dma_regs->intr_ena |= DMA_STATUS_RI;
1073 +               spin_unlock_irqrestore(&sp->lock, flags);
1074 +           }
1075 +}
1076 +
1077 +static void
1078 +rx_schedule(struct net_device *dev)
1079 +{
1080 +       struct ar2313_private *sp = dev->priv;
1081 +
1082 +       sp->dma_regs->intr_ena &= ~DMA_STATUS_RI;
1083 +
1084 +       tasklet_hi_schedule(&sp->rx_tasklet);
1085 +}
1086 +
1087 +static irqreturn_t ar2313_interrupt(int irq, void *dev_id)
1088 +{
1089 +       struct net_device *dev = (struct net_device *)dev_id;
1090 +       struct ar2313_private *sp = dev->priv;
1091 +       unsigned int status, enabled;
1092 +
1093 +       /* clear interrupt */
1094 +       /*
1095 +        * Don't clear RI bit if currently disabled.
1096 +        */
1097 +       status = sp->dma_regs->status;
1098 +       enabled = sp->dma_regs->intr_ena;
1099 +       sp->dma_regs->status = status & enabled;
1100 +
1101 +       if (status & DMA_STATUS_NIS) {
1102 +       /* normal status */
1103 +           /*
1104 +            * Don't schedule rx processing if interrupt
1105 +            * is already disabled.
1106 +            */
1107 +       if (status & enabled & DMA_STATUS_RI) {
1108 +           /* receive interrupt */
1109 +           rx_schedule(dev);
1110 +       }
1111 +       if (status & DMA_STATUS_TI) {
1112 +          /* transmit interrupt */
1113 +           ar2313_tx_int(dev);
1114 +       }
1115 +       }
1116 +
1117 +       if (status & DMA_STATUS_AIS) {
1118 +#if DEBUG_INT
1119 +           printk("%s: AIS set %08x & %x\n", __FUNCTION__,
1120 +                  status, (DMA_STATUS_FBE | DMA_STATUS_TPS));
1121 +#endif
1122 +       /* abnormal status */
1123 +       if (status & (DMA_STATUS_FBE | DMA_STATUS_TPS)) {
1124 +           ar2313_restart(dev);
1125 +       }
1126 +       }
1127 +       return IRQ_HANDLED;
1128 +}
1129 +
1130 +
1131 +static int ar2313_open(struct net_device *dev)
1132 +{
1133 +       struct ar2313_private *sp;
1134 +
1135 +       sp = dev->priv;
1136 +
1137 +       dev->mtu = 1500;
1138 +       netif_start_queue(dev);
1139 +
1140 +       sp->eth_regs->mac_control |= MAC_CONTROL_RE;
1141 +
1142 +       AR2313_MOD_INC_USE_COUNT;
1143 +
1144 +       return 0;
1145 +}
1146 +
1147 +static void ar2313_halt(struct net_device *dev)
1148 +{
1149 +       struct ar2313_private *sp = dev->priv;
1150 +       int j;
1151 +
1152 +       tasklet_disable(&sp->rx_tasklet);
1153 +
1154 +       /* kill the MAC */
1155 +       sp->eth_regs->mac_control &= ~(MAC_CONTROL_RE | /* disable Receives */
1156 +                                      MAC_CONTROL_TE); /* disable Transmits */
1157 +       /* stop dma */
1158 +       sp->dma_regs->control = 0;
1159 +       sp->dma_regs->bus_mode = DMA_BUS_MODE_SWR;
1160 +
1161 +       /* place phy and MAC in reset */
1162 +       *sp->int_regs |= (ar_int_mac_mask | ar_int_phy_mask);
1163 +
1164 +       /* free buffers on tx ring */
1165 +       for (j = 0; j < AR2313_DESCR_ENTRIES; j++) {
1166 +       struct sk_buff *skb;
1167 +       ar2313_descr_t *txdesc;
1168 +
1169 +       txdesc = &sp->tx_ring[j];
1170 +       txdesc->descr = 0;
1171 +
1172 +       skb = sp->tx_skb[j];
1173 +       if (skb) {
1174 +           dev_kfree_skb(skb);
1175 +           sp->tx_skb[j] = NULL;
1176 +       }
1177 +       }
1178 +}
1179 +
1180 +/*
1181 + * close should do nothing. Here's why. It's called when
1182 + * 'ifconfig bond0 down' is run. If it calls free_irq then
1183 + * the irq is gone forever ! When bond0 is made 'up' again,
1184 + * the ar2313_open () does not call request_irq (). Worse,
1185 + * the call to ar2313_halt() generates a WDOG reset due to
1186 + * the write to 'sp->int_regs' and the box reboots.
1187 + * Commenting this out is good since it allows the
1188 + * system to resume when bond0 is made up again.
1189 + */
1190 +static int ar2313_close(struct net_device *dev)
1191 +{
1192 +#if 0
1193 +       /*
1194 +        * Disable interrupts
1195 +        */
1196 +       disable_irq(dev->irq);
1197 +               
1198 +       /*
1199 +        * Without (or before) releasing irq and stopping hardware, this
1200 +        * is an absolute non-sense, by the way. It will be reset instantly
1201 +        * by the first irq.
1202 +        */
1203 +       netif_stop_queue(dev);
1204 +
1205 +       /* stop the MAC and DMA engines */
1206 +       ar2313_halt(dev);
1207 +
1208 +       /* release the interrupt */
1209 +       free_irq(dev->irq, dev);
1210 +
1211 +#endif
1212 +       AR2313_MOD_DEC_USE_COUNT;
1213 +       return 0;
1214 +}
1215 +
1216 +static int ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev)
1217 +{
1218 +       struct ar2313_private *sp = dev->priv;
1219 +       ar2313_descr_t *td;
1220 +       u32 idx;
1221 +
1222 +       idx = sp->tx_prd;
1223 +       td = &sp->tx_ring[idx];
1224 +
1225 +       if (td->status & DMA_TX_OWN) {
1226 +#if DEBUG_TX
1227 +       printk("%s: No space left to Tx\n", __FUNCTION__);
1228 +#endif
1229 +           /* free skbuf and lie to the caller that we sent it out */
1230 +           sp->stats.tx_dropped++;
1231 +       dev_kfree_skb(skb);
1232 +
1233 +           /* restart transmitter in case locked */
1234 +           sp->dma_regs->xmt_poll = 0;
1235 +       return 0;
1236 +       }
1237 +
1238 +       /* Setup the transmit descriptor. */
1239 +       td->devcs = ((skb->len << DMA_TX1_BSIZE_SHIFT) | 
1240 +                    (DMA_TX1_LS|DMA_TX1_IC|DMA_TX1_CHAINED));
1241 +       td->addr = dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE);
1242 +       td->status = DMA_TX_OWN;
1243 +
1244 +       /* kick transmitter last */
1245 +       sp->dma_regs->xmt_poll = 0;
1246 +
1247 +#if DEBUG_TX
1248 +       printk("index %d\n", idx);
1249 +       printk("TX status %08x\n", td->status);
1250 +       printk("TX devcs  %08x\n", td->devcs );
1251 +       printk("TX addr   %08x\n", td->addr  );
1252 +       printk("TX descr  %08x\n", td->descr );
1253 +#endif
1254 +
1255 +       sp->tx_skb[idx] = skb;
1256 +       idx = DSC_NEXT(idx);
1257 +       sp->tx_prd = idx;
1258 +
1259 +       //dev->trans_start = jiffies;
1260 +
1261 +       return 0;
1262 +}
1263 +
1264 +static int netdev_get_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1265 +{
1266 +       struct ar2313_private *np = dev->priv;
1267 +       u32 tmp;
1268 +
1269 +       ecmd->supported = 
1270 +               (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
1271 +               SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
1272 +               SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII);
1273 +       
1274 +           ecmd->port = PORT_TP;
1275 +       /* only supports internal transceiver */
1276 +       ecmd->transceiver = XCVR_INTERNAL;
1277 +       /* not sure what this is for */
1278 +       ecmd->phy_address = 1;
1279 +
1280 +       ecmd->advertising = ADVERTISED_MII;
1281 +       tmp = armiiread(np->phy, MII_ADVERTISE);
1282 +       if (tmp & ADVERTISE_10HALF)
1283 +               ecmd->advertising |= ADVERTISED_10baseT_Half;
1284 +       if (tmp & ADVERTISE_10FULL)
1285 +               ecmd->advertising |= ADVERTISED_10baseT_Full;
1286 +       if (tmp & ADVERTISE_100HALF)
1287 +               ecmd->advertising |= ADVERTISED_100baseT_Half;
1288 +       if (tmp & ADVERTISE_100FULL)
1289 +               ecmd->advertising |= ADVERTISED_100baseT_Full;
1290 +
1291 +       tmp = armiiread(np->phy, MII_BMCR);
1292 +       if (tmp & BMCR_ANENABLE) {
1293 +               ecmd->advertising |= ADVERTISED_Autoneg;
1294 +               ecmd->autoneg = AUTONEG_ENABLE;
1295 +       } else {
1296 +               ecmd->autoneg = AUTONEG_DISABLE;
1297 +       }
1298 +
1299 +           if (ecmd->autoneg == AUTONEG_ENABLE) {
1300 +               tmp = armiiread(np->phy, MII_LPA);
1301 +               if (tmp & (LPA_100FULL|LPA_10FULL)) {
1302 +                   ecmd->duplex = DUPLEX_FULL;
1303 +               } else {
1304 +                   ecmd->duplex = DUPLEX_HALF;
1305 +               }
1306 +               if (tmp & (LPA_100FULL|LPA_100HALF)) {
1307 +               ecmd->speed = SPEED_100;
1308 +               } else {
1309 +               ecmd->speed = SPEED_10;
1310 +               }
1311 +           } else {
1312 +               if (tmp & BMCR_FULLDPLX) {
1313 +                   ecmd->duplex = DUPLEX_FULL;
1314 +               } else {
1315 +                   ecmd->duplex = DUPLEX_HALF;
1316 +               }
1317 +               if (tmp & BMCR_SPEED100) {
1318 +               ecmd->speed = SPEED_100;
1319 +               } else {
1320 +               ecmd->speed = SPEED_10;
1321 +               }
1322 +       }
1323 +
1324 +       /* ignore maxtxpkt, maxrxpkt for now */
1325 +
1326 +       return 0;
1327 +}
1328 +
1329 +static int netdev_set_ecmd(struct net_device *dev, struct ethtool_cmd *ecmd)
1330 +{
1331 +       struct ar2313_private *np = dev->priv;
1332 +       u32 tmp;
1333 +
1334 +       if (ecmd->speed != SPEED_10 && ecmd->speed != SPEED_100)
1335 +               return -EINVAL;
1336 +       if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
1337 +               return -EINVAL;
1338 +       if (ecmd->port != PORT_TP)
1339 +               return -EINVAL;
1340 +       if (ecmd->transceiver != XCVR_INTERNAL)
1341 +               return -EINVAL;
1342 +       if (ecmd->autoneg != AUTONEG_DISABLE && ecmd->autoneg != AUTONEG_ENABLE)
1343 +               return -EINVAL;
1344 +       /* ignore phy_address, maxtxpkt, maxrxpkt for now */
1345 +       
1346 +       /* WHEW! now lets bang some bits */
1347 +       
1348 +       tmp = armiiread(np->phy, MII_BMCR);
1349 +       if (ecmd->autoneg == AUTONEG_ENABLE) {
1350 +               /* turn on autonegotiation */
1351 +               tmp |= BMCR_ANENABLE;
1352 +                   printk("%s: Enabling auto-neg\n", dev->name);
1353 +       } else {
1354 +               /* turn off auto negotiation, set speed and duplexity */
1355 +               tmp &= ~(BMCR_ANENABLE | BMCR_SPEED100 | BMCR_FULLDPLX);
1356 +               if (ecmd->speed == SPEED_100)
1357 +                       tmp |= BMCR_SPEED100;
1358 +               if (ecmd->duplex == DUPLEX_FULL)
1359 +                       tmp |= BMCR_FULLDPLX;
1360 +                   printk("%s: Hard coding %d/%s\n", dev->name, 
1361 +                          (ecmd->speed == SPEED_100)? 100:10,
1362 +                          (ecmd->duplex == DUPLEX_FULL)? "full":"half");
1363 +       }
1364 +       armiiwrite(np->phy, MII_BMCR, tmp);
1365 +           np->phyData = 0;
1366 +       return 0;
1367 +}
1368 +
1369 +static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr)
1370 +{
1371 +       struct ar2313_private *np = dev->priv;
1372 +       u32 cmd;
1373 +       
1374 +       if (get_user(cmd, (u32 *)useraddr))
1375 +               return -EFAULT;
1376 +
1377 +           switch (cmd) {
1378 +       /* get settings */
1379 +       case ETHTOOL_GSET: {
1380 +               struct ethtool_cmd ecmd = { ETHTOOL_GSET };
1381 +               spin_lock_irq(&np->lock);
1382 +               netdev_get_ecmd(dev, &ecmd);
1383 +               spin_unlock_irq(&np->lock);
1384 +               if (copy_to_user(useraddr, &ecmd, sizeof(ecmd)))
1385 +                       return -EFAULT;
1386 +               return 0;
1387 +       }
1388 +       /* set settings */
1389 +       case ETHTOOL_SSET: {
1390 +               struct ethtool_cmd ecmd;
1391 +               int r;
1392 +               if (copy_from_user(&ecmd, useraddr, sizeof(ecmd)))
1393 +                       return -EFAULT;
1394 +               spin_lock_irq(&np->lock);
1395 +               r = netdev_set_ecmd(dev, &ecmd);
1396 +               spin_unlock_irq(&np->lock);
1397 +               return r;
1398 +       }
1399 +       /* restart autonegotiation */
1400 +       case ETHTOOL_NWAY_RST: {
1401 +               int tmp;
1402 +               int r = -EINVAL;
1403 +               /* if autoneg is off, it's an error */
1404 +               tmp = armiiread(np->phy, MII_BMCR);
1405 +               if (tmp & BMCR_ANENABLE) {
1406 +                       tmp |= (BMCR_ANRESTART);
1407 +                       armiiwrite(np->phy, MII_BMCR, tmp);
1408 +                       r = 0;
1409 +               }
1410 +               return r;
1411 +       }
1412 +       /* get link status */
1413 +       case ETHTOOL_GLINK: {
1414 +               struct ethtool_value edata = {ETHTOOL_GLINK};
1415 +               edata.data = (armiiread(np->phy, MII_BMSR)&BMSR_LSTATUS) ? 1:0;
1416 +               if (copy_to_user(useraddr, &edata, sizeof(edata)))
1417 +                       return -EFAULT;
1418 +               return 0;
1419 +       }
1420 +           }
1421 +       
1422 +       return -EOPNOTSUPP;
1423 +}
1424 +
1425 +static int ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
1426 +{
1427 +       struct mii_ioctl_data *data = (struct mii_ioctl_data *)&ifr->ifr_data;
1428 +
1429 +       switch (cmd) {
1430 +       case SIOCDEVPRIVATE: {
1431 +           struct ar2313_cmd scmd;
1432 +
1433 +           if (copy_from_user(&scmd, ifr->ifr_data, sizeof(scmd)))
1434 +           return -EFAULT;
1435 +
1436 +#if DEBUG
1437 +       printk("%s: ioctl devprivate c=%d a=%x l=%d m=%d d=%x,%x\n",
1438 +              dev->name, scmd.cmd,
1439 +              scmd.address, scmd.length,
1440 +              scmd.mailbox, scmd.data[0], scmd.data[1]);
1441 +#endif /* DEBUG */
1442 +
1443 +       switch (scmd.cmd) {
1444 +       case AR2313_READ_DATA:
1445 +           if(scmd.length==4){
1446 +               scmd.data[0] = *((u32*)scmd.address);
1447 +           } else if(scmd.length==2) {
1448 +               scmd.data[0] = *((u16*)scmd.address);
1449 +           } else if (scmd.length==1) {
1450 +               scmd.data[0] = *((u8*)scmd.address);
1451 +           } else {
1452 +               return -EOPNOTSUPP;
1453 +           }
1454 +           if(copy_to_user(ifr->ifr_data, &scmd, sizeof(scmd)))
1455 +               return -EFAULT;
1456 +           break;
1457 +
1458 +       case AR2313_WRITE_DATA:
1459 +           if(scmd.length==4){
1460 +               *((u32*)scmd.address) = scmd.data[0];
1461 +           } else if(scmd.length==2) {
1462 +               *((u16*)scmd.address) = scmd.data[0];
1463 +           } else if (scmd.length==1) {
1464 +               *((u8*)scmd.address) = scmd.data[0];
1465 +           } else {
1466 +               return -EOPNOTSUPP;
1467 +           }
1468 +           break;
1469 +
1470 +       case AR2313_GET_VERSION:
1471 +           // SAMEER: sprintf((char*) &scmd, "%s", ARUBA_VERSION);
1472 +           if(copy_to_user(ifr->ifr_data, &scmd, sizeof(scmd)))
1473 +               return -EFAULT;
1474 +           break;
1475 +
1476 +       default:
1477 +           return -EOPNOTSUPP;
1478 +       }
1479 +       return 0;
1480 +       }
1481 +         
1482 +       case SIOCETHTOOL:
1483 +           return netdev_ethtool_ioctl(dev, (void *) ifr->ifr_data);
1484 +
1485 +       case SIOCGMIIPHY:               /* Get address of MII PHY in use. */
1486 +           data->phy_id = 1;
1487 +           /* Fall Through */
1488 +
1489 +       case SIOCGMIIREG:               /* Read MII PHY register. */
1490 +       case SIOCDEVPRIVATE+1:  /* for binary compat, remove in 2.5 */
1491 +           data->val_out = armiiread(data->phy_id & 0x1f, 
1492 +                                     data->reg_num & 0x1f);
1493 +           return 0;
1494 +       case SIOCSMIIREG:               /* Write MII PHY register. */
1495 +       case SIOCDEVPRIVATE+2:  /* for binary compat, remove in 2.5 */
1496 +           if (!capable(CAP_NET_ADMIN))
1497 +               return -EPERM;
1498 +           armiiwrite(data->phy_id & 0x1f, 
1499 +                      data->reg_num & 0x1f, data->val_in);
1500 +           return 0;
1501 +
1502 +       case SIOCSIFHWADDR:
1503 +           if (copy_from_user(dev->dev_addr, ifr->ifr_data, sizeof(dev->dev_addr)))
1504 +               return -EFAULT;
1505 +           return 0;
1506 +
1507 +       case SIOCGIFHWADDR:
1508 +           if (copy_to_user(ifr->ifr_data, dev->dev_addr, sizeof(dev->dev_addr)))
1509 +               return -EFAULT;
1510 +           return 0;
1511 +
1512 +       default:
1513 +           break;
1514 +       }
1515 +
1516 +       return -EOPNOTSUPP;
1517 +}
1518 +
1519 +static struct net_device_stats *ar2313_get_stats(struct net_device *dev)
1520 +{
1521 +  struct ar2313_private *sp = dev->priv;
1522 +       return &sp->stats;
1523 +}
1524 +
1525 +static short
1526 +armiiread(short phy, short reg)
1527 +{
1528 +  volatile ETHERNET_STRUCT * ethernet;
1529 +
1530 +  ethernet = (volatile ETHERNET_STRUCT *)KSEG1ADDR(ar_eth_base); /* always MAC 0 */
1531 +  ethernet->mii_addr = ((reg << MII_ADDR_REG_SHIFT) |
1532 +                           (phy << MII_ADDR_PHY_SHIFT));
1533 +  while (ethernet->mii_addr & MII_ADDR_BUSY);
1534 +  return (ethernet->mii_data >> MII_DATA_SHIFT);
1535 +}
1536 +
1537 +static void
1538 +armiiwrite(short phy, short reg, short data)
1539 +{
1540 +  volatile ETHERNET_STRUCT * ethernet;
1541 +
1542 +  ethernet = (volatile ETHERNET_STRUCT *)KSEG1ADDR(ar_eth_base); /* always MAC 0 */
1543 +  while (ethernet->mii_addr & MII_ADDR_BUSY);
1544 +  ethernet->mii_data = data << MII_DATA_SHIFT;
1545 +  ethernet->mii_addr = ((reg << MII_ADDR_REG_SHIFT) |
1546 +                           (phy << MII_ADDR_PHY_SHIFT) |
1547 +                           MII_ADDR_WRITE);
1548 +}
1549 +
1550 diff -urN linux.old/drivers/net/ar2313/ar2313.h linux.eth/drivers/net/ar2313/ar2313.h
1551 --- linux.old/drivers/net/ar2313/ar2313.h       1970-01-01 01:00:00.000000000 +0100
1552 +++ linux.eth/drivers/net/ar2313/ar2313.h       2006-12-16 04:30:11.000000000 +0100
1553 @@ -0,0 +1,191 @@
1554 +#ifndef _AR2313_H_
1555 +#define _AR2313_H_
1556 +
1557 +#include <linux/autoconf.h>
1558 +#include <asm/bootinfo.h>
1559 +#include "platform.h"
1560 +
1561 +extern unsigned long mips_machtype;
1562 +
1563 +#undef ETHERNET_BASE
1564 +#define ETHERNET_BASE ar_eth_base
1565 +#define ETHERNET_SIZE 0x00100000
1566 +#define ETHERNET_MACS 2
1567 +
1568 +#undef DMA_BASE
1569 +#define DMA_BASE      ar_dma_base
1570 +#define DMA_SIZE      0x00100000
1571 +
1572 +
1573 +/*
1574 + * probe link timer - 5 secs
1575 + */
1576 +#define LINK_TIMER    (5*HZ) 
1577 +
1578 +/*
1579 + * Interrupt register base address
1580 + */
1581 +#define INTERRUPT_BASE    PHYS_TO_K1(ar_int_base)
1582 +
1583 +/*
1584 + * Reset Register
1585 + */
1586 +#define AR531X_RESET    (AR531X_RESETTMR + 0x0020)
1587 +#define RESET_SYSTEM         0x00000001      /* cold reset full system */
1588 +#define RESET_PROC           0x00000002      /* cold reset MIPS core */
1589 +#define RESET_WLAN0          0x00000004      /* cold reset WLAN MAC and BB */
1590 +#define RESET_EPHY0          0x00000008      /* cold reset ENET0 phy */
1591 +#define RESET_EPHY1          0x00000010      /* cold reset ENET1 phy */
1592 +#define RESET_ENET0          0x00000020      /* cold reset ENET0 mac */
1593 +#define RESET_ENET1          0x00000040      /* cold reset ENET1 mac */
1594 +
1595 +#define IS_DMA_TX_INT(X)   (((X) & (DMA_STATUS_TI)) != 0)
1596 +#define IS_DMA_RX_INT(X)   (((X) & (DMA_STATUS_RI)) != 0)
1597 +#define IS_DRIVER_OWNED(X) (((X) & (DMA_TX_OWN))    == 0)
1598 +
1599 +#ifndef K1_TO_PHYS
1600 +// hack
1601 +#define K1_TO_PHYS(x)   (((unsigned int)(x)) & 0x1FFFFFFF)        /* kseg1 to physical */
1602 +#endif
1603 +
1604 +#ifndef PHYS_TO_K1
1605 +// hack
1606 +#define  PHYS_TO_K1(x)   (((unsigned int)(x)) | 0xA0000000)   /* physical to kseg1 */
1607 +#endif
1608 +
1609 +#define AR2313_TX_TIMEOUT (HZ/4)
1610 +
1611 +/*
1612 + * Rings
1613 + */
1614 +#define DSC_RING_ENTRIES_SIZE  (AR2313_DESCR_ENTRIES * sizeof(struct desc))
1615 +#define DSC_NEXT(idx)          ((idx + 1) & (AR2313_DESCR_ENTRIES - 1))
1616 +
1617 +static inline int tx_space (u32 csm, u32 prd)
1618 +{
1619 +       return (csm - prd - 1) & (AR2313_DESCR_ENTRIES - 1);
1620 +}
1621 +
1622 +#if MAX_SKB_FRAGS
1623 +#define TX_RESERVED    (MAX_SKB_FRAGS+1) /* +1 for message header */
1624 +#define tx_ring_full(csm, prd) (tx_space(csm, prd) <= TX_RESERVED)
1625 +#else
1626 +#define tx_ring_full           0
1627 +#endif
1628 +
1629 +#define AR2313_MBGET           2
1630 +#define AR2313_MBSET           3
1631 +#define AR2313_PCI_RECONFIG    4
1632 +#define AR2313_PCI_DUMP        5
1633 +#define AR2313_TEST_PANIC      6
1634 +#define AR2313_TEST_NULLPTR    7
1635 +#define AR2313_READ_DATA       8
1636 +#define AR2313_WRITE_DATA      9
1637 +#define AR2313_GET_VERSION     10
1638 +#define AR2313_TEST_HANG       11
1639 +#define AR2313_SYNC            12
1640 +
1641 +
1642 +struct ar2313_cmd {
1643 +       u32     cmd;
1644 +       u32     address;      /* virtual address of image */
1645 +       u32     length;       /* size of image to download */
1646 +       u32     mailbox;      /* mailbox to get/set */
1647 +       u32     data[2];      /* contents of mailbox to read/write */
1648 +};
1649 +
1650 +
1651 +/*
1652 + * Struct private for the Sibyte.
1653 + *
1654 + * Elements are grouped so variables used by the tx handling goes
1655 + * together, and will go into the same cache lines etc. in order to
1656 + * avoid cache line contention between the rx and tx handling on SMP.
1657 + *
1658 + * Frequently accessed variables are put at the beginning of the
1659 + * struct to help the compiler generate better/shorter code.
1660 + */
1661 +struct ar2313_private
1662 +{
1663 +       struct net_device *dev;
1664 +       int                     version;
1665 +       u32                     mb[2];
1666 +       
1667 +       volatile ETHERNET_STRUCT        *eth_regs;
1668 +       volatile DMA                    *dma_regs;
1669 +       volatile u32                    *int_regs;
1670 +
1671 +       spinlock_t lock;        /* Serialise access to device */
1672 +
1673 +       /*
1674 +        * RX and TX descriptors, must be adjacent
1675 +        */
1676 +       ar2313_descr_t          *rx_ring;
1677 +       ar2313_descr_t          *tx_ring;
1678 +
1679 +
1680 +       struct sk_buff          **rx_skb;
1681 +       struct sk_buff          **tx_skb;
1682 +
1683 +       /*
1684 +        * RX elements
1685 +        */
1686 +       u32                     rx_skbprd;
1687 +       u32                     cur_rx;
1688 +
1689 +       /*
1690 +        * TX elements
1691 +        */
1692 +       u32                     tx_prd;
1693 +       u32                     tx_csm;
1694 +
1695 +       /*
1696 +        * Misc elements
1697 +        */
1698 +       int                     board_idx;
1699 +       char                    name[48];
1700 +       struct net_device_stats stats;
1701 +       struct {
1702 +           u32 address;
1703 +           u32 length;
1704 +           char *mapping;
1705 +       } desc;
1706 +
1707 +
1708 +       struct timer_list link_timer;
1709 +       unsigned short phy;  /* merlot phy = 1,  samsung phy = 0x1f */
1710 +       unsigned short mac;
1711 +       unsigned short link; /* 0 - link down,  1 - link up */
1712 +       u16 phyData;
1713 +
1714 +       struct tasklet_struct rx_tasklet;
1715 +       int unloading;
1716 +};
1717 +
1718 +
1719 +/*
1720 + * Prototypes
1721 + */
1722 +static int  ar2313_init(struct net_device *dev);
1723 +#ifdef TX_TIMEOUT
1724 +static void ar2313_tx_timeout(struct net_device *dev);
1725 +#endif
1726 +#if 0
1727 +static void ar2313_multicast_list(struct net_device *dev);
1728 +#endif
1729 +static int ar2313_restart(struct net_device *dev);
1730 +#if DEBUG
1731 +static void  ar2313_dump_regs(struct net_device *dev);
1732 +#endif
1733 +static void ar2313_load_rx_ring(struct net_device *dev, int bufs);
1734 +static irqreturn_t ar2313_interrupt(int irq, void *dev_id);
1735 +static int  ar2313_open(struct net_device *dev);
1736 +static int  ar2313_start_xmit(struct sk_buff *skb, struct net_device *dev);
1737 +static int  ar2313_close(struct net_device *dev);
1738 +static int  ar2313_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
1739 +static void ar2313_init_cleanup(struct net_device *dev);
1740 +static int  ar2313_setup_timer(struct net_device *dev);
1741 +static void ar2313_link_timer_fn(unsigned long data);
1742 +static void ar2313_check_link(struct net_device *dev);
1743 +static struct net_device_stats *ar2313_get_stats(struct net_device *dev);
1744 +#endif /* _AR2313_H_ */
1745 diff -urN linux.old/drivers/net/ar2313/ar2313_msg.h linux.eth/drivers/net/ar2313/ar2313_msg.h
1746 --- linux.old/drivers/net/ar2313/ar2313_msg.h   1970-01-01 01:00:00.000000000 +0100
1747 +++ linux.eth/drivers/net/ar2313/ar2313_msg.h   2006-12-16 04:30:11.000000000 +0100
1748 @@ -0,0 +1,17 @@
1749 +#ifndef _AR2313_MSG_H_
1750 +#define _AR2313_MSG_H_
1751 +
1752 +#define AR2313_MTU                     1692
1753 +#define AR2313_PRIOS                   1
1754 +#define AR2313_QUEUES                  (2*AR2313_PRIOS)
1755 +
1756 +#define AR2313_DESCR_ENTRIES           64
1757 +
1758 +typedef struct {
1759 +    volatile unsigned int      status;         // OWN, Device control and status.
1760 +    volatile unsigned int      devcs;          // pkt Control bits + Length
1761 +    volatile unsigned int      addr;           // Current Address.
1762 +    volatile unsigned int      descr;          // Next descriptor in chain.
1763 +} ar2313_descr_t;
1764 +
1765 +#endif /* _AR2313_MSG_H_ */
1766 diff -urN linux.old/drivers/net/ar2313/dma.h linux.eth/drivers/net/ar2313/dma.h
1767 --- linux.old/drivers/net/ar2313/dma.h  1970-01-01 01:00:00.000000000 +0100
1768 +++ linux.eth/drivers/net/ar2313/dma.h  2006-12-16 04:30:11.000000000 +0100
1769 @@ -0,0 +1,135 @@
1770 +#ifndef __ARUBA_DMA_H__
1771 +#define __ARUBA_DMA_H__
1772 +
1773 +/*******************************************************************************
1774 + *
1775 + * Copyright 2002 Integrated Device Technology, Inc.
1776 + *             All rights reserved.
1777 + *
1778 + * DMA register definition.
1779 + *
1780 + * File   : $Id: dma.h,v 1.3 2002/06/06 18:34:03 astichte Exp $
1781 + *
1782 + * Author : ryan.holmQVist@idt.com
1783 + * Date   : 20011005
1784 + * Update :
1785 + *         $Log: dma.h,v $
1786 + *         Revision 1.3  2002/06/06 18:34:03  astichte
1787 + *         Added XXX_PhysicalAddress and XXX_VirtualAddress
1788 + *     
1789 + *         Revision 1.2  2002/06/05 18:30:46  astichte
1790 + *         Removed IDTField
1791 + *     
1792 + *         Revision 1.1  2002/05/29 17:33:21  sysarch
1793 + *         jba File moved from vcode/include/idt/acacia
1794 + *     
1795 + *
1796 + ******************************************************************************/
1797 +
1798 +#define AR_BIT(x)            (1 << (x))
1799 +#define DMA_RX_ERR_CRC       AR_BIT(1)
1800 +#define DMA_RX_ERR_DRIB      AR_BIT(2)
1801 +#define DMA_RX_ERR_MII       AR_BIT(3)
1802 +#define DMA_RX_EV2           AR_BIT(5)
1803 +#define DMA_RX_ERR_COL       AR_BIT(6)
1804 +#define DMA_RX_LONG          AR_BIT(7)
1805 +#define DMA_RX_LS            AR_BIT(8)  /* last descriptor */
1806 +#define DMA_RX_FS            AR_BIT(9)  /* first descriptor */
1807 +#define DMA_RX_MF            AR_BIT(10) /* multicast frame */
1808 +#define DMA_RX_ERR_RUNT      AR_BIT(11) /* runt frame */
1809 +#define DMA_RX_ERR_LENGTH    AR_BIT(12) /* length error */
1810 +#define DMA_RX_ERR_DESC      AR_BIT(14) /* descriptor error */
1811 +#define DMA_RX_ERROR         AR_BIT(15) /* error summary */
1812 +#define DMA_RX_LEN_MASK      0x3fff0000
1813 +#define DMA_RX_LEN_SHIFT     16
1814 +#define DMA_RX_FILT          AR_BIT(30)
1815 +#define DMA_RX_OWN           AR_BIT(31) /* desc owned by DMA controller */
1816 +
1817 +#define DMA_RX1_BSIZE_MASK   0x000007ff
1818 +#define DMA_RX1_BSIZE_SHIFT  0
1819 +#define DMA_RX1_CHAINED      AR_BIT(24)
1820 +#define DMA_RX1_RER          AR_BIT(25)
1821 +
1822 +#define DMA_TX_ERR_UNDER     AR_BIT(1)  /* underflow error */
1823 +#define DMA_TX_ERR_DEFER     AR_BIT(2)  /* excessive deferral */
1824 +#define DMA_TX_COL_MASK      0x78
1825 +#define DMA_TX_COL_SHIFT     3
1826 +#define DMA_TX_ERR_HB        AR_BIT(7)  /* hearbeat failure */
1827 +#define DMA_TX_ERR_COL       AR_BIT(8)  /* excessive collisions */
1828 +#define DMA_TX_ERR_LATE      AR_BIT(9)  /* late collision */
1829 +#define DMA_TX_ERR_LINK      AR_BIT(10) /* no carrier */
1830 +#define DMA_TX_ERR_LOSS      AR_BIT(11) /* loss of carrier */
1831 +#define DMA_TX_ERR_JABBER    AR_BIT(14) /* transmit jabber timeout */
1832 +#define DMA_TX_ERROR         AR_BIT(15) /* frame aborted */
1833 +#define DMA_TX_OWN           AR_BIT(31) /* descr owned by DMA controller */
1834 +
1835 +#define DMA_TX1_BSIZE_MASK   0x000007ff
1836 +#define DMA_TX1_BSIZE_SHIFT  0
1837 +#define DMA_TX1_CHAINED      AR_BIT(24) /* chained descriptors */
1838 +#define DMA_TX1_TER          AR_BIT(25) /* transmit end of ring */
1839 +#define DMA_TX1_FS           AR_BIT(29) /* first segment */
1840 +#define DMA_TX1_LS           AR_BIT(30) /* last segment */
1841 +#define DMA_TX1_IC           AR_BIT(31) /* interrupt on completion */
1842 +
1843 +#define RCVPKT_LENGTH(X)     (X  >> 16)               /* Received pkt Length  */
1844 +
1845 +#define MAC_CONTROL_RE       AR_BIT(2)  /* receive enable */
1846 +#define MAC_CONTROL_TE       AR_BIT(3)  /* transmit enable */
1847 +#define MAC_CONTROL_DC       AR_BIT(5)  /* Deferral check*/
1848 +#define MAC_CONTROL_ASTP     AR_BIT(8)  /* Auto pad strip */
1849 +#define MAC_CONTROL_DRTY     AR_BIT(10) /* Disable retry */
1850 +#define MAC_CONTROL_DBF      AR_BIT(11) /* Disable bcast frames */
1851 +#define MAC_CONTROL_LCC      AR_BIT(12) /* late collision ctrl */
1852 +#define MAC_CONTROL_HP       AR_BIT(13) /* Hash Perfect filtering */
1853 +#define MAC_CONTROL_HASH     AR_BIT(14) /* Unicast hash filtering */
1854 +#define MAC_CONTROL_HO       AR_BIT(15) /* Hash only filtering */
1855 +#define MAC_CONTROL_PB       AR_BIT(16) /* Pass Bad frames */
1856 +#define MAC_CONTROL_IF       AR_BIT(17) /* Inverse filtering */
1857 +#define MAC_CONTROL_PR       AR_BIT(18) /* promiscuous mode (valid frames only) */
1858 +#define MAC_CONTROL_PM       AR_BIT(19) /* pass multicast */
1859 +#define MAC_CONTROL_F        AR_BIT(20) /* full-duplex */
1860 +#define MAC_CONTROL_DRO      AR_BIT(23) /* Disable Receive Own */
1861 +#define MAC_CONTROL_HBD      AR_BIT(28) /* heart-beat disabled (MUST BE SET) */
1862 +#define MAC_CONTROL_BLE      AR_BIT(30) /* big endian mode */
1863 +#define MAC_CONTROL_RA       AR_BIT(31) /* receive all (valid and invalid frames) */
1864 +
1865 +#define MII_ADDR_BUSY        AR_BIT(0)
1866 +#define MII_ADDR_WRITE       AR_BIT(1)
1867 +#define MII_ADDR_REG_SHIFT   6
1868 +#define MII_ADDR_PHY_SHIFT   11
1869 +#define MII_DATA_SHIFT       0
1870 +
1871 +#define FLOW_CONTROL_FCE     AR_BIT(1)
1872 +
1873 +#define DMA_BUS_MODE_SWR       AR_BIT(0)  /* software reset */
1874 +#define DMA_BUS_MODE_BLE       AR_BIT(7)  /* big endian mode */
1875 +#define DMA_BUS_MODE_PBL_SHIFT 8          /* programmable burst length 32 */
1876 +#define DMA_BUS_MODE_DBO       AR_BIT(20) /* big-endian descriptors */
1877 +
1878 +#define DMA_STATUS_TI        AR_BIT(0)  /* transmit interrupt */
1879 +#define DMA_STATUS_TPS       AR_BIT(1)  /* transmit process stopped */
1880 +#define DMA_STATUS_TU        AR_BIT(2)  /* transmit buffer unavailable */
1881 +#define DMA_STATUS_TJT       AR_BIT(3)  /* transmit buffer timeout */
1882 +#define DMA_STATUS_UNF       AR_BIT(5)  /* transmit underflow */
1883 +#define DMA_STATUS_RI        AR_BIT(6)  /* receive interrupt */
1884 +#define DMA_STATUS_RU        AR_BIT(7)  /* receive buffer unavailable */
1885 +#define DMA_STATUS_RPS       AR_BIT(8)  /* receive process stopped */
1886 +#define DMA_STATUS_ETI       AR_BIT(10) /* early transmit interrupt */
1887 +#define DMA_STATUS_FBE       AR_BIT(13) /* fatal bus interrupt */
1888 +#define DMA_STATUS_ERI       AR_BIT(14) /* early receive interrupt */
1889 +#define DMA_STATUS_AIS       AR_BIT(15) /* abnormal interrupt summary */
1890 +#define DMA_STATUS_NIS       AR_BIT(16) /* normal interrupt summary */
1891 +#define DMA_STATUS_RS_SHIFT  17         /* receive process state */
1892 +#define DMA_STATUS_TS_SHIFT  20         /* transmit process state */
1893 +#define DMA_STATUS_EB_SHIFT  23         /* error bits */
1894 +
1895 +#define DMA_CONTROL_SR       AR_BIT(1)  /* start receive */
1896 +#define DMA_CONTROL_ST       AR_BIT(13) /* start transmit */
1897 +#define DMA_CONTROL_SF       AR_BIT(21) /* store and forward */
1898 +
1899 +#endif // __ARUBA_DMA_H__
1900 +
1901 +
1902 +
1903 +
1904 +
1905 diff -urN linux.old/drivers/net/ar2313/Makefile linux.eth/drivers/net/ar2313/Makefile
1906 --- linux.old/drivers/net/ar2313/Makefile       1970-01-01 01:00:00.000000000 +0100
1907 +++ linux.eth/drivers/net/ar2313/Makefile       2006-12-16 04:30:11.000000000 +0100
1908 @@ -0,0 +1,5 @@
1909 +#
1910 +# Makefile for the AR2313 ethernet driver
1911 +#
1912 +
1913 +obj-$(CONFIG_AR2313)   += ar2313.o
1914 diff -urN linux.old/drivers/net/ar2313/platform.h linux.eth/drivers/net/ar2313/platform.h
1915 --- linux.old/drivers/net/ar2313/platform.h     1970-01-01 01:00:00.000000000 +0100
1916 +++ linux.eth/drivers/net/ar2313/platform.h     2006-12-16 04:30:11.000000000 +0100
1917 @@ -0,0 +1,128 @@
1918 +/********************************************************************************
1919 +   Title:   $Source: platform.h,v $
1920 +
1921 +   Author:  Dan Steinberg
1922 +            Copyright Integrated Device Technology 2001
1923 +
1924 +   Purpose: AR2313 Register/Bit Definitions
1925 +   
1926 +   Update:
1927 +            $Log: platform.h,v $
1928 +      
1929 +   Notes:   See Merlot architecture spec for complete details.  Note, all
1930 +            addresses are virtual addresses in kseg1 (Uncached, Unmapped).
1931
1932 +********************************************************************************/
1933 +
1934 +#ifndef PLATFORM_H
1935 +#define PLATFORM_H
1936 +
1937 +#define BIT(x) (1 << (x))
1938 +
1939 +#define RESET_BASE        0xBC003020
1940 +#define RESET_VALUE       0x00000001
1941 +
1942 +/********************************************************************
1943 + * Device controller 
1944 + ********************************************************************/
1945 +typedef struct {
1946 +  volatile unsigned int flash0;
1947 +} DEVICE;
1948 +
1949 +#define device (*((volatile DEVICE *) DEV_CTL_BASE))
1950 +
1951 +// DDRC register
1952 +#define DEV_WP        (1<<26)
1953 +
1954 +/********************************************************************
1955 + * DDR controller 
1956 + ********************************************************************/
1957 +typedef struct {
1958 +  volatile unsigned int ddrc0;
1959 +  volatile unsigned int ddrc1;
1960 +  volatile unsigned int ddrrefresh;
1961 +} DDR;
1962 +
1963 +#define ddr (*((volatile DDR *) DDR_BASE))
1964 +
1965 +// DDRC register
1966 +#define DDRC_CS(i)     ((i&0x3)<<0)
1967 +#define DDRC_WE        (1<<2)
1968 +
1969 +/********************************************************************
1970 + * Ethernet interfaces
1971 + ********************************************************************/
1972 +#define ETHERNET_BASE    0xB8200000
1973 +
1974 +//
1975 +// New Combo structure for Both Eth0 AND eth1
1976 +//
1977 +typedef struct {
1978 +  volatile unsigned int mac_control;    /* 0x00 */
1979 +  volatile unsigned int mac_addr[2];    /* 0x04 - 0x08*/
1980 +  volatile unsigned int mcast_table[2]; /* 0x0c - 0x10 */
1981 +  volatile unsigned int mii_addr;       /* 0x14 */
1982 +  volatile unsigned int mii_data;       /* 0x18 */
1983 +  volatile unsigned int flow_control;   /* 0x1c */
1984 +  volatile unsigned int vlan_tag;       /* 0x20 */
1985 +  volatile unsigned int pad[7];         /* 0x24 - 0x3c */
1986 +  volatile unsigned int ucast_table[8]; /* 0x40-0x5c */
1987 +  
1988 +} ETHERNET_STRUCT;
1989 +
1990 +/********************************************************************
1991 + * Interrupt controller 
1992 + ********************************************************************/
1993 +
1994 +typedef struct {
1995 +  volatile unsigned int wdog_control;          /* 0x08 */
1996 +  volatile unsigned int wdog_timer;            /* 0x0c */
1997 +  volatile unsigned int misc_status;           /* 0x10 */
1998 +  volatile unsigned int misc_mask;             /* 0x14 */
1999 +  volatile unsigned int global_status;         /* 0x18 */
2000 +  volatile unsigned int reserved;              /* 0x1c */
2001 +  volatile unsigned int reset_control;         /* 0x20 */
2002 +} INTERRUPT;
2003 +
2004 +#define interrupt (*((volatile INTERRUPT *) INTERRUPT_BASE))
2005 +
2006 +#define INTERRUPT_MISC_TIMER    BIT(0)
2007 +#define INTERRUPT_MISC_AHBPROC  BIT(1)
2008 +#define INTERRUPT_MISC_AHBDMA   BIT(2)
2009 +#define INTERRUPT_MISC_GPIO     BIT(3)
2010 +#define INTERRUPT_MISC_UART     BIT(4)
2011 +#define INTERRUPT_MISC_UARTDMA  BIT(5)
2012 +#define INTERRUPT_MISC_WATCHDOG BIT(6)
2013 +#define INTERRUPT_MISC_LOCAL    BIT(7)
2014 +
2015 +#define INTERRUPT_GLOBAL_ETH    BIT(2)
2016 +#define INTERRUPT_GLOBAL_WLAN   BIT(3)
2017 +#define INTERRUPT_GLOBAL_MISC   BIT(4)
2018 +#define INTERRUPT_GLOBAL_ITIMER BIT(5)
2019 +
2020 +/********************************************************************
2021 + * DMA controller
2022 + ********************************************************************/
2023 +#define DMA_BASE          0xB8201000
2024 +
2025 +typedef struct {
2026 +  volatile unsigned int bus_mode;        /* 0x00 (CSR0) */
2027 +  volatile unsigned int xmt_poll;        /* 0x04 (CSR1) */
2028 +  volatile unsigned int rcv_poll;        /* 0x08 (CSR2) */
2029 +  volatile unsigned int rcv_base;        /* 0x0c (CSR3) */
2030 +  volatile unsigned int xmt_base;        /* 0x10 (CSR4) */
2031 +  volatile unsigned int status;          /* 0x14 (CSR5) */
2032 +  volatile unsigned int control;         /* 0x18 (CSR6) */
2033 +  volatile unsigned int intr_ena;        /* 0x1c (CSR7) */
2034 +  volatile unsigned int rcv_missed;      /* 0x20 (CSR8) */
2035 +  volatile unsigned int reserved[11];    /* 0x24-0x4c (CSR9-19) */
2036 +  volatile unsigned int cur_tx_buf_addr; /* 0x50 (CSR20) */
2037 +  volatile unsigned int cur_rx_buf_addr; /* 0x50 (CSR21) */
2038 +} DMA;
2039 +
2040 +#define dma (*((volatile DMA *) DMA_BASE))
2041 +
2042 +// macro to convert from virtual to physical address  
2043 +#define phys_addr(x)      (x & 0x1fffffff) 
2044 +
2045 +#endif /* PLATFORM_H */
2046 diff -urN linux.old/drivers/net/Kconfig linux.eth/drivers/net/Kconfig
2047 --- linux.old/drivers/net/Kconfig       2006-12-14 23:53:29.000000000 +0100
2048 +++ linux.eth/drivers/net/Kconfig       2006-12-16 04:30:11.000000000 +0100
2049 @@ -313,6 +313,12 @@
2050  
2051  source "drivers/net/arm/Kconfig"
2052  
2053 +config AR2313
2054 +       tristate "AR2313 Ethernet support"
2055 +       depends on NET_ETHERNET && AR531X
2056 +       help
2057 +         Support for the AR231x/531x ethernet controller
2058 +
2059  config MACE
2060         tristate "MACE (Power Mac ethernet) support"
2061         depends on NET_ETHERNET && PPC_PMAC && PPC32
2062 diff -urN linux.old/drivers/net/Makefile linux.eth/drivers/net/Makefile
2063 --- linux.old/drivers/net/Makefile      2006-12-14 23:53:29.000000000 +0100
2064 +++ linux.eth/drivers/net/Makefile      2006-12-16 04:30:11.000000000 +0100
2065 @@ -9,6 +9,7 @@
2066  obj-$(CONFIG_EHEA) += ehea/
2067  obj-$(CONFIG_BONDING) += bonding/
2068  obj-$(CONFIG_GIANFAR) += gianfar_driver.o
2069 +obj-$(CONFIG_AR2313) += ar2313/
2070  
2071  gianfar_driver-objs := gianfar.o \
2072                 gianfar_ethtool.o \