Changeset 3596


Ignore:
Timestamp:
2006-04-06T17:52:01+02:00 (12 years ago)
Author:
nbd
Message:

integrate the newer broadcom wl driver from us robotics

Location:
trunk/openwrt/target/linux/brcm-2.4
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/openwrt/target/linux/brcm-2.4/Makefile

    r3112 r3596  
    1414 
    1515$(eval $(call KMOD_template,BRCM_WL2,brcm-wl2,\ 
    16         $(BUILD_DIR)/wl/wl2/wl.o \ 
     16        $(MODULES_DIR)/kernel/drivers/net/wl2/wl.o \ 
    1717,CONFIG_WL,,20,wl)) 
    1818 
     
    4141LINUX_BINARY_DRIVER_SITE=http://openwrt.org/downloads/sources 
    4242# proprietary driver, extracted from Linksys GPL sourcetree WRT54GS 4.70.6 
    43 LINUX_BINARY_WL_DRIVER=kernel-binary-wl-0.5.tar.gz 
    44 LINUX_BINARY_WL_MD5SUM=78e839842bdc04022bb44469f92b1131 
     43LINUX_BINARY_WL_DRIVER=kernel-binary-wl-0.6.tar.gz 
     44LINUX_BINARY_WL_MD5SUM=4fc1d5b46bcb7a17d6d5dd31da9c8d7f 
    4545 
    4646$(DL_DIR)/$(LINUX_BINARY_WL_DRIVER): 
     
    5757        # copy binary wlan driver 
    5858        mkdir -p $(LINUX_DIR)/drivers/net/wl 
    59         $(CP) $(BUILD_DIR)/wl/*.o $(LINUX_DIR)/drivers/net/wl 
     59        $(CP) $(BUILD_DIR)/kernel-binary-wl/old/*.o $(LINUX_DIR)/drivers/net/wl 
     60        $(CP) $(BUILD_DIR)/kernel-binary-wl/new/*.o $(LINUX_DIR)/drivers/net/wl2 
    6061        touch $@ 
    6162 
    6263$(LINUX_DIR)/.drivers-installed: $(LINUX_DIR)/.modules_done 
    6364        mkdir -p $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl 
     65        mkdir -p $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl2 
    6466        @-[ -f $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl/wl.o ] || $(CP) $(LINUX_DIR)/drivers/net/wl/wl.o $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl/ 
     67        @-[ -f $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl2/wl.o ] || $(CP) $(LINUX_DIR)/drivers/net/wl2/wl.o $(LINUX_BUILD_DIR)/modules/lib/modules/2.4.32/kernel/drivers/net/wl2/ 
    6568        touch $@ 
    6669 
  • trunk/openwrt/target/linux/brcm-2.4/config

    r3507 r3596  
    834834# CONFIG_HERMES is not set 
    835835CONFIG_WL=m 
     836CONFIG_WL2=m 
    836837# CONFIG_PLX_HERMES is not set 
    837838# CONFIG_TMD_HERMES is not set 
  • trunk/openwrt/target/linux/brcm-2.4/patches/001-bcm47xx.patch

    r3410 r3596  
    1 diff -Nur linux-2.4.32/arch/mips/bcm947xx/cfe_env.c linux-2.4.32-brcm/arch/mips/bcm947xx/cfe_env.c 
    2 --- linux-2.4.32/arch/mips/bcm947xx/cfe_env.c   1970-01-01 01:00:00.000000000 +0100 
    3 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/cfe_env.c      2005-12-19 01:56:35.104829500 +0100 
     1diff -Naur linux.old/arch/mips/Makefile linux.dev/arch/mips/Makefile 
     2--- linux.old/arch/mips/Makefile        2006-04-06 15:38:09.000000000 +0200 
     3+++ linux.dev/arch/mips/Makefile        2006-04-06 15:34:15.000000000 +0200 
     4@@ -726,6 +726,19 @@ 
     5 endif 
     6  
     7 # 
     8+# Broadcom BCM947XX variants 
     9+# 
     10+ifdef CONFIG_BCM947XX 
     11+LIBS           += arch/mips/bcm947xx/generic/brcm.o arch/mips/bcm947xx/bcm947xx.o  
     12+SUBDIRS                += arch/mips/bcm947xx/generic arch/mips/bcm947xx  
     13+LOADADDR       := 0x80001000 
     14+ 
     15+zImage: vmlinux 
     16+       $(MAKE) -C arch/$(ARCH)/bcm947xx/compressed 
     17+export LOADADDR 
     18+endif 
     19+ 
     20+# 
     21 # Choosing incompatible machines durings configuration will result in 
     22 # error messages during linking.  Select a default linkscript if 
     23 # none has been choosen above. 
     24@@ -778,6 +791,7 @@ 
     25        $(MAKE) -C arch/$(ARCH)/tools clean 
     26        $(MAKE) -C arch/mips/baget clean 
     27        $(MAKE) -C arch/mips/lasat clean 
     28+       $(MAKE) -C arch/mips/bcm947xx/compressed clean 
     29  
     30 archmrproper: 
     31        @$(MAKEBOOT) mrproper 
     32diff -Naur linux.old/arch/mips/bcm947xx/Makefile linux.dev/arch/mips/bcm947xx/Makefile 
     33--- linux.old/arch/mips/bcm947xx/Makefile       1970-01-01 01:00:00.000000000 +0100 
     34+++ linux.dev/arch/mips/bcm947xx/Makefile       2006-04-06 15:34:14.000000000 +0200 
     35@@ -0,0 +1,15 @@ 
     36+# 
     37+# Makefile for the BCM947xx specific kernel interface routines 
     38+# under Linux. 
     39+# 
     40+ 
     41+EXTRA_CFLAGS+=-I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER 
     42+ 
     43+O_TARGET        := bcm947xx.o 
     44+ 
     45+export-objs     := nvram_linux.o setup.o 
     46+obj-y          := prom.o setup.o time.o sbmips.o gpio.o 
     47+obj-y          += nvram.o nvram_linux.o sflash.o cfe_env.o 
     48+obj-$(CONFIG_PCI) += sbpci.o pcibios.o 
     49+ 
     50+include $(TOPDIR)/Rules.make 
     51diff -Naur linux.old/arch/mips/bcm947xx/cfe_env.c linux.dev/arch/mips/bcm947xx/cfe_env.c 
     52--- linux.old/arch/mips/bcm947xx/cfe_env.c      1970-01-01 01:00:00.000000000 +0100 
     53+++ linux.dev/arch/mips/bcm947xx/cfe_env.c      2006-04-06 15:34:14.000000000 +0200 
    454@@ -0,0 +1,234 @@ 
    555+/* 
     
    237287+} 
    238288+ 
    239 diff -Nur linux-2.4.32/arch/mips/bcm947xx/compressed/Makefile linux-2.4.32-brcm/arch/mips/bcm947xx/compressed/Makefile 
    240 --- linux-2.4.32/arch/mips/bcm947xx/compressed/Makefile 1970-01-01 01:00:00.000000000 +0100 
    241 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/compressed/Makefile    2005-12-16 23:39:10.668819500 +0100 
     289diff -Naur linux.old/arch/mips/bcm947xx/compressed/Makefile linux.dev/arch/mips/bcm947xx/compressed/Makefile 
     290--- linux.old/arch/mips/bcm947xx/compressed/Makefile    1970-01-01 01:00:00.000000000 +0100 
     291+++ linux.dev/arch/mips/bcm947xx/compressed/Makefile    2006-04-06 15:34:14.000000000 +0200 
    242292@@ -0,0 +1,33 @@ 
    243293+# 
     
    274324+clean: 
    275325+       rm -f vmlinuz piggy 
    276 diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/int-handler.S linux-2.4.32-brcm/arch/mips/bcm947xx/generic/int-handler.S 
    277 --- linux-2.4.32/arch/mips/bcm947xx/generic/int-handler.S       1970-01-01 01:00:00.000000000 +0100 
    278 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/int-handler.S  2005-12-16 23:39:10.668819500 +0100 
     326diff -Naur linux.old/arch/mips/bcm947xx/generic/Makefile linux.dev/arch/mips/bcm947xx/generic/Makefile 
     327--- linux.old/arch/mips/bcm947xx/generic/Makefile       1970-01-01 01:00:00.000000000 +0100 
     328+++ linux.dev/arch/mips/bcm947xx/generic/Makefile       2006-04-06 15:34:14.000000000 +0200 
     329@@ -0,0 +1,15 @@ 
     330+# 
     331+# Makefile for the BCM947xx specific kernel interface routines 
     332+# under Linux. 
     333+# 
     334+ 
     335+.S.s: 
     336+       $(CPP) $(AFLAGS) $< -o $*.s 
     337+.S.o: 
     338+       $(CC) $(AFLAGS) -c $< -o $*.o 
     339+ 
     340+O_TARGET        := brcm.o 
     341+ 
     342+obj-y  := int-handler.o irq.o 
     343+ 
     344+include $(TOPDIR)/Rules.make 
     345diff -Naur linux.old/arch/mips/bcm947xx/generic/int-handler.S linux.dev/arch/mips/bcm947xx/generic/int-handler.S 
     346--- linux.old/arch/mips/bcm947xx/generic/int-handler.S  1970-01-01 01:00:00.000000000 +0100 
     347+++ linux.dev/arch/mips/bcm947xx/generic/int-handler.S  2006-04-06 15:34:14.000000000 +0200 
    279348@@ -0,0 +1,51 @@ 
    280349+/* 
     
    329398+                
    330399+       END(brcmIRQ) 
    331 diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/irq.c linux-2.4.32-brcm/arch/mips/bcm947xx/generic/irq.c 
    332 --- linux-2.4.32/arch/mips/bcm947xx/generic/irq.c       1970-01-01 01:00:00.000000000 +0100 
    333 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/irq.c  2005-12-16 23:39:10.668819500 +0100 
     400diff -Naur linux.old/arch/mips/bcm947xx/generic/irq.c linux.dev/arch/mips/bcm947xx/generic/irq.c 
     401--- linux.old/arch/mips/bcm947xx/generic/irq.c  1970-01-01 01:00:00.000000000 +0100 
     402+++ linux.dev/arch/mips/bcm947xx/generic/irq.c  2006-04-06 15:34:14.000000000 +0200 
    334403@@ -0,0 +1,130 @@ 
    335404+/* 
     
    463532+#endif 
    464533+} 
    465 diff -Nur linux-2.4.32/arch/mips/bcm947xx/generic/Makefile linux-2.4.32-brcm/arch/mips/bcm947xx/generic/Makefile 
    466 --- linux-2.4.32/arch/mips/bcm947xx/generic/Makefile    1970-01-01 01:00:00.000000000 +0100 
    467 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/generic/Makefile       2005-12-16 23:39:10.668819500 +0100 
    468 @@ -0,0 +1,15 @@ 
    469 +# 
    470 +# Makefile for the BCM947xx specific kernel interface routines 
    471 +# under Linux. 
    472 +# 
    473 + 
    474 +.S.s: 
    475 +       $(CPP) $(AFLAGS) $< -o $*.s 
    476 +.S.o: 
    477 +       $(CC) $(AFLAGS) -c $< -o $*.o 
    478 + 
    479 +O_TARGET        := brcm.o 
    480 + 
    481 +obj-y  := int-handler.o irq.o 
    482 + 
    483 +include $(TOPDIR)/Rules.make 
    484 diff -Nur linux-2.4.32/arch/mips/bcm947xx/gpio.c linux-2.4.32-brcm/arch/mips/bcm947xx/gpio.c 
    485 --- linux-2.4.32/arch/mips/bcm947xx/gpio.c      1970-01-01 01:00:00.000000000 +0100 
    486 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/gpio.c 2005-12-16 23:39:10.668819500 +0100 
     534diff -Naur linux.old/arch/mips/bcm947xx/gpio.c linux.dev/arch/mips/bcm947xx/gpio.c 
     535--- linux.old/arch/mips/bcm947xx/gpio.c 1970-01-01 01:00:00.000000000 +0100 
     536+++ linux.dev/arch/mips/bcm947xx/gpio.c 2006-04-06 15:34:14.000000000 +0200 
    487537@@ -0,0 +1,158 @@ 
    488538+/* 
     
    644694+module_init(gpio_init); 
    645695+module_exit(gpio_exit); 
    646 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmdevs.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmdevs.h 
    647 --- linux-2.4.32/arch/mips/bcm947xx/include/bcmdevs.h   1970-01-01 01:00:00.000000000 +0100 
    648 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmdevs.h      2005-12-16 23:39:10.672819750 +0100 
     696diff -Naur linux.old/arch/mips/bcm947xx/include/bcmdevs.h linux.dev/arch/mips/bcm947xx/include/bcmdevs.h 
     697--- linux.old/arch/mips/bcm947xx/include/bcmdevs.h      1970-01-01 01:00:00.000000000 +0100 
     698+++ linux.dev/arch/mips/bcm947xx/include/bcmdevs.h      2006-04-06 15:34:14.000000000 +0200 
    649699@@ -0,0 +1,391 @@ 
    650700+/* 
     
    10391089+ 
    10401090+#endif /* _BCMDEVS_H */ 
    1041 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmendian.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmendian.h 
    1042 --- linux-2.4.32/arch/mips/bcm947xx/include/bcmendian.h 1970-01-01 01:00:00.000000000 +0100 
    1043 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmendian.h    2005-12-16 23:39:10.672819750 +0100 
     1091diff -Naur linux.old/arch/mips/bcm947xx/include/bcmendian.h linux.dev/arch/mips/bcm947xx/include/bcmendian.h 
     1092--- linux.old/arch/mips/bcm947xx/include/bcmendian.h    1970-01-01 01:00:00.000000000 +0100 
     1093+++ linux.dev/arch/mips/bcm947xx/include/bcmendian.h    2006-04-06 15:34:14.000000000 +0200 
    10441094@@ -0,0 +1,152 @@ 
    10451095+/* 
     
    11951245+ 
    11961246+#endif /* _BCMENDIAN_H_ */ 
    1197 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmnvram.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmnvram.h 
    1198 --- linux-2.4.32/arch/mips/bcm947xx/include/bcmnvram.h  1970-01-01 01:00:00.000000000 +0100 
    1199 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmnvram.h     2005-12-16 23:39:10.700821500 +0100 
     1247diff -Naur linux.old/arch/mips/bcm947xx/include/bcmnvram.h linux.dev/arch/mips/bcm947xx/include/bcmnvram.h 
     1248--- linux.old/arch/mips/bcm947xx/include/bcmnvram.h     1970-01-01 01:00:00.000000000 +0100 
     1249+++ linux.dev/arch/mips/bcm947xx/include/bcmnvram.h     2006-04-06 15:34:14.000000000 +0200 
    12001250@@ -0,0 +1,141 @@ 
    12011251+/* 
     
    13401390+ 
    13411391+#endif /* _bcmnvram_h_ */ 
    1342 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmsrom.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmsrom.h 
    1343 --- linux-2.4.32/arch/mips/bcm947xx/include/bcmsrom.h   1970-01-01 01:00:00.000000000 +0100 
    1344 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmsrom.h      2005-12-16 23:39:10.704821750 +0100 
     1392diff -Naur linux.old/arch/mips/bcm947xx/include/bcmsrom.h linux.dev/arch/mips/bcm947xx/include/bcmsrom.h 
     1393--- linux.old/arch/mips/bcm947xx/include/bcmsrom.h      1970-01-01 01:00:00.000000000 +0100 
     1394+++ linux.dev/arch/mips/bcm947xx/include/bcmsrom.h      2006-04-06 15:34:14.000000000 +0200 
    13451395@@ -0,0 +1,23 @@ 
    13461396+/* 
     
    13671417+ 
    13681418+#endif /* _bcmsrom_h_ */ 
    1369 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/bcmutils.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmutils.h 
    1370 --- linux-2.4.32/arch/mips/bcm947xx/include/bcmutils.h  1970-01-01 01:00:00.000000000 +0100 
    1371 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/bcmutils.h     2005-12-16 23:39:10.704821750 +0100 
    1372 @@ -0,0 +1,313 @@ 
     1419diff -Naur linux.old/arch/mips/bcm947xx/include/bcmutils.h linux.dev/arch/mips/bcm947xx/include/bcmutils.h 
     1420--- linux.old/arch/mips/bcm947xx/include/bcmutils.h     1970-01-01 01:00:00.000000000 +0100 
     1421+++ linux.dev/arch/mips/bcm947xx/include/bcmutils.h     2006-04-06 17:07:30.000000000 +0200 
     1422@@ -0,0 +1,287 @@ 
    13731423+/* 
    13741424+ * Misc useful os-independent macros and functions. 
     
    14301480+} 
    14311481+ 
    1432 +/* generic osl packet queue */ 
    1433 +struct pktq { 
    1434 +       void *head;     /* first packet to dequeue */ 
    1435 +       void *tail;     /* last packet to dequeue */ 
    1436 +       uint len;       /* number of queued packets */ 
    1437 +       uint maxlen;    /* maximum number of queued packets */ 
    1438 +       bool priority;  /* enqueue by packet priority */ 
    1439 +       uint8 prio_map[MAXPRIO+1]; /* user priority to packet enqueue policy map */ 
    1440 +}; 
    1441 +#define DEFAULT_QLEN   128 
    1442 + 
    1443 +#define        pktq_len(q)     ((q)->len) 
    1444 +#define        pktq_avail(q)   ((q)->maxlen - (q)->len) 
    1445 +#define        pktq_head(q)    ((q)->head) 
    1446 +#define        pktq_full(q)    ((q)->len >= (q)->maxlen) 
    1447 +#define        _pktq_pri(q, pri)       ((q)->prio_map[pri]) 
    1448 +#define        pktq_tailpri(q) ((q)->tail ? _pktq_pri(q, PKTPRIO((q)->tail)) : _pktq_pri(q, 0)) 
    1449 + 
    1450 +/* externs */ 
    1451 +/* packet */ 
    1452 +extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf); 
    1453 +extern uint pkttotlen(osl_t *osh, void *); 
    1454 +extern void pktq_init(struct pktq *q, uint maxlen, const uint8 prio_map[]); 
    1455 +extern void pktenq(struct pktq *q, void *p, bool lifo); 
    1456 +extern void *pktdeq(struct pktq *q); 
    1457 +extern void *pktdeqtail(struct pktq *q); 
    14581482+/* string */ 
    14591483+extern uint bcm_atoi(char *s); 
     
    16841708+ 
    16851709+#endif /* _bcmutils_h_ */ 
    1686 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/hnddma.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/hnddma.h 
    1687 --- linux-2.4.32/arch/mips/bcm947xx/include/hnddma.h    1970-01-01 01:00:00.000000000 +0100 
    1688 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/hnddma.h       2005-12-16 23:39:10.708822000 +0100 
    1689 @@ -0,0 +1,71 @@ 
    1690 +/* 
    1691 + * Generic Broadcom Home Networking Division (HND) DMA engine SW interface 
    1692 + * This supports the following chips: BCM42xx, 44xx, 47xx . 
    1693 + * 
    1694 + * Copyright 2005, Broadcom Corporation       
    1695 + * All Rights Reserved.       
    1696 + *        
    1697 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
    1698 + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
    1699 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
    1700 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
    1701 + * $Id$ 
    1702 + */ 
    1703 + 
    1704 +#ifndef        _hnddma_h_ 
    1705 +#define        _hnddma_h_ 
    1706 + 
    1707 +/* export structure */ 
    1708 +typedef volatile struct { 
    1709 +       /* rx error counters */ 
    1710 +       uint            rxgiants;       /* rx giant frames */ 
    1711 +       uint            rxnobuf;        /* rx out of dma descriptors */ 
    1712 +       /* tx error counters */ 
    1713 +       uint            txnobuf;        /* tx out of dma descriptors */ 
    1714 +} hnddma_t; 
    1715 + 
    1716 +#ifndef di_t 
    1717 +#define        di_t    void 
    1718 +#endif 
    1719 + 
    1720 +#ifndef osl_t  
    1721 +#define osl_t void 
    1722 +#endif 
    1723 + 
    1724 +/* externs */ 
    1725 +extern void * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx,  
    1726 +                        uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset, uint *msg_level); 
    1727 +extern void dma_detach(di_t *di); 
    1728 +extern void dma_txreset(di_t *di); 
    1729 +extern void dma_rxreset(di_t *di); 
    1730 +extern void dma_txinit(di_t *di); 
    1731 +extern bool dma_txenabled(di_t *di); 
    1732 +extern void dma_rxinit(di_t *di); 
    1733 +extern void dma_rxenable(di_t *di); 
    1734 +extern bool dma_rxenabled(di_t *di); 
    1735 +extern void dma_txsuspend(di_t *di); 
    1736 +extern void dma_txresume(di_t *di); 
    1737 +extern bool dma_txsuspended(di_t *di); 
    1738 +extern bool dma_txsuspendedidle(di_t *di); 
    1739 +extern bool dma_txstopped(di_t *di); 
    1740 +extern bool dma_rxstopped(di_t *di); 
    1741 +extern int dma_txfast(di_t *di, void *p, uint32 coreflags); 
    1742 +extern void dma_fifoloopbackenable(di_t *di); 
    1743 +extern void *dma_rx(di_t *di); 
    1744 +extern void dma_rxfill(di_t *di); 
    1745 +extern void dma_txreclaim(di_t *di, bool forceall); 
    1746 +extern void dma_rxreclaim(di_t *di); 
    1747 +extern uintptr dma_getvar(di_t *di, char *name); 
    1748 +extern void *dma_getnexttxp(di_t *di, bool forceall); 
    1749 +extern void *dma_peeknexttxp(di_t *di); 
    1750 +extern void *dma_getnextrxp(di_t *di, bool forceall); 
    1751 +extern void dma_txblock(di_t *di); 
    1752 +extern void dma_txunblock(di_t *di); 
    1753 +extern uint dma_txactive(di_t *di); 
    1754 +extern void dma_txrotate(di_t *di); 
    1755 + 
    1756 +extern void dma_rxpiomode(dma32regs_t *); 
    1757 +extern void dma_txpioloopback(dma32regs_t *); 
    1758 + 
    1759 + 
    1760 +#endif /* _hnddma_h_ */ 
    1761 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/hndmips.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/hndmips.h 
    1762 --- linux-2.4.32/arch/mips/bcm947xx/include/hndmips.h   1970-01-01 01:00:00.000000000 +0100 
    1763 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/hndmips.h      2005-12-16 23:39:10.708822000 +0100 
     1710diff -Naur linux.old/arch/mips/bcm947xx/include/hndmips.h linux.dev/arch/mips/bcm947xx/include/hndmips.h 
     1711--- linux.old/arch/mips/bcm947xx/include/hndmips.h      1970-01-01 01:00:00.000000000 +0100 
     1712+++ linux.dev/arch/mips/bcm947xx/include/hndmips.h      2006-04-06 15:34:14.000000000 +0200 
    17641713@@ -0,0 +1,16 @@ 
    17651714+/* 
     
    17791728+ 
    17801729+#include "sbmips.h" 
    1781 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/linux_osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/linux_osl.h 
    1782 --- linux-2.4.32/arch/mips/bcm947xx/include/linux_osl.h 1970-01-01 01:00:00.000000000 +0100 
    1783 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/linux_osl.h    2005-12-16 23:39:10.708822000 +0100 
     1730diff -Naur linux.old/arch/mips/bcm947xx/include/linux_osl.h linux.dev/arch/mips/bcm947xx/include/linux_osl.h 
     1731--- linux.old/arch/mips/bcm947xx/include/linux_osl.h    1970-01-01 01:00:00.000000000 +0100 
     1732+++ linux.dev/arch/mips/bcm947xx/include/linux_osl.h    2006-04-06 15:34:14.000000000 +0200 
    17841733@@ -0,0 +1,371 @@ 
    17851734+/* 
     
    21542103+ 
    21552104+#endif /* _linux_osl_h_ */ 
    2156 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/linuxver.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/linuxver.h 
    2157 --- linux-2.4.32/arch/mips/bcm947xx/include/linuxver.h  1970-01-01 01:00:00.000000000 +0100 
    2158 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/linuxver.h     2005-12-16 23:39:10.748824500 +0100 
     2105diff -Naur linux.old/arch/mips/bcm947xx/include/linuxver.h linux.dev/arch/mips/bcm947xx/include/linuxver.h 
     2106--- linux.old/arch/mips/bcm947xx/include/linuxver.h     1970-01-01 01:00:00.000000000 +0100 
     2107+++ linux.dev/arch/mips/bcm947xx/include/linuxver.h     2006-04-06 15:34:14.000000000 +0200 
    21592108@@ -0,0 +1,411 @@ 
    21602109+/* 
     
    25692518+ 
    25702519+#endif /* _linuxver_h_ */ 
    2571 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/mipsinc.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/mipsinc.h 
    2572 --- linux-2.4.32/arch/mips/bcm947xx/include/mipsinc.h   1970-01-01 01:00:00.000000000 +0100 
    2573 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/mipsinc.h      2005-12-16 23:39:10.748824500 +0100 
     2520diff -Naur linux.old/arch/mips/bcm947xx/include/mipsinc.h linux.dev/arch/mips/bcm947xx/include/mipsinc.h 
     2521--- linux.old/arch/mips/bcm947xx/include/mipsinc.h      1970-01-01 01:00:00.000000000 +0100 
     2522+++ linux.dev/arch/mips/bcm947xx/include/mipsinc.h      2006-04-06 15:34:14.000000000 +0200 
    25742523@@ -0,0 +1,552 @@ 
    25752524+/* 
     
    31253074+ 
    31263075+#endif /* _MISPINC_H */ 
    3127 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/osl.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/osl.h 
    3128 --- linux-2.4.32/arch/mips/bcm947xx/include/osl.h       1970-01-01 01:00:00.000000000 +0100 
    3129 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/osl.h  2005-12-16 23:39:10.748824500 +0100 
     3076diff -Naur linux.old/arch/mips/bcm947xx/include/osl.h linux.dev/arch/mips/bcm947xx/include/osl.h 
     3077--- linux.old/arch/mips/bcm947xx/include/osl.h  1970-01-01 01:00:00.000000000 +0100 
     3078+++ linux.dev/arch/mips/bcm947xx/include/osl.h  2006-04-06 15:34:14.000000000 +0200 
    31303079@@ -0,0 +1,42 @@ 
    31313080+/* 
     
    31713120+ 
    31723121+#endif /* _osl_h_ */ 
    3173 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/pcicfg.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/pcicfg.h 
    3174 --- linux-2.4.32/arch/mips/bcm947xx/include/pcicfg.h    1970-01-01 01:00:00.000000000 +0100 
    3175 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/pcicfg.h       2005-12-16 23:39:10.752824750 +0100 
     3122diff -Naur linux.old/arch/mips/bcm947xx/include/pcicfg.h linux.dev/arch/mips/bcm947xx/include/pcicfg.h 
     3123--- linux.old/arch/mips/bcm947xx/include/pcicfg.h       1970-01-01 01:00:00.000000000 +0100 
     3124+++ linux.dev/arch/mips/bcm947xx/include/pcicfg.h       2006-04-06 15:34:14.000000000 +0200 
    31763125@@ -0,0 +1,451 @@ 
    31773126+/* 
     
    36263575+ 
    36273576+#endif 
    3628 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbchipc.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbchipc.h 
    3629 --- linux-2.4.32/arch/mips/bcm947xx/include/sbchipc.h   1970-01-01 01:00:00.000000000 +0100 
    3630 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbchipc.h      2005-12-16 23:39:10.932836000 +0100 
     3577diff -Naur linux.old/arch/mips/bcm947xx/include/sbchipc.h linux.dev/arch/mips/bcm947xx/include/sbchipc.h 
     3578--- linux.old/arch/mips/bcm947xx/include/sbchipc.h      1970-01-01 01:00:00.000000000 +0100 
     3579+++ linux.dev/arch/mips/bcm947xx/include/sbchipc.h      2006-04-06 15:34:14.000000000 +0200 
    36313580@@ -0,0 +1,440 @@ 
    36323581+/* 
     
    40704019+ 
    40714020+#endif /* _SBCHIPC_H */ 
    4072 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbconfig.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbconfig.h 
    4073 --- linux-2.4.32/arch/mips/bcm947xx/include/sbconfig.h  1970-01-01 01:00:00.000000000 +0100 
    4074 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbconfig.h     2005-12-16 23:39:10.932836000 +0100 
     4021diff -Naur linux.old/arch/mips/bcm947xx/include/sbconfig.h linux.dev/arch/mips/bcm947xx/include/sbconfig.h 
     4022--- linux.old/arch/mips/bcm947xx/include/sbconfig.h     1970-01-01 01:00:00.000000000 +0100 
     4023+++ linux.dev/arch/mips/bcm947xx/include/sbconfig.h     2006-04-06 15:34:14.000000000 +0200 
    40754024@@ -0,0 +1,342 @@ 
    40764025+/* 
     
    44164365+ 
    44174366+#endif /* _SBCONFIG_H */ 
    4418 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbextif.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbextif.h 
    4419 --- linux-2.4.32/arch/mips/bcm947xx/include/sbextif.h   1970-01-01 01:00:00.000000000 +0100 
    4420 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbextif.h      2005-12-16 23:39:10.932836000 +0100 
     4367diff -Naur linux.old/arch/mips/bcm947xx/include/sbextif.h linux.dev/arch/mips/bcm947xx/include/sbextif.h 
     4368--- linux.old/arch/mips/bcm947xx/include/sbextif.h      1970-01-01 01:00:00.000000000 +0100 
     4369+++ linux.dev/arch/mips/bcm947xx/include/sbextif.h      2006-04-06 15:34:14.000000000 +0200 
    44214370@@ -0,0 +1,242 @@ 
    44224371+/* 
     
    46624611+ 
    46634612+#endif /* _SBEXTIF_H */ 
    4664 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbhnddma.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbhnddma.h 
    4665 --- linux-2.4.32/arch/mips/bcm947xx/include/sbhnddma.h  1970-01-01 01:00:00.000000000 +0100 
    4666 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbhnddma.h     2005-12-16 23:39:10.932836000 +0100 
    4667 @@ -0,0 +1,312 @@ 
    4668 +/* 
    4669 + * Generic Broadcom Home Networking Division (HND) DMA engine HW interface 
    4670 + * This supports the following chips: BCM42xx, 44xx, 47xx . 
    4671 + * 
    4672 + * Copyright 2005, Broadcom Corporation       
    4673 + * All Rights Reserved.       
    4674 + *        
    4675 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
    4676 + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
    4677 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
    4678 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
    4679 + * $Id$ 
    4680 + */ 
    4681 + 
    4682 +#ifndef        _sbhnddma_h_ 
    4683 +#define        _sbhnddma_h_ 
    4684 + 
    4685 +  
    4686 +/* 2byte-wide pio register set per channel(xmt or rcv) */ 
    4687 +typedef volatile struct { 
    4688 +       uint16  fifocontrol; 
    4689 +       uint16  fifodata; 
    4690 +       uint16  fifofree;       /* only valid in xmt channel, not in rcv channel */ 
    4691 +       uint16  PAD; 
    4692 +} pio2regs_t; 
    4693 + 
    4694 +/* a pair of pio channels(tx and rx) */ 
    4695 +typedef volatile struct { 
    4696 +       pio2regs_t      tx; 
    4697 +       pio2regs_t      rx; 
    4698 +} pio2regp_t; 
    4699 + 
    4700 +/* 4byte-wide pio register set per channel(xmt or rcv) */ 
    4701 +typedef volatile struct { 
    4702 +       uint32  fifocontrol; 
    4703 +       uint32  fifodata; 
    4704 +} pio4regs_t; 
    4705 + 
    4706 +/* a pair of pio channels(tx and rx) */ 
    4707 +typedef volatile struct { 
    4708 +       pio4regs_t      tx; 
    4709 +       pio4regs_t      rx; 
    4710 +} pio4regp_t; 
    4711 + 
    4712 + 
    4713 + 
    4714 +/* DMA structure: 
    4715 + *  support two DMA engines: 32 bits address or 64 bit addressing 
    4716 + *  basic DMA register set is per channel(transmit or receive) 
    4717 + *  a pair of channels is defined for convenience 
    4718 + */ 
    4719 + 
    4720 + 
    4721 +/*** 32 bits addressing ***/  
    4722 + 
    4723 +/* dma registers per channel(xmt or rcv) */ 
    4724 +typedef volatile struct { 
    4725 +       uint32  control;                /* enable, et al */ 
    4726 +       uint32  addr;                   /* descriptor ring base address (4K aligned) */ 
    4727 +       uint32  ptr;                    /* last descriptor posted to chip */ 
    4728 +       uint32  status;                 /* current active descriptor, et al */ 
    4729 +} dma32regs_t; 
    4730 + 
    4731 +typedef volatile struct { 
    4732 +       dma32regs_t     xmt;            /* dma tx channel */ 
    4733 +       dma32regs_t     rcv;            /* dma rx channel */ 
    4734 +} dma32regp_t; 
    4735 + 
    4736 +typedef volatile struct {      /* diag access */ 
    4737 +       uint32  fifoaddr;               /* diag address */ 
    4738 +       uint32  fifodatalow;            /* low 32bits of data */ 
    4739 +       uint32  fifodatahigh;           /* high 32bits of data */ 
    4740 +       uint32  pad;                    /* reserved */ 
    4741 +} dma32diag_t; 
    4742 + 
    4743 +/* 
    4744 + * DMA Descriptor 
    4745 + * Descriptors are only read by the hardware, never written back. 
    4746 + */ 
    4747 +typedef volatile struct { 
    4748 +       uint32  ctrl;           /* misc control bits & bufcount */ 
    4749 +       uint32  addr;           /* data buffer address */ 
    4750 +} dma32dd_t; 
    4751 + 
    4752 +/* 
    4753 + * Each descriptor ring must be 4096byte aligned, and fit within a single 4096byte page. 
    4754 + */ 
    4755 +#define        D32MAXRINGSZ    4096 
    4756 +#define        D32RINGALIGN    4096 
    4757 +#define        D32MAXDD        (D32MAXRINGSZ / sizeof (dma32dd_t)) 
    4758 + 
    4759 +/* transmit channel control */ 
    4760 +#define        XC_XE           ((uint32)1 << 0)        /* transmit enable */ 
    4761 +#define        XC_SE           ((uint32)1 << 1)        /* transmit suspend request */ 
    4762 +#define        XC_LE           ((uint32)1 << 2)        /* loopback enable */ 
    4763 +#define        XC_FL           ((uint32)1 << 4)        /* flush request */ 
    4764 +#define        XC_AE           ((uint32)3 << 16)       /* address extension bits */ 
    4765 +#define        XC_AE_SHIFT     16 
    4766 + 
    4767 +/* transmit descriptor table pointer */ 
    4768 +#define        XP_LD_MASK      0xfff                   /* last valid descriptor */ 
    4769 + 
    4770 +/* transmit channel status */ 
    4771 +#define        XS_CD_MASK      0x0fff                  /* current descriptor pointer */ 
    4772 +#define        XS_XS_MASK      0xf000                  /* transmit state */ 
    4773 +#define        XS_XS_SHIFT     12 
    4774 +#define        XS_XS_DISABLED  0x0000                  /* disabled */ 
    4775 +#define        XS_XS_ACTIVE    0x1000                  /* active */ 
    4776 +#define        XS_XS_IDLE      0x2000                  /* idle wait */ 
    4777 +#define        XS_XS_STOPPED   0x3000                  /* stopped */ 
    4778 +#define        XS_XS_SUSP      0x4000                  /* suspend pending */ 
    4779 +#define        XS_XE_MASK      0xf0000                 /* transmit errors */ 
    4780 +#define        XS_XE_SHIFT     16 
    4781 +#define        XS_XE_NOERR     0x00000                 /* no error */ 
    4782 +#define        XS_XE_DPE       0x10000                 /* descriptor protocol error */ 
    4783 +#define        XS_XE_DFU       0x20000                 /* data fifo underrun */ 
    4784 +#define        XS_XE_BEBR      0x30000                 /* bus error on buffer read */ 
    4785 +#define        XS_XE_BEDA      0x40000                 /* bus error on descriptor access */ 
    4786 +#define        XS_AD_MASK      0xfff00000              /* active descriptor */ 
    4787 +#define        XS_AD_SHIFT     20 
    4788 + 
    4789 +/* receive channel control */ 
    4790 +#define        RC_RE           ((uint32)1 << 0)        /* receive enable */ 
    4791 +#define        RC_RO_MASK      0xfe                    /* receive frame offset */ 
    4792 +#define        RC_RO_SHIFT     1 
    4793 +#define        RC_FM           ((uint32)1 << 8)        /* direct fifo receive (pio) mode */ 
    4794 +#define        RC_AE           ((uint32)3 << 16)       /* address extension bits */ 
    4795 +#define        RC_AE_SHIFT     16 
    4796 + 
    4797 +/* receive descriptor table pointer */ 
    4798 +#define        RP_LD_MASK      0xfff                   /* last valid descriptor */ 
    4799 + 
    4800 +/* receive channel status */ 
    4801 +#define        RS_CD_MASK      0x0fff                  /* current descriptor pointer */ 
    4802 +#define        RS_RS_MASK      0xf000                  /* receive state */ 
    4803 +#define        RS_RS_SHIFT     12 
    4804 +#define        RS_RS_DISABLED  0x0000                  /* disabled */ 
    4805 +#define        RS_RS_ACTIVE    0x1000                  /* active */ 
    4806 +#define        RS_RS_IDLE      0x2000                  /* idle wait */ 
    4807 +#define        RS_RS_STOPPED   0x3000                  /* reserved */ 
    4808 +#define        RS_RE_MASK      0xf0000                 /* receive errors */ 
    4809 +#define        RS_RE_SHIFT     16 
    4810 +#define        RS_RE_NOERR     0x00000                 /* no error */ 
    4811 +#define        RS_RE_DPE       0x10000                 /* descriptor protocol error */ 
    4812 +#define        RS_RE_DFO       0x20000                 /* data fifo overflow */ 
    4813 +#define        RS_RE_BEBW      0x30000                 /* bus error on buffer write */ 
    4814 +#define        RS_RE_BEDA      0x40000                 /* bus error on descriptor access */ 
    4815 +#define        RS_AD_MASK      0xfff00000              /* active descriptor */ 
    4816 +#define        RS_AD_SHIFT     20 
    4817 + 
    4818 +/* fifoaddr */ 
    4819 +#define        FA_OFF_MASK     0xffff                  /* offset */ 
    4820 +#define        FA_SEL_MASK     0xf0000                 /* select */ 
    4821 +#define        FA_SEL_SHIFT    16 
    4822 +#define        FA_SEL_XDD      0x00000                 /* transmit dma data */ 
    4823 +#define        FA_SEL_XDP      0x10000                 /* transmit dma pointers */ 
    4824 +#define        FA_SEL_RDD      0x40000                 /* receive dma data */ 
    4825 +#define        FA_SEL_RDP      0x50000                 /* receive dma pointers */ 
    4826 +#define        FA_SEL_XFD      0x80000                 /* transmit fifo data */ 
    4827 +#define        FA_SEL_XFP      0x90000                 /* transmit fifo pointers */ 
    4828 +#define        FA_SEL_RFD      0xc0000                 /* receive fifo data */ 
    4829 +#define        FA_SEL_RFP      0xd0000                 /* receive fifo pointers */ 
    4830 +#define        FA_SEL_RSD      0xe0000                 /* receive frame status data */ 
    4831 +#define        FA_SEL_RSP      0xf0000                 /* receive frame status pointers */ 
    4832 + 
    4833 +/* descriptor control flags */ 
    4834 +#define        CTRL_BC_MASK    0x1fff                  /* buffer byte count */ 
    4835 +#define        CTRL_AE         ((uint32)3 << 16)       /* address extension bits */ 
    4836 +#define        CTRL_AE_SHIFT   16 
    4837 +#define        CTRL_EOT        ((uint32)1 << 28)       /* end of descriptor table */ 
    4838 +#define        CTRL_IOC        ((uint32)1 << 29)       /* interrupt on completion */ 
    4839 +#define        CTRL_EOF        ((uint32)1 << 30)       /* end of frame */ 
    4840 +#define        CTRL_SOF        ((uint32)1 << 31)       /* start of frame */ 
    4841 + 
    4842 +/* control flags in the range [27:20] are core-specific and not defined here */ 
    4843 +#define        CTRL_CORE_MASK  0x0ff00000 
    4844 + 
    4845 +/*** 64 bits addressing ***/ 
    4846 + 
    4847 +/* dma registers per channel(xmt or rcv) */ 
    4848 +typedef volatile struct { 
    4849 +       uint32  control;                /* enable, et al */ 
    4850 +       uint32  ptr;                    /* last descriptor posted to chip */ 
    4851 +       uint32  addrlow;                /* descriptor ring base address low 32-bits (8K aligned) */ 
    4852 +       uint32  addrhigh;               /* descriptor ring base address bits 63:32 (8K aligned) */ 
    4853 +       uint32  status0;                /* current descriptor, xmt state */ 
    4854 +       uint32  status1;                /* active descriptor, xmt error */ 
    4855 +} dma64regs_t; 
    4856 + 
    4857 +typedef volatile struct { 
    4858 +       dma64regs_t     tx;             /* dma64 tx channel */ 
    4859 +       dma64regs_t     rx;             /* dma64 rx channel */ 
    4860 +} dma64regp_t; 
    4861 + 
    4862 +typedef volatile struct {              /* diag access */ 
    4863 +       uint32  fifoaddr;               /* diag address */ 
    4864 +       uint32  fifodatalow;            /* low 32bits of data */ 
    4865 +       uint32  fifodatahigh;           /* high 32bits of data */ 
    4866 +       uint32  pad;                    /* reserved */ 
    4867 +} dma64diag_t; 
    4868 + 
    4869 +/* 
    4870 + * DMA Descriptor 
    4871 + * Descriptors are only read by the hardware, never written back. 
    4872 + */ 
    4873 +typedef volatile struct { 
    4874 +       uint32  ctrl1;          /* misc control bits & bufcount */ 
    4875 +       uint32  ctrl2;          /* buffer count and address extension */ 
    4876 +       uint32  addrlow;        /* memory address of the first byte of the date buffer, bits 31:0 */ 
    4877 +       uint32  addrhigh;       /* memory address of the first byte of the date buffer, bits 63:32 */ 
    4878 +} dma64dd_t; 
    4879 + 
    4880 +/* 
    4881 + * Each descriptor ring must be 8kB aligned, and fit within a contiguous 8kB physical addresss. 
    4882 + */ 
    4883 +#define        D64MAXRINGSZ    8192 
    4884 +#define        D64RINGALIGN    8192 
    4885 +#define        D64MAXDD        (D64MAXRINGSZ / sizeof (dma64dd_t)) 
    4886 + 
    4887 +/* transmit channel control */ 
    4888 +#define        D64_XC_XE               0x00000001      /* transmit enable */ 
    4889 +#define        D64_XC_SE               0x00000002      /* transmit suspend request */ 
    4890 +#define        D64_XC_LE               0x00000004      /* loopback enable */ 
    4891 +#define        D64_XC_FL               0x00000010      /* flush request */ 
    4892 +#define        D64_XC_AE               0x00110000      /* address extension bits */ 
    4893 +#define        D64_XC_AE_SHIFT         16 
    4894 + 
    4895 +/* transmit descriptor table pointer */ 
    4896 +#define        D64_XP_LD_MASK          0x00000fff      /* last valid descriptor */ 
    4897 + 
    4898 +/* transmit channel status */ 
    4899 +#define        D64_XS0_CD_MASK         0x00001fff      /* current descriptor pointer */ 
    4900 +#define        D64_XS0_XS_MASK         0xf0000000      /* transmit state */ 
    4901 +#define        D64_XS0_XS_SHIFT                28 
    4902 +#define        D64_XS0_XS_DISABLED     0x00000000      /* disabled */ 
    4903 +#define        D64_XS0_XS_ACTIVE       0x10000000      /* active */ 
    4904 +#define        D64_XS0_XS_IDLE         0x20000000      /* idle wait */ 
    4905 +#define        D64_XS0_XS_STOPPED      0x30000000      /* stopped */ 
    4906 +#define        D64_XS0_XS_SUSP         0x40000000      /* suspend pending */ 
    4907 + 
    4908 +#define        D64_XS1_AD_MASK         0x0001ffff      /* active descriptor */ 
    4909 +#define        D64_XS1_XE_MASK         0xf0000000      /* transmit errors */ 
    4910 +#define        D64_XS1_XE_SHIFT                28 
    4911 +#define        D64_XS1_XE_NOERR        0x00000000      /* no error */ 
    4912 +#define        D64_XS1_XE_DPE          0x10000000      /* descriptor protocol error */ 
    4913 +#define        D64_XS1_XE_DFU          0x20000000      /* data fifo underrun */ 
    4914 +#define        D64_XS1_XE_DTE          0x30000000      /* data transfer error */ 
    4915 +#define        D64_XS1_XE_DESRE        0x40000000      /* descriptor read error */ 
    4916 +#define        D64_XS1_XE_COREE        0x50000000      /* core error */ 
    4917 + 
    4918 +/* receive channel control */ 
    4919 +#define        D64_RC_RE               0x00000001      /* receive enable */ 
    4920 +#define        D64_RC_RO_MASK          0x000000fe      /* receive frame offset */ 
    4921 +#define        D64_RC_RO_SHIFT         1 
    4922 +#define        D64_RC_FM               0x00000100      /* direct fifo receive (pio) mode */ 
    4923 +#define        D64_RC_AE               0x00110000      /* address extension bits */ 
    4924 +#define        D64_RC_AE_SHIFT         16 
    4925 + 
    4926 +/* receive descriptor table pointer */ 
    4927 +#define        D64_RP_LD_MASK          0x00000fff      /* last valid descriptor */ 
    4928 + 
    4929 +/* receive channel status */ 
    4930 +#define        D64_RS0_CD_MASK         0x00001fff      /* current descriptor pointer */ 
    4931 +#define        D64_RS0_RS_MASK         0xf0000000      /* receive state */ 
    4932 +#define        D64_RS0_RS_SHIFT                28 
    4933 +#define        D64_RS0_RS_DISABLED     0x00000000      /* disabled */ 
    4934 +#define        D64_RS0_RS_ACTIVE       0x10000000      /* active */ 
    4935 +#define        D64_RS0_RS_IDLE         0x20000000      /* idle wait */ 
    4936 +#define        D64_RS0_RS_STOPPED      0x30000000      /* stopped */ 
    4937 +#define        D64_RS0_RS_SUSP         0x40000000      /* suspend pending */ 
    4938 + 
    4939 +#define        D64_RS1_AD_MASK         0x0001ffff      /* active descriptor */ 
    4940 +#define        D64_RS1_RE_MASK         0xf0000000      /* receive errors */ 
    4941 +#define        D64_RS1_RE_SHIFT                28 
    4942 +#define        D64_RS1_RE_NOERR        0x00000000      /* no error */ 
    4943 +#define        D64_RS1_RE_DPO          0x10000000      /* descriptor protocol error */ 
    4944 +#define        D64_RS1_RE_DFU          0x20000000      /* data fifo overflow */ 
    4945 +#define        D64_RS1_RE_DTE          0x30000000      /* data transfer error */ 
    4946 +#define        D64_RS1_RE_DESRE        0x40000000      /* descriptor read error */ 
    4947 +#define        D64_RS1_RE_COREE        0x50000000      /* core error */ 
    4948 + 
    4949 +/* fifoaddr */ 
    4950 +#define        D64_FA_OFF_MASK         0xffff          /* offset */ 
    4951 +#define        D64_FA_SEL_MASK         0xf0000         /* select */ 
    4952 +#define        D64_FA_SEL_SHIFT        16 
    4953 +#define        D64_FA_SEL_XDD          0x00000         /* transmit dma data */ 
    4954 +#define        D64_FA_SEL_XDP          0x10000         /* transmit dma pointers */ 
    4955 +#define        D64_FA_SEL_RDD          0x40000         /* receive dma data */ 
    4956 +#define        D64_FA_SEL_RDP          0x50000         /* receive dma pointers */ 
    4957 +#define        D64_FA_SEL_XFD          0x80000         /* transmit fifo data */ 
    4958 +#define        D64_FA_SEL_XFP          0x90000         /* transmit fifo pointers */ 
    4959 +#define        D64_FA_SEL_RFD          0xc0000         /* receive fifo data */ 
    4960 +#define        D64_FA_SEL_RFP          0xd0000         /* receive fifo pointers */ 
    4961 +#define        D64_FA_SEL_RSD          0xe0000         /* receive frame status data */ 
    4962 +#define        D64_FA_SEL_RSP          0xf0000         /* receive frame status pointers */ 
    4963 + 
    4964 +/* descriptor control flags 1 */ 
    4965 +#define        D64_CTRL1_EOT           ((uint32)1 << 28)       /* end of descriptor table */ 
    4966 +#define        D64_CTRL1_IOC           ((uint32)1 << 29)       /* interrupt on completion */ 
    4967 +#define        D64_CTRL1_EOF           ((uint32)1 << 30)       /* end of frame */ 
    4968 +#define        D64_CTRL1_SOF           ((uint32)1 << 31)       /* start of frame */ 
    4969 + 
    4970 +/* descriptor control flags 2 */ 
    4971 +#define        D64_CTRL2_BC_MASK       0x00007fff      /* buffer byte count mask */ 
    4972 +#define        D64_CTRL2_AE            0x00110000      /* address extension bits */ 
    4973 +#define        D64_CTRL2_AE_SHIFT      16 
    4974 + 
    4975 +/* control flags in the range [27:20] are core-specific and not defined here */ 
    4976 +#define        D64_CTRL_CORE_MASK      0x0ff00000 
    4977 + 
    4978 + 
    4979 +#endif /* _sbhnddma_h_ */ 
    4980 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbmemc.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbmemc.h 
    4981 --- linux-2.4.32/arch/mips/bcm947xx/include/sbmemc.h    1970-01-01 01:00:00.000000000 +0100 
    4982 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbmemc.h       2005-12-16 23:39:10.932836000 +0100 
     4613diff -Naur linux.old/arch/mips/bcm947xx/include/sbmemc.h linux.dev/arch/mips/bcm947xx/include/sbmemc.h 
     4614--- linux.old/arch/mips/bcm947xx/include/sbmemc.h       1970-01-01 01:00:00.000000000 +0100 
     4615+++ linux.dev/arch/mips/bcm947xx/include/sbmemc.h       2006-04-06 15:34:14.000000000 +0200 
    49834616@@ -0,0 +1,148 @@ 
    49844617+/* 
     
    51304763+ 
    51314764+#endif /* _SBMEMC_H */ 
    5132 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbmips.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbmips.h 
    5133 --- linux-2.4.32/arch/mips/bcm947xx/include/sbmips.h    1970-01-01 01:00:00.000000000 +0100 
    5134 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbmips.h       2005-12-16 23:39:10.936836250 +0100 
     4765diff -Naur linux.old/arch/mips/bcm947xx/include/sbmips.h linux.dev/arch/mips/bcm947xx/include/sbmips.h 
     4766--- linux.old/arch/mips/bcm947xx/include/sbmips.h       1970-01-01 01:00:00.000000000 +0100 
     4767+++ linux.dev/arch/mips/bcm947xx/include/sbmips.h       2006-04-06 15:34:14.000000000 +0200 
    51354768@@ -0,0 +1,62 @@ 
    51364769+/* 
     
    51964829+ 
    51974830+#endif /* _SBMIPS_H */ 
    5198 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbpcie.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpcie.h 
    5199 --- linux-2.4.32/arch/mips/bcm947xx/include/sbpcie.h    1970-01-01 01:00:00.000000000 +0100 
    5200 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpcie.h       2005-12-16 23:39:10.936836250 +0100 
     4831diff -Naur linux.old/arch/mips/bcm947xx/include/sbpci.h linux.dev/arch/mips/bcm947xx/include/sbpci.h 
     4832--- linux.old/arch/mips/bcm947xx/include/sbpci.h        1970-01-01 01:00:00.000000000 +0100 
     4833+++ linux.dev/arch/mips/bcm947xx/include/sbpci.h        2006-04-06 15:34:14.000000000 +0200 
     4834@@ -0,0 +1,122 @@ 
     4835+/* 
     4836+ * BCM47XX Sonics SiliconBackplane PCI core hardware definitions. 
     4837+ * 
     4838+ * $Id$ 
     4839+ * Copyright 2005, Broadcom Corporation       
     4840+ * All Rights Reserved.       
     4841+ *        
     4842+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
     4843+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
     4844+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
     4845+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
     4846+ */ 
     4847+ 
     4848+#ifndef        _SBPCI_H 
     4849+#define        _SBPCI_H 
     4850+ 
     4851+/* cpp contortions to concatenate w/arg prescan */ 
     4852+#ifndef PAD 
     4853+#define        _PADLINE(line)  pad ## line 
     4854+#define        _XSTR(line)     _PADLINE(line) 
     4855+#define        PAD             _XSTR(__LINE__) 
     4856+#endif 
     4857+ 
     4858+/* Sonics side: PCI core and host control registers */ 
     4859+typedef struct sbpciregs { 
     4860+       uint32 control;         /* PCI control */ 
     4861+       uint32 PAD[3]; 
     4862+       uint32 arbcontrol;      /* PCI arbiter control */ 
     4863+       uint32 PAD[3]; 
     4864+       uint32 intstatus;       /* Interrupt status */ 
     4865+       uint32 intmask;         /* Interrupt mask */ 
     4866+       uint32 sbtopcimailbox;  /* Sonics to PCI mailbox */ 
     4867+       uint32 PAD[9]; 
     4868+       uint32 bcastaddr;       /* Sonics broadcast address */ 
     4869+       uint32 bcastdata;       /* Sonics broadcast data */ 
     4870+       uint32 PAD[2]; 
     4871+       uint32 gpioin;          /* ro: gpio input (>=rev2) */ 
     4872+       uint32 gpioout;         /* rw: gpio output (>=rev2) */ 
     4873+       uint32 gpioouten;       /* rw: gpio output enable (>= rev2) */ 
     4874+       uint32 gpiocontrol;     /* rw: gpio control (>= rev2) */ 
     4875+       uint32 PAD[36]; 
     4876+       uint32 sbtopci0;        /* Sonics to PCI translation 0 */ 
     4877+       uint32 sbtopci1;        /* Sonics to PCI translation 1 */ 
     4878+       uint32 sbtopci2;        /* Sonics to PCI translation 2 */ 
     4879+       uint32 PAD[445]; 
     4880+       uint16 sprom[36];       /* SPROM shadow Area */ 
     4881+       uint32 PAD[46]; 
     4882+} sbpciregs_t; 
     4883+ 
     4884+/* PCI control */ 
     4885+#define PCI_RST_OE     0x01    /* When set, drives PCI_RESET out to pin */ 
     4886+#define PCI_RST                0x02    /* Value driven out to pin */ 
     4887+#define PCI_CLK_OE     0x04    /* When set, drives clock as gated by PCI_CLK out to pin */ 
     4888+#define PCI_CLK                0x08    /* Gate for clock driven out to pin */   
     4889+ 
     4890+/* PCI arbiter control */ 
     4891+#define PCI_INT_ARB    0x01    /* When set, use an internal arbiter */ 
     4892+#define PCI_EXT_ARB    0x02    /* When set, use an external arbiter */ 
     4893+#define PCI_PARKID_MASK        0x06    /* Selects which agent is parked on an idle bus */ 
     4894+#define PCI_PARKID_SHIFT   1 
     4895+#define PCI_PARKID_LAST           0    /* Last requestor */ 
     4896+#define PCI_PARKID_4710           1    /* 4710 */ 
     4897+#define PCI_PARKID_EXTREQ0 2   /* External requestor 0 */ 
     4898+#define PCI_PARKID_EXTREQ1 3   /* External requestor 1 */ 
     4899+ 
     4900+/* Interrupt status/mask */ 
     4901+#define PCI_INTA       0x01    /* PCI INTA# is asserted */ 
     4902+#define PCI_INTB       0x02    /* PCI INTB# is asserted */ 
     4903+#define PCI_SERR       0x04    /* PCI SERR# has been asserted (write one to clear) */ 
     4904+#define PCI_PERR       0x08    /* PCI PERR# has been asserted (write one to clear) */ 
     4905+#define PCI_PME                0x10    /* PCI PME# is asserted */ 
     4906+ 
     4907+/* (General) PCI/SB mailbox interrupts, two bits per pci function */ 
     4908+#define        MAILBOX_F0_0    0x100   /* function 0, int 0 */ 
     4909+#define        MAILBOX_F0_1    0x200   /* function 0, int 1 */ 
     4910+#define        MAILBOX_F1_0    0x400   /* function 1, int 0 */ 
     4911+#define        MAILBOX_F1_1    0x800   /* function 1, int 1 */ 
     4912+#define        MAILBOX_F2_0    0x1000  /* function 2, int 0 */ 
     4913+#define        MAILBOX_F2_1    0x2000  /* function 2, int 1 */ 
     4914+#define        MAILBOX_F3_0    0x4000  /* function 3, int 0 */ 
     4915+#define        MAILBOX_F3_1    0x8000  /* function 3, int 1 */ 
     4916+ 
     4917+/* Sonics broadcast address */ 
     4918+#define BCAST_ADDR_MASK        0xff    /* Broadcast register address */ 
     4919+ 
     4920+/* Sonics to PCI translation types */ 
     4921+#define SBTOPCI0_MASK  0xfc000000 
     4922+#define SBTOPCI1_MASK  0xfc000000 
     4923+#define SBTOPCI2_MASK  0xc0000000 
     4924+#define SBTOPCI_MEM    0 
     4925+#define SBTOPCI_IO     1 
     4926+#define SBTOPCI_CFG0   2 
     4927+#define SBTOPCI_CFG1   3 
     4928+#define        SBTOPCI_PREF    0x4             /* prefetch enable */ 
     4929+#define        SBTOPCI_BURST   0x8             /* burst enable */ 
     4930+#define        SBTOPCI_RC_MASK         0x30    /* read command (>= rev11) */ 
     4931+#define        SBTOPCI_RC_READ         0x00    /* memory read */ 
     4932+#define        SBTOPCI_RC_READLINE     0x10    /* memory read line */ 
     4933+#define        SBTOPCI_RC_READMULTI    0x20    /* memory read multiple */ 
     4934+ 
     4935+/* PCI core index in SROM shadow area */ 
     4936+#define SRSH_PI_OFFSET 0       /* first word */ 
     4937+#define SRSH_PI_MASK   0xf000  /* bit 15:12 */ 
     4938+#define SRSH_PI_SHIFT  12      /* bit 15:12 */ 
     4939+ 
     4940+/* PCI side: Reserved PCI configuration registers (see pcicfg.h) */ 
     4941+#define cap_list       rsvd_a[0] 
     4942+#define bar0_window    dev_dep[0x80 - 0x40] 
     4943+#define bar1_window    dev_dep[0x84 - 0x40] 
     4944+#define sprom_control  dev_dep[0x88 - 0x40] 
     4945+ 
     4946+#ifndef _LANGUAGE_ASSEMBLY 
     4947+ 
     4948+extern int sbpci_read_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf, int len); 
     4949+extern int sbpci_write_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf, int len); 
     4950+extern void sbpci_ban(uint16 core); 
     4951+extern int sbpci_init(sb_t *sbh); 
     4952+extern void sbpci_check(sb_t *sbh); 
     4953+ 
     4954+#endif /* !_LANGUAGE_ASSEMBLY */ 
     4955+ 
     4956+#endif /* _SBPCI_H */ 
     4957diff -Naur linux.old/arch/mips/bcm947xx/include/sbpcie.h linux.dev/arch/mips/bcm947xx/include/sbpcie.h 
     4958--- linux.old/arch/mips/bcm947xx/include/sbpcie.h       1970-01-01 01:00:00.000000000 +0100 
     4959+++ linux.dev/arch/mips/bcm947xx/include/sbpcie.h       2006-04-06 15:34:14.000000000 +0200 
    52014960@@ -0,0 +1,199 @@ 
    52024961+/* 
     
    53995158+ 
    54005159+#endif /* _SBPCIE_H */ 
    5401 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbpci.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpci.h 
    5402 --- linux-2.4.32/arch/mips/bcm947xx/include/sbpci.h     1970-01-01 01:00:00.000000000 +0100 
    5403 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpci.h        2005-12-16 23:39:10.936836250 +0100 
    5404 @@ -0,0 +1,122 @@ 
    5405 +/* 
    5406 + * BCM47XX Sonics SiliconBackplane PCI core hardware definitions. 
    5407 + * 
    5408 + * $Id$ 
    5409 + * Copyright 2005, Broadcom Corporation       
    5410 + * All Rights Reserved.       
    5411 + *        
    5412 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
    5413 + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
    5414 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
    5415 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
    5416 + */ 
    5417 + 
    5418 +#ifndef        _SBPCI_H 
    5419 +#define        _SBPCI_H 
    5420 + 
    5421 +/* cpp contortions to concatenate w/arg prescan */ 
    5422 +#ifndef PAD 
    5423 +#define        _PADLINE(line)  pad ## line 
    5424 +#define        _XSTR(line)     _PADLINE(line) 
    5425 +#define        PAD             _XSTR(__LINE__) 
    5426 +#endif 
    5427 + 
    5428 +/* Sonics side: PCI core and host control registers */ 
    5429 +typedef struct sbpciregs { 
    5430 +       uint32 control;         /* PCI control */ 
    5431 +       uint32 PAD[3]; 
    5432 +       uint32 arbcontrol;      /* PCI arbiter control */ 
    5433 +       uint32 PAD[3]; 
    5434 +       uint32 intstatus;       /* Interrupt status */ 
    5435 +       uint32 intmask;         /* Interrupt mask */ 
    5436 +       uint32 sbtopcimailbox;  /* Sonics to PCI mailbox */ 
    5437 +       uint32 PAD[9]; 
    5438 +       uint32 bcastaddr;       /* Sonics broadcast address */ 
    5439 +       uint32 bcastdata;       /* Sonics broadcast data */ 
    5440 +       uint32 PAD[2]; 
    5441 +       uint32 gpioin;          /* ro: gpio input (>=rev2) */ 
    5442 +       uint32 gpioout;         /* rw: gpio output (>=rev2) */ 
    5443 +       uint32 gpioouten;       /* rw: gpio output enable (>= rev2) */ 
    5444 +       uint32 gpiocontrol;     /* rw: gpio control (>= rev2) */ 
    5445 +       uint32 PAD[36]; 
    5446 +       uint32 sbtopci0;        /* Sonics to PCI translation 0 */ 
    5447 +       uint32 sbtopci1;        /* Sonics to PCI translation 1 */ 
    5448 +       uint32 sbtopci2;        /* Sonics to PCI translation 2 */ 
    5449 +       uint32 PAD[445]; 
    5450 +       uint16 sprom[36];       /* SPROM shadow Area */ 
    5451 +       uint32 PAD[46]; 
    5452 +} sbpciregs_t; 
    5453 + 
    5454 +/* PCI control */ 
    5455 +#define PCI_RST_OE     0x01    /* When set, drives PCI_RESET out to pin */ 
    5456 +#define PCI_RST                0x02    /* Value driven out to pin */ 
    5457 +#define PCI_CLK_OE     0x04    /* When set, drives clock as gated by PCI_CLK out to pin */ 
    5458 +#define PCI_CLK                0x08    /* Gate for clock driven out to pin */   
    5459 + 
    5460 +/* PCI arbiter control */ 
    5461 +#define PCI_INT_ARB    0x01    /* When set, use an internal arbiter */ 
    5462 +#define PCI_EXT_ARB    0x02    /* When set, use an external arbiter */ 
    5463 +#define PCI_PARKID_MASK        0x06    /* Selects which agent is parked on an idle bus */ 
    5464 +#define PCI_PARKID_SHIFT   1 
    5465 +#define PCI_PARKID_LAST           0    /* Last requestor */ 
    5466 +#define PCI_PARKID_4710           1    /* 4710 */ 
    5467 +#define PCI_PARKID_EXTREQ0 2   /* External requestor 0 */ 
    5468 +#define PCI_PARKID_EXTREQ1 3   /* External requestor 1 */ 
    5469 + 
    5470 +/* Interrupt status/mask */ 
    5471 +#define PCI_INTA       0x01    /* PCI INTA# is asserted */ 
    5472 +#define PCI_INTB       0x02    /* PCI INTB# is asserted */ 
    5473 +#define PCI_SERR       0x04    /* PCI SERR# has been asserted (write one to clear) */ 
    5474 +#define PCI_PERR       0x08    /* PCI PERR# has been asserted (write one to clear) */ 
    5475 +#define PCI_PME                0x10    /* PCI PME# is asserted */ 
    5476 + 
    5477 +/* (General) PCI/SB mailbox interrupts, two bits per pci function */ 
    5478 +#define        MAILBOX_F0_0    0x100   /* function 0, int 0 */ 
    5479 +#define        MAILBOX_F0_1    0x200   /* function 0, int 1 */ 
    5480 +#define        MAILBOX_F1_0    0x400   /* function 1, int 0 */ 
    5481 +#define        MAILBOX_F1_1    0x800   /* function 1, int 1 */ 
    5482 +#define        MAILBOX_F2_0    0x1000  /* function 2, int 0 */ 
    5483 +#define        MAILBOX_F2_1    0x2000  /* function 2, int 1 */ 
    5484 +#define        MAILBOX_F3_0    0x4000  /* function 3, int 0 */ 
    5485 +#define        MAILBOX_F3_1    0x8000  /* function 3, int 1 */ 
    5486 + 
    5487 +/* Sonics broadcast address */ 
    5488 +#define BCAST_ADDR_MASK        0xff    /* Broadcast register address */ 
    5489 + 
    5490 +/* Sonics to PCI translation types */ 
    5491 +#define SBTOPCI0_MASK  0xfc000000 
    5492 +#define SBTOPCI1_MASK  0xfc000000 
    5493 +#define SBTOPCI2_MASK  0xc0000000 
    5494 +#define SBTOPCI_MEM    0 
    5495 +#define SBTOPCI_IO     1 
    5496 +#define SBTOPCI_CFG0   2 
    5497 +#define SBTOPCI_CFG1   3 
    5498 +#define        SBTOPCI_PREF    0x4             /* prefetch enable */ 
    5499 +#define        SBTOPCI_BURST   0x8             /* burst enable */ 
    5500 +#define        SBTOPCI_RC_MASK         0x30    /* read command (>= rev11) */ 
    5501 +#define        SBTOPCI_RC_READ         0x00    /* memory read */ 
    5502 +#define        SBTOPCI_RC_READLINE     0x10    /* memory read line */ 
    5503 +#define        SBTOPCI_RC_READMULTI    0x20    /* memory read multiple */ 
    5504 + 
    5505 +/* PCI core index in SROM shadow area */ 
    5506 +#define SRSH_PI_OFFSET 0       /* first word */ 
    5507 +#define SRSH_PI_MASK   0xf000  /* bit 15:12 */ 
    5508 +#define SRSH_PI_SHIFT  12      /* bit 15:12 */ 
    5509 + 
    5510 +/* PCI side: Reserved PCI configuration registers (see pcicfg.h) */ 
    5511 +#define cap_list       rsvd_a[0] 
    5512 +#define bar0_window    dev_dep[0x80 - 0x40] 
    5513 +#define bar1_window    dev_dep[0x84 - 0x40] 
    5514 +#define sprom_control  dev_dep[0x88 - 0x40] 
    5515 + 
    5516 +#ifndef _LANGUAGE_ASSEMBLY 
    5517 + 
    5518 +extern int sbpci_read_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf, int len); 
    5519 +extern int sbpci_write_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf, int len); 
    5520 +extern void sbpci_ban(uint16 core); 
    5521 +extern int sbpci_init(sb_t *sbh); 
    5522 +extern void sbpci_check(sb_t *sbh); 
    5523 + 
    5524 +#endif /* !_LANGUAGE_ASSEMBLY */ 
    5525 + 
    5526 +#endif /* _SBPCI_H */ 
    5527 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbpcmcia.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpcmcia.h 
    5528 --- linux-2.4.32/arch/mips/bcm947xx/include/sbpcmcia.h  1970-01-01 01:00:00.000000000 +0100 
    5529 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbpcmcia.h     2005-12-16 23:39:10.936836250 +0100 
     5160diff -Naur linux.old/arch/mips/bcm947xx/include/sbpcmcia.h linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h 
     5161--- linux.old/arch/mips/bcm947xx/include/sbpcmcia.h     1970-01-01 01:00:00.000000000 +0100 
     5162+++ linux.dev/arch/mips/bcm947xx/include/sbpcmcia.h     2006-04-06 15:34:14.000000000 +0200 
    55305163@@ -0,0 +1,146 @@ 
    55315164+/* 
     
    56755308+ 
    56765309+#endif /* _SBPCMCIA_H */ 
    5677 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbsdram.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbsdram.h 
    5678 --- linux-2.4.32/arch/mips/bcm947xx/include/sbsdram.h   1970-01-01 01:00:00.000000000 +0100 
    5679 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbsdram.h      2005-12-16 23:39:10.936836250 +0100 
     5310diff -Naur linux.old/arch/mips/bcm947xx/include/sbsdram.h linux.dev/arch/mips/bcm947xx/include/sbsdram.h 
     5311--- linux.old/arch/mips/bcm947xx/include/sbsdram.h      1970-01-01 01:00:00.000000000 +0100 
     5312+++ linux.dev/arch/mips/bcm947xx/include/sbsdram.h      2006-04-06 15:34:14.000000000 +0200 
    56805313@@ -0,0 +1,75 @@ 
    56815314+/* 
     
    57545387+ 
    57555388+#endif /* _SBSDRAM_H */ 
    5756 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbsocram.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbsocram.h 
    5757 --- linux-2.4.32/arch/mips/bcm947xx/include/sbsocram.h  1970-01-01 01:00:00.000000000 +0100 
    5758 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbsocram.h     2005-12-16 23:39:10.936836250 +0100 
     5389diff -Naur linux.old/arch/mips/bcm947xx/include/sbsocram.h linux.dev/arch/mips/bcm947xx/include/sbsocram.h 
     5390--- linux.old/arch/mips/bcm947xx/include/sbsocram.h     1970-01-01 01:00:00.000000000 +0100 
     5391+++ linux.dev/arch/mips/bcm947xx/include/sbsocram.h     2006-04-06 15:34:14.000000000 +0200 
    57595392@@ -0,0 +1,37 @@ 
    57605393+/* 
     
    57955428+ 
    57965429+#endif /* _SBSOCRAM_H */ 
    5797 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sbutils.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbutils.h 
    5798 --- linux-2.4.32/arch/mips/bcm947xx/include/sbutils.h   1970-01-01 01:00:00.000000000 +0100 
    5799 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sbutils.h      2005-12-16 23:39:10.936836250 +0100 
     5430diff -Naur linux.old/arch/mips/bcm947xx/include/sbutils.h linux.dev/arch/mips/bcm947xx/include/sbutils.h 
     5431--- linux.old/arch/mips/bcm947xx/include/sbutils.h      1970-01-01 01:00:00.000000000 +0100 
     5432+++ linux.dev/arch/mips/bcm947xx/include/sbutils.h      2006-04-06 15:34:14.000000000 +0200 
    58005433@@ -0,0 +1,140 @@ 
    58015434+/* 
     
    59395572+ 
    59405573+#endif /* _sbutils_h_ */ 
    5941 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/sflash.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/sflash.h 
    5942 --- linux-2.4.32/arch/mips/bcm947xx/include/sflash.h    1970-01-01 01:00:00.000000000 +0100 
    5943 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/sflash.h       2005-12-16 23:39:10.936836250 +0100 
     5574diff -Naur linux.old/arch/mips/bcm947xx/include/sflash.h linux.dev/arch/mips/bcm947xx/include/sflash.h 
     5575--- linux.old/arch/mips/bcm947xx/include/sflash.h       1970-01-01 01:00:00.000000000 +0100 
     5576+++ linux.dev/arch/mips/bcm947xx/include/sflash.h       2006-04-06 15:34:14.000000000 +0200 
    59445577@@ -0,0 +1,36 @@ 
    59455578+/* 
     
    59795612+ 
    59805613+#endif /* _sflash_h_ */ 
    5981 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/trxhdr.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/trxhdr.h 
    5982 --- linux-2.4.32/arch/mips/bcm947xx/include/trxhdr.h    1970-01-01 01:00:00.000000000 +0100 
    5983 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/trxhdr.h       2005-12-16 23:39:10.940836500 +0100 
     5614diff -Naur linux.old/arch/mips/bcm947xx/include/trxhdr.h linux.dev/arch/mips/bcm947xx/include/trxhdr.h 
     5615--- linux.old/arch/mips/bcm947xx/include/trxhdr.h       1970-01-01 01:00:00.000000000 +0100 
     5616+++ linux.dev/arch/mips/bcm947xx/include/trxhdr.h       2006-04-06 15:34:14.000000000 +0200 
    59845617@@ -0,0 +1,33 @@ 
    59855618+/* 
     
    60165649+/* Compatibility */ 
    60175650+typedef struct trx_header TRXHDR, *PTRXHDR; 
    6018 diff -Nur linux-2.4.32/arch/mips/bcm947xx/include/typedefs.h linux-2.4.32-brcm/arch/mips/bcm947xx/include/typedefs.h 
    6019 --- linux-2.4.32/arch/mips/bcm947xx/include/typedefs.h  1970-01-01 01:00:00.000000000 +0100 
    6020 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/include/typedefs.h     2005-12-16 23:39:10.940836500 +0100 
     5651diff -Naur linux.old/arch/mips/bcm947xx/include/typedefs.h linux.dev/arch/mips/bcm947xx/include/typedefs.h 
     5652--- linux.old/arch/mips/bcm947xx/include/typedefs.h     1970-01-01 01:00:00.000000000 +0100 
     5653+++ linux.dev/arch/mips/bcm947xx/include/typedefs.h     2006-04-06 15:34:14.000000000 +0200 
    60215654@@ -0,0 +1,326 @@ 
    60225655+/* 
     
    63465979+ 
    63475980+#endif /* _TYPEDEFS_H_ */ 
    6348 diff -Nur linux-2.4.32/arch/mips/bcm947xx/Makefile linux-2.4.32-brcm/arch/mips/bcm947xx/Makefile 
    6349 --- linux-2.4.32/arch/mips/bcm947xx/Makefile    1970-01-01 01:00:00.000000000 +0100 
    6350 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/Makefile       2005-12-19 01:56:51.733868750 +0100 
    6351 @@ -0,0 +1,15 @@ 
    6352 +# 
    6353 +# Makefile for the BCM947xx specific kernel interface routines 
    6354 +# under Linux. 
    6355 +# 
    6356 + 
    6357 +EXTRA_CFLAGS+=-I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER 
    6358 + 
    6359 +O_TARGET        := bcm947xx.o 
    6360 + 
    6361 +export-objs     := nvram_linux.o setup.o 
    6362 +obj-y          := prom.o setup.o time.o sbmips.o gpio.o 
    6363 +obj-y          += nvram.o nvram_linux.o sflash.o cfe_env.o 
    6364 +obj-$(CONFIG_PCI) += sbpci.o pcibios.o 
    6365 + 
    6366 +include $(TOPDIR)/Rules.make 
    6367 diff -Nur linux-2.4.32/arch/mips/bcm947xx/nvram.c linux-2.4.32-brcm/arch/mips/bcm947xx/nvram.c 
    6368 --- linux-2.4.32/arch/mips/bcm947xx/nvram.c     1970-01-01 01:00:00.000000000 +0100 
    6369 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/nvram.c        2005-12-19 01:05:00.079582750 +0100 
     5981diff -Naur linux.old/arch/mips/bcm947xx/nvram.c linux.dev/arch/mips/bcm947xx/nvram.c 
     5982--- linux.old/arch/mips/bcm947xx/nvram.c        1970-01-01 01:00:00.000000000 +0100 
     5983+++ linux.dev/arch/mips/bcm947xx/nvram.c        2006-04-06 15:34:14.000000000 +0200 
    63705984@@ -0,0 +1,320 @@ 
    63715985+/* 
     
    66896303+       BCMINIT(nvram_free)(); 
    66906304+} 
    6691 diff -Nur linux-2.4.32/arch/mips/bcm947xx/nvram_linux.c linux-2.4.32-brcm/arch/mips/bcm947xx/nvram_linux.c 
    6692 --- linux-2.4.32/arch/mips/bcm947xx/nvram_linux.c       1970-01-01 01:00:00.000000000 +0100 
    6693 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/nvram_linux.c  2005-12-19 01:09:59.782313000 +0100 
     6305diff -Naur linux.old/arch/mips/bcm947xx/nvram_linux.c linux.dev/arch/mips/bcm947xx/nvram_linux.c 
     6306--- linux.old/arch/mips/bcm947xx/nvram_linux.c  1970-01-01 01:00:00.000000000 +0100 
     6307+++ linux.dev/arch/mips/bcm947xx/nvram_linux.c  2006-04-06 15:34:14.000000000 +0200 
    66946308@@ -0,0 +1,653 @@ 
    66956309+/* 
     
    73466960+module_init(dev_nvram_init); 
    73476961+module_exit(dev_nvram_exit); 
    7348 diff -Nur linux-2.4.32/arch/mips/bcm947xx/pcibios.c linux-2.4.32-brcm/arch/mips/bcm947xx/pcibios.c 
    7349 --- linux-2.4.32/arch/mips/bcm947xx/pcibios.c   1970-01-01 01:00:00.000000000 +0100 
    7350 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/pcibios.c      2005-12-16 23:39:10.944836750 +0100 
     6962diff -Naur linux.old/arch/mips/bcm947xx/pcibios.c linux.dev/arch/mips/bcm947xx/pcibios.c 
     6963--- linux.old/arch/mips/bcm947xx/pcibios.c      1970-01-01 01:00:00.000000000 +0100 
     6964+++ linux.dev/arch/mips/bcm947xx/pcibios.c      2006-04-06 15:34:14.000000000 +0200 
    73516965@@ -0,0 +1,355 @@ 
    73526966+/* 
     
    77057319+} 
    77067320+ 
    7707 diff -Nur linux-2.4.32/arch/mips/bcm947xx/prom.c linux-2.4.32-brcm/arch/mips/bcm947xx/prom.c 
    7708 --- linux-2.4.32/arch/mips/bcm947xx/prom.c      1970-01-01 01:00:00.000000000 +0100 
    7709 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/prom.c 2005-12-16 23:39:10.944836750 +0100 
     7321diff -Naur linux.old/arch/mips/bcm947xx/prom.c linux.dev/arch/mips/bcm947xx/prom.c 
     7322--- linux.old/arch/mips/bcm947xx/prom.c 1970-01-01 01:00:00.000000000 +0100 
     7323+++ linux.dev/arch/mips/bcm947xx/prom.c 2006-04-06 15:34:14.000000000 +0200 
    77107324@@ -0,0 +1,41 @@ 
    77117325+/* 
     
    77507364+{ 
    77517365+} 
    7752 diff -Nur linux-2.4.32/arch/mips/bcm947xx/sbmips.c linux-2.4.32-brcm/arch/mips/bcm947xx/sbmips.c 
    7753 --- linux-2.4.32/arch/mips/bcm947xx/sbmips.c    1970-01-01 01:00:00.000000000 +0100 
    7754 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/sbmips.c       2005-12-16 23:39:10.944836750 +0100 
     7366diff -Naur linux.old/arch/mips/bcm947xx/sbmips.c linux.dev/arch/mips/bcm947xx/sbmips.c 
     7367--- linux.old/arch/mips/bcm947xx/sbmips.c       1970-01-01 01:00:00.000000000 +0100 
     7368+++ linux.dev/arch/mips/bcm947xx/sbmips.c       2006-04-06 15:34:14.000000000 +0200 
    77557369@@ -0,0 +1,1038 @@ 
    77567370+/* 
     
    87928406+} 
    87938407+ 
    8794 diff -Nur linux-2.4.32/arch/mips/bcm947xx/sbpci.c linux-2.4.32-brcm/arch/mips/bcm947xx/sbpci.c 
    8795 --- linux-2.4.32/arch/mips/bcm947xx/sbpci.c     1970-01-01 01:00:00.000000000 +0100 
    8796 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/sbpci.c        2005-12-16 23:39:10.948837000 +0100 
     8408diff -Naur linux.old/arch/mips/bcm947xx/sbpci.c linux.dev/arch/mips/bcm947xx/sbpci.c 
     8409--- linux.old/arch/mips/bcm947xx/sbpci.c        1970-01-01 01:00:00.000000000 +0100 
     8410+++ linux.dev/arch/mips/bcm947xx/sbpci.c        2006-04-06 15:34:14.000000000 +0200 
    87978411@@ -0,0 +1,588 @@ 
    87988412+/* 
     
    93848998+} 
    93858999+ 
    9386 diff -Nur linux-2.4.32/arch/mips/bcm947xx/setup.c linux-2.4.32-brcm/arch/mips/bcm947xx/setup.c 
    9387 --- linux-2.4.32/arch/mips/bcm947xx/setup.c     1970-01-01 01:00:00.000000000 +0100 
    9388 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/setup.c        2005-12-20 00:29:40.187416500 +0100 
     9000diff -Naur linux.old/arch/mips/bcm947xx/setup.c linux.dev/arch/mips/bcm947xx/setup.c 
     9001--- linux.old/arch/mips/bcm947xx/setup.c        1970-01-01 01:00:00.000000000 +0100 
     9002+++ linux.dev/arch/mips/bcm947xx/setup.c        2006-04-06 15:34:14.000000000 +0200 
    93899003@@ -0,0 +1,234 @@ 
    93909004+/* 
     
    96229236+ 
    96239237+EXPORT_SYMBOL(bcm947xx_sbh); 
    9624 diff -Nur linux-2.4.32/arch/mips/bcm947xx/sflash.c linux-2.4.32-brcm/arch/mips/bcm947xx/sflash.c 
    9625 --- linux-2.4.32/arch/mips/bcm947xx/sflash.c    1970-01-01 01:00:00.000000000 +0100 
    9626 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/sflash.c       2005-12-16 23:39:10.948837000 +0100 
     9238diff -Naur linux.old/arch/mips/bcm947xx/sflash.c linux.dev/arch/mips/bcm947xx/sflash.c 
     9239--- linux.old/arch/mips/bcm947xx/sflash.c       1970-01-01 01:00:00.000000000 +0100 
     9240+++ linux.dev/arch/mips/bcm947xx/sflash.c       2006-04-06 15:34:14.000000000 +0200 
    96279241@@ -0,0 +1,418 @@ 
    96289242+/* 
     
    100449658+} 
    100459659+ 
    10046 diff -Nur linux-2.4.32/arch/mips/bcm947xx/time.c linux-2.4.32-brcm/arch/mips/bcm947xx/time.c 
    10047 --- linux-2.4.32/arch/mips/bcm947xx/time.c      1970-01-01 01:00:00.000000000 +0100 
    10048 +++ linux-2.4.32-brcm/arch/mips/bcm947xx/time.c 2005-12-16 23:39:10.948837000 +0100 
     9660diff -Naur linux.old/arch/mips/bcm947xx/time.c linux.dev/arch/mips/bcm947xx/time.c 
     9661--- linux.old/arch/mips/bcm947xx/time.c 1970-01-01 01:00:00.000000000 +0100 
     9662+++ linux.dev/arch/mips/bcm947xx/time.c 2006-04-06 15:34:14.000000000 +0200 
    100499663@@ -0,0 +1,118 @@ 
    100509664+/* 
     
    101669780+       setup_irq(7, &bcm947xx_timer_irqaction); 
    101679781+} 
    10168 diff -Nur linux-2.4.32/arch/mips/config-shared.in linux-2.4.32-brcm/arch/mips/config-shared.in 
    10169 --- linux-2.4.32/arch/mips/config-shared.in     2005-01-19 15:09:27.000000000 +0100 
    10170 +++ linux-2.4.32-brcm/arch/mips/config-shared.in        2005-12-16 23:39:11.080845250 +0100 
    10171 @@ -205,6 +205,14 @@ 
     9782diff -Naur linux.old/arch/mips/config-shared.in linux.dev/arch/mips/config-shared.in 
     9783--- linux.old/arch/mips/config-shared.in        2006-04-06 15:38:09.000000000 +0200 
     9784+++ linux.dev/arch/mips/config-shared.in        2006-04-06 15:34:14.000000000 +0200 
     9785@@ -208,6 +208,14 @@ 
    101729786    fi 
    101739787    define_bool CONFIG_MIPS_RTC y 
     
    101849798 bool 'Support for TANBAC TB0226 (Mbase)' CONFIG_TANBAC_TB0226 
    101859799 bool 'Support for TANBAC TB0229 (VR4131DIMM)' CONFIG_TANBAC_TB0229 
    10186 @@ -226,6 +234,11 @@ 
     9800@@ -229,6 +237,11 @@ 
    101879801 define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM n 
    101889802  
     
    101969810 # 
    101979811 if [ "$CONFIG_ACER_PICA_61" = "y" ]; then 
    10198 @@ -533,6 +546,13 @@ 
     9812@@ -554,6 +567,13 @@ 
    101999813    define_bool CONFIG_SWAP_IO_SPACE_L y 
    102009814    define_bool CONFIG_BOOT_ELF32 y 
     
    102109824    define_bool CONFIG_ARC32 y 
    102119825    define_bool CONFIG_ARC_MEMORY y 
    10212 @@ -1011,7 +1031,11 @@ 
     9826@@ -1042,7 +1062,11 @@ 
    102139827  
    102149828 bool 'Are you using a crosscompiler' CONFIG_CROSSCOMPILE 
     
    102239837 if [ "$CONFIG_KGDB" = "y" ]; then 
    102249838    define_bool CONFIG_DEBUG_INFO y 
    10225 diff -Nur linux-2.4.32/arch/mips/kernel/cpu-probe.c linux-2.4.32-brcm/arch/mips/kernel/cpu-probe.c 
    10226 --- linux-2.4.32/arch/mips/kernel/cpu-probe.c   2005-01-19 15:09:29.000000000 +0100 
    10227 +++ linux-2.4.32-brcm/arch/mips/kernel/cpu-probe.c      2005-12-16 23:39:11.084845500 +0100 
    10228 @@ -174,7 +174,7 @@ 
     9839diff -Naur linux.old/arch/mips/kernel/cpu-probe.c linux.dev/arch/mips/kernel/cpu-probe.c 
     9840--- linux.old/arch/mips/kernel/cpu-probe.c      2006-04-06 15:38:09.000000000 +0200 
     9841+++ linux.dev/arch/mips/kernel/cpu-probe.c      2006-04-06 15:34:14.000000000 +0200 
     9842@@ -162,7 +162,7 @@ 
    102299843  
    102309844 static inline void cpu_probe_legacy(struct cpuinfo_mips *c) 
     
    102359849                c->cputype = CPU_R2000; 
    102369850                c->isa_level = MIPS_CPU_ISA_I; 
    10237 @@ -184,7 +184,7 @@ 
     9851@@ -172,7 +172,7 @@ 
    102389852                c->tlbsize = 64; 
    102399853                break; 
     
    102449858                                c->cputype = CPU_R3081E; 
    102459859                        else 
    10246 @@ -199,12 +199,12 @@ 
     9860@@ -187,12 +187,12 @@ 
    102479861                break; 
    102489862        case PRID_IMP_R4000: 
     
    102599873                        else 
    102609874                                c->cputype = CPU_R4000SC; 
    10261 @@ -450,7 +450,7 @@ 
     9875@@ -438,7 +438,7 @@ 
    102629876 static inline void cpu_probe_mips(struct cpuinfo_mips *c) 
    102639877 { 
     
    102689882                c->cputype = CPU_4KC; 
    102699883                c->isa_level = MIPS_CPU_ISA_M32; 
    10270 @@ -491,10 +491,10 @@ 
     9884@@ -479,10 +479,10 @@ 
    102719885 { 
    102729886        decode_config1(c); 
     
    102819895                        c->cputype = CPU_AU1000; 
    102829896                        break; 
    10283 @@ -522,10 +522,34 @@ 
     9897@@ -510,10 +510,34 @@ 
    102849898        } 
    102859899 } 
     
    103179931                c->cputype = CPU_SB1; 
    103189932                c->isa_level = MIPS_CPU_ISA_M64; 
    10319 @@ -547,7 +571,7 @@ 
     9933@@ -535,7 +559,7 @@ 
    103209934 static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c) 
    103219935 { 
     
    103269940                c->cputype = CPU_SR71000; 
    103279941                c->isa_level = MIPS_CPU_ISA_M64; 
    10328 @@ -572,7 +596,7 @@ 
     9942@@ -560,7 +584,7 @@ 
    103299943        c->cputype      = CPU_UNKNOWN; 
    103309944  
     
    103359949        case PRID_COMP_LEGACY: 
    103369950                cpu_probe_legacy(c); 
    10337 @@ -583,6 +607,9 @@ 
     9951@@ -571,6 +595,9 @@ 
    103389952        case PRID_COMP_ALCHEMY: 
    103399953                cpu_probe_alchemy(c); 
     
    103459959                cpu_probe_sibyte(c); 
    103469960                break; 
    10347 diff -Nur linux-2.4.32/arch/mips/kernel/head.S linux-2.4.32-brcm/arch/mips/kernel/head.S 
    10348 --- linux-2.4.32/arch/mips/kernel/head.S        2005-01-19 15:09:29.000000000 +0100 
    10349 +++ linux-2.4.32-brcm/arch/mips/kernel/head.S   2005-12-16 23:39:11.084845500 +0100 
     9961diff -Naur linux.old/arch/mips/kernel/head.S linux.dev/arch/mips/kernel/head.S 
     9962--- linux.old/arch/mips/kernel/head.S   2006-04-06 15:38:09.000000000 +0200 
     9963+++ linux.dev/arch/mips/kernel/head.S   2006-04-06 15:34:14.000000000 +0200 
    103509964@@ -28,12 +28,20 @@ 
    103519965 #include <asm/mipsregs.h> 
     
    103709984                /* The following two symbols are used for kernel profiling. */ 
    103719985                EXPORT(stext) 
    10372 diff -Nur linux-2.4.32/arch/mips/kernel/proc.c linux-2.4.32-brcm/arch/mips/kernel/proc.c 
    10373 --- linux-2.4.32/arch/mips/kernel/proc.c        2005-01-19 15:09:29.000000000 +0100 
    10374 +++ linux-2.4.32-brcm/arch/mips/kernel/proc.c   2005-12-16 23:39:11.084845500 +0100 
     9986diff -Naur linux.old/arch/mips/kernel/proc.c linux.dev/arch/mips/kernel/proc.c 
     9987--- linux.old/arch/mips/kernel/proc.c   2006-04-06 15:38:09.000000000 +0200 
     9988+++ linux.dev/arch/mips/kernel/proc.c   2006-04-06 15:34:14.000000000 +0200 
    103759989@@ -78,9 +78,10 @@ 
    103769990        [CPU_AU1550]    "Au1550", 
     
    103859999 { 
    1038610000        unsigned int version = current_cpu_data.processor_id; 
    10387 diff -Nur linux-2.4.32/arch/mips/kernel/setup.c linux-2.4.32-brcm/arch/mips/kernel/setup.c 
    10388 --- linux-2.4.32/arch/mips/kernel/setup.c       2005-01-19 15:09:29.000000000 +0100 
    10389 +++ linux-2.4.32-brcm/arch/mips/kernel/setup.c  2005-12-16 23:39:11.140849000 +0100 
    10390 @@ -495,6 +495,7 @@ 
     10001diff -Naur linux.old/arch/mips/kernel/setup.c linux.dev/arch/mips/kernel/setup.c 
     10002--- linux.old/arch/mips/kernel/setup.c  2006-04-06 15:38:09.000000000 +0200 
     10003+++ linux.dev/arch/mips/kernel/setup.c  2006-04-06 15:34:14.000000000 +0200 
     10004@@ -493,6 +493,7 @@ 
    1039110005        void swarm_setup(void); 
    1039210006        void hp_setup(void); 
     
    1039610010  
    1039710011        frame_info_init(); 
    10398 @@ -693,6 +694,11 @@ 
     10012@@ -691,6 +692,11 @@ 
    1039910013                 pmc_yosemite_setup(); 
    1040010014                 break; 
     
    1040810022                panic("Unsupported architecture"); 
    1040910023        } 
    10410 diff -Nur linux-2.4.32/arch/mips/kernel/traps.c linux-2.4.32-brcm/arch/mips/kernel/traps.c 
    10411 --- linux-2.4.32/arch/mips/kernel/traps.c       2005-01-19 15:09:29.000000000 +0100 
    10412 +++ linux-2.4.32-brcm/arch/mips/kernel/traps.c  2005-12-16 23:39:11.140849000 +0100 
    10413 @@ -913,6 +913,7 @@ 
     10024diff -Naur linux.old/arch/mips/kernel/traps.c linux.dev/arch/mips/kernel/traps.c 
     10025--- linux.old/arch/mips/kernel/traps.c  2006-04-06 15:38:09.000000000 +0200 
     10026+++ linux.dev/arch/mips/kernel/traps.c  2006-04-06 15:34:14.000000000 +0200 
     10027@@ -920,6 +920,7 @@ 
    1041410028 void __init trap_init(void) 
    1041510029 { 
     
    1041910033        extern char except_vec_ejtag_debug; 
    1042010034        extern char except_vec4; 
    10421 @@ -922,6 +923,7 @@ 
     10035@@ -927,6 +928,7 @@ 
    1042210036  
    1042310037        /* Copy the generic exception handler code to it's final destination. */ 
     
    1042710041        /* 
    1042810042         * Setup default vectors 
    10429 @@ -980,6 +982,12 @@ 
     10043@@ -985,6 +987,12 @@ 
    1043010044        set_except_vector(13, handle_tr); 
    1043110045        set_except_vector(22, handle_mdmx); 
     
    1044010054                set_except_vector(15, handle_fpe); 
    1044110055  
    10442 diff -Nur linux-2.4.32/arch/mips/Makefile linux-2.4.32-brcm/arch/mips/Makefile 
    10443 --- linux-2.4.32/arch/mips/Makefile     2005-01-19 15:09:26.000000000 +0100 
    10444 +++ linux-2.4.32-brcm/arch/mips/Makefile        2005-12-16 23:39:10.668819500 +0100 
    10445 @@ -715,6 +715,19 @@ 
    10446  endif 
    10447   
    10448  # 
    10449 +# Broadcom BCM947XX variants 
    10450 +# 
    10451 +ifdef CONFIG_BCM947XX 
    10452 +LIBS           += arch/mips/bcm947xx/generic/brcm.o arch/mips/bcm947xx/bcm947xx.o  
    10453 +SUBDIRS                += arch/mips/bcm947xx/generic arch/mips/bcm947xx  
    10454 +LOADADDR       := 0x80001000 
    10455 + 
    10456 +zImage: vmlinux 
    10457 +       $(MAKE) -C arch/$(ARCH)/bcm947xx/compressed 
    10458 +export LOADADDR 
    10459 +endif 
    10460 + 
    10461 +# 
    10462  # Choosing incompatible machines durings configuration will result in 
    10463  # error messages during linking.  Select a default linkscript if 
    10464  # none has been choosen above. 
    10465 @@ -767,6 +780,7 @@ 
    10466         $(MAKE) -C arch/$(ARCH)/tools clean 
    10467         $(MAKE) -C arch/mips/baget clean 
    10468         $(MAKE) -C arch/mips/lasat clean 
    10469 +       $(MAKE) -C arch/mips/bcm947xx/compressed clean 
    10470   
    10471  archmrproper: 
    10472         @$(MAKEBOOT) mrproper 
    10473 diff -Nur linux-2.4.32/arch/mips/mm/c-r4k.c linux-2.4.32-brcm/arch/mips/mm/c-r4k.c 
    10474 --- linux-2.4.32/arch/mips/mm/c-r4k.c   2005-01-19 15:09:29.000000000 +0100 
    10475 +++ linux-2.4.32-brcm/arch/mips/mm/c-r4k.c      2005-12-16 23:39:11.144849250 +0100 
    10476 @@ -1114,3 +1114,47 @@ 
     10056diff -Naur linux.old/arch/mips/mm/c-r4k.c linux.dev/arch/mips/mm/c-r4k.c 
     10057--- linux.old/arch/mips/mm/c-r4k.c      2006-04-06 15:38:09.000000000 +0200 
     10058+++ linux.dev/arch/mips/mm/c-r4k.c      2006-04-06 15:34:15.000000000 +0200 
     10059@@ -1166,3 +1166,47 @@ 
    1047710060        build_clear_page(); 
    1047810061        build_copy_page(); 
     
    1052210105+ 
    1052310106+ 
    10524 diff -Nur linux-2.4.32/arch/mips/pci/Makefile linux-2.4.32-brcm/arch/mips/pci/Makefile 
    10525 --- linux-2.4.32/arch/mips/pci/Makefile 2005-01-19 15:09:29.000000000 +0100 
    10526 +++ linux-2.4.32-brcm/arch/mips/pci/Makefile    2005-12-16 23:39:11.144849250 +0100 
     10107diff -Naur linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile 
     10108--- linux.old/arch/mips/pci/Makefile    2006-04-06 15:38:09.000000000 +0200 
     10109+++ linux.dev/arch/mips/pci/Makefile    2006-04-06 15:34:14.000000000 +0200 
    1052710110@@ -13,7 +13,9 @@ 
    1052810111 obj-$(CONFIG_MIPS_MSC)         += ops-msc.o 
     
    1053510118  
    1053610119 include $(TOPDIR)/Rules.make 
    10537 diff -Nur linux-2.4.32/drivers/char/serial.c linux-2.4.32-brcm/drivers/char/serial.c 
    10538 --- linux-2.4.32/drivers/char/serial.c  2005-11-16 20:12:54.000000000 +0100 
    10539 +++ linux-2.4.32-brcm/drivers/char/serial.c     2005-12-16 23:39:11.200852750 +0100 
    10540 @@ -422,6 +422,10 @@ 
     10120diff -Naur linux.old/drivers/char/serial.c linux.dev/drivers/char/serial.c 
     10121--- linux.old/drivers/char/serial.c     2006-04-06 15:38:09.000000000 +0200 
     10122+++ linux.dev/drivers/char/serial.c     2006-04-06 15:34:14.000000000 +0200 
     10123@@ -444,6 +444,10 @@ 
    1054110124                return inb(info->port+1); 
    1054210125 #endif 
     
    1054910132                             (offset<<info->iomem_reg_shift)); 
    1055010133        default: 
    10551 @@ -442,6 +446,9 @@ 
     10134@@ -464,6 +468,9 @@ 
    1055210135        case SERIAL_IO_MEM: 
    1055310136                writeb(value, (unsigned long) info->iomem_base + 
     
    1055910142        default: 
    1056010143                outb(value, info->port+offset); 
    10561 @@ -1704,7 +1711,7 @@ 
     10144@@ -1728,7 +1735,7 @@ 
    1056210145                        /* Special case since 134 is really 134.5 */ 
    1056310146                        quot = (2*baud_base / 269); 
     
    1056810151        /* If the quotient is zero refuse the change */ 
    1056910152        if (!quot && old_termios) { 
    10570 @@ -1721,12 +1728,12 @@ 
     10153@@ -1745,12 +1752,12 @@ 
    1057110154                                /* Special case since 134 is really 134.5 */ 
    1057210155                                quot = (2*baud_base / 269); 
     
    1058310166         * Work around a bug in the Oxford Semiconductor 952 rev B 
    1058410167         * chip which causes it to seriously miscalculate baud rates 
    10585 @@ -5982,6 +5989,13 @@ 
     10168@@ -5994,6 +6001,13 @@ 
    1058610169         *      Divisor, bytesize and parity 
    1058710170         */ 
     
    1059710180                state->flags |= ASYNC_CONS_FLOW; 
    1059810181        info = &async_sercons; 
    10599 @@ -5995,7 +6009,7 @@ 
     10182@@ -6007,7 +6021,7 @@ 
    1060010183        info->io_type = state->io_type; 
    1060110184        info->iomem_base = state->iomem_base; 
     
    1060610189 #if defined(__powerpc__) || defined(__alpha__) 
    1060710190        cval >>= 8; 
    10608 diff -Nur linux-2.4.32/drivers/net/Config.in linux-2.4.32-brcm/drivers/net/Config.in 
    10609 --- linux-2.4.32/drivers/net/Config.in  2005-01-19 15:09:56.000000000 +0100 
    10610 +++ linux-2.4.32-brcm/drivers/net/Config.in     2005-12-16 23:39:11.232854750 +0100 
     10191diff -Naur linux.old/drivers/net/Config.in linux.dev/drivers/net/Config.in 
     10192--- linux.old/drivers/net/Config.in     2006-04-06 15:38:09.000000000 +0200 
     10193+++ linux.dev/drivers/net/Config.in     2006-04-06 15:34:14.000000000 +0200 
    1061110194@@ -2,6 +2,8 @@ 
    1061210195 # Network device configuration 
     
    1061810201  
    1061910202 tristate 'Dummy net driver support' CONFIG_DUMMY 
    10620 diff -Nur linux-2.4.32/drivers/net/hnd/bcmsrom.c linux-2.4.32-brcm/drivers/net/hnd/bcmsrom.c 
    10621 --- linux-2.4.32/drivers/net/hnd/bcmsrom.c      1970-01-01 01:00:00.000000000 +0100 
    10622 +++ linux-2.4.32-brcm/drivers/net/hnd/bcmsrom.c 2005-12-16 23:39:11.284858000 +0100 
     10203diff -Naur linux.old/drivers/net/Makefile linux.dev/drivers/net/Makefile 
     10204--- linux.old/drivers/net/Makefile      2006-04-06 15:38:09.000000000 +0200 
     10205+++ linux.dev/drivers/net/Makefile      2006-04-06 16:45:29.000000000 +0200 
     10206@@ -3,6 +3,8 @@ 
     10207 # Makefile for the Linux network (ethercard) device drivers. 
     10208 # 
     10209  
     10210+EXTRA_CFLAGS := -I$(TOPDIR)/arch/mips/bcm947xx/include 
     10211+ 
     10212 obj-y           := 
     10213 obj-m           := 
     10214 obj-n           := 
     10215@@ -39,6 +41,9 @@ 
     10216   obj-$(CONFIG_ISDN) += slhc.o 
     10217 endif 
     10218  
     10219+subdir-$(CONFIG_HND) += hnd 
     10220+subdir-$(CONFIG_WL) += wl 
     10221+subdir-$(CONFIG_WL2) += wl2 
     10222 subdir-$(CONFIG_NET_PCMCIA) += pcmcia 
     10223 subdir-$(CONFIG_NET_WIRELESS) += wireless 
     10224 subdir-$(CONFIG_TULIP) += tulip 
     10225@@ -69,6 +74,10 @@ 
     10226 obj-$(CONFIG_MYRI_SBUS) += myri_sbus.o 
     10227 obj-$(CONFIG_SUNGEM) += sungem.o 
     10228  
     10229+ifeq ($(CONFIG_HND),y) 
     10230+  obj-y += hnd/hnd.o 
     10231+endif 
     10232+ 
     10233 obj-$(CONFIG_MACE) += mace.o 
     10234 obj-$(CONFIG_BMAC) += bmac.o 
     10235 obj-$(CONFIG_GMAC) += gmac.o 
     10236diff -Naur linux.old/drivers/net/hnd/Makefile linux.dev/drivers/net/hnd/Makefile 
     10237--- linux.old/drivers/net/hnd/Makefile  1970-01-01 01:00:00.000000000 +0100 
     10238+++ linux.dev/drivers/net/hnd/Makefile  2006-04-06 16:20:00.000000000 +0200 
     10239@@ -0,0 +1,19 @@ 
     10240+# 
     10241+# Makefile for the BCM47xx specific kernel interface routines 
     10242+# under Linux. 
     10243+# 
     10244+ 
     10245+EXTRA_CFLAGS   += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER 
     10246+ 
     10247+O_TARGET       := hnd.o 
     10248+ 
     10249+HND_OBJS       := bcmutils.o linux_osl.o sbutils.o bcmsrom.o 
     10250+ 
     10251+export-objs    := shared_ksyms.o 
     10252+obj-y          := shared_ksyms.o $(HND_OBJS) 
     10253+obj-m           := $(O_TARGET) 
     10254+ 
     10255+include $(TOPDIR)/Rules.make 
     10256+ 
     10257+shared_ksyms.c: shared_ksyms.sh $(HND_OBJS) 
     10258+       sh -e $< $(HND_OBJS) > $@ 
     10259diff -Naur linux.old/drivers/net/hnd/bcmsrom.c linux.dev/drivers/net/hnd/bcmsrom.c 
     10260--- linux.old/drivers/net/hnd/bcmsrom.c 1970-01-01 01:00:00.000000000 +0100 
     10261+++ linux.dev/drivers/net/hnd/bcmsrom.c 2006-04-06 15:34:14.000000000 +0200 
    1062310262@@ -0,0 +1,938 @@ 
    1062410263+/* 
     
    1156011199+} 
    1156111200+ 
    11562 diff -Nur linux-2.4.32/drivers/net/hnd/bcmutils.c linux-2.4.32-brcm/drivers/net/hnd/bcmutils.c 
    11563 --- linux-2.4.32/drivers/net/hnd/bcmutils.c     1970-01-01 01:00:00.000000000 +0100 
    11564 +++ linux-2.4.32-brcm/drivers/net/hnd/bcmutils.c        2005-12-16 23:39:11.288858250 +0100 
    11565 @@ -0,0 +1,1081 @@ 
     11201diff -Naur linux.old/drivers/net/hnd/bcmutils.c linux.dev/drivers/net/hnd/bcmutils.c 
     11202--- linux.old/drivers/net/hnd/bcmutils.c        1970-01-01 01:00:00.000000000 +0100 
     11203+++ linux.dev/drivers/net/hnd/bcmutils.c        2006-04-06 16:05:56.000000000 +0200 
     11204@@ -0,0 +1,875 @@ 
    1156611205+/* 
    1156711206+ * Misc useful OS-independent routines. 
     
    1159111230+ 
    1159211231+#ifdef BCMDRIVER 
    11593 +/* copy a pkt buffer chain into a buffer */ 
    11594 +uint 
    11595 +pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf) 
    11596 +{ 
    11597 +       uint n, ret = 0; 
    11598 + 
    11599 +       if (len < 0) 
    11600 +               len = 4096;     /* "infinite" */ 
    11601 + 
    11602 +       /* skip 'offset' bytes */ 
    11603 +       for (; p && offset; p = PKTNEXT(osh, p)) { 
    11604 +               if (offset < (uint)PKTLEN(osh, p)) 
    11605 +                       break; 
    11606 +               offset -= PKTLEN(osh, p); 
    11607 +       } 
    11608 + 
    11609 +       if (!p) 
    11610 +               return 0; 
    11611 + 
    11612 +       /* copy the data */ 
    11613 +       for (; p && len; p = PKTNEXT(osh, p)) { 
    11614 +               n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len); 
    11615 +               bcopy(PKTDATA(osh, p) + offset, buf, n); 
    11616 +               buf += n; 
    11617 +               len -= n; 
    11618 +               ret += n; 
    11619 +               offset = 0; 
    11620 +       } 
    11621 + 
    11622 +       return ret; 
    11623 +} 
    11624 + 
    11625 +/* return total length of buffer chain */ 
    11626 +uint 
    11627 +pkttotlen(osl_t *osh, void *p) 
    11628 +{ 
    11629 +       uint total; 
    11630 + 
    11631 +       total = 0; 
    11632 +       for (; p; p = PKTNEXT(osh, p)) 
    11633 +               total += PKTLEN(osh, p); 
    11634 +       return (total); 
    11635 +} 
    11636 + 
    11637 +void 
    11638 +pktq_init(struct pktq *q, uint maxlen, const uint8 prio_map[]) 
    11639 +{ 
    11640 +       q->head = q->tail = NULL; 
    11641 +       q->maxlen = maxlen; 
    11642 +       q->len = 0; 
    11643 +       if (prio_map) { 
    11644 +               q->priority = TRUE; 
    11645 +               bcopy(prio_map, q->prio_map, sizeof(q->prio_map)); 
    11646 +       } 
    11647 +       else 
    11648 +               q->priority = FALSE; 
    11649 +} 
    11650 + 
    11651 +/* should always check pktq_full before calling pktenq */ 
    11652 +void 
    11653 +pktenq(struct pktq *q, void *p, bool lifo) 
    11654 +{ 
    11655 +       void *next, *prev; 
    11656 + 
    11657 +       /* allow 10 pkts slack */ 
    11658 +       ASSERT(q->len < (q->maxlen + 10)); 
    11659 + 
    11660 +       /* Queueing chains not allowed */ 
    11661 +       ASSERT(PKTLINK(p) == NULL); 
    11662 + 
    11663 +       /* Queue is empty */ 
    11664 +       if (q->tail == NULL) { 
    11665 +               ASSERT(q->head == NULL); 
    11666 +               q->head = q->tail = p; 
    11667 +       } 
    11668 + 
    11669 +       /* Insert at head or tail */ 
    11670 +       else if (q->priority == FALSE) { 
    11671 +               /* Insert at head (LIFO) */ 
    11672 +               if (lifo) { 
    11673 +                       PKTSETLINK(p, q->head); 
    11674 +                       q->head = p; 
    11675 +               } 
    11676 +               /* Insert at tail (FIFO) */ 
    11677 +               else { 
    11678 +                       ASSERT(PKTLINK(q->tail) == NULL); 
    11679 +                       PKTSETLINK(q->tail, p); 
    11680 +                       PKTSETLINK(p, NULL); 
    11681 +                       q->tail = p; 
    11682 +               } 
    11683 +       } 
    11684 + 
    11685 +       /* Insert by priority */ 
    11686 +       else { 
    11687 +               /* legal priorities 0-7 */ 
    11688 +               ASSERT(PKTPRIO(p) <= MAXPRIO); 
    11689 + 
    11690 +               ASSERT(q->head); 
    11691 +               ASSERT(q->tail); 
    11692 +               /* Shortcut to insertion at tail */ 
    11693 +               if (_pktq_pri(q, PKTPRIO(p)) < _pktq_pri(q, PKTPRIO(q->tail)) || 
    11694 +                   (!lifo && _pktq_pri(q, PKTPRIO(p)) <= _pktq_pri(q, PKTPRIO(q->tail)))) { 
    11695 +                       prev = q->tail; 
    11696 +                       next = NULL; 
    11697 +               } 
    11698 +               /* Insert at head or in the middle */ 
    11699 +               else { 
    11700 +                       prev = NULL; 
    11701 +                       next = q->head; 
    11702 +               } 
    11703 +               /* Walk the queue */ 
    11704 +               for (; next; prev = next, next = PKTLINK(next)) { 
    11705 +                       /* Priority queue invariant */ 
    11706 +                       ASSERT(!prev || _pktq_pri(q, PKTPRIO(prev)) >= _pktq_pri(q, PKTPRIO(next))); 
    11707 +                       /* Insert at head of string of packets of same priority (LIFO) */ 
    11708 +                       if (lifo) { 
    11709 +                               if (_pktq_pri(q, PKTPRIO(p)) >= _pktq_pri(q, PKTPRIO(next))) 
    11710 +                                       break; 
    11711 +                       } 
    11712 +                       /* Insert at tail of string of packets of same priority (FIFO) */ 
    11713 +                       else { 
    11714 +                               if (_pktq_pri(q, PKTPRIO(p)) > _pktq_pri(q, PKTPRIO(next))) 
    11715 +                                       break; 
    11716 +                       } 
    11717 +               } 
    11718 +               /* Insert at tail */ 
    11719 +               if (next == NULL) { 
    11720 +                       ASSERT(PKTLINK(q->tail) == NULL); 
    11721 +                       PKTSETLINK(q->tail, p); 
    11722 +                       PKTSETLINK(p, NULL); 
    11723 +                       q->tail = p; 
    11724 +               } 
    11725 +               /* Insert in the middle */ 
    11726 +               else if (prev) { 
    11727 +                       PKTSETLINK(prev, p); 
    11728 +                       PKTSETLINK(p, next); 
    11729 +               } 
    11730 +               /* Insert at head */ 
    11731 +               else { 
    11732 +                       PKTSETLINK(p, q->head); 
    11733 +                       q->head = p; 
    11734 +               } 
    11735 +       } 
    11736 + 
    11737 +       /* List invariants after insertion */ 
    11738 +       ASSERT(q->head); 
    11739 +       ASSERT(PKTLINK(q->tail) == NULL); 
    11740 + 
    11741 +       q->len++; 
    11742 +} 
    11743 + 
    11744 +/* dequeue packet at head */ 
    11745 +void* 
    11746 +pktdeq(struct pktq *q) 
    11747 +{ 
    11748 +       void *p; 
    11749 + 
    11750 +       if ((p = q->head)) { 
    11751 +               ASSERT(q->tail); 
    11752 +               q->head = PKTLINK(p); 
    11753 +               PKTSETLINK(p, NULL); 
    11754 +               q->len--; 
    11755 +               if (q->head == NULL) 
    11756 +                       q->tail = NULL; 
    11757 +       } 
    11758 +       else { 
    11759 +               ASSERT(q->tail == NULL); 
    11760 +       } 
    11761 + 
    11762 +       return (p); 
    11763 +} 
    11764 + 
    11765 +/* dequeue packet at tail */ 
    11766 +void* 
    11767 +pktdeqtail(struct pktq *q) 
    11768 +{ 
    11769 +       void *p; 
    11770 +       void *next, *prev; 
    11771 + 
    11772 +       if (q->head == q->tail) {  /* last packet on queue or queue empty */ 
    11773 +               p = q->head; 
    11774 +               q->head = q->tail = NULL; 
    11775 +               q->len = 0; 
    11776 +               return(p); 
    11777 +       } 
    11778 + 
    11779 +       /* start walk at head */ 
    11780 +       prev = NULL; 
    11781 +       next = q->head; 
    11782 + 
    11783 +       /* Walk the queue to find prev of q->tail */ 
    11784 +       for (; next; prev = next, next = PKTLINK(next)) { 
    11785 +               if (next == q->tail) 
    11786 +                       break; 
    11787 +       } 
    11788 + 
    11789 +       ASSERT(prev); 
    11790 + 
    11791 +       PKTSETLINK(prev, NULL); 
    11792 +       q->tail = prev; 
    11793 +       q->len--; 
    11794 +       p = next; 
    11795 + 
    11796 +       return (p); 
    11797 +} 
    11798 + 
    1179911232+unsigned char bcm_ctype[] = { 
    1180011233+       _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 0-7 */ 
     
    1264512078+       return(qdbm); 
    1264612079+} 
    12647 diff -Nur linux-2.4.32/drivers/net/hnd/hnddma.c linux-2.4.32-brcm/drivers/net/hnd/hnddma.c 
    12648 --- linux-2.4.32/drivers/net/hnd/hnddma.c       1970-01-01 01:00:00.000000000 +0100 
    12649 +++ linux-2.4.32-brcm/drivers/net/hnd/hnddma.c  2005-12-16 23:39:11.288858250 +0100 
    12650 @@ -0,0 +1,1527 @@ 
    12651 +/* 
    12652 + * Generic Broadcom Home Networking Division (HND) DMA module. 
    12653 + * This supports the following chips: BCM42xx, 44xx, 47xx . 
    12654 + * 
    12655 + * Copyright 2005, Broadcom Corporation 
    12656 + * All Rights Reserved. 
    12657 + *  
    12658 + * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY 
    12659 + * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM 
    12660 + * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
    12661 + * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. 
    12662 + * 
    12663 + * $Id$ 
    12664 + */ 
    12665 + 
    12666 +#include <typedefs.h> 
    12667 +#include <osl.h> 
    12668 +#include <bcmendian.h> 
    12669 +#include <sbconfig.h> 
    12670 +#include <bcmutils.h> 
    12671 +#include <bcmdevs.h> 
    12672 +#include <sbutils.h> 
    12673 + 
    12674 +struct dma_info;       /* forward declaration */ 
    12675 +#define di_t struct dma_info 
    12676 + 
    12677 +#include <sbhnddma.h> 
    12678 +#include <hnddma.h> 
    12679 + 
    12680 +/* debug/trace */ 
    12681 +#define        DMA_ERROR(args) 
    12682 +#define        DMA_TRACE(args) 
    12683 + 
    12684 +/* default dma message level (if input msg_level pointer is null in dma_attach()) */ 
    12685 +static uint dma_msg_level = 
    12686 +       0; 
    12687 + 
    12688 +#define        MAXNAMEL        8 
    12689 + 
    12690 +/* dma engine software state */ 
    12691 +typedef struct dma_info { 
    12692 +       hnddma_t        hnddma;         /* exported structure */ 
    12693 +       uint            *msg_level;     /* message level pointer */ 
    12694 +       char            name[MAXNAMEL]; /* callers name for diag msgs */ 
    12695 +        
    12696 +       void            *osh;           /* os handle */ 
    12697 +       sb_t            *sbh;           /* sb handle */ 
    12698 +        
    12699 +       bool            dma64;          /* dma64 enabled */ 
    12700 +       bool            addrext;        /* this dma engine supports DmaExtendedAddrChanges */ 
    12701 +        
    12702 +       dma32regs_t     *d32txregs;     /* 32 bits dma tx engine registers */ 
    12703 +       dma32regs_t     *d32rxregs;     /* 32 bits dma rx engine registers */ 
    12704 +       dma64regs_t     *d64txregs;     /* 64 bits dma tx engine registers */ 
    12705 +       dma64regs_t     *d64rxregs;     /* 64 bits dma rx engine registers */ 
    12706 + 
    12707 +       uint32          dma64align;     /* either 8k or 4k depends on number of dd */ 
    12708 +       dma32dd_t       *txd32;         /* pointer to dma32 tx descriptor ring */ 
    12709 +       dma64dd_t       *txd64;         /* pointer to dma64 tx descriptor ring */ 
    12710 +       uint            ntxd;           /* # tx descriptors tunable */   
    12711 +       uint            txin;           /* index of next descriptor to reclaim */ 
    12712 +       uint            txout;          /* index of next descriptor to post */ 
    12713 +       uint            txavail;        /* # free tx descriptors */ 
    12714 +       void            **txp;          /* pointer to parallel array of pointers to packets */ 
    12715 +       ulong           txdpa;          /* physical address of descriptor ring */ 
    12716 +       uint            txdalign;       /* #bytes added to alloc'd mem to align txd */ 
    12717 +       uint            txdalloc;       /* #bytes allocated for the ring */ 
    12718 + 
    12719 +       dma32dd_t       *rxd32;         /* pointer to dma32 rx descriptor ring */ 
    12720 +       dma64dd_t       *rxd64;         /* pointer to dma64 rx descriptor ring */ 
    12721 +       uint            nrxd;           /* # rx descriptors tunable */   
    12722 +       uint            rxin;           /* index of next descriptor to reclaim */ 
    12723 +       uint            rxout;          /* index of next descriptor to post */ 
    12724 +       void            **rxp;          /* pointer to parallel array of pointers to packets */ 
    12725 +       ulong           rxdpa;          /* physical address of descriptor ring */ 
    12726 +       uint            rxdalign;       /* #bytes added to alloc'd mem to align rxd */ 
    12727 +       uint            rxdalloc;       /* #bytes allocated for the ring */ 
    12728 + 
    12729 +       /* tunables */ 
    12730 +       uint            rxbufsize;      /* rx buffer size in bytes */ 
    12731 +       uint            nrxpost;        /* # rx buffers to keep posted */ 
    12732 +       uint            rxoffset;       /* rxcontrol offset */ 
    12733 +       uint            ddoffsetlow;    /* add to get dma address of descriptor ring, low 32 bits */ 
    12734 +       uint            ddoffsethigh;   /* add to get dma address of descriptor ring, high 32 bits */ 
    12735 +       uint            dataoffsetlow;  /* add to get dma address of data buffer, low 32 bits */ 
    12736 +       uint            dataoffsethigh; /* add to get dma address of data buffer, high 32 bits */ 
    12737 +} dma_info_t; 
    12738 + 
    12739 +#ifdef BCMDMA64 
    12740 +#define        DMA64_ENAB(di)  ((di)->dma64) 
    12741 +#else 
    12742 +#define        DMA64_ENAB(di)  (0) 
    12743 +#endif 
    12744 + 
    12745 +/* descriptor bumping macros */ 
    12746 +#define        XXD(x, n)       ((x) & ((n) - 1)) 
    12747 +#define        TXD(x)          XXD((x), di->ntxd) 
    12748 +#define        RXD(x)          XXD((x), di->nrxd) 
    12749 +#define        NEXTTXD(i)      TXD(i + 1) 
    12750 +#define        PREVTXD(i)      TXD(i - 1) 
    12751 +#define        NEXTRXD(i)      RXD(i + 1) 
    12752 +#define        NTXDACTIVE(h, t)        TXD(t - h) 
    12753 +#define        NRXDACTIVE(h, t)        RXD(t - h) 
    12754 + 
    12755 +/* macros to convert between byte offsets and indexes */ 
    12756 +#define        B2I(bytes, type)        ((bytes) / sizeof(type)) 
    12757 +#define        I2B(index, type)        ((index) * sizeof(type)) 
    12758 + 
    12759 +#define        PCI32ADDR_HIGH          0xc0000000      /* address[31:30] */ 
    12760 +#define        PCI32ADDR_HIGH_SHIFT    30 
    12761 + 
    12762 + 
    12763 +/* prototypes */ 
    12764 +static bool dma_isaddrext(dma_info_t *di); 
    12765 +static bool dma_alloc(dma_info_t *di, uint direction); 
    12766 + 
    12767 +static bool dma32_alloc(dma_info_t *di, uint direction); 
    12768 +static void dma32_txreset(dma_info_t *di); 
    12769 +static void dma32_rxreset(dma_info_t *di); 
    12770 +static bool dma32_txsuspendedidle(dma_info_t *di); 
    12771 +static int  dma32_txfast(dma_info_t *di, void *p0, uint32 coreflags); 
    12772 +static void* dma32_getnexttxp(dma_info_t *di, bool forceall); 
    12773 +static void* dma32_getnextrxp(dma_info_t *di, bool forceall); 
    12774 +static void dma32_txrotate(di_t *di); 
    12775 + 
    12776 +/* prototype or stubs */ 
    12777 +#ifdef BCMDMA64 
    12778 +static bool dma64_alloc(dma_info_t *di, uint direction); 
    12779 +static void dma64_txreset(dma_info_t *di); 
    12780 +static void dma64_rxreset(dma_info_t *di); 
    12781 +static bool dma64_txsuspendedidle(dma_info_t *di); 
    12782 +static int  dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags); 
    12783 +static void* dma64_getnexttxp(dma_info_t *di, bool forceall); 
    12784 +static void* dma64_getnextrxp(dma_info_t *di, bool forceall); 
    12785 +static void dma64_txrotate(di_t *di); 
    12786 +#else 
    12787 +static bool dma64_alloc(dma_info_t *di, uint direction) { return TRUE; } 
    12788 +static void dma64_txreset(dma_info_t *di) {} 
    12789 +static void dma64_rxreset(dma_info_t *di) {} 
    12790 +static bool dma64_txsuspendedidle(dma_info_t *di) { return TRUE;} 
    12791 +static int  dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags) { return 0; } 
    12792 +static void* dma64_getnexttxp(dma_info_t *di, bool forceall) { return NULL; } 
    12793 +static void* dma64_getnextrxp(dma_info_t *di, bool forceall) { return NULL; } 
    12794 +static void dma64_txrotate(di_t *di) { return; } 
    12795 +#endif 
    12796 + 
    12797 +/* old dmaregs struct for compatibility */ 
    12798 +typedef volatile struct { 
    12799 +       /* transmit channel */ 
    12800 +       uint32  xmtcontrol;         /* enable, et al */ 
    12801 +       uint32  xmtaddr;            /* descriptor ring base address (4K aligned) */ 
    12802 +       uint32  xmtptr;             /* last descriptor posted to chip */ 
    12803 +       uint32  xmtstatus;          /* current active descriptor, et al */ 
    12804 +        
    12805 +       /* receive channel */ 
    12806 +       uint32  rcvcontrol;         /* enable, et al */ 
    12807 +       uint32  rcvaddr;            /* descriptor ring base address (4K aligned) */ 
    12808 +       uint32  rcvptr;             /* last descriptor posted to chip */ 
    12809 +       uint32  rcvstatus;          /* current active descriptor, et al */ 
    12810 +} dmaregs_t; 
    12811 + 
    12812 +typedef struct { 
    12813 +       uint ddoffset; 
    12814 +       uint dataoffset; 
    12815 +} compat_data; 
    12816 + 
    12817 +static compat_data *ugly_hack = NULL; 
    12818 + 
    12819 +void*  
    12820 +dma_attold(void *drv, void *osh, char *name, dmaregs_t *regs, uint ntxd, uint nrxd, 
    12821 +               uint rxbufsize, uint nrxpost, uint rxoffset, uint ddoffset, uint dataoffset, uint *msg_level) 
    12822 +{ 
    12823 +       dma32regs_t *dtx = regs; 
    12824 +       dma32regs_t *drx = dtx + 1; 
    12825 +        
    12826 +       ugly_hack = kmalloc(sizeof(ugly_hack), GFP_KERNEL); 
    12827 +       ugly_hack->ddoffset = ddoffset; 
    12828 +       ugly_hack->dataoffset = dataoffset; 
    12829 +       dma_attach((osl_t *) osh, name, NULL, dtx, drx, ntxd, nrxd, rxbufsize, nrxpost, rxoffset, msg_level); 
    12830 +       ugly_hack = NULL; 
    12831 +} 
    12832 + 
    12833 + 
    12834 +void*  
    12835 +dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx, 
    12836 +          uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset, uint *msg_level) 
    12837 +{ 
    12838 +       dma_info_t *di; 
    12839 +       uint size; 
    12840 + 
    12841 +       /* allocate private info structure */ 
    12842 +       if ((di = MALLOC(osh, sizeof (dma_info_t))) == NULL) { 
    12843 +               return (NULL); 
    12844 +       } 
    12845 +       bzero((char*)di, sizeof (dma_info_t)); 
    12846 + 
    12847 +       di->msg_level = msg_level ? msg_level : &dma_msg_level; 
    12848 + 
    12849 +       if (sbh != NULL) 
    12850 +               di->dma64 = ((sb_coreflagshi(sbh, 0, 0) & SBTMH_DMA64) == SBTMH_DMA64); 
    12851 + 
    12852 +#ifndef BCMDMA64 
    12853 +       if (di->dma64) { 
    12854 +               DMA_ERROR(("dma_attach: driver doesn't have the capability to support 64 bits DMA\n")); 
    12855 +               goto fail; 
    12856 +       } 
    12857 +#endif 
    12858 +        
    12859 +       /* check arguments */ 
    12860 +       ASSERT(ISPOWEROF2(ntxd)); 
    12861 +       ASSERT(ISPOWEROF2(nrxd)); 
    12862 +       if (nrxd == 0) 
    12863 +               ASSERT(dmaregsrx == NULL); 
    12864 +       if (ntxd == 0) 
    12865 +               ASSERT(dmaregstx == NULL); 
    12866 + 
    12867 + 
    12868 +       /* init dma reg pointer */ 
    12869 +       if (di->dma64) { 
    12870 +               ASSERT(ntxd <= D64MAXDD); 
    12871 +               ASSERT(nrxd <= D64MAXDD); 
    12872 +               di->d64txregs = (dma64regs_t *)dmaregstx; 
    12873 +               di->d64rxregs = (dma64regs_t *)dmaregsrx; 
    12874 + 
    12875 +               di->dma64align = D64RINGALIGN; 
    12876 +               if ((ntxd < D64MAXDD / 2) && (nrxd < D64MAXDD / 2)) { 
    12877 +                       /* for smaller dd table, HW relax the alignment requirement */ 
    12878 +                       di->dma64align = D64RINGALIGN / 2; 
    12879 +               } 
    12880 +       } else { 
    12881 +               ASSERT(ntxd <= D32MAXDD); 
    12882 +               ASSERT(nrxd <= D32MAXDD); 
    12883 +               di->d32txregs = (dma32regs_t *)dmaregstx; 
    12884 +               di->d32rxregs = (dma32regs_t *)dmaregsrx; 
    12885 +       } 
    12886 + 
    12887 + 
    12888 +       /* make a private copy of our callers name */ 
    12889 +       strncpy(di->name, name, MAXNAMEL); 
    12890 +       di->name[MAXNAMEL-1] = '\0'; 
    12891 + 
    12892 +       di->osh = osh; 
    12893 +       di->sbh = sbh; 
    12894 + 
    12895 +       /* save tunables */ 
    12896 +       di->ntxd = ntxd; 
    12897 +       di->nrxd = nrxd; 
    12898 +       di->rxbufsize = rxbufsize; 
    12899 +       di->nrxpost = nrxpost; 
    12900 +       di->rxoffset = rxoffset; 
    12901 + 
    12902 +       /*  
    12903 +        * figure out the DMA physical address offset for dd and data  
    12904 +        *   for old chips w/o sb, use zero 
    12905 +        *   for new chips w sb,  
    12906 +        *     PCI/PCIE: they map silicon backplace address to zero based memory, need offset 
    12907 +        *     Other bus: use zero 
    12908 +        *     SB_BUS BIGENDIAN kludge: use sdram swapped region for data buffer, not descriptor 
    12909 +        */ 
    12910 +       di->ddoffsetlow = 0; 
    12911 +       di->dataoffsetlow = 0; 
    12912 +       if (ugly_hack != NULL) { 
    12913 +               di->ddoffsetlow = ugly_hack->ddoffset; 
    12914 +               di->dataoffsetlow = ugly_hack->dataoffset; 
    12915 +               di->ddoffsethigh = 0; 
    12916 +               di->dataoffsethigh = 0; 
    12917 +       } else if (sbh != NULL) {        
    12918 +               if (sbh->bustype == PCI_BUS) {  /* for pci bus, add offset */ 
    12919 +                       if ((sbh->buscoretype == SB_PCIE) && di->dma64){ 
    12920 +                               di->ddoffsetlow = 0; 
    12921 +                               di->ddoffsethigh = SB_PCIE_DMA_H32; 
    12922 +                       } else { 
    12923 +                               di->ddoffsetlow = SB_PCI_DMA; 
    12924 +                               di->ddoffsethigh = 0; 
    12925 +                       } 
    12926 +                       di->dataoffsetlow =  di->ddoffsetlow; 
    12927 +                       di->dataoffsethigh =  di->ddoffsethigh; 
    12928 +               }  
    12929 +#if defined(__mips__) && defined(IL_BIGENDIAN) 
    12930 +               /* use sdram swapped region for data buffers but not dma descriptors */ 
    12931 +               di->dataoffsetlow = di->dataoffsetlow + SB_SDRAM_SWAPPED; 
    12932 +#endif 
    12933 +       } 
    12934 + 
    12935 +       di->addrext = ((ugly_hack == NULL) ? dma_isaddrext(di) : 0); 
    12936 + 
    12937 +       DMA_TRACE(("%s: dma_attach: osh %p ntxd %d nrxd %d rxbufsize %d nrxpost %d rxoffset %d ddoffset 0x%x dataoffset 0x%x\n",  
    12938 +                  name, osh, ntxd, nrxd, rxbufsize, nrxpost, rxoffset, di->ddoffsetlow, di->dataoffsetlow)); 
    12939 + 
    12940 +       /* allocate tx packet pointer vector */ 
    12941 +       if (ntxd) { 
    12942 +               size = ntxd * sizeof (void*); 
    12943 +               if ((di->txp = MALLOC(osh, size)) == NULL) { 
    12944 +                       DMA_ERROR(("%s: dma_attach: out of tx memory, malloced %d bytes\n", di->name, MALLOCED(osh))); 
    12945 +                       goto fail; 
    12946 +               } 
    12947 +               bzero((char*)di->txp, size); 
    12948 +       } 
    12949 + 
    12950 +       /* allocate rx packet pointer vector */ 
    12951 +       if (nrxd) { 
    12952 +               size = nrxd * sizeof (void*); 
    12953 +               if ((di->rxp = MALLOC(osh, size)) == NULL) { 
    12954 +                       DMA_ERROR(("%s: dma_attach: out of rx memory, malloced %d bytes\n", di->name, MALLOCED(osh))); 
    12955 +                       goto fail; 
    12956 +               } 
    12957 +               bzero((char*)di->rxp, size); 
    12958 +       }  
    12959 + 
    12960 +       /* allocate transmit descriptor ring, only need ntxd descriptors but it must be aligned */ 
    12961 +       if (ntxd) { 
    12962 +               if (!dma_alloc(di, DMA_TX)) 
    12963 +                       goto fail; 
    12964 +       } 
    12965 + 
    12966 +       /* allocate receive descriptor ring, only need nrxd descriptors but it must be aligned */ 
    12967 +       if (nrxd) { 
    12968 +               if (!dma_alloc(di, DMA_RX)) 
    12969 +                       goto fail; 
    12970 +       } 
    12971 + 
    12972 +       if ((di->ddoffsetlow == SB_PCI_DMA) && (di->txdpa > SB_PCI_DMA_SZ) && !di->addrext) { 
    12973 +               DMA_ERROR(("%s: dma_attach: txdpa 0x%lx: addrext not supported\n", di->name, di->txdpa)); 
    12974 +               goto fail; 
    12975 +       } 
    12976 +       if ((di->ddoffsetlow == SB_PCI_DMA) && (di->rxdpa > SB_PCI_DMA_SZ) && !di->addrext) { 
    12977 +               DMA_ERROR(("%s: dma_attach: rxdpa 0x%lx: addrext not supported\n", di->name, di->rxdpa)); 
    12978 +               goto fail; 
    12979 +       } 
    12980 + 
    12981 +       return ((void*)di); 
    12982 + 
    12983 +fail: 
    12984 +       dma_detach((void*)di); 
    12985 +       return (NULL); 
    12986 +} 
    12987 + 
    12988 +static bool 
    12989 +dma_alloc(dma_info_t *di, uint direction) 
    12990 +{ 
    12991 +       if (DMA64_ENAB(di)) { 
    12992 +               return dma64_alloc(di, direction); 
    12993 +       } else { 
    12994 +               return dma32_alloc(di, direction); 
    12995 +       } 
    12996 +} 
    12997 + 
    12998 +/* may be called with core in reset */ 
    12999 +void 
    13000 +dma_detach(dma_info_t *di) 
    13001 +{ 
    13002 +       if (di == NULL) 
    13003 +               return; 
    13004 + 
    13005 +       DMA_TRACE(("%s: dma_detach\n", di->name)); 
    13006 + 
    13007 +       /* shouldn't be here if descriptors are unreclaimed */ 
    13008 +       ASSERT(di->txin == di->txout); 
    13009 +       ASSERT(di->rxin == di->rxout); 
    13010 + 
    13011 +       /* free dma descriptor rings */ 
    13012 +       if (di->txd32) 
    13013 +               DMA_FREE_CONSISTENT(di->osh, ((int8*)di->txd32 - di->txdalign), di->txdalloc, (di->txdpa - di->txdalign)); 
    13014 +       if (di->rxd32) 
    13015 +               DMA_FREE_CONSISTENT(di->osh, ((int8*)di->rxd32 - di->rxdalign), di->rxdalloc, (di->rxdpa - di->rxdalign)); 
    13016 + 
    13017 +       /* free packet pointer vectors */ 
    13018 +       if (di->txp) 
    13019 +               MFREE(di->osh, (void*)di->txp, (di->ntxd * sizeof (void*))); 
    13020 +       if (di->rxp) 
    13021 +               MFREE(di->osh, (void*)di->rxp, (di->nrxd * sizeof (void*))); 
    13022 + 
    13023 +       /* free our private info structure */ 
    13024 +       MFREE(di->osh, (void*)di, sizeof (dma_info_t)); 
    13025 +} 
    13026 + 
    13027 +/* return TRUE if this dma engine supports DmaExtendedAddrChanges, otherwise FALSE */ 
    13028 +static bool 
    13029 +dma_isaddrext(dma_info_t *di) 
    13030 +{ 
    13031 +       uint32 w; 
    13032 + 
    13033 +       if (DMA64_ENAB(di)) { 
    13034 +               OR_REG(&di->d64txregs->control, D64_XC_AE); 
    13035 +               w = R_REG(&di->d32txregs->control); 
    13036 +               AND_REG(&di->d32txregs->control, ~D64_XC_AE); 
    13037 +               return ((w & XC_AE) == D64_XC_AE); 
    13038 +       } else { 
    13039 +               OR_REG(&di->d32txregs->control, XC_AE); 
    13040 +               w = R_REG(&di->d32txregs->control); 
    13041 +               AND_REG(&di->d32txregs->control, ~XC_AE); 
    13042 +               return ((w & XC_AE) == XC_AE); 
    13043 +       } 
    13044 +} 
    13045 + 
    13046 +void 
    13047 +dma_txreset(dma_info_t *di) 
    13048 +{ 
    13049 +       DMA_TRACE(("%s: dma_txreset\n", di->name)); 
    13050 + 
    13051 +       if (DMA64_ENAB(di)) 
    13052 +               dma64_txreset(di); 
    13053 +       else 
    13054 +               dma32_txreset(di); 
    13055 +} 
    13056 + 
    13057 +void 
    13058 +dma_rxreset(dma_info_t *di) 
    13059 +{ 
    13060 +       DMA_TRACE(("%s: dma_rxreset\n", di->name)); 
    13061 + 
    13062 +       if (DMA64_ENAB(di)) 
    13063 +               dma64_rxreset(di); 
    13064 +       else 
    13065 +               dma32_rxreset(di); 
    13066 +} 
    13067 + 
    13068 +/* initialize descriptor table base address */ 
    13069 +static void 
    13070 +dma_ddtable_init(dma_info_t *di, uint direction, ulong pa) 
    13071 +{ 
    13072 +       if (DMA64_ENAB(di)) { 
    13073 +               if (direction == DMA_TX) { 
    13074 +                       W_REG(&di->d64txregs->addrlow, pa + di->ddoffsetlow); 
    13075 +                       W_REG(&di->d64txregs->addrhigh, di->ddoffsethigh); 
    13076 +               } else { 
    13077 +                       W_REG(&di->d64rxregs->addrlow, pa + di->ddoffsetlow); 
    13078 +                       W_REG(&di->d64rxregs->addrhigh, di->ddoffsethigh); 
    13079 +               } 
    13080 +       } else { 
    13081 +               uint32 offset = di->ddoffsetlow; 
    13082 +               if ((offset != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) { 
    13083 +                       if (direction == DMA_TX)         
    13084 +                               W_REG(&di->d32txregs->addr, (pa + offset)); 
    13085 +                       else 
    13086 +                               W_REG(&di->d32rxregs->addr, (pa + offset)); 
    13087 +               } else {         
    13088 +                       /* dma32 address extension */ 
    13089 +                       uint32 ae; 
    13090 +                       ASSERT(di->addrext); 
    13091 +                       ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT; 
    13092 +        
    13093 +                       if (direction == DMA_TX) { 
    13094 +                               W_REG(&di->d32txregs->addr, ((pa & ~PCI32ADDR_HIGH) + offset)); 
    13095 +                               SET_REG(&di->d32txregs->control, XC_AE, (ae << XC_AE_SHIFT)); 
    13096 +                       } else { 
    13097 +                               W_REG(&di->d32rxregs->addr, ((pa & ~PCI32ADDR_HIGH) + offset)); 
    13098 +                               SET_REG(&di->d32rxregs->control, RC_AE, (ae << RC_AE_SHIFT)); 
    13099 +                       } 
    13100 +               } 
    13101 +       } 
    13102 +} 
    13103 + 
    13104 +/* init the tx or rx descriptor */ 
    13105 +static INLINE void 
    13106 +dma32_dd_upd(dma_info_t *di, dma32dd_t *ddring, ulong pa, uint outidx, uint32 *ctrl) 
    13107 +{ 
    13108 +       uint offset = di->dataoffsetlow; 
    13109 + 
    13110 +       if ((offset != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) { 
    13111 +               W_SM(&ddring[outidx].addr, BUS_SWAP32(pa + offset)); 
    13112 +               W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*ctrl)); 
    13113 +       } else {         
    13114 +               /* address extension */ 
    13115 +               uint32 ae; 
    13116 +               ASSERT(di->addrext); 
    13117 +               ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT; 
    13118 + 
    13119 +               *ctrl |= (ae << CTRL_AE_SHIFT); 
    13120 +               W_SM(&ddring[outidx].addr, BUS_SWAP32((pa & ~PCI32ADDR_HIGH) + offset)); 
    13121 +               W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*ctrl)); 
    13122 +       } 
    13123 +} 
    13124 + 
    13125 +/* init the tx or rx descriptor */ 
    13126 +static INLINE void 
    13127 +dma64_dd_upd(dma_info_t *di, dma64dd_t *ddring, ulong pa, uint outidx, uint32 *flags, uint32 bufcount) 
    13128 +{ 
    13129 +       uint32 bufaddr_low = pa + di->dataoffsetlow; 
    13130 +       uint32 bufaddr_high = 0 + di->dataoffsethigh; 
    13131 + 
    13132 +       uint32 ctrl2 = bufcount & D64_CTRL2_BC_MASK; 
    13133 + 
    13134 +       W_SM(&ddring[outidx].addrlow, BUS_SWAP32(bufaddr_low)); 
    13135 +       W_SM(&ddring[outidx].addrhigh, BUS_SWAP32(bufaddr_high)); 
    13136 +       W_SM(&ddring[outidx].ctrl1, BUS_SWAP32(*flags)); 
    13137 +       W_SM(&ddring[outidx].ctrl2, BUS_SWAP32(ctrl2)); 
    13138 +} 
    13139 + 
    13140 +void 
    13141 +dma_txinit(dma_info_t *di) 
    13142 +{ 
    13143 +       DMA_TRACE(("%s: dma_txinit\n", di->name)); 
    13144 + 
    13145 +       di->txin = di->txout = 0; 
    13146 +       di->txavail = di->ntxd - 1; 
    13147 + 
    13148 +       /* clear tx descriptor ring */ 
    13149 +       if (DMA64_ENAB(di)) { 
    13150 +               BZERO_SM((void*)di->txd64, (di->ntxd * sizeof (dma64dd_t))); 
    13151 +               W_REG(&di->d64txregs->control, XC_XE); 
    13152 +               dma_ddtable_init(di, DMA_TX, di->txdpa); 
    13153 +       } else { 
    13154 +               BZERO_SM((void*)di->txd32, (di->ntxd * sizeof (dma32dd_t))); 
    13155 +               W_REG(&di->d32txregs->control, XC_XE); 
    13156 +               dma_ddtable_init(di, DMA_TX, di->txdpa); 
    13157 +       } 
    13158 +} 
    13159 + 
    13160 +bool 
    13161 +dma_txenabled(dma_info_t *di) 
    13162 +{ 
    13163 +       uint32 xc; 
    13164 +        
    13165 +       /* If the chip is dead, it is not enabled :-) */ 
    13166 +       if (DMA64_ENAB(di)) { 
    13167 +               xc = R_REG(&di->d64txregs->control); 
    13168 +               return ((xc != 0xffffffff) && (xc & D64_XC_XE)); 
    13169 +       } else { 
    13170 +               xc = R_REG(&di->d32txregs->control); 
    13171 +               return ((xc != 0xffffffff) && (xc & XC_XE)); 
    13172 +       } 
    13173 +} 
    13174 + 
    13175 +void 
    13176 +dma_txsuspend(dma_info_t *di) 
    13177 +{ 
    13178 +       DMA_TRACE(("%s: dma_txsuspend\n", di->name)); 
    13179 +       if (DMA64_ENAB(di)) 
    13180 +               OR_REG(&di->d64txregs->control, D64_XC_SE); 
    13181 +       else 
    13182 +               OR_REG(&di->d32txregs->control, XC_SE); 
    13183 +} 
    13184 + 
    13185 +void 
    13186 +dma_txresume(dma_info_t *di) 
    13187 +{ 
    13188 +       DMA_TRACE(("%s: dma_txresume\n", di->name)); 
    13189 +       if (DMA64_ENAB(di)) 
    13190 +               AND_REG(&di->d64txregs->control, ~D64_XC_SE); 
    13191 +       else 
    13192 +               AND_REG(&di->d32txregs->control, ~XC_SE); 
    13193 +} 
    13194 + 
    13195 +bool 
    13196 +dma_txsuspendedidle(dma_info_t *di) 
    13197 +{ 
    13198 +       if (DMA64_ENAB(di)) 
    13199 +               return dma64_txsuspendedidle(di); 
    13200 +       else 
    13201 +               return dma32_txsuspendedidle(di); 
    13202 +} 
    13203 + 
    13204 +bool 
    13205 +dma_txsuspended(dma_info_t *di) 
    13206 +{ 
    13207 +       if (DMA64_ENAB(di)) 
    13208 +               return ((R_REG(&di->d64txregs->control) & D64_XC_SE) == D64_XC_SE); 
    13209 +       else 
    13210 +               return ((R_REG(&di->d32txregs->control) & XC_SE) == XC_SE); 
    13211 +} 
    13212 + 
    13213 +bool 
    13214 +dma_txstopped(dma_info_t *di) 
    13215 +{ 
    13216 +       if (DMA64_ENAB(di)) 
    13217 +               return ((R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_STOPPED); 
    13218 +       else 
    13219 +               return ((R_REG(&di->d32txregs->status) & XS_XS_MASK) == XS_XS_STOPPED); 
    13220 +} 
    13221 + 
    13222 +bool 
    13223 +dma_rxstopped(dma_info_t *di) 
    13224 +{ 
    13225 +       if (DMA64_ENAB(di)) 
    13226 +               return ((R_REG(&di->d64rxregs->status0) & D64_RS0_RS_MASK) == D64_RS0_RS_STOPPED); 
    13227 +       else 
    13228 +               return ((R_REG(&di->d32rxregs->status) & RS_RS_MASK) == RS_RS_STOPPED); 
    13229 +} 
    13230 + 
    13231 +void 
    13232 +dma_fifoloopbackenable(dma_info_t *di) 
    13233 +{ 
    13234 +       DMA_TRACE(("%s: dma_fifoloopbackenable\n", di->name)); 
    13235 +       if (DMA64_ENAB(di)) 
    13236 +               OR_REG(&di->d64txregs->control, D64_XC_LE); 
    13237 +       else 
    13238 +               OR_REG(&di->d32txregs->control, XC_LE); 
    13239 +} 
    13240 + 
    13241 +void 
    13242 +dma_rxinit(dma_info_t *di) 
    13243 +{ 
    13244 +       DMA_TRACE(("%s: dma_rxinit\n", di->name)); 
    13245 + 
    13246 +       di->rxin = di->rxout = 0; 
    13247 + 
    13248 +       /* clear rx descriptor ring */ 
    13249 +       if (DMA64_ENAB(di)) { 
    13250 +                BZERO_SM((void*)di->rxd64, (di->nrxd * sizeof (dma64dd_t))); 
    13251 +               dma_rxenable(di); 
    13252 +               dma_ddtable_init(di, DMA_RX, di->rxdpa); 
    13253 +       } else { 
    13254 +               BZERO_SM((void*)di->rxd32, (di->nrxd * sizeof (dma32dd_t))); 
    13255 +               dma_rxenable(di); 
    13256 +               dma_ddtable_init(di, DMA_RX, di->rxdpa); 
    13257 +       } 
    13258 +} 
    13259 + 
    13260 +void 
    13261 +dma_rxenable(dma_info_t *di) 
    13262 +{ 
    13263 +       DMA_TRACE(("%s: dma_rxenable\n", di->name)); 
    13264 +       if (DMA64_ENAB(di)) 
    13265 +               W_REG(&di->d64rxregs->control, ((di->rxoffset << D64_RC_RO_SHIFT) | D64_RC_RE)); 
    13266 +       else 
    13267 +               W_REG(&di->d32rxregs->control, ((di->rxoffset << RC_RO_SHIFT) | RC_RE)); 
    13268 +} 
    13269 + 
    13270 +bool 
    13271 +dma_rxenabled(dma_info_t *di) 
    13272 +{ 
    13273 +       uint32 rc; 
    13274 + 
    13275 +       if (DMA64_ENAB(di)) {  
    13276 +               rc = R_REG(&di->d64rxregs->control); 
    13277 +               return ((rc != 0xffffffff) && (rc & D64_RC_RE)); 
    13278 +       } else { 
    13279 +               rc = R_REG(&di->d32rxregs->control); 
    13280 +               return ((rc != 0xffffffff) && (rc & RC_RE)); 
    13281 +       } 
    13282 +} 
    13283 + 
    13284 + 
    13285 +/* !! tx entry routine */ 
    13286 +int 
    13287 +dma_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
    13288 +{ 
    13289 +       if (DMA64_ENAB(di)) {  
    13290 +               return dma64_txfast(di, p0, coreflags); 
    13291 +       } else { 
    13292 +               return dma32_txfast(di, p0, coreflags); 
    13293 +       } 
    13294 +} 
    13295 + 
    13296 +/* !! rx entry routine, returns a pointer to the next frame received, or NULL if there are no more */ 
    13297 +void* 
    13298 +dma_rx(dma_info_t *di) 
    13299 +{ 
    13300 +       void *p; 
    13301 +       uint len; 
    13302 +       int skiplen = 0; 
    13303 + 
    13304 +       while ((p = dma_getnextrxp(di, FALSE))) { 
    13305 +               /* skip giant packets which span multiple rx descriptors */ 
    13306 +               if (skiplen > 0) { 
    13307 +                       skiplen -= di->rxbufsize; 
    13308 +                       if (skiplen < 0) 
    13309 +                               skiplen = 0; 
    13310 +                       PKTFREE(di->osh, p, FALSE); 
    13311 +                       continue; 
    13312 +               } 
    13313 + 
    13314 +               len = ltoh16(*(uint16*)(PKTDATA(di->osh, p))); 
    13315 +               DMA_TRACE(("%s: dma_rx len %d\n", di->name, len)); 
    13316 + 
    13317 +               /* bad frame length check */ 
    13318 +               if (len > (di->rxbufsize - di->rxoffset)) { 
    13319 +                       DMA_ERROR(("%s: dma_rx: bad frame length (%d)\n", di->name, len)); 
    13320 +                       if (len > 0) 
    13321 +                               skiplen = len - (di->rxbufsize - di->rxoffset); 
    13322 +                       PKTFREE(di->osh, p, FALSE); 
    13323 +                       di->hnddma.rxgiants++; 
    13324 +                       continue; 
    13325 +               } 
    13326 + 
    13327 +               /* set actual length */ 
    13328 +               PKTSETLEN(di->osh, p, (di->rxoffset + len)); 
    13329 + 
    13330 +               break; 
    13331 +       } 
    13332 + 
    13333 +       return (p); 
    13334 +} 
    13335 + 
    13336 +/* post receive buffers */ 
    13337 +void 
    13338 +dma_rxfill(dma_info_t *di) 
    13339 +{ 
    13340 +       void *p; 
    13341 +       uint rxin, rxout; 
    13342 +       uint32 ctrl; 
    13343 +       uint n; 
    13344 +       uint i; 
    13345 +       uint32 pa; 
    13346 +       uint rxbufsize; 
    13347 + 
    13348 +       /* 
    13349 +        * Determine how many receive buffers we're lacking 
    13350 +        * from the full complement, allocate, initialize, 
    13351 +        * and post them, then update the chip rx lastdscr. 
    13352 +        */ 
    13353 + 
    13354 +       rxin = di->rxin; 
    13355 +       rxout = di->rxout; 
    13356 +       rxbufsize = di->rxbufsize; 
    13357 + 
    13358 +       n = di->nrxpost - NRXDACTIVE(rxin, rxout); 
    13359 + 
    13360 +       DMA_TRACE(("%s: dma_rxfill: post %d\n", di->name, n)); 
    13361 + 
    13362 +       for (i = 0; i < n; i++) { 
    13363 +               if ((p = PKTGET(di->osh, rxbufsize, FALSE)) == NULL) { 
    13364 +                       DMA_ERROR(("%s: dma_rxfill: out of rxbufs\n", di->name)); 
    13365 +                       di->hnddma.rxnobuf++; 
    13366 +                       break; 
    13367 +               } 
    13368 + 
    13369 +               /* Do a cached write instead of uncached write since DMA_MAP 
    13370 +                * will flush the cache. */ 
    13371 +               *(uint32*)(PKTDATA(di->osh, p)) = 0; 
    13372 + 
    13373 +               pa = (uint32) DMA_MAP(di->osh, PKTDATA(di->osh, p), rxbufsize, DMA_RX, p); 
    13374 +               ASSERT(ISALIGNED(pa, 4)); 
    13375 + 
    13376 +               /* save the free packet pointer */ 
    13377 +               ASSERT(di->rxp[rxout] == NULL); 
    13378 +               di->rxp[rxout] = p; 
    13379 + 
    13380 +               if (DMA64_ENAB(di)) { 
    13381 +                       /* prep the descriptor control value */ 
    13382 +                       if (rxout == (di->nrxd - 1)) 
    13383 +                               ctrl = CTRL_EOT; 
    13384 + 
    13385 +                       dma64_dd_upd(di, di->rxd64, pa, rxout, &ctrl, rxbufsize); 
    13386 +               } else { 
    13387 +                       /* prep the descriptor control value */ 
    13388 +                       ctrl = rxbufsize; 
    13389 +                       if (rxout == (di->nrxd - 1)) 
    13390 +                               ctrl |= CTRL_EOT; 
    13391 +                       dma32_dd_upd(di, di->rxd32, pa, rxout, &ctrl); 
    13392 +               } 
    13393 + 
    13394 +               rxout = NEXTRXD(rxout); 
    13395 +       } 
    13396 + 
    13397 +       di->rxout = rxout; 
    13398 + 
    13399 +       /* update the chip lastdscr pointer */ 
    13400 +       if (DMA64_ENAB(di)) { 
    13401 +               W_REG(&di->d64rxregs->ptr, I2B(rxout, dma64dd_t)); 
    13402 +       } else { 
    13403 +               W_REG(&di->d32rxregs->ptr, I2B(rxout, dma32dd_t)); 
    13404 +       } 
    13405 +} 
    13406 + 
    13407 +void 
    13408 +dma_txreclaim(dma_info_t *di, bool forceall) 
    13409 +{ 
    13410 +       void *p; 
    13411 + 
    13412 +       DMA_TRACE(("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : "")); 
    13413 + 
    13414 +       while ((p = dma_getnexttxp(di, forceall))) 
    13415 +               PKTFREE(di->osh, p, TRUE); 
    13416 +} 
    13417 + 
    13418 +/* 
    13419 + * Reclaim next completed txd (txds if using chained buffers) and 
    13420 + * return associated packet. 
    13421 + * If 'force' is true, reclaim txd(s) and return associated packet 
    13422 + * regardless of the value of the hardware "curr" pointer. 
    13423 + */ 
    13424 +void* 
    13425 +dma_getnexttxp(dma_info_t *di, bool forceall) 
    13426 +{ 
    13427 +       if (DMA64_ENAB(di)) { 
    13428 +               return dma64_getnexttxp(di, forceall); 
    13429 +       } else { 
    13430 +               return dma32_getnexttxp(di, forceall); 
    13431 +       } 
    13432 +} 
    13433 +        
    13434 +/* like getnexttxp but no reclaim */ 
    13435 +void* 
    13436 +dma_peeknexttxp(dma_info_t *di) 
    13437 +{ 
    13438 +       uint end, i; 
    13439 + 
    13440 +       if (DMA64_ENAB(di)) { 
    13441 +               end = B2I(R_REG(&di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t); 
    13442 +       } else { 
    13443 +               end = B2I(R_REG(&di->d32txregs->status) & XS_CD_MASK, dma32dd_t); 
    13444 +       } 
    13445 + 
    13446 +       for (i = di->txin; i != end; i = NEXTTXD(i)) 
    13447 +               if (di->txp[i]) 
    13448 +                       return (di->txp[i]); 
    13449 + 
    13450 +       return (NULL); 
    13451 +} 
    13452 + 
    13453 +/* 
    13454 + * Rotate all active tx dma ring entries "forward" by (ActiveDescriptor - txin). 
    13455 + */ 
    13456 +void 
    13457 +dma_txrotate(di_t *di) 
    13458 +{ 
    13459 +       if (DMA64_ENAB(di)) { 
    13460 +               dma64_txrotate(di); 
    13461 +       } else { 
    13462 +               dma32_txrotate(di); 
    13463 +       } 
    13464 +} 
    13465 + 
    13466 +void 
    13467 +dma_rxreclaim(dma_info_t *di) 
    13468 +{ 
    13469 +       void *p; 
    13470 + 
    13471 +       DMA_TRACE(("%s: dma_rxreclaim\n", di->name)); 
    13472 + 
    13473 +       while ((p = dma_getnextrxp(di, TRUE))) 
    13474 +               PKTFREE(di->osh, p, FALSE); 
    13475 +} 
    13476 + 
    13477 +void * 
    13478 +dma_getnextrxp(dma_info_t *di, bool forceall) 
    13479 +{ 
    13480 +       if (DMA64_ENAB(di)) { 
    13481 +               return dma64_getnextrxp(di, forceall); 
    13482 +       } else { 
    13483 +               return dma32_getnextrxp(di, forceall); 
    13484 +       } 
    13485 +} 
    13486 + 
    13487 +uintptr 
    13488 +dma_getvar(dma_info_t *di, char *name) 
    13489 +{ 
    13490 +       if (!strcmp(name, "&txavail")) 
    13491 +               return ((uintptr) &di->txavail); 
    13492 +       else { 
    13493 +               ASSERT(0); 
    13494 +       } 
    13495 +       return (0); 
    13496 +} 
    13497 + 
    13498 +void 
    13499 +dma_txblock(dma_info_t *di) 
    13500 +{ 
    13501 +       di->txavail = 0; 
    13502 +} 
    13503 + 
    13504 +void 
    13505 +dma_txunblock(dma_info_t *di) 
    13506 +{ 
    13507 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    13508 +} 
    13509 + 
    13510 +uint 
    13511 +dma_txactive(dma_info_t *di) 
    13512 +{ 
    13513 +       return (NTXDACTIVE(di->txin, di->txout)); 
    13514 +} 
    13515 +        
    13516 +void 
    13517 +dma_rxpiomode(dma32regs_t *regs) 
    13518 +{ 
    13519 +       W_REG(&regs->control, RC_FM); 
    13520 +} 
    13521 + 
    13522 +void 
    13523 +dma_txpioloopback(dma32regs_t *regs) 
    13524 +{ 
    13525 +       OR_REG(&regs->control, XC_LE); 
    13526 +} 
    13527 + 
    13528 + 
    13529 + 
    13530 + 
    13531 +/*** 32 bits DMA non-inline functions ***/ 
    13532 +static bool 
    13533 +dma32_alloc(dma_info_t *di, uint direction) 
    13534 +{ 
    13535 +       uint size; 
    13536 +       uint ddlen; 
    13537 +       void *va; 
    13538 + 
    13539 +       ddlen = sizeof (dma32dd_t); 
    13540 + 
    13541 +       size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen); 
    13542 + 
    13543 +       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, D32RINGALIGN)) 
    13544 +               size += D32RINGALIGN; 
    13545 + 
    13546 + 
    13547 +       if (direction == DMA_TX) { 
    13548 +               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->txdpa)) == NULL) { 
    13549 +                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(ntxd) failed\n", di->name)); 
    13550 +                       return FALSE; 
    13551 +               } 
    13552 + 
    13553 +               di->txd32 = (dma32dd_t*) ROUNDUP((uintptr)va, D32RINGALIGN); 
    13554 +               di->txdalign = (uint)((int8*)di->txd32 - (int8*)va); 
    13555 +               di->txdpa += di->txdalign; 
    13556 +               di->txdalloc = size; 
    13557 +               ASSERT(ISALIGNED((uintptr)di->txd32, D32RINGALIGN)); 
    13558 +       } else { 
    13559 +               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->rxdpa)) == NULL) { 
    13560 +                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(nrxd) failed\n", di->name)); 
    13561 +                       return FALSE; 
    13562 +               } 
    13563 +               di->rxd32 = (dma32dd_t*) ROUNDUP((uintptr)va, D32RINGALIGN); 
    13564 +               di->rxdalign = (uint)((int8*)di->rxd32 - (int8*)va); 
    13565 +               di->rxdpa += di->rxdalign; 
    13566 +               di->rxdalloc = size; 
    13567 +               ASSERT(ISALIGNED((uintptr)di->rxd32, D32RINGALIGN)); 
    13568 +       } 
    13569 + 
    13570 +       return TRUE; 
    13571 +} 
    13572 + 
    13573 +static void  
    13574 +dma32_txreset(dma_info_t *di) 
    13575 +{ 
    13576 +       uint32 status; 
    13577 + 
    13578 +       /* suspend tx DMA first */ 
    13579 +       W_REG(&di->d32txregs->control, XC_SE); 
    13580 +       SPINWAIT((status = (R_REG(&di->d32txregs->status) & XS_XS_MASK)) != XS_XS_DISABLED && 
    13581 +                status != XS_XS_IDLE && 
    13582 +                status != XS_XS_STOPPED, 
    13583 +                10000); 
    13584 + 
    13585 +       W_REG(&di->d32txregs->control, 0); 
    13586 +       SPINWAIT((status = (R_REG(&di->d32txregs->status) & XS_XS_MASK)) != XS_XS_DISABLED, 
    13587 +                10000); 
    13588 + 
    13589 +       if (status != XS_XS_DISABLED) { 
    13590 +               DMA_ERROR(("%s: dma_txreset: dma cannot be stopped\n", di->name)); 
    13591 +       } 
    13592 + 
    13593 +       /* wait for the last transaction to complete */ 
    13594 +       OSL_DELAY(300); 
    13595 +} 
    13596 + 
    13597 +static void  
    13598 +dma32_rxreset(dma_info_t *di) 
    13599 +{ 
    13600 +       uint32 status; 
    13601 + 
    13602 +       W_REG(&di->d32rxregs->control, 0); 
    13603 +       SPINWAIT((status = (R_REG(&di->d32rxregs->status) & RS_RS_MASK)) != RS_RS_DISABLED, 
    13604 +                10000); 
    13605 + 
    13606 +       if (status != RS_RS_DISABLED) { 
    13607 +               DMA_ERROR(("%s: dma_rxreset: dma cannot be stopped\n", di->name)); 
    13608 +       } 
    13609 +} 
    13610 + 
    13611 +static bool 
    13612 +dma32_txsuspendedidle(dma_info_t *di) 
    13613 +{ 
    13614 +       if (!(R_REG(&di->d32txregs->control) & XC_SE)) 
    13615 +               return 0; 
    13616 +        
    13617 +       if ((R_REG(&di->d32txregs->status) & XS_XS_MASK) != XS_XS_IDLE) 
    13618 +               return 0; 
    13619 + 
    13620 +       OSL_DELAY(2); 
    13621 +       return ((R_REG(&di->d32txregs->status) & XS_XS_MASK) == XS_XS_IDLE); 
    13622 +} 
    13623 + 
    13624 +/* 
    13625 + * supports full 32bit dma engine buffer addressing so 
    13626 + * dma buffers can cross 4 Kbyte page boundaries. 
    13627 + */ 
    13628 +static int 
    13629 +dma32_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
    13630 +{ 
    13631 +       void *p, *next; 
    13632 +       uchar *data; 
    13633 +       uint len; 
    13634 +       uint txout; 
    13635 +       uint32 ctrl; 
    13636 +       uint32 pa;       
    13637 + 
    13638 +       DMA_TRACE(("%s: dma_txfast\n", di->name)); 
    13639 + 
    13640 +       txout = di->txout; 
    13641 +       ctrl = 0; 
    13642 + 
    13643 +       /* 
    13644 +        * Walk the chain of packet buffers 
    13645 +        * allocating and initializing transmit descriptor entries. 
    13646 +        */ 
    13647 +       for (p = p0; p; p = next) { 
    13648 +               data = PKTDATA(di->osh, p); 
    13649 +               len = PKTLEN(di->osh, p); 
    13650 +               next = PKTNEXT(di->osh, p); 
    13651 + 
    13652 +               /* return nonzero if out of tx descriptors */ 
    13653 +               if (NEXTTXD(txout) == di->txin) 
    13654 +                       goto outoftxd; 
    13655 + 
    13656 +               if (len == 0) 
    13657 +                       continue; 
    13658 + 
    13659 +               /* get physical address of buffer start */ 
    13660 +               pa = (uint32) DMA_MAP(di->osh, data, len, DMA_TX, p); 
    13661 + 
    13662 +               /* build the descriptor control value */ 
    13663 +               ctrl = len & CTRL_BC_MASK; 
    13664 + 
    13665 +               ctrl |= coreflags; 
    13666 +                
    13667 +               if (p == p0) 
    13668 +                       ctrl |= CTRL_SOF; 
    13669 +               if (next == NULL) 
    13670 +                       ctrl |= (CTRL_IOC | CTRL_EOF); 
    13671 +               if (txout == (di->ntxd - 1)) 
    13672 +                       ctrl |= CTRL_EOT; 
    13673 + 
    13674 +               if (DMA64_ENAB(di)) { 
    13675 +                       dma64_dd_upd(di, di->txd64, pa, txout, &ctrl, len); 
    13676 +               } else { 
    13677 +                       dma32_dd_upd(di, di->txd32, pa, txout, &ctrl); 
    13678 +               } 
    13679 + 
    13680 +               ASSERT(di->txp[txout] == NULL); 
    13681 + 
    13682 +               txout = NEXTTXD(txout); 
    13683 +       } 
    13684 + 
    13685 +       /* if last txd eof not set, fix it */ 
    13686 +       if (!(ctrl & CTRL_EOF)) 
    13687 +               W_SM(&di->txd32[PREVTXD(txout)].ctrl, BUS_SWAP32(ctrl | CTRL_IOC | CTRL_EOF)); 
    13688 + 
    13689 +       /* save the packet */ 
    13690 +       di->txp[PREVTXD(txout)] = p0; 
    13691 + 
    13692 +       /* bump the tx descriptor index */ 
    13693 +       di->txout = txout; 
    13694 + 
    13695 +       /* kick the chip */ 
    13696 +       if (DMA64_ENAB(di)) { 
    13697 +               W_REG(&di->d64txregs->ptr, I2B(txout, dma64dd_t)); 
    13698 +       } else { 
    13699 +               W_REG(&di->d32txregs->ptr, I2B(txout, dma32dd_t)); 
    13700 +       } 
    13701 + 
    13702 +       /* tx flow control */ 
    13703 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    13704 + 
    13705 +       return (0); 
    13706 + 
    13707 + outoftxd: 
    13708 +       DMA_ERROR(("%s: dma_txfast: out of txds\n", di->name)); 
    13709 +       PKTFREE(di->osh, p0, TRUE); 
    13710 +       di->txavail = 0; 
    13711 +       di->hnddma.txnobuf++; 
    13712 +       return (-1); 
    13713 +} 
    13714 + 
    13715 +static void* 
    13716 +dma32_getnexttxp(dma_info_t *di, bool forceall) 
    13717 +{ 
    13718 +       uint start, end, i; 
    13719 +       void *txp; 
    13720 + 
    13721 +       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : "")); 
    13722 + 
    13723 +       txp = NULL; 
    13724 + 
    13725 +       start = di->txin; 
    13726 +       if (forceall) 
    13727 +               end = di->txout; 
    13728 +       else 
    13729 +               end = B2I(R_REG(&di->d32txregs->status) & XS_CD_MASK, dma32dd_t); 
    13730 + 
    13731 +       if ((start == 0) && (end > di->txout)) 
    13732 +               goto bogus; 
    13733 + 
    13734 +       for (i = start; i != end && !txp; i = NEXTTXD(i)) { 
    13735 +               DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->txd32[i].addr)) - di->dataoffsetlow), 
    13736 +                         (BUS_SWAP32(R_SM(&di->txd32[i].ctrl)) & CTRL_BC_MASK), DMA_TX, di->txp[i]); 
    13737 + 
    13738 +               W_SM(&di->txd32[i].addr, 0xdeadbeef); 
    13739 +               txp = di->txp[i]; 
    13740 +               di->txp[i] = NULL; 
    13741 +       } 
    13742 + 
    13743 +       di->txin = i; 
    13744 + 
    13745 +       /* tx flow control */ 
    13746 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    13747 + 
    13748 +       return (txp); 
    13749 + 
    13750 +bogus: 
    13751 +/* 
    13752 +       DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n", 
    13753 +               start, end, di->txout, forceall)); 
    13754 +*/ 
    13755 +       return (NULL); 
    13756 +} 
    13757 + 
    13758 +static void * 
    13759 +dma32_getnextrxp(dma_info_t *di, bool forceall) 
    13760 +{ 
    13761 +       uint i; 
    13762 +       void *rxp; 
    13763 + 
    13764 +       /* if forcing, dma engine must be disabled */ 
    13765 +       ASSERT(!forceall || !dma_rxenabled(di)); 
    13766 + 
    13767 +       i = di->rxin; 
    13768 + 
    13769 +       /* return if no packets posted */ 
    13770 +       if (i == di->rxout) 
    13771 +               return (NULL); 
    13772 + 
    13773 +       /* ignore curr if forceall */ 
    13774 +       if (!forceall && (i == B2I(R_REG(&di->d32rxregs->status) & RS_CD_MASK, dma32dd_t))) 
    13775 +               return (NULL); 
    13776 + 
    13777 +       /* get the packet pointer that corresponds to the rx descriptor */ 
    13778 +       rxp = di->rxp[i]; 
    13779 +       ASSERT(rxp); 
    13780 +       di->rxp[i] = NULL; 
    13781 + 
    13782 +       /* clear this packet from the descriptor ring */ 
    13783 +       DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->rxd32[i].addr)) - di->dataoffsetlow), 
    13784 +                 di->rxbufsize, DMA_RX, rxp); 
    13785 +       W_SM(&di->rxd32[i].addr, 0xdeadbeef); 
    13786 + 
    13787 +       di->rxin = NEXTRXD(i); 
    13788 + 
    13789 +       return (rxp); 
    13790 +} 
    13791 + 
    13792 +static void 
    13793 +dma32_txrotate(di_t *di) 
    13794 +{ 
    13795 +       uint ad; 
    13796 +       uint nactive; 
    13797 +       uint rot; 
    13798 +       uint old, new; 
    13799 +       uint32 w; 
    13800 +       uint first, last; 
    13801 + 
    13802 +       ASSERT(dma_txsuspendedidle(di)); 
    13803 + 
    13804 +       nactive = dma_txactive(di); 
    13805 +       ad = B2I(((R_REG(&di->d32txregs->status) & XS_AD_MASK) >> XS_AD_SHIFT), dma32dd_t); 
    13806 +       rot = TXD(ad - di->txin); 
    13807 + 
    13808 +       ASSERT(rot < di->ntxd); 
    13809 + 
    13810 +       /* full-ring case is a lot harder - don't worry about this */ 
    13811 +       if (rot >= (di->ntxd - nactive)) { 
    13812 +               DMA_ERROR(("%s: dma_txrotate: ring full - punt\n", di->name)); 
    13813 +               return; 
    13814 +       } 
    13815 + 
    13816 +       first = di->txin; 
    13817 +       last = PREVTXD(di->txout); 
    13818 + 
    13819 +       /* move entries starting at last and moving backwards to first */ 
    13820 +       for (old = last; old != PREVTXD(first); old = PREVTXD(old)) { 
    13821 +               new = TXD(old + rot); 
    13822 + 
    13823 +               /* 
    13824 +                * Move the tx dma descriptor. 
    13825 +                * EOT is set only in the last entry in the ring. 
    13826 +                */ 
    13827 +               w = R_SM(&di->txd32[old].ctrl) & ~CTRL_EOT; 
    13828 +               if (new == (di->ntxd - 1)) 
    13829 +                       w |= CTRL_EOT; 
    13830 +               W_SM(&di->txd32[new].ctrl, w); 
    13831 +               W_SM(&di->txd32[new].addr, R_SM(&di->txd32[old].addr)); 
    13832 + 
    13833 +               /* zap the old tx dma descriptor address field */ 
    13834 +               W_SM(&di->txd32[old].addr, 0xdeadbeef); 
    13835 + 
    13836 +               /* move the corresponding txp[] entry */ 
    13837 +               ASSERT(di->txp[new] == NULL); 
    13838 +               di->txp[new] = di->txp[old]; 
    13839 +               di->txp[old] = NULL; 
    13840 +       } 
    13841 + 
    13842 +       /* update txin and txout */ 
    13843 +       di->txin = ad; 
    13844 +       di->txout = TXD(di->txout + rot); 
    13845 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    13846 + 
    13847 +       /* kick the chip */ 
    13848 +       W_REG(&di->d32txregs->ptr, I2B(di->txout, dma32dd_t)); 
    13849 +} 
    13850 + 
    13851 +/*** 64 bits DMA non-inline functions ***/ 
    13852 + 
    13853 +#ifdef BCMDMA64 
    13854 + 
    13855 +static bool 
    13856 +dma64_alloc(dma_info_t *di, uint direction) 
    13857 +{ 
    13858 +       uint size; 
    13859 +       uint ddlen; 
    13860 +       uint32 alignbytes; 
    13861 +       void *va; 
    13862 + 
    13863 +       ddlen = sizeof (dma64dd_t); 
    13864 + 
    13865 +       size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen); 
    13866 + 
    13867 +       alignbytes = di->dma64align; 
    13868 + 
    13869 +       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, alignbytes)) 
    13870 +               size += alignbytes; 
    13871 + 
    13872 + 
    13873 +       if (direction == DMA_TX) { 
    13874 +               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->txdpa)) == NULL) { 
    13875 +                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(ntxd) failed\n", di->name)); 
    13876 +                       return FALSE; 
    13877 +               } 
    13878 + 
    13879 +               di->txd64 = (dma64dd_t*) ROUNDUP((uintptr)va, alignbytes); 
    13880 +               di->txdalign = (uint)((int8*)di->txd64 - (int8*)va); 
    13881 +               di->txdpa += di->txdalign; 
    13882 +               di->txdalloc = size; 
    13883 +               ASSERT(ISALIGNED((uintptr)di->txd64, alignbytes)); 
    13884 +       } else { 
    13885 +               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->rxdpa)) == NULL) { 
    13886 +                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(nrxd) failed\n", di->name)); 
    13887 +                       return FALSE; 
    13888 +               } 
    13889 +               di->rxd64 = (dma64dd_t*) ROUNDUP((uintptr)va, alignbytes); 
    13890 +               di->rxdalign = (uint)((int8*)di->rxd64 - (int8*)va); 
    13891 +               di->rxdpa += di->rxdalign; 
    13892 +               di->rxdalloc = size; 
    13893 +               ASSERT(ISALIGNED((uintptr)di->rxd64, alignbytes)); 
    13894 +       } 
    13895 + 
    13896 +       return TRUE; 
    13897 +} 
    13898 + 
    13899 +static void  
    13900 +dma64_txreset(dma_info_t *di) 
    13901 +{ 
    13902 +       uint32 status; 
    13903 + 
    13904 +       /* suspend tx DMA first */ 
    13905 +       W_REG(&di->d64txregs->control, D64_XC_SE); 
    13906 +       SPINWAIT((status = (R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK)) != D64_XS0_XS_DISABLED && 
    13907 +                status != D64_XS0_XS_IDLE && 
    13908 +                status != D64_XS0_XS_STOPPED, 
    13909 +                10000); 
    13910 + 
    13911 +       W_REG(&di->d64txregs->control, 0); 
    13912 +       SPINWAIT((status = (R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK)) != D64_XS0_XS_DISABLED, 
    13913 +                10000); 
    13914 + 
    13915 +       if (status != D64_XS0_XS_DISABLED) { 
    13916 +               DMA_ERROR(("%s: dma_txreset: dma cannot be stopped\n", di->name)); 
    13917 +       } 
    13918 + 
    13919 +       /* wait for the last transaction to complete */ 
    13920 +       OSL_DELAY(300); 
    13921 +} 
    13922 + 
    13923 +static void  
    13924 +dma64_rxreset(dma_info_t *di) 
    13925 +{ 
    13926 +       uint32 status; 
    13927 + 
    13928 +       W_REG(&di->d64rxregs->control, 0); 
    13929 +       SPINWAIT((status = (R_REG(&di->d64rxregs->status0) & D64_RS0_RS_MASK)) != D64_RS0_RS_DISABLED, 
    13930 +                10000); 
    13931 + 
    13932 +       if (status != D64_RS0_RS_DISABLED) { 
    13933 +               DMA_ERROR(("%s: dma_rxreset: dma cannot be stopped\n", di->name)); 
    13934 +       } 
    13935 +} 
    13936 + 
    13937 +static bool 
    13938 +dma64_txsuspendedidle(dma_info_t *di) 
    13939 +{ 
    13940 + 
    13941 +       if (!(R_REG(&di->d64txregs->control) & D64_XC_SE)) 
    13942 +               return 0; 
    13943 +        
    13944 +       if ((R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_IDLE) 
    13945 +               return 1; 
    13946 + 
    13947 +       return 0; 
    13948 +} 
    13949 + 
    13950 +/* 
    13951 + * supports full 32bit dma engine buffer addressing so 
    13952 + * dma buffers can cross 4 Kbyte page boundaries. 
    13953 + */ 
    13954 +static int 
    13955 +dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
    13956 +{ 
    13957 +       void *p, *next; 
    13958 +       uchar *data; 
    13959 +       uint len; 
    13960 +       uint txout; 
    13961 +       uint32 flags; 
    13962 +       uint32 pa;       
    13963 + 
    13964 +       DMA_TRACE(("%s: dma_txfast\n", di->name)); 
    13965 + 
    13966 +       txout = di->txout; 
    13967 +       flags = 0; 
    13968 + 
    13969 +       /* 
    13970 +        * Walk the chain of packet buffers 
    13971 +        * allocating and initializing transmit descriptor entries. 
    13972 +        */ 
    13973 +       for (p = p0; p; p = next) { 
    13974 +               data = PKTDATA(di->osh, p); 
    13975 +               len = PKTLEN(di->osh, p); 
    13976 +               next = PKTNEXT(di->osh, p); 
    13977 + 
    13978 +               /* return nonzero if out of tx descriptors */ 
    13979 +               if (NEXTTXD(txout) == di->txin) 
    13980 +                       goto outoftxd; 
    13981 + 
    13982 +               if (len == 0) 
    13983 +                       continue; 
    13984 + 
    13985 +               /* get physical address of buffer start */ 
    13986 +               pa = (uint32) DMA_MAP(di->osh, data, len, DMA_TX, p); 
    13987 + 
    13988 +               flags = coreflags; 
    13989 +                
    13990 +               if (p == p0) 
    13991 +                       flags |= D64_CTRL1_SOF; 
    13992 +               if (next == NULL) 
    13993 +                       flags |= (D64_CTRL1_IOC | D64_CTRL1_EOF); 
    13994 +               if (txout == (di->ntxd - 1)) 
    13995 +                       flags |= D64_CTRL1_EOT; 
    13996 + 
    13997 +               dma64_dd_upd(di, di->txd64, pa, txout, &flags, len); 
    13998 + 
    13999 +               ASSERT(di->txp[txout] == NULL); 
    14000 + 
    14001 +               txout = NEXTTXD(txout); 
    14002 +       } 
    14003 + 
    14004 +       /* if last txd eof not set, fix it */ 
    14005 +       if (!(flags & D64_CTRL1_EOF)) 
    14006 +               W_SM(&di->txd64[PREVTXD(txout)].ctrl1, BUS_SWAP32(flags | D64_CTRL1_IOC | D64_CTRL1_EOF)); 
    14007 + 
    14008 +       /* save the packet */ 
    14009 +       di->txp[PREVTXD(txout)] = p0; 
    14010 + 
    14011 +       /* bump the tx descriptor index */ 
    14012 +       di->txout = txout; 
    14013 + 
    14014 +       /* kick the chip */ 
    14015 +       W_REG(&di->d64txregs->ptr, I2B(txout, dma64dd_t)); 
    14016 + 
    14017 +       /* tx flow control */ 
    14018 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    14019 + 
    14020 +       return (0); 
    14021 + 
    14022 +outoftxd: 
    14023 +       DMA_ERROR(("%s: dma_txfast: out of txds\n", di->name)); 
    14024 +       PKTFREE(di->osh, p0, TRUE); 
    14025 +       di->txavail = 0; 
    14026 +       di->hnddma.txnobuf++; 
    14027 +       return (-1); 
    14028 +} 
    14029 + 
    14030 +static void* 
    14031 +dma64_getnexttxp(dma_info_t *di, bool forceall) 
    14032 +{ 
    14033 +       uint start, end, i; 
    14034 +       void *txp; 
    14035 + 
    14036 +       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : "")); 
    14037 + 
    14038 +       txp = NULL; 
    14039 + 
    14040 +       start = di->txin; 
    14041 +       if (forceall) 
    14042 +               end = di->txout; 
    14043 +       else 
    14044 +               end = B2I(R_REG(&di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t); 
    14045 + 
    14046 +       if ((start == 0) && (end > di->txout)) 
    14047 +               goto bogus; 
    14048 + 
    14049 +       for (i = start; i != end && !txp; i = NEXTTXD(i)) { 
    14050 +               DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->txd64[i].addrlow)) - di->dataoffsetlow), 
    14051 +                         (BUS_SWAP32(R_SM(&di->txd64[i].ctrl2)) & D64_CTRL2_BC_MASK), DMA_TX, di->txp[i]); 
    14052 + 
    14053 +               W_SM(&di->txd64[i].addrlow, 0xdeadbeef); 
    14054 +               W_SM(&di->txd64[i].addrhigh, 0xdeadbeef); 
    14055 + 
    14056 +               txp = di->txp[i]; 
    14057 +               di->txp[i] = NULL; 
    14058 +       } 
    14059 + 
    14060 +       di->txin = i; 
    14061 + 
    14062 +       /* tx flow control */ 
    14063 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    14064 + 
    14065 +       return (txp); 
    14066 + 
    14067 +bogus: 
    14068 +/* 
    14069 +       DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n", 
    14070 +               start, end, di->txout, forceall)); 
    14071 +*/ 
    14072 +       return (NULL); 
    14073 +} 
    14074 + 
    14075 +static void * 
    14076 +dma64_getnextrxp(dma_info_t *di, bool forceall) 
    14077 +{ 
    14078 +       uint i; 
    14079 +       void *rxp; 
    14080 + 
    14081 +       /* if forcing, dma engine must be disabled */ 
    14082 +       ASSERT(!forceall || !dma_rxenabled(di)); 
    14083 + 
    14084 +       i = di->rxin; 
    14085 + 
    14086 +       /* return if no packets posted */ 
    14087 +       if (i == di->rxout) 
    14088 +               return (NULL); 
    14089 + 
    14090 +       /* ignore curr if forceall */ 
    14091 +       if (!forceall && (i == B2I(R_REG(&di->d64rxregs->status0) & D64_RS0_CD_MASK, dma64dd_t))) 
    14092 +               return (NULL); 
    14093 + 
    14094 +       /* get the packet pointer that corresponds to the rx descriptor */ 
    14095 +       rxp = di->rxp[i]; 
    14096 +       ASSERT(rxp); 
    14097 +       di->rxp[i] = NULL; 
    14098 + 
    14099 +       /* clear this packet from the descriptor ring */ 
    14100 +       DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->rxd64[i].addrlow)) - di->dataoffsetlow), 
    14101 +                 di->rxbufsize, DMA_RX, rxp); 
    14102 + 
    14103 +       W_SM(&di->rxd64[i].addrlow, 0xdeadbeef); 
    14104 +       W_SM(&di->rxd64[i].addrhigh, 0xdeadbeef); 
    14105 + 
    14106 +       di->rxin = NEXTRXD(i); 
    14107 + 
    14108 +       return (rxp); 
    14109 +} 
    14110 + 
    14111 +static void 
    14112 +dma64_txrotate(di_t *di) 
    14113 +{ 
    14114 +       uint ad; 
    14115 +       uint nactive; 
    14116 +       uint rot; 
    14117 +       uint old, new; 
    14118 +       uint32 w; 
    14119 +       uint first, last; 
    14120 + 
    14121 +       ASSERT(dma_txsuspendedidle(di)); 
    14122 + 
    14123 +       nactive = dma_txactive(di); 
    14124 +       ad = B2I((R_REG(&di->d64txregs->status1) & D64_XS1_AD_MASK), dma64dd_t); 
    14125 +       rot = TXD(ad - di->txin); 
    14126 + 
    14127 +       ASSERT(rot < di->ntxd); 
    14128 + 
    14129 +       /* full-ring case is a lot harder - don't worry about this */ 
    14130 +       if (rot >= (di->ntxd - nactive)) { 
    14131 +               DMA_ERROR(("%s: dma_txrotate: ring full - punt\n", di->name)); 
    14132 +               return; 
    14133 +       } 
    14134 + 
    14135 +       first = di->txin; 
    14136 +       last = PREVTXD(di->txout); 
    14137 + 
    14138 +       /* move entries starting at last and moving backwards to first */ 
    14139 +       for (old = last; old != PREVTXD(first); old = PREVTXD(old)) { 
    14140 +               new = TXD(old + rot); 
    14141 + 
    14142 +               /* 
    14143 +                * Move the tx dma descriptor. 
    14144 +                * EOT is set only in the last entry in the ring. 
    14145 +                */ 
    14146 +               w = R_SM(&di->txd64[old].ctrl1) & ~D64_CTRL1_EOT; 
    14147 +               if (new == (di->ntxd - 1)) 
    14148 +                       w |= D64_CTRL1_EOT; 
    14149 +               W_SM(&di->txd64[new].ctrl1, w); 
    14150 + 
    14151 +               w = R_SM(&di->txd64[old].ctrl2); 
    14152 +               W_SM(&di->txd64[new].ctrl2, w); 
    14153 + 
    14154 +               W_SM(&di->txd64[new].addrlow, R_SM(&di->txd64[old].addrlow)); 
    14155 +               W_SM(&di->txd64[new].addrhigh, R_SM(&di->txd64[old].addrhigh)); 
    14156 + 
    14157 +               /* zap the old tx dma descriptor address field */ 
    14158 +               W_SM(&di->txd64[old].addrlow, 0xdeadbeef); 
    14159 +               W_SM(&di->txd64[old].addrhigh, 0xdeadbeef); 
    14160 + 
    14161 +               /* move the corresponding txp[] entry */ 
    14162 +               ASSERT(di->txp[new] == NULL); 
    14163 +               di->txp[new] = di->txp[old]; 
    14164 +               di->txp[old] = NULL; 
    14165 +       } 
    14166 + 
    14167 +       /* update txin and txout */ 
    14168 +       di->txin = ad; 
    14169 +       di->txout = TXD(di->txout + rot); 
    14170 +       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
    14171 + 
    14172 +       /* kick the chip */ 
    14173 +       W_REG(&di->d64txregs->ptr, I2B(di->txout, dma64dd_t)); 
    14174 +} 
    14175 + 
    14176 +#endif 
    14177 + 
    14178 diff -Nur linux-2.4.32/drivers/net/hnd/linux_osl.c linux-2.4.32-brcm/drivers/net/hnd/linux_osl.c 
    14179 --- linux-2.4.32/drivers/net/hnd/linux_osl.c    1970-01-01 01:00:00.000000000 +0100 
    14180 +++ linux-2.4.32-brcm/drivers/net/hnd/linux_osl.c       2005-12-16 23:39:11.292858500 +0100 
     12080diff -Naur linux.old/drivers/net/hnd/linux_osl.c linux.dev/drivers/net/hnd/linux_osl.c 
     12081--- linux.old/drivers/net/hnd/linux_osl.c       1970-01-01 01:00:00.000000000 +0100 
     12082+++ linux.dev/drivers/net/hnd/linux_osl.c       2006-04-06 15:34:15.000000000 +0200 
    1418112083@@ -0,0 +1,708 @@ 
    1418212084+/* 
     
    1488812790+ 
    1488912791+#endif /* BINOSL */ 
    14890 diff -Nur linux-2.4.32/drivers/net/hnd/Makefile linux-2.4.32-brcm/drivers/net/hnd/Makefile 
    14891 --- linux-2.4.32/drivers/net/hnd/Makefile       1970-01-01 01:00:00.000000000 +0100 
    14892 +++ linux-2.4.32-brcm/drivers/net/hnd/Makefile  2005-12-16 23:39:11.284858000 +0100 
    14893 @@ -0,0 +1,19 @@ 
    14894 +# 
    14895 +# Makefile for the BCM47xx specific kernel interface routines 
    14896 +# under Linux. 
    14897 +# 
    14898 + 
    14899 +EXTRA_CFLAGS   += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER 
    14900 + 
    14901 +O_TARGET       := hnd.o 
    14902 + 
    14903 +HND_OBJS       := bcmutils.o hnddma.o linux_osl.o sbutils.o bcmsrom.o 
    14904 + 
    14905 +export-objs    := shared_ksyms.o 
    14906 +obj-y          := shared_ksyms.o $(HND_OBJS) 
    14907 +obj-m           := $(O_TARGET) 
    14908 + 
    14909 +include $(TOPDIR)/Rules.make 
    14910 + 
    14911 +shared_ksyms.c: shared_ksyms.sh $(HND_OBJS) 
    14912 +       sh -e $< $(HND_OBJS) > $@ 
    14913 diff -Nur linux-2.4.32/drivers/net/hnd/sbutils.c linux-2.4.32-brcm/drivers/net/hnd/sbutils.c 
    14914 --- linux-2.4.32/drivers/net/hnd/sbutils.c      1970-01-01 01:00:00.000000000 +0100 
    14915 +++ linux-2.4.32-brcm/drivers/net/hnd/sbutils.c 2005-12-16 23:39:11.316860000 +0100 
     12792diff -Naur linux.old/drivers/net/hnd/sbutils.c linux.dev/drivers/net/hnd/sbutils.c 
     12793--- linux.old/drivers/net/hnd/sbutils.c 1970-01-01 01:00:00.000000000 +0100 
     12794+++ linux.dev/drivers/net/hnd/sbutils.c 2006-04-06 15:34:15.000000000 +0200 
    1491612795@@ -0,0 +1,2837 @@ 
    1491712796+/* 
     
    1775215631+} 
    1775315632+ 
    17754 diff -Nur linux-2.4.32/drivers/net/hnd/shared_ksyms.sh linux-2.4.32-brcm/drivers/net/hnd/shared_ksyms.sh 
    17755 --- linux-2.4.32/drivers/net/hnd/shared_ksyms.sh        1970-01-01 01:00:00.000000000 +0100 
    17756 +++ linux-2.4.32-brcm/drivers/net/hnd/shared_ksyms.sh   2005-12-16 23:39:11.316860000 +0100 
     15633diff -Naur linux.old/drivers/net/hnd/shared_ksyms.sh linux.dev/drivers/net/hnd/shared_ksyms.sh 
     15634--- linux.old/drivers/net/hnd/shared_ksyms.sh   1970-01-01 01:00:00.000000000 +0100 
     15635+++ linux.dev/drivers/net/hnd/shared_ksyms.sh   2006-04-06 15:34:15.000000000 +0200 
    1775715636@@ -0,0 +1,21 @@ 
    1775815637+#!/bin/sh 
     
    1777715656+    ${NM} $file | sed -ne 's/[0-9A-Fa-f]* [DT] \([^ ]*\)/extern void \1; EXPORT_SYMBOL(\1);/p' 
    1777815657+done 
    17779 diff -Nur linux-2.4.32/drivers/net/Makefile linux-2.4.32-brcm/drivers/net/Makefile 
    17780 --- linux-2.4.32/drivers/net/Makefile   2005-01-19 15:09:56.000000000 +0100 
    17781 +++ linux-2.4.32-brcm/drivers/net/Makefile      2005-12-16 23:39:11.284858000 +0100 
    17782 @@ -3,6 +3,8 @@ 
    17783  # Makefile for the Linux network (ethercard) device drivers. 
    17784  # 
    17785   
    17786 +EXTRA_CFLAGS := -I$(TOPDIR)/arch/mips/bcm947xx/include 
    17787 + 
    17788  obj-y           := 
    17789  obj-m           := 
    17790  obj-n           := 
    17791 @@ -39,6 +41,8 @@ 
    17792    obj-$(CONFIG_ISDN) += slhc.o 
    17793  endif 
    17794   
    17795 +subdir-$(CONFIG_HND) += hnd 
    17796 +subdir-$(CONFIG_WL) += wl 
    17797  subdir-$(CONFIG_NET_PCMCIA) += pcmcia 
    17798  subdir-$(CONFIG_NET_WIRELESS) += wireless 
    17799  subdir-$(CONFIG_TULIP) += tulip 
    17800 @@ -69,6 +74,13 @@ 
    17801  obj-$(CONFIG_MYRI_SBUS) += myri_sbus.o 
    17802  obj-$(CONFIG_SUNGEM) += sungem.o 
    17803   
    17804 +ifeq ($(CONFIG_HND),y) 
    17805 +  obj-y += hnd/hnd.o 
    17806 +endif 
    17807 +ifeq ($(CONFIG_WL),y) 
    17808 +  obj-y += wl/wl.o 
    17809 +endif 
    17810 + 
    17811  obj-$(CONFIG_MACE) += mace.o 
    17812  obj-$(CONFIG_BMAC) += bmac.o 
    17813  obj-$(CONFIG_GMAC) += gmac.o 
    17814 diff -Nur linux-2.4.32/drivers/net/wireless/Config.in linux-2.4.32-brcm/drivers/net/wireless/Config.in 
    17815 --- linux-2.4.32/drivers/net/wireless/Config.in 2004-11-17 12:54:21.000000000 +0100 
    17816 +++ linux-2.4.32-brcm/drivers/net/wireless/Config.in    2005-12-16 23:39:11.364863000 +0100 
    17817 @@ -13,6 +13,7 @@ 
     15658diff -Naur linux.old/drivers/net/wireless/Config.in linux.dev/drivers/net/wireless/Config.in 
     15659--- linux.old/drivers/net/wireless/Config.in    2006-04-06 15:38:09.000000000 +0200 
     15660+++ linux.dev/drivers/net/wireless/Config.in    2006-04-06 17:04:48.000000000 +0200 
     15661@@ -13,6 +13,8 @@ 
    1781815662 fi 
    1781915663  
    1782015664 if [ "$CONFIG_PCI" = "y" ]; then 
    17821 +   dep_tristate '    Proprietary Broadcom BCM43xx 802.11 Wireless support' CONFIG_WL 
     15665+   dep_tristate '    Proprietary Broadcom BCM43xx 802.11 Wireless support (old)' CONFIG_WL 
     15666+   dep_tristate '    Proprietary Broadcom BCM43xx 802.11 Wireless support (new)' CONFIG_WL2 
    1782215667    dep_tristate '    Hermes in PLX9052 based PCI adaptor support (Netgear MA301 etc.) (EXPERIMENTAL)' CONFIG_PLX_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL 
    1782315668    dep_tristate '    Hermes in TMD7160/NCP130 based PCI adaptor support (Pheecom WL-PCI etc.) (EXPERIMENTAL)' CONFIG_TMD_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL 
    1782415669    dep_tristate '    Prism 2.5 PCI 802.11b adaptor support (EXPERIMENTAL)' CONFIG_PCI_HERMES $CONFIG_HERMES $CONFIG_EXPERIMENTAL 
    17825 diff -Nur linux-2.4.32/drivers/net/wl/Makefile linux-2.4.32-brcm/drivers/net/wl/Makefile 
    17826 --- linux-2.4.32/drivers/net/wl/Makefile        1970-01-01 01:00:00.000000000 +0100 
    17827 +++ linux-2.4.32-brcm/drivers/net/wl/Makefile   2005-12-16 23:39:11.364863000 +0100 
    17828 @@ -0,0 +1,26 @@ 
     15670diff -Naur linux.old/drivers/net/wl/Makefile linux.dev/drivers/net/wl/Makefile 
     15671--- linux.old/drivers/net/wl/Makefile   1970-01-01 01:00:00.000000000 +0100 
     15672+++ linux.dev/drivers/net/wl/Makefile   2006-04-06 16:56:38.000000000 +0200 
     15673@@ -0,0 +1,27 @@ 
    1782915674+# 
    1783015675+# Makefile for the Broadcom wl driver 
     
    1784015685+# $Id: Makefile,v 1.2 2005/03/29 03:32:18 mbm Exp $ 
    1784115686+ 
    17842 +EXTRA_CFLAGS += -I$(TOPDIR)/arch/mips/bcm947xx/include 
     15687+EXTRA_CFLAGS += -I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER 
    1784315688+ 
    1784415689+O_TARGET       := wl.o 
     
    1784915694+obj-y          += apsta_wlc_phy.o apsta_wlc_rate.o apsta_wlc_security.o  
    1785015695+obj-y          += apsta_wlc_sup.o apsta_wlc_wet.o apsta_wl_linux.o apsta_wlc.o 
     15696+obj-y          += compat.o hnddma.o 
    1785115697+ 
    1785215698+obj-m          := $(O_TARGET) 
    1785315699+ 
    1785415700+include $(TOPDIR)/Rules.make 
    17855 diff -Nur linux-2.4.32/drivers/parport/Config.in linux-2.4.32-brcm/drivers/parport/Config.in 
    17856 --- linux-2.4.32/drivers/parport/Config.in      2004-02-18 14:36:31.000000000 +0100 
    17857 +++ linux-2.4.32-brcm/drivers/parport/Config.in 2005-12-16 23:39:11.364863000 +0100 
     15701diff -Naur linux.old/drivers/net/wl/compat.c linux.dev/drivers/net/wl/compat.c 
     15702--- linux.old/drivers/net/wl/compat.c   1970-01-01 01:00:00.000000000 +0100 
     15703+++ linux.dev/drivers/net/wl/compat.c   2006-04-06 17:12:19.000000000 +0200 
     15704@@ -0,0 +1,237 @@ 
     15705+/* 
     15706+ * Misc useful OS-independent routines. 
     15707+ * 
     15708+ * Copyright 2005, Broadcom Corporation       
     15709+ * All Rights Reserved.       
     15710+ *        
     15711+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
     15712+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
     15713+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
     15714+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
     15715+ * $Id$ 
     15716+ */ 
     15717+ 
     15718+#include <typedefs.h> 
     15719+#ifdef BCMDRIVER 
     15720+#include <osl.h> 
     15721+#include <sbutils.h> 
     15722+#include <bcmnvram.h> 
     15723+#else 
     15724+#include <stdio.h> 
     15725+#include <string.h> 
     15726+#endif 
     15727+#include "pktq.h" 
     15728+#include <bcmutils.h> 
     15729+#include <bcmendian.h> 
     15730+#include <bcmdevs.h> 
     15731+ 
     15732+#ifdef BCMDRIVER 
     15733+/* copy a pkt buffer chain into a buffer */ 
     15734+uint 
     15735+pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf) 
     15736+{ 
     15737+       uint n, ret = 0; 
     15738+ 
     15739+       if (len < 0) 
     15740+               len = 4096;     /* "infinite" */ 
     15741+ 
     15742+       /* skip 'offset' bytes */ 
     15743+       for (; p && offset; p = PKTNEXT(osh, p)) { 
     15744+               if (offset < (uint)PKTLEN(osh, p)) 
     15745+                       break; 
     15746+               offset -= PKTLEN(osh, p); 
     15747+       } 
     15748+ 
     15749+       if (!p) 
     15750+               return 0; 
     15751+ 
     15752+       /* copy the data */ 
     15753+       for (; p && len; p = PKTNEXT(osh, p)) { 
     15754+               n = MIN((uint)PKTLEN(osh, p) - offset, (uint)len); 
     15755+               bcopy(PKTDATA(osh, p) + offset, buf, n); 
     15756+               buf += n; 
     15757+               len -= n; 
     15758+               ret += n; 
     15759+               offset = 0; 
     15760+       } 
     15761+ 
     15762+       return ret; 
     15763+} 
     15764+ 
     15765+/* return total length of buffer chain */ 
     15766+uint 
     15767+pkttotlen(osl_t *osh, void *p) 
     15768+{ 
     15769+       uint total; 
     15770+ 
     15771+       total = 0; 
     15772+       for (; p; p = PKTNEXT(osh, p)) 
     15773+               total += PKTLEN(osh, p); 
     15774+       return (total); 
     15775+} 
     15776+ 
     15777+void 
     15778+pktq_init(struct pktq *q, uint maxlen, const uint8 prio_map[]) 
     15779+{ 
     15780+       q->head = q->tail = NULL; 
     15781+       q->maxlen = maxlen; 
     15782+       q->len = 0; 
     15783+       if (prio_map) { 
     15784+               q->priority = TRUE; 
     15785+               bcopy(prio_map, q->prio_map, sizeof(q->prio_map)); 
     15786+       } 
     15787+       else 
     15788+               q->priority = FALSE; 
     15789+} 
     15790+ 
     15791+ 
     15792+/* should always check pktq_full before calling pktenq */ 
     15793+void 
     15794+pktenq(struct pktq *q, void *p, bool lifo) 
     15795+{ 
     15796+       void *next, *prev; 
     15797+ 
     15798+       /* allow 10 pkts slack */ 
     15799+       ASSERT(q->len < (q->maxlen + 10)); 
     15800+ 
     15801+       /* Queueing chains not allowed */ 
     15802+       ASSERT(PKTLINK(p) == NULL); 
     15803+ 
     15804+       /* Queue is empty */ 
     15805+       if (q->tail == NULL) { 
     15806+               ASSERT(q->head == NULL); 
     15807+               q->head = q->tail = p; 
     15808+       } 
     15809+ 
     15810+       /* Insert at head or tail */ 
     15811+       else if (q->priority == FALSE) { 
     15812+               /* Insert at head (LIFO) */ 
     15813+               if (lifo) { 
     15814+                       PKTSETLINK(p, q->head); 
     15815+                       q->head = p; 
     15816+               } 
     15817+               /* Insert at tail (FIFO) */ 
     15818+               else { 
     15819+                       ASSERT(PKTLINK(q->tail) == NULL); 
     15820+                       PKTSETLINK(q->tail, p); 
     15821+                       PKTSETLINK(p, NULL); 
     15822+                       q->tail = p; 
     15823+               } 
     15824+       } 
     15825+ 
     15826+       /* Insert by priority */ 
     15827+       else { 
     15828+               /* legal priorities 0-7 */ 
     15829+               ASSERT(PKTPRIO(p) <= MAXPRIO); 
     15830+ 
     15831+               ASSERT(q->head); 
     15832+               ASSERT(q->tail); 
     15833+               /* Shortcut to insertion at tail */ 
     15834+               if (_pktq_pri(q, PKTPRIO(p)) < _pktq_pri(q, PKTPRIO(q->tail)) || 
     15835+                   (!lifo && _pktq_pri(q, PKTPRIO(p)) <= _pktq_pri(q, PKTPRIO(q->tail)))) { 
     15836+                       prev = q->tail; 
     15837+                       next = NULL; 
     15838+               } 
     15839+               /* Insert at head or in the middle */ 
     15840+               else { 
     15841+                       prev = NULL; 
     15842+                       next = q->head; 
     15843+               } 
     15844+               /* Walk the queue */ 
     15845+               for (; next; prev = next, next = PKTLINK(next)) { 
     15846+                       /* Priority queue invariant */ 
     15847+                       ASSERT(!prev || _pktq_pri(q, PKTPRIO(prev)) >= _pktq_pri(q, PKTPRIO(next))); 
     15848+                       /* Insert at head of string of packets of same priority (LIFO) */ 
     15849+                       if (lifo) { 
     15850+                               if (_pktq_pri(q, PKTPRIO(p)) >= _pktq_pri(q, PKTPRIO(next))) 
     15851+                                       break; 
     15852+                       } 
     15853+                       /* Insert at tail of string of packets of same priority (FIFO) */ 
     15854+                       else { 
     15855+                               if (_pktq_pri(q, PKTPRIO(p)) > _pktq_pri(q, PKTPRIO(next))) 
     15856+                                       break; 
     15857+                       } 
     15858+               } 
     15859+               /* Insert at tail */ 
     15860+               if (next == NULL) { 
     15861+                       ASSERT(PKTLINK(q->tail) == NULL); 
     15862+                       PKTSETLINK(q->tail, p); 
     15863+                       PKTSETLINK(p, NULL); 
     15864+                       q->tail = p; 
     15865+               } 
     15866+               /* Insert in the middle */ 
     15867+               else if (prev) { 
     15868+                       PKTSETLINK(prev, p); 
     15869+                       PKTSETLINK(p, next); 
     15870+               } 
     15871+               /* Insert at head */ 
     15872+               else { 
     15873+                       PKTSETLINK(p, q->head); 
     15874+                       q->head = p; 
     15875+               } 
     15876+       } 
     15877+ 
     15878+       /* List invariants after insertion */ 
     15879+       ASSERT(q->head); 
     15880+       ASSERT(PKTLINK(q->tail) == NULL); 
     15881+ 
     15882+       q->len++; 
     15883+} 
     15884+ 
     15885+/* dequeue packet at head */ 
     15886+void* 
     15887+pktdeq(struct pktq *q) 
     15888+{ 
     15889+       void *p; 
     15890+ 
     15891+       if ((p = q->head)) { 
     15892+               ASSERT(q->tail); 
     15893+               q->head = PKTLINK(p); 
     15894+               PKTSETLINK(p, NULL); 
     15895+               q->len--; 
     15896+               if (q->head == NULL) 
     15897+                       q->tail = NULL; 
     15898+       } 
     15899+       else { 
     15900+               ASSERT(q->tail == NULL); 
     15901+       } 
     15902+ 
     15903+       return (p); 
     15904+} 
     15905+ 
     15906+/* dequeue packet at tail */ 
     15907+void* 
     15908+pktdeqtail(struct pktq *q) 
     15909+{ 
     15910+       void *p; 
     15911+       void *next, *prev; 
     15912+ 
     15913+       if (q->head == q->tail) {  /* last packet on queue or queue empty */ 
     15914+               p = q->head; 
     15915+               q->head = q->tail = NULL; 
     15916+               q->len = 0; 
     15917+               return(p); 
     15918+       } 
     15919+ 
     15920+       /* start walk at head */ 
     15921+       prev = NULL; 
     15922+       next = q->head; 
     15923+ 
     15924+       /* Walk the queue to find prev of q->tail */ 
     15925+       for (; next; prev = next, next = PKTLINK(next)) { 
     15926+               if (next == q->tail) 
     15927+                       break; 
     15928+       } 
     15929+ 
     15930+       ASSERT(prev); 
     15931+ 
     15932+       PKTSETLINK(prev, NULL); 
     15933+       q->tail = prev; 
     15934+       q->len--; 
     15935+       p = next; 
     15936+ 
     15937+       return (p); 
     15938+} 
     15939+#endif 
     15940+ 
     15941+ 
     15942diff -Naur linux.old/drivers/net/wl/hnddma.c linux.dev/drivers/net/wl/hnddma.c 
     15943--- linux.old/drivers/net/wl/hnddma.c   1970-01-01 01:00:00.000000000 +0100 
     15944+++ linux.dev/drivers/net/wl/hnddma.c   2006-04-06 16:58:24.000000000 +0200 
     15945@@ -0,0 +1,1453 @@ 
     15946+/* 
     15947+ * Generic Broadcom Home Networking Division (HND) DMA module. 
     15948+ * This supports the following chips: BCM42xx, 44xx, 47xx . 
     15949+ * 
     15950+ * Copyright 2005, Broadcom Corporation 
     15951+ * All Rights Reserved. 
     15952+ *  
     15953+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY 
     15954+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM 
     15955+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
     15956+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. 
     15957+ * 
     15958+ * $Id$ 
     15959+ */ 
     15960+ 
     15961+#include <typedefs.h> 
     15962+#include <osl.h> 
     15963+#include <bcmendian.h> 
     15964+#include <sbconfig.h> 
     15965+#include <bcmutils.h> 
     15966+#include <bcmdevs.h> 
     15967+#include <sbutils.h> 
     15968+ 
     15969+struct dma_info;       /* forward declaration */ 
     15970+#define di_t struct dma_info 
     15971+ 
     15972+#include "sbhnddma.h" 
     15973+#include "hnddma.h" 
     15974+ 
     15975+/* debug/trace */ 
     15976+#define        DMA_ERROR(args) 
     15977+#define        DMA_TRACE(args) 
     15978+ 
     15979+/* default dma message level (if input msg_level pointer is null in dma_attach()) */ 
     15980+static uint dma_msg_level = 
     15981+       0; 
     15982+ 
     15983+#define        MAXNAMEL        8 
     15984+ 
     15985+/* dma engine software state */ 
     15986+typedef struct dma_info { 
     15987+       hnddma_t        hnddma;         /* exported structure */ 
     15988+       uint            *msg_level;     /* message level pointer */ 
     15989+       char            name[MAXNAMEL]; /* callers name for diag msgs */ 
     15990+        
     15991+       void            *osh;           /* os handle */ 
     15992+       sb_t            *sbh;           /* sb handle */ 
     15993+        
     15994+       bool            dma64;          /* dma64 enabled */ 
     15995+       bool            addrext;        /* this dma engine supports DmaExtendedAddrChanges */ 
     15996+        
     15997+       dma32regs_t     *d32txregs;     /* 32 bits dma tx engine registers */ 
     15998+       dma32regs_t     *d32rxregs;     /* 32 bits dma rx engine registers */ 
     15999+       dma64regs_t     *d64txregs;     /* 64 bits dma tx engine registers */ 
     16000+       dma64regs_t     *d64rxregs;     /* 64 bits dma rx engine registers */ 
     16001+ 
     16002+       uint32          dma64align;     /* either 8k or 4k depends on number of dd */ 
     16003+       dma32dd_t       *txd32;         /* pointer to dma32 tx descriptor ring */ 
     16004+       dma64dd_t       *txd64;         /* pointer to dma64 tx descriptor ring */ 
     16005+       uint            ntxd;           /* # tx descriptors tunable */   
     16006+       uint            txin;           /* index of next descriptor to reclaim */ 
     16007+       uint            txout;          /* index of next descriptor to post */ 
     16008+       uint            txavail;        /* # free tx descriptors */ 
     16009+       void            **txp;          /* pointer to parallel array of pointers to packets */ 
     16010+       ulong           txdpa;          /* physical address of descriptor ring */ 
     16011+       uint            txdalign;       /* #bytes added to alloc'd mem to align txd */ 
     16012+       uint            txdalloc;       /* #bytes allocated for the ring */ 
     16013+ 
     16014+       dma32dd_t       *rxd32;         /* pointer to dma32 rx descriptor ring */ 
     16015+       dma64dd_t       *rxd64;         /* pointer to dma64 rx descriptor ring */ 
     16016+       uint            nrxd;           /* # rx descriptors tunable */   
     16017+       uint            rxin;           /* index of next descriptor to reclaim */ 
     16018+       uint            rxout;          /* index of next descriptor to post */ 
     16019+       void            **rxp;          /* pointer to parallel array of pointers to packets */ 
     16020+       ulong           rxdpa;          /* physical address of descriptor ring */ 
     16021+       uint            rxdalign;       /* #bytes added to alloc'd mem to align rxd */ 
     16022+       uint            rxdalloc;       /* #bytes allocated for the ring */ 
     16023+ 
     16024+       /* tunables */ 
     16025+       uint            rxbufsize;      /* rx buffer size in bytes */ 
     16026+       uint            nrxpost;        /* # rx buffers to keep posted */ 
     16027+       uint            rxoffset;       /* rxcontrol offset */ 
     16028+       uint            ddoffsetlow;    /* add to get dma address of descriptor ring, low 32 bits */ 
     16029+       uint            ddoffsethigh;   /* add to get dma address of descriptor ring, high 32 bits */ 
     16030+       uint            dataoffsetlow;  /* add to get dma address of data buffer, low 32 bits */ 
     16031+       uint            dataoffsethigh; /* add to get dma address of data buffer, high 32 bits */ 
     16032+} dma_info_t; 
     16033+ 
     16034+#ifdef BCMDMA64 
     16035+#define        DMA64_ENAB(di)  ((di)->dma64) 
     16036+#else 
     16037+#define        DMA64_ENAB(di)  (0) 
     16038+#endif 
     16039+ 
     16040+/* descriptor bumping macros */ 
     16041+#define        XXD(x, n)       ((x) & ((n) - 1)) 
     16042+#define        TXD(x)          XXD((x), di->ntxd) 
     16043+#define        RXD(x)          XXD((x), di->nrxd) 
     16044+#define        NEXTTXD(i)      TXD(i + 1) 
     16045+#define        PREVTXD(i)      TXD(i - 1) 
     16046+#define        NEXTRXD(i)      RXD(i + 1) 
     16047+#define        NTXDACTIVE(h, t)        TXD(t - h) 
     16048+#define        NRXDACTIVE(h, t)        RXD(t - h) 
     16049+ 
     16050+/* macros to convert between byte offsets and indexes */ 
     16051+#define        B2I(bytes, type)        ((bytes) / sizeof(type)) 
     16052+#define        I2B(index, type)        ((index) * sizeof(type)) 
     16053+ 
     16054+#define        PCI32ADDR_HIGH          0xc0000000      /* address[31:30] */ 
     16055+#define        PCI32ADDR_HIGH_SHIFT    30 
     16056+ 
     16057+ 
     16058+/* prototypes */ 
     16059+static bool dma_isaddrext(dma_info_t *di); 
     16060+static bool dma_alloc(dma_info_t *di, uint direction); 
     16061+ 
     16062+static bool dma32_alloc(dma_info_t *di, uint direction); 
     16063+static void dma32_txreset(dma_info_t *di); 
     16064+static void dma32_rxreset(dma_info_t *di); 
     16065+static bool dma32_txsuspendedidle(dma_info_t *di); 
     16066+static int  dma32_txfast(dma_info_t *di, void *p0, uint32 coreflags); 
     16067+static void* dma32_getnexttxp(dma_info_t *di, bool forceall); 
     16068+static void* dma32_getnextrxp(dma_info_t *di, bool forceall); 
     16069+static void dma32_txrotate(di_t *di); 
     16070+ 
     16071+/* prototype or stubs */ 
     16072+#ifdef BCMDMA64 
     16073+static bool dma64_alloc(dma_info_t *di, uint direction); 
     16074+static void dma64_txreset(dma_info_t *di); 
     16075+static void dma64_rxreset(dma_info_t *di); 
     16076+static bool dma64_txsuspendedidle(dma_info_t *di); 
     16077+static int  dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags); 
     16078+static void* dma64_getnexttxp(dma_info_t *di, bool forceall); 
     16079+static void* dma64_getnextrxp(dma_info_t *di, bool forceall); 
     16080+static void dma64_txrotate(di_t *di); 
     16081+#else 
     16082+static bool dma64_alloc(dma_info_t *di, uint direction) { return TRUE; } 
     16083+static void dma64_txreset(dma_info_t *di) {} 
     16084+static void dma64_rxreset(dma_info_t *di) {} 
     16085+static bool dma64_txsuspendedidle(dma_info_t *di) { return TRUE;} 
     16086+static int  dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags) { return 0; } 
     16087+static void* dma64_getnexttxp(dma_info_t *di, bool forceall) { return NULL; } 
     16088+static void* dma64_getnextrxp(dma_info_t *di, bool forceall) { return NULL; } 
     16089+static void dma64_txrotate(di_t *di) { return; } 
     16090+#endif 
     16091+ 
     16092+/* old dmaregs struct for compatibility */ 
     16093+typedef volatile struct { 
     16094+       /* transmit channel */ 
     16095+       uint32  xmtcontrol;         /* enable, et al */ 
     16096+       uint32  xmtaddr;            /* descriptor ring base address (4K aligned) */ 
     16097+       uint32  xmtptr;             /* last descriptor posted to chip */ 
     16098+       uint32  xmtstatus;          /* current active descriptor, et al */ 
     16099+        
     16100+       /* receive channel */ 
     16101+       uint32  rcvcontrol;         /* enable, et al */ 
     16102+       uint32  rcvaddr;            /* descriptor ring base address (4K aligned) */ 
     16103+       uint32  rcvptr;             /* last descriptor posted to chip */ 
     16104+       uint32  rcvstatus;          /* current active descriptor, et al */ 
     16105+} dmaregs_t; 
     16106+ 
     16107+void*  
     16108+dma_attach(void *drv, void *osh, char *name, dmaregs_t *regs, uint ntxd, uint nrxd, 
     16109+               uint rxbufsize, uint nrxpost, uint rxoffset, uint ddoffset, uint dataoffset, uint *msg_level) 
     16110+{ 
     16111+       dma_info_t *di; 
     16112+       uint size; 
     16113+       dma32regs_t *dmaregstx = regs; 
     16114+       dma32regs_t *dmaregsrx = dmaregstx + 1; 
     16115+        
     16116+       /* allocate private info structure */ 
     16117+       if ((di = MALLOC(osh, sizeof (dma_info_t))) == NULL) { 
     16118+               return (NULL); 
     16119+       } 
     16120+       bzero((char*)di, sizeof (dma_info_t)); 
     16121+       di->msg_level = msg_level ? msg_level : &dma_msg_level; 
     16122+ 
     16123+       /* check arguments */ 
     16124+       ASSERT(ISPOWEROF2(ntxd)); 
     16125+       ASSERT(ISPOWEROF2(nrxd)); 
     16126+       if (nrxd == 0) 
     16127+               ASSERT(dmaregsrx == NULL); 
     16128+       if (ntxd == 0) 
     16129+               ASSERT(dmaregstx == NULL); 
     16130+ 
     16131+       ASSERT(ntxd <= D32MAXDD); 
     16132+       ASSERT(nrxd <= D32MAXDD); 
     16133+       di->d32txregs = (dma32regs_t *)dmaregstx; 
     16134+       di->d32rxregs = (dma32regs_t *)dmaregsrx; 
     16135+ 
     16136+       /* make a private copy of our callers name */ 
     16137+       strncpy(di->name, name, MAXNAMEL); 
     16138+       di->name[MAXNAMEL-1] = '\0'; 
     16139+ 
     16140+       di->osh = osh; 
     16141+       di->sbh = NULL; 
     16142+ 
     16143+       /* save tunables */ 
     16144+       di->ntxd = ntxd; 
     16145+       di->nrxd = nrxd; 
     16146+       di->rxbufsize = rxbufsize; 
     16147+       di->nrxpost = nrxpost; 
     16148+       di->rxoffset = rxoffset; 
     16149+ 
     16150+       di->ddoffsetlow = ddoffset; 
     16151+       di->dataoffsetlow = dataoffset; 
     16152+       di->ddoffsethigh = 0; 
     16153+       di->dataoffsethigh = 0; 
     16154+        
     16155+       di->addrext = 0; 
     16156+        
     16157+       DMA_TRACE(("%s: dma_attach: osh %p ntxd %d nrxd %d rxbufsize %d nrxpost %d rxoffset %d ddoffset 0x%x dataoffset 0x%x\n",  
     16158+                  name, osh, ntxd, nrxd, rxbufsize, nrxpost, rxoffset, di->ddoffsetlow, di->dataoffsetlow)); 
     16159+ 
     16160+       /* allocate tx packet pointer vector */ 
     16161+       if (ntxd) { 
     16162+               size = ntxd * sizeof (void*); 
     16163+               if ((di->txp = MALLOC(osh, size)) == NULL) { 
     16164+                       DMA_ERROR(("%s: dma_attach: out of tx memory, malloced %d bytes\n", di->name, MALLOCED(osh))); 
     16165+                       goto fail; 
     16166+               } 
     16167+               bzero((char*)di->txp, size); 
     16168+       } 
     16169+ 
     16170+       /* allocate rx packet pointer vector */ 
     16171+       if (nrxd) { 
     16172+               size = nrxd * sizeof (void*); 
     16173+               if ((di->rxp = MALLOC(osh, size)) == NULL) { 
     16174+                       DMA_ERROR(("%s: dma_attach: out of rx memory, malloced %d bytes\n", di->name, MALLOCED(osh))); 
     16175+                       goto fail; 
     16176+               } 
     16177+               bzero((char*)di->rxp, size); 
     16178+       }  
     16179+ 
     16180+       /* allocate transmit descriptor ring, only need ntxd descriptors but it must be aligned */ 
     16181+       if (ntxd) { 
     16182+               if (!dma_alloc(di, DMA_TX)) 
     16183+                       goto fail; 
     16184+       } 
     16185+ 
     16186+       /* allocate receive descriptor ring, only need nrxd descriptors but it must be aligned */ 
     16187+       if (nrxd) { 
     16188+               if (!dma_alloc(di, DMA_RX)) 
     16189+                       goto fail; 
     16190+       } 
     16191+ 
     16192+       if ((di->ddoffsetlow == SB_PCI_DMA) && (di->txdpa > SB_PCI_DMA_SZ) && !di->addrext) { 
     16193+               DMA_ERROR(("%s: dma_attach: txdpa 0x%lx: addrext not supported\n", di->name, di->txdpa)); 
     16194+               goto fail; 
     16195+       } 
     16196+       if ((di->ddoffsetlow == SB_PCI_DMA) && (di->rxdpa > SB_PCI_DMA_SZ) && !di->addrext) { 
     16197+               DMA_ERROR(("%s: dma_attach: rxdpa 0x%lx: addrext not supported\n", di->name, di->rxdpa)); 
     16198+               goto fail; 
     16199+       } 
     16200+ 
     16201+       return ((void*)di); 
     16202+ 
     16203+fail: 
     16204+       dma_detach((void*)di); 
     16205+       return (NULL); 
     16206+} 
     16207+ 
     16208+ 
     16209+static bool 
     16210+dma_alloc(dma_info_t *di, uint direction) 
     16211+{ 
     16212+       if (DMA64_ENAB(di)) { 
     16213+               return dma64_alloc(di, direction); 
     16214+       } else { 
     16215+               return dma32_alloc(di, direction); 
     16216+       } 
     16217+} 
     16218+ 
     16219+/* may be called with core in reset */ 
     16220+void 
     16221+dma_detach(dma_info_t *di) 
     16222+{ 
     16223+       if (di == NULL) 
     16224+               return; 
     16225+ 
     16226+       DMA_TRACE(("%s: dma_detach\n", di->name)); 
     16227+ 
     16228+       /* shouldn't be here if descriptors are unreclaimed */ 
     16229+       ASSERT(di->txin == di->txout); 
     16230+       ASSERT(di->rxin == di->rxout); 
     16231+ 
     16232+       /* free dma descriptor rings */ 
     16233+       if (di->txd32) 
     16234+               DMA_FREE_CONSISTENT(di->osh, ((int8*)di->txd32 - di->txdalign), di->txdalloc, (di->txdpa - di->txdalign)); 
     16235+       if (di->rxd32) 
     16236+               DMA_FREE_CONSISTENT(di->osh, ((int8*)di->rxd32 - di->rxdalign), di->rxdalloc, (di->rxdpa - di->rxdalign)); 
     16237+ 
     16238+       /* free packet pointer vectors */ 
     16239+       if (di->txp) 
     16240+               MFREE(di->osh, (void*)di->txp, (di->ntxd * sizeof (void*))); 
     16241+       if (di->rxp) 
     16242+               MFREE(di->osh, (void*)di->rxp, (di->nrxd * sizeof (void*))); 
     16243+ 
     16244+       /* free our private info structure */ 
     16245+       MFREE(di->osh, (void*)di, sizeof (dma_info_t)); 
     16246+} 
     16247+ 
     16248+/* return TRUE if this dma engine supports DmaExtendedAddrChanges, otherwise FALSE */ 
     16249+static bool 
     16250+dma_isaddrext(dma_info_t *di) 
     16251+{ 
     16252+       uint32 w; 
     16253+ 
     16254+       if (DMA64_ENAB(di)) { 
     16255+               OR_REG(&di->d64txregs->control, D64_XC_AE); 
     16256+               w = R_REG(&di->d32txregs->control); 
     16257+               AND_REG(&di->d32txregs->control, ~D64_XC_AE); 
     16258+               return ((w & XC_AE) == D64_XC_AE); 
     16259+       } else { 
     16260+               OR_REG(&di->d32txregs->control, XC_AE); 
     16261+               w = R_REG(&di->d32txregs->control); 
     16262+               AND_REG(&di->d32txregs->control, ~XC_AE); 
     16263+               return ((w & XC_AE) == XC_AE); 
     16264+       } 
     16265+} 
     16266+ 
     16267+void 
     16268+dma_txreset(dma_info_t *di) 
     16269+{ 
     16270+       DMA_TRACE(("%s: dma_txreset\n", di->name)); 
     16271+ 
     16272+       if (DMA64_ENAB(di)) 
     16273+               dma64_txreset(di); 
     16274+       else 
     16275+               dma32_txreset(di); 
     16276+} 
     16277+ 
     16278+void 
     16279+dma_rxreset(dma_info_t *di) 
     16280+{ 
     16281+       DMA_TRACE(("%s: dma_rxreset\n", di->name)); 
     16282+ 
     16283+       if (DMA64_ENAB(di)) 
     16284+               dma64_rxreset(di); 
     16285+       else 
     16286+               dma32_rxreset(di); 
     16287+} 
     16288+ 
     16289+/* initialize descriptor table base address */ 
     16290+static void 
     16291+dma_ddtable_init(dma_info_t *di, uint direction, ulong pa) 
     16292+{ 
     16293+       if (DMA64_ENAB(di)) { 
     16294+               if (direction == DMA_TX) { 
     16295+                       W_REG(&di->d64txregs->addrlow, pa + di->ddoffsetlow); 
     16296+                       W_REG(&di->d64txregs->addrhigh, di->ddoffsethigh); 
     16297+               } else { 
     16298+                       W_REG(&di->d64rxregs->addrlow, pa + di->ddoffsetlow); 
     16299+                       W_REG(&di->d64rxregs->addrhigh, di->ddoffsethigh); 
     16300+               } 
     16301+       } else { 
     16302+               uint32 offset = di->ddoffsetlow; 
     16303+               if ((offset != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) { 
     16304+                       if (direction == DMA_TX)         
     16305+                               W_REG(&di->d32txregs->addr, (pa + offset)); 
     16306+                       else 
     16307+                               W_REG(&di->d32rxregs->addr, (pa + offset)); 
     16308+               } else {         
     16309+                       /* dma32 address extension */ 
     16310+                       uint32 ae; 
     16311+                       ASSERT(di->addrext); 
     16312+                       ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT; 
     16313+        
     16314+                       if (direction == DMA_TX) { 
     16315+                               W_REG(&di->d32txregs->addr, ((pa & ~PCI32ADDR_HIGH) + offset)); 
     16316+                               SET_REG(&di->d32txregs->control, XC_AE, (ae << XC_AE_SHIFT)); 
     16317+                       } else { 
     16318+                               W_REG(&di->d32rxregs->addr, ((pa & ~PCI32ADDR_HIGH) + offset)); 
     16319+                               SET_REG(&di->d32rxregs->control, RC_AE, (ae << RC_AE_SHIFT)); 
     16320+                       } 
     16321+               } 
     16322+       } 
     16323+} 
     16324+ 
     16325+/* init the tx or rx descriptor */ 
     16326+static INLINE void 
     16327+dma32_dd_upd(dma_info_t *di, dma32dd_t *ddring, ulong pa, uint outidx, uint32 *ctrl) 
     16328+{ 
     16329+       uint offset = di->dataoffsetlow; 
     16330+ 
     16331+       if ((offset != SB_PCI_DMA) || !(pa & PCI32ADDR_HIGH)) { 
     16332+               W_SM(&ddring[outidx].addr, BUS_SWAP32(pa + offset)); 
     16333+               W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*ctrl)); 
     16334+       } else {         
     16335+               /* address extension */ 
     16336+               uint32 ae; 
     16337+               ASSERT(di->addrext); 
     16338+               ae = (pa & PCI32ADDR_HIGH) >> PCI32ADDR_HIGH_SHIFT; 
     16339+ 
     16340+               *ctrl |= (ae << CTRL_AE_SHIFT); 
     16341+               W_SM(&ddring[outidx].addr, BUS_SWAP32((pa & ~PCI32ADDR_HIGH) + offset)); 
     16342+               W_SM(&ddring[outidx].ctrl, BUS_SWAP32(*ctrl)); 
     16343+       } 
     16344+} 
     16345+ 
     16346+/* init the tx or rx descriptor */ 
     16347+static INLINE void 
     16348+dma64_dd_upd(dma_info_t *di, dma64dd_t *ddring, ulong pa, uint outidx, uint32 *flags, uint32 bufcount) 
     16349+{ 
     16350+       uint32 bufaddr_low = pa + di->dataoffsetlow; 
     16351+       uint32 bufaddr_high = 0 + di->dataoffsethigh; 
     16352+ 
     16353+       uint32 ctrl2 = bufcount & D64_CTRL2_BC_MASK; 
     16354+ 
     16355+       W_SM(&ddring[outidx].addrlow, BUS_SWAP32(bufaddr_low)); 
     16356+       W_SM(&ddring[outidx].addrhigh, BUS_SWAP32(bufaddr_high)); 
     16357+       W_SM(&ddring[outidx].ctrl1, BUS_SWAP32(*flags)); 
     16358+       W_SM(&ddring[outidx].ctrl2, BUS_SWAP32(ctrl2)); 
     16359+} 
     16360+ 
     16361+void 
     16362+dma_txinit(dma_info_t *di) 
     16363+{ 
     16364+       DMA_TRACE(("%s: dma_txinit\n", di->name)); 
     16365+ 
     16366+       di->txin = di->txout = 0; 
     16367+       di->txavail = di->ntxd - 1; 
     16368+ 
     16369+       /* clear tx descriptor ring */ 
     16370+       if (DMA64_ENAB(di)) { 
     16371+               BZERO_SM((void*)di->txd64, (di->ntxd * sizeof (dma64dd_t))); 
     16372+               W_REG(&di->d64txregs->control, XC_XE); 
     16373+               dma_ddtable_init(di, DMA_TX, di->txdpa); 
     16374+       } else { 
     16375+               BZERO_SM((void*)di->txd32, (di->ntxd * sizeof (dma32dd_t))); 
     16376+               W_REG(&di->d32txregs->control, XC_XE); 
     16377+               dma_ddtable_init(di, DMA_TX, di->txdpa); 
     16378+       } 
     16379+} 
     16380+ 
     16381+bool 
     16382+dma_txenabled(dma_info_t *di) 
     16383+{ 
     16384+       uint32 xc; 
     16385+        
     16386+       /* If the chip is dead, it is not enabled :-) */ 
     16387+       if (DMA64_ENAB(di)) { 
     16388+               xc = R_REG(&di->d64txregs->control); 
     16389+               return ((xc != 0xffffffff) && (xc & D64_XC_XE)); 
     16390+       } else { 
     16391+               xc = R_REG(&di->d32txregs->control); 
     16392+               return ((xc != 0xffffffff) && (xc & XC_XE)); 
     16393+       } 
     16394+} 
     16395+ 
     16396+void 
     16397+dma_txsuspend(dma_info_t *di) 
     16398+{ 
     16399+       DMA_TRACE(("%s: dma_txsuspend\n", di->name)); 
     16400+       if (DMA64_ENAB(di)) 
     16401+               OR_REG(&di->d64txregs->control, D64_XC_SE); 
     16402+       else 
     16403+               OR_REG(&di->d32txregs->control, XC_SE); 
     16404+} 
     16405+ 
     16406+void 
     16407+dma_txresume(dma_info_t *di) 
     16408+{ 
     16409+       DMA_TRACE(("%s: dma_txresume\n", di->name)); 
     16410+       if (DMA64_ENAB(di)) 
     16411+               AND_REG(&di->d64txregs->control, ~D64_XC_SE); 
     16412+       else 
     16413+               AND_REG(&di->d32txregs->control, ~XC_SE); 
     16414+} 
     16415+ 
     16416+bool 
     16417+dma_txsuspendedidle(dma_info_t *di) 
     16418+{ 
     16419+       if (DMA64_ENAB(di)) 
     16420+               return dma64_txsuspendedidle(di); 
     16421+       else 
     16422+               return dma32_txsuspendedidle(di); 
     16423+} 
     16424+ 
     16425+bool 
     16426+dma_txsuspended(dma_info_t *di) 
     16427+{ 
     16428+       if (DMA64_ENAB(di)) 
     16429+               return ((R_REG(&di->d64txregs->control) & D64_XC_SE) == D64_XC_SE); 
     16430+       else 
     16431+               return ((R_REG(&di->d32txregs->control) & XC_SE) == XC_SE); 
     16432+} 
     16433+ 
     16434+bool 
     16435+dma_txstopped(dma_info_t *di) 
     16436+{ 
     16437+       if (DMA64_ENAB(di)) 
     16438+               return ((R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_STOPPED); 
     16439+       else 
     16440+               return ((R_REG(&di->d32txregs->status) & XS_XS_MASK) == XS_XS_STOPPED); 
     16441+} 
     16442+ 
     16443+bool 
     16444+dma_rxstopped(dma_info_t *di) 
     16445+{ 
     16446+       if (DMA64_ENAB(di)) 
     16447+               return ((R_REG(&di->d64rxregs->status0) & D64_RS0_RS_MASK) == D64_RS0_RS_STOPPED); 
     16448+       else 
     16449+               return ((R_REG(&di->d32rxregs->status) & RS_RS_MASK) == RS_RS_STOPPED); 
     16450+} 
     16451+ 
     16452+void 
     16453+dma_fifoloopbackenable(dma_info_t *di) 
     16454+{ 
     16455+       DMA_TRACE(("%s: dma_fifoloopbackenable\n", di->name)); 
     16456+       if (DMA64_ENAB(di)) 
     16457+               OR_REG(&di->d64txregs->control, D64_XC_LE); 
     16458+       else 
     16459+               OR_REG(&di->d32txregs->control, XC_LE); 
     16460+} 
     16461+ 
     16462+void 
     16463+dma_rxinit(dma_info_t *di) 
     16464+{ 
     16465+       DMA_TRACE(("%s: dma_rxinit\n", di->name)); 
     16466+ 
     16467+       di->rxin = di->rxout = 0; 
     16468+ 
     16469+       /* clear rx descriptor ring */ 
     16470+       if (DMA64_ENAB(di)) { 
     16471+                BZERO_SM((void*)di->rxd64, (di->nrxd * sizeof (dma64dd_t))); 
     16472+               dma_rxenable(di); 
     16473+               dma_ddtable_init(di, DMA_RX, di->rxdpa); 
     16474+       } else { 
     16475+               BZERO_SM((void*)di->rxd32, (di->nrxd * sizeof (dma32dd_t))); 
     16476+               dma_rxenable(di); 
     16477+               dma_ddtable_init(di, DMA_RX, di->rxdpa); 
     16478+       } 
     16479+} 
     16480+ 
     16481+void 
     16482+dma_rxenable(dma_info_t *di) 
     16483+{ 
     16484+       DMA_TRACE(("%s: dma_rxenable\n", di->name)); 
     16485+       if (DMA64_ENAB(di)) 
     16486+               W_REG(&di->d64rxregs->control, ((di->rxoffset << D64_RC_RO_SHIFT) | D64_RC_RE)); 
     16487+       else 
     16488+               W_REG(&di->d32rxregs->control, ((di->rxoffset << RC_RO_SHIFT) | RC_RE)); 
     16489+} 
     16490+ 
     16491+bool 
     16492+dma_rxenabled(dma_info_t *di) 
     16493+{ 
     16494+       uint32 rc; 
     16495+ 
     16496+       if (DMA64_ENAB(di)) {  
     16497+               rc = R_REG(&di->d64rxregs->control); 
     16498+               return ((rc != 0xffffffff) && (rc & D64_RC_RE)); 
     16499+       } else { 
     16500+               rc = R_REG(&di->d32rxregs->control); 
     16501+               return ((rc != 0xffffffff) && (rc & RC_RE)); 
     16502+       } 
     16503+} 
     16504+ 
     16505+ 
     16506+/* !! tx entry routine */ 
     16507+int 
     16508+dma_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
     16509+{ 
     16510+       if (DMA64_ENAB(di)) {  
     16511+               return dma64_txfast(di, p0, coreflags); 
     16512+       } else { 
     16513+               return dma32_txfast(di, p0, coreflags); 
     16514+       } 
     16515+} 
     16516+ 
     16517+/* !! rx entry routine, returns a pointer to the next frame received, or NULL if there are no more */ 
     16518+void* 
     16519+dma_rx(dma_info_t *di) 
     16520+{ 
     16521+       void *p; 
     16522+       uint len; 
     16523+       int skiplen = 0; 
     16524+ 
     16525+       while ((p = dma_getnextrxp(di, FALSE))) { 
     16526+               /* skip giant packets which span multiple rx descriptors */ 
     16527+               if (skiplen > 0) { 
     16528+                       skiplen -= di->rxbufsize; 
     16529+                       if (skiplen < 0) 
     16530+                               skiplen = 0; 
     16531+                       PKTFREE(di->osh, p, FALSE); 
     16532+                       continue; 
     16533+               } 
     16534+ 
     16535+               len = ltoh16(*(uint16*)(PKTDATA(di->osh, p))); 
     16536+               DMA_TRACE(("%s: dma_rx len %d\n", di->name, len)); 
     16537+ 
     16538+               /* bad frame length check */ 
     16539+               if (len > (di->rxbufsize - di->rxoffset)) { 
     16540+                       DMA_ERROR(("%s: dma_rx: bad frame length (%d)\n", di->name, len)); 
     16541+                       if (len > 0) 
     16542+                               skiplen = len - (di->rxbufsize - di->rxoffset); 
     16543+                       PKTFREE(di->osh, p, FALSE); 
     16544+                       di->hnddma.rxgiants++; 
     16545+                       continue; 
     16546+               } 
     16547+ 
     16548+               /* set actual length */ 
     16549+               PKTSETLEN(di->osh, p, (di->rxoffset + len)); 
     16550+ 
     16551+               break; 
     16552+       } 
     16553+ 
     16554+       return (p); 
     16555+} 
     16556+ 
     16557+/* post receive buffers */ 
     16558+void 
     16559+dma_rxfill(dma_info_t *di) 
     16560+{ 
     16561+       void *p; 
     16562+       uint rxin, rxout; 
     16563+       uint32 ctrl; 
     16564+       uint n; 
     16565+       uint i; 
     16566+       uint32 pa; 
     16567+       uint rxbufsize; 
     16568+ 
     16569+       /* 
     16570+        * Determine how many receive buffers we're lacking 
     16571+        * from the full complement, allocate, initialize, 
     16572+        * and post them, then update the chip rx lastdscr. 
     16573+        */ 
     16574+ 
     16575+       rxin = di->rxin; 
     16576+       rxout = di->rxout; 
     16577+       rxbufsize = di->rxbufsize; 
     16578+ 
     16579+       n = di->nrxpost - NRXDACTIVE(rxin, rxout); 
     16580+ 
     16581+       DMA_TRACE(("%s: dma_rxfill: post %d\n", di->name, n)); 
     16582+ 
     16583+       for (i = 0; i < n; i++) { 
     16584+               if ((p = PKTGET(di->osh, rxbufsize, FALSE)) == NULL) { 
     16585+                       DMA_ERROR(("%s: dma_rxfill: out of rxbufs\n", di->name)); 
     16586+                       di->hnddma.rxnobuf++; 
     16587+                       break; 
     16588+               } 
     16589+ 
     16590+               /* Do a cached write instead of uncached write since DMA_MAP 
     16591+                * will flush the cache. */ 
     16592+               *(uint32*)(PKTDATA(di->osh, p)) = 0; 
     16593+ 
     16594+               pa = (uint32) DMA_MAP(di->osh, PKTDATA(di->osh, p), rxbufsize, DMA_RX, p); 
     16595+               ASSERT(ISALIGNED(pa, 4)); 
     16596+ 
     16597+               /* save the free packet pointer */ 
     16598+               ASSERT(di->rxp[rxout] == NULL); 
     16599+               di->rxp[rxout] = p; 
     16600+ 
     16601+               if (DMA64_ENAB(di)) { 
     16602+                       /* prep the descriptor control value */ 
     16603+                       if (rxout == (di->nrxd - 1)) 
     16604+                               ctrl = CTRL_EOT; 
     16605+ 
     16606+                       dma64_dd_upd(di, di->rxd64, pa, rxout, &ctrl, rxbufsize); 
     16607+               } else { 
     16608+                       /* prep the descriptor control value */ 
     16609+                       ctrl = rxbufsize; 
     16610+                       if (rxout == (di->nrxd - 1)) 
     16611+                               ctrl |= CTRL_EOT; 
     16612+                       dma32_dd_upd(di, di->rxd32, pa, rxout, &ctrl); 
     16613+               } 
     16614+ 
     16615+               rxout = NEXTRXD(rxout); 
     16616+       } 
     16617+ 
     16618+       di->rxout = rxout; 
     16619+ 
     16620+       /* update the chip lastdscr pointer */ 
     16621+       if (DMA64_ENAB(di)) { 
     16622+               W_REG(&di->d64rxregs->ptr, I2B(rxout, dma64dd_t)); 
     16623+       } else { 
     16624+               W_REG(&di->d32rxregs->ptr, I2B(rxout, dma32dd_t)); 
     16625+       } 
     16626+} 
     16627+ 
     16628+void 
     16629+dma_txreclaim(dma_info_t *di, bool forceall) 
     16630+{ 
     16631+       void *p; 
     16632+ 
     16633+       DMA_TRACE(("%s: dma_txreclaim %s\n", di->name, forceall ? "all" : "")); 
     16634+ 
     16635+       while ((p = dma_getnexttxp(di, forceall))) 
     16636+               PKTFREE(di->osh, p, TRUE); 
     16637+} 
     16638+ 
     16639+/* 
     16640+ * Reclaim next completed txd (txds if using chained buffers) and 
     16641+ * return associated packet. 
     16642+ * If 'force' is true, reclaim txd(s) and return associated packet 
     16643+ * regardless of the value of the hardware "curr" pointer. 
     16644+ */ 
     16645+void* 
     16646+dma_getnexttxp(dma_info_t *di, bool forceall) 
     16647+{ 
     16648+       if (DMA64_ENAB(di)) { 
     16649+               return dma64_getnexttxp(di, forceall); 
     16650+       } else { 
     16651+               return dma32_getnexttxp(di, forceall); 
     16652+       } 
     16653+} 
     16654+        
     16655+/* like getnexttxp but no reclaim */ 
     16656+void* 
     16657+dma_peeknexttxp(dma_info_t *di) 
     16658+{ 
     16659+       uint end, i; 
     16660+ 
     16661+       if (DMA64_ENAB(di)) { 
     16662+               end = B2I(R_REG(&di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t); 
     16663+       } else { 
     16664+               end = B2I(R_REG(&di->d32txregs->status) & XS_CD_MASK, dma32dd_t); 
     16665+       } 
     16666+ 
     16667+       for (i = di->txin; i != end; i = NEXTTXD(i)) 
     16668+               if (di->txp[i]) 
     16669+                       return (di->txp[i]); 
     16670+ 
     16671+       return (NULL); 
     16672+} 
     16673+ 
     16674+/* 
     16675+ * Rotate all active tx dma ring entries "forward" by (ActiveDescriptor - txin). 
     16676+ */ 
     16677+void 
     16678+dma_txrotate(di_t *di) 
     16679+{ 
     16680+       if (DMA64_ENAB(di)) { 
     16681+               dma64_txrotate(di); 
     16682+       } else { 
     16683+               dma32_txrotate(di); 
     16684+       } 
     16685+} 
     16686+ 
     16687+void 
     16688+dma_rxreclaim(dma_info_t *di) 
     16689+{ 
     16690+       void *p; 
     16691+ 
     16692+       DMA_TRACE(("%s: dma_rxreclaim\n", di->name)); 
     16693+ 
     16694+       while ((p = dma_getnextrxp(di, TRUE))) 
     16695+               PKTFREE(di->osh, p, FALSE); 
     16696+} 
     16697+ 
     16698+void * 
     16699+dma_getnextrxp(dma_info_t *di, bool forceall) 
     16700+{ 
     16701+       if (DMA64_ENAB(di)) { 
     16702+               return dma64_getnextrxp(di, forceall); 
     16703+       } else { 
     16704+               return dma32_getnextrxp(di, forceall); 
     16705+       } 
     16706+} 
     16707+ 
     16708+uintptr 
     16709+dma_getvar(dma_info_t *di, char *name) 
     16710+{ 
     16711+       if (!strcmp(name, "&txavail")) 
     16712+               return ((uintptr) &di->txavail); 
     16713+       else { 
     16714+               ASSERT(0); 
     16715+       } 
     16716+       return (0); 
     16717+} 
     16718+ 
     16719+void 
     16720+dma_txblock(dma_info_t *di) 
     16721+{ 
     16722+       di->txavail = 0; 
     16723+} 
     16724+ 
     16725+void 
     16726+dma_txunblock(dma_info_t *di) 
     16727+{ 
     16728+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     16729+} 
     16730+ 
     16731+uint 
     16732+dma_txactive(dma_info_t *di) 
     16733+{ 
     16734+       return (NTXDACTIVE(di->txin, di->txout)); 
     16735+} 
     16736+        
     16737+void 
     16738+dma_rxpiomode(dma32regs_t *regs) 
     16739+{ 
     16740+       W_REG(&regs->control, RC_FM); 
     16741+} 
     16742+ 
     16743+void 
     16744+dma_txpioloopback(dma32regs_t *regs) 
     16745+{ 
     16746+       OR_REG(&regs->control, XC_LE); 
     16747+} 
     16748+ 
     16749+ 
     16750+ 
     16751+ 
     16752+/*** 32 bits DMA non-inline functions ***/ 
     16753+static bool 
     16754+dma32_alloc(dma_info_t *di, uint direction) 
     16755+{ 
     16756+       uint size; 
     16757+       uint ddlen; 
     16758+       void *va; 
     16759+ 
     16760+       ddlen = sizeof (dma32dd_t); 
     16761+ 
     16762+       size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen); 
     16763+ 
     16764+       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, D32RINGALIGN)) 
     16765+               size += D32RINGALIGN; 
     16766+ 
     16767+ 
     16768+       if (direction == DMA_TX) { 
     16769+               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->txdpa)) == NULL) { 
     16770+                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(ntxd) failed\n", di->name)); 
     16771+                       return FALSE; 
     16772+               } 
     16773+ 
     16774+               di->txd32 = (dma32dd_t*) ROUNDUP((uintptr)va, D32RINGALIGN); 
     16775+               di->txdalign = (uint)((int8*)di->txd32 - (int8*)va); 
     16776+               di->txdpa += di->txdalign; 
     16777+               di->txdalloc = size; 
     16778+               ASSERT(ISALIGNED((uintptr)di->txd32, D32RINGALIGN)); 
     16779+       } else { 
     16780+               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->rxdpa)) == NULL) { 
     16781+                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(nrxd) failed\n", di->name)); 
     16782+                       return FALSE; 
     16783+               } 
     16784+               di->rxd32 = (dma32dd_t*) ROUNDUP((uintptr)va, D32RINGALIGN); 
     16785+               di->rxdalign = (uint)((int8*)di->rxd32 - (int8*)va); 
     16786+               di->rxdpa += di->rxdalign; 
     16787+               di->rxdalloc = size; 
     16788+               ASSERT(ISALIGNED((uintptr)di->rxd32, D32RINGALIGN)); 
     16789+       } 
     16790+ 
     16791+       return TRUE; 
     16792+} 
     16793+ 
     16794+static void  
     16795+dma32_txreset(dma_info_t *di) 
     16796+{ 
     16797+       uint32 status; 
     16798+ 
     16799+       /* suspend tx DMA first */ 
     16800+       W_REG(&di->d32txregs->control, XC_SE); 
     16801+       SPINWAIT((status = (R_REG(&di->d32txregs->status) & XS_XS_MASK)) != XS_XS_DISABLED && 
     16802+                status != XS_XS_IDLE && 
     16803+                status != XS_XS_STOPPED, 
     16804+                10000); 
     16805+ 
     16806+       W_REG(&di->d32txregs->control, 0); 
     16807+       SPINWAIT((status = (R_REG(&di->d32txregs->status) & XS_XS_MASK)) != XS_XS_DISABLED, 
     16808+                10000); 
     16809+ 
     16810+       if (status != XS_XS_DISABLED) { 
     16811+               DMA_ERROR(("%s: dma_txreset: dma cannot be stopped\n", di->name)); 
     16812+       } 
     16813+ 
     16814+       /* wait for the last transaction to complete */ 
     16815+       OSL_DELAY(300); 
     16816+} 
     16817+ 
     16818+static void  
     16819+dma32_rxreset(dma_info_t *di) 
     16820+{ 
     16821+       uint32 status; 
     16822+ 
     16823+       W_REG(&di->d32rxregs->control, 0); 
     16824+       SPINWAIT((status = (R_REG(&di->d32rxregs->status) & RS_RS_MASK)) != RS_RS_DISABLED, 
     16825+                10000); 
     16826+ 
     16827+       if (status != RS_RS_DISABLED) { 
     16828+               DMA_ERROR(("%s: dma_rxreset: dma cannot be stopped\n", di->name)); 
     16829+       } 
     16830+} 
     16831+ 
     16832+static bool 
     16833+dma32_txsuspendedidle(dma_info_t *di) 
     16834+{ 
     16835+       if (!(R_REG(&di->d32txregs->control) & XC_SE)) 
     16836+               return 0; 
     16837+        
     16838+       if ((R_REG(&di->d32txregs->status) & XS_XS_MASK) != XS_XS_IDLE) 
     16839+               return 0; 
     16840+ 
     16841+       OSL_DELAY(2); 
     16842+       return ((R_REG(&di->d32txregs->status) & XS_XS_MASK) == XS_XS_IDLE); 
     16843+} 
     16844+ 
     16845+/* 
     16846+ * supports full 32bit dma engine buffer addressing so 
     16847+ * dma buffers can cross 4 Kbyte page boundaries. 
     16848+ */ 
     16849+static int 
     16850+dma32_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
     16851+{ 
     16852+       void *p, *next; 
     16853+       uchar *data; 
     16854+       uint len; 
     16855+       uint txout; 
     16856+       uint32 ctrl; 
     16857+       uint32 pa;       
     16858+ 
     16859+       DMA_TRACE(("%s: dma_txfast\n", di->name)); 
     16860+ 
     16861+       txout = di->txout; 
     16862+       ctrl = 0; 
     16863+ 
     16864+       /* 
     16865+        * Walk the chain of packet buffers 
     16866+        * allocating and initializing transmit descriptor entries. 
     16867+        */ 
     16868+       for (p = p0; p; p = next) { 
     16869+               data = PKTDATA(di->osh, p); 
     16870+               len = PKTLEN(di->osh, p); 
     16871+               next = PKTNEXT(di->osh, p); 
     16872+ 
     16873+               /* return nonzero if out of tx descriptors */ 
     16874+               if (NEXTTXD(txout) == di->txin) 
     16875+                       goto outoftxd; 
     16876+ 
     16877+               if (len == 0) 
     16878+                       continue; 
     16879+ 
     16880+               /* get physical address of buffer start */ 
     16881+               pa = (uint32) DMA_MAP(di->osh, data, len, DMA_TX, p); 
     16882+ 
     16883+               /* build the descriptor control value */ 
     16884+               ctrl = len & CTRL_BC_MASK; 
     16885+ 
     16886+               ctrl |= coreflags; 
     16887+                
     16888+               if (p == p0) 
     16889+                       ctrl |= CTRL_SOF; 
     16890+               if (next == NULL) 
     16891+                       ctrl |= (CTRL_IOC | CTRL_EOF); 
     16892+               if (txout == (di->ntxd - 1)) 
     16893+                       ctrl |= CTRL_EOT; 
     16894+ 
     16895+               if (DMA64_ENAB(di)) { 
     16896+                       dma64_dd_upd(di, di->txd64, pa, txout, &ctrl, len); 
     16897+               } else { 
     16898+                       dma32_dd_upd(di, di->txd32, pa, txout, &ctrl); 
     16899+               } 
     16900+ 
     16901+               ASSERT(di->txp[txout] == NULL); 
     16902+ 
     16903+               txout = NEXTTXD(txout); 
     16904+       } 
     16905+ 
     16906+       /* if last txd eof not set, fix it */ 
     16907+       if (!(ctrl & CTRL_EOF)) 
     16908+               W_SM(&di->txd32[PREVTXD(txout)].ctrl, BUS_SWAP32(ctrl | CTRL_IOC | CTRL_EOF)); 
     16909+ 
     16910+       /* save the packet */ 
     16911+       di->txp[PREVTXD(txout)] = p0; 
     16912+ 
     16913+       /* bump the tx descriptor index */ 
     16914+       di->txout = txout; 
     16915+ 
     16916+       /* kick the chip */ 
     16917+       if (DMA64_ENAB(di)) { 
     16918+               W_REG(&di->d64txregs->ptr, I2B(txout, dma64dd_t)); 
     16919+       } else { 
     16920+               W_REG(&di->d32txregs->ptr, I2B(txout, dma32dd_t)); 
     16921+       } 
     16922+ 
     16923+       /* tx flow control */ 
     16924+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     16925+ 
     16926+       return (0); 
     16927+ 
     16928+ outoftxd: 
     16929+       DMA_ERROR(("%s: dma_txfast: out of txds\n", di->name)); 
     16930+       PKTFREE(di->osh, p0, TRUE); 
     16931+       di->txavail = 0; 
     16932+       di->hnddma.txnobuf++; 
     16933+       return (-1); 
     16934+} 
     16935+ 
     16936+static void* 
     16937+dma32_getnexttxp(dma_info_t *di, bool forceall) 
     16938+{ 
     16939+       uint start, end, i; 
     16940+       void *txp; 
     16941+ 
     16942+       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : "")); 
     16943+ 
     16944+       txp = NULL; 
     16945+ 
     16946+       start = di->txin; 
     16947+       if (forceall) 
     16948+               end = di->txout; 
     16949+       else 
     16950+               end = B2I(R_REG(&di->d32txregs->status) & XS_CD_MASK, dma32dd_t); 
     16951+ 
     16952+       if ((start == 0) && (end > di->txout)) 
     16953+               goto bogus; 
     16954+ 
     16955+       for (i = start; i != end && !txp; i = NEXTTXD(i)) { 
     16956+               DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->txd32[i].addr)) - di->dataoffsetlow), 
     16957+                         (BUS_SWAP32(R_SM(&di->txd32[i].ctrl)) & CTRL_BC_MASK), DMA_TX, di->txp[i]); 
     16958+ 
     16959+               W_SM(&di->txd32[i].addr, 0xdeadbeef); 
     16960+               txp = di->txp[i]; 
     16961+               di->txp[i] = NULL; 
     16962+       } 
     16963+ 
     16964+       di->txin = i; 
     16965+ 
     16966+       /* tx flow control */ 
     16967+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     16968+ 
     16969+       return (txp); 
     16970+ 
     16971+bogus: 
     16972+/* 
     16973+       DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n", 
     16974+               start, end, di->txout, forceall)); 
     16975+*/ 
     16976+       return (NULL); 
     16977+} 
     16978+ 
     16979+static void * 
     16980+dma32_getnextrxp(dma_info_t *di, bool forceall) 
     16981+{ 
     16982+       uint i; 
     16983+       void *rxp; 
     16984+ 
     16985+       /* if forcing, dma engine must be disabled */ 
     16986+       ASSERT(!forceall || !dma_rxenabled(di)); 
     16987+ 
     16988+       i = di->rxin; 
     16989+ 
     16990+       /* return if no packets posted */ 
     16991+       if (i == di->rxout) 
     16992+               return (NULL); 
     16993+ 
     16994+       /* ignore curr if forceall */ 
     16995+       if (!forceall && (i == B2I(R_REG(&di->d32rxregs->status) & RS_CD_MASK, dma32dd_t))) 
     16996+               return (NULL); 
     16997+ 
     16998+       /* get the packet pointer that corresponds to the rx descriptor */ 
     16999+       rxp = di->rxp[i]; 
     17000+       ASSERT(rxp); 
     17001+       di->rxp[i] = NULL; 
     17002+ 
     17003+       /* clear this packet from the descriptor ring */ 
     17004+       DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->rxd32[i].addr)) - di->dataoffsetlow), 
     17005+                 di->rxbufsize, DMA_RX, rxp); 
     17006+       W_SM(&di->rxd32[i].addr, 0xdeadbeef); 
     17007+ 
     17008+       di->rxin = NEXTRXD(i); 
     17009+ 
     17010+       return (rxp); 
     17011+} 
     17012+ 
     17013+static void 
     17014+dma32_txrotate(di_t *di) 
     17015+{ 
     17016+       uint ad; 
     17017+       uint nactive; 
     17018+       uint rot; 
     17019+       uint old, new; 
     17020+       uint32 w; 
     17021+       uint first, last; 
     17022+ 
     17023+       ASSERT(dma_txsuspendedidle(di)); 
     17024+ 
     17025+       nactive = dma_txactive(di); 
     17026+       ad = B2I(((R_REG(&di->d32txregs->status) & XS_AD_MASK) >> XS_AD_SHIFT), dma32dd_t); 
     17027+       rot = TXD(ad - di->txin); 
     17028+ 
     17029+       ASSERT(rot < di->ntxd); 
     17030+ 
     17031+       /* full-ring case is a lot harder - don't worry about this */ 
     17032+       if (rot >= (di->ntxd - nactive)) { 
     17033+               DMA_ERROR(("%s: dma_txrotate: ring full - punt\n", di->name)); 
     17034+               return; 
     17035+       } 
     17036+ 
     17037+       first = di->txin; 
     17038+       last = PREVTXD(di->txout); 
     17039+ 
     17040+       /* move entries starting at last and moving backwards to first */ 
     17041+       for (old = last; old != PREVTXD(first); old = PREVTXD(old)) { 
     17042+               new = TXD(old + rot); 
     17043+ 
     17044+               /* 
     17045+                * Move the tx dma descriptor. 
     17046+                * EOT is set only in the last entry in the ring. 
     17047+                */ 
     17048+               w = R_SM(&di->txd32[old].ctrl) & ~CTRL_EOT; 
     17049+               if (new == (di->ntxd - 1)) 
     17050+                       w |= CTRL_EOT; 
     17051+               W_SM(&di->txd32[new].ctrl, w); 
     17052+               W_SM(&di->txd32[new].addr, R_SM(&di->txd32[old].addr)); 
     17053+ 
     17054+               /* zap the old tx dma descriptor address field */ 
     17055+               W_SM(&di->txd32[old].addr, 0xdeadbeef); 
     17056+ 
     17057+               /* move the corresponding txp[] entry */ 
     17058+               ASSERT(di->txp[new] == NULL); 
     17059+               di->txp[new] = di->txp[old]; 
     17060+               di->txp[old] = NULL; 
     17061+       } 
     17062+ 
     17063+       /* update txin and txout */ 
     17064+       di->txin = ad; 
     17065+       di->txout = TXD(di->txout + rot); 
     17066+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     17067+ 
     17068+       /* kick the chip */ 
     17069+       W_REG(&di->d32txregs->ptr, I2B(di->txout, dma32dd_t)); 
     17070+} 
     17071+ 
     17072+/*** 64 bits DMA non-inline functions ***/ 
     17073+ 
     17074+#ifdef BCMDMA64 
     17075+ 
     17076+static bool 
     17077+dma64_alloc(dma_info_t *di, uint direction) 
     17078+{ 
     17079+       uint size; 
     17080+       uint ddlen; 
     17081+       uint32 alignbytes; 
     17082+       void *va; 
     17083+ 
     17084+       ddlen = sizeof (dma64dd_t); 
     17085+ 
     17086+       size = (direction == DMA_TX) ? (di->ntxd * ddlen) : (di->nrxd * ddlen); 
     17087+ 
     17088+       alignbytes = di->dma64align; 
     17089+ 
     17090+       if (!ISALIGNED(DMA_CONSISTENT_ALIGN, alignbytes)) 
     17091+               size += alignbytes; 
     17092+ 
     17093+ 
     17094+       if (direction == DMA_TX) { 
     17095+               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->txdpa)) == NULL) { 
     17096+                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(ntxd) failed\n", di->name)); 
     17097+                       return FALSE; 
     17098+               } 
     17099+ 
     17100+               di->txd64 = (dma64dd_t*) ROUNDUP((uintptr)va, alignbytes); 
     17101+               di->txdalign = (uint)((int8*)di->txd64 - (int8*)va); 
     17102+               di->txdpa += di->txdalign; 
     17103+               di->txdalloc = size; 
     17104+               ASSERT(ISALIGNED((uintptr)di->txd64, alignbytes)); 
     17105+       } else { 
     17106+               if ((va = DMA_ALLOC_CONSISTENT(di->osh, size, &di->rxdpa)) == NULL) { 
     17107+                       DMA_ERROR(("%s: dma_attach: DMA_ALLOC_CONSISTENT(nrxd) failed\n", di->name)); 
     17108+                       return FALSE; 
     17109+               } 
     17110+               di->rxd64 = (dma64dd_t*) ROUNDUP((uintptr)va, alignbytes); 
     17111+               di->rxdalign = (uint)((int8*)di->rxd64 - (int8*)va); 
     17112+               di->rxdpa += di->rxdalign; 
     17113+               di->rxdalloc = size; 
     17114+               ASSERT(ISALIGNED((uintptr)di->rxd64, alignbytes)); 
     17115+       } 
     17116+ 
     17117+       return TRUE; 
     17118+} 
     17119+ 
     17120+static void  
     17121+dma64_txreset(dma_info_t *di) 
     17122+{ 
     17123+       uint32 status; 
     17124+ 
     17125+       /* suspend tx DMA first */ 
     17126+       W_REG(&di->d64txregs->control, D64_XC_SE); 
     17127+       SPINWAIT((status = (R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK)) != D64_XS0_XS_DISABLED && 
     17128+                status != D64_XS0_XS_IDLE && 
     17129+                status != D64_XS0_XS_STOPPED, 
     17130+                10000); 
     17131+ 
     17132+       W_REG(&di->d64txregs->control, 0); 
     17133+       SPINWAIT((status = (R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK)) != D64_XS0_XS_DISABLED, 
     17134+                10000); 
     17135+ 
     17136+       if (status != D64_XS0_XS_DISABLED) { 
     17137+               DMA_ERROR(("%s: dma_txreset: dma cannot be stopped\n", di->name)); 
     17138+       } 
     17139+ 
     17140+       /* wait for the last transaction to complete */ 
     17141+       OSL_DELAY(300); 
     17142+} 
     17143+ 
     17144+static void  
     17145+dma64_rxreset(dma_info_t *di) 
     17146+{ 
     17147+       uint32 status; 
     17148+ 
     17149+       W_REG(&di->d64rxregs->control, 0); 
     17150+       SPINWAIT((status = (R_REG(&di->d64rxregs->status0) & D64_RS0_RS_MASK)) != D64_RS0_RS_DISABLED, 
     17151+                10000); 
     17152+ 
     17153+       if (status != D64_RS0_RS_DISABLED) { 
     17154+               DMA_ERROR(("%s: dma_rxreset: dma cannot be stopped\n", di->name)); 
     17155+       } 
     17156+} 
     17157+ 
     17158+static bool 
     17159+dma64_txsuspendedidle(dma_info_t *di) 
     17160+{ 
     17161+ 
     17162+       if (!(R_REG(&di->d64txregs->control) & D64_XC_SE)) 
     17163+               return 0; 
     17164+        
     17165+       if ((R_REG(&di->d64txregs->status0) & D64_XS0_XS_MASK) == D64_XS0_XS_IDLE) 
     17166+               return 1; 
     17167+ 
     17168+       return 0; 
     17169+} 
     17170+ 
     17171+/* 
     17172+ * supports full 32bit dma engine buffer addressing so 
     17173+ * dma buffers can cross 4 Kbyte page boundaries. 
     17174+ */ 
     17175+static int 
     17176+dma64_txfast(dma_info_t *di, void *p0, uint32 coreflags) 
     17177+{ 
     17178+       void *p, *next; 
     17179+       uchar *data; 
     17180+       uint len; 
     17181+       uint txout; 
     17182+       uint32 flags; 
     17183+       uint32 pa;       
     17184+ 
     17185+       DMA_TRACE(("%s: dma_txfast\n", di->name)); 
     17186+ 
     17187+       txout = di->txout; 
     17188+       flags = 0; 
     17189+ 
     17190+       /* 
     17191+        * Walk the chain of packet buffers 
     17192+        * allocating and initializing transmit descriptor entries. 
     17193+        */ 
     17194+       for (p = p0; p; p = next) { 
     17195+               data = PKTDATA(di->osh, p); 
     17196+               len = PKTLEN(di->osh, p); 
     17197+               next = PKTNEXT(di->osh, p); 
     17198+ 
     17199+               /* return nonzero if out of tx descriptors */ 
     17200+               if (NEXTTXD(txout) == di->txin) 
     17201+                       goto outoftxd; 
     17202+ 
     17203+               if (len == 0) 
     17204+                       continue; 
     17205+ 
     17206+               /* get physical address of buffer start */ 
     17207+               pa = (uint32) DMA_MAP(di->osh, data, len, DMA_TX, p); 
     17208+ 
     17209+               flags = coreflags; 
     17210+                
     17211+               if (p == p0) 
     17212+                       flags |= D64_CTRL1_SOF; 
     17213+               if (next == NULL) 
     17214+                       flags |= (D64_CTRL1_IOC | D64_CTRL1_EOF); 
     17215+               if (txout == (di->ntxd - 1)) 
     17216+                       flags |= D64_CTRL1_EOT; 
     17217+ 
     17218+               dma64_dd_upd(di, di->txd64, pa, txout, &flags, len); 
     17219+ 
     17220+               ASSERT(di->txp[txout] == NULL); 
     17221+ 
     17222+               txout = NEXTTXD(txout); 
     17223+       } 
     17224+ 
     17225+       /* if last txd eof not set, fix it */ 
     17226+       if (!(flags & D64_CTRL1_EOF)) 
     17227+               W_SM(&di->txd64[PREVTXD(txout)].ctrl1, BUS_SWAP32(flags | D64_CTRL1_IOC | D64_CTRL1_EOF)); 
     17228+ 
     17229+       /* save the packet */ 
     17230+       di->txp[PREVTXD(txout)] = p0; 
     17231+ 
     17232+       /* bump the tx descriptor index */ 
     17233+       di->txout = txout; 
     17234+ 
     17235+       /* kick the chip */ 
     17236+       W_REG(&di->d64txregs->ptr, I2B(txout, dma64dd_t)); 
     17237+ 
     17238+       /* tx flow control */ 
     17239+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     17240+ 
     17241+       return (0); 
     17242+ 
     17243+outoftxd: 
     17244+       DMA_ERROR(("%s: dma_txfast: out of txds\n", di->name)); 
     17245+       PKTFREE(di->osh, p0, TRUE); 
     17246+       di->txavail = 0; 
     17247+       di->hnddma.txnobuf++; 
     17248+       return (-1); 
     17249+} 
     17250+ 
     17251+static void* 
     17252+dma64_getnexttxp(dma_info_t *di, bool forceall) 
     17253+{ 
     17254+       uint start, end, i; 
     17255+       void *txp; 
     17256+ 
     17257+       DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : "")); 
     17258+ 
     17259+       txp = NULL; 
     17260+ 
     17261+       start = di->txin; 
     17262+       if (forceall) 
     17263+               end = di->txout; 
     17264+       else 
     17265+               end = B2I(R_REG(&di->d64txregs->status0) & D64_XS0_CD_MASK, dma64dd_t); 
     17266+ 
     17267+       if ((start == 0) && (end > di->txout)) 
     17268+               goto bogus; 
     17269+ 
     17270+       for (i = start; i != end && !txp; i = NEXTTXD(i)) { 
     17271+               DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->txd64[i].addrlow)) - di->dataoffsetlow), 
     17272+                         (BUS_SWAP32(R_SM(&di->txd64[i].ctrl2)) & D64_CTRL2_BC_MASK), DMA_TX, di->txp[i]); 
     17273+ 
     17274+               W_SM(&di->txd64[i].addrlow, 0xdeadbeef); 
     17275+               W_SM(&di->txd64[i].addrhigh, 0xdeadbeef); 
     17276+ 
     17277+               txp = di->txp[i]; 
     17278+               di->txp[i] = NULL; 
     17279+       } 
     17280+ 
     17281+       di->txin = i; 
     17282+ 
     17283+       /* tx flow control */ 
     17284+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     17285+ 
     17286+       return (txp); 
     17287+ 
     17288+bogus: 
     17289+/* 
     17290+       DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n", 
     17291+               start, end, di->txout, forceall)); 
     17292+*/ 
     17293+       return (NULL); 
     17294+} 
     17295+ 
     17296+static void * 
     17297+dma64_getnextrxp(dma_info_t *di, bool forceall) 
     17298+{ 
     17299+       uint i; 
     17300+       void *rxp; 
     17301+ 
     17302+       /* if forcing, dma engine must be disabled */ 
     17303+       ASSERT(!forceall || !dma_rxenabled(di)); 
     17304+ 
     17305+       i = di->rxin; 
     17306+ 
     17307+       /* return if no packets posted */ 
     17308+       if (i == di->rxout) 
     17309+               return (NULL); 
     17310+ 
     17311+       /* ignore curr if forceall */ 
     17312+       if (!forceall && (i == B2I(R_REG(&di->d64rxregs->status0) & D64_RS0_CD_MASK, dma64dd_t))) 
     17313+               return (NULL); 
     17314+ 
     17315+       /* get the packet pointer that corresponds to the rx descriptor */ 
     17316+       rxp = di->rxp[i]; 
     17317+       ASSERT(rxp); 
     17318+       di->rxp[i] = NULL; 
     17319+ 
     17320+       /* clear this packet from the descriptor ring */ 
     17321+       DMA_UNMAP(di->osh, (BUS_SWAP32(R_SM(&di->rxd64[i].addrlow)) - di->dataoffsetlow), 
     17322+                 di->rxbufsize, DMA_RX, rxp); 
     17323+ 
     17324+       W_SM(&di->rxd64[i].addrlow, 0xdeadbeef); 
     17325+       W_SM(&di->rxd64[i].addrhigh, 0xdeadbeef); 
     17326+ 
     17327+       di->rxin = NEXTRXD(i); 
     17328+ 
     17329+       return (rxp); 
     17330+} 
     17331+ 
     17332+static void 
     17333+dma64_txrotate(di_t *di) 
     17334+{ 
     17335+       uint ad; 
     17336+       uint nactive; 
     17337+       uint rot; 
     17338+       uint old, new; 
     17339+       uint32 w; 
     17340+       uint first, last; 
     17341+ 
     17342+       ASSERT(dma_txsuspendedidle(di)); 
     17343+ 
     17344+       nactive = dma_txactive(di); 
     17345+       ad = B2I((R_REG(&di->d64txregs->status1) & D64_XS1_AD_MASK), dma64dd_t); 
     17346+       rot = TXD(ad - di->txin); 
     17347+ 
     17348+       ASSERT(rot < di->ntxd); 
     17349+ 
     17350+       /* full-ring case is a lot harder - don't worry about this */ 
     17351+       if (rot >= (di->ntxd - nactive)) { 
     17352+               DMA_ERROR(("%s: dma_txrotate: ring full - punt\n", di->name)); 
     17353+               return; 
     17354+       } 
     17355+ 
     17356+       first = di->txin; 
     17357+       last = PREVTXD(di->txout); 
     17358+ 
     17359+       /* move entries starting at last and moving backwards to first */ 
     17360+       for (old = last; old != PREVTXD(first); old = PREVTXD(old)) { 
     17361+               new = TXD(old + rot); 
     17362+ 
     17363+               /* 
     17364+                * Move the tx dma descriptor. 
     17365+                * EOT is set only in the last entry in the ring. 
     17366+                */ 
     17367+               w = R_SM(&di->txd64[old].ctrl1) & ~D64_CTRL1_EOT; 
     17368+               if (new == (di->ntxd - 1)) 
     17369+                       w |= D64_CTRL1_EOT; 
     17370+               W_SM(&di->txd64[new].ctrl1, w); 
     17371+ 
     17372+               w = R_SM(&di->txd64[old].ctrl2); 
     17373+               W_SM(&di->txd64[new].ctrl2, w); 
     17374+ 
     17375+               W_SM(&di->txd64[new].addrlow, R_SM(&di->txd64[old].addrlow)); 
     17376+               W_SM(&di->txd64[new].addrhigh, R_SM(&di->txd64[old].addrhigh)); 
     17377+ 
     17378+               /* zap the old tx dma descriptor address field */ 
     17379+               W_SM(&di->txd64[old].addrlow, 0xdeadbeef); 
     17380+               W_SM(&di->txd64[old].addrhigh, 0xdeadbeef); 
     17381+ 
     17382+               /* move the corresponding txp[] entry */ 
     17383+               ASSERT(di->txp[new] == NULL); 
     17384+               di->txp[new] = di->txp[old]; 
     17385+               di->txp[old] = NULL; 
     17386+       } 
     17387+ 
     17388+       /* update txin and txout */ 
     17389+       di->txin = ad; 
     17390+       di->txout = TXD(di->txout + rot); 
     17391+       di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; 
     17392+ 
     17393+       /* kick the chip */ 
     17394+       W_REG(&di->d64txregs->ptr, I2B(di->txout, dma64dd_t)); 
     17395+} 
     17396+ 
     17397+#endif 
     17398+ 
     17399diff -Naur linux.old/drivers/net/wl/hnddma.h linux.dev/drivers/net/wl/hnddma.h 
     17400--- linux.old/drivers/net/wl/hnddma.h   1970-01-01 01:00:00.000000000 +0100 
     17401+++ linux.dev/drivers/net/wl/hnddma.h   2006-04-06 16:57:44.000000000 +0200 
     17402@@ -0,0 +1,69 @@ 
     17403+/* 
     17404+ * Generic Broadcom Home Networking Division (HND) DMA engine SW interface 
     17405+ * This supports the following chips: BCM42xx, 44xx, 47xx . 
     17406+ * 
     17407+ * Copyright 2005, Broadcom Corporation       
     17408+ * All Rights Reserved.       
     17409+ *        
     17410+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
     17411+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
     17412+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
     17413+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
     17414+ * $Id$ 
     17415+ */ 
     17416+ 
     17417+#ifndef        _hnddma_h_ 
     17418+#define        _hnddma_h_ 
     17419+ 
     17420+/* export structure */ 
     17421+typedef volatile struct { 
     17422+       /* rx error counters */ 
     17423+       uint            rxgiants;       /* rx giant frames */ 
     17424+       uint            rxnobuf;        /* rx out of dma descriptors */ 
     17425+       /* tx error counters */ 
     17426+       uint            txnobuf;        /* tx out of dma descriptors */ 
     17427+} hnddma_t; 
     17428+ 
     17429+#ifndef di_t 
     17430+#define        di_t    void 
     17431+#endif 
     17432+ 
     17433+#ifndef osl_t  
     17434+#define osl_t void 
     17435+#endif 
     17436+ 
     17437+/* externs */ 
     17438+extern void dma_detach(di_t *di); 
     17439+extern void dma_txreset(di_t *di); 
     17440+extern void dma_rxreset(di_t *di); 
     17441+extern void dma_txinit(di_t *di); 
     17442+extern bool dma_txenabled(di_t *di); 
     17443+extern void dma_rxinit(di_t *di); 
     17444+extern void dma_rxenable(di_t *di); 
     17445+extern bool dma_rxenabled(di_t *di); 
     17446+extern void dma_txsuspend(di_t *di); 
     17447+extern void dma_txresume(di_t *di); 
     17448+extern bool dma_txsuspended(di_t *di); 
     17449+extern bool dma_txsuspendedidle(di_t *di); 
     17450+extern bool dma_txstopped(di_t *di); 
     17451+extern bool dma_rxstopped(di_t *di); 
     17452+extern int dma_txfast(di_t *di, void *p, uint32 coreflags); 
     17453+extern void dma_fifoloopbackenable(di_t *di); 
     17454+extern void *dma_rx(di_t *di); 
     17455+extern void dma_rxfill(di_t *di); 
     17456+extern void dma_txreclaim(di_t *di, bool forceall); 
     17457+extern void dma_rxreclaim(di_t *di); 
     17458+extern uintptr dma_getvar(di_t *di, char *name); 
     17459+extern void *dma_getnexttxp(di_t *di, bool forceall); 
     17460+extern void *dma_peeknexttxp(di_t *di); 
     17461+extern void *dma_getnextrxp(di_t *di, bool forceall); 
     17462+extern void dma_txblock(di_t *di); 
     17463+extern void dma_txunblock(di_t *di); 
     17464+extern uint dma_txactive(di_t *di); 
     17465+extern void dma_txrotate(di_t *di); 
     17466+ 
     17467+extern void dma_rxpiomode(dma32regs_t *); 
     17468+extern void dma_txpioloopback(dma32regs_t *); 
     17469+ 
     17470+ 
     17471+#endif /* _hnddma_h_ */ 
     17472diff -Naur linux.old/drivers/net/wl/pktq.h linux.dev/drivers/net/wl/pktq.h 
     17473--- linux.old/drivers/net/wl/pktq.h     1970-01-01 01:00:00.000000000 +0100 
     17474+++ linux.dev/drivers/net/wl/pktq.h     2006-04-06 17:32:52.000000000 +0200 
     17475@@ -0,0 +1,48 @@ 
     17476+/* 
     17477+ * Misc useful os-independent macros and functions. 
     17478+ * 
     17479+ * Copyright 2005, Broadcom Corporation 
     17480+ * All Rights Reserved. 
     17481+ *  
     17482+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY 
     17483+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM 
     17484+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 
     17485+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. 
     17486+ * $Id$ 
     17487+ */ 
     17488+ 
     17489+#ifndef        _pktq_h_ 
     17490+#define        _pktq_h_ 
     17491+ 
     17492+/*** driver-only section ***/ 
     17493+#ifdef BCMDRIVER 
     17494+ 
     17495+/* generic osl packet queue */ 
     17496+struct pktq { 
     17497+       void *head;     /* first packet to dequeue */ 
     17498+       void *tail;     /* last packet to dequeue */ 
     17499+       uint len;       /* number of queued packets */ 
     17500+       uint maxlen;    /* maximum number of queued packets */ 
     17501+       bool priority;  /* enqueue by packet priority */ 
     17502+       uint8 prio_map[MAXPRIO+1]; /* user priority to packet enqueue policy map */ 
     17503+}; 
     17504+#define DEFAULT_QLEN   128 
     17505+ 
     17506+#define        pktq_len(q)     ((q)->len) 
     17507+#define        pktq_avail(q)   ((q)->maxlen - (q)->len) 
     17508+#define        pktq_head(q)    ((q)->head) 
     17509+#define        pktq_full(q)    ((q)->len >= (q)->maxlen) 
     17510+#define        _pktq_pri(q, pri)       ((q)->prio_map[pri]) 
     17511+#define        pktq_tailpri(q) ((q)->tail ? _pktq_pri(q, PKTPRIO((q)->tail)) : _pktq_pri(q, 0)) 
     17512+ 
     17513+/* externs */ 
     17514+/* packet */ 
     17515+extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf); 
     17516+extern uint pkttotlen(osl_t *osh, void *); 
     17517+extern void pktq_init(struct pktq *q, uint maxlen, const uint8 prio_map[]); 
     17518+extern void pktenq(struct pktq *q, void *p, bool lifo); 
     17519+extern void *pktdeq(struct pktq *q); 
     17520+extern void *pktdeqtail(struct pktq *q); 
     17521+ 
     17522+#endif 
     17523+#endif /* _pktq_h_ */ 
     17524diff -Naur linux.old/drivers/net/wl/sbhnddma.h linux.dev/drivers/net/wl/sbhnddma.h 
     17525--- linux.old/drivers/net/wl/sbhnddma.h 1970-01-01 01:00:00.000000000 +0100 
     17526+++ linux.dev/drivers/net/wl/sbhnddma.h 2006-04-06 15:34:14.000000000 +0200 
     17527@@ -0,0 +1,312 @@ 
     17528+/* 
     17529+ * Generic Broadcom Home Networking Division (HND) DMA engine HW interface 
     17530+ * This supports the following chips: BCM42xx, 44xx, 47xx . 
     17531+ * 
     17532+ * Copyright 2005, Broadcom Corporation       
     17533+ * All Rights Reserved.       
     17534+ *        
     17535+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY       
     17536+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM       
     17537+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS       
     17538+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.       
     17539+ * $Id$ 
     17540+ */ 
     17541+ 
     17542+#ifndef        _sbhnddma_h_ 
     17543+#define        _sbhnddma_h_ 
     17544+ 
     17545+  
     17546+/* 2byte-wide pio register set per channel(xmt or rcv) */ 
     17547+typedef volatile struct { 
     17548+       uint16  fifocontrol; 
     17549+       uint16  fifodata; 
     17550+       uint16  fifofree;       /* only valid in xmt channel, not in rcv channel */ 
     17551+       uint16  PAD; 
     17552+} pio2regs_t; 
     17553+ 
     17554+/* a pair of pio channels(tx and rx) */ 
     17555+typedef volatile struct { 
     17556+       pio2regs_t      tx; 
     17557+       pio2regs_t      rx; 
     17558+} pio2regp_t; 
     17559+ 
     17560+/* 4byte-wide pio register set per channel(xmt or rcv) */ 
     17561+typedef volatile struct { 
     17562+       uint32  fifocontrol; 
     17563+       uint32  fifodata; 
     17564+} pio4regs_t; 
     17565+ 
     17566+/* a pair of pio channels(tx and rx) */ 
     17567+typedef volatile struct { 
     17568+       pio4regs_t      tx; 
     17569+       pio4regs_t      rx; 
     17570+} pio4regp_t; 
     17571+ 
     17572+ 
     17573+ 
     17574+/* DMA structure: 
     17575+ *  support two DMA engines: 32 bits address or 64 bit addressing 
     17576+ *  basic DMA register set is per channel(transmit or receive) 
     17577+ *  a pair of channels is defined for convenience 
     17578+ */ 
     17579+ 
     17580+ 
     17581+/*** 32 bits addressing ***/  
     17582+ 
     17583+/* dma registers per channel(xmt or rcv) */ 
     17584+typedef volatile struct { 
     17585+       uint32  control;                /* enable, et al */ 
     17586+       uint32  addr;                   /* descriptor ring base address (4K aligned) */ 
     17587+       uint32  ptr;                    /* last descriptor posted to chip */ 
     17588+       uint32  status;                 /* current active descriptor, et al */ 
     17589+} dma32regs_t; 
     17590+ 
     17591+typedef volatile struct { 
     17592+       dma32regs_t     xmt;            /* dma tx channel */ 
     17593+       dma32regs_t     rcv;            /* dma rx channel */ 
     17594+} dma32regp_t; 
     17595+ 
     17596+typedef volatile struct {      /* diag access */ 
     17597+       uint32  fifoaddr;               /* diag address */ 
     17598+       uint32  fifodatalow;            /* low 32bits of data */ 
     17599+       uint32  fifodatahigh;           /* high 32bits of data */ 
     17600+       uint32  pad;                    /* reserved */ 
     17601+} dma32diag_t; 
     17602+ 
     17603+/* 
     17604+ * DMA Descriptor 
     17605+ * Descriptors are only read by the hardware, never written back. 
     17606+ */ 
     17607+typedef volatile struct { 
     17608+       uint32  ctrl;           /* misc control bits & bufcount */ 
     17609+       uint32  addr;           /* data buffer address */ 
     17610+} dma32dd_t; 
     17611+ 
     17612+/* 
     17613+ * Each descriptor ring must be 4096byte aligned, and fit within a single 4096byte page. 
     17614+ */ 
     17615+#define        D32MAXRINGSZ    4096 
     17616+#define        D32RINGALIGN    4096 
     17617+#define        D32MAXDD        (D32MAXRINGSZ / sizeof (dma32dd_t)) 
     17618+ 
     17619+/* transmit channel control */ 
     17620+#define        XC_XE           ((uint32)1 << 0)        /* transmit enable */ 
     17621+#define        XC_SE           ((uint32)1 << 1)        /* transmit suspend request */ 
     17622+#define        XC_LE           ((uint32)1 << 2)        /* loopback enable */ 
     17623+#define        XC_FL           ((uint32)1 << 4)        /* flush request */ 
     17624+#define        XC_AE           ((uint32)3 << 16)       /* address extension bits */ 
     17625+#define        XC_AE_SHIFT     16 
     17626+ 
     17627+/* transmit descriptor table pointer */ 
     17628+#define        XP_LD_MASK      0xfff                   /* last valid descriptor */ 
     17629+ 
     17630+/* transmit channel status */ 
     17631+#define        XS_CD_MASK      0x0fff                  /* current descriptor pointer */ 
     17632+#define        XS_XS_MASK      0xf000                  /* transmit state */ 
     17633+#define        XS_XS_SHIFT     12 
     17634+#define        XS_XS_DISABLED  0x0000                  /* disabled */ 
     17635+#define        XS_XS_ACTIVE    0x1000                  /* active */ 
     17636+#define        XS_XS_IDLE      0x2000                  /* idle wait */ 
     17637+#define        XS_XS_STOPPED   0x3000                  /* stopped */ 
     17638+#define        XS_XS_SUSP      0x4000                  /* suspend pending */ 
     17639+#define        XS_XE_MASK      0xf0000                 /* transmit errors */ 
     17640+#define        XS_XE_SHIFT     16 
     17641+#define        XS_XE_NOERR     0x00000                 /* no error */ 
     17642+#define        XS_XE_DPE       0x10000                 /* descriptor protocol error */ 
     17643+#define        XS_XE_DFU       0x20000                 /* data fifo underrun */ 
     17644+#define        XS_XE_BEBR      0x30000                 /* bus error on buffer read */ 
     17645+#define        XS_XE_BEDA      0x40000                 /* bus error on descriptor access */ 
     17646+#define        XS_AD_MASK      0xfff00000              /* active descriptor */ 
     17647+#define        XS_AD_SHIFT     20 
     17648+ 
     17649+/* receive channel control */ 
     17650+#define        RC_RE           ((uint32)1 << 0)        /* receive enable */ 
     17651+#define        RC_RO_MASK      0xfe                    /* receive frame offset */ 
     17652+#define        RC_RO_SHIFT     1 
     17653+#define        RC_FM           ((uint32)1 << 8)        /* direct fifo receive (pio) mode */ 
     17654+#define        RC_AE           ((uint32)3 << 16)       /* address extension bits */ 
     17655+#define        RC_AE_SHIFT     16 
     17656+ 
     17657+/* receive descriptor table pointer */ 
     17658+#define        RP_LD_MASK      0xfff                   /* last valid descriptor */ 
     17659+ 
     17660+/* receive channel status */ 
     17661+#define        RS_CD_MASK      0x0fff                  /* current descriptor pointer */ 
     17662+#define        RS_RS_MASK      0xf000                  /* receive state */ 
     17663+#define        RS_RS_SHIFT     12 
     17664+#define        RS_RS_DISABLED  0x0000                  /* disabled */ 
     17665+#define        RS_RS_ACTIVE    0x1000                  /* active */ 
     17666+#define        RS_RS_IDLE      0x2000                  /* idle wait */ 
     17667+#define        RS_RS_STOPPED   0x3000                  /* reserved */ 
     17668+#define        RS_RE_MASK      0xf0000                 /* receive errors */ 
     17669+#define        RS_RE_SHIFT     16 
     17670+#define        RS_RE_NOERR     0x00000                 /* no error */ 
     17671+#define        RS_RE_DPE       0x10000                 /* descriptor protocol error */ 
     17672+#define        RS_RE_DFO       0x20000                 /* data fifo overflow */ 
     17673+#define        RS_RE_BEBW      0x30000                 /* bus error on buffer write */ 
     17674+#define        RS_RE_BEDA      0x40000                 /* bus error on descriptor access */ 
     17675+#define        RS_AD_MASK      0xfff00000              /* active descriptor */ 
     17676+#define        RS_AD_SHIFT     20 
     17677+ 
     17678+/* fifoaddr */ 
     17679+#define        FA_OFF_MASK     0xffff                  /* offset */ 
     17680+#define        FA_SEL_MASK     0xf0000                 /* select */ 
     17681+#define        FA_SEL_SHIFT    16 
     17682+#define        FA_SEL_XDD      0x00000                 /* transmit dma data */ 
     17683+#define        FA_SEL_XDP      0x10000                 /* transmit dma pointers */ 
     17684+#define        FA_SEL_RDD      0x40000                 /* receive dma data */ 
     17685+#define        FA_SEL_RDP      0x50000                 /* receive dma pointers */ 
     17686+#define        FA_SEL_XFD      0x80000                 /* transmit fifo data */ 
     17687+#define        FA_SEL_XFP      0x90000                 /* transmit fifo pointers */ 
     17688+#define        FA_SEL_RFD      0xc0000                 /* receive fifo data */ 
     17689+#define        FA_SEL_RFP      0xd0000                 /* receive fifo pointers */ 
     17690+#define        FA_SEL_RSD      0xe0000                 /* receive frame status data */ 
     17691+#define        FA_SEL_RSP      0xf0000                 /* receive frame status pointers */ 
     17692+ 
     17693+/* descriptor control flags */ 
     17694+#define        CTRL_BC_MASK    0x1fff                  /* buffer byte count */ 
     17695+#define        CTRL_AE         ((uint32)3 << 16)       /* address extension bits */ 
     17696+#define        CTRL_AE_SHIFT   16 
     17697+#define        CTRL_EOT        ((uint32)1 << 28)       /* end of descriptor table */ 
     17698+#define        CTRL_IOC        ((uint32)1 << 29)       /* interrupt on completion */ 
     17699+#define        CTRL_EOF        ((uint32)1 << 30)       /* end of frame */ 
     17700+#define        CTRL_SOF        ((uint32)1 << 31)       /* start of frame */ 
     17701+ 
     17702+/* control flags in the range [27:20] are core-specific and not defined here */ 
     17703+#define        CTRL_CORE_MASK  0x0ff00000 
     17704+ 
     17705+/*** 64 bits addressing ***/ 
     17706+ 
     17707+/* dma registers per channel(xmt or rcv) */ 
     17708+typedef volatile struct { 
     17709+       uint32  control;                /* enable, et al */ 
     17710+       uint32  ptr;                    /* last descriptor posted to chip */ 
     17711+       uint32  addrlow;                /* descriptor ring base address low 32-bits (8K aligned) */ 
     17712+       uint32  addrhigh;               /* descriptor ring base address bits 63:32 (8K aligned) */ 
     17713+       uint32  status0;                /* current descriptor, xmt state */ 
     17714+       uint32  status1;                /* active descriptor, xmt error */ 
     17715+} dma64regs_t; 
     17716+ 
     17717+typedef volatile struct { 
     17718+       dma64regs_t     tx;             /* dma64 tx channel */ 
     17719+       dma64regs_t     rx;             /* dma64 rx channel */ 
     17720+} dma64regp_t; 
     17721+ 
     17722+typedef volatile struct {              /* diag access */ 
     17723+       uint32  fifoaddr;               /* diag address */ 
     17724+       uint32  fifodatalow;            /* low 32bits of data */ 
     17725+       uint32  fifodatahigh;           /* high 32bits of data */ 
     17726+       uint32  pad;                    /* reserved */ 
     17727+} dma64diag_t; 
     17728+ 
     17729+/* 
     17730+ * DMA Descriptor 
     17731+ * Descriptors are only read by the hardware, never written back. 
     17732+ */ 
     17733+typedef volatile struct { 
     17734+       uint32  ctrl1;          /* misc control bits & bufcount */ 
     17735+       uint32  ctrl2;          /* buffer count and address extension */ 
     17736+       uint32  addrlow;        /* memory address of the first byte of the date buffer, bits 31:0 */ 
     17737+       uint32  addrhigh;       /* memory address of the first byte of the date buffer, bits 63:32 */ 
     17738+} dma64dd_t; 
     17739+ 
     17740+/* 
     17741+ * Each descriptor ring must be 8kB aligned, and fit within a contiguous 8kB physical addresss. 
     17742+ */ 
     17743+#define        D64MAXRINGSZ    8192 
     17744+#define        D64RINGALIGN    8192 
     17745+#define        D64MAXDD        (D64MAXRINGSZ / sizeof (dma64dd_t)) 
     17746+ 
     17747+/* transmit channel control */ 
     17748+#define        D64_XC_XE               0x00000001      /* transmit enable */ 
     17749+#define        D64_XC_SE               0x00000002      /* transmit suspend request */ 
     17750+#define        D64_XC_LE               0x00000004      /* loopback enable */ 
     17751+#define        D64_XC_FL               0x00000010      /* flush request */ 
     17752+#define        D64_XC_AE               0x00110000      /* address extension bits */ 
     17753+#define        D64_XC_AE_SHIFT         16 
     17754+ 
     17755+/* transmit descriptor table pointer */ 
     17756+#define        D64_XP_LD_MASK          0x00000fff      /* last valid descriptor */ 
     17757+ 
     17758+/* transmit channel status */ 
     17759+#define        D64_XS0_CD_MASK         0x00001fff      /* current descriptor pointer */ 
     17760+#define        D64_XS0_XS_MASK         0xf0000000      /* transmit state */ 
     17761+#define        D64_XS0_XS_SHIFT                28 
     17762+#define        D64_XS0_XS_DISABLED     0x00000000      /* disabled */ 
     17763+#define        D64_XS0_XS_ACTIVE       0x10000000      /* active */ 
     17764+#define        D64_XS0_XS_IDLE         0x20000000      /* idle wait */ 
     17765+#define        D64_XS0_XS_STOPPED      0x30000000      /* stopped */ 
     17766+#define        D64_XS0_XS_SUSP         0x40000000      /* suspend pending */ 
     17767+ 
     17768+#define        D64_XS1_AD_MASK         0x0001ffff      /* active descriptor */ 
     17769+#define        D64_XS1_XE_MASK         0xf0000000      /* transmit errors */ 
     17770+#define        D64_XS1_XE_SHIFT                28 
     17771+#define        D64_XS1_XE_NOERR        0x00000000      /* no error */ 
     17772+#define        D64_XS1_XE_DPE          0x10000000      /* descriptor protocol error */ 
     17773+#define        D64_XS1_XE_DFU          0x20000000      /* data fifo underrun */ 
     17774+#define        D64_XS1_XE_DTE          0x30000000      /* data transfer error */ 
     17775+#define        D64_XS1_XE_DESRE        0x40000000      /* descriptor read error */ 
     17776+#define        D64_XS1_XE_COREE        0x50000000      /* core error */ 
     17777+ 
     17778+/* receive channel control */ 
     17779+#define        D64_RC_RE               0x00000001      /* receive enable */ 
     17780+#define        D64_RC_RO_MASK          0x000000fe      /* receive frame offset */ 
     17781+#define        D64_RC_RO_SHIFT         1 
     17782+#define        D64_RC_FM               0x00000100      /* direct fifo receive (pio) mode */ 
     17783+#define        D64_RC_AE               0x00110000      /* address extension bits */ 
     17784+#define        D64_RC_AE_SHIFT         16 
     17785+ 
     17786+/* receive descriptor table pointer */ 
     17787+#define        D64_RP_LD_MASK          0x00000fff      /* last valid descriptor */ 
     17788+ 
     17789+/* receive channel status */ 
     17790+#define        D64_RS0_CD_MASK         0x00001fff      /* current descriptor pointer */ 
     17791+#define        D64_RS0_RS_MASK         0xf0000000      /* receive state */ 
     17792+#define        D64_RS0_RS_SHIFT                28 
     17793+#define        D64_RS0_RS_DISABLED     0x00000000      /* disabled */ 
     17794+#define        D64_RS0_RS_ACTIVE       0x10000000      /* active */ 
     17795+#define        D64_RS0_RS_IDLE         0x20000000      /* idle wait */ 
     17796+#define        D64_RS0_RS_STOPPED      0x30000000      /* stopped */ 
     17797+#define        D64_RS0_RS_SUSP         0x40000000      /* suspend pending */ 
     17798+ 
     17799+#define        D64_RS1_AD_MASK         0x0001ffff      /* active descriptor */ 
     17800+#define        D64_RS1_RE_MASK         0xf0000000      /* receive errors */ 
     17801+#define        D64_RS1_RE_SHIFT                28 
     17802+#define        D64_RS1_RE_NOERR        0x00000000      /* no error */ 
     17803+#define        D64_RS1_RE_DPO          0x10000000      /* descriptor protocol error */ 
     17804+#define        D64_RS1_RE_DFU          0x20000000      /* data fifo overflow */ 
     17805+#define        D64_RS1_RE_DTE          0x30000000      /* data transfer error */ 
     17806+#define        D64_RS1_RE_DESRE        0x40000000      /* descriptor read error */ 
     17807+#define        D64_RS1_RE_COREE        0x50000000      /* core error */ 
     17808+ 
     17809+/* fifoaddr */ 
     17810+#define        D64_FA_OFF_MASK         0xffff          /* offset */ 
     17811+#define        D64_FA_SEL_MASK         0xf0000         /* select */ 
     17812+#define        D64_FA_SEL_SHIFT        16 
     17813+#define        D64_FA_SEL_XDD          0x00000         /* transmit dma data */ 
     17814+#define        D64_FA_SEL_XDP          0x10000         /* transmit dma pointers */ 
     17815+#define        D64_FA_SEL_RDD          0x40000         /* receive dma data */ 
     17816+#define        D64_FA_SEL_RDP          0x50000         /* receive dma pointers */ 
     17817+#define        D64_FA_SEL_XFD          0x80000         /* transmit fifo data */ 
     17818+#define        D64_FA_SEL_XFP          0x90000         /* transmit fifo pointers */ 
     17819+#define        D64_FA_SEL_RFD          0xc0000         /* receive fifo data */ 
     17820+#define        D64_FA_SEL_RFP          0xd0000         /* receive fifo pointers */ 
     17821+#define        D64_FA_SEL_RSD          0xe0000         /* receive frame status data */ 
     17822+#define        D64_FA_SEL_RSP          0xf0000         /* receive frame status pointers */ 
     17823+ 
     17824+/* descriptor control flags 1 */ 
     17825+#define        D64_CTRL1_EOT           ((uint32)1 << 28)       /* end of descriptor table */ 
     17826+#define        D64_CTRL1_IOC           ((uint32)1 << 29)       /* interrupt on completion */ 
     17827+#define        D64_CTRL1_EOF           ((uint32)1 << 30)       /* end of frame */ 
     17828+#define        D64_CTRL1_SOF           ((uint32)1 << 31)       /* start of frame */ 
     17829+ 
     17830+/* descriptor control flags 2 */ 
     17831+#define        D64_CTRL2_BC_MASK       0x00007fff      /* buffer byte count mask */ 
     17832+#define        D64_CTRL2_AE            0x00110000      /* address extension bits */ 
     17833+#define        D64_CTRL2_AE_SHIFT      16 
     17834+ 
     17835+/* control flags in the range [27:20] are core-specific and not defined here */ 
     17836+#define        D64_CTRL_CORE_MASK      0x0ff00000 
     17837+ 
     17838+ 
     178