convert brcm-2.4 to the new target structure
authorFelix Fietkau <nbd@openwrt.org>
Fri, 4 May 2007 22:13:42 +0000 (22:13 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 4 May 2007 22:13:42 +0000 (22:13 +0000)
SVN-Revision: 7092

55 files changed:
target/linux/brcm-2.4/files/arch/mips/bcm947xx/Makefile [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmsrom.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmutils.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/compressed/Makefile [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/export.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/Makefile [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/int-handler.S [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/irq.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/gpio.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/hndchipc.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcm4710.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdefs.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs1.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmendian.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmnvram.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmsrom.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmutils.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndcpu.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndmips.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndpci.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/linuxver.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/mipsinc.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/osl.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/pcicfg.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbchipc.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbconfig.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbextif.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbhndmips.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbmemc.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpci.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcie.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcmcia.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbsdram.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbsocram.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbutils.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sflash.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/trxhdr.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/typedefs.h [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/nvram.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/nvram_linux.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/pcibios.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/prom.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbmips.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbpci.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sbutils.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/setup.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/sflash.c [new file with mode: 0644]
target/linux/brcm-2.4/files/arch/mips/bcm947xx/time.c [new file with mode: 0644]
target/linux/brcm-2.4/files/drivers/mtd/devices/sflash.c [new file with mode: 0644]
target/linux/brcm-2.4/files/drivers/mtd/maps/bcm947xx-flash.c [new file with mode: 0644]
target/linux/brcm-2.4/files/drivers/parport/parport_splink.c [new file with mode: 0644]
target/linux/brcm-2.4/patches/001-bcm47xx.patch
target/linux/brcm-2.4/patches/004-flash.patch
target/linux/brcm-2.4/patches/009-wrt54g3g_pcmcia.patch

diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/Makefile b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/Makefile
new file mode 100644 (file)
index 0000000..55e1757
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# Makefile for the BCM947xx specific kernel interface routines
+# under Linux.
+#
+
+EXTRA_CFLAGS+=-I$(TOPDIR)/arch/mips/bcm947xx/include -DBCMDRIVER
+
+O_TARGET        := bcm947xx.o
+
+export-objs     := export.o
+obj-y          := prom.o setup.o time.o sbmips.o gpio.o
+obj-y          += nvram.o nvram_linux.o sflash.o
+obj-y          += sbutils.o bcmutils.o bcmsrom.o hndchipc.o
+obj-$(CONFIG_PCI) += sbpci.o pcibios.o
+obj-y          += export.o
+
+include $(TOPDIR)/Rules.make
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmsrom.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmsrom.c
new file mode 100644 (file)
index 0000000..1d08218
--- /dev/null
@@ -0,0 +1,1213 @@
+/*
+ *  Misc useful routines to access NIC SROM/OTP .
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmsrom.c,v 1.1.1.14 2006/04/15 01:28:25 michael Exp $
+ */
+
+#include <typedefs.h>
+#include <bcmdefs.h>
+#include <osl.h>
+#include <bcmutils.h>
+#include <bcmsrom.h>
+#include <bcmdevs.h>
+#include <bcmendian.h>
+#include <sbpcmcia.h>
+#include <pcicfg.h>
+#include <sbutils.h>
+#include <bcmnvram.h>
+
+/* debug/trace */
+#if defined(WLTEST)
+#define        BS_ERROR(args)  printf args
+#else
+#define        BS_ERROR(args)
+#endif /* BCMDBG_ERR || WLTEST */
+
+#define        VARS_MAX        4096    /* should be reduced */
+
+#define WRITE_ENABLE_DELAY     500     /* 500 ms after write enable/disable toggle */
+#define WRITE_WORD_DELAY       20      /* 20 ms between each word write */
+
+static int initvars_srom_pci(void *sbh, void *curmap, char **vars, uint *count);
+static int initvars_cis_pcmcia(void *sbh, osl_t *osh, char **vars, uint *count);
+static int initvars_flash_sb(void *sbh, char **vars, uint *count);
+static int srom_parsecis(osl_t *osh, uint8 **pcis, uint ciscnt, char **vars, uint *count);
+static int sprom_cmd_pcmcia(osl_t *osh, uint8 cmd);
+static int sprom_read_pcmcia(osl_t *osh, uint16 addr, uint16 *data);
+static int sprom_write_pcmcia(osl_t *osh, uint16 addr, uint16 data);
+static int sprom_read_pci(osl_t *osh, uint16 *sprom, uint wordoff, uint16 *buf, uint nwords,
+                          bool check_crc);
+
+static int initvars_table(osl_t *osh, char *start, char *end, char **vars, uint *count);
+static int initvars_flash(osl_t *osh, char **vp, uint len, char *devpath);
+
+/*
+ * Initialize local vars from the right source for this platform.
+ * Return 0 on success, nonzero on error.
+ */
+int
+srom_var_init(void *sbh, uint bustype, void *curmap, osl_t *osh, char **vars, uint *count)
+{
+       ASSERT(bustype == BUSTYPE(bustype));
+       if (vars == NULL || count == NULL)
+               return (0);
+
+       switch (BUSTYPE(bustype)) {
+       case SB_BUS:
+       case JTAG_BUS:
+               return initvars_flash_sb(sbh, vars, count);
+
+       case PCI_BUS:
+               ASSERT(curmap); /* can not be NULL */
+               return initvars_srom_pci(sbh, curmap, vars, count);
+
+       case PCMCIA_BUS:
+               return initvars_cis_pcmcia(sbh, osh, vars, count);
+
+
+       default:
+               ASSERT(0);
+       }
+       return (-1);
+}
+
+/* support only 16-bit word read from srom */
+int
+srom_read(uint bustype, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf)
+{
+       void *srom;
+       uint i, off, nw;
+
+       ASSERT(bustype == BUSTYPE(bustype));
+
+       /* check input - 16-bit access only */
+       if (byteoff & 1 || nbytes & 1 || (byteoff + nbytes) > (SPROM_SIZE * 2))
+               return 1;
+
+       off = byteoff / 2;
+       nw = nbytes / 2;
+
+       if (BUSTYPE(bustype) == PCI_BUS) {
+               if (!curmap)
+                       return 1;
+               srom = (uchar*)curmap + PCI_BAR0_SPROM_OFFSET;
+               if (sprom_read_pci(osh, srom, off, buf, nw, FALSE))
+                       return 1;
+       } else if (BUSTYPE(bustype) == PCMCIA_BUS) {
+               for (i = 0; i < nw; i++) {
+                       if (sprom_read_pcmcia(osh, (uint16)(off + i), (uint16*)(buf + i)))
+                               return 1;
+               }
+       } else {
+               return 1;
+       }
+
+       return 0;
+}
+
+/* support only 16-bit word write into srom */
+int
+srom_write(uint bustype, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf)
+{
+       uint16 *srom;
+       uint i, nw, crc_range;
+       uint16 image[SPROM_SIZE];
+       uint8 crc;
+       volatile uint32 val32;
+
+       ASSERT(bustype == BUSTYPE(bustype));
+
+       /* check input - 16-bit access only */
+       if (byteoff & 1 || nbytes & 1 || (byteoff + nbytes) > (SPROM_SIZE * 2))
+               return 1;
+
+       /* Are we writing the whole thing at once? */
+       if ((byteoff == 0) &&
+           ((nbytes == SPROM_SIZE) ||
+            (nbytes == (SPROM_CRC_RANGE * 2)) ||
+            (nbytes == (SROM4_WORDS * 2)))) {
+               crc_range = nbytes;
+               bcopy((void*)buf, (void*)image, nbytes);
+               nw = nbytes / 2;
+       } else {
+               if ((BUSTYPE(bustype) == PCMCIA_BUS) || (BUSTYPE(bustype) == SDIO_BUS))
+                       crc_range = SPROM_SIZE;
+               else
+                       crc_range = SPROM_CRC_RANGE * 2;        /* Tentative */
+
+               nw = crc_range / 2;
+               /* read first 64 words from srom */
+               if (srom_read(bustype, curmap, osh, 0, crc_range, image))
+                       return 1;
+               if (image[SROM4_SIGN] == SROM4_SIGNATURE) {
+                       crc_range = SROM4_WORDS;
+                       nw = crc_range / 2;
+                       if (srom_read(bustype, curmap, osh, 0, crc_range, image))
+                               return 1;
+               }
+               /* make changes */
+               bcopy((void*)buf, (void*)&image[byteoff / 2], nbytes);
+       }
+
+       /* calculate crc */
+       htol16_buf(image, crc_range);
+       crc = ~hndcrc8((uint8 *)image, crc_range - 1, CRC8_INIT_VALUE);
+       ltoh16_buf(image, crc_range);
+       image[(crc_range / 2) - 1] = (crc << 8) | (image[(crc_range / 2) - 1] & 0xff);
+
+       if (BUSTYPE(bustype) == PCI_BUS) {
+               srom = (uint16*)((uchar*)curmap + PCI_BAR0_SPROM_OFFSET);
+               /* enable writes to the SPROM */
+               val32 = OSL_PCI_READ_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32));
+               val32 |= SPROM_WRITEEN;
+               OSL_PCI_WRITE_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32), val32);
+               bcm_mdelay(WRITE_ENABLE_DELAY);
+               /* write srom */
+               for (i = 0; i < nw; i++) {
+                       W_REG(osh, &srom[i], image[i]);
+                       bcm_mdelay(WRITE_WORD_DELAY);
+               }
+               /* disable writes to the SPROM */
+               OSL_PCI_WRITE_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32), val32 &
+                                    ~SPROM_WRITEEN);
+       } else if (BUSTYPE(bustype) == PCMCIA_BUS) {
+               /* enable writes to the SPROM */
+               if (sprom_cmd_pcmcia(osh, SROM_WEN))
+                       return 1;
+               bcm_mdelay(WRITE_ENABLE_DELAY);
+               /* write srom */
+               for (i = 0; i < nw; i++) {
+                       sprom_write_pcmcia(osh, (uint16)(i), image[i]);
+                       bcm_mdelay(WRITE_WORD_DELAY);
+               }
+               /* disable writes to the SPROM */
+               if (sprom_cmd_pcmcia(osh, SROM_WDS))
+                       return 1;
+       } else {
+               return 1;
+       }
+
+       bcm_mdelay(WRITE_ENABLE_DELAY);
+       return 0;
+}
+
+
+static int
+srom_parsecis(osl_t *osh, uint8 **pcis, uint ciscnt, char **vars, uint *count)
+{
+       char eabuf[32];
+       char *vp, *base;
+       uint8 *cis, tup, tlen, sromrev = 1;
+       int i, j;
+       uint varsize;
+       bool ag_init = FALSE;
+       uint32 w32;
+
+       ASSERT(vars);
+       ASSERT(count);
+
+       base = vp = MALLOC(osh, VARS_MAX);
+       ASSERT(vp);
+       if (!vp)
+               return -2;
+
+       while (ciscnt--) {
+               cis = *pcis++;
+               i = 0;
+               do {
+                       tup = cis[i++];
+                       tlen = cis[i++];
+                       if ((i + tlen) >= CIS_SIZE)
+                               break;
+
+                       switch (tup) {
+                       case CISTPL_MANFID:
+                               vp += sprintf(vp, "manfid=%d", (cis[i + 1] << 8) + cis[i]);
+                               vp++;
+                               vp += sprintf(vp, "prodid=%d", (cis[i + 3] << 8) + cis[i + 2]);
+                               vp++;
+                               break;
+
+                       case CISTPL_FUNCE:
+                               switch (cis[i]) {
+                               case LAN_NID:
+                                       ASSERT(cis[i + 1] == 6);
+                                       bcm_ether_ntoa((struct ether_addr *)&cis[i + 2], eabuf);
+                                       vp += sprintf(vp, "il0macaddr=%s", eabuf);
+                                       vp++;
+                                       break;
+                               case 1:         /* SDIO Extended Data */
+                                       vp += sprintf(vp, "sdmaxblk=%d",
+                                                     (cis[i + 13] << 8) | cis[i + 12]);
+                                       vp++;
+                                       break;
+                               }
+                               break;
+
+                       case CISTPL_CFTABLE:
+                               vp += sprintf(vp, "regwindowsz=%d", (cis[i + 7] << 8) | cis[i + 6]);
+                               vp++;
+                               break;
+
+                       case CISTPL_BRCM_HNBU:
+                               switch (cis[i]) {
+                               case HNBU_SROMREV:
+                                       sromrev = cis[i + 1];
+                                       break;
+
+                               case HNBU_CHIPID:
+                                       vp += sprintf(vp, "vendid=%d", (cis[i + 2] << 8) +
+                                                     cis[i + 1]);
+                                       vp++;
+                                       vp += sprintf(vp, "devid=%d", (cis[i + 4] << 8) +
+                                                     cis[i + 3]);
+                                       vp++;
+                                       if (tlen == 7) {
+                                               vp += sprintf(vp, "chiprev=%d",
+                                                             (cis[i + 6] << 8) + cis[i + 5]);
+                                               vp++;
+                                       }
+                                       break;
+
+                               case HNBU_BOARDREV:
+                                       vp += sprintf(vp, "boardrev=%d", cis[i + 1]);
+                                       vp++;
+                                       break;
+
+                               case HNBU_AA:
+                                       vp += sprintf(vp, "aa2g=%d", cis[i + 1]);
+                                       vp++;
+                                       break;
+
+                               case HNBU_AG:
+                                       vp += sprintf(vp, "ag0=%d", cis[i + 1]);
+                                       vp++;
+                                       ag_init = TRUE;
+                                       break;
+
+                               case HNBU_CC:
+                                       ASSERT(sromrev == 1);
+                                       vp += sprintf(vp, "cc=%d", cis[i + 1]);
+                                       vp++;
+                                       break;
+
+                               case HNBU_PAPARMS:
+                                       if (tlen == 2) {
+                                               ASSERT(sromrev == 1);
+                                               vp += sprintf(vp, "pa0maxpwr=%d", cis[i + 1]);
+                                               vp++;
+                                       } else if (tlen >= 9) {
+                                               if (tlen == 10) {
+                                                       ASSERT(sromrev == 2);
+                                                       vp += sprintf(vp, "opo=%d", cis[i + 9]);
+                                                       vp++;
+                                               } else
+                                                       ASSERT(tlen == 9);
+
+                                               for (j = 0; j < 3; j++) {
+                                                       vp += sprintf(vp, "pa0b%d=%d", j,
+                                                                     (cis[i + (j * 2) + 2] << 8) +
+                                                                     cis[i + (j * 2) + 1]);
+                                                       vp++;
+                                               }
+                                               vp += sprintf(vp, "pa0itssit=%d", cis[i + 7]);
+                                               vp++;
+                                               vp += sprintf(vp, "pa0maxpwr=%d", cis[i + 8]);
+                                               vp++;
+                                       } else
+                                               ASSERT(tlen >= 9);
+                                       break;
+
+                               case HNBU_OEM:
+                                       ASSERT(sromrev == 1);
+                                       vp += sprintf(vp, "oem=%02x%02x%02x%02x%02x%02x%02x%02x",
+                                                     cis[i + 1], cis[i + 2],
+                                                     cis[i + 3], cis[i + 4],
+                                                     cis[i + 5], cis[i + 6],
+                                                     cis[i + 7], cis[i + 8]);
+                                       vp++;
+                                       break;
+
+                               case HNBU_BOARDFLAGS:
+                                       w32 = (cis[i + 2] << 8) + cis[i + 1];
+                                       if (tlen == 5)
+                                               w32 |= (cis[i + 4] << 24) + (cis[i + 3] << 16);
+                                       vp += sprintf(vp, "boardflags=0x%x", w32);
+                                       vp++;
+                                       break;
+
+                               case HNBU_LEDS:
+                                       if (cis[i + 1] != 0xff) {
+                                               vp += sprintf(vp, "ledbh0=%d", cis[i + 1]);
+                                               vp++;
+                                       }
+                                       if (cis[i + 2] != 0xff) {
+                                               vp += sprintf(vp, "ledbh1=%d", cis[i + 2]);
+                                               vp++;
+                                       }
+                                       if (cis[i + 3] != 0xff) {
+                                               vp += sprintf(vp, "ledbh2=%d", cis[i + 3]);
+                                               vp++;
+                                       }
+                                       if (cis[i + 4] != 0xff) {
+                                               vp += sprintf(vp, "ledbh3=%d", cis[i + 4]);
+                                               vp++;
+                                       }
+                                       break;
+
+                               case HNBU_CCODE:
+                               {
+                                       char str[3];
+                                       ASSERT(sromrev > 1);
+                                       str[0] = cis[i + 1];
+                                       str[1] = cis[i + 2];
+                                       str[2] = 0;
+                                       vp += sprintf(vp, "ccode=%s", str);
+                                       vp++;
+                                       vp += sprintf(vp, "cctl=0x%x", cis[i + 3]);
+                                       vp++;
+                                       break;
+                               }
+
+                               case HNBU_CCKPO:
+                                       ASSERT(sromrev > 2);
+                                       vp += sprintf(vp, "cckpo=0x%x",
+                                                     (cis[i + 2] << 8) | cis[i + 1]);
+                                       vp++;
+                                       break;
+
+                               case HNBU_OFDMPO:
+                                       ASSERT(sromrev > 2);
+                                       vp += sprintf(vp, "ofdmpo=0x%x",
+                                                     (cis[i + 4] << 24) |
+                                                     (cis[i + 3] << 16) |
+                                                     (cis[i + 2] << 8) |
+                                                     cis[i + 1]);
+                                       vp++;
+                                       break;
+                               }
+                               break;
+
+                       }
+                       i += tlen;
+               } while (tup != 0xff);
+       }
+
+       /* Set the srom version */
+       vp += sprintf(vp, "sromrev=%d", sromrev);
+       vp++;
+
+       /* if there is no antenna gain field, set default */
+       if (ag_init == FALSE) {
+               ASSERT(sromrev == 1);
+               vp += sprintf(vp, "ag0=%d", 0xff);
+               vp++;
+       }
+
+       /* final nullbyte terminator */
+       *vp++ = '\0';
+       varsize = (uint)(vp - base);
+
+       ASSERT((vp - base) < VARS_MAX);
+
+       if (varsize == VARS_MAX) {
+               *vars = base;
+       } else {
+               vp = MALLOC(osh, varsize);
+               ASSERT(vp);
+               if (vp)
+                       bcopy(base, vp, varsize);
+               MFREE(osh, base, VARS_MAX);
+               *vars = vp;
+               if (!vp) {
+                       *count = 0;
+                       return -2;
+               }
+       }
+       *count = varsize;
+
+       return (0);
+}
+
+
+/* set PCMCIA sprom command register */
+static int
+sprom_cmd_pcmcia(osl_t *osh, uint8 cmd)
+{
+       uint8 status = 0;
+       uint wait_cnt = 1000;
+
+       /* write sprom command register */
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_CS, &cmd, 1);
+
+       /* wait status */
+       while (wait_cnt--) {
+               OSL_PCMCIA_READ_ATTR(osh, SROM_CS, &status, 1);
+               if (status & SROM_DONE)
+                       return 0;
+       }
+
+       return 1;
+}
+
+/* read a word from the PCMCIA srom */
+static int
+sprom_read_pcmcia(osl_t *osh, uint16 addr, uint16 *data)
+{
+       uint8 addr_l, addr_h, data_l, data_h;
+
+       addr_l = (uint8)((addr * 2) & 0xff);
+       addr_h = (uint8)(((addr * 2) >> 8) & 0xff);
+
+       /* set address */
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRH, &addr_h, 1);
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRL, &addr_l, 1);
+
+       /* do read */
+       if (sprom_cmd_pcmcia(osh, SROM_READ))
+               return 1;
+
+       /* read data */
+       data_h = data_l = 0;
+       OSL_PCMCIA_READ_ATTR(osh, SROM_DATAH, &data_h, 1);
+       OSL_PCMCIA_READ_ATTR(osh, SROM_DATAL, &data_l, 1);
+
+       *data = (data_h << 8) | data_l;
+       return 0;
+}
+
+/* write a word to the PCMCIA srom */
+static int
+sprom_write_pcmcia(osl_t *osh, uint16 addr, uint16 data)
+{
+       uint8 addr_l, addr_h, data_l, data_h;
+
+       addr_l = (uint8)((addr * 2) & 0xff);
+       addr_h = (uint8)(((addr * 2) >> 8) & 0xff);
+       data_l = (uint8)(data & 0xff);
+       data_h = (uint8)((data >> 8) & 0xff);
+
+       /* set address */
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRH, &addr_h, 1);
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_ADDRL, &addr_l, 1);
+
+       /* write data */
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_DATAH, &data_h, 1);
+       OSL_PCMCIA_WRITE_ATTR(osh, SROM_DATAL, &data_l, 1);
+
+       /* do write */
+       return sprom_cmd_pcmcia(osh, SROM_WRITE);
+}
+
+/*
+ * Read in and validate sprom.
+ * Return 0 on success, nonzero on error.
+ */
+static int
+sprom_read_pci(osl_t *osh, uint16 *sprom, uint wordoff, uint16 *buf, uint nwords, bool check_crc)
+{
+       int err = 0;
+       uint i;
+
+       /* read the sprom */
+       for (i = 0; i < nwords; i++)
+               buf[i] = R_REG(osh, &sprom[wordoff + i]);
+
+       if (check_crc) {
+               /* fixup the endianness so crc8 will pass */
+               htol16_buf(buf, nwords * 2);
+               if (hndcrc8((uint8*)buf, nwords * 2, CRC8_INIT_VALUE) != CRC8_GOOD_VALUE)
+                       err = 1;
+               /* now correct the endianness of the byte array */
+               ltoh16_buf(buf, nwords * 2);
+       }
+
+       return err;
+}
+
+/*
+* Create variable table from memory.
+* Return 0 on success, nonzero on error.
+*/
+static int
+initvars_table(osl_t *osh, char *start, char *end, char **vars, uint *count)
+{
+       int c = (int)(end - start);
+
+       /* do it only when there is more than just the null string */
+       if (c > 1) {
+               char *vp = MALLOC(osh, c);
+               ASSERT(vp);
+               if (!vp)
+                       return BCME_NOMEM;
+               bcopy(start, vp, c);
+               *vars = vp;
+               *count = c;
+       }
+       else {
+               *vars = NULL;
+               *count = 0;
+       }
+
+       return 0;
+}
+
+/*
+ * Find variables with <devpath> from flash. 'base' points to the beginning
+ * of the table upon enter and to the end of the table upon exit when success.
+ * Return 0 on success, nonzero on error.
+ */
+static int
+initvars_flash(osl_t *osh, char **base, uint len, char *devpath)
+{
+       char *vp = *base;
+       char *flash;
+       int err;
+       char *s;
+       uint l, dl, copy_len;
+
+       /* allocate memory and read in flash */
+       if (!(flash = MALLOC(osh, NVRAM_SPACE)))
+               return BCME_NOMEM;
+       if ((err = nvram_getall(flash, NVRAM_SPACE)))
+               goto exit;
+
+       /* grab vars with the <devpath> prefix in name */
+       dl = strlen(devpath);
+       for (s = flash; s && *s; s += l + 1) {
+               l = strlen(s);
+
+               /* skip non-matching variable */
+               if (strncmp(s, devpath, dl))
+                       continue;
+
+               /* is there enough room to copy? */
+               copy_len = l - dl + 1;
+               if (len < copy_len) {
+                       err = BCME_BUFTOOSHORT;
+                       goto exit;
+               }
+
+               /* no prefix, just the name=value */
+               strcpy(vp, &s[dl]);
+               vp += copy_len;
+               len -= copy_len;
+       }
+
+       /* add null string as terminator */
+       if (len < 1) {
+               err = BCME_BUFTOOSHORT;
+               goto exit;
+       }
+       *vp++ = '\0';
+
+       *base = vp;
+
+exit:  MFREE(osh, flash, NVRAM_SPACE);
+       return err;
+}
+
+/*
+ * Initialize nonvolatile variable table from flash.
+ * Return 0 on success, nonzero on error.
+ */
+static int
+initvars_flash_sb(void *sbh, char **vars, uint *count)
+{
+       osl_t *osh = sb_osh(sbh);
+       char devpath[SB_DEVPATH_BUFSZ];
+       char *vp, *base;
+       int err;
+
+       ASSERT(vars);
+       ASSERT(count);
+
+       if ((err = sb_devpath(sbh, devpath, sizeof(devpath))))
+               return err;
+
+       base = vp = MALLOC(osh, VARS_MAX);
+       ASSERT(vp);
+       if (!vp)
+               return BCME_NOMEM;
+
+       if ((err = initvars_flash(osh, &vp, VARS_MAX, devpath)))
+               goto err;
+
+       err = initvars_table(osh, base, vp, vars, count);
+
+err:   MFREE(osh, base, VARS_MAX);
+       return err;
+}
+
+#ifdef WLTEST
+char mfgsromvars[256];
+char *defaultsromvars = "il0macaddr=00:11:22:33:44:51\0"
+               "et0macaddr=00:11:22:33:44:52\0"
+               "et1macaddr=00:11:22:33:44:53\0"
+               "boardtype=0xffff\0"
+               "boardrev=0x10\0"
+               "boardflags=8\0"
+               "sromrev=2\0"
+               "aa2g=3";
+#define        MFGSROM_DEFVARSLEN      147 /* default srom len */
+#endif /* WL_TEST */
+
+/*
+ * Initialize nonvolatile variable table from sprom.
+ * Return 0 on success, nonzero on error.
+ */
+static int
+initvars_srom_pci(void *sbh, void *curmap, char **vars, uint *count)
+{
+       uint16 w, *b;
+       uint8 sromrev = 0;
+       struct ether_addr ea;
+       char eabuf[32];
+       uint32 w32;
+       int woff, i;
+       char *vp, *base;
+       osl_t *osh = sb_osh(sbh);
+       bool flash = FALSE;
+       char name[SB_DEVPATH_BUFSZ+16], *value;
+       char devpath[SB_DEVPATH_BUFSZ];
+       int err;
+
+       /*
+        * Apply CRC over SROM content regardless SROM is present or not,
+        * and use variable <devpath>sromrev's existance in flash to decide
+        * if we should return an error when CRC fails or read SROM variables
+        * from flash.
+        */
+       b = MALLOC(osh, SROM_MAX);
+       ASSERT(b);
+       if (!b)
+               return -2;
+
+       err = sprom_read_pci(osh, (void*)((int8*)curmap + PCI_BAR0_SPROM_OFFSET), 0, b,
+                            64, TRUE);
+       if (b[SROM4_SIGN] == SROM4_SIGNATURE) {
+               /* sromrev >= 4, read more */
+               err = sprom_read_pci(osh, (void*)((int8*)curmap + PCI_BAR0_SPROM_OFFSET), 0, b, SROM4_WORDS, TRUE);
+               sromrev = b[SROM4_WORDS - 1] & 0xff;
+       } else if (err == 0) {
+               /* srom is good and is rev < 4 */
+               /* top word of sprom contains version and crc8 */
+               sromrev = b[63] & 0xff;
+               /* bcm4401 sroms misprogrammed */
+               if (sromrev == 0x10)
+                       sromrev = 1;
+       }
+
+       if (err) {
+#ifdef WLTEST
+               BS_ERROR(("SROM Crc Error, so see if we could use a default\n"));
+               w32 = OSL_PCI_READ_CONFIG(osh, PCI_SPROM_CONTROL, sizeof(uint32));
+               if (w32 & SPROM_OTPIN_USE) {
+                       BS_ERROR(("srom crc failed with OTP, use default vars....\n"));
+                       vp = base =  mfgsromvars;
+                       if (sb_chip(sbh) == BCM4311_CHIP_ID) {
+                               BS_ERROR(("setting the devid to be 4311\n"));
+                               vp += sprintf(vp, "devid=0x4311");
+                               vp++;
+                       }
+                       bcopy(defaultsromvars,  vp, MFGSROM_DEFVARSLEN);
+                       vp += MFGSROM_DEFVARSLEN;
+                       goto varsdone;
+               } else {
+                       BS_ERROR(("srom crc failed with SPROM....\n"));
+#endif /* WLTEST */
+                       if ((err = sb_devpath(sbh, devpath, sizeof(devpath))))
+                               return err;
+                       sprintf(name, "%ssromrev", devpath);
+                       if (!(value = getvar(NULL, name)))
+                               return (-1);
+                       sromrev = (uint8)bcm_strtoul(value, NULL, 0);
+                       flash = TRUE;
+#ifdef WLTEST
+               }
+#endif /* WLTEST */
+       }
+
+       /* srom version check */
+       if (sromrev > 4)
+               return (-2);
+
+       ASSERT(vars);
+       ASSERT(count);
+
+       base = vp = MALLOC(osh, VARS_MAX);
+       ASSERT(vp);
+       if (!vp)
+               return -2;
+
+       /* read variables from flash */
+       if (flash) {
+               if ((err = initvars_flash(osh, &vp, VARS_MAX, devpath)))
+                       goto err;
+               goto varsdone;
+       }
+
+       vp += sprintf(vp, "sromrev=%d", sromrev);
+       vp++;
+
+       if (sromrev >= 4) {
+               uint path, pathbase;
+               const uint pathbases[MAX_PATH] = {SROM4_PATH0, SROM4_PATH1,
+                                                 SROM4_PATH2, SROM4_PATH3};
+
+               vp += sprintf(vp, "boardrev=%d", b[SROM4_BREV]);
+               vp++;
+
+               vp += sprintf(vp, "boardflags=%d", (b[SROM4_BFL1] << 16) | b[SROM4_BFL0]);
+               vp++;
+
+               vp += sprintf(vp, "boardflags2=%d", (b[SROM4_BFL3] << 16) | b[SROM4_BFL2]);
+               vp++;
+
+               /* The macaddr */
+               ea.octet[0] = (b[SROM4_MACHI] >> 8) & 0xff;
+               ea.octet[1] = b[SROM4_MACHI] & 0xff;
+               ea.octet[2] = (b[SROM4_MACMID] >> 8) & 0xff;
+               ea.octet[3] = b[SROM4_MACMID] & 0xff;
+               ea.octet[4] = (b[SROM4_MACLO] >> 8) & 0xff;
+               ea.octet[5] = b[SROM4_MACLO] & 0xff;
+               bcm_ether_ntoa(&ea, eabuf);
+               vp += sprintf(vp, "macaddr=%s", eabuf);
+               vp++;
+
+               w = b[SROM4_CCODE];
+               if (w == 0)
+                       vp += sprintf(vp, "ccode=");
+               else
+                       vp += sprintf(vp, "ccode=%c%c", (w >> 8), (w & 0xff));
+               vp++;
+               vp += sprintf(vp, "regrev=%d", b[SROM4_REGREV]);
+               vp++;
+
+               w = b[SROM4_LEDBH10];
+               if ((w != 0) && (w != 0xffff)) {
+                       /* ledbh0 */
+                       vp += sprintf(vp, "ledbh0=%d", (w & 0xff));
+                       vp++;
+
+                       /* ledbh1 */
+                       vp += sprintf(vp, "ledbh1=%d", (w >> 8) & 0xff);
+                       vp++;
+               }
+               w = b[SROM4_LEDBH32];
+               if ((w != 0) && (w != 0xffff)) {
+                       /* ledbh2 */
+                       vp += sprintf(vp, "ledbh2=%d", w & 0xff);
+                       vp++;
+
+                       /* ledbh3 */
+                       vp += sprintf(vp, "ledbh3=%d", (w >> 8) & 0xff);
+                       vp++;
+               }
+               /* LED Powersave duty cycle (oncount >> 24) (offcount >> 8) */
+               if (w != 0xffff) {
+                       w = b[SROM4_LEDDC];
+                       w32 = ((uint32)((unsigned char)(w >> 8) & 0xff) << 24) |  /* oncount */
+                               ((uint32)((unsigned char)(w & 0xff)) << 8); /* offcount */
+                       vp += sprintf(vp, "leddc=%d", w32);
+                       vp++;
+               }
+
+               w = b[SROM4_AA];
+               vp += sprintf(vp, "aa2g=%d", w & SROM4_AA2G_MASK);
+               vp++;
+               vp += sprintf(vp, "aa5g=%d", w >> SROM4_AA5G_SHIFT);
+               vp++;
+
+               w = b[SROM4_AG10];
+               vp += sprintf(vp, "ag0=%d", w & 0xff);
+               vp++;
+               vp += sprintf(vp, "ag1=%d", (w >> 8) & 0xff);
+               vp++;
+               w = b[SROM4_AG32];
+               vp += sprintf(vp, "ag2=%d", w & 0xff);
+               vp++;
+               vp += sprintf(vp, "ag3=%d", (w >> 8) & 0xff);
+               vp++;
+
+               /* Fixed power indices when power control is disabled */
+               for (i = 0; i < 2; i++) {
+                       w = b[SROM4_TXPID2G + i];
+                       vp += sprintf(vp, "txpid2ga%d=%d", 2 * i, w & 0xff);
+                       vp++;
+                       vp += sprintf(vp, "txpid2ga%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
+                       vp++;
+                       w = b[SROM4_TXPID5G + i];
+                       vp += sprintf(vp, "txpid5ga%d=%d", 2 * i, w & 0xff);
+                       vp++;
+                       vp += sprintf(vp, "txpid5ga%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
+                       vp++;
+                       w = b[SROM4_TXPID5GL + i];
+                       vp += sprintf(vp, "txpid5gla%d=%d", 2 * i, w & 0xff);
+                       vp++;
+                       vp += sprintf(vp, "txpid5gla%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
+                       vp++;
+                       w = b[SROM4_TXPID5GH + i];
+                       vp += sprintf(vp, "txpid5gha%d=%d", 2 * i, w & 0xff);
+                       vp++;
+                       vp += sprintf(vp, "txpid5gha%d=%d", (2 * i) + 1, (w >> 8) & 0xff);
+                       vp++;
+               }
+
+               /* Per path variables */
+               for (path = 0; path < MAX_PATH; path++) {
+                       pathbase = pathbases[path];
+                       w = b[pathbase + SROM4_2G_ITT_MAXP];
+                       vp += sprintf(vp, "itt2ga%d=%d", path, w >> B2G_ITT_SHIFT);
+                       vp++;
+                       vp += sprintf(vp, "maxp2ga%d=%d", path, w & B2G_MAXP_MASK);
+                       vp++;
+
+                       for (i = 0; i < 4; i++) {
+                               vp += sprintf(vp, "pa2gw%da%d=%d", i, path,
+                                             b[pathbase + SROM4_2G_PA + i]);
+                               vp++;
+                       }
+
+                       w = b[pathbase + SROM4_5G_ITT_MAXP];
+                       vp += sprintf(vp, "itt5ga%d=%d", path, w >> B5G_ITT_SHIFT);
+                       vp++;
+                       vp += sprintf(vp, "maxp5ga%d=%d", path, w & B5G_MAXP_MASK);
+                       vp++;
+
+                       w = b[pathbase + SROM4_5GLH_MAXP];
+                       vp += sprintf(vp, "maxp5lga%d=%d", path, w >> B5GL_MAXP_SHIFT);
+                       vp++;
+                       vp += sprintf(vp, "maxp5gha%d=%d", path, w & B5GH_MAXP_MASK);
+                       vp++;
+
+                       for (i = 0; i < 4; i++) {
+                               vp += sprintf(vp, "pa5gw%da%d=%d", i, path,
+                                             b[pathbase + SROM4_5G_PA + i]);
+                               vp++;
+                               vp += sprintf(vp, "pa5glw%da%d=%d", i, path,
+                                             b[pathbase + SROM4_5GL_PA + i]);
+                               vp++;
+                               vp += sprintf(vp, "pa5hgw%da%d=%d", i, path,
+                                             b[pathbase + SROM4_5GH_PA + i]);
+                               vp++;
+                       }
+               }
+
+               vp += sprintf(vp, "cck2gpo=%d", b[SROM4_2G_CCKPO]);
+               vp++;
+
+               w32 = ((uint32)b[SROM4_2G_OFDMPO + 1] << 16) | b[SROM4_2G_OFDMPO];
+               vp += sprintf(vp, "ofdm2gpo=%d", w32);
+               vp++;
+
+               w32 = ((uint32)b[SROM4_5G_OFDMPO + 1] << 16) | b[SROM4_5G_OFDMPO];
+               vp += sprintf(vp, "ofdm5gpo=%d", w32);
+               vp++;
+
+               w32 = ((uint32)b[SROM4_5GL_OFDMPO + 1] << 16) | b[SROM4_5GL_OFDMPO];
+               vp += sprintf(vp, "ofdm5glpo=%d", w32);
+               vp++;
+
+               w32 = ((uint32)b[SROM4_5GH_OFDMPO + 1] << 16) | b[SROM4_5GH_OFDMPO];
+               vp += sprintf(vp, "ofdm5ghpo=%d", w32);
+               vp++;
+
+               for (i = 0; i < 8; i++) {
+                       vp += sprintf(vp, "mcs2gpo%d=%d", i, b[SROM4_2G_MCSPO]);
+                       vp++;
+                       vp += sprintf(vp, "mcs5gpo%d=%d", i, b[SROM4_5G_MCSPO]);
+                       vp++;
+                       vp += sprintf(vp, "mcs5glpo%d=%d", i, b[SROM4_5GL_MCSPO]);
+                       vp++;
+                       vp += sprintf(vp, "mcs5ghpo%d=%d", i, b[SROM4_5GH_MCSPO]);
+                       vp++;
+               }
+
+               vp += sprintf(vp, "ccdpo%d=%d", i, b[SROM4_CCDPO]);
+               vp++;
+               vp += sprintf(vp, "stbcpo%d=%d", i, b[SROM4_STBCPO]);
+               vp++;
+               vp += sprintf(vp, "bw40po%d=%d", i, b[SROM4_BW40PO]);
+               vp++;
+               vp += sprintf(vp, "bwduppo%d=%d", i, b[SROM4_BWDUPPO]);
+               vp++;
+
+               goto done;
+       }
+       if (sromrev >= 3) {
+               /* New section takes over the 3th hardware function space */
+
+               /* Words 22+23 are 11a (mid) ofdm power offsets */
+               w32 = ((uint32)b[23] << 16) | b[22];
+               vp += sprintf(vp, "ofdmapo=%d", w32);
+               vp++;
+
+               /* Words 24+25 are 11a (low) ofdm power offsets */
+               w32 = ((uint32)b[25] << 16) | b[24];
+               vp += sprintf(vp, "ofdmalpo=%d", w32);
+               vp++;
+
+               /* Words 26+27 are 11a (high) ofdm power offsets */
+               w32 = ((uint32)b[27] << 16) | b[26];
+               vp += sprintf(vp, "ofdmahpo=%d", w32);
+               vp++;
+
+               /* LED Powersave duty cycle (oncount >> 24) (offcount >> 8) */
+               w32 = ((uint32)((unsigned char)(b[21] >> 8) & 0xff) << 24) |  /* oncount */
+                       ((uint32)((unsigned char)(b[21] & 0xff)) << 8); /* offcount */
+               vp += sprintf(vp, "leddc=%d", w32);
+
+               vp++;
+       }
+
+       if (sromrev >= 2) {
+               /* New section takes over the 4th hardware function space */
+
+               /* Word 29 is max power 11a high/low */
+               w = b[29];
+               vp += sprintf(vp, "pa1himaxpwr=%d", w & 0xff);
+               vp++;
+               vp += sprintf(vp, "pa1lomaxpwr=%d", (w >> 8) & 0xff);
+               vp++;
+
+               /* Words 30-32 set the 11alow pa settings,
+                * 33-35 are the 11ahigh ones.
+                */
+               for (i = 0; i < 3; i++) {
+                       vp += sprintf(vp, "pa1lob%d=%d", i, b[30 + i]);
+                       vp++;
+                       vp += sprintf(vp, "pa1hib%d=%d", i, b[33 + i]);
+                       vp++;
+               }
+               w = b[59];
+               if (w == 0)
+                       vp += sprintf(vp, "ccode=");
+               else
+                       vp += sprintf(vp, "ccode=%c%c", (w >> 8), (w & 0xff));
+               vp++;
+
+       }
+
+       /* parameter section of sprom starts at byte offset 72 */
+       woff = 72/2;
+
+       /* first 6 bytes are il0macaddr */
+       ea.octet[0] = (b[woff] >> 8) & 0xff;
+       ea.octet[1] = b[woff] & 0xff;
+       ea.octet[2] = (b[woff+1] >> 8) & 0xff;
+       ea.octet[3] = b[woff+1] & 0xff;
+       ea.octet[4] = (b[woff+2] >> 8) & 0xff;
+       ea.octet[5] = b[woff+2] & 0xff;
+       woff += 3;
+       bcm_ether_ntoa(&ea, eabuf);
+       vp += sprintf(vp, "il0macaddr=%s", eabuf);
+       vp++;
+
+       /* next 6 bytes are et0macaddr */
+       ea.octet[0] = (b[woff] >> 8) & 0xff;
+       ea.octet[1] = b[woff] & 0xff;
+       ea.octet[2] = (b[woff+1] >> 8) & 0xff;
+       ea.octet[3] = b[woff+1] & 0xff;
+       ea.octet[4] = (b[woff+2] >> 8) & 0xff;
+       ea.octet[5] = b[woff+2] & 0xff;
+       woff += 3;
+       bcm_ether_ntoa(&ea, eabuf);
+       vp += sprintf(vp, "et0macaddr=%s", eabuf);
+       vp++;
+
+       /* next 6 bytes are et1macaddr */
+       ea.octet[0] = (b[woff] >> 8) & 0xff;
+       ea.octet[1] = b[woff] & 0xff;
+       ea.octet[2] = (b[woff+1] >> 8) & 0xff;
+       ea.octet[3] = b[woff+1] & 0xff;
+       ea.octet[4] = (b[woff+2] >> 8) & 0xff;
+       ea.octet[5] = b[woff+2] & 0xff;
+       woff += 3;
+       bcm_ether_ntoa(&ea, eabuf);
+       vp += sprintf(vp, "et1macaddr=%s", eabuf);
+       vp++;
+
+       /*
+        * Enet phy settings one or two singles or a dual
+        * Bits 4-0 : MII address for enet0 (0x1f for not there)
+        * Bits 9-5 : MII address for enet1 (0x1f for not there)
+        * Bit 14   : Mdio for enet0
+        * Bit 15   : Mdio for enet1
+        */
+       w = b[woff];
+       vp += sprintf(vp, "et0phyaddr=%d", (w & 0x1f));
+       vp++;
+       vp += sprintf(vp, "et1phyaddr=%d", ((w >> 5) & 0x1f));
+       vp++;
+       vp += sprintf(vp, "et0mdcport=%d", ((w >> 14) & 0x1));
+       vp++;
+       vp += sprintf(vp, "et1mdcport=%d", ((w >> 15) & 0x1));
+       vp++;
+
+       /* Word 46 has board rev, antennas 0/1 & Country code/control */
+       w = b[46];
+       vp += sprintf(vp, "boardrev=%d", w & 0xff);
+       vp++;
+
+       if (sromrev > 1)
+               vp += sprintf(vp, "cctl=%d", (w >> 8) & 0xf);
+       else
+               vp += sprintf(vp, "cc=%d", (w >> 8) & 0xf);
+       vp++;
+
+       vp += sprintf(vp, "aa2g=%d", (w >> 12) & 0x3);
+       vp++;
+
+       vp += sprintf(vp, "aa5g=%d", (w >> 14) & 0x3);
+       vp++;
+
+       /* Words 47-49 set the (wl) pa settings */
+       woff = 47;
+
+       for (i = 0; i < 3; i++) {
+               vp += sprintf(vp, "pa0b%d=%d", i, b[woff+i]);
+               vp++;
+               vp += sprintf(vp, "pa1b%d=%d", i, b[woff+i+6]);
+               vp++;
+       }
+
+       /*
+        * Words 50-51 set the customer-configured wl led behavior.
+        * 8 bits/gpio pin.  High bit:  activehi=0, activelo=1;
+        * LED behavior values defined in wlioctl.h .
+        */
+       w = b[50];
+       if ((w != 0) && (w != 0xffff)) {
+               /* ledbh0 */
+               vp += sprintf(vp, "ledbh0=%d", (w & 0xff));
+               vp++;
+
+               /* ledbh1 */
+               vp += sprintf(vp, "ledbh1=%d", (w >> 8) & 0xff);
+               vp++;
+       }
+       w = b[51];
+       if ((w != 0) && (w != 0xffff)) {
+               /* ledbh2 */
+               vp += sprintf(vp, "ledbh2=%d", w & 0xff);
+               vp++;
+
+               /* ledbh */
+               vp += sprintf(vp, "ledbh3=%d", (w >> 8) & 0xff);
+               vp++;
+       }
+
+       /* Word 52 is max power 0/1 */
+       w = b[52];
+       vp += sprintf(vp, "pa0maxpwr=%d", w & 0xff);
+       vp++;
+       vp += sprintf(vp, "pa1maxpwr=%d", (w >> 8) & 0xff);
+       vp++;
+
+       /* Word 56 is idle tssi target 0/1 */
+       w = b[56];
+       vp += sprintf(vp, "pa0itssit=%d", w & 0xff);
+       vp++;
+       vp += sprintf(vp, "pa1itssit=%d", (w >> 8) & 0xff);
+       vp++;
+
+       /* Word 57 is boardflags, if not programmed make it zero */
+       w32 = (uint32)b[57];
+       if (w32 == 0xffff) w32 = 0;
+       if (sromrev > 1) {
+               /* Word 28 is the high bits of boardflags */
+               w32 |= (uint32)b[28] << 16;
+       }
+       vp += sprintf(vp, "boardflags=%d", w32);
+       vp++;
+
+       /* Word 58 is antenna gain 0/1 */
+       w = b[58];
+       vp += sprintf(vp, "ag0=%d", w & 0xff);
+       vp++;
+
+       vp += sprintf(vp, "ag1=%d", (w >> 8) & 0xff);
+       vp++;
+
+       if (sromrev == 1) {
+               /* set the oem string */
+               vp += sprintf(vp, "oem=%02x%02x%02x%02x%02x%02x%02x%02x",
+                             ((b[59] >> 8) & 0xff), (b[59] & 0xff),
+                             ((b[60] >> 8) & 0xff), (b[60] & 0xff),
+                             ((b[61] >> 8) & 0xff), (b[61] & 0xff),
+                             ((b[62] >> 8) & 0xff), (b[62] & 0xff));
+               vp++;
+       } else if (sromrev == 2) {
+               /* Word 60 OFDM tx power offset from CCK level */
+               /* OFDM Power Offset - opo */
+               vp += sprintf(vp, "opo=%d", b[60] & 0xff);
+               vp++;
+       } else {
+               /* Word 60: cck power offsets */
+               vp += sprintf(vp, "cckpo=%d", b[60]);
+               vp++;
+
+               /* Words 61+62: 11g ofdm power offsets */
+               w32 = ((uint32)b[62] << 16) | b[61];
+               vp += sprintf(vp, "ofdmgpo=%d", w32);
+               vp++;
+       }
+
+       /* final nullbyte terminator */
+done:  *vp++ = '\0';
+
+       ASSERT((vp - base) <= VARS_MAX);
+
+varsdone:
+       err = initvars_table(osh, base, vp, vars, count);
+
+err:
+#ifdef WLTEST
+       if (base != mfgsromvars)
+#endif
+               MFREE(osh, base, VARS_MAX);
+       MFREE(osh, b, SROM_MAX);
+       return err;
+}
+
+/*
+ * Read the cis and call parsecis to initialize the vars.
+ * Return 0 on success, nonzero on error.
+ */
+static int
+initvars_cis_pcmcia(void *sbh, osl_t *osh, char **vars, uint *count)
+{
+       uint8 *cis = NULL;
+       int rc;
+       uint data_sz;
+
+       data_sz = (sb_pcmciarev(sbh) == 1) ? (SPROM_SIZE * 2) : CIS_SIZE;
+
+       if ((cis = MALLOC(osh, data_sz)) == NULL)
+               return (-2);
+
+       if (sb_pcmciarev(sbh) == 1) {
+               if (srom_read(PCMCIA_BUS, (void *)NULL, osh, 0, data_sz, (uint16 *)cis)) {
+                       MFREE(osh, cis, data_sz);
+                       return (-1);
+               }
+               /* fix up endianess for 16-bit data vs 8-bit parsing */
+               ltoh16_buf((uint16 *)cis, data_sz);
+       } else
+               OSL_PCMCIA_READ_ATTR(osh, 0, cis, data_sz);
+
+       rc = srom_parsecis(osh, &cis, 1, vars, count);
+
+       MFREE(osh, cis, data_sz);
+
+       return (rc);
+}
+
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmutils.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/bcmutils.c
new file mode 100644 (file)
index 0000000..c7b0b3d
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+ * Misc useful OS-independent routines.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmutils.c,v 1.1.1.12 2006/02/27 03:43:16 honor Exp $
+ */
+
+#include <typedefs.h>
+#include <bcmdefs.h>
+#include <stdarg.h>
+#include <bcmutils.h>
+#include <osl.h>
+#include <sbutils.h>
+#include <bcmnvram.h>
+#include <bcmendian.h>
+#include <bcmdevs.h>
+
+unsigned char bcm_ctype[] = {
+       _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 0-7 */
+       _BCM_C, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C|_BCM_S, _BCM_C,
+       _BCM_C, /* 8-15 */
+       _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 16-23 */
+       _BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,_BCM_C,                        /* 24-31 */
+       _BCM_S|_BCM_SP,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                /* 32-39 */
+       _BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 40-47 */
+       _BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,_BCM_D,                        /* 48-55 */
+       _BCM_D,_BCM_D,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 56-63 */
+       _BCM_P, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X, _BCM_U|_BCM_X,
+       _BCM_U|_BCM_X, _BCM_U, /* 64-71 */
+       _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,                        /* 72-79 */
+       _BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,_BCM_U,                        /* 80-87 */
+       _BCM_U,_BCM_U,_BCM_U,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_P,                        /* 88-95 */
+       _BCM_P, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X, _BCM_L|_BCM_X,
+       _BCM_L|_BCM_X, _BCM_L, /* 96-103 */
+       _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 104-111 */
+       _BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L,_BCM_L, /* 112-119 */
+       _BCM_L,_BCM_L,_BCM_L,_BCM_P,_BCM_P,_BCM_P,_BCM_P,_BCM_C, /* 120-127 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,         /* 128-143 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,         /* 144-159 */
+       _BCM_S|_BCM_SP, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
+       _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 160-175 */
+       _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P,
+       _BCM_P, _BCM_P, _BCM_P, _BCM_P, _BCM_P, /* 176-191 */
+       _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U,
+       _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, /* 192-207 */
+       _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_P, _BCM_U, _BCM_U, _BCM_U,
+       _BCM_U, _BCM_U, _BCM_U, _BCM_U, _BCM_L, /* 208-223 */
+       _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L,
+       _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, /* 224-239 */
+       _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_P, _BCM_L, _BCM_L, _BCM_L,
+       _BCM_L, _BCM_L, _BCM_L, _BCM_L, _BCM_L /* 240-255 */
+};
+
+
+ulong
+bcm_strtoul(char *cp, char **endp, uint base)
+{
+       ulong result, value;
+       bool minus;
+
+       minus = FALSE;
+
+       while (bcm_isspace(*cp))
+               cp++;
+
+       if (cp[0] == '+')
+               cp++;
+       else if (cp[0] == '-') {
+               minus = TRUE;
+               cp++;
+       }
+
+       if (base == 0) {
+               if (cp[0] == '0') {
+                       if ((cp[1] == 'x') || (cp[1] == 'X')) {
+                               base = 16;
+                               cp = &cp[2];
+                       } else {
+                               base = 8;
+                               cp = &cp[1];
+                       }
+               } else
+                       base = 10;
+       } else if (base == 16 && (cp[0] == '0') && ((cp[1] == 'x') || (cp[1] == 'X'))) {
+               cp = &cp[2];
+       }
+
+       result = 0;
+
+       while (bcm_isxdigit(*cp) &&
+              (value = bcm_isdigit(*cp) ? *cp-'0' : bcm_toupper(*cp)-'A'+10) < base) {
+               result = result*base + value;
+               cp++;
+       }
+
+       if (minus)
+               result = (ulong)(result * -1);
+
+       if (endp)
+               *endp = (char *)cp;
+
+       return (result);
+}
+
+uchar
+bcm_toupper(uchar c)
+{
+       if (bcm_islower(c))
+               c -= 'a'-'A';
+       return (c);
+}
+
+char*
+bcm_ether_ntoa(struct ether_addr *ea, char *buf)
+{
+       sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x",
+               ea->octet[0]&0xff, ea->octet[1]&0xff, ea->octet[2]&0xff,
+               ea->octet[3]&0xff, ea->octet[4]&0xff, ea->octet[5]&0xff);
+       return (buf);
+}
+
+
+/*
+ * Search the name=value vars for a specific one and return its value.
+ * Returns NULL if not found.
+ */
+char*
+getvar(char *vars, char *name)
+{
+       char *s;
+       int len;
+
+       len = strlen(name);
+
+       /* first look in vars[] */
+       for (s = vars; s && *s;) {
+               /* CSTYLED */
+               if ((memcmp(s, name, len) == 0) && (s[len] == '='))
+                       return (&s[len+1]);
+
+               while (*s++)
+                       ;
+       }
+
+       /* then query nvram */
+       return (nvram_get(name));
+}
+
+/*
+ * Search the vars for a specific one and return its value as
+ * an integer. Returns 0 if not found.
+ */
+int
+getintvar(char *vars, char *name)
+{
+       char *val;
+
+       if ((val = getvar(vars, name)) == NULL)
+               return (0);
+
+       return (bcm_strtoul(val, NULL, 0));
+}
+
+
+/*******************************************************************************
+ * crc8
+ *
+ * Computes a crc8 over the input data using the polynomial:
+ *
+ *       x^8 + x^7 +x^6 + x^4 + x^2 + 1
+ *
+ * The caller provides the initial value (either CRC8_INIT_VALUE
+ * or the previous returned value) to allow for processing of
+ * discontiguous blocks of data.  When generating the CRC the
+ * caller is responsible for complementing the final return value
+ * and inserting it into the byte stream.  When checking, a final
+ * return value of CRC8_GOOD_VALUE indicates a valid CRC.
+ *
+ * Reference: Dallas Semiconductor Application Note 27
+ *   Williams, Ross N., "A Painless Guide to CRC Error Detection Algorithms",
+ *     ver 3, Aug 1993, ross@guest.adelaide.edu.au, Rocksoft Pty Ltd.,
+ *     ftp://ftp.rocksoft.com/clients/rocksoft/papers/crc_v3.txt
+ *
+ * ****************************************************************************
+ */
+
+static uint8 crc8_table[256] = {
+    0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B,
+    0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21,
+    0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF,
+    0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5,
+    0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14,
+    0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E,
+    0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80,
+    0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA,
+    0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95,
+    0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF,
+    0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01,
+    0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B,
+    0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA,
+    0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0,
+    0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E,
+    0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34,
+    0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0,
+    0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A,
+    0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54,
+    0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E,
+    0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF,
+    0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5,
+    0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B,
+    0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61,
+    0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E,
+    0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74,
+    0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA,
+    0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0,
+    0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41,
+    0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B,
+    0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5,
+    0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F
+};
+
+#define CRC_INNER_LOOP(n, c, x) \
+       (c) = ((c) >> 8) ^ crc##n##_table[((c) ^ (x)) & 0xff]
+
+uint8
+hndcrc8(
+       uint8 *pdata,   /* pointer to array of data to process */
+       uint  nbytes,   /* number of input data bytes to process */
+       uint8 crc       /* either CRC8_INIT_VALUE or previous return value */
+)
+{
+       /* hard code the crc loop instead of using CRC_INNER_LOOP macro
+        * to avoid the undefined and unnecessary (uint8 >> 8) operation.
+        */
+       while (nbytes-- > 0)
+               crc = crc8_table[(crc ^ *pdata++) & 0xff];
+
+       return crc;
+}
+
+
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/compressed/Makefile b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/compressed/Makefile
new file mode 100644 (file)
index 0000000..2942c8e
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# Makefile for Broadcom BCM947XX boards
+#
+# Copyright 2001-2003, Broadcom Corporation
+# All Rights Reserved.
+# 
+# THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+# KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+# SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+# FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+#
+# $Id: Makefile,v 1.2 2005/04/02 12:12:57 wbx Exp $
+#
+
+OBJCOPY_ARGS   = -O binary -R .reginfo -R .note -R .comment -R .mdebug -S
+SYSTEM         ?= $(TOPDIR)/vmlinux
+
+all: vmlinuz
+
+# Don't build dependencies, this may die if $(CC) isn't gcc
+dep:
+
+# Create a gzipped version named vmlinuz for compatibility
+vmlinuz: piggy
+       gzip -c9 $< > $@
+
+piggy: $(SYSTEM)
+       $(OBJCOPY) $(OBJCOPY_ARGS) $< $@
+
+mrproper: clean
+
+clean:
+       rm -f vmlinuz piggy
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/export.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/export.c
new file mode 100644 (file)
index 0000000..9da9572
--- /dev/null
@@ -0,0 +1,71 @@
+#include <linux/module.h>
+
+#define _export(n) \
+               void n(void); \
+               EXPORT_SYMBOL(n);
+
+_export(bcm947xx_sbh)
+
+_export(sb_attach)
+_export(sb_kattach)
+_export(sb_boardtype)
+_export(sb_boardvendor)
+_export(sb_btcgpiowar)
+_export(sb_bus)
+_export(sb_chip)
+_export(sb_chiprev)
+_export(sb_chipcrev)
+_export(sb_chippkg)
+_export(sb_clkctl_clk)
+_export(sb_clkctl_fast_pwrup_delay)
+_export(sb_clkctl_init)
+_export(sb_clkctl_xtal)
+_export(sb_core_disable)
+_export(sb_core_reset)
+_export(sb_core_tofixup)
+_export(sb_coreflags)
+_export(sb_coreflagshi)
+_export(sb_coreidx)
+_export(sb_coreregs)
+_export(sb_corerev)
+_export(sb_coreunit)
+_export(sb_detach)
+_export(sb_deviceremoved)
+_export(sb_gpiosetcore)
+_export(sb_gpiocontrol)
+_export(sb_gpiointmask)
+_export(sb_gpiointpolarity)
+_export(sb_gpioled)
+_export(sb_gpioin)
+_export(sb_gpioout)
+_export(sb_gpioouten)
+_export(sb_gpiotimerval)
+_export(sb_irq)
+_export(sb_iscoreup)
+_export(sb_pci_setup)
+_export(sb_pcirev)
+_export(sb_pcmcia_init)
+_export(sb_pcmciarev)
+_export(sb_register_intr_callback)
+_export(sb_setcore)
+_export(sb_setcoreidx)
+_export(sb_war16165)
+_export(sb_war32414_forceHT)
+_export(sb_osh)
+               
+_export(getvar)
+_export(getintvar)
+_export(bcm_strtoul)
+_export(bcm_ctype)
+_export(bcm_toupper)
+_export(bcm_ether_ntoa)
+
+_export(nvram_get)
+_export(nvram_getall)
+_export(nvram_set)
+_export(nvram_unset)
+_export(nvram_commit)
+
+_export(srom_read)
+_export(srom_write)
+
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/Makefile b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/Makefile
new file mode 100644 (file)
index 0000000..7e03a34
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Makefile for the BCM947xx specific kernel interface routines
+# under Linux.
+#
+EXTRA_CFLAGS += -fno-delayed-branch
+USE_STANDARD_AS_RULE := true
+
+O_TARGET        := brcm.o
+
+obj-y  := int-handler.o irq.o
+
+include $(TOPDIR)/Rules.make
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/int-handler.S b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/int-handler.S
new file mode 100644 (file)
index 0000000..cdb45c3
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Generic interrupt handler for Broadcom MIPS boards
+ *
+ * Copyright 2004, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: int-handler.S,v 1.1 2005/03/16 13:50:00 wbx Exp $
+ */
+
+#include <linux/config.h>
+
+#include <asm/asm.h>
+#include <asm/mipsregs.h>
+#include <asm/regdef.h>
+#include <asm/stackframe.h>
+
+/*
+ *     MIPS IRQ        Source
+ *      --------        ------
+ *             0       Software (ignored)
+ *             1        Software (ignored)
+ *             2        Combined hardware interrupt (hw0)
+ *             3        Hardware
+ *             4        Hardware
+ *             5        Hardware
+ *             6        Hardware
+ *             7        R4k timer
+ */
+
+       .text
+       .set    noreorder
+       .set    noat
+       .align  5
+       NESTED(brcmIRQ, PT_SIZE, sp)
+       SAVE_ALL
+       CLI
+       .set    at
+    .set    noreorder
+
+       jal         brcm_irq_dispatch
+        move   a0, sp
+
+       j           ret_from_irq
+        nop
+               
+       END(brcmIRQ)
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/irq.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/generic/irq.c
new file mode 100644 (file)
index 0000000..698598b
--- /dev/null
@@ -0,0 +1,130 @@
+/*
+ * Generic interrupt control functions for Broadcom MIPS boards
+ *
+ * Copyright 2004, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: irq.c,v 1.1 2005/03/16 13:50:00 wbx Exp $
+ */
+
+#include <linux/config.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+
+#include <asm/irq.h>
+#include <asm/mipsregs.h>
+#include <asm/gdb-stub.h>
+
+#define ALLINTS (IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5)
+
+extern asmlinkage void brcmIRQ(void);
+extern asmlinkage unsigned int do_IRQ(int irq, struct pt_regs *regs);
+
+void
+brcm_irq_dispatch(struct pt_regs *regs)
+{
+       u32 cause;
+
+       cause = read_c0_cause() &
+               read_c0_status() &
+               CAUSEF_IP;
+
+#ifdef CONFIG_KERNPROF
+       change_c0_status(cause | 1, 1);
+#else
+       clear_c0_status(cause);
+#endif
+
+       if (cause & CAUSEF_IP7)
+               do_IRQ(7, regs);
+       if (cause & CAUSEF_IP2)
+               do_IRQ(2, regs);
+       if (cause & CAUSEF_IP3)
+               do_IRQ(3, regs);
+       if (cause & CAUSEF_IP4)
+               do_IRQ(4, regs);
+       if (cause & CAUSEF_IP5)
+               do_IRQ(5, regs);
+       if (cause & CAUSEF_IP6)
+               do_IRQ(6, regs);
+}
+
+static void
+enable_brcm_irq(unsigned int irq)
+{
+       if (irq < 8)
+               set_c0_status(1 << (irq + 8));
+       else
+               set_c0_status(IE_IRQ0);
+}
+
+static void
+disable_brcm_irq(unsigned int irq)
+{
+       if (irq < 8)
+               clear_c0_status(1 << (irq + 8));
+       else
+               clear_c0_status(IE_IRQ0);
+}
+
+static void
+ack_brcm_irq(unsigned int irq)
+{
+       /* Already done in brcm_irq_dispatch */
+}
+
+static unsigned int
+startup_brcm_irq(unsigned int irq)
+{ 
+       enable_brcm_irq(irq);
+
+       return 0; /* never anything pending */
+}
+
+static void
+end_brcm_irq(unsigned int irq)
+{
+       if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS)))
+               enable_brcm_irq(irq);
+}
+
+static struct hw_interrupt_type brcm_irq_type = {
+       typename: "MIPS",
+       startup: startup_brcm_irq,
+       shutdown: disable_brcm_irq,
+       enable: enable_brcm_irq,
+       disable: disable_brcm_irq,
+       ack: ack_brcm_irq,
+       end: end_brcm_irq,
+       NULL
+};
+
+void __init
+init_IRQ(void)
+{
+       int i;
+
+       for (i = 0; i < NR_IRQS; i++) {
+               irq_desc[i].status = IRQ_DISABLED;
+               irq_desc[i].action = 0;
+               irq_desc[i].depth = 1;
+               irq_desc[i].handler = &brcm_irq_type;
+       }
+
+       set_except_vector(0, brcmIRQ);
+       change_c0_status(ST0_IM, ALLINTS);
+
+#ifdef CONFIG_REMOTE_DEBUG
+       printk("Breaking into debugger...\n");
+       set_debug_traps();
+       breakpoint(); 
+#endif
+}
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/gpio.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/gpio.c
new file mode 100644 (file)
index 0000000..c31f58b
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * GPIO char driver
+ *
+ * Copyright 2005, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/fs.h>
+#include <linux/miscdevice.h>
+#include <asm/uaccess.h>
+
+#include <typedefs.h>
+#include <osl.h>
+#include <bcmutils.h>
+#include <sbutils.h>
+#include <bcmdevs.h>
+
+static sb_t *gpio_sbh;
+static int gpio_major;
+static devfs_handle_t gpio_dir;
+static struct {
+       char *name;
+       devfs_handle_t handle;
+} gpio_file[] = {
+       { "in", NULL },
+       { "out", NULL },
+       { "outen", NULL },
+       { "control", NULL }
+};
+
+static int
+gpio_open(struct inode *inode, struct file * file)
+{
+       if (MINOR(inode->i_rdev) > ARRAYSIZE(gpio_file))
+               return -ENODEV;
+
+       MOD_INC_USE_COUNT;
+       return 0;
+}
+
+static int
+gpio_release(struct inode *inode, struct file * file)
+{
+       MOD_DEC_USE_COUNT;
+       return 0;
+}
+
+static ssize_t
+gpio_read(struct file *file, char *buf, size_t count, loff_t *ppos)
+{
+       u32 val;
+
+       switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
+       case 0:
+               val = sb_gpioin(gpio_sbh);
+               break;
+       case 1:
+               val = sb_gpioout(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
+               break;
+       case 2:
+               val = sb_gpioouten(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
+               break;
+       case 3:
+               val = sb_gpiocontrol(gpio_sbh, 0, 0, GPIO_DRV_PRIORITY);
+               break;
+       default:
+               return -ENODEV;
+       }
+
+       if (put_user(val, (u32 *) buf))
+               return -EFAULT;
+
+       return sizeof(val);
+}
+
+static ssize_t
+gpio_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
+{
+       u32 val;
+
+       if (get_user(val, (u32 *) buf))
+               return -EFAULT;
+
+       switch (MINOR(file->f_dentry->d_inode->i_rdev)) {
+       case 0:
+               return -EACCES;
+       case 1:
+               sb_gpioout(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
+               break;
+       case 2:
+               sb_gpioouten(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
+               break;
+       case 3:
+               sb_gpiocontrol(gpio_sbh, ~0, val, GPIO_DRV_PRIORITY);
+               break;
+       default:
+               return -ENODEV;
+       }
+
+       return sizeof(val);
+}
+
+static struct file_operations gpio_fops = {
+       owner:          THIS_MODULE,
+       open:           gpio_open,
+       release:        gpio_release,
+       read:           gpio_read,
+       write:          gpio_write,
+};
+
+static int __init
+gpio_init(void)
+{
+       int i;
+
+       if (!(gpio_sbh = sb_kattach()))
+               return -ENODEV;
+
+       sb_gpiosetcore(gpio_sbh);
+
+       if ((gpio_major = devfs_register_chrdev(0, "gpio", &gpio_fops)) < 0)
+               return gpio_major;
+
+       gpio_dir = devfs_mk_dir(NULL, "gpio", NULL);
+
+       for (i = 0; i < ARRAYSIZE(gpio_file); i++) {
+               gpio_file[i].handle = devfs_register(gpio_dir,
+                                                    gpio_file[i].name,
+                                                    DEVFS_FL_DEFAULT, gpio_major, i,
+                                                    S_IFCHR | S_IRUGO | S_IWUGO,
+                                                    &gpio_fops, NULL);
+       }
+
+       return 0;
+}
+
+static void __exit
+gpio_exit(void)
+{
+       int i;
+
+       for (i = 0; i < ARRAYSIZE(gpio_file); i++)
+               devfs_unregister(gpio_file[i].handle);
+       devfs_unregister(gpio_dir);
+       devfs_unregister_chrdev(gpio_major, "gpio");
+       sb_detach(gpio_sbh);
+}
+
+module_init(gpio_init);
+module_exit(gpio_exit);
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/hndchipc.c b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/hndchipc.c
new file mode 100644 (file)
index 0000000..6502078
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * BCM47XX support code for some chipcommon (old extif) facilities (uart)
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: hndchipc.c,v 1.1.1.1 2006/02/27 03:43:16 honor Exp $
+ */
+
+#include <typedefs.h>
+#include <bcmdefs.h>
+#include <osl.h>
+#include <bcmutils.h>
+#include <sbutils.h>
+#include <bcmdevs.h>
+#include <bcmnvram.h>
+#include <sbconfig.h>
+#include <sbextif.h>
+#include <sbchipc.h>
+#include <hndcpu.h>
+
+/*
+ * Returns TRUE if an external UART exists at the given base
+ * register.
+ */
+static bool
+BCMINITFN(serial_exists)(osl_t *osh, uint8 *regs)
+{
+       uint8 save_mcr, status1;
+
+       save_mcr = R_REG(osh, &regs[UART_MCR]);
+       W_REG(osh, &regs[UART_MCR], UART_MCR_LOOP | 0x0a);
+       status1 = R_REG(osh, &regs[UART_MSR]) & 0xf0;
+       W_REG(osh, &regs[UART_MCR], save_mcr);
+
+       return (status1 == 0x90);
+}
+
+/*
+ * Initializes UART access. The callback function will be called once
+ * per found UART.
+ */
+void
+BCMINITFN(sb_serial_init)(sb_t *sbh, void (*add)(void *regs, uint irq, uint baud_base,
+                                                 uint reg_shift))
+{
+       osl_t *osh;
+       void *regs;
+       ulong base;
+       uint irq;
+       int i, n;
+
+       osh = sb_osh(sbh);
+
+       if ((regs = sb_setcore(sbh, SB_EXTIF, 0))) {
+               extifregs_t *eir = (extifregs_t *) regs;
+               sbconfig_t *sb;
+
+               /* Determine external UART register base */
+               sb = (sbconfig_t *)((ulong) eir + SBCONFIGOFF);
+               base = EXTIF_CFGIF_BASE(sb_base(R_REG(osh, &sb->sbadmatch1)));
+
+               /* Determine IRQ */
+               irq = sb_irq(sbh);
+
+               /* Disable GPIO interrupt initially */
+               W_REG(osh, &eir->gpiointpolarity, 0);
+               W_REG(osh, &eir->gpiointmask, 0);
+
+               /* Search for external UARTs */
+               n = 2;
+               for (i = 0; i < 2; i++) {
+                       regs = (void *) REG_MAP(base + (i * 8), 8);
+                       if (serial_exists(osh, regs)) {
+                               /* Set GPIO 1 to be the external UART IRQ */
+                               W_REG(osh, &eir->gpiointmask, 2);
+                               /* XXXDetermine external UART clock */
+                               if (add)
+                                       add(regs, irq, 13500000, 0);
+                       }
+               }
+
+               /* Add internal UART if enabled */
+               if (R_REG(osh, &eir->corecontrol) & CC_UE)
+                       if (add)
+                               add((void *) &eir->uartdata, irq, sb_clock(sbh), 2);
+       } else if ((regs = sb_setcore(sbh, SB_CC, 0))) {
+               chipcregs_t *cc = (chipcregs_t *) regs;
+               uint32 rev, cap, pll, baud_base, div;
+
+               /* Determine core revision and capabilities */
+               rev = sb_corerev(sbh);
+               cap = R_REG(osh, &cc->capabilities);
+               pll = cap & CAP_PLL_MASK;
+
+               /* Determine IRQ */
+               irq = sb_irq(sbh);
+
+               if (pll == PLL_TYPE1) {
+                       /* PLL clock */
+                       baud_base = sb_clock_rate(pll,
+                                                 R_REG(osh, &cc->clockcontrol_n),
+                                                 R_REG(osh, &cc->clockcontrol_m2));
+                       div = 1;
+               } else {
+                       /* Fixed ALP clock */
+                       if (rev >= 11 && rev != 15) {
+                               baud_base = 20000000;
+                               div = 1;
+                               /* Set the override bit so we don't divide it */
+                               W_REG(osh, &cc->corecontrol, CC_UARTCLKO);
+                       }
+                       /* Internal backplane clock */
+                       else if (rev >= 3) {
+                               baud_base = sb_clock(sbh);
+                               div = 2;        /* Minimum divisor */
+                               W_REG(osh, &cc->clkdiv,
+                                     ((R_REG(osh, &cc->clkdiv) & ~CLKD_UART) | div));
+                       }
+                       /* Fixed internal backplane clock */
+                       else {
+                               baud_base = 88000000;
+                               div = 48;
+                       }
+
+                       /* Clock source depends on strapping if UartClkOverride is unset */
+                       if ((rev > 0) &&
+                           ((R_REG(osh, &cc->corecontrol) & CC_UARTCLKO) == 0)) {
+                               if ((cap & CAP_UCLKSEL) == CAP_UINTCLK) {
+                                       /* Internal divided backplane clock */
+                                       baud_base /= div;
+                               } else {
+                                       /* Assume external clock of 1.8432 MHz */
+                                       baud_base = 1843200;
+                               }
+                       }
+               }
+
+               /* Add internal UARTs */
+               n = cap & CAP_UARTS_MASK;
+               for (i = 0; i < n; i++) {
+                       /* Register offset changed after revision 0 */
+                       if (rev)
+                               regs = (void *)((ulong) &cc->uart0data + (i * 256));
+                       else
+                               regs = (void *)((ulong) &cc->uart0data + (i * 8));
+
+                       if (add)
+                               add(regs, irq, baud_base, 0);
+               }
+       }
+}
+
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcm4710.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcm4710.h
new file mode 100644 (file)
index 0000000..416e5cb
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * BCM4710 address space map and definitions
+ * Think twice before adding to this file, this is not the kitchen sink
+ * These definitions are not guaranteed for all 47xx chips, only the 4710
+ *
+ * Copyright 2004, Broadcom Corporation   
+ * All Rights Reserved.   
+ *    
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY   
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM   
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS   
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.   
+ *
+ * $Id: bcm4710.h,v 1.3 2004/09/27 07:23:30 tallest Exp $
+ */
+
+#ifndef _bcm4710_h_
+#define _bcm4710_h_
+
+/* Address map */
+#define BCM4710_SDRAM          0x00000000      /* Physical SDRAM */
+#define BCM4710_PCI_MEM                0x08000000      /* Host Mode PCI memory access space (64 MB) */
+#define BCM4710_PCI_CFG                0x0c000000      /* Host Mode PCI configuration space (64 MB) */
+#define BCM4710_PCI_DMA                0x40000000      /* Client Mode PCI memory access space (1 GB) */
+#define        BCM4710_SDRAM_SWAPPED   0x10000000      /* Byteswapped Physical SDRAM */
+#define BCM4710_ENUM           0x18000000      /* Beginning of core enumeration space */
+
+/* Core register space */
+#define BCM4710_REG_SDRAM      0x18000000      /* SDRAM core registers */
+#define BCM4710_REG_ILINE20    0x18001000      /* InsideLine20 core registers */
+#define BCM4710_REG_EMAC0      0x18002000      /* Ethernet MAC 0 core registers */
+#define BCM4710_REG_CODEC      0x18003000      /* Codec core registers */
+#define BCM4710_REG_USB                0x18004000      /* USB core registers */
+#define BCM4710_REG_PCI                0x18005000      /* PCI core registers */
+#define BCM4710_REG_MIPS       0x18006000      /* MIPS core registers */
+#define BCM4710_REG_EXTIF      0x18007000      /* External Interface core registers */
+#define BCM4710_REG_EMAC1      0x18008000      /* Ethernet MAC 1 core registers */
+
+#define        BCM4710_EXTIF           0x1f000000      /* External Interface base address */
+#define BCM4710_PCMCIA_MEM     0x1f000000      /* External Interface PCMCIA memory access */
+#define BCM4710_PCMCIA_IO      0x1f100000      /* PCMCIA I/O access */
+#define BCM4710_PCMCIA_CONF    0x1f200000      /* PCMCIA configuration */
+#define BCM4710_PROG           0x1f800000      /* Programable interface */
+#define BCM4710_FLASH          0x1fc00000      /* Flash */
+
+#define        BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
+
+#define        BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
+
+#define        BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
+#define        BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
+
+#define        SBFLAG_PCI      0
+#define        SBFLAG_ENET0    1
+#define        SBFLAG_ILINE20  2
+#define        SBFLAG_CODEC    3
+#define        SBFLAG_USB      4
+#define        SBFLAG_EXTIF    5
+#define        SBFLAG_ENET1    6
+
+#ifdef CONFIG_HWSIM
+#define        BCM4710_TRACE(trval)        do { *((int *)0xa0000f18) = (trval); } while (0)
+#else
+#define        BCM4710_TRACE(trval)
+#endif
+
+
+/* BCM94702 CPCI -ExtIF used for LocalBus devs */
+
+#define BCM94702_CPCI_RESET_ADDR        BCM4710_EXTIF
+#define BCM94702_CPCI_BOARDID_ADDR     (BCM4710_EXTIF | 0x4000)
+#define BCM94702_CPCI_DOC_ADDR         (BCM4710_EXTIF | 0x6000)
+#define BCM94702_DOC_ADDR                BCM94702_CPCI_DOC_ADDR
+#define BCM94702_CPCI_LED_ADDR         (BCM4710_EXTIF | 0xc000)
+#define BCM94702_CPCI_NVRAM_ADDR       (BCM4710_EXTIF | 0xe000)
+#define BCM94702_CPCI_NVRAM_SIZE         0x1ff0 /* 8K NVRAM : DS1743/STM48txx*/
+#define BCM94702_CPCI_TOD_REG_BASE       (BCM94702_CPCI_NVRAM_ADDR | 0x1ff0)
+
+#define LED_REG(x)      \
+ (*(volatile unsigned char *) (KSEG1ADDR(BCM94702_CPCI_LED_ADDR) + (x)))
+
+/* 
+ * Reset function implemented in PLD.  Read or write should trigger hard reset 
+ */
+#define SYS_HARD_RESET()   \
+    { for (;;) \
+     *( (volatile unsigned char *)\
+      KSEG1ADDR(BCM94702_CPCI_RESET_ADDR) ) = 0x80; \
+    }
+
+#endif /* _bcm4710_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdefs.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdefs.h
new file mode 100644 (file)
index 0000000..8b5abe5
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Misc system wide definitions
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmdefs.h,v 1.1.1.3 2006/04/08 06:13:39 honor Exp $
+ */
+
+#ifndef        _bcmdefs_h_
+#define        _bcmdefs_h_
+
+/*
+ * One doesn't need to include this file explicitly, gets included automatically if
+ * typedefs.h is included.
+ */
+
+/* Reclaiming text and data :
+ * The following macros specify special linker sections that can be reclaimed
+ * after a system is considered 'up'.
+ */
+#if defined(__GNUC__) && defined(BCMRECLAIM)
+extern bool    bcmreclaimed;
+#define BCMINITDATA(_data)     __attribute__ ((__section__ (".dataini." #_data))) _data
+#define BCMINITFN(_fn)         __attribute__ ((__section__ (".textini." #_fn))) _fn
+#else /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
+#define BCMINITDATA(_data)     _data
+#define BCMINITFN(_fn)         _fn
+#define bcmreclaimed           0
+#endif /* #if defined(__GNUC__) && defined(BCMRECLAIM) */
+
+/* Reclaim uninit functions if BCMNODOWN is defined            */
+/* and if they are not already removed by -gc-sections */
+#ifdef BCMNODOWN
+#define BCMUNINITFN(_fn)               BCMINITFN(_fn)
+#else
+#define BCMUNINITFN(_fn)               _fn
+#endif
+
+#ifdef BCMRECLAIM
+#define CONST
+#else
+#define CONST  const
+#endif /* BCMRECLAIM */
+
+/* Compatibility with old-style BCMRECLAIM */
+#define BCMINIT(_id)           _id
+
+
+/* Put some library data/code into ROM to reduce RAM requirements */
+#if defined(__GNUC__) && defined(BCMROMOFFLOAD)
+#define BCMROMDATA(_data)      __attribute__ ((__section__ (".datarom." #_data))) _data
+#define BCMROMFN(_fn)          __attribute__ ((__section__ (".textrom." #_fn))) _fn
+#else
+#define BCMROMDATA(_data)      _data
+#define BCMROMFN(_fn)          _fn
+#endif
+
+/* Bus types */
+#define        SB_BUS                  0       /* Silicon Backplane */
+#define        PCI_BUS                 1       /* PCI target */
+#define        PCMCIA_BUS              2       /* PCMCIA target */
+#define SDIO_BUS               3       /* SDIO target */
+#define JTAG_BUS               4       /* JTAG */
+#define NO_BUS                 0xFF    /* Bus that does not support R/W REG */
+
+/* Allows optimization for single-bus support */
+#ifdef BCMBUSTYPE
+#define BUSTYPE(bus) (BCMBUSTYPE)
+#else
+#define BUSTYPE(bus) (bus)
+#endif
+
+/* Defines for DMA Address Width - Shared between OSL and HNDDMA */
+#define DMADDR_MASK_32 0x0             /* Address mask for 32-bits */
+#define DMADDR_MASK_30 0xc0000000      /* Address mask for 30-bits */
+#define DMADDR_MASK_0  0xffffffff      /* Address mask for 0-bits (hi-part) */
+
+#define        DMADDRWIDTH_30  30 /* 30-bit addressing capability */
+#define        DMADDRWIDTH_32  32 /* 32-bit addressing capability */
+#define        DMADDRWIDTH_63  63 /* 64-bit addressing capability */
+#define        DMADDRWIDTH_64  64 /* 64-bit addressing capability */
+
+/* packet headroom necessary to accomodate the largest header in the system, (i.e TXOFF).
+ * By doing, we avoid the need  to allocate an extra buffer for the header when bridging to WL.
+ * There is a compile time check in wlc.c which ensure that this value is at least as big
+ * as TXOFF. This value is used in dma_rxfill (hnddma.c).
+ */
+#define BCMEXTRAHDROOM 160
+
+/* Headroom required for dongle-to-host communication.  Packets allocated
+ * locally in the dongle (e.g. for CDC ioctls or RNDIS messages) should
+ * leave this much room in front for low-level message headers which may
+ * be needed to get across the dongle bus to the host.  (These messages
+ * don't go over the network, so room for the full WL header above would
+ * be a waste.)
+ */
+#define BCMDONGLEHDRSZ 8
+
+
+
+#endif /* _bcmdefs_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs.h
new file mode 100644 (file)
index 0000000..2e80658
--- /dev/null
@@ -0,0 +1,369 @@
+/*
+ * Broadcom device-specific manifest constants.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmdevs.h,v 1.1.1.17 2006/04/15 01:29:08 michael Exp $
+ */
+
+#ifndef        _BCMDEVS_H
+#define        _BCMDEVS_H
+
+#include "bcm4710.h"
+
+/* Known PCI vendor Id's */
+#define        VENDOR_EPIGRAM          0xfeda
+#define        VENDOR_BROADCOM         0x14e4
+#define        VENDOR_3COM             0x10b7
+#define        VENDOR_NETGEAR          0x1385
+#define        VENDOR_DIAMOND          0x1092
+#define        VENDOR_DELL             0x1028
+#define        VENDOR_HP               0x0e11
+#define        VENDOR_APPLE            0x106b
+
+/* PCI Device Id's */
+#define        BCM4210_DEVICE_ID       0x1072          /* never used */
+#define        BCM4211_DEVICE_ID       0x4211
+#define        BCM4230_DEVICE_ID       0x1086          /* never used */
+#define        BCM4231_DEVICE_ID       0x4231
+
+#define        BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
+#define        BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
+#define        BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
+#define        BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
+
+#define        BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
+#define        BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
+
+#define        EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
+#define        EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
+
+#define        BCM47XX_ILINE_ID        0x4711          /* 47xx iline20 */
+#define        BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
+#define        BCM47XX_ENET_ID         0x4713          /* 47xx enet */
+#define        BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
+#define        BCM47XX_USB_ID          0x4715          /* 47xx usb */
+#define        BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
+#define        BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
+#define        BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
+#define        BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
+#define        BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
+#define        BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
+#define        BCM47XX_ATA100_ID       0x471d          /* 47xx parallel ATA */
+#define        BCM47XX_SATAXOR_ID      0x471e          /* 47xx serial ATA & XOR DMA */
+#define        BCM47XX_GIGETH_ID       0x471f          /* 47xx GbE (5700) */
+
+#define BCM47XX_SMBUS_EMU_ID   0x47fe          /* 47xx emulated SMBus device */
+#define        BCM47XX_XOR_EMU_ID      0x47ff          /* 47xx emulated XOR engine */
+
+#define        BCM4710_CHIP_ID         0x4710          /* 4710 chipid returned by sb_chip() */
+#define        BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
+
+#define        BCM4402_CHIP_ID         0x4402          /* 4402 chipid */
+#define        BCM4402_ENET_ID         0x4402          /* 4402 enet */
+#define        BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
+#define        BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
+
+#define        BCM4306_CHIP_ID         0x4306          /* 4306 chipcommon chipid */
+#define        BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
+#define        BCM4306_D11G_ID2        0x4325          
+#define        BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
+#define        BCM4306_UART_ID         0x4322          /* 4306 uart */
+#define        BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
+#define        BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
+
+#define        BCM4309_PKG_ID          1               /* 4309 package id */
+
+#define        BCM4311_CHIP_ID         0x4311          /* 4311 PCIe 802.11a/b/g */
+#define        BCM4311_D11G_ID         0x4311          /* 4311 802.11b/g id */
+#define        BCM4311_D11DUAL_ID      0x4312          /* 4311 802.11a/b/g id */
+#define        BCM4311_D11A_ID         0x4313          /* 4311 802.11a id */
+
+#define        BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
+#define        BCM4303_PKG_ID          2               /* 4303 package id */
+
+#define        BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
+#define        BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
+
+#define        BCM4704_CHIP_ID         0x4704          /* 4704 chipcommon chipid */
+#define        BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
+
+#define        BCM4318_CHIP_ID         0x4318          /* 4318 chip common chipid */
+#define        BCM4318_D11G_ID         0x4318          /* 4318 802.11b/g id */
+#define        BCM4318_D11DUAL_ID      0x4319          /* 4318 802.11a/b/g id */
+#define        BCM4318_D11A_ID         0x431a          /* 4318 802.11a id */
+
+#define        BCM4321_CHIP_ID         0x4321          /* 4321 chip common chipid */
+#define        BCM4321_D11N_ID         0x4328          /* 4321 802.11n dualband id */
+#define        BCM4321_D11N2G_ID       0x4329          /* 4321 802.11n 2.4Hgz band id */
+#define        BCM4321_D11N5G_ID       0x432a          /* 4321 802.11n 5Ghz band id */
+
+#define BCM4331_CHIP_ID                0x4331          /* 4331 chip common chipid */
+#define BCM4331_D11N2G_ID      0x4330          /* 4331 802.11n 2.4Ghz band id */
+#define BCM4331_D11N_ID                0x4331          /* 4331 802.11n dualband id */
+#define BCM4331_D11N5G_ID      0x4332          /* 4331 802.11n 5Ghz band id */
+
+#define HDLSIM5350_PKG_ID      1               /* HDL simulator package id for a 5350 */
+#define HDLSIM_PKG_ID          14              /* HDL simulator package id */
+#define HWSIM_PKG_ID           15              /* Hardware simulator package id */
+
+#define        BCM4712_CHIP_ID         0x4712          /* 4712 chipcommon chipid */
+#define        BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
+#define        BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
+#define        BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
+#define        BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
+
+#define BCM5365_CHIP_ID                0x5365          /* 5365 chipcommon chipid */
+#define        BCM5350_CHIP_ID         0x5350          /* bcm5350 chipcommon chipid */
+#define        BCM5352_CHIP_ID         0x5352          /* bcm5352 chipcommon chipid */
+
+#define        BCM4320_CHIP_ID         0x4320          /* bcm4320 chipcommon chipid */
+
+#define BCM4328_CHIP_ID                0x4328          /* bcm4328 chipcommon chipid */
+
+#define FPGA_JTAGM_ID          0x43f0          /* FPGA jtagm device id */
+#define BCM43XX_JTAGM_ID       0x43f1          /* 43xx jtagm device id */
+#define BCM43XXOLD_JTAGM_ID    0x4331          /* 43xx old jtagm device id */
+
+#define SDIOH_FPGA_ID          0x43f2          /* sdio host fpga */
+#define SDIOD_FPGA_ID          0x43f4          /* sdio device fpga */
+
+#define MIMO_FPGA_ID           0x43f8          /* FPGA mimo minimacphy device id */
+
+#define BCM4785_CHIP_ID                0x4785          /* 4785 chipcommon chipid */
+
+/* PCMCIA vendor Id's */
+
+#define        VENDOR_BROADCOM_PCMCIA  0x02d0
+
+/* SDIO vendor Id's */
+#define        VENDOR_BROADCOM_SDIO    0x00BF
+
+
+/* boardflags */
+#define        BFL_BTCOEXIST           0x0001  /* This board implements Bluetooth coexistance */
+#define        BFL_PACTRL              0x0002  /* This board has gpio 9 controlling the PA */
+#define        BFL_AIRLINEMODE         0x0004  /* This board implements gpio13 radio disable indication */
+#define        BFL_ENETROBO            0x0010  /* This board has robo switch or core */
+#define        BFL_CCKHIPWR            0x0040  /* Can do high-power CCK transmission */
+#define        BFL_ENETADM             0x0080  /* This board has ADMtek switch */
+#define        BFL_ENETVLAN            0x0100  /* This board has vlan capability */
+#define        BFL_AFTERBURNER         0x0200  /* This board supports Afterburner mode */
+#define BFL_NOPCI              0x0400  /* This board leaves PCI floating */
+#define BFL_FEM                        0x0800  /* This board supports the Front End Module */
+#define BFL_EXTLNA             0x1000  /* This board has an external LNA */
+#define BFL_HGPA               0x2000  /* This board has a high gain PA */
+#define        BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
+#define        BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
+
+/* boardflags2 */
+#define BFL2_RXBB_INT_REG_DIS  0x00000001      /* This board has an external rxbb regulator */
+#define BFL2_SSWITCH_AVAIL     0x00000002      /* This board has a superswitch for > 2 antennas */
+#define BFL2_TXPWRCTRL_EN      0x00000004      /* This board permits TX Power Control to be enabled */
+
+/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
+#define        BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistance Input */
+#define        BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistance Out */
+#define        BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistance Input */
+#define        BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistance Out */
+#define        BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
+#define        PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
+#define PCI_CFG_GPIO_HWRAD     0x20    /* PCI config space GPIO 13 for hw radio disable */
+#define PCI_CFG_GPIO_XTAL      0x40    /* PCI config space GPIO 14 for Xtal powerup */
+#define PCI_CFG_GPIO_PLL       0x80    /* PCI config space GPIO 15 for PLL powerdown */
+
+/* power control defines */
+#define PLL_DELAY              150             /* us pll on delay */
+#define FREF_DELAY             200             /* us fref change delay */
+#define MIN_SLOW_CLK           32              /* us Slow clock period */
+#define        XTAL_ON_DELAY           1000            /* us crystal power-on delay */
+
+/* Reference Board Types */
+
+#define        BU4710_BOARD            0x0400
+#define        VSIM4710_BOARD          0x0401
+#define        QT4710_BOARD            0x0402
+
+#define        BU4309_BOARD            0x040a
+#define        BCM94309CB_BOARD        0x040b
+#define        BCM94309MP_BOARD        0x040c
+#define        BCM4309AP_BOARD         0x040d
+
+#define        BCM94302MP_BOARD        0x040e
+
+#define        BU4306_BOARD            0x0416
+#define        BCM94306CB_BOARD        0x0417
+#define        BCM94306MP_BOARD        0x0418
+
+#define        BCM94710D_BOARD         0x041a
+#define        BCM94710R1_BOARD        0x041b
+#define        BCM94710R4_BOARD        0x041c
+#define        BCM94710AP_BOARD        0x041d
+
+#define        BU2050_BOARD            0x041f
+
+
+#define        BCM94309G_BOARD         0x0421
+
+#define        BU4704_BOARD            0x0423
+#define        BU4702_BOARD            0x0424
+
+#define        BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
+
+
+#define        BCM94702MN_BOARD        0x0428
+
+/* BCM4702 1U CompactPCI Board */
+#define        BCM94702CPCI_BOARD      0x0429
+
+/* BCM4702 with BCM95380 VLAN Router */
+#define        BCM95380RR_BOARD        0x042a
+
+/* cb4306 with SiGe PA */
+#define        BCM94306CBSG_BOARD      0x042b
+
+/* cb4306 with SiGe PA */
+#define        PCSG94306_BOARD         0x042d
+
+/* bu4704 with sdram */
+#define        BU4704SD_BOARD          0x042e
+
+/* Dual 11a/11g Router */
+#define        BCM94704AGR_BOARD       0x042f
+
+/* 11a-only minipci */
+#define        BCM94308MP_BOARD        0x0430
+
+
+
+#define BU4712_BOARD           0x0444
+#define        BU4712SD_BOARD          0x045d
+#define        BU4712L_BOARD           0x045f
+
+/* BCM4712 boards */
+#define BCM94712AP_BOARD       0x0445
+#define BCM94712P_BOARD                0x0446
+
+/* BCM4318 boards */
+#define BU4318_BOARD           0x0447
+#define CB4318_BOARD           0x0448
+#define MPG4318_BOARD          0x0449
+#define MP4318_BOARD           0x044a
+#define SD4318_BOARD           0x044b
+
+/* BCM63XX boards */
+#define BCM96338_BOARD         0x6338
+#define BCM96348_BOARD         0x6348
+
+/* Another mp4306 with SiGe */
+#define        BCM94306P_BOARD         0x044c
+
+/* mp4303 */
+#define        BCM94303MP_BOARD        0x044e
+
+/* mpsgh4306 */
+#define        BCM94306MPSGH_BOARD     0x044f
+
+/* BRCM 4306 w/ Front End Modules */
+#define BCM94306MPM            0x0450
+#define BCM94306MPL            0x0453
+
+/* 4712agr */
+#define        BCM94712AGR_BOARD       0x0451
+
+/* pcmcia 4303 */
+#define        PC4303_BOARD            0x0454
+
+/* 5350K */
+#define        BCM95350K_BOARD         0x0455
+
+/* 5350R */
+#define        BCM95350R_BOARD         0x0456
+
+/* 4306mplna */
+#define        BCM94306MPLNA_BOARD     0x0457
+
+/* 4320 boards */
+#define        BU4320_BOARD            0x0458
+#define        BU4320S_BOARD           0x0459
+#define        BCM94320PH_BOARD        0x045a
+
+/* 4306mph */
+#define        BCM94306MPH_BOARD       0x045b
+
+/* 4306pciv */
+#define        BCM94306PCIV_BOARD      0x045c
+
+#define        BU4712SD_BOARD          0x045d
+
+#define        BCM94320PFLSH_BOARD     0x045e
+
+#define        BU4712L_BOARD           0x045f
+#define        BCM94712LGR_BOARD       0x0460
+#define        BCM94320R_BOARD         0x0461
+
+#define        BU5352_BOARD            0x0462
+
+#define        BCM94318MPGH_BOARD      0x0463
+
+#define        BU4311_BOARD            0x0464
+#define        BCM94311MC_BOARD        0x0465
+#define        BCM94311MCAG_BOARD      0x0466
+
+#define        BCM95352GR_BOARD        0x0467
+
+/* bcm95351agr */
+#define        BCM95351AGR_BOARD       0x0470
+
+/* bcm94704mpcb */
+#define        BCM94704MPCB_BOARD      0x0472
+
+/* 4785 boards */
+#define BU4785_BOARD           0x0478
+
+/* 4321 boards */
+#define BU4321_BOARD           0x046b
+#define BU4321E_BOARD          0x047c
+#define MP4321_BOARD           0x046c
+#define CB2_4321_BOARD         0x046d
+#define MC4321_BOARD           0x046e
+
+/* # of GPIO pins */
+#define GPIO_NUMPINS           16
+
+/* radio ID codes */
+#define        NORADIO_ID              0xe4f5
+#define        NORADIO_IDCODE          0x4e4f5246
+
+#define        BCM2050_ID              0x2050
+#define        BCM2050_IDCODE          0x02050000
+#define        BCM2050A0_IDCODE        0x1205017f
+#define        BCM2050A1_IDCODE        0x2205017f
+#define        BCM2050R8_IDCODE        0x8205017f
+
+#define BCM2055_ID             0x2055
+#define BCM2055_IDCODE         0x02055000
+#define BCM2055A0_IDCODE       0x1205517f
+
+#define        BCM2060_ID              0x2060
+#define        BCM2060_IDCODE          0x02060000
+#define        BCM2060WW_IDCODE        0x1206017f
+
+#define BCM2062_ID             0x2062
+#define BCM2062_IDCODE         0x02062000
+#define BCM2062A0_IDCODE       0x0206217f
+
+/* parts of an idcode: */
+#define        IDCODE_MFG_MASK         0x00000fff
+#define        IDCODE_MFG_SHIFT        0
+#define        IDCODE_ID_MASK          0x0ffff000
+#define        IDCODE_ID_SHIFT         12
+#define        IDCODE_REV_MASK         0xf0000000
+#define        IDCODE_REV_SHIFT        28
+
+#endif /* _BCMDEVS_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs1.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmdevs1.h
new file mode 100644 (file)
index 0000000..4c21d14
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * Broadcom device-specific manifest constants.
+ *
+ * Copyright 2005, Broadcom Corporation   
+ * All Rights Reserved.   
+ *    
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY   
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM   
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS   
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.   
+ * $Id$
+ */
+
+#ifndef        _BCMDEVS_H
+#define        _BCMDEVS_H
+
+
+/* Known PCI vendor Id's */
+#define        VENDOR_EPIGRAM          0xfeda
+#define        VENDOR_BROADCOM         0x14e4
+#define        VENDOR_3COM             0x10b7
+#define        VENDOR_NETGEAR          0x1385
+#define        VENDOR_DIAMOND          0x1092
+#define        VENDOR_DELL             0x1028
+#define        VENDOR_HP               0x0e11
+#define        VENDOR_APPLE            0x106b
+
+/* PCI Device Id's */
+#define        BCM4210_DEVICE_ID       0x1072          /* never used */
+#define        BCM4211_DEVICE_ID       0x4211
+#define        BCM4230_DEVICE_ID       0x1086          /* never used */
+#define        BCM4231_DEVICE_ID       0x4231
+
+#define        BCM4410_DEVICE_ID       0x4410          /* bcm44xx family pci iline */
+#define        BCM4430_DEVICE_ID       0x4430          /* bcm44xx family cardbus iline */
+#define        BCM4412_DEVICE_ID       0x4412          /* bcm44xx family pci enet */
+#define        BCM4432_DEVICE_ID       0x4432          /* bcm44xx family cardbus enet */
+
+#define        BCM3352_DEVICE_ID       0x3352          /* bcm3352 device id */
+#define        BCM3360_DEVICE_ID       0x3360          /* bcm3360 device id */
+
+#define        EPI41210_DEVICE_ID      0xa0fa          /* bcm4210 */
+#define        EPI41230_DEVICE_ID      0xa10e          /* bcm4230 */
+
+#define        BCM47XX_ILINE_ID        0x4711          /* 47xx iline20 */
+#define        BCM47XX_V90_ID          0x4712          /* 47xx v90 codec */
+#define        BCM47XX_ENET_ID         0x4713          /* 47xx enet */
+#define        BCM47XX_EXT_ID          0x4714          /* 47xx external i/f */
+#define        BCM47XX_USB_ID          0x4715          /* 47xx usb */
+#define        BCM47XX_USBH_ID         0x4716          /* 47xx usb host */
+#define        BCM47XX_USBD_ID         0x4717          /* 47xx usb device */
+#define        BCM47XX_IPSEC_ID        0x4718          /* 47xx ipsec */
+#define        BCM47XX_ROBO_ID         0x4719          /* 47xx/53xx roboswitch core */
+#define        BCM47XX_USB20H_ID       0x471a          /* 47xx usb 2.0 host */
+#define        BCM47XX_USB20D_ID       0x471b          /* 47xx usb 2.0 device */
+
+#define        BCM4710_DEVICE_ID       0x4710          /* 4710 primary function 0 */
+
+#define        BCM4610_DEVICE_ID       0x4610          /* 4610 primary function 0 */
+#define        BCM4610_ILINE_ID        0x4611          /* 4610 iline100 */
+#define        BCM4610_V90_ID          0x4612          /* 4610 v90 codec */
+#define        BCM4610_ENET_ID         0x4613          /* 4610 enet */
+#define        BCM4610_EXT_ID          0x4614          /* 4610 external i/f */
+#define        BCM4610_USB_ID          0x4615          /* 4610 usb */
+
+#define        BCM4402_DEVICE_ID       0x4402          /* 4402 primary function 0 */
+#define        BCM4402_ENET_ID         0x4402          /* 4402 enet */
+#define        BCM4402_V90_ID          0x4403          /* 4402 v90 codec */
+#define        BCM4401_ENET_ID         0x170c          /* 4401b0 production enet cards */
+
+#define        BCM4301_DEVICE_ID       0x4301          /* 4301 primary function 0 */
+#define        BCM4301_D11B_ID         0x4301          /* 4301 802.11b */
+
+#define        BCM4307_DEVICE_ID       0x4307          /* 4307 primary function 0 */
+#define        BCM4307_V90_ID          0x4305          /* 4307 v90 codec */
+#define        BCM4307_ENET_ID         0x4306          /* 4307 enet */
+#define        BCM4307_D11B_ID         0x4307          /* 4307 802.11b */
+
+#define        BCM4306_DEVICE_ID       0x4306          /* 4306 chipcommon chipid */
+#define        BCM4306_D11G_ID         0x4320          /* 4306 802.11g */
+#define        BCM4306_D11G_ID2        0x4325          
+#define        BCM4306_D11A_ID         0x4321          /* 4306 802.11a */
+#define        BCM4306_UART_ID         0x4322          /* 4306 uart */
+#define        BCM4306_V90_ID          0x4323          /* 4306 v90 codec */
+#define        BCM4306_D11DUAL_ID      0x4324          /* 4306 dual A+B */
+
+#define        BCM4309_PKG_ID          1               /* 4309 package id */
+
+#define        BCM4303_D11B_ID         0x4303          /* 4303 802.11b */
+#define        BCM4303_PKG_ID          2               /* 4303 package id */
+
+#define        BCM4310_DEVICE_ID       0x4310          /* 4310 chipcommon chipid */
+#define        BCM4310_D11B_ID         0x4311          /* 4310 802.11b */
+#define        BCM4310_UART_ID         0x4312          /* 4310 uart */
+#define        BCM4310_ENET_ID         0x4313          /* 4310 enet */
+#define        BCM4310_USB_ID          0x4315          /* 4310 usb */
+
+#define        BCMGPRS_UART_ID         0x4333          /* Uart id used by 4306/gprs card */
+#define        BCMGPRS2_UART_ID        0x4344          /* Uart id used by 4306/gprs card */
+
+
+#define        BCM4704_DEVICE_ID       0x4704          /* 4704 chipcommon chipid */
+#define        BCM4704_ENET_ID         0x4706          /* 4704 enet (Use 47XX_ENET_ID instead!) */
+
+#define        BCM4317_DEVICE_ID       0x4317          /* 4317 chip common chipid */
+
+#define        BCM4318_DEVICE_ID       0x4318          /* 4318 chip common chipid */
+#define        BCM4318_D11G_ID         0x4318          /* 4318 801.11b/g id */
+#define        BCM4318_D11DUAL_ID      0x4319          /* 4318 801.11a/b/g id */
+#define BCM4318_JTAGM_ID       0x4331          /* 4318 jtagm device id */
+
+#define FPGA_JTAGM_ID          0x4330          /* ??? */
+
+/* Address map */
+#define BCM4710_SDRAM           0x00000000      /* Physical SDRAM */
+#define BCM4710_PCI_MEM         0x08000000      /* Host Mode PCI memory access space (64 MB) */
+#define BCM4710_PCI_CFG         0x0c000000      /* Host Mode PCI configuration space (64 MB) */
+#define BCM4710_PCI_DMA         0x40000000      /* Client Mode PCI memory access space (1 GB) */
+#define BCM4710_SDRAM_SWAPPED   0x10000000      /* Byteswapped Physical SDRAM */
+#define BCM4710_ENUM            0x18000000      /* Beginning of core enumeration space */
+
+/* Core register space */
+#define BCM4710_REG_SDRAM       0x18000000      /* SDRAM core registers */
+#define BCM4710_REG_ILINE20     0x18001000      /* InsideLine20 core registers */
+#define BCM4710_REG_EMAC0       0x18002000      /* Ethernet MAC 0 core registers */
+#define BCM4710_REG_CODEC       0x18003000      /* Codec core registers */
+#define BCM4710_REG_USB         0x18004000      /* USB core registers */
+#define BCM4710_REG_PCI         0x18005000      /* PCI core registers */
+#define BCM4710_REG_MIPS        0x18006000      /* MIPS core registers */
+#define BCM4710_REG_EXTIF       0x18007000      /* External Interface core registers */
+#define BCM4710_REG_EMAC1       0x18008000      /* Ethernet MAC 1 core registers */
+
+#define BCM4710_EXTIF           0x1f000000      /* External Interface base address */
+#define BCM4710_PCMCIA_MEM      0x1f000000      /* External Interface PCMCIA memory access */
+#define BCM4710_PCMCIA_IO       0x1f100000      /* PCMCIA I/O access */
+#define BCM4710_PCMCIA_CONF     0x1f200000      /* PCMCIA configuration */
+#define BCM4710_PROG            0x1f800000      /* Programable interface */
+#define BCM4710_FLASH           0x1fc00000      /* Flash */
+
+#define BCM4710_EJTAG           0xff200000      /* MIPS EJTAG space (2M) */
+
+#define BCM4710_UART            (BCM4710_REG_EXTIF + 0x00000300)
+
+#define BCM4710_EUART           (BCM4710_EXTIF + 0x00800000)
+#define BCM4710_LED             (BCM4710_EXTIF + 0x00900000)
+
+#define        BCM4712_DEVICE_ID       0x4712          /* 4712 chipcommon chipid */
+#define        BCM4712_MIPS_ID         0x4720          /* 4712 base devid */
+#define        BCM4712LARGE_PKG_ID     0               /* 340pin 4712 package id */
+#define        BCM4712SMALL_PKG_ID     1               /* 200pin 4712 package id */
+#define        BCM4712MID_PKG_ID       2               /* 225pin 4712 package id */
+
+#define        SDIOH_FPGA_ID           0x4380          /* sdio host fpga */
+
+#define BCM5365_DEVICE_ID       0x5365          /* 5365 chipcommon chipid */
+#define        BCM5350_DEVICE_ID       0x5350          /* bcm5350 chipcommon chipid */
+#define        BCM5352_DEVICE_ID       0x5352          /* bcm5352 chipcommon chipid */
+
+#define        BCM4320_DEVICE_ID       0x4320          /* bcm4320 chipcommon chipid */
+
+/* PCMCIA vendor Id's */
+
+#define        VENDOR_BROADCOM_PCMCIA  0x02d0
+
+/* SDIO vendor Id's */
+#define        VENDOR_BROADCOM_SDIO    0x00BF
+
+
+/* boardflags */
+#define        BFL_BTCOEXIST           0x0001  /* This board implements Bluetooth coexistance */
+#define        BFL_PACTRL              0x0002  /* This board has gpio 9 controlling the PA */
+#define        BFL_AIRLINEMODE         0x0004  /* This board implements gpio13 radio disable indication */
+#define        BFL_ENETROBO            0x0010  /* This board has robo switch or core */
+#define        BFL_CCKHIPWR            0x0040  /* Can do high-power CCK transmission */
+#define        BFL_ENETADM             0x0080  /* This board has ADMtek switch */
+#define        BFL_ENETVLAN            0x0100  /* This board has vlan capability */
+#define        BFL_AFTERBURNER         0x0200  /* This board supports Afterburner mode */
+#define BFL_NOPCI              0x0400  /* This board leaves PCI floating */
+#define BFL_FEM                        0x0800  /* This board supports the Front End Module */
+#define BFL_EXTLNA             0x1000  /* This board has an external LNA */
+#define BFL_HGPA               0x2000  /* This board has a high gain PA */
+#define        BFL_BTCMOD              0x4000  /* This board' BTCOEXIST is in the alternate gpios */
+#define        BFL_ALTIQ               0x8000  /* Alternate I/Q settings */
+
+/* board specific GPIO assignment, gpio 0-3 are also customer-configurable led */
+#define BOARD_GPIO_HWRAD_B     0x010   /* bit 4 is HWRAD input on 4301 */
+#define        BOARD_GPIO_BTCMOD_IN    0x010   /* bit 4 is the alternate BT Coexistance Input */
+#define        BOARD_GPIO_BTCMOD_OUT   0x020   /* bit 5 is the alternate BT Coexistance Out */
+#define        BOARD_GPIO_BTC_IN       0x080   /* bit 7 is BT Coexistance Input */
+#define        BOARD_GPIO_BTC_OUT      0x100   /* bit 8 is BT Coexistance Out */
+#define        BOARD_GPIO_PACTRL       0x200   /* bit 9 controls the PA on new 4306 boards */
+#define        PCI_CFG_GPIO_SCS        0x10    /* PCI config space bit 4 for 4306c0 slow clock source */
+#define PCI_CFG_GPIO_HWRAD     0x20    /* PCI config space GPIO 13 for hw radio disable */
+#define PCI_CFG_GPIO_XTAL      0x40    /* PCI config space GPIO 14 for Xtal powerup */
+#define PCI_CFG_GPIO_PLL       0x80    /* PCI config space GPIO 15 for PLL powerdown */
+
+/* Bus types */
+#define        SB_BUS                  0       /* Silicon Backplane */
+#define        PCI_BUS                 1       /* PCI target */
+#define        PCMCIA_BUS              2       /* PCMCIA target */
+#define SDIO_BUS               3       /* SDIO target */
+#define JTAG_BUS               4       /* JTAG */
+
+/* Allows optimization for single-bus support */
+#ifdef BCMBUSTYPE
+#define BUSTYPE(bus) (BCMBUSTYPE)
+#else
+#define BUSTYPE(bus) (bus)
+#endif
+
+/* power control defines */
+#define PLL_DELAY              150             /* us pll on delay */
+#define FREF_DELAY             200             /* us fref change delay */
+#define MIN_SLOW_CLK           32              /* us Slow clock period */
+#define        XTAL_ON_DELAY           1000            /* us crystal power-on delay */
+
+/* Reference Board Types */
+
+#define        BU4710_BOARD            0x0400
+#define        VSIM4710_BOARD          0x0401
+#define        QT4710_BOARD            0x0402
+
+#define        BU4610_BOARD            0x0403
+#define        VSIM4610_BOARD          0x0404
+
+#define        BU4307_BOARD            0x0405
+#define        BCM94301CB_BOARD        0x0406
+#define        BCM94301PC_BOARD        0x0406          /* Pcmcia 5v card */
+#define        BCM94301MP_BOARD        0x0407
+#define        BCM94307MP_BOARD        0x0408
+#define        BCMAP4307_BOARD         0x0409
+
+#define        BU4309_BOARD            0x040a
+#define        BCM94309CB_BOARD        0x040b
+#define        BCM94309MP_BOARD        0x040c
+#define        BCM4309AP_BOARD         0x040d
+
+#define        BCM94302MP_BOARD        0x040e
+
+#define        VSIM4310_BOARD          0x040f
+#define        BU4711_BOARD            0x0410
+#define        BCM94310U_BOARD         0x0411
+#define        BCM94310AP_BOARD        0x0412
+#define        BCM94310MP_BOARD        0x0414
+
+#define        BU4306_BOARD            0x0416
+#define        BCM94306CB_BOARD        0x0417
+#define        BCM94306MP_BOARD        0x0418
+
+#define        BCM94710D_BOARD         0x041a
+#define        BCM94710R1_BOARD        0x041b
+#define        BCM94710R4_BOARD        0x041c
+#define        BCM94710AP_BOARD        0x041d
+
+
+#define        BU2050_BOARD            0x041f
+
+
+#define        BCM94309G_BOARD         0x0421
+
+#define        BCM94301PC3_BOARD       0x0422          /* Pcmcia 3.3v card */
+
+#define        BU4704_BOARD            0x0423
+#define        BU4702_BOARD            0x0424
+
+#define        BCM94306PC_BOARD        0x0425          /* pcmcia 3.3v 4306 card */
+
+#define        BU4317_BOARD            0x0426
+
+
+#define        BCM94702MN_BOARD        0x0428
+
+/* BCM4702 1U CompactPCI Board */
+#define        BCM94702CPCI_BOARD      0x0429
+
+/* BCM4702 with BCM95380 VLAN Router */
+#define        BCM95380RR_BOARD        0x042a
+
+/* cb4306 with SiGe PA */
+#define        BCM94306CBSG_BOARD      0x042b
+
+/* mp4301 with 2050 radio */
+#define        BCM94301MPL_BOARD       0x042c
+
+/* cb4306 with SiGe PA */
+#define        PCSG94306_BOARD         0x042d
+
+/* bu4704 with sdram */
+#define        BU4704SD_BOARD          0x042e
+
+/* Dual 11a/11g Router */
+#define        BCM94704AGR_BOARD       0x042f
+
+/* 11a-only minipci */
+#define        BCM94308MP_BOARD        0x0430
+
+
+
+/* BCM94317 boards */
+#define BCM94317CB_BOARD       0x0440
+#define BCM94317MP_BOARD       0x0441
+#define BCM94317PCMCIA_BOARD   0x0442
+#define BCM94317SDIO_BOARD     0x0443
+
+#define BU4712_BOARD           0x0444
+#define        BU4712SD_BOARD          0x045d
+#define        BU4712L_BOARD           0x045f
+
+/* BCM4712 boards */
+#define BCM94712AP_BOARD       0x0445
+#define BCM94712P_BOARD                0x0446
+
+/* BCM4318 boards */
+#define BU4318_BOARD           0x0447
+#define CB4318_BOARD           0x0448
+#define MPG4318_BOARD          0x0449
+#define MP4318_BOARD           0x044a
+#define SD4318_BOARD           0x044b
+
+/* BCM63XX boards */
+#define BCM96338_BOARD         0x6338
+#define BCM96345_BOARD         0x6345
+#define BCM96348_BOARD         0x6348
+
+/* Another mp4306 with SiGe */
+#define        BCM94306P_BOARD         0x044c
+
+/* CF-like 4317 modules */
+#define        BCM94317CF_BOARD        0x044d
+
+/* mp4303 */
+#define        BCM94303MP_BOARD        0x044e
+
+/* mpsgh4306 */
+#define        BCM94306MPSGH_BOARD     0x044f
+
+/* BRCM 4306 w/ Front End Modules */
+#define BCM94306MPM            0x0450
+#define BCM94306MPL            0x0453
+
+/* 4712agr */
+#define        BCM94712AGR_BOARD       0x0451
+
+/* The real CF 4317 board */
+#define        CFI4317_BOARD           0x0452
+
+/* pcmcia 4303 */
+#define        PC4303_BOARD            0x0454
+
+/* 5350K */
+#define        BCM95350K_BOARD         0x0455
+
+/* 5350R */
+#define        BCM95350R_BOARD         0x0456
+
+/* 4306mplna */
+#define        BCM94306MPLNA_BOARD     0x0457
+
+/* 4320 boards */
+#define        BU4320_BOARD            0x0458
+#define        BU4320S_BOARD           0x0459
+#define        BCM94320PH_BOARD        0x045a
+
+/* 4306mph */
+#define        BCM94306MPH_BOARD       0x045b
+
+/* 4306pciv */
+#define        BCM94306PCIV_BOARD      0x045c
+
+#define        BU4712SD_BOARD          0x045d
+
+#define        BCM94320PFLSH_BOARD     0x045e
+
+#define        BU4712L_BOARD           0x045f
+#define        BCM94712LGR_BOARD       0x0460
+#define        BCM94320R_BOARD         0x0461
+
+#define        BU5352_BOARD            0x0462
+
+#define        BCM94318MPGH_BOARD      0x0463
+
+
+#define        BCM95352GR_BOARD        0x0467
+
+/* bcm95351agr */
+#define        BCM95351AGR_BOARD       0x0470
+
+/* # of GPIO pins */
+#define GPIO_NUMPINS           16
+
+#endif /* _BCMDEVS_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmendian.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmendian.h
new file mode 100644 (file)
index 0000000..906129c
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * local version of endian.h - byte order defines
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ *  $Id: bcmendian.h,v 1.1.1.10 2006/02/27 03:43:16 honor Exp $
+*/
+
+#ifndef _BCMENDIAN_H_
+#define _BCMENDIAN_H_
+
+#include <typedefs.h>
+
+/* Byte swap a 16 bit value */
+#define BCMSWAP16(val) \
+       ((uint16)(\
+               (((uint16)(val) & (uint16)0x00ffU) << 8) | \
+               (((uint16)(val) & (uint16)0xff00U) >> 8)))
+
+/* Byte swap a 32 bit value */
+#define BCMSWAP32(val) \
+       ((uint32)(\
+               (((uint32)(val) & (uint32)0x000000ffUL) << 24) | \
+               (((uint32)(val) & (uint32)0x0000ff00UL) <<  8) | \
+               (((uint32)(val) & (uint32)0x00ff0000UL) >>  8) | \
+               (((uint32)(val) & (uint32)0xff000000UL) >> 24)))
+
+/* 2 Byte swap a 32 bit value */
+#define BCMSWAP32BY16(val) \
+       ((uint32)(\
+               (((uint32)(val) & (uint32)0x0000ffffUL) << 16) | \
+               (((uint32)(val) & (uint32)0xffff0000UL) >> 16)))
+
+
+static INLINE uint16
+bcmswap16(uint16 val)
+{
+       return BCMSWAP16(val);
+}
+
+static INLINE uint32
+bcmswap32(uint32 val)
+{
+       return BCMSWAP32(val);
+}
+
+static INLINE uint32
+bcmswap32by16(uint32 val)
+{
+       return BCMSWAP32BY16(val);
+}
+
+/* buf - start of buffer of shorts to swap */
+/* len  - byte length of buffer */
+static INLINE void
+bcmswap16_buf(uint16 *buf, uint len)
+{
+       len = len/2;
+
+       while (len--) {
+               *buf = bcmswap16(*buf);
+               buf++;
+       }
+}
+
+#ifndef hton16
+#ifndef IL_BIGENDIAN
+#define HTON16(i) BCMSWAP16(i)
+#define        hton16(i) bcmswap16(i)
+#define        hton32(i) bcmswap32(i)
+#define        ntoh16(i) bcmswap16(i)
+#define        ntoh32(i) bcmswap32(i)
+#define ltoh16(i) (i)
+#define ltoh32(i) (i)
+#define htol16(i) (i)
+#define htol32(i) (i)
+#else
+#define HTON16(i) (i)
+#define        hton16(i) (i)
+#define        hton32(i) (i)
+#define        ntoh16(i) (i)
+#define        ntoh32(i) (i)
+#define        ltoh16(i) bcmswap16(i)
+#define        ltoh32(i) bcmswap32(i)
+#define htol16(i) bcmswap16(i)
+#define htol32(i) bcmswap32(i)
+#endif /* IL_BIGENDIAN */
+#endif /* hton16 */
+
+#ifndef IL_BIGENDIAN
+#define ltoh16_buf(buf, i)
+#define htol16_buf(buf, i)
+#else
+#define ltoh16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
+#define htol16_buf(buf, i) bcmswap16_buf((uint16*)buf, i)
+#endif /* IL_BIGENDIAN */
+
+/*
+* store 16-bit value to unaligned little endian byte array.
+*/
+static INLINE void
+htol16_ua_store(uint16 val, uint8 *bytes)
+{
+       bytes[0] = val&0xff;
+       bytes[1] = val>>8;
+}
+
+/*
+* store 32-bit value to unaligned little endian byte array.
+*/
+static INLINE void
+htol32_ua_store(uint32 val, uint8 *bytes)
+{
+       bytes[0] = val&0xff;
+       bytes[1] = (val>>8)&0xff;
+       bytes[2] = (val>>16)&0xff;
+       bytes[3] = val>>24;
+}
+
+/*
+* store 16-bit value to unaligned network(big) endian byte array.
+*/
+static INLINE void
+hton16_ua_store(uint16 val, uint8 *bytes)
+{
+       bytes[1] = val&0xff;
+       bytes[0] = val>>8;
+}
+
+/*
+* store 32-bit value to unaligned network(big) endian byte array.
+*/
+static INLINE void
+hton32_ua_store(uint32 val, uint8 *bytes)
+{
+       bytes[3] = val&0xff;
+       bytes[2] = (val>>8)&0xff;
+       bytes[1] = (val>>16)&0xff;
+       bytes[0] = val>>24;
+}
+
+/*
+* load 16-bit value from unaligned little endian byte array.
+*/
+static INLINE uint16
+ltoh16_ua(void *bytes)
+{
+       return (((uint8*)bytes)[1]<<8)+((uint8 *)bytes)[0];
+}
+
+/*
+* load 32-bit value from unaligned little endian byte array.
+*/
+static INLINE uint32
+ltoh32_ua(void *bytes)
+{
+       return (((uint8*)bytes)[3]<<24)+(((uint8*)bytes)[2]<<16)+
+              (((uint8*)bytes)[1]<<8)+((uint8*)bytes)[0];
+}
+
+/*
+* load 16-bit value from unaligned big(network) endian byte array.
+*/
+static INLINE uint16
+ntoh16_ua(void *bytes)
+{
+       return (((uint8*)bytes)[0]<<8)+((uint8*)bytes)[1];
+}
+
+/*
+* load 32-bit value from unaligned big(network) endian byte array.
+*/
+static INLINE uint32
+ntoh32_ua(void *bytes)
+{
+       return (((uint8*)bytes)[0]<<24)+(((uint8*)bytes)[1]<<16)+
+              (((uint8*)bytes)[2]<<8)+((uint8*)bytes)[3];
+}
+
+#define ltoh_ua(ptr) (\
+       sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
+       sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] : \
+       (((uint8 *)ptr)[3]<<24)+(((uint8 *)ptr)[2]<<16)+(((uint8 *)ptr)[1]<<8)+((uint8 *)ptr)[0] \
+)
+
+#define ntoh_ua(ptr) (\
+       sizeof(*(ptr)) == sizeof(uint8) ?  *(uint8 *)ptr : \
+       sizeof(*(ptr)) == sizeof(uint16) ? (((uint8 *)ptr)[0]<<8)+((uint8 *)ptr)[1] : \
+       (((uint8 *)ptr)[0]<<24)+(((uint8 *)ptr)[1]<<16)+(((uint8 *)ptr)[2]<<8)+((uint8 *)ptr)[3] \
+)
+
+#endif /* _BCMENDIAN_H_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmnvram.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmnvram.h
new file mode 100644 (file)
index 0000000..c713b4b
--- /dev/null
@@ -0,0 +1,159 @@
+/*
+ * NVRAM variable manipulation
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: bcmnvram.h,v 1.17 2006/03/02 12:33:44 honor Exp $
+ */
+
+#ifndef _bcmnvram_h_
+#define _bcmnvram_h_
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+#include <typedefs.h>
+#include <bcmdefs.h>
+
+struct nvram_header {
+       uint32 magic;
+       uint32 len;
+       uint32 crc_ver_init;    /* 0:7 crc, 8:15 ver, 16:31 sdram_init */
+       uint32 config_refresh;  /* 0:15 sdram_config, 16:31 sdram_refresh */
+       uint32 config_ncdl;     /* ncdl values for memc */
+};
+
+struct nvram_tuple {
+       char *name;
+       char *value;
+       struct nvram_tuple *next;
+};
+
+/*
+ * Initialize NVRAM access. May be unnecessary or undefined on certain
+ * platforms.
+ */
+extern int nvram_init(void *sbh);
+
+/*
+ * Disable NVRAM access. May be unnecessary or undefined on certain
+ * platforms.
+ */
+extern void nvram_exit(void *sbh);
+
+/*
+ * Get the value of an NVRAM variable. The pointer returned may be
+ * invalid after a set.
+ * @param      name    name of variable to get
+ * @return     value of variable or NULL if undefined
+ */
+extern char * nvram_get(const char *name);
+
+/* 
+ * Read the reset GPIO value from the nvram and set the GPIO
+ * as input
+ */
+extern int BCMINITFN(nvram_resetgpio_init)(void *sbh);
+extern int BCMINITFN(nvram_gpio_init)(const char *name, void *sbh);
+extern int BCMINITFN(nvram_gpio_set)(const char *name, void *sbh, int type);
+
+/* 
+ * Get the value of an NVRAM variable.
+ * @param      name    name of variable to get
+ * @return     value of variable or NUL if undefined
+ */
+#define nvram_safe_get(name) (nvram_get(name) ? : "")
+
+#define nvram_safe_unset(name) ({ \
+       if(nvram_get(name)) \
+               nvram_unset(name); \
+})
+
+#define nvram_safe_set(name, value) ({ \
+       if(!nvram_get(name) || strcmp(nvram_get(name), value)) \
+               nvram_set(name, value); \
+})
+
+/*
+ * Match an NVRAM variable.
+ * @param      name    name of variable to match
+ * @param      match   value to compare against value of variable
+ * @return     TRUE if variable is defined and its value is string equal
+ *             to match or FALSE otherwise
+ */
+static INLINE int
+nvram_match(char *name, char *match) {
+       const char *value = nvram_get(name);
+       return (value && !strcmp(value, match));
+}
+
+/*
+ * Inversely match an NVRAM variable.
+ * @param      name    name of variable to match
+ * @param      match   value to compare against value of variable
+ * @return     TRUE if variable is defined and its value is not string
+ *             equal to invmatch or FALSE otherwise
+ */
+static INLINE int
+nvram_invmatch(char *name, char *invmatch) {
+       const char *value = nvram_get(name);
+       return (value && strcmp(value, invmatch));
+}
+
+/*
+ * Set the value of an NVRAM variable. The name and value strings are
+ * copied into private storage. Pointers to previously set values
+ * may become invalid. The new value may be immediately
+ * retrieved but will not be permanently stored until a commit.
+ * @param      name    name of variable to set
+ * @param      value   value of variable
+ * @return     0 on success and errno on failure
+ */
+extern int nvram_set(const char *name, const char *value);
+
+/*
+ * Unset an NVRAM variable. Pointers to previously set values
+ * remain valid until a set.
+ * @param      name    name of variable to unset
+ * @return     0 on success and errno on failure
+ * NOTE: use nvram_commit to commit this change to flash.
+ */
+extern int nvram_unset(const char *name);
+
+/*
+ * Commit NVRAM variables to permanent storage. All pointers to values
+ * may be invalid after a commit.
+ * NVRAM values are undefined after a commit.
+ * @return     0 on success and errno on failure
+ */
+extern int nvram_commit(void);
+
+/*
+ * Get all NVRAM variables (format name=value\0 ... \0\0).
+ * @param      buf     buffer to store variables
+ * @param      count   size of buffer in bytes
+ * @return     0 on success and errno on failure
+ */
+extern int nvram_getall(char *buf, int count);
+
+extern int file2nvram(char *filename, char *varname);
+extern int nvram2file(char *varname, char *filename);
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+#define NVRAM_MAGIC            0x48534C46      /* 'FLSH' */
+#define NVRAM_CLEAR_MAGIC              0x0
+#define NVRAM_INVALID_MAGIC    0xFFFFFFFF
+#define NVRAM_VERSION          1
+#define NVRAM_HEADER_SIZE      20
+#define NVRAM_SPACE            0x8000
+
+#define NVRAM_MAX_VALUE_LEN 255
+#define NVRAM_MAX_PARAM_LEN 64
+
+#endif /* _bcmnvram_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmsrom.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmsrom.h
new file mode 100644 (file)
index 0000000..4f99e95
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Misc useful routines to access NIC local SROM/OTP .
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: bcmsrom.h,v 1.1.1.13 2006/04/15 01:29:08 michael Exp $
+ */
+
+#ifndef        _bcmsrom_h_
+#define        _bcmsrom_h_
+
+/* Maximum srom: 4 Kilobits == 512 bytes */
+#define        SROM_MAX        512
+
+/* SROM Rev 4: Reallocate the software part of the srom to accomodate
+ * MIMO features. It assumes up to two PCIE functions and 440 bytes
+ * of useable srom i.e. the useable storage in chips with OTP that
+ * implements hardware redundancy.
+ */
+
+#define        SROM4_WORDS             220
+
+#define        SROM4_SIGN              32
+#define        SROM4_SIGNATURE         0x5372
+
+#define        SROM4_BREV              33
+
+#define        SROM4_BFL0              34
+#define        SROM4_BFL1              35
+#define        SROM4_BFL2              36
+#define        SROM4_BFL3              37
+
+#define        SROM4_MACHI             38
+#define        SROM4_MACMID            39
+#define        SROM4_MACLO             40
+
+#define        SROM4_CCODE             41
+#define        SROM4_REGREV            42
+
+#define        SROM4_LEDBH10           43
+#define        SROM4_LEDBH32           44
+
+#define        SROM4_LEDDC             45
+
+#define        SROM4_AA                46
+#define        SROM4_AA2G_MASK         0x00ff
+#define        SROM4_AA2G_SHIFT        0
+#define        SROM4_AA5G_MASK         0xff00
+#define        SROM4_AA5G_SHIFT        8
+
+#define        SROM4_AG10              47
+#define        SROM4_AG32              48
+
+#define        SROM4_TXPID2G           49
+#define        SROM4_TXPID5G           51
+#define        SROM4_TXPID5GL          53
+#define        SROM4_TXPID5GH          55
+
+/* Per-path fields */
+#define        MAX_PATH                4
+#define        SROM4_PATH0             64
+#define        SROM4_PATH1             87
+#define        SROM4_PATH2             110
+#define        SROM4_PATH3             133
+
+#define        SROM4_2G_ITT_MAXP       0
+#define        SROM4_2G_PA             1
+#define        SROM4_5G_ITT_MAXP       5
+#define        SROM4_5GLH_MAXP         6
+#define        SROM4_5G_PA             7
+#define        SROM4_5GL_PA            11
+#define        SROM4_5GH_PA            15
+
+/* Fields in the ITT_MAXP and 5GLH_MAXP words */
+#define        B2G_MAXP_MASK           0xff
+#define        B2G_ITT_SHIFT           8
+#define        B5G_MAXP_MASK           0xff
+#define        B5G_ITT_SHIFT           8
+#define        B5GH_MAXP_MASK          0xff
+#define        B5GL_MAXP_SHIFT         8
+
+/* All the miriad power offsets */
+#define        SROM4_2G_CCKPO          156
+#define        SROM4_2G_OFDMPO         157
+#define        SROM4_5G_OFDMPO         159
+#define        SROM4_5GL_OFDMPO        161
+#define        SROM4_5GH_OFDMPO        163
+#define        SROM4_2G_MCSPO          165
+#define        SROM4_5G_MCSPO          173
+#define        SROM4_5GL_MCSPO         181
+#define        SROM4_5GH_MCSPO         189
+#define        SROM4_CCDPO             197
+#define        SROM4_STBCPO            198
+#define        SROM4_BW40PO            199
+#define        SROM4_BWDUPPO           200
+
+extern int srom_var_init(void *sbh, uint bus, void *curmap, osl_t *osh, char **vars, uint *count);
+
+extern int srom_read(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
+extern int srom_write(uint bus, void *curmap, osl_t *osh, uint byteoff, uint nbytes, uint16 *buf);
+
+#endif /* _bcmsrom_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmutils.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/bcmutils.h
new file mode 100644 (file)
index 0000000..b200f62
--- /dev/null
@@ -0,0 +1,433 @@
+/*
+ * Misc useful os-independent macros and functions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ * $Id: bcmutils.h,v 1.1.1.16 2006/04/08 06:13:39 honor Exp $
+ */
+
+#ifndef        _bcmutils_h_
+#define        _bcmutils_h_
+
+/* ** driver-only section ** */
+#ifdef BCMDRIVER
+
+#define _BCM_U 0x01    /* upper */
+#define _BCM_L 0x02    /* lower */
+#define _BCM_D 0x04    /* digit */
+#define _BCM_C 0x08    /* cntrl */
+#define _BCM_P 0x10    /* punct */
+#define _BCM_S 0x20    /* white space (space/lf/tab) */
+#define _BCM_X 0x40    /* hex digit */
+#define _BCM_SP        0x80    /* hard space (0x20) */
+
+#define GPIO_PIN_NOTDEFINED    0x20    /* Pin not defined */
+
+extern unsigned char bcm_ctype[];
+#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
+
+#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
+#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
+#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
+#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
+#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
+#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
+#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
+#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
+#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
+#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
+#define bcm_isxdigit(c)        ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
+
+/*
+ * Spin at most 'us' microseconds while 'exp' is true.
+ * Caller should explicitly test 'exp' when this completes
+ * and take appropriate error action if 'exp' is still true.
+ */
+#define SPINWAIT(exp, us) { \
+       uint countdown = (us) + 9; \
+       while ((exp) && (countdown >= 10)) {\
+               OSL_DELAY(10); \
+               countdown -= 10; \
+       } \
+}
+
+struct  ether_addr {
+       uint8 octet[6];
+} __attribute__((packed));
+
+/* string */
+extern uchar bcm_toupper(uchar c);
+extern ulong bcm_strtoul(char *cp, char **endp, uint base);
+extern char *bcmstrstr(char *haystack, char *needle);
+extern char *bcmstrcat(char *dest, const char *src);
+extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
+/* ethernet address */
+extern char *bcm_ether_ntoa(struct ether_addr *ea, char *buf);
+/* variable access */
+extern char *getvar(char *vars, char *name);
+extern int getintvar(char *vars, char *name);
+extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
+#ifdef BCMPERFSTATS
+extern void bcm_perf_enable(void);
+extern void bcmstats(char *fmt);
+extern void bcmlog(char *fmt, uint a1, uint a2);
+extern void bcmdumplog(char *buf, int size);
+extern int bcmdumplogent(char *buf, uint idx);
+#else
+#define bcm_perf_enable()
+#define bcmstats(fmt)
+#define        bcmlog(fmt, a1, a2)
+#define        bcmdumplog(buf, size)   *buf = '\0'
+#define        bcmdumplogent(buf, idx) -1
+#endif /* BCMPERFSTATS */
+extern char *bcm_nvram_vars(uint *length);
+extern int bcm_nvram_cache(void *sbh);
+
+/* Support for sharing code across in-driver iovar implementations.
+ * The intent is that a driver use this structure to map iovar names
+ * to its (private) iovar identifiers, and the lookup function to
+ * find the entry.  Macros are provided to map ids and get/set actions
+ * into a single number space for a switch statement.
+ */
+
+/* iovar structure */
+typedef struct bcm_iovar {
+       const char *name;       /* name for lookup and display */
+       uint16 varid;           /* id for switch */
+       uint16 flags;           /* driver-specific flag bits */
+       uint16 type;            /* base type of argument */
+       uint16 minlen;          /* min length for buffer vars */
+} bcm_iovar_t;
+
+/* varid definitions are per-driver, may use these get/set bits */
+
+/* IOVar action bits for id mapping */
+#define IOV_GET 0 /* Get an iovar */
+#define IOV_SET 1 /* Set an iovar */
+
+/* Varid to actionid mapping */
+#define IOV_GVAL(id)           ((id)*2)
+#define IOV_SVAL(id)           (((id)*2)+IOV_SET)
+#define IOV_ISSET(actionid)    ((actionid & IOV_SET) == IOV_SET)
+
+/* flags are per-driver based on driver attributes */
+
+/* Base type definitions */
+#define IOVT_VOID      0       /* no value (implictly set only) */
+#define IOVT_BOOL      1       /* any value ok (zero/nonzero) */
+#define IOVT_INT8      2       /* integer values are range-checked */
+#define IOVT_UINT8     3       /* unsigned int 8 bits */
+#define IOVT_INT16     4       /* int 16 bits */
+#define IOVT_UINT16    5       /* unsigned int 16 bits */
+#define IOVT_INT32     6       /* int 32 bits */
+#define IOVT_UINT32    7       /* unsigned int 32 bits */
+#define IOVT_BUFFER    8       /* buffer is size-checked as per minlen */
+
+extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
+extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
+
+#endif /* #ifdef BCMDRIVER */
+
+/* ** driver/apps-shared section ** */
+
+#define BCME_STRLEN            64      /* Max string length for BCM errors */
+#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
+
+
+/*
+ * error codes could be added but the defined ones shouldn't be changed/deleted
+ * these error codes are exposed to the user code
+ * when ever a new error code is added to this list
+ * please update errorstring table with the related error string and
+ * update osl files with os specific errorcode map
+*/
+
+#define BCME_OK                                0       /* Success */
+#define BCME_ERROR                     -1      /* Error generic */
+#define BCME_BADARG                    -2      /* Bad Argument */
+#define BCME_BADOPTION                 -3      /* Bad option */
+#define BCME_NOTUP                     -4      /* Not up */
+#define BCME_NOTDOWN                   -5      /* Not down */
+#define BCME_NOTAP                     -6      /* Not AP */
+#define BCME_NOTSTA                    -7      /* Not STA  */
+#define BCME_BADKEYIDX                 -8      /* BAD Key Index */
+#define BCME_RADIOOFF                  -9      /* Radio Off */
+#define BCME_NOTBANDLOCKED             -10     /* Not  band locked */
+#define BCME_NOCLK                     -11     /* No Clock */
+#define BCME_BADRATESET                        -12     /* BAD Rate valueset */
+#define BCME_BADBAND                   -13     /* BAD Band */
+#define BCME_BUFTOOSHORT               -14     /* Buffer too short */
+#define BCME_BUFTOOLONG                        -15     /* Buffer too long */
+#define BCME_BUSY                      -16     /* Busy */
+#define BCME_NOTASSOCIATED             -17     /* Not Associated */
+#define BCME_BADSSIDLEN                        -18     /* Bad SSID len */
+#define BCME_OUTOFRANGECHAN            -19     /* Out of Range Channel */
+#define BCME_BADCHAN                   -20     /* Bad Channel */
+#define BCME_BADADDR                   -21     /* Bad Address */
+#define BCME_NORESOURCE                        -22     /* Not Enough Resources */
+#define BCME_UNSUPPORTED               -23     /* Unsupported */
+#define BCME_BADLEN                    -24     /* Bad length */
+#define BCME_NOTREADY                  -25     /* Not Ready */
+#define BCME_EPERM                     -26     /* Not Permitted */
+#define BCME_NOMEM                     -27     /* No Memory */
+#define BCME_ASSOCIATED                        -28     /* Associated */
+#define BCME_RANGE                     -29     /* Not In Range */
+#define BCME_NOTFOUND                  -30     /* Not Found */
+#define BCME_WME_NOT_ENABLED           -31     /* WME Not Enabled */
+#define BCME_TSPEC_NOTFOUND            -32     /* TSPEC Not Found */
+#define BCME_ACM_NOTSUPPORTED          -33     /* ACM Not Supported */
+#define BCME_NOT_WME_ASSOCIATION       -34     /* Not WME Association */
+#define BCME_SDIO_ERROR                        -35     /* SDIO Bus Error */
+#define BCME_DONGLE_DOWN               -36     /* Dongle Not Accessible */
+#define BCME_LAST                      BCME_DONGLE_DOWN
+
+/* These are collection of BCME Error strings */
+#define BCMERRSTRINGTABLE {            \
+       "OK",                           \
+       "Undefined error",              \
+       "Bad Argument",                 \
+       "Bad Option",                   \
+       "Not up",                       \
+       "Not down",                     \
+       "Not AP",                       \
+       "Not STA",                      \
+       "Bad Key Index",                \
+       "Radio Off",                    \
+       "Not band locked",              \
+       "No clock",                     \
+       "Bad Rate valueset",            \
+       "Bad Band",                     \
+       "Buffer too short",             \
+       "Buffer too long",              \
+       "Busy",                         \
+       "Not Associated",               \
+       "Bad SSID len",                 \
+       "Out of Range Channel",         \
+       "Bad Channel",                  \
+       "Bad Address",                  \
+       "Not Enough Resources",         \
+       "Unsupported",                  \
+       "Bad length",                   \
+       "Not Ready",                    \
+       "Not Permitted",                \
+       "No Memory",                    \
+       "Associated",                   \
+       "Not In Range",                 \
+       "Not Found",                    \
+       "WME Not Enabled",              \
+       "TSPEC Not Found",              \
+       "ACM Not Supported",            \
+       "Not WME Association",          \
+       "SDIO Bus Error",               \
+       "Dongle Not Accessible"         \
+}
+
+#ifndef ABS
+#define        ABS(a)                  (((a) < 0)?-(a):(a))
+#endif /* ABS */
+
+#ifndef MIN
+#define        MIN(a, b)               (((a) < (b))?(a):(b))
+#endif /* MIN */
+
+#ifndef MAX
+#define        MAX(a, b)               (((a) > (b))?(a):(b))
+#endif /* MAX */
+
+#define CEIL(x, y)             (((x) + ((y)-1)) / (y))
+#define        ROUNDUP(x, y)           ((((x)+((y)-1))/(y))*(y))
+#define        ISALIGNED(a, x)         (((a) & ((x)-1)) == 0)
+#define        ISPOWEROF2(x)           ((((x)-1)&(x)) == 0)
+#define VALID_MASK(mask)       !((mask) & ((mask) + 1))
+#define        OFFSETOF(type, member)  ((uint)(uintptr)&((type *)0)->member)
+#define ARRAYSIZE(a)           (sizeof(a)/sizeof(a[0]))
+
+/* bit map related macros */
+#ifndef setbit
+#ifndef NBBY               /* the BSD family defines NBBY */
+#define        NBBY    8       /* 8 bits per byte */
+#endif /* #ifndef NBBY */
+#define        setbit(a, i)    (((uint8 *)a)[(i)/NBBY] |= 1<<((i)%NBBY))
+#define        clrbit(a, i)    (((uint8 *)a)[(i)/NBBY] &= ~(1<<((i)%NBBY)))
+#define        isset(a, i)     (((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY)))
+#define        isclr(a, i)     ((((uint8 *)a)[(i)/NBBY] & (1<<((i)%NBBY))) == 0)
+#endif /* setbit */
+
+#define        NBITS(type)     (sizeof(type) * 8)
+#define NBITVAL(nbits) (1 << (nbits))
+#define MAXBITVAL(nbits)       ((1 << (nbits)) - 1)
+#define        NBITMASK(nbits) MAXBITVAL(nbits)
+#define MAXNBVAL(nbyte)        MAXBITVAL((nbyte) * 8)
+
+/* basic mux operation - can be optimized on several architectures */
+#define MUX(pred, true, false) ((pred) ? (true) : (false))
+
+/* modulo inc/dec - assumes x E [0, bound - 1] */
+#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
+#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
+
+/* modulo inc/dec, bound = 2^k */
+#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
+#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
+
+/* modulo add/sub - assumes x, y E [0, bound - 1] */
+#define MODADD(x, y, bound) \
+    MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
+#define MODSUB(x, y, bound) \
+    MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
+
+/* module add/sub, bound = 2^k */
+#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
+#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
+
+/* crc defines */
+#define CRC8_INIT_VALUE  0xff          /* Initial CRC8 checksum value */
+#define CRC8_GOOD_VALUE  0x9f          /* Good final CRC8 checksum value */
+#define CRC16_INIT_VALUE 0xffff                /* Initial CRC16 checksum value */
+#define CRC16_GOOD_VALUE 0xf0b8                /* Good final CRC16 checksum value */
+#define CRC32_INIT_VALUE 0xffffffff    /* Initial CRC32 checksum value */
+#define CRC32_GOOD_VALUE 0xdebb20e3    /* Good final CRC32 checksum value */
+
+/* bcm_format_flags() bit description structure */
+typedef struct bcm_bit_desc {
+       uint32  bit;
+       char*   name;
+} bcm_bit_desc_t;
+
+/* tag_ID/length/value_buffer tuple */
+typedef struct bcm_tlv {
+       uint8   id;
+       uint8   len;
+       uint8   data[1];
+} bcm_tlv_t;
+
+/* Check that bcm_tlv_t fits into the given buflen */
+#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
+
+/* buffer length for ethernet address from bcm_ether_ntoa() */
+#define ETHER_ADDR_STR_LEN     18      /* 18-bytes of Ethernet address buffer length */
+
+/* unaligned load and store macros */
+#ifdef IL_BIGENDIAN
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[0] = (v >> 24) & 0xff;
+       a[1] = (v >> 16) & 0xff;
+       a[2] = (v >> 8) & 0xff;
+       a[3] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[0] << 8) | a[1]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[0] = (v >> 8) & 0xff;
+       a[1] = v & 0xff;
+}
+
+#else
+
+static INLINE uint32
+load32_ua(uint8 *a)
+{
+       return ((a[3] << 24) | (a[2] << 16) | (a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store32_ua(uint8 *a, uint32 v)
+{
+       a[3] = (v >> 24) & 0xff;
+       a[2] = (v >> 16) & 0xff;
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+static INLINE uint16
+load16_ua(uint8 *a)
+{
+       return ((a[1] << 8) | a[0]);
+}
+
+static INLINE void
+store16_ua(uint8 *a, uint16 v)
+{
+       a[1] = (v >> 8) & 0xff;
+       a[0] = v & 0xff;
+}
+
+#endif /* IL_BIGENDIAN */
+
+/* externs */
+/* crc */
+extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
+extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
+extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
+/* format/print */
+extern void printfbig(char *buf);
+
+/* IE parsing */
+extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
+extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
+extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
+
+/* bcmerror */
+extern const char *bcmerrorstr(int bcmerror);
+
+/* multi-bool data type: set of bools, mbool is true if any is set */
+typedef uint32 mbool;
+#define mboolset(mb, bit)              (mb |= bit)             /* set one bool */
+#define mboolclr(mb, bit)              (mb &= ~bit)            /* clear one bool */
+#define mboolisset(mb, bit)            ((mb & bit) != 0)       /* TRUE if one bool is set */
+#define        mboolmaskset(mb, mask, val)     ((mb) = (((mb) & ~(mask)) | (val)))
+
+/* power conversion */
+extern uint16 bcm_qdbm_to_mw(uint8 qdbm);
+extern uint8 bcm_mw_to_qdbm(uint16 mw);
+
+/* generic datastruct to help dump routines */
+struct fielddesc {
+       char    *nameandfmt;
+       uint32  offset;
+       uint32  len;
+};
+
+/* Buffer structure for collecting string-formatted data 
+* using bcm_bprintf() API.
+* Use bcm_binit() to initialize before use
+*/
+struct bcmstrbuf
+{
+       char *buf;      /* pointer to current position in origbuf */
+       uint size;      /* current (residual) size in bytes */
+       char *origbuf;  /* unmodified pointer to orignal buffer */
+       uint origsize;  /* unmodified orignal buffer size in bytes */
+};
+
+extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
+extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
+
+typedef  uint32 (*readreg_rtn)(void *arg0, void *arg1, uint32 offset);
+extern uint bcmdumpfields(readreg_rtn func_ptr, void *arg0, void *arg1, struct fielddesc *str,
+                          char *buf, uint32 bufsize);
+
+extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
+extern uint bcm_bitcount(uint8 *bitmap, uint bytelength);
+
+#endif /* _bcmutils_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndcpu.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndcpu.h
new file mode 100644 (file)
index 0000000..b9844b0
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * HND SiliconBackplane MIPS/ARM cores software interface.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: hndcpu.h,v 1.1.1.1 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef _hndcpu_h_
+#define _hndcpu_h_
+
+#if defined(mips)
+#include <hndmips.h>
+#elif defined(__ARM_ARCH_4T__)
+#include <hndarm.h>
+#endif
+
+extern uint sb_irq(sb_t *sbh);
+extern uint32 sb_cpu_clock(sb_t *sbh);
+extern void sb_cpu_wait(void);
+
+#endif /* _hndcpu_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndmips.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndmips.h
new file mode 100644 (file)
index 0000000..cd771ca
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * HND SiliconBackplane MIPS core software interface.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: hndmips.h,v 1.1.1.8 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef _hndmips_h_
+#define _hndmips_h_
+
+extern void sb_mips_init(sb_t *sbh, uint shirq_map_base);
+extern bool sb_mips_setclock(sb_t *sbh, uint32 mipsclock, uint32 sbclock, uint32 pciclock);
+extern void enable_pfc(uint32 mode);
+extern uint32 sb_memc_get_ncdl(sb_t *sbh);
+
+#if defined(BCMPERFSTATS)
+/* enable counting - exclusive version. Only one set of counters allowed at a time */
+extern void hndmips_perf_instrcount_enable(void);
+extern void hndmips_perf_icachecount_enable(void);
+extern void hndmips_perf_dcachecount_enable(void);
+/* start and stop counting */
+#define hndmips_perf_start01() \
+       MTC0(C0_PERFORMANCE, 4, MFC0(C0_PERFORMANCE, 4) | 0x80008000)
+#define hndmips_perf_stop01() \
+       MTC0(C0_PERFORMANCE, 4, MFC0(C0_PERFORMANCE, 4) & ~0x80008000)
+/* retrieve coutners - counters *decrement* */
+#define hndmips_perf_read0() -(long)(MFC0(C0_PERFORMANCE, 0))
+#define hndmips_perf_read1() -(long)(MFC0(C0_PERFORMANCE, 1))
+#define hndmips_perf_read2() -(long)(MFC0(C0_PERFORMANCE, 2))
+/* enable counting - modular version. Each counters can be enabled separately. */
+extern void hndmips_perf_icache_hit_enable(void);
+extern void hndmips_perf_icache_miss_enable(void);
+extern uint32 hndmips_perf_read_instrcount(void);
+extern uint32 hndmips_perf_read_cache_miss(void);
+extern uint32 hndmips_perf_read_cache_hit(void);
+#endif /*  defined(BCMINTERNAL) || defined (BCMPERFSTATS) */
+
+#endif /* _hndmips_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndpci.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/hndpci.h
new file mode 100644 (file)
index 0000000..6ae0eff
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * HND SiliconBackplane PCI core software interface.
+ *
+ * $Id: hndpci.h,v 1.1.1.1 2006/02/27 03:43:16 honor Exp $
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ */
+
+#ifndef _hndpci_h_
+#define _hndpci_h_
+
+extern int sbpci_read_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf,
+                             int len);
+extern int extpci_read_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf,
+                              int len);
+extern int sbpci_write_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf,
+                              int len);
+extern int extpci_write_config(sb_t *sbh, uint bus, uint dev, uint func, uint off, void *buf,
+                               int len);
+extern void sbpci_ban(uint16 core);
+extern int sbpci_init(sb_t *sbh);
+extern int sbpci_init_pci(sb_t *sbh);
+extern void sbpci_check(sb_t *sbh);
+
+#endif /* _hndpci_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/linuxver.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/linuxver.h
new file mode 100644 (file)
index 0000000..c6a12ae
--- /dev/null
@@ -0,0 +1,417 @@
+/*
+ * Linux-specific abstractions to gain some independence from linux kernel versions.
+ * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: linuxver.h,v 1.1.1.10 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef _linuxver_h_
+#define _linuxver_h_
+
+#include <linux/config.h>
+#include <linux/version.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0))
+/* __NO_VERSION__ must be defined for all linkables except one in 2.2 */
+#ifdef __UNDEF_NO_VERSION__
+#undef __NO_VERSION__
+#else
+#define __NO_VERSION__
+#endif
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0) */
+
+#if defined(MODULE) && defined(MODVERSIONS)
+#include <linux/modversions.h>
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 0)
+#include <linux/moduleparam.h>
+#endif
+
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0)
+#define module_param(_name_, _type_, _perm_)   MODULE_PARM(_name_, "i")
+#define module_param_string(_name_, _string_, _size_, _perm_) \
+               MODULE_PARM(_string_, "c" __MODULE_STRING(_size_))
+#endif
+
+/* linux/malloc.h is deprecated, use linux/slab.h instead. */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 9))
+#include <linux/malloc.h>
+#else
+#include <linux/slab.h>
+#endif
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/pci.h>
+#include <linux/interrupt.h>
+#include <linux/netdevice.h>
+#include <asm/io.h>
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41))
+#include <linux/workqueue.h>
+#else
+#include <linux/tqueue.h>
+#ifndef work_struct
+#define work_struct tq_struct
+#endif
+#ifndef INIT_WORK
+#define INIT_WORK(_work, _func, _data) INIT_TQUEUE((_work), (_func), (_data))
+#endif
+#ifndef schedule_work
+#define schedule_work(_work) schedule_task((_work))
+#endif
+#ifndef flush_scheduled_work
+#define flush_scheduled_work() flush_scheduled_tasks()
+#endif
+#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41) */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0))
+/* Some distributions have their own 2.6.x compatibility layers */
+#ifndef IRQ_NONE
+typedef void irqreturn_t;
+#define IRQ_NONE
+#define IRQ_HANDLED
+#define IRQ_RETVAL(x)
+#endif
+#else
+typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs);
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) */
+
+#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
+
+#include <pcmcia/version.h>
+#include <pcmcia/cs_types.h>
+#include <pcmcia/cs.h>
+#include <pcmcia/cistpl.h>
+#include <pcmcia/cisreg.h>
+#include <pcmcia/ds.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 69))
+/* In 2.5 (as of 2.5.69 at least) there is a cs_error exported which
+ * does this, but it's not in 2.4 so we do our own for now.
+ */
+static inline void
+cs_error(client_handle_t handle, int func, int ret)
+{
+       error_info_t err = { func, ret };
+       CardServices(ReportError, handle, &err);
+}
+#endif
+
+#endif /* CONFIG_PCMCIA */
+
+#ifndef __exit
+#define __exit
+#endif
+#ifndef __devexit
+#define __devexit
+#endif
+#ifndef __devinit
+#define __devinit      __init
+#endif
+#ifndef __devinitdata
+#define __devinitdata
+#endif
+#ifndef __devexit_p
+#define __devexit_p(x) x
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0))
+
+#define pci_get_drvdata(dev)           (dev)->sysdata
+#define pci_set_drvdata(dev, value)    (dev)->sysdata = (value)
+
+/*
+ * New-style (2.4.x) PCI/hot-pluggable PCI/CardBus registration
+ */
+
+struct pci_device_id {
+       unsigned int vendor, device;            /* Vendor and device ID or PCI_ANY_ID */
+       unsigned int subvendor, subdevice;      /* Subsystem ID's or PCI_ANY_ID */
+       unsigned int class, class_mask;         /* (class,subclass,prog-if) triplet */
+       unsigned long driver_data;              /* Data private to the driver */
+};
+
+struct pci_driver {
+       struct list_head node;
+       char *name;
+       const struct pci_device_id *id_table;   /* NULL if wants all devices */
+       int (*probe)(struct pci_dev *dev,
+                    const struct pci_device_id *id); /* New device inserted */
+       void (*remove)(struct pci_dev *dev);    /* Device removed (NULL if not a hot-plug
+                                                * capable driver)
+                                                */
+       void (*suspend)(struct pci_dev *dev);   /* Device suspended */
+       void (*resume)(struct pci_dev *dev);    /* Device woken up */
+};
+
+#define MODULE_DEVICE_TABLE(type, name)
+#define PCI_ANY_ID (~0)
+
+/* compatpci.c */
+#define pci_module_init pci_register_driver
+extern int pci_register_driver(struct pci_driver *drv);
+extern void pci_unregister_driver(struct pci_driver *drv);
+
+#endif /* PCI registration */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18))
+#ifdef MODULE
+#define module_init(x) int init_module(void) { return x(); }
+#define module_exit(x) void cleanup_module(void) { x(); }
+#else
+#define module_init(x) __initcall(x);
+#define module_exit(x) __exitcall(x);
+#endif
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18) */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 48))
+#define list_for_each(pos, head) \
+       for (pos = (head)->next; pos != (head); pos = pos->next)
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 13))
+#define pci_resource_start(dev, bar)   ((dev)->base_address[(bar)])
+#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 44))
+#define pci_resource_start(dev, bar)   ((dev)->resource[(bar)].start)
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 23))
+#define pci_enable_device(dev) do { } while (0)
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14))
+#define net_device device
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 42))
+
+/*
+ * DMA mapping
+ *
+ * See linux/Documentation/DMA-mapping.txt
+ */
+
+#ifndef PCI_DMA_TODEVICE
+#define        PCI_DMA_TODEVICE        1
+#define        PCI_DMA_FROMDEVICE      2
+#endif
+
+typedef u32 dma_addr_t;
+
+/* Pure 2^n version of get_order */
+static inline int get_order(unsigned long size)
+{
+       int order;
+
+       size = (size-1) >> (PAGE_SHIFT-1);
+       order = -1;
+       do {
+               size >>= 1;
+               order++;
+       } while (size);
+       return order;
+}
+
+static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
+                                         dma_addr_t *dma_handle)
+{
+       void *ret;
+       int gfp = GFP_ATOMIC | GFP_DMA;
+
+       ret = (void *)__get_free_pages(gfp, get_order(size));
+
+       if (ret != NULL) {
+               memset(ret, 0, size);
+               *dma_handle = virt_to_bus(ret);
+       }
+       return ret;
+}
+static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size,
+                                       void *vaddr, dma_addr_t dma_handle)
+{
+       free_pages((unsigned long)vaddr, get_order(size));
+}
+#ifdef ILSIM
+extern uint pci_map_single(void *dev, void *va, uint size, int direction);
+extern void pci_unmap_single(void *dev, uint pa, uint size, int direction);
+#else
+#define pci_map_single(cookie, address, size, dir)     virt_to_bus(address)
+#define pci_unmap_single(cookie, address, size, dir)
+#endif
+
+#endif /* DMA mapping */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 43))
+
+#define dev_kfree_skb_any(a)           dev_kfree_skb(a)
+#define netif_down(dev)                        do { (dev)->start = 0; } while (0)
+
+/* pcmcia-cs provides its own netdevice compatibility layer */
+#ifndef _COMPAT_NETDEVICE_H
+
+/*
+ * SoftNet
+ *
+ * For pre-softnet kernels we need to tell the upper layer not to
+ * re-enter start_xmit() while we are in there. However softnet
+ * guarantees not to enter while we are in there so there is no need
+ * to do the netif_stop_queue() dance unless the transmit queue really
+ * gets stuck. This should also improve performance according to tests
+ * done by Aman Singla.
+ */
+
+#define dev_kfree_skb_irq(a)   dev_kfree_skb(a)
+#define netif_wake_queue(dev) \
+               do { clear_bit(0, &(dev)->tbusy); mark_bh(NET_BH); } while (0)
+#define netif_stop_queue(dev)  set_bit(0, &(dev)->tbusy)
+
+static inline void netif_start_queue(struct net_device *dev)
+{
+       dev->tbusy = 0;
+       dev->interrupt = 0;
+       dev->start = 1;
+}
+
+#define netif_queue_stopped(dev)       (dev)->tbusy
+#define netif_running(dev)             (dev)->start
+
+#endif /* _COMPAT_NETDEVICE_H */
+
+#define netif_device_attach(dev)       netif_start_queue(dev)
+#define netif_device_detach(dev)       netif_stop_queue(dev)
+
+/* 2.4.x renamed bottom halves to tasklets */
+#define tasklet_struct                         tq_struct
+static inline void tasklet_schedule(struct tasklet_struct *tasklet)
+{
+       queue_task(tasklet, &tq_immediate);
+       mark_bh(IMMEDIATE_BH);
+}
+
+static inline void tasklet_init(struct tasklet_struct *tasklet,
+                                void (*func)(unsigned long),
+                                unsigned long data)
+{
+       tasklet->next = NULL;
+       tasklet->sync = 0;
+       tasklet->routine = (void (*)(void *))func;
+       tasklet->data = (void *)data;
+}
+#define tasklet_kill(tasklet)  { do{} while (0); }
+
+/* 2.4.x introduced del_timer_sync() */
+#define del_timer_sync(timer) del_timer(timer)
+
+#else
+
+#define netif_down(dev)
+
+#endif /* SoftNet */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3))
+
+/*
+ * Emit code to initialise a tq_struct's routine and data pointers
+ */
+#define PREPARE_TQUEUE(_tq, _routine, _data)                   \
+       do {                                                    \
+               (_tq)->routine = _routine;                      \
+               (_tq)->data = _data;                            \
+       } while (0)
+
+/*
+ * Emit code to initialise all of a tq_struct
+ */
+#define INIT_TQUEUE(_tq, _routine, _data)                      \
+       do {                                                    \
+               INIT_LIST_HEAD(&(_tq)->list);                   \
+               (_tq)->sync = 0;                                \
+               PREPARE_TQUEUE((_tq), (_routine), (_data));     \
+       } while (0)
+
+#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3) */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 6))
+
+/* Power management related routines */
+
+static inline int
+pci_save_state(struct pci_dev *dev, u32 *buffer)
+{
+       int i;
+       if (buffer) {
+               for (i = 0; i < 16; i++)
+                       pci_read_config_dword(dev, i * 4, &buffer[i]);
+       }
+       return 0;
+}
+
+static inline int
+pci_restore_state(struct pci_dev *dev, u32 *buffer)
+{
+       int i;
+
+       if (buffer) {
+               for (i = 0; i < 16; i++)
+                       pci_write_config_dword(dev, i * 4, buffer[i]);
+       }
+       /*
+        * otherwise, write the context information we know from bootup.
+        * This works around a problem where warm-booting from Windows
+        * combined with a D3(hot)->D0 transition causes PCI config
+        * header data to be forgotten.
+        */
+       else {
+               for (i = 0; i < 6; i ++)
+                       pci_write_config_dword(dev,
+                                              PCI_BASE_ADDRESS_0 + (i * 4),
+                                              pci_resource_start(dev, i));
+               pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
+       }
+       return 0;
+}
+
+#endif /* PCI power management */
+
+/* Old cp0 access macros deprecated in 2.4.19 */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 19))
+#define read_c0_count() read_32bit_cp0_register(CP0_COUNT)
+#endif
+
+/* Module refcount handled internally in 2.6.x */
+#ifndef SET_MODULE_OWNER
+#define SET_MODULE_OWNER(dev)          do {} while (0)
+#define OLD_MOD_INC_USE_COUNT          MOD_INC_USE_COUNT
+#define OLD_MOD_DEC_USE_COUNT          MOD_DEC_USE_COUNT
+#else
+#define OLD_MOD_INC_USE_COUNT          do {} while (0)
+#define OLD_MOD_DEC_USE_COUNT          do {} while (0)
+#endif
+
+#ifndef SET_NETDEV_DEV
+#define SET_NETDEV_DEV(net, pdev)      do {} while (0)
+#endif
+
+#ifndef HAVE_FREE_NETDEV
+#define free_netdev(dev)               kfree(dev)
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0))
+/* struct packet_type redefined in 2.6.x */
+#define af_packet_priv                 data
+#endif
+
+#endif /* _linuxver_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/mipsinc.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/mipsinc.h
new file mode 100644 (file)
index 0000000..2c87031
--- /dev/null
@@ -0,0 +1,541 @@
+/*
+ * HND Run Time Environment for standalone MIPS programs.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: mipsinc.h,v 1.1.1.5 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _MISPINC_H
+#define _MISPINC_H
+
+
+/* MIPS defines */
+
+#ifdef _LANGUAGE_ASSEMBLY
+
+/*
+ * Symbolic register names for 32 bit ABI
+ */
+#define zero   $0      /* wired zero */
+#define AT     $1      /* assembler temp - uppercase because of ".set at" */
+#define v0     $2      /* return value */
+#define v1     $3
+#define a0     $4      /* argument registers */
+#define a1     $5
+#define a2     $6
+#define a3     $7
+#define t0     $8      /* caller saved */
+#define t1     $9
+#define t2     $10
+#define t3     $11
+#define t4     $12
+#define t5     $13
+#define t6     $14
+#define t7     $15
+#define s0     $16     /* callee saved */
+#define s1     $17
+#define s2     $18
+#define s3     $19
+#define s4     $20
+#define s5     $21
+#define s6     $22
+#define s7     $23
+#define t8     $24     /* caller saved */
+#define t9     $25
+#define jp     $25     /* PIC jump register */
+#define k0     $26     /* kernel scratch */
+#define k1     $27
+#define gp     $28     /* global pointer */
+#define sp     $29     /* stack pointer */
+#define fp     $30     /* frame pointer */
+#define s8     $30     /* same like fp! */
+#define ra     $31     /* return address */
+
+
+/* CP0 Registers */
+
+#define C0_INX         $0
+#define C0_RAND                $1
+#define C0_TLBLO0      $2
+#define C0_TLBLO       C0_TLBLO0
+#define C0_TLBLO1      $3
+#define C0_CTEXT       $4
+#define C0_PGMASK      $5
+#define C0_WIRED       $6
+#define C0_BADVADDR    $8
+#define C0_COUNT       $9
+#define C0_TLBHI       $10
+#define C0_COMPARE     $11
+#define C0_SR          $12
+#define C0_STATUS      C0_SR
+#define C0_CAUSE       $13
+#define C0_EPC         $14
+#define C0_PRID                $15
+#define C0_CONFIG      $16
+#define C0_LLADDR      $17
+#define C0_WATCHLO     $18
+#define C0_WATCHHI     $19
+#define C0_XCTEXT      $20
+#define C0_DIAGNOSTIC  $22
+#define C0_BROADCOM    C0_DIAGNOSTIC
+#define        C0_PERFORMANCE  $25
+#define C0_ECC         $26
+#define C0_CACHEERR    $27
+#define C0_TAGLO       $28
+#define C0_TAGHI       $29
+#define C0_ERREPC      $30
+#define C0_DESAVE      $31
+
+/*
+ * LEAF - declare leaf routine
+ */
+#define LEAF(symbol)                           \
+               .globl  symbol;                 \
+               .align  2;                      \
+               .type   symbol, @function;      \
+               .ent    symbol, 0;              \
+symbol:                .frame  sp, 0, ra
+
+/*
+ * END - mark end of function
+ */
+#define END(function)                          \
+               .end    function;               \
+               .size   function, . - function
+
+#define _ULCAST_
+
+#define MFC0_SEL(dst, src, sel) \
+               .word\t(0x40000000 | ((dst) << 16) | ((src) << 11) | (sel))
+
+
+#define MTC0_SEL(dst, src, sel) \
+               .word\t(0x40800000 | ((dst) << 16) | ((src) << 11) | (sel))
+
+#else
+
+/*
+ * The following macros are especially useful for __asm__
+ * inline assembler.
+ */
+#ifndef __STR
+#define __STR(x) #x
+#endif
+#ifndef STR
+#define STR(x) __STR(x)
+#endif
+
+#define _ULCAST_ (unsigned long)
+
+
+/* CP0 Registers */
+
+#define C0_INX         0               /* CP0: TLB Index */
+#define C0_RAND                1               /* CP0: TLB Random */
+#define C0_TLBLO0      2               /* CP0: TLB EntryLo0 */
+#define C0_TLBLO       C0_TLBLO0       /* CP0: TLB EntryLo0 */
+#define C0_TLBLO1      3               /* CP0: TLB EntryLo1 */
+#define C0_CTEXT       4               /* CP0: Context */
+#define C0_PGMASK      5               /* CP0: TLB PageMask */
+#define C0_WIRED       6               /* CP0: TLB Wired */
+#define C0_BADVADDR    8               /* CP0: Bad Virtual Address */
+#define C0_COUNT       9               /* CP0: Count */
+#define C0_TLBHI       10              /* CP0: TLB EntryHi */
+#define C0_COMPARE     11              /* CP0: Compare */
+#define C0_SR          12              /* CP0: Processor Status */
+#define C0_STATUS      C0_SR           /* CP0: Processor Status */
+#define C0_CAUSE       13              /* CP0: Exception Cause */
+#define C0_EPC         14              /* CP0: Exception PC */
+#define C0_PRID                15              /* CP0: Processor Revision Indentifier */
+#define C0_CONFIG      16              /* CP0: Config */
+#define C0_LLADDR      17              /* CP0: LLAddr */
+#define C0_WATCHLO     18              /* CP0: WatchpointLo */
+#define C0_WATCHHI     19              /* CP0: WatchpointHi */
+#define C0_XCTEXT      20              /* CP0: XContext */
+#define C0_DIAGNOSTIC  22              /* CP0: Diagnostic */
+#define C0_BROADCOM    C0_DIAGNOSTIC   /* CP0: Broadcom Register */
+#define        C0_PERFORMANCE  25              /* CP0: Performance Counter/Control Registers */
+#define C0_ECC         26              /* CP0: ECC */
+#define C0_CACHEERR    27              /* CP0: CacheErr */
+#define C0_TAGLO       28              /* CP0: TagLo */
+#define C0_TAGHI       29              /* CP0: TagHi */
+#define C0_ERREPC      30              /* CP0: ErrorEPC */
+#define C0_DESAVE      31              /* CP0: DebugSave */
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+/*
+ * Memory segments (32bit kernel mode addresses)
+ */
+#undef KUSEG
+#undef KSEG0
+#undef KSEG1
+#undef KSEG2
+#undef KSEG3
+#define KUSEG          0x00000000
+#define KSEG0          0x80000000
+#define KSEG1          0xa0000000
+#define KSEG2          0xc0000000
+#define KSEG3          0xe0000000
+#define PHYSADDR_MASK  0x1fffffff
+
+/*
+ * Map an address to a certain kernel segment
+ */
+#undef PHYSADDR
+#undef KSEG0ADDR
+#undef KSEG1ADDR
+#undef KSEG2ADDR
+#undef KSEG3ADDR
+
+#define PHYSADDR(a)    (_ULCAST_(a) & PHYSADDR_MASK)
+#define KSEG0ADDR(a)   ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG0)
+#define KSEG1ADDR(a)   ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG1)
+#define KSEG2ADDR(a)   ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG2)
+#define KSEG3ADDR(a)   ((_ULCAST_(a) & PHYSADDR_MASK) | KSEG3)
+
+
+#ifndef        Index_Invalidate_I
+/*
+ * Cache Operations
+ */
+#define Index_Invalidate_I     0x00
+#define Index_Writeback_Inv_D  0x01
+#define Index_Invalidate_SI    0x02
+#define Index_Writeback_Inv_SD 0x03
+#define Index_Load_Tag_I       0x04
+#define Index_Load_Tag_D       0x05
+#define Index_Load_Tag_SI      0x06
+#define Index_Load_Tag_SD      0x07
+#define Index_Store_Tag_I      0x08
+#define Index_Store_Tag_D      0x09
+#define Index_Store_Tag_SI     0x0A
+#define Index_Store_Tag_SD     0x0B
+#define Create_Dirty_Excl_D    0x0d
+#define Create_Dirty_Excl_SD   0x0f
+#define Hit_Invalidate_I       0x10
+#define Hit_Invalidate_D       0x11
+#define Hit_Invalidate_SI      0x12
+#define Hit_Invalidate_SD      0x13
+#define Fill_I                 0x14
+#define Hit_Writeback_Inv_D    0x15
+                                       /* 0x16 is unused */
+#define Hit_Writeback_Inv_SD   0x17
+#define R5K_Page_Invalidate_S  0x17
+#define Hit_Writeback_I                0x18
+#define Hit_Writeback_D                0x19
+                                       /* 0x1a is unused */
+#define Hit_Writeback_SD       0x1b
+                                       /* 0x1c is unused */
+                                       /* 0x1e is unused */
+#define Hit_Set_Virtual_SI     0x1e
+#define Hit_Set_Virtual_SD     0x1f
+#endif /* !Index_Invalidate_I */
+
+
+/*
+ * R4x00 interrupt enable / cause bits
+ */
+#define IE_SW0                 (_ULCAST_(1) <<  8)
+#define IE_SW1                 (_ULCAST_(1) <<  9)
+#define IE_IRQ0                        (_ULCAST_(1) << 10)
+#define IE_IRQ1                        (_ULCAST_(1) << 11)
+#define IE_IRQ2                        (_ULCAST_(1) << 12)
+#define IE_IRQ3                        (_ULCAST_(1) << 13)
+#define IE_IRQ4                        (_ULCAST_(1) << 14)
+#define IE_IRQ5                        (_ULCAST_(1) << 15)
+
+#ifndef        ST0_UM
+/*
+ * Bitfields in the mips32 cp0 status register
+ */
+#define ST0_IE                 0x00000001
+#define ST0_EXL                        0x00000002
+#define ST0_ERL                        0x00000004
+#define ST0_UM                 0x00000010
+#define ST0_SWINT0             0x00000100
+#define ST0_SWINT1             0x00000200
+#define ST0_HWINT0             0x00000400
+#define ST0_HWINT1             0x00000800
+#define ST0_HWINT2             0x00001000
+#define ST0_HWINT3             0x00002000
+#define ST0_HWINT4             0x00004000
+#define ST0_HWINT5             0x00008000
+#define ST0_IM                 0x0000ff00
+#define ST0_NMI                        0x00080000
+#define ST0_SR                 0x00100000
+#define ST0_TS                 0x00200000
+#define ST0_BEV                        0x00400000
+#define ST0_RE                 0x02000000
+#define ST0_RP                 0x08000000
+#define ST0_CU                 0xf0000000
+#define ST0_CU0                        0x10000000
+#define ST0_CU1                        0x20000000
+#define ST0_CU2                        0x40000000
+#define ST0_CU3                        0x80000000
+#endif /* !ST0_UM */
+
+
+/*
+ * Bitfields in the mips32 cp0 cause register
+ */
+#define C_EXC                  0x0000007c
+#define C_EXC_SHIFT            2
+#define C_INT                  0x0000ff00
+#define C_INT_SHIFT            8
+#define C_SW0                  (_ULCAST_(1) <<  8)
+#define C_SW1                  (_ULCAST_(1) <<  9)
+#define C_IRQ0                 (_ULCAST_(1) << 10)
+#define C_IRQ1                 (_ULCAST_(1) << 11)
+#define C_IRQ2                 (_ULCAST_(1) << 12)
+#define C_IRQ3                 (_ULCAST_(1) << 13)
+#define C_IRQ4                 (_ULCAST_(1) << 14)
+#define C_IRQ5                 (_ULCAST_(1) << 15)
+#define C_WP                   0x00400000
+#define C_IV                   0x00800000
+#define C_CE                   0x30000000
+#define C_CE_SHIFT             28
+#define C_BD                   0x80000000
+
+/* Values in C_EXC */
+#define EXC_INT                        0
+#define EXC_TLBM               1
+#define EXC_TLBL               2
+#define EXC_TLBS               3
+#define EXC_AEL                        4
+#define EXC_AES                        5
+#define EXC_IBE                        6
+#define EXC_DBE                        7
+#define EXC_SYS                        8
+#define EXC_BPT                        9
+#define EXC_RI                 10
+#define EXC_CU                 11
+#define EXC_OV                 12
+#define EXC_TR                 13
+#define EXC_WATCH              23
+#define EXC_MCHK               24
+
+
+/*
+ * Bits in the cp0 config register.
+ */
+#define CONF_CM_CACHABLE_NO_WA         0
+#define CONF_CM_CACHABLE_WA            1
+#define CONF_CM_UNCACHED               2
+#define CONF_CM_CACHABLE_NONCOHERENT   3
+#define CONF_CM_CACHABLE_CE            4
+#define CONF_CM_CACHABLE_COW           5
+#define CONF_CM_CACHABLE_CUW           6
+#define CONF_CM_CACHABLE_ACCELERATED   7
+#define CONF_CM_CMASK                  7
+#define CONF_CU                                (_ULCAST_(1) <<  3)
+#define CONF_DB                                (_ULCAST_(1) <<  4)
+#define CONF_IB                                (_ULCAST_(1) <<  5)
+#define CONF_SE                                (_ULCAST_(1) << 12)
+#ifndef CONF_BE                                    /* duplicate in mipsregs.h */
+#define CONF_BE                                (_ULCAST_(1) << 15)
+#endif
+#define CONF_SC                                (_ULCAST_(1) << 17)
+#define CONF_AC                                (_ULCAST_(1) << 23)
+#define CONF_HALT                      (_ULCAST_(1) << 25)
+#ifndef CONF_M                             /* duplicate in mipsregs.h */
+#define CONF_M                         (_ULCAST_(1) << 31)
+#endif
+
+
+/*
+ * Bits in the cp0 config register select 1.
+ */
+#define CONF1_FP               0x00000001      /* FPU present */
+#define CONF1_EP               0x00000002      /* EJTAG present */
+#define CONF1_CA               0x00000004      /* mips16 implemented */
+#define CONF1_WR               0x00000008      /* Watch registers present */
+#define CONF1_PC               0x00000010      /* Performance counters present */
+#define CONF1_DA_SHIFT         7               /* D$ associativity */
+#define CONF1_DA_MASK          0x00000380
+#define CONF1_DA_BASE          1
+#define CONF1_DL_SHIFT         10              /* D$ line size */
+#define CONF1_DL_MASK          0x00001c00
+#define CONF1_DL_BASE          2
+#define CONF1_DS_SHIFT         13              /* D$ sets/way */
+#define CONF1_DS_MASK          0x0000e000
+#define CONF1_DS_BASE          64
+#define CONF1_IA_SHIFT         16              /* I$ associativity */
+#define CONF1_IA_MASK          0x00070000
+#define CONF1_IA_BASE          1
+#define CONF1_IL_SHIFT         19              /* I$ line size */
+#define CONF1_IL_MASK          0x00380000
+#define CONF1_IL_BASE          2
+#define CONF1_IS_SHIFT         22              /* Instruction cache sets/way */
+#define CONF1_IS_MASK          0x01c00000
+#define CONF1_IS_BASE          64
+#define CONF1_MS_MASK          0x7e000000      /* Number of tlb entries */
+#define CONF1_MS_SHIFT         25
+
+/* PRID register */
+#define PRID_COPT_MASK         0xff000000
+#define PRID_COMP_MASK         0x00ff0000
+#define PRID_IMP_MASK          0x0000ff00
+#define PRID_REV_MASK          0x000000ff
+
+#define PRID_COMP_LEGACY       0x000000
+#define PRID_COMP_MIPS         0x010000
+#define PRID_COMP_BROADCOM     0x020000
+#define PRID_COMP_ALCHEMY      0x030000
+#define PRID_COMP_SIBYTE       0x040000
+#define PRID_IMP_BCM4710       0x4000
+#define PRID_IMP_BCM3302       0x9000
+#define PRID_IMP_BCM3303       0x9100
+
+#define PRID_IMP_UNKNOWN       0xff00
+
+#define BCM330X(id) \
+               (((id & (PRID_COMP_MASK | PRID_IMP_MASK)) == \
+                (PRID_COMP_BROADCOM | PRID_IMP_BCM3302)) || \
+               ((id & (PRID_COMP_MASK | PRID_IMP_MASK)) == \
+                (PRID_COMP_BROADCOM | PRID_IMP_BCM3303)))
+
+/* Bits in C0_BROADCOM */
+#define BRCM_PFC_AVAIL         0x20000000      /* PFC is available */
+#define BRCM_DC_ENABLE         0x40000000      /* Enable Data $ */
+#define BRCM_IC_ENABLE         0x80000000      /* Enable Instruction $ */
+#define BRCM_PFC_ENABLE                0x00400000      /* Obsolete? Enable PFC (at least on 4310) */
+#define BRCM_CLF_ENABLE                0x00100000      /* Enable cache line first feature */
+
+/* PreFetch Cache aka Read Ahead Cache */
+
+#define PFC_CR0                        0xff400000      /* control reg 0 */
+#define PFC_CR1                        0xff400004      /* control reg 1 */
+
+/* PFC operations */
+#define PFC_I                  0x00000001      /* Enable PFC use for instructions */
+#define PFC_D                  0x00000002      /* Enable PFC use for data */
+#define PFC_PFI                        0x00000004      /* Enable seq. prefetch for instructions */
+#define PFC_PFD                        0x00000008      /* Enable seq. prefetch for data */
+#define PFC_CINV               0x00000010      /* Enable selective (i/d) cacheop flushing */
+#define PFC_NCH                        0x00000020      /* Disable flushing based on cacheops */
+#define PFC_DPF                        0x00000040      /* Enable directional prefetching */
+#define PFC_FLUSH              0x00000100      /* Flush the PFC */
+#define PFC_BRR                        0x40000000      /* Bus error indication */
+#define PFC_PWR                        0x80000000      /* Disable power saving (clock gating) */
+
+/* Handy defaults */
+#define PFC_DISABLED           0
+#define PFC_AUTO                       0xffffffff      /* auto select the default mode */
+#define PFC_INST               (PFC_I | PFC_PFI | PFC_CINV)
+#define PFC_INST_NOPF          (PFC_I | PFC_CINV)
+#define PFC_DATA               (PFC_D | PFC_PFD | PFC_CINV)
+#define PFC_DATA_NOPF          (PFC_D | PFC_CINV)
+#define PFC_I_AND_D            (PFC_INST | PFC_DATA)
+#define PFC_I_AND_D_NOPF       (PFC_INST_NOPF | PFC_DATA_NOPF)
+
+#ifndef        _LANGUAGE_ASSEMBLY
+
+/*
+ * Macros to access the system control coprocessor
+ */
+
+#define MFC0(source, sel)                                      \
+({                                                             \
+       int __res;                                              \
+       __asm__ __volatile__("                                  \
+       .set\tnoreorder;                                        \
+       .set\tnoat;                                             \
+       .word\t"STR(0x40010000 | ((source) << 11) | (sel))";    \
+       move\t%0, $1;                                           \
+       .set\tat;                                               \
+       .set\treorder"                                          \
+       :"=r" (__res)                                           \
+       :                                                       \
+       :"$1");                                                 \
+       __res;                                                  \
+})
+
+#define MTC0(source, sel, value)                               \
+do {                                                           \
+       __asm__ __volatile__("                                  \
+       .set\tnoreorder;                                        \
+       .set\tnoat;                                             \
+       move\t$1, %z0;                                          \
+       .word\t"STR(0x40810000 | ((source) << 11) | (sel))";    \
+       .set\tat;                                               \
+       .set\treorder"                                          \
+       :                                                       \
+       :"jr" (value)                                           \
+       :"$1");                                                 \
+} while (0)
+
+#define get_c0_count()                                         \
+({                                                             \
+       int __res;                                              \
+       __asm__ __volatile__("                                  \
+       .set\tnoreorder;                                        \
+       .set\tnoat;                                             \
+       mfc0\t%0, $9;                                           \
+       .set\tat;                                               \
+       .set\treorder"                                          \
+       :"=r" (__res));                                         \
+       __res;                                                  \
+})
+
+static INLINE void icache_probe(uint32 config1, uint *size, uint *lsize)
+{
+       uint lsz, sets, ways;
+
+       /* Instruction Cache Size = Associativity * Line Size * Sets Per Way */
+       if ((lsz = ((config1 & CONF1_IL_MASK) >> CONF1_IL_SHIFT)))
+               lsz = CONF1_IL_BASE << lsz;
+       sets = CONF1_IS_BASE << ((config1 & CONF1_IS_MASK) >> CONF1_IS_SHIFT);
+       ways = CONF1_IA_BASE + ((config1 & CONF1_IA_MASK) >> CONF1_IA_SHIFT);
+       *size = lsz * sets * ways;
+       *lsize = lsz;
+}
+
+static INLINE void dcache_probe(uint32 config1, uint *size, uint *lsize)
+{
+       uint lsz, sets, ways;
+
+       /* Data Cache Size = Associativity * Line Size * Sets Per Way */
+       if ((lsz = ((config1 & CONF1_DL_MASK) >> CONF1_DL_SHIFT)))
+               lsz = CONF1_DL_BASE << lsz;
+       sets = CONF1_DS_BASE << ((config1 & CONF1_DS_MASK) >> CONF1_DS_SHIFT);
+       ways = CONF1_DA_BASE + ((config1 & CONF1_DA_MASK) >> CONF1_DA_SHIFT);
+       *size = lsz * sets * ways;
+       *lsize = lsz;
+}
+
+#define cache_op(base, op)                     \
+       __asm__ __volatile__("                  \
+               .set noreorder;                 \
+               .set mips3;                     \
+               cache %1, (%0);                 \
+               .set mips0;                     \
+               .set reorder"                   \
+               :                               \
+               : "r" (base),                   \
+                 "i" (op));
+
+#define cache_unroll4(base, delta, op)         \
+       __asm__ __volatile__("                  \
+               .set noreorder;                 \
+               .set mips3;                     \
+               cache %1, 0(%0);                \
+               cache %1, delta(%0);            \
+               cache %1, (2 * delta)(%0);      \
+               cache %1, (3 * delta)(%0);      \
+               .set mips0;                     \
+               .set reorder"                   \
+               :                               \
+               : "r" (base),                   \
+                 "i" (op));
+
+#endif /* !_LANGUAGE_ASSEMBLY */
+
+#endif /* _MISPINC_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/osl.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/osl.h
new file mode 100644 (file)
index 0000000..9be4432
--- /dev/null
@@ -0,0 +1,181 @@
+#ifndef __osl_h
+#define __osl_h
+
+#include <linux/delay.h>
+#include <typedefs.h>
+#include <linuxver.h>
+#include <bcmutils.h>
+#include <pcicfg.h>
+
+#define ASSERT(n)
+
+/* Pkttag flag should be part of public information */
+typedef struct {
+       bool pkttag;
+       uint pktalloced; /* Number of allocated packet buffers */
+       void *tx_fn;
+       void *tx_ctx;
+} osl_pubinfo_t;
+
+struct osl_info {
+       osl_pubinfo_t pub;
+       uint magic;
+       void *pdev;
+       uint malloced;
+       uint failed;
+       void *dbgmem_list;
+};
+
+typedef struct osl_info osl_t;
+
+#define PCI_CFG_RETRY                10
+
+/* map/unmap direction */
+#define DMA_TX  1   /* TX direction for DMA */
+#define DMA_RX  2   /* RX direction for DMA */
+
+#define        AND_REG(osh, r, v)              W_REG(osh, (r), R_REG(osh, r) & (v))
+#define        OR_REG(osh, r, v)               W_REG(osh, (r), R_REG(osh, r) | (v))
+#define SET_REG(osh, r, mask, val)     W_REG((osh), (r), ((R_REG((osh), r) & ~(mask)) | (val)))
+
+/* bcopy, bcmp, and bzero */
+#define        bcopy(src, dst, len)    memcpy((dst), (src), (len))
+#define        bcmp(b1, b2, len)       memcmp((b1), (b2), (len))
+#define        bzero(b, len)           memset((b), '\0', (len))
+
+/* uncached virtual address */
+#ifdef mips
+#define OSL_UNCACHED(va)       KSEG1ADDR((va))
+#include <asm/addrspace.h>
+#else
+#define OSL_UNCACHED(va)       (va)
+#endif /* mips */
+
+
+#ifndef IL_BIGENDIAN
+#define R_REG(osh, r) (\
+       sizeof(*(r)) == sizeof(uint8) ? readb((volatile uint8*)(r)) : \
+       sizeof(*(r)) == sizeof(uint16) ? readw((volatile uint16*)(r)) : \
+       readl((volatile uint32*)(r)) \
+)
+#define W_REG(osh, r, v) do { \
+       switch (sizeof(*(r))) { \
+       case sizeof(uint8):     writeb((uint8)(v), (volatile uint8*)(r)); break; \
+       case sizeof(uint16):    writew((uint16)(v), (volatile uint16*)(r)); break; \
+       case sizeof(uint32):    writel((uint32)(v), (volatile uint32*)(r)); break; \
+       } \
+} while (0)
+#else  /* IL_BIGENDIAN */
+#define R_REG(osh, r) ({ \
+       __typeof(*(r)) __osl_v; \
+       switch (sizeof(*(r))) { \
+       case sizeof(uint8):     __osl_v = readb((volatile uint8*)((uint32)r^3)); break; \
+       case sizeof(uint16):    __osl_v = readw((volatile uint16*)((uint32)r^2)); break; \
+       case sizeof(uint32):    __osl_v = readl((volatile uint32*)(r)); break; \
+       } \
+       __osl_v; \
+})
+#define W_REG(osh, r, v) do { \
+       switch (sizeof(*(r))) { \
+       case sizeof(uint8):     writeb((uint8)(v), (volatile uint8*)((uint32)r^3)); break; \
+       case sizeof(uint16):    writew((uint16)(v), (volatile uint16*)((uint32)r^2)); break; \
+       case sizeof(uint32):    writel((uint32)(v), (volatile uint32*)(r)); break; \
+       } \
+} while (0)
+#endif /* IL_BIGENDIAN */
+
+/* dereference an address that may cause a bus exception */
+#define        BUSPROBE(val, addr)     get_dbe((val), (addr))
+#include <asm/paccess.h>
+
+/* map/unmap physical to virtual I/O */
+#define        REG_MAP(pa, size)       ioremap_nocache((unsigned long)(pa), (unsigned long)(size))
+#define        REG_UNMAP(va)           iounmap((void *)(va))
+
+/* shared (dma-able) memory access macros */
+#define        R_SM(r)                 *(r)
+#define        W_SM(r, v)              (*(r) = (v))
+#define        BZERO_SM(r, len)        memset((r), '\0', (len))
+
+#define        MALLOC(osh, size)       kmalloc((size), GFP_ATOMIC)
+#define        MFREE(osh, addr, size)  kfree((addr))
+#define MALLOCED(osh)  (0)     
+
+#define        osl_delay               OSL_DELAY
+static inline void OSL_DELAY(uint usec)
+{
+       uint d;
+
+       while (usec > 0) {
+               d = MIN(usec, 1000);
+               udelay(d);
+               usec -= d;
+       }
+}
+
+static inline void
+bcm_mdelay(uint ms)
+{
+       uint i;
+
+       for (i = 0; i < ms; i++) {
+               OSL_DELAY(1000);
+       }
+}
+
+
+#define        OSL_PCMCIA_READ_ATTR(osh, offset, buf, size)
+#define        OSL_PCMCIA_WRITE_ATTR(osh, offset, buf, size)
+
+#define        OSL_PCI_READ_CONFIG(osh, offset, size) \
+       osl_pci_read_config((osh), (offset), (size))
+
+static inline uint32
+osl_pci_read_config(osl_t *osh, uint offset, uint size)
+{
+       uint val;
+       uint retry = PCI_CFG_RETRY;      
+
+       do {
+               pci_read_config_dword(osh->pdev, offset, &val);
+               if (val != 0xffffffff)
+                       break;
+       } while (retry--);
+
+       return (val);
+}
+
+#define        OSL_PCI_WRITE_CONFIG(osh, offset, size, val) \
+       osl_pci_write_config((osh), (offset), (size), (val))
+static inline void
+osl_pci_write_config(osl_t *osh, uint offset, uint size, uint val)
+{
+       uint retry = PCI_CFG_RETRY;      
+
+       do {
+               pci_write_config_dword(osh->pdev, offset, val);
+               if (offset != PCI_BAR0_WIN)
+                       break;
+               if (osl_pci_read_config(osh, offset, size) == val)
+                       break;
+       } while (retry--);
+}
+
+
+/* return bus # for the pci device pointed by osh->pdev */
+#define OSL_PCI_BUS(osh)       osl_pci_bus(osh)
+static inline uint
+osl_pci_bus(osl_t *osh)
+{
+       return ((struct pci_dev *)osh->pdev)->bus->number;
+}
+
+/* return slot # for the pci device pointed by osh->pdev */
+#define OSL_PCI_SLOT(osh)      osl_pci_slot(osh)
+static inline uint
+osl_pci_slot(osl_t *osh)
+{
+       return PCI_SLOT(((struct pci_dev *)osh->pdev)->devfn);
+}
+
+#endif
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/pcicfg.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/pcicfg.h
new file mode 100644 (file)
index 0000000..8bb4595
--- /dev/null
@@ -0,0 +1,495 @@
+/*
+ * pcicfg.h: PCI configuration constants and structures.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: pcicfg.h,v 1.1.1.11 2006/04/08 06:13:40 honor Exp $
+ */
+
+#ifndef        _h_pcicfg_
+#define        _h_pcicfg_
+
+/* The following inside ifndef's so we don't collide with NTDDK.H */
+#ifndef PCI_MAX_BUS
+#define PCI_MAX_BUS            0x100
+#endif
+#ifndef PCI_MAX_DEVICES
+#define PCI_MAX_DEVICES                0x20
+#endif
+#ifndef PCI_MAX_FUNCTION
+#define PCI_MAX_FUNCTION       0x8
+#endif
+
+#ifndef PCI_INVALID_VENDORID
+#define PCI_INVALID_VENDORID   0xffff
+#endif
+#ifndef PCI_INVALID_DEVICEID
+#define PCI_INVALID_DEVICEID   0xffff
+#endif
+
+
+/* Convert between bus-slot-function-register and config addresses */
+
+#define        PCICFG_BUS_SHIFT        16      /* Bus shift */
+#define        PCICFG_SLOT_SHIFT       11      /* Slot shift */
+#define        PCICFG_FUN_SHIFT        8       /* Function shift */
+#define        PCICFG_OFF_SHIFT        0       /* Register shift */
+
+#define        PCICFG_BUS_MASK         0xff    /* Bus mask */
+#define        PCICFG_SLOT_MASK        0x1f    /* Slot mask */
+#define        PCICFG_FUN_MASK         7       /* Function mask */
+#define        PCICFG_OFF_MASK         0xff    /* Bus mask */
+
+#define        PCI_CONFIG_ADDR(b, s, f, o)                                     \
+               ((((b) & PCICFG_BUS_MASK) << PCICFG_BUS_SHIFT)          \
+                | (((s) & PCICFG_SLOT_MASK) << PCICFG_SLOT_SHIFT)      \
+                | (((f) & PCICFG_FUN_MASK) << PCICFG_FUN_SHIFT)        \
+                | (((o) & PCICFG_OFF_MASK) << PCICFG_OFF_SHIFT))
+
+#define        PCI_CONFIG_BUS(a)       (((a) >> PCICFG_BUS_SHIFT) & PCICFG_BUS_MASK)
+#define        PCI_CONFIG_SLOT(a)      (((a) >> PCICFG_SLOT_SHIFT) & PCICFG_SLOT_MASK)
+#define        PCI_CONFIG_FUN(a)       (((a) >> PCICFG_FUN_SHIFT) & PCICFG_FUN_MASK)
+#define        PCI_CONFIG_OFF(a)       (((a) >> PCICFG_OFF_SHIFT) & PCICFG_OFF_MASK)
+
+/* PCIE Config space accessing MACROS */
+
+#define        PCIECFG_BUS_SHIFT       24      /* Bus shift */
+#define        PCIECFG_SLOT_SHIFT      19      /* Slot/Device shift */
+#define        PCIECFG_FUN_SHIFT       16      /* Function shift */
+#define        PCIECFG_OFF_SHIFT       0       /* Register shift */
+
+#define        PCIECFG_BUS_MASK        0xff    /* Bus mask */
+#define        PCIECFG_SLOT_MASK       0x1f    /* Slot/Device mask */
+#define        PCIECFG_FUN_MASK        7       /* Function mask */
+#define        PCIECFG_OFF_MASK        0x3ff   /* Register mask */
+
+#define        PCIE_CONFIG_ADDR(b, s, f, o)                                    \
+               ((((b) & PCIECFG_BUS_MASK) << PCIECFG_BUS_SHIFT)                \
+                | (((s) & PCIECFG_SLOT_MASK) << PCIECFG_SLOT_SHIFT)    \
+                | (((f) & PCIECFG_FUN_MASK) << PCIECFG_FUN_SHIFT)      \
+                | (((o) & PCIECFG_OFF_MASK) << PCIECFG_OFF_SHIFT))
+
+#define        PCIE_CONFIG_BUS(a)      (((a) >> PCIECFG_BUS_SHIFT) & PCIECFG_BUS_MASK)
+#define        PCIE_CONFIG_SLOT(a)     (((a) >> PCIECFG_SLOT_SHIFT) & PCIECFG_SLOT_MASK)
+#define        PCIE_CONFIG_FUN(a)      (((a) >> PCIECFG_FUN_SHIFT) & PCIECFG_FUN_MASK)
+#define        PCIE_CONFIG_OFF(a)      (((a) >> PCIECFG_OFF_SHIFT) & PCIECFG_OFF_MASK)
+
+/* The actual config space */
+
+#define        PCI_BAR_MAX             6
+
+#define        PCI_ROM_BAR             8
+
+#define        PCR_RSVDA_MAX           2
+
+/* Bits in PCI bars' flags */
+
+#define        PCIBAR_FLAGS            0xf
+#define        PCIBAR_IO               0x1
+#define        PCIBAR_MEM1M            0x2
+#define        PCIBAR_MEM64            0x4
+#define        PCIBAR_PREFETCH         0x8
+#define        PCIBAR_MEM32_MASK       0xFFFFFF80
+
+/* pci config status reg has a bit to indicate that capability ptr is present */
+
+#define PCI_CAPPTR_PRESENT     0x0010
+
+typedef struct _pci_config_regs {
+       unsigned short  vendor;
+       unsigned short  device;
+       unsigned short  command;
+       unsigned short  status;
+       unsigned char   rev_id;
+       unsigned char   prog_if;
+       unsigned char   sub_class;
+       unsigned char   base_class;
+       unsigned char   cache_line_size;
+       unsigned char   latency_timer;
+       unsigned char   header_type;
+       unsigned char   bist;
+       unsigned long   base[PCI_BAR_MAX];
+       unsigned long   cardbus_cis;
+       unsigned short  subsys_vendor;
+       unsigned short  subsys_id;
+       unsigned long   baserom;
+       unsigned long   rsvd_a[PCR_RSVDA_MAX];
+       unsigned char   int_line;
+       unsigned char   int_pin;
+       unsigned char   min_gnt;
+       unsigned char   max_lat;
+       unsigned char   dev_dep[192];
+} pci_config_regs;
+
+#define        SZPCR           (sizeof (pci_config_regs))
+#define        MINSZPCR        64              /* offsetof (dev_dep[0] */
+
+/* A structure for the config registers is nice, but in most
+ * systems the config space is not memory mapped, so we need
+ * filed offsetts. :-(
+ */
+#define        PCI_CFG_VID             0
+#define        PCI_CFG_DID             2
+#define        PCI_CFG_CMD             4
+#define        PCI_CFG_STAT            6
+#define        PCI_CFG_REV             8
+#define        PCI_CFG_PROGIF          9
+#define        PCI_CFG_SUBCL           0xa
+#define        PCI_CFG_BASECL          0xb
+#define        PCI_CFG_CLSZ            0xc
+#define        PCI_CFG_LATTIM          0xd
+#define        PCI_CFG_HDR             0xe
+#define        PCI_CFG_BIST            0xf
+#define        PCI_CFG_BAR0            0x10
+#define        PCI_CFG_BAR1            0x14
+#define        PCI_CFG_BAR2            0x18
+#define        PCI_CFG_BAR3            0x1c
+#define        PCI_CFG_BAR4            0x20
+#define        PCI_CFG_BAR5            0x24
+#define        PCI_CFG_CIS             0x28
+#define        PCI_CFG_SVID            0x2c
+#define        PCI_CFG_SSID            0x2e
+#define        PCI_CFG_ROMBAR          0x30
+#define PCI_CFG_CAPPTR         0x34
+#define        PCI_CFG_INT             0x3c
+#define        PCI_CFG_PIN             0x3d
+#define        PCI_CFG_MINGNT          0x3e
+#define        PCI_CFG_MAXLAT          0x3f
+
+#ifdef __NetBSD__
+#undef PCI_CLASS_DISPLAY
+#undef PCI_CLASS_MEMORY
+#undef PCI_CLASS_BRIDGE
+#undef PCI_CLASS_INPUT
+#undef PCI_CLASS_DOCK
+#endif /* __NetBSD__ */
+
+/* Classes and subclasses */
+
+typedef enum {
+       PCI_CLASS_OLD = 0,
+       PCI_CLASS_DASDI,
+       PCI_CLASS_NET,
+       PCI_CLASS_DISPLAY,
+       PCI_CLASS_MMEDIA,
+       PCI_CLASS_MEMORY,
+       PCI_CLASS_BRIDGE,
+       PCI_CLASS_COMM,
+       PCI_CLASS_BASE,
+       PCI_CLASS_INPUT,
+       PCI_CLASS_DOCK,
+       PCI_CLASS_CPU,
+       PCI_CLASS_SERIAL,
+       PCI_CLASS_INTELLIGENT = 0xe,
+       PCI_CLASS_SATELLITE,
+       PCI_CLASS_CRYPT,
+       PCI_CLASS_DSP,
+       PCI_CLASS_XOR = 0xfe
+} pci_classes;
+
+typedef enum {
+       PCI_DASDI_SCSI,
+       PCI_DASDI_IDE,
+       PCI_DASDI_FLOPPY,
+       PCI_DASDI_IPI,
+       PCI_DASDI_RAID,
+       PCI_DASDI_OTHER = 0x80
+} pci_dasdi_subclasses;
+
+typedef enum {
+       PCI_NET_ETHER,
+       PCI_NET_TOKEN,
+       PCI_NET_FDDI,
+       PCI_NET_ATM,
+       PCI_NET_OTHER = 0x80
+} pci_net_subclasses;
+
+typedef enum {
+       PCI_DISPLAY_VGA,
+       PCI_DISPLAY_XGA,
+       PCI_DISPLAY_3D,
+       PCI_DISPLAY_OTHER = 0x80
+} pci_display_subclasses;
+
+typedef enum {
+       PCI_MMEDIA_VIDEO,
+       PCI_MMEDIA_AUDIO,
+       PCI_MMEDIA_PHONE,
+       PCI_MEDIA_OTHER = 0x80
+} pci_mmedia_subclasses;
+
+typedef enum {
+       PCI_MEMORY_RAM,
+       PCI_MEMORY_FLASH,
+       PCI_MEMORY_OTHER = 0x80
+} pci_memory_subclasses;
+
+typedef enum {
+       PCI_BRIDGE_HOST,
+       PCI_BRIDGE_ISA,
+       PCI_BRIDGE_EISA,
+       PCI_BRIDGE_MC,
+       PCI_BRIDGE_PCI,
+       PCI_BRIDGE_PCMCIA,
+       PCI_BRIDGE_NUBUS,
+       PCI_BRIDGE_CARDBUS,
+       PCI_BRIDGE_RACEWAY,
+       PCI_BRIDGE_OTHER = 0x80
+} pci_bridge_subclasses;
+
+typedef enum {
+       PCI_COMM_UART,
+       PCI_COMM_PARALLEL,
+       PCI_COMM_MULTIUART,
+       PCI_COMM_MODEM,
+       PCI_COMM_OTHER = 0x80
+} pci_comm_subclasses;
+
+typedef enum {
+       PCI_BASE_PIC,
+       PCI_BASE_DMA,
+       PCI_BASE_TIMER,
+       PCI_BASE_RTC,
+       PCI_BASE_PCI_HOTPLUG,
+       PCI_BASE_OTHER = 0x80
+} pci_base_subclasses;
+
+typedef enum {
+       PCI_INPUT_KBD,
+       PCI_INPUT_PEN,
+       PCI_INPUT_MOUSE,
+       PCI_INPUT_SCANNER,
+       PCI_INPUT_GAMEPORT,
+       PCI_INPUT_OTHER = 0x80
+} pci_input_subclasses;
+
+typedef enum {
+       PCI_DOCK_GENERIC,
+       PCI_DOCK_OTHER = 0x80
+} pci_dock_subclasses;
+
+typedef enum {
+       PCI_CPU_386,
+       PCI_CPU_486,
+       PCI_CPU_PENTIUM,
+       PCI_CPU_ALPHA = 0x10,
+       PCI_CPU_POWERPC = 0x20,
+       PCI_CPU_MIPS = 0x30,
+       PCI_CPU_COPROC = 0x40,
+       PCI_CPU_OTHER = 0x80
+} pci_cpu_subclasses;
+
+typedef enum {
+       PCI_SERIAL_IEEE1394,
+       PCI_SERIAL_ACCESS,
+       PCI_SERIAL_SSA,
+       PCI_SERIAL_USB,
+       PCI_SERIAL_FIBER,
+       PCI_SERIAL_SMBUS,
+       PCI_SERIAL_OTHER = 0x80
+} pci_serial_subclasses;
+
+typedef enum {
+       PCI_INTELLIGENT_I2O
+} pci_intelligent_subclasses;
+
+typedef enum {
+       PCI_SATELLITE_TV,
+       PCI_SATELLITE_AUDIO,
+       PCI_SATELLITE_VOICE,
+       PCI_SATELLITE_DATA,
+       PCI_SATELLITE_OTHER = 0x80
+} pci_satellite_subclasses;
+
+typedef enum {
+       PCI_CRYPT_NETWORK,
+       PCI_CRYPT_ENTERTAINMENT,
+       PCI_CRYPT_OTHER = 0x80
+} pci_crypt_subclasses;
+
+typedef enum {
+       PCI_DSP_DPIO,
+       PCI_DSP_OTHER = 0x80
+} pci_dsp_subclasses;
+
+typedef enum {
+       PCI_XOR_QDMA,
+       PCI_XOR_OTHER = 0x80
+} pci_xor_subclasses;
+
+/* Header types */
+typedef enum {
+       PCI_HEADER_NORMAL,
+       PCI_HEADER_BRIDGE,
+       PCI_HEADER_CARDBUS
+} pci_header_types;
+
+
+/* Overlay for a PCI-to-PCI bridge */
+
+#define        PPB_RSVDA_MAX           2
+#define        PPB_RSVDD_MAX           8
+
+typedef struct _ppb_config_regs {
+       unsigned short  vendor;
+       unsigned short  device;
+       unsigned short  command;
+       unsigned short  status;
+       unsigned char   rev_id;
+       unsigned char   prog_if;
+       unsigned char   sub_class;
+       unsigned char   base_class;
+       unsigned char   cache_line_size;
+       unsigned char   latency_timer;
+       unsigned char   header_type;
+       unsigned char   bist;
+       unsigned long   rsvd_a[PPB_RSVDA_MAX];
+       unsigned char   prim_bus;
+       unsigned char   sec_bus;
+       unsigned char   sub_bus;
+       unsigned char   sec_lat;
+       unsigned char   io_base;
+       unsigned char   io_lim;
+       unsigned short  sec_status;
+       unsigned short  mem_base;
+       unsigned short  mem_lim;
+       unsigned short  pf_mem_base;
+       unsigned short  pf_mem_lim;
+       unsigned long   pf_mem_base_hi;
+       unsigned long   pf_mem_lim_hi;
+       unsigned short  io_base_hi;
+       unsigned short  io_lim_hi;
+       unsigned short  subsys_vendor;
+       unsigned short  subsys_id;
+       unsigned long   rsvd_b;
+       unsigned char   rsvd_c;
+       unsigned char   int_pin;
+       unsigned short  bridge_ctrl;
+       unsigned char   chip_ctrl;
+       unsigned char   diag_ctrl;
+       unsigned short  arb_ctrl;
+       unsigned long   rsvd_d[PPB_RSVDD_MAX];
+       unsigned char   dev_dep[192];
+} ppb_config_regs;
+
+
+/* PCI CAPABILITY DEFINES */
+#define PCI_CAP_POWERMGMTCAP_ID                0x01
+#define PCI_CAP_MSICAP_ID              0x05
+#define PCI_CAP_PCIECAP_ID             0x10
+
+/* Data structure to define the Message Signalled Interrupt facility 
+ * Valid for PCI and PCIE configurations
+ */
+typedef struct _pciconfig_cap_msi {
+       unsigned char capID;
+       unsigned char nextptr;
+       unsigned short msgctrl;
+       unsigned int msgaddr;
+} pciconfig_cap_msi;
+
+/* Data structure to define the Power managment facility
+ * Valid for PCI and PCIE configurations
+ */
+typedef struct _pciconfig_cap_pwrmgmt {
+       unsigned char capID;
+       unsigned char nextptr;
+       unsigned short pme_cap;
+       unsigned short pme_sts_ctrl;
+       unsigned char pme_bridge_ext;
+       unsigned char data;
+} pciconfig_cap_pwrmgmt;
+
+/* Data structure to define the PCIE capability */
+typedef struct _pciconfig_cap_pcie {
+       unsigned char capID;
+       unsigned char nextptr;
+       unsigned short pcie_cap;
+       unsigned int dev_cap;
+       unsigned short dev_ctrl;
+       unsigned short dev_status;
+       unsigned int link_cap;
+       unsigned short link_ctrl;
+       unsigned short link_status;
+} pciconfig_cap_pcie;
+
+/* PCIE Enhanced CAPABILITY DEFINES */
+#define PCIE_EXTCFG_OFFSET     0x100
+#define PCIE_ADVERRREP_CAPID   0x0001
+#define PCIE_VC_CAPID          0x0002
+#define PCIE_DEVSNUM_CAPID     0x0003
+#define PCIE_PWRBUDGET_CAPID   0x0004
+
+/* Header to define the PCIE specific capabilities in the extended config space */
+typedef struct _pcie_enhanced_caphdr {
+       unsigned short capID;
+       unsigned short cap_ver : 4;
+       unsigned short next_ptr : 12;
+} pcie_enhanced_caphdr;
+
+
+/* Everything below is BRCM HND proprietary */
+
+
+/* Brcm PCI configuration registers */
+#define cap_list       rsvd_a[0]
+#define bar0_window    dev_dep[0x80 - 0x40]
+#define bar1_window    dev_dep[0x84 - 0x40]
+#define sprom_control  dev_dep[0x88 - 0x40]
+
+#define        PCI_BAR0_WIN            0x80    /* backplane addres space accessed by BAR0 */
+#define        PCI_BAR1_WIN            0x84    /* backplane addres space accessed by BAR1 */
+#define        PCI_SPROM_CONTROL       0x88    /* sprom property control */
+#define        PCI_BAR1_CONTROL        0x8c    /* BAR1 region burst control */
+#define        PCI_INT_STATUS          0x90    /* PCI and other cores interrupts */
+#define        PCI_INT_MASK            0x94    /* mask of PCI and other cores interrupts */
+#define PCI_TO_SB_MB           0x98    /* signal backplane interrupts */
+#define PCI_BACKPLANE_ADDR     0xA0    /* address an arbitrary location on the system backplane */
+#define PCI_BACKPLANE_DATA     0xA4    /* data at the location specified by above address */
+#define        PCI_GPIO_IN             0xb0    /* pci config space gpio input (>=rev3) */
+#define        PCI_GPIO_OUT            0xb4    /* pci config space gpio output (>=rev3) */
+#define        PCI_GPIO_OUTEN          0xb8    /* pci config space gpio output enable (>=rev3) */
+
+#define        PCI_BAR0_SHADOW_OFFSET  (2 * 1024)      /* bar0 + 2K accesses sprom shadow (in pci core) */
+#define        PCI_BAR0_SPROM_OFFSET   (4 * 1024)      /* bar0 + 4K accesses external sprom */
+#define        PCI_BAR0_PCIREGS_OFFSET (6 * 1024)      /* bar0 + 6K accesses pci core registers */
+#define        PCI_BAR0_PCISBR_OFFSET  (4 * 1024)      /* pci core SB registers are at the end of the
+                                                * 8KB window, so their address is the "regular"
+                                                * address plus 4K
+                                                */
+#define PCI_BAR0_WINSZ         8192            /* bar0 window size */
+
+/* On pci corerev >= 13 and all pcie, the bar0 is now 16KB and it maps: */
+#define        PCI_16KB0_PCIREGS_OFFSET (8 * 1024)     /* bar0 + 8K accesses pci/pcie core registers */
+#define        PCI_16KB0_CCREGS_OFFSET (12 * 1024)     /* bar0 + 12K accesses chipc core registers */
+#define PCI_16KBB0_WINSZ       (16 * 1024)     /* bar0 window size */
+
+/* PCI_INT_STATUS */
+#define        PCI_SBIM_STATUS_SERR    0x4     /* backplane SBErr interrupt status */
+
+/* PCI_INT_MASK */
+#define        PCI_SBIM_SHIFT          8       /* backplane core interrupt mask bits offset */
+#define        PCI_SBIM_MASK           0xff00  /* backplane core interrupt mask */
+#define        PCI_SBIM_MASK_SERR      0x4     /* backplane SBErr interrupt mask */
+
+/* PCI_SPROM_CONTROL */
+#define SPROM_SZ_MSK           0x02    /* SPROM Size Mask */
+#define SPROM_LOCKED           0x08    /* SPROM Locked */
+#define        SPROM_BLANK             0x04    /* indicating a blank SPROM */
+#define SPROM_WRITEEN          0x10    /* SPROM write enable */
+#define SPROM_BOOTROM_WE       0x20    /* external bootrom write enable */
+#define SPROM_OTPIN_USE                0x80    /* device OTP In use */
+
+#define        SPROM_SIZE              256     /* sprom size in 16-bit */
+#define SPROM_CRC_RANGE                64      /* crc cover range in 16-bit */
+
+/* PCI_CFG_CMD_STAT */
+#define PCI_CFG_CMD_STAT_TA    0x08000000      /* target abort status */
+
+#endif /* _h_pcicfg_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbchipc.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbchipc.h
new file mode 100644 (file)
index 0000000..03c5cf1
--- /dev/null
@@ -0,0 +1,516 @@
+/*
+ * SiliconBackplane Chipcommon core hardware definitions.
+ *
+ * The chipcommon core provides chip identification, SB control,
+ * jtag, 0/1/2 uarts, clock frequency control, a watchdog interrupt timer,
+ * gpio interface, extbus, and support for serial and parallel flashes.
+ *
+ * $Id: sbchipc.h,v 1.1.1.14 2006/04/15 01:29:08 michael Exp $
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ */
+
+#ifndef        _SBCHIPC_H
+#define        _SBCHIPC_H
+
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif /* PAD */
+
+typedef volatile struct {
+       uint32  chipid;                 /* 0x0 */
+       uint32  capabilities;
+       uint32  corecontrol;            /* corerev >= 1 */
+       uint32  bist;
+
+       /* OTP */
+       uint32  otpstatus;              /* 0x10, corerev >= 10 */
+       uint32  otpcontrol;
+       uint32  otpprog;
+       uint32  PAD;
+
+       /* Interrupt control */
+       uint32  intstatus;              /* 0x20 */
+       uint32  intmask;
+       uint32  chipcontrol;            /* 0x28, rev >= 11 */
+       uint32  chipstatus;             /* 0x2c, rev >= 11 */
+
+       /* Jtag Master */
+       uint32  jtagcmd;                /* 0x30, rev >= 10 */
+       uint32  jtagir;
+       uint32  jtagdr;
+       uint32  jtagctrl;
+
+       /* serial flash interface registers */
+       uint32  flashcontrol;           /* 0x40 */
+       uint32  flashaddress;
+       uint32  flashdata;
+       uint32  PAD[1];
+
+       /* Silicon backplane configuration broadcast control */
+       uint32  broadcastaddress;       /* 0x50 */
+       uint32  broadcastdata;
+       uint32  PAD[2];
+
+       /* gpio - cleared only by power-on-reset */
+       uint32  gpioin;                 /* 0x60 */
+       uint32  gpioout;
+       uint32  gpioouten;
+       uint32  gpiocontrol;
+       uint32  gpiointpolarity;
+       uint32  gpiointmask;
+       uint32  PAD[2];
+
+       /* Watchdog timer */
+       uint32  watchdog;               /* 0x80 */
+       uint32  PAD[1];
+
+       /* GPIO based LED powersave registers corerev >= 16 */
+       uint32  gpiotimerval;           /* 0x88 */
+       uint32  gpiotimeroutmask;
+
+       /* clock control */
+       uint32  clockcontrol_n;         /* 0x90 */
+       uint32  clockcontrol_sb;        /* aka m0 */
+       uint32  clockcontrol_pci;       /* aka m1 */
+       uint32  clockcontrol_m2;        /* mii/uart/mipsref */
+       uint32  clockcontrol_m3;        /* cpu */
+       uint32  clkdiv;                 /* corerev >= 3 */
+       uint32  PAD[2];
+
+       /* pll delay registers (corerev >= 4) */
+       uint32  pll_on_delay;           /* 0xb0 */
+       uint32  fref_sel_delay;
+       uint32  slow_clk_ctl;           /* 5 < corerev < 10 */
+       uint32  PAD[1];
+
+       /* Instaclock registers (corerev >= 10) */
+       uint32  system_clk_ctl;         /* 0xc0 */
+       uint32  clkstatestretch;
+       uint32  PAD[14];
+
+       /* ExtBus control registers (corerev >= 3) */
+       uint32  pcmcia_config;          /* 0x100 */
+       uint32  pcmcia_memwait;
+       uint32  pcmcia_attrwait;
+       uint32  pcmcia_iowait;
+       uint32  ide_config;
+       uint32  ide_memwait;
+       uint32  ide_attrwait;
+       uint32  ide_iowait;
+       uint32  prog_config;
+       uint32  prog_waitcount;
+       uint32  flash_config;
+       uint32  flash_waitcount;
+       uint32  PAD[44];
+
+       /* Clock control and hardware workarounds */
+       uint32  clk_ctl_st;
+       uint32  hw_war;
+       uint32  PAD[70];
+
+       /* uarts */
+       uint8   uart0data;              /* 0x300 */
+       uint8   uart0imr;
+       uint8   uart0fcr;
+       uint8   uart0lcr;
+       uint8   uart0mcr;
+       uint8   uart0lsr;
+       uint8   uart0msr;
+       uint8   uart0scratch;
+       uint8   PAD[248];               /* corerev >= 1 */
+
+       uint8   uart1data;              /* 0x400 */
+       uint8   uart1imr;
+       uint8   uart1fcr;
+       uint8   uart1lcr;
+       uint8   uart1mcr;
+       uint8   uart1lsr;
+       uint8   uart1msr;
+       uint8   uart1scratch;
+} chipcregs_t;
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+#define        CC_CHIPID               0
+#define        CC_CAPABILITIES         4
+#define        CC_JTAGCMD              0x30
+#define        CC_JTAGIR               0x34
+#define        CC_JTAGDR               0x38
+#define        CC_JTAGCTRL             0x3c
+#define        CC_WATCHDOG             0x80
+#define        CC_CLKC_N               0x90
+#define        CC_CLKC_M0              0x94
+#define        CC_CLKC_M1              0x98
+#define        CC_CLKC_M2              0x9c
+#define        CC_CLKC_M3              0xa0
+#define        CC_CLKDIV               0xa4
+#define        CC_SYS_CLK_CTL          0xc0
+#define        CC_OTP                  0x800
+
+/* chipid */
+#define        CID_ID_MASK             0x0000ffff      /* Chip Id mask */
+#define        CID_REV_MASK            0x000f0000      /* Chip Revision mask */
+#define        CID_REV_SHIFT           16              /* Chip Revision shift */
+#define        CID_PKG_MASK            0x00f00000      /* Package Option mask */
+#define        CID_PKG_SHIFT           20              /* Package Option shift */
+#define        CID_CC_MASK             0x0f000000      /* CoreCount (corerev >= 4) */
+#define CID_CC_SHIFT           24
+
+/* capabilities */
+#define        CAP_UARTS_MASK          0x00000003      /* Number of uarts */
+#define CAP_MIPSEB             0x00000004      /* MIPS is in big-endian mode */
+#define CAP_UCLKSEL            0x00000018      /* UARTs clock select */
+#define CAP_UINTCLK            0x00000008      /* UARTs are driven by internal divided clock */
+#define CAP_UARTGPIO           0x00000020      /* UARTs own Gpio's 15:12 */
+#define CAP_EXTBUS_MASK                0x000000c0      /* External bus mask */
+#define CAP_EXTBUS_NONE                0x00000000      /* No ExtBus present */
+#define CAP_EXTBUS_FULL                0x00000040      /* ExtBus: PCMCIA, IDE & Prog */
+#define CAP_EXTBUS_PROG                0x00000080      /* ExtBus: ProgIf only */
+#define        CAP_FLASH_MASK          0x00000700      /* Type of flash */
+#define        CAP_PLL_MASK            0x00038000      /* Type of PLL */
+#define CAP_PWR_CTL            0x00040000      /* Power control */
+#define CAP_OTPSIZE            0x00380000      /* OTP Size (0 = none) */
+#define CAP_OTPSIZE_SHIFT      19              /* OTP Size shift */
+#define CAP_OTPSIZE_BASE       5               /* OTP Size base */
+#define CAP_JTAGP              0x00400000      /* JTAG Master Present */
+#define CAP_ROM                        0x00800000      /* Internal boot rom active */
+#define CAP_BKPLN64            0x08000000      /* 64-bit backplane */
+
+/* PLL type */
+#define PLL_NONE               0x00000000
+#define PLL_TYPE1              0x00010000      /* 48Mhz base, 3 dividers */
+#define PLL_TYPE2              0x00020000      /* 48Mhz, 4 dividers */
+#define PLL_TYPE3              0x00030000      /* 25Mhz, 2 dividers */
+#define PLL_TYPE4              0x00008000      /* 48Mhz, 4 dividers */
+#define PLL_TYPE5              0x00018000      /* 25Mhz, 4 dividers */
+#define PLL_TYPE6              0x00028000      /* 100/200 or 120/240 only */
+#define PLL_TYPE7              0x00038000      /* 25Mhz, 4 dividers */
+
+/* corecontrol */
+#define CC_UARTCLKO            0x00000001      /* Drive UART with internal clock */
+#define        CC_SE                   0x00000002      /* sync clk out enable (corerev >= 3) */
+
+/* chipcontrol */
+#define CHIPCTRL_4321A0_DEFAULT        0x3a4           
+#define CHIPCTRL_4321A1_DEFAULT        0x0a4           
+
+/* Fields in the otpstatus register */
+#define        OTPS_PROGFAIL           0x80000000
+#define        OTPS_PROTECT            0x00000007
+#define        OTPS_HW_PROTECT         0x00000001
+#define        OTPS_SW_PROTECT         0x00000002
+#define        OTPS_CID_PROTECT        0x00000004
+
+/* Fields in the otpcontrol register */
+#define        OTPC_RECWAIT            0xff000000
+#define        OTPC_PROGWAIT           0x00ffff00
+#define        OTPC_PRW_SHIFT          8
+#define        OTPC_MAXFAIL            0x00000038
+#define        OTPC_VSEL               0x00000006
+#define        OTPC_SELVL              0x00000001
+
+/* Fields in otpprog */
+#define        OTPP_COL_MASK           0x000000ff
+#define        OTPP_ROW_MASK           0x0000ff00
+#define        OTPP_ROW_SHIFT          8
+#define        OTPP_READERR            0x10000000
+#define        OTPP_VALUE              0x20000000
+#define        OTPP_VALUE_SHIFT                29
+#define        OTPP_READ               0x40000000
+#define        OTPP_START              0x80000000
+#define        OTPP_BUSY               0x80000000
+
+/* jtagcmd */
+#define JCMD_START             0x80000000
+#define JCMD_BUSY              0x80000000
+#define JCMD_PAUSE             0x40000000
+#define JCMD0_ACC_MASK         0x0000f000
+#define JCMD0_ACC_IRDR         0x00000000
+#define JCMD0_ACC_DR           0x00001000
+#define JCMD0_ACC_IR           0x00002000
+#define JCMD0_ACC_RESET                0x00003000
+#define JCMD0_ACC_IRPDR                0x00004000
+#define JCMD0_ACC_PDR          0x00005000
+#define JCMD0_IRW_MASK         0x00000f00
+#define JCMD_ACC_MASK          0x000f0000      /* Changes for corerev 11 */
+#define JCMD_ACC_IRDR          0x00000000
+#define JCMD_ACC_DR            0x00010000
+#define JCMD_ACC_IR            0x00020000
+#define JCMD_ACC_RESET         0x00030000
+#define JCMD_ACC_IRPDR         0x00040000
+#define JCMD_ACC_PDR           0x00050000
+#define JCMD_IRW_MASK          0x00001f00
+#define JCMD_IRW_SHIFT         8
+#define JCMD_DRW_MASK          0x0000003f
+
+/* jtagctrl */
+#define JCTRL_FORCE_CLK                4               /* Force clock */
+#define JCTRL_EXT_EN           2               /* Enable external targets */
+#define JCTRL_EN               1               /* Enable Jtag master */
+
+/* Fields in clkdiv */
+#define        CLKD_SFLASH             0x0f000000
+#define        CLKD_SFLASH_SHIFT       24
+#define        CLKD_OTP                0x000f0000
+#define        CLKD_OTP_SHIFT          16
+#define        CLKD_JTAG               0x00000f00
+#define        CLKD_JTAG_SHIFT         8
+#define        CLKD_UART               0x000000ff
+
+/* intstatus/intmask */
+#define        CI_GPIO                 0x00000001      /* gpio intr */
+#define        CI_EI                   0x00000002      /* ro: ext intr pin (corerev >= 3) */
+#define        CI_WDRESET              0x80000000      /* watchdog reset occurred */
+
+/* slow_clk_ctl */
+#define SCC_SS_MASK            0x00000007      /* slow clock source mask */
+#define        SCC_SS_LPO              0x00000000      /* source of slow clock is LPO */
+#define        SCC_SS_XTAL             0x00000001      /* source of slow clock is crystal */
+#define        SCC_SS_PCI              0x00000002      /* source of slow clock is PCI */
+#define SCC_LF                 0x00000200      /* LPOFreqSel, 1: 160Khz, 0: 32KHz */
+#define SCC_LP                 0x00000400      /* LPOPowerDown, 1: LPO is disabled,
+                                                * 0: LPO is enabled
+                                                */
+#define SCC_FS                 0x00000800      /* ForceSlowClk, 1: sb/cores running on slow clock,
+                                                * 0: power logic control
+                                                */
+#define SCC_IP                 0x00001000      /* IgnorePllOffReq, 1/0: power logic ignores/honors
+                                                * PLL clock disable requests from core
+                                                */
+#define SCC_XC                 0x00002000      /* XtalControlEn, 1/0: power logic does/doesn't
+                                                * disable crystal when appropriate
+                                                */
+#define SCC_XP                 0x00004000      /* XtalPU (RO), 1/0: crystal running/disabled */
+#define SCC_CD_MASK            0xffff0000      /* ClockDivider (SlowClk = 1/(4+divisor)) */
+#define SCC_CD_SHIFT           16
+
+/* system_clk_ctl */
+#define        SYCC_IE                 0x00000001      /* ILPen: Enable Idle Low Power */
+#define        SYCC_AE                 0x00000002      /* ALPen: Enable Active Low Power */
+#define        SYCC_FP                 0x00000004      /* ForcePLLOn */
+#define        SYCC_AR                 0x00000008      /* Force ALP (or HT if ALPen is not set */
+#define        SYCC_HR                 0x00000010      /* Force HT */
+#define SYCC_CD_MASK           0xffff0000      /* ClkDiv  (ILP = 1/(4 * (divisor + 1)) */
+#define SYCC_CD_SHIFT          16
+
+/* gpiotimerval */
+#define GPIO_ONTIME_SHIFT      16
+
+/* clockcontrol_n */
+#define        CN_N1_MASK              0x3f            /* n1 control */
+#define        CN_N2_MASK              0x3f00          /* n2 control */
+#define        CN_N2_SHIFT             8
+#define        CN_PLLC_MASK            0xf0000         /* pll control */
+#define        CN_PLLC_SHIFT           16
+
+/* clockcontrol_sb/pci/uart */
+#define        CC_M1_MASK              0x3f            /* m1 control */
+#define        CC_M2_MASK              0x3f00          /* m2 control */
+#define        CC_M2_SHIFT             8
+#define        CC_M3_MASK              0x3f0000        /* m3 control */
+#define        CC_M3_SHIFT             16
+#define        CC_MC_MASK              0x1f000000      /* mux control */
+#define        CC_MC_SHIFT             24
+
+/* N3M Clock control magic field values */
+#define        CC_F6_2                 0x02            /* A factor of 2 in */
+#define        CC_F6_3                 0x03            /* 6-bit fields like */
+#define        CC_F6_4                 0x05            /* N1, M1 or M3 */
+#define        CC_F6_5                 0x09
+#define        CC_F6_6                 0x11
+#define        CC_F6_7                 0x21
+
+#define        CC_F5_BIAS              5               /* 5-bit fields get this added */
+
+#define        CC_MC_BYPASS            0x08
+#define        CC_MC_M1                0x04
+#define        CC_MC_M1M2              0x02
+#define        CC_MC_M1M2M3            0x01
+#define        CC_MC_M1M3              0x11
+
+/* Type 2 Clock control magic field values */
+#define        CC_T2_BIAS              2               /* n1, n2, m1 & m3 bias */
+#define        CC_T2M2_BIAS            3               /* m2 bias */
+
+#define        CC_T2MC_M1BYP           1
+#define        CC_T2MC_M2BYP           2
+#define        CC_T2MC_M3BYP           4
+
+/* Type 6 Clock control magic field values */
+#define        CC_T6_MMASK             1               /* bits of interest in m */
+#define        CC_T6_M0                120000000       /* sb clock for m = 0 */
+#define        CC_T6_M1                100000000       /* sb clock for m = 1 */
+#define        SB2MIPS_T6(sb)          (2 * (sb))
+
+/* Common clock base */
+#define        CC_CLOCK_BASE1          24000000        /* Half the clock freq */
+#define CC_CLOCK_BASE2         12500000        /* Alternate crystal on some PLL's */
+
+/* Clock control values for 200Mhz in 5350 */
+#define        CLKC_5350_N             0x0311
+#define        CLKC_5350_M             0x04020009
+
+/* Flash types in the chipcommon capabilities register */
+#define FLASH_NONE             0x000           /* No flash */
+#define SFLASH_ST              0x100           /* ST serial flash */
+#define SFLASH_AT              0x200           /* Atmel serial flash */
+#define        PFLASH                  0x700           /* Parallel flash */
+
+/* Bits in the ExtBus config registers */
+#define        CC_CFG_EN               0x0001          /* Enable */
+#define        CC_CFG_EM_MASK          0x000e          /* Extif Mode */
+#define        CC_CFG_EM_ASYNC         0x0000          /*   Async/Parallel flash */
+#define        CC_CFG_EM_SYNC          0x0002          /*   Synchronous */
+#define        CC_CFG_EM_PCMCIA        0x0004          /*   PCMCIA */
+#define        CC_CFG_EM_IDE           0x0006          /*   IDE */
+#define        CC_CFG_DS               0x0010          /* Data size, 0=8bit, 1=16bit */
+#define        CC_CFG_CD_MASK          0x0060          /* Sync: Clock divisor */
+#define        CC_CFG_CE               0x0080          /* Sync: Clock enable */
+#define        CC_CFG_SB               0x0100          /* Sync: Size/Bytestrobe */
+
+/* ExtBus address space */
+#define        CC_EB_BASE              0x1a000000      /* Chipc ExtBus base address */
+#define        CC_EB_PCMCIA_MEM        0x1a000000      /* PCMCIA 0 memory base address */
+#define        CC_EB_PCMCIA_IO         0x1a200000      /* PCMCIA 0 I/O base address */
+#define        CC_EB_PCMCIA_CFG        0x1a400000      /* PCMCIA 0 config base address */
+#define        CC_EB_IDE               0x1a800000      /* IDE memory base */
+#define        CC_EB_PCMCIA1_MEM       0x1a800000      /* PCMCIA 1 memory base address */
+#define        CC_EB_PCMCIA1_IO        0x1aa00000      /* PCMCIA 1 I/O base address */
+#define        CC_EB_PCMCIA1_CFG       0x1ac00000      /* PCMCIA 1 config base address */
+#define        CC_EB_PROGIF            0x1b000000      /* ProgIF Async/Sync base address */
+
+
+/* Start/busy bit in flashcontrol */
+#define SFLASH_OPCODE          0x000000ff
+#define SFLASH_ACTION          0x00000700
+#define SFLASH_START           0x80000000
+#define SFLASH_BUSY            SFLASH_START
+
+/* flashcontrol action codes */
+#define        SFLASH_ACT_OPONLY       0x0000          /* Issue opcode only */
+#define        SFLASH_ACT_OP1D         0x0100          /* opcode + 1 data byte */
+#define        SFLASH_ACT_OP3A         0x0200          /* opcode + 3 address bytes */
+#define        SFLASH_ACT_OP3A1D       0x0300          /* opcode + 3 addres & 1 data bytes */
+#define        SFLASH_ACT_OP3A4D       0x0400          /* opcode + 3 addres & 4 data bytes */
+#define        SFLASH_ACT_OP3A4X4D     0x0500          /* opcode + 3 addres, 4 don't care & 4 data bytes */
+#define        SFLASH_ACT_OP3A1X4D     0x0700          /* opcode + 3 addres, 1 don't care & 4 data bytes */
+
+/* flashcontrol action+opcodes for ST flashes */
+#define SFLASH_ST_WREN         0x0006          /* Write Enable */
+#define SFLASH_ST_WRDIS                0x0004          /* Write Disable */
+#define SFLASH_ST_RDSR         0x0105          /* Read Status Register */
+#define SFLASH_ST_WRSR         0x0101          /* Write Status Register */
+#define SFLASH_ST_READ         0x0303          /* Read Data Bytes */
+#define SFLASH_ST_PP           0x0302          /* Page Program */
+#define SFLASH_ST_SE           0x02d8          /* Sector Erase */
+#define SFLASH_ST_BE           0x00c7          /* Bulk Erase */
+#define SFLASH_ST_DP           0x00b9          /* Deep Power-down */
+#define SFLASH_ST_RES          0x03ab          /* Read Electronic Signature */
+
+/* Status register bits for ST flashes */
+#define SFLASH_ST_WIP          0x01            /* Write In Progress */
+#define SFLASH_ST_WEL          0x02            /* Write Enable Latch */
+#define SFLASH_ST_BP_MASK      0x1c            /* Block Protect */
+#define SFLASH_ST_BP_SHIFT     2
+#define SFLASH_ST_SRWD         0x80            /* Status Register Write Disable */
+
+/* flashcontrol action+opcodes for Atmel flashes */
+#define SFLASH_AT_READ                         0x07e8
+#define SFLASH_AT_PAGE_READ                    0x07d2
+#define SFLASH_AT_BUF1_READ
+#define SFLASH_AT_BUF2_READ
+#define SFLASH_AT_STATUS                       0x01d7
+#define SFLASH_AT_BUF1_WRITE                   0x0384
+#define SFLASH_AT_BUF2_WRITE                   0x0387
+#define SFLASH_AT_BUF1_ERASE_PROGRAM           0x0283
+#define SFLASH_AT_BUF2_ERASE_PROGRAM           0x0286
+#define SFLASH_AT_BUF1_PROGRAM                 0x0288
+#define SFLASH_AT_BUF2_PROGRAM                 0x0289
+#define SFLASH_AT_PAGE_ERASE                   0x0281
+#define SFLASH_AT_BLOCK_ERASE                  0x0250
+#define SFLASH_AT_BUF1_WRITE_ERASE_PROGRAM     0x0382
+#define SFLASH_AT_BUF2_WRITE_ERASE_PROGRAM     0x0385
+#define SFLASH_AT_BUF1_LOAD                    0x0253
+#define SFLASH_AT_BUF2_LOAD                    0x0255
+#define SFLASH_AT_BUF1_COMPARE                 0x0260
+#define SFLASH_AT_BUF2_COMPARE                 0x0261
+#define SFLASH_AT_BUF1_REPROGRAM               0x0258
+#define SFLASH_AT_BUF2_REPROGRAM               0x0259
+
+/* Status register bits for Atmel flashes */
+#define SFLASH_AT_READY                                0x80
+#define SFLASH_AT_MISMATCH                     0x40
+#define SFLASH_AT_ID_MASK                      0x38
+#define SFLASH_AT_ID_SHIFT                     3
+
+/* OTP regions */
+#define        OTP_HW_REGION   OTPS_HW_PROTECT
+#define        OTP_SW_REGION   OTPS_SW_PROTECT
+#define        OTP_CID_REGION  OTPS_CID_PROTECT
+
+/* OTP regions (Byte offsets from otp size) */
+#define        OTP_SWLIM_OFF   (-8)
+#define        OTP_CIDBASE_OFF 0
+#define        OTP_CIDLIM_OFF  8
+
+/* Predefined OTP words (Word offset from otp size) */
+#define        OTP_BOUNDARY_OFF (-4)
+#define        OTP_HWSIGN_OFF  (-3)
+#define        OTP_SWSIGN_OFF  (-2)
+#define        OTP_CIDSIGN_OFF (-1)
+
+#define        OTP_CID_OFF     0
+#define        OTP_PKG_OFF     1
+#define        OTP_FID_OFF     2
+#define        OTP_RSV_OFF     3
+#define        OTP_LIM_OFF     4
+
+#define        OTP_SIGNATURE   0x578a
+#define        OTP_MAGIC       0x4e56
+
+/* 
+ * These are the UART port assignments, expressed as offsets from the base
+ * register.  These assignments should hold for any serial port based on
+ * a 8250, 16450, or 16550(A).
+ */
+
+#define UART_RX                0       /* In:  Receive buffer (DLAB=0) */
+#define UART_TX                0       /* Out: Transmit buffer (DLAB=0) */
+#define UART_DLL       0       /* Out: Divisor Latch Low (DLAB=1) */
+#define UART_IER       1       /* In/Out: Interrupt Enable Register (DLAB=0) */
+#define UART_DLM       1       /* Out: Divisor Latch High (DLAB=1) */
+#define UART_IIR       2       /* In: Interrupt Identity Register  */
+#define UART_FCR       2       /* Out: FIFO Control Register */
+#define UART_LCR       3       /* Out: Line Control Register */
+#define UART_MCR       4       /* Out: Modem Control Register */
+#define UART_LSR       5       /* In:  Line Status Register */
+#define UART_MSR       6       /* In:  Modem Status Register */
+#define UART_SCR       7       /* I/O: Scratch Register */
+#define UART_LCR_DLAB  0x80    /* Divisor latch access bit */
+#define UART_LCR_WLEN8 0x03    /* Wordlength: 8 bits */
+#define UART_MCR_OUT2  0x08    /* MCR GPIO out 2 */
+#define UART_MCR_LOOP  0x10    /* Enable loopback test mode */
+#define UART_LSR_THRE  0x20    /* Transmit-hold-register empty */
+#define UART_LSR_RXRDY 0x01    /* Receiver ready */
+#define UART_FCR_FIFO_ENABLE 1 /* FIFO control register bit controlling FIFO enable/disable */
+
+/* Interrupt Enable Register (IER) bits */
+#define UART_IER_EDSSI 8       /* enable modem status interrupt */
+#define UART_IER_ELSI  4       /* enable receiver line status interrupt */
+#define UART_IER_ETBEI  2      /* enable transmitter holding register empty interrupt */
+#define UART_IER_ERBFI 1       /* enable data available interrupt */
+
+#endif /* _SBCHIPC_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbconfig.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbconfig.h
new file mode 100644 (file)
index 0000000..7a44e5f
--- /dev/null
@@ -0,0 +1,369 @@
+/*
+ * Broadcom SiliconBackplane hardware register definitions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbconfig.h,v 1.1.1.11 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _SBCONFIG_H
+#define        _SBCONFIG_H
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif
+
+/*
+ * SiliconBackplane Address Map.
+ * All regions may not exist on all chips.
+ */
+#define SB_SDRAM_BASE          0x00000000      /* Physical SDRAM */
+#define SB_PCI_MEM             0x08000000      /* Host Mode sb2pcitranslation0 (64 MB) */
+#define SB_PCI_MEM_SZ          (64 * 1024 * 1024)
+#define SB_PCI_CFG             0x0c000000      /* Host Mode sb2pcitranslation1 (64 MB) */
+#define        SB_SDRAM_SWAPPED        0x10000000      /* Byteswapped Physical SDRAM */
+#define SB_ENUM_BASE           0x18000000      /* Enumeration space base */
+#define        SB_ENUM_LIM             0x18010000      /* Enumeration space limit */
+
+#define        SB_FLASH2               0x1c000000      /* Flash Region 2 (region 1 shadowed here) */
+#define        SB_FLASH2_SZ            0x02000000      /* Size of Flash Region 2 */
+
+#define        SB_EXTIF_BASE           0x1f000000      /* External Interface region base address */
+#define        SB_FLASH1               0x1fc00000      /* MIPS Flash Region 1 */
+#define        SB_FLASH1_SZ            0x00400000      /* MIPS Size of Flash Region 1 */
+
+#define        SB_ROM                  0x20000000      /* ARM ROM */
+#define        SB_SRAM2                0x80000000      /* ARM SRAM Region 2 */
+#define        SB_ARM_FLASH1           0xffff0000      /* ARM Flash Region 1 */
+#define        SB_ARM_FLASH1_SZ        0x00010000      /* ARM Size of Flash Region 1 */
+
+#define SB_PCI_DMA             0x40000000      /* Client Mode sb2pcitranslation2 (1 GB) */
+#define SB_PCI_DMA_SZ          0x40000000      /* Client Mode sb2pcitranslation2 size in bytes */
+#define SB_PCIE_DMA_L32                0x00000000      /* PCIE Client Mode sb2pcitranslation2
+                                                * (2 ZettaBytes), low 32 bits
+                                                */
+#define SB_PCIE_DMA_H32                0x80000000      /* PCIE Client Mode sb2pcitranslation2
+                                                * (2 ZettaBytes), high 32 bits
+                                                */
+#define        SB_EUART                (SB_EXTIF_BASE + 0x00800000)
+#define        SB_LED                  (SB_EXTIF_BASE + 0x00900000)
+
+
+/* enumeration space related defs */
+#define SB_CORE_SIZE           0x1000          /* each core gets 4Kbytes for registers */
+#define        SB_MAXCORES             ((SB_ENUM_LIM - SB_ENUM_BASE)/SB_CORE_SIZE)
+#define SB_MAXFUNCS            4               /* max. # functions per core */
+#define        SBCONFIGOFF             0xf00           /* core sbconfig regs are top 256bytes of regs */
+#define        SBCONFIGSIZE            256             /* sizeof (sbconfig_t) */
+
+/* mips address */
+#define        SB_EJTAG                0xff200000      /* MIPS EJTAG space (2M) */
+
+/*
+ * Sonics Configuration Space Registers.
+ */
+#define SBIPSFLAG              0x08
+#define SBTPSFLAG              0x18
+#define        SBTMERRLOGA             0x48            /* sonics >= 2.3 */
+#define        SBTMERRLOG              0x50            /* sonics >= 2.3 */
+#define SBADMATCH3             0x60
+#define SBADMATCH2             0x68
+#define SBADMATCH1             0x70
+#define SBIMSTATE              0x90
+#define SBINTVEC               0x94
+#define SBTMSTATELOW           0x98
+#define SBTMSTATEHIGH          0x9c
+#define SBBWA0                 0xa0
+#define SBIMCONFIGLOW          0xa8
+#define SBIMCONFIGHIGH         0xac
+#define SBADMATCH0             0xb0
+#define SBTMCONFIGLOW          0xb8
+#define SBTMCONFIGHIGH         0xbc
+#define SBBCONFIG              0xc0
+#define SBBSTATE               0xc8
+#define SBACTCNFG              0xd8
+#define        SBFLAGST                0xe8
+#define SBIDLOW                        0xf8
+#define SBIDHIGH               0xfc
+
+/* All the previous registers are above SBCONFIGOFF, but with Sonics 2.3, we have
+ * a few registers *below* that line. I think it would be very confusing to try
+ * and change the value of SBCONFIGOFF, so I'm definig them as absolute offsets here,
+ */
+
+#define SBIMERRLOGA            0xea8
+#define SBIMERRLOG             0xeb0
+#define SBTMPORTCONNID0                0xed8
+#define SBTMPORTLOCK0          0xef8
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+typedef volatile struct _sbconfig {
+       uint32  PAD[2];
+       uint32  sbipsflag;              /* initiator port ocp slave flag */
+       uint32  PAD[3];
+       uint32  sbtpsflag;              /* target port ocp slave flag */
+       uint32  PAD[11];
+       uint32  sbtmerrloga;            /* (sonics >= 2.3) */
+       uint32  PAD;
+       uint32  sbtmerrlog;             /* (sonics >= 2.3) */
+       uint32  PAD[3];
+       uint32  sbadmatch3;             /* address match3 */
+       uint32  PAD;
+       uint32  sbadmatch2;             /* address match2 */
+       uint32  PAD;
+       uint32  sbadmatch1;             /* address match1 */
+       uint32  PAD[7];
+       uint32  sbimstate;              /* initiator agent state */
+       uint32  sbintvec;               /* interrupt mask */
+       uint32  sbtmstatelow;           /* target state */
+       uint32  sbtmstatehigh;          /* target state */
+       uint32  sbbwa0;                 /* bandwidth allocation table0 */
+       uint32  PAD;
+       uint32  sbimconfiglow;          /* initiator configuration */
+       uint32  sbimconfighigh;         /* initiator configuration */
+       uint32  sbadmatch0;             /* address match0 */
+       uint32  PAD;
+       uint32  sbtmconfiglow;          /* target configuration */
+       uint32  sbtmconfighigh;         /* target configuration */
+       uint32  sbbconfig;              /* broadcast configuration */
+       uint32  PAD;
+       uint32  sbbstate;               /* broadcast state */
+       uint32  PAD[3];
+       uint32  sbactcnfg;              /* activate configuration */
+       uint32  PAD[3];
+       uint32  sbflagst;               /* current sbflags */
+       uint32  PAD[3];
+       uint32  sbidlow;                /* identification */
+       uint32  sbidhigh;               /* identification */
+} sbconfig_t;
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+/* sbipsflag */
+#define        SBIPS_INT1_MASK         0x3f            /* which sbflags get routed to mips interrupt 1 */
+#define        SBIPS_INT1_SHIFT        0
+#define        SBIPS_INT2_MASK         0x3f00          /* which sbflags get routed to mips interrupt 2 */
+#define        SBIPS_INT2_SHIFT        8
+#define        SBIPS_INT3_MASK         0x3f0000        /* which sbflags get routed to mips interrupt 3 */
+#define        SBIPS_INT3_SHIFT        16
+#define        SBIPS_INT4_MASK         0x3f000000      /* which sbflags get routed to mips interrupt 4 */
+#define        SBIPS_INT4_SHIFT        24
+
+/* sbtpsflag */
+#define        SBTPS_NUM0_MASK         0x3f            /* interrupt sbFlag # generated by this core */
+#define        SBTPS_F0EN0             0x40            /* interrupt is always sent on the backplane */
+
+/* sbtmerrlog */
+#define        SBTMEL_CM               0x00000007      /* command */
+#define        SBTMEL_CI               0x0000ff00      /* connection id */
+#define        SBTMEL_EC               0x0f000000      /* error code */
+#define        SBTMEL_ME               0x80000000      /* multiple error */
+
+/* sbimstate */
+#define        SBIM_PC                 0xf             /* pipecount */
+#define        SBIM_AP_MASK            0x30            /* arbitration policy */
+#define        SBIM_AP_BOTH            0x00            /* use both timeslaces and token */
+#define        SBIM_AP_TS              0x10            /* use timesliaces only */
+#define        SBIM_AP_TK              0x20            /* use token only */
+#define        SBIM_AP_RSV             0x30            /* reserved */
+#define        SBIM_IBE                0x20000         /* inbanderror */
+#define        SBIM_TO                 0x40000         /* timeout */
+#define        SBIM_BY                 0x01800000      /* busy (sonics >= 2.3) */
+#define        SBIM_RJ                 0x02000000      /* reject (sonics >= 2.3) */
+
+/* sbtmstatelow */
+#define        SBTML_RESET             0x1             /* reset */
+#define        SBTML_REJ_MASK          0x6             /* reject */
+#define        SBTML_REJ_SHIFT         1
+#define        SBTML_CLK               0x10000         /* clock enable */
+#define        SBTML_FGC               0x20000         /* force gated clocks on */
+#define        SBTML_FL_MASK           0x3ffc0000      /* core-specific flags */
+#define        SBTML_PE                0x40000000      /* pme enable */
+#define        SBTML_BE                0x80000000      /* bist enable */
+
+/* sbtmstatehigh */
+#define        SBTMH_SERR              0x1             /* serror */
+#define        SBTMH_INT               0x2             /* interrupt */
+#define        SBTMH_BUSY              0x4             /* busy */
+#define        SBTMH_TO                0x00000020      /* timeout (sonics >= 2.3) */
+#define        SBTMH_FL_MASK           0x1fff0000      /* core-specific flags */
+#define SBTMH_DMA64            0x10000000      /* supports DMA with 64-bit addresses */
+#define        SBTMH_GCR               0x20000000      /* gated clock request */
+#define        SBTMH_BISTF             0x40000000      /* bist failed */
+#define        SBTMH_BISTD             0x80000000      /* bist done */
+
+
+/* sbbwa0 */
+#define        SBBWA_TAB0_MASK         0xffff          /* lookup table 0 */
+#define        SBBWA_TAB1_MASK         0xffff          /* lookup table 1 */
+#define        SBBWA_TAB1_SHIFT        16
+
+/* sbimconfiglow */
+#define        SBIMCL_STO_MASK         0x7             /* service timeout */
+#define        SBIMCL_RTO_MASK         0x70            /* request timeout */
+#define        SBIMCL_RTO_SHIFT        4
+#define        SBIMCL_CID_MASK         0xff0000        /* connection id */
+#define        SBIMCL_CID_SHIFT        16
+
+/* sbimconfighigh */
+#define        SBIMCH_IEM_MASK         0xc             /* inband error mode */
+#define        SBIMCH_TEM_MASK         0x30            /* timeout error mode */
+#define        SBIMCH_TEM_SHIFT        4
+#define        SBIMCH_BEM_MASK         0xc0            /* bus error mode */
+#define        SBIMCH_BEM_SHIFT        6
+
+/* sbadmatch0 */
+#define        SBAM_TYPE_MASK          0x3             /* address type */
+#define        SBAM_AD64               0x4             /* reserved */
+#define        SBAM_ADINT0_MASK        0xf8            /* type0 size */
+#define        SBAM_ADINT0_SHIFT       3
+#define        SBAM_ADINT1_MASK        0x1f8           /* type1 size */
+#define        SBAM_ADINT1_SHIFT       3
+#define        SBAM_ADINT2_MASK        0x1f8           /* type2 size */
+#define        SBAM_ADINT2_SHIFT       3
+#define        SBAM_ADEN               0x400           /* enable */
+#define        SBAM_ADNEG              0x800           /* negative decode */
+#define        SBAM_BASE0_MASK         0xffffff00      /* type0 base address */
+#define        SBAM_BASE0_SHIFT        8
+#define        SBAM_BASE1_MASK         0xfffff000      /* type1 base address for the core */
+#define        SBAM_BASE1_SHIFT        12
+#define        SBAM_BASE2_MASK         0xffff0000      /* type2 base address for the core */
+#define        SBAM_BASE2_SHIFT        16
+
+/* sbtmconfiglow */
+#define        SBTMCL_CD_MASK          0xff            /* clock divide */
+#define        SBTMCL_CO_MASK          0xf800          /* clock offset */
+#define        SBTMCL_CO_SHIFT         11
+#define        SBTMCL_IF_MASK          0xfc0000        /* interrupt flags */
+#define        SBTMCL_IF_SHIFT         18
+#define        SBTMCL_IM_MASK          0x3000000       /* interrupt mode */
+#define        SBTMCL_IM_SHIFT         24
+
+/* sbtmconfighigh */
+#define        SBTMCH_BM_MASK          0x3             /* busy mode */
+#define        SBTMCH_RM_MASK          0x3             /* retry mode */
+#define        SBTMCH_RM_SHIFT         2
+#define        SBTMCH_SM_MASK          0x30            /* stop mode */
+#define        SBTMCH_SM_SHIFT         4
+#define        SBTMCH_EM_MASK          0x300           /* sb error mode */
+#define        SBTMCH_EM_SHIFT         8
+#define        SBTMCH_IM_MASK          0xc00           /* int mode */
+#define        SBTMCH_IM_SHIFT         10
+
+/* sbbconfig */
+#define        SBBC_LAT_MASK           0x3             /* sb latency */
+#define        SBBC_MAX0_MASK          0xf0000         /* maxccntr0 */
+#define        SBBC_MAX0_SHIFT         16
+#define        SBBC_MAX1_MASK          0xf00000        /* maxccntr1 */
+#define        SBBC_MAX1_SHIFT         20
+
+/* sbbstate */
+#define        SBBS_SRD                0x1             /* st reg disable */
+#define        SBBS_HRD                0x2             /* hold reg disable */
+
+/* sbidlow */
+#define        SBIDL_CS_MASK           0x3             /* config space */
+#define        SBIDL_AR_MASK           0x38            /* # address ranges supported */
+#define        SBIDL_AR_SHIFT          3
+#define        SBIDL_SYNCH             0x40            /* sync */
+#define        SBIDL_INIT              0x80            /* initiator */
+#define        SBIDL_MINLAT_MASK       0xf00           /* minimum backplane latency */
+#define        SBIDL_MINLAT_SHIFT      8
+#define        SBIDL_MAXLAT            0xf000          /* maximum backplane latency */
+#define        SBIDL_MAXLAT_SHIFT      12
+#define        SBIDL_FIRST             0x10000         /* this initiator is first */
+#define        SBIDL_CW_MASK           0xc0000         /* cycle counter width */
+#define        SBIDL_CW_SHIFT          18
+#define        SBIDL_TP_MASK           0xf00000        /* target ports */
+#define        SBIDL_TP_SHIFT          20
+#define        SBIDL_IP_MASK           0xf000000       /* initiator ports */
+#define        SBIDL_IP_SHIFT          24
+#define        SBIDL_RV_MASK           0xf0000000      /* sonics backplane revision code */
+#define        SBIDL_RV_SHIFT          28
+#define        SBIDL_RV_2_2            0x00000000      /* version 2.2 or earlier */
+#define        SBIDL_RV_2_3            0x10000000      /* version 2.3 */
+
+/* sbidhigh */
+#define        SBIDH_RC_MASK           0x000f          /* revision code */
+#define        SBIDH_RCE_MASK          0x7000          /* revision code extension field */
+#define        SBIDH_RCE_SHIFT         8
+#define        SBCOREREV(sbidh) \
+       ((((sbidh) & SBIDH_RCE_MASK) >> SBIDH_RCE_SHIFT) | ((sbidh) & SBIDH_RC_MASK))
+#define        SBIDH_CC_MASK           0x8ff0          /* core code */
+#define        SBIDH_CC_SHIFT          4
+#define        SBIDH_VC_MASK           0xffff0000      /* vendor code */
+#define        SBIDH_VC_SHIFT          16
+
+#define        SB_COMMIT               0xfd8           /* update buffered registers value */
+
+/* vendor codes */
+#define        SB_VEND_BCM             0x4243          /* Broadcom's SB vendor code */
+
+/* core codes */
+#define        SB_NODEV                0x700           /* Invalid coreid */
+#define        SB_CC                   0x800           /* chipcommon core */
+#define        SB_ILINE20              0x801           /* iline20 core */
+#define        SB_SDRAM                0x803           /* sdram core */
+#define        SB_PCI                  0x804           /* pci core */
+#define        SB_MIPS                 0x805           /* mips core */
+#define        SB_ENET                 0x806           /* enet mac core */
+#define        SB_CODEC                0x807           /* v90 codec core */
+#define        SB_USB                  0x808           /* usb 1.1 host/device core */
+#define        SB_ADSL                 0x809           /* ADSL core */
+#define        SB_ILINE100             0x80a           /* iline100 core */
+#define        SB_IPSEC                0x80b           /* ipsec core */
+#define        SB_PCMCIA               0x80d           /* pcmcia core */
+#define SB_SDIOD               SB_PCMCIA       /* pcmcia core has sdio device */
+#define        SB_SOCRAM               0x80e           /* internal memory core */
+#define        SB_MEMC                 0x80f           /* memc sdram core */
+#define        SB_EXTIF                0x811           /* external interface core */
+#define        SB_D11                  0x812           /* 802.11 MAC core */
+#define        SB_MIPS33               0x816           /* mips3302 core */
+#define        SB_USB11H               0x817           /* usb 1.1 host core */
+#define        SB_USB11D               0x818           /* usb 1.1 device core */
+#define        SB_USB20H               0x819           /* usb 2.0 host core */
+#define        SB_USB20D               0x81a           /* usb 2.0 device core */
+#define        SB_SDIOH                0x81b           /* sdio host core */
+#define        SB_ROBO                 0x81c           /* roboswitch core */
+#define        SB_ATA100               0x81d           /* parallel ATA core */
+#define        SB_SATAXOR              0x81e           /* serial ATA & XOR DMA core */
+#define        SB_GIGETH               0x81f           /* gigabit ethernet core */
+#define        SB_PCIE                 0x820           /* pci express core */
+#define        SB_MIMO                 0x821           /* MIMO phy core */
+#define        SB_SRAMC                0x822           /* SRAM controller core */
+#define        SB_MINIMAC              0x823           /* MINI MAC/phy core */
+#define        SB_ARM11                0x824           /* ARM 1176 core */
+#define        SB_ARM7                 0x825           /* ARM 7tdmi core */
+
+#define        SB_CC_IDX               0               /* chipc, when present, is always core 0 */
+
+/* Not really related to Silicon Backplane, but a couple of software
+ * conventions for the use the flash space:
+ */
+
+/* Minumum amount of flash we support */
+#define FLASH_MIN              0x00020000      /* Minimum flash size */
+
+/* A boot/binary may have an embedded block that describes its size  */
+#define        BISZ_OFFSET             0x3e0           /* At this offset into the binary */
+#define        BISZ_MAGIC              0x4249535a      /* Marked with this value: 'BISZ' */
+#define        BISZ_MAGIC_IDX          0               /* Word 0: magic */
+#define        BISZ_TXTST_IDX          1               /*      1: text start */
+#define        BISZ_TXTEND_IDX         2               /*      2: text start */
+#define        BISZ_DATAST_IDX         3               /*      3: text start */
+#define        BISZ_DATAEND_IDX        4               /*      4: text start */
+#define        BISZ_BSSST_IDX          5               /*      5: text start */
+#define        BISZ_BSSEND_IDX         6               /*      6: text start */
+#define BISZ_SIZE              7               /* descriptor size in 32-bit intergers */
+
+#endif /* _SBCONFIG_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbextif.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbextif.h
new file mode 100644 (file)
index 0000000..7c3f2a0
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * Hardware-specific External Interface I/O core definitions
+ * for the BCM47xx family of SiliconBackplane-based chips.
+ *
+ * The External Interface core supports a total of three external chip selects
+ * supporting external interfaces. One of the external chip selects is
+ * used for Flash, one is used for PCMCIA, and the other may be
+ * programmed to support either a synchronous interface or an
+ * asynchronous interface. The asynchronous interface can be used to
+ * support external devices such as UARTs and the BCM2019 Bluetooth
+ * baseband processor.
+ * The external interface core also contains 2 on-chip 16550 UARTs, clock
+ * frequency control, a watchdog interrupt timer, and a GPIO interface.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbextif.h,v 1.1.1.8 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _SBEXTIF_H
+#define        _SBEXTIF_H
+
+/* external interface address space */
+#define        EXTIF_PCMCIA_MEMBASE(x) (x)
+#define        EXTIF_PCMCIA_IOBASE(x)  ((x) + 0x100000)
+#define        EXTIF_PCMCIA_CFGBASE(x) ((x) + 0x200000)
+#define        EXTIF_CFGIF_BASE(x)     ((x) + 0x800000)
+#define        EXTIF_FLASH_BASE(x)     ((x) + 0xc00000)
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif /* PAD */
+
+/*
+ * The multiple instances of output and output enable registers
+ * are present to allow driver software for multiple cores to control
+ * gpio outputs without needing to share a single register pair.
+ */
+struct gpiouser {
+       uint32  out;
+       uint32  outen;
+};
+#define        NGPIOUSER       5
+
+typedef volatile struct {
+       uint32  corecontrol;
+       uint32  extstatus;
+       uint32  PAD[2];
+
+       /* pcmcia control registers */
+       uint32  pcmcia_config;
+       uint32  pcmcia_memwait;
+       uint32  pcmcia_attrwait;
+       uint32  pcmcia_iowait;
+
+       /* programmable interface control registers */
+       uint32  prog_config;
+       uint32  prog_waitcount;
+
+       /* flash control registers */
+       uint32  flash_config;
+       uint32  flash_waitcount;
+       uint32  PAD[4];
+
+       uint32  watchdog;
+
+       /* clock control */
+       uint32  clockcontrol_n;
+       uint32  clockcontrol_sb;
+       uint32  clockcontrol_pci;
+       uint32  clockcontrol_mii;
+       uint32  PAD[3];
+
+       /* gpio */
+       uint32  gpioin;
+       struct gpiouser gpio[NGPIOUSER];
+       uint32  PAD;
+       uint32  ejtagouten;
+       uint32  gpiointpolarity;
+       uint32  gpiointmask;
+       uint32  PAD[153];
+
+       uint8   uartdata;
+       uint8   PAD[3];
+       uint8   uartimer;
+       uint8   PAD[3];
+       uint8   uartfcr;
+       uint8   PAD[3];
+       uint8   uartlcr;
+       uint8   PAD[3];
+       uint8   uartmcr;
+       uint8   PAD[3];
+       uint8   uartlsr;
+       uint8   PAD[3];
+       uint8   uartmsr;
+       uint8   PAD[3];
+       uint8   uartscratch;
+       uint8   PAD[3];
+} extifregs_t;
+
+/* corecontrol */
+#define        CC_UE           (1 << 0)                /* uart enable */
+
+/* extstatus */
+#define        ES_EM           (1 << 0)                /* endian mode (ro) */
+#define        ES_EI           (1 << 1)                /* external interrupt pin (ro) */
+#define        ES_GI           (1 << 2)                /* gpio interrupt pin (ro) */
+
+/* gpio bit mask */
+#define GPIO_BIT0      (1 << 0)
+#define GPIO_BIT1      (1 << 1)
+#define GPIO_BIT2      (1 << 2)
+#define GPIO_BIT3      (1 << 3)
+#define GPIO_BIT4      (1 << 4)
+#define GPIO_BIT5      (1 << 5)
+#define GPIO_BIT6      (1 << 6)
+#define GPIO_BIT7      (1 << 7)
+
+
+/* pcmcia/prog/flash_config */
+#define        CF_EN           (1 << 0)                /* enable */
+#define        CF_EM_MASK      0xe                     /* mode */
+#define        CF_EM_SHIFT     1
+#define        CF_EM_FLASH     0x0                     /* flash/asynchronous mode */
+#define        CF_EM_SYNC      0x2                     /* synchronous mode */
+#define        CF_EM_PCMCIA    0x4                     /* pcmcia mode */
+#define        CF_DS           (1 << 4)                /* destsize:  0=8bit, 1=16bit */
+#define        CF_BS           (1 << 5)                /* byteswap */
+#define        CF_CD_MASK      0xc0                    /* clock divider */
+#define        CF_CD_SHIFT     6
+#define        CF_CD_DIV2      0x0                     /* backplane/2 */
+#define        CF_CD_DIV3      0x40                    /* backplane/3 */
+#define        CF_CD_DIV4      0x80                    /* backplane/4 */
+#define        CF_CE           (1 << 8)                /* clock enable */
+#define        CF_SB           (1 << 9)                /* size/bytestrobe (synch only) */
+
+/* pcmcia_memwait */
+#define        PM_W0_MASK      0x3f                    /* waitcount0 */
+#define        PM_W1_MASK      0x1f00                  /* waitcount1 */
+#define        PM_W1_SHIFT     8
+#define        PM_W2_MASK      0x1f0000                /* waitcount2 */
+#define        PM_W2_SHIFT     16
+#define        PM_W3_MASK      0x1f000000              /* waitcount3 */
+#define        PM_W3_SHIFT     24
+
+/* pcmcia_attrwait */
+#define        PA_W0_MASK      0x3f                    /* waitcount0 */
+#define        PA_W1_MASK      0x1f00                  /* waitcount1 */
+#define        PA_W1_SHIFT     8
+#define        PA_W2_MASK      0x1f0000                /* waitcount2 */
+#define        PA_W2_SHIFT     16
+#define        PA_W3_MASK      0x1f000000              /* waitcount3 */
+#define        PA_W3_SHIFT     24
+
+/* pcmcia_iowait */
+#define        PI_W0_MASK      0x3f                    /* waitcount0 */
+#define        PI_W1_MASK      0x1f00                  /* waitcount1 */
+#define        PI_W1_SHIFT     8
+#define        PI_W2_MASK      0x1f0000                /* waitcount2 */
+#define        PI_W2_SHIFT     16
+#define        PI_W3_MASK      0x1f000000              /* waitcount3 */
+#define        PI_W3_SHIFT     24
+
+/* prog_waitcount */
+#define        PW_W0_MASK      0x0000001f                      /* waitcount0 */
+#define        PW_W1_MASK      0x00001f00                      /* waitcount1 */
+#define        PW_W1_SHIFT     8
+#define        PW_W2_MASK      0x001f0000              /* waitcount2 */
+#define        PW_W2_SHIFT     16
+#define        PW_W3_MASK      0x1f000000              /* waitcount3 */
+#define        PW_W3_SHIFT     24
+
+#define PW_W0       0x0000000c
+#define PW_W1       0x00000a00
+#define PW_W2       0x00020000
+#define PW_W3       0x01000000
+
+/* flash_waitcount */
+#define        FW_W0_MASK      0x1f                    /* waitcount0 */
+#define        FW_W1_MASK      0x1f00                  /* waitcount1 */
+#define        FW_W1_SHIFT     8
+#define        FW_W2_MASK      0x1f0000                /* waitcount2 */
+#define        FW_W2_SHIFT     16
+#define        FW_W3_MASK      0x1f000000              /* waitcount3 */
+#define        FW_W3_SHIFT     24
+
+/* watchdog */
+#define WATCHDOG_CLOCK 48000000                /* Hz */
+
+/* clockcontrol_n */
+#define        CN_N1_MASK      0x3f                    /* n1 control */
+#define        CN_N2_MASK      0x3f00                  /* n2 control */
+#define        CN_N2_SHIFT     8
+
+/* clockcontrol_sb/pci/mii */
+#define        CC_M1_MASK      0x3f                    /* m1 control */
+#define        CC_M2_MASK      0x3f00                  /* m2 control */
+#define        CC_M2_SHIFT     8
+#define        CC_M3_MASK      0x3f0000                /* m3 control */
+#define        CC_M3_SHIFT     16
+#define        CC_MC_MASK      0x1f000000              /* mux control */
+#define        CC_MC_SHIFT     24
+
+/* Clock control default values */
+#define CC_DEF_N       0x0009                  /* Default values for bcm4710 */
+#define CC_DEF_100     0x04020011
+#define CC_DEF_33      0x11030011
+#define CC_DEF_25      0x11050011
+
+/* Clock control values for 125Mhz */
+#define        CC_125_N        0x0802
+#define        CC_125_M        0x04020009
+#define        CC_125_M25      0x11090009
+#define        CC_125_M33      0x11090005
+
+/* Clock control magic field values */
+#define        CC_F6_2         0x02                    /* A factor of 2 in */
+#define        CC_F6_3         0x03                    /*  6-bit fields like */
+#define        CC_F6_4         0x05                    /*  N1, M1 or M3 */
+#define        CC_F6_5         0x09
+#define        CC_F6_6         0x11
+#define        CC_F6_7         0x21
+
+#define        CC_F5_BIAS      5                       /* 5-bit fields get this added */
+
+#define        CC_MC_BYPASS    0x08
+#define        CC_MC_M1        0x04
+#define        CC_MC_M1M2      0x02
+#define        CC_MC_M1M2M3    0x01
+#define        CC_MC_M1M3      0x11
+
+#define        CC_CLOCK_BASE   24000000        /* Half the clock freq. in the 4710 */
+
+#endif /* _SBEXTIF_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbhndmips.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbhndmips.h
new file mode 100644 (file)
index 0000000..93f5ace
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * Broadcom SiliconBackplane MIPS definitions
+ *
+ * SB MIPS cores are custom MIPS32 processors with SiliconBackplane
+ * OCP interfaces. The CP0 processor ID is 0x00024000, where bits
+ * 23:16 mean Broadcom and bits 15:8 mean a MIPS core with an OCP
+ * interface. The core revision is stored in the SB ID register in SB
+ * configuration space.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbhndmips.h,v 1.1.1.1 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _sbhndmips_h_
+#define        _sbhndmips_h_
+
+#include <mipsinc.h>
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif /* PAD */
+
+typedef volatile struct {
+       uint32  corecontrol;
+       uint32  PAD[2];
+       uint32  biststatus;
+       uint32  PAD[4];
+       uint32  intstatus;
+       uint32  intmask;
+       uint32  timer;
+} mipsregs_t;
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+#endif /* _sbhndmips_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbmemc.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbmemc.h
new file mode 100644 (file)
index 0000000..74af8e1
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * BCM47XX Sonics SiliconBackplane DDR/SDRAM controller core hardware definitions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbmemc.h,v 1.6 2006/03/02 12:33:44 honor Exp $
+ */
+
+#ifndef        _SBMEMC_H
+#define        _SBMEMC_H
+
+#ifdef _LANGUAGE_ASSEMBLY
+
+#define        MEMC_CONTROL            0x00
+#define        MEMC_CONFIG             0x04
+#define        MEMC_REFRESH            0x08
+#define        MEMC_BISTSTAT           0x0c
+#define        MEMC_MODEBUF            0x10
+#define        MEMC_BKCLS              0x14
+#define        MEMC_PRIORINV           0x18
+#define        MEMC_DRAMTIM            0x1c
+#define        MEMC_INTSTAT            0x20
+#define        MEMC_INTMASK            0x24
+#define        MEMC_INTINFO            0x28
+#define        MEMC_NCDLCTL            0x30
+#define        MEMC_RDNCDLCOR          0x34
+#define        MEMC_WRNCDLCOR          0x38
+#define        MEMC_MISCDLYCTL         0x3c
+#define        MEMC_DQSGATENCDL        0x40
+#define        MEMC_SPARE              0x44
+#define        MEMC_TPADDR             0x48
+#define        MEMC_TPDATA             0x4c
+#define        MEMC_BARRIER            0x50
+#define        MEMC_CORE               0x54
+
+#else  /* !_LANGUAGE_ASSEMBLY */
+
+/* Sonics side: MEMC core registers */
+typedef volatile struct sbmemcregs {
+       uint32  control;
+       uint32  config;
+       uint32  refresh;
+       uint32  biststat;
+       uint32  modebuf;
+       uint32  bkcls;
+       uint32  priorinv;
+       uint32  dramtim;
+       uint32  intstat;
+       uint32  intmask;
+       uint32  intinfo;
+       uint32  reserved1;
+       uint32  ncdlctl;
+       uint32  rdncdlcor;
+       uint32  wrncdlcor;
+       uint32  miscdlyctl;
+       uint32  dqsgatencdl;
+       uint32  spare;
+       uint32  tpaddr;
+       uint32  tpdata;
+       uint32  barrier;
+       uint32  core;
+} sbmemcregs_t;
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+/* MEMC Core Init values (OCP ID 0x80f) */
+
+/* For sdr: */
+#define MEMC_SD_CONFIG_INIT    0x00048000
+#define MEMC_SD_DRAMTIM2_INIT  0x000754d8
+#define MEMC_SD_DRAMTIM3_INIT  0x000754da
+#define MEMC_SD_RDNCDLCOR_INIT 0x00000000
+#define MEMC_SD_WRNCDLCOR_INIT 0x49351200
+#define MEMC_SD1_WRNCDLCOR_INIT        0x14500200      /* For corerev 1 (4712) */
+#define MEMC_SD_MISCDLYCTL_INIT        0x00061c1b
+#define MEMC_SD1_MISCDLYCTL_INIT 0x00021416    /* For corerev 1 (4712) */
+#define MEMC_SD_CONTROL_INIT0  0x00000002
+#define MEMC_SD_CONTROL_INIT1  0x00000008
+#define MEMC_SD_CONTROL_INIT2  0x00000004
+#define MEMC_SD_CONTROL_INIT3  0x00000010
+#define MEMC_SD_CONTROL_INIT4  0x00000001
+#define MEMC_SD_MODEBUF_INIT   0x00000000
+#define MEMC_SD_REFRESH_INIT   0x0000840f
+
+
+/* This is for SDRM8X8X4 */
+#define        MEMC_SDR_INIT           0x0008
+#define        MEMC_SDR_MODE           0x32
+#define        MEMC_SDR_NCDL           0x00020032
+#define        MEMC_SDR1_NCDL          0x0002020f      /* For corerev 1 (4712) */
+
+/* For ddr: */
+#define MEMC_CONFIG_INIT       0x00048000
+#define MEMC_DRAMTIM2_INIT     0x000754d8
+#define MEMC_DRAMTIM25_INIT    0x000754d9
+#define MEMC_RDNCDLCOR_INIT    0x00000000
+#define MEMC_RDNCDLCOR_SIMINIT 0xf6f6f6f6      /* For hdl sim */
+#define MEMC_WRNCDLCOR_INIT    0x49351200
+#define MEMC_1_WRNCDLCOR_INIT  0x14500200
+#define MEMC_DQSGATENCDL_INIT  0x00030000
+#define MEMC_MISCDLYCTL_INIT   0x21061c1b
+#define MEMC_1_MISCDLYCTL_INIT 0x21021400
+#define MEMC_NCDLCTL_INIT      0x00002001
+#define MEMC_CONTROL_INIT0     0x00000002
+#define MEMC_CONTROL_INIT1     0x00000008
+#define MEMC_MODEBUF_INIT0     0x00004000
+#define MEMC_CONTROL_INIT2     0x00000010
+#define MEMC_MODEBUF_INIT1     0x00000100
+#define MEMC_CONTROL_INIT3     0x00000010
+#define MEMC_CONTROL_INIT4     0x00000008
+#define MEMC_REFRESH_INIT      0x0000840f
+#define MEMC_CONTROL_INIT5     0x00000004
+#define MEMC_MODEBUF_INIT2     0x00000000
+#define MEMC_CONTROL_INIT6     0x00000010
+#define MEMC_CONTROL_INIT7     0x00000001
+
+
+/* This is for DDRM16X16X2 */
+#define        MEMC_DDR_INIT           0x0009
+#define        MEMC_DDR_MODE           0x62
+#define        MEMC_DDR_NCDL           0x0005050a
+#define        MEMC_DDR1_NCDL          0x00000a0a      /* For corerev 1 (4712) */
+
+/* mask for sdr/ddr calibration registers */
+#define MEMC_RDNCDLCOR_RD_MASK 0x000000ff
+#define MEMC_WRNCDLCOR_WR_MASK 0x000000ff
+#define MEMC_DQSGATENCDL_G_MASK        0x000000ff
+
+/* masks for miscdlyctl registers */
+#define MEMC_MISC_SM_MASK      0x30000000
+#define MEMC_MISC_SM_SHIFT     28
+#define MEMC_MISC_SD_MASK      0x0f000000
+#define MEMC_MISC_SD_SHIFT     24
+
+/* hw threshhold for calculating wr/rd for sdr memc */
+#define MEMC_CD_THRESHOLD      128
+
+/* Low bit of init register says if memc is ddr or sdr */
+#define MEMC_CONFIG_DDR                0x00000001
+
+#endif /* _SBMEMC_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpci.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpci.h
new file mode 100644 (file)
index 0000000..761e5b4
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * HND SiliconBackplane PCI core hardware definitions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbpci.h,v 1.1.1.11 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _sbpci_h_
+#define        _sbpci_h_
+
+#ifndef _LANGUAGE_ASSEMBLY
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif
+
+/* Sonics side: PCI core and host control registers */
+typedef struct sbpciregs {
+       uint32 control;         /* PCI control */
+       uint32 PAD[3];
+       uint32 arbcontrol;      /* PCI arbiter control */
+       uint32 PAD[3];
+       uint32 intstatus;       /* Interrupt status */
+       uint32 intmask;         /* Interrupt mask */
+       uint32 sbtopcimailbox;  /* Sonics to PCI mailbox */
+       uint32 PAD[9];
+       uint32 bcastaddr;       /* Sonics broadcast address */
+       uint32 bcastdata;       /* Sonics broadcast data */
+       uint32 PAD[2];
+       uint32 gpioin;          /* ro: gpio input (>=rev2) */
+       uint32 gpioout;         /* rw: gpio output (>=rev2) */
+       uint32 gpioouten;       /* rw: gpio output enable (>= rev2) */
+       uint32 gpiocontrol;     /* rw: gpio control (>= rev2) */
+       uint32 PAD[36];
+       uint32 sbtopci0;        /* Sonics to PCI translation 0 */
+       uint32 sbtopci1;        /* Sonics to PCI translation 1 */
+       uint32 sbtopci2;        /* Sonics to PCI translation 2 */
+       uint32 PAD[189];
+       uint32 pcicfg[4][64];   /* 0x400 - 0x7FF, PCI Cfg Space (>=rev8) */
+       uint16 sprom[36];       /* SPROM shadow Area */
+       uint32 PAD[46];
+} sbpciregs_t;
+
+#endif /* _LANGUAGE_ASSEMBLY */
+
+/* PCI control */
+#define PCI_RST_OE     0x01    /* When set, drives PCI_RESET out to pin */
+#define PCI_RST                0x02    /* Value driven out to pin */
+#define PCI_CLK_OE     0x04    /* When set, drives clock as gated by PCI_CLK out to pin */
+#define PCI_CLK                0x08    /* Gate for clock driven out to pin */
+
+/* PCI arbiter control */
+#define PCI_INT_ARB    0x01    /* When set, use an internal arbiter */
+#define PCI_EXT_ARB    0x02    /* When set, use an external arbiter */
+/* ParkID - for PCI corerev >= 8 */
+#define PCI_PARKID_MASK                0x1c    /* Selects which agent is parked on an idle bus */
+#define PCI_PARKID_SHIFT       2
+#define PCI_PARKID_EXT0                0       /* External master 0 */
+#define PCI_PARKID_EXT1                1       /* External master 1 */
+#define PCI_PARKID_EXT2                2       /* External master 2 */
+#define PCI_PARKID_INT         3       /* Internal master */
+#define PCI_PARKID_LAST                4       /* Last active master */
+
+/* Interrupt status/mask */
+#define PCI_INTA       0x01    /* PCI INTA# is asserted */
+#define PCI_INTB       0x02    /* PCI INTB# is asserted */
+#define PCI_SERR       0x04    /* PCI SERR# has been asserted (write one to clear) */
+#define PCI_PERR       0x08    /* PCI PERR# has been asserted (write one to clear) */
+#define PCI_PME                0x10    /* PCI PME# is asserted */
+
+/* (General) PCI/SB mailbox interrupts, two bits per pci function */
+#define        MAILBOX_F0_0    0x100   /* function 0, int 0 */
+#define        MAILBOX_F0_1    0x200   /* function 0, int 1 */
+#define        MAILBOX_F1_0    0x400   /* function 1, int 0 */
+#define        MAILBOX_F1_1    0x800   /* function 1, int 1 */
+#define        MAILBOX_F2_0    0x1000  /* function 2, int 0 */
+#define        MAILBOX_F2_1    0x2000  /* function 2, int 1 */
+#define        MAILBOX_F3_0    0x4000  /* function 3, int 0 */
+#define        MAILBOX_F3_1    0x8000  /* function 3, int 1 */
+
+/* Sonics broadcast address */
+#define BCAST_ADDR_MASK        0xff    /* Broadcast register address */
+
+/* Sonics to PCI translation types */
+#define SBTOPCI0_MASK  0xfc000000
+#define SBTOPCI1_MASK  0xfc000000
+#define SBTOPCI2_MASK  0xc0000000
+#define SBTOPCI_MEM    0
+#define SBTOPCI_IO     1
+#define SBTOPCI_CFG0   2
+#define SBTOPCI_CFG1   3
+#define        SBTOPCI_PREF    0x4             /* prefetch enable */
+#define        SBTOPCI_BURST   0x8             /* burst enable */
+#define        SBTOPCI_RC_MASK         0x30    /* read command (>= rev11) */
+#define        SBTOPCI_RC_READ         0x00    /* memory read */
+#define        SBTOPCI_RC_READLINE     0x10    /* memory read line */
+#define        SBTOPCI_RC_READMULTI    0x20    /* memory read multiple */
+
+/* PCI core index in SROM shadow area */
+#define SRSH_PI_OFFSET 0       /* first word */
+#define SRSH_PI_MASK   0xf000  /* bit 15:12 */
+#define SRSH_PI_SHIFT  12      /* bit 15:12 */
+
+#endif /* _sbpci_h_ */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcie.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcie.h
new file mode 100644 (file)
index 0000000..58990c9
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * BCM43XX SiliconBackplane PCIE core hardware definitions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbpcie.h,v 1.1.1.2 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _SBPCIE_H
+#define        _SBPCIE_H
+
+/* cpp contortions to concatenate w/arg prescan */
+#ifndef PAD
+#define        _PADLINE(line)  pad ## line
+#define        _XSTR(line)     _PADLINE(line)
+#define        PAD             _XSTR(__LINE__)
+#endif
+
+/* PCIE Enumeration space offsets */
+#define  PCIE_CORE_CONFIG_OFFSET       0x0
+#define  PCIE_FUNC0_CONFIG_OFFSET      0x400
+#define  PCIE_FUNC1_CONFIG_OFFSET      0x500
+#define  PCIE_FUNC2_CONFIG_OFFSET      0x600
+#define  PCIE_FUNC3_CONFIG_OFFSET      0x700
+#define  PCIE_SPROM_SHADOW_OFFSET      0x800
+#define  PCIE_SBCONFIG_OFFSET          0xE00
+
+/* PCIE Bar0 Address Mapping. Each function maps 16KB config space */
+#define PCIE_DEV_BAR0_SIZE             0x4000
+#define PCIE_BAR0_WINMAPCORE_OFFSET    0x0
+#define PCIE_BAR0_EXTSPROM_OFFSET      0x1000
+#define PCIE_BAR0_PCIECORE_OFFSET      0x2000
+#define PCIE_BAR0_CCCOREREG_OFFSET     0x3000
+
+/* SB side: PCIE core and host control registers */
+typedef struct sbpcieregs {
+       uint32 PAD[3];
+       uint32 biststatus;      /* bist Status: 0x00C */
+       uint32 PAD[6];
+       uint32 sbtopcimailbox;  /* sb to pcie mailbox: 0x028 */
+       uint32 PAD[54];
+       uint32 sbtopcie0;       /* sb to pcie translation 0: 0x100 */
+       uint32 sbtopcie1;       /* sb to pcie translation 1: 0x104 */
+       uint32 sbtopcie2;       /* sb to pcie translation 2: 0x108 */
+       uint32 PAD[4];
+
+       /* pcie core supports in direct access to config space */
+       uint32 configaddr;      /* pcie config space access: Address field: 0x120 */
+       uint32 configdata;      /* pcie config space access: Data field: 0x124 */
+
+       /* mdio access to serdes */
+       uint32 mdiocontrol;     /* controls the mdio access: 0x128 */
+       uint32 mdiodata;        /* Data to the mdio access: 0x12c */
+
+       /* pcie protocol phy/dllp/tlp register access mechanism */
+       uint32 pcieaddr;        /* address of the internal registeru: 0x130 */
+       uint32 pciedata;        /* Data to/from the internal regsiter: 0x134 */
+
+       uint32 PAD[434];
+       uint16 sprom[36];       /* SPROM shadow Area */
+} sbpcieregs_t;
+
+/* SB to PCIE translation masks */
+#define SBTOPCIE0_MASK 0xfc000000
+#define SBTOPCIE1_MASK 0xfc000000
+#define SBTOPCIE2_MASK 0xc0000000
+
+/* Access type bits (0:1) */
+#define SBTOPCIE_MEM   0
+#define SBTOPCIE_IO    1
+#define SBTOPCIE_CFG0  2
+#define SBTOPCIE_CFG1  3
+
+/* Prefetch enable bit 2 */
+#define SBTOPCIE_PF            4
+
+/* Write Burst enable for memory write bit 3 */
+#define SBTOPCIE_WR_BURST      8
+
+/* config access */
+#define CONFIGADDR_FUNC_MASK   0x7000
+#define CONFIGADDR_FUNC_SHF    12
+#define CONFIGADDR_REG_MASK    0x0FFF
+#define CONFIGADDR_REG_SHF     0
+
+/* PCIE protocol regs Indirect Address */
+#define PCIEADDR_PROT_MASK     0x300
+#define PCIEADDR_PROT_SHF      8
+#define PCIEADDR_PL_TLP                0
+#define PCIEADDR_PL_DLLP       1
+#define PCIEADDR_PL_PLP                2
+
+/* PCIE protocol PHY diagnostic registers */
+#define        PCIE_PLP_MODEREG                0x200 /* Mode */
+#define        PCIE_PLP_STATUSREG              0x204 /* Status */
+#define PCIE_PLP_LTSSMCTRLREG          0x208 /* LTSSM control */
+#define PCIE_PLP_LTLINKNUMREG          0x20c /* Link Training Link number */
+#define PCIE_PLP_LTLANENUMREG          0x210 /* Link Training Lane number */
+#define PCIE_PLP_LTNFTSREG             0x214 /* Link Training N_FTS */
+#define PCIE_PLP_ATTNREG               0x218 /* Attention */
+#define PCIE_PLP_ATTNMASKREG           0x21C /* Attention Mask */
+#define PCIE_PLP_RXERRCTR              0x220 /* Rx Error */
+#define PCIE_PLP_RXFRMERRCTR           0x224 /* Rx Framing Error */
+#define PCIE_PLP_RXERRTHRESHREG                0x228 /* Rx Error threshold */
+#define PCIE_PLP_TESTCTRLREG           0x22C /* Test Control reg */
+#define PCIE_PLP_SERDESCTRLOVRDREG     0x230 /* SERDES Control Override */
+#define PCIE_PLP_TIMINGOVRDREG         0x234 /* Timing param override */
+#define PCIE_PLP_RXTXSMDIAGREG         0x238 /* RXTX State Machine Diag */
+#define PCIE_PLP_LTSSMDIAGREG          0x23C /* LTSSM State Machine Diag */
+
+/* PCIE protocol DLLP diagnostic registers */
+#define PCIE_DLLP_LCREG                        0x100 /* Link Control */
+#define PCIE_DLLP_LSREG                        0x104 /* Link Status */
+#define PCIE_DLLP_LAREG                        0x108 /* Link Attention */
+#define PCIE_DLLP_LAMASKREG            0x10C /* Link Attention Mask */
+#define PCIE_DLLP_NEXTTXSEQNUMREG      0x110 /* Next Tx Seq Num */
+#define PCIE_DLLP_ACKEDTXSEQNUMREG     0x114 /* Acked Tx Seq Num */
+#define PCIE_DLLP_PURGEDTXSEQNUMREG    0x118 /* Purged Tx Seq Num */
+#define PCIE_DLLP_RXSEQNUMREG          0x11C /* Rx Sequence Number */
+#define PCIE_DLLP_LRREG                        0x120 /* Link Replay */
+#define PCIE_DLLP_LACKTOREG            0x124 /* Link Ack Timeout */
+#define PCIE_DLLP_PMTHRESHREG          0x128 /* Power Management Threshold */
+#define PCIE_DLLP_RTRYWPREG            0x12C /* Retry buffer write ptr */
+#define PCIE_DLLP_RTRYRPREG            0x130 /* Retry buffer Read ptr */
+#define PCIE_DLLP_RTRYPPREG            0x134 /* Retry buffer Purged ptr */
+#define PCIE_DLLP_RTRRWREG             0x138 /* Retry buffer Read/Write */
+#define PCIE_DLLP_ECTHRESHREG          0x13C /* Error Count Threshold */
+#define PCIE_DLLP_TLPERRCTRREG         0x140 /* TLP Error Counter */
+#define PCIE_DLLP_ERRCTRREG            0x144 /* Error Counter */
+#define PCIE_DLLP_NAKRXCTRREG          0x148 /* NAK Received Counter */
+#define PCIE_DLLP_TESTREG              0x14C /* Test */
+#define PCIE_DLLP_PKTBIST              0x150 /* Packet BIST */
+
+/* PCIE protocol TLP diagnostic registers */
+#define PCIE_TLP_CONFIGREG             0x000 /* Configuration */
+#define PCIE_TLP_WORKAROUNDSREG                0x004 /* TLP Workarounds */
+#define PCIE_TLP_WRDMAUPPER            0x010 /* Write DMA Upper Address */
+#define PCIE_TLP_WRDMALOWER            0x014 /* Write DMA Lower Address */
+#define PCIE_TLP_WRDMAREQ_LBEREG       0x018 /* Write DMA Len/ByteEn Req */
+#define PCIE_TLP_RDDMAUPPER            0x01C /* Read DMA Upper Address */
+#define PCIE_TLP_RDDMALOWER            0x020 /* Read DMA Lower Address */
+#define PCIE_TLP_RDDMALENREG           0x024 /* Read DMA Len Req */
+#define PCIE_TLP_MSIDMAUPPER           0x028 /* MSI DMA Upper Address */
+#define PCIE_TLP_MSIDMALOWER           0x02C /* MSI DMA Lower Address */
+#define PCIE_TLP_MSIDMALENREG          0x030 /* MSI DMA Len Req */
+#define PCIE_TLP_SLVREQLENREG          0x034 /* Slave Request Len */
+#define PCIE_TLP_FCINPUTSREQ           0x038 /* Flow Control Inputs */
+#define PCIE_TLP_TXSMGRSREQ            0x03C /* Tx StateMachine and Gated Req */
+#define PCIE_TLP_ADRACKCNTARBLEN       0x040 /* Address Ack XferCnt and ARB Len */
+#define PCIE_TLP_DMACPLHDR0            0x044 /* DMA Completion Hdr 0 */
+#define PCIE_TLP_DMACPLHDR1            0x048 /* DMA Completion Hdr 1 */
+#define PCIE_TLP_DMACPLHDR2            0x04C /* DMA Completion Hdr 2 */
+#define PCIE_TLP_DMACPLMISC0           0x050 /* DMA Completion Misc0 */
+#define PCIE_TLP_DMACPLMISC1           0x054 /* DMA Completion Misc1 */
+#define PCIE_TLP_DMACPLMISC2           0x058 /* DMA Completion Misc2 */
+#define PCIE_TLP_SPTCTRLLEN            0x05C /* Split Controller Req len */
+#define PCIE_TLP_SPTCTRLMSIC0          0x060 /* Split Controller Misc 0 */
+#define PCIE_TLP_SPTCTRLMSIC1          0x064 /* Split Controller Misc 1 */
+#define PCIE_TLP_BUSDEVFUNC            0x068 /* Bus/Device/Func */
+#define PCIE_TLP_RESETCTR              0x06C /* Reset Counter */
+#define PCIE_TLP_RTRYBUF               0x070 /* Retry Buffer value */
+#define PCIE_TLP_TGTDEBUG1             0x074 /* Target Debug Reg1 */
+#define PCIE_TLP_TGTDEBUG2             0x078 /* Target Debug Reg2 */
+#define PCIE_TLP_TGTDEBUG3             0x07C /* Target Debug Reg3 */
+#define PCIE_TLP_TGTDEBUG4             0x080 /* Target Debug Reg4 */
+
+/* MDIO control */
+#define MDIOCTL_DIVISOR_MASK           0x7f    /* clock to be used on MDIO */
+#define MDIOCTL_DIVISOR_VAL            0x2
+#define MDIOCTL_PREAM_EN               0x80    /* Enable preamble sequnce */
+#define MDIOCTL_ACCESS_DONE            0x100   /* Tranaction complete */
+
+/* MDIO Data */
+#define MDIODATA_MASK                  0x0000ffff      /* data 2 bytes */
+#define MDIODATA_TA                    0x00020000      /* Turnaround */
+#define MDIODATA_REGADDR_SHF           18              /* Regaddr shift */
+#define MDIODATA_REGADDR_MASK          0x003c0000      /* Regaddr Mask */
+#define MDIODATA_DEVADDR_SHF           22              /* Physmedia devaddr shift */
+#define MDIODATA_DEVADDR_MASK          0x0fc00000      /* Physmedia devaddr Mask */
+#define MDIODATA_WRITE                 0x10000000      /* write Transaction */
+#define MDIODATA_READ                  0x20000000      /* Read Transaction */
+#define MDIODATA_START                 0x40000000      /* start of Transaction */
+
+/* MDIO devices (SERDES modules) */
+#define MDIODATA_DEV_PLL                       0x1d    /* SERDES PLL Dev */
+#define MDIODATA_DEV_TX                        0x1e    /* SERDES TX Dev */
+#define MDIODATA_DEV_RX                        0x1f    /* SERDES RX Dev */
+
+/* SERDES registers */
+#define SERDES_RX_TIMER1               2       /* Rx Timer1 */
+#define SERDES_RX_CDR                  6       /* CDR */
+#define SERDES_RX_CDRBW                        7       /* CDR BW */
+
+#endif /* _SBPCIE_H */
diff --git a/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcmcia.h b/target/linux/brcm-2.4/files/arch/mips/bcm947xx/include/sbpcmcia.h
new file mode 100644 (file)
index 0000000..08fd453
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * BCM43XX Sonics SiliconBackplane PCMCIA core hardware definitions.
+ *
+ * Copyright 2006, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id: sbpcmcia.h,v 1.1.1.9 2006/02/27 03:43:16 honor Exp $
+ */
+
+#ifndef        _SBPCMCIA_H
+#define        _SBPCMCIA_H
+
+
+/* All the addresses that are offsets in attribute space are divided
+ * by two to account for the fact that odd bytes are invalid in
+ * attribute space and our read/write routines make the space appear
+ * as if they didn't exist. Still we want to show the original numbers
+ * as documented in the hnd_pcmcia core manual.
+ */
+
+/* PCMCIA Function Configuration Registers */
+#define        PCMCIA_FCR              (0x700 / 2)
+
+#define        FCR0_OFF                0
+#define        FCR1_OFF                (0x40 / 2)
+#define        FCR2_OFF                (0x80 / 2)
+#define        FCR3_OFF                (0xc0 / 2)
+
+#define        PCMCIA_FCR0             (0x700 / 2)
+#define        PCMCIA_FCR1             (0x740 / 2)
+#define        PCMCIA_FCR2             (0x780 / 2)
+#define        PCMCIA_FCR3             (0x7c0 / 2)
+
+/* Standard PCMCIA FCR registers */
+
+#define        PCMCIA_COR              0
+
+#define        COR_RST                 0x80
+#define        COR_LEV                 0x40
+#define        COR_IRQEN               0x04
+#define        COR_BLREN               0x01
+#define        COR_FUNEN               0x01
+
+
+#define        PCICIA_FCSR             (2 / 2)
+#define        PCICIA_PRR              (4 / 2)
+#define        PCICIA_SCR              (6 / 2)
+#define        PCICIA_ESR              (8 / 2)
+
+
+#define PCM_MEMOFF             0x0000
+#define F0_MEMOFF              0x1000
+#define F1_MEMOFF              0x2000
+#define F2_MEMOFF              0x3000
+#define F3_MEMOFF              0x4000
+
+/* Memory base in the function fcr's */
+#define MEM_ADDR0              (0x728 / 2)
+#define MEM_ADDR1              (0x72a / 2)
+#define MEM_ADDR2              (0x72c / 2)
+
+/* PCMCIA base plus Srom access in fcr0: */
+#define PCMCIA_ADDR0           (0x072e / 2)
+#define PCMCIA_ADDR1           (0x0730 / 2)
+#define PCMCIA_ADDR2           (0x0732 / 2)
+
+#define MEM_SEG                        (0x0734 / 2)
+#define SROM_CS                        (0x0736 / 2)
+#define SROM_DATAL             (0x0738 / 2)
+#define SROM_DATAH             (0x073a / 2)
+#define SROM_ADDRL             (0x073c / 2)
+#define SROM_ADDRH             (0x073e / 2)
+
+/*  Values for srom_cs: */
+#define SROM_IDLE              0
+#define SROM_WRITE             1
+#define SROM_READ              2
+#define SROM_WEN               4
+#define SROM_WDS               7
+#define SROM_DONE              8
+
+/* CIS stuff */
+
+/* The CIS stops where the FCRs start */
+#define        CIS_SIZE                PCMCIA_FCR
+
+/*&nbs