summaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/3c501.c70
-rw-r--r--drivers/net/3c503.c1
-rw-r--r--drivers/net/3c505.c88
-rw-r--r--drivers/net/3c509.c52
-rw-r--r--drivers/net/3c515.c15
-rw-r--r--drivers/net/3c523.c35
-rw-r--r--drivers/net/3c59x.c1020
-rw-r--r--drivers/net/82596.c2
-rw-r--r--drivers/net/8390.c195
-rw-r--r--drivers/net/8390.h64
-rw-r--r--drivers/net/Config.in13
-rw-r--r--drivers/net/Makefile44
-rw-r--r--drivers/net/Space.c21
-rw-r--r--drivers/net/ac3200.c1
-rw-r--r--drivers/net/acenic.c408
-rw-r--r--drivers/net/acenic.h21
-rw-r--r--drivers/net/acenic_firmware.h7957
-rw-r--r--drivers/net/apne.c30
-rw-r--r--drivers/net/ariadne2.c5
-rw-r--r--drivers/net/at1700.c218
-rw-r--r--drivers/net/bmac.c101
-rw-r--r--drivers/net/cops.h2
-rw-r--r--drivers/net/cosa.c1909
-rw-r--r--drivers/net/cosa.h102
-rw-r--r--drivers/net/daynaport.c4
-rw-r--r--drivers/net/de4x5.c178
-rw-r--r--drivers/net/de4x5.h1
-rw-r--r--drivers/net/dgrs.c4
-rw-r--r--drivers/net/dgrs_i82596.h4
-rw-r--r--drivers/net/e2100.c1
-rw-r--r--drivers/net/eepro.c972
-rw-r--r--drivers/net/eepro100.c2
-rw-r--r--drivers/net/eexpress.c5
-rw-r--r--drivers/net/epic100.c1285
-rw-r--r--drivers/net/es3210.c1
-rw-r--r--drivers/net/eth16i.c4
-rw-r--r--drivers/net/fmv18x.c96
-rw-r--r--drivers/net/hamradio/Config.in4
-rw-r--r--drivers/net/hamradio/baycom_ser_fdx.c1
-rw-r--r--drivers/net/hamradio/baycom_ser_hdx.c1
-rw-r--r--drivers/net/hamradio/hdlcdrv.c3
-rw-r--r--drivers/net/hamradio/scc.c255
-rw-r--r--drivers/net/hamradio/soundmodem/sm.c1
-rw-r--r--drivers/net/hp-plus.c1
-rw-r--r--drivers/net/hp.c1
-rw-r--r--drivers/net/hp100.c28
-rw-r--r--drivers/net/ibmtr.c20
-rw-r--r--drivers/net/irda/.cvsignore2
-rw-r--r--drivers/net/irda/Config.in17
-rw-r--r--drivers/net/irda/Makefile80
-rw-r--r--drivers/net/irda/actisys.c314
-rw-r--r--drivers/net/irda/esi.c194
-rw-r--r--drivers/net/irda/irport.c403
-rw-r--r--drivers/net/irda/irtty.c748
-rw-r--r--drivers/net/irda/pc87108.c1502
-rw-r--r--drivers/net/irda/tekram.c314
-rw-r--r--drivers/net/irda/uircc.c914
-rw-r--r--drivers/net/irda/w83977af_ir.c1273
-rw-r--r--drivers/net/lance.c284
-rw-r--r--drivers/net/lne390.c1
-rw-r--r--drivers/net/ltpc.c20
-rw-r--r--drivers/net/ne.c841
-rw-r--r--drivers/net/ne2.c13
-rw-r--r--drivers/net/ne2k-pci.c1
-rw-r--r--drivers/net/ne3210.c1
-rw-r--r--drivers/net/net_init.c82
-rw-r--r--drivers/net/pcnet32.c130
-rw-r--r--drivers/net/plip.c60
-rw-r--r--drivers/net/ppp.c23
-rw-r--r--drivers/net/rcif.h299
-rw-r--r--drivers/net/rclanmtl.c2307
-rw-r--r--drivers/net/rclanmtl.h637
-rw-r--r--drivers/net/rcpci45.c1419
-rw-r--r--drivers/net/rrunner.c247
-rw-r--r--drivers/net/rrunner.h3
-rw-r--r--drivers/net/sdla.c6
-rw-r--r--drivers/net/sdla_fr.c6
-rw-r--r--drivers/net/sdla_ppp.c2
-rw-r--r--drivers/net/sdla_x25.c5
-rw-r--r--drivers/net/sdladrv.c2
-rw-r--r--drivers/net/sdlamain.c12
-rw-r--r--drivers/net/seeq8005.c8
-rw-r--r--drivers/net/sktr.c16
-rw-r--r--drivers/net/sktr_firmware.h2
-rw-r--r--drivers/net/slhc.c59
-rw-r--r--drivers/net/smc-mca.c1
-rw-r--r--drivers/net/smc-ultra.c1
-rw-r--r--drivers/net/smc-ultra32.c1
-rw-r--r--drivers/net/tlan.c2
-rw-r--r--drivers/net/tulip.c2090
-rw-r--r--drivers/net/via-rhine.c13
-rw-r--r--drivers/net/wd.c1
-rw-r--r--drivers/net/yellowfin.c17
-rw-r--r--drivers/net/z85230.c8
-rw-r--r--drivers/net/znet.c4
95 files changed, 21985 insertions, 7646 deletions
diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c
index 188de03d0..6c2a672ec 100644
--- a/drivers/net/3c501.c
+++ b/drivers/net/3c501.c
@@ -98,18 +98,18 @@ static const char *version =
#include <asm/bitops.h>
#include <asm/io.h>
+#include <asm/spinlock.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/init.h>
-#define BLOCKOUT_2
-
/* A zero-terminated list of I/O addresses to be probed.
The 3c501 can be at many locations, but here are the popular ones. */
-static unsigned int netcard_portlist[] __initdata =
- { 0x280, 0x300, 0};
+static unsigned int netcard_portlist[] __initdata = {
+ 0x280, 0x300, 0
+};
/*
@@ -140,10 +140,11 @@ static int el_debug = EL_DEBUG;
struct net_local
{
- struct net_device_stats stats;
- int tx_pkt_start; /* The length of the current Tx packet. */
- int collisions; /* Tx collisions this packet */
- int loading; /* Spot buffer load collisions */
+ struct net_device_stats stats;
+ int tx_pkt_start; /* The length of the current Tx packet. */
+ int collisions; /* Tx collisions this packet */
+ int loading; /* Spot buffer load collisions */
+ spinlock_t lock; /* Serializing lock */
};
@@ -238,6 +239,7 @@ __initfunc(int el1_probe(struct device *dev))
__initfunc(static int el1_probe1(struct device *dev, int ioaddr))
{
+ struct net_local *lp;
const char *mname; /* Vendor name */
unsigned char station_addr[6];
int autoirq = 0;
@@ -327,6 +329,9 @@ __initfunc(static int el1_probe1(struct device *dev, int ioaddr))
return -ENOMEM;
memset(dev->priv, 0, sizeof(struct net_local));
+ lp=dev->priv;
+ spin_lock_init(&lp->lock);
+
/*
* The EL1-specific entries in the device structure.
*/
@@ -398,24 +403,22 @@ static int el_start_xmit(struct sk_buff *skb, struct device *dev)
dev->trans_start = jiffies;
}
- save_flags(flags);
-
/*
* Avoid incoming interrupts between us flipping tbusy and flipping
* mode as the driver assumes tbusy is a faithful indicator of card
* state
*/
- cli();
-
+ spin_lock_irqsave(&lp->lock, flags);
+
/*
* Avoid timer-based retransmission conflicts.
*/
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
{
- restore_flags(flags);
- printk("%s: Transmitter access conflict.\n", dev->name);
+ spin_unlock_irqrestore(&lp->lock, flags);
+ printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
}
else
{
@@ -433,9 +436,6 @@ load_it_again_sam:
* mean no more interrupts can be pending on the card.
*/
-#ifdef BLOCKOUT_1
- disable_irq(dev->irq);
-#endif
outb_p(AX_SYS, AX_CMD);
inb_p(RX_STATUS);
inb_p(TX_STATUS);
@@ -447,24 +447,22 @@ load_it_again_sam:
* loading bytes into the board
*/
- restore_flags(flags);
+ spin_unlock_irqrestore(&lp->lock, flags);
+
outw(0x00, RX_BUF_CLR); /* Set rx packet area to 0. */
outw(gp_start, GP_LOW); /* aim - packet will be loaded into buffer start */
outsb(DATAPORT,buf,skb->len); /* load buffer (usual thing each byte increments the pointer) */
outw(gp_start, GP_LOW); /* the board reuses the same register */
-#ifndef BLOCKOUT_1
+
if(lp->loading==2) /* A receive upset our load, despite our best efforts */
{
if(el_debug>2)
printk("%s: burped during tx load.\n", dev->name);
+ spin_lock_irqsave(&lp->lock, flags);
goto load_it_again_sam; /* Sigh... */
}
-#endif
outb(AX_XMIT, AX_CMD); /* fire ... Trigger xmit. */
lp->loading=0;
-#ifdef BLOCKOUT_1
- enable_irq(dev->irq);
-#endif
dev->trans_start = jiffies;
}
@@ -489,13 +487,15 @@ static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (dev == NULL || dev->irq != irq)
{
- printk ("3c501 driver: irq %d for unknown device.\n", irq);
+ printk (KERN_ERR "3c501 driver: irq %d for unknown device.\n", irq);
return;
}
ioaddr = dev->base_addr;
lp = (struct net_local *)dev->priv;
+ spin_lock(&lp->lock);
+
/*
* What happened ?
*/
@@ -507,18 +507,13 @@ static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
*/
if (el_debug > 3)
- printk("%s: el_interrupt() aux=%#02x", dev->name, axsr);
+ printk(KERN_DEBUG "%s: el_interrupt() aux=%#02x", dev->name, axsr);
if (dev->interrupt)
- printk("%s: Reentering the interrupt driver!\n", dev->name);
+ printk(KERN_WARNING "%s: Reentering the interrupt driver!\n", dev->name);
dev->interrupt = 1;
-#ifndef BLOCKOUT_1
if(lp->loading==1 && !dev->tbusy)
- printk("%s: Inconsistent state loading while not in tx\n",
+ printk(KERN_WARNING "%s: Inconsistent state loading while not in tx\n",
dev->name);
-#endif
-#ifdef BLOCKOUT_3
- lp->loading=2; /* So we can spot loading interruptions */
-#endif
if (dev->tbusy)
{
@@ -529,21 +524,22 @@ static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
*/
int txsr = inb(TX_STATUS);
-#ifdef BLOCKOUT_2
+
if(lp->loading==1)
{
if(el_debug > 2)
{
- printk("%s: Interrupt while loading [", dev->name);
+ printk(KERN_DEBUG "%s: Interrupt while loading [", dev->name);
printk(" txsr=%02x gp=%04x rp=%04x]\n", txsr, inw(GP_LOW),inw(RX_LOW));
}
lp->loading=2; /* Force a reload */
dev->interrupt = 0;
+ spin_unlock(&lp->lock);
return;
}
-#endif
+
if (el_debug > 6)
- printk(" txsr=%02x gp=%04x rp=%04x", txsr, inw(GP_LOW),inw(RX_LOW));
+ printk(KERN_DEBUG " txsr=%02x gp=%04x rp=%04x", txsr, inw(GP_LOW),inw(RX_LOW));
if ((axsr & 0x80) && (txsr & TX_READY) == 0)
{
@@ -585,6 +581,7 @@ static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
outb(AX_XMIT, AX_CMD);
lp->stats.collisions++;
dev->interrupt = 0;
+ spin_unlock(&lp->lock);
return;
}
else
@@ -654,6 +651,7 @@ static void el_interrupt(int irq, void *dev_id, struct pt_regs *regs)
inb(RX_STATUS); /* Be certain that interrupts are cleared. */
inb(TX_STATUS);
dev->interrupt = 0;
+ spin_unlock(&lp->lock);
return;
}
diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c
index 75a2e37ad..9f922c43e 100644
--- a/drivers/net/3c503.c
+++ b/drivers/net/3c503.c
@@ -684,7 +684,6 @@ cleanup_module(void)
void *priv = dev->priv;
/* NB: el2_close() handles free_irq */
release_region(dev->base_addr, EL2_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c
index b8e9936f8..34edf2200 100644
--- a/drivers/net/3c505.c
+++ b/drivers/net/3c505.c
@@ -266,12 +266,12 @@ static inline unsigned int backlog_next(unsigned int n)
static inline int get_status(unsigned int base_addr)
{
- int timeout = jiffies + 10;
+ int timeout = jiffies + 10*HZ/100;
register int stat1;
do {
stat1 = inb_status(base_addr);
- } while (stat1 != inb_status(base_addr) && jiffies < timeout);
- if (jiffies >= timeout)
+ } while (stat1 != inb_status(base_addr) && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout))
TIMEOUT_MSG(__LINE__);
return stat1;
}
@@ -296,23 +296,23 @@ inline static void adapter_reset(struct device *dev)
if (inb_status(dev->base_addr) & ACRF) {
do {
inb_command(dev->base_addr);
- timeout = jiffies + 2;
- while ((jiffies <= timeout) && !(inb_status(dev->base_addr) & ACRF));
+ timeout = jiffies + 2*HZ/100;
+ while (time_before_eq(jiffies, timeout) && !(inb_status(dev->base_addr) & ACRF));
} while (inb_status(dev->base_addr) & ACRF);
set_hsf(dev, HSF_PCB_NAK);
}
outb_control(adapter->hcr_val | ATTN | DIR, dev);
- timeout = jiffies + 1;
- while (jiffies <= timeout);
+ timeout = jiffies + 1*HZ/100;
+ while (time_before_eq(jiffies, timeout));
outb_control(adapter->hcr_val & ~ATTN, dev);
- timeout = jiffies + 1;
- while (jiffies <= timeout);
+ timeout = jiffies + 1*HZ/100;
+ while (time_before_eq(jiffies, timeout));
outb_control(adapter->hcr_val | FLSH, dev);
- timeout = jiffies + 1;
- while (jiffies <= timeout);
+ timeout = jiffies + 1*HZ/100;
+ while (time_before_eq(jiffies, timeout));
outb_control(adapter->hcr_val & ~FLSH, dev);
- timeout = jiffies + 1;
- while (jiffies <= timeout);
+ timeout = jiffies + 1*HZ/100;
+ while (time_before_eq(jiffies, timeout));
outb_control(orig_hcr, dev);
if (!start_receive(dev, &adapter->tx_pcb))
@@ -326,7 +326,7 @@ inline static void adapter_reset(struct device *dev)
static inline void check_3c505_dma(struct device *dev)
{
elp_device *adapter = dev->priv;
- if (adapter->dmaing && (jiffies > (adapter->current_dma.start_time + 10))) {
+ if (adapter->dmaing && time_after(jiffies, adapter->current_dma.start_time + 10)) {
unsigned long flags, f;
printk("%s: DMA %s timed out, %d bytes left\n", dev->name, adapter->current_dma.direction ? "download" : "upload", get_dma_residue(dev->dma));
save_flags(flags);
@@ -350,7 +350,7 @@ static inline unsigned int send_pcb_slow(unsigned int base_addr, unsigned char b
{
unsigned int timeout;
outb_command(byte, base_addr);
- for (timeout = jiffies + 5; jiffies < timeout;) {
+ for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) {
if (inb_status(base_addr) & HCRE)
return FALSE;
}
@@ -448,7 +448,7 @@ static int send_pcb(struct device *dev, pcb_struct * pcb)
/* now wait for the acknowledgement */
sti();
- for (timeout = jiffies + 5; jiffies < timeout;) {
+ for (timeout = jiffies + 5*HZ/100; time_before(jiffies, timeout);) {
switch (GET_ASF(dev->base_addr)) {
case ASF_PCB_ACK:
adapter->send_pcb_semaphore = 0;
@@ -499,18 +499,18 @@ static int receive_pcb(struct device *dev, pcb_struct * pcb)
set_hsf(dev, 0);
/* get the command code */
- timeout = jiffies + 2;
- while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout);
- if (jiffies >= timeout) {
+ timeout = jiffies + 2*HZ/100;
+ while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout)) {
TIMEOUT_MSG(__LINE__);
return FALSE;
}
pcb->command = inb_command(dev->base_addr);
/* read the data length */
- timeout = jiffies + 3;
- while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && jiffies < timeout);
- if (jiffies >= timeout) {
+ timeout = jiffies + 3*HZ/100;
+ while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout)) {
TIMEOUT_MSG(__LINE__);
printk("%s: status %02x\n", dev->name, stat);
return FALSE;
@@ -738,8 +738,8 @@ static void elp_interrupt(int irq, void *dev_id, struct pt_regs *reg_ptr)
/*
* receive a PCB from the adapter
*/
- timeout = jiffies + 3;
- while ((inb_status(dev->base_addr) & ACRF) != 0 && jiffies < timeout) {
+ timeout = jiffies + 3*HZ/100;
+ while ((inb_status(dev->base_addr) & ACRF) != 0 && time_before(jiffies, timeout)) {
if (receive_pcb(dev, &adapter->irx_pcb)) {
switch (adapter->irx_pcb.command) {
case 0:
@@ -971,8 +971,8 @@ static int elp_open(struct device *dev)
printk("%s: couldn't send memory configuration command\n", dev->name);
else {
int timeout = jiffies + TIMEOUT;
- while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && jiffies < timeout);
- if (jiffies >= timeout)
+ while (adapter->got[CMD_CONFIGURE_ADAPTER_MEMORY] == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout))
TIMEOUT_MSG(__LINE__);
}
@@ -990,8 +990,8 @@ static int elp_open(struct device *dev)
printk("%s: couldn't send 82586 configure command\n", dev->name);
else {
int timeout = jiffies + TIMEOUT;
- while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout);
- if (jiffies >= timeout)
+ while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout))
TIMEOUT_MSG(__LINE__);
}
@@ -1177,8 +1177,8 @@ static struct net_device_stats *elp_get_stats(struct device *dev)
printk("%s: couldn't send get statistics command\n", dev->name);
else {
int timeout = jiffies + TIMEOUT;
- while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && jiffies < timeout);
- if (jiffies >= timeout) {
+ while (adapter->got[CMD_NETWORK_STATISTICS] == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout)) {
TIMEOUT_MSG(__LINE__);
return &adapter->stats;
}
@@ -1270,8 +1270,8 @@ static void elp_set_mc_list(struct device *dev)
printk("%s: couldn't send set_multicast command\n", dev->name);
else {
int timeout = jiffies + TIMEOUT;
- while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && jiffies < timeout);
- if (jiffies >= timeout) {
+ while (adapter->got[CMD_LOAD_MULTICAST_LIST] == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout)) {
TIMEOUT_MSG(__LINE__);
}
}
@@ -1294,8 +1294,8 @@ static void elp_set_mc_list(struct device *dev)
printk("%s: couldn't send 82586 configure command\n", dev->name);
else {
int timeout = jiffies + TIMEOUT;
- while (adapter->got[CMD_CONFIGURE_82586] == 0 && jiffies < timeout);
- if (jiffies >= timeout)
+ while (adapter->got[CMD_CONFIGURE_82586] == 0 && time_before(jiffies, timeout));
+ if (time_after_eq(jiffies, timeout))
TIMEOUT_MSG(__LINE__);
}
}
@@ -1371,8 +1371,8 @@ __initfunc(static int elp_sense(struct device *dev))
if (orig_HSR & DIR) {
/* If HCR.DIR is up, we pull it down. HSR.DIR should follow. */
outb(0, dev->base_addr + PORT_CONTROL);
- timeout = jiffies + 30;
- while (jiffies < timeout);
+ timeout = jiffies + 30*HZ/100;
+ while (time_before(jiffies, timeout));
restore_flags(flags);
if (inb_status(addr) & DIR) {
if (elp_debug > 0)
@@ -1382,8 +1382,8 @@ __initfunc(static int elp_sense(struct device *dev))
} else {
/* If HCR.DIR is down, we pull it up. HSR.DIR should follow. */
outb(DIR, dev->base_addr + PORT_CONTROL);
- timeout = jiffies + 30;
- while (jiffies < timeout);
+ timeout = jiffies + 30*HZ/100;
+ while (time_before(jiffies, timeout));
restore_flags(flags);
if (!(inb_status(addr) & DIR)) {
if (elp_debug > 0)
@@ -1479,13 +1479,13 @@ __initfunc(int elplus_probe(struct device *dev))
/* First try to write just one byte, to see if the card is
* responding at all normally.
*/
- timeout = jiffies + 5;
+ timeout = jiffies + 5*HZ/100;
okay = 0;
- while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE));
+ while (time_before(jiffies, timeout) && !(inb_status(dev->base_addr) & HCRE));
if ((inb_status(dev->base_addr) & HCRE)) {
outb_command(0, dev->base_addr); /* send a spurious byte */
- timeout = jiffies + 5;
- while (jiffies < timeout && !(inb_status(dev->base_addr) & HCRE));
+ timeout = jiffies + 5*HZ/100;
+ while (time_before(jiffies, timeout) && !(inb_status(dev->base_addr) & HCRE));
if (inb_status(dev->base_addr) & HCRE)
okay = 1;
}
@@ -1499,8 +1499,8 @@ __initfunc(int elplus_probe(struct device *dev))
* Give it the benefit of the doubt for 10 seconds.
*/
printk("assuming 3c505 still starting\n");
- timeout = jiffies + 10 * HZ;
- while (jiffies < timeout && (inb_status(dev->base_addr) & 7));
+ timeout = jiffies + 10*HZ;
+ while (time_before(jiffies, timeout) && (inb_status(dev->base_addr) & 7));
if (inb_status(dev->base_addr) & 7) {
printk("%s: 3c505 failed to start\n", dev->name);
} else {
diff --git a/drivers/net/3c509.c b/drivers/net/3c509.c
index 58a44182e..2b79709aa 100644
--- a/drivers/net/3c509.c
+++ b/drivers/net/3c509.c
@@ -63,6 +63,7 @@ static char *version = "3c509.c:1.12 6/4/97 becker@cesdis.gsfc.nasa.gov\n";
#include <asm/spinlock.h>
#include <asm/bitops.h>
#include <asm/io.h>
+#include <asm/irq.h>
#ifdef EL3_DEBUG
int el3_debug = EL3_DEBUG;
@@ -407,7 +408,7 @@ el3_open(struct device *dev)
/* Set the spinlock before grabbing IRQ! */
((struct el3_private *)dev->priv)->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
- if (request_irq(dev->irq, &el3_interrupt, 0, "3c509", dev)) {
+ if (request_irq(dev->irq, &el3_interrupt, 0, dev->name, dev)) {
return -EAGAIN;
}
@@ -526,10 +527,21 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
printk("%s: Transmitter access conflict.\n", dev->name);
else {
- unsigned long flags;
-
- /* Spin on the lock, until we're clear of an IRQ */
- spin_lock_irqsave(&lp->lock, flags);
+ /*
+ * We lock the driver against other processors. Note
+ * we don't need to lock versus the IRQ as we suspended
+ * that. This means that we lose the ability to take
+ * an RX during a TX upload. That sucks a bit with SMP
+ * on an original 3c509 (2K buffer)
+ *
+ * Using disable_irq stops us crapping on other
+ * time sensitive devices.
+ */
+
+#ifdef __SMP__
+ disable_irq(dev->irq);
+ spin_lock(&lp->lock);
+#endif
/* Put out the doubleword header... */
outw(skb->len, ioaddr + TX_FIFO);
@@ -547,8 +559,10 @@ el3_start_xmit(struct sk_buff *skb, struct device *dev)
} else
/* Interrupt us when the FIFO has room for max-sized packet. */
outw(SetTxThreshold + 1536, ioaddr + EL3_CMD);
-
- spin_unlock_irqrestore(&lp->lock, flags);
+#ifdef __SMP__
+ spin_unlock(&lp->lock);
+ enable_irq(dev->irq);
+#endif
}
dev_kfree_skb (skb);
@@ -658,10 +672,14 @@ el3_get_stats(struct device *dev)
struct el3_private *lp = (struct el3_private *)dev->priv;
unsigned long flags;
- save_flags(flags);
- cli();
+ /*
+ * This is fast enough not to bother with disable IRQ
+ * stuff.
+ */
+
+ spin_lock_irqsave(&lp->lock, flags);
update_stats(dev);
- restore_flags(flags);
+ spin_unlock_irqrestore(&lp->lock, flags);
return &lp->stats;
}
@@ -683,13 +701,13 @@ static void update_stats(struct device *dev)
EL3WINDOW(6);
lp->stats.tx_carrier_errors += inb(ioaddr + 0);
lp->stats.tx_heartbeat_errors += inb(ioaddr + 1);
- /* Multiple collisions. */ inb(ioaddr + 2);
- lp->stats.collisions += inb(ioaddr + 3);
- lp->stats.tx_window_errors += inb(ioaddr + 4);
- lp->stats.rx_fifo_errors += inb(ioaddr + 5);
- lp->stats.tx_packets += inb(ioaddr + 6);
- /* Rx packets */ inb(ioaddr + 7);
- /* Tx deferrals */ inb(ioaddr + 8);
+ /* Multiple collisions. */ inb(ioaddr + 2);
+ lp->stats.collisions += inb(ioaddr + 3);
+ lp->stats.tx_window_errors += inb(ioaddr + 4);
+ lp->stats.rx_fifo_errors += inb(ioaddr + 5);
+ lp->stats.tx_packets += inb(ioaddr + 6);
+ /* Rx packets */ inb(ioaddr + 7);
+ /* Tx deferrals */ inb(ioaddr + 8);
inw(ioaddr + 10); /* Total Rx and Tx octets. */
inw(ioaddr + 12);
diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c
index b74ca51e6..7dc831e58 100644
--- a/drivers/net/3c515.c
+++ b/drivers/net/3c515.c
@@ -39,16 +39,8 @@ static int max_interrupt_work = 20;
#define RX_RING_SIZE 16
#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
#include <linux/module.h>
#include <linux/version.h>
-#else
-#define MOD_INC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
#include <linux/kernel.h>
#include <linux/sched.h>
@@ -67,12 +59,9 @@ static int max_interrupt_work = 20;
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
-#if (LINUX_VERSION_CODE >= 0x10344)
+
#define NEW_MULTICAST
#include <linux/delay.h>
-#else
-#define udelay(microsec) do { int _i = 4*microsec; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
-#endif
/* Kernel version compatibility functions. */
#define RUN_AT(x) (jiffies + (x))
@@ -758,7 +747,7 @@ vortex_open(struct device *dev)
vp->tx_skbuff[i] = 0;
outl(0, ioaddr + DownListPtr);
}
- /* Set reciever mode: presumably accept b-case and phys addr only. */
+ /* Set receiver mode: presumably accept b-case and phys addr only. */
set_rx_mode(dev);
outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */
diff --git a/drivers/net/3c523.c b/drivers/net/3c523.c
index 968168d01..d907fe7f3 100644
--- a/drivers/net/3c523.c
+++ b/drivers/net/3c523.c
@@ -184,7 +184,7 @@ static void set_multicast_list(struct device *dev);
/* helper-functions */
static int init586(struct device *dev);
-static int check586(struct device *dev, char *where, unsigned size);
+static int check586(struct device *dev, unsigned long where, unsigned size);
static void alloc586(struct device *dev);
static void startrecv586(struct device *dev);
static void *alloc_rfa(struct device *dev, void *ptr);
@@ -311,19 +311,19 @@ static int elmc_open(struct device *dev)
* Check to see if there's an 82586 out there.
*/
-__initfunc(static int check586(struct device *dev, char *where, unsigned size))
+__initfunc(static int check586(struct device *dev, unsigned long where, unsigned size))
{
struct priv *p = (struct priv *) dev->priv;
char *iscp_addrs[2];
int i = 0;
- p->base = (unsigned long) where + size - 0x01000000;
- p->memtop = where + size;
- p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS);
+ p->base = where + size - 0x01000000;
+ p->memtop = phys_to_virt(where) + size;
+ p->scp = (struct scp_struct *)phys_to_virt(p->base + SCP_DEFAULT_ADDRESS);
memset((char *) p->scp, 0, sizeof(struct scp_struct));
p->scp->sysbus = SYSBUSVAL; /* 1 = 8Bit-Bus, 0 = 16 Bit */
- iscp_addrs[0] = where;
+ iscp_addrs[0] = phys_to_virt(where);
iscp_addrs[1] = (char *) p->scp - sizeof(struct iscp_struct);
for (i = 0; i < 2; i++) {
@@ -358,8 +358,8 @@ void alloc586(struct device *dev)
elmc_id_reset586();
DELAY(2);
- p->scp = (struct scp_struct *) (p->base + SCP_DEFAULT_ADDRESS);
- p->scb = (struct scb_struct *) (dev->mem_start);
+ p->scp = (struct scp_struct *) phys_to_virt(p->base + SCP_DEFAULT_ADDRESS);
+ p->scb = (struct scb_struct *) phys_to_virt(dev->mem_start);
p->iscp = (struct iscp_struct *) ((char *) p->scp - sizeof(struct iscp_struct));
memset((char *) p->iscp, 0, sizeof(struct iscp_struct));
@@ -521,9 +521,9 @@ __initfunc(int elmc_probe(struct device *dev))
/* The 3c523 has a 24K chunk of memory. The first 16K is the
shared memory, while the last 8K is for the EtherStart BIOS ROM.
Which we don't care much about here. We'll just tell Linux that
- we're using 16K. MCA won't permit adress space conflicts caused
+ we're using 16K. MCA won't permit address space conflicts caused
by not mapping the other 8K. */
- dev->mem_start = phys_to_virt(shm_table[(status & ELMC_STATUS_MEMORY_SELECT) >> 3]);
+ dev->mem_start = shm_table[(status & ELMC_STATUS_MEMORY_SELECT) >> 3];
/* We're using MCA, so it's a given that the information about memory
size is correct. The Crynwr drivers do something like this. */
@@ -531,7 +531,7 @@ __initfunc(int elmc_probe(struct device *dev))
elmc_id_reset586(); /* seems like a good idea before checking it... */
size = 0x4000; /* check for 16K mem */
- if (!check586(dev, (char *) dev->mem_start, size)) {
+ if (!check586(dev, dev->mem_start, size)) {
printk("%s: memprobe, Can't find memory at 0x%lx!\n", dev->name,
dev->mem_start);
release_region(dev->base_addr, ELMC_IO_EXTENT);
@@ -550,8 +550,7 @@ __initfunc(int elmc_probe(struct device *dev))
/* dump all the assorted information */
printk("%s: IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->name,
dev->irq, dev->if_port ? "ex" : "in",
- virt_to_phys(dev->mem_start),
- virt_to_phys(dev->mem_end - 1));
+ dev->mem_start, dev->mem_end - 1);
/* The hardware address for the 3c523 is stored in the first six
bytes of the IO address. */
@@ -628,7 +627,7 @@ static int init586(struct device *dev)
s = jiffies; /* warning: only active with interrupts on !! */
while (!(cfg_cmd->cmd_status & STAT_COMPL)) {
- if (jiffies - s > 30)
+ if (jiffies - s > 30*HZ/100)
break;
}
@@ -654,7 +653,7 @@ static int init586(struct device *dev)
s = jiffies;
while (!(ias_cmd->cmd_status & STAT_COMPL)) {
- if (jiffies - s > 30)
+ if (jiffies - s > 30*HZ/100)
break;
}
@@ -679,7 +678,7 @@ static int init586(struct device *dev)
s = jiffies;
while (!(tdr_cmd->cmd_status & STAT_COMPL)) {
- if (jiffies - s > 30) {
+ if (jiffies - s > 30*HZ/100) {
printk("%s: %d Problems while running the TDR.\n", dev->name, __LINE__);
result = 1;
break;
@@ -768,7 +767,7 @@ static int init586(struct device *dev)
elmc_id_attn586();
s = jiffies;
while (!(mc_cmd->cmd_status & STAT_COMPL)) {
- if (jiffies - s > 30)
+ if (jiffies - s > 30*HZ/100)
break;
}
if (!(mc_cmd->cmd_status & STAT_COMPL)) {
@@ -964,7 +963,7 @@ static void elmc_rcv_int(struct device *dev)
if (skb != NULL) {
skb->dev = dev;
skb_reserve(skb, 2); /* 16 byte alignment */
- memcpy(skb_put(skb, totlen), (char *) p->base + (unsigned long) rbd->buffer, totlen);
+ memcpy(skb_put(skb, totlen), (u8 *)phys_to_virt(p->base) + (unsigned long) rbd->buffer, totlen);
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
p->stats.rx_packets++;
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c
index 547d0497c..62f73cd71 100644
--- a/drivers/net/3c59x.c
+++ b/drivers/net/3c59x.c
@@ -15,18 +15,19 @@
*/
static char *version =
-"3c59x.c:v0.99E 5/12/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n";
+"3c59x.c:v0.99H 11/17/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html\n";
/* "Knobs" that adjust features and parameters. */
/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
Setting to > 1512 effectively disables this feature. */
-static const rx_copybreak = 200;
+static const int rx_copybreak = 200;
/* Allow setting MTU to a larger size, bypassing the normal ethernet setup. */
-static const mtu = 1500;
+static const int mtu = 1500;
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
static int max_interrupt_work = 20;
/* Put out somewhat more debugging messages. (0: no msg, 1 minimal .. 6). */
+#define vortex_debug debug
#ifdef VORTEX_DEBUG
static int vortex_debug = VORTEX_DEBUG;
#else
@@ -37,15 +38,6 @@ static int vortex_debug = 1;
debugging. */
static int rx_nocopy = 0, rx_copy = 0, queued_packet = 0, rx_csumhits;
-/* Enable the automatic media selection code -- usually set. */
-#define AUTOMEDIA 1
-
-/* Allow the use of fragment bus master transfers instead of only
- programmed-I/O for Vortex cards. Full-bus-master transfers are always
- enabled by default on Boomerang cards. If VORTEX_BUS_MASTER is defined,
- the feature may be turned on using 'options'. */
-#define VORTEX_BUS_MASTER
-
/* A few values that may be tweaked. */
/* Time in jiffies before concluding the transmitter is hung. */
#define TX_TIMEOUT ((400*HZ)/1000)
@@ -56,12 +48,12 @@ static int rx_nocopy = 0, rx_copy = 0, queued_packet = 0, rx_csumhits;
#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
#include <linux/config.h>
+#include <linux/version.h>
#ifdef MODULE
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>
-#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
@@ -70,41 +62,51 @@ static int rx_nocopy = 0, rx_copy = 0, queued_packet = 0, rx_csumhits;
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
-#include <linux/ptrace.h>
+#include <linux/timer.h>
#include <linux/errno.h>
#include <linux/in.h>
#include <linux/ioport.h>
#include <linux/malloc.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
-#include <linux/timer.h>
-
-#include <asm/byteorder.h>
-#include <asm/irq.h> /* For NR_IRQS only. */
-#include <asm/bitops.h>
-#include <asm/io.h>
-
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
+#if LINUX_VERSION_CODE < 0x20155 || defined(CARDBUS)
+#include <linux/bios32.h>
+#endif
+#include <asm/irq.h> /* For NR_IRQS only. */
+#include <asm/bitops.h>
+#include <asm/io.h>
-/* Kernel compatibility defines, common to David Hind's PCMCIA package.
+/* Kernel compatibility defines, some common to David Hinds' PCMCIA package.
This is only in the support-all-kernels source code. */
-#ifndef LINUX_VERSION_CODE
-#include <linux/version.h> /* Redundant above, here for easy clean-up. */
+
+#define RUN_AT(x) (jiffies + (x))
+
+#include <linux/delay.h>
+
+#if (LINUX_VERSION_CODE <= 0x20100)
+#ifndef __alpha__
+#define ioremap(a,b) \
+ (((a)<0x100000) ? (void *)((u_long)(a)) : vremap(a,b))
+#define iounmap(v) \
+ do { if ((u_long)(v) > 0x100000) vfree(v); } while (0)
#endif
-#if LINUX_VERSION_CODE < 0x10300
-#define RUN_AT(x) (x) /* What to put in timer->expires. */
-#define DEV_ALLOC_SKB(len) alloc_skb(len, GFP_ATOMIC)
-#if defined(__alpha)
-#error "The Alpha architecture is only support with kernel version 2.0."
#endif
-#define virt_to_bus(addr) ((unsigned long)addr)
-#define bus_to_virt(addr) ((void*)addr)
-#define NR_IRQS 16
-#else /* 1.3.0 and later */
-#define RUN_AT(x) (jiffies + (x))
-#define DEV_ALLOC_SKB(len) dev_alloc_skb(len)
+#if LINUX_VERSION_CODE <= 0x20139
+#define net_device_stats enet_statistics
+#define NETSTATS_VER2
+#endif
+#if LINUX_VERSION_CODE < 0x20138
+#define test_and_set_bit(val, addr) set_bit(val, addr)
+#define le32_to_cpu(val) (val)
+#define cpu_to_le32(val) (val)
+#endif
+#if LINUX_VERSION_CODE < 0x20155
+#define PCI_SUPPORT_VER1
+#else
+#define PCI_SUPPORT_VER2
#endif
#if LINUX_VERSION_CODE < 0x20159
#define DEV_FREE_SKB(skb) dev_kfree_skb (skb, FREE_WRITE);
@@ -112,27 +114,7 @@ static int rx_nocopy = 0, rx_copy = 0, queued_packet = 0, rx_csumhits;
#define DEV_FREE_SKB(skb) dev_kfree_skb(skb);
#endif
-#ifdef SA_SHIRQ
-#define FREE_IRQ(irqnum, dev) free_irq(irqnum, dev)
-#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance)
-#define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
-#else
-#define FREE_IRQ(irqnum, dev) free_irq(irqnum)
-#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n)
-#define IRQ(irq, dev_id, pt_regs) (irq, pt_regs)
-#endif
-
-#if (LINUX_VERSION_CODE >= 0x10344)
-#define NEW_MULTICAST
-#include <linux/delay.h>
-#else
-#define udelay(microsec) do { int _i = 4*microsec; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
-#endif
-
-#if LINUX_VERSION_CODE < 0x20138
-#define test_and_set_bit(val, addr) set_bit(val, addr)
-#endif
-#if defined(MODULE) && (LINUX_VERSION_CODE >= 0x20115)
+#if defined(MODULE) && LINUX_VERSION_CODE > 0x20115
MODULE_AUTHOR("Donald Becker <becker@cesdis.gsfc.nasa.gov>");
MODULE_DESCRIPTION("3Com 3c590/3c900 series Vortex/Boomerang driver");
MODULE_PARM(debug, "i");
@@ -142,7 +124,7 @@ MODULE_PARM(rx_copybreak, "i");
MODULE_PARM(max_interrupt_work, "i");
MODULE_PARM(compaq_ioaddr, "i");
MODULE_PARM(compaq_irq, "i");
-MODULE_PARM(compaq_prod_id, "i");
+MODULE_PARM(compaq_device_id, "i");
#endif
/* Operational parameter that usually are not changed. */
@@ -154,35 +136,11 @@ MODULE_PARM(compaq_prod_id, "i");
#define VORTEX_TOTAL_SIZE 0x20
#define BOOMERANG_TOTAL_SIZE 0x40
-#ifdef HAVE_DEVLIST
-struct netdev_entry tc59x_drv =
-{"Vortex", vortex_pci_probe, VORTEX_TOTAL_SIZE, NULL};
-#endif
-
/* Set iff a MII transceiver on any interface requires mdio preamble.
This only set with the original DP83840 on older 3c905 boards, so the extra
code size of a per-interface flag is not worthwhile. */
static char mii_preamble_required = 0;
-/* Caution! These entries must be consistent. */
-static const int product_ids[] = {
- 0x5900, 0x5920, 0x5970, 0x5950, 0x5951, 0x5952, 0x9000, 0x9001,
- 0x9050, 0x9051, 0x9055, 0x5057, 0 };
-static const char *product_names[] = {
- "3c590 Vortex 10Mbps",
- "3c592 EISA 10mbps Demon/Vortex",
- "3c597 EISA Fast Demon/Vortex",
- "3c595 Vortex 100baseTX",
- "3c595 Vortex 100baseT4",
- "3c595 Vortex 100base-MII",
- "3c900 Boomerang 10baseT",
- "3c900 Boomerang 10Mbps/Combo",
- "3c905 Boomerang 100baseTx",
- "3c905 Boomerang 100baseT4",
- "3c905B Cyclone 100baseTx",
- "3c575", /* Cardbus Boomerang */
-};
-
/*
Theory of Operation
@@ -193,17 +151,19 @@ XL, 3Com's PCI to 10/100baseT adapters. It also works with the 10Mbs
versions of the FastEtherLink cards. The supported product IDs are
3c590, 3c592, 3c595, 3c597, 3c900, 3c905
-The ISA 3c515 is supported with a seperate driver, 3c515.c, included with
-the kernel source or available from
+The related ISA 3c515 is supported with a separate driver, 3c515.c, included
+with the kernel source or available from
cesdis.gsfc.nasa.gov:/pub/linux/drivers/3c515.html
II. Board-specific settings
PCI bus devices are configured by the system at boot time, so no jumpers
need to be set on the board. The system BIOS should be set to assign the
-PCI INTA signal to an otherwise unused system IRQ line. While it's
-physically possible to shared PCI interrupt lines, the 1.2.0 kernel doesn't
-support it.
+PCI INTA signal to an otherwise unused system IRQ line.
+
+The EEPROM settings for media type and forced-full-duplex are observed.
+The EEPROM media type should be left at the default "autoselect" unless using
+10base2 or AUI connections which cannot be reliably detected.
III. Driver operation
@@ -211,10 +171,10 @@ The 3c59x series use an interface that's very similar to the previous 3c5x9
series. The primary interface is two programmed-I/O FIFOs, with an
alternate single-contiguous-region bus-master transfer (see next).
-The 3c900 "Boomerang" series uses a full-bus-master interface with seperate
+The 3c900 "Boomerang" series uses a full-bus-master interface with separate
lists of transmit and receive descriptors, similar to the AMD LANCE/PCnet,
DEC Tulip and Intel Speedo3. The first chip version retains a compatible
-programmed-I/O interface that will be removed in the 'B' and subsequent
+programmed-I/O interface that has been removed in 'B' and subsequent board
revisions.
One extension that is advertised in a very large font is that the adapters
@@ -232,7 +192,7 @@ packets may be reordered and receive buffer groups are associated with a
single frame.
With full-bus-master support, this driver uses a "RX_COPYBREAK" scheme.
-Tather than a fixed intermediate receive buffer, this scheme allocates
+Rather than a fixed intermediate receive buffer, this scheme allocates
full-sized skbuffs as receive buffers. The value RX_COPYBREAK is used as
the copying breakpoint: it is chosen to trade-off the memory wasted by
passing the full-sized skbuff to the queue layer for all frames vs. the
@@ -258,7 +218,66 @@ This driver only supports ethernet packets because of the skbuff allocation
limit of 4K.
*/
-#define TCOM_VENDOR_ID 0x10B7 /* 3Com's manufacturer's ID. */
+/* This table drives the PCI probe routines. It's mostly boilerplate in all
+ of the drivers, and will likely be provided by some future kernel.
+*/
+enum pci_flags_bit {
+ PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
+ PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3,
+};
+struct pci_id_info {
+ const char *name;
+ u16 vendor_id, device_id, device_id_mask, flags;
+ int drv_flags, io_size;
+ struct device *(*probe1)(int pci_bus, int pci_devfn, struct device *dev,
+ long ioaddr, int irq, int chip_idx, int fnd_cnt);
+};
+
+enum { IS_VORTEX=1, IS_BOOMERANG=2, IS_CYCLONE=4,
+ HAS_PWR_CTRL=0x10, HAS_MII=0x20, HAS_NWAY=0x40, HAS_CB_FNS=0x80, };
+static struct device *vortex_probe1(int pci_bus, int pci_devfn,
+ struct device *dev, long ioaddr,
+ int irq, int dev_id, int card_idx);
+static struct pci_id_info pci_tbl[] = {
+ {"3c590 Vortex 10Mbps", 0x10B7, 0x5900, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1},
+ {"3c595 Vortex 100baseTx", 0x10B7, 0x5950, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1},
+ {"3c595 Vortex 100baseT4", 0x10B7, 0x5951, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1},
+ {"3c595 Vortex 100base-MII", 0x10B7, 0x5952, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, vortex_probe1},
+ {"3Com Vortex", 0x10B7, 0x5900, 0xff00,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1},
+ {"3c900 Boomerang 10baseT", 0x10B7, 0x9000, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1},
+ {"3c900 Boomerang 10Mbps Combo", 0x10B7, 0x9001, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1},
+ {"3c900 Cyclone 10Mbps Combo", 0x10B7, 0x9005, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1},
+ {"3c900B-FL Cyclone 10base-FL", 0x10B7, 0x900A, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1},
+ {"3c905 Boomerang 100baseTx", 0x10B7, 0x9050, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1},
+ {"3c905 Boomerang 100baseT4", 0x10B7, 0x9051, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1},
+ {"3c905B Cyclone 100baseTx", 0x10B7, 0x9055, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY, 128, vortex_probe1},
+ {"3c905B-FX Cyclone 100baseFx", 0x10B7, 0x905A, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1},
+ {"3c980 Cyclone", 0x10B7, 0x9800, 0xfff0,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, vortex_probe1},
+ {"3c575 Boomerang CardBus", 0x10B7, 0x5057, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1},
+ {"3CCFE575 Cyclone CardBus", 0x10B7, 0x5157, 0xffff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS,
+ 128, vortex_probe1},
+ {"3c575 series CardBus (unknown version)", 0x10B7, 0x5057, 0xf0ff,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, vortex_probe1},
+ {"3Com Boomerang (unknown version)", 0x10B7, 0x9000, 0xff00,
+ PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, vortex_probe1},
+ {0,}, /* 0 terminated list. */
+};
/* Operational definitions.
These are not used by other compilation units and thus are not
@@ -287,7 +306,7 @@ enum vortex_cmd {
SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,
SetTxThreshold = 18<<11, SetTxStart = 19<<11,
StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11,
- StatsDisable = 22<<11, StopCoax = 23<<11,};
+ StatsDisable = 22<<11, StopCoax = 23<<11, SetFilterBit = 25<<11,};
/* The SetRxFilter command accepts the following classes: */
enum RxFilter {
@@ -327,26 +346,19 @@ enum eeprom_offset {
NodeAddr01=10, NodeAddr23=11, NodeAddr45=12,
DriverTune=13, Checksum=15};
+enum Window2 { /* Window 2. */
+ Wn2_ResetOptions=12,
+};
enum Window3 { /* Window 3: MAC/config bits. */
Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,
};
union wn3_config {
int i;
struct w3_config_fields {
-#if defined(__LITTLE_ENDIAN_BITFIELD)
unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2;
int pad8:8;
unsigned int ram_split:2, pad18:2, xcvr:4, autoselect:1;
int pad24:7;
-#elif defined(__BIG_ENDIAN_BITFIELD)
- unsigned int rom_size:2, ram_speed:2, ram_width:1, ram_size:3;
- int pad8:8;
- unsigned int xcvr:4, pad18:2, ram_split:2;
- int pad24:7;
- unsigned int autoselect:1;
-#else
-#error "Bitfield endianness not defined! Check your byteorder.h"
-#endif
} u;
};
@@ -404,37 +416,37 @@ enum tx_desc_status {
enum ChipCaps { CapBusMaster=0x20 };
struct vortex_private {
- char devname[8]; /* "ethN" string, also for kernel debug. */
- const char *product_name;
- struct device *next_module;
- /* The Rx and Tx rings are here to keep them quad-word-aligned. */
+ /* The Rx and Tx rings should be quad-word-aligned. */
struct boom_rx_desc rx_ring[RX_RING_SIZE];
struct boom_tx_desc tx_ring[TX_RING_SIZE];
/* The addresses of transmit- and receive-in-place skbuffs. */
struct sk_buff* rx_skbuff[RX_RING_SIZE];
struct sk_buff* tx_skbuff[TX_RING_SIZE];
+ struct device *next_module;
+ void *priv_addr;
unsigned int cur_rx, cur_tx; /* The next free ring entry */
unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
- struct enet_statistics stats;
+ struct net_device_stats stats;
struct sk_buff *tx_skb; /* Packet being eaten by bus master ctrl. */
/* PCI configuration space information. */
- u8 pci_bus, pci_dev_fn; /* PCI bus location, for power management. */
- u16 pci_device_id;
+ u8 pci_bus, pci_devfn; /* PCI bus location, for power management. */
+ char *cb_fn_base; /* CardBus function status addr space. */
+ int chip_id;
/* The remainder are related to chip state, mostly media selection. */
- int in_interrupt;
+ unsigned long in_interrupt;
struct timer_list timer; /* Media selection timer. */
int options; /* User-settable misc. driver options. */
- unsigned int
- media_override:3, /* Passed-in media type. */
- default_media:3, /* Read from the EEPROM/Wn3_Config. */
- full_duplex:1, autoselect:1,
- bus_master:1, /* Vortex can only do a fragment bus-m. */
- full_bus_master_tx:1, full_bus_master_rx:2, /* Boomerang */
- hw_csums:1, /* Has hardware checksums. */
- tx_full:1;
+ unsigned int media_override:3, /* Passed-in media type. */
+ default_media:4, /* Read from the EEPROM/Wn3_Config. */
+ full_duplex:1, force_fd:1, autoselect:1,
+ bus_master:1, /* Vortex can only do a fragment bus-m. */
+ full_bus_master_tx:1, full_bus_master_rx:2, /* Boomerang */
+ hw_csums:1, /* Has hardware checksums. */
+ tx_full:1;
u16 status_enable;
+ u16 intr_enable;
u16 available_media; /* From Wn3_Options. */
u16 capabilities, info1, info2; /* Various, from EEPROM. */
u16 advertising; /* NWay media advertisement */
@@ -469,61 +481,39 @@ static struct media_table {
{ "Default", 0, 0xFF, XCVR_10baseT, 10000},
};
-static int vortex_scan(struct device *dev);
-static struct device *vortex_found_device(struct device *dev, int ioaddr,
- int irq, int device_id,
- int options, int card_idx);
-static int vortex_probe1(struct device *dev);
-static int vortex_open(struct device *dev);
-static void mdio_sync(int ioaddr, int bits);
-static int mdio_read(int ioaddr, int phy_id, int location);
-#ifdef HAVE_PRIVATE_IOCTL
-static void mdio_write(int ioaddr, int phy_id, int location, int value);
+#ifndef CARDBUS
+static int vortex_scan(struct device *dev, struct pci_id_info pci_tbl[]);
#endif
+static int vortex_open(struct device *dev);
+static void mdio_sync(long ioaddr, int bits);
+static int mdio_read(long ioaddr, int phy_id, int location);
+static void mdio_write(long ioaddr, int phy_id, int location, int value);
static void vortex_timer(unsigned long arg);
static int vortex_start_xmit(struct sk_buff *skb, struct device *dev);
static int boomerang_start_xmit(struct sk_buff *skb, struct device *dev);
static int vortex_rx(struct device *dev);
static int boomerang_rx(struct device *dev);
-static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs);
+static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static int vortex_close(struct device *dev);
-static void update_stats(int addr, struct device *dev);
-static struct enet_statistics *vortex_get_stats(struct device *dev);
+static void update_stats(long ioaddr, struct device *dev);
+static struct net_device_stats *vortex_get_stats(struct device *dev);
static void set_rx_mode(struct device *dev);
-#ifdef HAVE_PRIVATE_IOCTL
static int vortex_ioctl(struct device *dev, struct ifreq *rq, int cmd);
-#endif
-#ifndef NEW_MULTICAST
-static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
-#endif
-/* Unlike the other PCI cards the 59x cards don't need a large contiguous
- memory region, so making the driver a loadable module is feasible.
-
- Unfortunately maximizing the shared code between the integrated and
- module version of the driver results in a complicated set of initialization
- procedures.
- init_module() -- modules / tc59x_init() -- built-in
- The wrappers for vortex_scan()
- vortex_scan() The common routine that scans for PCI and EISA cards
- vortex_found_device() Allocate a device structure when we find a card.
- Different versions exist for modules and built-in.
- vortex_probe1() Fill in the device structure -- this is separated
- so that the modules code can put it in dev->init.
-*/
/* This driver uses 'options' to pass the media type, full-duplex flag, etc. */
-/* Note: this is the only limit on the number of cards supported!! */
-static int options[8] = { -1, -1, -1, -1, -1, -1, -1, -1,};
-static int full_duplex[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
+/* Option count limit only -- unlimited interfaces are supported. */
+#define MAX_UNITS 8
+static int options[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1,};
+static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
/* A list of all installed Vortex devices, for removing the driver module. */
static struct device *root_vortex_dev = NULL;
#ifdef MODULE
+#ifndef CARDBUS
/* Variables to work-around the Compaq PCI BIOS32 problem. */
static int compaq_ioaddr = 0, compaq_irq = 0, compaq_device_id = 0x5900;
-
-static int debug = -1;
+#endif
#ifdef CARDBUS
@@ -531,19 +521,38 @@ static int debug = -1;
static dev_node_t *vortex_attach(dev_locator_t *loc)
{
- u16 dev_id;
+ u16 dev_id, vendor_id;
u32 io;
u8 bus, devfn, irq;
struct device *dev;
+ int chip_idx;
if (loc->bus != LOC_PCI) return NULL;
bus = loc->b.pci.bus; devfn = loc->b.pci.devfn;
- printk(KERN_INFO "vortex_attach(bus %d, function %d)\n", bus, devfn);
pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io);
pcibios_read_config_byte(bus, devfn, PCI_INTERRUPT_LINE, &irq);
+ pcibios_read_config_word(bus, devfn, PCI_VENDOR_ID, &vendor_id);
pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id);
+ printk(KERN_INFO "vortex_attach(bus %d, function %d, device %4.4x)\n",
+ bus, devfn, dev_id);
io &= ~3;
- dev = vortex_found_device(NULL, io, irq, dev_id, 0, -1);
+ if (io == 0 || irq == 0) {
+ printk(KERN_ERR "The 3Com CardBus Ethernet interface was not "
+ "assigned an %s.\n" KERN_ERR " It will not be activated.\n",
+ io == 0 ? "I/O address" : "IRQ");
+ return NULL;
+ }
+ for (chip_idx = 0; pci_tbl[chip_idx].vendor_id; chip_idx++)
+ if (vendor_id == pci_tbl[chip_idx].vendor_id
+ && (dev_id & pci_tbl[chip_idx].device_id_mask) ==
+ pci_tbl[chip_idx].device_id)
+ break;
+ if (pci_tbl[chip_idx].vendor_id == 0) { /* Compiled out! */
+ printk(KERN_INFO "Unable to match chip type %4.4x %4.4x in "
+ "vortex_attach().\n", vendor_id, dev_id);
+ return NULL;
+ }
+ dev = vortex_probe1(bus, devfn, NULL, io, irq, chip_idx, MAX_UNITS+1);
if (dev) {
dev_node_t *node = kmalloc(sizeof(dev_node_t), GFP_KERNEL);
strcpy(node->dev_name, dev->name);
@@ -565,61 +574,52 @@ static void vortex_detach(dev_node_t *node)
}
if (*devp) {
struct device *dev = *devp;
+ struct vortex_private *vp = dev->priv;
if (dev->flags & IFF_UP)
vortex_close(dev);
dev->flags &= ~(IFF_UP|IFF_RUNNING);
unregister_netdev(dev);
+ if (vp->cb_fn_base) iounmap(vp->cb_fn_base);
kfree(dev);
*devp = *next;
+ kfree(vp);
kfree(node);
MOD_DEC_USE_COUNT;
}
}
struct driver_operations vortex_ops = {
- "3c59x_cb", vortex_attach, NULL, NULL, vortex_detach
+ "3c575_cb", vortex_attach, NULL, NULL, vortex_detach
};
#endif /* Cardbus support */
-int
-init_module(void)
+int init_module(void)
{
- if (debug >= 0)
- vortex_debug = debug;
if (vortex_debug)
- printk(version);
-
- root_vortex_dev = NULL;
+ printk(KERN_INFO "%s", version);
#ifdef CARDBUS
register_driver(&vortex_ops);
return 0;
#else
- {
- int cards_found = vortex_scan(0);
- if (cards_found == 0)
- printk("No 3Com Vortex/Boomerang cards found.\n");
- return cards_found ? 0 : -ENODEV;
- }
+ return vortex_scan(0, pci_tbl);
#endif
}
#else
int tc59x_probe(struct device *dev)
{
- int cards_found = 0;
-
- cards_found = vortex_scan(dev);
-
- if (vortex_debug > 0 && cards_found)
- printk(version);
-
- return cards_found ? 0 : -ENODEV;
+ static int scanned=0;
+ if(scanned++)
+ return -ENODEV;
+ printk(KERN_INFO "%s", version);
+ return vortex_scan(dev, pci_tbl);
}
#endif /* not MODULE */
-static int vortex_scan(struct device *dev)
+#ifndef CARDBUS
+static int vortex_scan(struct device *dev, struct pci_id_info pci_tbl[])
{
int cards_found = 0;
@@ -634,25 +634,30 @@ static int vortex_scan(struct device *dev)
unsigned char pci_bus, pci_device_fn;
for (;pci_index < 0xff; pci_index++) {
- u8 pci_latency;
- u16 pci_command, new_command, vendor, device;
- int irq;
+ u16 vendor, device, pci_command, new_command, pwr_cmd;
+ int chip_idx, irq;
long ioaddr;
- if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
- pci_index, &pci_bus, &pci_device_fn)
+ if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8, pci_index,
+ &pci_bus, &pci_device_fn)
!= PCIBIOS_SUCCESSFUL)
break;
pcibios_read_config_word(pci_bus, pci_device_fn,
PCI_VENDOR_ID, &vendor);
pcibios_read_config_word(pci_bus, pci_device_fn,
PCI_DEVICE_ID, &device);
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_COMMAND, &pci_command);
+ for (chip_idx = 0; pci_tbl[chip_idx].vendor_id; chip_idx++)
+ if (vendor == pci_tbl[chip_idx].vendor_id
+ && (device & pci_tbl[chip_idx].device_id_mask) ==
+ pci_tbl[chip_idx].device_id)
+ break;
+ if (pci_tbl[chip_idx].vendor_id == 0) /* Compiled out! */
+ continue;
+
{
#if LINUX_VERSION_CODE >= 0x20155
struct pci_dev *pdev = pci_find_slot(pci_bus, pci_device_fn);
- ioaddr = pdev->base_address[0];
+ ioaddr = pdev->base_address[0] & ~3;
irq = pdev->irq;
#else
u32 pci_ioaddr;
@@ -661,15 +666,28 @@ static int vortex_scan(struct device *dev)
PCI_INTERRUPT_LINE, &pci_irq_line);
pcibios_read_config_dword(pci_bus, pci_device_fn,
PCI_BASE_ADDRESS_0, &pci_ioaddr);
- ioaddr = pci_ioaddr;
+ ioaddr = pci_ioaddr & ~3;;
irq = pci_irq_line;
#endif
}
- /* Remove I/O space marker in bit 0. */
- ioaddr &= ~3;
- if (vendor != TCOM_VENDOR_ID)
- continue;
+ /* Power-up the card. */
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ 0xe0, &pwr_cmd);
+ if (pwr_cmd & 0x3) {
+ /* Save the ioaddr and IRQ info! */
+ printk(KERN_INFO " A 3Com network adapter is powered down!"
+ " Setting the power state %4.4x->%4.4x.\n",
+ pwr_cmd, pwr_cmd & ~3);
+ pcibios_write_config_word(pci_bus, pci_device_fn,
+ 0xe0, pwr_cmd & ~3);
+ printk(KERN_INFO " Setting the IRQ to %d, IOADDR to %#lx.\n",
+ irq, ioaddr);
+ pcibios_write_config_byte(pci_bus, pci_device_fn,
+ PCI_INTERRUPT_LINE, irq);
+ pcibios_write_config_dword(pci_bus, pci_device_fn,
+ PCI_BASE_ADDRESS_0, ioaddr);
+ }
if (ioaddr == 0) {
printk(KERN_WARNING " A 3Com network adapter has been found, "
@@ -679,34 +697,31 @@ static int vortex_scan(struct device *dev)
continue;
}
- if (check_region(ioaddr, VORTEX_TOTAL_SIZE))
+ if (check_region(ioaddr, pci_tbl[chip_idx].io_size))
continue;
/* Activate the card. */
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, &pci_command);
new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
if (pci_command != new_command) {
- printk(KERN_INFO " The PCI BIOS has not enabled this"
- " device! Updating PCI command %4.4x->%4.4x.\n",
- pci_command, new_command);
+ printk(KERN_INFO " The PCI BIOS has not enabled the device "
+ "at %d/%d. Updating PCI command %4.4x->%4.4x.\n",
+ pci_bus, pci_device_fn, pci_command, new_command);
pcibios_write_config_word(pci_bus, pci_device_fn,
PCI_COMMAND, new_command);
}
- dev = vortex_found_device(dev, ioaddr, irq,
- device, dev && dev->mem_start
- ? dev->mem_start : options[cards_found],
- cards_found);
+ dev = vortex_probe1(pci_bus, pci_device_fn, dev, ioaddr, irq,
+ chip_idx, cards_found);
if (dev) {
- struct vortex_private *vp = (struct vortex_private *)dev->priv;
/* Get and check the latency values. On the 3c590 series
the latency timer must be set to the maximum value to avoid
data corruption that occurs when the timer expires during
a transfer -- a bug in the Vortex chip only. */
- u8 new_latency = (device&0xff00) == 0x5900 ? 248 : 32;
- vp->pci_bus = pci_bus;
- vp->pci_dev_fn = pci_device_fn;
- vp->pci_device_id = device;
+ u8 pci_latency;
+ u8 new_latency = (device & 0xff00) == 0x5900 ? 248 : 32;
pcibios_read_config_byte(pci_bus, pci_device_fn,
PCI_LATENCY_TIMER, &pci_latency);
@@ -726,7 +741,7 @@ static int vortex_scan(struct device *dev)
/* Now check all slots of the EISA bus. */
if (EISA_bus) {
- static int ioaddr = 0x1000;
+ static long ioaddr = 0x1000;
for ( ; ioaddr < 0x9000; ioaddr += 0x1000) {
int device_id;
if (check_region(ioaddr, VORTEX_TOTAL_SIZE))
@@ -738,10 +753,8 @@ static int vortex_scan(struct device *dev)
device_id = (inb(ioaddr + 0xC82)<<8) + inb(ioaddr + 0xC83);
if ((device_id & 0xFF00) != 0x5900)
continue;
- vortex_found_device(dev, ioaddr, inw(ioaddr + 0xC88) >> 12,
- device_id, dev && dev->mem_start
- ? dev->mem_start : options[cards_found],
- cards_found);
+ vortex_probe1(0, 0, dev, ioaddr, inw(ioaddr + 0xC88) >> 12,
+ 4, cards_found);
dev = 0;
cards_found++;
}
@@ -750,97 +763,58 @@ static int vortex_scan(struct device *dev)
#ifdef MODULE
/* Special code to work-around the Compaq PCI BIOS32 problem. */
if (compaq_ioaddr) {
- vortex_found_device(dev, compaq_ioaddr, compaq_irq, compaq_device_id,
- dev && dev->mem_start ? dev->mem_start
- : options[cards_found], cards_found);
- cards_found++;
+ vortex_probe1(0, 0, dev, compaq_ioaddr, compaq_irq,
+ compaq_device_id, cards_found++);
dev = 0;
}
#endif
- /* 3c515 cards are now supported by the 3c515.c driver. */
-
- return cards_found;
+ return cards_found ? 0 : -ENODEV;
}
+#endif /* ! Cardbus */
-static struct device *
-vortex_found_device(struct device *dev, int ioaddr, int irq,
- int device_id, int option, int card_idx)
+static struct device *vortex_probe1(int pci_bus, int pci_devfn,
+ struct device *dev, long ioaddr,
+ int irq, int chip_idx, int card_idx)
{
struct vortex_private *vp;
- const char *product_name;
- int board_index = 0;
+ int option;
+ unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
+ int i;
- for (board_index = 0; product_ids[board_index]; board_index++) {
- if (device_id == product_ids[board_index])
- break;
- }
- /* Handle products we don't recognize, but might still work with. */
- if (product_ids[board_index])
- product_name = product_names[board_index];
- else if ((device_id & 0xff00) == 0x5900)
- product_name = "3c590 Vortex";
- else if ((device_id & 0xfff0) == 0x9000)
- product_name = "3c900";
- else if ((device_id & 0xfff0) == 0x9050)
- product_name = "3c905";
- else {
- printk(KERN_WARNING "Unknown 3Com PCI ethernet adapter type %4.4x detected:"
- " not configured.\n", device_id);
- return 0;
- }
+ dev = init_etherdev(dev, 0);
-#ifdef MODULE
- /* Allocate and fill new device structure. */
- {
- int dev_size = sizeof(struct device) +
- sizeof(struct vortex_private) + 15; /* Pad for alignment */
+ printk(KERN_INFO "%s: 3Com %s at 0x%lx, ",
+ dev->name, pci_tbl[chip_idx].name, ioaddr);
- dev = (struct device *) kmalloc(dev_size, GFP_KERNEL);
- memset(dev, 0, dev_size);
- }
- /* Align the Rx and Tx ring entries. */
- dev->priv = (void *)(((long)dev + sizeof(struct device) + 15) & ~15);
- vp = (struct vortex_private *)dev->priv;
- dev->name = vp->devname; /* An empty string. */
dev->base_addr = ioaddr;
dev->irq = irq;
- dev->init = vortex_probe1;
- vp->product_name = product_name;
- vp->options = option;
- if (card_idx >= 0) {
- if (full_duplex[card_idx] >= 0)
- vp->full_duplex = full_duplex[card_idx];
- } else
- vp->full_duplex = (option > 0 && (option & 0x10) ? 1 : 0);
+ dev->mtu = mtu;
- if (option > 0) {
- vp->media_override = ((option & 7) == XCVR_10baseTOnly) ?
- XCVR_10baseT : option & 7;
- vp->bus_master = (option & 16) ? 1 : 0;
- } else {
- vp->media_override = 7;
- vp->bus_master = 0;
+ /* Make certain the descriptor lists are aligned. */
+ {
+ void *mem = kmalloc(sizeof(*vp) + 15, GFP_KERNEL);
+ vp = (void *)(((long)mem + 15) & ~15);
+ vp->priv_addr = mem;
}
- ether_setup(dev);
+ memset(vp, 0, sizeof(*vp));
+ dev->priv = vp;
+
vp->next_module = root_vortex_dev;
root_vortex_dev = dev;
- if (register_netdev(dev) != 0)
- return 0;
-#else /* not a MODULE */
- if (dev) {
- /* Caution: quad-word alignment required for rings! */
- dev->priv = kmalloc(sizeof (struct vortex_private), GFP_KERNEL);
- memset(dev->priv, 0, sizeof (struct vortex_private));
- }
- dev = init_etherdev(dev, sizeof(struct vortex_private));
- dev->base_addr = ioaddr;
- dev->irq = irq;
- dev->mtu = mtu;
- vp = (struct vortex_private *)dev->priv;
- vp->product_name = product_name;
- vp->options = option;
+ vp->chip_id = chip_idx;
+ vp->pci_bus = pci_bus;
+ vp->pci_devfn = pci_devfn;
+
+ /* The lower four bits are the media type. */
+ if (dev->mem_start)
+ option = dev->mem_start;
+ else if (card_idx < MAX_UNITS)
+ option = options[card_idx];
+ else
+ option = -1;
+
if (option >= 0) {
vp->media_override = ((option & 7) == 2) ? 0 : option & 7;
vp->full_duplex = (option & 8) ? 1 : 0;
@@ -850,22 +824,11 @@ vortex_found_device(struct device *dev, int ioaddr, int irq,
vp->full_duplex = 0;
vp->bus_master = 0;
}
+ if (card_idx < MAX_UNITS && full_duplex[card_idx] > 0)
+ vp->full_duplex = 1;
- vortex_probe1(dev);
-#endif /* MODULE */
- return dev;
-}
-
-static int vortex_probe1(struct device *dev)
-{
- int ioaddr = dev->base_addr;
- struct vortex_private *vp = (struct vortex_private *)dev->priv;
- u16 *ether_addr = (u16 *)dev->dev_addr;
- unsigned int eeprom[0x40], checksum = 0; /* EEPROM contents */
- int i;
-
- printk(KERN_INFO "%s: 3Com %s at %#3x,",
- dev->name, vp->product_name, ioaddr);
+ vp->force_fd = vp->full_duplex;
+ vp->options = option;
/* Read the station address from the EEPROM. */
EL3WINDOW(0);
@@ -896,14 +859,30 @@ static int vortex_probe1(struct device *dev)
printk(" ***INVALID CHECKSUM %4.4x*** ", checksum);
for (i = 0; i < 3; i++)
- ether_addr[i] = htons(eeprom[i + 10]);
+ ((u16 *)dev->dev_addr)[i] = htons(eeprom[i + 10]);
for (i = 0; i < 6; i++)
printk("%c%2.2x", i ? ':' : ' ', dev->dev_addr[i]);
+#ifdef __sparc__
+ printk(", IRQ %s\n", __irq_itoa(dev->irq));
+#else
printk(", IRQ %d\n", dev->irq);
/* Tell them about an invalid IRQ. */
if (vortex_debug && (dev->irq <= 0 || dev->irq >= NR_IRQS))
printk(KERN_WARNING " *** Warning: IRQ %d is unlikely to work! ***\n",
dev->irq);
+#endif
+
+ if (pci_tbl[vp->chip_id].drv_flags & HAS_CB_FNS) {
+ u32 fn_st_addr; /* Cardbus function status space */
+ pcibios_read_config_dword(pci_bus, pci_devfn, PCI_BASE_ADDRESS_2,
+ &fn_st_addr);
+ if (fn_st_addr)
+ vp->cb_fn_base = ioremap(fn_st_addr & ~3, 128);
+ printk("%s: CardBus functions mapped %8.8x->%p (PCMCIA committee"
+ " brain-damage).\n", dev->name, fn_st_addr, vp->cb_fn_base);
+ EL3WINDOW(2);
+ outw(0x10 | inw(ioaddr + Wn2_ResetOptions), ioaddr + Wn2_ResetOptions);
+ }
/* Extract our information from the EEPROM data. */
vp->info1 = eeprom[13];
@@ -929,7 +908,7 @@ static int vortex_probe1(struct device *dev)
config.u.ram_width ? "word" : "byte",
ram_split[config.u.ram_split],
config.u.autoselect ? "autoselect/" : "",
- config.u.xcvr ? "NWay Autonegotiation" :
+ config.u.xcvr > XCVR_ExtMII ? "<invalid transceiver>" :
media_tbl[config.u.xcvr].name);
vp->default_media = config.u.xcvr;
vp->autoselect = config.u.autoselect;
@@ -942,22 +921,24 @@ static int vortex_probe1(struct device *dev)
} else
dev->if_port = vp->default_media;
- if (dev->if_port == XCVR_MII) {
+ if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
int phy, phy_idx = 0;
EL3WINDOW(4);
- for (phy = 0; phy < 32 && phy_idx < sizeof(vp->phys); phy++) {
- int mii_status;
- mdio_sync(ioaddr, 32);
- mii_status = mdio_read(ioaddr, phy, 1);
+ mii_preamble_required++;
+ mii_preamble_required++;
+ mdio_read(ioaddr, 24, 1);
+ for (phy = 1; phy <= 32 && phy_idx < sizeof(vp->phys); phy++) {
+ int mii_status, phyx = phy & 0x1f;
+ mii_status = mdio_read(ioaddr, phyx, 1);
if (mii_status && mii_status != 0xffff) {
- vp->phys[phy_idx++] = phy;
- printk(KERN_INFO " MII transceiver found at address %d, status %4x.\n",
- phy, mii_status);
- mdio_sync(ioaddr, 32);
- if ((mdio_read(ioaddr, phy, 1) & 0x0040) == 0)
- mii_preamble_required = 1;
+ vp->phys[phy_idx++] = phyx;
+ printk(KERN_INFO " MII transceiver found at address %d,"
+ " status %4x.\n", phyx, mii_status);
+ if ((mii_status & 0x0040) == 0)
+ mii_preamble_required++;
}
}
+ mii_preamble_required--;
if (phy_idx == 0) {
printk(KERN_WARNING" ***WARNING*** No MII transceivers found!\n");
vp->phys[0] = 24;
@@ -965,7 +946,7 @@ static int vortex_probe1(struct device *dev)
vp->advertising = mdio_read(ioaddr, vp->phys[0], 4);
if (vp->full_duplex) {
/* Only advertise the FD media types. */
- vp->advertising &= 0x015F;
+ vp->advertising &= ~0x02A0;
mdio_write(ioaddr, vp->phys[0], 4, vp->advertising);
}
}
@@ -979,30 +960,24 @@ static int vortex_probe1(struct device *dev)
}
/* We do a request_region() to register /proc/ioports info. */
- request_region(ioaddr, VORTEX_TOTAL_SIZE, vp->product_name);
+ request_region(ioaddr, pci_tbl[chip_idx].io_size, dev->name);
/* The 3c59x-specific entries in the device structure. */
dev->open = &vortex_open;
dev->hard_start_xmit = &vortex_start_xmit;
dev->stop = &vortex_close;
dev->get_stats = &vortex_get_stats;
-#ifdef HAVE_PRIVATE_IOCTL
dev->do_ioctl = &vortex_ioctl;
-#endif
-#ifdef NEW_MULTICAST
dev->set_multicast_list = &set_rx_mode;
-#else
- dev->set_multicast_list = &set_multicast_list;
-#endif
- return 0;
+ return dev;
}
static int
vortex_open(struct device *dev)
{
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
struct vortex_private *vp = (struct vortex_private *)dev->priv;
union wn3_config config;
int i;
@@ -1017,28 +992,31 @@ vortex_open(struct device *dev)
dev->name, vp->media_override,
media_tbl[vp->media_override].name);
dev->if_port = vp->media_override;
+ } else if (vp->autoselect && pci_tbl[vp->chip_id].drv_flags & HAS_NWAY) {
+ dev->if_port = XCVR_NWAY;
} else if (vp->autoselect) {
/* Find first available media type, starting with 100baseTx. */
dev->if_port = XCVR_100baseTx;
while (! (vp->available_media & media_tbl[dev->if_port].mask))
dev->if_port = media_tbl[dev->if_port].next;
-
- if (vortex_debug > 1)
- printk(KERN_DEBUG "%s: Initial media type %s.\n",
- dev->name, media_tbl[dev->if_port].name);
-
- init_timer(&vp->timer);
- vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
- vp->timer.data = (unsigned long)dev;
- vp->timer.function = &vortex_timer; /* timer handler */
- add_timer(&vp->timer);
} else
dev->if_port = vp->default_media;
+ init_timer(&vp->timer);
+ vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
+ vp->timer.data = (unsigned long)dev;
+ vp->timer.function = &vortex_timer; /* timer handler */
+ add_timer(&vp->timer);
+
+ if (vortex_debug > 1)
+ printk(KERN_DEBUG "%s: Initial media type %s.\n",
+ dev->name, media_tbl[dev->if_port].name);
+
+ vp->full_duplex = vp->force_fd;
config.u.xcvr = dev->if_port;
outl(config.i, ioaddr + Wn3_Config);
- if (dev->if_port == XCVR_MII) {
+ if (dev->if_port == XCVR_MII || dev->if_port == XCVR_NWAY) {
int mii_reg1, mii_reg5;
EL3WINDOW(4);
/* Read BMSR (reg1) only to clear old status. */
@@ -1078,20 +1056,10 @@ vortex_open(struct device *dev)
outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD);
-#ifdef SA_SHIRQ
/* Use the now-standard shared IRQ implementation. */
if (request_irq(dev->irq, &vortex_interrupt, SA_SHIRQ, dev->name, dev)) {
return -EAGAIN;
}
-#else
- if (dev->irq == 0 || irq2dev_map[dev->irq] != NULL)
- return -EAGAIN;
- irq2dev_map[dev->irq] = dev;
- if (request_irq(dev->irq, &vortex_interrupt, 0, vp->product_name)) {
- irq2dev_map[dev->irq] = NULL;
- return -EAGAIN;
- }
-#endif
if (vortex_debug > 1) {
EL3WINDOW(4);
@@ -1109,9 +1077,11 @@ vortex_open(struct device *dev)
if (dev->if_port == XCVR_10base2)
/* Start the thinnet transceiver. We should really wait 50ms...*/
outw(StartCoax, ioaddr + EL3_CMD);
- EL3WINDOW(4);
- outw((inw(ioaddr + Wn4_Media) & ~(Media_10TP|Media_SQE)) |
- media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
+ if (dev->if_port != XCVR_NWAY) {
+ EL3WINDOW(4);
+ outw((inw(ioaddr + Wn4_Media) & ~(Media_10TP|Media_SQE)) |
+ media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
+ }
/* Switch to the stats window, and clear all stats by reading. */
outw(StatsDisable, ioaddr + EL3_CMD);
@@ -1138,22 +1108,23 @@ vortex_open(struct device *dev)
printk(KERN_DEBUG "%s: Filling in the Rx ring.\n", dev->name);
for (i = 0; i < RX_RING_SIZE; i++) {
struct sk_buff *skb;
- vp->rx_ring[i].next = virt_to_bus(&vp->rx_ring[i+1]);
+ vp->rx_ring[i].next = cpu_to_le32(virt_to_bus(&vp->rx_ring[i+1]));
vp->rx_ring[i].status = 0; /* Clear complete bit. */
- vp->rx_ring[i].length = PKT_BUF_SZ | LAST_FRAG;
- skb = DEV_ALLOC_SKB(PKT_BUF_SZ);
+ vp->rx_ring[i].length = cpu_to_le32(PKT_BUF_SZ | LAST_FRAG);
+ skb = dev_alloc_skb(PKT_BUF_SZ);
vp->rx_skbuff[i] = skb;
if (skb == NULL)
break; /* Bad news! */
skb->dev = dev; /* Mark as being used by this device. */
#if LINUX_VERSION_CODE >= 0x10300
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
- vp->rx_ring[i].addr = virt_to_bus(skb->tail);
+ vp->rx_ring[i].addr = cpu_to_le32(virt_to_bus(skb->tail));
#else
vp->rx_ring[i].addr = virt_to_bus(skb->data);
#endif
}
- vp->rx_ring[i-1].next = virt_to_bus(&vp->rx_ring[0]); /* Wrap the ring. */
+ /* Wrap the ring. */
+ vp->rx_ring[i-1].next = cpu_to_le32(virt_to_bus(&vp->rx_ring[0]));
outl(virt_to_bus(&vp->rx_ring[0]), ioaddr + UpListPtr);
}
if (vp->full_bus_master_tx) { /* Boomerang bus master Tx. */
@@ -1181,14 +1152,16 @@ vortex_open(struct device *dev)
(vp->full_bus_master_tx ? DownComplete : TxAvailable) |
(vp->full_bus_master_rx ? UpComplete : RxComplete) |
(vp->bus_master ? DMADone : 0);
+ vp->intr_enable = SetIntrEnb | IntLatch | TxAvailable | RxComplete |
+ StatsFull | HostError | TxComplete | IntReq
+ | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete;
outw(vp->status_enable, ioaddr + EL3_CMD);
/* Ack all pending events, and set active indicator mask. */
outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq,
ioaddr + EL3_CMD);
- outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull
- | HostError | TxComplete
- | (vp->bus_master ? DMADone : 0) | UpComplete | DownComplete,
- ioaddr + EL3_CMD);
+ outw(vp->intr_enable, ioaddr + EL3_CMD);
+ if (vp->cb_fn_base) /* The PCMCIA people are idiots. */
+ writel(0x8000, vp->cb_fn_base + 4);
MOD_INC_USE_COUNT;
@@ -1197,24 +1170,23 @@ vortex_open(struct device *dev)
static void vortex_timer(unsigned long data)
{
-#ifdef AUTOMEDIA
struct device *dev = (struct device *)data;
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
- unsigned long flags;
+ long ioaddr = dev->base_addr;
+ int next_tick = 0;
int ok = 0;
+ int media_status, mii_status, old_window;
if (vortex_debug > 1)
printk(KERN_DEBUG "%s: Media selection timer tick happened, %s.\n",
dev->name, media_tbl[dev->if_port].name);
- save_flags(flags); cli(); {
- int old_window = inw(ioaddr + EL3_CMD) >> 13;
- int media_status;
- EL3WINDOW(4);
- media_status = inw(ioaddr + Wn4_Media);
- switch (dev->if_port) {
- case XCVR_10baseT: case XCVR_100baseTx: case XCVR_100baseFx:
+ disable_irq(dev->irq);
+ old_window = inw(ioaddr + EL3_CMD) >> 13;
+ EL3WINDOW(4);
+ media_status = inw(ioaddr + Wn4_Media);
+ switch (dev->if_port) {
+ case XCVR_10baseT: case XCVR_100baseTx: case XCVR_100baseFx:
if (media_status & Media_LnkBeat) {
ok = 1;
if (vortex_debug > 1)
@@ -1223,27 +1195,40 @@ static void vortex_timer(unsigned long data)
} else if (vortex_debug > 1)
printk(KERN_DEBUG "%s: Media %s is has no link beat, %x.\n",
dev->name, media_tbl[dev->if_port].name, media_status);
-
break;
- case XCVR_MII:
- {
- int mii_reg1 = mdio_read(ioaddr, vp->phys[0], 1);
+ case XCVR_MII: case XCVR_NWAY:
+ mii_status = mdio_read(ioaddr, vp->phys[0], 1);
+ ok = 1;
+ if (debug > 1)
+ printk(KERN_DEBUG "%s: MII transceiver has status %4.4x.\n",
+ dev->name, mii_status);
+ if (mii_status & 0x0004) {
int mii_reg5 = mdio_read(ioaddr, vp->phys[0], 5);
- if (vortex_debug > 1)
- printk(KERN_DEBUG "%s: MII #%d status register is %4.4x, "
- "link partner capability %4.4x.\n",
- dev->name, vp->phys[0], mii_reg1, mii_reg5);
- if (mii_reg1 & 0x0004)
- ok = 1;
- break;
+ if (! vp->force_fd && mii_reg5 != 0xffff) {
+ int duplex = (mii_reg5&0x0100) ||
+ (mii_reg5 & 0x01C0) == 0x0040;
+ if (vp->full_duplex != duplex) {
+ vp->full_duplex = duplex;
+ printk(KERN_INFO "%s: Setting %s-duplex based on MII "
+ "#%d link partner capability of %4.4x.\n",
+ dev->name, vp->full_duplex ? "full" : "half",
+ vp->phys[0], mii_reg5);
+ /* Set the full-duplex bit. */
+ outb((vp->full_duplex ? 0x20 : 0) |
+ (dev->mtu > 1500 ? 0x40 : 0),
+ ioaddr + Wn3_MAC_Ctrl);
+ }
+ next_tick = 60*HZ;
+ }
}
+ break;
default: /* Other media types handled by Tx timeouts. */
if (vortex_debug > 1)
printk(KERN_DEBUG "%s: Media %s is has no indication, %x.\n",
dev->name, media_tbl[dev->if_port].name, media_status);
ok = 1;
- }
- if ( ! ok) {
+ }
+ if ( ! ok) {
union wn3_config config;
do {
@@ -1260,8 +1245,7 @@ static void vortex_timer(unsigned long data)
printk(KERN_DEBUG "%s: Media selection failed, now trying "
"%s port.\n",
dev->name, media_tbl[dev->if_port].name);
- vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait);
- add_timer(&vp->timer);
+ next_tick = media_tbl[dev->if_port].wait;
}
outw((media_status & ~(Media_10TP|Media_SQE)) |
media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media);
@@ -1273,21 +1257,25 @@ static void vortex_timer(unsigned long data)
outw(dev->if_port == XCVR_10base2 ? StartCoax : StopCoax,
ioaddr + EL3_CMD);
- }
- EL3WINDOW(old_window);
- } restore_flags(flags);
- if (vortex_debug > 1)
+ }
+ EL3WINDOW(old_window);
+ enable_irq(dev->irq);
+
+ if (vortex_debug > 2)
printk(KERN_DEBUG "%s: Media selection timer finished, %s.\n",
dev->name, media_tbl[dev->if_port].name);
-#endif /* AUTOMEDIA*/
+ if (next_tick) {
+ vp->timer.expires = RUN_AT(next_tick);
+ add_timer(&vp->timer);
+ }
return;
}
static void vortex_tx_timeout(struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int j;
printk(KERN_ERR "%s: transmit timed out, tx_status %2.2x status %4.4x.\n",
@@ -1301,7 +1289,7 @@ static void vortex_tx_timeout(struct device *dev)
printk(KERN_ERR "%s: Interrupt posted but not delivered --"
" IRQ blocked by another device?\n", dev->name);
/* Bad idea here.. but we might as well handle a few events. */
- vortex_interrupt IRQ(dev->irq, dev, 0);
+ vortex_interrupt(dev->irq, dev, 0);
}
outw(TxReset, ioaddr + EL3_CMD);
for (j = 200; j >= 0 ; j--)
@@ -1320,8 +1308,8 @@ static void vortex_tx_timeout(struct device *dev)
for (i = 0; i < TX_RING_SIZE; i++) {
printk(KERN_DEBUG " %d: @%p length %8.8x status %8.8x\n", i,
&vp->tx_ring[i],
- vp->tx_ring[i].length,
- vp->tx_ring[i].status);
+ le32_to_cpu(vp->tx_ring[i].length),
+ le32_to_cpu(vp->tx_ring[i].status));
}
}
#endif
@@ -1351,14 +1339,14 @@ static void vortex_tx_timeout(struct device *dev)
}
/*
- * Handle uncommon interrupt sources. This is a seperate routine to minimize
+ * Handle uncommon interrupt sources. This is a separate routine to minimize
* the cache impact.
*/
static void
vortex_error(struct device *dev, int status)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int do_tx_reset = 0;
int i;
@@ -1398,8 +1386,10 @@ vortex_error(struct device *dev, int status)
DoneDidThat++;
}
}
- if (status & IntReq) /* Restore all interrupt sources. */
- outw(ioaddr + EL3_CMD, vp->status_enable);
+ if (status & IntReq) { /* Restore all interrupt sources. */
+ outw(vp->status_enable, ioaddr + EL3_CMD);
+ outw(vp->intr_enable, ioaddr + EL3_CMD);
+ }
if (status & HostError) {
u16 fifo_diag;
EL3WINDOW(4);
@@ -1445,7 +1435,7 @@ static int
vortex_start_xmit(struct sk_buff *skb, struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
if (jiffies - dev->trans_start >= TX_TIMEOUT)
@@ -1455,7 +1445,6 @@ vortex_start_xmit(struct sk_buff *skb, struct device *dev)
/* Put out the doubleword header... */
outl(skb->len, ioaddr + TX_FIFO);
-#ifdef VORTEX_BUS_MASTER
if (vp->bus_master) {
/* Set the bus-master controller to transfer the packet. */
outl(virt_to_bus(skb->data), ioaddr + Wn7_MasterAddr);
@@ -1473,16 +1462,6 @@ vortex_start_xmit(struct sk_buff *skb, struct device *dev)
/* Interrupt us when the FIFO has room for max-sized packet. */
outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
}
-#else
- /* ... and the packet rounded to a doubleword. */
- outsl(ioaddr + TX_FIFO, skb->data, (skb->len + 3) >> 2);
- DEV_FREE_SKB(skb);
- if (inw(ioaddr + TxFree) > 1536) {
- clear_bit(0, (void*)&dev->tbusy);
- } else
- /* Interrupt us when the FIFO has room for max-sized packet. */
- outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
-#endif /* bus master */
dev->trans_start = jiffies;
@@ -1510,6 +1489,7 @@ vortex_start_xmit(struct sk_buff *skb, struct device *dev)
outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */
}
}
+ vp->stats.tx_bytes += skb->len;
return 0;
}
@@ -1517,7 +1497,7 @@ static int
boomerang_start_xmit(struct sk_buff *skb, struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
if (jiffies - dev->trans_start >= TX_TIMEOUT)
@@ -1539,13 +1519,12 @@ boomerang_start_xmit(struct sk_buff *skb, struct device *dev)
printk(KERN_WARNING "%s: Tx Ring full, refusing to send buffer.\n",
dev->name);
return 1;
- }
- /* end change 06/25/97 M. Sievers */
+ }
vp->tx_skbuff[entry] = skb;
vp->tx_ring[entry].next = 0;
- vp->tx_ring[entry].addr = virt_to_bus(skb->data);
- vp->tx_ring[entry].length = skb->len | LAST_FRAG;
- vp->tx_ring[entry].status = skb->len | TxIntrUploaded;
+ vp->tx_ring[entry].addr = cpu_to_le32(virt_to_bus(skb->data));
+ vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG);
+ vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded);
save_flags(flags);
cli();
@@ -1554,7 +1533,7 @@ boomerang_start_xmit(struct sk_buff *skb, struct device *dev)
for (i = 600; i >= 0 ; i--)
if ( (inw(ioaddr + EL3_STATUS) & CmdInProgress) == 0)
break;
- prev_entry->next = virt_to_bus(&vp->tx_ring[entry]);
+ prev_entry->next = cpu_to_le32(virt_to_bus(&vp->tx_ring[entry]));
if (inl(ioaddr + DownListPtr) == 0) {
outl(virt_to_bus(&vp->tx_ring[entry]), ioaddr + DownListPtr);
queued_packet++;
@@ -1566,38 +1545,44 @@ boomerang_start_xmit(struct sk_buff *skb, struct device *dev)
if (vp->cur_tx - vp->dirty_tx > TX_RING_SIZE - 1)
vp->tx_full = 1;
else { /* Clear previous interrupt enable. */
- prev_entry->status &= ~TxIntrUploaded;
+ prev_entry->status &= cpu_to_le32(~TxIntrUploaded);
clear_bit(0, (void*)&dev->tbusy);
}
dev->trans_start = jiffies;
+ vp->stats.tx_bytes += skb->len;
return 0;
}
}
/* The interrupt handler does all of the Rx thread work and cleans up
after the Tx thread. */
-static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs)
+static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
-#ifdef SA_SHIRQ /* Use the now-standard shared IRQ implementation. */
struct device *dev = dev_id;
-#else
- struct device *dev = (struct device *)(irq2dev_map[irq]);
-#endif
- struct vortex_private *vp;
- int ioaddr, status;
- int latency;
+ struct vortex_private *vp = (struct vortex_private *)dev->priv;
+ long ioaddr;
+ int latency, status;
int work_done = max_interrupt_work;
- vp = (struct vortex_private *)dev->priv;
- if (test_and_set_bit(0, (void*)&vp->in_interrupt)) {
+#if defined(__i386__)
+ /* A lock to prevent simultaneous entry bug on Intel SMP machines. */
+ if (test_and_set_bit(0, (void*)&dev->interrupt)) {
+ printk(KERN_ERR"%s: SMP simultaneous entry of an interrupt handler.\n",
+ dev->name);
+ dev->interrupt = 0; /* Avoid halting machine. */
+ return;
+ }
+#else
+ if (dev->interrupt) {
printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
return;
}
+ dev->interrupt = 1;
+#endif
dev->interrupt = 1;
ioaddr = dev->base_addr;
latency = inb(ioaddr + Timer);
-
status = inw(ioaddr + EL3_STATUS);
if (vortex_debug > 4)
@@ -1646,17 +1631,23 @@ static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs)
mark_bh(NET_BH);
}
}
-#ifdef VORTEX_BUS_MASTER
if (status & DMADone) {
- outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
- clear_bit(0, (void*)&dev->tbusy);
- DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
- mark_bh(NET_BH);
+ if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) {
+ outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
+ DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
+ if (inw(ioaddr + TxFree) > 1536) {
+ clear_bit(0, (void*)&dev->tbusy);
+ mark_bh(NET_BH);
+ } else /* Interrupt when FIFO has room for max-sized packet. */
+ outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD);
+ }
}
-#endif
/* Check for all uncommon interrupts at once. */
- if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq))
+ if (status & (HostError | RxEarly | StatsFull | TxComplete | IntReq)) {
+ if (status == 0xffff)
+ break;
vortex_error(dev, status);
+ }
if (--work_done < 0) {
if ((status & (0x7fe - (UpComplete | DownComplete))) == 0) {
@@ -1669,13 +1660,14 @@ static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs)
/* Disable all pending interrupts. */
outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD);
outw(AckIntr | 0x7FF, ioaddr + EL3_CMD);
- /* Set a timer to reenable interrupts. */
-
+ /* The timer will reenable interrupts. */
break;
}
}
/* Acknowledge the IRQ. */
outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
+ if (vp->cb_fn_base) /* The PCMCIA people are idiots. */
+ writel(0x8000, vp->cb_fn_base + 4);
} while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete));
@@ -1683,16 +1675,18 @@ static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs)
printk(KERN_DEBUG "%s: exiting interrupt, status %4.4x.\n",
dev->name, status);
+#if defined(__i386__)
+ clear_bit(0, (void*)&dev->interrupt);
+#else
dev->interrupt = 0;
- clear_bit(0, (void*)&vp->in_interrupt);
+#endif
return;
}
-static int
-vortex_rx(struct device *dev)
+static int vortex_rx(struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int i;
short rx_status;
@@ -1715,28 +1709,32 @@ vortex_rx(struct device *dev)
int pkt_len = rx_status & 0x1fff;
struct sk_buff *skb;
- skb = DEV_ALLOC_SKB(pkt_len + 5);
+ skb = dev_alloc_skb(pkt_len + 5);
if (vortex_debug > 4)
printk(KERN_DEBUG "Receiving packet size %d status %4.4x.\n",
pkt_len, rx_status);
if (skb != NULL) {
skb->dev = dev;
-#if LINUX_VERSION_CODE >= 0x10300
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
/* 'skb_put()' points to the start of sk_buff data area. */
- insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
- (pkt_len + 3) >> 2);
+ if (vp->bus_master &&
+ ! (inw(ioaddr + Wn7_MasterStatus) & 0x8000)) {
+ outl(virt_to_bus(skb_put(skb, pkt_len)),
+ ioaddr + Wn7_MasterAddr);
+ outw((skb->len + 3) & ~3, ioaddr + Wn7_MasterLen);
+ outw(StartDMAUp, ioaddr + EL3_CMD);
+ while (inw(ioaddr + Wn7_MasterStatus) & 0x8000)
+ ;
+ } else {
+ insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len),
+ (pkt_len + 3) >> 2);
+ }
outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
skb->protocol = eth_type_trans(skb, dev);
-#else
- skb->len = pkt_len;
- /* 'skb->data' points to the start of sk_buff data area. */
- insl(ioaddr + RX_FIFO, skb->data, (pkt_len + 3) >> 2);
- outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */
-#endif /* KERNEL_1_3_0 */
netif_rx(skb);
dev->last_rx = jiffies;
vp->stats.rx_packets++;
+ vp->stats.rx_bytes += skb->len;
/* Wait a limited time to go to next packet. */
for (i = 200; i >= 0; i--)
if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress))
@@ -1762,7 +1760,7 @@ boomerang_rx(struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
int entry = vp->cur_rx % RX_RING_SIZE;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int rx_status;
int rx_work_limit = vp->dirty_rx + RX_RING_SIZE - vp->cur_rx;
@@ -1770,8 +1768,9 @@ boomerang_rx(struct device *dev)
printk(KERN_DEBUG " In boomerang_rx(), status %4.4x, rx_status "
"%4.4x.\n",
inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus));
- while ((--rx_work_limit >= 0) &&
- ((rx_status = vp->rx_ring[entry].status) & RxDComplete)) {
+ while ((rx_status = le32_to_cpu(vp->rx_ring[entry].status)) & RxDComplete){
+ if (--rx_work_limit < 0)
+ break;
if (rx_status & RxDError) { /* Error, update stats. */
unsigned char rx_error = rx_status >> 16;
if (vortex_debug > 2)
@@ -1787,6 +1786,7 @@ boomerang_rx(struct device *dev)
int pkt_len = rx_status & 0x1fff;
struct sk_buff *skb;
+ vp->stats.rx_bytes += pkt_len;
if (vortex_debug > 4)
printk(KERN_DEBUG "Receiving packet size %d status %4.4x.\n",
pkt_len, rx_status);
@@ -1794,41 +1794,28 @@ boomerang_rx(struct device *dev)
/* Check if the packet is long enough to just accept without
copying to a properly sized skbuff. */
if (pkt_len < rx_copybreak
- && (skb = DEV_ALLOC_SKB(pkt_len + 2)) != 0) {
+ && (skb = dev_alloc_skb(pkt_len + 2)) != 0) {
skb->dev = dev;
-#if LINUX_VERSION_CODE >= 0x10300
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
/* 'skb_put()' points to the start of sk_buff data area. */
memcpy(skb_put(skb, pkt_len),
- bus_to_virt(vp->rx_ring[entry].addr),
+ bus_to_virt(le32_to_cpu(vp->rx_ring[entry].addr)),
pkt_len);
-#else
- memcpy(skb->data, bus_to_virt(vp->rx_ring[entry].addr), pkt_len);
- skb->len = pkt_len;
-#endif
rx_copy++;
- } else{
+ } else {
void *temp;
/* Pass up the skbuff already on the Rx ring. */
skb = vp->rx_skbuff[entry];
- if (skb == NULL) {
- printk(KERN_WARNING "%s: in boomerang_rx -- attempt to use NULL skb caught\n", dev->name);
- break;
- }
vp->rx_skbuff[entry] = NULL;
-#if LINUX_VERSION_CODE >= 0x10300
temp = skb_put(skb, pkt_len);
-#else
- temp = skb->data;
-#endif
/* Remove this checking code for final release. */
- if (bus_to_virt(vp->rx_ring[entry].addr) != temp)
+ if (bus_to_virt(le32_to_cpu(vp->rx_ring[entry].addr)) != temp)
printk(KERN_ERR "%s: Warning -- the skbuff addresses do not match"
" in boomerang_rx: %p vs. %p.\n", dev->name,
- bus_to_virt(vp->rx_ring[entry].addr), temp);
+ bus_to_virt(le32_to_cpu(vp->rx_ring[entry].addr)),
+ temp);
rx_nocopy++;
}
-#if LINUX_VERSION_CODE > 0x10300
skb->protocol = eth_type_trans(skb, dev);
{ /* Use hardware checksum info. */
int csum_bits = rx_status & 0xee000000;
@@ -1839,9 +1826,6 @@ boomerang_rx(struct device *dev)
rx_csumhits++;
}
}
-#else
- skb->len = pkt_len;
-#endif
netif_rx(skb);
dev->last_rx = jiffies;
vp->stats.rx_packets++;
@@ -1853,29 +1837,17 @@ boomerang_rx(struct device *dev)
struct sk_buff *skb;
entry = vp->dirty_rx % RX_RING_SIZE;
if (vp->rx_skbuff[entry] == NULL) {
- skb = DEV_ALLOC_SKB(PKT_BUF_SZ);
- if (skb == NULL) {
- printk(KERN_DEBUG "%s: in boomerang_rx -- could not allocate skbuff\n", dev->name);
+ skb = dev_alloc_skb(PKT_BUF_SZ);
+ if (skb == NULL)
break; /* Bad news! */
- }
skb->dev = dev; /* Mark as being used by this device. */
-#if LINUX_VERSION_CODE > 0x10300
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
- vp->rx_ring[entry].addr = virt_to_bus(skb->tail);
-#else
- vp->rx_ring[entry].addr = virt_to_bus(skb->data);
-#endif
+ vp->rx_ring[entry].addr = cpu_to_le32(virt_to_bus(skb->tail));
vp->rx_skbuff[entry] = skb;
}
vp->rx_ring[entry].status = 0; /* Clear complete bit. */
outw(UpUnstall, ioaddr + EL3_CMD);
}
-
- if (vp->dirty_rx >= RX_RING_SIZE ) {
- vp->cur_rx -= RX_RING_SIZE;
- vp->dirty_rx -= RX_RING_SIZE;
- }
-
return 0;
}
@@ -1883,7 +1855,7 @@ static int
vortex_close(struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int i;
dev->start = 0;
@@ -1910,12 +1882,7 @@ vortex_close(struct device *dev)
/* Turn off thinnet power. Green! */
outw(StopCoax, ioaddr + EL3_CMD);
-#ifdef SA_SHIRQ
free_irq(dev->irq, dev);
-#else
- free_irq(dev->irq);
- irq2dev_map[dev->irq] = 0;
-#endif
outw(SetIntrEnb | 0x0000, ioaddr + EL3_CMD);
@@ -1945,8 +1912,7 @@ vortex_close(struct device *dev)
return 0;
}
-static struct enet_statistics *
-vortex_get_stats(struct device *dev)
+static struct net_device_stats *vortex_get_stats(struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
unsigned long flags;
@@ -1967,7 +1933,7 @@ vortex_get_stats(struct device *dev)
table. This is done by checking that the ASM (!) code generated uses
atomic updates with '+='.
*/
-static void update_stats(int ioaddr, struct device *dev)
+static void update_stats(long ioaddr, struct device *dev)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
@@ -1998,20 +1964,14 @@ static void update_stats(int ioaddr, struct device *dev)
return;
}
-#ifdef HAVE_PRIVATE_IOCTL
static int vortex_ioctl(struct device *dev, struct ifreq *rq, int cmd)
{
struct vortex_private *vp = (struct vortex_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
u16 *data = (u16 *)&rq->ifr_data;
int phy = vp->phys[0] & 0x1f;
- if (vortex_debug > 2)
- printk(KERN_DEBUG "%s: In ioct(%-.6s, %#4.4x) %4.4x %4.4x %4.4x %4.4x.\n",
- dev->name, rq->ifr_ifrn.ifrn_name, cmd,
- data[0], data[1], data[2], data[3]);
-
- switch(cmd) {
+ switch(cmd) {
case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
data[0] = phy;
case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
@@ -2021,22 +1981,20 @@ static int vortex_ioctl(struct device *dev, struct ifreq *rq, int cmd)
case SIOCDEVPRIVATE+2: /* Write the specified MII register */
if (!suser())
return -EPERM;
+ EL3WINDOW(4);
mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]);
return 0;
default:
return -EOPNOTSUPP;
}
}
-#endif /* HAVE_PRIVATE_IOCTL */
-/* This new version of set_rx_mode() supports v1.4 kernels.
- The Vortex chip has no documented multicast filter, so the only
+/* Pre-Cyclone chips have no documented multicast filter, so the only
multicast setting is to receive all multicast frames. At least
the chip has a very clean way to set the mode, unlike many others. */
-static void
-set_rx_mode(struct device *dev)
+static void set_rx_mode(struct device *dev)
{
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int new_mode;
if (dev->flags & IFF_PROMISC) {
@@ -2050,14 +2008,6 @@ set_rx_mode(struct device *dev)
outw(new_mode, ioaddr + EL3_CMD);
}
-#ifndef NEW_MULTICAST
-/* The old interface to set the Rx mode. */
-static void
-set_multicast_list(struct device *dev, int num_addrs, void *addrs)
-{
- set_rx_mode(dev);
-}
-#endif
/* MII transceiver control section.
@@ -2068,7 +2018,7 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs)
/* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
met by back-to-back PCI I/O cycles, but we insert a delay to avoid
"overclocking" issues. */
-#define mdio_delay() udelay(1)
+#define mdio_delay() inl(mdio_addr)
#define MDIO_SHIFT_CLK 0x01
#define MDIO_DIR_WRITE 0x04
@@ -2079,11 +2029,11 @@ set_multicast_list(struct device *dev, int num_addrs, void *addrs)
/* Generate the preamble required for initial synchronization and
a few older transceivers. */
-static void mdio_sync(int ioaddr, int bits)
+static void mdio_sync(long ioaddr, int bits)
{
- int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
+ long mdio_addr = ioaddr + Wn4_PhysicalMgmt;
- /* Establish sync by sending at least 32 logic ones. */
+ /* Establish sync by sending at least 32 logic ones. */
while (-- bits >= 0) {
outw(MDIO_DATA_WRITE1, mdio_addr);
mdio_delay();
@@ -2092,12 +2042,12 @@ static void mdio_sync(int ioaddr, int bits)
}
}
-static int mdio_read(int ioaddr, int phy_id, int location)
+static int mdio_read(long ioaddr, int phy_id, int location)
{
int i;
int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
unsigned int retval = 0;
- int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
+ long mdio_addr = ioaddr + Wn4_PhysicalMgmt;
if (mii_preamble_required)
mdio_sync(ioaddr, 32);
@@ -2118,13 +2068,17 @@ static int mdio_read(int ioaddr, int phy_id, int location)
outw(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
mdio_delay();
}
- return retval>>1 & 0xffff;
+#if 0
+ return (retval>>1) & 0x1ffff;
+#else
+ return retval & 0x20000 ? 0xffff : retval>>1 & 0xffff;
+#endif
}
-static void mdio_write(int ioaddr, int phy_id, int location, int value)
+static void mdio_write(long ioaddr, int phy_id, int location, int value)
{
int write_cmd = 0x50020000 | (phy_id << 23) | (location << 18) | value;
- int mdio_addr = ioaddr + Wn4_PhysicalMgmt;
+ long mdio_addr = ioaddr + Wn4_PhysicalMgmt;
int i;
if (mii_preamble_required)
@@ -2151,8 +2105,7 @@ static void mdio_write(int ioaddr, int phy_id, int location, int value)
#ifdef MODULE
-void
-cleanup_module(void)
+void cleanup_module(void)
{
struct device *next_dev;
@@ -2162,11 +2115,14 @@ cleanup_module(void)
/* No need to check MOD_IN_USE, as sys_delete_module() checks. */
while (root_vortex_dev) {
- next_dev = ((struct vortex_private *)root_vortex_dev->priv)->next_module;
+ struct vortex_private *vp=(void *)(root_vortex_dev->priv);
+ next_dev = vp->next_module;
unregister_netdev(root_vortex_dev);
outw(TotalReset, root_vortex_dev->base_addr + EL3_CMD);
- release_region(root_vortex_dev->base_addr, VORTEX_TOTAL_SIZE);
+ release_region(root_vortex_dev->base_addr,
+ pci_tbl[vp->chip_id].io_size);
kfree(root_vortex_dev);
+ kfree(vp->priv_addr);
root_vortex_dev = next_dev;
}
}
@@ -2177,7 +2133,7 @@ cleanup_module(void)
* Local variables:
* compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c59x.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
* SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c59x.c"
- * compile-command-alt1: "gcc -DCARDBUS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c59x.c -o 3c59x_cb.o"
+ * cardbus-compile-command: "gcc -DCARDBUS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c 3c59x.c -o 3c575_cb.o -I/usr/src/pcmcia-cs-3.0.5/include/"
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 4
diff --git a/drivers/net/82596.c b/drivers/net/82596.c
index 6a9c0990c..cd3ab6bd6 100644
--- a/drivers/net/82596.c
+++ b/drivers/net/82596.c
@@ -67,7 +67,7 @@ static const char *version = "82596.c:v1.0 15/07/98\n";
#endif
/*
- * Define various macros for Channel Attention, word swapping etc., dependant
+ * Define various macros for Channel Attention, word swapping etc., dependent
* on architecture. MVME and BVME are 680x0 based, otherwise it is Intel.
*/
diff --git a/drivers/net/8390.c b/drivers/net/8390.c
index cd638f3df..064edb07f 100644
--- a/drivers/net/8390.c
+++ b/drivers/net/8390.c
@@ -37,7 +37,7 @@
68K Macintosh. Support >16bit I/O spaces
Paul Gortmaker : add kmod support for auto-loading of the 8390
module by all drivers that require it.
-
+ Alan Cox : Spinlocking work, added 'BUG_83C690'
Sources:
The National Semiconductor LAN Databook, and the 3Com 3c503 databook.
@@ -72,6 +72,8 @@ static const char *version =
#define NS8390_CORE
#include "8390.h"
+#define BUG_83C690
+
/* These are the operational function interfaces to board-specific
routines.
void reset_8390(struct device *dev)
@@ -110,6 +112,34 @@ static void ei_rx_overrun(struct device *dev);
static void NS8390_trigger_send(struct device *dev, unsigned int length,
int start_page);
static void set_multicast_list(struct device *dev);
+static void do_set_multicast_list(struct device *dev);
+
+/*
+ * SMP and the 8390 setup.
+ *
+ * The 8390 isnt exactly designed to be multithreaded on RX/TX. There is
+ * a page register that controls bank and packet buffer access. We guard
+ * this with ei_local->page_lock. Nobody should assume or set the page other
+ * than zero when the lock is not held. Lock holders must restore page 0
+ * before unlocking. Even pure readers must take the lock to protect in
+ * page 0.
+ *
+ * To make life difficult the chip can also be very slow. We therefore can't
+ * just use spinlocks. For the longer lockups we disable the irq the device
+ * sits on and hold the lock. We must hold the lock because there is a dual
+ * processor case other than interrupts (get stats/set multicast list in
+ * parallel with each other and transmit).
+ *
+ * Note: in theory we can just disable the irq on the card _but_ there is
+ * a latency on SMP irq delivery. So we can easily go "disable irq" "sync irqs"
+ * enter lock, take the queued irq. So we waddle instead of flying.
+ *
+ * Finally by special arrangement for the purpose of being generally
+ * annoying the transmit function is called bh atomic. That places
+ * restrictions on the user context callers as disable_irq won't save
+ * them.
+ */
+
/* Open/initialize the board. This routine goes all-out, setting everything
@@ -118,6 +148,7 @@ static void set_multicast_list(struct device *dev);
*/
int ei_open(struct device *dev)
{
+ unsigned long flags;
struct ei_device *ei_local = (struct ei_device *) dev->priv;
/* This can't happen unless somebody forgot to call ethdev_init(). */
@@ -127,7 +158,14 @@ int ei_open(struct device *dev)
return -ENXIO;
}
+ /*
+ * Grab the page lock so we own the register set, then call
+ * the init function.
+ */
+
+ spin_lock_irqsave(&ei_local->page_lock, flags);
NS8390_init(dev, 1);
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
dev->start = 1;
ei_local->irqlock = 0;
return 0;
@@ -136,7 +174,16 @@ int ei_open(struct device *dev)
/* Opposite of above. Only used when "ifconfig <devname> down" is done. */
int ei_close(struct device *dev)
{
+ struct ei_device *ei_local = (struct ei_device *) dev->priv;
+ unsigned long flags;
+
+ /*
+ * Hold the page lock during close
+ */
+
+ spin_lock_irqsave(&ei_local->page_lock, flags);
NS8390_init(dev, 0);
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
dev->start = 0;
return 0;
}
@@ -146,24 +193,39 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
int e8390_base = dev->base_addr;
struct ei_device *ei_local = (struct ei_device *) dev->priv;
int length, send_length, output_page;
+ unsigned long flags;
/*
* We normally shouldn't be called if dev->tbusy is set, but the
* existing code does anyway. If it has been too long since the
- * last Tx, we assume the board has died and kick it.
+ * last Tx, we assume the board has died and kick it. We are
+ * bh_atomic here.
*/
if (dev->tbusy)
{ /* Do timeouts, just like the 8003 driver. */
- int txsr = inb(e8390_base+EN0_TSR), isr;
+ int txsr;
+ int isr;
int tickssofar = jiffies - dev->trans_start;
+
+ /*
+ * Need the page lock. Now see what went wrong. This bit is
+ * fast.
+ */
+
+ spin_lock_irqsave(&ei_local->page_lock, flags);
+ txsr = inb(e8390_base+EN0_TSR);
if (tickssofar < TX_TIMEOUT || (tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX)))
+ {
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
return 1;
+ }
ei_local->stat.tx_errors++;
isr = inb(e8390_base+EN0_ISR);
if (dev->start == 0)
{
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
printk(KERN_WARNING "%s: xmit on stopped card\n", dev->name);
return 1;
}
@@ -184,22 +246,54 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
ei_local->interface_num ^= 1; /* Try a different xcvr. */
}
+ /*
+ * Play shuffle the locks, a reset on some chips takes a few
+ * mS. We very rarely hit this point.
+ */
+
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
+
+ /* Ugly but a reset can be slow, yet must be protected */
+
+ disable_irq(dev->irq);
+ synchronize_irq();
+ spin_lock(&ei_local->page_lock);
+
/* Try to restart the card. Perhaps the user has fixed something. */
ei_reset_8390(dev);
NS8390_init(dev, 1);
+
+ spin_unlock(&ei_local->page_lock);
+ enable_irq(dev->irq);
dev->trans_start = jiffies;
}
length = skb->len;
- /* Mask interrupts from the ethercard. */
+ /* Mask interrupts from the ethercard.
+ SMP: We have to grab the lock here otherwise the IRQ handler
+ on another CPU can flip window and race the IRQ mask set. We end
+ up trashing the mcast filter not disabling irqs if we dont lock */
+
+ spin_lock_irqsave(&ei_local->page_lock, flags);
outb_p(0x00, e8390_base + EN0_IMR);
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
+
+
+ /*
+ * Slow phase with lock held.
+ */
+
disable_irq(dev->irq);
synchronize_irq();
+
+ spin_lock(&ei_local->page_lock);
+
if (dev->interrupt)
{
printk(KERN_WARNING "%s: Tx request while isr active.\n",dev->name);
outb_p(ENISR_ALL, e8390_base + EN0_IMR);
+ spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
ei_local->stat.tx_errors++;
dev_kfree_skb(skb);
@@ -243,6 +337,7 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
ei_local->irqlock = 0;
dev->tbusy = 1;
outb_p(ENISR_ALL, e8390_base + EN0_IMR);
+ spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
ei_local->stat.tx_errors++;
return 1;
@@ -294,6 +389,8 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev)
/* Turn 8390 interrupts back on. */
ei_local->irqlock = 0;
outb_p(ENISR_ALL, e8390_base + EN0_IMR);
+
+ spin_unlock(&ei_local->page_lock);
enable_irq(dev->irq);
dev_kfree_skb (skb);
@@ -320,6 +417,13 @@ void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
e8390_base = dev->base_addr;
ei_local = (struct ei_device *) dev->priv;
+
+ /*
+ * Protect the irq test too.
+ */
+
+ spin_lock(&ei_local->page_lock);
+
if (dev->interrupt || ei_local->irqlock)
{
#if 1 /* This might just be an interrupt for a PCI device sharing this line */
@@ -330,15 +434,17 @@ void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
dev->name, inb_p(e8390_base + EN0_ISR),
inb_p(e8390_base + EN0_IMR));
#endif
+ spin_unlock(&ei_local->page_lock);
return;
}
+
dev->interrupt = 1;
/* Change to page 0 and read the intr status reg. */
outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
if (ei_debug > 3)
- printk("%s: interrupt(isr=%#2.2x).\n", dev->name,
+ printk(KERN_DEBUG "%s: interrupt(isr=%#2.2x).\n", dev->name,
inb_p(e8390_base + EN0_ISR));
/* !!Assumption!! -- we stay in page 0. Don't break this. */
@@ -386,15 +492,16 @@ void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD);
if (nr_serviced >= MAX_SERVICE)
{
- printk("%s: Too much work at interrupt, status %#2.2x\n",
+ printk(KERN_WARNING "%s: Too much work at interrupt, status %#2.2x\n",
dev->name, interrupts);
outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */
} else {
- printk("%s: unknown interrupt %#2x\n", dev->name, interrupts);
+ printk(KERN_WARNING "%s: unknown interrupt %#2x\n", dev->name, interrupts);
outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */
}
}
dev->interrupt = 0;
+ spin_unlock(&ei_local->page_lock);
return;
}
@@ -405,6 +512,8 @@ void ei_interrupt(int irq, void *dev_id, struct pt_regs * regs)
* letting the failed packet sit and collect dust in the Tx buffer. This
* is a much better solution as it avoids kernel based Tx timeouts, and
* an unnecessary card reset.
+ *
+ * Called with lock held
*/
static void ei_tx_err(struct device *dev)
@@ -443,7 +552,7 @@ static void ei_tx_err(struct device *dev)
}
/* We have finished a transmit: check for errors and then trigger the next
- packet to be sent. */
+ packet to be sent. Called with lock held */
static void ei_tx_intr(struct device *dev)
{
@@ -532,7 +641,8 @@ static void ei_tx_intr(struct device *dev)
mark_bh (NET_BH);
}
-/* We have a good packet(s), get it/them out of the buffers. */
+/* We have a good packet(s), get it/them out of the buffers.
+ Called with lock held */
static void ei_receive(struct device *dev)
{
@@ -659,6 +769,8 @@ static void ei_receive(struct device *dev)
* the updated datasheets, or "the NIC may act in an unpredictable manner."
* This includes causing "the NIC to defer indefinitely when it is stopped
* on a busy network." Ugh.
+ * Called with lock held. Don't call this with the interrupts off or your
+ * computer will hate you - it takes 10mS or so.
*/
static void ei_rx_overrun(struct device *dev)
@@ -726,19 +838,26 @@ static void ei_rx_overrun(struct device *dev)
outb_p(E8390_NODMA + E8390_PAGE0 + E8390_START + E8390_TRANS, e8390_base + E8390_CMD);
}
+/*
+ * Collect the stats. This is called unlocked and from several contexts.
+ */
+
static struct net_device_stats *get_stats(struct device *dev)
{
int ioaddr = dev->base_addr;
struct ei_device *ei_local = (struct ei_device *) dev->priv;
+ unsigned long flags;
/* If the card is stopped, just return the present stats. */
if (dev->start == 0)
return &ei_local->stat;
+ spin_lock_irqsave(&ei_local->page_lock,flags);
/* Read the counter registers, assuming we are in page 0. */
ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0);
ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1);
ei_local->stat.rx_missed_errors+= inb_p(ioaddr + EN0_COUNTER2);
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
return &ei_local->stat;
}
@@ -794,14 +913,14 @@ static inline void make_mc_bits(u8 *bits, struct device *dev)
}
/*
- * Set or clear the multicast filter for this adaptor.
+ * Set or clear the multicast filter for this adaptor. May be called
+ * from a BH in 2.1.x. Must be called with lock held.
*/
-static void set_multicast_list(struct device *dev)
+static void do_set_multicast_list(struct device *dev)
{
int e8390_base = dev->base_addr;
int i;
- unsigned long flags;
struct ei_device *ei_local = (struct ei_device*)dev->priv;
if (!(dev->flags&(IFF_PROMISC|IFF_ALLMULTI)))
@@ -825,21 +944,19 @@ static void set_multicast_list(struct device *dev)
* them as r/w so this is a bug. The SMC 83C790 (SMC Ultra and
* Ultra32 EISA) appears to have this bug fixed.
*/
+
if (dev->start)
outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
- save_flags(flags);
- cli();
outb_p(E8390_NODMA + E8390_PAGE1, e8390_base + E8390_CMD);
for(i = 0; i < 8; i++)
{
outb_p(ei_local->mcfilter[i], e8390_base + EN1_MULT_SHIFT(i));
-#ifdef NOT_83C690
+#ifndef BUG_83C690
if(inb_p(e8390_base + EN1_MULT_SHIFT(i))!=ei_local->mcfilter[i])
printk(KERN_ERR "Multicast filter read/write mismap %d\n",i);
#endif
}
outb_p(E8390_NODMA + E8390_PAGE0, e8390_base + E8390_CMD);
- restore_flags(flags);
if(dev->flags&IFF_PROMISC)
outb_p(E8390_RXCONFIG | 0x18, e8390_base + EN0_RXCR);
@@ -847,12 +964,29 @@ static void set_multicast_list(struct device *dev)
outb_p(E8390_RXCONFIG | 0x08, e8390_base + EN0_RXCR);
else
outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR);
-}
+ }
+
+/*
+ * Called without lock held. This is invoked from user context and may
+ * be parallel to just about everything else. Its also fairly quick and
+ * not called too often. Must protect against both bh and irq users
+ */
+
+static void set_multicast_list(struct device *dev)
+{
+ unsigned long flags;
+ struct ei_device *ei_local = (struct ei_device*)dev->priv;
+
+ spin_lock_irqsave(&ei_local->page_lock, flags);
+ do_set_multicast_list(dev);
+ spin_unlock_irqrestore(&ei_local->page_lock, flags);
+}
/*
* Initialize the rest of the 8390 device structure. Do NOT __initfunc
* this, as it is used by 8390 based modular drivers too.
*/
+
int ethdev_init(struct device *dev)
{
if (ei_debug > 1)
@@ -867,6 +1001,7 @@ int ethdev_init(struct device *dev)
return -ENOMEM;
memset(dev->priv, 0, sizeof(struct ei_device));
ei_local = (struct ei_device *)dev->priv;
+ spin_lock_init(&ei_local->page_lock);
}
dev->hard_start_xmit = &ei_start_xmit;
@@ -883,13 +1018,16 @@ int ethdev_init(struct device *dev)
/* This page of functions should be 8390 generic */
/* Follow National Semi's recommendations for initializing the "NIC". */
+/*
+ * Must be called with lock held.
+ */
+
void NS8390_init(struct device *dev, int startp)
{
int e8390_base = dev->base_addr;
struct ei_device *ei_local = (struct ei_device *) dev->priv;
int i;
int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48;
- unsigned long flags;
if(sizeof(struct e8390_pkt_hdr)!=4)
panic("8390.c: header struct mispacked\n");
@@ -914,8 +1052,7 @@ void NS8390_init(struct device *dev, int startp)
outb_p(0x00, e8390_base + EN0_IMR);
/* Copy the station address into the DS8390 registers. */
- save_flags(flags);
- cli();
+
outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base+E8390_CMD); /* 0x61 */
for(i = 0; i < 6; i++)
{
@@ -926,7 +1063,7 @@ void NS8390_init(struct device *dev, int startp)
outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG);
outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base+E8390_CMD);
- restore_flags(flags);
+
dev->tbusy = 0;
dev->interrupt = 0;
ei_local->tx1 = ei_local->tx2 = 0;
@@ -940,18 +1077,20 @@ void NS8390_init(struct device *dev, int startp)
outb_p(E8390_TXCONFIG, e8390_base + EN0_TXCR); /* xmit on. */
/* 3c503 TechMan says rxconfig only after the NIC is started. */
outb_p(E8390_RXCONFIG, e8390_base + EN0_RXCR); /* rx on, */
- set_multicast_list(dev); /* (re)load the mcast table */
+ do_set_multicast_list(dev); /* (re)load the mcast table */
}
return;
}
-/* Trigger a transmit start, assuming the length is valid. */
+/* Trigger a transmit start, assuming the length is valid.
+ Always called with the page lock held */
+
static void NS8390_trigger_send(struct device *dev, unsigned int length,
int start_page)
{
int e8390_base = dev->base_addr;
- struct ei_device *ei_local = (struct ei_device *) dev->priv;
-
+ struct ei_device *ei_local = (struct ei_device *) dev->priv;
+
outb_p(E8390_NODMA+E8390_PAGE0, e8390_base+E8390_CMD);
if (inb_p(e8390_base) & E8390_TRANS)
@@ -968,6 +1107,12 @@ static void NS8390_trigger_send(struct device *dev, unsigned int length,
#ifdef MODULE
+EXPORT_SYMBOL(ei_open);
+EXPORT_SYMBOL(ei_close);
+EXPORT_SYMBOL(ei_interrupt);
+EXPORT_SYMBOL(ethdev_init);
+EXPORT_SYMBOL(NS8390_init);
+
struct module *NS8390_module = NULL;
int init_module(void)
diff --git a/drivers/net/8390.h b/drivers/net/8390.h
index 52d4e9c9b..4f280b013 100644
--- a/drivers/net/8390.h
+++ b/drivers/net/8390.h
@@ -155,30 +155,30 @@ extern void ei_interrupt(int irq, void *dev_id, struct pt_regs *regs);
things in there should be here!) */
/* You have one of these per-board */
struct ei_device {
- const char *name;
- void (*reset_8390)(struct device *);
- void (*get_8390_hdr)(struct device *, struct e8390_pkt_hdr *, int);
- void (*block_output)(struct device *, int, const unsigned char *, int);
- void (*block_input)(struct device *, int, struct sk_buff *, int);
- unsigned char mcfilter[8];
- unsigned open:1;
- unsigned word16:1; /* We have the 16-bit (vs 8-bit) version of the card. */
- unsigned txing:1; /* Transmit Active */
- unsigned irqlock:1; /* 8390's intrs disabled when '1'. */
- unsigned dmaing:1; /* Remote DMA Active */
- unsigned char tx_start_page, rx_start_page, stop_page;
- unsigned char current_page; /* Read pointer in buffer */
- unsigned char interface_num; /* Net port (AUI, 10bT.) to use. */
- unsigned char txqueue; /* Tx Packet buffer queue length. */
- short tx1, tx2; /* Packet lengths for ping-pong tx. */
- short lasttx; /* Alpha version consistency check. */
- unsigned char reg0; /* Register '0' in a WD8013 */
- unsigned char reg5; /* Register '5' in a WD8013 */
- unsigned char saved_irq; /* Original dev->irq value. */
- /* The new statistics table. */
- struct net_device_stats stat;
- unsigned char *reg_offset; /* Register mapping table */
- unsigned long priv; /* Private field to store bus IDs etc. */
+ const char *name;
+ void (*reset_8390)(struct device *);
+ void (*get_8390_hdr)(struct device *, struct e8390_pkt_hdr *, int);
+ void (*block_output)(struct device *, int, const unsigned char *, int);
+ void (*block_input)(struct device *, int, struct sk_buff *, int);
+ unsigned char mcfilter[8];
+ unsigned open:1;
+ unsigned word16:1; /* We have the 16-bit (vs 8-bit) version of the card. */
+ unsigned txing:1; /* Transmit Active */
+ unsigned irqlock:1; /* 8390's intrs disabled when '1'. */
+ unsigned dmaing:1; /* Remote DMA Active */
+ unsigned char tx_start_page, rx_start_page, stop_page;
+ unsigned char current_page; /* Read pointer in buffer */
+ unsigned char interface_num; /* Net port (AUI, 10bT.) to use. */
+ unsigned char txqueue; /* Tx Packet buffer queue length. */
+ short tx1, tx2; /* Packet lengths for ping-pong tx. */
+ short lasttx; /* Alpha version consistency check. */
+ unsigned char reg0; /* Register '0' in a WD8013 */
+ unsigned char reg5; /* Register '5' in a WD8013 */
+ unsigned char saved_irq; /* Original dev->irq value. */
+ struct net_device_stats stat; /* The new statistics table. */
+ u32 *reg_offset; /* Register mapping table */
+ spinlock_t page_lock; /* Page register locks */
+ unsigned long priv; /* Private field to store bus IDs etc. */
};
/* The maximum number of 8390 interrupt service routines called per IRQ. */
@@ -190,12 +190,12 @@ struct ei_device {
#define ei_status (*(struct ei_device *)(dev->priv))
/* Some generic ethernet register configurations. */
-#define E8390_TX_IRQ_MASK 0xa /* For register EN0_ISR */
-#define E8390_RX_IRQ_MASK 0x5
-#define E8390_RXCONFIG 0x4 /* EN0_RXCR: broadcasts, no multicast,errors */
-#define E8390_RXOFF 0x20 /* EN0_RXCR: Accept no packets */
-#define E8390_TXCONFIG 0x00 /* EN0_TXCR: Normal transmit mode */
-#define E8390_TXOFF 0x02 /* EN0_TXCR: Transmitter off */
+#define E8390_TX_IRQ_MASK 0xa /* For register EN0_ISR */
+#define E8390_RX_IRQ_MASK 0x5
+#define E8390_RXCONFIG 0x4 /* EN0_RXCR: broadcasts, no multicast,errors */
+#define E8390_RXOFF 0x20 /* EN0_RXCR: Accept no packets */
+#define E8390_TXCONFIG 0x00 /* EN0_TXCR: Normal transmit mode */
+#define E8390_TXOFF 0x02 /* EN0_TXCR: Transmitter off */
/* Register accessed at EN_CMD, the 8390 base addr. */
#define E8390_STOP 0x01 /* Stop and reset the chip */
@@ -208,6 +208,10 @@ struct ei_device {
#define E8390_PAGE1 0x40 /* using the two high-order bits */
#define E8390_PAGE2 0x80 /* Page 3 is invalid. */
+/*
+ * Only generate indirect loads given a machine that needs them.
+ */
+
#if defined(CONFIG_MAC) || defined(CONFIG_AMIGA_PCMCIA) || \
defined(CONFIG_ARIADNE2) || defined(CONFIG_ARIADNE2_MODULE)
#define EI_SHIFT(x) (ei_local->reg_offset[x])
diff --git a/drivers/net/Config.in b/drivers/net/Config.in
index df7d7f60c..e0ca210b1 100644
--- a/drivers/net/Config.in
+++ b/drivers/net/Config.in
@@ -59,7 +59,7 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
tristate '3c515 ISA Fast EtherLink' CONFIG_3C515
tristate '3c590/3c900 series (592/595/597) "Vortex/Boomerang" support' CONFIG_VORTEX
fi
- bool 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE
+ tristate 'AMD LANCE and PCnet (AT1500 and NE2100) support' CONFIG_LANCE
bool 'Western Digital/SMC cards' CONFIG_NET_VENDOR_SMC
if [ "$CONFIG_NET_VENDOR_SMC" = "y" ]; then
tristate 'WD80*3 support' CONFIG_WD80x3
@@ -85,17 +85,15 @@ if [ "$CONFIG_NET_ETHERNET" = "y" ]; then
fi
bool 'Other ISA cards' CONFIG_NET_ISA
if [ "$CONFIG_NET_ISA" = "y" ]; then
- if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
- tristate 'AT1700/1720 support (EXPERIMENTAL)' CONFIG_AT1700
- fi
+ tristate 'AT1700/1720 support' CONFIG_AT1700
tristate 'Cabletron E21xx support' CONFIG_E2100
tristate 'DEPCA, DE10x, DE200, DE201, DE202, DE422 support' CONFIG_DEPCA
tristate 'EtherWORKS 3 (DE203, DE204, DE205) support' CONFIG_EWRK3
tristate 'EtherExpress 16 support' CONFIG_EEXPRESS
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
tristate 'EtherExpressPro support' CONFIG_EEXPRESS_PRO
- tristate 'FMV-181/182/183/184 support' CONFIG_FMV18X
fi
+ tristate 'FMV-181/182/183/184 support' CONFIG_FMV18X
tristate 'HP PCLAN+ (27247B and 27252A) support' CONFIG_HPLAN_PLUS
tristate 'HP PCLAN (27245 and other 27xxx series) support' CONFIG_HPLAN
tristate 'HP 10/100VG PCLAN (ISA, EISA, PCI) support' CONFIG_HP100
@@ -228,6 +226,11 @@ fi
#
dep_tristate 'Comtrol Hostess SV-11 support' CONFIG_HOSTESS_SV11 m
#
+# The COSA/SRP driver has not been tested as non-modular yet.
+#
+dep_tristate 'COSA/SRP sync serial boards support' CONFIG_COSA m
+tristate 'Red Creek Hardware VPN (EXPERIMENTAL)' CONFIG_RCPCI
+#
if [ "$CONFIG_WAN_ROUTER" != "n" ]; then
bool 'WAN drivers' CONFIG_WAN_DRIVERS
if [ "$CONFIG_WAN_DRIVERS" = "y" ]; then
diff --git a/drivers/net/Makefile b/drivers/net/Makefile
index 2dc86b499..572e4ec27 100644
--- a/drivers/net/Makefile
+++ b/drivers/net/Makefile
@@ -5,7 +5,7 @@
SUB_DIRS :=
MOD_SUB_DIRS := $(SUB_DIRS)
-ALL_SUB_DIRS := $(SUB_DIRS) hamradio
+ALL_SUB_DIRS := $(SUB_DIRS) hamradio irda
L_TARGET := net.a
L_OBJS := auto_irq.o
@@ -384,6 +384,10 @@ endif
ifeq ($(CONFIG_LANCE),y)
L_OBJS += lance.o
+else
+ ifeq ($(CONFIG_LANCE),m)
+ M_OBJS += lance.o
+ endif
endif
ifeq ($(CONFIG_PCNET32),y)
@@ -752,6 +756,16 @@ else
endif
endif
+ifeq ($(CONFIG_COSA),y)
+L_OBJS += cosa.o
+CONFIG_SYNCPPP_BUILTIN = y
+else
+ ifeq ($(CONFIG_COSA),m)
+ CONFIG_SYNCPPP_MODULE = y
+ M_OBJS += cosa.o
+ endif
+endif
+
# If anything built-in uses syncppp, then build it into the kernel also.
# If not, but a module uses it, build as a module.
@@ -812,7 +826,7 @@ ifdef CONFIG_8390_BUILTIN
L_OBJS += 8390.o
else
ifdef CONFIG_8390_MODULE
- M_OBJS += 8390.o
+ MX_OBJS += 8390.o
endif
endif
@@ -965,6 +979,14 @@ else
endif
endif
+ifeq ($(CONFIG_RCPCI),y)
+L_OBJS += rcpci.o
+else
+ ifeq ($(CONFIG_RCPCI),m)
+ M_OBJS += rcpci.o
+ endif
+endif
+
ifeq ($(CONFIG_MACE),y)
L_OBJS += mace.o
endif
@@ -1013,13 +1035,6 @@ endif
#
# HIPPI adapters
#
-ifeq ($(CONFIG_CERN_HIPPI),y)
-L_OBJS += cern_hippi.o
-else
- ifeq ($(CONFIG_CERN_HIPPI),m)
- M_OBJS += cern_hippi.o
- endif
-endif
ifeq ($(CONFIG_ROADRUNNER),y)
L_OBJS += rrunner.o
@@ -1029,6 +1044,14 @@ else
endif
endif
+ifeq ($(CONFIG_IRDA),y)
+SUB_DIRS += irda
+else
+ ifeq ($(CONFIG_IRDA),m)
+ MOD_SUB_DIRS += irda
+ endif
+endif
+
include $(TOPDIR)/Rules.make
clean:
@@ -1036,3 +1059,6 @@ clean:
wanpipe.o: $(WANPIPE_OBJS)
ld -r -o $@ $(WANPIPE_OBJS)
+
+rcpci.o: rcpci45.o rclanmtl.o
+ $(LD) -r -o rcpci.o rcpci45.o rclanmtl.o
diff --git a/drivers/net/Space.c b/drivers/net/Space.c
index a3f8e68a9..eece1bfe3 100644
--- a/drivers/net/Space.c
+++ b/drivers/net/Space.c
@@ -111,6 +111,8 @@ extern int rtl8139_probe(struct device *dev);
extern int hplance_probe(struct device *dev);
extern int via_rhine_probe(struct device *dev);
extern int tc515_probe(struct device *dev);
+extern int lance_probe(struct device *dev);
+extern int rcpci_probe(struct device *);
/* Gigabit Ethernet adapters */
extern int yellowfin_probe(struct device *dev);
@@ -126,7 +128,6 @@ extern int dfx_probe(struct device *dev);
extern int apfddi_init(struct device *dev);
/* HIPPI boards */
-extern int cern_hippi_probe(struct device *);
extern int rr_hippi_probe(struct device *);
struct devprobe
@@ -172,12 +173,12 @@ struct devprobe pci_probes[] __initdata = {
#ifdef CONFIG_DGRS
{dgrs_probe, 0},
#endif
+#ifdef CONFIG_RCPCI
+ {rcpci_probe, 0},
+#endif
#ifdef CONFIG_VORTEX
{tc59x_probe, 0},
#endif
-#ifdef CONFIG_DEC_ELCP
- {tulip_probe, 0},
-#endif
#ifdef CONFIG_NE2K_PCI
{ne2k_pci_probe, 0},
#endif
@@ -187,6 +188,9 @@ struct devprobe pci_probes[] __initdata = {
#ifdef CONFIG_EEXPRESS_PRO100 /* Intel EtherExpress Pro/100 */
{eepro100_probe, 0},
#endif
+#ifdef CONFIG_DEC_ELCP
+ {tulip_probe, 0},
+#endif
#ifdef CONFIG_DE4X5 /* DEC DE425, DE434, DE435 adapters */
{de4x5_probe, 0},
#endif
@@ -300,6 +304,9 @@ struct devprobe isa_probes[] __initdata = {
#ifdef CONFIG_NE2000 /* ISA (use ne2k-pci for PCI cards) */
{ne_probe, 0},
#endif
+#ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */
+ {lance_probe, 0},
+#endif
#ifdef CONFIG_SMC9194
{smc_init, 0},
#endif
@@ -536,9 +543,6 @@ static int hippi_probe(struct device *dev)
return 1;
if (1
-#ifdef CONFIG_CERN_HIPPI
- && cern_hippi_probe(dev)
-#endif
#ifdef CONFIG_ROADRUNNER
&& rr_hippi_probe(dev)
#endif
@@ -713,6 +717,9 @@ trif_probe(struct device *dev)
#ifdef CONFIG_SKTR
&& sktr_probe(dev)
#endif
+#ifdef CONFIG_SMCTR
+ && smctr_probe(dev)
+#endif
&& 1 ) {
return 1; /* -ENODEV or -EAGAIN would be more accurate. */
}
diff --git a/drivers/net/ac3200.c b/drivers/net/ac3200.c
index c6950ad28..e5e2f572f 100644
--- a/drivers/net/ac3200.c
+++ b/drivers/net/ac3200.c
@@ -407,7 +407,6 @@ cleanup_module(void)
release_region(dev->base_addr, AC_IO_EXTENT);
if (ei_status.reg0)
iounmap((void *)dev->mem_start);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c
index 7eef6b801..44709f341 100644
--- a/drivers/net/acenic.c
+++ b/drivers/net/acenic.c
@@ -7,14 +7,17 @@
* Thanks to Alteon and 3Com for providing hardware and documentation
* enabling me to write this driver.
*
+ * A mailing list for discussing the use of this driver has been
+ * setup, please subscribe to the lists if you have any questions
+ * about the driver. Send mail to linux-acenic-help@sunsite.auc.dk to
+ * see how to subscribe.
+ *
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
-#define DEBUG 1
-#define RX_DMA_SKBUFF 1
#define PKT_COPY_THRESHOLD 300
#include <linux/module.h>
@@ -59,10 +62,6 @@
* firmware. Also the programming interface is quite neat, except for
* the parts dealing with the i2c eeprom on the card ;-)
*
- * A number of standard Ethernet receive skb's are now allocated at
- * init time and not released before the driver is unloaded. This
- * makes it possible to do ifconfig down/up.
- *
* Using jumbo frames:
*
* To enable jumbo frames, simply specify an mtu between 1500 and 9000
@@ -70,55 +69,107 @@
* by running `ifconfig eth<X> mtu <MTU>' with <X> being the Ethernet
* interface number and <MTU> being the MTU value.
*
+ * Module parameters:
+ *
+ * When compiled as a loadable module, the driver allows for a number
+ * of module parameters to be specified. The driver supports the
+ * following module parameters:
+ *
+ * trace=<val> - Firmware trace level. This requires special traced
+ * firmware to replace the firmware supplied with
+ * the driver - for debugging purposes only.
+ *
+ * link=<val> - Link state. Normally you want to use the default link
+ * parameters set by the driver. This can be used to
+ * override these in case your switch doesn't negotiate
+ * the link properly. Valid values are:
+ * 0x0001 - Force half duplex link.
+ * 0x0002 - Do not negotiate line speed with the other end.
+ * 0x0010 - 10Mbit/sec link.
+ * 0x0020 - 100Mbit/sec link.
+ * 0x0040 - 1000Mbit/sec link.
+ * 0x0100 - Do not negotiate flow control.
+ * 0x0200 - Enable RX flow control Y
+ * 0x0400 - Enable TX flow control Y (Tigon II NICs only).
+ * Default value is 0x0270, ie. enable link+flow
+ * control negotiation. Negotiating the highest
+ * possible link speed with RX flow control enabled.
+ *
+ * When disabling link speed negotiation, only one link
+ * speed is allowed to be specified!
+ *
+ * tx_coal_tick=<val> - number of coalescing clock ticks (us) allowed
+ * to wait for more packets to arive before
+ * interrupting the host, from the time the first
+ * packet arrives.
+ *
+ * rx_coal_tick=<val> - number of coalescing clock ticks (us) allowed
+ * to wait for more packets to arive in the transmit ring,
+ * before interrupting the host, after transmitting the
+ * first packet in the ring.
+ *
+ * max_tx_desc=<val> - maximum number of transmit descriptors
+ * (packets) transmitted before interrupting the host.
+ *
+ * max_rx_desc=<val> - maximum number of receive descriptors
+ * (packets) received before interrupting the host.
+ *
+ * If you use more than one NIC, specify the parameters for the
+ * individual NICs with a comma, ie. trace=0,0x00001fff,0 you want to
+ * run tracing on NIC #2 but not on NIC #1 and #3.
+ *
* TODO:
*
* - Add multicast support.
- * - Make all the tuning parameters and link speed negotiation, user
- * settable at driver/module init time.
+ * - NIC dump support.
+ * - More tuning parameters.
*/
-static const char *version = "acenic.c: v0.13 11/25/98 Jes Sorensen (Jes.Sorensen@cern.ch)\n";
+static int link[8] = {0, };
+static int trace[8] = {0, };
+static int tx_coal_tick[8] = {0, };
+static int rx_coal_tick[8] = {0, };
+static int max_tx_desc[8] = {0, };
+static int max_rx_desc[8] = {0, };
+
+static const char *version = "acenic.c: v0.24 01/13/99 Jes Sorensen (Jes.Sorensen@cern.ch)\n";
static struct device *root_dev = NULL;
static int ace_load_firmware(struct device *dev);
+static int probed __initdata = 0;
+
__initfunc(int acenic_probe (struct device *dev))
{
- static int i = 0;
int boards_found = 0;
int version_disp;
- u32 tmp;
struct ace_private *ap;
+ u8 pci_latency;
+#if 0
u16 vendor, device;
u8 pci_bus;
u8 pci_dev_fun;
- u8 pci_latency;
u8 irq;
+#endif
+ struct pci_dev *pdev = NULL;
+
+ if (probed)
+ return -ENODEV;
+ probed ++;
if (!pci_present()) /* is PCI support present? */
return -ENODEV;
version_disp = 0;
- for (; i < 255; i++)
+ while((pdev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pdev)))
{
dev = NULL;
- if (pcibios_find_class(PCI_CLASS_NETWORK_ETHERNET << 8,
- i, &pci_bus, &pci_dev_fun) !=
- PCIBIOS_SUCCESSFUL)
- break;
-
- pcibios_read_config_word(pci_bus, pci_dev_fun,
- PCI_VENDOR_ID, &vendor);
-
- pcibios_read_config_word(pci_bus, pci_dev_fun,
- PCI_DEVICE_ID, &device);
-
- if ((vendor != PCI_VENDOR_ID_ALTEON) &&
- !((vendor == PCI_VENDOR_ID_3COM) &&
- (device == PCI_DEVICE_ID_3COM_3C985)))
+ if ((pdev->vendor != PCI_VENDOR_ID_ALTEON) &&
+ !((pdev->vendor == PCI_VENDOR_ID_3COM) &&
+ (pdev->device == PCI_DEVICE_ID_3COM_3C985)))
continue;
dev = init_etherdev(dev, sizeof(struct ace_private));
@@ -133,36 +184,10 @@ __initfunc(int acenic_probe (struct device *dev))
dev->priv = kmalloc(sizeof(*ap), GFP_KERNEL);
ap = dev->priv;
- ap->vendor = vendor;
-
- /* Read register base address from
- PCI Configuration Space */
-
- pcibios_read_config_dword(pci_bus, pci_dev_fun,
- PCI_BASE_ADDRESS_0, &tmp);
-
- pcibios_read_config_byte(pci_bus, pci_dev_fun,
- PCI_INTERRUPT_LINE, &irq);
-
- pcibios_read_config_word(pci_bus, pci_dev_fun,
- PCI_COMMAND, &ap->pci_command);
-
- if (!(ap->pci_command & PCI_COMMAND_MASTER)){
- ap->pci_command |= PCI_COMMAND_MASTER;
- pcibios_write_config_word(pci_bus, pci_dev_fun,
- PCI_COMMAND,
- ap->pci_command);
- }
-
- if (!(ap->pci_command & PCI_COMMAND_MEMORY)){
- printk(KERN_ERR "Shared mem not enabled - "
- "unable to configure AceNIC\n");
- break;
- }
+ ap->pdev = pdev;
+ ap->vendor = pdev->vendor;
- dev->irq = irq;
- ap->pci_bus = pci_bus;
- ap->pci_dev_fun = pci_dev_fun;
+ dev->irq = pdev->irq;
#ifdef __SMP__
spin_lock_init(&ap->lock);
#endif
@@ -189,15 +214,17 @@ __initfunc(int acenic_probe (struct device *dev))
printk(version);
}
- pcibios_read_config_byte(pci_bus, pci_dev_fun,
- PCI_LATENCY_TIMER, &pci_latency);
+ pci_read_config_word(pdev, PCI_COMMAND, &ap->pci_command);
+
+ pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &pci_latency);
if (pci_latency <= 0x40){
pci_latency = 0x40;
- pcibios_write_config_byte(pci_bus, pci_dev_fun,
- PCI_LATENCY_TIMER,
- pci_latency);
+ pci_write_config_byte(pdev, PCI_LATENCY_TIMER,
+ pci_latency);
}
+ pci_set_master(pdev);
+
switch(ap->vendor){
case PCI_VENDOR_ID_ALTEON:
sprintf(ap->name, "AceNIC Gigabit Ethernet");
@@ -212,21 +239,27 @@ __initfunc(int acenic_probe (struct device *dev))
printk(KERN_INFO "%s: Unknown AceNIC ", dev->name);
break;
}
- printk("Gigabit Ethernet at 0x%08x, irq %i, PCI latency %i "
- "clks\n", tmp, dev->irq, pci_latency);
+ printk("Gigabit Ethernet at 0x%08lx, irq %i, PCI latency %i "
+ "clks\n", pdev->base_address[0], dev->irq, pci_latency);
/*
* Remap the regs into kernel space.
*/
- ap->regs = (struct ace_regs *)ioremap(tmp, 0x4000);
+ ap->regs = (struct ace_regs *)ioremap(pdev->base_address[0],
+ 0x4000);
if (!ap->regs){
printk(KERN_ERR "%s: Unable to map I/O register, "
- "AceNIC %i will be disabled.\n", dev->name, i);
+ "AceNIC %i will be disabled.\n",
+ dev->name, boards_found);
break;
}
- ace_init(dev);
+#ifdef MODULE
+ ace_init(dev, boards_found);
+#else
+ ace_init(dev, -1);
+#endif
boards_found++;
@@ -255,6 +288,17 @@ __initfunc(int acenic_probe (struct device *dev))
#ifdef MODULE
+#if LINUX_VERSION_CODE > 0x20118
+MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@cern.ch>");
+MODULE_DESCRIPTION("AceNIC/3C985 Gigabit Ethernet driver");
+MODULE_PARM(link, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(trace, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(tx_coal_tick, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(max_tx_desc, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(rx_coal_tick, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(max_rx_desc, "1-" __MODULE_STRING(8) "i");
+#endif
+
int init_module(void)
{
int cards;
@@ -299,6 +343,8 @@ void cleanup_module(void)
}
iounmap(regs);
+ if(ap->trace_buf)
+ kfree(ap->trace_buf);
kfree(ap->info);
free_irq(root_dev->irq, root_dev);
unregister_netdev(root_dev);
@@ -326,12 +372,12 @@ static inline void ace_issue_cmd(struct ace_regs *regs, struct cmd *cmd)
}
-__initfunc(static int ace_init(struct device *dev))
+__initfunc(static int ace_init(struct device *dev, int board_idx))
{
struct ace_private *ap;
struct ace_regs *regs;
struct ace_info *info;
- u32 tig_ver, mac1 = 0, mac2 = 0, tmp;
+ u32 tig_ver, mac1, mac2, tmp;
unsigned long tmp_ptr, myjif;
short i;
@@ -345,7 +391,7 @@ __initfunc(static int ace_init(struct device *dev))
{
long myjif = jiffies + HZ;
- while (myjif > jiffies);
+ while (time_before(jiffies, myjif));
}
#endif
@@ -360,13 +406,6 @@ __initfunc(static int ace_init(struct device *dev))
((CLR_INT | WORD_SWAP) << 24));
#endif
-#ifdef __LITTLE_ENDIAN
- regs->ModeStat = ACE_BYTE_SWAP_DATA | ACE_WARN | ACE_FATAL
- | ACE_WORD_SWAP;
-#else
-#error "this driver doesn't run on big-endian machines yet!"
-#endif
-
/*
* Stop the NIC CPU and clear pending interrupts
*/
@@ -398,10 +437,26 @@ __initfunc(static int ace_init(struct device *dev))
return -ENODEV;
}
+ /*
+ * ModeStat _must_ be set after the SRAM settings as this change
+ * seems to corrupt the ModeStat and possible other registers.
+ * The SRAM settings survive resets and setting it to the same
+ * value a second time works as well. This is what caused the
+ * `Firmware not running' problem on the Tigon II.
+ */
+#ifdef __LITTLE_ENDIAN
+ regs->ModeStat = ACE_BYTE_SWAP_DATA | ACE_WARN | ACE_FATAL
+ | ACE_WORD_SWAP;
+#else
+#error "this driver doesn't run on big-endian machines yet!"
+#endif
+
+ mac1 = 0;
for(i = 0; i < 4; i++){
mac1 = mac1 << 8;
mac1 |= read_eeprom_byte(regs, 0x8c+i);
}
+ mac2 = 0;
for(i = 4; i < 8; i++){
mac2 = mac2 << 8;
mac2 |= read_eeprom_byte(regs, 0x8c+i);
@@ -430,7 +485,14 @@ __initfunc(static int ace_init(struct device *dev))
*/
tmp = READ_CMD_MEM | WRITE_CMD_MEM;
if (ap->version == 2){
+#if 0
+ /*
+ * According to the documentation this enables writes
+ * to all PCI regs - NOT good.
+ */
tmp |= DMA_WRITE_ALL_ALIGN;
+#endif
+ tmp |= MEM_READ_MULTIPLE;
if (ap->pci_command & PCI_COMMAND_INVALIDATE){
switch(L1_CACHE_BYTES){
case 16:
@@ -447,10 +509,8 @@ __initfunc(static int ace_init(struct device *dev))
"supported, PCI write and invalidate "
"disabled\n", L1_CACHE_BYTES);
ap->pci_command &= ~PCI_COMMAND_INVALIDATE;
- pcibios_write_config_word(ap->pci_bus,
- ap->pci_dev_fun,
- PCI_COMMAND,
- ap->pci_command);
+ pci_write_config_word(ap->pdev, PCI_COMMAND,
+ ap->pci_command);
}
}
}
@@ -473,6 +533,13 @@ __initfunc(static int ace_init(struct device *dev))
return -EAGAIN;
}
+ /*
+ * Register the device here to be able to catch allocated
+ * interrupt handlers in case the firmware doesn't come up.
+ */
+ ap->next = root_dev;
+ root_dev = dev;
+
ap->info = info;
memset(info, 0, sizeof(struct ace_info));
@@ -546,41 +613,115 @@ __initfunc(static int ace_init(struct device *dev))
info->tx_csm_ptr = virt_to_bus(&ap->tx_csm);
+ /*
+ * Potential item for tuning parameter
+ */
regs->DmaReadCfg = DMA_THRESH_8W;
regs->DmaWriteCfg = DMA_THRESH_8W;
regs->MaskInt = 0;
regs->IfIdx = 1;
+ regs->AssistState = 1;
#if 0
{
u32 tmp;
- tmp = regs->AssistState;
- tmp &= ~2;
- tmp |= 1;
- regs->AssistState = tmp;
tmp = regs->MacRxState;
tmp &= ~4;
regs->MacRxState = tmp;
}
#endif
+
regs->TuneStatTicks = 2 * TICKS_PER_SEC;
- regs->TuneTxCoalTicks = TICKS_PER_SEC / 500;
- regs->TuneMaxTxDesc = 7;
- regs->TuneRxCoalTicks = TICKS_PER_SEC / 10000;
- regs->TuneMaxRxDesc = 2;
- regs->TuneTrace = 0 /* 0x30001fff */;
- tmp = LNK_ENABLE | LNK_FULL_DUPLEX | LNK_1000MB |
- LNK_RX_FLOW_CTL_Y | LNK_NEG_FCTL | LNK_NEGOTIATE;
- if(ap->version == 1)
- regs->TuneLink = tmp;
- else{
- tmp |= LNK_TX_FLOW_CTL_Y;
- regs->TuneLink = tmp;
- regs->TuneFastLink = tmp;
+
+ if (board_idx >= 0) {
+ if ((board_idx < 8) && tx_coal_tick[board_idx])
+ regs->TuneTxCoalTicks = tx_coal_tick[board_idx] *
+ TICKS_PER_SEC / 1000;
+ else
+ regs->TuneTxCoalTicks = TICKS_PER_SEC / 500;
+ if ((board_idx < 8) && max_tx_desc[board_idx])
+ regs->TuneMaxTxDesc = max_tx_desc[board_idx];
+ else
+ regs->TuneMaxTxDesc = 7;
+
+ if ((board_idx < 8) && rx_coal_tick[board_idx])
+ regs->TuneRxCoalTicks = rx_coal_tick[board_idx] *
+ TICKS_PER_SEC / 1000;
+ else
+ regs->TuneRxCoalTicks = TICKS_PER_SEC / 10000;
+ if ((board_idx < 8) && max_rx_desc[board_idx])
+ regs->TuneMaxRxDesc = max_rx_desc[board_idx];
+ else
+ regs->TuneMaxRxDesc = 2;
+
+ if (board_idx < 8)
+ regs->TuneTrace = trace[board_idx];
+ else
+ regs->TuneTrace = 0;
+ }else{
+ regs->TuneTxCoalTicks = TICKS_PER_SEC / 500;
+ regs->TuneMaxTxDesc = 7;
+ regs->TuneRxCoalTicks = TICKS_PER_SEC / 10000;
+ regs->TuneMaxRxDesc = 2;
+ regs->TuneTrace = 0;
+ }
+
+ tmp = LNK_ENABLE;
+
+ if ((board_idx > 7) || (board_idx < 0) || !(link[board_idx])){
+ if (board_idx > 7)
+ printk(KERN_WARNING "%s: more then 8 NICs detected, "
+ "ignoring link options!\n", dev->name);
+ /*
+ * No link options specified, we go for the defaults
+ */
+ tmp |= LNK_FULL_DUPLEX | LNK_1000MB | LNK_100MB | LNK_10MB |
+ LNK_RX_FLOW_CTL_Y | LNK_NEG_FCTL | LNK_NEGOTIATE;
+
+ if(ap->version == 2)
+ tmp |= LNK_TX_FLOW_CTL_Y;
+ } else {
+ int option = link[board_idx];
+
+ if (option & 0x01){
+ printk(KERN_INFO "%s: Setting half duplex link\n",
+ dev->name);
+ tmp |= LNK_FULL_DUPLEX;
+ }
+ if ((option & 0x02) == 0)
+ tmp |= LNK_NEGOTIATE;
+ if (option & 0x10)
+ tmp |= LNK_10MB;
+ if (option & 0x20)
+ tmp |= LNK_100MB;
+ if (option & 0x40)
+ tmp |= LNK_1000MB;
+ if ((option & 0x70) == 0){
+ printk(KERN_WARNING "%s: No media speed specified, "
+ "forcing auto negotiation\n", dev->name);
+ tmp |= LNK_NEGOTIATE | LNK_1000MB |
+ LNK_100MB | LNK_10MB;
+ }
+ if ((option & 0x100) == 0)
+ tmp |= LNK_NEG_FCTL;
+ else
+ printk(KERN_INFO "%s: Disabling flow control "
+ "negotiation\n", dev->name);
+ if (option & 0x200)
+ tmp |= LNK_RX_FLOW_CTL_Y;
+ if ((option & 0x400) && (ap->version == 2)){
+ printk(KERN_INFO "%s: Enabling TX flow control\n",
+ dev->name);
+ tmp |= LNK_TX_FLOW_CTL_Y;
+ }
}
+ regs->TuneLink = tmp;
+ if (ap->version == 2)
+ regs->TuneFastLink = tmp;
+
if (ap->version == 1)
regs->Pc = tigonFwStartAddr;
else if (ap->version == 2)
@@ -595,18 +736,17 @@ __initfunc(static int ace_init(struct device *dev))
regs->CpuCtrl = (regs->CpuCtrl & ~(CPU_HALT | CPU_TRACE));
/*
- * Wait for the firmware to spin up - max 2 seconds.
+ * Wait for the firmware to spin up - max 3 seconds.
*/
myjif = jiffies + 3 * HZ;
- while ((myjif > jiffies) && !ap->fw_running);
+ while (time_before(jiffies, myjif) && !ap->fw_running);
if (!ap->fw_running){
- printk(KERN_ERR "%s: firmware NOT running!\n", dev->name);
+ printk(KERN_ERR "%s: Firmware NOT running!\n", dev->name);
+ ace_dump_trace(ap);
+ regs->CpuCtrl |= CPU_HALT;
return -EBUSY;
}
- ap->next = root_dev;
- root_dev = dev;
-
/*
* We load the ring here as there seem to be no way to tell the
* firmware to wipe the ring without re-initializing it.
@@ -620,7 +760,6 @@ __initfunc(static int ace_init(struct device *dev))
/*
* Monitor the card to detect hangs.
*/
-
static void ace_timer(unsigned long data)
{
struct device *dev = (struct device *)data;
@@ -643,6 +782,17 @@ static void ace_timer(unsigned long data)
/*
+ * Copy the contents of the NIC's trace buffer to kernel memory.
+ */
+static void ace_dump_trace(struct ace_private *ap)
+{
+ if (!ap->trace_buf)
+ if (!(ap->trace_buf = kmalloc(ACE_TRACE_SIZE, GFP_KERNEL)));
+ return;
+}
+
+
+/*
* Load the standard rx ring.
*/
static int ace_load_std_rx_ring(struct device *dev)
@@ -822,7 +972,6 @@ static u32 ace_handle_event(struct device *dev, u32 evtcsm, u32 evtprd)
ap->fw_running = 1;
break;
case E_STATS_UPDATED:
- mod_timer(&ap->timer, jiffies + (5/2*HZ));
break;
case E_LNK_STATE:
{
@@ -1036,18 +1185,6 @@ static void ace_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
return;
}
-#if 0
- /*
- * Since we are also using a spinlock, I wonder if this is
- * actually worth it.
- */
- if (test_and_set_bit(0, (void*)&dev->interrupt) != 0) {
- printk(KERN_WARNING "%s: Re-entering the interrupt handler.\n",
- dev->name);
- return;
- }
-#endif
-
/*
* Tell the card not to generate interrupts while we are in here.
*/
@@ -1076,6 +1213,12 @@ static void ace_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
ap->tx_full = 0;
dev->tbusy = 0;
mark_bh(NET_BH);
+
+ /*
+ * TX ring is no longer full, aka the
+ * transmitter is working fine - kill timer.
+ */
+ del_timer(&ap->timer);
}
ap->tx_ret_csm = txcsm;
@@ -1098,9 +1241,6 @@ static void ace_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
regs->Mb0Lo = 0;
spin_unlock(&ap->lock);
-#if 0
- dev->interrupt = 0;
-#endif
}
@@ -1140,7 +1280,7 @@ static int ace_open(struct device *dev)
#if 0
{ long myjif = jiffies + HZ;
- while (jiffies < myjif);
+ while (time_before(jiffies, myjif));
}
cmd.evt = C_LNK_NEGOTIATION;
@@ -1159,10 +1299,8 @@ static int ace_open(struct device *dev)
* Setup the timer
*/
init_timer(&ap->timer);
- ap->timer.expires = jiffies + 5/2 * HZ;
ap->timer.data = (unsigned long)dev;
- ap->timer.function = &ace_timer;
- add_timer(&ap->timer);
+ ap->timer.function = ace_timer;
return 0;
}
@@ -1239,6 +1377,12 @@ static int ace_start_xmit(struct sk_buff *skb, struct device *dev)
if ((idx + 1) % TX_RING_ENTRIES == ap->tx_ret_csm){
ap->tx_full = 1;
set_bit(0, (void*)&dev->tbusy);
+ /*
+ * Queue is full, add timer to detect whether the
+ * transmitter is stuck.
+ */
+ ap->timer.expires = jiffies + (3 * HZ);
+ add_timer(&ap->timer);
}
spin_unlock_irqrestore(&ap->lock, flags);
@@ -1342,11 +1486,14 @@ static struct net_device_stats *ace_get_stats(struct device *dev)
}
-__initfunc(int ace_copy(struct ace_regs *regs, void *src, u32 dest, int size))
+__initfunc(void ace_copy(struct ace_regs *regs, void *src, u32 dest, int size))
{
int tsize;
u32 tdest;
+ if (size <= 0)
+ return;
+
while(size > 0){
tsize = min(((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
min(size, ACE_WINDOW_SIZE));
@@ -1365,15 +1512,18 @@ __initfunc(int ace_copy(struct ace_regs *regs, void *src, u32 dest, int size))
size -= tsize;
}
- return 0;
+ return;
}
-__initfunc(int ace_clear(struct ace_regs *regs, u32 dest, int size))
+__initfunc(void ace_clear(struct ace_regs *regs, u32 dest, int size))
{
- int tsize;
+ int tsize = 0;
u32 tdest;
+ if (size <= 0)
+ return;
+
while(size > 0){
tsize = min(((~dest & (ACE_WINDOW_SIZE - 1)) + 1),
min(size, ACE_WINDOW_SIZE));
@@ -1386,7 +1536,7 @@ __initfunc(int ace_clear(struct ace_regs *regs, u32 dest, int size))
size -= tsize;
}
- return 0;
+ return;
}
diff --git a/drivers/net/acenic.h b/drivers/net/acenic.h
index e84be5f7b..deca3e895 100644
--- a/drivers/net/acenic.h
+++ b/drivers/net/acenic.h
@@ -142,6 +142,8 @@ struct ace_regs {
#define ACE_JUMBO_MTU 9000
#define ACE_STD_MTU 1500
+#define ACE_TRACE_SIZE 0x8000
+
/*
* Host control register bits.
*/
@@ -205,20 +207,13 @@ struct ace_regs {
#define DMA_WRITE_MAX_128 0xa0
#define DMA_WRITE_MAX_256 0xc0
#define DMA_WRITE_MAX_1K 0xe0
+#define MEM_READ_MULTIPLE 0x00020000
#define DMA_WRITE_ALL_ALIGN 0x00800000
#define READ_CMD_MEM 0x06000000
#define WRITE_CMD_MEM 0x70000000
/*
- * Transmit status.
- */
-
-#define ENA_XMIT 0x01
-#define PERM_CON 0x02
-
-
-/*
* Mode status
*/
@@ -580,12 +575,17 @@ struct ace_private
__attribute__ ((aligned (L1_CACHE_BYTES)));
struct device *next
__attribute__ ((aligned (L1_CACHE_BYTES)));
+ unsigned char *trace_buf;
int fw_running, fw_up, jumbo, promisc;
int version;
- int vendor;
+ int flags;
+ u16 vendor;
u16 pci_command;
+ struct pci_dev *pdev;
+#if 0
u8 pci_bus;
u8 pci_dev_fun;
+#endif
char name[24];
struct net_device_stats stats;
};
@@ -593,7 +593,7 @@ struct ace_private
/*
* Prototypes
*/
-static int ace_init(struct device *dev);
+static int ace_init(struct device *dev, int board_idx);
static int ace_load_std_rx_ring(struct device *dev);
static int ace_load_jumbo_rx_ring(struct device *dev);
static int ace_flush_jumbo_rx_ring(struct device *dev);
@@ -603,6 +603,7 @@ static int ace_open(struct device *dev);
static int ace_start_xmit(struct sk_buff *skb, struct device *dev);
static int ace_close(struct device *dev);
static void ace_timer(unsigned long data);
+static void ace_dump_trace(struct ace_private *ap);
static void ace_set_multicast_list(struct device *dev);
static int ace_change_mtu(struct device *dev, int new_mtu);
static int ace_set_mac_addr(struct device *dev, void *p);
diff --git a/drivers/net/acenic_firmware.h b/drivers/net/acenic_firmware.h
index 2c7d4f478..7e2472c51 100644
--- a/drivers/net/acenic_firmware.h
+++ b/drivers/net/acenic_firmware.h
@@ -1,28 +1,28 @@
/* Generated by genfw.c */
int tigonFwReleaseMajor = 0xc;
int tigonFwReleaseMinor = 0x1;
-int tigonFwReleaseFix = 0x4;
+int tigonFwReleaseFix = 0x6;
u32 tigonFwStartAddr = 0x4000;
u32 tigonFwTextAddr = 0x4000;
-int tigonFwTextLen = 0x10300;
-u32 tigonFwDataAddr = 0x14d40;
+int tigonFwTextLen = 0x10500;
+u32 tigonFwDataAddr = 0x14f50;
int tigonFwDataLen = 0x140;
-u32 tigonFwRodataAddr = 0x14300;
-int tigonFwRodataLen = 0xa20;
-u32 tigonFwBssAddr = 0x14eb0;
+u32 tigonFwRodataAddr = 0x14500;
+int tigonFwRodataLen = 0xa30;
+u32 tigonFwBssAddr = 0x150c0;
int tigonFwBssLen = 0x2080;
-u32 tigonFwSbssAddr = 0x14e80;
+u32 tigonFwSbssAddr = 0x15090;
int tigonFwSbssLen = 0x28;
-u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
-0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001, 0x8fbd4d74,
+u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] __initdata = {
+0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001, 0x8fbd4f84,
0x3a0f021, 0x3c100000, 0x26104000, 0xc00100c, 0x0, 0xd,
0x27bdffd8, 0x3c1cc000, 0x3c1b0013, 0x377bd800, 0xd021, 0x3c170013,
-0x36f75430, 0x2e02021, 0x340583d0, 0xafbf0024, 0xc00242c, 0xafb00020,
-0xc00238c, 0x0, 0x3c040001, 0x24844360, 0x24050001, 0x2e03021,
-0x3821, 0x3c100001, 0x26106f30, 0xafb00010, 0xc0023a7, 0xafbb0014,
+0x36f75430, 0x2e02021, 0x340583d0, 0xafbf0024, 0xc002488, 0xafb00020,
+0xc0023e8, 0x0, 0x3c040001, 0x24844560, 0x24050001, 0x2e03021,
+0x3821, 0x3c100001, 0x26107140, 0xafb00010, 0xc002403, 0xafbb0014,
0x3c02000f, 0x3442ffff, 0x2021024, 0x362102b, 0x10400009, 0x24050003,
-0x3c040001, 0x2484436c, 0x2003021, 0x3603821, 0x3c020010, 0xafa20010,
-0xc0023a7, 0xafa00014, 0x2021, 0x3405c000, 0x3c010001, 0x370821,
+0x3c040001, 0x2484456c, 0x2003021, 0x3603821, 0x3c020010, 0xafa20010,
+0xc002403, 0xafa00014, 0x2021, 0x3405c000, 0x3c010001, 0x370821,
0xa02083a0, 0x3c010001, 0x370821, 0xa02083a2, 0x3c010001, 0x370821,
0xa02083a3, 0x3c010001, 0x370821, 0xac2083a4, 0xa2e004c8, 0x418c0,
0x24840001, 0x771021, 0xac40726c, 0x771021, 0xac407270, 0x2e31021,
@@ -46,122 +46,124 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x8f8200b0, 0x8ee304bc, 0x431025, 0xaf8200b0, 0x8f8200b0, 0x30420004,
0x1440fffd, 0x0, 0x8ee20450, 0x8ee30454, 0xaee304ec, 0x8ee204ec,
0x2442e000, 0x2c422001, 0x1440000d, 0x26e40030, 0x8ee20450, 0x8ee30454,
-0x3c040001, 0x24844378, 0x3c050001, 0xafa00010, 0xafa00014, 0x8ee704ec,
-0x34a5f000, 0xc0023a7, 0x603021, 0x26e40030, 0xc00242c, 0x24050400,
-0x27440080, 0xc00242c, 0x24050080, 0x26e4776c, 0xc00242c, 0x24050400,
+0x3c040001, 0x24844578, 0x3c050001, 0xafa00010, 0xafa00014, 0x8ee704ec,
+0x34a5f000, 0xc002403, 0x603021, 0x26e40030, 0xc002488, 0x24050400,
+0x27440080, 0xc002488, 0x24050080, 0x26e4776c, 0xc002488, 0x24050400,
0x8f42025c, 0x26e40094, 0xaee20060, 0x8f420260, 0x27450200, 0x24060008,
-0xaee20068, 0x24020006, 0xc00243e, 0xaee20064, 0x3c023b9a, 0x3442ca00,
+0xaee20068, 0x24020006, 0xc00249a, 0xaee20064, 0x3c023b9a, 0x3442ca00,
0x2021, 0x24030002, 0xaee30074, 0xaee30070, 0xaee2006c, 0x240203e8,
0xaee20104, 0x24020001, 0xaee30100, 0xaee2010c, 0x3c030001, 0x641821,
-0x90634d40, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8,
+0x90634f50, 0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8,
0x0, 0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030,
0xa062009c, 0x2e41021, 0xa040009c, 0x96e2046a, 0x30420003, 0x14400009,
-0x0, 0x96e2047a, 0x30420003, 0x5040012b, 0x3c030800, 0x96e2046a,
+0x0, 0x96e2047a, 0x30420003, 0x50400131, 0x3c030800, 0x96e2046a,
0x30420003, 0x1040002a, 0x3c020700, 0x96e2047a, 0x30420003, 0x10400026,
0x3c020700, 0x96e3047a, 0x96e2046a, 0x14620022, 0x3c020700, 0x8ee204b0,
0x24030001, 0xa2e34e10, 0x34420e00, 0xaee204b0, 0x8f420218, 0x30420100,
-0x10400005, 0x0, 0x3c020001, 0x2442ded0, 0x800111d, 0x21100,
-0x3c020001, 0x2442d0d0, 0x21100, 0x21182, 0x3c030800, 0x431025,
-0x3c010001, 0xac220f38, 0x3c020001, 0x2442f3c8, 0x21100, 0x21182,
-0x3c030800, 0x431025, 0x3c010001, 0xac220f78, 0x8ee20000, 0x34424000,
-0x8001232, 0xaee20000, 0x34423000, 0xafa20018, 0x8ee205f8, 0x8f430228,
-0x24420001, 0x304900ff, 0x512300dc, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x10400005, 0x0, 0x3c020001, 0x2442e128, 0x800111d, 0x21100,
+0x3c020001, 0x2442d31c, 0x21100, 0x21182, 0x3c030800, 0x431025,
+0x3c010001, 0xac221138, 0x3c020001, 0x2442f640, 0x21100, 0x21182,
+0x3c030800, 0x431025, 0x3c010001, 0xac221178, 0x8ee20000, 0x34424000,
+0x8001238, 0xaee20000, 0x34423000, 0xafa20018, 0x8ee205f8, 0x8f430228,
+0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 0x8ee205f8, 0x210c0,
0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f870120,
0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
-0x15020007, 0x1021, 0x8ee201a0, 0x3021, 0x24420001, 0xaee201a0,
-0x800119d, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430,
-0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018,
-0xace9001c, 0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4,
-0xace20010, 0xaf880120, 0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x8001187,
-0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x800119d,
-0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c,
-0xaee905f8, 0x3c040001, 0x24844384, 0xafa00010, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f000, 0x800121d, 0x0,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
-0xaee201a0, 0x8001201, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x3021, 0x24420001, 0xaee201a0, 0x80011a0, 0x8ee201a0, 0x8ee405f8,
+0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee305f8, 0x24020008,
+0xa4e2000e, 0x2402000d, 0xace20018, 0xace9001c, 0x318c0, 0x246305fc,
+0x2e31021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
+0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001,
+0x10a20005, 0x0, 0x800118a, 0x0, 0x14a00005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400013, 0xac800000, 0x80011a0, 0x0, 0x8ee24e20, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000,
+0x24020001, 0xac820004, 0x54c0000c, 0xaee905f8, 0x3c040001, 0x24844584,
+0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f000, 0x8001223, 0x0, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
+0xaee201a0, 0x8001207, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028,
0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24,
-0x24420001, 0x10a20005, 0x0, 0x80011eb, 0x0, 0x14a00005,
+0x24420001, 0x10a20005, 0x0, 0x80011f1, 0x0, 0x14a00005,
0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x8001201, 0x0, 0x8ee24e20,
+0x2c420011, 0x50400013, 0xac800000, 0x8001207, 0x0, 0x8ee24e20,
0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001,
0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
0xac820000, 0x24020001, 0xac820004, 0x14c0001b, 0x0, 0x3c040001,
-0x2484438c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
-0xc0023a7, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x800121d,
-0x8ee201ac, 0x3c040001, 0x24844398, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0xc0023a7, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
-0x8ee201a8, 0x8ee2015c, 0x3c040001, 0x248443a4, 0x3405f001, 0x24420001,
-0xaee2015c, 0x8ee2015c, 0x3021, 0x3821, 0xafa00010, 0xc0023a7,
-0xafa00014, 0x8001232, 0x0, 0x3c020001, 0x2442f2f0, 0x21100,
-0x21182, 0x431025, 0x3c010001, 0xac220f78, 0x96e2045a, 0x30420003,
+0x2484458c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8001223,
+0x8ee201ac, 0x3c040001, 0x24844598, 0xafa00014, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
+0x8ee201a8, 0x8ee2015c, 0x3c040001, 0x248445a4, 0x3405f001, 0x24420001,
+0xaee2015c, 0x8ee2015c, 0x3021, 0x3821, 0xafa00010, 0xc002403,
+0xafa00014, 0x8001238, 0x0, 0x3c020001, 0x2442f568, 0x21100,
+0x21182, 0x431025, 0x3c010001, 0xac221178, 0x96e2045a, 0x30420003,
0x10400025, 0x3c050fff, 0x8ee204b8, 0x34a5ffff, 0x34420a00, 0xaee204b8,
-0x8ee304b8, 0x3c040001, 0x248443b0, 0x24020001, 0xa2e204dc, 0xa2e204dd,
-0x3c020002, 0x621825, 0x3c020001, 0x2442a1c0, 0x451024, 0x21082,
-0xaee304b8, 0x3c030800, 0x431025, 0x3c010001, 0xac220f20, 0x3c020001,
-0x2442abb4, 0x451024, 0x21082, 0x431025, 0x3c010001, 0xac220f80,
-0x96e6045a, 0x3821, 0x24050011, 0xafa00010, 0xc0023a7, 0xafa00014,
-0x8001262, 0x0, 0x3c020001, 0x2442a7e0, 0x21100, 0x21182,
-0x3c030800, 0x431025, 0x3c010001, 0xac220f80, 0x96e2046a, 0x30420010,
-0x14400009, 0x0, 0x96e2047a, 0x30420010, 0x1040010c, 0x0,
+0x8ee304b8, 0x3c040001, 0x248445b0, 0x24020001, 0xa2e204dc, 0xa2e204dd,
+0x3c020002, 0x621825, 0x3c020001, 0x2442a390, 0x451024, 0x21082,
+0xaee304b8, 0x3c030800, 0x431025, 0x3c010001, 0xac221120, 0x3c020001,
+0x2442adb4, 0x451024, 0x21082, 0x431025, 0x3c010001, 0xac221180,
+0x96e6045a, 0x3821, 0x24050011, 0xafa00010, 0xc002403, 0xafa00014,
+0x8001268, 0x0, 0x3c020001, 0x2442a9d4, 0x21100, 0x21182,
+0x3c030800, 0x431025, 0x3c010001, 0xac221180, 0x96e2046a, 0x30420010,
+0x14400009, 0x0, 0x96e2047a, 0x30420010, 0x10400112, 0x0,
0x96e2046a, 0x30420010, 0x10400005, 0x3c020700, 0x96e2047a, 0x30420010,
-0x144000fc, 0x3c020700, 0x34423000, 0xafa20018, 0x8ee205f8, 0x8f430228,
-0x24420001, 0x304900ff, 0x512300dc, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x14400102, 0x3c020700, 0x34423000, 0xafa20018, 0x8ee205f8, 0x8f430228,
+0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 0x8ee205f8, 0x210c0,
0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f870120,
0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
-0x15020007, 0x1021, 0x8ee201a0, 0x3021, 0x24420001, 0xaee201a0,
-0x80012e1, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430,
-0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018,
-0xace9001c, 0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4,
-0xace20010, 0xaf880120, 0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80012cb,
-0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80012e1,
-0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c,
-0xaee905f8, 0x3c040001, 0x24844384, 0xafa00010, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f000, 0x8001361, 0x0,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
-0xaee201a0, 0x8001345, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x3021, 0x24420001, 0xaee201a0, 0x80012ea, 0x8ee201a0, 0x8ee405f8,
+0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee305f8, 0x24020008,
+0xa4e2000e, 0x2402000d, 0xace20018, 0xace9001c, 0x318c0, 0x246305fc,
+0x2e31021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
+0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001,
+0x10a20005, 0x0, 0x80012d4, 0x0, 0x14a00005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400013, 0xac800000, 0x80012ea, 0x0, 0x8ee24e20, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000,
+0x24020001, 0xac820004, 0x54c0000c, 0xaee905f8, 0x3c040001, 0x24844584,
+0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f000, 0x800136d, 0x0, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
+0xaee201a0, 0x8001351, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028,
0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24,
-0x24420001, 0x10a20005, 0x0, 0x800132f, 0x0, 0x14a00005,
+0x24420001, 0x10a20005, 0x0, 0x800133b, 0x0, 0x14a00005,
0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x8001345, 0x0, 0x8ee24e20,
+0x2c420011, 0x50400013, 0xac800000, 0x8001351, 0x0, 0x8ee24e20,
0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001,
0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
0xac820000, 0x24020001, 0xac820004, 0x14c0001b, 0x0, 0x3c040001,
-0x2484438c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
-0xc0023a7, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8001361,
-0x8ee201ac, 0x3c040001, 0x24844398, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0xc0023a7, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
-0x8ee201a8, 0x8ee2015c, 0x3c040001, 0x248443a4, 0x3405f002, 0x24420001,
-0xaee2015c, 0x8ee2015c, 0x3021, 0x3821, 0xafa00010, 0xc0023a7,
-0xafa00014, 0x96e6047a, 0x96e7046a, 0x3c040001, 0x248443bc, 0x24050012,
-0xafa00010, 0xc0023a7, 0xafa00014, 0xc004440, 0x0, 0xc0022b8,
+0x2484458c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x800136d,
+0x8ee201ac, 0x3c040001, 0x24844598, 0xafa00014, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
+0x8ee201a8, 0x8ee2015c, 0x3c040001, 0x248445a4, 0x3405f002, 0x24420001,
+0xaee2015c, 0x8ee2015c, 0x3021, 0x3821, 0xafa00010, 0xc002403,
+0xafa00014, 0x96e6047a, 0x96e7046a, 0x3c040001, 0x248445bc, 0x24050012,
+0xafa00010, 0xc002403, 0xafa00014, 0xc0044c0, 0x0, 0xc002314,
0x0, 0x3c060001, 0x34c63800, 0xaee005f8, 0xaf400228, 0xaf40022c,
0x96e30458, 0x8ee40000, 0x3c0512d8, 0x34a5c358, 0x27623800, 0xaee27248,
0x27623800, 0xaee27250, 0x27623800, 0xaee27254, 0x3661021, 0xaee27260,
@@ -170,464 +172,391 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0xaee05234, 0xaee05230, 0xaee0522c, 0xaee07240, 0xaee07244, 0xaee0724c,
0xaee07258, 0xaee004c0, 0x2463ffff, 0x852025, 0xaee304e8, 0xaee40000,
0xaf800060, 0xaf820064, 0x3c020100, 0xafa20018, 0x8ee205f8, 0x8f430228,
-0x24420001, 0x304900ff, 0x512300dc, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 0x8ee205f8, 0x210c0,
0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f870120,
0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
-0x15020007, 0x1021, 0x8ee201a0, 0x3021, 0x24420001, 0xaee201a0,
-0x8001413, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430,
-0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018,
-0xace9001c, 0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4,
-0xace20010, 0xaf880120, 0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80013fd,
-0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x8001413,
-0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54c0000c,
-0xaee905f8, 0x3c040001, 0x24844384, 0xafa00010, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f000, 0x8001493, 0x0,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
-0xaee201a0, 0x8001477, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x3021, 0x24420001, 0xaee201a0, 0x8001422, 0x8ee201a0, 0x8ee405f8,
+0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee305f8, 0x24020008,
+0xa4e2000e, 0x2402000d, 0xace20018, 0xace9001c, 0x318c0, 0x246305fc,
+0x2e31021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
+0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001,
+0x10a20005, 0x0, 0x800140c, 0x0, 0x14a00005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400013, 0xac800000, 0x8001422, 0x0, 0x8ee24e20, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000,
+0x24020001, 0xac820004, 0x54c0000c, 0xaee905f8, 0x3c040001, 0x24844584,
+0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f000, 0x80014a5, 0x0, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3021, 0x24420001,
+0xaee201a0, 0x8001489, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
0x92e24e10, 0x14400037, 0x24060001, 0x8ee24e20, 0x210c0, 0x24425028,
0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24,
-0x24420001, 0x10a20005, 0x0, 0x8001461, 0x0, 0x14a00005,
+0x24420001, 0x10a20005, 0x0, 0x8001473, 0x0, 0x14a00005,
0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x8001477, 0x0, 0x8ee24e20,
+0x2c420011, 0x50400013, 0xac800000, 0x8001489, 0x0, 0x8ee24e20,
0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001,
0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
0xac820000, 0x24020001, 0xac820004, 0x14c0001b, 0x0, 0x3c040001,
-0x2484438c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
-0xc0023a7, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x8001493,
-0x8ee201ac, 0x3c040001, 0x24844398, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0xc0023a7, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
-0x8ee201a8, 0x8ee20150, 0x24420001, 0xaee20150, 0xc0014c8, 0x8ee20150,
+0x2484458c, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x80014a5,
+0x8ee201ac, 0x3c040001, 0x24844598, 0xafa00014, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
+0x8ee201a8, 0x8ee20150, 0x24420001, 0xaee20150, 0xc0014dc, 0x8ee20150,
0x8f8200a0, 0x30420004, 0x1440fffd, 0x0, 0x8f820040, 0x30420001,
0x14400008, 0x0, 0x8f430104, 0x24020001, 0x10620004, 0x0,
0x8f420264, 0x10400006, 0x0, 0x8ee20178, 0x24420001, 0xaee20178,
-0x80014b3, 0x8ee20178, 0x8f820044, 0x34420004, 0xaf820044, 0x8ee20174,
+0x80014c5, 0x8ee20178, 0x8f820044, 0x34420004, 0xaf820044, 0x8ee20174,
0x24420001, 0xaee20174, 0x8ee20174, 0x8f8200d8, 0x8f8300d4, 0x431023,
0xaee2725c, 0x8ee2725c, 0x1c400003, 0x3c030001, 0x431021, 0xaee2725c,
-0xc003fb0, 0x0, 0xc004380, 0xaf800228, 0x8fbf0024, 0x8fb00020,
+0xc004054, 0x0, 0xc004400, 0xaf800228, 0x8fbf0024, 0x8fb00020,
0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 0x3e00008, 0x0,
-0x2402002c, 0xaf820050, 0xaee07264, 0x8f420238, 0xaee27268, 0x8f820054,
-0x24420067, 0xaf820058, 0xaee07b78, 0xaee07b7c, 0xaee07b74, 0x3c010001,
-0x370821, 0xac2083ac, 0x3c010001, 0x370821, 0x3e00008, 0xa02083a9,
-0x27bdffd8, 0xafbf0024, 0xafb00020, 0x8f820054, 0x3c030001, 0x8c634dfc,
-0x24420067, 0x1060000d, 0xaf820058, 0x3c020001, 0x571021, 0x904283a8,
-0x10400005, 0x3c030200, 0x3c010001, 0x370821, 0x80014ef, 0xa02083a8,
-0x8ee20000, 0x431025, 0xaee20000, 0x8f420218, 0x30420100, 0x104000c3,
-0x0, 0x8f8200b0, 0x30420004, 0x104000bf, 0x0, 0x3c030001,
-0x771821, 0x8c6383c0, 0x8f820104, 0x146200b1, 0x0, 0x3c030001,
-0x771821, 0x8c6383c4, 0x8f8200b4, 0x146200ab, 0x0, 0x8f8200b0,
-0x3c030080, 0x431024, 0x1040000d, 0x0, 0x8f82011c, 0x34420002,
-0xaf82011c, 0x8f8200b0, 0x2403fffb, 0x431024, 0xaf8200b0, 0x8f82011c,
-0x2403fffd, 0x431024, 0x80015b5, 0xaf82011c, 0x3c030001, 0x771821,
-0x8c6383c0, 0x8f820104, 0x1462007f, 0x0, 0x3c030001, 0x771821,
-0x8c6383c4, 0x8f8200b4, 0x14620079, 0x0, 0x3c070001, 0xf73821,
-0x8ce783c0, 0x8f8200b0, 0x3c040001, 0x24844430, 0xafa00014, 0xafa20010,
-0x8f8600b0, 0x3c050005, 0xc0023a7, 0x34a50900, 0x8f82011c, 0x34420002,
-0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0xaf830104,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20006, 0x0, 0x8ee201a0, 0x24420001, 0xaee201a0,
-0x8001589, 0x8ee201a0, 0x8f440208, 0x8f45020c, 0x26e20030, 0xac620008,
-0x24020400, 0xa462000e, 0x2402000f, 0xac620018, 0xac60001c, 0xac640000,
+0x0, 0x0, 0x2402002c, 0xaf820050, 0xaee07264, 0x8f420238,
+0xaee27268, 0x8f820054, 0x24420067, 0xaf820058, 0xaee07b78, 0xaee07b7c,
+0xaee07b74, 0x3c010001, 0x370821, 0xac2083ac, 0x3c010001, 0x370821,
+0x3e00008, 0xa02083a9, 0x27bdffd8, 0xafbf0024, 0xafb00020, 0x8f820054,
+0x3c030001, 0x8c63500c, 0x24420067, 0x1060000d, 0xaf820058, 0x3c020001,
+0x571021, 0x904283a8, 0x10400005, 0x3c030200, 0x3c010001, 0x370821,
+0x8001503, 0xa02083a8, 0x8ee20000, 0x431025, 0xaee20000, 0x8f420218,
+0x30420100, 0x104000c6, 0x0, 0x8f8200b0, 0x30420004, 0x104000c2,
+0x0, 0x3c030001, 0x771821, 0x8c6383c0, 0x8f820104, 0x146200b4,
+0x0, 0x3c030001, 0x771821, 0x8c6383c4, 0x8f8200b4, 0x146200ae,
+0x0, 0x8f8200b0, 0x3c030080, 0x431024, 0x1040000d, 0x0,
+0x8f82011c, 0x34420002, 0xaf82011c, 0x8f8200b0, 0x2403fffb, 0x431024,
+0xaf8200b0, 0x8f82011c, 0x2403fffd, 0x431024, 0x80015cc, 0xaf82011c,
+0x3c030001, 0x771821, 0x8c6383c0, 0x8f820104, 0x14620082, 0x0,
+0x3c030001, 0x771821, 0x8c6383c4, 0x8f8200b4, 0x1462007c, 0x0,
+0x3c070001, 0xf73821, 0x8ce783c0, 0x8f8200b0, 0x3c040001, 0x24844630,
+0xafa00014, 0xafa20010, 0x8f8600b0, 0x3c050005, 0xc002403, 0x34a50900,
+0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001,
+0xaf8200b0, 0xaf830104, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
+0x14c20006, 0x0, 0x8ee201a0, 0x24420001, 0xaee201a0, 0x80015a0,
+0x8ee201a0, 0x8f440208, 0x8f45020c, 0x26e20030, 0xac620008, 0x24020400,
+0xa462000e, 0x2402000f, 0xac620018, 0xac60001c, 0xac640000, 0xac650004,
+0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x0,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007,
+0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001,
+0x10430007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0,
+0x800158a, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
+0x80015a0, 0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004,
+0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201d4, 0x3c070001,
+0xf73821, 0x8ce783c0, 0x24420001, 0xaee201d4, 0x8ee201d4, 0x3c040001,
+0x2484463c, 0x80015bd, 0xafa00010, 0x8f820104, 0x3c010001, 0x370821,
+0xac2283c0, 0x8f8200b4, 0x3c070001, 0xf73821, 0x8ce783c0, 0x3c040001,
+0x24844644, 0x3c010001, 0x370821, 0xac2283c4, 0xafa00010, 0xafa00014,
+0x8f8600b0, 0x3c050005, 0xc002403, 0x34a50900, 0x80015cc, 0x0,
+0x8f820104, 0x3c010001, 0x370821, 0xac2283c0, 0x8f8200b4, 0x3c010001,
+0x370821, 0xac2283c4, 0x8ee27264, 0x92e304e4, 0x24420067, 0x14600006,
+0xaee27264, 0x8ee27264, 0x8f430234, 0x43102b, 0x1440007b, 0x0,
+0x8ee304d4, 0x8ee204e8, 0x14620004, 0x0, 0x92e204e4, 0x50400074,
+0xa2e004e4, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001,
+0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007,
+0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8001637,
+0x8ee201a0, 0x8ee204d4, 0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c,
+0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000,
0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037,
-0x0, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
-0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
+0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
+0x24020012, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20,
0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005,
-0x0, 0x8001573, 0x0, 0x14a00005, 0x0, 0x8f820128,
+0x0, 0x8001621, 0x0, 0x14a00005, 0x0, 0x8f820128,
0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8001589, 0x0, 0x8ee24e20, 0x24030040, 0x24420001,
+0xac800000, 0x8001637, 0x0, 0x8ee24e20, 0x24030040, 0x24420001,
0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001,
-0xac820004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201d4,
-0x3c070001, 0xf73821, 0x8ce783c0, 0x24420001, 0xaee201d4, 0x8ee201d4,
-0x3c040001, 0x2484443c, 0x80015a6, 0xafa00010, 0x8f820104, 0x3c010001,
-0x370821, 0xac2283c0, 0x8f8200b4, 0x3c070001, 0xf73821, 0x8ce783c0,
-0x3c040001, 0x24844444, 0x3c010001, 0x370821, 0xac2283c4, 0xafa00010,
-0xafa00014, 0x8f8600b0, 0x3c050005, 0xc0023a7, 0x34a50900, 0x80015b5,
-0x0, 0x8f820104, 0x3c010001, 0x370821, 0xac2283c0, 0x8f8200b4,
-0x3c010001, 0x370821, 0xac2283c4, 0x8ee27264, 0x92e304e4, 0x24420067,
-0x14600006, 0xaee27264, 0x8ee27264, 0x8f430234, 0x43102b, 0x14400078,
-0x0, 0x8ee304d4, 0x8ee204e8, 0x14620004, 0x0, 0x92e204e4,
-0x50400071, 0xa2e004e4, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
-0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0, 0x8ee201a0,
-0x8021, 0x24420001, 0xaee201a0, 0x800161d, 0x8ee201a0, 0x8ee204d4,
-0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c, 0xac620008, 0x24020008,
+0x210c0, 0x24425028, 0x2e22021, 0x24020012, 0xac820000, 0x24020001,
+0xac820004, 0x5600000b, 0x24100001, 0x8ee204d4, 0x3c040001, 0x2484464c,
+0xafa00014, 0xafa20010, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f006, 0x16000003, 0x24020001, 0x8001650, 0xa2e204e4, 0x8ee2016c,
+0x24420001, 0xaee2016c, 0x8ee2016c, 0x8ee204d4, 0xa2e004e4, 0xaee004e0,
+0xaee07264, 0xaee204e8, 0x8ee20e0c, 0x1040006d, 0x0, 0x8f830120,
+0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128,
+0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a0,
+0x8021, 0x24420001, 0xaee201a0, 0x80016ad, 0x8ee201a0, 0x8ee2723c,
+0xac62001c, 0x8ee40498, 0x8ee5049c, 0x2462001c, 0xac620008, 0x24020008,
0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204b4,
0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20,
0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012, 0x1462001f,
0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x8001607,
+0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x8001697,
0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x800161d,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80016ad,
0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b,
-0x24100001, 0x8ee204d4, 0x3c040001, 0x2484444c, 0xafa00014, 0xafa20010,
-0x8ee605f8, 0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f006, 0x16000003,
-0x24020001, 0x8001636, 0xa2e204e4, 0x8ee2016c, 0x24420001, 0xaee2016c,
-0x8ee2016c, 0x8ee204d4, 0xa2e004e4, 0xaee004e0, 0xaee07264, 0xaee204e8,
-0x8ee20e0c, 0x1040006a, 0x0, 0x8f830120, 0x27623800, 0x24660020,
-0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0,
-0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8001690, 0x8ee201a0,
-0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c, 0x2462001c, 0xac620008,
-0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004,
-0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012,
-0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040,
-0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001,
-0x10430007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0,
-0x800167a, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
-0x8001690, 0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004,
-0x5600000b, 0x24100001, 0x8ee2723c, 0x3c040001, 0x24844458, 0xafa00014,
-0xafa20010, 0x8ee6723c, 0x8f470280, 0x3c050009, 0xc0023a7, 0x34a5f008,
-0x56000001, 0xaee00e0c, 0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170,
-0x8ee24e14, 0x10400019, 0x0, 0xaee04e14, 0x8f820040, 0x30420001,
-0x14400008, 0x0, 0x8f430104, 0x24020001, 0x10620004, 0x0,
-0x8f420264, 0x10400006, 0x0, 0x8ee20178, 0x24420001, 0xaee20178,
-0x80016bd, 0x8ee20178, 0x8f820044, 0x34420004, 0xaf820044, 0x8ee20174,
-0x24420001, 0xaee20174, 0x8ee20174, 0x8ee27268, 0x2442ff99, 0xaee27268,
-0x8ee27268, 0x1c400299, 0x0, 0x8f420238, 0x10400296, 0x0,
-0x8f420080, 0xaee2004c, 0x8f4200c0, 0xaee20048, 0x8f420084, 0xaee20038,
-0x8f420084, 0xaee20234, 0x8f420088, 0xaee20238, 0x8f42008c, 0xaee2023c,
-0x8f420090, 0xaee20240, 0x8f420094, 0xaee20244, 0x8f420098, 0xaee20248,
-0x8f42009c, 0xaee2024c, 0x8f4200a0, 0xaee20250, 0x8f4200a4, 0xaee20254,
-0x8f4200a8, 0xaee20258, 0x8f4200ac, 0xaee2025c, 0x8f4200b0, 0xaee20260,
-0x8f4200b4, 0xaee20264, 0x8f4200b8, 0xaee20268, 0x8f4200bc, 0x24040001,
-0xaee2026c, 0xaee0003c, 0x41080, 0x571021, 0x8ee3003c, 0x8c420234,
-0x24840001, 0x621821, 0x2c82000f, 0xaee3003c, 0x1440fff8, 0x41080,
-0x8f4200cc, 0xaee20050, 0x8f4200d0, 0xaee20054, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8001750,
-0x8ee201a0, 0x8f440208, 0x8f45020c, 0x26e20030, 0xac620008, 0x24020400,
-0xa462000e, 0x2402000f, 0xac620018, 0xac60001c, 0xac640000, 0xac650004,
-0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007,
-0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040,
-0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001,
-0x10430007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0,
-0x800173a, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
-0x8001750, 0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004,
-0x12000206, 0x3c020400, 0xafa20018, 0x3c020001, 0x571021, 0x904283a0,
-0x10400105, 0x0, 0x8ee205f8, 0x8f430228, 0x24420001, 0x304a00ff,
-0x514300f7, 0xafa00010, 0x8ee205f8, 0x210c0, 0x571021, 0x8fa30018,
-0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054, 0x8f820054, 0x24690032,
-0x1221023, 0x2c420033, 0x10400067, 0x5821, 0x24180008, 0x240f000d,
-0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120, 0x27623800, 0x24e80020,
-0x102102b, 0x50400001, 0x27683000, 0x8f820128, 0x15020007, 0x1021,
-0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x80017cb, 0x8ee201a0,
-0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821,
-0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8,
-0xa4f8000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021,
-0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033,
-0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
-0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
-0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
-0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
-0x80017b8, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
-0x80017cb, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0xac8d0000, 0xac8e0004, 0x56000006, 0x240b0001, 0x8f820054,
-0x1221023, 0x2c420033, 0x1440ffa0, 0x0, 0x316300ff, 0x24020001,
-0x14620074, 0x3c050009, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032,
-0x1221023, 0x2c420033, 0x1040005e, 0x5821, 0x240d0008, 0x240c0011,
-0x24080012, 0x24070040, 0x240a0001, 0x8f830120, 0x27623800, 0x24660020,
-0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0,
-0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8001834, 0x8ee201a0,
-0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008,
-0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010,
-0xaf860120, 0x92e24e10, 0x14400033, 0x24100001, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x8c820000, 0x1448001f, 0x0, 0x8ee34e20,
-0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004,
-0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10470007, 0x0, 0x8ee24e24,
-0x24420001, 0x10620005, 0x0, 0x8001821, 0x0, 0x14600005,
-0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400010, 0xac800000, 0x8001834, 0x0, 0x8ee24e20,
-0x24420001, 0x50470003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac880000, 0xac8a0004,
-0x56000006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa9,
-0x0, 0x316300ff, 0x24020001, 0x14620003, 0x3c050009, 0x800194b,
-0x24100001, 0x3c040001, 0x24844464, 0xafa00010, 0xafa00014, 0x8f860120,
-0x8f870124, 0x8001850, 0x34a5f011, 0x3c040001, 0x24844470, 0xafa00010,
-0xafa00014, 0x8f860120, 0x8f870124, 0x34a5f010, 0xc0023a7, 0x8021,
-0x800194b, 0x0, 0x3c040001, 0x2484447c, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0x8001944, 0x34a5f00f, 0x8ee205f8, 0x8f430228,
-0x24420001, 0x304900ff, 0x512300dc, 0xafa00010, 0x8ee205f8, 0x210c0,
-0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f870120,
+0x24100001, 0x8ee2723c, 0x3c040001, 0x24844658, 0xafa00014, 0xafa20010,
+0x8ee6723c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x56000001,
+0xaee00e0c, 0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x8ee24e14,
+0x10400019, 0x0, 0xaee04e14, 0x8f820040, 0x30420001, 0x14400008,
+0x0, 0x8f430104, 0x24020001, 0x10620004, 0x0, 0x8f420264,
+0x10400006, 0x0, 0x8ee20178, 0x24420001, 0xaee20178, 0x80016da,
+0x8ee20178, 0x8f820044, 0x34420004, 0xaf820044, 0x8ee20174, 0x24420001,
+0xaee20174, 0x8ee20174, 0x8ee27268, 0x2442ff99, 0xaee27268, 0x8ee27268,
+0x1c4002a8, 0x0, 0x8f420238, 0x104002a5, 0x0, 0x8f420080,
+0xaee2004c, 0x8f4200c0, 0xaee20048, 0x8f420084, 0xaee20038, 0x8f420084,
+0xaee20234, 0x8f420088, 0xaee20238, 0x8f42008c, 0xaee2023c, 0x8f420090,
+0xaee20240, 0x8f420094, 0xaee20244, 0x8f420098, 0xaee20248, 0x8f42009c,
+0xaee2024c, 0x8f4200a0, 0xaee20250, 0x8f4200a4, 0xaee20254, 0x8f4200a8,
+0xaee20258, 0x8f4200ac, 0xaee2025c, 0x8f4200b0, 0xaee20260, 0x8f4200b4,
+0xaee20264, 0x8f4200b8, 0xaee20268, 0x8f4200bc, 0x24040001, 0xaee2026c,
+0xaee0003c, 0x41080, 0x571021, 0x8ee3003c, 0x8c420234, 0x24840001,
+0x621821, 0x2c82000f, 0xaee3003c, 0x1440fff8, 0x41080, 0x8f4200cc,
+0xaee20050, 0x8f4200d0, 0xaee20054, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001,
+0xaee201a0, 0x8001770, 0x8ee201a0, 0x8f440208, 0x8f45020c, 0x26e20030,
+0xac620008, 0x24020400, 0xa462000e, 0x2402000f, 0xac620018, 0xac60001c,
+0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10,
+0x14400037, 0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001,
+0x10a20005, 0x0, 0x800175a, 0x0, 0x14a00005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400013, 0xac800000, 0x8001770, 0x0, 0x8ee24e20, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000,
+0x24020001, 0xac820004, 0x12000212, 0x3c020400, 0xafa20018, 0x3c020001,
+0x571021, 0x904283a0, 0x1040010b, 0x0, 0x8ee205f8, 0x8f430228,
+0x24420001, 0x304a00ff, 0x514300fd, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054,
+0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040006a, 0x5821,
+0x24180008, 0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120,
0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
-0x15020007, 0x1021, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0,
-0x80018c9, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430,
-0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018,
-0xace9001c, 0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4,
-0xace20010, 0xaf880120, 0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x8021, 0x24420001, 0xaee201a0, 0x80017ee, 0x8ee201a0, 0x8ee405f8,
+0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8, 0xa4f8000e,
+0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021, 0xace20008,
+0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033, 0x24100001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144d001f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x104c0007,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x80017db,
+0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x80017ee,
+0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0xac8d0000, 0xac8e0004, 0x56000006, 0x240b0001, 0x8f820054, 0x1221023,
+0x2c420033, 0x1440ff9d, 0x0, 0x316300ff, 0x24020001, 0x14620077,
+0x3c050009, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032, 0x1221023,
+0x2c420033, 0x10400061, 0x5821, 0x240d0008, 0x240c0011, 0x24080012,
+0x24070040, 0x240a0001, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
+0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0,
+0x800185a, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494,
+0x2462001c, 0xac620008, 0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004,
+0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24100001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x1448001f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10470007,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001847,
+0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x800185a,
+0x0, 0x8ee24e20, 0x24420001, 0x50470003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0xac880000, 0xac8a0004, 0x56000006, 0x240b0001, 0x8f820054, 0x1221023,
+0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x14620003,
+0x3c050009, 0x8001977, 0x24100001, 0x3c040001, 0x24844664, 0xafa00010,
+0xafa00014, 0x8f860120, 0x8f870124, 0x8001876, 0x34a5f011, 0x3c040001,
+0x24844670, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x34a5f010,
+0xc002403, 0x8021, 0x8001977, 0x0, 0x3c040001, 0x2484467c,
+0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0x8001970, 0x34a5f00f,
+0x8ee205f8, 0x8f430228, 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010,
+0x8ee205f8, 0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc,
+0xac440600, 0x8f870120, 0x27623800, 0x24e80020, 0x102102b, 0x50400001,
+0x27683000, 0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007,
+0x1021, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x80018f2,
+0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434,
+0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004,
+0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018, 0xace9001c,
+0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4, 0xace20010,
+0xaf880120, 0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0,
+0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0,
+0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80018dc, 0x0,
+0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
+0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80018f2, 0x0,
+0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x5600000c, 0xaee905f8,
+0x3c040001, 0x24844688, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0xc002403, 0x34a5f000, 0x8001977, 0x0, 0x8f830120,
+0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128,
+0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a0,
+0x8021, 0x24420001, 0xaee201a0, 0x8001959, 0x8ee201a0, 0x8ee205f8,
+0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008, 0x24020008,
+0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204b4,
+0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012, 0x1462001f,
0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80018b3,
+0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x8001943,
0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80018c9,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x8001959,
0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x5600000c,
-0xaee905f8, 0x3c040001, 0x24844488, 0xafa00010, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f000, 0x800194b, 0x0,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001,
-0xaee201a0, 0x800192d, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
-0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
-0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
-0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
-0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
-0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24,
-0x24420001, 0x10a20005, 0x0, 0x8001917, 0x0, 0x14a00005,
-0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x800192d, 0x0, 0x8ee24e20,
-0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
-0xac820000, 0x24020001, 0xac820004, 0x5600001d, 0x24100001, 0x3c040001,
-0x24844490, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
-0xc0023a7, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x800194b,
-0x8ee201ac, 0x3c040001, 0x2484449c, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0x34a5f005, 0xc0023a7, 0x0, 0x8ee201a8, 0x8021,
-0x24420001, 0xaee201a8, 0x8ee201a8, 0x1200000c, 0x24020001, 0x3c010001,
-0x370821, 0xa02083a0, 0x8f420238, 0x8ee30154, 0x24630001, 0xaee30154,
-0x8ee30154, 0x800195b, 0xaee27268, 0x24020001, 0x3c010001, 0x370821,
-0xa02283a0, 0x3c020001, 0x8c424dfc, 0x10400181, 0x0, 0x8ee27b74,
-0x24430001, 0x284200c9, 0x1440019e, 0xaee37b74, 0x8ee204c4, 0x30420002,
-0x14400113, 0xaee07b74, 0x8ee204c4, 0x3c030600, 0x34631000, 0x34420002,
-0xaee204c4, 0xafa30018, 0x8ee205f8, 0x8f430228, 0x24420001, 0x304a00ff,
-0x514300f7, 0xafa00010, 0x8ee205f8, 0x210c0, 0x571021, 0x8fa30018,
-0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054, 0x8f820054, 0x24690032,
-0x1221023, 0x2c420033, 0x10400067, 0x5821, 0x24180008, 0x240f000d,
-0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120, 0x27623800, 0x24e80020,
-0x102102b, 0x50400001, 0x27683000, 0x8f820128, 0x15020007, 0x1021,
-0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x80019e1, 0x8ee201a0,
-0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821,
-0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8,
-0xa4f8000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021,
-0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033,
-0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
-0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
-0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
-0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
-0x80019ce, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
-0x80019e1, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0xac8d0000, 0xac8e0004, 0x56000006, 0x240b0001, 0x8f820054,
-0x1221023, 0x2c420033, 0x1440ffa0, 0x0, 0x316300ff, 0x24020001,
-0x54620075, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032,
-0x1221023, 0x2c420033, 0x1040005e, 0x5821, 0x240d0008, 0x240c0011,
-0x24080012, 0x24070040, 0x240a0001, 0x8f830120, 0x27623800, 0x24660020,
-0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0,
-0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8001a4a, 0x8ee201a0,
-0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008,
-0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010,
-0xaf860120, 0x92e24e10, 0x14400033, 0x24100001, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x8c820000, 0x1448001f, 0x0, 0x8ee34e20,
-0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004,
-0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10470007, 0x0, 0x8ee24e24,
-0x24420001, 0x10620005, 0x0, 0x8001a37, 0x0, 0x14600005,
-0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400010, 0xac800000, 0x8001a4a, 0x0, 0x8ee24e20,
-0x24420001, 0x50470003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac880000, 0xac8a0004,
-0x56000006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa9,
-0x0, 0x316300ff, 0x24020001, 0x10620022, 0x0, 0x3c040001,
-0x24844464, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
-0xc0023a7, 0x34a5f011, 0x8001a76, 0x0, 0x3c040001, 0x24844470,
-0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc0023a7, 0x34a5f010,
-0x8001a76, 0x0, 0x3c040001, 0x2484447c, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f00f, 0x8ee201a8, 0x24420001,
-0xaee201a8, 0x8ee201a8, 0x8ee20158, 0x24420001, 0xaee20158, 0x8ee20158,
-0x8ee204c4, 0x30420001, 0x10400055, 0x0, 0x8f420218, 0x30420080,
-0x10400029, 0x0, 0x8f820044, 0x34420040, 0xaf820044, 0x8ee27b6c,
-0x402821, 0x8ee200c0, 0x8ee300c4, 0x24060000, 0x2407ffff, 0x2021,
-0x461024, 0x1444000d, 0x671824, 0x1465000b, 0x0, 0x8ee27b70,
-0x402821, 0x8ee200e0, 0x8ee300e4, 0x2021, 0x461024, 0x14440003,
-0x671824, 0x1065000b, 0x0, 0x8ee200c0, 0x8ee300c4, 0x8ee400e0,
-0x8ee500e4, 0xaee37b6c, 0xaee57b70, 0x8f820044, 0x38420020, 0x8001b01,
-0xaf820044, 0x8f820044, 0x2403ffdf, 0x431024, 0x8001b01, 0xaf820044,
-0x8f820044, 0x2403ffdf, 0x431024, 0xaf820044, 0x8ee27b6c, 0x402821,
-0x8ee200c0, 0x8ee300c4, 0x24060000, 0x2407ffff, 0x2021, 0x461024,
-0x1444000d, 0x671824, 0x1465000b, 0x0, 0x8ee27b70, 0x402821,
-0x8ee200e0, 0x8ee300e4, 0x2021, 0x461024, 0x14440003, 0x671824,
-0x1065000b, 0x0, 0x8ee200c0, 0x8ee300c4, 0x8ee400e0, 0x8ee500e4,
-0xaee37b6c, 0xaee57b70, 0x8f820044, 0x38420040, 0x8001b01, 0xaf820044,
-0x8f820044, 0x34420040, 0x8001b01, 0xaf820044, 0x8f820044, 0x34420040,
-0xaf820044, 0x8ee27b7c, 0x24430001, 0x28420015, 0x14400028, 0xaee37b7c,
-0x8f820044, 0x38420020, 0xaf820044, 0x8001b01, 0xaee07b7c, 0x8ee204c4,
-0x30420001, 0x10400011, 0x0, 0x8f420218, 0x30420080, 0x10400009,
-0x0, 0x8f820044, 0x34420020, 0xaf820044, 0x8f820044, 0x2403ffbf,
-0x431024, 0x8001aff, 0xaf820044, 0x8f820044, 0x34420060, 0x8001aff,
-0xaf820044, 0x8f820044, 0x34420040, 0xaf820044, 0x8ee27b78, 0x24430001,
-0x28421389, 0x14400005, 0xaee37b78, 0x8f820044, 0x38420020, 0xaf820044,
-0xaee07b78, 0xc0044fc, 0x0, 0x8fbf0024, 0x8fb00020, 0x3e00008,
-0x27bd0028, 0x0, 0x0, 0x0, 0x27bdffb8, 0xafbf0044,
+0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600001d,
+0x24100001, 0x3c040001, 0x24844690, 0xafa00010, 0xafa00014, 0x8ee605f8,
+0x8f470228, 0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201ac, 0x24420001,
+0xaee201ac, 0x8001977, 0x8ee201ac, 0x3c040001, 0x2484469c, 0xafa00014,
+0x8ee605f8, 0x8f470228, 0x3c050009, 0x34a5f005, 0xc002403, 0x0,
+0x8ee201a8, 0x8021, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x1200000c,
+0x24020001, 0x3c010001, 0x370821, 0xa02083a0, 0x8f420238, 0x8ee30154,
+0x24630001, 0xaee30154, 0x8ee30154, 0x8001987, 0xaee27268, 0x24020001,
+0x3c010001, 0x370821, 0xa02283a0, 0x3c020001, 0x8c42500c, 0x10400187,
+0x0, 0x8ee27b74, 0x24430001, 0x284200c9, 0x144001a4, 0xaee37b74,
+0x8ee204c4, 0x30420002, 0x14400119, 0xaee07b74, 0x8ee204c4, 0x3c030600,
+0x34631000, 0x34420002, 0xaee204c4, 0xafa30018, 0x8ee205f8, 0x8f430228,
+0x24420001, 0x304a00ff, 0x514300fd, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054,
+0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040006a, 0x5821,
+0x24180008, 0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120,
+0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x8021, 0x24420001, 0xaee201a0, 0x8001a10, 0x8ee201a0, 0x8ee405f8,
+0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8, 0xa4f8000e,
+0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021, 0xace20008,
+0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033, 0x24100001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144d001f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x104c0007,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x80019fd,
+0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001a10,
+0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0xac8d0000, 0xac8e0004, 0x56000006, 0x240b0001, 0x8f820054, 0x1221023,
+0x2c420033, 0x1440ff9d, 0x0, 0x316300ff, 0x24020001, 0x54620078,
+0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032, 0x1221023,
+0x2c420033, 0x10400061, 0x5821, 0x240d0008, 0x240c0011, 0x24080012,
+0x24070040, 0x240a0001, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
+0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0,
+0x8001a7c, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494,
+0x2462001c, 0xac620008, 0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004,
+0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24100001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x1448001f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10470007,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001a69,
+0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001a7c,
+0x0, 0x8ee24e20, 0x24420001, 0x50470003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0xac880000, 0xac8a0004, 0x56000006, 0x240b0001, 0x8f820054, 0x1221023,
+0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022,
+0x0, 0x3c040001, 0x24844664, 0xafa00010, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x8001aa8, 0x0,
+0x3c040001, 0x24844670, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
+0xc002403, 0x34a5f010, 0x8001aa8, 0x0, 0x3c040001, 0x2484467c,
+0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f,
+0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20158, 0x24420001,
+0xaee20158, 0x8ee20158, 0x8ee204c4, 0x30420001, 0x10400055, 0x0,
+0x8f420218, 0x30420080, 0x10400029, 0x0, 0x8f820044, 0x34420040,
+0xaf820044, 0x8ee27b6c, 0x402821, 0x8ee200c0, 0x8ee300c4, 0x24060000,
+0x2407ffff, 0x2021, 0x461024, 0x1444000d, 0x671824, 0x1465000b,
+0x0, 0x8ee27b70, 0x402821, 0x8ee200e0, 0x8ee300e4, 0x2021,
+0x461024, 0x14440003, 0x671824, 0x1065000b, 0x0, 0x8ee200c0,
+0x8ee300c4, 0x8ee400e0, 0x8ee500e4, 0xaee37b6c, 0xaee57b70, 0x8f820044,
+0x38420020, 0x8001b33, 0xaf820044, 0x8f820044, 0x2403ffdf, 0x431024,
+0x8001b33, 0xaf820044, 0x8f820044, 0x2403ffdf, 0x431024, 0xaf820044,
+0x8ee27b6c, 0x402821, 0x8ee200c0, 0x8ee300c4, 0x24060000, 0x2407ffff,
+0x2021, 0x461024, 0x1444000d, 0x671824, 0x1465000b, 0x0,
+0x8ee27b70, 0x402821, 0x8ee200e0, 0x8ee300e4, 0x2021, 0x461024,
+0x14440003, 0x671824, 0x1065000b, 0x0, 0x8ee200c0, 0x8ee300c4,
+0x8ee400e0, 0x8ee500e4, 0xaee37b6c, 0xaee57b70, 0x8f820044, 0x38420040,
+0x8001b33, 0xaf820044, 0x8f820044, 0x34420040, 0x8001b33, 0xaf820044,
+0x8f820044, 0x34420040, 0xaf820044, 0x8ee27b7c, 0x24430001, 0x28420015,
+0x14400028, 0xaee37b7c, 0x8f820044, 0x38420020, 0xaf820044, 0x8001b33,
+0xaee07b7c, 0x8ee204c4, 0x30420001, 0x10400011, 0x0, 0x8f420218,
+0x30420080, 0x10400009, 0x0, 0x8f820044, 0x34420020, 0xaf820044,
+0x8f820044, 0x2403ffbf, 0x431024, 0x8001b31, 0xaf820044, 0x8f820044,
+0x34420060, 0x8001b31, 0xaf820044, 0x8f820044, 0x34420040, 0xaf820044,
+0x8ee27b78, 0x24430001, 0x28421389, 0x14400005, 0xaee37b78, 0x8f820044,
+0x38420020, 0xaf820044, 0xaee07b78, 0xc00457c, 0x0, 0x8fbf0024,
+0x8fb00020, 0x3e00008, 0x27bd0028, 0x0, 0x27bdffb8, 0xafbf0044,
0xafb60040, 0xafb5003c, 0xafb40038, 0xafb30034, 0xafb20030, 0xafb1002c,
0xafb00028, 0x8f960064, 0x32c20004, 0x1040000c, 0x24020004, 0xaf820064,
0x8f420114, 0xaee204d0, 0x8f820060, 0x34420008, 0xaf820060, 0x8ee20168,
-0x24420001, 0xaee20168, 0x8002293, 0x8ee20168, 0x32c20001, 0x10400004,
-0x24020001, 0xaf820064, 0x8002293, 0x0, 0x32c20002, 0x1040076b,
-0x0, 0x8f43022c, 0x8f42010c, 0x5062000c, 0xafa00010, 0x8f42022c,
-0x21080, 0x5a1021, 0x8c420300, 0xafa20020, 0x8f42022c, 0x24070001,
-0x24420001, 0x3042003f, 0x8001b41, 0xaf42022c, 0x3c040001, 0x24844510,
-0xafa00014, 0x8f46022c, 0x8f47010c, 0x3c050003, 0xc0023a7, 0x34a5f01f,
-0x3821, 0x14e00003, 0x0, 0x800228c, 0xaf960064, 0x93a20020,
-0x2443ffff, 0x2c620011, 0x1040063c, 0x31080, 0x3c010001, 0x220821,
-0x8c2245c8, 0x400008, 0x0, 0x8fa20020, 0x30420fff, 0xaee20dfc,
-0x8f820060, 0x34420200, 0xaf820060, 0x8ee20118, 0x24420001, 0xaee20118,
-0x8002287, 0x8ee20118, 0x8fa20020, 0x24030001, 0x3c010001, 0x370821,
-0xa02383a1, 0x30420fff, 0xaee25228, 0x8f820060, 0x34420100, 0xaf820060,
-0x8ee20144, 0x24420001, 0xaee20144, 0x8002287, 0x8ee20144, 0x8fa20020,
-0x21200, 0x22502, 0x24020001, 0x10820005, 0x24020002, 0x10820009,
-0x2402fffe, 0x8001b8a, 0xafa00010, 0x8ee204c4, 0xaee40070, 0xaee40074,
-0x34420001, 0x8001b7e, 0xaee204c4, 0x8ee304c4, 0xaee40070, 0xaee40074,
-0x621824, 0xaee304c4, 0x8f840054, 0x41442, 0x41c82, 0x431021,
-0x41cc2, 0x431023, 0x41d02, 0x431021, 0x41d42, 0x431023,
-0x8001b91, 0xaee20078, 0x3c040001, 0x2484451c, 0xafa00014, 0x8fa60020,
-0x3c050003, 0xc0023a7, 0x34a50004, 0x8ee20110, 0x24420001, 0xaee20110,
-0x8002287, 0x8ee20110, 0x27440212, 0xc00229d, 0x24050006, 0x3049001f,
-0x920c0, 0x2e41021, 0x9442726c, 0x30424000, 0x1040000a, 0x971021,
-0x97430212, 0xa443726e, 0x8f430214, 0x971021, 0xac437270, 0x2e41821,
-0x34028000, 0x8001c38, 0xa462726c, 0x9443726e, 0x97420212, 0x14620006,
-0x2e41021, 0x971021, 0x8c437270, 0x8f420214, 0x1062009d, 0x2e41021,
-0x9442726c, 0x30428000, 0x10400028, 0x2406ffff, 0x2021, 0x410c0,
-0x2e21021, 0x9442736c, 0x30424000, 0x54400005, 0x803021, 0x24840001,
-0x2c820080, 0x1440fff8, 0x410c0, 0x4c10010, 0x620c0, 0x610c0,
-0x571821, 0x8c63736c, 0x571021, 0xafa30010, 0x8c427370, 0x3c040001,
-0x24844528, 0xafa20014, 0x8f470214, 0x3c050003, 0xc0023a7, 0x34a50013,
-0x8001c4f, 0x3c020800, 0x97430212, 0x971021, 0xa443736e, 0x8f430214,
-0x971021, 0xac437370, 0x910c0, 0x2e21021, 0x2e41821, 0x8001c36,
-0xa446726c, 0x2e41021, 0x9445726c, 0x8001bed, 0x510c0, 0x9443736e,
-0x97420212, 0x14620006, 0x510c0, 0x971021, 0x8c437370, 0x8f420214,
-0x10620065, 0x510c0, 0x2e21021, 0x9445736c, 0x510c0, 0x2e21021,
-0x9442736c, 0x30428000, 0x1040fff0, 0x971021, 0x520c0, 0x971021,
-0x9443736e, 0x97420212, 0x14620006, 0x2406ffff, 0x971021, 0x8c437370,
-0x8f420214, 0x10620053, 0x3c020800, 0x2021, 0x410c0, 0x2e21021,
+0x24420001, 0xaee20168, 0x80022ee, 0x8ee20168, 0x32c20001, 0x10400004,
+0x24020001, 0xaf820064, 0x80022ee, 0x0, 0x32c20002, 0x1440000c,
+0x3c050003, 0x3c040001, 0x24844714, 0x34a50001, 0x2c03021, 0x3821,
+0xafa00010, 0xc002403, 0xafa00014, 0x2402fff8, 0x80022ee, 0xaf820064,
+0x8f43022c, 0x8f42010c, 0x5062000c, 0xafa00010, 0x8f42022c, 0x21080,
+0x5a1021, 0x8c420300, 0xafa20020, 0x8f42022c, 0x24070001, 0x24420001,
+0x3042003f, 0x8001b7c, 0xaf42022c, 0x3c040001, 0x24844720, 0xafa00014,
+0x8f46022c, 0x8f47010c, 0x3c050003, 0xc002403, 0x34a5f01f, 0x3821,
+0x14e00003, 0x0, 0x80022e7, 0xaf960064, 0x93a20020, 0x2443ffff,
+0x2c620011, 0x10400656, 0x31080, 0x3c010001, 0x220821, 0x8c2247d8,
+0x400008, 0x0, 0x8fa20020, 0x30420fff, 0xaee20dfc, 0x8f820060,
+0x34420200, 0xaf820060, 0x8ee20118, 0x24420001, 0xaee20118, 0x80022e2,
+0x8ee20118, 0x8fa20020, 0x24030001, 0x3c010001, 0x370821, 0xa02383a1,
+0x30420fff, 0xaee25228, 0x8f820060, 0x34420100, 0xaf820060, 0x8ee20144,
+0x24420001, 0xaee20144, 0x80022e2, 0x8ee20144, 0x8fa20020, 0x21200,
+0x22502, 0x24020001, 0x10820005, 0x24020002, 0x10820009, 0x2402fffe,
+0x8001bc5, 0xafa00010, 0x8ee204c4, 0xaee40070, 0xaee40074, 0x34420001,
+0x8001bb9, 0xaee204c4, 0x8ee304c4, 0xaee40070, 0xaee40074, 0x621824,
+0xaee304c4, 0x8f840054, 0x41442, 0x41c82, 0x431021, 0x41cc2,
+0x431023, 0x41d02, 0x431021, 0x41d42, 0x431023, 0x8001bcc,
+0xaee20078, 0x3c040001, 0x2484472c, 0xafa00014, 0x8fa60020, 0x3c050003,
+0xc002403, 0x34a50004, 0x8ee20110, 0x24420001, 0xaee20110, 0x80022e2,
+0x8ee20110, 0x27440212, 0xc0022f8, 0x24050006, 0x3049001f, 0x920c0,
+0x2e41021, 0x9442726c, 0x30424000, 0x1040000a, 0x971021, 0x97430212,
+0xa443726e, 0x8f430214, 0x971021, 0xac437270, 0x2e41821, 0x34028000,
+0x8001c75, 0xa462726c, 0x9443726e, 0x97420212, 0x14620006, 0x2e41021,
+0x971021, 0x8c437270, 0x8f420214, 0x1062009f, 0x2e41021, 0x9442726c,
+0x30428000, 0x1040002a, 0x2406ffff, 0x2021, 0x410c0, 0x2e21021,
0x9442736c, 0x30424000, 0x54400005, 0x803021, 0x24840001, 0x2c820080,
-0x1440fff8, 0x410c0, 0x4c10023, 0x620c0, 0x910c0, 0x571821,
-0x8c63726c, 0x571021, 0xafa30010, 0x8c427270, 0x3c040001, 0x24844534,
-0xafa20014, 0x8f470214, 0x3c050003, 0xc0023a7, 0x34a5f017, 0x8001c4f,
-0x3c020800, 0x8f430210, 0xb71021, 0xac43776c, 0x8f430214, 0xb71021,
-0xac437770, 0x3c020001, 0x571021, 0x8c4283a4, 0x24420001, 0x3c010001,
-0x370821, 0xac2283a4, 0x3c030001, 0x771821, 0x8c6383a4, 0x2e51021,
-0x8001c41, 0xa443776c, 0x97430212, 0x971021, 0xa443736e, 0x8f430214,
-0x971021, 0xac437370, 0x510c0, 0x2e21021, 0x2e41821, 0xa446736c,
-0x34028000, 0xa462736c, 0x2021, 0x428c0, 0x2e51021, 0x9442776c,
-0x1040ffdc, 0x24840001, 0x2c820080, 0x5440fffa, 0x428c0, 0x92e204c8,
-0x10400006, 0x24020001, 0x8ee304cc, 0x1221004, 0x621825, 0x8001c4e,
-0xaee304cc, 0x8f830228, 0x24020001, 0x1221004, 0x621825, 0xaf830228,
-0x3c020800, 0x34421000, 0xafa20018, 0x8ee205f8, 0x8f430228, 0x24420001,
-0x304a00ff, 0x514300f7, 0xafa00010, 0x8ee205f8, 0x210c0, 0x571021,
-0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054, 0x8f820054,
-0x24690032, 0x1221023, 0x2c420033, 0x10400067, 0x5821, 0x24100008,
-0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120, 0x27623800,
-0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128, 0x15020007,
-0x1021, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8001cc4,
-0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434,
-0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004,
-0x8ee205f8, 0xa4f0000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc,
-0x2e21021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
-0x14400033, 0x24070001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0x8c820000, 0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8001cb1, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
-0xac800000, 0x8001cc4, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0xac8d0000, 0xac8e0004, 0x54e00006, 0x240b0001,
-0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa0, 0x0, 0x316300ff,
-0x24020001, 0x54620075, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054,
-0x24690032, 0x1221023, 0x2c420033, 0x1040005e, 0x5821, 0x240e0008,
-0x240d0011, 0x240a0012, 0x24080040, 0x240c0001, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8001d2d,
-0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c,
-0xac620008, 0xa46e000e, 0xac6d0018, 0xac640000, 0xac650004, 0x8ee204b4,
-0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24070001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144a001f, 0x0,
-0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001,
-0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10480007, 0x0,
-0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001d1a, 0x0,
-0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
-0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001d2d, 0x0,
-0x8ee24e20, 0x24420001, 0x50480003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac8a0000,
-0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033,
-0x1440ffa9, 0x0, 0x316300ff, 0x24020001, 0x10620022, 0x0,
-0x3c040001, 0x24844540, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
-0x3c050009, 0xc0023a7, 0x34a5f011, 0x8001d59, 0x0, 0x3c040001,
-0x2484454c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc0023a7,
-0x34a5f010, 0x8001d59, 0x0, 0x3c040001, 0x24844558, 0xafa00014,
-0x8ee605f8, 0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f00f, 0x8ee201a8,
-0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20124, 0x24420001, 0xaee20124,
-0x8001f47, 0x8ee20124, 0x27440212, 0xc00229d, 0x24050006, 0x3049001f,
-0x928c0, 0x2e51021, 0x9442726c, 0x30428000, 0x1040002d, 0xb71021,
-0x9443726e, 0x97420212, 0x1462001a, 0xb71021, 0x8c437270, 0x8f420214,
-0x54620018, 0xafa20010, 0x92e204c8, 0x10400007, 0x24020001, 0x8ee304cc,
-0x1221004, 0x21027, 0x621824, 0x8001d7e, 0xaee304cc, 0x8f830228,
-0x1221004, 0x21027, 0x621824, 0xaf830228, 0x918c0, 0x2e31021,
-0x9442726c, 0x2e31821, 0x34424000, 0x8001e04, 0xa462726c, 0x8f420214,
-0xafa20010, 0x910c0, 0x571021, 0x8c42726c, 0x3c040001, 0x24844564,
-0x3c050003, 0xafa20014, 0x8f470210, 0x34a5f01c, 0xc0023a7, 0x1203021,
-0x8001e39, 0x3c020800, 0x9443726e, 0x97420212, 0x14620019, 0x918c0,
-0xb71021, 0x8c437270, 0x8f420214, 0x14620014, 0x918c0, 0x2e51021,
-0x9447726c, 0x720c0, 0x971021, 0x9443736e, 0xb71021, 0xa443726e,
-0x971021, 0x8c437370, 0xb71021, 0xac437270, 0x2e41021, 0x9443736c,
-0x2e51021, 0xa443726c, 0x2e41821, 0x24024000, 0x8001e04, 0xa462736c,
-0x2e31021, 0x9447726c, 0x3021, 0x720c0, 0x2e41021, 0x9442736c,
-0x4021, 0x30428000, 0x14400025, 0xe02821, 0x605021, 0x240b4000,
-0x971021, 0x9443736e, 0x97420212, 0x54620015, 0xe02821, 0x971021,
-0x8c437370, 0x8f420214, 0x54620010, 0xe02821, 0x11000006, 0x2e41021,
-0x9443736c, 0x510c0, 0x2e21021, 0x8001dd0, 0xa443736c, 0x9443736c,
-0x2ea1021, 0xa443726c, 0x710c0, 0x2e21021, 0xa44b736c, 0x8001dde,
-0x24060001, 0x510c0, 0x2e21021, 0x9447736c, 0x720c0, 0x2e41021,
-0x9442736c, 0x30428000, 0x1040ffdf, 0x25080001, 0x30c200ff, 0x14400025,
-0x2021, 0x720c0, 0x971021, 0x9443736e, 0x97420212, 0x1462000f,
-0x910c0, 0x971021, 0x8c437370, 0x8f420214, 0x1462000a, 0x910c0,
-0x2e41821, 0x24024000, 0x15000015, 0xa462736c, 0x910c0, 0x2e21821,
-0x34028000, 0x8001e04, 0xa462726c, 0x571021, 0x8c42726c, 0x3c040001,
-0x24844570, 0x3c050003, 0xafa20010, 0x710c0, 0x571021, 0x8c42736c,
-0x34a5001e, 0x1203021, 0xc0023a7, 0xafa20014, 0x8001e39, 0x3c020800,
-0x2021, 0x428c0, 0xb71021, 0x9443776e, 0x97420212, 0x5462002b,
-0x24840001, 0xb71021, 0x8c437770, 0x8f420214, 0x54620026, 0x24840001,
-0x3c020001, 0x571021, 0x8c4283a4, 0x2442ffff, 0x3c010001, 0x370821,
-0xac2283a4, 0x3c020001, 0x571021, 0x8c4283a4, 0x809021, 0x242102b,
-0x1040000e, 0x24b1776c, 0x24b07774, 0x2f02021, 0x2f12821, 0xc002434,
-0x24060008, 0x26310008, 0x3c020001, 0x571021, 0x8c4283a4, 0x26520001,
-0x242102b, 0x1440fff5, 0x26100008, 0x3c040001, 0x972021, 0x8c8483a4,
-0x24050008, 0x420c0, 0x2484776c, 0xc00242c, 0x2e42021, 0x8001e39,
-0x3c020800, 0x2c820080, 0x1440ffcf, 0x428c0, 0x3c020800, 0x34422000,
-0xafa20018, 0x8ee205f8, 0x8f430228, 0x24420001, 0x304a00ff, 0x514300f7,
-0xafa00010, 0x8ee205f8, 0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c,
-0xac4305fc, 0xac440600, 0x8f830054, 0x8f820054, 0x24690032, 0x1221023,
-0x2c420033, 0x10400067, 0x5821, 0x24100008, 0x240f000d, 0x240d0007,
-0x240c0040, 0x240e0001, 0x8f870120, 0x27623800, 0x24e80020, 0x102102b,
-0x50400001, 0x27683000, 0x8f820128, 0x15020007, 0x1021, 0x8ee201a0,
-0x3821, 0x24420001, 0xaee201a0, 0x8001eae, 0x8ee201a0, 0x8ee405f8,
+0x1440fff8, 0x410c0, 0x4c10010, 0x618c0, 0x610c0, 0x571821,
+0x8c63736c, 0x571021, 0xafa30010, 0x8c427370, 0x3c040001, 0x24844738,
+0xafa20014, 0x8f470214, 0x3c050003, 0xc002403, 0x34a50013, 0x8001c8c,
+0x3c020800, 0x97440212, 0x771021, 0xa444736e, 0x8f440214, 0x771021,
+0x2e31821, 0xac447370, 0x34028000, 0xa462736c, 0x910c0, 0x2e21021,
+0x8001c75, 0xa446726c, 0x2e41021, 0x9445726c, 0x8001c2a, 0x510c0,
+0x9443736e, 0x97420212, 0x14620006, 0x510c0, 0x971021, 0x8c437370,
+0x8f420214, 0x10620065, 0x510c0, 0x2e21021, 0x9445736c, 0x510c0,
+0x2e21021, 0x9442736c, 0x30428000, 0x1040fff0, 0x971021, 0x520c0,
+0x971021, 0x9443736e, 0x97420212, 0x14620006, 0x2406ffff, 0x971021,
+0x8c437370, 0x8f420214, 0x10620053, 0x3c020800, 0x2021, 0x410c0,
+0x2e21021, 0x9442736c, 0x30424000, 0x54400005, 0x803021, 0x24840001,
+0x2c820080, 0x1440fff8, 0x410c0, 0x4c10023, 0x618c0, 0x910c0,
+0x571821, 0x8c63726c, 0x571021, 0xafa30010, 0x8c427270, 0x3c040001,
+0x24844744, 0xafa20014, 0x8f470214, 0x3c050003, 0xc002403, 0x34a5f017,
+0x8001c8c, 0x3c020800, 0x8f430210, 0xb71021, 0xac43776c, 0x8f430214,
+0xb71021, 0xac437770, 0x3c020001, 0x571021, 0x8c4283a4, 0x24420001,
+0x3c010001, 0x370821, 0xac2283a4, 0x3c030001, 0x771821, 0x8c6383a4,
+0x2e51021, 0x8001c7e, 0xa443776c, 0x97440212, 0x771021, 0xa444736e,
+0x8f440214, 0x771021, 0x2e31821, 0xac447370, 0x34028000, 0xa462736c,
+0x510c0, 0x2e21021, 0xa446736c, 0x2021, 0x428c0, 0x2e51021,
+0x9442776c, 0x1040ffdc, 0x24840001, 0x2c820080, 0x5440fffa, 0x428c0,
+0x92e204c8, 0x10400006, 0x24020001, 0x8ee304cc, 0x1221004, 0x621825,
+0x8001c8b, 0xaee304cc, 0x8f830228, 0x24020001, 0x1221004, 0x621825,
+0xaf830228, 0x3c020800, 0x34421000, 0xafa20018, 0x8ee205f8, 0x8f430228,
+0x24420001, 0x304a00ff, 0x514300fd, 0xafa00010, 0x8ee205f8, 0x210c0,
+0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054,
+0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040006a, 0x5821,
+0x24100008, 0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120,
+0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
+0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021, 0x8ee201a0,
+0x3821, 0x24420001, 0xaee201a0, 0x8001d04, 0x8ee201a0, 0x8ee405f8,
0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b,
0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8, 0xa4f0000e,
0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021, 0xace20008,
@@ -635,707 +564,800 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144d001f,
0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x104c0007,
-0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001e9b,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001cf1,
0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001eae,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001d04,
0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e20,
0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
0xac8d0000, 0xac8e0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023,
-0x2c420033, 0x1440ffa0, 0x0, 0x316300ff, 0x24020001, 0x54620075,
+0x2c420033, 0x1440ff9d, 0x0, 0x316300ff, 0x24020001, 0x54620078,
0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032, 0x1221023,
-0x2c420033, 0x1040005e, 0x5821, 0x240e0008, 0x240d0011, 0x240a0012,
+0x2c420033, 0x10400061, 0x5821, 0x240e0008, 0x240d0011, 0x240a0012,
0x24080040, 0x240c0001, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
-0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0, 0x8ee201a0,
-0x3821, 0x24420001, 0xaee201a0, 0x8001f17, 0x8ee201a0, 0x8ee205f8,
-0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008, 0xa46e000e,
-0xac6d0018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
-0x92e24e10, 0x14400033, 0x24070001, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x8c820000, 0x144a001f, 0x0, 0x8ee34e20, 0x8ee24e24,
-0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
-0x8ee34e20, 0x24420001, 0x10480007, 0x0, 0x8ee24e24, 0x24420001,
-0x10620005, 0x0, 0x8001f04, 0x0, 0x14600005, 0x0,
-0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
-0x50400010, 0xac800000, 0x8001f17, 0x0, 0x8ee24e20, 0x24420001,
-0x50480003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006,
-0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa9, 0x0,
-0x316300ff, 0x24020001, 0x10620022, 0x0, 0x3c040001, 0x24844540,
-0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc0023a7,
-0x34a5f011, 0x8001f43, 0x0, 0x3c040001, 0x2484454c, 0xafa00014,
-0x8f860120, 0x8f870124, 0x3c050009, 0xc0023a7, 0x34a5f010, 0x8001f43,
-0x0, 0x3c040001, 0x24844558, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0xc0023a7, 0x34a5f00f, 0x8ee201a8, 0x24420001, 0xaee201a8,
-0x8ee201a8, 0x8ee20128, 0x24420001, 0xaee20128, 0x8ee20128, 0x8ee20160,
-0x24420001, 0xaee20160, 0x8002287, 0x8ee20160, 0x8fa20020, 0x21200,
-0x21d02, 0x24020001, 0x10620005, 0x24020002, 0x1062000d, 0x0,
-0x8001f67, 0xafa00010, 0x92e204c8, 0x14400006, 0x24020001, 0x8f820228,
-0xaee204cc, 0x2402ffff, 0xaf820228, 0x24020001, 0x8001f6e, 0xa2e204c8,
-0x92e204c8, 0x5040000c, 0xa2e004c8, 0x8ee204cc, 0xaf820228, 0x8001f6e,
-0xa2e004c8, 0x3c040001, 0x24844578, 0xafa00014, 0x8fa60020, 0x3c050003,
-0xc0023a7, 0x34a5f009, 0x8ee2013c, 0x24420001, 0xaee2013c, 0x8002287,
-0x8ee2013c, 0x8fa20020, 0x21200, 0x22502, 0x24020001, 0x10820005,
-0x24020002, 0x1082000f, 0x0, 0x8001f93, 0xafa00010, 0x8f820220,
-0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x24020001,
-0x3c010001, 0x370821, 0xa02283a2, 0x8001f9a, 0xaee40108, 0x8f820220,
-0x3c0308ff, 0x3463fff7, 0x431024, 0xaf820220, 0x3c010001, 0x370821,
-0xa02083a2, 0x8001f9a, 0xaee40108, 0x3c040001, 0x24844584, 0xafa00014,
-0x8fa60020, 0x3c050003, 0xc0023a7, 0x34a5f00a, 0x8ee2012c, 0x24420001,
-0xaee2012c, 0x8002287, 0x8ee2012c, 0x8fa20020, 0x21200, 0x21d02,
-0x24020001, 0x10620005, 0x24020002, 0x1062000e, 0x0, 0x8001fc1,
-0xafa00010, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008,
-0xaf820220, 0x24020001, 0x3c010001, 0x370821, 0x8001fc8, 0xa02283a3,
-0x3c020001, 0x571021, 0x904283a2, 0x3c010001, 0x370821, 0x1440000e,
-0xa02083a3, 0x8f820220, 0x3c0308ff, 0x3463fff7, 0x431024, 0x8001fc8,
-0xaf820220, 0x3c040001, 0x24844590, 0xafa00014, 0x8fa60020, 0x3c050003,
-0xc0023a7, 0x34a5f00b, 0x8ee20114, 0x24420001, 0xaee20114, 0x8002287,
-0x8ee20114, 0x27840208, 0x27450200, 0xc00243e, 0x24060008, 0x26e40094,
-0x27450200, 0xc00243e, 0x24060008, 0x8ee20134, 0x24420001, 0xaee20134,
-0x8002287, 0x8ee20134, 0x8f460248, 0x24040001, 0xc004e2c, 0x24050004,
-0x8ee20130, 0x24420001, 0xaee20130, 0x8002287, 0x8ee20130, 0x8ef301c4,
-0x8ef401c8, 0x8ef501cc, 0x8ee20140, 0x26e40030, 0x24420001, 0xaee20140,
-0x8ef00140, 0x8ef10074, 0x8ef20070, 0xc00242c, 0x24050400, 0xaef301c4,
-0xaef401c8, 0xaef501cc, 0xaef00140, 0xaef10074, 0xaef20070, 0x8f42025c,
-0x26e40094, 0xaee20060, 0x8f420260, 0x27450200, 0x24060008, 0xaee20068,
-0x24020006, 0xc00243e, 0xaee20064, 0x3c023b9a, 0x3442ca00, 0xaee2006c,
-0x240203e8, 0x24040002, 0x24030001, 0xaee20104, 0xaee40100, 0xaee3010c,
-0x8f820220, 0x30420008, 0x10400004, 0x0, 0xaee30108, 0x8002011,
-0x2021, 0xaee40108, 0x2021, 0x3c030001, 0x641821, 0x90634d50,
-0x2e41021, 0x24840001, 0xa043009c, 0x2c82000f, 0x1440fff8, 0x0,
-0x8f820040, 0x2e41821, 0x24840001, 0x21702, 0x24420030, 0xa062009c,
-0x2e41021, 0x8002287, 0xa040009c, 0x240a0400, 0x24090040, 0x24080001,
-0x8f830100, 0x27623000, 0x24660020, 0xc2102b, 0x50400001, 0x27662800,
-0x8f820108, 0x14c20007, 0x26e20030, 0x8ee201a4, 0x3821, 0x24420001,
-0xaee201a4, 0x8002050, 0x8ee201a4, 0x8ee404a8, 0x8ee504ac, 0xac620008,
-0xa46a000e, 0xac600018, 0xac60001c, 0xac640000, 0xac650004, 0x8ee204bc,
-0xac620010, 0xaf860100, 0x92e204dc, 0x1440000e, 0x24070001, 0x8ee24e18,
-0x24420001, 0x50490003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18,
-0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21021, 0xac400000, 0xac480004,
-0x10e0ffd5, 0x0, 0x8ee20148, 0x24420001, 0xaee20148, 0x8002287,
-0x8ee20148, 0x3c020900, 0xaee05228, 0xaee0522c, 0xaee05230, 0xaee05234,
-0xaee001c8, 0x3c010001, 0x370821, 0xa02083a1, 0xafa20018, 0x8ee205f8,
-0x8f430228, 0x24420001, 0x304a00ff, 0x514300f7, 0xafa00010, 0x8ee205f8,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
+0x14c20007, 0x0, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0,
+0x8001d70, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494,
+0x2462001c, 0xac620008, 0xa46e000e, 0xac6d0018, 0xac640000, 0xac650004,
+0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24070001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144a001f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10480007,
+0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8001d5d,
+0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
+0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x8001d70,
+0x0, 0x8ee24e20, 0x24420001, 0x50480003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054, 0x1221023,
+0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001, 0x10620022,
+0x0, 0x3c040001, 0x24844750, 0xafa00010, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x8001d9c, 0x0,
+0x3c040001, 0x2484475c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
+0xc002403, 0x34a5f010, 0x8001d9c, 0x0, 0x3c040001, 0x24844768,
+0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403, 0x34a5f00f,
+0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20124, 0x24420001,
+0xaee20124, 0x8001f93, 0x8ee20124, 0x27440212, 0xc0022f8, 0x24050006,
+0x3049001f, 0x928c0, 0x2e51021, 0x9442726c, 0x30428000, 0x1040002f,
+0x2e51021, 0x9442726c, 0x30424000, 0x1440001c, 0xb71021, 0x9443726e,
+0x97420212, 0x14620018, 0xb71021, 0x8c437270, 0x8f420214, 0x54620016,
+0xafa20010, 0x92e204c8, 0x10400007, 0x24020001, 0x8ee304cc, 0x1221004,
+0x21027, 0x621824, 0x8001dc5, 0xaee304cc, 0x8f830228, 0x1221004,
+0x21027, 0x621824, 0xaf830228, 0x910c0, 0x2e21821, 0x3402c000,
+0x8001e4a, 0xa462726c, 0x8f420214, 0xafa20010, 0x910c0, 0x571021,
+0x8c42726c, 0x3c040001, 0x24844774, 0x3c050003, 0xafa20014, 0x8f470210,
+0x34a5f01c, 0xc002403, 0x1203021, 0x8001e7f, 0x3c020800, 0xb71021,
+0x9443726e, 0x97420212, 0x14620019, 0x918c0, 0xb71021, 0x8c437270,
+0x8f420214, 0x14620014, 0x918c0, 0x2e51021, 0x9447726c, 0x720c0,
+0x971021, 0x9443736e, 0xb71021, 0xa443726e, 0x971021, 0x8c437370,
+0xb71021, 0xac437270, 0x2e41021, 0x9443736c, 0x2e51021, 0xa443726c,
+0x2e41821, 0x3402c000, 0x8001e4a, 0xa462736c, 0x2e31021, 0x9447726c,
+0x3021, 0x720c0, 0x2e41021, 0x9442736c, 0x4021, 0x30428000,
+0x14400025, 0xe02821, 0x605021, 0x340bc000, 0x971021, 0x9443736e,
+0x97420212, 0x54620015, 0xe02821, 0x971021, 0x8c437370, 0x8f420214,
+0x54620010, 0xe02821, 0x11000006, 0x2e41021, 0x9443736c, 0x510c0,
+0x2e21021, 0x8001e16, 0xa443736c, 0x9443736c, 0x2ea1021, 0xa443726c,
+0x710c0, 0x2e21021, 0xa44b736c, 0x8001e24, 0x24060001, 0x510c0,
+0x2e21021, 0x9447736c, 0x720c0, 0x2e41021, 0x9442736c, 0x30428000,
+0x1040ffdf, 0x25080001, 0x30c200ff, 0x14400025, 0x2021, 0x720c0,
+0x971021, 0x9443736e, 0x97420212, 0x1462000f, 0x910c0, 0x971021,
+0x8c437370, 0x8f420214, 0x1462000a, 0x910c0, 0x2e41821, 0x3402c000,
+0x15000015, 0xa462736c, 0x910c0, 0x2e21821, 0x34028000, 0x8001e4a,
+0xa462726c, 0x571021, 0x8c42726c, 0x3c040001, 0x24844780, 0x3c050003,
+0xafa20010, 0x710c0, 0x571021, 0x8c42736c, 0x34a5001e, 0x1203021,
+0xc002403, 0xafa20014, 0x8001e7f, 0x3c020800, 0x2021, 0x428c0,
+0xb71021, 0x9443776e, 0x97420212, 0x5462002b, 0x24840001, 0xb71021,
+0x8c437770, 0x8f420214, 0x54620026, 0x24840001, 0x3c020001, 0x571021,
+0x8c4283a4, 0x2442ffff, 0x3c010001, 0x370821, 0xac2283a4, 0x3c020001,
+0x571021, 0x8c4283a4, 0x809021, 0x242102b, 0x1040000e, 0x24b1776c,
+0x24b07774, 0x2f02021, 0x2f12821, 0xc002490, 0x24060008, 0x26310008,
+0x3c020001, 0x571021, 0x8c4283a4, 0x26520001, 0x242102b, 0x1440fff5,
+0x26100008, 0x3c040001, 0x972021, 0x8c8483a4, 0x24050008, 0x420c0,
+0x2484776c, 0xc002488, 0x2e42021, 0x8001e7f, 0x3c020800, 0x2c820080,
+0x1440ffcf, 0x428c0, 0x3c020800, 0x34422000, 0xafa20018, 0x8ee205f8,
+0x8f430228, 0x24420001, 0x304a00ff, 0x514300fd, 0xafa00010, 0x8ee205f8,
0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600,
-0x8f830054, 0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x10400067,
+0x8f830054, 0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040006a,
0x5821, 0x24100008, 0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001,
0x8f870120, 0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000,
-0x8f820128, 0x15020007, 0x1021, 0x8ee201a0, 0x3821, 0x24420001,
-0xaee201a0, 0x80020d4, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821,
-0x8ee40430, 0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021,
-0xace40000, 0xace50004, 0x8ee205f8, 0xa4f0000e, 0xacef0018, 0xacea001c,
-0x210c0, 0x244205fc, 0x2e21021, 0xace20008, 0x8ee204b4, 0xace20010,
-0xaf880120, 0x92e24e10, 0x14400033, 0x24070001, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x8c820000, 0x144d001f, 0x0, 0x8ee34e20,
-0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004,
-0x8ee24e24, 0x8ee34e20, 0x24420001, 0x104c0007, 0x0, 0x8ee24e24,
-0x24420001, 0x10620005, 0x0, 0x80020c1, 0x0, 0x14600005,
-0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400010, 0xac800000, 0x80020d4, 0x0, 0x8ee24e20,
-0x24420001, 0x504c0003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac8d0000, 0xac8e0004,
-0x54e00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa0,
-0x0, 0x316300ff, 0x24020001, 0x54620075, 0xafa00010, 0xaeea05f8,
-0x8f830054, 0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040005e,
-0x5821, 0x240e0008, 0x240d0011, 0x240a0012, 0x24080040, 0x240c0001,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x3821, 0x24420001,
-0xaee201a0, 0x800213d, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
+0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021,
+0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8001ef7, 0x8ee201a0,
+0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821,
+0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8,
+0xa4f0000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021,
+0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033,
+0x24070001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
+0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x8001ee4, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
+0x8001ef7, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021,
+0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0xac8d0000, 0xac8e0004, 0x54e00006, 0x240b0001, 0x8f820054,
+0x1221023, 0x2c420033, 0x1440ff9d, 0x0, 0x316300ff, 0x24020001,
+0x54620078, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032,
+0x1221023, 0x2c420033, 0x10400061, 0x5821, 0x240e0008, 0x240d0011,
+0x240a0012, 0x24080040, 0x240c0001, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3821, 0x24420001,
+0xaee201a0, 0x8001f63, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
0x8ee50494, 0x2462001c, 0xac620008, 0xa46e000e, 0xac6d0018, 0xac640000,
0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033,
0x24070001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
0x144a001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
0x10480007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
-0x800212a, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0x8001f50, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
-0x800213d, 0x0, 0x8ee24e20, 0x24420001, 0x50480003, 0x1021,
+0x8001f63, 0x0, 0x8ee24e20, 0x24420001, 0x50480003, 0x1021,
0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001, 0x8f820054,
-0x1221023, 0x2c420033, 0x1440ffa9, 0x0, 0x316300ff, 0x24020001,
-0x10620022, 0x0, 0x3c040001, 0x24844540, 0xafa00010, 0xafa00014,
-0x8f860120, 0x8f870124, 0x3c050009, 0xc0023a7, 0x34a5f011, 0x8002169,
-0x0, 0x3c040001, 0x2484454c, 0xafa00014, 0x8f860120, 0x8f870124,
-0x3c050009, 0xc0023a7, 0x34a5f010, 0x8002169, 0x0, 0x3c040001,
-0x24844558, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc0023a7,
-0x34a5f00f, 0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20120,
-0x24420001, 0xaee20120, 0x8ee20120, 0x8ee20164, 0x24420001, 0xaee20164,
-0x8002287, 0x8ee20164, 0x8f42025c, 0x26e40094, 0xaee20060, 0x8f420260,
-0x27450200, 0x24060008, 0xc00243e, 0xaee20068, 0x8f820220, 0x30420008,
-0x14400002, 0x24020001, 0x24020002, 0xaee20108, 0x8ee2011c, 0x24420001,
-0xaee2011c, 0x8002287, 0x8ee2011c, 0x3c040001, 0x2484459c, 0xafa00010,
-0xafa00014, 0x8fa60020, 0x3c050003, 0xc0023a7, 0x34a5f00f, 0x93a20020,
-0x3c030700, 0x34631000, 0x431025, 0xafa20018, 0x8ee205f8, 0x8f430228,
-0x24420001, 0x304900ff, 0x512300dc, 0xafa00010, 0x8ee205f8, 0x210c0,
-0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f870120,
-0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128,
-0x15020007, 0x1021, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0,
-0x80021ff, 0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430,
-0x8ee50434, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee305f8, 0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018,
-0xace9001c, 0x318c0, 0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4,
-0xace20010, 0xaf880120, 0x92e24e10, 0x14400037, 0x24070001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80021e9,
-0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80021ff,
-0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x54e0000c,
-0xaee905f8, 0x3c040001, 0x248445a4, 0xafa00010, 0xafa00014, 0x8ee605f8,
-0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f000, 0x800227f, 0x0,
-0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
-0x8f820128, 0x14c20007, 0x0, 0x8ee201a0, 0x3821, 0x24420001,
-0xaee201a0, 0x8002263, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
-0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
-0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
+0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001,
+0x10620022, 0x0, 0x3c040001, 0x24844750, 0xafa00010, 0xafa00014,
+0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011, 0x8001f8f,
+0x0, 0x3c040001, 0x2484475c, 0xafa00014, 0x8f860120, 0x8f870124,
+0x3c050009, 0xc002403, 0x34a5f010, 0x8001f8f, 0x0, 0x3c040001,
+0x24844768, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f00f, 0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20128,
+0x24420001, 0xaee20128, 0x8ee20128, 0x8ee20160, 0x24420001, 0xaee20160,
+0x80022e2, 0x8ee20160, 0x8fa20020, 0x21200, 0x21d02, 0x24020001,
+0x10620005, 0x24020002, 0x1062000d, 0x0, 0x8001fb3, 0xafa00010,
+0x92e204c8, 0x14400006, 0x24020001, 0x8f820228, 0xaee204cc, 0x2402ffff,
+0xaf820228, 0x24020001, 0x8001fba, 0xa2e204c8, 0x92e204c8, 0x5040000c,
+0xa2e004c8, 0x8ee204cc, 0xaf820228, 0x8001fba, 0xa2e004c8, 0x3c040001,
+0x24844788, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f009,
+0x8ee2013c, 0x24420001, 0xaee2013c, 0x80022e2, 0x8ee2013c, 0x8fa20020,
+0x21200, 0x22502, 0x24020001, 0x10820005, 0x24020002, 0x1082000f,
+0x0, 0x8001fdf, 0xafa00010, 0x8f820220, 0x3c0308ff, 0x3463ffff,
+0x431024, 0x34420008, 0xaf820220, 0x24020001, 0x3c010001, 0x370821,
+0xa02283a2, 0x8001fe6, 0xaee40108, 0x8f820220, 0x3c0308ff, 0x3463fff7,
+0x431024, 0xaf820220, 0x3c010001, 0x370821, 0xa02083a2, 0x8001fe6,
+0xaee40108, 0x3c040001, 0x24844794, 0xafa00014, 0x8fa60020, 0x3c050003,
+0xc002403, 0x34a5f00a, 0x8ee2012c, 0x24420001, 0xaee2012c, 0x80022e2,
+0x8ee2012c, 0x8fa20020, 0x21200, 0x21d02, 0x24020001, 0x10620005,
+0x24020002, 0x1062000e, 0x0, 0x800200d, 0xafa00010, 0x8f820220,
+0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x24020001,
+0x3c010001, 0x370821, 0x8002014, 0xa02283a3, 0x3c020001, 0x571021,
+0x904283a2, 0x3c010001, 0x370821, 0x1440000e, 0xa02083a3, 0x8f820220,
+0x3c0308ff, 0x3463fff7, 0x431024, 0x8002014, 0xaf820220, 0x3c040001,
+0x248447a0, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00b,
+0x8ee20114, 0x24420001, 0xaee20114, 0x80022e2, 0x8ee20114, 0x27840208,
+0x27450200, 0xc00249a, 0x24060008, 0x26e40094, 0x27450200, 0xc00249a,
+0x24060008, 0x8ee20134, 0x24420001, 0xaee20134, 0x80022e2, 0x8ee20134,
+0x8f460248, 0x24040001, 0xc004eac, 0x24050004, 0x8ee20130, 0x24420001,
+0xaee20130, 0x80022e2, 0x8ee20130, 0x8ef301c4, 0x8ef401c8, 0x8ef501cc,
+0x8ee20140, 0x26e40030, 0x24420001, 0xaee20140, 0x8ef00140, 0x8ef10074,
+0x8ef20070, 0xc002488, 0x24050400, 0xaef301c4, 0xaef401c8, 0xaef501cc,
+0xaef00140, 0xaef10074, 0xaef20070, 0x8f42025c, 0x26e40094, 0xaee20060,
+0x8f420260, 0x27450200, 0x24060008, 0xaee20068, 0x24020006, 0xc00249a,
+0xaee20064, 0x3c023b9a, 0x3442ca00, 0xaee2006c, 0x240203e8, 0x24040002,
+0x24030001, 0xaee20104, 0xaee40100, 0xaee3010c, 0x8f820220, 0x30420008,
+0x10400004, 0x0, 0xaee30108, 0x800205d, 0x2021, 0xaee40108,
+0x2021, 0x3c030001, 0x641821, 0x90634f60, 0x2e41021, 0x24840001,
+0xa043009c, 0x2c82000f, 0x1440fff8, 0x0, 0x8f820040, 0x2e41821,
+0x24840001, 0x21702, 0x24420030, 0xa062009c, 0x2e41021, 0x80022e2,
+0xa040009c, 0x240a0400, 0x24090040, 0x24080001, 0x8f830100, 0x27623000,
+0x24660020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004,
+0x0, 0x8f820104, 0x14c20007, 0x26e20030, 0x8ee201a4, 0x3821,
+0x24420001, 0xaee201a4, 0x800209f, 0x8ee201a4, 0x8ee404a8, 0x8ee504ac,
+0xac620008, 0xa46a000e, 0xac600018, 0xac60001c, 0xac640000, 0xac650004,
+0x8ee204bc, 0xac620010, 0xaf860100, 0x92e204dc, 0x1440000e, 0x24070001,
+0x8ee24e18, 0x24420001, 0x50490003, 0x1021, 0x8ee24e18, 0x24420001,
+0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21021, 0xac400000,
+0xac480004, 0x10e0ffd2, 0x0, 0x8ee20148, 0x24420001, 0xaee20148,
+0x80022e2, 0x8ee20148, 0x3c020900, 0xaee05228, 0xaee0522c, 0xaee05230,
+0xaee05234, 0xaee001c8, 0x3c010001, 0x370821, 0xa02083a1, 0xafa20018,
+0x8ee205f8, 0x8f430228, 0x24420001, 0x304a00ff, 0x514300fd, 0xafa00010,
+0x8ee205f8, 0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc,
+0xac440600, 0x8f830054, 0x8f820054, 0x24690032, 0x1221023, 0x2c420033,
+0x1040006a, 0x5821, 0x24100008, 0x240f000d, 0x240d0007, 0x240c0040,
+0x240e0001, 0x8f870120, 0x27623800, 0x24e80020, 0x102102b, 0x50400001,
+0x27683000, 0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007,
+0x1021, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8002126,
+0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434,
+0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004,
+0x8ee205f8, 0xa4f0000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc,
+0x2e21021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
+0x14400033, 0x24070001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c820000, 0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
+0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
+0x24420001, 0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
+0x0, 0x8002113, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
+0xac800000, 0x8002126, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0xac8d0000, 0xac8e0004, 0x54e00006, 0x240b0001,
+0x8f820054, 0x1221023, 0x2c420033, 0x1440ff9d, 0x0, 0x316300ff,
+0x24020001, 0x54620078, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054,
+0x24690032, 0x1221023, 0x2c420033, 0x10400061, 0x5821, 0x240e0008,
+0x240d0011, 0x240a0012, 0x24080040, 0x240c0001, 0x8f830120, 0x27623800,
+0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004,
+0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3821,
+0x24420001, 0xaee201a0, 0x8002192, 0x8ee201a0, 0x8ee205f8, 0xac62001c,
+0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008, 0xa46e000e, 0xac6d0018,
+0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10,
+0x14400033, 0x24070001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c820000, 0x144a001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
+0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
+0x24420001, 0x10480007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
+0x0, 0x800217f, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
+0xac800000, 0x8002192, 0x0, 0x8ee24e20, 0x24420001, 0x50480003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0xac8a0000, 0xac8c0004, 0x54e00006, 0x240b0001,
+0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff,
+0x24020001, 0x10620022, 0x0, 0x3c040001, 0x24844750, 0xafa00010,
+0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011,
+0x80021be, 0x0, 0x3c040001, 0x2484475c, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x80021be, 0x0,
+0x3c040001, 0x24844768, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f00f, 0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8,
+0x8ee20120, 0x24420001, 0xaee20120, 0x8ee20120, 0x8ee20164, 0x24420001,
+0xaee20164, 0x80022e2, 0x8ee20164, 0x8f42025c, 0x26e40094, 0xaee20060,
+0x8f420260, 0x27450200, 0x24060008, 0xc00249a, 0xaee20068, 0x8f820220,
+0x30420008, 0x14400002, 0x24020001, 0x24020002, 0xaee20108, 0x8ee2011c,
+0x24420001, 0xaee2011c, 0x80022e2, 0x8ee2011c, 0x3c040001, 0x248447ac,
+0xafa00010, 0xafa00014, 0x8fa60020, 0x3c050003, 0xc002403, 0x34a5f00f,
+0x93a20020, 0x3c030700, 0x34631000, 0x431025, 0xafa20018, 0x8ee205f8,
+0x8f430228, 0x24420001, 0x304900ff, 0x512300e2, 0xafa00010, 0x8ee205f8,
+0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600,
+0x8f870120, 0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000,
+0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021,
+0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8002257, 0x8ee201a0,
+0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821,
+0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee305f8,
+0x24020008, 0xa4e2000e, 0x2402000d, 0xace20018, 0xace9001c, 0x318c0,
+0x246305fc, 0x2e31021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120,
0x92e24e10, 0x14400037, 0x24070001, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
+0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ee34e20,
0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0, 0x8ee24e24,
-0x24420001, 0x10a20005, 0x0, 0x800224d, 0x0, 0x14a00005,
+0x24420001, 0x10a20005, 0x0, 0x8002241, 0x0, 0x14a00005,
0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x8002263, 0x0, 0x8ee24e20,
+0x2c420011, 0x50400013, 0xac800000, 0x8002257, 0x0, 0x8ee24e20,
0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
-0xac820000, 0x24020001, 0xac820004, 0x14e0001b, 0x0, 0x3c040001,
-0x248445ac, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
-0xc0023a7, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac, 0x800227f,
-0x8ee201ac, 0x3c040001, 0x248445b8, 0xafa00014, 0x8ee605f8, 0x8f470228,
-0x3c050009, 0xc0023a7, 0x34a5f005, 0x8ee201a8, 0x24420001, 0xaee201a8,
-0x8ee201a8, 0x8ee2014c, 0x24420001, 0xaee2014c, 0x8ee2014c, 0x8ee2015c,
-0x24420001, 0xaee2015c, 0x8ee2015c, 0x8f43022c, 0x8f42010c, 0x14620009,
-0x24020002, 0xaf820064, 0x8f820064, 0x14400005, 0x0, 0x8f43022c,
-0x8f42010c, 0x1462f897, 0x0, 0x8fbf0044, 0x8fb60040, 0x8fb5003c,
-0x8fb40038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028, 0x3e00008,
-0x27bd0048, 0x27bdfff8, 0x2408ffff, 0x10a00014, 0x4821, 0x3c0aedb8,
-0x354a8320, 0x90870000, 0x24840001, 0x3021, 0x1071026, 0x30420001,
-0x10400002, 0x81842, 0x6a1826, 0x604021, 0x24c60001, 0x2cc20008,
-0x1440fff7, 0x73842, 0x25290001, 0x125102b, 0x1440fff0, 0x0,
-0x1001021, 0x3e00008, 0x27bd0008, 0x0, 0x27bdffe8, 0x27642800,
-0xafbf0010, 0xc00242c, 0x24051000, 0x24020021, 0xaf800100, 0xaf800104,
-0xaf800108, 0xaf800110, 0xaf800114, 0xaf800118, 0xaf800120, 0xaf800124,
-0xaf800128, 0xaf800130, 0xaf800134, 0xaf800138, 0xaee04e18, 0xaee04e1c,
-0xaee04e20, 0xaee04e24, 0xaf82011c, 0x8f420218, 0x30420040, 0x10400004,
-0x0, 0x8f82011c, 0x34420004, 0xaf82011c, 0x8fbf0010, 0x3e00008,
-0x27bd0018, 0x27bdffe0, 0xafbf0018, 0x8f820104, 0xafa20010, 0x8f820100,
-0x3c050002, 0xafa20014, 0x8f8600b0, 0x8f87011c, 0x3c040001, 0x2484466c,
-0xc0023a7, 0x34a5f000, 0x8f8300b0, 0x3c027f00, 0x621824, 0x3c020400,
-0x1062002b, 0x43102b, 0x14400008, 0x3c022000, 0x3c020100, 0x10620026,
-0x3c020200, 0x10620013, 0x0, 0x8002316, 0x0, 0x1062000a,
-0x43102b, 0x1040001e, 0x3c024000, 0x1462001c, 0x0, 0x8ee2018c,
-0x24420001, 0xaee2018c, 0x8002316, 0x8ee2018c, 0x8ee20188, 0x24420001,
-0xaee20188, 0x8002316, 0x8ee20188, 0x8f82011c, 0x34420002, 0xaf82011c,
-0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0xaf830104, 0x8f82011c,
-0x2403fffd, 0x431024, 0xaf82011c, 0x8ee2019c, 0x24420001, 0xaee2019c,
-0x8002319, 0x8ee2019c, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0x8fbf0018,
-0x3e00008, 0x27bd0020, 0x27bdffe0, 0xafbf001c, 0xafb00018, 0x8f820120,
-0xafa20010, 0x8f820124, 0x3c050001, 0xafa20014, 0x8f8600a0, 0x8f87011c,
-0x3c040001, 0x24844678, 0xc0023a7, 0x34a5f000, 0x8f8300a0, 0x3c027f00,
-0x621824, 0x3c020400, 0x10620055, 0x8021, 0x43102b, 0x14400008,
-0x3c042000, 0x3c020100, 0x1062004f, 0x3c020200, 0x1062003c, 0x0,
-0x8002384, 0x0, 0x10640005, 0x83102b, 0x10400047, 0x3c024000,
-0x14620045, 0x0, 0x8f8200a0, 0x441024, 0x10400006, 0x0,
-0x8ee20190, 0x24420001, 0xaee20190, 0x800234d, 0x8ee20190, 0x8ee20194,
-0x24420001, 0xaee20194, 0x8ee20194, 0x8f82011c, 0x34420002, 0xaf82011c,
-0x8f82011c, 0x30420200, 0x1040001b, 0x0, 0x8f8300a0, 0x8f840124,
-0x8f8200ac, 0x14400007, 0x24020001, 0x3c020001, 0x3442f000, 0x621024,
-0x50400001, 0x24100001, 0x24020001, 0x1200000d, 0xaf8200a0, 0x8f820124,
-0x2442ffe0, 0xaf820124, 0x8f820124, 0x8f820124, 0x27633000, 0x43102b,
-0x10400005, 0x276237e0, 0xaf820124, 0x800236e, 0x0, 0xaf840124,
-0x8f82011c, 0x2403fffd, 0x431024, 0x8002387, 0xaf82011c, 0x8f82011c,
-0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001, 0xaf8200a0,
-0xaf830124, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee20198,
-0x24420001, 0xaee20198, 0x8002387, 0x8ee20198, 0x8f8200a0, 0x34420001,
-0xaf8200a0, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x0,
-0x3c020001, 0x8c424d78, 0x27bdffe8, 0xafbf0014, 0x14400012, 0xafb00010,
-0x3c100001, 0x26104eb0, 0x2002021, 0xc00242c, 0x24052000, 0x26021fe0,
-0x3c010001, 0xac224e84, 0x3c010001, 0xac224e80, 0xaf420250, 0x24022000,
-0xaf500254, 0xaf420258, 0x24020001, 0x3c010001, 0xac224d78, 0x8fbf0014,
-0x8fb00010, 0x3e00008, 0x27bd0018, 0x3c030001, 0x8c634e84, 0x8c820000,
-0x8fa80010, 0x8fa90014, 0xac620000, 0x3c020001, 0x8c424e84, 0x8c830004,
-0xac430004, 0xac450008, 0x8f840054, 0x2443ffe0, 0xac460010, 0xac470014,
-0xac480018, 0xac49001c, 0x3c010001, 0xac234e84, 0xac44000c, 0x3c020001,
-0x24424eb0, 0x62182b, 0x10600005, 0x0, 0x3c020001, 0x8c424e80,
-0x3c010001, 0xac224e84, 0x3c030001, 0x8c634e84, 0x3c020001, 0x8c424d60,
-0xac620000, 0x3c030001, 0x8c634e84, 0x3c020001, 0x8c424d60, 0xac620004,
-0x3e00008, 0xaf430250, 0x3c030001, 0x8c634e84, 0x3c020001, 0x8c424d60,
-0x27bdffd0, 0xafb40020, 0x8fb40040, 0xafb00010, 0x808021, 0xafb50024,
-0x8fb50044, 0x8fa40048, 0xafb10014, 0xa08821, 0xafbf0028, 0xafb3001c,
-0xafb20018, 0xac620000, 0x3c050001, 0x8ca54e84, 0x3c020001, 0x8c424d60,
-0xc09021, 0xe09821, 0x10800006, 0xaca20004, 0x24a50008, 0xc002434,
-0x24060018, 0x80023f2, 0x0, 0x24a40008, 0xc00242c, 0x24050018,
-0x3c020001, 0x8c424e84, 0x3c050001, 0x24a54eb0, 0x2442ffe0, 0x3c010001,
-0xac224e84, 0x45102b, 0x10400005, 0x0, 0x3c020001, 0x8c424e80,
-0x3c010001, 0xac224e84, 0x3c030001, 0x8c634e84, 0x8e020000, 0xac620000,
-0x3c030001, 0x8c634e84, 0x8e020004, 0xac620004, 0xac710008, 0x8f840054,
-0x2462ffe0, 0x3c010001, 0xac224e84, 0x45102b, 0xac720010, 0xac730014,
-0xac740018, 0xac75001c, 0x10400005, 0xac64000c, 0x3c020001, 0x8c424e80,
-0x3c010001, 0xac224e84, 0x3c030001, 0x8c634e84, 0x3c020001, 0x8c424d60,
-0xac620000, 0x3c030001, 0x8c634e84, 0x3c020001, 0x8c424d60, 0xac620004,
-0xaf430250, 0x8fbf0028, 0x8fb50024, 0x8fb40020, 0x8fb3001c, 0x8fb20018,
-0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030, 0x10a00005, 0x0,
-0xac800000, 0x24a5fffc, 0x14a0fffd, 0x24840004, 0x3e00008, 0x0,
-0x10c00007, 0x0, 0x8c820000, 0x24840004, 0x24c6fffc, 0xaca20000,
-0x14c0fffb, 0x24a50004, 0x3e00008, 0x0, 0x10c00007, 0x0,
-0x8ca20000, 0x24a50004, 0x24c6fffc, 0xac820000, 0x14c0fffb, 0x24840004,
-0x3e00008, 0x0, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0020,
-0x8ee304d4, 0x8ee204d0, 0x1062041e, 0x0, 0x8ee204d4, 0x8ee304ec,
-0x21100, 0x626021, 0x95870008, 0x8d8a0000, 0x8d8b0004, 0x958d000a,
-0x8ee2724c, 0x8ee3725c, 0x30e4ffff, 0x441021, 0x62182b, 0x10600015,
-0x31a20004, 0x8f8200d8, 0x8ee37248, 0x431023, 0xaee2725c, 0x8ee2725c,
-0x1c400003, 0x3c030001, 0x431021, 0xaee2725c, 0x8ee2724c, 0x8ee3725c,
-0x441021, 0x62182b, 0x10600006, 0x31a20004, 0x8ee201b4, 0x24420001,
-0xaee201b4, 0x800286d, 0x8ee201b4, 0x10400234, 0x31a20200, 0x10400144,
-0x4821, 0x96e2045a, 0x30420010, 0x10400140, 0x0, 0x8f840100,
+0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007,
+0xac820000, 0x24020001, 0xac820004, 0x54e0000c, 0xaee905f8, 0x3c040001,
+0x248447b4, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f000, 0x80022da, 0x0, 0x8f830120, 0x27623800,
+0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004,
+0x0, 0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x3821,
+0x24420001, 0xaee201a0, 0x80022be, 0x8ee201a0, 0x8ee205f8, 0xac62001c,
+0x8ee40490, 0x8ee50494, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e,
+0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010,
+0xaf860120, 0x92e24e10, 0x14400037, 0x24070001, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0,
+0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007, 0x0,
+0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x80022a8, 0x0,
+0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
+0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80022be, 0x0,
+0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e20,
+0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x14e0001b, 0x0,
+0x3c040001, 0x248447bc, 0xafa00010, 0xafa00014, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0xc002403, 0x34a5f001, 0x8ee201ac, 0x24420001, 0xaee201ac,
+0x80022da, 0x8ee201ac, 0x3c040001, 0x248447c8, 0xafa00014, 0x8ee605f8,
+0x8f470228, 0x3c050009, 0xc002403, 0x34a5f005, 0x8ee201a8, 0x24420001,
+0xaee201a8, 0x8ee201a8, 0x8ee2014c, 0x24420001, 0xaee2014c, 0x8ee2014c,
+0x8ee2015c, 0x24420001, 0xaee2015c, 0x8ee2015c, 0x8f43022c, 0x8f42010c,
+0x14620009, 0x24020002, 0xaf820064, 0x8f820064, 0x14400005, 0x0,
+0x8f43022c, 0x8f42010c, 0x1462f877, 0x0, 0x8fbf0044, 0x8fb60040,
+0x8fb5003c, 0x8fb40038, 0x8fb30034, 0x8fb20030, 0x8fb1002c, 0x8fb00028,
+0x3e00008, 0x27bd0048, 0x27bdfff8, 0x2408ffff, 0x10a00014, 0x4821,
+0x3c0aedb8, 0x354a8320, 0x90870000, 0x24840001, 0x3021, 0x1071026,
+0x30420001, 0x10400002, 0x81842, 0x6a1826, 0x604021, 0x24c60001,
+0x2cc20008, 0x1440fff7, 0x73842, 0x25290001, 0x125102b, 0x1440fff0,
+0x0, 0x1001021, 0x3e00008, 0x27bd0008, 0x0, 0x0,
+0x27bdffe8, 0x27642800, 0xafbf0010, 0xc002488, 0x24051000, 0x24020021,
+0xaf800100, 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114, 0xaf800118,
+0xaf800120, 0xaf800124, 0xaf800128, 0xaf800130, 0xaf800134, 0xaf800138,
+0xaee04e18, 0xaee04e1c, 0xaee04e20, 0xaee04e24, 0xaf82011c, 0x8f420218,
+0x30420040, 0x10400004, 0x0, 0x8f82011c, 0x34420004, 0xaf82011c,
+0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0xafbf0018, 0x8f820104,
+0xafa20010, 0x8f820100, 0x3c050002, 0xafa20014, 0x8f8600b0, 0x8f87011c,
+0x3c040001, 0x2484487c, 0xc002403, 0x34a5f000, 0x8f8300b0, 0x3c027f00,
+0x621824, 0x3c020400, 0x1062002b, 0x43102b, 0x14400008, 0x3c022000,
+0x3c020100, 0x10620026, 0x3c020200, 0x10620013, 0x0, 0x8002372,
+0x0, 0x1062000a, 0x43102b, 0x1040001e, 0x3c024000, 0x1462001c,
+0x0, 0x8ee2018c, 0x24420001, 0xaee2018c, 0x8002372, 0x8ee2018c,
+0x8ee20188, 0x24420001, 0xaee20188, 0x8002372, 0x8ee20188, 0x8f82011c,
+0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0,
+0xaf830104, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee2019c,
+0x24420001, 0xaee2019c, 0x8002375, 0x8ee2019c, 0x8f8200b0, 0x34420001,
+0xaf8200b0, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, 0xafbf001c,
+0xafb00018, 0x8f820120, 0xafa20010, 0x8f820124, 0x3c050001, 0xafa20014,
+0x8f8600a0, 0x8f87011c, 0x3c040001, 0x24844888, 0xc002403, 0x34a5f000,
+0x8f8300a0, 0x3c027f00, 0x621824, 0x3c020400, 0x10620055, 0x8021,
+0x43102b, 0x14400008, 0x3c042000, 0x3c020100, 0x1062004f, 0x3c020200,
+0x1062003c, 0x0, 0x80023e0, 0x0, 0x10640005, 0x83102b,
+0x10400047, 0x3c024000, 0x14620045, 0x0, 0x8f8200a0, 0x441024,
+0x10400006, 0x0, 0x8ee20190, 0x24420001, 0xaee20190, 0x80023a9,
+0x8ee20190, 0x8ee20194, 0x24420001, 0xaee20194, 0x8ee20194, 0x8f82011c,
+0x34420002, 0xaf82011c, 0x8f82011c, 0x30420200, 0x1040001b, 0x0,
+0x8f8300a0, 0x8f840124, 0x8f8200ac, 0x14400007, 0x24020001, 0x3c020001,
+0x3442f000, 0x621024, 0x50400001, 0x24100001, 0x24020001, 0x1200000d,
+0xaf8200a0, 0x8f820124, 0x2442ffe0, 0xaf820124, 0x8f820124, 0x8f820124,
+0x27633000, 0x43102b, 0x10400005, 0x276237e0, 0xaf820124, 0x80023ca,
+0x0, 0xaf840124, 0x8f82011c, 0x2403fffd, 0x431024, 0x80023e3,
+0xaf82011c, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0,
+0x34420001, 0xaf8200a0, 0xaf830124, 0x8f82011c, 0x2403fffd, 0x431024,
+0xaf82011c, 0x8ee20198, 0x24420001, 0xaee20198, 0x80023e3, 0x8ee20198,
+0x8f8200a0, 0x34420001, 0xaf8200a0, 0x8fbf001c, 0x8fb00018, 0x3e00008,
+0x27bd0020, 0x0, 0x3c020001, 0x8c424f88, 0x27bdffe8, 0xafbf0014,
+0x14400012, 0xafb00010, 0x3c100001, 0x261050c0, 0x2002021, 0xc002488,
+0x24052000, 0x26021fe0, 0x3c010001, 0xac225094, 0x3c010001, 0xac225090,
+0xaf420250, 0x24022000, 0xaf500254, 0xaf420258, 0x24020001, 0x3c010001,
+0xac224f88, 0x8fbf0014, 0x8fb00010, 0x3e00008, 0x27bd0018, 0x3c030001,
+0x8c635094, 0x8c820000, 0x8fa80010, 0x8fa90014, 0xac620000, 0x3c020001,
+0x8c425094, 0x8c830004, 0xac430004, 0xac450008, 0x8f840054, 0x2443ffe0,
+0xac460010, 0xac470014, 0xac480018, 0xac49001c, 0x3c010001, 0xac235094,
+0xac44000c, 0x3c020001, 0x244250c0, 0x62182b, 0x10600005, 0x0,
+0x3c020001, 0x8c425090, 0x3c010001, 0xac225094, 0x3c030001, 0x8c635094,
+0x3c020001, 0x8c424f70, 0xac620000, 0x3c030001, 0x8c635094, 0x3c020001,
+0x8c424f70, 0xac620004, 0x3e00008, 0xaf430250, 0x3c030001, 0x8c635094,
+0x3c020001, 0x8c424f70, 0x27bdffd0, 0xafb40020, 0x8fb40040, 0xafb00010,
+0x808021, 0xafb50024, 0x8fb50044, 0x8fa40048, 0xafb10014, 0xa08821,
+0xafbf0028, 0xafb3001c, 0xafb20018, 0xac620000, 0x3c050001, 0x8ca55094,
+0x3c020001, 0x8c424f70, 0xc09021, 0xe09821, 0x10800006, 0xaca20004,
+0x24a50008, 0xc002490, 0x24060018, 0x800244e, 0x0, 0x24a40008,
+0xc002488, 0x24050018, 0x3c020001, 0x8c425094, 0x3c050001, 0x24a550c0,
+0x2442ffe0, 0x3c010001, 0xac225094, 0x45102b, 0x10400005, 0x0,
+0x3c020001, 0x8c425090, 0x3c010001, 0xac225094, 0x3c030001, 0x8c635094,
+0x8e020000, 0xac620000, 0x3c030001, 0x8c635094, 0x8e020004, 0xac620004,
+0xac710008, 0x8f840054, 0x2462ffe0, 0x3c010001, 0xac225094, 0x45102b,
+0xac720010, 0xac730014, 0xac740018, 0xac75001c, 0x10400005, 0xac64000c,
+0x3c020001, 0x8c425090, 0x3c010001, 0xac225094, 0x3c030001, 0x8c635094,
+0x3c020001, 0x8c424f70, 0xac620000, 0x3c030001, 0x8c635094, 0x3c020001,
+0x8c424f70, 0xac620004, 0xaf430250, 0x8fbf0028, 0x8fb50024, 0x8fb40020,
+0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0030,
+0x10a00005, 0x0, 0xac800000, 0x24a5fffc, 0x14a0fffd, 0x24840004,
+0x3e00008, 0x0, 0x10c00007, 0x0, 0x8c820000, 0x24840004,
+0x24c6fffc, 0xaca20000, 0x14c0fffb, 0x24a50004, 0x3e00008, 0x0,
+0x10c00007, 0x0, 0x8ca20000, 0x24a50004, 0x24c6fffc, 0xac820000,
+0x14c0fffb, 0x24840004, 0x3e00008, 0x0, 0x3e00008, 0x0,
+0x27bdffd8, 0xafbf0020, 0x8ee304d4, 0x8ee204d0, 0x10620436, 0x0,
+0x8ee204d4, 0x8ee304ec, 0x21100, 0x626021, 0x95870008, 0x8d8a0000,
+0x8d8b0004, 0x958d000a, 0x8ee2724c, 0x8ee3725c, 0x30e4ffff, 0x441021,
+0x62182b, 0x10600015, 0x31a20004, 0x8f8200d8, 0x8ee37248, 0x431023,
+0xaee2725c, 0x8ee2725c, 0x1c400003, 0x3c030001, 0x431021, 0xaee2725c,
+0x8ee2724c, 0x8ee3725c, 0x441021, 0x62182b, 0x10600006, 0x31a20004,
+0x8ee201b4, 0x24420001, 0xaee201b4, 0x80028e1, 0x8ee201b4, 0x10400240,
+0x31a20200, 0x1040014d, 0x4821, 0x96e2045a, 0x30420010, 0x10400149,
+0x0, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001,
+0x27652800, 0x8f820108, 0x10a20004, 0x0, 0x8f820104, 0x14a20006,
+0x2402000c, 0x8ee201a4, 0x24420001, 0xaee201a4, 0x800252c, 0x8ee201a4,
+0xac8a0000, 0xac8b0004, 0x8ee37254, 0x24060005, 0xa482000e, 0xac860018,
+0xac830008, 0x8ee204d4, 0xac82001c, 0x8ee204b8, 0xac820010, 0xaf850100,
+0x92e204dc, 0x14400036, 0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28,
+0x2e22021, 0x8c820000, 0x1446001f, 0x0, 0x8ee34e18, 0x8ee24e1c,
+0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c,
+0x8ee54e18, 0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001,
+0x10a20005, 0x0, 0x8002516, 0x0, 0x14a00005, 0x0,
+0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011,
+0x50400013, 0xac800000, 0x800252c, 0x0, 0x8ee24e18, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18,
+0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000,
+0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010, 0x8ee27254,
+0x3c040001, 0x24844af0, 0x3c050004, 0xafa20014, 0x8ee604d4, 0x80028be,
+0x34a5f114, 0x8ee27254, 0x34843800, 0x3641821, 0x24420010, 0x43102b,
+0x14400073, 0x0, 0x8ee27254, 0x24480010, 0x3641021, 0x102102b,
+0x14400002, 0x3c02ffff, 0x1024021, 0x8f850100, 0x27623000, 0x24a60020,
+0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0,
+0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a4, 0x4821, 0x24420001,
+0xaee201a4, 0x80025a0, 0x8ee201a4, 0x2c64000c, 0x1441021, 0xaca20000,
+0xaca30004, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca80008, 0xaca20018,
+0x8ee204d4, 0xaca2001c, 0x8ee204b8, 0x3c030002, 0x431025, 0xaca20010,
+0xaf860100, 0x92e204dc, 0x14400037, 0x24090001, 0x8ee24e18, 0x210c0,
+0x24424e28, 0x2e22021, 0x8c830000, 0x24020005, 0x1462001f, 0x0,
+0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007, 0x0,
+0x8ee24e1c, 0x24420001, 0x10a20005, 0x0, 0x800258a, 0x0,
+0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108,
+0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x80025a0, 0x0,
+0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18,
+0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
+0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc,
+0xafab0010, 0x8ee27254, 0x3c040001, 0x24844af0, 0x3c050004, 0xafa20014,
+0x8ee604d4, 0x80028be, 0x34a5f125, 0x34028100, 0xa5020000, 0x9582000e,
+0x800261d, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 0xc2102b,
+0x50400001, 0x27662800, 0x8f820108, 0x10c20004, 0x0, 0x8f820104,
+0x14c20007, 0x2563000c, 0x8ee201a4, 0x4821, 0x24420001, 0xaee201a4,
+0x800260d, 0x8ee201a4, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004,
+0x8ee37254, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca20018, 0x24630010,
+0xaca30008, 0x8ee204d4, 0xaca2001c, 0x8ee204b8, 0x3c030002, 0x431025,
+0xaca20010, 0xaf860100, 0x92e204dc, 0x14400037, 0x24090001, 0x8ee24e18,
+0x210c0, 0x24424e28, 0x2e22021, 0x8c830000, 0x24020005, 0x1462001f,
+0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007,
+0x0, 0x8ee24e1c, 0x24420001, 0x10a20005, 0x0, 0x80025f7,
+0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108,
+0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x800260d,
+0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021,
+0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28,
+0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a,
+0x34028100, 0xafab0010, 0x8ee27254, 0x3c040001, 0x24844af0, 0x3c050004,
+0xafa20014, 0x8ee604d4, 0x80028be, 0x34a5f015, 0x8ee37254, 0xa462000c,
+0x8ee37254, 0x9582000e, 0xa462000e, 0x8002681, 0x24e70004, 0x8f840100,
0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108,
-0x14a20006, 0x2402000c, 0x8ee201a4, 0x24420001, 0xaee201a4, 0x80024cd,
-0x8ee201a4, 0xac8a0000, 0xac8b0004, 0x8ee37254, 0x24060005, 0xa482000e,
-0xac860018, 0xac830008, 0x8ee204d4, 0xac82001c, 0x8ee204b8, 0xac820010,
-0xaf850100, 0x92e204dc, 0x14400036, 0x24090001, 0x8ee24e18, 0x210c0,
-0x24424e28, 0x2e22021, 0x8c820000, 0x1446001f, 0x0, 0x8ee34e18,
+0x10a20004, 0x0, 0x8f820104, 0x14a20007, 0x24020006, 0x8ee201a4,
+0x4821, 0x24420001, 0xaee201a4, 0x8002677, 0x8ee201a4, 0xac8a0000,
+0xac8b0004, 0x8ee37254, 0xa487000e, 0xac820018, 0xac830008, 0x8ee204d4,
+0xac82001c, 0x8ee204b8, 0x3c030002, 0x431025, 0xac820010, 0xaf850100,
+0x92e204dc, 0x14400037, 0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28,
+0x2e22021, 0x8c830000, 0x24020005, 0x1462001f, 0x0, 0x8ee34e18,
0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007, 0x0, 0x8ee24e1c,
-0x24420001, 0x10a20005, 0x0, 0x80024b7, 0x0, 0x14a00005,
+0x24420001, 0x10a20005, 0x0, 0x8002661, 0x0, 0x14a00005,
0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004,
-0x2c420011, 0x50400013, 0xac800000, 0x80024cd, 0x0, 0x8ee24e18,
+0x2c420011, 0x50400013, 0xac800000, 0x8002677, 0x0, 0x8ee24e18,
0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001,
0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x24020005,
-0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001, 0xafab0010,
-0x8ee27254, 0x3c040001, 0x248448e0, 0x3c050004, 0xafa20014, 0x8ee604d4,
-0x800284a, 0x34a5f114, 0x8ee27254, 0x34843800, 0x3641821, 0x24420010,
-0x43102b, 0x14400070, 0x0, 0x8ee27254, 0x24480010, 0x3641021,
-0x102102b, 0x14400002, 0x3c02ffff, 0x1024021, 0x8f850100, 0x27623000,
-0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x14c20007,
-0x2563000c, 0x8ee201a4, 0x4821, 0x24420001, 0xaee201a4, 0x800253e,
-0x8ee201a4, 0x2c64000c, 0x1441021, 0xaca20000, 0xaca30004, 0x24e2fff4,
-0xa4a2000e, 0x24020006, 0xaca80008, 0xaca20018, 0x8ee204d4, 0xaca2001c,
-0x8ee204b8, 0x3c030002, 0x431025, 0xaca20010, 0xaf860100, 0x92e204dc,
-0x14400037, 0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
-0x8c830000, 0x24020005, 0x1462001f, 0x0, 0x8ee34e18, 0x8ee24e1c,
-0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c,
-0x8ee54e18, 0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001,
-0x10a20005, 0x0, 0x8002528, 0x0, 0x14a00005, 0x0,
-0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011,
-0x50400013, 0xac800000, 0x800253e, 0x0, 0x8ee24e18, 0x24030040,
-0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18,
-0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000,
-0x24020001, 0xac820004, 0x1520000a, 0x2508fffc, 0xafab0010, 0x8ee27254,
-0x3c040001, 0x248448e0, 0x3c050004, 0xafa20014, 0x8ee604d4, 0x800284a,
-0x34a5f125, 0x34028100, 0xa5020000, 0x9582000e, 0x80025b8, 0xa5020002,
-0x8f850100, 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 0x27662800,
-0x8f820108, 0x14c20007, 0x2563000c, 0x8ee201a4, 0x4821, 0x24420001,
-0xaee201a4, 0x80025a8, 0x8ee201a4, 0x2c64000c, 0x1441021, 0xaca20000,
-0xaca30004, 0x8ee37254, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca20018,
-0x24630010, 0xaca30008, 0x8ee204d4, 0xaca2001c, 0x8ee204b8, 0x3c030002,
+0xac820000, 0x24020001, 0xac820004, 0x15200009, 0x3c050004, 0xafab0010,
+0x8ee27254, 0x3c040001, 0x24844af0, 0xafa20014, 0x8ee604d4, 0x80028be,
+0x34a5f004, 0x8ee2724c, 0x30e7ffff, 0x471021, 0xaee2724c, 0x8ee204d4,
+0x8ee304ec, 0x8ee47248, 0x21100, 0x431021, 0xac44000c, 0x8ee27248,
+0xafa20018, 0x8ee3724c, 0xafa3001c, 0x8ee2724c, 0x2c42003c, 0x10400004,
+0x24620001, 0x2403fffe, 0x431024, 0xafa2001c, 0x8ee27254, 0x3c060001,
+0x34c63800, 0x8ee3724c, 0x2405fff8, 0x471021, 0x24420007, 0x451024,
+0x24630007, 0xaee27248, 0x8ee2725c, 0x8ee47248, 0x651824, 0x431023,
+0xaee2725c, 0x3661021, 0x82202b, 0x14800004, 0x3c03ffff, 0x8ee27248,
+0x431021, 0xaee27248, 0x8ee27248, 0xaee27254, 0x8f8200f0, 0x24470008,
+0x27621800, 0xe2102b, 0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007,
+0x0, 0x8ee201b0, 0x4821, 0x24420001, 0xaee201b0, 0x80026c4,
+0x8ee201b0, 0x8f8200f0, 0x24090001, 0x8fa30018, 0x8fa4001c, 0xac430000,
+0xac440004, 0xaf8700f0, 0x15200012, 0xd1142, 0x8f8200f0, 0xafa20010,
+0x8f8200f4, 0x3c040001, 0x24844afc, 0xafa20014, 0x8fa60018, 0x8fa7001c,
+0x3c050004, 0xc002403, 0x34a5f005, 0x8ee20088, 0x24420001, 0xaee20088,
+0x8ee20088, 0x80028d3, 0xaee0724c, 0x30430003, 0x24020002, 0x10620016,
+0x28620003, 0x10400005, 0x24020001, 0x10620008, 0x0, 0x8002703,
+0x0, 0x24020003, 0x10620017, 0x0, 0x8002703, 0x0,
+0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021, 0xaee200e8,
+0xaee300ec, 0x8ee200e8, 0x8002703, 0x8ee300ec, 0x8ee200f0, 0x8ee300f4,
+0x24630001, 0x2c640001, 0x441021, 0xaee200f0, 0xaee300f4, 0x8ee200f0,
+0x8002703, 0x8ee300f4, 0x8ee200f8, 0x8ee300fc, 0x24630001, 0x2c640001,
+0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8, 0x8ee300fc, 0x8ee2724c,
+0x8ee400e0, 0x8ee500e4, 0x401821, 0x1021, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xaee400e0, 0xaee500e4, 0x80028d3, 0xaee0724c,
+0x30e2ffff, 0x104001c1, 0x31a20200, 0x1040014d, 0x4821, 0x96e2045a,
+0x30420010, 0x10400149, 0x0, 0x8f840100, 0x27623000, 0x24850020,
+0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0,
+0x8f820104, 0x14a20006, 0x2402000c, 0x8ee201a4, 0x24420001, 0xaee201a4,
+0x800276e, 0x8ee201a4, 0xac8a0000, 0xac8b0004, 0x8ee37254, 0x24060005,
+0xa482000e, 0xac860018, 0xac830008, 0x8ee204d4, 0xac82001c, 0x8ee204b8,
+0xac820010, 0xaf850100, 0x92e204dc, 0x14400036, 0x24090001, 0x8ee24e18,
+0x210c0, 0x24424e28, 0x2e22021, 0x8c820000, 0x1446001f, 0x0,
+0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007, 0x0,
+0x8ee24e1c, 0x24420001, 0x10a20005, 0x0, 0x8002758, 0x0,
+0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108,
+0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x800276e, 0x0,
+0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18,
+0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
+0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x3c040001,
+0xafab0010, 0x8ee27254, 0x3c040001, 0x24844af0, 0x3c050004, 0xafa20014,
+0x8ee604d4, 0x80028be, 0x34a5f014, 0x8ee27254, 0x34843800, 0x3641821,
+0x24420010, 0x43102b, 0x14400073, 0x0, 0x8ee27254, 0x24480010,
+0x3641021, 0x102102b, 0x14400002, 0x3c02ffff, 0x1024021, 0x8f850100,
+0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108,
+0x10c20004, 0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a4,
+0x4821, 0x24420001, 0xaee201a4, 0x80027e2, 0x8ee201a4, 0x2c64000c,
+0x1441021, 0xaca20000, 0xaca30004, 0x24e2fff4, 0xa4a2000e, 0x24020006,
+0xaca80008, 0xaca20018, 0x8ee204d4, 0xaca2001c, 0x8ee204b8, 0x3c030002,
0x431025, 0xaca20010, 0xaf860100, 0x92e204dc, 0x14400037, 0x24090001,
0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c830000, 0x24020005,
0x1462001f, 0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040,
0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001,
0x10430007, 0x0, 0x8ee24e1c, 0x24420001, 0x10a20005, 0x0,
-0x8002592, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020,
+0x80027cc, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020,
0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
-0x80025a8, 0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003,
+0x80027e2, 0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003,
0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0,
0x24424e28, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004,
-0x1520000a, 0x34028100, 0xafab0010, 0x8ee27254, 0x3c040001, 0x248448e0,
-0x3c050004, 0xafa20014, 0x8ee604d4, 0x800284a, 0x34a5f015, 0x8ee37254,
-0xa462000c, 0x8ee37254, 0x9582000e, 0xa462000e, 0x8002619, 0x24e70004,
-0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800,
-0x8f820108, 0x14a20007, 0x24020006, 0x8ee201a4, 0x4821, 0x24420001,
-0xaee201a4, 0x800260f, 0x8ee201a4, 0xac8a0000, 0xac8b0004, 0x8ee37254,
-0xa487000e, 0xac820018, 0xac830008, 0x8ee204d4, 0xac82001c, 0x8ee204b8,
-0x3c030002, 0x431025, 0xac820010, 0xaf850100, 0x92e204dc, 0x14400037,
+0x1520000a, 0x2508fffc, 0xafab0010, 0x8ee27254, 0x3c040001, 0x24844af0,
+0x3c050004, 0xafa20014, 0x8ee604d4, 0x80028be, 0x34a5f015, 0x34028100,
+0xa5020000, 0x9582000e, 0x800285f, 0xa5020002, 0x8f850100, 0x27623000,
+0x24a60020, 0xc2102b, 0x50400001, 0x27662800, 0x8f820108, 0x10c20004,
+0x0, 0x8f820104, 0x14c20007, 0x2563000c, 0x8ee201a4, 0x4821,
+0x24420001, 0xaee201a4, 0x800284f, 0x8ee201a4, 0x2c64000c, 0x1441021,
+0xaca20000, 0xaca30004, 0x8ee37254, 0x24e2fff4, 0xa4a2000e, 0x24020006,
+0xaca20018, 0x24630010, 0xaca30008, 0x8ee204d4, 0xaca2001c, 0x8ee204b8,
+0x3c030002, 0x431025, 0xaca20010, 0xaf860100, 0x92e204dc, 0x14400037,
0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c830000,
0x24020005, 0x1462001f, 0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b,
0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18,
0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001, 0x10a20005,
-0x0, 0x80025f9, 0x0, 0x14a00005, 0x0, 0x8f820108,
+0x0, 0x8002839, 0x0, 0x14a00005, 0x0, 0x8f820108,
0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x800260f, 0x0, 0x8ee24e18, 0x24030040, 0x24420001,
+0xac800000, 0x800284f, 0x0, 0x8ee24e18, 0x24030040, 0x24420001,
0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18,
0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000, 0x24020001,
-0xac820004, 0x15200009, 0x3c050004, 0xafab0010, 0x8ee27254, 0x3c040001,
-0x248448e0, 0xafa20014, 0x8ee604d4, 0x800284a, 0x34a5f004, 0x8ee2724c,
-0x30e7ffff, 0x471021, 0xaee2724c, 0x8ee204d4, 0x8ee304ec, 0x8ee47248,
-0x21100, 0x431021, 0xac44000c, 0x8ee27248, 0xafa20018, 0x8ee3724c,
-0xafa3001c, 0x8ee2724c, 0x2c42003c, 0x10400004, 0x24620001, 0x2403fffe,
-0x431024, 0xafa2001c, 0x8ee27254, 0x3c060001, 0x34c63800, 0x8ee3724c,
-0x2405fff8, 0x471021, 0x24420007, 0x451024, 0x24630007, 0xaee27248,
-0x8ee2725c, 0x8ee47248, 0x651824, 0x431023, 0xaee2725c, 0x3661021,
-0x82202b, 0x14800004, 0x3c03ffff, 0x8ee27248, 0x431021, 0xaee27248,
-0x8ee27248, 0xaee27254, 0x8f8200f0, 0x24470008, 0x27621800, 0xe2102b,
-0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007, 0x0, 0x8ee201b0,
-0x4821, 0x24420001, 0xaee201b0, 0x800265c, 0x8ee201b0, 0x8f8200f0,
-0x24090001, 0x8fa30018, 0x8fa4001c, 0xac430000, 0xac440004, 0xaf8700f0,
-0x15200012, 0xd1142, 0x8f8200f0, 0xafa20010, 0x8f8200f4, 0x3c040001,
-0x248448ec, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050004, 0xc0023a7,
-0x34a5f005, 0x8ee20088, 0x24420001, 0xaee20088, 0x8ee20088, 0x800285f,
-0xaee0724c, 0x30430003, 0x24020002, 0x10620016, 0x28620003, 0x10400005,
-0x24020001, 0x10620008, 0x0, 0x800269b, 0x0, 0x24020003,
-0x10620017, 0x0, 0x800269b, 0x0, 0x8ee200e8, 0x8ee300ec,
-0x24630001, 0x2c640001, 0x441021, 0xaee200e8, 0xaee300ec, 0x8ee200e8,
-0x800269b, 0x8ee300ec, 0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001,
-0x441021, 0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x800269b, 0x8ee300f4,
-0x8ee200f8, 0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8,
-0xaee300fc, 0x8ee200f8, 0x8ee300fc, 0x8ee2724c, 0x8ee400e0, 0x8ee500e4,
-0x401821, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021,
-0xaee400e0, 0xaee500e4, 0x800285f, 0xaee0724c, 0x30e2ffff, 0x104001b5,
-0x31a20200, 0x10400144, 0x4821, 0x96e2045a, 0x30420010, 0x10400140,
-0x0, 0x8f840100, 0x27623000, 0x24850020, 0xa2102b, 0x50400001,
-0x27652800, 0x8f820108, 0x14a20006, 0x2402000c, 0x8ee201a4, 0x24420001,
-0xaee201a4, 0x8002703, 0x8ee201a4, 0xac8a0000, 0xac8b0004, 0x8ee37254,
-0x24060005, 0xa482000e, 0xac860018, 0xac830008, 0x8ee204d4, 0xac82001c,
-0x8ee204b8, 0xac820010, 0xaf850100, 0x92e204dc, 0x14400036, 0x24090001,
-0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c820000, 0x1446001f,
-0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007,
-0x0, 0x8ee24e1c, 0x24420001, 0x10a20005, 0x0, 0x80026ed,
-0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108,
-0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x8002703,
-0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28,
-0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a,
-0x3c040001, 0xafab0010, 0x8ee27254, 0x3c040001, 0x248448e0, 0x3c050004,
-0xafa20014, 0x8ee604d4, 0x800284a, 0x34a5f014, 0x8ee27254, 0x34843800,
-0x3641821, 0x24420010, 0x43102b, 0x14400070, 0x0, 0x8ee27254,
-0x24480010, 0x3641021, 0x102102b, 0x14400002, 0x3c02ffff, 0x1024021,
-0x8f850100, 0x27623000, 0x24a60020, 0xc2102b, 0x50400001, 0x27662800,
-0x8f820108, 0x14c20007, 0x2563000c, 0x8ee201a4, 0x4821, 0x24420001,
-0xaee201a4, 0x8002774, 0x8ee201a4, 0x2c64000c, 0x1441021, 0xaca20000,
-0xaca30004, 0x24e2fff4, 0xa4a2000e, 0x24020006, 0xaca80008, 0xaca20018,
-0x8ee204d4, 0xaca2001c, 0x8ee204b8, 0x3c030002, 0x431025, 0xaca20010,
-0xaf860100, 0x92e204dc, 0x14400037, 0x24090001, 0x8ee24e18, 0x210c0,
-0x24424e28, 0x2e22021, 0x8c830000, 0x24020005, 0x1462001f, 0x0,
-0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001,
-0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007, 0x0,
-0x8ee24e1c, 0x24420001, 0x10a20005, 0x0, 0x800275e, 0x0,
-0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108,
-0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x8002774, 0x0,
-0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18,
-0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
-0x24020005, 0xac820000, 0x24020001, 0xac820004, 0x1520000a, 0x2508fffc,
-0xafab0010, 0x8ee27254, 0x3c040001, 0x248448e0, 0x3c050004, 0xafa20014,
-0x8ee604d4, 0x800284a, 0x34a5f015, 0x34028100, 0xa5020000, 0x9582000e,
-0x80027ee, 0xa5020002, 0x8f850100, 0x27623000, 0x24a60020, 0xc2102b,
-0x50400001, 0x27662800, 0x8f820108, 0x14c20007, 0x2563000c, 0x8ee201a4,
-0x4821, 0x24420001, 0xaee201a4, 0x80027de, 0x8ee201a4, 0x2c64000c,
-0x1441021, 0xaca20000, 0xaca30004, 0x8ee37254, 0x24e2fff4, 0xa4a2000e,
-0x24020006, 0xaca20018, 0x24630010, 0xaca30008, 0x8ee204d4, 0xaca2001c,
-0x8ee204b8, 0x3c030002, 0x431025, 0xaca20010, 0xaf860100, 0x92e204dc,
-0x14400037, 0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
-0x8c830000, 0x24020005, 0x1462001f, 0x0, 0x8ee34e18, 0x8ee24e1c,
+0xac820004, 0x1520000a, 0x34028100, 0xafab0010, 0x8ee27254, 0x3c040001,
+0x24844af0, 0x3c050004, 0xafa20014, 0x8ee604d4, 0x80028be, 0x34a5f016,
+0x8ee37254, 0xa462000c, 0x8ee37254, 0x9582000e, 0xa462000e, 0x80028c2,
+0x24e70004, 0x8f830100, 0x27623000, 0x24640020, 0x82102b, 0x50400001,
+0x27642800, 0x8f820108, 0x10820004, 0x0, 0x8f820104, 0x14820007,
+0x24050005, 0x8ee201a4, 0x4821, 0x24420001, 0xaee201a4, 0x80028b6,
+0x8ee201a4, 0xac6a0000, 0xac6b0004, 0x8ee27254, 0xa467000e, 0xac650018,
+0xac620008, 0x8ee204d4, 0xac62001c, 0x8ee204b8, 0xac620010, 0xaf840100,
+0x92e204dc, 0x14400036, 0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28,
+0x2e22021, 0x8c820000, 0x1445001f, 0x0, 0x8ee34e18, 0x8ee24e1c,
0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c,
0x8ee54e18, 0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001,
-0x10a20005, 0x0, 0x80027c8, 0x0, 0x14a00005, 0x0,
+0x10a20005, 0x0, 0x80028a0, 0x0, 0x14a00005, 0x0,
0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011,
-0x50400013, 0xac800000, 0x80027de, 0x0, 0x8ee24e18, 0x24030040,
+0x50400013, 0xac800000, 0x80028b6, 0x0, 0x8ee24e18, 0x24030040,
0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18,
0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000,
-0x24020001, 0xac820004, 0x1520000a, 0x34028100, 0xafab0010, 0x8ee27254,
-0x3c040001, 0x248448e0, 0x3c050004, 0xafa20014, 0x8ee604d4, 0x800284a,
-0x34a5f016, 0x8ee37254, 0xa462000c, 0x8ee37254, 0x9582000e, 0xa462000e,
-0x800284e, 0x24e70004, 0x8f830100, 0x27623000, 0x24640020, 0x82102b,
-0x50400001, 0x27642800, 0x8f820108, 0x14820007, 0x24050005, 0x8ee201a4,
-0x4821, 0x24420001, 0xaee201a4, 0x8002842, 0x8ee201a4, 0xac6a0000,
-0xac6b0004, 0x8ee27254, 0xa467000e, 0xac650018, 0xac620008, 0x8ee204d4,
-0xac62001c, 0x8ee204b8, 0xac620010, 0xaf840100, 0x92e204dc, 0x14400036,
-0x24090001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c820000,
+0x24020001, 0xac820004, 0x1520000b, 0x3c050004, 0x3c040001, 0x24844b08,
+0xafab0010, 0xafa00014, 0x8ee604d4, 0x34a5f017, 0xc002403, 0x30e7ffff,
+0x80028e1, 0x0, 0x8ee27254, 0x3c050001, 0x30e4ffff, 0x441021,
+0xaee27254, 0x8ee2724c, 0x8ee37254, 0x34a53800, 0x441021, 0xaee2724c,
+0x3651021, 0x62182b, 0x14600004, 0x3c03ffff, 0x8ee27254, 0x431021,
+0xaee27254, 0x8ee304d4, 0x96e20458, 0x24630001, 0x2442ffff, 0x621824,
+0xaee304d4, 0x8ee304d4, 0x8ee204d0, 0x14620005, 0x0, 0x8f820060,
+0x2403fff7, 0x431024, 0xaf820060, 0x8fbf0020, 0x3e00008, 0x27bd0028,
+0x27bdffe0, 0xafbf0018, 0x8ee304d8, 0x8ee204d0, 0x10620189, 0x0,
+0x8ee204d8, 0x8ee304ec, 0x21100, 0x621821, 0x94670008, 0x92e204dd,
+0x8c680000, 0x8c690004, 0x10400023, 0x946a000a, 0x8ee204b8, 0x34460400,
+0x31420200, 0x1040001f, 0x0, 0x96e2045a, 0x30420010, 0x1040001b,
+0x3c028000, 0x3c010001, 0x370821, 0xac2283c8, 0x8ee27254, 0x9464000e,
+0x3c050001, 0x34a53800, 0x24420004, 0xaee27254, 0x8ee37254, 0x42400,
+0x3651021, 0x3c010001, 0x370821, 0xac2483cc, 0x62182b, 0x14600005,
+0x24e70004, 0x8ee27254, 0x3c03ffff, 0x431021, 0xaee27254, 0x8ee27254,
+0x8002917, 0xaee27248, 0x8ee604b8, 0x8ee2725c, 0x30e4ffff, 0x44102a,
+0x10400015, 0x0, 0x8f8200d8, 0x8ee37248, 0x431023, 0xaee2725c,
+0x8ee2725c, 0x1c400007, 0x44102a, 0x8ee2725c, 0x3c030001, 0x431021,
+0xaee2725c, 0x8ee2725c, 0x44102a, 0x10400006, 0x0, 0x8ee201b4,
+0x24420001, 0xaee201b4, 0x8002a72, 0x8ee201b4, 0x3c020001, 0x571021,
+0x8c4283c8, 0x54400001, 0x24e7fffc, 0x31420004, 0x104000b9, 0x30e2ffff,
+0x3c020001, 0x571021, 0x8c4283c8, 0x1040002f, 0x5021, 0x8f840100,
+0x27623000, 0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108,
+0x10a20032, 0x0, 0x8f820104, 0x10a2002f, 0x24020015, 0xac880000,
+0xac890004, 0x8ee37254, 0xa487000e, 0xac820018, 0xac830008, 0x8ee204d8,
+0x3c030001, 0x771821, 0x8c6383cc, 0xac860010, 0x431025, 0xac82001c,
+0xaf850100, 0x92e204dc, 0x14400066, 0x240a0001, 0x8ee24e18, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18,
+0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21821, 0x24020015, 0xac620000,
+0x24020001, 0x80029bf, 0xac620004, 0x8f840100, 0x27623000, 0x24850020,
+0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a20004, 0x0,
+0x8f820104, 0x14a20006, 0x24020006, 0x8ee201a4, 0x24420001, 0xaee201a4,
+0x80029bf, 0x8ee201a4, 0xac880000, 0xac890004, 0x8ee37254, 0xa487000e,
+0xac820018, 0xac830008, 0x8ee204d8, 0xac860010, 0xac82001c, 0xaf850100,
+0x92e204dc, 0x14400037, 0x240a0001, 0x8ee24e18, 0x210c0, 0x24424e28,
+0x2e22021, 0x8c830000, 0x24020005, 0x1462001f, 0x0, 0x8ee34e18,
+0x8ee24e1c, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
+0x8ee24e1c, 0x8ee54e18, 0x24420001, 0x10430007, 0x0, 0x8ee24e1c,
+0x24420001, 0x10a20005, 0x0, 0x80029a9, 0x0, 0x14a00005,
+0x0, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8c820004,
+0x2c420011, 0x50400013, 0xac800000, 0x80029bf, 0x0, 0x8ee24e18,
+0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001,
+0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x24020005,
+0xac820000, 0x24020001, 0xac820004, 0x1540000a, 0x24020001, 0xafa90010,
+0x8ee27254, 0x3c040001, 0x24844af0, 0x3c050004, 0xafa20014, 0x8ee604d4,
+0x8002a4f, 0x34a5f204, 0xa2e204dd, 0x8ee204d8, 0x8ee304ec, 0x8ee47248,
+0x3c060001, 0x34c63800, 0x3c010001, 0x370821, 0xac2083c8, 0x3c010001,
+0x370821, 0xac2083cc, 0x21100, 0x431021, 0xac44000c, 0x8ee27254,
+0x2405fff8, 0x30e3ffff, 0x431021, 0x24420007, 0x451024, 0x24630007,
+0xaee27248, 0x8ee2725c, 0x8ee47248, 0x651824, 0x431023, 0xaee2725c,
+0x3661021, 0x82202b, 0x14800004, 0x3c03ffff, 0x8ee27248, 0x431021,
+0xaee27248, 0x8ee27248, 0x8002a64, 0xaee27254, 0x10400073, 0x0,
+0x8f830100, 0x27623000, 0x24640020, 0x82102b, 0x14400002, 0x5021,
+0x27642800, 0x8f820108, 0x10820004, 0x0, 0x8f820104, 0x14820006,
+0x24050005, 0x8ee201a4, 0x24420001, 0xaee201a4, 0x8002a46, 0x8ee201a4,
+0xac680000, 0xac690004, 0x8ee27254, 0xa467000e, 0xac650018, 0xac620008,
+0x8ee204d8, 0xac660010, 0xac62001c, 0xaf840100, 0x92e204dc, 0x14400036,
+0x240a0001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c820000,
0x1445001f, 0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b, 0x24030040,
0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18, 0x24420001,
0x10430007, 0x0, 0x8ee24e1c, 0x24420001, 0x10a20005, 0x0,
-0x800282c, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020,
+0x8002a30, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020,
0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
-0x8002842, 0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003,
+0x8002a46, 0x0, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003,
0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0,
0x24424e28, 0x2e22021, 0x24020005, 0xac820000, 0x24020001, 0xac820004,
-0x1520000b, 0x3c050004, 0x3c040001, 0x248448f8, 0xafab0010, 0xafa00014,
-0x8ee604d4, 0x34a5f017, 0xc0023a7, 0x30e7ffff, 0x800286d, 0x0,
-0x8ee27254, 0x3c050001, 0x30e4ffff, 0x441021, 0xaee27254, 0x8ee2724c,
-0x8ee37254, 0x34a53800, 0x441021, 0xaee2724c, 0x3651021, 0x62182b,
-0x14600004, 0x3c03ffff, 0x8ee27254, 0x431021, 0xaee27254, 0x8ee304d4,
-0x96e20458, 0x24630001, 0x2442ffff, 0x621824, 0xaee304d4, 0x8ee304d4,
-0x8ee204d0, 0x14620005, 0x0, 0x8f820060, 0x2403fff7, 0x431024,
-0xaf820060, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x27bdffe0, 0xafbf0018,
-0x8ee304d8, 0x8ee204d0, 0x10620180, 0x0, 0x8ee204d8, 0x8ee304ec,
-0x21100, 0x621821, 0x94670008, 0x92e204dd, 0x8c680000, 0x8c690004,
-0x10400023, 0x946a000a, 0x8ee204b8, 0x34460400, 0x31420200, 0x1040001f,
-0x0, 0x96e2045a, 0x30420010, 0x1040001b, 0x3c028000, 0x3c010001,
-0x370821, 0xac2283c8, 0x8ee27254, 0x9464000e, 0x3c050001, 0x34a53800,
-0x24420004, 0xaee27254, 0x8ee37254, 0x42400, 0x3651021, 0x3c010001,
-0x370821, 0xac2483cc, 0x62182b, 0x14600005, 0x24e70004, 0x8ee27254,
-0x3c03ffff, 0x431021, 0xaee27254, 0x8ee27254, 0x80028a3, 0xaee27248,
-0x8ee604b8, 0x8ee2725c, 0x30e4ffff, 0x44102a, 0x10400015, 0x0,
-0x8f8200d8, 0x8ee37248, 0x431023, 0xaee2725c, 0x8ee2725c, 0x1c400007,
-0x44102a, 0x8ee2725c, 0x3c030001, 0x431021, 0xaee2725c, 0x8ee2725c,
-0x44102a, 0x10400006, 0x0, 0x8ee201b4, 0x24420001, 0xaee201b4,
-0x80029f5, 0x8ee201b4, 0x3c020001, 0x571021, 0x8c4283c8, 0x54400001,
-0x24e7fffc, 0x31420004, 0x104000b3, 0x30e2ffff, 0x3c020001, 0x571021,
-0x8c4283c8, 0x1040002c, 0x5021, 0x8f840100, 0x27623000, 0x24850020,
-0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x10a2002c, 0x24020015,
-0xac880000, 0xac890004, 0x8ee37254, 0xa487000e, 0xac820018, 0xac830008,
-0x8ee204d8, 0x3c030001, 0x771821, 0x8c6383cc, 0xac860010, 0x431025,
-0xac82001c, 0xaf850100, 0x92e204dc, 0x14400063, 0x240a0001, 0x8ee24e18,
-0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001,
-0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21821, 0x24020015,
-0xac620000, 0x24020001, 0x8002945, 0xac620004, 0x8f840100, 0x27623000,
-0x24850020, 0xa2102b, 0x50400001, 0x27652800, 0x8f820108, 0x14a20006,
-0x24020006, 0x8ee201a4, 0x24420001, 0xaee201a4, 0x8002945, 0x8ee201a4,
-0xac880000, 0xac890004, 0x8ee37254, 0xa487000e, 0xac820018, 0xac830008,
-0x8ee204d8, 0xac860010, 0xac82001c, 0xaf850100, 0x92e204dc, 0x14400037,
-0x240a0001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021, 0x8c830000,
-0x24020005, 0x1462001f, 0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b,
-0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18,
-0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001, 0x10a20005,
-0x0, 0x800292f, 0x0, 0x14a00005, 0x0, 0x8f820108,
-0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8002945, 0x0, 0x8ee24e18, 0x24030040, 0x24420001,
-0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18,
-0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000, 0x24020001,
-0xac820004, 0x1540000a, 0x24020001, 0xafa90010, 0x8ee27254, 0x3c040001,
-0x248448e0, 0x3c050004, 0xafa20014, 0x8ee604d4, 0x80029d2, 0x34a5f204,
-0xa2e204dd, 0x8ee204d8, 0x8ee304ec, 0x8ee47248, 0x3c060001, 0x34c63800,
-0x3c010001, 0x370821, 0xac2083c8, 0x3c010001, 0x370821, 0xac2083cc,
-0x21100, 0x431021, 0xac44000c, 0x8ee27254, 0x2405fff8, 0x30e3ffff,
-0x431021, 0x24420007, 0x451024, 0x24630007, 0xaee27248, 0x8ee2725c,
-0x8ee47248, 0x651824, 0x431023, 0xaee2725c, 0x3661021, 0x82202b,
-0x14800004, 0x3c03ffff, 0x8ee27248, 0x431021, 0xaee27248, 0x8ee27248,
-0x80029e7, 0xaee27254, 0x10400070, 0x0, 0x8f830100, 0x27623000,
-0x24640020, 0x82102b, 0x14400002, 0x5021, 0x27642800, 0x8f820108,
-0x14820006, 0x24050005, 0x8ee201a4, 0x24420001, 0xaee201a4, 0x80029c9,
-0x8ee201a4, 0xac680000, 0xac690004, 0x8ee27254, 0xa467000e, 0xac650018,
-0xac620008, 0x8ee204d8, 0xac660010, 0xac62001c, 0xaf840100, 0x92e204dc,
-0x14400036, 0x240a0001, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e22021,
-0x8c820000, 0x1445001f, 0x0, 0x8ee34e18, 0x8ee24e1c, 0x1062001b,
-0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e1c, 0x8ee54e18,
-0x24420001, 0x10430007, 0x0, 0x8ee24e1c, 0x24420001, 0x10a20005,
-0x0, 0x80029b3, 0x0, 0x14a00005, 0x0, 0x8f820108,
-0x24420020, 0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x80029c9, 0x0, 0x8ee24e18, 0x24030040, 0x24420001,
-0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18,
-0x210c0, 0x24424e28, 0x2e22021, 0x24020005, 0xac820000, 0x24020001,
-0xac820004, 0x1540000c, 0x30e5ffff, 0x3c040001, 0x248448f8, 0x3c050004,
-0xafa90010, 0xafa00014, 0x8ee604d4, 0x34a5f237, 0xc0023a7, 0x30e7ffff,
-0x80029f5, 0x0, 0x8ee27254, 0x451021, 0xaee27254, 0x8ee2725c,
-0x8ee37254, 0x3c040001, 0x34843800, 0xa2e004dd, 0x451023, 0xaee2725c,
-0x3641021, 0x62182b, 0x14600004, 0x3c03ffff, 0x8ee27254, 0x431021,
-0xaee27254, 0x8ee304d8, 0x96e20458, 0x24630001, 0x2442ffff, 0x621824,
-0xaee304d8, 0x8ee304d8, 0x8ee204d0, 0x14620005, 0x0, 0x8f820060,
-0x2403fff7, 0x431024, 0xaf820060, 0x8fbf0018, 0x3e00008, 0x27bd0020,
-0x27bdffe0, 0xafbf001c, 0xafb00018, 0x8f820100, 0x8ee34e1c, 0x8f820104,
-0x8f850108, 0x24020040, 0x24630001, 0x50620003, 0x1021, 0x8ee24e1c,
-0x24420001, 0xaee24e1c, 0x8ee24e1c, 0x8ee34e1c, 0x210c0, 0x24424e28,
-0x2e22021, 0x8ee24e18, 0x8c870004, 0x14620007, 0xa03021, 0x8f820108,
-0x24420020, 0xaf820108, 0x8f820108, 0x8002a25, 0xac800000, 0x8ee24e1c,
-0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e1c, 0x24420001,
-0x210c0, 0x24424e28, 0x2e22021, 0x8c820004, 0x8f830108, 0x21140,
-0x621821, 0xaf830108, 0xac800000, 0x8cc30018, 0x2c620002, 0x144000b7,
-0x2c620004, 0x5440008a, 0x24030040, 0x2c620007, 0x104000b2, 0x2c620005,
-0x144000b0, 0x0, 0x8ee204e0, 0x471021, 0xaee204e0, 0x8ee204e0,
-0x8f43023c, 0x43102b, 0x144000b2, 0x0, 0x8ee304d4, 0x8ee204e8,
-0x506200ae, 0xa2e004e4, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
-0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0, 0x8ee201a0,
-0x8021, 0x24420001, 0xaee201a0, 0x8002a93, 0x8ee201a0, 0x8ee204d4,
-0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c, 0xac620008, 0x24020008,
-0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004, 0x8ee204b4,
-0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012, 0x1462001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20, 0x24420001, 0x10430007,
-0x0, 0x8ee24e24, 0x24420001, 0x10a20005, 0x0, 0x8002a7d,
-0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000, 0x8002a93,
-0x0, 0x8ee24e20, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020012, 0xac820000, 0x24020001, 0xac820004, 0x5600000b,
-0x24100001, 0x8ee204d4, 0x3c040001, 0x24844904, 0xafa00014, 0xafa20010,
-0x8ee605f8, 0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f006, 0x16000003,
-0x24020001, 0x8002ae9, 0xa2e204e4, 0x8ee2016c, 0x24420001, 0xaee2016c,
-0x8ee2016c, 0x8ee204d4, 0xa2e004e4, 0xaee004e0, 0xaee204e8, 0x8f42023c,
-0x5040003c, 0xaee07264, 0x8ee20180, 0x24420001, 0xaee20180, 0x8ee20180,
-0x8002ae9, 0xaee07264, 0x8ee204f4, 0x24420001, 0x50430003, 0x1021,
-0x8ee204f4, 0x24420001, 0xaee204f4, 0x8ee204f4, 0x8cc30018, 0x21080,
-0x571021, 0x8c4404f8, 0x24020003, 0x1462000f, 0x0, 0x3c020001,
-0x571021, 0x904283a1, 0x10400014, 0x0, 0x8ee201c8, 0x8ee35230,
-0x441021, 0xaee201c8, 0x8ee201cc, 0x641821, 0x306300ff, 0x8002ad9,
-0xaee35230, 0x8ee201c4, 0x8ee30e00, 0x441021, 0xaee201c4, 0x8ee201cc,
-0x641821, 0x306301ff, 0xaee30e00, 0x441021, 0xaee201cc, 0x8ee20000,
-0x34420040, 0x8002ae9, 0xaee20000, 0x94c7000e, 0x8cc2001c, 0x3c040001,
-0x24844910, 0xafa60014, 0xafa20010, 0x8cc60018, 0x3c050008, 0xc0023a7,
-0x34a50910, 0x8fbf001c, 0x8fb00018, 0x3e00008, 0x27bd0020, 0x27bdff98,
-0xafbf0060, 0xafbe005c, 0xafb60058, 0xafb50054, 0xafb40050, 0xafb3004c,
-0xafb20048, 0xafb10044, 0xafb00040, 0x8f830108, 0x8f820104, 0xafa00024,
-0x106203d9, 0xafa0002c, 0x3c1e0001, 0x37de3800, 0x3c0bffff, 0x8f930108,
-0x8e620018, 0x8f830104, 0x2443fffe, 0x2c620014, 0x104003c1, 0x31080,
-0x3c010001, 0x220821, 0x8c224920, 0x400008, 0x0, 0x9663000e,
-0x8ee2724c, 0x8ee404e0, 0x431021, 0xaee2724c, 0x8e63001c, 0x96e20458,
-0x24840001, 0xaee404e0, 0x24630001, 0x2442ffff, 0x621824, 0xaee304d4,
-0x8f42023c, 0x82202b, 0x148003ab, 0x0, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8002b73,
+0x1540000c, 0x30e5ffff, 0x3c040001, 0x24844b08, 0x3c050004, 0xafa90010,
+0xafa00014, 0x8ee604d4, 0x34a5f237, 0xc002403, 0x30e7ffff, 0x8002a72,
+0x0, 0x8ee27254, 0x451021, 0xaee27254, 0x8ee2725c, 0x8ee37254,
+0x3c040001, 0x34843800, 0xa2e004dd, 0x451023, 0xaee2725c, 0x3641021,
+0x62182b, 0x14600004, 0x3c03ffff, 0x8ee27254, 0x431021, 0xaee27254,
+0x8ee304d8, 0x96e20458, 0x24630001, 0x2442ffff, 0x621824, 0xaee304d8,
+0x8ee304d8, 0x8ee204d0, 0x14620005, 0x0, 0x8f820060, 0x2403fff7,
+0x431024, 0xaf820060, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0,
+0xafbf001c, 0xafb00018, 0x8f820100, 0x8ee34e1c, 0x8f820104, 0x8f850108,
+0x24020040, 0x24630001, 0x50620003, 0x1021, 0x8ee24e1c, 0x24420001,
+0xaee24e1c, 0x8ee24e1c, 0x8ee34e1c, 0x210c0, 0x24424e28, 0x2e22021,
+0x8ee24e18, 0x8c870004, 0x14620007, 0xa03021, 0x8f820108, 0x24420020,
+0xaf820108, 0x8f820108, 0x8002aa2, 0xac800000, 0x8ee24e1c, 0x24030040,
+0x24420001, 0x50430003, 0x1021, 0x8ee24e1c, 0x24420001, 0x210c0,
+0x24424e28, 0x2e22021, 0x8c820004, 0x8f830108, 0x21140, 0x621821,
+0xaf830108, 0xac800000, 0x8cc30018, 0x2c620002, 0x144000ba, 0x2c620004,
+0x5440008d, 0x24030040, 0x2c620007, 0x104000b5, 0x2c620005, 0x144000b3,
+0x0, 0x8ee204e0, 0x471021, 0xaee204e0, 0x8ee204e0, 0x8f43023c,
+0x43102b, 0x144000b5, 0x0, 0x8ee304d4, 0x8ee204e8, 0x506200b1,
+0xa2e004e4, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001,
+0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007,
+0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8002b13,
0x8ee201a0, 0x8ee204d4, 0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c,
0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000,
0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037,
0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
0x24020012, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x240c0040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8002b5d, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x24030040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee54e20,
+0x24420001, 0x10430007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005,
+0x0, 0x8002afd, 0x0, 0x14a00005, 0x0, 0x8f820128,
0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8002b73, 0x0, 0x8ee24e20, 0x240c0040, 0x24420001,
-0x504c0003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000,
-0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204d4, 0x3c040001, 0x24844904,
-0xafa00014, 0xafa20010, 0x8ee605f8, 0x8f470228, 0x3c050009, 0x34a5f006,
-0xc0023a7, 0xafab0038, 0x8fab0038, 0x12000307, 0x240c0001, 0x8002e8b,
-0x0, 0x966c001c, 0xafac002c, 0x9662001e, 0x3c0c8000, 0xafac0024,
-0xae62001c, 0x8e75001c, 0x8ee204ec, 0x8ee404ec, 0x151900, 0x621021,
-0x8c52000c, 0x92e27b88, 0x641821, 0x9476000a, 0x14400003, 0x32c20002,
-0xaef27b94, 0xaef57b8c, 0x1040004b, 0x8021, 0x96e2045a, 0x30420002,
-0x10400047, 0x0, 0x8e63001c, 0x8ee204ec, 0x32100, 0x821021,
-0x8c42000c, 0x37e1821, 0x24420022, 0x43102b, 0x1440000a, 0x24050014,
-0x8ee204ec, 0x821021, 0x8c44000c, 0xafab0038, 0xc002edf, 0x2484000e,
-0x8fab0038, 0x8002bc7, 0x3050ffff, 0x8ee204ec, 0x821021, 0x8c42000c,
-0x9450000e, 0x94430010, 0x94440012, 0x94450014, 0x2038021, 0x2048021,
-0x2058021, 0x94430016, 0x94440018, 0x9445001a, 0x2038021, 0x2048021,
-0x2058021, 0x9443001c, 0x9444001e, 0x94420020, 0x2038021, 0x2048021,
-0x2028021, 0x101c02, 0x3202ffff, 0x628021, 0x8e63001c, 0x8ee204ec,
-0x102402, 0x32900, 0xa21021, 0x8c43000c, 0x3202ffff, 0x828021,
-0x37e1021, 0x24630018, 0x62182b, 0x14600009, 0x0, 0x8ee204ec,
-0xa21021, 0x8c43000c, 0x101027, 0x3c01ffff, 0x230821, 0x8002be4,
-0xa4220018, 0x8ee204ec, 0xa21021, 0x8c43000c, 0x101027, 0xa4620018,
-0x96e2045a, 0x8821, 0x30420008, 0x14400063, 0xa021, 0x8e63001c,
-0x8ee204ec, 0x33100, 0xc21021, 0x8c42000c, 0x37e1821, 0x24420022,
-0x43102b, 0x14400035, 0x0, 0x8ee204ec, 0xc21021, 0x8c42000c,
-0x24470010, 0x37e1021, 0xe2102b, 0x50400001, 0xeb3821, 0x8ee204ec,
-0x94f10000, 0xc21021, 0x8c42000c, 0x24470016, 0x37e1021, 0xe2102b,
-0x14400002, 0x2634ffec, 0xeb3821, 0x8ee204ec, 0x90e30001, 0xc21021,
-0x8c42000c, 0x2447001a, 0x37e1021, 0xe2102b, 0x14400002, 0x2838821,
+0xac800000, 0x8002b13, 0x0, 0x8ee24e20, 0x24030040, 0x24420001,
+0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x24020012, 0xac820000, 0x24020001,
+0xac820004, 0x5600000b, 0x24100001, 0x8ee204d4, 0x3c040001, 0x24844b14,
+0xafa00014, 0xafa20010, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc002403,
+0x34a5f006, 0x16000003, 0x24020001, 0x8002b69, 0xa2e204e4, 0x8ee2016c,
+0x24420001, 0xaee2016c, 0x8ee2016c, 0x8ee204d4, 0xa2e004e4, 0xaee004e0,
+0xaee204e8, 0x8f42023c, 0x5040003c, 0xaee07264, 0x8ee20180, 0x24420001,
+0xaee20180, 0x8ee20180, 0x8002b69, 0xaee07264, 0x8ee204f4, 0x24420001,
+0x50430003, 0x1021, 0x8ee204f4, 0x24420001, 0xaee204f4, 0x8ee204f4,
+0x8cc30018, 0x21080, 0x571021, 0x8c4404f8, 0x24020003, 0x1462000f,
+0x0, 0x3c020001, 0x571021, 0x904283a1, 0x10400014, 0x0,
+0x8ee201c8, 0x8ee35230, 0x441021, 0xaee201c8, 0x8ee201cc, 0x641821,
+0x306300ff, 0x8002b59, 0xaee35230, 0x8ee201c4, 0x8ee30e00, 0x441021,
+0xaee201c4, 0x8ee201cc, 0x641821, 0x306301ff, 0xaee30e00, 0x441021,
+0xaee201cc, 0x8ee20000, 0x34420040, 0x8002b69, 0xaee20000, 0x94c7000e,
+0x8cc2001c, 0x3c040001, 0x24844b20, 0xafa60014, 0xafa20010, 0x8cc60018,
+0x3c050008, 0xc002403, 0x34a50910, 0x8fbf001c, 0x8fb00018, 0x3e00008,
+0x27bd0020, 0x27bdff98, 0xafbf0060, 0xafbe005c, 0xafb60058, 0xafb50054,
+0xafb40050, 0xafb3004c, 0xafb20048, 0xafb10044, 0xafb00040, 0x8f830108,
+0x8f820104, 0xafa00024, 0x106203df, 0xafa0002c, 0x3c1e0001, 0x37de3800,
+0x3c0bffff, 0x8f930108, 0x8e620018, 0x8f830104, 0x2443fffe, 0x2c620014,
+0x104003c7, 0x31080, 0x3c010001, 0x220821, 0x8c224b30, 0x400008,
+0x0, 0x9663000e, 0x8ee2724c, 0x8ee404e0, 0x431021, 0xaee2724c,
+0x8e63001c, 0x96e20458, 0x24840001, 0xaee404e0, 0x24630001, 0x2442ffff,
+0x621824, 0xaee304d4, 0x8f42023c, 0x82202b, 0x148003b1, 0x0,
+0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000,
+0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007, 0x0,
+0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8002bf6, 0x8ee201a0,
+0x8ee204d4, 0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c, 0xac620008,
+0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004,
+0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037, 0x24100001,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012,
+0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x240c0040,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x8002be0, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
+0x8002bf6, 0x0, 0x8ee24e20, 0x240c0040, 0x24420001, 0x504c0003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000, 0xac8c0004,
+0x5600000d, 0x24100001, 0x8ee204d4, 0x3c040001, 0x24844b14, 0xafa00014,
+0xafa20010, 0x8ee605f8, 0x8f470228, 0x3c050009, 0x34a5f006, 0xc002403,
+0xafab0038, 0x8fab0038, 0x1200030a, 0x240c0001, 0x8002f11, 0x0,
+0x966c001c, 0xafac002c, 0x9662001e, 0x3c0c8000, 0xafac0024, 0xae62001c,
+0x8e75001c, 0x8ee204ec, 0x8ee404ec, 0x151900, 0x621021, 0x8c52000c,
+0x92e27b88, 0x641821, 0x9476000a, 0x14400003, 0x32c20002, 0xaef27b94,
+0xaef57b8c, 0x1040004b, 0x8021, 0x96e2045a, 0x30420002, 0x10400047,
+0x0, 0x8e63001c, 0x8ee204ec, 0x32100, 0x821021, 0x8c42000c,
+0x37e1821, 0x24420022, 0x43102b, 0x1440000a, 0x24050014, 0x8ee204ec,
+0x821021, 0x8c44000c, 0xafab0038, 0xc002f65, 0x2484000e, 0x8fab0038,
+0x8002c4a, 0x3050ffff, 0x8ee204ec, 0x821021, 0x8c42000c, 0x9450000e,
+0x94430010, 0x94440012, 0x94450014, 0x2038021, 0x2048021, 0x2058021,
+0x94430016, 0x94440018, 0x9445001a, 0x2038021, 0x2048021, 0x2058021,
+0x9443001c, 0x9444001e, 0x94420020, 0x2038021, 0x2048021, 0x2028021,
+0x101c02, 0x3202ffff, 0x628021, 0x8e63001c, 0x8ee204ec, 0x102402,
+0x32900, 0xa21021, 0x8c43000c, 0x3202ffff, 0x828021, 0x37e1021,
+0x24630018, 0x62182b, 0x14600009, 0x0, 0x8ee204ec, 0xa21021,
+0x8c43000c, 0x101027, 0x3c01ffff, 0x230821, 0x8002c67, 0xa4220018,
+0x8ee204ec, 0xa21021, 0x8c43000c, 0x101027, 0xa4620018, 0x96e2045a,
+0x8821, 0x30420008, 0x14400063, 0xa021, 0x8e63001c, 0x8ee204ec,
+0x33100, 0xc21021, 0x8c42000c, 0x37e1821, 0x24420022, 0x43102b,
+0x14400035, 0x0, 0x8ee204ec, 0xc21021, 0x8c42000c, 0x24470010,
+0x37e1021, 0xe2102b, 0x50400001, 0xeb3821, 0x8ee204ec, 0x94f10000,
+0xc21021, 0x8c42000c, 0x24470016, 0x37e1021, 0xe2102b, 0x14400002,
+0x2634ffec, 0xeb3821, 0x8ee204ec, 0x90e30001, 0xc21021, 0x8c42000c,
+0x2447001a, 0x37e1021, 0xe2102b, 0x14400002, 0x2838821, 0xeb3821,
+0x94e20000, 0x24e70002, 0x2228821, 0x37e1021, 0xe2102b, 0x50400001,
0xeb3821, 0x94e20000, 0x24e70002, 0x2228821, 0x37e1021, 0xe2102b,
0x50400001, 0xeb3821, 0x94e20000, 0x24e70002, 0x2228821, 0x37e1021,
-0xe2102b, 0x50400001, 0xeb3821, 0x94e20000, 0x24e70002, 0x2228821,
-0x37e1021, 0xe2102b, 0x50400001, 0xeb3821, 0x94e20000, 0x8002c45,
-0x2228821, 0x8ee204ec, 0xc21021, 0x8c43000c, 0x8ee204ec, 0x94710010,
-0x8ee304ec, 0xc21021, 0x8c44000c, 0xc31821, 0x8c62000c, 0x2634ffec,
-0x90840017, 0x8ee304ec, 0x9442001a, 0x2848821, 0xc31821, 0x8c65000c,
-0x8ee304ec, 0x2228821, 0x8ee204ec, 0xc31821, 0xc21021, 0x8c44000c,
-0x8c62000c, 0x94a3001c, 0x9484001e, 0x94420020, 0x2238821, 0x2248821,
-0x2228821, 0x111c02, 0x3222ffff, 0x628821, 0x111c02, 0x3222ffff,
-0x628821, 0x32c20001, 0x104000b2, 0x0, 0x96e2045a, 0x30420001,
-0x104000ae, 0x32c20080, 0x10400008, 0x0, 0x92e27b88, 0x14400005,
-0x0, 0x240c0001, 0xa2ec7b88, 0xaef57b8c, 0xaef27b94, 0x8ee304ec,
-0x151100, 0x431021, 0x8c47000c, 0x37e1821, 0x24e2000e, 0x43102b,
-0x14400008, 0xe02021, 0x2405000e, 0xc002edf, 0xafab0038, 0x3042ffff,
-0x8fab0038, 0x8002c7e, 0x2028021, 0x94e60000, 0x24e70002, 0x94e50000,
-0x24e70002, 0x94e30000, 0x24e70002, 0x94e20000, 0x24e70002, 0x94e40000,
-0x24e70002, 0x2068021, 0x2058021, 0x2038021, 0x2028021, 0x94e20000,
-0x94e30002, 0x2048021, 0x2028021, 0x2038021, 0x101c02, 0x3202ffff,
-0x628021, 0x101c02, 0x3202ffff, 0x8ee47b8c, 0x628021, 0x14950004,
-0x3205ffff, 0x96620016, 0x8002c8c, 0x512021, 0x96620016, 0x542021,
-0x41402, 0x3083ffff, 0x432021, 0x852023, 0x41402, 0x822021,
-0x3084ffff, 0x50800001, 0x3404ffff, 0x8ee27b94, 0x24430017, 0x37e1021,
-0x62102b, 0x50400001, 0x6b1821, 0x90630000, 0x24020011, 0x14620031,
-0x24020006, 0x8ee27b94, 0x37e1821, 0x24420028, 0x43102b, 0x14400018,
+0xe2102b, 0x50400001, 0xeb3821, 0x94e20000, 0x8002cc8, 0x2228821,
+0x8ee204ec, 0xc21021, 0x8c43000c, 0x8ee204ec, 0x94710010, 0x8ee304ec,
+0xc21021, 0x8c44000c, 0xc31821, 0x8c62000c, 0x2634ffec, 0x90840017,
+0x8ee304ec, 0x9442001a, 0x2848821, 0xc31821, 0x8c65000c, 0x8ee304ec,
+0x2228821, 0x8ee204ec, 0xc31821, 0xc21021, 0x8c44000c, 0x8c62000c,
+0x94a3001c, 0x9484001e, 0x94420020, 0x2238821, 0x2248821, 0x2228821,
+0x111c02, 0x3222ffff, 0x628821, 0x111c02, 0x3222ffff, 0x628821,
+0x32c20001, 0x104000b2, 0x0, 0x96e2045a, 0x30420001, 0x104000ae,
+0x32c20080, 0x10400008, 0x0, 0x92e27b88, 0x14400005, 0x0,
+0x240c0001, 0xa2ec7b88, 0xaef57b8c, 0xaef27b94, 0x8ee304ec, 0x151100,
+0x431021, 0x8c47000c, 0x37e1821, 0x24e2000e, 0x43102b, 0x14400008,
+0xe02021, 0x2405000e, 0xc002f65, 0xafab0038, 0x3042ffff, 0x8fab0038,
+0x8002d01, 0x2028021, 0x94e60000, 0x24e70002, 0x94e50000, 0x24e70002,
+0x94e30000, 0x24e70002, 0x94e20000, 0x24e70002, 0x94e40000, 0x24e70002,
+0x2068021, 0x2058021, 0x2038021, 0x2028021, 0x94e20000, 0x94e30002,
+0x2048021, 0x2028021, 0x2038021, 0x101c02, 0x3202ffff, 0x628021,
+0x101c02, 0x3202ffff, 0x8ee47b8c, 0x628021, 0x14950004, 0x3205ffff,
+0x96620016, 0x8002d0f, 0x512021, 0x96620016, 0x542021, 0x41402,
+0x3083ffff, 0x432021, 0x852023, 0x41402, 0x822021, 0x3084ffff,
+0x50800001, 0x3404ffff, 0x8ee27b94, 0x24430017, 0x37e1021, 0x62102b,
+0x50400001, 0x6b1821, 0x90630000, 0x24020011, 0x14620031, 0x24020006,
+0x8ee27b94, 0x37e1821, 0x24420028, 0x43102b, 0x14400018, 0x0,
+0x8ee27b8c, 0x12a2000a, 0x32c20100, 0x8ee27b94, 0x3c01ffff, 0x220821,
+0x94220028, 0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x32c20100,
+0x14400004, 0x41027, 0x92e27b88, 0x14400002, 0x41027, 0x3044ffff,
+0x8ee27b94, 0x3c01ffff, 0x220821, 0x8002d82, 0xa4240028, 0x8ee27b8c,
+0x12a20008, 0x32c20100, 0x8ee27b94, 0x94420028, 0x822021, 0x41c02,
+0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b88,
+0x14400002, 0x41027, 0x3044ffff, 0x8ee27b94, 0x8002d82, 0xa4440028,
+0x1462002f, 0x37e1821, 0x8ee27b94, 0x24420032, 0x43102b, 0x14400018,
0x0, 0x8ee27b8c, 0x12a2000a, 0x32c20100, 0x8ee27b94, 0x3c01ffff,
-0x220821, 0x94220028, 0x822021, 0x41c02, 0x3082ffff, 0x622021,
+0x220821, 0x94220032, 0x822021, 0x41c02, 0x3082ffff, 0x622021,
0x32c20100, 0x14400004, 0x41027, 0x92e27b88, 0x14400002, 0x41027,
-0x3044ffff, 0x8ee27b94, 0x3c01ffff, 0x220821, 0x8002cff, 0xa4240028,
-0x8ee27b8c, 0x12a20008, 0x32c20100, 0x8ee27b94, 0x94420028, 0x822021,
+0x3044ffff, 0x8ee27b94, 0x3c01ffff, 0x220821, 0x8002d82, 0xa4240032,
+0x8ee27b8c, 0x12a20008, 0x32c20100, 0x8ee27b94, 0x94420032, 0x822021,
0x41c02, 0x3082ffff, 0x622021, 0x32c20100, 0x14400004, 0x41027,
-0x92e27b88, 0x14400002, 0x41027, 0x3044ffff, 0x8ee27b94, 0x8002cff,
-0xa4440028, 0x1462002f, 0x37e1821, 0x8ee27b94, 0x24420032, 0x43102b,
-0x14400018, 0x0, 0x8ee27b8c, 0x12a2000a, 0x32c20100, 0x8ee27b94,
-0x3c01ffff, 0x220821, 0x94220032, 0x822021, 0x41c02, 0x3082ffff,
-0x622021, 0x32c20100, 0x14400004, 0x41027, 0x92e27b88, 0x14400002,
-0x41027, 0x3044ffff, 0x8ee27b94, 0x3c01ffff, 0x220821, 0x8002cff,
-0xa4240032, 0x8ee27b8c, 0x12a20008, 0x32c20100, 0x8ee27b94, 0x94420032,
-0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x32c20100, 0x14400004,
-0x41027, 0x92e27b88, 0x14400002, 0x41027, 0x3044ffff, 0x8ee27b94,
-0xa4440032, 0x8fac0024, 0x1180002c, 0x37e1821, 0x8e420000, 0xae42fffc,
-0x2642000a, 0x43102b, 0x1440001b, 0x34038100, 0x26430004, 0x37e1021,
-0x62102b, 0x14400003, 0x602021, 0x6b1821, 0x602021, 0x8c620000,
-0x24630004, 0xae420000, 0x37e1021, 0x62102b, 0x50400001, 0x6b1821,
-0x8c620000, 0xac820000, 0x34028100, 0xa4620000, 0x24630002, 0x37e1021,
-0x62102b, 0x50400001, 0x6b1821, 0x97ac002e, 0x8002d29, 0xa46c0000,
-0x8e420004, 0x8e440008, 0xa6430008, 0x97ac002e, 0xa64c000a, 0xae420000,
-0xae440004, 0x9662000e, 0x2652fffc, 0x24420004, 0xa662000e, 0x9662000e,
-0x8ee3724c, 0x621821, 0xaee3724c, 0xafb20018, 0x8ee3724c, 0xafa3001c,
-0x8ee2724c, 0x2c42003c, 0x10400004, 0x24620001, 0x2403fffe, 0x431024,
-0xafa2001c, 0x32c20080, 0x1040000c, 0x32c20100, 0x8ee27b98, 0x24430001,
+0x92e27b88, 0x14400002, 0x41027, 0x3044ffff, 0x8ee27b94, 0xa4440032,
+0x8fac0024, 0x1180002c, 0x37e1821, 0x8e420000, 0xae42fffc, 0x2642000a,
+0x43102b, 0x1440001b, 0x34038100, 0x26430004, 0x37e1021, 0x62102b,
+0x14400003, 0x602021, 0x6b1821, 0x602021, 0x8c620000, 0x24630004,
+0xae420000, 0x37e1021, 0x62102b, 0x50400001, 0x6b1821, 0x8c620000,
+0xac820000, 0x34028100, 0xa4620000, 0x24630002, 0x37e1021, 0x62102b,
+0x50400001, 0x6b1821, 0x97ac002e, 0x8002dac, 0xa46c0000, 0x8e420004,
+0x8e440008, 0xa6430008, 0x97ac002e, 0xa64c000a, 0xae420000, 0xae440004,
+0x9662000e, 0x2652fffc, 0x24420004, 0xa662000e, 0x9662000e, 0x8ee3724c,
+0x621821, 0xaee3724c, 0xafb20018, 0x8ee3724c, 0xafa3001c, 0x8ee2724c,
+0x2c42003c, 0x10400004, 0x24620001, 0x2403fffe, 0x431024, 0xafa2001c,
+0x32c20080, 0x1040000c, 0x32c20100, 0x8ee27b98, 0x24430001, 0x210c0,
+0x571021, 0xaee37b98, 0x8fa30018, 0x8fa4001c, 0xac437b9c, 0xac447ba0,
+0x8002e98, 0xaee0724c, 0x10400072, 0x0, 0x8ee27b98, 0x24430001,
0x210c0, 0x571021, 0xaee37b98, 0x8fa30018, 0x8fa4001c, 0xac437b9c,
-0xac447ba0, 0x8002e15, 0xaee0724c, 0x10400072, 0x0, 0x8ee27b98,
-0x24430001, 0x210c0, 0x571021, 0xaee37b98, 0x8fa30018, 0x8fa4001c,
-0xac437b9c, 0xac447ba0, 0x8ee27b98, 0x10400063, 0x4821, 0x5021,
-0x8f8200f0, 0x24480008, 0x27621800, 0x102102b, 0x50400001, 0x27681000,
-0x8f8200f4, 0x15020007, 0x0, 0x8ee201b0, 0x8021, 0x24420001,
-0xaee201b0, 0x8002d6f, 0x8ee201b0, 0x8f8300f0, 0x24100001, 0x1571021,
-0x8c447b9c, 0x8c457ba0, 0xac640000, 0xac650004, 0xaf8800f0, 0x16000006,
-0x2ea1021, 0x8ee20088, 0x24420001, 0xaee20088, 0x8002db4, 0x8ee20088,
-0x8c427ba0, 0x8ee400e0, 0x8ee500e4, 0x8ee67b8c, 0x401821, 0x1021,
-0xa32821, 0xa3382b, 0x822021, 0x872021, 0x8ee204ec, 0xc93021,
-0x63100, 0xaee400e0, 0xaee500e4, 0xc23021, 0x94c2000a, 0x240c0002,
-0x21142, 0x30430003, 0x106c0016, 0x28620003, 0x10400005, 0x240c0001,
-0x106c0008, 0x0, 0x8002db4, 0x0, 0x240c0003, 0x106c0017,
-0x0, 0x8002db4, 0x0, 0x8ee200e8, 0x8ee300ec, 0x24630001,
-0x2c640001, 0x441021, 0xaee200e8, 0xaee300ec, 0x8ee200e8, 0x8002db4,
-0x8ee300ec, 0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001, 0x441021,
-0xaee200f0, 0xaee300f4, 0x8ee200f0, 0x8002db4, 0x8ee300f4, 0x8ee200f8,
-0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc,
-0x8ee200f8, 0x8ee300fc, 0x8ee27b98, 0x25290001, 0x122102b, 0x1440ffa0,
-0x254a0008, 0xa2e07b88, 0x8002e14, 0xaee07b98, 0x8f8200f0, 0x24470008,
-0x27621800, 0xe2102b, 0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007,
-0x0, 0x8ee201b0, 0x8021, 0x24420001, 0xaee201b0, 0x8002dd2,
-0x8ee201b0, 0x8f8200f0, 0x24100001, 0x8fa30018, 0x8fa4001c, 0xac430000,
-0xac440004, 0xaf8700f0, 0x16000007, 0x0, 0x8ee20088, 0x24420001,
-0xaee20088, 0x8ee20088, 0x8002e15, 0xaee0724c, 0x8ee2724c, 0x8ee400e0,
-0x8ee500e4, 0x240c0002, 0x401821, 0x1021, 0xa32821, 0xa3302b,
-0x822021, 0x862021, 0x161142, 0x30430003, 0xaee400e0, 0xaee500e4,
-0x106c0017, 0x2c620003, 0x10400005, 0x240c0001, 0x106c0008, 0x0,
-0x8002e15, 0xaee0724c, 0x240c0003, 0x106c0019, 0x0, 0x8002e15,
-0xaee0724c, 0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021,
-0xaee200e8, 0xaee300ec, 0x8ee200e8, 0x8ee300ec, 0x8002e15, 0xaee0724c,
+0xac447ba0, 0x8ee27b98, 0x10400063, 0x4821, 0x5021, 0x8f8200f0,
+0x24480008, 0x27621800, 0x102102b, 0x50400001, 0x27681000, 0x8f8200f4,
+0x15020007, 0x0, 0x8ee201b0, 0x8021, 0x24420001, 0xaee201b0,
+0x8002df2, 0x8ee201b0, 0x8f8300f0, 0x24100001, 0x1571021, 0x8c447b9c,
+0x8c457ba0, 0xac640000, 0xac650004, 0xaf8800f0, 0x16000006, 0x2ea1021,
+0x8ee20088, 0x24420001, 0xaee20088, 0x8002e37, 0x8ee20088, 0x8c427ba0,
+0x8ee400e0, 0x8ee500e4, 0x8ee67b8c, 0x401821, 0x1021, 0xa32821,
+0xa3382b, 0x822021, 0x872021, 0x8ee204ec, 0xc93021, 0x63100,
+0xaee400e0, 0xaee500e4, 0xc23021, 0x94c2000a, 0x240c0002, 0x21142,
+0x30430003, 0x106c0016, 0x28620003, 0x10400005, 0x240c0001, 0x106c0008,
+0x0, 0x8002e37, 0x0, 0x240c0003, 0x106c0017, 0x0,
+0x8002e37, 0x0, 0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001,
+0x441021, 0xaee200e8, 0xaee300ec, 0x8ee200e8, 0x8002e37, 0x8ee300ec,
0x8ee200f0, 0x8ee300f4, 0x24630001, 0x2c640001, 0x441021, 0xaee200f0,
-0xaee300f4, 0x8ee200f0, 0x8ee300f4, 0x8002e15, 0xaee0724c, 0x8ee200f8,
-0x8ee300fc, 0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc,
-0x8ee200f8, 0x8ee300fc, 0xaee0724c, 0x8e62001c, 0x96e30458, 0x8ee404e0,
-0x24420001, 0x2463ffff, 0x431024, 0x24840001, 0xaee204d4, 0xaee404e0,
-0x8f42023c, 0x82202b, 0x148000a5, 0x0, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8002e79,
-0x8ee201a0, 0x8ee204d4, 0xac62001c, 0x8ee404a0, 0x8ee504a4, 0x2462001c,
-0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000,
-0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400037,
-0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
-0x24020012, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x240c0040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8002e63, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8002e79, 0x0, 0x8ee24e20, 0x240c0040, 0x24420001,
-0x504c0003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x24020012, 0x240c0001, 0xac820000,
-0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204d4, 0x3c040001, 0x24844904,
-0xafa00014, 0xafa20010, 0x8ee605f8, 0x8f470228, 0x3c050009, 0x34a5f006,
-0xc0023a7, 0xafab0038, 0x8fab0038, 0x16000003, 0x240c0001, 0x8002ec6,
-0xa2ec04e4, 0x8ee2016c, 0x24420001, 0xaee2016c, 0x8ee2016c, 0x8ee204d4,
-0xa2e004e4, 0xaee004e0, 0xaee07264, 0xaee204e8, 0x8f42023c, 0x10400030,
-0x0, 0x8ee20180, 0x24420001, 0xaee20180, 0x8002ec6, 0x8ee20180,
-0x8ee204f4, 0x240c0040, 0x24420001, 0x504c0003, 0x1021, 0x8ee204f4,
-0x24420001, 0xaee204f4, 0x8ee204f4, 0x8e630018, 0x240c0003, 0x21080,
-0x571021, 0x146c000f, 0x8c4404f8, 0x3c020001, 0x571021, 0x904283a1,
-0x10400014, 0x0, 0x8ee201c8, 0x8ee35230, 0x441021, 0xaee201c8,
-0x8ee201cc, 0x641821, 0x306300ff, 0x8002ec1, 0xaee35230, 0x8ee201c4,
-0x8ee30e00, 0x441021, 0xaee201c4, 0x8ee201cc, 0x641821, 0x306301ff,
-0xaee30e00, 0x441021, 0xaee201cc, 0x8ee20000, 0x34420040, 0xaee20000,
-0x8f820108, 0x24420020, 0xaf820108, 0x8f820108, 0x8f820108, 0x27633000,
-0x43102b, 0x14400002, 0x27622800, 0xaf820108, 0x8f830108, 0x8f820104,
-0x1462fc2c, 0x0, 0x8fbf0060, 0x8fbe005c, 0x8fb60058, 0x8fb50054,
-0x8fb40050, 0x8fb3004c, 0x8fb20048, 0x8fb10044, 0x8fb00040, 0x3e00008,
-0x27bd0068, 0x52843, 0x10a0000d, 0x3021, 0x3c030001, 0x34633800,
-0x3c07ffff, 0x3631021, 0x82102b, 0x50400001, 0x872021, 0x94820000,
-0x24840002, 0x24a5ffff, 0x14a0fff8, 0xc23021, 0x61c02, 0x30c2ffff,
-0x623021, 0x61c02, 0x30c2ffff, 0x623021, 0x3e00008, 0x30c2ffff,
-0x0, 0x0, 0x27bdff88, 0x240f0001, 0xafbf0070, 0xafbe006c,
+0xaee300f4, 0x8ee200f0, 0x8002e37, 0x8ee300f4, 0x8ee200f8, 0x8ee300fc,
+0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8,
+0x8ee300fc, 0x8ee27b98, 0x25290001, 0x122102b, 0x1440ffa0, 0x254a0008,
+0xa2e07b88, 0x8002e97, 0xaee07b98, 0x8f8200f0, 0x24470008, 0x27621800,
+0xe2102b, 0x50400001, 0x27671000, 0x8f8200f4, 0x14e20007, 0x0,
+0x8ee201b0, 0x8021, 0x24420001, 0xaee201b0, 0x8002e55, 0x8ee201b0,
+0x8f8200f0, 0x24100001, 0x8fa30018, 0x8fa4001c, 0xac430000, 0xac440004,
+0xaf8700f0, 0x16000007, 0x0, 0x8ee20088, 0x24420001, 0xaee20088,
+0x8ee20088, 0x8002e98, 0xaee0724c, 0x8ee2724c, 0x8ee400e0, 0x8ee500e4,
+0x240c0002, 0x401821, 0x1021, 0xa32821, 0xa3302b, 0x822021,
+0x862021, 0x161142, 0x30430003, 0xaee400e0, 0xaee500e4, 0x106c0017,
+0x2c620003, 0x10400005, 0x240c0001, 0x106c0008, 0x0, 0x8002e98,
+0xaee0724c, 0x240c0003, 0x106c0019, 0x0, 0x8002e98, 0xaee0724c,
+0x8ee200e8, 0x8ee300ec, 0x24630001, 0x2c640001, 0x441021, 0xaee200e8,
+0xaee300ec, 0x8ee200e8, 0x8ee300ec, 0x8002e98, 0xaee0724c, 0x8ee200f0,
+0x8ee300f4, 0x24630001, 0x2c640001, 0x441021, 0xaee200f0, 0xaee300f4,
+0x8ee200f0, 0x8ee300f4, 0x8002e98, 0xaee0724c, 0x8ee200f8, 0x8ee300fc,
+0x24630001, 0x2c640001, 0x441021, 0xaee200f8, 0xaee300fc, 0x8ee200f8,
+0x8ee300fc, 0xaee0724c, 0x8e62001c, 0x96e30458, 0x8ee404e0, 0x24420001,
+0x2463ffff, 0x431024, 0x24840001, 0xaee204d4, 0xaee404e0, 0x8f42023c,
+0x82202b, 0x148000a8, 0x0, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001,
+0xaee201a0, 0x8002eff, 0x8ee201a0, 0x8ee204d4, 0xac62001c, 0x8ee404a0,
+0x8ee504a4, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
+0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
+0x92e24e10, 0x14400037, 0x24100001, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0x8c830000, 0x24020012, 0x1462001f, 0x0, 0x8ee34e20,
+0x8ee24e24, 0x1062001b, 0x240c0040, 0x8c820004, 0x24420001, 0xac820004,
+0x8ee24e24, 0x8ee34e20, 0x24420001, 0x104c0007, 0x0, 0x8ee24e24,
+0x24420001, 0x10620005, 0x0, 0x8002ee9, 0x0, 0x14600005,
+0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
+0x2c420011, 0x50400013, 0xac800000, 0x8002eff, 0x0, 0x8ee24e20,
+0x240c0040, 0x24420001, 0x504c0003, 0x1021, 0x8ee24e20, 0x24420001,
+0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020012,
+0x240c0001, 0xac820000, 0xac8c0004, 0x5600000d, 0x24100001, 0x8ee204d4,
+0x3c040001, 0x24844b14, 0xafa00014, 0xafa20010, 0x8ee605f8, 0x8f470228,
+0x3c050009, 0x34a5f006, 0xc002403, 0xafab0038, 0x8fab0038, 0x16000003,
+0x240c0001, 0x8002f4c, 0xa2ec04e4, 0x8ee2016c, 0x24420001, 0xaee2016c,
+0x8ee2016c, 0x8ee204d4, 0xa2e004e4, 0xaee004e0, 0xaee07264, 0xaee204e8,
+0x8f42023c, 0x10400030, 0x0, 0x8ee20180, 0x24420001, 0xaee20180,
+0x8002f4c, 0x8ee20180, 0x8ee204f4, 0x240c0040, 0x24420001, 0x504c0003,
+0x1021, 0x8ee204f4, 0x24420001, 0xaee204f4, 0x8ee204f4, 0x8e630018,
+0x240c0003, 0x21080, 0x571021, 0x146c000f, 0x8c4404f8, 0x3c020001,
+0x571021, 0x904283a1, 0x10400014, 0x0, 0x8ee201c8, 0x8ee35230,
+0x441021, 0xaee201c8, 0x8ee201cc, 0x641821, 0x306300ff, 0x8002f47,
+0xaee35230, 0x8ee201c4, 0x8ee30e00, 0x441021, 0xaee201c4, 0x8ee201cc,
+0x641821, 0x306301ff, 0xaee30e00, 0x441021, 0xaee201cc, 0x8ee20000,
+0x34420040, 0xaee20000, 0x8f820108, 0x24420020, 0xaf820108, 0x8f820108,
+0x8f820108, 0x27633000, 0x43102b, 0x14400002, 0x27622800, 0xaf820108,
+0x8f830108, 0x8f820104, 0x1462fc26, 0x0, 0x8fbf0060, 0x8fbe005c,
+0x8fb60058, 0x8fb50054, 0x8fb40050, 0x8fb3004c, 0x8fb20048, 0x8fb10044,
+0x8fb00040, 0x3e00008, 0x27bd0068, 0x52843, 0x10a0000d, 0x3021,
+0x3c030001, 0x34633800, 0x3c07ffff, 0x3631021, 0x82102b, 0x50400001,
+0x872021, 0x94820000, 0x24840002, 0x24a5ffff, 0x14a0fff8, 0xc23021,
+0x61c02, 0x30c2ffff, 0x623021, 0x61c02, 0x30c2ffff, 0x623021,
+0x3e00008, 0x30c2ffff, 0x27bdff88, 0x240f0001, 0xafbf0070, 0xafbe006c,
0xafb60068, 0xafb50064, 0xafb40060, 0xafb3005c, 0xafb20058, 0xafb10054,
0xafb00050, 0xa3a00027, 0xafaf002c, 0x8ee204c4, 0x8021, 0x30420001,
0x1440002a, 0xa3a00037, 0x8f8700e0, 0x8f8800c4, 0x8f8200e8, 0xe22023,
@@ -1344,30 +1366,30 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0xaee400c8, 0xaee500cc, 0x8f8300c8, 0x3c02000a, 0x3442efff, 0x1032023,
0x44102b, 0x10400003, 0x3c02000a, 0x3442f000, 0x822021, 0x801821,
0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021,
-0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, 0xaf8700e4, 0x8003429,
+0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, 0xaf8700e4, 0x80034bc,
0xaf8700e8, 0x3c020001, 0x571021, 0x904283b0, 0x1040000b, 0x0,
0x3c140001, 0x297a021, 0x8e9483b4, 0x3c130001, 0x2779821, 0x8e7383b8,
-0x3c120001, 0x2579021, 0x80030ff, 0x8e5283bc, 0x8f8300e0, 0x8f8200e4,
+0x3c120001, 0x2579021, 0x8003183, 0x8e5283bc, 0x8f8300e0, 0x8f8200e4,
0x10430007, 0x8821, 0x8f8200e4, 0x24110001, 0x8c430000, 0x8c440004,
0xafa30018, 0xafa4001c, 0x1620000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010,
-0x8f8200c8, 0x3c040001, 0x248449d0, 0xafa20014, 0x8f8600e0, 0x8f8700e4,
-0x3c050006, 0xc0023a7, 0x34a5f000, 0x8003429, 0x0, 0x8fa3001c,
+0x8f8200c8, 0x3c040001, 0x24844be0, 0xafa20014, 0x8f8600e0, 0x8f8700e4,
+0x3c050006, 0xc002403, 0x34a5f000, 0x80034bc, 0x0, 0x8fa3001c,
0x8fb20018, 0x3074ffff, 0x2694fffc, 0x621024, 0x10400058, 0x2409821,
0x3c020080, 0x621024, 0x1040000a, 0x3c040040, 0x8ee2007c, 0x24420001,
-0xaee2007c, 0x8ee2007c, 0x8ee201ec, 0x24420001, 0xaee201ec, 0x8003423,
+0xaee2007c, 0x8ee2007c, 0x8ee201ec, 0x24420001, 0xaee201ec, 0x80034b6,
0x8ee201ec, 0x3c060004, 0x3c0b0001, 0x3c0a0002, 0x3c050010, 0x3c090008,
0x8ee20080, 0x3c080020, 0x34078000, 0x24420001, 0xaee20080, 0x8ee20080,
0x8fa2001c, 0x441824, 0x10660021, 0xc3102b, 0x14400007, 0x0,
-0x106b0011, 0x0, 0x106a0015, 0x0, 0x8002fb5, 0x42042,
+0x106b0011, 0x0, 0x106a0015, 0x0, 0x8003039, 0x42042,
0x10650023, 0xa3102b, 0x14400005, 0x0, 0x10690019, 0x0,
-0x8002fb5, 0x42042, 0x10680021, 0x0, 0x8002fb5, 0x42042,
-0x8ee20034, 0x24420001, 0xaee20034, 0x8ee20034, 0x8002fb5, 0x42042,
-0x8ee201dc, 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8002fb5, 0x42042,
-0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x8002fb5, 0x42042,
-0x8ee201e4, 0x24420001, 0xaee201e4, 0x8ee201e4, 0x8002fb5, 0x42042,
-0x8ee20030, 0x24420001, 0xaee20030, 0x8ee20030, 0x8002fb5, 0x42042,
-0x8ee201e8, 0x24420001, 0xaee201e8, 0x8ee201e8, 0x42042, 0x1087046d,
-0x0, 0x8002f7a, 0x0, 0x3c020001, 0x571021, 0x904283a2,
+0x8003039, 0x42042, 0x10680021, 0x0, 0x8003039, 0x42042,
+0x8ee20034, 0x24420001, 0xaee20034, 0x8ee20034, 0x8003039, 0x42042,
+0x8ee201dc, 0x24420001, 0xaee201dc, 0x8ee201dc, 0x8003039, 0x42042,
+0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x8003039, 0x42042,
+0x8ee201e4, 0x24420001, 0xaee201e4, 0x8ee201e4, 0x8003039, 0x42042,
+0x8ee20030, 0x24420001, 0xaee20030, 0x8ee20030, 0x8003039, 0x42042,
+0x8ee201e8, 0x24420001, 0xaee201e8, 0x8ee201e8, 0x42042, 0x1087047c,
+0x0, 0x8002ffe, 0x0, 0x3c020001, 0x571021, 0x904283a2,
0x14400084, 0x24020001, 0x3c030001, 0x771821, 0x906383a3, 0x1462007f,
0x3c020100, 0x8e430000, 0x621024, 0x1040006f, 0x2402ffff, 0x14620005,
0x24100001, 0x96430004, 0x3402ffff, 0x10620075, 0x0, 0x92e204c8,
@@ -1376,20 +1398,20 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x2821, 0x96660000, 0x520c0, 0x971021, 0x9442776e, 0x14460009,
0x971021, 0x94437770, 0x96620002, 0x14620005, 0x971021, 0x94437772,
0x96620004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283a4,
-0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, 0x10400431,
-0x0, 0x8003041, 0x0, 0x2402021, 0xc00229d, 0x24050006,
-0x3044001f, 0x428c0, 0x2e51021, 0x9442726c, 0x30424000, 0x14400425,
+0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, 0x10400440,
+0x0, 0x80030c5, 0x0, 0x2402021, 0xc0022f8, 0x24050006,
+0x3044001f, 0x428c0, 0x2e51021, 0x9442726c, 0x30424000, 0x14400434,
0xb71021, 0x9443726e, 0x96620000, 0x1462000b, 0x418c0, 0xb71021,
0x94437270, 0x96620002, 0x14620006, 0x418c0, 0xb71021, 0x94437272,
0x96620004, 0x10620035, 0x418c0, 0x2e31021, 0x9442726c, 0x30428000,
-0x14400412, 0x2e31021, 0x944b726c, 0x96670000, 0xb28c0, 0xb71021,
-0x9442736e, 0x8003023, 0x3021, 0x420c0, 0x2e41021, 0x9443736c,
+0x14400421, 0x2e31021, 0x944b726c, 0x96670000, 0xb28c0, 0xb71021,
+0x9442736e, 0x80030a7, 0x3021, 0x420c0, 0x2e41021, 0x9443736c,
0x2e41021, 0x944b736c, 0x30638000, 0x14600010, 0xb28c0, 0xb71021,
0x9442736e, 0x1447fff5, 0x1602021, 0xb71021, 0x94437370, 0x96620002,
0x5462fff1, 0x420c0, 0xb71021, 0x94437372, 0x96620004, 0x5462ffec,
-0x420c0, 0x24060001, 0x30c200ff, 0x104003f1, 0x0, 0x8003041,
-0x0, 0x97430202, 0x96420000, 0x146203eb, 0x0, 0x97430204,
-0x96420002, 0x146203e7, 0x0, 0x97430206, 0x96420004, 0x146203e3,
+0x420c0, 0x24060001, 0x30c200ff, 0x10400400, 0x0, 0x80030c5,
+0x0, 0x97430202, 0x96420000, 0x146203fa, 0x0, 0x97430204,
+0x96420002, 0x146203f6, 0x0, 0x97430206, 0x96420004, 0x146203f2,
0x0, 0x92420000, 0x3a030001, 0x30420001, 0x431024, 0x10400074,
0x2402ffff, 0x8e630000, 0x14620004, 0x3402ffff, 0x96630004, 0x1062006f,
0x240f0002, 0x3c020001, 0x571021, 0x904283a2, 0x1440006a, 0x240f0003,
@@ -1399,33 +1421,33 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x14460009, 0x971021, 0x94437770, 0x96620002, 0x14620005, 0x971021,
0x94437772, 0x96620004, 0x50620008, 0x24070001, 0x3c020001, 0x571021,
0x8c4283a4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff,
-0x14400044, 0x240f0003, 0x8003423, 0x0, 0x2402021, 0xc00229d,
+0x14400044, 0x240f0003, 0x80034b6, 0x0, 0x2402021, 0xc0022f8,
0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442726c, 0x30424000,
-0x144003a0, 0xb71021, 0x9443726e, 0x96620000, 0x1462000b, 0x418c0,
+0x144003af, 0xb71021, 0x9443726e, 0x96620000, 0x1462000b, 0x418c0,
0xb71021, 0x94437270, 0x96620002, 0x14620006, 0x418c0, 0xb71021,
0x94437272, 0x96620004, 0x10620027, 0x418c0, 0x2e31021, 0x9442726c,
-0x30428000, 0x1440038d, 0x2e31021, 0x944b726c, 0x96670000, 0xb28c0,
-0xb71021, 0x9442736e, 0x80030a8, 0x3021, 0x420c0, 0x2e41021,
+0x30428000, 0x1440039c, 0x2e31021, 0x944b726c, 0x96670000, 0xb28c0,
+0xb71021, 0x9442736e, 0x800312c, 0x3021, 0x420c0, 0x2e41021,
0x9443736c, 0x2e41021, 0x944b736c, 0x30638000, 0x14600010, 0xb28c0,
0xb71021, 0x9442736e, 0x1447fff5, 0x1602021, 0xb71021, 0x94437370,
0x96620002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437372, 0x96620004,
-0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, 0x1040036c, 0x0,
-0x80030bb, 0x240f0003, 0x240f0001, 0xafaf002c, 0x8f420260, 0x54102b,
+0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, 0x1040037b, 0x0,
+0x800313f, 0x240f0003, 0x240f0001, 0xafaf002c, 0x8f420260, 0x54102b,
0x1040003a, 0x0, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008,
0xaf8300e4, 0xaf8300e8, 0x8ee400c0, 0x8ee500c4, 0x2801821, 0x1021,
0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4,
0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001,
0xaee2007c, 0x8ee2007c, 0x8f8200e0, 0xafa20010, 0x8f8200e4, 0x3c040001,
-0x248449d8, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc0023a7,
-0x34a5f003, 0x8003429, 0x0, 0x8ee25230, 0xafa20010, 0x8ee25234,
-0x3c040001, 0x248449e4, 0xafa20014, 0x8ee60e00, 0x8ee70e08, 0x3c050006,
-0xc0023a7, 0x34a5f002, 0x8ee201bc, 0x24420001, 0xaee201bc, 0x8ee20000,
-0x8ee301bc, 0x2403ffbf, 0x431024, 0x80033cd, 0xaee20000, 0x96e20468,
-0x54102b, 0x10400003, 0x0, 0x240f0001, 0xa3af0027, 0x128002f2,
+0x24844be8, 0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc002403,
+0x34a5f003, 0x80034bc, 0x0, 0x8ee25230, 0xafa20010, 0x8ee25234,
+0x3c040001, 0x24844bf4, 0xafa20014, 0x8ee60e00, 0x8ee70e08, 0x3c050006,
+0xc002403, 0x34a5f002, 0x8ee201bc, 0x24420001, 0xaee201bc, 0x8ee20000,
+0x8ee301bc, 0x2403ffbf, 0x431024, 0x8003460, 0xaee20000, 0x96e20468,
+0x54102b, 0x10400003, 0x0, 0x240f0001, 0xa3af0027, 0x12800301,
0x24160007, 0x24150040, 0x241e0001, 0x240e0012, 0x8ee2723c, 0x8f430280,
-0x24420001, 0x304203ff, 0x106202c4, 0x0, 0x93a20027, 0x10400014,
+0x24420001, 0x304203ff, 0x106202d3, 0x0, 0x93a20027, 0x10400014,
0x0, 0x8ee35230, 0x8ee25234, 0x10620009, 0x26ed5234, 0x8ee65234,
-0x8ee35234, 0x21140, 0x24425238, 0x2e28021, 0x24630001, 0x800312b,
+0x8ee35234, 0x21140, 0x24425238, 0x2e28021, 0x24630001, 0x80031af,
0x306b00ff, 0x92e27238, 0x1440ffca, 0x0, 0x8ee201d0, 0x24420001,
0xaee201d0, 0x8ee201d0, 0x8ee30e00, 0x8ee20e08, 0x1062ffc2, 0x26ed0e08,
0x8ee60e08, 0x8ee30e08, 0x21140, 0x24420e10, 0x2e28021, 0x24630001,
@@ -1439,28 +1461,29 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x439823, 0x26820007, 0x2404fff8, 0x9603000a, 0x446024, 0x6a1821,
0x6c102b, 0x10400002, 0x1803821, 0x603821, 0xae130018, 0x8f880120,
0x24e20007, 0x443824, 0x27623800, 0x25090020, 0x122102b, 0x50400001,
-0x27693000, 0x8f820128, 0x15220007, 0x1401821, 0x8ee201a0, 0x8821,
-0x24420001, 0xaee201a0, 0x80031b5, 0x8ee201a0, 0x8e040000, 0x8e050004,
-0x1021, 0xad130008, 0xa507000e, 0xad160018, 0xad06001c, 0xa3302b,
-0xa32823, 0x822023, 0x862023, 0xad040000, 0xad050004, 0x8ee204b0,
-0xad020010, 0xaf890120, 0x92e24e10, 0x14400033, 0x24110001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x1456001f, 0x0,
-0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001,
-0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10550007, 0x0,
-0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x80031a2, 0x0,
-0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
-0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x80031b5, 0x0,
-0x8ee24e20, 0x24420001, 0x50550003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac960000,
-0xac9e0004, 0x16200018, 0x3c050006, 0x8e020018, 0x3c040001, 0x248449f0,
-0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 0xc0023a7,
-0xafa30014, 0x93a20037, 0x1040020a, 0x340f8100, 0x8e420004, 0x8e430008,
-0x8e44000c, 0xa64f000c, 0xae420000, 0xae430004, 0xae440008, 0x96020016,
-0x80033cd, 0xa642000e, 0x14ec015f, 0x28a1823, 0x960c000a, 0x9603000e,
-0x28a1023, 0xa602000a, 0x34620004, 0xa602000e, 0x8f880120, 0x27623800,
-0x25090020, 0x122102b, 0x14400002, 0x306affff, 0x27693000, 0x8f820128,
+0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007,
+0x1401821, 0x8ee201a0, 0x8821, 0x24420001, 0xaee201a0, 0x800323c,
+0x8ee201a0, 0x8e040000, 0x8e050004, 0x1021, 0xad130008, 0xa507000e,
+0xad160018, 0xad06001c, 0xa3302b, 0xa32823, 0x822023, 0x862023,
+0xad040000, 0xad050004, 0x8ee204b0, 0xad020010, 0xaf890120, 0x92e24e10,
+0x14400033, 0x24110001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
+0x8c820000, 0x1456001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
+0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
+0x24420001, 0x10550007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
+0x0, 0x8003229, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
+0xac800000, 0x800323c, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0xac960000, 0xac9e0004, 0x16200018, 0x3c050006,
+0x8e020018, 0x3c040001, 0x24844c00, 0xafa20010, 0x8e020000, 0x8e030004,
+0x34a5f009, 0x2003021, 0xc002403, 0xafa30014, 0x93a20037, 0x10400216,
+0x340f8100, 0x8e420004, 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000,
+0xae430004, 0xae440008, 0x96020016, 0x8003460, 0xa642000e, 0x14ec0168,
+0x28a1823, 0x960c000a, 0x9603000e, 0x28a1023, 0xa602000a, 0x34620004,
+0xa602000e, 0x8f880120, 0x27623800, 0x25090020, 0x122102b, 0x14400002,
+0x306affff, 0x27693000, 0x8f820128, 0x11220004, 0x0, 0x8f820124,
0x15220007, 0x24040020, 0x8ee201a0, 0x8821, 0x24420001, 0xaee201a0,
-0x8003230, 0x8ee201a0, 0x8ee5723c, 0x8ee60480, 0x8ee70484, 0xa504000e,
+0x80032ba, 0x8ee201a0, 0x8ee5723c, 0x8ee60480, 0x8ee70484, 0xa504000e,
0x24040004, 0xad100008, 0xad040018, 0x52940, 0xa01821, 0x1021,
0xe33821, 0xe3202b, 0xc23021, 0xc43021, 0xad060000, 0xad070004,
0x8ee2723c, 0xad02001c, 0x8ee204b4, 0xad020010, 0xaf890120, 0x92e24e10,
@@ -1468,278 +1491,280 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x8c820000, 0x1456001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
0x24420001, 0x10550007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x800321d, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x0, 0x80032a7, 0x0, 0x14600005, 0x0, 0x8f820128,
0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
-0xac800000, 0x8003230, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
+0xac800000, 0x80032ba, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
0x24425028, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620000d, 0x0,
0xa60c000a, 0xa60a000e, 0x8f820100, 0xafa20010, 0x8f820104, 0x3c040001,
-0x248449fc, 0x3c050006, 0xafa20014, 0x8ee6723c, 0x8003398, 0x34a5f00b,
+0x24844c0c, 0x3c050006, 0xafa20014, 0x8ee6723c, 0x800342b, 0x34a5f00b,
0x3c010001, 0x370821, 0xa02083b0, 0xadab0000, 0x8ee201cc, 0x8ee3723c,
0x2442ffff, 0xaee201cc, 0x8ee201cc, 0x24630001, 0x306303ff, 0x26e25234,
-0x15a20006, 0xaee3723c, 0x8ee201c8, 0x2442ffff, 0xaee201c8, 0x8003255,
+0x15a20006, 0xaee3723c, 0x8ee201c8, 0x2442ffff, 0xaee201c8, 0x80032df,
0x8ee201c8, 0x8ee201c4, 0x2442ffff, 0xaee201c4, 0x8ee201c4, 0x8f420240,
-0x10400070, 0x0, 0x8ee20e0c, 0x24420001, 0xaee20e0c, 0x8f430240,
-0x43102b, 0x1440016d, 0xa021, 0x8f830120, 0x27623800, 0x24660020,
-0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007, 0x0,
-0x8ee201a0, 0x8821, 0x24420001, 0xaee201a0, 0x80032b2, 0x8ee201a0,
-0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c, 0x2462001c, 0xac620008,
-0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000, 0xac650004,
-0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24110001,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x144e001f,
-0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004,
-0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10550007,
-0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x800329f,
-0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x80032b2,
-0x0, 0x8ee24e20, 0x24420001, 0x50550003, 0x1021, 0x8ee24e20,
-0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0xac8e0000, 0xac9e0004, 0x5620000d, 0x24110001, 0x8ee2723c, 0x3c040001,
-0x24844a08, 0xafa00014, 0xafa20010, 0x8ee6723c, 0x8f470280, 0x3c050009,
-0x34a5f008, 0xc0023a7, 0xafae0048, 0x8fae0048, 0x56200001, 0xaee00e0c,
-0x8ee20184, 0x24420001, 0xaee20184, 0x8003328, 0x8ee20184, 0x8f830120,
-0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128,
+0x10400073, 0x0, 0x8ee20e0c, 0x24420001, 0xaee20e0c, 0x8f430240,
+0x43102b, 0x14400176, 0xa021, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x8821, 0x24420001,
+0xaee201a0, 0x800333f, 0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498,
+0x8ee5049c, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
+0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
+0x92e24e10, 0x14400033, 0x24110001, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0x8c820000, 0x144e001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee34e20, 0x24420001, 0x10550007, 0x0, 0x8ee24e24, 0x24420001,
+0x10620005, 0x0, 0x800332c, 0x0, 0x14600005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400010, 0xac800000, 0x800333f, 0x0, 0x8ee24e20, 0x24420001,
+0x50550003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x5620000d,
+0x24110001, 0x8ee2723c, 0x3c040001, 0x24844c18, 0xafa00014, 0xafa20010,
+0x8ee6723c, 0x8f470280, 0x3c050009, 0x34a5f008, 0xc002403, 0xafae0048,
+0x8fae0048, 0x56200001, 0xaee00e0c, 0x8ee20184, 0x24420001, 0xaee20184,
+0x80033b8, 0x8ee20184, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
0x14c20007, 0x0, 0x8ee201a0, 0x8821, 0x24420001, 0xaee201a0,
-0x800331a, 0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c,
+0x80033aa, 0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c,
0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018,
0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10,
0x14400033, 0x24110001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
0x8c820000, 0x144e001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
0x24420001, 0x10550007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8003307, 0x0, 0x14600005, 0x0, 0x8f820128,
+0x0, 0x8003397, 0x0, 0x14600005, 0x0, 0x8f820128,
0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
-0xac800000, 0x800331a, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
+0xac800000, 0x80033aa, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
0x24425028, 0x2e22021, 0xac8e0000, 0xac9e0004, 0x1620000d, 0x0,
-0x8ee2723c, 0x3c040001, 0x24844a08, 0xafa00014, 0xafa20010, 0x8ee6723c,
-0x8f470280, 0x3c050009, 0x34a5f008, 0xc0023a7, 0xafae0048, 0x8fae0048,
-0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x80033cb, 0xa021,
+0x8ee2723c, 0x3c040001, 0x24844c18, 0xafa00014, 0xafa20010, 0x8ee6723c,
+0x8f470280, 0x3c050009, 0x34a5f008, 0xc002403, 0xafae0048, 0x8fae0048,
+0x8ee20170, 0x24420001, 0xaee20170, 0x8ee20170, 0x800345e, 0xa021,
0x960c000a, 0x183102b, 0x54400001, 0x1801821, 0xa603000a, 0x8f880120,
0x27623800, 0x25090020, 0x122102b, 0x50400001, 0x27693000, 0x8f820128,
-0x15220007, 0x24040020, 0x8ee201a0, 0x8821, 0x24420001, 0xaee201a0,
-0x800338c, 0x8ee201a0, 0x8ee5723c, 0x8ee60480, 0x8ee70484, 0xa504000e,
-0x24040004, 0xad100008, 0xad040018, 0x52940, 0xa01821, 0x1021,
-0xe33821, 0xe3202b, 0xc23021, 0xc43021, 0xad060000, 0xad070004,
-0x8ee2723c, 0xad02001c, 0x8ee204b4, 0xad020010, 0xaf890120, 0x92e24e10,
-0x14400033, 0x24110001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0x8c820000, 0x1456001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x10550007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8003379, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
-0xac800000, 0x800338c, 0x0, 0x8ee24e20, 0x24420001, 0x50550003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0xac960000, 0xac9e0004, 0x1620001d, 0x0,
-0xa60c000a, 0x8f820100, 0xafa20010, 0x8f820104, 0x3c040001, 0x248449fc,
-0x3c050006, 0xafa20014, 0x8ee6723c, 0x34a5f00d, 0xc0023a7, 0x2003821,
-0x93a20037, 0x10400031, 0x340f8100, 0x8e420004, 0x8e430008, 0x8e44000c,
-0xa64f000c, 0xae420000, 0xae430004, 0xae440008, 0x96020016, 0xa642000e,
-0x9602000e, 0x3042fdff, 0x80033cd, 0xa602000e, 0x8ee201cc, 0x2442ffff,
-0xaee201cc, 0x8ee201cc, 0x8ee201c4, 0x3c04001f, 0x3c010001, 0x370821,
-0xa03e83b0, 0x2442ffff, 0xaee201c4, 0x9603000a, 0x3484ffff, 0x8ee201c4,
-0x6a1821, 0x2639821, 0x93202b, 0x10800003, 0x3c02fff5, 0x34421000,
-0x2629821, 0xadab0000, 0x8ee2723c, 0x24420001, 0x304203ff, 0xaee2723c,
-0x8f420240, 0x10400004, 0x283a023, 0x8ee20e0c, 0x24420001, 0xaee20e0c,
-0xa3a00027, 0x1680fd38, 0x0, 0x12800024, 0x0, 0x3c010001,
-0x370821, 0xac3483b4, 0x3c010001, 0x370821, 0xac3383b8, 0x3c010001,
-0x370821, 0xac3283bc, 0x93a20037, 0x10400008, 0x0, 0x3c020001,
-0x571021, 0x8c4283bc, 0x24420004, 0x3c010001, 0x370821, 0xac2283bc,
-0x8ee2723c, 0x8f430280, 0x24420001, 0x304203ff, 0x14620006, 0x0,
-0x8ee201c0, 0x24420001, 0xaee201c0, 0x8003429, 0x8ee201c0, 0x8ee201b8,
-0x24420001, 0xaee201b8, 0x8003429, 0x8ee201b8, 0x97a4001e, 0x2484fffc,
-0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b,
-0x822021, 0x862021, 0xaee400c0, 0xaee500c4, 0x8faf002c, 0x24020002,
-0x11e2000f, 0x29e20003, 0x14400017, 0x24020003, 0x15e20015, 0x0,
-0x8ee200d0, 0x8ee300d4, 0x24630001, 0x2c640001, 0x441021, 0xaee200d0,
-0xaee300d4, 0x8ee200d0, 0x8003423, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc,
-0x24630001, 0x2c640001, 0x441021, 0xaee200d8, 0xaee300dc, 0x8ee200d8,
-0x8003423, 0x8ee300dc, 0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001,
-0x441021, 0xaee200c8, 0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4,
-0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8fbf0070,
-0x8fbe006c, 0x8fb60068, 0x8fb50064, 0x8fb40060, 0x8fb3005c, 0x8fb20058,
-0x8fb10054, 0x8fb00050, 0x3e00008, 0x27bd0078, 0x27bdffb0, 0xafb50044,
-0xa821, 0xafb00030, 0x8021, 0xafbf004c, 0xafb60048, 0xafb40040,
-0xafb3003c, 0xafb20038, 0xafb10034, 0x8ee204c4, 0x24140001, 0x30420001,
-0x1440002a, 0xb021, 0x8f8700e0, 0x8f8800c4, 0x8f8200e8, 0xe22023,
-0x2c821000, 0x50400001, 0x24841000, 0x420c2, 0x801821, 0x8ee400c8,
-0x8ee500cc, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021,
-0xaee400c8, 0xaee500cc, 0x8f8300c8, 0x3c02000a, 0x3442efff, 0x1032023,
-0x44102b, 0x10400003, 0x3c02000a, 0x3442f000, 0x822021, 0x801821,
-0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021,
-0x862021, 0xaee400c0, 0xaee500c4, 0xaf8800c8, 0xaf8700e4, 0x80037aa,
-0xaf8700e8, 0x3c020001, 0x571021, 0x904283b0, 0x1040000b, 0x0,
-0x3c130001, 0x2779821, 0x8e7383b4, 0x3c110001, 0x2378821, 0x8e3183b8,
-0x3c120001, 0x2579021, 0x8003645, 0x8e5283bc, 0x8f8300e0, 0x8f8200e4,
-0x10430007, 0x4821, 0x8f8200e4, 0x24090001, 0x8c430000, 0x8c440004,
-0xafa30018, 0xafa4001c, 0x1520000e, 0x3c02ffff, 0x8f8200c4, 0xafa20010,
-0x8f8200c8, 0x3c040001, 0x248449d0, 0xafa20014, 0x8f8600e0, 0x8f8700e4,
-0x3c050006, 0xc0023a7, 0x34a5f000, 0x80037aa, 0x0, 0x8fa3001c,
-0x8fb20018, 0x3073ffff, 0x2673fffc, 0x621024, 0x10400058, 0x2408821,
-0x3c020080, 0x621024, 0x1040000a, 0x3c040040, 0x8ee2007c, 0x24420001,
-0xaee2007c, 0x8ee2007c, 0x8ee201ec, 0x24420001, 0xaee201ec, 0x80037a4,
-0x8ee201ec, 0x3c060004, 0x3c0b0001, 0x3c0a0002, 0x3c050010, 0x3c090008,
-0x8ee20080, 0x3c080020, 0x34078000, 0x24420001, 0xaee20080, 0x8ee20080,
-0x8fa2001c, 0x441824, 0x10660021, 0xc3102b, 0x14400007, 0x0,
-0x106b0011, 0x0, 0x106a0015, 0x0, 0x80034ef, 0x42042,
-0x10650023, 0xa3102b, 0x14400005, 0x0, 0x10690019, 0x0,
-0x80034ef, 0x42042, 0x10680021, 0x0, 0x80034ef, 0x42042,
-0x8ee20034, 0x24420001, 0xaee20034, 0x8ee20034, 0x80034ef, 0x42042,
-0x8ee201dc, 0x24420001, 0xaee201dc, 0x8ee201dc, 0x80034ef, 0x42042,
-0x8ee201e0, 0x24420001, 0xaee201e0, 0x8ee201e0, 0x80034ef, 0x42042,
-0x8ee201e4, 0x24420001, 0xaee201e4, 0x8ee201e4, 0x80034ef, 0x42042,
-0x8ee20030, 0x24420001, 0xaee20030, 0x8ee20030, 0x80034ef, 0x42042,
-0x8ee201e8, 0x24420001, 0xaee201e8, 0x8ee201e8, 0x42042, 0x108702b4,
-0x0, 0x80034b4, 0x0, 0x3c020001, 0x571021, 0x904283a2,
-0x14400084, 0x24020001, 0x3c030001, 0x771821, 0x906383a3, 0x1462007f,
-0x3c020100, 0x8e430000, 0x621024, 0x1040006f, 0x2402ffff, 0x14620005,
-0x24100001, 0x96430004, 0x3402ffff, 0x10620075, 0x0, 0x92e204c8,
-0x14400072, 0x0, 0x3c020001, 0x571021, 0x8c4283a4, 0x28420005,
-0x10400020, 0x3821, 0x3c020001, 0x571021, 0x8c4283a4, 0x18400016,
-0x2821, 0x96260000, 0x520c0, 0x971021, 0x9442776e, 0x14460009,
-0x971021, 0x94437770, 0x96220002, 0x14620005, 0x971021, 0x94437772,
-0x96220004, 0x50620008, 0x24070001, 0x3c020001, 0x571021, 0x8c4283a4,
-0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff, 0x10400278,
-0x0, 0x800357b, 0x0, 0x2402021, 0xc00229d, 0x24050006,
-0x3044001f, 0x428c0, 0x2e51021, 0x9442726c, 0x30424000, 0x1440026c,
-0xb71021, 0x9443726e, 0x96220000, 0x1462000b, 0x418c0, 0xb71021,
-0x94437270, 0x96220002, 0x14620006, 0x418c0, 0xb71021, 0x94437272,
-0x96220004, 0x10620035, 0x418c0, 0x2e31021, 0x9442726c, 0x30428000,
-0x14400259, 0x2e31021, 0x9448726c, 0x96270000, 0x828c0, 0xb71021,
-0x9442736e, 0x800355d, 0x3021, 0x420c0, 0x2e41021, 0x9443736c,
-0x2e41021, 0x9448736c, 0x30638000, 0x14600010, 0x828c0, 0xb71021,
-0x9442736e, 0x1447fff5, 0x1002021, 0xb71021, 0x94437370, 0x96220002,
-0x5462fff1, 0x420c0, 0xb71021, 0x94437372, 0x96220004, 0x5462ffec,
-0x420c0, 0x24060001, 0x30c200ff, 0x10400238, 0x0, 0x800357b,
-0x0, 0x97430202, 0x96420000, 0x14620232, 0x0, 0x97430204,
-0x96420002, 0x1462022e, 0x0, 0x97430206, 0x96420004, 0x1462022a,
-0x0, 0x92420000, 0x3a030001, 0x30420001, 0x431024, 0x10400074,
-0x2402ffff, 0x8e230000, 0x14620004, 0x3402ffff, 0x96230004, 0x1062006f,
-0x24140002, 0x3c020001, 0x571021, 0x904283a2, 0x1440006a, 0x24140003,
-0x92e204c8, 0x14400067, 0x0, 0x3c020001, 0x571021, 0x8c4283a4,
-0x28420005, 0x10400020, 0x3821, 0x3c020001, 0x571021, 0x8c4283a4,
-0x18400016, 0x2821, 0x96260000, 0x520c0, 0x971021, 0x9442776e,
-0x14460009, 0x971021, 0x94437770, 0x96220002, 0x14620005, 0x971021,
-0x94437772, 0x96220004, 0x50620008, 0x24070001, 0x3c020001, 0x571021,
-0x8c4283a4, 0x24a50001, 0xa2102a, 0x5440ffee, 0x520c0, 0x30e200ff,
-0x14400044, 0x24140003, 0x80037a4, 0x0, 0x2402021, 0xc00229d,
-0x24050006, 0x3044001f, 0x428c0, 0x2e51021, 0x9442726c, 0x30424000,
-0x144001e7, 0xb71021, 0x9443726e, 0x96220000, 0x1462000b, 0x418c0,
-0xb71021, 0x94437270, 0x96220002, 0x14620006, 0x418c0, 0xb71021,
-0x94437272, 0x96220004, 0x10620027, 0x418c0, 0x2e31021, 0x9442726c,
-0x30428000, 0x144001d4, 0x2e31021, 0x9448726c, 0x96270000, 0x828c0,
-0xb71021, 0x9442736e, 0x80035e2, 0x3021, 0x420c0, 0x2e41021,
-0x9443736c, 0x2e41021, 0x9448736c, 0x30638000, 0x14600010, 0x828c0,
-0xb71021, 0x9442736e, 0x1447fff5, 0x1002021, 0xb71021, 0x94437370,
-0x96220002, 0x5462fff1, 0x420c0, 0xb71021, 0x94437372, 0x96220004,
-0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff, 0x104001b3, 0x0,
-0x80035f5, 0x24140003, 0x24140001, 0x8f420260, 0x53102b, 0x10400049,
-0x0, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4,
-0xaf8300e8, 0x8ee400c0, 0x8ee500c4, 0x2601821, 0x1021, 0xa32821,
-0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4, 0x8ee20058,
-0x24420001, 0xaee20058, 0x8ee20058, 0x8ee2007c, 0x24420001, 0xaee2007c,
-0x8ee2007c, 0x8f8200e0, 0xafa20010, 0x8f8200e4, 0x3c040001, 0x248449d8,
-0xafa20014, 0x8fa60018, 0x8fa7001c, 0x3c050006, 0xc0023a7, 0x34a5f003,
-0x80037aa, 0x0, 0x8ee25230, 0xafa20010, 0x8ee25234, 0x3c040001,
-0x248449e4, 0xafa20014, 0x8ee60e00, 0x8ee70e08, 0xc0023a7, 0x34a5f002,
-0x8ee201bc, 0x24420001, 0xaee201bc, 0x8ee20000, 0x8ee301bc, 0x2403ffbf,
-0x431024, 0x8003752, 0xaee20000, 0x8ee25230, 0xafa20010, 0x8ee25234,
-0x3c040001, 0x248449e4, 0xafa20014, 0x8ee60e00, 0x8ee70e08, 0x3c050006,
-0xc0023a7, 0x34a5f002, 0x8ee201bc, 0x24420001, 0xaee201bc, 0x8003752,
-0x8ee201bc, 0x96e20468, 0x53102b, 0x54400001, 0x3c158000, 0x1260012e,
-0x3c0c001f, 0x358cffff, 0x8ee2723c, 0x8f430280, 0x24420001, 0x304203ff,
-0x10620105, 0x0, 0x12a00014, 0x0, 0x8ee35230, 0x8ee25234,
-0x10620009, 0x26ee5234, 0x8eeb5234, 0x8ee35234, 0x21140, 0x24425238,
-0x2e28021, 0x24630001, 0x800366f, 0x306800ff, 0x92e27238, 0x1440ffc0,
-0x3c050006, 0x8ee201d0, 0x24420001, 0xaee201d0, 0x8ee201d0, 0x8ee30e00,
-0x8ee20e08, 0x1062ffcb, 0x26ee0e08, 0x8eeb0e08, 0xa821, 0x8ee30e08,
-0x21140, 0x24420e10, 0x2e28021, 0x24630001, 0x306801ff, 0x96e2046a,
-0x30420010, 0x10400017, 0x34028100, 0x9643000c, 0x14620014, 0x0,
-0x3c020001, 0x571021, 0x904283b0, 0x1440000f, 0x0, 0x9642000e,
-0xa6020016, 0x8e420008, 0x8e430004, 0x8e440000, 0x2673fffc, 0xae42000c,
-0xae430008, 0xae440004, 0x9602000e, 0x26310004, 0x24160001, 0x34420200,
-0xa602000e, 0x9603000a, 0x2605021, 0x73102b, 0x10400002, 0x2606821,
-0x605021, 0x2d42003d, 0x1040002a, 0x3821, 0x9623000c, 0x24020800,
-0x54620027, 0xae110018, 0x3c020001, 0x571021, 0x904283b0, 0x54400022,
-0xae110018, 0x26220017, 0x182102b, 0x10400013, 0x0, 0x3c02fff5,
-0x511021, 0x90421017, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001,
-0x621825, 0x10600013, 0x26220010, 0x182102b, 0x1040000e, 0x0,
-0x3c07fff5, 0xf13821, 0x94e71010, 0x80036bb, 0x24e7000e, 0x92220017,
-0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x50600004,
-0xae110018, 0x96270010, 0x24e7000e, 0xae110018, 0x3c020001, 0x571021,
-0x904283b0, 0x2102b, 0x14e00002, 0x24ec0, 0x1403821, 0x8f830120,
-0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128,
+0x11220004, 0x0, 0x8f820124, 0x15220007, 0x24040020, 0x8ee201a0,
+0x8821, 0x24420001, 0xaee201a0, 0x800341f, 0x8ee201a0, 0x8ee5723c,
+0x8ee60480, 0x8ee70484, 0xa504000e, 0x24040004, 0xad100008, 0xad040018,
+0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b, 0xc23021,
+0xc43021, 0xad060000, 0xad070004, 0x8ee2723c, 0xad02001c, 0x8ee204b4,
+0xad020010, 0xaf890120, 0x92e24e10, 0x14400033, 0x24110001, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x1456001f, 0x0,
+0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10550007, 0x0,
+0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x800340c, 0x0,
+0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
+0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x800341f, 0x0,
+0x8ee24e20, 0x24420001, 0x50550003, 0x1021, 0x8ee24e20, 0x24420001,
+0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac960000,
+0xac9e0004, 0x1620001d, 0x0, 0xa60c000a, 0x8f820100, 0xafa20010,
+0x8f820104, 0x3c040001, 0x24844c0c, 0x3c050006, 0xafa20014, 0x8ee6723c,
+0x34a5f00d, 0xc002403, 0x2003821, 0x93a20037, 0x10400031, 0x340f8100,
+0x8e420004, 0x8e430008, 0x8e44000c, 0xa64f000c, 0xae420000, 0xae430004,
+0xae440008, 0x96020016, 0xa642000e, 0x9602000e, 0x3042fdff, 0x8003460,
+0xa602000e, 0x8ee201cc, 0x2442ffff, 0xaee201cc, 0x8ee201cc, 0x8ee201c4,
+0x3c04001f, 0x3c010001, 0x370821, 0xa03e83b0, 0x2442ffff, 0xaee201c4,
+0x9603000a, 0x3484ffff, 0x8ee201c4, 0x6a1821, 0x2639821, 0x93202b,
+0x10800003, 0x3c02fff5, 0x34421000, 0x2629821, 0xadab0000, 0x8ee2723c,
+0x24420001, 0x304203ff, 0xaee2723c, 0x8f420240, 0x10400004, 0x283a023,
+0x8ee20e0c, 0x24420001, 0xaee20e0c, 0xa3a00027, 0x1680fd29, 0x0,
+0x12800024, 0x0, 0x3c010001, 0x370821, 0xac3483b4, 0x3c010001,
+0x370821, 0xac3383b8, 0x3c010001, 0x370821, 0xac3283bc, 0x93a20037,
+0x10400008, 0x0, 0x3c020001, 0x571021, 0x8c4283bc, 0x24420004,
+0x3c010001, 0x370821, 0xac2283bc, 0x8ee2723c, 0x8f430280, 0x24420001,
+0x304203ff, 0x14620006, 0x0, 0x8ee201c0, 0x24420001, 0xaee201c0,
+0x80034bc, 0x8ee201c0, 0x8ee201b8, 0x24420001, 0xaee201b8, 0x80034bc,
+0x8ee201b8, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0, 0x8ee500c4,
+0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0,
+0xaee500c4, 0x8faf002c, 0x24020002, 0x11e2000f, 0x29e20003, 0x14400017,
+0x24020003, 0x15e20015, 0x0, 0x8ee200d0, 0x8ee300d4, 0x24630001,
+0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0, 0x80034b6,
+0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001, 0x441021,
+0xaee200d8, 0xaee300dc, 0x8ee200d8, 0x80034b6, 0x8ee300dc, 0x8ee200c8,
+0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8, 0xaee300cc,
+0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008,
+0xaf8300e4, 0xaf8300e8, 0x8fbf0070, 0x8fbe006c, 0x8fb60068, 0x8fb50064,
+0x8fb40060, 0x8fb3005c, 0x8fb20058, 0x8fb10054, 0x8fb00050, 0x3e00008,
+0x27bd0078, 0x27bdffb0, 0xafb50044, 0xa821, 0xafb00030, 0x8021,
+0xafbf004c, 0xafb60048, 0xafb40040, 0xafb3003c, 0xafb20038, 0xafb10034,
+0x8ee204c4, 0x24140001, 0x30420001, 0x1440002a, 0xb021, 0x8f8700e0,
+0x8f8800c4, 0x8f8200e8, 0xe22023, 0x2c821000, 0x50400001, 0x24841000,
+0x420c2, 0x801821, 0x8ee400c8, 0x8ee500cc, 0x1021, 0xa32821,
+0xa3302b, 0x822021, 0x862021, 0xaee400c8, 0xaee500cc, 0x8f8300c8,
+0x3c02000a, 0x3442efff, 0x1032023, 0x44102b, 0x10400003, 0x3c02000a,
+0x3442f000, 0x822021, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021,
+0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4,
+0xaf8800c8, 0xaf8700e4, 0x8003840, 0xaf8700e8, 0x3c020001, 0x571021,
+0x904283b0, 0x1040000b, 0x0, 0x3c130001, 0x2779821, 0x8e7383b4,
+0x3c110001, 0x2378821, 0x8e3183b8, 0x3c120001, 0x2579021, 0x80036d8,
+0x8e5283bc, 0x8f8300e0, 0x8f8200e4, 0x10430007, 0x4821, 0x8f8200e4,
+0x24090001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x1520000e,
+0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, 0x3c040001, 0x24844be0,
+0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f000,
+0x8003840, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc,
+0x621024, 0x10400058, 0x2408821, 0x3c020080, 0x621024, 0x1040000a,
+0x3c040040, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8ee201ec,
+0x24420001, 0xaee201ec, 0x800383a, 0x8ee201ec, 0x3c060004, 0x3c0b0001,
+0x3c0a0002, 0x3c050010, 0x3c090008, 0x8ee20080, 0x3c080020, 0x34078000,
+0x24420001, 0xaee20080, 0x8ee20080, 0x8fa2001c, 0x441824, 0x10660021,
+0xc3102b, 0x14400007, 0x0, 0x106b0011, 0x0, 0x106a0015,
+0x0, 0x8003582, 0x42042, 0x10650023, 0xa3102b, 0x14400005,
+0x0, 0x10690019, 0x0, 0x8003582, 0x42042, 0x10680021,
+0x0, 0x8003582, 0x42042, 0x8ee20034, 0x24420001, 0xaee20034,
+0x8ee20034, 0x8003582, 0x42042, 0x8ee201dc, 0x24420001, 0xaee201dc,
+0x8ee201dc, 0x8003582, 0x42042, 0x8ee201e0, 0x24420001, 0xaee201e0,
+0x8ee201e0, 0x8003582, 0x42042, 0x8ee201e4, 0x24420001, 0xaee201e4,
+0x8ee201e4, 0x8003582, 0x42042, 0x8ee20030, 0x24420001, 0xaee20030,
+0x8ee20030, 0x8003582, 0x42042, 0x8ee201e8, 0x24420001, 0xaee201e8,
+0x8ee201e8, 0x42042, 0x108702b7, 0x0, 0x8003547, 0x0,
+0x3c020001, 0x571021, 0x904283a2, 0x14400084, 0x24020001, 0x3c030001,
+0x771821, 0x906383a3, 0x1462007f, 0x3c020100, 0x8e430000, 0x621024,
+0x1040006f, 0x2402ffff, 0x14620005, 0x24100001, 0x96430004, 0x3402ffff,
+0x10620075, 0x0, 0x92e204c8, 0x14400072, 0x0, 0x3c020001,
+0x571021, 0x8c4283a4, 0x28420005, 0x10400020, 0x3821, 0x3c020001,
+0x571021, 0x8c4283a4, 0x18400016, 0x2821, 0x96260000, 0x520c0,
+0x971021, 0x9442776e, 0x14460009, 0x971021, 0x94437770, 0x96220002,
+0x14620005, 0x971021, 0x94437772, 0x96220004, 0x50620008, 0x24070001,
+0x3c020001, 0x571021, 0x8c4283a4, 0x24a50001, 0xa2102a, 0x5440ffee,
+0x520c0, 0x30e200ff, 0x1040027b, 0x0, 0x800360e, 0x0,
+0x2402021, 0xc0022f8, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021,
+0x9442726c, 0x30424000, 0x1440026f, 0xb71021, 0x9443726e, 0x96220000,
+0x1462000b, 0x418c0, 0xb71021, 0x94437270, 0x96220002, 0x14620006,
+0x418c0, 0xb71021, 0x94437272, 0x96220004, 0x10620035, 0x418c0,
+0x2e31021, 0x9442726c, 0x30428000, 0x1440025c, 0x2e31021, 0x9448726c,
+0x96270000, 0x828c0, 0xb71021, 0x9442736e, 0x80035f0, 0x3021,
+0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x9448736c, 0x30638000,
+0x14600010, 0x828c0, 0xb71021, 0x9442736e, 0x1447fff5, 0x1002021,
+0xb71021, 0x94437370, 0x96220002, 0x5462fff1, 0x420c0, 0xb71021,
+0x94437372, 0x96220004, 0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff,
+0x1040023b, 0x0, 0x800360e, 0x0, 0x97430202, 0x96420000,
+0x14620235, 0x0, 0x97430204, 0x96420002, 0x14620231, 0x0,
+0x97430206, 0x96420004, 0x1462022d, 0x0, 0x92420000, 0x3a030001,
+0x30420001, 0x431024, 0x10400074, 0x2402ffff, 0x8e230000, 0x14620004,
+0x3402ffff, 0x96230004, 0x1062006f, 0x24140002, 0x3c020001, 0x571021,
+0x904283a2, 0x1440006a, 0x24140003, 0x92e204c8, 0x14400067, 0x0,
+0x3c020001, 0x571021, 0x8c4283a4, 0x28420005, 0x10400020, 0x3821,
+0x3c020001, 0x571021, 0x8c4283a4, 0x18400016, 0x2821, 0x96260000,
+0x520c0, 0x971021, 0x9442776e, 0x14460009, 0x971021, 0x94437770,
+0x96220002, 0x14620005, 0x971021, 0x94437772, 0x96220004, 0x50620008,
+0x24070001, 0x3c020001, 0x571021, 0x8c4283a4, 0x24a50001, 0xa2102a,
+0x5440ffee, 0x520c0, 0x30e200ff, 0x14400044, 0x24140003, 0x800383a,
+0x0, 0x2402021, 0xc0022f8, 0x24050006, 0x3044001f, 0x428c0,
+0x2e51021, 0x9442726c, 0x30424000, 0x144001ea, 0xb71021, 0x9443726e,
+0x96220000, 0x1462000b, 0x418c0, 0xb71021, 0x94437270, 0x96220002,
+0x14620006, 0x418c0, 0xb71021, 0x94437272, 0x96220004, 0x10620027,
+0x418c0, 0x2e31021, 0x9442726c, 0x30428000, 0x144001d7, 0x2e31021,
+0x9448726c, 0x96270000, 0x828c0, 0xb71021, 0x9442736e, 0x8003675,
+0x3021, 0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x9448736c,
+0x30638000, 0x14600010, 0x828c0, 0xb71021, 0x9442736e, 0x1447fff5,
+0x1002021, 0xb71021, 0x94437370, 0x96220002, 0x5462fff1, 0x420c0,
+0xb71021, 0x94437372, 0x96220004, 0x5462ffec, 0x420c0, 0x24060001,
+0x30c200ff, 0x104001b6, 0x0, 0x8003688, 0x24140003, 0x24140001,
+0x8f420260, 0x53102b, 0x10400049, 0x0, 0x8f8300e4, 0x8f8200e0,
+0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8ee400c0, 0x8ee500c4,
+0x2601821, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021,
+0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058,
+0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, 0xafa20010,
+0x8f8200e4, 0x3c040001, 0x24844be8, 0xafa20014, 0x8fa60018, 0x8fa7001c,
+0x3c050006, 0xc002403, 0x34a5f003, 0x8003840, 0x0, 0x8ee25230,
+0xafa20010, 0x8ee25234, 0x3c040001, 0x24844bf4, 0xafa20014, 0x8ee60e00,
+0x8ee70e08, 0xc002403, 0x34a5f002, 0x8ee201bc, 0x24420001, 0xaee201bc,
+0x8ee20000, 0x8ee301bc, 0x2403ffbf, 0x431024, 0x80037e8, 0xaee20000,
+0x8ee25230, 0xafa20010, 0x8ee25234, 0x3c040001, 0x24844bf4, 0xafa20014,
+0x8ee60e00, 0x8ee70e08, 0x3c050006, 0xc002403, 0x34a5f002, 0x8ee201bc,
+0x24420001, 0xaee201bc, 0x80037e8, 0x8ee201bc, 0x96e20468, 0x53102b,
+0x54400001, 0x3c158000, 0x12600131, 0x3c0c001f, 0x358cffff, 0x8ee2723c,
+0x8f430280, 0x24420001, 0x304203ff, 0x10620108, 0x0, 0x12a00014,
+0x0, 0x8ee35230, 0x8ee25234, 0x10620009, 0x26ee5234, 0x8eeb5234,
+0x8ee35234, 0x21140, 0x24425238, 0x2e28021, 0x24630001, 0x8003702,
+0x306800ff, 0x92e27238, 0x1440ffc0, 0x3c050006, 0x8ee201d0, 0x24420001,
+0xaee201d0, 0x8ee201d0, 0x8ee30e00, 0x8ee20e08, 0x1062ffcb, 0x26ee0e08,
+0x8eeb0e08, 0xa821, 0x8ee30e08, 0x21140, 0x24420e10, 0x2e28021,
+0x24630001, 0x306801ff, 0x96e2046a, 0x30420010, 0x10400017, 0x34028100,
+0x9643000c, 0x14620014, 0x0, 0x3c020001, 0x571021, 0x904283b0,
+0x1440000f, 0x0, 0x9642000e, 0xa6020016, 0x8e420008, 0x8e430004,
+0x8e440000, 0x2673fffc, 0xae42000c, 0xae430008, 0xae440004, 0x9602000e,
+0x26310004, 0x24160001, 0x34420200, 0xa602000e, 0x9603000a, 0x2605021,
+0x73102b, 0x10400002, 0x2606821, 0x605021, 0x2d42003d, 0x1040002a,
+0x3821, 0x9623000c, 0x24020800, 0x54620027, 0xae110018, 0x3c020001,
+0x571021, 0x904283b0, 0x54400022, 0xae110018, 0x26220017, 0x182102b,
+0x10400013, 0x0, 0x3c02fff5, 0x511021, 0x90421017, 0x38430006,
+0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600013, 0x26220010,
+0x182102b, 0x1040000e, 0x0, 0x3c07fff5, 0xf13821, 0x94e71010,
+0x800374e, 0x24e7000e, 0x92220017, 0x38430006, 0x2c630001, 0x38420011,
+0x2c420001, 0x621825, 0x50600004, 0xae110018, 0x96270010, 0x24e7000e,
+0xae110018, 0x3c020001, 0x571021, 0x904283b0, 0x2102b, 0x14e00002,
+0x24ec0, 0x1403821, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b,
+0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124,
0x14c20007, 0x2402000b, 0x8ee201a0, 0x4821, 0x24420001, 0xaee201a0,
-0x8003719, 0x8ee201a0, 0x8e040000, 0x8e050004, 0xac620018, 0x1751025,
+0x80037af, 0x8ee201a0, 0x8e040000, 0x8e050004, 0xac620018, 0x1751025,
0x491025, 0xac710008, 0xa467000e, 0xac62001c, 0xac640000, 0xac650004,
0x8ee204b0, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400038, 0x24090001,
0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007,
0x14620020, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001c, 0x0,
0x8c820004, 0x24420001, 0xac820004, 0x8ee34e24, 0x8ee54e20, 0x24020040,
0x24630001, 0x10620007, 0x0, 0x8ee24e24, 0x24420001, 0x10a20005,
-0x0, 0x8003703, 0x0, 0x14a00005, 0x0, 0x8f820128,
+0x0, 0x8003799, 0x0, 0x14a00005, 0x0, 0x8f820128,
0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8003719, 0x0, 0x8ee24e20, 0x24030040, 0x24420001,
+0xac800000, 0x80037af, 0x0, 0x8ee24e20, 0x24030040, 0x24420001,
0x50430003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001,
-0xac820004, 0x15200018, 0x3c050006, 0x8e020018, 0x3c040001, 0x248449f0,
-0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 0xc0023a7,
+0xac820004, 0x15200018, 0x3c050006, 0x8e020018, 0x3c040001, 0x24844c00,
+0xafa20010, 0x8e020000, 0x8e030004, 0x34a5f009, 0x2003021, 0xc002403,
0xafa30014, 0x32c200ff, 0x1040002b, 0x34028100, 0x8e430004, 0x8e440008,
0x8e45000c, 0xa642000c, 0xae430000, 0xae440004, 0xae450008, 0x96020016,
-0x8003752, 0xa642000e, 0x154d000a, 0x0, 0x9602000e, 0xa613000a,
-0x34420004, 0xa602000e, 0x3c010001, 0x370821, 0xa02083b0, 0x8003750,
+0x80037e8, 0xa642000e, 0x154d000a, 0x0, 0x9602000e, 0xa613000a,
+0x34420004, 0xa602000e, 0x3c010001, 0x370821, 0xa02083b0, 0x80037e6,
0x9821, 0x9604000a, 0x93102b, 0x10400002, 0x2601821, 0x801821,
0x24020001, 0xa603000a, 0x3c010001, 0x370821, 0xa02283b0, 0x9604000a,
0x2248821, 0x191102b, 0x10400003, 0x3c02fff5, 0x34421000, 0x2228821,
-0x2649823, 0xa821, 0x1660fef7, 0xadc80000, 0x12600021, 0x32c200ff,
+0x2649823, 0xa821, 0x1660fef4, 0xadc80000, 0x12600021, 0x32c200ff,
0x3c010001, 0x370821, 0xac3383b4, 0x3c010001, 0x370821, 0xac3183b8,
0x3c010001, 0x370821, 0x10400008, 0xac3283bc, 0x3c020001, 0x571021,
0x8c4283bc, 0x24420004, 0x3c010001, 0x370821, 0xac2283bc, 0x8ee2723c,
0x8f430280, 0x24420001, 0x14620006, 0x0, 0x8ee201c0, 0x24420001,
-0xaee201c0, 0x80037aa, 0x8ee201c0, 0x8ee201b8, 0x24420001, 0xaee201b8,
-0x80037aa, 0x8ee201b8, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0,
+0xaee201c0, 0x8003840, 0x8ee201c0, 0x8ee201b8, 0x24420001, 0xaee201b8,
+0x8003840, 0x8ee201b8, 0x97a4001e, 0x2484fffc, 0x801821, 0x8ee400c0,
0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021,
0x24020002, 0xaee400c0, 0xaee500c4, 0x1282000f, 0x2a820003, 0x14400017,
0x24020003, 0x16820015, 0x0, 0x8ee200d0, 0x8ee300d4, 0x24630001,
-0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0, 0x80037a4,
+0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0, 0x800383a,
0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001, 0x441021,
-0xaee200d8, 0xaee300dc, 0x8ee200d8, 0x80037a4, 0x8ee300dc, 0x8ee200c8,
+0xaee200d8, 0xaee300dc, 0x8ee200d8, 0x800383a, 0x8ee300dc, 0x8ee200c8,
0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8, 0xaee300cc,
0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003, 0x24630008,
0xaf8300e4, 0xaf8300e8, 0x8fbf004c, 0x8fb60048, 0x8fb50044, 0x8fb40040,
0x8fb3003c, 0x8fb20038, 0x8fb10034, 0x8fb00030, 0x3e00008, 0x27bd0050,
-0x27bdff90, 0xafbe0064, 0xf021, 0xafbf0068, 0xafb60060, 0xafb5005c,
+0x27bdff90, 0xafb60060, 0xb021, 0xafbf0068, 0xafbe0064, 0xafb5005c,
0xafb40058, 0xafb30054, 0xafb20050, 0xafb1004c, 0xafb00048, 0x8ee204c4,
-0x8821, 0x24160001, 0x30420001, 0x1440002a, 0xa3a0002f, 0x8f8700e0,
+0x8821, 0x24150001, 0x30420001, 0x1440002a, 0xa3a0002f, 0x8f8700e0,
0x8f8800c4, 0x8f8200e8, 0xe22023, 0x2c821000, 0x50400001, 0x24841000,
0x420c2, 0x801821, 0x8ee400c8, 0x8ee500cc, 0x1021, 0xa32821,
0xa3302b, 0x822021, 0x862021, 0xaee400c8, 0xaee500cc, 0x8f8300c8,
0x3c02000a, 0x3442efff, 0x1032023, 0x44102b, 0x10400003, 0x3c02000a,
0x3442f000, 0x822021, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021,
0xa32821, 0xa3302b, 0x822021, 0x862021, 0xaee400c0, 0xaee500c4,
-0xaf8800c8, 0xaf8700e4, 0x8003bb3, 0xaf8700e8, 0x3c020001, 0x571021,
+0xaf8800c8, 0xaf8700e4, 0x8003c4b, 0xaf8700e8, 0x3c020001, 0x571021,
0x904283b0, 0x1040000b, 0x0, 0x3c130001, 0x2779821, 0x8e7383b4,
-0x3c100001, 0x2178021, 0x8e1083b8, 0x3c120001, 0x2579021, 0x80039b3,
+0x3c100001, 0x2178021, 0x8e1083b8, 0x3c120001, 0x2579021, 0x8003a49,
0x8e5283bc, 0x8f8300e0, 0x8f8200e4, 0x10430007, 0x3821, 0x8f8200e4,
0x24070001, 0x8c430000, 0x8c440004, 0xafa30018, 0xafa4001c, 0x14e0000e,
-0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, 0x3c040001, 0x24844a14,
-0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc0023a7, 0x34a5f200,
-0x8003bb3, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc,
+0x3c02ffff, 0x8f8200c4, 0xafa20010, 0x8f8200c8, 0x3c040001, 0x24844c24,
+0xafa20014, 0x8f8600e0, 0x8f8700e4, 0x3c050006, 0xc002403, 0x34a5f200,
+0x8003c4b, 0x0, 0x8fa3001c, 0x8fb20018, 0x3073ffff, 0x2673fffc,
0x621024, 0x10400058, 0x2408021, 0x3c020080, 0x621024, 0x1040000a,
0x3c040040, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8ee201ec,
-0x24420001, 0xaee201ec, 0x8003bad, 0x8ee201ec, 0x3c060004, 0x3c0b0001,
+0x24420001, 0xaee201ec, 0x8003c45, 0x8ee201ec, 0x3c060004, 0x3c0b0001,
0x3c0a0002, 0x3c050010, 0x3c090008, 0x8ee20080, 0x3c080020, 0x34078000,
0x24420001, 0xaee20080, 0x8ee20080, 0x8fa2001c, 0x441824, 0x10660021,
0xc3102b, 0x14400007, 0x0, 0x106b0011, 0x0, 0x106a0015,
-0x0, 0x8003870, 0x42042, 0x10650023, 0xa3102b, 0x14400005,
-0x0, 0x10690019, 0x0, 0x8003870, 0x42042, 0x10680021,
-0x0, 0x8003870, 0x42042, 0x8ee20034, 0x24420001, 0xaee20034,
-0x8ee20034, 0x8003870, 0x42042, 0x8ee201dc, 0x24420001, 0xaee201dc,
-0x8ee201dc, 0x8003870, 0x42042, 0x8ee201e0, 0x24420001, 0xaee201e0,
-0x8ee201e0, 0x8003870, 0x42042, 0x8ee201e4, 0x24420001, 0xaee201e4,
-0x8ee201e4, 0x8003870, 0x42042, 0x8ee20030, 0x24420001, 0xaee20030,
-0x8ee20030, 0x8003870, 0x42042, 0x8ee201e8, 0x24420001, 0xaee201e8,
-0x8ee201e8, 0x42042, 0x1087033c, 0x0, 0x8003835, 0x0,
+0x0, 0x8003906, 0x42042, 0x10650023, 0xa3102b, 0x14400005,
+0x0, 0x10690019, 0x0, 0x8003906, 0x42042, 0x10680021,
+0x0, 0x8003906, 0x42042, 0x8ee20034, 0x24420001, 0xaee20034,
+0x8ee20034, 0x8003906, 0x42042, 0x8ee201dc, 0x24420001, 0xaee201dc,
+0x8ee201dc, 0x8003906, 0x42042, 0x8ee201e0, 0x24420001, 0xaee201e0,
+0x8ee201e0, 0x8003906, 0x42042, 0x8ee201e4, 0x24420001, 0xaee201e4,
+0x8ee201e4, 0x8003906, 0x42042, 0x8ee20030, 0x24420001, 0xaee20030,
+0x8ee20030, 0x8003906, 0x42042, 0x8ee201e8, 0x24420001, 0xaee201e8,
+0x8ee201e8, 0x42042, 0x1087033e, 0x0, 0x80038cb, 0x0,
0x3c020001, 0x571021, 0x904283a2, 0x14400084, 0x24020001, 0x3c030001,
0x771821, 0x906383a3, 0x1462007f, 0x3c020100, 0x8e430000, 0x621024,
0x1040006f, 0x2402ffff, 0x14620005, 0x24110001, 0x96430004, 0x3402ffff,
@@ -1749,491 +1774,487 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x971021, 0x9442776e, 0x14460009, 0x971021, 0x94437770, 0x96020002,
0x14620005, 0x971021, 0x94437772, 0x96020004, 0x50620008, 0x24070001,
0x3c020001, 0x571021, 0x8c4283a4, 0x24a50001, 0xa2102a, 0x5440ffee,
-0x520c0, 0x30e200ff, 0x10400300, 0x0, 0x80038fc, 0x0,
-0x2402021, 0xc00229d, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021,
-0x9442726c, 0x30424000, 0x144002f4, 0xb71021, 0x9443726e, 0x96020000,
+0x520c0, 0x30e200ff, 0x10400302, 0x0, 0x8003992, 0x0,
+0x2402021, 0xc0022f8, 0x24050006, 0x3044001f, 0x428c0, 0x2e51021,
+0x9442726c, 0x30424000, 0x144002f6, 0xb71021, 0x9443726e, 0x96020000,
0x1462000b, 0x418c0, 0xb71021, 0x94437270, 0x96020002, 0x14620006,
0x418c0, 0xb71021, 0x94437272, 0x96020004, 0x10620035, 0x418c0,
-0x2e31021, 0x9442726c, 0x30428000, 0x144002e1, 0x2e31021, 0x944e726c,
-0x96070000, 0xe28c0, 0xb71021, 0x9442736e, 0x80038de, 0x3021,
-0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x944e736c, 0x30638000,
-0x14600010, 0xe28c0, 0xb71021, 0x9442736e, 0x1447fff5, 0x1c02021,
+0x2e31021, 0x9442726c, 0x30428000, 0x144002e3, 0x2e31021, 0x944d726c,
+0x96070000, 0xd28c0, 0xb71021, 0x9442736e, 0x8003974, 0x3021,
+0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x944d736c, 0x30638000,
+0x14600010, 0xd28c0, 0xb71021, 0x9442736e, 0x1447fff5, 0x1a02021,
0xb71021, 0x94437370, 0x96020002, 0x5462fff1, 0x420c0, 0xb71021,
0x94437372, 0x96020004, 0x5462ffec, 0x420c0, 0x24060001, 0x30c200ff,
-0x104002c0, 0x0, 0x80038fc, 0x0, 0x97430202, 0x96420000,
-0x146202ba, 0x0, 0x97430204, 0x96420002, 0x146202b6, 0x0,
-0x97430206, 0x96420004, 0x146202b2, 0x0, 0x92420000, 0x3a230001,
+0x104002c2, 0x0, 0x8003992, 0x0, 0x97430202, 0x96420000,
+0x146202bc, 0x0, 0x97430204, 0x96420002, 0x146202b8, 0x0,
+0x97430206, 0x96420004, 0x146202b4, 0x0, 0x92420000, 0x3a230001,
0x30420001, 0x431024, 0x10400074, 0x2402ffff, 0x8e030000, 0x14620004,
-0x3402ffff, 0x96030004, 0x1062006f, 0x24160002, 0x3c020001, 0x571021,
-0x904283a2, 0x1440006a, 0x24160003, 0x92e204c8, 0x14400067, 0x0,
+0x3402ffff, 0x96030004, 0x1062006f, 0x24150002, 0x3c020001, 0x571021,
+0x904283a2, 0x1440006a, 0x24150003, 0x92e204c8, 0x14400067, 0x0,
0x3c020001, 0x571021, 0x8c4283a4, 0x28420005, 0x10400020, 0x3821,
0x3c020001, 0x571021, 0x8c4283a4, 0x18400016, 0x2821, 0x96060000,
0x520c0, 0x971021, 0x9442776e, 0x14460009, 0x971021, 0x94437770,
0x96020002, 0x14620005, 0x971021, 0x94437772, 0x96020004, 0x50620008,
0x24070001, 0x3c020001, 0x571021, 0x8c4283a4, 0x24a50001, 0xa2102a,
-0x5440ffee, 0x520c0, 0x30e200ff, 0x14400044, 0x24160003, 0x8003bad,
-0x0, 0x2402021, 0xc00229d, 0x24050006, 0x3044001f, 0x428c0,
-0x2e51021, 0x9442726c, 0x30424000, 0x1440026f, 0xb71021, 0x9443726e,
+0x5440ffee, 0x520c0, 0x30e200ff, 0x14400044, 0x24150003, 0x8003c45,
+0x0, 0x2402021, 0xc0022f8, 0x24050006, 0x3044001f, 0x428c0,
+0x2e51021, 0x9442726c, 0x30424000, 0x14400271, 0xb71021, 0x9443726e,
0x96020000, 0x1462000b, 0x418c0, 0xb71021, 0x94437270, 0x96020002,
0x14620006, 0x418c0, 0xb71021, 0x94437272, 0x96020004, 0x10620027,
-0x418c0, 0x2e31021, 0x9442726c, 0x30428000, 0x1440025c, 0x2e31021,
-0x944e726c, 0x96070000, 0xe28c0, 0xb71021, 0x9442736e, 0x8003963,
-0x3021, 0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x944e736c,
-0x30638000, 0x14600010, 0xe28c0, 0xb71021, 0x9442736e, 0x1447fff5,
-0x1c02021, 0xb71021, 0x94437370, 0x96020002, 0x5462fff1, 0x420c0,
+0x418c0, 0x2e31021, 0x9442726c, 0x30428000, 0x1440025e, 0x2e31021,
+0x944d726c, 0x96070000, 0xd28c0, 0xb71021, 0x9442736e, 0x80039f9,
+0x3021, 0x420c0, 0x2e41021, 0x9443736c, 0x2e41021, 0x944d736c,
+0x30638000, 0x14600010, 0xd28c0, 0xb71021, 0x9442736e, 0x1447fff5,
+0x1a02021, 0xb71021, 0x94437370, 0x96020002, 0x5462fff1, 0x420c0,
0xb71021, 0x94437372, 0x96020004, 0x5462ffec, 0x420c0, 0x24060001,
-0x30c200ff, 0x1040023b, 0x0, 0x8003976, 0x24160003, 0x24160001,
+0x30c200ff, 0x1040023d, 0x0, 0x8003a0c, 0x24150003, 0x24150001,
0x8f420260, 0x53102b, 0x10400036, 0x0, 0x8f8300e4, 0x8f8200e0,
0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8ee400c0, 0x8ee500c4,
0x2601821, 0x1021, 0xa32821, 0xa3302b, 0x822021, 0x862021,
0xaee400c0, 0xaee500c4, 0x8ee20058, 0x24420001, 0xaee20058, 0x8ee20058,
0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x8f8200e0, 0xafa20010,
-0x8f8200e4, 0x3c040001, 0x24844a20, 0xafa20014, 0x8fa60018, 0x8fa7001c,
-0x3c050006, 0xc0023a7, 0x34a5f203, 0x8003bb3, 0x0, 0x8ee25230,
-0xafa20010, 0x8ee25234, 0x3c040001, 0x24844a2c, 0xafa20014, 0x8ee60e00,
-0x8ee70e08, 0x3c050006, 0xc0023a7, 0x34a5f202, 0x8ee201bc, 0x24420001,
-0xaee201bc, 0x8003b5a, 0x8ee201bc, 0x96e20468, 0x53102b, 0x54400001,
-0x3c1e8000, 0x126001c9, 0x3c0f001f, 0x35efffff, 0x3c18fff5, 0x37181000,
-0x8ee2723c, 0x8f430280, 0x24420001, 0x304203ff, 0x1062019d, 0x0,
-0x13c00012, 0x0, 0x8ee35230, 0x8ee25234, 0x1062000a, 0x26f95234,
-0x8ef55234, 0xafb90024, 0x8ee35234, 0x21140, 0x24425238, 0x2e28821,
-0x24630001, 0x80039de, 0x306e00ff, 0x8ee201d0, 0x24420001, 0xaee201d0,
-0x8ee201d0, 0x8ee30e00, 0x8ee20e08, 0x1062ffcb, 0x26f90e08, 0x8ef50e08,
-0xf021, 0xafb90024, 0x8ee30e08, 0x21140, 0x24420e10, 0x2e28821,
-0x24630001, 0x306e01ff, 0x96e2046a, 0x30420010, 0x10400018, 0x34028100,
-0x9643000c, 0x14620015, 0x0, 0x3c020001, 0x571021, 0x904283b0,
-0x14400010, 0x0, 0x9642000e, 0xa6220016, 0x8e420008, 0x8e430004,
-0x8e440000, 0x2673fffc, 0xae42000c, 0xae430008, 0xae440004, 0x9622000e,
-0x26100004, 0x24190001, 0xa3b9002f, 0x34420200, 0xa622000e, 0x8e220000,
-0x8e230004, 0x3c040001, 0x34843800, 0x2003021, 0x306b0007, 0x20b8023,
-0x3641021, 0x202102b, 0x10400005, 0x26b9821, 0x2041023, 0x3621823,
-0x3c020020, 0x438023, 0x26620007, 0x9623000a, 0x2419fff8, 0x59a024,
-0x6b1821, 0x74102b, 0x10400002, 0x2806821, 0x606821, 0x1a01821,
-0x24620007, 0x2419fff8, 0x596824, 0x26d102b, 0x14400004, 0x1b32823,
-0x1a32823, 0x8003a1c, 0xc31021, 0xd31021, 0x4b2023, 0x1e4102b,
-0x54400001, 0x982021, 0x25620040, 0x4d102b, 0x14400035, 0x6021,
-0x94c3000c, 0x24020800, 0x54620032, 0xae260018, 0x3c020001, 0x571021,
-0x904283b0, 0x5440002d, 0xae260018, 0x24c20017, 0x1e2102b, 0x10400013,
-0x0, 0x3c02fff5, 0x461021, 0x90421017, 0x38430006, 0x2c630001,
-0x38420011, 0x2c420001, 0x621825, 0x10600014, 0x24c20010, 0x1e2102b,
-0x1040000e, 0x0, 0x3c0cfff5, 0x1866021, 0x958c1010, 0x8003a4d,
-0x2582000e, 0x90c20017, 0x38430006, 0x2c630001, 0x38420011, 0x2c420001,
-0x621825, 0x10600005, 0x1801821, 0x94cc0010, 0x2582000e, 0x4b6021,
-0x1801821, 0x24620007, 0x2419fff8, 0x596024, 0xc31021, 0x4b2023,
-0x1e4102b, 0x10400002, 0x1832823, 0x982021, 0xae260018, 0x3c020001,
-0x571021, 0x904283b0, 0x2102b, 0x216c0, 0x15800002, 0xafa20044,
-0x1a06021, 0x30820001, 0x10400007, 0x4021, 0x90880000, 0x24840001,
-0x1e4102b, 0x10400002, 0x24a5ffff, 0x982021, 0x50a00012, 0x81c02,
+0x8f8200e4, 0x3c040001, 0x24844c30, 0xafa20014, 0x8fa60018, 0x8fa7001c,
+0x3c050006, 0xc002403, 0x34a5f203, 0x8003c4b, 0x0, 0x8ee25230,
+0xafa20010, 0x8ee25234, 0x3c040001, 0x24844c3c, 0xafa20014, 0x8ee60e00,
+0x8ee70e08, 0x3c050006, 0xc002403, 0x34a5f202, 0x8ee201bc, 0x24420001,
+0xaee201bc, 0x8003bf2, 0x8ee201bc, 0x96e20468, 0x53102b, 0x54400001,
+0x3c168000, 0x126001cb, 0x3c0e001f, 0x35ceffff, 0x3c0ffff5, 0x35ef1000,
+0x241e0040, 0x8ee2723c, 0x8f430280, 0x24420001, 0x304203ff, 0x1062019e,
+0x0, 0x12c00012, 0x0, 0x8ee35230, 0x8ee25234, 0x1062000a,
+0x26f85234, 0x8ef45234, 0xafb80024, 0x8ee35234, 0x21140, 0x24425238,
+0x2e28821, 0x24630001, 0x8003a75, 0x306d00ff, 0x8ee201d0, 0x24420001,
+0xaee201d0, 0x8ee201d0, 0x8ee30e00, 0x8ee20e08, 0x1062ffca, 0x26f80e08,
+0x8ef40e08, 0xb021, 0xafb80024, 0x8ee30e08, 0x21140, 0x24420e10,
+0x2e28821, 0x24630001, 0x306d01ff, 0x96e2046a, 0x30420010, 0x10400018,
+0x34028100, 0x9643000c, 0x14620015, 0x0, 0x3c020001, 0x571021,
+0x904283b0, 0x14400010, 0x0, 0x9642000e, 0xa6220016, 0x8e420008,
+0x8e430004, 0x8e440000, 0x2673fffc, 0xae42000c, 0xae430008, 0xae440004,
+0x9622000e, 0x26100004, 0x24180001, 0xa3b8002f, 0x34420200, 0xa622000e,
+0x8e220000, 0x8e230004, 0x3c040001, 0x34843800, 0x2003021, 0x306a0007,
+0x20a8023, 0x3641021, 0x202102b, 0x10400005, 0x26a9821, 0x2041023,
+0x3621823, 0x3c020020, 0x438023, 0x26620007, 0x9623000a, 0x2418fff8,
+0x58c824, 0x6a1821, 0x79102b, 0x10400002, 0x3206021, 0x606021,
+0x1801821, 0x24620007, 0x2418fff8, 0x586024, 0x26c102b, 0x14400004,
+0x1932823, 0x1832823, 0x8003ab3, 0xc31021, 0xd31021, 0x4a2023,
+0x1c4102b, 0x54400001, 0x8f2021, 0x25420040, 0x4c102b, 0x14400035,
+0x5821, 0x94c3000c, 0x24020800, 0x54620032, 0xae260018, 0x3c020001,
+0x571021, 0x904283b0, 0x5440002d, 0xae260018, 0x24c20017, 0x1c2102b,
+0x10400013, 0x0, 0x3c02fff5, 0x461021, 0x90421017, 0x38430006,
+0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x10600014, 0x24c20010,
+0x1c2102b, 0x1040000e, 0x0, 0x3c0bfff5, 0x1665821, 0x956b1010,
+0x8003ae4, 0x2562000e, 0x90c20017, 0x38430006, 0x2c630001, 0x38420011,
+0x2c420001, 0x621825, 0x10600005, 0x1601821, 0x94cb0010, 0x2562000e,
+0x4a5821, 0x1601821, 0x24620007, 0x2418fff8, 0x585824, 0xc31021,
+0x4a2023, 0x1c4102b, 0x10400002, 0x1632823, 0x8f2021, 0xae260018,
+0x3c020001, 0x571021, 0x904283b0, 0x2102b, 0x216c0, 0x15600002,
+0xafa20044, 0x1805821, 0x30820001, 0x10400007, 0x4021, 0x90880000,
+0x24840001, 0x1c4102b, 0x10400002, 0x24a5ffff, 0x8f2021, 0x50a00012,
+0x81c02, 0x2ca20002, 0x54400009, 0x24a5ffff, 0x94820000, 0x24840002,
+0x1024021, 0x1c4102b, 0x10400006, 0x24a5fffe, 0x8003b11, 0x8f2021,
+0x90820000, 0x21200, 0x1024021, 0x14a0fff2, 0x2ca20002, 0x81c02,
+0x3102ffff, 0x624021, 0x3108ffff, 0x1402821, 0x11400011, 0x2002021,
0x2ca20002, 0x54400009, 0x24a5ffff, 0x94820000, 0x24840002, 0x1024021,
-0x1e4102b, 0x10400006, 0x24a5fffe, 0x8003a7a, 0x982021, 0x90820000,
+0x1c4102b, 0x10400006, 0x24a5fffe, 0x8003b28, 0x8f2021, 0x90820000,
0x21200, 0x1024021, 0x14a0fff2, 0x2ca20002, 0x81c02, 0x3102ffff,
-0x624021, 0x3108ffff, 0x1602821, 0x11600011, 0x2002021, 0x2ca20002,
-0x54400009, 0x24a5ffff, 0x94820000, 0x24840002, 0x1024021, 0x1e4102b,
-0x10400006, 0x24a5fffe, 0x8003a91, 0x982021, 0x90820000, 0x21200,
-0x1024021, 0x14a0fff2, 0x2ca20002, 0x81c02, 0x3102ffff, 0x624021,
-0x81c02, 0x3102ffff, 0x8f890120, 0x624021, 0x27623800, 0x252a0020,
-0x142102b, 0x14400002, 0x3108ffff, 0x276a3000, 0x8f820128, 0x15420007,
-0x1602821, 0x8ee201a0, 0x3821, 0x24420001, 0xaee201a0, 0x8003b21,
-0x8ee201a0, 0x8e260000, 0x8e270004, 0x81400, 0x3443000b, 0xad300008,
-0xa52c000e, 0xad230018, 0x8fb90044, 0x2021, 0x2be1025, 0x591025,
-0xad22001c, 0xe5102b, 0xe53823, 0xc43023, 0xc23023, 0xad260000,
-0xad270004, 0x8ee204b0, 0xad220010, 0xaf8a0120, 0x92e24e10, 0x14400061,
-0x24070001, 0x2462ffee, 0x2c420002, 0x14400003, 0x24020011, 0x14620025,
-0x0, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
-0x24020012, 0x1462000f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062000b,
-0x24190040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x1059002b, 0x0, 0x8003aff, 0x0, 0x8ee24e20,
-0x24190040, 0x24420001, 0x50590003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8003b1e,
-0x24020012, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
-0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x24190040, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x10590007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8003b0b, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013,
-0xac800000, 0x8003b21, 0x0, 0x8ee24e20, 0x24190040, 0x24420001,
-0x50590003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001,
-0xac820004, 0x14e00019, 0x3c050006, 0x3c040001, 0x248449f0, 0x8e220018,
-0x34a5f209, 0xafa20010, 0x8e220000, 0x8e230004, 0x2203021, 0x1803821,
-0xc0023a7, 0xafa30014, 0x93a2002f, 0x1040002a, 0x34028100, 0x8e430004,
-0x8e440008, 0x8e45000c, 0xa642000c, 0xae430000, 0xae440004, 0xae450008,
-0x96220016, 0x8003b5a, 0xa642000e, 0x15b4000a, 0x26b1823, 0x9622000e,
-0xa623000a, 0x34420004, 0xa622000e, 0x3c010001, 0x370821, 0xa02083b0,
-0x8003b57, 0x9821, 0x9624000a, 0x83102b, 0x54400001, 0x801821,
-0x24020001, 0xa623000a, 0x3c010001, 0x370821, 0xa02283b0, 0x9622000a,
-0x4b1821, 0x2038021, 0x1f0102b, 0x54400001, 0x2188021, 0x2639823,
-0xf021, 0x8fb90024, 0x1660fe5f, 0xaf2e0000, 0x12600022, 0x0,
-0x3c010001, 0x370821, 0xac3383b4, 0x3c010001, 0x370821, 0xac3083b8,
-0x3c010001, 0x370821, 0xac3283bc, 0x93a2002f, 0x10400008, 0x0,
-0x3c020001, 0x571021, 0x8c4283bc, 0x24420004, 0x3c010001, 0x370821,
-0xac2283bc, 0x8f430280, 0x8ee2723c, 0x14620006, 0x0, 0x8ee201c0,
-0x24420001, 0xaee201c0, 0x8003bb3, 0x8ee201c0, 0x8ee201b8, 0x24420001,
-0xaee201b8, 0x8003bb3, 0x8ee201b8, 0x97a4001e, 0x2484fffc, 0x801821,
-0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821, 0xa3302b, 0x822021,
-0x862021, 0x24020002, 0xaee400c0, 0xaee500c4, 0x12c2000f, 0x2ac20003,
-0x14400017, 0x24020003, 0x16c20015, 0x0, 0x8ee200d0, 0x8ee300d4,
-0x24630001, 0x2c640001, 0x441021, 0xaee200d0, 0xaee300d4, 0x8ee200d0,
-0x8003bad, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc, 0x24630001, 0x2c640001,
-0x441021, 0xaee200d8, 0xaee300dc, 0x8ee200d8, 0x8003bad, 0x8ee300dc,
-0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001, 0x441021, 0xaee200c8,
-0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4, 0x8f8200e0, 0x10620003,
-0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8fbf0068, 0x8fbe0064, 0x8fb60060,
-0x8fb5005c, 0x8fb40058, 0x8fb30054, 0x8fb20050, 0x8fb1004c, 0x8fb00048,
-0x3e00008, 0x27bd0070, 0x27bdffe0, 0xafbf0018, 0x8ee30e04, 0x8ee20dfc,
-0x10620071, 0x0, 0x8ee30dfc, 0x8ee20e04, 0x622023, 0x4820001,
-0x24840200, 0x8ee30e08, 0x8ee20e04, 0x43102b, 0x14400004, 0x24020200,
-0x8ee30e04, 0x8003bd5, 0x431823, 0x8ee20e08, 0x8ee30e04, 0x431023,
+0x624021, 0x81c02, 0x3102ffff, 0x8f890120, 0x624021, 0x27623800,
+0x25230020, 0x62102b, 0x14400002, 0x3108ffff, 0x27633000, 0x8f820128,
+0x10620004, 0x0, 0x8f820124, 0x14620007, 0x1402821, 0x8ee201a0,
+0x3821, 0x24420001, 0xaee201a0, 0x8003bb9, 0x8ee201a0, 0x8e260000,
+0x8e270004, 0x81400, 0x3448000b, 0xad300008, 0xa52b000e, 0xad280018,
+0x8fb80044, 0x2021, 0x2961025, 0x581025, 0xad22001c, 0xe5102b,
+0xe53823, 0xc43023, 0xc23023, 0xad260000, 0xad270004, 0x8ee204b0,
+0xad220010, 0xaf830120, 0x92e24e10, 0x1440005f, 0x24070001, 0x2502ffee,
+0x2c420002, 0x14400003, 0x24020011, 0x15020024, 0x0, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020012, 0x1462000f,
+0x0, 0x8ee34e20, 0x8ee24e24, 0x1062000b, 0x0, 0x8c820004,
+0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x105e002a,
+0x0, 0x8003b98, 0x0, 0x8ee24e20, 0x24420001, 0x505e0003,
+0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x8003bb6, 0x24020012, 0x8ee24e20, 0x210c0,
+0x24425028, 0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0,
+0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001,
+0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x105e0007, 0x0,
+0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x8003ba4, 0x0,
+0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
+0x8c820004, 0x2c420011, 0x50400012, 0xac800000, 0x8003bb9, 0x0,
+0x8ee24e20, 0x24420001, 0x505e0003, 0x1021, 0x8ee24e20, 0x24420001,
+0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020007,
+0xac820000, 0x24020001, 0xac820004, 0x14e00019, 0x3c050006, 0x3c040001,
+0x24844c00, 0x8e220018, 0x34a5f209, 0xafa20010, 0x8e220000, 0x8e230004,
+0x2203021, 0x1603821, 0xc002403, 0xafa30014, 0x93a2002f, 0x1040002a,
+0x34028100, 0x8e430004, 0x8e440008, 0x8e45000c, 0xa642000c, 0xae430000,
+0xae440004, 0xae450008, 0x96220016, 0x8003bf2, 0xa642000e, 0x1599000a,
+0x26a1823, 0x9622000e, 0xa623000a, 0x34420004, 0xa622000e, 0x3c010001,
+0x370821, 0xa02083b0, 0x8003bef, 0x9821, 0x9624000a, 0x83102b,
+0x54400001, 0x801821, 0x24020001, 0xa623000a, 0x3c010001, 0x370821,
+0xa02283b0, 0x9622000a, 0x4a1821, 0x2038021, 0x1d0102b, 0x54400001,
+0x20f8021, 0x2639823, 0xb021, 0x8fb80024, 0x1660fe5e, 0xaf0d0000,
+0x12600022, 0x0, 0x3c010001, 0x370821, 0xac3383b4, 0x3c010001,
+0x370821, 0xac3083b8, 0x3c010001, 0x370821, 0xac3283bc, 0x93a2002f,
+0x10400008, 0x0, 0x3c020001, 0x571021, 0x8c4283bc, 0x24420004,
+0x3c010001, 0x370821, 0xac2283bc, 0x8f430280, 0x8ee2723c, 0x14620006,
+0x0, 0x8ee201c0, 0x24420001, 0xaee201c0, 0x8003c4b, 0x8ee201c0,
+0x8ee201b8, 0x24420001, 0xaee201b8, 0x8003c4b, 0x8ee201b8, 0x97a4001e,
+0x2484fffc, 0x801821, 0x8ee400c0, 0x8ee500c4, 0x1021, 0xa32821,
+0xa3302b, 0x822021, 0x862021, 0x24020002, 0xaee400c0, 0xaee500c4,
+0x12a2000f, 0x2aa20003, 0x14400017, 0x24020003, 0x16a20015, 0x0,
+0x8ee200d0, 0x8ee300d4, 0x24630001, 0x2c640001, 0x441021, 0xaee200d0,
+0xaee300d4, 0x8ee200d0, 0x8003c45, 0x8ee300d4, 0x8ee200d8, 0x8ee300dc,
+0x24630001, 0x2c640001, 0x441021, 0xaee200d8, 0xaee300dc, 0x8ee200d8,
+0x8003c45, 0x8ee300dc, 0x8ee200c8, 0x8ee300cc, 0x24630001, 0x2c640001,
+0x441021, 0xaee200c8, 0xaee300cc, 0x8ee200c8, 0x8ee300cc, 0x8f8300e4,
+0x8f8200e0, 0x10620003, 0x24630008, 0xaf8300e4, 0xaf8300e8, 0x8fbf0068,
+0x8fbe0064, 0x8fb60060, 0x8fb5005c, 0x8fb40058, 0x8fb30054, 0x8fb20050,
+0x8fb1004c, 0x8fb00048, 0x3e00008, 0x27bd0070, 0x27bdffe0, 0xafbf0018,
+0x8ee30e04, 0x8ee20dfc, 0x10620074, 0x0, 0x8ee30dfc, 0x8ee20e04,
+0x622023, 0x4820001, 0x24840200, 0x8ee30e08, 0x8ee20e04, 0x43102b,
+0x14400004, 0x24020200, 0x8ee30e04, 0x8003c6d, 0x431823, 0x8ee20e08,
+0x8ee30e04, 0x431023, 0x2443ffff, 0x804821, 0x69102a, 0x54400001,
+0x604821, 0x8f870100, 0x27623000, 0x24e80020, 0x102102b, 0x50400001,
+0x27682800, 0x8f820108, 0x11020004, 0x0, 0x8f820104, 0x15020007,
+0x1021, 0x8ee201a4, 0x2021, 0x24420001, 0xaee201a4, 0x8003caf,
+0x8ee201a4, 0x8ee40e04, 0x42140, 0x801821, 0x8ee40460, 0x8ee50464,
+0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004,
+0x8ee30e04, 0x91140, 0xa4e2000e, 0x24020002, 0xace20018, 0x31940,
+0x24630e10, 0x2e31021, 0xace20008, 0x8ee20e04, 0xace2001c, 0x8ee204bc,
+0xace20010, 0xaf880100, 0x92e204dc, 0x14400011, 0x24040001, 0x8ee24e18,
+0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18, 0x24420001,
+0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21821, 0x24020002,
+0xac620000, 0x24020001, 0xac620004, 0x1480000e, 0x24030040, 0x8ee20e04,
+0xafa20010, 0x8ee20e08, 0x3c050007, 0xafa20014, 0x8ee60dfc, 0x8ee70e00,
+0x3c040001, 0x24844c44, 0xc002403, 0x34a5f001, 0x8003ccd, 0x0,
+0x8ee204f0, 0x24420001, 0x50430003, 0x1021, 0x8ee204f0, 0x24420001,
+0xaee204f0, 0x8ee204f0, 0x21080, 0x571021, 0xac4904f8, 0x8ee20e04,
+0x491021, 0x304201ff, 0xaee20e04, 0x8ee30e04, 0x8ee20dfc, 0x14620005,
+0x0, 0x8f820060, 0x2403fdff, 0x431024, 0xaf820060, 0x8fbf0018,
+0x3e00008, 0x27bd0020, 0x27bdffe0, 0xafbf0018, 0x8ee3522c, 0x8ee25228,
+0x10620074, 0x0, 0x8ee35228, 0x8ee2522c, 0x622023, 0x4820001,
+0x24840100, 0x8ee35234, 0x8ee2522c, 0x43102b, 0x14400004, 0x24020100,
+0x8ee3522c, 0x8003cef, 0x431823, 0x8ee25234, 0x8ee3522c, 0x431023,
0x2443ffff, 0x804821, 0x69102a, 0x54400001, 0x604821, 0x8f870100,
0x27623000, 0x24e80020, 0x102102b, 0x50400001, 0x27682800, 0x8f820108,
-0x15020007, 0x1021, 0x8ee201a4, 0x2021, 0x24420001, 0xaee201a4,
-0x8003c14, 0x8ee201a4, 0x8ee40e04, 0x42140, 0x801821, 0x8ee40460,
-0x8ee50464, 0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000,
-0xace50004, 0x8ee30e04, 0x91140, 0xa4e2000e, 0x24020002, 0xace20018,
-0x31940, 0x24630e10, 0x2e31021, 0xace20008, 0x8ee20e04, 0xace2001c,
-0x8ee204bc, 0xace20010, 0xaf880100, 0x92e204dc, 0x14400011, 0x24040001,
-0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e18,
-0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28, 0x2e21821,
-0x24020002, 0xac620000, 0x24020001, 0xac620004, 0x1480000e, 0x24030040,
-0x8ee20e04, 0xafa20010, 0x8ee20e08, 0x3c050007, 0xafa20014, 0x8ee60dfc,
-0x8ee70e00, 0x3c040001, 0x24844a34, 0xc0023a7, 0x34a5f001, 0x8003c32,
-0x0, 0x8ee204f0, 0x24420001, 0x50430003, 0x1021, 0x8ee204f0,
-0x24420001, 0xaee204f0, 0x8ee204f0, 0x21080, 0x571021, 0xac4904f8,
-0x8ee20e04, 0x491021, 0x304201ff, 0xaee20e04, 0x8ee30e04, 0x8ee20dfc,
-0x14620005, 0x0, 0x8f820060, 0x2403fdff, 0x431024, 0xaf820060,
-0x8fbf0018, 0x3e00008, 0x27bd0020, 0x27bdffe0, 0xafbf0018, 0x8ee3522c,
-0x8ee25228, 0x10620071, 0x0, 0x8ee35228, 0x8ee2522c, 0x622023,
-0x4820001, 0x24840100, 0x8ee35234, 0x8ee2522c, 0x43102b, 0x14400004,
-0x24020100, 0x8ee3522c, 0x8003c54, 0x431823, 0x8ee25234, 0x8ee3522c,
-0x431023, 0x2443ffff, 0x804821, 0x69102a, 0x54400001, 0x604821,
-0x8f870100, 0x27623000, 0x24e80020, 0x102102b, 0x50400001, 0x27682800,
-0x8f820108, 0x15020007, 0x1021, 0x8ee201a4, 0x2021, 0x24420001,
-0xaee201a4, 0x8003c93, 0x8ee201a4, 0x8ee4522c, 0x42140, 0x801821,
-0x8ee40470, 0x8ee50474, 0xa32821, 0xa3302b, 0x822021, 0x862021,
-0xace40000, 0xace50004, 0x8ee3522c, 0x91140, 0xa4e2000e, 0x24020003,
-0xace20018, 0x31940, 0x24635238, 0x2e31021, 0xace20008, 0x8ee2522c,
-0xace2001c, 0x8ee204bc, 0xace20010, 0xaf880100, 0x92e204dc, 0x14400011,
-0x24040001, 0x8ee24e18, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18, 0x210c0, 0x24424e28,
-0x2e21821, 0x24020003, 0xac620000, 0x24020001, 0xac620004, 0x1480000e,
-0x24030040, 0x8ee2522c, 0xafa20010, 0x8ee25234, 0x3c050007, 0xafa20014,
-0x8ee65228, 0x8ee75230, 0x3c040001, 0x24844a40, 0xc0023a7, 0x34a5f010,
-0x8003cb1, 0x0, 0x8ee204f0, 0x24420001, 0x50430003, 0x1021,
-0x8ee204f0, 0x24420001, 0xaee204f0, 0x8ee204f0, 0x21080, 0x571021,
-0xac4904f8, 0x8ee2522c, 0x491021, 0x304200ff, 0xaee2522c, 0x8ee3522c,
-0x8ee25228, 0x14620005, 0x0, 0x8f820060, 0x2403feff, 0x431024,
-0xaf820060, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820120, 0x8ee34e24,
-0x8f820124, 0x8f860128, 0x24020040, 0x24630001, 0x50620003, 0x1021,
-0x8ee24e24, 0x24420001, 0xaee24e24, 0x8ee24e24, 0x8ee44e24, 0x8ee34e20,
-0x210c0, 0x24425028, 0x14830007, 0x2e22821, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8003ce4, 0xaca00000, 0x8ee24e24, 0x24030040,
-0x24420001, 0x50430003, 0x1021, 0x8ee24e24, 0x24420001, 0x210c0,
-0x24425028, 0x2e22821, 0x8ca20004, 0x8f830128, 0x21140, 0x621821,
-0xaf830128, 0xaca00000, 0x8cc20018, 0x2443fffe, 0x2c620012, 0x10400008,
-0x31080, 0x3c010001, 0x220821, 0x8c224a50, 0x400008, 0x0,
-0x24020001, 0xaee24e14, 0x3e00008, 0x0, 0x27bdffc8, 0xafbf0030,
-0xafb5002c, 0xafb40028, 0xafb30024, 0xafb20020, 0xafb1001c, 0xafb00018,
-0x8f830128, 0x8f820124, 0x106202a7, 0xa021, 0x3c11001f, 0x3631ffff,
-0x3c12fff5, 0x36521000, 0x24150012, 0x24130040, 0x8f8c0128, 0x8f820128,
-0x24420020, 0xaf820128, 0x9182001b, 0x8f830128, 0x2443fffe, 0x2c620012,
-0x10400293, 0x31080, 0x3c010001, 0x220821, 0x8c224aa8, 0x400008,
-0x0, 0x8f420218, 0x30420100, 0x10400007, 0x0, 0x95830016,
-0x95820018, 0x621823, 0x31402, 0x431021, 0xa5820016, 0x8d82001c,
-0x3c038000, 0x3044ffff, 0x436824, 0x3c030800, 0x431824, 0x11a00004,
-0xad84001c, 0x41140, 0x8003d2a, 0x24425238, 0x41140, 0x24420e10,
-0x2e25821, 0x9562000e, 0x3042fffc, 0x10600004, 0xa562000e, 0x95840016,
-0x8003e12, 0x0, 0x8d690018, 0x4021, 0x952a0000, 0x25290002,
-0x95270000, 0x25290002, 0x95260000, 0x25290002, 0x95250000, 0x25290002,
-0x95240000, 0x25290002, 0x95230000, 0x25290002, 0x95220000, 0x25290002,
-0x1475021, 0x1465021, 0x1455021, 0x1445021, 0x1435021, 0x1425021,
-0xa1c02, 0x3142ffff, 0x625021, 0xa1c02, 0x3142ffff, 0x625021,
-0x96e2046a, 0x314effff, 0x30420002, 0x10400044, 0x5021, 0x25220014,
-0x222102b, 0x10400014, 0x1201821, 0x2405000a, 0x2021, 0x223102b,
-0x54400001, 0x721821, 0x94620000, 0x24630002, 0x24a5ffff, 0x14a0fff9,
-0x822021, 0x41c02, 0x3082ffff, 0x622021, 0x41402, 0x3083ffff,
-0x431021, 0x3042ffff, 0x8003d85, 0x1425021, 0x952a0000, 0x25290002,
-0x95280000, 0x25290002, 0x95270000, 0x25290002, 0x95260000, 0x25290002,
-0x95250000, 0x25290002, 0x95230000, 0x25290002, 0x95220000, 0x25290002,
-0x95240000, 0x25290002, 0x1485021, 0x1475021, 0x1465021, 0x1455021,
-0x1435021, 0x1425021, 0x95220000, 0x95230002, 0x1445021, 0x1425021,
-0x1435021, 0xa1c02, 0x3142ffff, 0x625021, 0xa1c02, 0x3142ffff,
-0x625021, 0x3148ffff, 0x51000001, 0x3408ffff, 0x8d620018, 0x9443000c,
-0x24020800, 0x54620005, 0xa5680010, 0x9562000e, 0x34420002, 0xa562000e,
-0xa5680010, 0x96e2046a, 0x2821, 0x30420008, 0x14400056, 0x3021,
-0x8d630018, 0x24620024, 0x222102b, 0x10400034, 0x24690010, 0x229102b,
-0x54400001, 0x1324821, 0x95250000, 0x24690014, 0x229102b, 0x10400002,
-0x24a5ffec, 0x1324821, 0x95220000, 0x30420fff, 0x14400003, 0x25290002,
-0x8003db2, 0x24140001, 0xa021, 0xa03021, 0x229102b, 0x54400001,
-0x1324821, 0x91220001, 0x25290002, 0xa22821, 0x229102b, 0x54400001,
-0x1324821, 0x25290002, 0x229102b, 0x54400001, 0x1324821, 0x95220000,
-0x25290002, 0xa22821, 0x229102b, 0x54400001, 0x1324821, 0x95220000,
-0x25290002, 0xa22821, 0x229102b, 0x54400001, 0x1324821, 0x95220000,
-0x25290002, 0xa22821, 0x229102b, 0x54400001, 0x1324821, 0x95220000,
-0x8003deb, 0xa22821, 0x94650010, 0x94620014, 0x24690016, 0x30420fff,
-0x14400003, 0x24a5ffec, 0x8003dde, 0x24140001, 0xa021, 0xa03021,
-0x91230001, 0x25290004, 0x95220000, 0x25290002, 0x95240000, 0x25290002,
-0xa32821, 0xa22821, 0x95220000, 0x95230002, 0xa42821, 0xa22821,
-0xa32821, 0x51c02, 0x30a2ffff, 0x622821, 0x51c02, 0x30a2ffff,
-0x622821, 0x96e2046a, 0x30420001, 0x1040001e, 0x2021, 0x95820016,
-0x4e2023, 0x41402, 0x822021, 0x328200ff, 0x50400002, 0x862021,
-0x852021, 0x41402, 0x822021, 0x3084ffff, 0x50800001, 0x3404ffff,
-0x8d620018, 0x24430017, 0x223102b, 0x54400001, 0x721821, 0x90620000,
-0x38430011, 0x2c630001, 0x38420006, 0x2c420001, 0x621825, 0x10600004,
-0x0, 0x9562000e, 0x34420001, 0xa562000e, 0x9562000e, 0x240a0002,
-0x30420004, 0x10400002, 0xa5640012, 0x240a0004, 0x8f880120, 0x27623800,
-0x25090020, 0x122102b, 0x50400001, 0x27693000, 0x8f820128, 0x15220007,
-0x24040020, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8003e9e,
-0x8ee201a0, 0x8ee5723c, 0x8ee60480, 0x8ee70484, 0xad0b0008, 0xa504000e,
-0xad0a0018, 0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b,
-0xc23021, 0xc43021, 0xad060000, 0xad070004, 0x8ee2723c, 0x4d1025,
-0xad02001c, 0x8ee204b4, 0xad020010, 0xaf890120, 0x92e24e10, 0x14400060,
-0x24100001, 0x2543ffee, 0x2c630002, 0x39420011, 0x2c420001, 0x621825,
-0x10600024, 0x0, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0x8c820000, 0x1455000f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062000b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x1053002b, 0x0, 0x8003e7d, 0x0, 0x8ee24e20,
-0x24420001, 0x50530003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20,
-0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x24020001, 0x8003e9d,
-0xac950000, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000,
-0x24020007, 0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x10530007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8003e89, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400012,
-0xac800000, 0x8003e9e, 0x0, 0x8ee24e20, 0x24420001, 0x50530003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004,
-0x1600000d, 0x0, 0x8f820120, 0x3c040001, 0x24844a98, 0xafa00014,
-0xafa20010, 0x8d86001c, 0x8f870124, 0x3c050008, 0xc0023a7, 0x34a50001,
-0x8003fa0, 0x0, 0x8ee2723c, 0x24420001, 0x304203ff, 0x11a00006,
-0xaee2723c, 0x8ee201c8, 0x2442ffff, 0xaee201c8, 0x8003eba, 0x8ee201c8,
-0x8ee201c4, 0x2442ffff, 0xaee201c4, 0x8ee201c4, 0x8ee201cc, 0x2442ffff,
-0xaee201cc, 0x8003fa0, 0x8ee201cc, 0x8f420240, 0x104000df, 0x0,
-0x8ee20e0c, 0x24420001, 0x8003fa0, 0xaee20e0c, 0x9582001e, 0xad82001c,
-0x8f420240, 0x1040006f, 0x0, 0x8ee20e0c, 0x24420001, 0xaee20e0c,
-0x8f430240, 0x43102b, 0x144000cf, 0x0, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8003f26,
+0x11020004, 0x0, 0x8f820104, 0x15020007, 0x1021, 0x8ee201a4,
+0x2021, 0x24420001, 0xaee201a4, 0x8003d31, 0x8ee201a4, 0x8ee4522c,
+0x42140, 0x801821, 0x8ee40470, 0x8ee50474, 0xa32821, 0xa3302b,
+0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee3522c, 0x91140,
+0xa4e2000e, 0x24020003, 0xace20018, 0x31940, 0x24635238, 0x2e31021,
+0xace20008, 0x8ee2522c, 0xace2001c, 0x8ee204bc, 0xace20010, 0xaf880100,
+0x92e204dc, 0x14400011, 0x24040001, 0x8ee24e18, 0x24030040, 0x24420001,
+0x50430003, 0x1021, 0x8ee24e18, 0x24420001, 0xaee24e18, 0x8ee24e18,
+0x210c0, 0x24424e28, 0x2e21821, 0x24020003, 0xac620000, 0x24020001,
+0xac620004, 0x1480000e, 0x24030040, 0x8ee2522c, 0xafa20010, 0x8ee25234,
+0x3c050007, 0xafa20014, 0x8ee65228, 0x8ee75230, 0x3c040001, 0x24844c50,
+0xc002403, 0x34a5f010, 0x8003d4f, 0x0, 0x8ee204f0, 0x24420001,
+0x50430003, 0x1021, 0x8ee204f0, 0x24420001, 0xaee204f0, 0x8ee204f0,
+0x21080, 0x571021, 0xac4904f8, 0x8ee2522c, 0x491021, 0x304200ff,
+0xaee2522c, 0x8ee3522c, 0x8ee25228, 0x14620005, 0x0, 0x8f820060,
+0x2403feff, 0x431024, 0xaf820060, 0x8fbf0018, 0x3e00008, 0x27bd0020,
+0x8f820120, 0x8ee34e24, 0x8f820124, 0x8f860128, 0x24020040, 0x24630001,
+0x50620003, 0x1021, 0x8ee24e24, 0x24420001, 0xaee24e24, 0x8ee24e24,
+0x8ee44e24, 0x8ee34e20, 0x210c0, 0x24425028, 0x14830007, 0x2e22821,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8003d82, 0xaca00000,
+0x8ee24e24, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ee24e24,
+0x24420001, 0x210c0, 0x24425028, 0x2e22821, 0x8ca20004, 0x8f830128,
+0x21140, 0x621821, 0xaf830128, 0xaca00000, 0x8cc20018, 0x2443fffe,
+0x2c620012, 0x10400008, 0x31080, 0x3c010001, 0x220821, 0x8c224c60,
+0x400008, 0x0, 0x24020001, 0xaee24e14, 0x3e00008, 0x0,
+0x27bdffc8, 0xafbf0030, 0xafb5002c, 0xafb40028, 0xafb30024, 0xafb20020,
+0xafb1001c, 0xafb00018, 0x8f830128, 0x8f820124, 0x106202b0, 0x9821,
+0x3c11001f, 0x3631ffff, 0x3c12fff5, 0x36521000, 0x24150012, 0x24140040,
+0x8f8c0128, 0x8f820128, 0x24420020, 0xaf820128, 0x9182001b, 0x8f830128,
+0x2443fffe, 0x2c620012, 0x1040029c, 0x31080, 0x3c010001, 0x220821,
+0x8c224cb8, 0x400008, 0x0, 0x8f420218, 0x30420100, 0x10400007,
+0x0, 0x95830016, 0x95820018, 0x621823, 0x31402, 0x431021,
+0xa5820016, 0x8d82001c, 0x3c038000, 0x3044ffff, 0x436824, 0x3c030800,
+0x431824, 0x11a00004, 0xad84001c, 0x41140, 0x8003dc8, 0x24425238,
+0x41140, 0x24420e10, 0x2e25821, 0x9562000e, 0x3042fffc, 0x10600004,
+0xa562000e, 0x95840016, 0x8003eb0, 0x0, 0x8d690018, 0x4021,
+0x952a0000, 0x25290002, 0x95270000, 0x25290002, 0x95260000, 0x25290002,
+0x95250000, 0x25290002, 0x95240000, 0x25290002, 0x95230000, 0x25290002,
+0x95220000, 0x25290002, 0x1475021, 0x1465021, 0x1455021, 0x1445021,
+0x1435021, 0x1425021, 0xa1c02, 0x3142ffff, 0x625021, 0xa1c02,
+0x3142ffff, 0x625021, 0x96e2046a, 0x314effff, 0x30420002, 0x10400044,
+0x5021, 0x25220014, 0x222102b, 0x10400014, 0x1201821, 0x2405000a,
+0x2021, 0x223102b, 0x54400001, 0x721821, 0x94620000, 0x24630002,
+0x24a5ffff, 0x14a0fff9, 0x822021, 0x41c02, 0x3082ffff, 0x622021,
+0x41402, 0x3083ffff, 0x431021, 0x3042ffff, 0x8003e23, 0x1425021,
+0x952a0000, 0x25290002, 0x95280000, 0x25290002, 0x95270000, 0x25290002,
+0x95260000, 0x25290002, 0x95250000, 0x25290002, 0x95230000, 0x25290002,
+0x95220000, 0x25290002, 0x95240000, 0x25290002, 0x1485021, 0x1475021,
+0x1465021, 0x1455021, 0x1435021, 0x1425021, 0x95220000, 0x95230002,
+0x1445021, 0x1425021, 0x1435021, 0xa1c02, 0x3142ffff, 0x625021,
+0xa1c02, 0x3142ffff, 0x625021, 0x3148ffff, 0x51000001, 0x3408ffff,
+0x8d620018, 0x9443000c, 0x24020800, 0x54620005, 0xa5680010, 0x9562000e,
+0x34420002, 0xa562000e, 0xa5680010, 0x96e2046a, 0x2821, 0x30420008,
+0x14400056, 0x3021, 0x8d630018, 0x24620024, 0x222102b, 0x10400034,
+0x24690010, 0x229102b, 0x54400001, 0x1324821, 0x95250000, 0x24690014,
+0x229102b, 0x10400002, 0x24a5ffec, 0x1324821, 0x95220000, 0x30420fff,
+0x14400003, 0x25290002, 0x8003e50, 0x24130001, 0x9821, 0xa03021,
+0x229102b, 0x54400001, 0x1324821, 0x91220001, 0x25290002, 0xa22821,
+0x229102b, 0x54400001, 0x1324821, 0x25290002, 0x229102b, 0x54400001,
+0x1324821, 0x95220000, 0x25290002, 0xa22821, 0x229102b, 0x54400001,
+0x1324821, 0x95220000, 0x25290002, 0xa22821, 0x229102b, 0x54400001,
+0x1324821, 0x95220000, 0x25290002, 0xa22821, 0x229102b, 0x54400001,
+0x1324821, 0x95220000, 0x8003e89, 0xa22821, 0x94650010, 0x94620014,
+0x24690016, 0x30420fff, 0x14400003, 0x24a5ffec, 0x8003e7c, 0x24130001,
+0x9821, 0xa03021, 0x91230001, 0x25290004, 0x95220000, 0x25290002,
+0x95240000, 0x25290002, 0xa32821, 0xa22821, 0x95220000, 0x95230002,
+0xa42821, 0xa22821, 0xa32821, 0x51c02, 0x30a2ffff, 0x622821,
+0x51c02, 0x30a2ffff, 0x622821, 0x96e2046a, 0x30420001, 0x1040001e,
+0x2021, 0x95820016, 0x4e2023, 0x41402, 0x822021, 0x326200ff,
+0x50400002, 0x862021, 0x852021, 0x41402, 0x822021, 0x3084ffff,
+0x50800001, 0x3404ffff, 0x8d620018, 0x24430017, 0x223102b, 0x54400001,
+0x721821, 0x90620000, 0x38430011, 0x2c630001, 0x38420006, 0x2c420001,
+0x621825, 0x10600004, 0x0, 0x9562000e, 0x34420001, 0xa562000e,
+0x9562000e, 0x240a0002, 0x30420004, 0x10400002, 0xa5640012, 0x240a0004,
+0x8f880120, 0x27623800, 0x25090020, 0x122102b, 0x50400001, 0x27693000,
+0x8f820128, 0x11220004, 0x0, 0x8f820124, 0x15220007, 0x24040020,
+0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8003f3f, 0x8ee201a0,
+0x8ee5723c, 0x8ee60480, 0x8ee70484, 0xad0b0008, 0xa504000e, 0xad0a0018,
+0x52940, 0xa01821, 0x1021, 0xe33821, 0xe3202b, 0xc23021,
+0xc43021, 0xad060000, 0xad070004, 0x8ee2723c, 0x4d1025, 0xad02001c,
+0x8ee204b4, 0xad020010, 0xaf890120, 0x92e24e10, 0x14400060, 0x24100001,
+0x2543ffee, 0x2c630002, 0x39420011, 0x2c420001, 0x621825, 0x10600024,
+0x0, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
+0x1455000f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062000b, 0x0,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x1054002b, 0x0, 0x8003f1e, 0x0, 0x8ee24e20, 0x24420001,
+0x50540003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x24020001, 0x8003f3e, 0xac950000,
+0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c830000, 0x24020007,
+0x1462001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x10540007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x8003f2a, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400012, 0xac800000,
+0x8003f3f, 0x0, 0x8ee24e20, 0x24420001, 0x50540003, 0x1021,
+0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004, 0x1600000d,
+0x0, 0x8f820120, 0x3c040001, 0x24844ca8, 0xafa00014, 0xafa20010,
+0x8d86001c, 0x8f870124, 0x3c050008, 0xc002403, 0x34a50001, 0x8004047,
+0x0, 0x8ee2723c, 0x24420001, 0x304203ff, 0x11a00006, 0xaee2723c,
+0x8ee201c8, 0x2442ffff, 0xaee201c8, 0x8003f5b, 0x8ee201c8, 0x8ee201c4,
+0x2442ffff, 0xaee201c4, 0x8ee201c4, 0x8ee201cc, 0x2442ffff, 0xaee201cc,
+0x8004047, 0x8ee201cc, 0x8f420240, 0x104000e5, 0x0, 0x8ee20e0c,
+0x24420001, 0x8004047, 0xaee20e0c, 0x9582001e, 0xad82001c, 0x8f420240,
+0x10400072, 0x0, 0x8ee20e0c, 0x24420001, 0xaee20e0c, 0x8f430240,
+0x43102b, 0x144000d5, 0x0, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001,
+0xaee201a0, 0x8003fca, 0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498,
+0x8ee5049c, 0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011,
+0xac620018, 0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120,
+0x92e24e10, 0x14400034, 0x24100001, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0x8c820000, 0x1455001f, 0x0, 0x8ee34e20, 0x8ee24e24,
+0x1062001b, 0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24,
+0x8ee34e20, 0x24420001, 0x10540007, 0x0, 0x8ee24e24, 0x24420001,
+0x10620005, 0x0, 0x8003fb6, 0x0, 0x14600005, 0x0,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011,
+0x50400011, 0xac800000, 0x8003fca, 0x0, 0x8ee24e20, 0x24420001,
+0x50540003, 0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20,
+0x210c0, 0x24425028, 0x2e22021, 0x24020001, 0xac950000, 0xac820004,
+0x5600000b, 0x24100001, 0x8ee2723c, 0x3c040001, 0x24844c18, 0xafa00014,
+0xafa20010, 0x8ee6723c, 0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008,
+0x56000001, 0xaee00e0c, 0x8ee20184, 0x24420001, 0xaee20184, 0x8004040,
+0x8ee20184, 0x8f830120, 0x27623800, 0x24660020, 0xc2102b, 0x50400001,
+0x27663000, 0x8f820128, 0x10c20004, 0x0, 0x8f820124, 0x14c20007,
+0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0, 0x8004034,
0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c, 0x2462001c,
0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018, 0xac640000,
0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400034,
0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
0x1455001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
-0x10530007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
-0x8003f12, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0x10540007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x8004020, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400011, 0xac800000,
-0x8003f26, 0x0, 0x8ee24e20, 0x24420001, 0x50530003, 0x1021,
+0x8004034, 0x0, 0x8ee24e20, 0x24420001, 0x50540003, 0x1021,
0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
-0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x5600000b, 0x24100001,
-0x8ee2723c, 0x3c040001, 0x24844a08, 0xafa00014, 0xafa20010, 0x8ee6723c,
-0x8f470280, 0x3c050009, 0xc0023a7, 0x34a5f008, 0x56000001, 0xaee00e0c,
-0x8ee20184, 0x24420001, 0xaee20184, 0x8003f99, 0x8ee20184, 0x8f830120,
-0x27623800, 0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128,
-0x14c20007, 0x0, 0x8ee201a0, 0x8021, 0x24420001, 0xaee201a0,
-0x8003f8d, 0x8ee201a0, 0x8ee2723c, 0xac62001c, 0x8ee40498, 0x8ee5049c,
-0x2462001c, 0xac620008, 0x24020008, 0xa462000e, 0x24020011, 0xac620018,
-0xac640000, 0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10,
-0x14400034, 0x24100001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0x8c820000, 0x1455001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x10530007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8003f79, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400011,
-0xac800000, 0x8003f8d, 0x0, 0x8ee24e20, 0x24420001, 0x50530003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x1600000b,
-0x0, 0x8ee2723c, 0x3c040001, 0x24844a08, 0xafa00014, 0xafa20010,
-0x8ee6723c, 0x8f470280, 0x3c050009, 0xc0023a7, 0x34a5f008, 0x8ee20170,
-0x24420001, 0xaee20170, 0x8003fa0, 0x8ee20170, 0x24020001, 0xaee24e14,
-0x8f830128, 0x8f820124, 0x1462fd61, 0x0, 0x8fbf0030, 0x8fb5002c,
-0x8fb40028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008,
-0x27bd0038, 0x0, 0x0, 0x0, 0x27bdffe8, 0x27840208,
-0x27450200, 0x24060008, 0xafbf0014, 0xc00243e, 0xafb00010, 0x24040001,
-0x24100001, 0x2402241f, 0xaf900210, 0xaf900200, 0xaf800204, 0xaf820214,
-0x8f460248, 0x24030004, 0x3c020040, 0x3c010001, 0xac234de8, 0x3c010001,
-0xac234dec, 0x3c010001, 0xac204e8c, 0x3c010001, 0xac224de4, 0x3c010001,
-0xac234dec, 0xc004e2c, 0x24050004, 0xc0046b4, 0x0, 0x8ee20000,
-0x3c03feff, 0x3463fffd, 0x431024, 0xaee20000, 0x3c023c00, 0xaf82021c,
-0x3c010001, 0x370821, 0xac30839c, 0x8fbf0014, 0x8fb00010, 0x3e00008,
-0x27bd0018, 0x27bdffe0, 0x3c050008, 0x34a50400, 0xafbf0018, 0xafa00010,
-0xafa00014, 0x8f860200, 0x3c040001, 0x24844b50, 0xc0023a7, 0x3821,
-0x8ee20270, 0x24420001, 0xaee20270, 0x8ee20270, 0x8f830200, 0x3c023f00,
-0x621824, 0x8fbf0018, 0x3c020400, 0x3e00008, 0x27bd0020, 0x27bdffd8,
-0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f900220, 0x8ee20204, 0x3821,
-0x24420001, 0xaee20204, 0x8ee20204, 0x3c020300, 0x2021024, 0x10400027,
-0x3c110400, 0xc0041e7, 0x0, 0x3c020100, 0x2021024, 0x10400007,
-0x0, 0x8ee20208, 0x24420001, 0xaee20208, 0x8ee20208, 0x8004012,
-0x3c03fdff, 0x8ee2020c, 0x24420001, 0xaee2020c, 0x8ee2020c, 0x3c03fdff,
-0x3463ffff, 0x3c0808ff, 0x3508ffff, 0x8ee20000, 0x3c040001, 0x24844b5c,
-0x3c050008, 0x2003021, 0x431024, 0xaee20000, 0x8f820220, 0x3821,
-0x3c030300, 0x481024, 0x431025, 0xaf820220, 0xafa00010, 0xc0023a7,
-0xafa00014, 0x80041e2, 0x0, 0x2111024, 0x1040001f, 0x3c024000,
-0x8f830224, 0x24021402, 0x1462000b, 0x3c03fdff, 0x3c040001, 0x24844b68,
-0x3c050008, 0xafa00010, 0xafa00014, 0x8f860224, 0x34a5ffff, 0xc0023a7,
-0x3821, 0x3c03fdff, 0x8ee20000, 0x3463ffff, 0x2002021, 0x431024,
-0xc004b88, 0xaee20000, 0x8ee20210, 0x24420001, 0xaee20210, 0x8ee20210,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x80041e1, 0x511025,
-0x2021024, 0x10400142, 0x0, 0x8ee2021c, 0x24420001, 0xaee2021c,
-0x8ee2021c, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004,
-0xaf820220, 0x8f830054, 0x8f820054, 0x800405a, 0x24630002, 0x8f820054,
-0x621023, 0x2c420003, 0x1440fffc, 0x0, 0x8f8600e0, 0x8f8400e4,
+0x2e22021, 0x24020001, 0xac950000, 0xac820004, 0x1600000b, 0x0,
+0x8ee2723c, 0x3c040001, 0x24844c18, 0xafa00014, 0xafa20010, 0x8ee6723c,
+0x8f470280, 0x3c050009, 0xc002403, 0x34a5f008, 0x8ee20170, 0x24420001,
+0xaee20170, 0x8004047, 0x8ee20170, 0x24020001, 0xaee24e14, 0x8f830128,
+0x8f820124, 0x1462fd58, 0x0, 0x8fbf0030, 0x8fb5002c, 0x8fb40028,
+0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0038,
+0x27bdffe8, 0x27840208, 0x27450200, 0x24060008, 0xafbf0014, 0xc00249a,
+0xafb00010, 0x24040001, 0x24100001, 0x2402241f, 0xaf900210, 0xaf900200,
+0xaf800204, 0xaf820214, 0x8f460248, 0x24030004, 0x3c020040, 0x3c010001,
+0xac234ff8, 0x3c010001, 0xac234ffc, 0x3c010001, 0xac20509c, 0x3c010001,
+0xac224ff4, 0x3c010001, 0xac234ffc, 0xc004eac, 0x24050004, 0xc004734,
+0x0, 0x8ee20000, 0x3c03feff, 0x3463fffd, 0x431024, 0xaee20000,
+0x3c023c00, 0xaf82021c, 0x3c010001, 0x370821, 0xac30839c, 0x8fbf0014,
+0x8fb00010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c050008, 0x34a50400,
+0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200, 0x3c040001, 0x24844d60,
+0xc002403, 0x3821, 0x8ee20270, 0x24420001, 0xaee20270, 0x8ee20270,
+0x8f830200, 0x3c023f00, 0x621824, 0x8fbf0018, 0x3c020400, 0x3e00008,
+0x27bd0020, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0xafb00018, 0x8f900220,
+0x8ee20204, 0x3821, 0x24420001, 0xaee20204, 0x8ee20204, 0x3c020300,
+0x2021024, 0x10400027, 0x3c110400, 0xc00428b, 0x0, 0x3c020100,
+0x2021024, 0x10400007, 0x0, 0x8ee20208, 0x24420001, 0xaee20208,
+0x8ee20208, 0x80040b6, 0x3c03fdff, 0x8ee2020c, 0x24420001, 0xaee2020c,
+0x8ee2020c, 0x3c03fdff, 0x3463ffff, 0x3c0808ff, 0x3508ffff, 0x8ee20000,
+0x3c040001, 0x24844d6c, 0x3c050008, 0x2003021, 0x431024, 0xaee20000,
+0x8f820220, 0x3821, 0x3c030300, 0x481024, 0x431025, 0xaf820220,
+0xafa00010, 0xc002403, 0xafa00014, 0x8004286, 0x0, 0x2111024,
+0x1040001f, 0x3c024000, 0x8f830224, 0x24021402, 0x1462000b, 0x3c03fdff,
+0x3c040001, 0x24844d78, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860224,
+0x34a5ffff, 0xc002403, 0x3821, 0x3c03fdff, 0x8ee20000, 0x3463ffff,
+0x2002021, 0x431024, 0xc004c08, 0xaee20000, 0x8ee20210, 0x24420001,
+0xaee20210, 0x8ee20210, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024,
+0x8004285, 0x511025, 0x2021024, 0x10400142, 0x0, 0x8ee2021c,
+0x24420001, 0xaee2021c, 0x8ee2021c, 0x8f820220, 0x3c0308ff, 0x3463ffff,
+0x431024, 0x34420004, 0xaf820220, 0x8f830054, 0x8f820054, 0x80040fe,
+0x24630002, 0x8f820054, 0x621023, 0x2c420003, 0x1440fffc, 0x0,
+0x8f8600e0, 0x8f8400e4, 0x30c20007, 0x10400012, 0x0, 0x8f8300e4,
+0x2402fff8, 0xc21024, 0x1043000d, 0x0, 0x8f820054, 0x8f8300e0,
+0x14c30009, 0x24440050, 0x8f820054, 0x821023, 0x2c420051, 0x10400004,
+0x0, 0x8f8200e0, 0x10c2fff9, 0x0, 0x8f820220, 0x3c0308ff,
+0x3463fffd, 0x431024, 0xaf820220, 0x8f8600e0, 0x30c20007, 0x10400003,
+0x2402fff8, 0xc23024, 0xaf8600e0, 0x8f8300c4, 0x3c02001f, 0x3442ffff,
+0x24680008, 0x48102b, 0x10400003, 0x3c02fff5, 0x34421000, 0x1024021,
+0x8f8b00c8, 0x8f850120, 0x8f840124, 0x8004135, 0x6021, 0x27623800,
+0x82102b, 0x50400001, 0x27643000, 0x10a40010, 0x318200ff, 0x8c820018,
+0x38430007, 0x2c630001, 0x3842000b, 0x2c420001, 0x621825, 0x5060fff3,
+0x24840020, 0x8ee20230, 0x240c0001, 0x24420001, 0xaee20230, 0x8ee20230,
+0x8c8b0008, 0x318200ff, 0x14400065, 0x0, 0x3c020001, 0x571021,
+0x904283b0, 0x14400060, 0x0, 0x8f8400e4, 0xc41023, 0x218c3,
+0x4620001, 0x24630200, 0x8f8900c4, 0x10600005, 0x24020001, 0x10620009,
+0x0, 0x8004177, 0x0, 0x8ee20220, 0x1205821, 0x24420001,
+0xaee20220, 0x80041ac, 0x8ee20220, 0x8ee20224, 0x3c05000a, 0x24420001,
+0xaee20224, 0x8c8b0000, 0x34a5f000, 0x8ee20224, 0x12b1823, 0xa3102b,
+0x54400001, 0x651821, 0x2c62233f, 0x14400040, 0x0, 0x8f8200e8,
+0x24420008, 0xaf8200e8, 0x8f8200e8, 0x8f8200e4, 0x1205821, 0x24420008,
+0xaf8200e4, 0x80041ac, 0x8f8200e4, 0x8ee20228, 0x3c03000a, 0x24420001,
+0xaee20228, 0x8c840000, 0x3463f000, 0x8ee20228, 0x883823, 0x67102b,
+0x54400001, 0xe33821, 0x3c020003, 0x34420d40, 0x47102b, 0x10400003,
+0x0, 0x80041ac, 0x805821, 0x8f8200e4, 0x24440008, 0xaf8400e4,
+0x8f8400e4, 0x10860018, 0x3c05000a, 0x34a5f000, 0x3c0a0003, 0x354a0d40,
+0x8ee2007c, 0x24420001, 0xaee2007c, 0x8c830000, 0x8ee2007c, 0x683823,
+0xa7102b, 0x54400001, 0xe53821, 0x147102b, 0x54400007, 0x605821,
+0x8f8200e4, 0x24440008, 0xaf8400e4, 0x8f8400e4, 0x1486ffef, 0x0,
+0x14860005, 0x0, 0x1205821, 0xaf8600e4, 0x80041ac, 0xaf8600e8,
+0xaf8400e4, 0xaf8400e8, 0x8f8200c8, 0x3c03000a, 0x3463f000, 0x483823,
+0x67102b, 0x54400001, 0xe33821, 0x3c020003, 0x34420d3f, 0x47102b,
+0x54400007, 0x6021, 0x1683823, 0x67102b, 0x54400003, 0xe33821,
+0x80041bf, 0x3c020003, 0x3c020003, 0x34420d3f, 0x47102b, 0x14400016,
+0x318200ff, 0x14400006, 0x0, 0x3c020001, 0x571021, 0x904283b0,
+0x1040000f, 0x0, 0x8ee2022c, 0x3c04fdff, 0x8ee30000, 0x3484ffff,
+0x24420001, 0xaee2022c, 0x8ee2022c, 0x24020001, 0x641824, 0x3c010001,
+0x370821, 0xa02283a8, 0x800421c, 0xaee30000, 0xaf8b00c8, 0x8f8300c8,
+0x8f8200c4, 0x3c04000a, 0x3484f000, 0x623823, 0x87102b, 0x54400001,
+0xe43821, 0x3c020003, 0x34420d40, 0x47102b, 0x2ce30001, 0x431025,
+0x10400008, 0x0, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024,
+0x3c034000, 0x431025, 0xaf820220, 0x8f8600e0, 0x8f8400e4, 0x10c4002a,
+0x0, 0x8ee2007c, 0x24420001, 0xaee2007c, 0x8ee2007c, 0x24c2fff8,
+0xaf8200e0, 0x3c020001, 0x8c427140, 0x3c030008, 0x8f8600e0, 0x431024,
+0x1040001d, 0x0, 0x10c4001b, 0x240dfff8, 0x3c0a000a, 0x354af000,
+0x3c0c0080, 0x24850008, 0x27622800, 0x50a20001, 0x27651800, 0x8c880004,
+0x8c820000, 0x8ca90000, 0x3103ffff, 0x431021, 0x4d1024, 0x24430010,
+0x6b102b, 0x54400001, 0x6a1821, 0x12b102b, 0x54400001, 0x12a4821,
+0x10690002, 0x10c1025, 0xac820004, 0xa02021, 0x14c4ffeb, 0x24850008,
+0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420002, 0xaf820220,
+0x8f830054, 0x8f820054, 0x8004227, 0x24630001, 0x8f820054, 0x621023,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb,
+0x431024, 0xaf820220, 0x6010055, 0x0, 0x8ee20218, 0x24420001,
+0xaee20218, 0x8ee20218, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024,
+0x34420004, 0xaf820220, 0x8f830054, 0x8f820054, 0x8004241, 0x24630002,
+0x8f820054, 0x621023, 0x2c420003, 0x1440fffc, 0x0, 0x8f8600e0,
0x30c20007, 0x10400012, 0x0, 0x8f8300e4, 0x2402fff8, 0xc21024,
-0x1043000d, 0x0, 0x8f820054, 0x8f8300e0, 0x14c30009, 0x24440050,
-0x8f820054, 0x821023, 0x2c420051, 0x10400004, 0x0, 0x8f8200e0,
+0x1043000d, 0x0, 0x8f820054, 0x8f8300e0, 0x14c30009, 0x24440032,
+0x8f820054, 0x821023, 0x2c420033, 0x10400004, 0x0, 0x8f8200e0,
0x10c2fff9, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffd, 0x431024,
0xaf820220, 0x8f8600e0, 0x30c20007, 0x10400003, 0x2402fff8, 0xc23024,
-0xaf8600e0, 0x8f8300c4, 0x3c02001f, 0x3442ffff, 0x24680008, 0x48102b,
-0x10400003, 0x3c02fff5, 0x34421000, 0x1024021, 0x8f8b00c8, 0x8f850120,
-0x8f840124, 0x8004091, 0x6021, 0x27623800, 0x82102b, 0x50400001,
-0x27643000, 0x10a40010, 0x318200ff, 0x8c820018, 0x38430007, 0x2c630001,
-0x3842000b, 0x2c420001, 0x621825, 0x5060fff3, 0x24840020, 0x8ee20230,
-0x240c0001, 0x24420001, 0xaee20230, 0x8ee20230, 0x8c8b0008, 0x318200ff,
-0x14400065, 0x0, 0x3c020001, 0x571021, 0x904283b0, 0x14400060,
-0x0, 0x8f8400e4, 0xc41023, 0x218c3, 0x4620001, 0x24630200,
-0x8f8900c4, 0x10600005, 0x24020001, 0x10620009, 0x0, 0x80040d3,
-0x0, 0x8ee20220, 0x1205821, 0x24420001, 0xaee20220, 0x8004108,
-0x8ee20220, 0x8ee20224, 0x3c05000a, 0x24420001, 0xaee20224, 0x8c8b0000,
-0x34a5f000, 0x8ee20224, 0x12b1823, 0xa3102b, 0x54400001, 0x651821,
-0x2c62233f, 0x14400040, 0x0, 0x8f8200e8, 0x24420008, 0xaf8200e8,
-0x8f8200e8, 0x8f8200e4, 0x1205821, 0x24420008, 0xaf8200e4, 0x8004108,
-0x8f8200e4, 0x8ee20228, 0x3c03000a, 0x24420001, 0xaee20228, 0x8c840000,
-0x3463f000, 0x8ee20228, 0x883823, 0x67102b, 0x54400001, 0xe33821,
-0x3c020003, 0x34420d40, 0x47102b, 0x10400003, 0x0, 0x8004108,
-0x805821, 0x8f8200e4, 0x24440008, 0xaf8400e4, 0x8f8400e4, 0x10860018,
-0x3c05000a, 0x34a5f000, 0x3c0a0003, 0x354a0d40, 0x8ee2007c, 0x24420001,
-0xaee2007c, 0x8c830000, 0x8ee2007c, 0x683823, 0xa7102b, 0x54400001,
-0xe53821, 0x147102b, 0x54400007, 0x605821, 0x8f8200e4, 0x24440008,
-0xaf8400e4, 0x8f8400e4, 0x1486ffef, 0x0, 0x14860005, 0x0,
-0x1205821, 0xaf8600e4, 0x8004108, 0xaf8600e8, 0xaf8400e4, 0xaf8400e8,
-0x8f8200c8, 0x3c03000a, 0x3463f000, 0x483823, 0x67102b, 0x54400001,
-0xe33821, 0x3c020003, 0x34420d3f, 0x47102b, 0x54400007, 0x6021,
-0x1683823, 0x67102b, 0x54400003, 0xe33821, 0x800411b, 0x3c020003,
-0x3c020003, 0x34420d3f, 0x47102b, 0x14400016, 0x318200ff, 0x14400006,
-0x0, 0x3c020001, 0x571021, 0x904283b0, 0x1040000f, 0x0,
-0x8ee2022c, 0x3c04fdff, 0x8ee30000, 0x3484ffff, 0x24420001, 0xaee2022c,
-0x8ee2022c, 0x24020001, 0x641824, 0x3c010001, 0x370821, 0xa02283a8,
-0x8004178, 0xaee30000, 0xaf8b00c8, 0x8f8300c8, 0x8f8200c4, 0x3c04000a,
-0x3484f000, 0x623823, 0x87102b, 0x54400001, 0xe43821, 0x3c020003,
-0x34420d40, 0x47102b, 0x2ce30001, 0x431025, 0x10400008, 0x0,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x3c034000, 0x431025,
-0xaf820220, 0x8f8600e0, 0x8f8400e4, 0x10c4002a, 0x0, 0x8ee2007c,
-0x24420001, 0xaee2007c, 0x8ee2007c, 0x24c2fff8, 0xaf8200e0, 0x3c020001,
-0x8c426f30, 0x3c030008, 0x8f8600e0, 0x431024, 0x1040001d, 0x0,
-0x10c4001b, 0x240dfff8, 0x3c0a000a, 0x354af000, 0x3c0c0080, 0x24850008,
-0x27622800, 0x50a20001, 0x27651800, 0x8c880004, 0x8c820000, 0x8ca90000,
-0x3103ffff, 0x431021, 0x4d1024, 0x24430010, 0x6b102b, 0x54400001,
-0x6a1821, 0x12b102b, 0x54400001, 0x12a4821, 0x10690002, 0x10c1025,
-0xac820004, 0xa02021, 0x14c4ffeb, 0x24850008, 0x8f820220, 0x3c0308ff,
-0x3463ffff, 0x431024, 0x34420002, 0xaf820220, 0x8f830054, 0x8f820054,
-0x8004183, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
-0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220,
-0x6010055, 0x0, 0x8ee20218, 0x24420001, 0xaee20218, 0x8ee20218,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004, 0xaf820220,
-0x8f830054, 0x8f820054, 0x800419d, 0x24630002, 0x8f820054, 0x621023,
-0x2c420003, 0x1440fffc, 0x0, 0x8f8600e0, 0x30c20007, 0x10400012,
-0x0, 0x8f8300e4, 0x2402fff8, 0xc21024, 0x1043000d, 0x0,
-0x8f820054, 0x8f8300e0, 0x14c30009, 0x24440032, 0x8f820054, 0x821023,
-0x2c420033, 0x10400004, 0x0, 0x8f8200e0, 0x10c2fff9, 0x0,
-0x8f820220, 0x3c0308ff, 0x3463fffd, 0x431024, 0xaf820220, 0x8f8600e0,
-0x30c20007, 0x10400003, 0x2402fff8, 0xc23024, 0xaf8600e0, 0x240301f5,
-0x8f8200e8, 0x673823, 0x718c0, 0x431021, 0xaf8200e8, 0x8f8200e8,
-0xaf8200e4, 0x8ee2007c, 0x3c0408ff, 0x3484ffff, 0x471021, 0xaee2007c,
-0x8f820220, 0x3c038000, 0x34630002, 0x441024, 0x431025, 0xaf820220,
-0x8f830054, 0x8f820054, 0x80041d9, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb,
-0x431024, 0xaf820220, 0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008,
-0x27bd0028, 0x3c020001, 0x8c424dfc, 0x27bdffd8, 0x10400012, 0xafbf0020,
-0x3c040001, 0x24844b74, 0x3c050008, 0x24020001, 0x3c010001, 0x370821,
-0xac22839c, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50498, 0x3c010001,
-0xac204dfc, 0x3c010001, 0xac224df0, 0xc0023a7, 0x3821, 0x8f420268,
-0x3c037fff, 0x3463ffff, 0x431024, 0xaf420268, 0x8ee204c0, 0x8ee404c4,
-0x2403fffe, 0x431024, 0x30840002, 0x10800118, 0xaee204c0, 0x8ee204c4,
-0x2403fffd, 0x431024, 0xaee204c4, 0x8f820044, 0x3c030600, 0x34632000,
-0x34420020, 0xaf820044, 0xafa30018, 0x8ee205f8, 0x8f430228, 0x24420001,
-0x304a00ff, 0x514300f8, 0xafa00010, 0x8ee205f8, 0x210c0, 0x571021,
-0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600, 0x8f830054, 0x8f820054,
-0x24690032, 0x1221023, 0x2c420033, 0x10400067, 0x5821, 0x24180008,
-0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001, 0x8f870120, 0x27623800,
-0x24e80020, 0x102102b, 0x50400001, 0x27683000, 0x8f820128, 0x15020007,
-0x1021, 0x8ee201a0, 0x2821, 0x24420001, 0xaee201a0, 0x8004286,
-0x8ee201a0, 0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434,
-0xa32821, 0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004,
-0x8ee205f8, 0xa4f8000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc,
-0x2e21021, 0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10,
-0x14400033, 0x24050001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021,
-0x8c820000, 0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b,
-0x0, 0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20,
-0x24420001, 0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005,
-0x0, 0x8004273, 0x0, 0x14600005, 0x0, 0x8f820128,
-0x24420020, 0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010,
-0xac800000, 0x8004286, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003,
-0x1021, 0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0,
-0x24425028, 0x2e22021, 0xac8d0000, 0xac8e0004, 0x54a00006, 0x240b0001,
-0x8f820054, 0x1221023, 0x2c420033, 0x1440ffa0, 0x0, 0x316300ff,
-0x24020001, 0x54620076, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054,
-0x24690032, 0x1221023, 0x2c420033, 0x1040005e, 0x5821, 0x240d0008,
-0x240c0011, 0x24080012, 0x24070040, 0x240a0001, 0x8f830120, 0x27623800,
-0x24660020, 0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x14c20007,
-0x0, 0x8ee201a0, 0x2821, 0x24420001, 0xaee201a0, 0x80042ef,
-0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490, 0x8ee50494, 0x2462001c,
-0xac620008, 0xa46d000e, 0xac6c0018, 0xac640000, 0xac650004, 0x8ee204b4,
-0xac620010, 0xaf860120, 0x92e24e10, 0x14400033, 0x24050001, 0x8ee24e20,
-0x210c0, 0x24425028, 0x2e22021, 0x8c820000, 0x1448001f, 0x0,
-0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0, 0x8c820004, 0x24420001,
-0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001, 0x10470007, 0x0,
-0x8ee24e24, 0x24420001, 0x10620005, 0x0, 0x80042dc, 0x0,
-0x14600005, 0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128,
-0x8c820004, 0x2c420011, 0x50400010, 0xac800000, 0x80042ef, 0x0,
-0x8ee24e20, 0x24420001, 0x50470003, 0x1021, 0x8ee24e20, 0x24420001,
-0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0xac880000,
-0xac8a0004, 0x54a00006, 0x240b0001, 0x8f820054, 0x1221023, 0x2c420033,
-0x1440ffa9, 0x0, 0x316300ff, 0x24020001, 0x54620003, 0xafa00010,
-0x800431c, 0x0, 0x3c040001, 0x24844b80, 0xafa00014, 0x8f860120,
-0x8f870124, 0x3c050009, 0xc0023a7, 0x34a5f011, 0x800431c, 0x0,
-0x3c040001, 0x24844b8c, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
-0xc0023a7, 0x34a5f010, 0x800431c, 0x0, 0x3c040001, 0x24844b98,
-0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009, 0xc0023a7, 0x34a5f00f,
-0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8, 0x8ee20158, 0x24420001,
-0xaee20158, 0x8ee20158, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3c020001,
-0x8c424dfc, 0x27bdffe0, 0x1440000d, 0xafbf0018, 0x3c040001, 0x24844ba4,
-0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50499, 0x24020001,
-0x3c010001, 0xac224dfc, 0xc0023a7, 0x3821, 0x8ee204c0, 0x3c030001,
-0x771821, 0x946383a2, 0x34420001, 0x10600007, 0xaee204c0, 0x8f820220,
-0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x24040001,
-0xc004f33, 0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008, 0x27bd0020,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x3c120001, 0x26520f00, 0x3c140001, 0x8e944d70,
-0x3c100001, 0x26100e20, 0x3c15c000, 0x36b50060, 0x8e8a0000, 0x8eb30000,
-0x26a400b, 0x248000a, 0x200f821, 0x0, 0xd, 0x0,
-0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0xaf8600e0, 0x240301f5, 0x8f8200e8, 0x673823, 0x718c0, 0x431021,
+0xaf8200e8, 0x8f8200e8, 0xaf8200e4, 0x8ee2007c, 0x3c0408ff, 0x3484ffff,
+0x471021, 0xaee2007c, 0x8f820220, 0x3c038000, 0x34630002, 0x441024,
+0x431025, 0xaf820220, 0x8f830054, 0x8f820054, 0x800427d, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820220,
+0x3c0308ff, 0x3463fffb, 0x431024, 0xaf820220, 0x8fbf0020, 0x8fb1001c,
+0x8fb00018, 0x3e00008, 0x27bd0028, 0x3c020001, 0x8c42500c, 0x27bdffd8,
+0x10400012, 0xafbf0020, 0x3c040001, 0x24844d84, 0x3c050008, 0x24020001,
+0x3c010001, 0x370821, 0xac22839c, 0xafa00010, 0xafa00014, 0x8f860220,
+0x34a50498, 0x3c010001, 0xac20500c, 0x3c010001, 0xac225000, 0xc002403,
+0x3821, 0x8f420268, 0x3c037fff, 0x3463ffff, 0x431024, 0xaf420268,
+0x8ee204c0, 0x8ee404c4, 0x2403fffe, 0x431024, 0x30840002, 0x1080011e,
+0xaee204c0, 0x8ee204c4, 0x2403fffd, 0x431024, 0xaee204c4, 0x8f820044,
+0x3c030600, 0x34632000, 0x34420020, 0xaf820044, 0xafa30018, 0x8ee205f8,
+0x8f430228, 0x24420001, 0x304a00ff, 0x514300fe, 0xafa00010, 0x8ee205f8,
+0x210c0, 0x571021, 0x8fa30018, 0x8fa4001c, 0xac4305fc, 0xac440600,
+0x8f830054, 0x8f820054, 0x24690032, 0x1221023, 0x2c420033, 0x1040006a,
+0x5821, 0x24180008, 0x240f000d, 0x240d0007, 0x240c0040, 0x240e0001,
+0x8f870120, 0x27623800, 0x24e80020, 0x102102b, 0x50400001, 0x27683000,
+0x8f820128, 0x11020004, 0x0, 0x8f820124, 0x15020007, 0x1021,
+0x8ee201a0, 0x2821, 0x24420001, 0xaee201a0, 0x800432d, 0x8ee201a0,
+0x8ee405f8, 0x420c0, 0x801821, 0x8ee40430, 0x8ee50434, 0xa32821,
+0xa3302b, 0x822021, 0x862021, 0xace40000, 0xace50004, 0x8ee205f8,
+0xa4f8000e, 0xacef0018, 0xacea001c, 0x210c0, 0x244205fc, 0x2e21021,
+0xace20008, 0x8ee204b4, 0xace20010, 0xaf880120, 0x92e24e10, 0x14400033,
+0x24050001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
+0x144d001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x104c0007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x800431a, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
+0x800432d, 0x0, 0x8ee24e20, 0x24420001, 0x504c0003, 0x1021,
+0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0xac8d0000, 0xac8e0004, 0x54a00006, 0x240b0001, 0x8f820054,
+0x1221023, 0x2c420033, 0x1440ff9d, 0x0, 0x316300ff, 0x24020001,
+0x54620079, 0xafa00010, 0xaeea05f8, 0x8f830054, 0x8f820054, 0x24690032,
+0x1221023, 0x2c420033, 0x10400061, 0x5821, 0x240d0008, 0x240c0011,
+0x24080012, 0x24070040, 0x240a0001, 0x8f830120, 0x27623800, 0x24660020,
+0xc2102b, 0x50400001, 0x27663000, 0x8f820128, 0x10c20004, 0x0,
+0x8f820124, 0x14c20007, 0x0, 0x8ee201a0, 0x2821, 0x24420001,
+0xaee201a0, 0x8004399, 0x8ee201a0, 0x8ee205f8, 0xac62001c, 0x8ee40490,
+0x8ee50494, 0x2462001c, 0xac620008, 0xa46d000e, 0xac6c0018, 0xac640000,
+0xac650004, 0x8ee204b4, 0xac620010, 0xaf860120, 0x92e24e10, 0x14400033,
+0x24050001, 0x8ee24e20, 0x210c0, 0x24425028, 0x2e22021, 0x8c820000,
+0x1448001f, 0x0, 0x8ee34e20, 0x8ee24e24, 0x1062001b, 0x0,
+0x8c820004, 0x24420001, 0xac820004, 0x8ee24e24, 0x8ee34e20, 0x24420001,
+0x10470007, 0x0, 0x8ee24e24, 0x24420001, 0x10620005, 0x0,
+0x8004386, 0x0, 0x14600005, 0x0, 0x8f820128, 0x24420020,
+0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400010, 0xac800000,
+0x8004399, 0x0, 0x8ee24e20, 0x24420001, 0x50470003, 0x1021,
+0x8ee24e20, 0x24420001, 0xaee24e20, 0x8ee24e20, 0x210c0, 0x24425028,
+0x2e22021, 0xac880000, 0xac8a0004, 0x54a00006, 0x240b0001, 0x8f820054,
+0x1221023, 0x2c420033, 0x1440ffa6, 0x0, 0x316300ff, 0x24020001,
+0x54620003, 0xafa00010, 0x80043c6, 0x0, 0x3c040001, 0x24844d90,
+0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0xc002403, 0x34a5f011,
+0x80043c6, 0x0, 0x3c040001, 0x24844d9c, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0xc002403, 0x34a5f010, 0x80043c6, 0x0,
+0x3c040001, 0x24844da8, 0xafa00014, 0x8ee605f8, 0x8f470228, 0x3c050009,
+0xc002403, 0x34a5f00f, 0x8ee201a8, 0x24420001, 0xaee201a8, 0x8ee201a8,
+0x8ee20158, 0x24420001, 0xaee20158, 0x8ee20158, 0x8fbf0020, 0x3e00008,
+0x27bd0028, 0x3c020001, 0x8c42500c, 0x27bdffe0, 0x1440000d, 0xafbf0018,
+0x3c040001, 0x24844db4, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220,
+0x34a50499, 0x24020001, 0x3c010001, 0xac22500c, 0xc002403, 0x3821,
+0x8ee204c0, 0x3c030001, 0x771821, 0x946383a2, 0x34420001, 0x10600007,
+0xaee204c0, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008,
+0xaf820220, 0x24040001, 0xc004fb3, 0x24050004, 0xaf420268, 0x8fbf0018,
+0x3e00008, 0x27bd0020, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x0, 0x0, 0x3c120001, 0x26521100,
+0x3c140001, 0x8e944f80, 0x3c100001, 0x26101020, 0x3c15c000, 0x36b50060,
+0x8e8a0000, 0x8eb30000, 0x26a400b, 0x248000a, 0x200f821, 0x0,
+0xd, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x80014c4, 0x0, 0x80014c6, 0x3c0a0001, 0x80014c6, 0x3c0a0002,
-0x80014c6, 0x0, 0x800244a, 0x0, 0x80014c6, 0x3c0a0003,
-0x80014c6, 0x3c0a0004, 0x8002ef8, 0x0, 0x80014c6, 0x3c0a0005,
-0x8003c3d, 0x0, 0x8003bbe, 0x0, 0x80014c6, 0x3c0a0006,
-0x80014c6, 0x3c0a0007, 0x80014c6, 0x0, 0x80014c6, 0x0,
-0x80014c6, 0x0, 0x80029f8, 0x0, 0x80014c6, 0x3c0a000b,
-0x80014c6, 0x3c0a000c, 0x80014c6, 0x3c0a000d, 0x800231c, 0x0,
-0x80022d9, 0x0, 0x80014c6, 0x3c0a000e, 0x8001b08, 0x0,
-0x8002448, 0x0, 0x80014c6, 0x3c0a000f, 0x8003ff3, 0x0,
-0x8003fdd, 0x0, 0x80014c6, 0x3c0a0010, 0x80014da, 0x0,
-0x80014c6, 0x3c0a0011, 0x80014c6, 0x3c0a0012, 0x80014c6, 0x3c0a0013,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+0x0, 0x0, 0x80014d6, 0x0, 0x80014d8, 0x3c0a0001,
+0x80014d8, 0x3c0a0002, 0x80014d8, 0x0, 0x80024a6, 0x0,
+0x80014d8, 0x3c0a0003, 0x80014d8, 0x3c0a0004, 0x8002f7c, 0x0,
+0x80014d8, 0x3c0a0005, 0x8003cd8, 0x0, 0x8003c56, 0x0,
+0x80014d8, 0x3c0a0006, 0x80014d8, 0x3c0a0007, 0x80014d8, 0x0,
+0x80014d8, 0x0, 0x80014d8, 0x0, 0x8002a75, 0x0,
+0x80014d8, 0x3c0a000b, 0x80014d8, 0x3c0a000c, 0x80014d8, 0x3c0a000d,
+0x8002378, 0x0, 0x8002335, 0x0, 0x80014d8, 0x3c0a000e,
+0x8001b38, 0x0, 0x80024a4, 0x0, 0x80014d8, 0x3c0a000f,
+0x8004097, 0x0, 0x8004081, 0x0, 0x80014d8, 0x3c0a0010,
+0x80014ee, 0x0, 0x80014d8, 0x3c0a0011, 0x80014d8, 0x3c0a0012,
+0x80014d8, 0x3c0a0013, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
@@ -2243,541 +2264,542 @@ u32 tigonFwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x0, 0x0, 0x3c030001, 0x34633800, 0x24050080, 0x2404001f,
-0x2406ffff, 0x24020001, 0xaf80021c, 0xaf820200, 0xaf820220, 0x3631021,
-0xaf8200c0, 0x3631021, 0xaf8200c4, 0x3631021, 0xaf8200c8, 0x27623800,
-0xaf8200d0, 0x27623800, 0xaf8200d4, 0x27623800, 0xaf8200d8, 0x27621800,
-0xaf8200e0, 0x27621800, 0xaf8200e4, 0x27621800, 0xaf8200e8, 0x27621000,
-0xaf8200f0, 0x27621000, 0xaf8200f4, 0x27621000, 0xaf8200f8, 0xaca00000,
-0x2484ffff, 0x1486fffd, 0x24a50004, 0x8f830040, 0x3c02f000, 0x621824,
-0x3c025000, 0x1062000c, 0x43102b, 0x14400006, 0x3c026000, 0x3c024000,
-0x10620008, 0x24020800, 0x8004479, 0x0, 0x10620004, 0x24020800,
-0x8004479, 0x0, 0x24020700, 0x3c010001, 0xac224e00, 0x3e00008,
-0x0, 0x27bdffd0, 0xafbf0028, 0x3c010001, 0xc004b65, 0xac204de8,
-0x24040001, 0x2821, 0x27a60020, 0x34028000, 0xc004782, 0xa7a20020,
-0x8f830054, 0x8f820054, 0x800448b, 0x24630064, 0x8f820054, 0x621023,
-0x2c420065, 0x1440fffc, 0x24040001, 0x24050001, 0xc004740, 0x27a60020,
-0x8f830054, 0x8f820054, 0x8004497, 0x24630064, 0x8f820054, 0x621023,
-0x2c420065, 0x1440fffc, 0x24040001, 0x24050001, 0xc004740, 0x27a60020,
-0x8f830054, 0x8f820054, 0x80044a3, 0x24630064, 0x8f820054, 0x621023,
-0x2c420065, 0x1440fffc, 0x24040001, 0x24050002, 0xc004740, 0x27a60018,
-0x8f830054, 0x8f820054, 0x80044af, 0x24630064, 0x8f820054, 0x621023,
-0x2c420065, 0x1440fffc, 0x24040001, 0x24050003, 0xc004740, 0x27a6001a,
-0x97a20020, 0x10400022, 0x24030001, 0x3c020001, 0x8c424de8, 0x97a30018,
-0x34420001, 0x3c010001, 0xac224de8, 0x24020015, 0x14620008, 0x3402f423,
-0x97a3001a, 0x14620005, 0x24020003, 0x3c010001, 0xac224e9c, 0x80044e2,
-0x3c08fff0, 0x97a30018, 0x24027810, 0x1462000a, 0x24020002, 0x97a3001a,
-0x24020001, 0x14620006, 0x24020002, 0x24020004, 0x3c010001, 0xac224e9c,
-0x80044e2, 0x3c08fff0, 0x3c010001, 0xac224e9c, 0x80044e2, 0x3c08fff0,
-0x3c020001, 0x8c424de8, 0x3c010001, 0xac234e9c, 0x34420004, 0x3c010001,
-0xac224de8, 0x3c08fff0, 0x3508bdc0, 0x8f830054, 0x97a60018, 0x3c070001,
-0x8ce74e9c, 0x3c040001, 0x24844c10, 0x24020001, 0x3c010001, 0xac224df0,
-0xafa60010, 0x3c060001, 0x8cc64de8, 0x97a2001a, 0x3c05000d, 0x34a50100,
-0x3c010001, 0xac204dec, 0x681821, 0x3c010001, 0xac234e94, 0xc0023a7,
-0xafa20014, 0x8fbf0028, 0x3e00008, 0x27bd0030, 0x27bdffe8, 0x24070004,
-0x3c040001, 0x8c844dec, 0x3021, 0x24020001, 0x1482000a, 0xafbf0010,
-0x3c020001, 0x8c426f3c, 0x3c050004, 0x30428000, 0x1040000c, 0x34a593e0,
-0x3c05000f, 0x8004515, 0x34a54240, 0x3c020001, 0x8c426f3c, 0x3c05000f,
-0x30428000, 0x10400003, 0x34a54240, 0x3c05001e, 0x34a58480, 0x3c020001,
-0x8c424e94, 0x8f830054, 0x451021, 0x431023, 0x45102b, 0x1440002e,
-0x0, 0x3c020001, 0x8c424df4, 0x1440002a, 0x2cc20001, 0x7182b,
-0x431024, 0x1040001d, 0x0, 0x3c090001, 0x8d294de8, 0x240b0001,
-0x3c054000, 0x3c080001, 0x25086f3c, 0x250afffc, 0x42042, 0x14800002,
-0x24e7ffff, 0x24040008, 0x891024, 0x5040000b, 0x2cc20001, 0x148b0004,
-0x0, 0x8d020000, 0x800453a, 0x451024, 0x8d420000, 0x451024,
-0x54400001, 0x24060001, 0x2cc20001, 0x7182b, 0x431024, 0x5440ffed,
-0x42042, 0x3c010001, 0x10c00024, 0xac244dec, 0x8f830054, 0x24020001,
-0x3c010001, 0xac224df0, 0x3c010001, 0xac234e94, 0x3c020001, 0x8c424df0,
-0x10400006, 0x24020001, 0x3c010001, 0xac204df0, 0x3c010001, 0x370821,
-0xac22839c, 0x3c030001, 0x771821, 0x8c63839c, 0x24020008, 0x10620005,
-0x24020001, 0xc00456a, 0x0, 0x8004567, 0x0, 0x3c030001,
-0x8c634dec, 0x10620007, 0x2402000e, 0x3c030001, 0x8c636eb0, 0x10620003,
-0x0, 0xc004b88, 0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018,
-0x27bdffe0, 0x3c02fdff, 0xafbf0018, 0x8ee30000, 0x3c050001, 0x8ca54dec,
-0x3c040001, 0x8c844e04, 0x3442ffff, 0x621824, 0x14a40008, 0xaee30000,
-0x3c030001, 0x771821, 0x8c63839c, 0x3c020001, 0x8c424e08, 0x10620008,
-0x0, 0x3c020001, 0x571021, 0x8c42839c, 0x3c010001, 0xac254e04,
-0x3c010001, 0xac224e08, 0x3c030001, 0x8c634dec, 0x24020002, 0x10620126,
-0x2c620003, 0x10400005, 0x24020001, 0x10620008, 0x0, 0x80046ae,
-0x0, 0x24020004, 0x1062007c, 0x24020001, 0x80046af, 0x0,
-0x3c020001, 0x571021, 0x8c42839c, 0x2443ffff, 0x2c620008, 0x10400117,
-0x31080, 0x3c010001, 0x220821, 0x8c224c28, 0x400008, 0x0,
-0xc0046b4, 0x0, 0x3c020001, 0x8c424df8, 0x3c010001, 0xac204d80,
-0x104000c5, 0x24020002, 0x3c010001, 0x370821, 0xac22839c, 0x3c010001,
-0x80046b1, 0xac204df8, 0xc0047c3, 0x0, 0x3c030001, 0x8c634e10,
-0x24020011, 0x146200fd, 0x24020003, 0x8004631, 0x0, 0x3c050001,
-0x8ca54dec, 0x3c060001, 0x8cc66f3c, 0xc004e2c, 0x24040001, 0x24020005,
-0x3c010001, 0xac204df8, 0x3c010001, 0x370821, 0x80046b1, 0xac22839c,
-0x3c040001, 0x24844c1c, 0x3c05000f, 0x34a50100, 0x3021, 0x3821,
-0xafa00010, 0xc0023a7, 0xafa00014, 0x80046b1, 0x0, 0x8f820220,
-0x3c03f700, 0x431025, 0x8004658, 0xaf820220, 0x8f820220, 0x3c030004,
-0x431024, 0x14400095, 0x24020007, 0x8f830054, 0x3c020001, 0x8c424e90,
-0x2463d8f0, 0x431023, 0x2c422710, 0x144000d1, 0x24020001, 0x80046af,
-0x0, 0x3c050001, 0x8ca54dec, 0xc004f33, 0x24040001, 0xc004ff8,
-0x24040001, 0x3c030001, 0x8c636f34, 0x46100c3, 0x24020001, 0x3c020008,
-0x621024, 0x10400006, 0x0, 0x8f820214, 0x3c03ffff, 0x431024,
-0x80045fa, 0x3442251f, 0x8f820214, 0x3c03ffff, 0x431024, 0x3442241f,
-0xaf820214, 0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, 0x8f820220,
-0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 0x34420002, 0xaf820220,
-0x24020008, 0x3c010001, 0x370821, 0xc004323, 0xac22839c, 0x80046b1,
-0x0, 0x3c020001, 0x571021, 0x8c42839c, 0x2443ffff, 0x2c620008,
-0x1040009e, 0x31080, 0x3c010001, 0x220821, 0x8c224c48, 0x400008,
-0x0, 0xc0041e7, 0x0, 0x3c010001, 0xac204df0, 0xaf800204,
-0x3c010001, 0xc0046b4, 0xac206f00, 0x8f820044, 0x34428080, 0xaf820044,
-0x8f830054, 0x3c010001, 0xac204d80, 0x800465a, 0x24020002, 0x8f830054,
-0x3c020001, 0x8c424e90, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400081,
-0x24020003, 0x3c010001, 0x370821, 0x80046b1, 0xac22839c, 0x3c020001,
-0x8c426f38, 0x30424000, 0x10400005, 0x0, 0x8f820044, 0x3c03ffff,
-0x8004640, 0x34637fff, 0x8f820044, 0x2403ff7f, 0x431024, 0xaf820044,
-0x8f830054, 0x800465a, 0x24020004, 0x8f830054, 0x3c020001, 0x8c424e90,
-0x2463d8f0, 0x431023, 0x2c422710, 0x14400065, 0x24020005, 0x3c010001,
-0x370821, 0x80046b1, 0xac22839c, 0x8f820220, 0x3c03f700, 0x431025,
-0xaf820220, 0xaf800204, 0x3c010001, 0xac206f00, 0x8f830054, 0x24020006,
-0x3c010001, 0x370821, 0xac22839c, 0x3c010001, 0x80046b1, 0xac234e90,
-0x3c05fffe, 0x34a57960, 0x3c040001, 0x8f820054, 0x3c030001, 0x8c634e90,
-0x3484869f, 0x451021, 0x621823, 0x83202b, 0x10800046, 0x0,
-0x24020007, 0x3c010001, 0x370821, 0x80046b1, 0xac22839c, 0x8f820220,
-0x3c04f700, 0x441025, 0xaf820220, 0x8f820220, 0x3c030300, 0x431024,
-0x14400005, 0x1821, 0x8f820220, 0x24030001, 0x441025, 0xaf820220,
-0x10600030, 0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c844e88,
-0x431024, 0x3442251f, 0xaf820214, 0x24020008, 0x3c010001, 0x370821,
-0xac22839c, 0x10800007, 0x24020001, 0x3c010001, 0xac226eb0, 0xc004b88,
-0x8f840220, 0x80046b1, 0x0, 0x8f820220, 0x3c030008, 0x431024,
-0x1440001a, 0x2402000e, 0x3c010001, 0xac226eb0, 0x8ee20000, 0x24040001,
-0x3c030200, 0x431025, 0xc004ff8, 0xaee20000, 0x8f820220, 0x2403fffb,
-0x431024, 0xaf820220, 0x8f820220, 0x34420002, 0xc004323, 0xaf820220,
-0x3c050001, 0x8ca54dec, 0xc004f33, 0x24040001, 0x80046b1, 0x0,
-0x24020001, 0x3c010001, 0xac224df0, 0x8fbf0018, 0x3e00008, 0x27bd0020,
-0x8f820200, 0x8f820220, 0x8f820220, 0x34420004, 0xaf820220, 0x8f820200,
-0x3c060001, 0x8cc64dec, 0x34420004, 0xaf820200, 0x24020002, 0x10c20048,
-0x2cc20003, 0x10400005, 0x24020001, 0x10c20008, 0x0, 0x8004708,
-0x0, 0x24020004, 0x10c20013, 0x24020001, 0x8004708, 0x0,
-0x3c030001, 0x8c634dd8, 0x3c020001, 0x8c424de4, 0x3c040001, 0x8c844e00,
-0x3c050001, 0x8ca54ddc, 0xaf860200, 0xaf860220, 0x34630022, 0x441025,
-0x451025, 0x34420002, 0x8004707, 0xaf830200, 0xaf820200, 0xaf820220,
-0x8f820044, 0x3c030001, 0x8c634e88, 0x34428080, 0xaf820044, 0x10600005,
-0x3c033f00, 0x3c020001, 0x8c424dd0, 0x80046fb, 0x346300e0, 0x8f8400f0,
-0x276217f8, 0x14820002, 0x24850008, 0x27651000, 0x8f8200f4, 0x10a20007,
-0x3c038000, 0x34630040, 0x3c020001, 0x24424d90, 0xac820000, 0xac830004,
-0xaf8500f0, 0x3c020001, 0x8c424dd0, 0x3c033f00, 0x346300e2, 0x431025,
-0xaf820200, 0x3c030001, 0x8c634dd4, 0x3c04f700, 0x3c020001, 0x8c424de4,
-0x3c050001, 0x8ca54e00, 0x641825, 0x431025, 0x451025, 0xaf820220,
-0x3e00008, 0x0, 0x8f820220, 0x3c030001, 0x8c634dec, 0x34420004,
-0xaf820220, 0x24020001, 0x1062000f, 0x0, 0x8f830054, 0x8f820054,
-0x24630002, 0x621023, 0x2c420003, 0x10400011, 0x0, 0x8f820054,
-0x621023, 0x2c420003, 0x1040000c, 0x0, 0x8004719, 0x0,
-0x8f830054, 0x8f820054, 0x8004725, 0x24630007, 0x8f820054, 0x621023,
-0x2c420008, 0x1440fffc, 0x0, 0x8f8400e0, 0x30820007, 0x1040000d,
-0x0, 0x8f820054, 0x8f8300e0, 0x14830009, 0x24450032, 0x8f820054,
-0xa21023, 0x2c420033, 0x10400004, 0x0, 0x8f8200e0, 0x1082fff9,
-0x0, 0x8f820220, 0x2403fffd, 0x431024, 0xaf820220, 0x3e00008,
-0x0, 0x0, 0x27bdffd8, 0xafb20018, 0x809021, 0xafb3001c,
-0xa09821, 0xafb10014, 0xc08821, 0xafb00010, 0x8021, 0xafbf0020,
-0xa6200000, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
-0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0x24100010, 0x2501024, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x2501024,
-0x24100010, 0x2701024, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x2701024, 0xc004b65, 0x34108000, 0xc004b65,
-0x0, 0xc004b1f, 0x0, 0x50400005, 0x108042, 0x96220000,
-0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, 0xc004b65,
-0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010,
-0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014, 0x808821, 0xafb20018,
-0xa09021, 0xafb3001c, 0xc09821, 0xafb00010, 0x8021, 0xafbf0020,
-0xc004b3f, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0,
-0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021,
-0xc004b3f, 0x24040001, 0x24100010, 0x2301024, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x2301024, 0x24100010,
-0x2501024, 0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042,
-0x1600fffa, 0x2501024, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021,
-0x34108000, 0x96620000, 0x501024, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fff8, 0x0, 0xc004b65, 0x0,
-0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008,
-0x27bd0028, 0x3c030001, 0x8c634e10, 0x3c020001, 0x8c424e54, 0x27bdffd8,
-0xafbf0020, 0xafb1001c, 0x10620003, 0xafb00018, 0x3c010001, 0xac234e54,
-0x2463ffff, 0x2c620013, 0x10400349, 0x31080, 0x3c010001, 0x220821,
-0x8c224c70, 0x400008, 0x0, 0xc004b65, 0x8021, 0x34028000,
-0xa7a20010, 0x27b10010, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020,
-0x1440fffb, 0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001,
-0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0x24100010, 0x32020001,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa,
-0x32020001, 0x24100010, 0xc004b3f, 0x2021, 0x108042, 0x1600fffc,
-0x0, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0x34108000,
-0x96220000, 0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fff8, 0x0, 0xc004b65, 0x0, 0x8004b18,
-0x24020002, 0x27b10010, 0xa7a00010, 0x8021, 0xc004b3f, 0x24040001,
-0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f, 0x2021,
-0xc004b3f, 0x24040001, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021,
-0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0xc004b3f, 0x2021,
-0x108042, 0x1600fffc, 0x0, 0xc004b65, 0x34108000, 0xc004b65,
-0x0, 0xc004b1f, 0x0, 0x50400005, 0x108042, 0x96220000,
-0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, 0xc004b65,
-0x0, 0x97a20010, 0x30428000, 0x144002dc, 0x24020003, 0x8004b18,
-0x0, 0x24021200, 0xa7a20010, 0x27b10010, 0x8021, 0xc004b3f,
-0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0xc004b3f,
-0x24040001, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0xc004b3f,
-0x2021, 0x108042, 0x1600fffc, 0x0, 0xc004b3f, 0x24040001,
-0xc004b3f, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fff8, 0x0,
-0xc004b65, 0x0, 0x8f830054, 0x8004b0a, 0x24020004, 0x8f830054,
-0x3c020001, 0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e,
-0x24020002, 0x3c030001, 0x8c634e9c, 0x10620297, 0x2c620003, 0x14400296,
-0x24020011, 0x24020003, 0x10620005, 0x24020004, 0x10620291, 0x2402000f,
-0x8004b18, 0x24020011, 0x8004b18, 0x24020005, 0x24020014, 0xa7a20010,
-0x27b10010, 0x8021, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020,
-0x1440fffb, 0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001,
-0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0x24100010, 0x32020001,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa,
-0x32020001, 0x24100010, 0x32020012, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fffa, 0x32020012, 0xc004b3f, 0x24040001,
-0xc004b3f, 0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fff8, 0x0,
-0xc004b65, 0x0, 0x8f830054, 0x8004b0a, 0x24020006, 0x8f830054,
-0x3c020001, 0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400250,
-0x24020007, 0x8004b18, 0x0, 0x24020006, 0xa7a20010, 0x27b10010,
-0x8021, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
-0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0x24100010, 0x32020001, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020001,
-0x24100010, 0x32020013, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x32020013, 0xc004b3f, 0x24040001, 0xc004b3f,
+0x0, 0x0, 0x0, 0x0, 0x3c030001, 0x34633800,
+0x24050080, 0x2404001f, 0x2406ffff, 0x24020001, 0xaf80021c, 0xaf820200,
+0xaf820220, 0x3631021, 0xaf8200c0, 0x3631021, 0xaf8200c4, 0x3631021,
+0xaf8200c8, 0x27623800, 0xaf8200d0, 0x27623800, 0xaf8200d4, 0x27623800,
+0xaf8200d8, 0x27621800, 0xaf8200e0, 0x27621800, 0xaf8200e4, 0x27621800,
+0xaf8200e8, 0x27621000, 0xaf8200f0, 0x27621000, 0xaf8200f4, 0x27621000,
+0xaf8200f8, 0xaca00000, 0x2484ffff, 0x1486fffd, 0x24a50004, 0x8f830040,
+0x3c02f000, 0x621824, 0x3c025000, 0x1062000c, 0x43102b, 0x14400006,
+0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x80044f9, 0x0,
+0x10620004, 0x24020800, 0x80044f9, 0x0, 0x24020700, 0x3c010001,
+0xac225010, 0x3e00008, 0x0, 0x27bdffd0, 0xafbf0028, 0x3c010001,
+0xc004be5, 0xac204ff8, 0x24040001, 0x2821, 0x27a60020, 0x34028000,
+0xc004802, 0xa7a20020, 0x8f830054, 0x8f820054, 0x800450b, 0x24630064,
+0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050001,
+0xc0047c0, 0x27a60020, 0x8f830054, 0x8f820054, 0x8004517, 0x24630064,
+0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050001,
+0xc0047c0, 0x27a60020, 0x8f830054, 0x8f820054, 0x8004523, 0x24630064,
+0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050002,
+0xc0047c0, 0x27a60018, 0x8f830054, 0x8f820054, 0x800452f, 0x24630064,
+0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050003,
+0xc0047c0, 0x27a6001a, 0x97a20020, 0x10400022, 0x24030001, 0x3c020001,
+0x8c424ff8, 0x97a30018, 0x34420001, 0x3c010001, 0xac224ff8, 0x24020015,
+0x14620008, 0x3402f423, 0x97a3001a, 0x14620005, 0x24020003, 0x3c010001,
+0xac2250ac, 0x8004562, 0x3c08fff0, 0x97a30018, 0x24027810, 0x1462000a,
+0x24020002, 0x97a3001a, 0x24020001, 0x14620006, 0x24020002, 0x24020004,
+0x3c010001, 0xac2250ac, 0x8004562, 0x3c08fff0, 0x3c010001, 0xac2250ac,
+0x8004562, 0x3c08fff0, 0x3c020001, 0x8c424ff8, 0x3c010001, 0xac2350ac,
+0x34420004, 0x3c010001, 0xac224ff8, 0x3c08fff0, 0x3508bdc0, 0x8f830054,
+0x97a60018, 0x3c070001, 0x8ce750ac, 0x3c040001, 0x24844e20, 0x24020001,
+0x3c010001, 0xac225000, 0xafa60010, 0x3c060001, 0x8cc64ff8, 0x97a2001a,
+0x3c05000d, 0x34a50100, 0x3c010001, 0xac204ffc, 0x681821, 0x3c010001,
+0xac2350a4, 0xc002403, 0xafa20014, 0x8fbf0028, 0x3e00008, 0x27bd0030,
+0x27bdffe8, 0x24070004, 0x3c040001, 0x8c844ffc, 0x3021, 0x24020001,
+0x1482000a, 0xafbf0010, 0x3c020001, 0x8c42714c, 0x3c050004, 0x30428000,
+0x1040000c, 0x34a593e0, 0x3c05000f, 0x8004595, 0x34a54240, 0x3c020001,
+0x8c42714c, 0x3c05000f, 0x30428000, 0x10400003, 0x34a54240, 0x3c05001e,
+0x34a58480, 0x3c020001, 0x8c4250a4, 0x8f830054, 0x451021, 0x431023,
+0x45102b, 0x1440002e, 0x0, 0x3c020001, 0x8c425004, 0x1440002a,
+0x2cc20001, 0x7182b, 0x431024, 0x1040001d, 0x0, 0x3c090001,
+0x8d294ff8, 0x240b0001, 0x3c054000, 0x3c080001, 0x2508714c, 0x250afffc,
+0x42042, 0x14800002, 0x24e7ffff, 0x24040008, 0x891024, 0x5040000b,
+0x2cc20001, 0x148b0004, 0x0, 0x8d020000, 0x80045ba, 0x451024,
+0x8d420000, 0x451024, 0x54400001, 0x24060001, 0x2cc20001, 0x7182b,
+0x431024, 0x5440ffed, 0x42042, 0x3c010001, 0x10c00024, 0xac244ffc,
+0x8f830054, 0x24020001, 0x3c010001, 0xac225000, 0x3c010001, 0xac2350a4,
+0x3c020001, 0x8c425000, 0x10400006, 0x24020001, 0x3c010001, 0xac205000,
+0x3c010001, 0x370821, 0xac22839c, 0x3c030001, 0x771821, 0x8c63839c,
+0x24020008, 0x10620005, 0x24020001, 0xc0045ea, 0x0, 0x80045e7,
+0x0, 0x3c030001, 0x8c634ffc, 0x10620007, 0x2402000e, 0x3c030001,
+0x8c6370c0, 0x10620003, 0x0, 0xc004c08, 0x8f840220, 0x8fbf0010,
+0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c02fdff, 0xafbf0018, 0x8ee30000,
+0x3c050001, 0x8ca54ffc, 0x3c040001, 0x8c845014, 0x3442ffff, 0x621824,
+0x14a40008, 0xaee30000, 0x3c030001, 0x771821, 0x8c63839c, 0x3c020001,
+0x8c425018, 0x10620008, 0x0, 0x3c020001, 0x571021, 0x8c42839c,
+0x3c010001, 0xac255014, 0x3c010001, 0xac225018, 0x3c030001, 0x8c634ffc,
+0x24020002, 0x10620126, 0x2c620003, 0x10400005, 0x24020001, 0x10620008,
+0x0, 0x800472e, 0x0, 0x24020004, 0x1062007c, 0x24020001,
+0x800472f, 0x0, 0x3c020001, 0x571021, 0x8c42839c, 0x2443ffff,
+0x2c620008, 0x10400117, 0x31080, 0x3c010001, 0x220821, 0x8c224e38,
+0x400008, 0x0, 0xc004734, 0x0, 0x3c020001, 0x8c425008,
+0x3c010001, 0xac204f90, 0x104000c5, 0x24020002, 0x3c010001, 0x370821,
+0xac22839c, 0x3c010001, 0x8004731, 0xac205008, 0xc004843, 0x0,
+0x3c030001, 0x8c635020, 0x24020011, 0x146200fd, 0x24020003, 0x80046b1,
+0x0, 0x3c050001, 0x8ca54ffc, 0x3c060001, 0x8cc6714c, 0xc004eac,
+0x24040001, 0x24020005, 0x3c010001, 0xac205008, 0x3c010001, 0x370821,
+0x8004731, 0xac22839c, 0x3c040001, 0x24844e2c, 0x3c05000f, 0x34a50100,
+0x3021, 0x3821, 0xafa00010, 0xc002403, 0xafa00014, 0x8004731,
+0x0, 0x8f820220, 0x3c03f700, 0x431025, 0x80046d8, 0xaf820220,
+0x8f820220, 0x3c030004, 0x431024, 0x14400095, 0x24020007, 0x8f830054,
+0x3c020001, 0x8c4250a0, 0x2463d8f0, 0x431023, 0x2c422710, 0x144000d1,
+0x24020001, 0x800472f, 0x0, 0x3c050001, 0x8ca54ffc, 0xc004fb3,
+0x24040001, 0xc005078, 0x24040001, 0x3c030001, 0x8c637144, 0x46100c3,
+0x24020001, 0x3c020008, 0x621024, 0x10400006, 0x0, 0x8f820214,
+0x3c03ffff, 0x431024, 0x800467a, 0x3442251f, 0x8f820214, 0x3c03ffff,
+0x431024, 0x3442241f, 0xaf820214, 0x8ee20000, 0x3c030200, 0x431025,
+0xaee20000, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220,
+0x34420002, 0xaf820220, 0x24020008, 0x3c010001, 0x370821, 0xc0043cd,
+0xac22839c, 0x8004731, 0x0, 0x3c020001, 0x571021, 0x8c42839c,
+0x2443ffff, 0x2c620008, 0x1040009e, 0x31080, 0x3c010001, 0x220821,
+0x8c224e58, 0x400008, 0x0, 0xc00428b, 0x0, 0x3c010001,
+0xac205000, 0xaf800204, 0x3c010001, 0xc004734, 0xac207110, 0x8f820044,
+0x34428080, 0xaf820044, 0x8f830054, 0x3c010001, 0xac204f90, 0x80046da,
+0x24020002, 0x8f830054, 0x3c020001, 0x8c4250a0, 0x2463d8f0, 0x431023,
+0x2c422710, 0x14400081, 0x24020003, 0x3c010001, 0x370821, 0x8004731,
+0xac22839c, 0x3c020001, 0x8c427148, 0x30424000, 0x10400005, 0x0,
+0x8f820044, 0x3c03ffff, 0x80046c0, 0x34637fff, 0x8f820044, 0x2403ff7f,
+0x431024, 0xaf820044, 0x8f830054, 0x80046da, 0x24020004, 0x8f830054,
+0x3c020001, 0x8c4250a0, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400065,
+0x24020005, 0x3c010001, 0x370821, 0x8004731, 0xac22839c, 0x8f820220,
+0x3c03f700, 0x431025, 0xaf820220, 0xaf800204, 0x3c010001, 0xac207110,
+0x8f830054, 0x24020006, 0x3c010001, 0x370821, 0xac22839c, 0x3c010001,
+0x8004731, 0xac2350a0, 0x3c05fffe, 0x34a57960, 0x3c040001, 0x8f820054,
+0x3c030001, 0x8c6350a0, 0x3484869f, 0x451021, 0x621823, 0x83202b,
+0x10800046, 0x0, 0x24020007, 0x3c010001, 0x370821, 0x8004731,
+0xac22839c, 0x8f820220, 0x3c04f700, 0x441025, 0xaf820220, 0x8f820220,
+0x3c030300, 0x431024, 0x14400005, 0x1821, 0x8f820220, 0x24030001,
+0x441025, 0xaf820220, 0x10600030, 0x24020001, 0x8f820214, 0x3c03ffff,
+0x3c040001, 0x8c845098, 0x431024, 0x3442251f, 0xaf820214, 0x24020008,
+0x3c010001, 0x370821, 0xac22839c, 0x10800007, 0x24020001, 0x3c010001,
+0xac2270c0, 0xc004c08, 0x8f840220, 0x8004731, 0x0, 0x8f820220,
+0x3c030008, 0x431024, 0x1440001a, 0x2402000e, 0x3c010001, 0xac2270c0,
+0x8ee20000, 0x24040001, 0x3c030200, 0x431025, 0xc005078, 0xaee20000,
+0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 0x34420002,
+0xc0043cd, 0xaf820220, 0x3c050001, 0x8ca54ffc, 0xc004fb3, 0x24040001,
+0x8004731, 0x0, 0x24020001, 0x3c010001, 0xac225000, 0x8fbf0018,
+0x3e00008, 0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, 0x34420004,
+0xaf820220, 0x8f820200, 0x3c060001, 0x8cc64ffc, 0x34420004, 0xaf820200,
+0x24020002, 0x10c20048, 0x2cc20003, 0x10400005, 0x24020001, 0x10c20008,
+0x0, 0x8004788, 0x0, 0x24020004, 0x10c20013, 0x24020001,
+0x8004788, 0x0, 0x3c030001, 0x8c634fe8, 0x3c020001, 0x8c424ff4,
+0x3c040001, 0x8c845010, 0x3c050001, 0x8ca54fec, 0xaf860200, 0xaf860220,
+0x34630022, 0x441025, 0x451025, 0x34420002, 0x8004787, 0xaf830200,
+0xaf820200, 0xaf820220, 0x8f820044, 0x3c030001, 0x8c635098, 0x34428080,
+0xaf820044, 0x10600005, 0x3c033f00, 0x3c020001, 0x8c424fe0, 0x800477b,
+0x346300e0, 0x8f8400f0, 0x276217f8, 0x14820002, 0x24850008, 0x27651000,
+0x8f8200f4, 0x10a20007, 0x3c038000, 0x34630040, 0x3c020001, 0x24424fa0,
+0xac820000, 0xac830004, 0xaf8500f0, 0x3c020001, 0x8c424fe0, 0x3c033f00,
+0x346300e2, 0x431025, 0xaf820200, 0x3c030001, 0x8c634fe4, 0x3c04f700,
+0x3c020001, 0x8c424ff4, 0x3c050001, 0x8ca55010, 0x641825, 0x431025,
+0x451025, 0xaf820220, 0x3e00008, 0x0, 0x8f820220, 0x3c030001,
+0x8c634ffc, 0x34420004, 0xaf820220, 0x24020001, 0x1062000f, 0x0,
+0x8f830054, 0x8f820054, 0x24630002, 0x621023, 0x2c420003, 0x10400011,
+0x0, 0x8f820054, 0x621023, 0x2c420003, 0x1040000c, 0x0,
+0x8004799, 0x0, 0x8f830054, 0x8f820054, 0x80047a5, 0x24630007,
+0x8f820054, 0x621023, 0x2c420008, 0x1440fffc, 0x0, 0x8f8400e0,
+0x30820007, 0x1040000d, 0x0, 0x8f820054, 0x8f8300e0, 0x14830009,
+0x24450032, 0x8f820054, 0xa21023, 0x2c420033, 0x10400004, 0x0,
+0x8f8200e0, 0x1082fff9, 0x0, 0x8f820220, 0x2403fffd, 0x431024,
+0xaf820220, 0x3e00008, 0x0, 0x0, 0x27bdffd8, 0xafb20018,
+0x809021, 0xafb3001c, 0xa09821, 0xafb10014, 0xc08821, 0xafb00010,
+0x8021, 0xafbf0020, 0xa6200000, 0xc004bbf, 0x24040001, 0x26100001,
+0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x24100010,
+0x2501024, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fffa, 0x2501024, 0x24100010, 0x2701024, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x2701024, 0xc004be5,
+0x34108000, 0xc004be5, 0x0, 0xc004b9f, 0x0, 0x50400005,
+0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7,
+0x0, 0xc004be5, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018,
+0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb10014,
+0x808821, 0xafb20018, 0xa09021, 0xafb3001c, 0xc09821, 0xafb00010,
+0x8021, 0xafbf0020, 0xc004bbf, 0x24040001, 0x26100001, 0x2e020020,
+0x1440fffb, 0x0, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001,
+0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0x24100010, 0x2301024,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa,
+0x2301024, 0x24100010, 0x2501024, 0x10400002, 0x2021, 0x24040001,
+0xc004bbf, 0x108042, 0x1600fffa, 0x2501024, 0xc004bbf, 0x24040001,
+0xc004bbf, 0x2021, 0x34108000, 0x96620000, 0x501024, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fff8, 0x0,
+0xc004be5, 0x0, 0x8fbf0020, 0x8fb3001c, 0x8fb20018, 0x8fb10014,
+0x8fb00010, 0x3e00008, 0x27bd0028, 0x3c030001, 0x8c635020, 0x3c020001,
+0x8c425064, 0x27bdffd8, 0xafbf0020, 0xafb1001c, 0x10620003, 0xafb00018,
+0x3c010001, 0xac235064, 0x2463ffff, 0x2c620013, 0x10400349, 0x31080,
+0x3c010001, 0x220821, 0x8c224e80, 0x400008, 0x0, 0xc004be5,
+0x8021, 0x34028000, 0xa7a20010, 0x27b10010, 0xc004bbf, 0x24040001,
+0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021,
+0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001,
+0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0xc004bbf, 0x2021,
+0x108042, 0x1600fffc, 0x0, 0xc004bbf, 0x24040001, 0xc004bbf,
0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fff8, 0x0, 0xc004b65,
-0x0, 0x8f830054, 0x8004b0a, 0x24020008, 0x8f830054, 0x3c020001,
-0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440020f, 0x24020009,
-0x8004b18, 0x0, 0x27b10010, 0xa7a00010, 0x8021, 0xc004b3f,
-0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0xc004b3f, 0x24040001, 0xc004b3f,
-0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa,
-0x32020018, 0xc004b65, 0x34108000, 0xc004b65, 0x0, 0xc004b1f,
-0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000,
-0x108042, 0x1600fff7, 0x0, 0xc004b65, 0x8021, 0x97a20010,
-0x27b10010, 0x34420001, 0xa7a20010, 0xc004b3f, 0x24040001, 0x26100001,
-0x2e020020, 0x1440fffb, 0x0, 0xc004b3f, 0x2021, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0x24100010,
-0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042,
-0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020018, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0x34108000, 0x96220000, 0x501024,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fff8,
-0x0, 0xc004b65, 0x0, 0x8f830054, 0x8004b0a, 0x2402000a,
-0x8f830054, 0x3c020001, 0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064,
-0x1440019b, 0x2402000b, 0x8004b18, 0x0, 0x27b10010, 0xa7a00010,
-0x8021, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
-0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0x24100010, 0x32020001, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020001,
-0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x32020017, 0xc004b65, 0x34108000, 0xc004b65,
-0x0, 0xc004b1f, 0x0, 0x50400005, 0x108042, 0x96220000,
-0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, 0xc004b65,
-0x8021, 0x97a20010, 0x27b10010, 0x34420700, 0xa7a20010, 0xc004b3f,
-0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0xc004b3f,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fff8, 0x0, 0xc004be5,
+0x0, 0x8004b98, 0x24020002, 0x27b10010, 0xa7a00010, 0x8021,
+0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0,
+0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf, 0x24040001,
+0xc004bbf, 0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001, 0x24100010,
+0xc004bbf, 0x2021, 0x108042, 0x1600fffc, 0x0, 0xc004be5,
+0x34108000, 0xc004be5, 0x0, 0xc004b9f, 0x0, 0x50400005,
+0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7,
+0x0, 0xc004be5, 0x0, 0x97a20010, 0x30428000, 0x144002dc,
+0x24020003, 0x8004b98, 0x0, 0x24021200, 0xa7a20010, 0x27b10010,
+0x8021, 0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
+0x0, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf,
+0x2021, 0xc004bbf, 0x24040001, 0x24100010, 0x32020001, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001,
+0x24100010, 0xc004bbf, 0x2021, 0x108042, 0x1600fffc, 0x0,
+0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x34108000, 0x96220000,
+0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fff8, 0x0, 0xc004be5, 0x0, 0x8f830054, 0x8004b8a,
+0x24020004, 0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c, 0x431023,
+0x2c420064, 0x1440029e, 0x24020002, 0x3c030001, 0x8c6350ac, 0x10620297,
+0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, 0x24020004,
+0x10620291, 0x2402000f, 0x8004b98, 0x24020011, 0x8004b98, 0x24020005,
+0x24020014, 0xa7a20010, 0x27b10010, 0x8021, 0xc004bbf, 0x24040001,
+0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021,
+0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001,
+0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020012, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020012,
+0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x34108000, 0x96220000,
+0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fff8, 0x0, 0xc004be5, 0x0, 0x8f830054, 0x8004b8a,
+0x24020006, 0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c, 0x431023,
+0x2c420064, 0x14400250, 0x24020007, 0x8004b98, 0x0, 0x24020006,
+0xa7a20010, 0x27b10010, 0x8021, 0xc004bbf, 0x24040001, 0x26100001,
+0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0x24100010,
+0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020013, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0x34108000, 0x96220000, 0x501024,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fff8,
+0x0, 0xc004be5, 0x0, 0x8f830054, 0x8004b8a, 0x24020008,
+0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c, 0x431023, 0x2c420064,
+0x1440020f, 0x24020009, 0x8004b98, 0x0, 0x27b10010, 0xa7a00010,
+0x8021, 0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
+0x0, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0x24100010, 0x32020001, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001,
+0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fffa, 0x32020018, 0xc004be5, 0x34108000, 0xc004be5,
+0x0, 0xc004b9f, 0x0, 0x50400005, 0x108042, 0x96220000,
+0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, 0xc004be5,
+0x8021, 0x97a20010, 0x27b10010, 0x34420001, 0xa7a20010, 0xc004bbf,
+0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004bbf,
+0x2021, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0xc004bbf,
0x24040001, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020017,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa,
-0x32020017, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0x34108000,
-0x96220000, 0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fff8, 0x0, 0xc004b65, 0x0, 0x8f830054,
-0x8004b0a, 0x2402000c, 0x8f830054, 0x3c020001, 0x8c424e98, 0x2463ff9c,
-0x431023, 0x2c420064, 0x14400127, 0x24020012, 0x8004b18, 0x0,
-0x27b10010, 0xa7a00010, 0x8021, 0xc004b3f, 0x24040001, 0x26100001,
-0x2e020020, 0x1440fffb, 0x0, 0xc004b3f, 0x2021, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0x24100010,
-0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042,
-0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020014, 0xc004b65,
-0x34108000, 0xc004b65, 0x0, 0xc004b1f, 0x0, 0x50400005,
+0xc004bbf, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa,
+0x32020018, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x34108000,
+0x96220000, 0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fff8, 0x0, 0xc004be5, 0x0, 0x8f830054,
+0x8004b8a, 0x2402000a, 0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c,
+0x431023, 0x2c420064, 0x1440019b, 0x2402000b, 0x8004b98, 0x0,
+0x27b10010, 0xa7a00010, 0x8021, 0xc004bbf, 0x24040001, 0x26100001,
+0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x24100010,
+0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fffa, 0x32020001, 0x24100010, 0x32020017, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020017, 0xc004be5,
+0x34108000, 0xc004be5, 0x0, 0xc004b9f, 0x0, 0x50400005,
0x108042, 0x96220000, 0x501025, 0xa6220000, 0x108042, 0x1600fff7,
-0x0, 0xc004b65, 0x8021, 0x97a20010, 0x27b10010, 0x34420010,
-0xa7a20010, 0xc004b3f, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
-0x0, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0x24100010, 0x32020001, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020001,
-0x24100010, 0x32020014, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x32020014, 0xc004b3f, 0x24040001, 0xc004b3f,
+0x0, 0xc004be5, 0x8021, 0x97a20010, 0x27b10010, 0x34420700,
+0xa7a20010, 0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
+0x0, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf,
+0x2021, 0xc004bbf, 0x24040001, 0x24100010, 0x32020001, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001,
+0x24100010, 0x32020017, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fffa, 0x32020017, 0xc004bbf, 0x24040001, 0xc004bbf,
0x2021, 0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fff8, 0x0, 0xc004b65,
-0x0, 0x8f830054, 0x8004b0a, 0x24020013, 0x8f830054, 0x3c020001,
-0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064, 0x144000b3, 0x2402000d,
-0x8004b18, 0x0, 0x27b10010, 0xa7a00010, 0x8021, 0xc004b3f,
-0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f,
-0x2021, 0xc004b3f, 0x24040001, 0xc004b3f, 0x24040001, 0xc004b3f,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fff8, 0x0, 0xc004be5,
+0x0, 0x8f830054, 0x8004b8a, 0x2402000c, 0x8f830054, 0x3c020001,
+0x8c4250a8, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400127, 0x24020012,
+0x8004b98, 0x0, 0x27b10010, 0xa7a00010, 0x8021, 0xc004bbf,
+0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004bbf,
+0x2021, 0xc004bbf, 0x24040001, 0xc004bbf, 0x24040001, 0xc004bbf,
0x2021, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001,
-0xc004b3f, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa,
-0x32020018, 0xc004b65, 0x34108000, 0xc004b65, 0x0, 0xc004b1f,
+0xc004bbf, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020014,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa,
+0x32020014, 0xc004be5, 0x34108000, 0xc004be5, 0x0, 0xc004b9f,
0x0, 0x50400005, 0x108042, 0x96220000, 0x501025, 0xa6220000,
-0x108042, 0x1600fff7, 0x0, 0xc004b65, 0x8021, 0x97a20010,
-0x27b10010, 0x3042fffe, 0xa7a20010, 0xc004b3f, 0x24040001, 0x26100001,
-0x2e020020, 0x1440fffb, 0x0, 0xc004b3f, 0x2021, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001, 0x24100010,
-0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042,
-0x1600fffa, 0x32020001, 0x24100010, 0x32020018, 0x10400002, 0x2021,
-0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020018, 0xc004b3f,
-0x24040001, 0xc004b3f, 0x2021, 0x34108000, 0x96220000, 0x501024,
-0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fff8,
-0x0, 0xc004b65, 0x0, 0x8f830054, 0x8004b0a, 0x2402000e,
-0x24020840, 0xa7a20010, 0x27b10010, 0x8021, 0xc004b3f, 0x24040001,
-0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004b3f, 0x2021,
-0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0xc004b3f, 0x24040001,
-0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004b3f,
-0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020013, 0x10400002,
-0x2021, 0x24040001, 0xc004b3f, 0x108042, 0x1600fffa, 0x32020013,
-0xc004b3f, 0x24040001, 0xc004b3f, 0x2021, 0x34108000, 0x96220000,
-0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004b3f, 0x108042,
-0x1600fff8, 0x0, 0xc004b65, 0x0, 0x8f830054, 0x24020010,
-0x3c010001, 0xac224e10, 0x3c010001, 0x8004b1a, 0xac234e98, 0x8f830054,
-0x3c020001, 0x8c424e98, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400004,
-0x0, 0x24020011, 0x3c010001, 0xac224e10, 0x8fbf0020, 0x8fb1001c,
-0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044, 0x8f820044, 0x3c030001,
-0x431025, 0x3c030008, 0xaf820044, 0x8f840054, 0x8f820054, 0xa32824,
-0x8004b2b, 0x24840001, 0x8f820054, 0x821023, 0x2c420002, 0x1440fffc,
-0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044,
-0x8f830054, 0x8f820054, 0x8004b39, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0xa01021, 0x8f830044,
-0x3c02fff0, 0x3442ffff, 0x42480, 0x621824, 0x3c020002, 0x822025,
-0x641825, 0xaf830044, 0x8f820044, 0x3c030001, 0x431025, 0xaf820044,
-0x8f830054, 0x8f820054, 0x8004b51, 0x24630001, 0x8f820054, 0x621023,
+0x108042, 0x1600fff7, 0x0, 0xc004be5, 0x8021, 0x97a20010,
+0x27b10010, 0x34420010, 0xa7a20010, 0xc004bbf, 0x24040001, 0x26100001,
+0x2e020020, 0x1440fffb, 0x0, 0xc004bbf, 0x2021, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0x24100010,
+0x32020001, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fffa, 0x32020001, 0x24100010, 0x32020014, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020014, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0x34108000, 0x96220000, 0x501024,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fff8,
+0x0, 0xc004be5, 0x0, 0x8f830054, 0x8004b8a, 0x24020013,
+0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c, 0x431023, 0x2c420064,
+0x144000b3, 0x2402000d, 0x8004b98, 0x0, 0x27b10010, 0xa7a00010,
+0x8021, 0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb,
+0x0, 0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf,
+0x24040001, 0xc004bbf, 0x2021, 0x24100010, 0x32020001, 0x10400002,
+0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001,
+0x24100010, 0x32020018, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fffa, 0x32020018, 0xc004be5, 0x34108000, 0xc004be5,
+0x0, 0xc004b9f, 0x0, 0x50400005, 0x108042, 0x96220000,
+0x501025, 0xa6220000, 0x108042, 0x1600fff7, 0x0, 0xc004be5,
+0x8021, 0x97a20010, 0x27b10010, 0x3042fffe, 0xa7a20010, 0xc004bbf,
+0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0, 0xc004bbf,
+0x2021, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0xc004bbf,
+0x24040001, 0x24100010, 0x32020001, 0x10400002, 0x2021, 0x24040001,
+0xc004bbf, 0x108042, 0x1600fffa, 0x32020001, 0x24100010, 0x32020018,
+0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042, 0x1600fffa,
+0x32020018, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021, 0x34108000,
+0x96220000, 0x501024, 0x10400002, 0x2021, 0x24040001, 0xc004bbf,
+0x108042, 0x1600fff8, 0x0, 0xc004be5, 0x0, 0x8f830054,
+0x8004b8a, 0x2402000e, 0x24020840, 0xa7a20010, 0x27b10010, 0x8021,
+0xc004bbf, 0x24040001, 0x26100001, 0x2e020020, 0x1440fffb, 0x0,
+0xc004bbf, 0x2021, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021,
+0xc004bbf, 0x24040001, 0x24100010, 0x32020001, 0x10400002, 0x2021,
+0x24040001, 0xc004bbf, 0x108042, 0x1600fffa, 0x32020001, 0x24100010,
+0x32020013, 0x10400002, 0x2021, 0x24040001, 0xc004bbf, 0x108042,
+0x1600fffa, 0x32020013, 0xc004bbf, 0x24040001, 0xc004bbf, 0x2021,
+0x34108000, 0x96220000, 0x501024, 0x10400002, 0x2021, 0x24040001,
+0xc004bbf, 0x108042, 0x1600fff8, 0x0, 0xc004be5, 0x0,
+0x8f830054, 0x24020010, 0x3c010001, 0xac225020, 0x3c010001, 0x8004b9a,
+0xac2350a8, 0x8f830054, 0x3c020001, 0x8c4250a8, 0x2463ff9c, 0x431023,
+0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, 0xac225020,
+0x8fbf0020, 0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0028, 0x8f850044,
+0x8f820044, 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, 0x8f840054,
+0x8f820054, 0xa32824, 0x8004bab, 0x24840001, 0x8f820054, 0x821023,
0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff,
-0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x8004b5f, 0x24630001,
+0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x8004bb9, 0x24630001,
0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008,
-0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044,
-0x8f820044, 0x3c030001, 0x431025, 0xaf820044, 0x8f830054, 0x8f820054,
-0x8004b73, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
-0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044,
-0x8f830054, 0x8f820054, 0x8004b81, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x0,
-0x27bdffe8, 0xafbf0010, 0x3c030001, 0x771821, 0x8c63839c, 0x24020008,
-0x1462021c, 0x803021, 0x3c020001, 0x8c424e88, 0x14400033, 0x0,
-0x8f850224, 0x38a30020, 0x2c630001, 0x38a20010, 0x2c420001, 0x621825,
-0x1460000d, 0x38a30030, 0x2c630001, 0x38a20400, 0x2c420001, 0x621825,
-0x14600007, 0x38a30402, 0x2c630001, 0x38a20404, 0x2c420001, 0x621825,
-0x10600005, 0x0, 0xc0041e7, 0x0, 0x8004bc1, 0x2402000e,
-0xc004323, 0x0, 0x3c050001, 0x8ca54dec, 0xc004f33, 0x24040001,
-0x3c030001, 0x8c634dec, 0x24020004, 0x14620005, 0x2403fffb, 0x3c020001,
-0x8c424de8, 0x8004bbd, 0x2403fff7, 0x3c020001, 0x8c424de8, 0x431024,
-0x3c010001, 0xac224de8, 0x2402000e, 0x3c010001, 0xc0041e7, 0xac226eb0,
-0x8004dab, 0x0, 0x8f820220, 0x3c030400, 0x431024, 0x10400027,
-0x2403ffbf, 0x8f850224, 0x3c020001, 0x8c426ebc, 0xa32024, 0x431024,
-0x1482000c, 0x0, 0x3c020001, 0x8c426ec0, 0x24420001, 0x3c010001,
-0xac226ec0, 0x2c420002, 0x14400008, 0x24020001, 0x3c010001, 0x8004be1,
-0xac226ee0, 0x3c010001, 0xac206ec0, 0x3c010001, 0xac206ee0, 0x3c020001,
-0x8c426ee0, 0x10400006, 0x30a20040, 0x10400004, 0x24020001, 0x3c010001,
-0x8004bec, 0xac226ee4, 0x3c010001, 0xac206ee4, 0x3c010001, 0xac256ebc,
-0x3c010001, 0x8004bfc, 0xac206ef0, 0x24020001, 0x3c010001, 0xac226ef0,
-0x3c010001, 0xac206ee0, 0x3c010001, 0xac206ec0, 0x3c010001, 0xac206ee4,
-0x3c010001, 0xac206ebc, 0x3c030001, 0x8c636eb0, 0x3c020001, 0x8c426eb4,
-0x10620003, 0x3c020200, 0x3c010001, 0xac236eb4, 0xc21024, 0x10400007,
-0x2463ffff, 0x8f820220, 0x24030001, 0x3c010001, 0xac234df0, 0x8004da9,
-0x3c03f700, 0x2c62000e, 0x10400198, 0x31080, 0x3c010001, 0x220821,
-0x8c224cc0, 0x400008, 0x0, 0x8ee20000, 0x3c03fdff, 0x3463ffff,
-0x431024, 0xaee20000, 0x3c010001, 0xac206ee0, 0x3c010001, 0xac206ec0,
-0x3c010001, 0xac206ef0, 0x3c010001, 0xac206ebc, 0x3c010001, 0xac206ee4,
-0x3c010001, 0xac206ed8, 0x3c010001, 0xac206ed0, 0xc00470a, 0xaf800224,
-0x24020002, 0x3c010001, 0xac226eb0, 0xc0041e7, 0x0, 0xaf800204,
-0x8f820200, 0x2403fffd, 0x431024, 0xaf820200, 0x3c010001, 0xac206f00,
-0x8f830054, 0x3c020001, 0x8c426ed8, 0x24040001, 0x3c010001, 0xac246eec,
-0x24420001, 0x3c010001, 0xac226ed8, 0x2c420004, 0x3c010001, 0xac236ed4,
-0x14400006, 0x24020003, 0x3c010001, 0xac244df0, 0x3c010001, 0x8004da7,
-0xac206ed8, 0x3c010001, 0x8004da7, 0xac226eb0, 0x8f830054, 0x3c020001,
-0x8c426ed4, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400154, 0x24020004,
-0x3c010001, 0x8004da7, 0xac226eb0, 0x3c040001, 0x8c844e8c, 0x3c010001,
-0xc004dae, 0xac206ec8, 0x3c020001, 0x8c426efc, 0xaf820204, 0x8f820204,
-0x30420030, 0x1440013c, 0x24020002, 0x3c030001, 0x8c636efc, 0x24020005,
-0x3c010001, 0xac226eb0, 0x3c010001, 0x8004da7, 0xac236f00, 0x3c020001,
-0x8c426ee0, 0x10400139, 0x0, 0x3c020001, 0x8c426ebc, 0x10400135,
-0x0, 0x3c010001, 0xac226ee8, 0x24020003, 0x3c010001, 0xac226ec0,
-0x8004d3a, 0x24020006, 0x3c010001, 0xac206ec8, 0x8f820204, 0x34420040,
-0xaf820204, 0x3c020001, 0x8c426f00, 0x24030007, 0x3c010001, 0xac236eb0,
-0x34420040, 0x3c010001, 0xac226f00, 0x3c020001, 0x8c426ee0, 0x10400005,
-0x0, 0x3c020001, 0x8c426ebc, 0x10400110, 0x24020002, 0x3c050001,
-0x24a56ec0, 0x8ca20000, 0x2c424e21, 0x1040010a, 0x24020002, 0x3c020001,
-0x8c426ee4, 0x1040010f, 0x2404ffbf, 0x3c020001, 0x8c426ebc, 0x3c030001,
-0x8c636ee8, 0x441024, 0x641824, 0x14430007, 0x24020001, 0x24020003,
-0xaca20000, 0x24020008, 0x3c010001, 0x8004da7, 0xac226eb0, 0x3c010001,
-0x8004da7, 0xac226eb0, 0x3c020001, 0x8c426eec, 0x1040000c, 0x24020001,
-0x3c040001, 0xc004dbb, 0x8c846ebc, 0x3c020001, 0x8c426f08, 0x14400005,
-0x24020001, 0x3c020001, 0x8c426f04, 0x10400006, 0x24020001, 0x3c010001,
-0xac224df0, 0x3c010001, 0x8004da7, 0xac206ed8, 0x8f820204, 0x34420040,
-0xaf820204, 0x3c020001, 0x8c426f00, 0x3c030001, 0x8c636ed0, 0x34420040,
-0x3c010001, 0xac226f00, 0x3c020001, 0x8c426ebc, 0x2c630001, 0x318c0,
-0x3c010001, 0xac236ed0, 0x30420008, 0x3c010001, 0xac226ecc, 0x8f830054,
-0x24020009, 0x3c010001, 0xac226eb0, 0x3c010001, 0x8004da7, 0xac236ed4,
-0x8f830054, 0x3c020001, 0x8c426ed4, 0x2463d8f0, 0x431023, 0x2c422710,
-0x144000b6, 0x0, 0x3c020001, 0x8c426ee0, 0x10400005, 0x0,
-0x3c020001, 0x8c426ebc, 0x104000b7, 0x24020002, 0x3c030001, 0x24636ec0,
-0x8c620000, 0x2c424e21, 0x104000b1, 0x24020002, 0x3c020001, 0x8c426eec,
-0x1040000e, 0x0, 0x3c020001, 0x8c426ebc, 0x3c010001, 0xac206eec,
-0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080, 0x1440000c,
-0x24020003, 0x8004d27, 0x2402000c, 0x3c020001, 0x8c426ebc, 0x30420080,
-0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f, 0x24020003,
-0xac620000, 0x2402000a, 0x3c010001, 0xac226eb0, 0x3c040001, 0x24846ef8,
-0x8c820000, 0x3c030001, 0x8c636ed0, 0x431025, 0xaf820204, 0x8c830000,
-0x3c040001, 0x8c846ed0, 0x2402000b, 0x3c010001, 0xac226eb0, 0x641825,
-0x3c010001, 0xac236f00, 0x3c050001, 0x24a56ec0, 0x8ca20000, 0x2c424e21,
-0x1040007d, 0x24020002, 0x3c020001, 0x8c426ef0, 0x10400005, 0x0,
-0x2402000c, 0x3c010001, 0x8004da7, 0xac226eb0, 0x3c020001, 0x8c426ee0,
-0x1040007a, 0x0, 0x3c040001, 0x8c846ebc, 0x1080006c, 0x30820008,
-0x3c030001, 0x8c636ecc, 0x10620072, 0x24020003, 0x3c010001, 0xac246ee8,
-0xaca20000, 0x24020006, 0x3c010001, 0x8004da7, 0xac226eb0, 0x8f8400f0,
-0x276217f8, 0x14820002, 0x24850008, 0x27651000, 0x8f8200f4, 0x10a20007,
-0x3c038000, 0x34630040, 0x3c020001, 0x24424d90, 0xac820000, 0xac830004,
-0xaf8500f0, 0x8f820200, 0x34420002, 0xaf820200, 0x8f830054, 0x2402000d,
-0x3c010001, 0xac226eb0, 0x3c010001, 0xac236ed4, 0x8f830054, 0x3c020001,
-0x8c426ed4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440003a, 0x0,
-0x3c020001, 0x8c426ef0, 0x10400029, 0x2402000e, 0x3c030001, 0x8c636f04,
-0x3c010001, 0x14600015, 0xac226eb0, 0xc004323, 0x0, 0x3c050001,
-0x8ca54dec, 0xc004f33, 0x24040001, 0x3c030001, 0x8c634dec, 0x24020004,
-0x14620005, 0x2403fffb, 0x3c020001, 0x8c424de8, 0x8004d76, 0x2403fff7,
-0x3c020001, 0x8c424de8, 0x431024, 0x3c010001, 0xac224de8, 0x8ee20000,
-0x3c030200, 0x431025, 0xaee20000, 0x8f820224, 0x3c010001, 0xac226f0c,
-0x8f820220, 0x2403fffb, 0x431024, 0xaf820220, 0x8f820220, 0x34420002,
-0x8004da7, 0xaf820220, 0x3c020001, 0x8c426ee0, 0x10400005, 0x0,
-0x3c020001, 0x8c426ebc, 0x1040000f, 0x24020002, 0x3c020001, 0x8c426ec0,
-0x2c424e21, 0x1040000a, 0x24020002, 0x3c020001, 0x8c426ee0, 0x1040000f,
-0x0, 0x3c020001, 0x8c426ebc, 0x1440000b, 0x0, 0x24020002,
-0x3c010001, 0x8004da7, 0xac226eb0, 0x3c020001, 0x8c426ee0, 0x10400003,
-0x0, 0xc0041e7, 0x0, 0x8f820220, 0x3c03f700, 0x431025,
-0xaf820220, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x3c030001, 0x24636f08,
-0x8c620000, 0x10400005, 0x34422000, 0x3c010001, 0xac226efc, 0x8004db9,
-0xac600000, 0x3c010001, 0xac246efc, 0x3e00008, 0x0, 0x27bdffe0,
-0x30820030, 0xafbf0018, 0x3c010001, 0xac226f04, 0x14400067, 0x3c02ffff,
-0x34421f0e, 0x821024, 0x14400061, 0x24020030, 0x30822000, 0x1040005d,
-0x30838000, 0x31a02, 0x30820001, 0x21200, 0x3c040001, 0x8c844e8c,
-0x621825, 0x331c2, 0x3c030001, 0x24634e6c, 0x30828000, 0x21202,
-0x30840001, 0x42200, 0x441025, 0x239c2, 0x61080, 0x431021,
-0x471021, 0x90430000, 0x24020001, 0x10620025, 0x0, 0x10600007,
-0x24020002, 0x10620013, 0x24020003, 0x1062002c, 0x3c05000f, 0x8004e1d,
-0x0, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220,
-0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 0x3c010001, 0xac206f44,
-0x3c010001, 0x8004e28, 0xac206f4c, 0x8f820200, 0x34420100, 0xaf820200,
-0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220, 0x24020100,
-0x3c010001, 0xac226f44, 0x3c010001, 0x8004e28, 0xac206f4c, 0x8f820200,
-0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025,
-0xaf820220, 0x3c010001, 0xac206f44, 0x3c010001, 0x8004e28, 0xac236f4c,
-0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c030001, 0x431025,
-0xaf820220, 0x24020100, 0x3c010001, 0xac226f44, 0x3c010001, 0x8004e28,
-0xac236f4c, 0x34a5ffff, 0x3c040001, 0x24844cf8, 0xafa30010, 0xc0023a7,
-0xafa00014, 0x8004e28, 0x0, 0x24020030, 0x3c010001, 0xac226f08,
-0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0, 0x27bdffc8, 0xafb10024,
-0x808821, 0xafb3002c, 0xa09821, 0xafb00020, 0xc08021, 0x3c040001,
-0x24844d10, 0x3c050009, 0x3c020001, 0x8c424dec, 0x34a59001, 0x2203021,
-0x2603821, 0xafbf0030, 0xafb20028, 0xa7a0001a, 0xafb00014, 0xc0023a7,
-0xafa20010, 0x24020002, 0x126200e9, 0x2e620003, 0x10400005, 0x24020001,
-0x1262000a, 0x3c02fffb, 0x8004f2c, 0x0, 0x24020004, 0x1262006d,
-0x24020008, 0x1262006c, 0x3c02ffec, 0x8004f2c, 0x0, 0x3442ffff,
-0x2028024, 0x119140, 0x3c010001, 0x320821, 0xac306f1c, 0x3c024000,
-0x2021024, 0x10400046, 0x1023c2, 0x30840030, 0x101382, 0x3042000c,
-0x3c030001, 0x24634e14, 0x431021, 0x823821, 0x3c020020, 0x2021024,
-0x10400006, 0x24020100, 0x3c010001, 0x320821, 0xac226f20, 0x8004e6f,
-0x3c020080, 0x3c010001, 0x320821, 0xac206f20, 0x3c020080, 0x2021024,
-0x10400006, 0x111940, 0x3c020001, 0x3c010001, 0x230821, 0x8004e7b,
-0xac226f28, 0x111140, 0x3c010001, 0x220821, 0xac206f28, 0x94e30000,
-0x32024000, 0x10400003, 0xa7a30018, 0x34624000, 0xa7a20018, 0x24040001,
-0x94e20002, 0x24050004, 0x24e60002, 0x34420001, 0xc004782, 0xa4e20002,
-0x24040001, 0x2821, 0xc004782, 0x27a60018, 0x3c020001, 0x8c424dec,
-0x24110001, 0x3c010001, 0xac314df8, 0x14530004, 0x32028000, 0xc0041e7,
-0x0, 0x32028000, 0x10400095, 0x0, 0xc0041e7, 0x0,
-0x24020002, 0x3c010001, 0xac314df0, 0x3c010001, 0x8004f2c, 0xac224dec,
-0x24040001, 0x24050004, 0x27b0001a, 0xc004782, 0x2003021, 0x24040001,
-0x2821, 0xc004782, 0x2003021, 0x3c020001, 0x521021, 0x8c426f14,
-0x3c040001, 0x8c844dec, 0x3c03bfff, 0x3463ffff, 0x3c010001, 0xac334df8,
-0x431024, 0x3c010001, 0x320821, 0x10930074, 0xac226f14, 0x8004f2c,
-0x0, 0x3c02ffec, 0x3442ffff, 0x2028024, 0x3c020008, 0x2028025,
-0x111140, 0x3c010001, 0x220821, 0xac306f18, 0x3c022000, 0x2021024,
-0x10400005, 0x24020001, 0x3c010001, 0xac224e88, 0x8004ecd, 0x3c024000,
-0x3c010001, 0xac204e88, 0x3c024000, 0x2021024, 0x1440001c, 0x0,
-0x3c020001, 0x8c424e88, 0x10400007, 0x24022020, 0x3c010001, 0xac224e8c,
-0x24020001, 0x3c010001, 0x370821, 0xac22839c, 0x3c04bfff, 0x111940,
-0x3c020001, 0x431021, 0x8c426f10, 0x3c050001, 0x8ca54dec, 0x3484ffff,
-0x441024, 0x3c010001, 0x230821, 0xac226f10, 0x24020001, 0x10a20044,
-0x0, 0x8004f2a, 0x0, 0x3c020001, 0x8c424e88, 0x1040001c,
-0x24022000, 0x3c010001, 0xac224e8c, 0x3c0300a0, 0x2031024, 0x14430005,
-0x111140, 0x3402a000, 0x3c010001, 0x8004f25, 0xac224e8c, 0x3c030001,
-0x621821, 0x8c636f18, 0x3c020020, 0x621024, 0x10400004, 0x24022001,
-0x3c010001, 0x8004f25, 0xac224e8c, 0x3c020080, 0x621024, 0x1040001f,
-0x3402a001, 0x3c010001, 0x8004f25, 0xac224e8c, 0x3c020020, 0x2021024,
-0x10400007, 0x111940, 0x24020100, 0x3c010001, 0x230821, 0xac226f24,
-0x8004f19, 0x3c020080, 0x111140, 0x3c010001, 0x220821, 0xac206f24,
+0xa01021, 0x8f830044, 0x3c02fff0, 0x3442ffff, 0x42480, 0x621824,
+0x3c020002, 0x822025, 0x641825, 0xaf830044, 0x8f820044, 0x3c030001,
+0x431025, 0xaf820044, 0x8f830054, 0x8f820054, 0x8004bd1, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044,
+0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054,
+0x8004bdf, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
+0x0, 0x3e00008, 0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff,
+0x431024, 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, 0xaf820044,
+0x8f830054, 0x8f820054, 0x8004bf3, 0x24630001, 0x8f820054, 0x621023,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff,
+0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x8004c01, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008,
+0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x3c030001, 0x771821,
+0x8c63839c, 0x24020008, 0x1462021c, 0x803021, 0x3c020001, 0x8c425098,
+0x14400033, 0x0, 0x8f850224, 0x38a30020, 0x2c630001, 0x38a20010,
+0x2c420001, 0x621825, 0x1460000d, 0x38a30030, 0x2c630001, 0x38a20400,
+0x2c420001, 0x621825, 0x14600007, 0x38a30402, 0x2c630001, 0x38a20404,
+0x2c420001, 0x621825, 0x10600005, 0x0, 0xc00428b, 0x0,
+0x8004c41, 0x2402000e, 0xc0043cd, 0x0, 0x3c050001, 0x8ca54ffc,
+0xc004fb3, 0x24040001, 0x3c030001, 0x8c634ffc, 0x24020004, 0x14620005,
+0x2403fffb, 0x3c020001, 0x8c424ff8, 0x8004c3d, 0x2403fff7, 0x3c020001,
+0x8c424ff8, 0x431024, 0x3c010001, 0xac224ff8, 0x2402000e, 0x3c010001,
+0xc00428b, 0xac2270c0, 0x8004e2b, 0x0, 0x8f820220, 0x3c030400,
+0x431024, 0x10400027, 0x2403ffbf, 0x8f850224, 0x3c020001, 0x8c4270cc,
+0xa32024, 0x431024, 0x1482000c, 0x0, 0x3c020001, 0x8c4270d0,
+0x24420001, 0x3c010001, 0xac2270d0, 0x2c420002, 0x14400008, 0x24020001,
+0x3c010001, 0x8004c61, 0xac2270f0, 0x3c010001, 0xac2070d0, 0x3c010001,
+0xac2070f0, 0x3c020001, 0x8c4270f0, 0x10400006, 0x30a20040, 0x10400004,
+0x24020001, 0x3c010001, 0x8004c6c, 0xac2270f4, 0x3c010001, 0xac2070f4,
+0x3c010001, 0xac2570cc, 0x3c010001, 0x8004c7c, 0xac207100, 0x24020001,
+0x3c010001, 0xac227100, 0x3c010001, 0xac2070f0, 0x3c010001, 0xac2070d0,
+0x3c010001, 0xac2070f4, 0x3c010001, 0xac2070cc, 0x3c030001, 0x8c6370c0,
+0x3c020001, 0x8c4270c4, 0x10620003, 0x3c020200, 0x3c010001, 0xac2370c4,
+0xc21024, 0x10400007, 0x2463ffff, 0x8f820220, 0x24030001, 0x3c010001,
+0xac235000, 0x8004e29, 0x3c03f700, 0x2c62000e, 0x10400198, 0x31080,
+0x3c010001, 0x220821, 0x8c224ed0, 0x400008, 0x0, 0x8ee20000,
+0x3c03fdff, 0x3463ffff, 0x431024, 0xaee20000, 0x3c010001, 0xac2070f0,
+0x3c010001, 0xac2070d0, 0x3c010001, 0xac207100, 0x3c010001, 0xac2070cc,
+0x3c010001, 0xac2070f4, 0x3c010001, 0xac2070e8, 0x3c010001, 0xac2070e0,
+0xc00478a, 0xaf800224, 0x24020002, 0x3c010001, 0xac2270c0, 0xc00428b,
+0x0, 0xaf800204, 0x8f820200, 0x2403fffd, 0x431024, 0xaf820200,
+0x3c010001, 0xac207110, 0x8f830054, 0x3c020001, 0x8c4270e8, 0x24040001,
+0x3c010001, 0xac2470fc, 0x24420001, 0x3c010001, 0xac2270e8, 0x2c420004,
+0x3c010001, 0xac2370e4, 0x14400006, 0x24020003, 0x3c010001, 0xac245000,
+0x3c010001, 0x8004e27, 0xac2070e8, 0x3c010001, 0x8004e27, 0xac2270c0,
+0x8f830054, 0x3c020001, 0x8c4270e4, 0x2463d8f0, 0x431023, 0x2c422710,
+0x14400154, 0x24020004, 0x3c010001, 0x8004e27, 0xac2270c0, 0x3c040001,
+0x8c84509c, 0x3c010001, 0xc004e2e, 0xac2070d8, 0x3c020001, 0x8c42710c,
+0xaf820204, 0x8f820204, 0x30420030, 0x1440013c, 0x24020002, 0x3c030001,
+0x8c63710c, 0x24020005, 0x3c010001, 0xac2270c0, 0x3c010001, 0x8004e27,
+0xac237110, 0x3c020001, 0x8c4270f0, 0x10400139, 0x0, 0x3c020001,
+0x8c4270cc, 0x10400135, 0x0, 0x3c010001, 0xac2270f8, 0x24020003,
+0x3c010001, 0xac2270d0, 0x8004dba, 0x24020006, 0x3c010001, 0xac2070d8,
+0x8f820204, 0x34420040, 0xaf820204, 0x3c020001, 0x8c427110, 0x24030007,
+0x3c010001, 0xac2370c0, 0x34420040, 0x3c010001, 0xac227110, 0x3c020001,
+0x8c4270f0, 0x10400005, 0x0, 0x3c020001, 0x8c4270cc, 0x10400110,
+0x24020002, 0x3c050001, 0x24a570d0, 0x8ca20000, 0x2c424e21, 0x1040010a,
+0x24020002, 0x3c020001, 0x8c4270f4, 0x1040010f, 0x2404ffbf, 0x3c020001,
+0x8c4270cc, 0x3c030001, 0x8c6370f8, 0x441024, 0x641824, 0x14430007,
+0x24020001, 0x24020003, 0xaca20000, 0x24020008, 0x3c010001, 0x8004e27,
+0xac2270c0, 0x3c010001, 0x8004e27, 0xac2270c0, 0x3c020001, 0x8c4270fc,
+0x1040000c, 0x24020001, 0x3c040001, 0xc004e3b, 0x8c8470cc, 0x3c020001,
+0x8c427118, 0x14400005, 0x24020001, 0x3c020001, 0x8c427114, 0x10400006,
+0x24020001, 0x3c010001, 0xac225000, 0x3c010001, 0x8004e27, 0xac2070e8,
+0x8f820204, 0x34420040, 0xaf820204, 0x3c020001, 0x8c427110, 0x3c030001,
+0x8c6370e0, 0x34420040, 0x3c010001, 0xac227110, 0x3c020001, 0x8c4270cc,
+0x2c630001, 0x318c0, 0x3c010001, 0xac2370e0, 0x30420008, 0x3c010001,
+0xac2270dc, 0x8f830054, 0x24020009, 0x3c010001, 0xac2270c0, 0x3c010001,
+0x8004e27, 0xac2370e4, 0x8f830054, 0x3c020001, 0x8c4270e4, 0x2463d8f0,
+0x431023, 0x2c422710, 0x144000b6, 0x0, 0x3c020001, 0x8c4270f0,
+0x10400005, 0x0, 0x3c020001, 0x8c4270cc, 0x104000b7, 0x24020002,
+0x3c030001, 0x246370d0, 0x8c620000, 0x2c424e21, 0x104000b1, 0x24020002,
+0x3c020001, 0x8c4270fc, 0x1040000e, 0x0, 0x3c020001, 0x8c4270cc,
+0x3c010001, 0xac2070fc, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204,
+0x30420080, 0x1440000c, 0x24020003, 0x8004da7, 0x2402000c, 0x3c020001,
+0x8c4270cc, 0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080,
+0x1040001f, 0x24020003, 0xac620000, 0x2402000a, 0x3c010001, 0xac2270c0,
+0x3c040001, 0x24847108, 0x8c820000, 0x3c030001, 0x8c6370e0, 0x431025,
+0xaf820204, 0x8c830000, 0x3c040001, 0x8c8470e0, 0x2402000b, 0x3c010001,
+0xac2270c0, 0x641825, 0x3c010001, 0xac237110, 0x3c050001, 0x24a570d0,
+0x8ca20000, 0x2c424e21, 0x1040007d, 0x24020002, 0x3c020001, 0x8c427100,
+0x10400005, 0x0, 0x2402000c, 0x3c010001, 0x8004e27, 0xac2270c0,
+0x3c020001, 0x8c4270f0, 0x1040007a, 0x0, 0x3c040001, 0x8c8470cc,
+0x1080006c, 0x30820008, 0x3c030001, 0x8c6370dc, 0x10620072, 0x24020003,
+0x3c010001, 0xac2470f8, 0xaca20000, 0x24020006, 0x3c010001, 0x8004e27,
+0xac2270c0, 0x8f8400f0, 0x276217f8, 0x14820002, 0x24850008, 0x27651000,
+0x8f8200f4, 0x10a20007, 0x3c038000, 0x34630040, 0x3c020001, 0x24424fa0,
+0xac820000, 0xac830004, 0xaf8500f0, 0x8f820200, 0x34420002, 0xaf820200,
+0x8f830054, 0x2402000d, 0x3c010001, 0xac2270c0, 0x3c010001, 0xac2370e4,
+0x8f830054, 0x3c020001, 0x8c4270e4, 0x2463d8f0, 0x431023, 0x2c422710,
+0x1440003a, 0x0, 0x3c020001, 0x8c427100, 0x10400029, 0x2402000e,
+0x3c030001, 0x8c637114, 0x3c010001, 0x14600015, 0xac2270c0, 0xc0043cd,
+0x0, 0x3c050001, 0x8ca54ffc, 0xc004fb3, 0x24040001, 0x3c030001,
+0x8c634ffc, 0x24020004, 0x14620005, 0x2403fffb, 0x3c020001, 0x8c424ff8,
+0x8004df6, 0x2403fff7, 0x3c020001, 0x8c424ff8, 0x431024, 0x3c010001,
+0xac224ff8, 0x8ee20000, 0x3c030200, 0x431025, 0xaee20000, 0x8f820224,
+0x3c010001, 0xac22711c, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220,
+0x8f820220, 0x34420002, 0x8004e27, 0xaf820220, 0x3c020001, 0x8c4270f0,
+0x10400005, 0x0, 0x3c020001, 0x8c4270cc, 0x1040000f, 0x24020002,
+0x3c020001, 0x8c4270d0, 0x2c424e21, 0x1040000a, 0x24020002, 0x3c020001,
+0x8c4270f0, 0x1040000f, 0x0, 0x3c020001, 0x8c4270cc, 0x1440000b,
+0x0, 0x24020002, 0x3c010001, 0x8004e27, 0xac2270c0, 0x3c020001,
+0x8c4270f0, 0x10400003, 0x0, 0xc00428b, 0x0, 0x8f820220,
+0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, 0x27bd0018,
+0x3c030001, 0x24637118, 0x8c620000, 0x10400005, 0x34422000, 0x3c010001,
+0xac22710c, 0x8004e39, 0xac600000, 0x3c010001, 0xac24710c, 0x3e00008,
+0x0, 0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010001, 0xac227114,
+0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030,
+0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, 0x21200,
+0x3c040001, 0x8c84509c, 0x621825, 0x331c2, 0x3c030001, 0x2463507c,
+0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2,
+0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025,
+0x0, 0x10600007, 0x24020002, 0x10620013, 0x24020003, 0x1062002c,
+0x3c05000f, 0x8004e9d, 0x0, 0x8f820200, 0x2403feff, 0x431024,
+0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220,
+0x3c010001, 0xac207154, 0x3c010001, 0x8004ea8, 0xac20715c, 0x8f820200,
+0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024,
+0xaf820220, 0x24020100, 0x3c010001, 0xac227154, 0x3c010001, 0x8004ea8,
+0xac20715c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220,
+0x3c030001, 0x431025, 0xaf820220, 0x3c010001, 0xac207154, 0x3c010001,
+0x8004ea8, 0xac23715c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220,
+0x3c030001, 0x431025, 0xaf820220, 0x24020100, 0x3c010001, 0xac227154,
+0x3c010001, 0x8004ea8, 0xac23715c, 0x34a5ffff, 0x3c040001, 0x24844f08,
+0xafa30010, 0xc002403, 0xafa00014, 0x8004ea8, 0x0, 0x24020030,
+0x3c010001, 0xac227118, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0,
+0x27bdffc8, 0xafb10024, 0x808821, 0xafb3002c, 0xa09821, 0xafb00020,
+0xc08021, 0x3c040001, 0x24844f20, 0x3c050009, 0x3c020001, 0x8c424ffc,
+0x34a59001, 0x2203021, 0x2603821, 0xafbf0030, 0xafb20028, 0xa7a0001a,
+0xafb00014, 0xc002403, 0xafa20010, 0x24020002, 0x126200e9, 0x2e620003,
+0x10400005, 0x24020001, 0x1262000a, 0x3c02fffb, 0x8004fac, 0x0,
+0x24020004, 0x1262006d, 0x24020008, 0x1262006c, 0x3c02ffec, 0x8004fac,
+0x0, 0x3442ffff, 0x2028024, 0x119140, 0x3c010001, 0x320821,
+0xac30712c, 0x3c024000, 0x2021024, 0x10400046, 0x1023c2, 0x30840030,
+0x101382, 0x3042000c, 0x3c030001, 0x24635024, 0x431021, 0x823821,
+0x3c020020, 0x2021024, 0x10400006, 0x24020100, 0x3c010001, 0x320821,
+0xac227130, 0x8004eef, 0x3c020080, 0x3c010001, 0x320821, 0xac207130,
0x3c020080, 0x2021024, 0x10400006, 0x111940, 0x3c020001, 0x3c010001,
-0x230821, 0x8004f25, 0xac226f2c, 0x111140, 0x3c010001, 0x220821,
-0xac206f2c, 0x3c030001, 0x8c634dec, 0x24020001, 0x10620003, 0x0,
-0xc0041e7, 0x0, 0x8fbf0030, 0x8fb3002c, 0x8fb20028, 0x8fb10024,
-0x8fb00020, 0x3e00008, 0x27bd0038, 0x27bdffd0, 0xafb40028, 0x80a021,
-0xafb20020, 0x9021, 0xafb30024, 0x9821, 0xafb1001c, 0x8821,
-0x24020002, 0xafbf002c, 0xafb00018, 0xa7a00012, 0x10a20068, 0xa7a00010,
-0x2ca20003, 0x10400005, 0x24020001, 0x10a2000a, 0x148140, 0x8004ff0,
-0x2201021, 0x24020004, 0x10a2005e, 0x24020008, 0x10a2005d, 0x142140,
-0x8004ff0, 0x2201021, 0x3c030001, 0x701821, 0x8c636f1c, 0x3c024000,
-0x621024, 0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, 0x628824,
-0x3c010001, 0x300821, 0xac316f14, 0x8004ff0, 0x2201021, 0x24050001,
-0xc004740, 0x27a60010, 0x24040001, 0x24050001, 0xc004740, 0x27a60010,
-0x97a20010, 0x30420004, 0x10400034, 0x3c114000, 0x3c030001, 0x8c634e9c,
-0x24020003, 0x10620008, 0x2c620004, 0x14400029, 0x3c028000, 0x24020004,
-0x10620014, 0x24040001, 0x8004f99, 0x3c028000, 0x24040001, 0x24050011,
-0x27b00012, 0xc004740, 0x2003021, 0x24040001, 0x24050011, 0xc004740,
-0x2003021, 0x97a30012, 0x30624000, 0x10400002, 0x3c130010, 0x3c130008,
-0x3c120001, 0x8004f96, 0x30628000, 0x24050014, 0x27b00012, 0xc004740,
-0x2003021, 0x24040001, 0x24050014, 0xc004740, 0x2003021, 0x97a30012,
-0x30621000, 0x10400002, 0x3c130010, 0x3c130008, 0x3c120001, 0x30620800,
-0x54400001, 0x3c120002, 0x3c028000, 0x2221025, 0x2531825, 0x8004fa3,
-0x438825, 0x3c110001, 0x2308821, 0x8e316f1c, 0x3c027fff, 0x3442ffff,
-0x2228824, 0x141140, 0x3c010001, 0x220821, 0xac316f14, 0x8004ff0,
-0x2201021, 0x142140, 0x3c030001, 0x641821, 0x8c636f18, 0x3c024000,
-0x621024, 0x14400008, 0x3c027fff, 0x3442ffff, 0x628824, 0x3c010001,
-0x240821, 0xac316f10, 0x8004ff0, 0x2201021, 0x3c020001, 0x8c424dfc,
-0x1040002d, 0x3c11c00c, 0x3c020001, 0x8c424e88, 0x3c03e00c, 0x3c010001,
-0x240821, 0x8c246f24, 0x2102b, 0x21023, 0x431024, 0x10800004,
-0x518825, 0x3c020020, 0x8004fcd, 0x2228825, 0x3c02ffdf, 0x3442ffff,
-0x2228824, 0x141140, 0x3c010001, 0x220821, 0x8c226f2c, 0x10400003,
-0x3c020080, 0x8004fd8, 0x2228825, 0x3c02ff7f, 0x3442ffff, 0x2228824,
-0x3c020001, 0x8c424e60, 0x10400002, 0x3c020800, 0x2228825, 0x3c020001,
-0x8c424e64, 0x10400002, 0x3c020400, 0x2228825, 0x3c020001, 0x8c424e68,
-0x10400006, 0x3c020100, 0x8004feb, 0x2228825, 0x3c027fff, 0x3442ffff,
-0x628824, 0x141140, 0x3c010001, 0x220821, 0xac316f10, 0x2201021,
-0x8fbf002c, 0x8fb40028, 0x8fb30024, 0x8fb20020, 0x8fb1001c, 0x8fb00018,
-0x3e00008, 0x27bd0030, 0x27bdffd8, 0xafb40020, 0x80a021, 0xafbf0024,
-0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010, 0x8f900200, 0x3c030001,
-0x8c634dec, 0x8f930220, 0x24020002, 0x106200b1, 0x2c620003, 0x10400005,
-0x24020001, 0x1062000a, 0x141940, 0x80050b7, 0x0, 0x24020004,
-0x1062005a, 0x24020008, 0x10620059, 0x149140, 0x80050b7, 0x0,
-0x3c040001, 0x832021, 0x8c846f1c, 0x3c110001, 0x2238821, 0x8e316f14,
-0x3c024000, 0x821024, 0x1040003e, 0x3c020008, 0x2221024, 0x10400020,
-0x36100002, 0x3c020001, 0x431021, 0x8c426f20, 0x10400005, 0x36100020,
-0x36100100, 0x3c020020, 0x800502f, 0x2228825, 0x2402feff, 0x2028024,
+0x230821, 0x8004efb, 0xac227138, 0x111140, 0x3c010001, 0x220821,
+0xac207138, 0x94e30000, 0x32024000, 0x10400003, 0xa7a30018, 0x34624000,
+0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, 0x24e60002, 0x34420001,
+0xc004802, 0xa4e20002, 0x24040001, 0x2821, 0xc004802, 0x27a60018,
+0x3c020001, 0x8c424ffc, 0x24110001, 0x3c010001, 0xac315008, 0x14530004,
+0x32028000, 0xc00428b, 0x0, 0x32028000, 0x10400095, 0x0,
+0xc00428b, 0x0, 0x24020002, 0x3c010001, 0xac315000, 0x3c010001,
+0x8004fac, 0xac224ffc, 0x24040001, 0x24050004, 0x27b0001a, 0xc004802,
+0x2003021, 0x24040001, 0x2821, 0xc004802, 0x2003021, 0x3c020001,
+0x521021, 0x8c427124, 0x3c040001, 0x8c844ffc, 0x3c03bfff, 0x3463ffff,
+0x3c010001, 0xac335008, 0x431024, 0x3c010001, 0x320821, 0x10930074,
+0xac227124, 0x8004fac, 0x0, 0x3c02ffec, 0x3442ffff, 0x2028024,
+0x3c020008, 0x2028025, 0x111140, 0x3c010001, 0x220821, 0xac307128,
+0x3c022000, 0x2021024, 0x10400005, 0x24020001, 0x3c010001, 0xac225098,
+0x8004f4d, 0x3c024000, 0x3c010001, 0xac205098, 0x3c024000, 0x2021024,
+0x1440001c, 0x0, 0x3c020001, 0x8c425098, 0x10400007, 0x24022020,
+0x3c010001, 0xac22509c, 0x24020001, 0x3c010001, 0x370821, 0xac22839c,
+0x3c04bfff, 0x111940, 0x3c020001, 0x431021, 0x8c427120, 0x3c050001,
+0x8ca54ffc, 0x3484ffff, 0x441024, 0x3c010001, 0x230821, 0xac227120,
+0x24020001, 0x10a20044, 0x0, 0x8004faa, 0x0, 0x3c020001,
+0x8c425098, 0x1040001c, 0x24022000, 0x3c010001, 0xac22509c, 0x3c0300a0,
+0x2031024, 0x14430005, 0x111140, 0x3402a000, 0x3c010001, 0x8004fa5,
+0xac22509c, 0x3c030001, 0x621821, 0x8c637128, 0x3c020020, 0x621024,
+0x10400004, 0x24022001, 0x3c010001, 0x8004fa5, 0xac22509c, 0x3c020080,
+0x621024, 0x1040001f, 0x3402a001, 0x3c010001, 0x8004fa5, 0xac22509c,
+0x3c020020, 0x2021024, 0x10400007, 0x111940, 0x24020100, 0x3c010001,
+0x230821, 0xac227134, 0x8004f99, 0x3c020080, 0x111140, 0x3c010001,
+0x220821, 0xac207134, 0x3c020080, 0x2021024, 0x10400006, 0x111940,
+0x3c020001, 0x3c010001, 0x230821, 0x8004fa5, 0xac22713c, 0x111140,
+0x3c010001, 0x220821, 0xac20713c, 0x3c030001, 0x8c634ffc, 0x24020001,
+0x10620003, 0x0, 0xc00428b, 0x0, 0x8fbf0030, 0x8fb3002c,
+0x8fb20028, 0x8fb10024, 0x8fb00020, 0x3e00008, 0x27bd0038, 0x27bdffd0,
+0xafb40028, 0x80a021, 0xafb20020, 0x9021, 0xafb30024, 0x9821,
+0xafb1001c, 0x8821, 0x24020002, 0xafbf002c, 0xafb00018, 0xa7a00012,
+0x10a20068, 0xa7a00010, 0x2ca20003, 0x10400005, 0x24020001, 0x10a2000a,
+0x148140, 0x8005070, 0x2201021, 0x24020004, 0x10a2005e, 0x24020008,
+0x10a2005d, 0x142140, 0x8005070, 0x2201021, 0x3c030001, 0x701821,
+0x8c63712c, 0x3c024000, 0x621024, 0x14400009, 0x24040001, 0x3c027fff,
+0x3442ffff, 0x628824, 0x3c010001, 0x300821, 0xac317124, 0x8005070,
+0x2201021, 0x24050001, 0xc0047c0, 0x27a60010, 0x24040001, 0x24050001,
+0xc0047c0, 0x27a60010, 0x97a20010, 0x30420004, 0x10400034, 0x3c114000,
+0x3c030001, 0x8c6350ac, 0x24020003, 0x10620008, 0x2c620004, 0x14400029,
+0x3c028000, 0x24020004, 0x10620014, 0x24040001, 0x8005019, 0x3c028000,
+0x24040001, 0x24050011, 0x27b00012, 0xc0047c0, 0x2003021, 0x24040001,
+0x24050011, 0xc0047c0, 0x2003021, 0x97a30012, 0x30624000, 0x10400002,
+0x3c130010, 0x3c130008, 0x3c120001, 0x8005016, 0x30628000, 0x24050014,
+0x27b00012, 0xc0047c0, 0x2003021, 0x24040001, 0x24050014, 0xc0047c0,
+0x2003021, 0x97a30012, 0x30621000, 0x10400002, 0x3c130010, 0x3c130008,
+0x3c120001, 0x30620800, 0x54400001, 0x3c120002, 0x3c028000, 0x2221025,
+0x2531825, 0x8005023, 0x438825, 0x3c110001, 0x2308821, 0x8e31712c,
+0x3c027fff, 0x3442ffff, 0x2228824, 0x141140, 0x3c010001, 0x220821,
+0xac317124, 0x8005070, 0x2201021, 0x142140, 0x3c030001, 0x641821,
+0x8c637128, 0x3c024000, 0x621024, 0x14400008, 0x3c027fff, 0x3442ffff,
+0x628824, 0x3c010001, 0x240821, 0xac317120, 0x8005070, 0x2201021,
+0x3c020001, 0x8c42500c, 0x1040002d, 0x3c11c00c, 0x3c020001, 0x8c425098,
+0x3c03e00c, 0x3c010001, 0x240821, 0x8c247134, 0x2102b, 0x21023,
+0x431024, 0x10800004, 0x518825, 0x3c020020, 0x800504d, 0x2228825,
0x3c02ffdf, 0x3442ffff, 0x2228824, 0x141140, 0x3c010001, 0x220821,
-0x8c226f28, 0x10400005, 0x3c020001, 0x2629825, 0x3c020080, 0x800504e,
-0x2228825, 0x3c02fffe, 0x3442ffff, 0x2629824, 0x3c02ff7f, 0x3442ffff,
-0x800504e, 0x2228824, 0x2402fedf, 0x2028024, 0x3c02fffe, 0x3442ffff,
-0x2629824, 0x3c02ff5f, 0x3442ffff, 0x2228824, 0x3c010001, 0x230821,
-0xac206f20, 0x3c010001, 0x230821, 0xac206f28, 0xc00470a, 0x0,
-0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220,
-0x8f820220, 0x34420002, 0xaf820220, 0x8005065, 0x141140, 0x8f820200,
-0x2403fffd, 0x431024, 0xc00470a, 0xaf820200, 0x3c02bfff, 0x3442ffff,
-0xc0041e7, 0x2228824, 0x141140, 0x3c010001, 0x220821, 0x80050b7,
-0xac316f14, 0x149140, 0x3c040001, 0x922021, 0x8c846f18, 0x3c110001,
-0x2328821, 0x8e316f10, 0x3c024000, 0x821024, 0x14400011, 0x0,
-0x3c020001, 0x8c424e88, 0x14400006, 0x3c02bfff, 0x8f820200, 0x34420002,
-0xc00470a, 0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc0041e7, 0x2228824,
-0x3c010001, 0x320821, 0x80050b7, 0xac316f10, 0x3c020001, 0x8c424e88,
-0x1440002d, 0x141140, 0x3c020020, 0x821024, 0x10400007, 0x36100020,
-0x24020100, 0x3c010001, 0x320821, 0xac226f24, 0x8005097, 0x36100100,
-0x3c010001, 0x320821, 0xac206f24, 0x2402feff, 0x2028024, 0x3c020080,
-0x821024, 0x10400007, 0x141940, 0x3c020001, 0x3c010001, 0x230821,
-0xac226f2c, 0x80050a8, 0x2629825, 0x141140, 0x3c010001, 0x220821,
-0xac206f2c, 0x3c02fffe, 0x3442ffff, 0x2629824, 0xc00470a, 0x0,
-0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb, 0x431024, 0xaf820220,
-0x8f820220, 0x34420002, 0xaf820220, 0x141140, 0x3c010001, 0x220821,
-0xac316f10, 0x8fbf0024, 0x8fb40020, 0x8fb3001c, 0x8fb20018, 0x8fb10014,
-0x8fb00010, 0x3e00008, 0x27bd0028, 0x0, 0x0 };
-u32 tigonFwData[(MAX_DATA_LEN/4) + 1] = {
+0x8c22713c, 0x10400003, 0x3c020080, 0x8005058, 0x2228825, 0x3c02ff7f,
+0x3442ffff, 0x2228824, 0x3c020001, 0x8c425070, 0x10400002, 0x3c020800,
+0x2228825, 0x3c020001, 0x8c425074, 0x10400002, 0x3c020400, 0x2228825,
+0x3c020001, 0x8c425078, 0x10400006, 0x3c020100, 0x800506b, 0x2228825,
+0x3c027fff, 0x3442ffff, 0x628824, 0x141140, 0x3c010001, 0x220821,
+0xac317120, 0x2201021, 0x8fbf002c, 0x8fb40028, 0x8fb30024, 0x8fb20020,
+0x8fb1001c, 0x8fb00018, 0x3e00008, 0x27bd0030, 0x27bdffd8, 0xafb40020,
+0x80a021, 0xafbf0024, 0xafb3001c, 0xafb20018, 0xafb10014, 0xafb00010,
+0x8f900200, 0x3c030001, 0x8c634ffc, 0x8f930220, 0x24020002, 0x106200b1,
+0x2c620003, 0x10400005, 0x24020001, 0x1062000a, 0x141940, 0x8005137,
+0x0, 0x24020004, 0x1062005a, 0x24020008, 0x10620059, 0x149140,
+0x8005137, 0x0, 0x3c040001, 0x832021, 0x8c84712c, 0x3c110001,
+0x2238821, 0x8e317124, 0x3c024000, 0x821024, 0x1040003e, 0x3c020008,
+0x2221024, 0x10400020, 0x36100002, 0x3c020001, 0x431021, 0x8c427130,
+0x10400005, 0x36100020, 0x36100100, 0x3c020020, 0x80050af, 0x2228825,
+0x2402feff, 0x2028024, 0x3c02ffdf, 0x3442ffff, 0x2228824, 0x141140,
+0x3c010001, 0x220821, 0x8c227138, 0x10400005, 0x3c020001, 0x2629825,
+0x3c020080, 0x80050ce, 0x2228825, 0x3c02fffe, 0x3442ffff, 0x2629824,
+0x3c02ff7f, 0x3442ffff, 0x80050ce, 0x2228824, 0x2402fedf, 0x2028024,
+0x3c02fffe, 0x3442ffff, 0x2629824, 0x3c02ff5f, 0x3442ffff, 0x2228824,
+0x3c010001, 0x230821, 0xac207130, 0x3c010001, 0x230821, 0xac207138,
+0xc00478a, 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb,
+0x431024, 0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, 0x80050e5,
+0x141140, 0x8f820200, 0x2403fffd, 0x431024, 0xc00478a, 0xaf820200,
+0x3c02bfff, 0x3442ffff, 0xc00428b, 0x2228824, 0x141140, 0x3c010001,
+0x220821, 0x8005137, 0xac317124, 0x149140, 0x3c040001, 0x922021,
+0x8c847128, 0x3c110001, 0x2328821, 0x8e317120, 0x3c024000, 0x821024,
+0x14400011, 0x0, 0x3c020001, 0x8c425098, 0x14400006, 0x3c02bfff,
+0x8f820200, 0x34420002, 0xc00478a, 0xaf820200, 0x3c02bfff, 0x3442ffff,
+0xc00428b, 0x2228824, 0x3c010001, 0x320821, 0x8005137, 0xac317120,
+0x3c020001, 0x8c425098, 0x1440002d, 0x141140, 0x3c020020, 0x821024,
+0x10400007, 0x36100020, 0x24020100, 0x3c010001, 0x320821, 0xac227134,
+0x8005117, 0x36100100, 0x3c010001, 0x320821, 0xac207134, 0x2402feff,
+0x2028024, 0x3c020080, 0x821024, 0x10400007, 0x141940, 0x3c020001,
+0x3c010001, 0x230821, 0xac22713c, 0x8005128, 0x2629825, 0x141140,
+0x3c010001, 0x220821, 0xac20713c, 0x3c02fffe, 0x3442ffff, 0x2629824,
+0xc00478a, 0x0, 0xaf900200, 0xaf930220, 0x8f820220, 0x2403fffb,
+0x431024, 0xaf820220, 0x8f820220, 0x34420002, 0xaf820220, 0x141140,
+0x3c010001, 0x220821, 0xac317120, 0x8fbf0024, 0x8fb40020, 0x8fb3001c,
+0x8fb20018, 0x8fb10014, 0x8fb00010, 0x3e00008, 0x27bd0028, 0x0,
+0x0 };
+u32 tigonFwData[(MAX_DATA_LEN/4) + 1] __initdata = {
0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x416c7465, 0x6f6e2041,
0x63654e49, 0x43205600, 0x42424242, 0x0, 0x0, 0x0,
0x135430, 0x13e7fc, 0x0, 0x0, 0x0, 0x0,
@@ -2792,7 +2814,7 @@ u32 tigonFwData[(MAX_DATA_LEN/4) + 1] = {
0x12000060, 0x12000180, 0x120001e0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x30001, 0x1,
0x30201, 0x0, 0x0 };
-u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] = {
+u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = {
0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f66, 0x776d6169,
0x6e2e632c, 0x7620312e, 0x312e322e, 0x31312031, 0x3939382f, 0x30342f32,
@@ -2813,114 +2835,114 @@ u32 tigonFwRodata[(MAX_RODATA_LEN/4) + 1] = {
0x0, 0x6576526e, 0x6746756c, 0x6c000000, 0x0, 0x0,
0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f63, 0x6f6d6d61,
-0x6e642e63, 0x2c762031, 0x2e312e32, 0x2e382031, 0x3939382f, 0x30342f32,
-0x37203232, 0x3a31333a, 0x33392073, 0x6875616e, 0x67204578, 0x70202400,
-0x4e4f636f, 0x6d616e64, 0x0, 0x68737465, 0x5f455252, 0x0,
-0x412d4572, 0x72427563, 0x0, 0x4552524f, 0x522d4164, 0x64000000,
-0x656e714d, 0x45765046, 0x61696c00, 0x656e714d, 0x45764661, 0x696c0000,
-0x6661696c, 0x456e454d, 0x0, 0x442d4572, 0x724c6173, 0x74000000,
-0x442d4572, 0x72320000, 0x6d437374, 0x4d644552, 0x52000000, 0x70726f6d,
-0x4d644552, 0x52000000, 0x46696c74, 0x4d644552, 0x52000000, 0x636d645f,
-0x45525200, 0x3f456e71, 0x45767400, 0x3f6e6f51, 0x64457650, 0x0,
-0x6576526e, 0x6746756c, 0x6c000000, 0x0, 0x6da4, 0x7e7c,
-0x6d3c, 0x85c8, 0x815c, 0x8614, 0x8614, 0x6e58,
-0x7578, 0x7dcc, 0x7f68, 0x7f34, 0x8614, 0x7d30,
-0x7f8c, 0x6d68, 0x808c, 0x0, 0x24486561, 0x6465723a,
-0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f64, 0x6d612e63, 0x2c762031, 0x2e312e32,
-0x2e332031, 0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 0x34312073,
-0x6875616e, 0x67204578, 0x70202400, 0x646d6172, 0x6441544e, 0x0,
-0x646d6177, 0x7241544e, 0x0, 0x0, 0x0, 0x0,
-0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
-0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f74, 0x72616365,
-0x2e632c76, 0x20312e31, 0x2e322e32, 0x20313939, 0x382f3034, 0x2f323720,
-0x32323a31, 0x333a3530, 0x20736875, 0x616e6720, 0x45787020, 0x24000000,
-0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
-0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d, 0x6f6e2f64, 0x6174612e,
-0x632c7620, 0x312e312e, 0x322e3220, 0x31393938, 0x2f30342f, 0x32372032,
-0x323a3133, 0x3a343020, 0x73687561, 0x6e672045, 0x78702024, 0x0,
-0x46575f56, 0x45525349, 0x4f4e3a20, 0x23312046, 0x7269204f, 0x63742031,
-0x36203130, 0x3a31333a, 0x30352050, 0x44542031, 0x39393800, 0x46575f43,
-0x4f4d5049, 0x4c455f54, 0x494d453a, 0x2031303a, 0x31333a30, 0x35000000,
-0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000,
-0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465,
-0x0, 0x46575f43, 0x4f4d5049, 0x4c455f44, 0x4f4d4149, 0x4e3a2065,
-0x6e672e61, 0x6374656f, 0x6e2e636f, 0x6d000000, 0x46575f43, 0x4f4d5049,
-0x4c45523a, 0x20676363, 0x20766572, 0x73696f6e, 0x20322e37, 0x2e320000,
+0x6e642e63, 0x2c762031, 0x2e312e31, 0x362e3120, 0x31393938, 0x2f31312f,
+0x31392030, 0x323a3339, 0x3a323520, 0x73687561, 0x6e672045, 0x78702024,
+0x0, 0x3f4d626f, 0x78457674, 0x0, 0x4e4f636f, 0x6d616e64,
+0x0, 0x68737465, 0x5f455252, 0x0, 0x412d4572, 0x72427563,
+0x0, 0x4552524f, 0x522d4164, 0x64000000, 0x656e714d, 0x45765046,
+0x61696c00, 0x656e714d, 0x45764661, 0x696c0000, 0x6661696c, 0x456e454d,
+0x0, 0x442d4572, 0x724c6173, 0x74000000, 0x442d4572, 0x72320000,
+0x6d437374, 0x4d644552, 0x52000000, 0x70726f6d, 0x4d644552, 0x52000000,
+0x46696c74, 0x4d644552, 0x52000000, 0x636d645f, 0x45525200, 0x3f456e71,
+0x45767400, 0x3f6e6f51, 0x64457650, 0x0, 0x6576526e, 0x6746756c,
+0x6c000000, 0x0, 0x6e90, 0x7fac, 0x6e28, 0x871c,
+0x8298, 0x8768, 0x8768, 0x6f44, 0x7684, 0x7efc,
+0x8098, 0x8064, 0x8768, 0x7e60, 0x80bc, 0x6e54,
+0x81bc, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f64, 0x6d612e63, 0x2c762031, 0x2e312e32, 0x2e332031, 0x3939382f,
+0x30342f32, 0x37203232, 0x3a31333a, 0x34312073, 0x6875616e, 0x67204578,
+0x70202400, 0x646d6172, 0x6441544e, 0x0, 0x646d6177, 0x7241544e,
0x0, 0x0, 0x0, 0x0, 0x24486561, 0x6465723a,
0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f6d, 0x656d2e63, 0x2c762031, 0x2e312e32,
-0x2e322031, 0x3939382f, 0x30342f32, 0x37203232, 0x3a31333a, 0x34342073,
-0x6875616e, 0x67204578, 0x70202400, 0x0, 0x24486561, 0x6465723a,
-0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f73, 0x656e642e, 0x632c7620, 0x312e312e,
-0x322e3820, 0x31393938, 0x2f30342f, 0x32372032, 0x323a3133, 0x3a343820,
-0x73687561, 0x6e672045, 0x78702024, 0x0, 0x736e6464, 0x654e6f51,
-0x20000000, 0x6e6f454e, 0x515f5458, 0x0, 0x736e6464, 0x744e6f51,
-0x20000000, 0x3f6e6f51, 0x64547845, 0x0, 0x756e6b72, 0x64747970,
-0x65000000, 0x0, 0xba70, 0xba70, 0xbb18, 0xac2c,
-0xae2c, 0xbb18, 0xbb18, 0xbb18, 0xbb18, 0xbb18,
-0xbb18, 0xbb18, 0xbb18, 0xbb18, 0xbb18, 0xbb18,
-0xbb18, 0xbb18, 0xbb18, 0xae14, 0x24486561, 0x6465723a,
-0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f72, 0x6563762e, 0x632c7620, 0x312e312e,
-0x322e3139, 0x20313939, 0x382f3037, 0x2f323420, 0x32313a33, 0x303a3035,
-0x20736875, 0x616e6720, 0x45787020, 0x24000000, 0x706b5278, 0x45525200,
-0x66726d32, 0x4c617267, 0x65000000, 0x72784e6f, 0x52784264, 0x0,
-0x72785144, 0x6d614446, 0x0, 0x72785144, 0x6d614246, 0x0,
-0x3f6e6f51, 0x64527845, 0x0, 0x706b5278, 0x45525273, 0x0,
-0x66726d32, 0x4c726753, 0x0, 0x72784e6f, 0x42645300, 0x3f724264,
-0x446d6146, 0x0, 0x3f724a42, 0x64446d46, 0x0, 0x0,
-0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0,
-0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0, 0xf3c0,
-0xf3c0, 0xf3c0, 0xf3c0, 0xf3b8, 0xf3b8, 0xf3b8,
-0x572d444d, 0x41456e46, 0x0, 0x0, 0xfafc, 0xfe80,
-0xfb18, 0xfe80, 0xfe80, 0xfe80, 0xfe80, 0xfe80,
-0xfe80, 0xf44c, 0xfe80, 0xfe80, 0xfe80, 0xfe80,
-0xfe80, 0xfe78, 0xfe78, 0xfe78, 0x24486561, 0x6465723a,
+0x2f66772f, 0x636f6d6d, 0x6f6e2f74, 0x72616365, 0x2e632c76, 0x20312e31,
+0x2e322e32, 0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 0x333a3530,
+0x20736875, 0x616e6720, 0x45787020, 0x24000000, 0x24486561, 0x6465723a,
0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f6d, 0x61632e63, 0x2c762031, 0x2e312e32,
-0x2e313220, 0x31393938, 0x2f30342f, 0x32372032, 0x323a3133, 0x3a343220,
-0x73687561, 0x6e672045, 0x78702024, 0x0, 0x6d616374, 0x7841544e,
-0x0, 0x4e745379, 0x6e264c6b, 0x0, 0x72656d61, 0x73737274,
-0x0, 0x6c696e6b, 0x444f574e, 0x0, 0x656e714d, 0x45765046,
-0x61696c00, 0x656e714d, 0x45764661, 0x696c0000, 0x6661696c, 0x456e454d,
-0x0, 0x6c696e6b, 0x55500000, 0x0, 0x24486561, 0x6465723a,
-0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
-0x2f66772f, 0x636f6d6d, 0x6f6e2f63, 0x6b73756d, 0x2e632c76, 0x20312e31,
-0x2e322e32, 0x20313939, 0x382f3034, 0x2f323720, 0x32323a31, 0x333a3339,
-0x20736875, 0x616e6720, 0x45787020, 0x24000000, 0x50726f62, 0x65506879,
-0x0, 0x6c6e6b41, 0x53535254, 0x0, 0x11680, 0x116b8,
-0x116dc, 0x11710, 0x1173c, 0x11750, 0x1178c, 0x11ac4,
-0x11864, 0x118a4, 0x118d4, 0x11914, 0x11944, 0x11980,
-0x119c4, 0x11ac4, 0x0, 0x0, 0x11f5c, 0x1202c,
-0x12104, 0x121d4, 0x12230, 0x1230c, 0x12334, 0x12410,
-0x12438, 0x125e0, 0x12608, 0x127b0, 0x129a8, 0x12c3c,
-0x12b50, 0x12c3c, 0x12c68, 0x127d8, 0x12980, 0x0,
-0x13054, 0x130b4, 0x13130, 0x1315c, 0x131ac, 0x131e8,
-0x1321c, 0x132a8, 0x13360, 0x13430, 0x13470, 0x134f4,
-0x13550, 0x13684, 0x646f4261, 0x73655067, 0x0, 0x0,
-0x0, 0x0, 0x73746d61, 0x634c4e4b, 0x0, 0x0,
-0x0 };
+0x2f66772f, 0x636f6d6d, 0x6f6e2f64, 0x6174612e, 0x632c7620, 0x312e312e,
+0x322e3220, 0x31393938, 0x2f30342f, 0x32372032, 0x323a3133, 0x3a343020,
+0x73687561, 0x6e672045, 0x78702024, 0x0, 0x46575f56, 0x45525349,
+0x4f4e3a20, 0x2331204d, 0x6f6e2044, 0x65632037, 0x2031343a, 0x35363a33,
+0x30205053, 0x54203139, 0x39380000, 0x46575f43, 0x4f4d5049, 0x4c455f54,
+0x494d453a, 0x2031343a, 0x35363a33, 0x30000000, 0x46575f43, 0x4f4d5049,
+0x4c455f42, 0x593a2064, 0x65767263, 0x73000000, 0x46575f43, 0x4f4d5049,
+0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465, 0x0, 0x46575f43,
+0x4f4d5049, 0x4c455f44, 0x4f4d4149, 0x4e3a2065, 0x6e672e61, 0x6374656f,
+0x6e2e636f, 0x6d000000, 0x46575f43, 0x4f4d5049, 0x4c45523a, 0x20676363,
+0x20766572, 0x73696f6e, 0x20322e37, 0x2e320000, 0x0, 0x0,
+0x0, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f6d, 0x656d2e63, 0x2c762031, 0x2e312e32, 0x2e322031, 0x3939382f,
+0x30342f32, 0x37203232, 0x3a31333a, 0x34342073, 0x6875616e, 0x67204578,
+0x70202400, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f73, 0x656e642e, 0x632c7620, 0x312e312e, 0x322e3820, 0x31393938,
+0x2f30342f, 0x32372032, 0x323a3133, 0x3a343820, 0x73687561, 0x6e672045,
+0x78702024, 0x0, 0x736e6464, 0x654e6f51, 0x20000000, 0x6e6f454e,
+0x515f5458, 0x0, 0x736e6464, 0x744e6f51, 0x20000000, 0x3f6e6f51,
+0x64547845, 0x0, 0x756e6b72, 0x64747970, 0x65000000, 0x0,
+0xbc88, 0xbc88, 0xbd30, 0xae2c, 0xb038, 0xbd30,
+0xbd30, 0xbd30, 0xbd30, 0xbd30, 0xbd30, 0xbd30,
+0xbd30, 0xbd30, 0xbd30, 0xbd30, 0xbd30, 0xbd30,
+0xbd30, 0xb020, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f72, 0x6563762e, 0x632c7620, 0x312e312e, 0x322e3139, 0x20313939,
+0x382f3037, 0x2f323420, 0x32313a33, 0x303a3035, 0x20736875, 0x616e6720,
+0x45787020, 0x24000000, 0x706b5278, 0x45525200, 0x66726d32, 0x4c617267,
+0x65000000, 0x72784e6f, 0x52784264, 0x0, 0x72785144, 0x6d614446,
+0x0, 0x72785144, 0x6d614246, 0x0, 0x3f6e6f51, 0x64527845,
+0x0, 0x706b5278, 0x45525273, 0x0, 0x66726d32, 0x4c726753,
+0x0, 0x72784e6f, 0x42645300, 0x3f724264, 0x446d6146, 0x0,
+0x3f724a42, 0x64446d46, 0x0, 0x0, 0xf638, 0xf638,
+0xf638, 0xf638, 0xf638, 0xf638, 0xf638, 0xf638,
+0xf638, 0xf638, 0xf638, 0xf638, 0xf638, 0xf638,
+0xf638, 0xf630, 0xf630, 0xf630, 0x572d444d, 0x41456e46,
+0x0, 0x0, 0xfd80, 0x1011c, 0xfd9c, 0x1011c,
+0x1011c, 0x1011c, 0x1011c, 0x1011c, 0x1011c, 0xf6c4,
+0x1011c, 0x1011c, 0x1011c, 0x1011c, 0x1011c, 0x10114,
+0x10114, 0x10114, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f6d, 0x61632e63, 0x2c762031, 0x2e312e32, 0x2e313220, 0x31393938,
+0x2f30342f, 0x32372032, 0x323a3133, 0x3a343220, 0x73687561, 0x6e672045,
+0x78702024, 0x0, 0x6d616374, 0x7841544e, 0x0, 0x4e745379,
+0x6e264c6b, 0x0, 0x72656d61, 0x73737274, 0x0, 0x6c696e6b,
+0x444f574e, 0x0, 0x656e714d, 0x45765046, 0x61696c00, 0x656e714d,
+0x45764661, 0x696c0000, 0x6661696c, 0x456e454d, 0x0, 0x6c696e6b,
+0x55500000, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
+0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f66772f, 0x636f6d6d,
+0x6f6e2f63, 0x6b73756d, 0x2e632c76, 0x20312e31, 0x2e322e32, 0x20313939,
+0x382f3034, 0x2f323720, 0x32323a31, 0x333a3339, 0x20736875, 0x616e6720,
+0x45787020, 0x24000000, 0x50726f62, 0x65506879, 0x0, 0x6c6e6b41,
+0x53535254, 0x0, 0x11880, 0x118b8, 0x118dc, 0x11910,
+0x1193c, 0x11950, 0x1198c, 0x11cc4, 0x11a64, 0x11aa4,
+0x11ad4, 0x11b14, 0x11b44, 0x11b80, 0x11bc4, 0x11cc4,
+0x0, 0x0, 0x1215c, 0x1222c, 0x12304, 0x123d4,
+0x12430, 0x1250c, 0x12534, 0x12610, 0x12638, 0x127e0,
+0x12808, 0x129b0, 0x12ba8, 0x12e3c, 0x12d50, 0x12e3c,
+0x12e68, 0x129d8, 0x12b80, 0x0, 0x13254, 0x132b4,
+0x13330, 0x1335c, 0x133ac, 0x133e8, 0x1341c, 0x134a8,
+0x13560, 0x13630, 0x13670, 0x136f4, 0x13750, 0x13884,
+0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0,
+0x73746d61, 0x634c4e4b, 0x0, 0x0, 0x0 };
/* Generated by genfw.c */
int tigon2FwReleaseMajor = 0xc;
int tigon2FwReleaseMinor = 0x1;
-int tigon2FwReleaseFix = 0x4;
+int tigon2FwReleaseFix = 0x6;
u32 tigon2FwStartAddr = 0x4000;
u32 tigon2FwTextAddr = 0x4000;
-int tigon2FwTextLen = 0xe480;
-u32 tigon2FwDataAddr = 0x131d0;
+int tigon2FwTextLen = 0xe5b0;
+u32 tigon2FwDataAddr = 0x13330;
int tigon2FwDataLen = 0x170;
-u32 tigon2FwRodataAddr = 0x12480;
-int tigon2FwRodataLen = 0xd30;
-u32 tigon2FwBssAddr = 0x133f0;
+u32 tigon2FwRodataAddr = 0x125b0;
+int tigon2FwRodataLen = 0xd60;
+u32 tigon2FwBssAddr = 0x13550;
int tigon2FwBssLen = 0x20c0;
-u32 tigon2FwSbssAddr = 0x13340;
+u32 tigon2FwSbssAddr = 0x134a0;
int tigon2FwSbssLen = 0xa8;
-u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
+u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] __initdata = {
0x0, 0x10000003, 0x0, 0xd, 0xd, 0x3c1d0001,
-0x8fbd3220, 0x3a0f021, 0x3c100000, 0x26104000, 0xc0010c0, 0x0,
-0xd, 0x3c1d0001, 0x8fbd3224, 0x3a0f021, 0x3c100000, 0x26104000,
+0x8fbd3380, 0x3a0f021, 0x3c100000, 0x26104000, 0xc0010c0, 0x0,
+0xd, 0x3c1d0001, 0x8fbd3384, 0x3a0f021, 0x3c100000, 0x26104000,
0xc0016fe, 0x0, 0xd, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
@@ -2930,14 +2952,14 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2000008, 0x0,
0x8001671, 0x3c0a0001, 0x8001671, 0x3c0a0002, 0x8001671, 0x0,
-0x8002994, 0x0, 0x8001671, 0x3c0a0003, 0x8001671, 0x3c0a0004,
-0x8003110, 0x0, 0x80019ba, 0x0, 0x8003608, 0x0,
-0x8003597, 0x0, 0x8001671, 0x3c0a0006, 0x8001671, 0x3c0a0007,
-0x8001671, 0x3c0a0008, 0x8001671, 0x3c0a0009, 0x8003679, 0x0,
-0x8002bd5, 0x0, 0x8001671, 0x3c0a000b, 0x8001671, 0x3c0a000c,
-0x8001671, 0x3c0a000d, 0x80026e0, 0x0, 0x80026b3, 0x0,
+0x80029b8, 0x0, 0x8001671, 0x3c0a0003, 0x8001671, 0x3c0a0004,
+0x8003134, 0x0, 0x80019ba, 0x0, 0x8003653, 0x0,
+0x80035e2, 0x0, 0x8001671, 0x3c0a0006, 0x8001671, 0x3c0a0007,
+0x8001671, 0x3c0a0008, 0x8001671, 0x3c0a0009, 0x80036c4, 0x0,
+0x8002bf9, 0x0, 0x8001671, 0x3c0a000b, 0x8001671, 0x3c0a000c,
+0x8001671, 0x3c0a000d, 0x80026ee, 0x0, 0x80026ad, 0x0,
0x8001671, 0x3c0a000e, 0x8001f40, 0x0, 0x80018c9, 0x0,
-0x800196b, 0x0, 0x80038f7, 0x0, 0x80038e1, 0x0,
+0x800196b, 0x0, 0x8003943, 0x0, 0x800392d, 0x0,
0x8001671, 0x0, 0x800184d, 0x0, 0x8001893, 0x0,
0x8001671, 0x3c0a0013, 0x8001671, 0x3c0a0014, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
@@ -2950,68 +2972,68 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
-0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xc0028d0, 0xd021, 0x8f820040,
+0x27bdffe0, 0x3c1cc000, 0xafbf0018, 0xc0028f4, 0xd021, 0x8f820040,
0x3c03f000, 0x431824, 0x3c025000, 0x10620005, 0x3c026000, 0x1062001a,
0x24020003, 0x10000030, 0x0, 0x8f820050, 0x3c030010, 0x431024,
-0x50400013, 0x24020003, 0x3c030001, 0x2463c2d0, 0x3c020001, 0x2442c354,
-0x431023, 0x3c010001, 0xac2333b8, 0x8f830140, 0x3c040001, 0x2484c35c,
-0x3c010001, 0xac2233a4, 0x3c020001, 0x2442c3c4, 0x3c010001, 0xac2031d8,
-0x10000013, 0x441023, 0x3c030001, 0x2463c3cc, 0xaf8200ec, 0x3c020001,
-0x2442c408, 0x431023, 0x3c010001, 0xac2333b8, 0x8f830140, 0x3c040001,
-0x2484c410, 0x3c010001, 0xac2233a4, 0x3c020001, 0x2442c438, 0x441023,
-0x3c0100c0, 0xac203ffc, 0x3c010001, 0xac2433b0, 0x3c010001, 0xac2233ac,
+0x50400013, 0x24020003, 0x3c030001, 0x2463c360, 0x3c020001, 0x2442c3e4,
+0x431023, 0x3c010001, 0xac233518, 0x8f830140, 0x3c040001, 0x2484c3ec,
+0x3c010001, 0xac223504, 0x3c020001, 0x2442c454, 0x3c010001, 0xac203338,
+0x10000013, 0x441023, 0x3c030001, 0x2463c45c, 0xaf8200ec, 0x3c020001,
+0x2442c498, 0x431023, 0x3c010001, 0xac233518, 0x8f830140, 0x3c040001,
+0x2484c4a0, 0x3c010001, 0xac223504, 0x3c020001, 0x2442c4c8, 0x441023,
+0x3c0100c0, 0xac203ffc, 0x3c010001, 0xac243510, 0x3c010001, 0xac22350c,
0x34630004, 0xaf830140, 0xc00169c, 0x0, 0x402821, 0x3c010001,
-0xac253350, 0x3c020008, 0x10a2002c, 0x45102b, 0x14400006, 0x3c020010,
+0xac2534b0, 0x3c020008, 0x10a2002c, 0x45102b, 0x14400006, 0x3c020010,
0x3c020004, 0x10a20007, 0x3c02ffff, 0x1000005b, 0x0, 0x10a20045,
-0x3c030003, 0x10000057, 0x0, 0x34422e10, 0x3c030001, 0x246354b0,
-0x3c040001, 0x8c8431d4, 0xa31823, 0x14800002, 0x622821, 0x24a5faa8,
-0x2403f000, 0xa32824, 0x51082, 0x431024, 0x3c010001, 0xac223340,
-0xa21023, 0x3c010001, 0xac223348, 0x3402a000, 0x3c010001, 0xac223358,
-0x24020008, 0x3c010001, 0xac223360, 0x2402001f, 0x3c010001, 0xac223368,
-0x24020016, 0x3c010001, 0xac22334c, 0x10000041, 0x3c08ffff, 0x3c02ffff,
-0x34422e10, 0x3c030001, 0x246354b0, 0x3c040001, 0x8c8431d4, 0xa31823,
+0x3c030003, 0x10000057, 0x0, 0x34422e10, 0x3c030001, 0x24635610,
+0x3c040001, 0x8c843334, 0xa31823, 0x14800002, 0x622821, 0x24a5faa8,
+0x2403f000, 0xa32824, 0x51082, 0x431024, 0x3c010001, 0xac2234a0,
+0xa21023, 0x3c010001, 0xac2234a8, 0x3402a000, 0x3c010001, 0xac2234b8,
+0x24020008, 0x3c010001, 0xac2234c0, 0x2402001f, 0x3c010001, 0xac2234c8,
+0x24020016, 0x3c010001, 0xac2234ac, 0x10000041, 0x3c08ffff, 0x3c02ffff,
+0x34422e10, 0x3c030001, 0x24635610, 0x3c040001, 0x8c843334, 0xa31823,
0x14800002, 0x622821, 0x24a5faa8, 0x2403f000, 0xa32824, 0x3c040003,
-0x34842000, 0x510c2, 0x431024, 0x3c010001, 0xac223340, 0xa21023,
-0x3c010001, 0xac223348, 0x24020008, 0x3c010001, 0xac223360, 0x2402001f,
-0x3c010001, 0xac223368, 0x24020016, 0x3c010001, 0xac243358, 0x3c010001,
-0xac22334c, 0x1000001f, 0x3c08ffff, 0x34632000, 0x3c020001, 0x3c010001,
-0xac223340, 0x3c020007, 0x3c010001, 0xac223348, 0x24020008, 0x3c010001,
-0xac223360, 0x2402001f, 0x3c010001, 0xac223368, 0x24020016, 0x3c010001,
-0xac233358, 0x3c010001, 0xac22334c, 0x1000000b, 0x3c08ffff, 0x3c040001,
-0x24842540, 0x3c050001, 0x8ca53350, 0x3021, 0x3821, 0xafa00010,
-0xc0028eb, 0xafa00014, 0x3c08ffff, 0x35087e10, 0x3c0500bf, 0x34a5f000,
-0x3c0600bf, 0x34c6e000, 0x3c070001, 0x8ce73340, 0x3c040001, 0x8c843348,
-0x3c030020, 0x3c090001, 0x8d2931d0, 0x671023, 0x441023, 0x245bb000,
-0x641823, 0x3c010001, 0xac233354, 0x671823, 0x27620ffc, 0x3c010001,
-0xac223220, 0x27621ffc, 0xbb2823, 0xdb3023, 0x3c010001, 0xac233344,
-0x3c010001, 0xac223224, 0xaf850150, 0xaf860250, 0x1120001b, 0x368b821,
-0x33620fff, 0x10400008, 0x24050019, 0x3c040001, 0x2484254c, 0x3603021,
-0x3821, 0xafa00010, 0xc0028eb, 0xafa00014, 0x3c1d0001, 0x8fbd31dc,
-0x3a0f021, 0xc001684, 0x0, 0x3c020001, 0x8c4231e0, 0x3c030001,
-0x8c6331e4, 0x2442fe00, 0x24630200, 0x3c010001, 0xac2231e0, 0x3c010001,
-0x10000004, 0xac2331e4, 0x3c1d0001, 0x8fbd3220, 0x3a0f021, 0x3c020001,
-0x8c4231d4, 0x1040000d, 0x26f6faa8, 0x3c020001, 0x8c4231e0, 0x3c030001,
-0x8c6331e4, 0x3c160001, 0x8ed631e4, 0x2442faa8, 0x24630558, 0x3c010001,
-0xac2231e0, 0x3c010001, 0xac2331e4, 0x3c020001, 0x8c4231d8, 0x14400003,
-0x0, 0x3c010001, 0xac2031e0, 0xc0011ca, 0x0, 0x8fbf0018,
+0x34842000, 0x510c2, 0x431024, 0x3c010001, 0xac2234a0, 0xa21023,
+0x3c010001, 0xac2234a8, 0x24020008, 0x3c010001, 0xac2234c0, 0x2402001f,
+0x3c010001, 0xac2234c8, 0x24020016, 0x3c010001, 0xac2434b8, 0x3c010001,
+0xac2234ac, 0x1000001f, 0x3c08ffff, 0x34632000, 0x3c020001, 0x3c010001,
+0xac2234a0, 0x3c020007, 0x3c010001, 0xac2234a8, 0x24020008, 0x3c010001,
+0xac2234c0, 0x2402001f, 0x3c010001, 0xac2234c8, 0x24020016, 0x3c010001,
+0xac2334b8, 0x3c010001, 0xac2234ac, 0x1000000b, 0x3c08ffff, 0x3c040001,
+0x24842670, 0x3c050001, 0x8ca534b0, 0x3021, 0x3821, 0xafa00010,
+0xc00290f, 0xafa00014, 0x3c08ffff, 0x35087e10, 0x3c0500bf, 0x34a5f000,
+0x3c0600bf, 0x34c6e000, 0x3c070001, 0x8ce734a0, 0x3c040001, 0x8c8434a8,
+0x3c030020, 0x3c090001, 0x8d293330, 0x671023, 0x441023, 0x245bb000,
+0x641823, 0x3c010001, 0xac2334b4, 0x671823, 0x27620ffc, 0x3c010001,
+0xac223380, 0x27621ffc, 0xbb2823, 0xdb3023, 0x3c010001, 0xac2334a4,
+0x3c010001, 0xac223384, 0xaf850150, 0xaf860250, 0x1120001b, 0x368b821,
+0x33620fff, 0x10400008, 0x24050019, 0x3c040001, 0x2484267c, 0x3603021,
+0x3821, 0xafa00010, 0xc00290f, 0xafa00014, 0x3c1d0001, 0x8fbd333c,
+0x3a0f021, 0xc001684, 0x0, 0x3c020001, 0x8c423340, 0x3c030001,
+0x8c633344, 0x2442fe00, 0x24630200, 0x3c010001, 0xac223340, 0x3c010001,
+0x10000004, 0xac233344, 0x3c1d0001, 0x8fbd3380, 0x3a0f021, 0x3c020001,
+0x8c423334, 0x1040000d, 0x26f6faa8, 0x3c020001, 0x8c423340, 0x3c030001,
+0x8c633344, 0x3c160001, 0x8ed63344, 0x2442faa8, 0x24630558, 0x3c010001,
+0xac223340, 0x3c010001, 0xac233344, 0x3c020001, 0x8c423338, 0x14400003,
+0x0, 0x3c010001, 0xac203340, 0xc0011ca, 0x0, 0x8fbf0018,
0x3e00008, 0x27bd0020, 0x27bdff98, 0xafbf0060, 0xafbe005c, 0xafb50058,
0xafb30054, 0xafb10050, 0x8f820240, 0x3c030001, 0x431025, 0xaf820240,
-0x3c020001, 0x8c4231e0, 0x3c030001, 0x8c6331e4, 0xaf800048, 0x8f840048,
+0x3c020001, 0x8c423340, 0x3c030001, 0x8c633344, 0xaf800048, 0x8f840048,
0x3c120000, 0x26524100, 0xa3a00047, 0xafa20034, 0x14800005, 0xafa30030,
0xaf800048, 0x8f820048, 0x10400004, 0x0, 0xaf800048, 0x10000003,
-0x2e02021, 0xaf80004c, 0x2e02021, 0xc00296c, 0x340581f0, 0x2c02021,
-0xc00296c, 0x24050558, 0x3c020001, 0x8c423344, 0x3c030001, 0x8c633340,
-0x3c040001, 0x8c843348, 0x3c050001, 0x8ca53358, 0x3c060001, 0x8cc63360,
-0x3c070001, 0x8ce73368, 0x3c080001, 0x8d08334c, 0xaec20534, 0x3c020001,
-0x8c423354, 0x8ec90534, 0xaec50544, 0x3c050001, 0x8ca53350, 0xaec00000,
+0x2e02021, 0xaf80004c, 0x2e02021, 0xc002990, 0x340581f0, 0x2c02021,
+0xc002990, 0x24050558, 0x3c020001, 0x8c4234a4, 0x3c030001, 0x8c6334a0,
+0x3c040001, 0x8c8434a8, 0x3c050001, 0x8ca534b8, 0x3c060001, 0x8cc634c0,
+0x3c070001, 0x8ce734c8, 0x3c080001, 0x8d0834ac, 0xaec20534, 0x3c020001,
+0x8c4234b4, 0x8ec90534, 0xaec50544, 0x3c050001, 0x8ca534b0, 0xaec00000,
0xaec3053c, 0xaec40540, 0xaec60548, 0xaec7054c, 0xaec80550, 0xaec20538,
0xafa90010, 0x8ec20538, 0xafa20014, 0x8ec6053c, 0x8ec70540, 0x3c040001,
-0xc0028eb, 0x24842558, 0xafb70010, 0xafb60014, 0x8ec60544, 0x8ec70548,
-0x3c040001, 0x24842560, 0xc0028eb, 0x24050001, 0x3c040001, 0x24842568,
-0x24050001, 0x24060001, 0x24070001, 0xafa00010, 0xc0028eb, 0xafa00014,
-0x3c020001, 0x8c423350, 0x3603821, 0x3c060001, 0x24c654b0, 0x2448ffff,
+0xc00290f, 0x24842688, 0xafb70010, 0xafb60014, 0x8ec60544, 0x8ec70548,
+0x3c040001, 0x24842690, 0xc00290f, 0x24050001, 0x3c040001, 0x24842698,
+0x24050001, 0x24060001, 0x24070001, 0xafa00010, 0xc00290f, 0xafa00014,
+0x3c020001, 0x8c4234b0, 0x3603821, 0x3c060001, 0x24c65610, 0x2448ffff,
0x1061824, 0xe81024, 0x43102b, 0x10400006, 0x24050002, 0x3c040001,
-0x24842570, 0xafa80010, 0xc0028eb, 0xafa00014, 0x24020001, 0xa2c20529,
+0x248426a0, 0xafa80010, 0xc00290f, 0xafa00014, 0x24020001, 0xa2c20529,
0xaf800054, 0xaf80011c, 0x8f420218, 0x30420002, 0x10400009, 0x0,
0x8f420220, 0x3c030002, 0x34630004, 0x431025, 0xaec20008, 0x8f42021c,
0x10000008, 0x34420004, 0x8f420220, 0x3c030002, 0x34630006, 0x431025,
@@ -3028,109 +3050,109 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x9482000a, 0xaca2009c, 0x8ca200b0, 0x8ec30010, 0x431025, 0xaca200b0,
0x8f8200b0, 0x30420004, 0x1440fffd, 0x0, 0x8ee20448, 0x8ee3044c,
0xaee304bc, 0x8ee204bc, 0x2442e000, 0x2c422001, 0x1440000d, 0x26c40128,
-0x8ee20448, 0x8ee3044c, 0x3c040001, 0x2484257c, 0x3c050001, 0xafa00010,
-0xafa00014, 0x8ee704bc, 0x34a5f000, 0xc0028eb, 0x603021, 0x26c40128,
-0xc00296c, 0x24050400, 0x27440080, 0xc00296c, 0x24050080, 0x8f42025c,
-0x26c4018c, 0xaec20158, 0x8f420260, 0x27450200, 0x24060008, 0xc00297e,
+0x8ee20448, 0x8ee3044c, 0x3c040001, 0x248426ac, 0x3c050001, 0xafa00010,
+0xafa00014, 0x8ee704bc, 0x34a5f000, 0xc00290f, 0x603021, 0x26c40128,
+0xc002990, 0x24050400, 0x27440080, 0xc002990, 0x24050080, 0x8f42025c,
+0x26c4018c, 0xaec20158, 0x8f420260, 0x27450200, 0x24060008, 0xc0029a2,
0xaec20160, 0x3c043b9a, 0x3484ca00, 0x2821, 0x24020006, 0x24030002,
0xaec2015c, 0x240203e8, 0xaec3016c, 0xaec30168, 0xaec40164, 0xaec201fc,
-0x24020001, 0xaec301f8, 0xaec20204, 0x3c030001, 0x651821, 0x906331e8,
+0x24020001, 0xaec301f8, 0xaec20204, 0x3c030001, 0x651821, 0x90633348,
0x2c51021, 0x24a50001, 0xa0430194, 0x2ca2000f, 0x1440fff8, 0x2c51821,
0x8f820040, 0x24a50001, 0x21702, 0x24420030, 0xa0620194, 0x2c51021,
-0xa0400194, 0xafa00010, 0x8fa20034, 0x3c040001, 0x24842588, 0xafa20014,
-0x8fa60030, 0x3821, 0xc0028eb, 0x2821, 0x3c040000, 0x24845990,
+0xa0400194, 0xafa00010, 0x8fa20034, 0x3c040001, 0x248426b8, 0xafa20014,
+0x8fa60030, 0x3821, 0xc00290f, 0x2821, 0x3c040000, 0x24845990,
0x24050010, 0x27b30030, 0x2603021, 0x27b10034, 0xc0016be, 0x2203821,
-0x3c030001, 0x8c6331d8, 0x3c15f000, 0x1060000a, 0xafa2003c, 0x8fa30030,
+0x3c030001, 0x8c633338, 0x3c15f000, 0x1060000a, 0xafa2003c, 0x8fa30030,
0x2405ff00, 0x8fa20034, 0x246400ff, 0x852024, 0x831823, 0x431023,
0xafa20034, 0xafa40030, 0x3c040000, 0x24844100, 0x24050108, 0x2603021,
0xc0016be, 0x2203821, 0x96e30452, 0x30630003, 0x1060005f, 0x409021,
0x8f820050, 0x3c030010, 0x431024, 0x10400021, 0x0, 0x8f820040,
0x3c035000, 0x551024, 0x14430009, 0x0, 0x96e60452, 0x8f820050,
-0xafa00014, 0xafa20010, 0x8f870040, 0x3c040001, 0x1000000d, 0x24842594,
+0xafa00014, 0xafa20010, 0x8f870040, 0x3c040001, 0x1000000d, 0x248426c4,
0x8f420218, 0x30420040, 0x1040000d, 0x24020001, 0x8f820050, 0x96e60452,
-0xafa20010, 0x8f420218, 0xafa20014, 0x8f870040, 0x3c040001, 0x2484259c,
-0xc0028eb, 0x2821, 0x10000004, 0x0, 0x3c010001, 0x370821,
-0xa02281ec, 0x3c040001, 0x24849a48, 0x3c050001, 0x24a59ac4, 0xa42823,
+0xafa20010, 0x8f420218, 0xafa20014, 0x8f870040, 0x3c040001, 0x248426cc,
+0xc00290f, 0x2821, 0x10000004, 0x0, 0x3c010001, 0x370821,
+0xa02281ec, 0x3c040001, 0x24849a34, 0x3c050001, 0x24a59aac, 0xa42823,
0x27b30030, 0x2603021, 0x8ec3000c, 0x27b10034, 0x2203821, 0x24020001,
0xa2c20020, 0xa2c20021, 0x34630a00, 0xc0016be, 0xaec3000c, 0x3c040001,
-0x2484ab64, 0x3c050001, 0x24a5af4c, 0xa42823, 0x2603021, 0x2203821,
-0xc0016be, 0xaec200a4, 0x3c040001, 0x2484b418, 0x3c050001, 0x24a5c2c8,
-0xa42823, 0x2603021, 0x3c010001, 0xac22339c, 0xc0016be, 0x2203821,
-0x3c040001, 0x2484dacc, 0x3c050001, 0x24a5e290, 0xa42823, 0x2603021,
-0x3c010001, 0xac2233a0, 0xc0016be, 0x2203821, 0x3c040001, 0x248425a4,
-0x96e60452, 0x24050011, 0x3821, 0x3c010001, 0xac2233bc, 0xafa00010,
-0xc0028eb, 0xafa00014, 0x10000028, 0x0, 0x3c040001, 0x2484989c,
-0x3c050001, 0x24a59a40, 0xa42823, 0x2603021, 0xc0016be, 0x2203821,
-0x3c040001, 0x2484a650, 0x3c050001, 0x24a5ab5c, 0xa42823, 0x2603021,
-0x2203821, 0xc0016be, 0xaec200a4, 0x3c040001, 0x2484af54, 0x3c050001,
-0x24a5b410, 0xa42823, 0x2603021, 0x3c010001, 0xac22339c, 0xc0016be,
-0x2203821, 0x3c040001, 0x2484d9e4, 0x3c050001, 0x24a5dac4, 0xa42823,
-0x2603021, 0x3c010001, 0xac2233a0, 0xc0016be, 0x2203821, 0x3c010001,
-0xac2233bc, 0x3c020001, 0x8c42339c, 0x3c050fff, 0x34a5ffff, 0x3c030001,
-0x8c6333a0, 0x3c040800, 0x451024, 0x21082, 0x441025, 0x651824,
-0xae420020, 0x3c020001, 0x8c4233bc, 0x31882, 0x641825, 0xae430080,
+0x2484abf4, 0x3c050001, 0x24a5afdc, 0xa42823, 0x2603021, 0x2203821,
+0xc0016be, 0xaec200a4, 0x3c040001, 0x2484b4a8, 0x3c050001, 0x24a5c358,
+0xa42823, 0x2603021, 0x3c010001, 0xac2234fc, 0xc0016be, 0x2203821,
+0x3c040001, 0x2484dbf8, 0x3c050001, 0x24a5e3bc, 0xa42823, 0x2603021,
+0x3c010001, 0xac223500, 0xc0016be, 0x2203821, 0x3c040001, 0x248426d4,
+0x96e60452, 0x24050011, 0x3821, 0x3c010001, 0xac22351c, 0xafa00010,
+0xc00290f, 0xafa00014, 0x10000028, 0x0, 0x3c040001, 0x24849890,
+0x3c050001, 0x24a59a2c, 0xa42823, 0x2603021, 0xc0016be, 0x2203821,
+0x3c040001, 0x2484a6e0, 0x3c050001, 0x24a5abec, 0xa42823, 0x2603021,
+0x2203821, 0xc0016be, 0xaec200a4, 0x3c040001, 0x2484afe4, 0x3c050001,
+0x24a5b4a0, 0xa42823, 0x2603021, 0x3c010001, 0xac2234fc, 0xc0016be,
+0x2203821, 0x3c040001, 0x2484db10, 0x3c050001, 0x24a5dbf0, 0xa42823,
+0x2603021, 0x3c010001, 0xac223500, 0xc0016be, 0x2203821, 0x3c010001,
+0xac22351c, 0x3c020001, 0x8c4234fc, 0x3c050fff, 0x34a5ffff, 0x3c030001,
+0x8c633500, 0x3c040800, 0x451024, 0x21082, 0x441025, 0x651824,
+0xae420020, 0x3c020001, 0x8c42351c, 0x31882, 0x641825, 0xae430080,
0x451024, 0x21082, 0x441025, 0xae420078, 0x96e20462, 0x30420003,
0x14400009, 0x0, 0x96e20472, 0x30420003, 0x1040007f, 0x27b30030,
0x96e20462, 0x30420003, 0x1040006d, 0x3c020700, 0x96e20472, 0x30420003,
0x10400069, 0x3c020700, 0x96e30472, 0x96e20462, 0x14620065, 0x3c020700,
0x8f82005c, 0x3c030080, 0x431024, 0x1040000b, 0x0, 0x8f820050,
0x96e60462, 0xafa20010, 0x8f82005c, 0xafa20014, 0x8f870040, 0x3c040001,
-0x248425b0, 0xc0028eb, 0x24051977, 0x8f820050, 0x3c030010, 0x431024,
+0x248426e0, 0xc00290f, 0x24051977, 0x8f820050, 0x3c030010, 0x431024,
0x10400022, 0x0, 0x8f820040, 0x3c03f000, 0x431024, 0x3c035000,
0x14430009, 0x0, 0x96e60462, 0x8f820050, 0xafa00014, 0xafa20010,
-0x8f870040, 0x3c040001, 0x1000000d, 0x24842594, 0x8f420218, 0x30420040,
+0x8f870040, 0x3c040001, 0x1000000d, 0x248426c4, 0x8f420218, 0x30420040,
0x1040000d, 0x24020001, 0x8f820050, 0x96e60462, 0xafa20010, 0x8f420218,
-0xafa20014, 0x8f870040, 0x3c040001, 0x2484259c, 0xc0028eb, 0x24050001,
+0xafa20014, 0x8f870040, 0x3c040001, 0x248426cc, 0xc00290f, 0x24050001,
0x10000004, 0x0, 0x3c010001, 0x370821, 0xa02281ec, 0x3c040001,
-0x2484981c, 0x3c050001, 0x24a59894, 0xa42823, 0x27b30030, 0x2603021,
+0x24849810, 0x3c050001, 0x24a59888, 0xa42823, 0x27b30030, 0x2603021,
0x8ec30004, 0x27b10034, 0x2203821, 0x24020001, 0xa2c2004c, 0x34630e00,
-0xc0016be, 0xaec30004, 0x3c040001, 0x2484cf2c, 0x3c050001, 0x24a5d654,
+0xc0016be, 0xaec30004, 0x3c040001, 0x2484d058, 0x3c050001, 0x24a5d780,
0xa42823, 0x2603021, 0x2203821, 0xc0016be, 0xaec200a8, 0x3c040001,
-0x2484dacc, 0x3c050001, 0x24a5e290, 0xa42823, 0x2603021, 0x3c010001,
-0xac2233b4, 0xc0016be, 0x2203821, 0x3c040001, 0x248425bc, 0x21900,
+0x2484dbf8, 0x3c050001, 0x24a5e3bc, 0xa42823, 0x2603021, 0x3c010001,
+0xac223514, 0xc0016be, 0x2203821, 0x3c040001, 0x248426ec, 0x21900,
0x31982, 0x3c050800, 0x651825, 0xae430078, 0x96e60462, 0x24050012,
-0x3c010001, 0xac2233bc, 0x1000000a, 0x3821, 0x34423000, 0x240a0001,
-0x3c040001, 0x248425c8, 0x3405f001, 0x3021, 0x3821, 0xa3aa0047,
-0xafa20020, 0xafa00010, 0xc0028eb, 0xafa00014, 0x10000015, 0x0,
-0x3c040001, 0x2484960c, 0x3c050001, 0x24a59814, 0xa42823, 0x2603021,
-0x27b10034, 0xc0016be, 0x2203821, 0x3c040001, 0x2484c4ec, 0x3c050001,
-0x24a5cf24, 0xa42823, 0x2603021, 0x2203821, 0xc0016be, 0xaec200a8,
-0x3c010001, 0xac2233b4, 0x3c020001, 0x8c4233b4, 0x3c030800, 0x21100,
+0x3c010001, 0xac22351c, 0x1000000a, 0x3821, 0x34423000, 0x240a0001,
+0x3c040001, 0x248426f8, 0x3405f001, 0x3021, 0x3821, 0xa3aa0047,
+0xafa20020, 0xafa00010, 0xc00290f, 0xafa00014, 0x10000015, 0x0,
+0x3c040001, 0x2484960c, 0x3c050001, 0x24a59808, 0xa42823, 0x2603021,
+0x27b10034, 0xc0016be, 0x2203821, 0x3c040001, 0x2484c57c, 0x3c050001,
+0x24a5d050, 0xa42823, 0x2603021, 0x2203821, 0xc0016be, 0xaec200a8,
+0x3c010001, 0xac223514, 0x3c020001, 0x8c423514, 0x3c030800, 0x21100,
0x21182, 0x431025, 0xae420038, 0x8f420218, 0x30420040, 0x14400004,
0x24020001, 0x3c010001, 0x370821, 0xa02281ec, 0x96e20462, 0x30420010,
0x14400009, 0x0, 0x96e20472, 0x30420010, 0x10400021, 0x0,
0x96e20462, 0x30420010, 0x10400005, 0x3c020700, 0x96e20472, 0x30420010,
0x14400011, 0x3c020700, 0x34423000, 0x240a0001, 0xa3aa0047, 0xafa20020,
0x8ee20154, 0x96e60462, 0x96e70472, 0x24420001, 0xaee20154, 0x8ee20154,
-0x3c040001, 0x248425d4, 0x3405f002, 0xafa00010, 0xc0028eb, 0xafa00014,
-0x96e60472, 0x96e70462, 0x3c040001, 0x248425dc, 0x24050012, 0xafa00010,
-0xc0028eb, 0xafa00014, 0x3c040001, 0x2484d65c, 0x3c050001, 0x24a5d818,
+0x3c040001, 0x24842704, 0x3405f002, 0xafa00010, 0xc00290f, 0xafa00014,
+0x96e60472, 0x96e70462, 0x3c040001, 0x2484270c, 0x24050012, 0xafa00010,
+0xc00290f, 0xafa00014, 0x3c040001, 0x2484d788, 0x3c050001, 0x24a5d944,
0xa42823, 0x27b30030, 0x2603021, 0x27b10034, 0xc0016be, 0x2203821,
-0x3c1e0fff, 0x37deffff, 0x3c040001, 0x2484d820, 0x3c050001, 0x24a5d9dc,
-0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac2233a8, 0x5e1024,
+0x3c1e0fff, 0x37deffff, 0x3c040001, 0x2484d94c, 0x3c050001, 0x24a5db08,
+0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac223508, 0x5e1024,
0x21082, 0x3c150800, 0x551025, 0xc0016be, 0xae420050, 0x3c040000,
0x24847d00, 0x3c050000, 0x24a57f50, 0xa42823, 0x2603021, 0x2203821,
-0x3c010001, 0xac2233c0, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
+0x3c010001, 0xac223520, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
0xae420048, 0x3c040000, 0x24846134, 0x3c050000, 0x24a56244, 0xa42823,
-0x2603021, 0x2203821, 0x3c010001, 0xac223388, 0x5e1024, 0x21082,
+0x2603021, 0x2203821, 0x3c010001, 0xac2234e8, 0x5e1024, 0x21082,
0x551025, 0xc0016be, 0xae4200b8, 0x3c040000, 0x2484624c, 0x3c050000,
-0x24a5631c, 0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac22337c,
+0x24a5631c, 0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac2234dc,
0x5e1024, 0x21082, 0x551025, 0xc0016be, 0xae4200e8, 0x3c040000,
0x24846324, 0x3c050000, 0x24a565a4, 0xa42823, 0x2603021, 0x2203821,
-0x3c010001, 0xac22336c, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
+0x3c010001, 0xac2234cc, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
0xae4200f0, 0x3c040000, 0x248465ac, 0x3c050000, 0x24a566e0, 0xa42823,
-0x2603021, 0x2203821, 0x3c010001, 0xac223374, 0x5e1024, 0x21082,
-0x551025, 0xc0016be, 0xae4200c0, 0x3c040001, 0x2484e3dc, 0x3c050001,
-0x24a5e98c, 0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac223380,
+0x2603021, 0x2203821, 0x3c010001, 0xac2234d4, 0x5e1024, 0x21082,
+0x551025, 0xc0016be, 0xae4200c0, 0x3c040001, 0x2484e50c, 0x3c050001,
+0x24a5eabc, 0xa42823, 0x2603021, 0x2203821, 0x3c010001, 0xac2234e0,
0x5e1024, 0x21082, 0x551025, 0xc0016be, 0xae4200c8, 0x3c040001,
-0x2484ed00, 0x3c050001, 0x24a5edd8, 0xa42823, 0x2603021, 0x2203821,
-0x3c010001, 0xac2233c4, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
-0xae4200d0, 0x3c040001, 0x8c8433b8, 0x3c050001, 0x8ca533a4, 0x2603021,
-0x2203821, 0xc0016be, 0xaec200ac, 0x3c040001, 0x8c8433b0, 0x3c050001,
-0x8ca533ac, 0x2603021, 0x3c010001, 0xac2233b8, 0xc0016be, 0x2203821,
-0x3c010001, 0xac2233b0, 0x3c070001, 0xf73821, 0x90e781ec, 0xafa00010,
-0x8fa20034, 0xafa20014, 0x8fa60030, 0x3c040001, 0x248425e8, 0xc0028eb,
-0x2821, 0x8faa003c, 0xc003beb, 0x1408021, 0xc0038a8, 0x0,
+0x2484ee30, 0x3c050001, 0x24a5ef08, 0xa42823, 0x2603021, 0x2203821,
+0x3c010001, 0xac223524, 0x5e1024, 0x21082, 0x551025, 0xc0016be,
+0xae4200d0, 0x3c040001, 0x8c843518, 0x3c050001, 0x8ca53504, 0x2603021,
+0x2203821, 0xc0016be, 0xaec200ac, 0x3c040001, 0x8c843510, 0x3c050001,
+0x8ca5350c, 0x2603021, 0x3c010001, 0xac223518, 0xc0016be, 0x2203821,
+0x3c010001, 0xac223510, 0x3c070001, 0xf73821, 0x90e781ec, 0xafa00010,
+0x8fa20034, 0xafa20014, 0x8fa60030, 0x3c040001, 0x24842718, 0xc00290f,
+0x2821, 0x8faa003c, 0xc003c37, 0x1408021, 0xc0038f4, 0x0,
0xc002548, 0x0, 0xaec0002c, 0xaf400228, 0xaf40022c, 0xaee004a8,
0xaec00014, 0xaec00018, 0xaec00024, 0x96e20450, 0x2442ffff, 0xaec20028,
0x3c010001, 0x370821, 0xac2081d4, 0xaec00038, 0xaec00044, 0xaec0003c,
@@ -3141,55 +3163,55 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xa2c00115, 0x3c1433d8, 0x3694c348, 0x3c020800, 0x34420080, 0x3c040000,
0x248459dc, 0x3c050000, 0x24a55a08, 0xa42823, 0x2603021, 0x2203821,
0xaf820060, 0x2402ffff, 0xaec00030, 0xaec00034, 0xc0016be, 0xaf820064,
-0x3c010001, 0xac223364, 0x5e1024, 0x21082, 0x551025, 0xc00181c,
+0x3c010001, 0xac2234c4, 0x5e1024, 0x21082, 0x551025, 0xc00181c,
0xae420000, 0x8f820240, 0x3c030001, 0x431025, 0xaf820240, 0x3c020000,
0x24424034, 0xaf820244, 0xaf800240, 0x8f820060, 0x551024, 0x14400005,
-0x3c030800, 0x8f820060, 0x431024, 0x1040fffd, 0x0, 0xc0038b5,
+0x3c030800, 0x8f820060, 0x431024, 0x1040fffd, 0x0, 0xc003901,
0x0, 0x3c020100, 0xafa20028, 0x8ec3002c, 0x240200ff, 0x10620003,
0x8821, 0x8ec2002c, 0x24510001, 0x8f420228, 0x1622000f, 0x24070008,
-0x3c040001, 0x248424fc, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f005, 0x8ec202a0, 0x24420001, 0xaec202a0,
+0x3c040001, 0x2484262c, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f005, 0x8ec202a0, 0x24420001, 0xaec202a0,
0x10000046, 0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021, 0x8fa30028,
0x8fa4002c, 0xac4304c0, 0xac4404c4, 0x8ec3002c, 0x8ee40428, 0x8ee5042c,
0x8ec6002c, 0x2402000d, 0xafa20010, 0xafb10014, 0x8ec20008, 0x318c0,
0x604821, 0x4021, 0xa92821, 0xa9182b, 0x882021, 0x832021,
0x630c0, 0xafa20018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021,
-0x5440000c, 0xaed1002c, 0x3c040001, 0x24842508, 0xafa00010, 0xafa00014,
-0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f000, 0x1000001d,
+0x5440000c, 0xaed1002c, 0x3c040001, 0x24842638, 0xafa00010, 0xafa00014,
+0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f000, 0x1000001d,
0x0, 0x8ee40488, 0x8ee5048c, 0x8ec3002c, 0x8ec80008, 0x8f860120,
0x24020011, 0xafa20010, 0xafa30014, 0xafa80018, 0x8ec200a8, 0x24070008,
-0x40f809, 0x24c6001c, 0x1440000e, 0x0, 0x3c040001, 0x24842510,
-0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb,
+0x40f809, 0x24c6001c, 0x1440000e, 0x0, 0x3c040001, 0x24842640,
+0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f,
0x34a5f001, 0x8ec202a4, 0x24420001, 0xaec202a4, 0x8ec202a4, 0x8ec20248,
0x24420001, 0xaec20248, 0x8ec20248, 0x93a20047, 0x10400070, 0x240200ff,
0x8ec3002c, 0x10620004, 0x27a70020, 0x8ec2002c, 0x10000002, 0x24510001,
-0x8821, 0x8f420228, 0x1622000f, 0x4021, 0x3c040001, 0x248424fc,
-0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb,
+0x8821, 0x8f420228, 0x1622000f, 0x4021, 0x3c040001, 0x2484262c,
+0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f,
0x34a5f005, 0x8ec202a0, 0x24420001, 0xaec202a0, 0x10000046, 0x8ec202a0,
0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000, 0x8ce40004, 0xac4304c0,
0xac4404c4, 0x8ec3002c, 0x8ee40428, 0x8ee5042c, 0x8ec6002c, 0x24070008,
0x2402000d, 0xafa20010, 0xafb10014, 0x8ec20008, 0x318c0, 0x604821,
0xa92821, 0xa9182b, 0x882021, 0x832021, 0x630c0, 0xafa20018,
0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x5440000c, 0xaed1002c,
-0x3c040001, 0x24842508, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f000, 0x1000001d, 0x0, 0x8ee40488,
+0x3c040001, 0x24842638, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f000, 0x1000001d, 0x0, 0x8ee40488,
0x8ee5048c, 0x8ec3002c, 0x8ec80008, 0x8f860120, 0x24020011, 0xafa20010,
0xafa30014, 0xafa80018, 0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c,
-0x1440000e, 0x0, 0x3c040001, 0x24842510, 0xafa00010, 0xafa00014,
-0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f001, 0x8ec202a4,
-0x24420001, 0xaec202a4, 0x8ec202a4, 0x3c040001, 0x248425f4, 0x8ec20254,
+0x1440000e, 0x0, 0x3c040001, 0x24842640, 0xafa00010, 0xafa00014,
+0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f001, 0x8ec202a4,
+0x24420001, 0xaec202a4, 0x8ec202a4, 0x3c040001, 0x24842724, 0x8ec20254,
0x3c050009, 0x34a59999, 0x24420001, 0xaec20254, 0x8ec20254, 0x3021,
-0x3821, 0xafa00010, 0xc0028eb, 0xafa00014, 0x10000004, 0x0,
+0x3821, 0xafa00010, 0xc00290f, 0xafa00014, 0x10000004, 0x0,
0x8f420264, 0x10400005, 0x0, 0x8f8200a0, 0x30420004, 0x1440fffa,
0x0, 0x8f820044, 0x34420004, 0xaf820044, 0x8ec2026c, 0x24420001,
0xaec2026c, 0x8ec2026c, 0x8f8200d8, 0x8f8300d4, 0x431023, 0x2442fff8,
0xaec20088, 0x8ec20088, 0x4410006, 0x24020001, 0x8ec20088, 0x8ec3053c,
0x431021, 0xaec20088, 0x24020001, 0xaec20070, 0x96e20452, 0x30420010,
0x10400005, 0x0, 0x8f820214, 0x3c038100, 0x431025, 0xaf820214,
-0x3c020001, 0x8c4232a8, 0x30420001, 0x10400007, 0x0, 0x3c040000,
+0x3c020001, 0x8c423408, 0x30420001, 0x10400007, 0x0, 0x3c040000,
0x24846bb4, 0x3c050000, 0x24a570e8, 0x10000006, 0xa42823, 0x3c040000,
0x248466e8, 0x3c050000, 0x24a56bac, 0xa42823, 0x27a60030, 0xc0016be,
-0x27a70034, 0x3c010001, 0xac223378, 0x3c020001, 0x8c423378, 0x3c030800,
+0x27a70034, 0x3c010001, 0xac2234d8, 0x3c020001, 0x8c4234d8, 0x3c030800,
0x21100, 0x21182, 0x431025, 0xae420040, 0x8f830060, 0x74100b,
0x242000a, 0x200f821, 0x0, 0xd, 0x8fbf0060, 0x8fbe005c,
0x8fb50058, 0x8fb30054, 0x8fb10050, 0x3e00008, 0x27bd0068, 0x3e00008,
@@ -3199,69 +3221,69 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x27bdfde0, 0x27a70018, 0x3c02dead, 0x3442beef, 0xafbf0218, 0x8f830150,
0x3c04001f, 0x3484ffff, 0xafa20018, 0xe33823, 0xe43824, 0x8ce30000,
0x10620008, 0x0, 0xafa30010, 0xafa00014, 0x8f860150, 0x3c040001,
-0x24842600, 0xc0028eb, 0x24050020, 0x8fbf0218, 0x3e00008, 0x27bd0220,
+0x24842730, 0xc00290f, 0x24050020, 0x8fbf0218, 0x3e00008, 0x27bd0220,
0x27bdffe0, 0x3c06abba, 0x34c6babe, 0xafb10018, 0x3c110004, 0x3c07007f,
0x34e7ffff, 0xafbf001c, 0x112840, 0x8e240000, 0x8ca30000, 0xaca00000,
0xae260000, 0x8ca20000, 0xaca30000, 0x10460005, 0xae240000, 0xa08821,
-0xf1102b, 0x1040fff5, 0x112840, 0x3c040001, 0x2484260c, 0x2202821,
-0x3021, 0x3821, 0xafa00010, 0xc0028eb, 0xafa00014, 0x2201021,
+0xf1102b, 0x1040fff5, 0x112840, 0x3c040001, 0x2484273c, 0x2202821,
+0x3021, 0x3821, 0xafa00010, 0xc00290f, 0xafa00014, 0x2201021,
0x8fbf001c, 0x8fb10018, 0x3e00008, 0x27bd0020, 0x27bdffc8, 0xafb30024,
0x809821, 0xafbe002c, 0xafb50028, 0xe0a821, 0x24a50003, 0xafbf0030,
0xafb10020, 0x8ea20000, 0x2403fffc, 0xa38824, 0x51102b, 0x14400020,
0xc0f021, 0x8fc80000, 0xafa00010, 0xafa8001c, 0x8ea20000, 0x3c040001,
-0x24842618, 0xafa20014, 0x8fc60000, 0x2602821, 0xc0028eb, 0x2203821,
+0x24842748, 0xafa20014, 0x8fc60000, 0x2602821, 0xc00290f, 0x2203821,
0x8fc60000, 0x111882, 0x2463ffff, 0x2402ffff, 0x10620008, 0x2602021,
0x2405ffff, 0x8c820000, 0x24840004, 0x2463ffff, 0xacc20000, 0x1465fffb,
0x24c60004, 0x8ea20000, 0x511023, 0xaea20000, 0x8fc20000, 0x511021,
-0x1000000b, 0xafc20000, 0xafa00010, 0x8ea20000, 0x3c040001, 0x24842620,
-0xafa20014, 0x8fc60000, 0x2602821, 0x2203821, 0xc0028eb, 0xafa5001c,
+0x1000000b, 0xafc20000, 0xafa00010, 0x8ea20000, 0x3c040001, 0x24842750,
+0xafa20014, 0x8fc60000, 0x2602821, 0x2203821, 0xc00290f, 0xafa5001c,
0x8fa2001c, 0x8fbf0030, 0x8fbe002c, 0x8fb50028, 0x8fb30024, 0x8fb10020,
0x3e00008, 0x27bd0038, 0x27bdffe8, 0x3c1cc000, 0xd021, 0x3c05ffff,
-0x3c030001, 0x8c633340, 0x3c040001, 0x8c843348, 0x34a57e10, 0x24021ffc,
-0x3c010001, 0xac2231e0, 0x3c0200c0, 0x3c010001, 0xac2231e4, 0x3c020020,
+0x3c030001, 0x8c6334a0, 0x3c040001, 0x8c8434a8, 0x34a57e10, 0x24021ffc,
+0x3c010001, 0xac223340, 0x3c0200c0, 0x3c010001, 0xac223344, 0x3c020020,
0xafbf0010, 0x3c0100c0, 0xac201ffc, 0x431023, 0x441023, 0x245bb000,
-0x365b821, 0x3c1d0001, 0x8fbd31dc, 0x3a0f021, 0x3c0400c0, 0x34840200,
-0x3c1600c0, 0x3c0300c0, 0x34630758, 0x24021dfc, 0x3c010001, 0xac2231e0,
-0x240218a4, 0x3c010001, 0xac2431e4, 0x3c010001, 0xac2231e0, 0x3c010001,
-0xac2331e4, 0xc00172c, 0x36d60200, 0x8fbf0010, 0x3e00008, 0x27bd0018,
-0x27bdffc8, 0x3c040001, 0x24842628, 0x2821, 0x3c020001, 0x8c4231e0,
-0x3c030001, 0x8c6331e4, 0x3021, 0x3603821, 0xafbf0030, 0xafbe002c,
+0x365b821, 0x3c1d0001, 0x8fbd333c, 0x3a0f021, 0x3c0400c0, 0x34840200,
+0x3c1600c0, 0x3c0300c0, 0x34630758, 0x24021dfc, 0x3c010001, 0xac223340,
+0x240218a4, 0x3c010001, 0xac243344, 0x3c010001, 0xac223340, 0x3c010001,
+0xac233344, 0xc00172c, 0x36d60200, 0x8fbf0010, 0x3e00008, 0x27bd0018,
+0x27bdffc8, 0x3c040001, 0x24842758, 0x2821, 0x3c020001, 0x8c423340,
+0x3c030001, 0x8c633344, 0x3021, 0x3603821, 0xafbf0030, 0xafbe002c,
0xafb50028, 0xafb30024, 0xafb10020, 0xafa2001c, 0xafa30018, 0xafb70010,
-0xc0028eb, 0xafb60014, 0xc001849, 0x0, 0x8f820240, 0x34420004,
+0xc00290f, 0xafb60014, 0xc001849, 0x0, 0x8f820240, 0x34420004,
0xaf820240, 0x24020001, 0xaec20000, 0x3c020001, 0x571021, 0x904281ec,
-0x10400090, 0x2402fffc, 0x3c110001, 0x2631a33b, 0x3c150001, 0x26b59ee8,
+0x10400090, 0x2402fffc, 0x3c110001, 0x2631a3c3, 0x3c150001, 0x26b59f70,
0x2351823, 0x8fa6001c, 0x628824, 0xd1102b, 0x1440001e, 0x27be0018,
-0x8fb30018, 0x3c040001, 0x24842618, 0x2a02821, 0x2203821, 0xafa00010,
-0xafa60014, 0xc0028eb, 0x2603021, 0x8fa40018, 0x111882, 0x2463ffff,
+0x8fb30018, 0x3c040001, 0x24842748, 0x2a02821, 0x2203821, 0xafa00010,
+0xafa60014, 0xc00290f, 0x2603021, 0x8fa40018, 0x111882, 0x2463ffff,
0x2402ffff, 0x10620008, 0x2a02821, 0x2406ffff, 0x8ca20000, 0x24a50004,
0x2463ffff, 0xac820000, 0x1466fffb, 0x24840004, 0x8fa2001c, 0x511023,
0xafa2001c, 0x8fc20000, 0x511021, 0x1000000a, 0xafc20000, 0x3c040001,
-0x24842620, 0x2a02821, 0xafa00010, 0xafa60014, 0x8fa60018, 0x2203821,
-0xc0028eb, 0xa09821, 0x8fa3001c, 0x24150020, 0x3c010001, 0xac33335c,
-0x2c620020, 0x1440001d, 0x27b30018, 0x8fb10018, 0x3c040001, 0x24842618,
-0x3c050001, 0x24a533f0, 0x24070020, 0xafa00010, 0xafa30014, 0xc0028eb,
-0x2203021, 0x3c050001, 0x24a533f0, 0x8fa40018, 0x24030007, 0x2406ffff,
+0x24842750, 0x2a02821, 0xafa00010, 0xafa60014, 0x8fa60018, 0x2203821,
+0xc00290f, 0xa09821, 0x8fa3001c, 0x24150020, 0x3c010001, 0xac3334bc,
+0x2c620020, 0x1440001d, 0x27b30018, 0x8fb10018, 0x3c040001, 0x24842748,
+0x3c050001, 0x24a53550, 0x24070020, 0xafa00010, 0xafa30014, 0xc00290f,
+0x2203021, 0x3c050001, 0x24a53550, 0x8fa40018, 0x24030007, 0x2406ffff,
0x8ca20000, 0x24a50004, 0x2463ffff, 0xac820000, 0x1466fffb, 0x24840004,
0x8fa2001c, 0x551023, 0xafa2001c, 0x8e620000, 0x551021, 0x1000000c,
-0xae620000, 0x3c040001, 0x24842620, 0x3c050001, 0x24a533f0, 0xafa00010,
-0xafa30014, 0x8fa60018, 0x3c110001, 0x263133f0, 0xc0028eb, 0x24070020,
-0x8fa3001c, 0x24150020, 0x3c010001, 0xac313390, 0x2c620020, 0x1440001d,
-0x27b30018, 0x8fb10018, 0x3c040001, 0x24842618, 0x3c050001, 0x24a53410,
-0x24070020, 0xafa00010, 0xafa30014, 0xc0028eb, 0x2203021, 0x3c050001,
-0x24a53410, 0x8fa40018, 0x24030007, 0x2406ffff, 0x8ca20000, 0x24a50004,
+0xae620000, 0x3c040001, 0x24842750, 0x3c050001, 0x24a53550, 0xafa00010,
+0xafa30014, 0x8fa60018, 0x3c110001, 0x26313550, 0xc00290f, 0x24070020,
+0x8fa3001c, 0x24150020, 0x3c010001, 0xac3134f0, 0x2c620020, 0x1440001d,
+0x27b30018, 0x8fb10018, 0x3c040001, 0x24842748, 0x3c050001, 0x24a53570,
+0x24070020, 0xafa00010, 0xafa30014, 0xc00290f, 0x2203021, 0x3c050001,
+0x24a53570, 0x8fa40018, 0x24030007, 0x2406ffff, 0x8ca20000, 0x24a50004,
0x2463ffff, 0xac820000, 0x1466fffb, 0x24840004, 0x8fa2001c, 0x551023,
0xafa2001c, 0x8e620000, 0x551021, 0x1000000c, 0xae620000, 0x3c040001,
-0x24842620, 0x3c050001, 0x24a53410, 0xafa00010, 0xafa30014, 0x8fa60018,
-0x3c110001, 0x26313410, 0xc0028eb, 0x24070020, 0x3c010001, 0x10000033,
-0xac31338c, 0x3c110000, 0x26317cef, 0x3c150000, 0x26b57b3c, 0x2351823,
+0x24842750, 0x3c050001, 0x24a53570, 0xafa00010, 0xafa30014, 0x8fa60018,
+0x3c110001, 0x26313570, 0xc00290f, 0x24070020, 0x3c010001, 0x10000033,
+0xac3134ec, 0x3c110000, 0x26317cef, 0x3c150000, 0x26b57b3c, 0x2351823,
0x8fa6001c, 0x628824, 0xd1102b, 0x1440001e, 0x27be0018, 0x8fb30018,
-0x3c040001, 0x24842618, 0x2a02821, 0x2203821, 0xafa00010, 0xafa60014,
-0xc0028eb, 0x2603021, 0x8fa40018, 0x111882, 0x2463ffff, 0x2402ffff,
+0x3c040001, 0x24842748, 0x2a02821, 0x2203821, 0xafa00010, 0xafa60014,
+0xc00290f, 0x2603021, 0x8fa40018, 0x111882, 0x2463ffff, 0x2402ffff,
0x10620008, 0x2a02821, 0x2406ffff, 0x8ca20000, 0x24a50004, 0x2463ffff,
0xac820000, 0x1466fffb, 0x24840004, 0x8fa2001c, 0x511023, 0xafa2001c,
-0x8fc20000, 0x511021, 0x1000000a, 0xafc20000, 0x3c040001, 0x24842620,
-0x2a02821, 0xafa00010, 0xafa60014, 0x8fa60018, 0x2203821, 0xc0028eb,
-0xa09821, 0x3c010001, 0xac33335c, 0x3c030001, 0x8c63335c, 0x24020400,
+0x8fc20000, 0x511021, 0x1000000a, 0xafc20000, 0x3c040001, 0x24842750,
+0x2a02821, 0xafa00010, 0xafa60014, 0x8fa60018, 0x2203821, 0xc00290f,
+0xa09821, 0x3c010001, 0xac3334bc, 0x3c030001, 0x8c6334bc, 0x24020400,
0x60f809, 0xaf820070, 0x8fbf0030, 0x8fbe002c, 0x8fb50028, 0x8fb30024,
0x8fb10020, 0x3e00008, 0x27bd0038, 0x0, 0x0, 0x0,
0x8f820040, 0x3c03f000, 0x431824, 0x3c025000, 0x10620005, 0x3c026000,
@@ -3272,13 +3294,13 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8f820054, 0x244203e8, 0xaf820058, 0x240201f4, 0xaec200c8, 0x24020004,
0xaec200d0, 0x24020002, 0xaec000a0, 0xaec000cc, 0xaec200c4, 0xaec000c0,
0xaec000bc, 0x3e00008, 0xaec000b8, 0x8f820054, 0x24420005, 0x3e00008,
-0xaf820078, 0x27bdffe8, 0xafbf0010, 0x8f820054, 0x3c030001, 0x8c6332bc,
-0x244203e8, 0x1060001d, 0xaf820058, 0x3c020001, 0x8c4232a8, 0x30420001,
-0x1440000c, 0x0, 0x3c020001, 0x8c4233c8, 0x10400008, 0x0,
-0x8f830224, 0x3c020001, 0x8c42548c, 0x10620003, 0x0, 0xc003a65,
+0xaf820078, 0x27bdffe8, 0xafbf0010, 0x8f820054, 0x3c030001, 0x8c63341c,
+0x244203e8, 0x1060001d, 0xaf820058, 0x3c020001, 0x8c423408, 0x30420001,
+0x1440000c, 0x0, 0x3c020001, 0x8c423528, 0x10400008, 0x0,
+0x8f830224, 0x3c020001, 0x8c4255ec, 0x10620003, 0x0, 0xc003ab1,
0x0, 0x92c200ec, 0x10400003, 0x3c0208ff, 0x1000000a, 0xa2c000ec,
0x3442fffb, 0x8f830220, 0x3c040200, 0x284a025, 0x621824, 0x10000003,
-0xaf830220, 0xc003d6d, 0x0, 0x8f420238, 0x1040000a, 0x0,
+0xaf830220, 0xc003db9, 0x0, 0x8f420238, 0x1040000a, 0x0,
0x8ec200a0, 0x244203e8, 0xaec200a0, 0x8f430238, 0x43102b, 0x14400003,
0x0, 0xc001c3c, 0x0, 0x8f420218, 0x30420100, 0x10400003,
0x0, 0xc001e07, 0x0, 0x8ec200c0, 0x8ec300c4, 0x24420001,
@@ -3297,14 +3319,14 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x3c020001, 0x571021, 0x8c4281d4, 0x10400023, 0x24070008, 0x8ed10018,
0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020012, 0xafa20010,
0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b,
-0x24020001, 0x3c040001, 0x24842690, 0xafb10010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021, 0x14400005,
+0x24020001, 0x3c040001, 0x248427c0, 0xafb10010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006, 0x1021, 0x14400005,
0x24020001, 0x3c010001, 0x370821, 0x1000005c, 0xac2281d4, 0x3c010001,
0x370821, 0x10000022, 0xac2081d0, 0x8ed10018, 0x8ee40498, 0x8ee5049c,
0x8ec30008, 0x8f860120, 0x24020019, 0xafa20010, 0xafb10014, 0xafa30018,
0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001,
-0x24842690, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
-0xc0028eb, 0x34a5f006, 0x1021, 0x14400005, 0x24020001, 0x3c010001,
+0x248427c0, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
+0xc00290f, 0x34a5f006, 0x1021, 0x14400005, 0x24020001, 0x3c010001,
0x370821, 0x1000003a, 0xac2281d8, 0x3c010001, 0x370821, 0xac2281d0,
0x3c010001, 0x370821, 0xac2081d8, 0x3c010001, 0x370821, 0xac2081d4,
0x8ec20264, 0xaec00024, 0xaed10028, 0x24420001, 0xaec20264, 0x1000002a,
@@ -3323,8 +3345,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xafbf0024, 0xafb10020, 0x8ec30068, 0x8ec2006c, 0x10620029, 0x24070008,
0x8ed10068, 0x8ee40490, 0x8ee50494, 0x8ec30008, 0x8f860120, 0x24020013,
0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c,
-0x1440000b, 0x24020001, 0x3c040001, 0x2484269c, 0xafb10010, 0xafa00014,
-0x8ec60068, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f008, 0x1021,
+0x1440000b, 0x24020001, 0x3c040001, 0x248427cc, 0xafb10010, 0xafa00014,
+0x8ec60068, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f008, 0x1021,
0x14400005, 0x24020001, 0x3c010001, 0x370821, 0x1000000e, 0xac2281e0,
0x3c010001, 0x370821, 0xac2081e0, 0x8ec20268, 0xaec00048, 0xaed1006c,
0x24420001, 0xaec20268, 0x10000004, 0x8ec20268, 0x3c010001, 0x370821,
@@ -3333,15 +3355,15 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x431024, 0xaf820060,
0x8ec20000, 0x10400003, 0x0, 0x10000002, 0xaf80004c, 0xaf800048,
0x8fbf0024, 0x8fb10020, 0x3e00008, 0x27bd0028, 0x3e00008, 0x0,
-0x3c020001, 0x8c4232bc, 0x27bdffc0, 0xafbf0038, 0xafbe0034, 0xafb50030,
+0x3c020001, 0x8c42341c, 0x27bdffc0, 0xafbf0038, 0xafbe0034, 0xafb50030,
0xafb3002c, 0x104000fe, 0xafb10028, 0x8ec200b8, 0x24430001, 0x2842000b,
0x1440011b, 0xaec300b8, 0xaec000b8, 0x8ee204a8, 0x30420002, 0x14400096,
-0x0, 0x8ee204a8, 0x3c030001, 0x8c6332ac, 0x34420002, 0xaee204a8,
+0x0, 0x8ee204a8, 0x3c030001, 0x8c63340c, 0x34420002, 0xaee204a8,
0x24020001, 0x14620003, 0x3c020600, 0x10000002, 0x34423000, 0x34421000,
0xafa20020, 0x8ec3002c, 0x240200ff, 0x10620004, 0x27a70020, 0x8ec2002c,
0x10000002, 0x24530001, 0x9821, 0x8f420228, 0x1662000f, 0x0,
-0x3c040001, 0x248426c8, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f00f, 0x8ec202a0, 0x24420001, 0xaec202a0,
+0x3c040001, 0x248427f8, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f00f, 0x8ec202a0, 0x24420001, 0xaec202a0,
0x1000006d, 0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000,
0x8ce40004, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247103e8,
0x2221023, 0x2c4203e9, 0x1040001e, 0xa821, 0x241e000c, 0x8ec8002c,
@@ -3350,7 +3372,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x822021, 0x892021, 0x630c0, 0xafa80018, 0x8ec200a8, 0x24c604c0,
0x40f809, 0x2e63021, 0x54400006, 0x24150001, 0x8f820054, 0x2221023,
0x2c4203e9, 0x1440ffe5, 0x0, 0x32a200ff, 0x54400011, 0xaed3002c,
-0x3c040001, 0x248426d4, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
+0x3c040001, 0x24842804, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
0x3c050009, 0x10000030, 0x34a5f010, 0x8ec2026c, 0x24150001, 0x24420001,
0xaec2026c, 0x8ec2026c, 0x1000001f, 0x32a200ff, 0x8f830054, 0x8f820054,
0x247103e8, 0x2221023, 0x2c4203e9, 0x10400017, 0xa821, 0x3c1e0020,
@@ -3358,8 +3380,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xafb30010, 0x5e1025, 0xafa30014, 0xafa20018, 0x8ec200a8, 0x24070008,
0x40f809, 0x24c6001c, 0x1440ffe2, 0x0, 0x8f820054, 0x2221023,
0x2c4203e9, 0x1440ffed, 0x0, 0x32a200ff, 0x1440000f, 0x0,
-0x3c040001, 0x248426e0, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
-0x3c050009, 0x34a5f011, 0xc0028eb, 0x0, 0x8ec202d0, 0x24420001,
+0x3c040001, 0x24842810, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
+0x3c050009, 0x34a5f011, 0xc00290f, 0x0, 0x8ec202d0, 0x24420001,
0xaec202d0, 0x8ec202d0, 0x8ec20250, 0x24420001, 0xaec20250, 0x8ec20250,
0x8ee204a8, 0x30420001, 0x10400054, 0x0, 0x8f420218, 0x30420080,
0x1040002b, 0x0, 0x8f820044, 0x34420040, 0xaf820044, 0x8ec200b0,
@@ -3384,15 +3406,15 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x24430001, 0x284201f5, 0x14400005, 0xaec300bc, 0x8f820044, 0x38420020,
0xaf820044, 0xaec000bc, 0x2402ff7f, 0x282a024, 0x8fbf0038, 0x8fbe0034,
0x8fb50030, 0x8fb3002c, 0x8fb10028, 0x3e00008, 0x27bd0040, 0x3e00008,
-0x0, 0x3c020001, 0x8c4232bc, 0x27bdffc0, 0xafbf0038, 0xafbe0034,
+0x0, 0x3c020001, 0x8c42341c, 0x27bdffc0, 0xafbf0038, 0xafbe0034,
0xafb50030, 0xafb3002c, 0x10400100, 0xafb10028, 0x8ec200b8, 0x3c040001,
-0x8c8432ac, 0x24430001, 0x2842000b, 0xaec400d0, 0x14400127, 0xaec300b8,
+0x8c84340c, 0x24430001, 0x2842000b, 0xaec400d0, 0x14400127, 0xaec300b8,
0xaec000b8, 0x8ee204a8, 0x30420002, 0x14400094, 0x0, 0x8ee204a8,
0x34420002, 0xaee204a8, 0x24020001, 0x14820003, 0x3c020600, 0x10000002,
0x34423000, 0x34421000, 0xafa20020, 0x8ec3002c, 0x240200ff, 0x10620004,
0x27a70020, 0x8ec2002c, 0x10000002, 0x24530001, 0x9821, 0x8f420228,
-0x1662000f, 0x0, 0x3c040001, 0x248426c8, 0xafa00010, 0xafa00014,
-0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f00f, 0x8ec202a0,
+0x1662000f, 0x0, 0x3c040001, 0x248427f8, 0xafa00010, 0xafa00014,
+0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f00f, 0x8ec202a0,
0x24420001, 0xaec202a0, 0x1000006d, 0x8ec202a0, 0x8ec2002c, 0x210c0,
0x571021, 0x8ce30000, 0x8ce40004, 0xac4304c0, 0xac4404c4, 0x8f830054,
0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001e, 0xa821,
@@ -3401,7 +3423,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xa32821, 0xa3482b, 0x822021, 0x892021, 0x630c0, 0xafa80018,
0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x54400006, 0x24150001,
0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffe5, 0x0, 0x32a200ff,
-0x54400011, 0xaed3002c, 0x3c040001, 0x248426d4, 0xafa00010, 0xafa00014,
+0x54400011, 0xaed3002c, 0x3c040001, 0x24842804, 0xafa00010, 0xafa00014,
0x8f860120, 0x8f870124, 0x3c050009, 0x10000030, 0x34a5f010, 0x8ec2026c,
0x24150001, 0x24420001, 0xaec2026c, 0x8ec2026c, 0x1000001f, 0x32a200ff,
0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x10400017,
@@ -3409,35 +3431,35 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec3002c, 0x8f860120, 0xafb30010, 0x5e1025, 0xafa30014, 0xafa20018,
0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe2, 0x0,
0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffed, 0x0, 0x32a200ff,
-0x1440000f, 0x0, 0x3c040001, 0x248426e0, 0xafa00010, 0xafa00014,
-0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011, 0xc0028eb, 0x0,
+0x1440000f, 0x0, 0x3c040001, 0x24842810, 0xafa00010, 0xafa00014,
+0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011, 0xc00290f, 0x0,
0x8ec202d0, 0x24420001, 0xaec202d0, 0x8ec202d0, 0x8ec20250, 0x24420001,
0xaec20250, 0x8ec20250, 0x8ee204a8, 0x30420001, 0x10400055, 0x0,
0x8f420218, 0x30420080, 0x10400027, 0x0, 0x8ec200b0, 0x3c040001,
-0x90843370, 0x24080000, 0x2409ffff, 0x403821, 0x8ec201b8, 0x8ec301bc,
-0x3021, 0x34840020, 0x3c010001, 0xa0243370, 0x481024, 0x1446000d,
+0x908434d0, 0x24080000, 0x2409ffff, 0x403821, 0x8ec201b8, 0x8ec301bc,
+0x3021, 0x34840020, 0x3c010001, 0xa02434d0, 0x481024, 0x1446000d,
0x691824, 0x1467000b, 0x0, 0x8ec200b4, 0x403821, 0x8ec201d8,
0x8ec301dc, 0x3021, 0x481024, 0x14460003, 0x691824, 0x10670009,
-0x308200bf, 0x8ec201b8, 0x8ec301bc, 0x3c040001, 0x90843370, 0x8ec601d8,
-0x8ec701dc, 0x10000026, 0x38840040, 0x3c010001, 0x10000061, 0xa0223370,
-0x8ec200b0, 0x3c040001, 0x90843370, 0x24080000, 0x2409ffff, 0x403821,
-0x8ec201b8, 0x8ec301bc, 0x3021, 0x308400bf, 0x3c010001, 0xa0243370,
+0x308200bf, 0x8ec201b8, 0x8ec301bc, 0x3c040001, 0x908434d0, 0x8ec601d8,
+0x8ec701dc, 0x10000026, 0x38840040, 0x3c010001, 0x10000061, 0xa02234d0,
+0x8ec200b0, 0x3c040001, 0x908434d0, 0x24080000, 0x2409ffff, 0x403821,
+0x8ec201b8, 0x8ec301bc, 0x3021, 0x308400bf, 0x3c010001, 0xa02434d0,
0x481024, 0x1446000d, 0x691824, 0x1467000b, 0x0, 0x8ec200b4,
0x403821, 0x8ec201d8, 0x8ec301dc, 0x3021, 0x481024, 0x14460003,
0x691824, 0x1067000d, 0x34820020, 0x8ec201b8, 0x8ec301bc, 0x3c040001,
-0x90843370, 0x8ec601d8, 0x8ec701dc, 0x38840020, 0xaec300b0, 0xaec700b4,
-0x3c010001, 0x1000003a, 0xa0243370, 0x3c010001, 0x10000037, 0xa0223370,
-0x3c020001, 0x90423370, 0x8ec300bc, 0x34440020, 0x24620001, 0x10000028,
+0x908434d0, 0x8ec601d8, 0x8ec701dc, 0x38840020, 0xaec300b0, 0xaec700b4,
+0x3c010001, 0x1000003a, 0xa02434d0, 0x3c010001, 0x10000037, 0xa02234d0,
+0x3c020001, 0x904234d0, 0x8ec300bc, 0x34440020, 0x24620001, 0x10000028,
0x28630033, 0x8ec200cc, 0x8ec300c8, 0x24420001, 0xaec200cc, 0x43102a,
0x14400006, 0x24030001, 0x8ec200d0, 0x14430002, 0xaec000cc, 0x24030004,
0xaec300d0, 0x8ee204a8, 0x30420001, 0x10400012, 0x0, 0x8f420218,
-0x30420080, 0x10400008, 0x0, 0x3c020001, 0x90423370, 0x34420040,
-0x304200df, 0x3c010001, 0x10000015, 0xa0223370, 0x3c020001, 0x90423370,
-0x34420060, 0x3c010001, 0x1000000f, 0xa0223370, 0x3c020001, 0x90423370,
-0x8ec300bc, 0x34440020, 0x24620001, 0x286300fb, 0x3c010001, 0xa0243370,
-0x14600005, 0xaec200bc, 0x38820040, 0x3c010001, 0xa0223370, 0xaec000bc,
-0x3c020001, 0x90423370, 0x8ec300d0, 0x3044007f, 0x24020001, 0x3c010001,
-0xa0243370, 0x54620003, 0x3484000f, 0x42102, 0x348400f0, 0xc004904,
+0x30420080, 0x10400008, 0x0, 0x3c020001, 0x904234d0, 0x34420040,
+0x304200df, 0x3c010001, 0x10000015, 0xa02234d0, 0x3c020001, 0x904234d0,
+0x34420060, 0x3c010001, 0x1000000f, 0xa02234d0, 0x3c020001, 0x904234d0,
+0x8ec300bc, 0x34440020, 0x24620001, 0x286300fb, 0x3c010001, 0xa02434d0,
+0x14600005, 0xaec200bc, 0x38820040, 0x3c010001, 0xa02234d0, 0xaec000bc,
+0x3c020001, 0x904234d0, 0x8ec300d0, 0x3044007f, 0x24020001, 0x3c010001,
+0xa02434d0, 0x54620003, 0x3484000f, 0x42102, 0x348400f0, 0xc004950,
0x0, 0x2402ff7f, 0x282a024, 0x8fbf0038, 0x8fbe0034, 0x8fb50030,
0x8fb3002c, 0x8fb10028, 0x3e00008, 0x27bd0040, 0x3e00008, 0x0,
0x27bdffc0, 0xafbf0038, 0xafbe0034, 0xafb50030, 0xafb3002c, 0xafb10028,
@@ -3477,7 +3499,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec200a8, 0x26e60028, 0x40f809, 0x24070400, 0x104000f1, 0x3c020400,
0xafa20020, 0x92c20115, 0x10400080, 0x240200ff, 0x8ec3002c, 0x10620004,
0x27a70020, 0x8ec2002c, 0x10000002, 0x24530001, 0x9821, 0x8f420228,
-0x1662000a, 0x0, 0x3c040001, 0x248426c8, 0xafa00010, 0xafa00014,
+0x1662000a, 0x0, 0x3c040001, 0x248427f8, 0xafa00010, 0xafa00014,
0x8ec6002c, 0x8f470228, 0x3c050009, 0x1000007f, 0x34a5f00f, 0x8ec2002c,
0x210c0, 0x571021, 0x8ce30000, 0x8ce40004, 0xac4304c0, 0xac4404c4,
0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001e,
@@ -3486,8 +3508,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec80008, 0xa32821, 0xa3482b, 0x822021, 0x892021, 0x630c0,
0xafa80018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x54400006,
0x24150001, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffe5, 0x0,
-0x32a200ff, 0x54400018, 0xaed3002c, 0x3c040001, 0x248426d4, 0xafa00010,
-0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f010, 0xc0028eb,
+0x32a200ff, 0x54400018, 0xaed3002c, 0x3c040001, 0x24842804, 0xafa00010,
+0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f010, 0xc00290f,
0x0, 0x8ec202d0, 0x1821, 0x24420001, 0xaec202d0, 0x1000008f,
0x8ec202d0, 0x8ec2026c, 0x24150001, 0x24420001, 0xaec2026c, 0x8ec2026c,
0x1000001d, 0x32a200ff, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023,
@@ -3495,23 +3517,23 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ee5048c, 0x8ec2002c, 0x8f860120, 0xafb30010, 0xafa20014, 0xafa30018,
0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe4, 0x0,
0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffee, 0x0, 0x32a200ff,
-0x1440006a, 0x24030001, 0x3c040001, 0x248426e0, 0xafa00010, 0xafa00014,
+0x1440006a, 0x24030001, 0x3c040001, 0x24842810, 0xafa00010, 0xafa00014,
0x8f860120, 0x8f870124, 0x3c050009, 0x1000ffcb, 0x34a5f011, 0x8ec3002c,
0x10620004, 0x27a70020, 0x8ec2002c, 0x10000002, 0x24510001, 0x8821,
-0x8f420228, 0x16220011, 0x4021, 0x3c040001, 0x248426a8, 0xafa00010,
-0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0x34a5f005, 0xc0028eb,
+0x8f420228, 0x16220011, 0x4021, 0x3c040001, 0x248427d8, 0xafa00010,
+0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0x34a5f005, 0xc00290f,
0x0, 0x8ec202a0, 0x1821, 0x24420001, 0xaec202a0, 0x10000047,
0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000, 0x8ce40004,
0xac4304c0, 0xac4404c4, 0x8ec3002c, 0x8ee40428, 0x8ee5042c, 0x8ec6002c,
0x24070008, 0x2402000d, 0xafa20010, 0xafb10014, 0x8ec20008, 0x318c0,
0x604821, 0xa92821, 0xa9182b, 0x882021, 0x832021, 0x630c0,
0xafa20018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x5440000c,
-0xaed1002c, 0x3c040001, 0x248426b4, 0xafa00010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f000, 0x1000001e, 0x1821,
+0xaed1002c, 0x3c040001, 0x248427e4, 0xafa00010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f000, 0x1000001e, 0x1821,
0x8ee40488, 0x8ee5048c, 0x8ec3002c, 0x8ec80008, 0x8f860120, 0x24020011,
0xafa20010, 0xafa30014, 0xafa80018, 0x8ec200a8, 0x24070008, 0x40f809,
-0x24c6001c, 0x1440000f, 0x24030001, 0x3c040001, 0x248426bc, 0xafa00010,
-0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f001,
+0x24c6001c, 0x1440000f, 0x24030001, 0x3c040001, 0x248427ec, 0xafa00010,
+0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f001,
0x8ec202a4, 0x1821, 0x24420001, 0xaec202a4, 0x8ec202a4, 0x1060000d,
0x24020001, 0x8ec2024c, 0xa2c00115, 0xaec000a0, 0x24420001, 0xaec2024c,
0x8ec2024c, 0x8ee2014c, 0x24420001, 0xaee2014c, 0x10000003, 0x8ee2014c,
@@ -3524,15 +3546,15 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8f8200b0, 0x2403fffb, 0x431024, 0xaf8200b0, 0x8f82011c, 0x2403fffd,
0x431024, 0x10000040, 0xaf82011c, 0x8ec30104, 0x8f820104, 0x14620005,
0x0, 0x8ec3010c, 0x8f8200b4, 0x5062000a, 0x3c050005, 0x8f820104,
-0xaec20104, 0x8f8200b4, 0xaec2010c, 0x8ec2010c, 0x3c040001, 0x248426ec,
-0x10000029, 0xafa00014, 0x8ec2010c, 0x3c040001, 0x248426f8, 0xafa00014,
-0xafa20010, 0x8f8600b0, 0x8ec70104, 0xc0028eb, 0x34a50900, 0x8f82011c,
+0xaec20104, 0x8f8200b4, 0xaec2010c, 0x8ec2010c, 0x3c040001, 0x2484281c,
+0x10000029, 0xafa00014, 0x8ec2010c, 0x3c040001, 0x24842828, 0xafa00014,
+0xafa20010, 0x8f8600b0, 0x8ec70104, 0xc00290f, 0x34a50900, 0x8f82011c,
0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0, 0x34420001, 0xaf8200b0,
0xaf830104, 0x8f440208, 0x8f45020c, 0x2402000f, 0xafa20010, 0xafa00014,
0x8ec20008, 0xafa20018, 0x8ec200a8, 0x26e60028, 0x40f809, 0x24070400,
0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ee201cc, 0x24420001,
-0xaee201cc, 0x8ee201cc, 0x8ec2010c, 0x3c040001, 0x24842704, 0xafa00014,
-0xafa20010, 0x8f8600b0, 0x8ec70104, 0x3c050005, 0xc0028eb, 0x34a50900,
+0xaee201cc, 0x8ee201cc, 0x8ec2010c, 0x3c040001, 0x24842834, 0xafa00014,
+0xafa20010, 0x8f8600b0, 0x8ec70104, 0x3c050005, 0xc00290f, 0x34a50900,
0x8f8200a0, 0x30420004, 0x1040005f, 0x0, 0x8ec30108, 0x8f820124,
0x14620005, 0x0, 0x8ec30110, 0x8f8200a4, 0x10620006, 0x0,
0x8f820124, 0xaec20108, 0x8f8200a4, 0x10000052, 0xaec20110, 0x8f8200a0,
@@ -3541,15 +3563,15 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x2403fffd, 0x431024, 0x10000041, 0xaf82011c, 0x8ec30108, 0x8f820124,
0x14620005, 0x0, 0x8ec30110, 0x8f8200a4, 0x5062000a, 0x3c050005,
0x8f820124, 0xaec20108, 0x8f8200a4, 0xaec20110, 0x8ec20110, 0x3c040001,
-0x24842710, 0x1000002a, 0xafa00014, 0x8ec20110, 0x3c040001, 0x2484271c,
-0xafa00014, 0xafa20010, 0x8f8600a0, 0x8ec70108, 0xc0028eb, 0x34a50900,
+0x24842840, 0x1000002a, 0xafa00014, 0x8ec20110, 0x3c040001, 0x2484284c,
+0xafa00014, 0xafa20010, 0x8f8600a0, 0x8ec70108, 0xc00290f, 0x34a50900,
0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001,
0xaf8200a0, 0xaf830124, 0x8f440208, 0x8f45020c, 0x24020010, 0xafa20010,
-0xafa00014, 0x8ec20010, 0xafa20018, 0x8ec200a4, 0x3c060001, 0x24c63384,
+0xafa00014, 0x8ec20010, 0xafa20018, 0x8ec200a4, 0x3c060001, 0x24c634e4,
0x40f809, 0x24070004, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c,
0x8ee201cc, 0x24420001, 0xaee201cc, 0x8ee201cc, 0x8ec20110, 0x3c040001,
-0x24842728, 0xafa00014, 0xafa20010, 0x8f8600a0, 0x8ec70108, 0x3c050005,
-0xc0028eb, 0x34a50900, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3c091000,
+0x24842858, 0xafa00014, 0xafa20010, 0x8f8600a0, 0x8ec70108, 0x3c050005,
+0xc00290f, 0x34a50900, 0x8fbf0020, 0x3e00008, 0x27bd0028, 0x3c091000,
0x24080001, 0x3c070080, 0x3c050100, 0x3c062000, 0x8f820070, 0x491024,
0x1040fffd, 0x0, 0x8f820054, 0x24420005, 0xaf820078, 0x8f420234,
0x10400017, 0x2021, 0x3c020001, 0x571021, 0x8c4281dc, 0x24420005,
@@ -3576,7 +3598,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x10000002, 0xaf80004c, 0xaf800048, 0x8ec20260, 0x24420001,
0xaec20260, 0x1000006f, 0x8ec20260, 0x30c20001, 0x10400004, 0x24020001,
0xaf820064, 0x10000069, 0x0, 0x30c20002, 0x1440000b, 0x3c050003,
-0x3c040001, 0x24842800, 0x34a50001, 0x3821, 0xafa00010, 0xc0028eb,
+0x3c040001, 0x24842930, 0x34a50001, 0x3821, 0xafa00010, 0xc00290f,
0xafa00014, 0x2402fff8, 0x1000005c, 0xaf820064, 0x8f43022c, 0x8f42010c,
0x1062004c, 0x0, 0x8f42022c, 0x21080, 0x5a1021, 0x8c440300,
0x8f42022c, 0x24420001, 0x3042003f, 0x41e02, 0xaf42022c, 0x24020003,
@@ -3596,15 +3618,15 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x3e00008, 0x27bd0020, 0x3e00008, 0x0, 0x27bdffc0, 0xafb10028,
0x808821, 0x111602, 0x2442ffff, 0x304300ff, 0x2c620011, 0xafbf0038,
0xafbe0034, 0xafb50030, 0x104001ab, 0xafb3002c, 0x31080, 0x3c010001,
-0x220821, 0x8c222848, 0x400008, 0x0, 0x111302, 0x30440fff,
+0x220821, 0x8c222978, 0x400008, 0x0, 0x111302, 0x30440fff,
0x24020001, 0x10820006, 0x3c030800, 0x24020002, 0x1082000c, 0x3c050003,
-0x10000022, 0x0, 0x3c020001, 0x8c4233b4, 0x21100, 0x21182,
+0x10000022, 0x0, 0x3c020001, 0x8c423514, 0x21100, 0x21182,
0x431025, 0xae420038, 0x8ee204a8, 0x1000000a, 0x34420001, 0x3c020001,
-0x2442c440, 0x21100, 0x21182, 0x431025, 0xae420038, 0x8ee204a8,
+0x2442c4d0, 0x21100, 0x21182, 0x431025, 0xae420038, 0x8ee204a8,
0x2403fffe, 0x431024, 0xaee204a8, 0xaec40168, 0xaec4016c, 0x8f840054,
0x41442, 0x41c82, 0x431021, 0x41cc2, 0x431023, 0x41d02,
0x431021, 0x41d42, 0x431023, 0x10000009, 0xaec20170, 0x3c040001,
-0x2484280c, 0x34a50004, 0x2203021, 0x3821, 0xafa00010, 0xc0028eb,
+0x2484293c, 0x34a50004, 0x2203021, 0x3821, 0xafa00010, 0xc00290f,
0xafa00014, 0x8ec20208, 0x24420001, 0xaec20208, 0x100001e1, 0x8ec20208,
0xc0022fe, 0x0, 0x100001dd, 0x0, 0xc002419, 0x0,
0x100001d9, 0x0, 0x111302, 0x30430fff, 0x24020001, 0x10620005,
@@ -3614,24 +3636,24 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xaf82022c, 0xaf820230, 0xaf820234, 0x24020001, 0x10000016, 0xa2c2011c,
0x92c2011c, 0x50400013, 0xa2c0011c, 0x8ee204ac, 0xaf820228, 0x8ee204b0,
0xaf82022c, 0x8ee204b4, 0xaf820230, 0x8ee204b8, 0xaf820234, 0x10000009,
-0xa2c0011c, 0x3c040001, 0x24842818, 0x34a5f009, 0x2203021, 0x3821,
-0xafa00010, 0xc0028eb, 0xafa00014, 0x8ec20234, 0x24420001, 0xaec20234,
+0xa2c0011c, 0x3c040001, 0x24842948, 0x34a5f009, 0x2203021, 0x3821,
+0xafa00010, 0xc00290f, 0xafa00014, 0x8ec20234, 0x24420001, 0xaec20234,
0x100001a3, 0x8ec20234, 0x111302, 0x30440fff, 0x24020001, 0x10820005,
0x24020002, 0x1082000d, 0x3c050003, 0x10000013, 0x0, 0x8f820220,
0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x24020001,
0xa2c2011d, 0x10000011, 0xaec40200, 0x8f820220, 0x3c0308ff, 0x3463fff7,
0x431024, 0xaf820220, 0xa2c0011d, 0x10000009, 0xaec40200, 0x3c040001,
-0x24842824, 0x34a5f00a, 0x2203021, 0x3821, 0xafa00010, 0xc0028eb,
+0x24842954, 0x34a5f00a, 0x2203021, 0x3821, 0xafa00010, 0xc00290f,
0xafa00014, 0x8ec20224, 0x24420001, 0xaec20224, 0x1000017b, 0x8ec20224,
-0x27840208, 0x27450200, 0xc00297e, 0x24060008, 0x26c4018c, 0x27450200,
-0xc00297e, 0x24060008, 0x8ec2022c, 0x24420001, 0xaec2022c, 0x1000016e,
+0x27840208, 0x27450200, 0xc0029a2, 0x24060008, 0x26c4018c, 0x27450200,
+0xc0029a2, 0x24060008, 0x8ec2022c, 0x24420001, 0xaec2022c, 0x1000016e,
0x8ec2022c, 0x111302, 0x30430fff, 0x24020001, 0x10620011, 0x28620002,
0x50400005, 0x24020002, 0x10600007, 0x0, 0x10000017, 0x0,
0x1062000f, 0x0, 0x10000013, 0x0, 0x8f460248, 0x24040001,
-0xc004680, 0x24050004, 0x10000007, 0x0, 0x8f460248, 0x24040001,
-0xc004680, 0x24050004, 0x10000010, 0x0, 0x8f46024c, 0x24040001,
-0xc004680, 0x24050001, 0x1000000a, 0x0, 0x3c040001, 0x24842830,
-0x3c050003, 0x34a50005, 0x2203021, 0x3821, 0xafa00010, 0xc0028eb,
+0xc0046cc, 0x24050004, 0x10000007, 0x0, 0x8f460248, 0x24040001,
+0xc0046cc, 0x24050004, 0x10000010, 0x0, 0x8f46024c, 0x24040001,
+0xc0046cc, 0x24050001, 0x1000000a, 0x0, 0x3c040001, 0x24842960,
+0x3c050003, 0x34a50005, 0x2203021, 0x3821, 0xafa00010, 0xc00290f,
0xafa00014, 0x8ec20228, 0x24420001, 0xaec20228, 0x1000013f, 0x8ec20228,
0xc002221, 0x0, 0x1000013b, 0x0, 0x24020001, 0xa2c20528,
0x24110014, 0x8ee404a0, 0x8ee504a4, 0xafb10010, 0xafa00014, 0x8ec20010,
@@ -3639,8 +3661,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x1000012a, 0x0, 0x3c020900, 0xaec00054, 0xaec00058,
0xaec0005c, 0xaec00060, 0xaec002c0, 0xa2c00065, 0xafa20020, 0x8ec3002c,
0x240200ff, 0x10620004, 0x27a70020, 0x8ec2002c, 0x10000002, 0x24530001,
-0x9821, 0x8f420228, 0x1662000f, 0x0, 0x3c040001, 0x248427dc,
-0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb,
+0x9821, 0x8f420228, 0x1662000f, 0x0, 0x3c040001, 0x2484290c,
+0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f,
0x34a5f00f, 0x8ec202a0, 0x24420001, 0xaec202a0, 0x1000006b, 0x8ec202a0,
0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000, 0x8ce40004, 0xac4304c0,
0xac4404c4, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9,
@@ -3649,7 +3671,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x1021, 0x8ec80008, 0xa32821, 0xa3482b, 0x822021, 0x892021,
0x630c0, 0xafa80018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021,
0x54400006, 0x24150001, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffe5,
-0x0, 0x32a200ff, 0x54400011, 0xaed3002c, 0x3c040001, 0x248427e8,
+0x0, 0x32a200ff, 0x54400011, 0xaed3002c, 0x3c040001, 0x24842918,
0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x1000002e,
0x34a5f010, 0x8ec2026c, 0x24150001, 0x24420001, 0xaec2026c, 0x8ec2026c,
0x1000001d, 0x32a200ff, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023,
@@ -3657,33 +3679,33 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ee5048c, 0x8ec2002c, 0x8f860120, 0xafb30010, 0xafa20014, 0xafa30018,
0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe4, 0x0,
0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffee, 0x0, 0x32a200ff,
-0x1440000f, 0x0, 0x3c040001, 0x248427f4, 0xafa00010, 0xafa00014,
-0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011, 0xc0028eb, 0x0,
+0x1440000f, 0x0, 0x3c040001, 0x24842924, 0xafa00010, 0xafa00014,
+0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011, 0xc00290f, 0x0,
0x8ec202d0, 0x24420001, 0xaec202d0, 0x8ec202d0, 0x8ec20218, 0x24420001,
0xaec20218, 0x8ec20218, 0x8ec2025c, 0x24420001, 0xaec2025c, 0x10000096,
0x8ec2025c, 0x8f42025c, 0x26c4018c, 0xaec20158, 0x8f420260, 0x27450200,
-0x24060008, 0xc00297e, 0xaec20160, 0x8f820220, 0x30420008, 0x14400002,
+0x24060008, 0xc0029a2, 0xaec20160, 0x8f820220, 0x30420008, 0x14400002,
0x24020001, 0x24020002, 0xaec20200, 0x8ec20214, 0x24420001, 0xaec20214,
0x10000083, 0x8ec20214, 0x3c0200ff, 0x96e30462, 0x3442ffff, 0x2222024,
0x3402fffb, 0x44102b, 0x38420001, 0x30630003, 0x2c630001, 0x621824,
-0x10600003, 0x0, 0x10000075, 0xaec40050, 0x3c040001, 0x2484283c,
-0x3c050003, 0x34a5f00f, 0x2203021, 0x3821, 0xafa00010, 0xc0028eb,
+0x10600003, 0x0, 0x10000075, 0xaec40050, 0x3c040001, 0x2484296c,
+0x3c050003, 0x34a5f00f, 0x2203021, 0x3821, 0xafa00010, 0xc00290f,
0xafa00014, 0x3c030700, 0x34631000, 0x111602, 0x431025, 0xafa20020,
0x8ec3002c, 0x240200ff, 0x10620004, 0x27a70020, 0x8ec2002c, 0x10000002,
0x24510001, 0x8821, 0x8f420228, 0x1622000f, 0x4021, 0x3c040001,
-0x248427bc, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
-0xc0028eb, 0x34a5f005, 0x8ec202a0, 0x24420001, 0xaec202a0, 0x10000046,
+0x248428ec, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
+0xc00290f, 0x34a5f005, 0x8ec202a0, 0x24420001, 0xaec202a0, 0x10000046,
0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000, 0x8ce40004,
0xac4304c0, 0xac4404c4, 0x8ec3002c, 0x8ee40428, 0x8ee5042c, 0x8ec6002c,
0x24070008, 0x2402000d, 0xafa20010, 0xafb10014, 0x8ec20008, 0x318c0,
0x604821, 0xa92821, 0xa9182b, 0x882021, 0x832021, 0x630c0,
0xafa20018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x5440000c,
-0xaed1002c, 0x3c040001, 0x248427c8, 0xafa00010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f000, 0x1000001d, 0x0,
+0xaed1002c, 0x3c040001, 0x248428f8, 0xafa00010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f000, 0x1000001d, 0x0,
0x8ee40488, 0x8ee5048c, 0x8ec3002c, 0x8ec80008, 0x8f860120, 0x24020011,
0xafa20010, 0xafa30014, 0xafa80018, 0x8ec200a8, 0x24070008, 0x40f809,
-0x24c6001c, 0x1440000e, 0x0, 0x3c040001, 0x248427d0, 0xafa00010,
-0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f001,
+0x24c6001c, 0x1440000e, 0x0, 0x3c040001, 0x24842900, 0xafa00010,
+0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f001,
0x8ec202a4, 0x24420001, 0xaec202a4, 0x8ec202a4, 0x8ec20244, 0x24420001,
0xaec20244, 0x8ec20244, 0x8ec20254, 0x24420001, 0xaec20254, 0x8ec20254,
0x8fbf0038, 0x8fbe0034, 0x8fb50030, 0x8fb3002c, 0x8fb10028, 0x3e00008,
@@ -3697,16 +3719,16 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xaf820220, 0x8f820200, 0x3c03c0ff, 0x3463ffff, 0x431024, 0x34420004,
0xaf820200, 0x8ede02bc, 0x8ec702c0, 0xafa70014, 0x8ec702c4, 0xafa7001c,
0x8ec20238, 0x26c40128, 0x24420001, 0xaec20238, 0x8ed10238, 0x8ed3016c,
-0x8ed50168, 0xc00296c, 0x24050400, 0xaede02bc, 0x8fa70014, 0xaec702c0,
+0x8ed50168, 0xc002990, 0x24050400, 0xaede02bc, 0x8fa70014, 0xaec702c0,
0x8fa7001c, 0xaec702c4, 0xaed10238, 0xaed3016c, 0xaed50168, 0x8f42025c,
0x26c4018c, 0xaec20158, 0x8f420260, 0x27450200, 0x24060008, 0xaec20160,
-0x24020006, 0xc00297e, 0xaec2015c, 0x3c023b9a, 0x3442ca00, 0xaec20164,
+0x24020006, 0xc0029a2, 0xaec2015c, 0x3c023b9a, 0x3442ca00, 0xaec20164,
0x240203e8, 0x24040002, 0x24030001, 0xaec201fc, 0xaec401f8, 0xaec30204,
0x8f820220, 0x30420008, 0x10400004, 0x0, 0xaec30200, 0x10000003,
-0x3021, 0xaec40200, 0x3021, 0x3c030001, 0x661821, 0x90633200,
+0x3021, 0xaec40200, 0x3021, 0x3c030001, 0x661821, 0x90633360,
0x2c61021, 0x24c60001, 0xa0430194, 0x2cc2000f, 0x1440fff8, 0x2c61821,
0x24c60001, 0x8f820040, 0x27440080, 0x24050080, 0x21702, 0x24420030,
-0xa0620194, 0x2c61021, 0xc00296c, 0xa0400194, 0x8fa70024, 0x30e20004,
+0xa0620194, 0x2c61021, 0xc002990, 0xa0400194, 0x8fa70024, 0x30e20004,
0x14400006, 0x0, 0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024,
0xaf820220, 0x8fa7002c, 0x30e20004, 0x14400006, 0x0, 0x8f820200,
0x3c03c0ff, 0x3463fffb, 0x431024, 0xaf820200, 0x8fbf0040, 0x8fbe003c,
@@ -3736,11 +3758,11 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x431026, 0x2c460001, 0xc01021, 0x14400005, 0x510c0, 0x2e21021,
0x944575c0, 0x14a0ffed, 0x510c0, 0xa03021, 0x10c00010, 0x610c0,
0x571821, 0x8c6375c0, 0x571021, 0xafa30010, 0x8c4275c4, 0x3c040001,
-0x2484294c, 0xafa20014, 0x8f460210, 0x8f470214, 0x3c050003, 0xc0028eb,
+0x24842a7c, 0xafa20014, 0x8f460210, 0x8f470214, 0x3c050003, 0xc00290f,
0x34a5f012, 0x10000051, 0x3c020800, 0x8ec50124, 0x10a00004, 0x510c0,
0x2e21021, 0x944275c0, 0xaec20124, 0xa03021, 0x14c0000f, 0x27440212,
-0x810c0, 0x2e21021, 0xafa80010, 0x944271c0, 0x3c040001, 0x24842958,
-0xafa20014, 0x8f460210, 0x8f470214, 0x3c050003, 0xc0028eb, 0x34a5f013,
+0x810c0, 0x2e21021, 0xafa80010, 0x944271c0, 0x3c040001, 0x24842a88,
+0xafa20014, 0x8f460210, 0x8f470214, 0x3c050003, 0xc00290f, 0x34a5f013,
0x1000003a, 0x3c020800, 0x628c0, 0x94830000, 0xb71021, 0x244275c2,
0xa4430000, 0x8c830002, 0x820c0, 0xac430002, 0x2e41021, 0x944371c0,
0x2e51021, 0xa44375c0, 0x2e41021, 0xa44671c0, 0x8ec20120, 0x24420001,
@@ -3753,8 +3775,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x24020001, 0x821004, 0x621825, 0xaca30228, 0x3c020800, 0x34421000,
0xafa20020, 0x8ec3002c, 0x240200ff, 0x10620004, 0x27a70020, 0x8ec2002c,
0x10000002, 0x24530001, 0x9821, 0x8f420228, 0x1662000f, 0x0,
-0x3c040001, 0x24842928, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f00f, 0x8ec202a0, 0x24420001, 0xaec202a0,
+0x3c040001, 0x24842a58, 0xafa00010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f00f, 0x8ec202a0, 0x24420001, 0xaec202a0,
0x1000006b, 0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021, 0x8ce30000,
0x8ce40004, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054, 0x247103e8,
0x2221023, 0x2c4203e9, 0x1040001e, 0xa821, 0x241e000d, 0x8ec8002c,
@@ -3763,16 +3785,16 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x822021, 0x892021, 0x630c0, 0xafa80018, 0x8ec200a8, 0x24c604c0,
0x40f809, 0x2e63021, 0x54400006, 0x24150001, 0x8f820054, 0x2221023,
0x2c4203e9, 0x1440ffe5, 0x0, 0x32a200ff, 0x54400011, 0xaed3002c,
-0x3c040001, 0x24842934, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
+0x3c040001, 0x24842a64, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124,
0x3c050009, 0x1000002e, 0x34a5f010, 0x8ec2026c, 0x24150001, 0x24420001,
0xaec2026c, 0x8ec2026c, 0x1000001d, 0x32a200ff, 0x8f830054, 0x8f820054,
0x247103e8, 0x2221023, 0x2c4203e9, 0x10400015, 0xa821, 0x24130011,
0x8ec30008, 0x8ee40488, 0x8ee5048c, 0x8ec2002c, 0x8f860120, 0xafb30010,
0xafa20014, 0xafa30018, 0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c,
0x1440ffe4, 0x0, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffee,
-0x0, 0x32a200ff, 0x1440000f, 0x0, 0x3c040001, 0x24842940,
+0x0, 0x32a200ff, 0x1440000f, 0x0, 0x3c040001, 0x24842a70,
0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011,
-0xc0028eb, 0x0, 0x8ec202d0, 0x24420001, 0xaec202d0, 0x8ec202d0,
+0xc00290f, 0x0, 0x8ec202d0, 0x24420001, 0xaec202d0, 0x8ec202d0,
0x8ec2021c, 0x24420001, 0xaec2021c, 0x8ec2021c, 0x8ec20258, 0x24420001,
0xaec20258, 0x8ec20258, 0x8fbf0038, 0x8fbe0034, 0x8fb50030, 0x8fb3002c,
0x8fb10028, 0x3e00008, 0x27bd0040, 0x27bdffb0, 0x27440212, 0x24050006,
@@ -3783,8 +3805,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x94a20004, 0x95230004, 0x431026, 0x2c460001, 0xc01021, 0x14400006,
0x710c0, 0xe04021, 0x2e21021, 0x944775c0, 0x14e0ffec, 0x710c0,
0xe02821, 0x14a0000f, 0xafa80028, 0x410c0, 0x2e21021, 0xafa40010,
-0x944271c0, 0x3c040001, 0x24842964, 0xafa20014, 0x8f460210, 0x8f470214,
-0x3c050003, 0xc0028eb, 0x34a5f01c, 0x10000062, 0x3c020800, 0x11000007,
+0x944271c0, 0x3c040001, 0x24842a94, 0xafa20014, 0x8f460210, 0x8f470214,
+0x3c050003, 0xc00290f, 0x34a5f01c, 0x10000062, 0x3c020800, 0x11000007,
0x510c0, 0x2e21021, 0x944375c0, 0x810c0, 0x2e21021, 0x10000006,
0xa44375c0, 0x2e21021, 0x944375c0, 0x410c0, 0x2e21021, 0xa44371c0,
0x8ec30124, 0x510c0, 0x2e21021, 0x26e871c0, 0xa44375c0, 0x8ec20120,
@@ -3803,8 +3825,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8c420228, 0x831804, 0x31827, 0x431024, 0xaca20228, 0x3c020800,
0x34422000, 0xafa20020, 0x8ec3002c, 0x240200ff, 0x10620004, 0x27a70020,
0x8ec2002c, 0x10000002, 0x24530001, 0x9821, 0x8f420228, 0x1662000f,
-0x0, 0x3c040001, 0x24842928, 0xafa00010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f00f, 0x8ec202a0, 0x24420001,
+0x0, 0x3c040001, 0x24842a58, 0xafa00010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f00f, 0x8ec202a0, 0x24420001,
0xaec202a0, 0x1000006b, 0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021,
0x8ce30000, 0x8ce40004, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054,
0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001e, 0xa821, 0x241e000d,
@@ -3813,7 +3835,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xa3482b, 0x822021, 0x892021, 0x630c0, 0xafa80018, 0x8ec200a8,
0x24c604c0, 0x40f809, 0x2e63021, 0x54400006, 0x24150001, 0x8f820054,
0x2221023, 0x2c4203e9, 0x1440ffe5, 0x0, 0x32a200ff, 0x54400011,
-0xaed3002c, 0x3c040001, 0x24842934, 0xafa00010, 0xafa00014, 0x8f860120,
+0xaed3002c, 0x3c040001, 0x24842a64, 0xafa00010, 0xafa00014, 0x8f860120,
0x8f870124, 0x3c050009, 0x1000002e, 0x34a5f010, 0x8ec2026c, 0x24150001,
0x24420001, 0xaec2026c, 0x8ec2026c, 0x1000001d, 0x32a200ff, 0x8f830054,
0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x10400015, 0xa821,
@@ -3821,12 +3843,12 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xafb30010, 0xafa20014, 0xafa30018, 0x8ec200a8, 0x24070008, 0x40f809,
0x24c6001c, 0x1440ffe4, 0x0, 0x8f820054, 0x2221023, 0x2c4203e9,
0x1440ffee, 0x0, 0x32a200ff, 0x1440000f, 0x0, 0x3c040001,
-0x24842940, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
-0x34a5f011, 0xc0028eb, 0x0, 0x8ec202d0, 0x24420001, 0xaec202d0,
+0x24842a70, 0xafa00010, 0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009,
+0x34a5f011, 0xc00290f, 0x0, 0x8ec202d0, 0x24420001, 0xaec202d0,
0x8ec202d0, 0x8ec20220, 0x24420001, 0xaec20220, 0x8ec20220, 0x8ec20258,
0x24420001, 0xaec20258, 0x8ec20258, 0x8fbf0048, 0x8fbe0044, 0x8fb50040,
0x8fb3003c, 0x8fb10038, 0x3e00008, 0x27bd0050, 0x0, 0x0,
-0x27bdffe8, 0x27644000, 0xafbf0010, 0xc00296c, 0x24051000, 0x24020020,
+0x27bdffe8, 0x27644000, 0xafbf0010, 0xc002990, 0x24051000, 0x24020020,
0xaf82011c, 0xaf800100, 0xaf800104, 0xaf800108, 0xaf800110, 0xaf800114,
0xaf800118, 0xaf800120, 0xaf800124, 0xaf800128, 0xaf800130, 0xaf800134,
0xaf800138, 0xaec000dc, 0xaec000e0, 0xaec000e4, 0xaec000e8, 0x3c020001,
@@ -3835,173 +3857,179 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x3c026000, 0x1062000b, 0x0, 0x10000010, 0x0, 0x8f420218,
0x30420040, 0x14400009, 0x0, 0x8f820050, 0x3c030010, 0x10000003,
0x431024, 0x8f420218, 0x30420040, 0x10400004, 0x0, 0x8f82011c,
-0x34420004, 0xaf82011c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x8faa0010,
-0x8f83012c, 0x8fab0014, 0x1060000c, 0x8fac0018, 0x8ec20534, 0x8f890128,
-0x24680020, 0x51020005, 0x27624800, 0x11280005, 0x24620020, 0x10000009,
-0x0, 0x15220007, 0x24620020, 0x8ec30298, 0x1021, 0x24630001,
-0xaec30298, 0x1000006b, 0x8ec30298, 0xac640000, 0xac650004, 0xac660008,
-0xa467000e, 0xac6a0018, 0xac6b001c, 0xac6c0010, 0x2543ffee, 0x2c630002,
-0xaf820120, 0x39420011, 0x2c420001, 0x621825, 0x10600025, 0x0,
-0x8ec200e4, 0x210c0, 0x24426fc0, 0x2e22021, 0x8c830000, 0x24020012,
-0x1462000f, 0x0, 0x8ec300e4, 0x8ec200e8, 0x1062000b, 0x24030040,
-0x8c820004, 0x24420001, 0xac820004, 0x8ec200e8, 0x8ec500e4, 0x24420001,
-0x1043002b, 0x0, 0x10000023, 0x0, 0x8ec200e4, 0x24030040,
-0x24420001, 0x50430003, 0x1021, 0x8ec200e4, 0x24420001, 0xaec200e4,
-0x8ec200e4, 0x210c0, 0x24426fc0, 0x2e22021, 0x10000034, 0x24020012,
-0x8ec200e4, 0x210c0, 0x24426fc0, 0x2e22021, 0x8c830000, 0x24020007,
-0x1462001f, 0x0, 0x8ec300e4, 0x8ec200e8, 0x1062001b, 0x24030040,
-0x8c820004, 0x24420001, 0xac820004, 0x8ec200e8, 0x8ec500e4, 0x24420001,
-0x10430007, 0x0, 0x8ec200e8, 0x24420001, 0x10a20005, 0x0,
-0x10000007, 0x0, 0x14a00005, 0x0, 0x8f820128, 0x24420020,
-0xaf820128, 0x8f820128, 0x8c820004, 0x2c420011, 0x50400013, 0xac800000,
-0x10000012, 0x24020001, 0x8ec200e4, 0x24030040, 0x24420001, 0x50430003,
-0x1021, 0x8ec200e4, 0x24420001, 0xaec200e4, 0x8ec200e4, 0x210c0,
-0x24426fc0, 0x2e22021, 0x24020007, 0xac820000, 0x24020001, 0xac820004,
-0x24020001, 0x3e00008, 0x0, 0x3e00008, 0x0, 0x8faa0010,
-0x8fab0014, 0x8f880120, 0x8ec20534, 0x8fac0018, 0x25030020, 0x14620002,
-0x604821, 0x27694800, 0x8f820128, 0x1122000c, 0x25030016, 0xad040000,
-0xad050004, 0xad060008, 0xa507000e, 0xad0a0018, 0xad0b001c, 0xad030014,
-0xad0c0010, 0xaf890120, 0x10000006, 0x24020001, 0x8ec30298, 0x1021,
-0x24630001, 0xaec30298, 0x8ec30298, 0x3e00008, 0x0, 0x3e00008,
-0x0, 0x8faa0010, 0x8f83010c, 0x8fab0014, 0x1060000c, 0x8fac0018,
-0x8f890108, 0x24680020, 0x27624800, 0x51020005, 0x27624000, 0x11280005,
-0x24620020, 0x10000009, 0x0, 0x15220007, 0x24620020, 0x8ec3029c,
-0x1021, 0x24630001, 0xaec3029c, 0x10000052, 0x8ec3029c, 0xac640000,
-0xac650004, 0xac660008, 0xa467000e, 0xac6a0018, 0xac6b001c, 0xac6c0010,
-0xaf820100, 0x2542fffb, 0x2c420002, 0x10400037, 0x24030040, 0x8ec200dc,
-0x210c0, 0x24426dc0, 0x2e22021, 0x8c830000, 0x24020005, 0x1462001f,
-0x0, 0x8ec300dc, 0x8ec200e0, 0x1062001b, 0x24030040, 0x8c820004,
-0x24420001, 0xac820004, 0x8ec200e0, 0x8ec500dc, 0x24420001, 0x10430007,
-0x0, 0x8ec200e0, 0x24420001, 0x10a20005, 0x0, 0x10000007,
-0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020, 0xaf820108,
-0x8f820108, 0x8c820004, 0x2c420011, 0x50400021, 0xac800000, 0x10000020,
-0x24020001, 0x8ec200dc, 0x24030040, 0x24420001, 0x50430003, 0x1021,
-0x8ec200dc, 0x24420001, 0xaec200dc, 0x8ec200dc, 0x210c0, 0x24426dc0,
-0x2e22021, 0x24020005, 0xac820000, 0x1000000e, 0x24020001, 0x8ec200dc,
-0x24420001, 0x50430003, 0x1021, 0x8ec200dc, 0x24420001, 0xaec200dc,
-0x8ec200dc, 0x210c0, 0x24426dc0, 0x2e22021, 0x24020001, 0xac8a0000,
-0xac820004, 0x24020001, 0x3e00008, 0x0, 0x3e00008, 0x0,
-0x8f880100, 0x8fa30010, 0x8faa0014, 0x8fab0018, 0x27624800, 0x25090020,
-0x122102b, 0x50400001, 0x27694000, 0x8f820108, 0x1122000d, 0x0,
-0xad030018, 0x25030016, 0xad040000, 0xad050004, 0xad060008, 0xa507000e,
-0xad0a001c, 0xad030014, 0xad0b0010, 0xaf890100, 0x10000006, 0x24020001,
+0x34420004, 0xaf82011c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x8fa90010,
+0x8f83012c, 0x8faa0014, 0x8fab0018, 0x1060000a, 0x24680020, 0x8ec20534,
+0x51020001, 0x27684800, 0x8f820128, 0x11020004, 0x0, 0x8f820124,
+0x15020007, 0x39220011, 0x8ec30298, 0x1021, 0x24630001, 0xaec30298,
+0x10000069, 0x8ec30298, 0xac640000, 0xac650004, 0xac660008, 0xa467000e,
+0xac690018, 0xac6a001c, 0xac6b0010, 0x2523ffee, 0x2c630002, 0x2c420001,
+0x621825, 0x10600025, 0xaf880120, 0x8ec200e4, 0x210c0, 0x24426fc0,
+0x2e22021, 0x8c830000, 0x24020012, 0x1462000f, 0x0, 0x8ec300e4,
+0x8ec200e8, 0x1062000b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
+0x8ec200e8, 0x8ec500e4, 0x24420001, 0x1043002b, 0x0, 0x10000023,
+0x0, 0x8ec200e4, 0x24030040, 0x24420001, 0x50430003, 0x1021,
+0x8ec200e4, 0x24420001, 0xaec200e4, 0x8ec200e4, 0x210c0, 0x24426fc0,
+0x2e22021, 0x10000034, 0x24020012, 0x8ec200e4, 0x210c0, 0x24426fc0,
+0x2e22021, 0x8c830000, 0x24020007, 0x1462001f, 0x0, 0x8ec300e4,
+0x8ec200e8, 0x1062001b, 0x24030040, 0x8c820004, 0x24420001, 0xac820004,
+0x8ec200e8, 0x8ec500e4, 0x24420001, 0x10430007, 0x0, 0x8ec200e8,
+0x24420001, 0x10a20005, 0x0, 0x10000007, 0x0, 0x14a00005,
+0x0, 0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x8c820004,
+0x2c420011, 0x50400013, 0xac800000, 0x10000012, 0x24020001, 0x8ec200e4,
+0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ec200e4, 0x24420001,
+0xaec200e4, 0x8ec200e4, 0x210c0, 0x24426fc0, 0x2e22021, 0x24020007,
+0xac820000, 0x24020001, 0xac820004, 0x24020001, 0x3e00008, 0x0,
+0x3e00008, 0x0, 0x8faa0010, 0x8fab0014, 0x8f880120, 0x8ec20534,
+0x8fac0018, 0x25030020, 0x14620002, 0x604821, 0x27694800, 0x8f820128,
+0x1122000c, 0x25030016, 0xad040000, 0xad050004, 0xad060008, 0xa507000e,
+0xad0a0018, 0xad0b001c, 0xad030014, 0xad0c0010, 0xaf890120, 0x10000006,
+0x24020001, 0x8ec30298, 0x1021, 0x24630001, 0xaec30298, 0x8ec30298,
+0x3e00008, 0x0, 0x3e00008, 0x0, 0x8fa90010, 0x8f83010c,
+0x8faa0014, 0x8fab0018, 0x1060000a, 0x24680020, 0x27624800, 0x51020001,
+0x27684000, 0x8f820108, 0x11020004, 0x0, 0x8f820104, 0x15020007,
+0x2522fffb, 0x8ec3029c, 0x1021, 0x24630001, 0xaec3029c, 0x10000051,
+0x8ec3029c, 0x2c420002, 0xac640000, 0xac650004, 0xac660008, 0xa467000e,
+0xac690018, 0xac6a001c, 0xac6b0010, 0xaf880100, 0x10400037, 0x24030040,
+0x8ec200dc, 0x210c0, 0x24426dc0, 0x2e22021, 0x8c830000, 0x24020005,
+0x1462001f, 0x0, 0x8ec300dc, 0x8ec200e0, 0x1062001b, 0x24030040,
+0x8c820004, 0x24420001, 0xac820004, 0x8ec200e0, 0x8ec500dc, 0x24420001,
+0x10430007, 0x0, 0x8ec200e0, 0x24420001, 0x10a20005, 0x0,
+0x10000007, 0x0, 0x14a00005, 0x0, 0x8f820108, 0x24420020,
+0xaf820108, 0x8f820108, 0x8c820004, 0x2c420011, 0x50400021, 0xac800000,
+0x10000020, 0x24020001, 0x8ec200dc, 0x24030040, 0x24420001, 0x50430003,
+0x1021, 0x8ec200dc, 0x24420001, 0xaec200dc, 0x8ec200dc, 0x210c0,
+0x24426dc0, 0x2e22021, 0x24020005, 0xac820000, 0x1000000e, 0x24020001,
+0x8ec200dc, 0x24420001, 0x50430003, 0x1021, 0x8ec200dc, 0x24420001,
+0xaec200dc, 0x8ec200dc, 0x210c0, 0x24426dc0, 0x2e22021, 0x24020001,
+0xac890000, 0xac820004, 0x24020001, 0x3e00008, 0x0, 0x3e00008,
+0x0, 0x8fab0010, 0x8f880100, 0x8faa0014, 0x8fac0018, 0x27624800,
+0x25030020, 0x14620002, 0x604821, 0x27694000, 0x8f820108, 0x1122000c,
+0x25030016, 0xad040000, 0xad050004, 0xad060008, 0xa507000e, 0xad0b0018,
+0xad0a001c, 0xad030014, 0xad0c0010, 0xaf890100, 0x10000006, 0x24020001,
0x8ec3029c, 0x1021, 0x24630001, 0xaec3029c, 0x8ec3029c, 0x3e00008,
0x0, 0x3e00008, 0x0, 0x27bdffe0, 0xafbf0018, 0x8f820104,
-0xafa20010, 0x8f820100, 0x3c050002, 0xafa20014, 0x8f8600b0, 0x8f87011c,
-0x3c040001, 0x24842a2c, 0xc0028eb, 0x34a5f000, 0x8f420218, 0x30420100,
+0xafa20010, 0x8f820100, 0x3c040001, 0x24842b5c, 0xafa20014, 0x8f8600b0,
+0x8f87011c, 0x3c050002, 0xc00290f, 0x34a5f000, 0x8f420218, 0x30420100,
0x10400017, 0x0, 0x8f8200b0, 0x3c030200, 0x431024, 0x10400012,
0x0, 0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830104, 0x8f8200b0,
0x34420001, 0xaf8200b0, 0xaf830104, 0x8f82011c, 0x2403fffd, 0x431024,
-0xaf82011c, 0x8ec20294, 0x24420001, 0xaec20294, 0x10000004, 0x8ec20294,
-0x8f8200b0, 0x34420001, 0xaf8200b0, 0x8fbf0018, 0x3e00008, 0x27bd0020,
-0x27bdffe0, 0xafbf0018, 0x8f820120, 0xafa20010, 0x8f820124, 0x3c050001,
-0xafa20014, 0x8f8600a0, 0x8f87011c, 0x3c040001, 0x24842a38, 0xc0028eb,
-0x34a5f000, 0x8f420218, 0x30420100, 0x10400017, 0x0, 0x8f8200a0,
-0x3c030200, 0x431024, 0x10400012, 0x0, 0x8f82011c, 0x34420002,
-0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0xaf830124,
-0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c, 0x8ec20290, 0x24420001,
-0xaec20290, 0x10000004, 0x8ec20290, 0x8f8200a0, 0x34420001, 0xaf8200a0,
-0x8fbf0018, 0x3e00008, 0x27bd0020, 0x6021, 0x5021, 0x3021,
-0x2821, 0x6821, 0x4821, 0x7821, 0x7021, 0x8f880124,
-0x8f870104, 0x1580002e, 0x8f8b011c, 0x11a00014, 0x31620800, 0x8f820120,
-0x10460029, 0x0, 0x3c040001, 0x8c843390, 0x8cc20000, 0x8cc30004,
-0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e,
-0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020,
-0x10400017, 0x0, 0x3c040001, 0x8c843390, 0x8d020000, 0x8d030004,
-0xac820000, 0xac830004, 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e,
-0x8d020010, 0x25060020, 0xac820010, 0x8d020014, 0x240c0001, 0xc01821,
-0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 0x27634800, 0x603021,
-0x1540002f, 0x31620100, 0x11200014, 0x31628000, 0x8f820100, 0x1045002a,
-0x31620100, 0x3c040001, 0x8c84338c, 0x8ca20000, 0x8ca30004, 0xac820000,
-0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010,
-0x240a0001, 0xac820010, 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018,
-0x31620100, 0x3c040001, 0x8c84338c, 0x8ce20000, 0x8ce30004, 0xac820000,
-0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010,
-0x24e50020, 0xac820010, 0x8ce20014, 0x240a0001, 0xa01821, 0xac820014,
-0x276247e0, 0x43102b, 0x54400001, 0x27634000, 0x602821, 0x31620100,
-0x5440001d, 0x31621000, 0x11a00009, 0x31a20800, 0x10400004, 0x25020020,
-0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 0x8f880124, 0x6821,
-0x11800011, 0x31621000, 0x3c040001, 0x8c843390, 0x8c820000, 0x8c830004,
-0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac,
-0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31621000,
-0x1440ff82, 0x0, 0x1120000f, 0x31220800, 0x10400004, 0x3c020002,
-0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1221024, 0x10400004, 0x24e20020,
-0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 0x8f870104, 0x4821,
-0x1140ff70, 0x0, 0x3c040001, 0x8c84338c, 0x8c820000, 0x8c830004,
-0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c,
-0x8c820010, 0x5021, 0xaf8200b0, 0x8c890010, 0x1000ff60, 0x8c8e0014,
-0x3e00008, 0x0, 0x6021, 0x5821, 0x3021, 0x2821,
-0x6821, 0x5021, 0x7821, 0x7021, 0x8f880124, 0x8f870104,
-0x3c180100, 0x1580002e, 0x8f89011c, 0x11a00014, 0x31220800, 0x8f820120,
-0x10460029, 0x0, 0x3c040001, 0x8c843390, 0x8cc20000, 0x8cc30004,
-0xac820000, 0xac830004, 0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e,
-0x8cc20010, 0x240c0001, 0xac820010, 0x8cc20014, 0x10000012, 0x24c60020,
-0x10400017, 0x0, 0x3c040001, 0x8c843390, 0x8d020000, 0x8d030004,
-0xac820000, 0xac830004, 0x8d020008, 0xac820008, 0x9502000e, 0xa482000e,
-0x8d020010, 0x25060020, 0xac820010, 0x8d020014, 0x240c0001, 0xc01821,
-0xac820014, 0x27624fe0, 0x43102b, 0x54400001, 0x27634800, 0x603021,
-0x1560002f, 0x31220100, 0x11400014, 0x31228000, 0x8f820100, 0x1045002a,
-0x31220100, 0x3c040001, 0x8c84338c, 0x8ca20000, 0x8ca30004, 0xac820000,
-0xac830004, 0x8ca20008, 0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010,
-0x240b0001, 0xac820010, 0x8ca20014, 0x10000012, 0x24a50020, 0x10400018,
-0x31220100, 0x3c040001, 0x8c84338c, 0x8ce20000, 0x8ce30004, 0xac820000,
-0xac830004, 0x8ce20008, 0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010,
-0x24e50020, 0xac820010, 0x8ce20014, 0x240b0001, 0xa01821, 0xac820014,
-0x276247e0, 0x43102b, 0x54400001, 0x27634000, 0x602821, 0x31220100,
-0x5440001d, 0x31221000, 0x11a00009, 0x31a20800, 0x10400004, 0x25020020,
-0x8f8200a8, 0xa5e20000, 0x25020020, 0xaf820124, 0x8f880124, 0x6821,
-0x11800011, 0x31221000, 0x3c040001, 0x8c843390, 0x8c820000, 0x8c830004,
-0xaf820080, 0xaf830084, 0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac,
-0x8c820010, 0x6021, 0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31221000,
-0x14400022, 0x0, 0x1140000f, 0x31420800, 0x10400004, 0x3c020002,
-0x8f8200b8, 0xa5c20000, 0x3c020002, 0x1421024, 0x10400004, 0x24e20020,
-0x8f8200b4, 0xaf8200d4, 0x24e20020, 0xaf820104, 0x8f870104, 0x5021,
-0x11600010, 0x0, 0x3c040001, 0x8c84338c, 0x8c820000, 0x8c830004,
-0xaf820090, 0xaf830094, 0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c,
-0x8c820010, 0x5821, 0xaf8200b0, 0x8c8a0010, 0x8c8e0014, 0x8f820070,
-0x3c031000, 0x431024, 0x1040ff5c, 0x0, 0x8f820054, 0x24420005,
-0xaf820078, 0x8f420234, 0x10400017, 0x2021, 0x3c020001, 0x571021,
-0x8c4281dc, 0x24420005, 0x3c010001, 0x370821, 0xac2281dc, 0x3c020001,
-0x571021, 0x8c4281dc, 0x8f430234, 0x43102b, 0x14400009, 0x24020001,
-0x3c040080, 0x3c010001, 0x370821, 0xac2281d4, 0x3c010001, 0x370821,
-0x1000000c, 0xac2081dc, 0x3c020001, 0x571021, 0x8c4281d4, 0x14400006,
-0x3c020080, 0x3c020001, 0x571021, 0x8c4281d8, 0x10400002, 0x3c020080,
-0x822025, 0x8f420230, 0x10400014, 0x0, 0x3c020001, 0x571021,
-0x8c4281e4, 0x24420005, 0x3c010001, 0x370821, 0xac2281e4, 0x3c020001,
-0x571021, 0x8c4281e4, 0x8f430230, 0x43102b, 0x14400006, 0x0,
-0x3c010001, 0x370821, 0xac2081e4, 0x10000006, 0x982025, 0x3c020001,
-0x571021, 0x8c4281e0, 0x54400001, 0x982025, 0x3c020001, 0x571021,
-0x8c4281e8, 0x10400005, 0x3c022000, 0x822025, 0x3c010001, 0x370821,
-0xac2081e8, 0x1080ff0f, 0x0, 0x8ec20000, 0x10400007, 0x0,
-0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0,
-0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x441025,
-0xaf820060, 0x8ec20000, 0x10400003, 0x0, 0x1000fefa, 0xaf80004c,
-0x1000fef8, 0xaf800048, 0x3e00008, 0x0, 0x3c020001, 0x8c423228,
-0x27bdffe8, 0xafbf0014, 0x14400012, 0xafb10010, 0x3c110001, 0x26313430,
-0x2202021, 0xc00296c, 0x24052000, 0x26221fe0, 0x3c010001, 0xac223398,
-0x3c010001, 0xac223394, 0xaf420250, 0x24022000, 0xaf510254, 0xaf420258,
-0x24020001, 0x3c010001, 0xac223228, 0x8fbf0014, 0x8fb10010, 0x3e00008,
-0x27bd0018, 0x3c030001, 0x8c633398, 0x8c820000, 0x8fa80010, 0x8fa90014,
-0xac620000, 0x3c020001, 0x8c423398, 0x8c830004, 0xac430004, 0xac450008,
+0xaf82011c, 0x8ec20294, 0x24420001, 0xaec20294, 0x10000018, 0x8ec20294,
+0x3c040001, 0x24842b68, 0x3405dead, 0x3021, 0x3c070001, 0x24e72b70,
+0x24020287, 0xafa20010, 0xc00290f, 0xafa00014, 0x8f82011c, 0x34420002,
+0xaf82011c, 0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, 0x3c030001,
+0x431025, 0xaf820140, 0x8f8200b0, 0x34420001, 0xaf8200b0, 0x8fbf0018,
+0x3e00008, 0x27bd0020, 0x27bdffe0, 0xafbf0018, 0x8f820120, 0xafa20010,
+0x8f820124, 0x3c040001, 0x24842b98, 0xafa20014, 0x8f8600a0, 0x8f87011c,
+0x3c050001, 0xc00290f, 0x34a5f000, 0x8f420218, 0x30420100, 0x10400017,
+0x0, 0x8f8200a0, 0x3c030200, 0x431024, 0x10400012, 0x0,
+0x8f82011c, 0x34420002, 0xaf82011c, 0x8f830124, 0x8f8200a0, 0x34420001,
+0xaf8200a0, 0xaf830124, 0x8f82011c, 0x2403fffd, 0x431024, 0xaf82011c,
+0x8ec20290, 0x24420001, 0xaec20290, 0x10000018, 0x8ec20290, 0x3c040001,
+0x24842b68, 0x3405dead, 0x3021, 0x3c070001, 0x24e72b70, 0x240202a3,
+0xafa20010, 0xc00290f, 0xafa00014, 0x8f82011c, 0x34420002, 0xaf82011c,
+0x8f820220, 0x34420004, 0xaf820220, 0x8f820140, 0x3c030001, 0x431025,
+0xaf820140, 0x8f8200a0, 0x34420001, 0xaf8200a0, 0x8fbf0018, 0x3e00008,
+0x27bd0020, 0x6021, 0x5021, 0x3021, 0x2821, 0x6821,
+0x4821, 0x7821, 0x7021, 0x8f880124, 0x8f870104, 0x1580002e,
+0x8f8b011c, 0x11a00014, 0x31620800, 0x8f820120, 0x10460029, 0x0,
+0x3c040001, 0x8c8434f0, 0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004,
+0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001,
+0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, 0x10400017, 0x0,
+0x3c040001, 0x8c8434f0, 0x8d020000, 0x8d030004, 0xac820000, 0xac830004,
+0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 0x8d020010, 0x25060020,
+0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 0xac820014, 0x27624fe0,
+0x43102b, 0x54400001, 0x27634800, 0x603021, 0x1540002f, 0x31620100,
+0x11200014, 0x31628000, 0x8f820100, 0x1045002a, 0x31620100, 0x3c040001,
+0x8c8434ec, 0x8ca20000, 0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008,
+0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 0x240a0001, 0xac820010,
+0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, 0x31620100, 0x3c040001,
+0x8c8434ec, 0x8ce20000, 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008,
+0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010,
+0x8ce20014, 0x240a0001, 0xa01821, 0xac820014, 0x276247e0, 0x43102b,
+0x54400001, 0x27634000, 0x602821, 0x31620100, 0x5440001d, 0x31621000,
+0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000,
+0x25020020, 0xaf820124, 0x8f880124, 0x6821, 0x11800011, 0x31621000,
+0x3c040001, 0x8c8434f0, 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084,
+0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021,
+0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31621000, 0x1440ff82, 0x0,
+0x1120000f, 0x31220800, 0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000,
+0x3c020002, 0x1221024, 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4,
+0x24e20020, 0xaf820104, 0x8f870104, 0x4821, 0x1140ff70, 0x0,
+0x3c040001, 0x8c8434ec, 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094,
+0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, 0x8c820010, 0x5021,
+0xaf8200b0, 0x8c890010, 0x1000ff60, 0x8c8e0014, 0x3e00008, 0x0,
+0x6021, 0x5821, 0x3021, 0x2821, 0x6821, 0x5021,
+0x7821, 0x7021, 0x8f880124, 0x8f870104, 0x3c180100, 0x1580002e,
+0x8f89011c, 0x11a00014, 0x31220800, 0x8f820120, 0x10460029, 0x0,
+0x3c040001, 0x8c8434f0, 0x8cc20000, 0x8cc30004, 0xac820000, 0xac830004,
+0x8cc20008, 0xac820008, 0x94c2000e, 0xa482000e, 0x8cc20010, 0x240c0001,
+0xac820010, 0x8cc20014, 0x10000012, 0x24c60020, 0x10400017, 0x0,
+0x3c040001, 0x8c8434f0, 0x8d020000, 0x8d030004, 0xac820000, 0xac830004,
+0x8d020008, 0xac820008, 0x9502000e, 0xa482000e, 0x8d020010, 0x25060020,
+0xac820010, 0x8d020014, 0x240c0001, 0xc01821, 0xac820014, 0x27624fe0,
+0x43102b, 0x54400001, 0x27634800, 0x603021, 0x1560002f, 0x31220100,
+0x11400014, 0x31228000, 0x8f820100, 0x1045002a, 0x31220100, 0x3c040001,
+0x8c8434ec, 0x8ca20000, 0x8ca30004, 0xac820000, 0xac830004, 0x8ca20008,
+0xac820008, 0x94a2000e, 0xa482000e, 0x8ca20010, 0x240b0001, 0xac820010,
+0x8ca20014, 0x10000012, 0x24a50020, 0x10400018, 0x31220100, 0x3c040001,
+0x8c8434ec, 0x8ce20000, 0x8ce30004, 0xac820000, 0xac830004, 0x8ce20008,
+0xac820008, 0x94e2000e, 0xa482000e, 0x8ce20010, 0x24e50020, 0xac820010,
+0x8ce20014, 0x240b0001, 0xa01821, 0xac820014, 0x276247e0, 0x43102b,
+0x54400001, 0x27634000, 0x602821, 0x31220100, 0x5440001d, 0x31221000,
+0x11a00009, 0x31a20800, 0x10400004, 0x25020020, 0x8f8200a8, 0xa5e20000,
+0x25020020, 0xaf820124, 0x8f880124, 0x6821, 0x11800011, 0x31221000,
+0x3c040001, 0x8c8434f0, 0x8c820000, 0x8c830004, 0xaf820080, 0xaf830084,
+0x8c820008, 0xaf8200a4, 0x9482000e, 0xaf8200ac, 0x8c820010, 0x6021,
+0xaf8200a0, 0x8c8d0010, 0x8c8f0014, 0x31221000, 0x14400022, 0x0,
+0x1140000f, 0x31420800, 0x10400004, 0x3c020002, 0x8f8200b8, 0xa5c20000,
+0x3c020002, 0x1421024, 0x10400004, 0x24e20020, 0x8f8200b4, 0xaf8200d4,
+0x24e20020, 0xaf820104, 0x8f870104, 0x5021, 0x11600010, 0x0,
+0x3c040001, 0x8c8434ec, 0x8c820000, 0x8c830004, 0xaf820090, 0xaf830094,
+0x8c820008, 0xaf8200b4, 0x9482000e, 0xaf82009c, 0x8c820010, 0x5821,
+0xaf8200b0, 0x8c8a0010, 0x8c8e0014, 0x8f820070, 0x3c031000, 0x431024,
+0x1040ff5c, 0x0, 0x8f820054, 0x24420005, 0xaf820078, 0x8f420234,
+0x10400017, 0x2021, 0x3c020001, 0x571021, 0x8c4281dc, 0x24420005,
+0x3c010001, 0x370821, 0xac2281dc, 0x3c020001, 0x571021, 0x8c4281dc,
+0x8f430234, 0x43102b, 0x14400009, 0x24020001, 0x3c040080, 0x3c010001,
+0x370821, 0xac2281d4, 0x3c010001, 0x370821, 0x1000000c, 0xac2081dc,
+0x3c020001, 0x571021, 0x8c4281d4, 0x14400006, 0x3c020080, 0x3c020001,
+0x571021, 0x8c4281d8, 0x10400002, 0x3c020080, 0x822025, 0x8f420230,
+0x10400014, 0x0, 0x3c020001, 0x571021, 0x8c4281e4, 0x24420005,
+0x3c010001, 0x370821, 0xac2281e4, 0x3c020001, 0x571021, 0x8c4281e4,
+0x8f430230, 0x43102b, 0x14400006, 0x0, 0x3c010001, 0x370821,
+0xac2081e4, 0x10000006, 0x982025, 0x3c020001, 0x571021, 0x8c4281e0,
+0x54400001, 0x982025, 0x3c020001, 0x571021, 0x8c4281e8, 0x10400005,
+0x3c022000, 0x822025, 0x3c010001, 0x370821, 0xac2081e8, 0x1080ff0f,
+0x0, 0x8ec20000, 0x10400007, 0x0, 0xaf80004c, 0x8f82004c,
+0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048,
+0x1040fffd, 0x0, 0x8f820060, 0x441025, 0xaf820060, 0x8ec20000,
+0x10400003, 0x0, 0x1000fefa, 0xaf80004c, 0x1000fef8, 0xaf800048,
+0x3e00008, 0x0, 0x0, 0x0, 0x3c020001, 0x8c423388,
+0x27bdffe8, 0xafbf0014, 0x14400012, 0xafb10010, 0x3c110001, 0x26313590,
+0x2202021, 0xc002990, 0x24052000, 0x26221fe0, 0x3c010001, 0xac2234f8,
+0x3c010001, 0xac2234f4, 0xaf420250, 0x24022000, 0xaf510254, 0xaf420258,
+0x24020001, 0x3c010001, 0xac223388, 0x8fbf0014, 0x8fb10010, 0x3e00008,
+0x27bd0018, 0x3c030001, 0x8c6334f8, 0x8c820000, 0x8fa80010, 0x8fa90014,
+0xac620000, 0x3c020001, 0x8c4234f8, 0x8c830004, 0xac430004, 0xac450008,
0x8f840054, 0x2443ffe0, 0xac460010, 0xac470014, 0xac480018, 0xac49001c,
-0x3c010001, 0xac233398, 0xac44000c, 0x3c020001, 0x24423430, 0x62182b,
-0x10600005, 0x0, 0x3c020001, 0x8c423394, 0x3c010001, 0xac223398,
-0x3c030001, 0x8c633398, 0x3c020001, 0x8c423210, 0xac620000, 0x3c030001,
-0x8c633398, 0x3c020001, 0x8c423210, 0xac620004, 0x3e00008, 0xaf430250,
-0x27bdffd8, 0xafb10010, 0x808821, 0x3c030001, 0x8c633398, 0x3c020001,
-0x8c423210, 0x8fa40040, 0xafb30014, 0xa09821, 0xafbf0020, 0xafbe001c,
-0xafb50018, 0xac620000, 0x3c050001, 0x8ca53398, 0x3c020001, 0x8c423210,
-0xc0a821, 0xe0f021, 0x10800006, 0xaca20004, 0x24a50008, 0xc002974,
-0x24060018, 0x10000004, 0x0, 0x24a40008, 0xc00296c, 0x24050018,
-0x3c020001, 0x8c423398, 0x3c050001, 0x24a53430, 0x2442ffe0, 0x3c010001,
-0xac223398, 0x45102b, 0x10400005, 0x0, 0x3c020001, 0x8c423394,
-0x3c010001, 0xac223398, 0x3c030001, 0x8c633398, 0x8e220000, 0xac620000,
-0x3c030001, 0x8c633398, 0x8e220004, 0xac620004, 0xac730008, 0x8f840054,
+0x3c010001, 0xac2334f8, 0xac44000c, 0x3c020001, 0x24423590, 0x62182b,
+0x10600005, 0x0, 0x3c020001, 0x8c4234f4, 0x3c010001, 0xac2234f8,
+0x3c030001, 0x8c6334f8, 0x3c020001, 0x8c423370, 0xac620000, 0x3c030001,
+0x8c6334f8, 0x3c020001, 0x8c423370, 0xac620004, 0x3e00008, 0xaf430250,
+0x27bdffd8, 0xafb10010, 0x808821, 0x3c030001, 0x8c6334f8, 0x3c020001,
+0x8c423370, 0x8fa40040, 0xafb30014, 0xa09821, 0xafbf0020, 0xafbe001c,
+0xafb50018, 0xac620000, 0x3c050001, 0x8ca534f8, 0x3c020001, 0x8c423370,
+0xc0a821, 0xe0f021, 0x10800006, 0xaca20004, 0x24a50008, 0xc002998,
+0x24060018, 0x10000004, 0x0, 0x24a40008, 0xc002990, 0x24050018,
+0x3c020001, 0x8c4234f8, 0x3c050001, 0x24a53590, 0x2442ffe0, 0x3c010001,
+0xac2234f8, 0x45102b, 0x10400005, 0x0, 0x3c020001, 0x8c4234f4,
+0x3c010001, 0xac2234f8, 0x3c030001, 0x8c6334f8, 0x8e220000, 0xac620000,
+0x3c030001, 0x8c6334f8, 0x8e220004, 0xac620004, 0xac730008, 0x8f840054,
0xac750010, 0xac7e0014, 0x8fa80038, 0xac680018, 0x8fa8003c, 0x2462ffe0,
-0x3c010001, 0xac223398, 0x45102b, 0xac68001c, 0x10400005, 0xac64000c,
-0x3c020001, 0x8c423394, 0x3c010001, 0xac223398, 0x3c030001, 0x8c633398,
-0x3c020001, 0x8c423210, 0xac620000, 0x3c030001, 0x8c633398, 0x3c020001,
-0x8c423210, 0xac620004, 0xaf430250, 0x8fbf0020, 0x8fbe001c, 0x8fb50018,
+0x3c010001, 0xac2234f8, 0x45102b, 0xac68001c, 0x10400005, 0xac64000c,
+0x3c020001, 0x8c4234f4, 0x3c010001, 0xac2234f8, 0x3c030001, 0x8c6334f8,
+0x3c020001, 0x8c423370, 0xac620000, 0x3c030001, 0x8c6334f8, 0x3c020001,
+0x8c423370, 0xac620004, 0xaf430250, 0x8fbf0020, 0x8fbe001c, 0x8fb50018,
0x8fb30014, 0x8fb10010, 0x3e00008, 0x27bd0028, 0x10a00005, 0x0,
0xac800000, 0x24a5fffc, 0x14a0fffd, 0x24840004, 0x3e00008, 0x0,
0x10c00007, 0x0, 0x8c820000, 0x24840004, 0x24c6fffc, 0xaca20000,
@@ -4025,7 +4053,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x24020017, 0x24020006, 0xafa20010, 0x8ec2001c, 0xafa20014, 0x8ec2000c,
0x8fa40028, 0x8fa5002c, 0x3c030002, 0x431025, 0xafa20018, 0x8ec60080,
0x8ec200a4, 0x40f809, 0x0, 0x5440000b, 0x3225ffff, 0x8fa9002c,
-0xafa90010, 0x8ec20080, 0x3c040001, 0x24842cfc, 0x3c050004, 0xafa20014,
+0xafa90010, 0x8ec20080, 0x3c040001, 0x24842e5c, 0x3c050004, 0xafa20014,
0x8ec6001c, 0x100000a5, 0x34a5f004, 0x8ec20078, 0x451021, 0xaec20078,
0x8ec2001c, 0x8ee304bc, 0x8ec40074, 0x21100, 0x431021, 0xac44000c,
0x8ec30074, 0xafa30020, 0x8ec40078, 0xafa40024, 0x8ec2052c, 0x10400006,
@@ -4037,8 +4065,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x8ec202a8, 0x1821, 0x24420001, 0xaec202a8, 0x10000008,
0x8ec202a8, 0x8fa20020, 0x8fa30024, 0xacc20000, 0xacc30004, 0x24c20008,
0xaf8200f0, 0x24030001, 0x14600012, 0x131142, 0x8f8200f0, 0xafa20010,
-0x8f8200f4, 0x3c040001, 0x24842d08, 0xafa20014, 0x8fa60020, 0x8fa70024,
-0x3c050004, 0xc0028eb, 0x34a5f005, 0x8ec20180, 0x24420001, 0xaec20180,
+0x8f8200f4, 0x3c040001, 0x24842e68, 0xafa20014, 0x8fa60020, 0x8fa70024,
+0x3c050004, 0xc00290f, 0x34a5f005, 0x8ec20180, 0x24420001, 0xaec20180,
0x8ec20180, 0x10000039, 0x24020001, 0x30430003, 0x24020002, 0x10620016,
0x28620003, 0x10400005, 0x24020001, 0x10620008, 0x0, 0x10000023,
0x0, 0x24020003, 0x10620017, 0x0, 0x1000001e, 0x0,
@@ -4052,8 +4080,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x1000002f, 0xa2c20529, 0x3227ffff, 0x10e0002c, 0x0, 0x14400002,
0x24020016, 0x24020005, 0xafa20010, 0x8ec2001c, 0x8fa40028, 0x8fa5002c,
0xafa20014, 0x8ec2000c, 0xafa20018, 0x8ec60080, 0x8ec200a4, 0x40f809,
-0x0, 0x1440000d, 0x3225ffff, 0x3c040001, 0x24842d14, 0x8fa8002c,
-0x3c050004, 0xafa00014, 0xafa80010, 0x8ec6001c, 0x34a5f007, 0xc0028eb,
+0x0, 0x1440000d, 0x3225ffff, 0x3c040001, 0x24842e74, 0x8fa8002c,
+0x3c050004, 0xafa00014, 0xafa80010, 0x8ec6001c, 0x34a5f007, 0xc00290f,
0x2203821, 0x10000030, 0x0, 0x8ec20080, 0x8ec40538, 0x451021,
0xaec20080, 0x8ec20078, 0x8ec30080, 0x451021, 0x64182b, 0x14600005,
0xaec20078, 0x8ec20080, 0x8ec3053c, 0x431023, 0xaec20080, 0xa2c00529,
@@ -4086,7 +4114,7 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xafa20010, 0x8ec2001c, 0x8fa40020, 0x8fa50024, 0x3c030002, 0xc31825,
0xafa30018, 0xafa20014, 0x8ec60080, 0x8ec200a4, 0x40f809, 0x0,
0x1440000b, 0x24030001, 0x8fab0024, 0xafab0010, 0x8ec20080, 0x3c040001,
-0x24842cfc, 0x3c050004, 0xafa20014, 0x8ec60018, 0x10000037, 0x34a5f004,
+0x24842e5c, 0x3c050004, 0xafa20014, 0x8ec60018, 0x10000037, 0x34a5f004,
0x8ec40070, 0x8ec20080, 0x8ec50538, 0x2406fff8, 0xa2c30021, 0xaec0052c,
0xaec00530, 0x24840001, 0xaec40070, 0x3224ffff, 0x441021, 0x24420007,
0x461024, 0x24840007, 0xaec20074, 0x8ec20088, 0x8ec30074, 0x862024,
@@ -4094,9 +4122,9 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x431023, 0xaec20074, 0x8ec20074, 0x1000002d, 0xaec20080, 0x10e0002b,
0x0, 0x15000002, 0x24020016, 0x24020005, 0xafa20010, 0x8ec2001c,
0x8fa40020, 0x8fa50024, 0xafa60018, 0xafa20014, 0x8ec60080, 0x8ec200a4,
-0x40f809, 0x0, 0x1440000d, 0x3225ffff, 0x3c040001, 0x24842d14,
+0x40f809, 0x0, 0x1440000d, 0x3225ffff, 0x3c040001, 0x24842e74,
0x8faa0024, 0x3c050004, 0xafa00014, 0xafaa0010, 0x8ec60018, 0x34a5f007,
-0xc0028eb, 0x2203821, 0x10000030, 0x0, 0x8ec20080, 0x8ec40538,
+0xc00290f, 0x2203821, 0x10000030, 0x0, 0x8ec20080, 0x8ec40538,
0x451021, 0xaec20080, 0x8ec20088, 0x8ec30080, 0xa2c00021, 0x451023,
0x64182b, 0x14600005, 0xaec20088, 0x8ec20080, 0x8ec3053c, 0x431023,
0xaec20080, 0x8ec3001c, 0x96e20450, 0x24630001, 0x2442ffff, 0x621824,
@@ -4119,26 +4147,26 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x0, 0x96e20452, 0x8ed10018, 0x30420020, 0x1040001e, 0x24070008,
0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020019, 0xafa20010,
0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b,
-0x24020001, 0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021, 0x1040004a,
+0x24020001, 0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006, 0x1021, 0x1040004a,
0x24020001, 0x3c010001, 0x370821, 0x1000006f, 0xac2281d0, 0x8ee40498,
0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020012, 0xafa20010, 0xafb10014,
0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001,
-0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021, 0x1040004f, 0x24020001,
+0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f006, 0x1021, 0x1040004f, 0x24020001,
0x10000051, 0x0, 0x2c420002, 0x10400062, 0x24a2fffe, 0x8cc2001c,
0x96e30450, 0x8ec40024, 0x24420001, 0x2463ffff, 0x431024, 0x872021,
0xaec20018, 0xaec40024, 0x96e20452, 0x8ed10018, 0x30420020, 0x10400023,
0x24070008, 0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020019,
0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c,
-0x1440000b, 0x24020001, 0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014,
-0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021,
+0x1440000b, 0x24020001, 0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014,
+0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006, 0x1021,
0x14400006, 0x24020001, 0x24020001, 0x3c010001, 0x370821, 0x10000031,
0xac2281d8, 0x3c010001, 0x370821, 0x10000021, 0xac2281d0, 0x8ee40498,
0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020012, 0xafa20010, 0xafb10014,
0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001,
-0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228,
-0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021, 0x14400005, 0x24020001,
+0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228,
+0x3c050009, 0xc00290f, 0x34a5f006, 0x1021, 0x14400005, 0x24020001,
0x3c010001, 0x370821, 0x10000010, 0xac2281d4, 0x3c010001, 0x370821,
0xac2081d0, 0x3c010001, 0x370821, 0xac2081d8, 0x3c010001, 0x370821,
0xac2081d4, 0x8ec20264, 0xaec00024, 0xaed10028, 0x24420001, 0xaec20264,
@@ -4150,12 +4178,12 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec202c4, 0x641821, 0x306300ff, 0x10000009, 0xaec3005c, 0x8ec202bc,
0x8ec3003c, 0x441021, 0xaec202bc, 0x8ec202c4, 0x641821, 0x306301ff,
0xaec3003c, 0x441021, 0xaec202c4, 0x10000022, 0x36940040, 0x24020014,
-0x14a20014, 0x24020010, 0x3c020001, 0x8c4231d4, 0x1040000a, 0x26e50028,
+0x14a20014, 0x24020010, 0x3c020001, 0x8c423334, 0x1040000a, 0x26e50028,
0x26c40128, 0x240300ff, 0x2406ffff, 0x8ca20000, 0x24a50004, 0x2463ffff,
0xac820000, 0x1466fffb, 0x24840004, 0x8ec20240, 0xa2c00528, 0x24420001,
0xaec20240, 0x1000000c, 0x8ec20240, 0x10a2000a, 0x3c050008, 0x94c7000e,
-0x8cc2001c, 0x3c040001, 0x24842d20, 0xafa60014, 0xafa20010, 0x8cc60018,
-0xc0028eb, 0x34a50910, 0x8fbf0024, 0x8fb10020, 0x3e00008, 0x27bd0028,
+0x8cc2001c, 0x3c040001, 0x24842e80, 0xafa60014, 0xafa20010, 0x8cc60018,
+0xc00290f, 0x34a50910, 0x8fbf0024, 0x8fb10020, 0x3e00008, 0x27bd0028,
0x3e00008, 0x0, 0x27bdff80, 0xafbf0078, 0xafbe0074, 0xafb50070,
0xafb3006c, 0xafb10068, 0x8f820104, 0x8f950108, 0xafa00034, 0x12a2039b,
0xafa0003c, 0x8f820108, 0x24420020, 0xaf820108, 0x8ead0018, 0xafad0044,
@@ -4185,8 +4213,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xaecd0094, 0x8ec3009c, 0x8ec20538, 0x24650017, 0xa2102b, 0x14400003,
0x0, 0x8ec2053c, 0xa22823, 0x90a50000, 0xa3a5005f, 0x93a6005f,
0x38c30006, 0x3182b, 0x38c20011, 0x2102b, 0x621824, 0x1060000c,
-0x3c050008, 0x8fad0054, 0xafad0010, 0x8ec2009c, 0x3c040001, 0x24842d2c,
-0xafa20014, 0x8ec70094, 0xc0028eb, 0x34a5f055, 0x100000d7, 0x0,
+0x3c050008, 0x8fad0054, 0xafad0010, 0x8ec2009c, 0x3c040001, 0x24842e8c,
+0xafa20014, 0x8ec70094, 0xc00290f, 0x34a5f055, 0x100000d7, 0x0,
0x96e20452, 0x30420008, 0x1040000c, 0x2625000e, 0x8ec20538, 0xa2102b,
0x14400003, 0xf021, 0x8ec2053c, 0xa22823, 0x90a20000, 0x3042000f,
0x21080, 0x10000068, 0xafa20028, 0x8ec20094, 0x8fad0054, 0x11a20013,
@@ -4264,13 +4292,13 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x2c420002, 0x1040012f, 0x0, 0x96e20452, 0x8ed10018, 0x30420020,
0x1040001e, 0x24070008, 0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120,
0x24020019, 0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809,
-0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001, 0x24842ca0, 0xafb10010,
-0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006,
+0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001, 0x24842e00, 0xafb10010,
+0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006,
0x1021, 0x1040008f, 0x24020001, 0x3c010001, 0x370821, 0x100000b4,
0xac2281d0, 0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020012,
0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c,
-0x1440000b, 0x24020001, 0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014,
-0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021,
+0x1440000b, 0x24020001, 0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014,
+0x8ec6002c, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006, 0x1021,
0x10400094, 0x24020001, 0x10000096, 0x0, 0x15a20043, 0x24020016,
0x96a3000e, 0x8ec20078, 0x8ec40024, 0x431021, 0xaec20078, 0x8ea3001c,
0x96e20450, 0x24840001, 0xaec40024, 0x24630001, 0x2442ffff, 0x621824,
@@ -4278,8 +4306,8 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ed10018, 0x30420020, 0x1040001e, 0x24070008, 0x8ee40498, 0x8ee5049c,
0x8ec30008, 0x8f860120, 0x24020019, 0xafa20010, 0xafb10014, 0xafa30018,
0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001,
-0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
-0xc0028eb, 0x34a5f006, 0x1021, 0x1040003f, 0x24020001, 0x3c010001,
+0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
+0xc00290f, 0x34a5f006, 0x1021, 0x1040003f, 0x24020001, 0x3c010001,
0x370821, 0x10000064, 0xac2281d0, 0x8ee40498, 0x8ee5049c, 0x8ec30008,
0x8f860120, 0x24020012, 0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8,
0x40f809, 0x24c6001c, 0x1040ffb1, 0x0, 0x1000ffb9, 0x24020001,
@@ -4288,14 +4316,14 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xaec30018, 0x96e20452, 0x8ed10018, 0x30420020, 0x10400023, 0x24070008,
0x8ee40498, 0x8ee5049c, 0x8ec30008, 0x8f860120, 0x24020019, 0xafa20010,
0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b,
-0x24020001, 0x3c040001, 0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c,
-0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f006, 0x1021, 0x14400006,
+0x24020001, 0x3c040001, 0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f006, 0x1021, 0x14400006,
0x24020001, 0x24020001, 0x3c010001, 0x370821, 0x10000031, 0xac2281d8,
0x3c010001, 0x370821, 0x10000021, 0xac2281d0, 0x8ee40498, 0x8ee5049c,
0x8ec30008, 0x8f860120, 0x24020012, 0xafa20010, 0xafb10014, 0xafa30018,
0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001,
-0x24842ca0, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
-0xc0028eb, 0x34a5f006, 0x1021, 0x14400005, 0x24020001, 0x3c010001,
+0x24842e00, 0xafb10010, 0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009,
+0xc00290f, 0x34a5f006, 0x1021, 0x14400005, 0x24020001, 0x3c010001,
0x370821, 0x10000010, 0xac2281d4, 0x3c010001, 0x370821, 0xac2081d0,
0x3c010001, 0x370821, 0xac2081d8, 0x3c010001, 0x370821, 0xac2081d4,
0x8ec20264, 0xaec00024, 0xaed10028, 0x24420001, 0xaec20264, 0x8ec20264,
@@ -4307,11 +4335,11 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec202c4, 0x641821, 0x306300ff, 0x10000009, 0xaec3005c, 0x8ec202bc,
0x8ec3003c, 0x441021, 0xaec202bc, 0x8ec202c4, 0x641821, 0x306301ff,
0xaec3003c, 0x441021, 0xaec202c4, 0x1000001f, 0x36940040, 0x8fad0044,
-0x24020014, 0x15a20010, 0x24020010, 0x3c020001, 0x8c4231d4, 0x10400017,
+0x24020014, 0x15a20010, 0x24020010, 0x3c020001, 0x8c423334, 0x10400017,
0x26e50028, 0x26c40128, 0x240300ff, 0x2406ffff, 0x8ca20000, 0x24a50004,
0x2463ffff, 0xac820000, 0x1466fffb, 0x24840004, 0x1000000c, 0x0,
-0x11a2000a, 0x3c050008, 0x96a7000e, 0x8ea2001c, 0x3c040001, 0x24842d20,
-0xafb50014, 0xafa20010, 0x8ea60018, 0xc0028eb, 0x34a50910, 0x8fbf0078,
+0x11a2000a, 0x3c050008, 0x96a7000e, 0x8ea2001c, 0x3c040001, 0x24842e80,
+0xafb50014, 0xafa20010, 0x8ea60018, 0xc00290f, 0x34a50910, 0x8fbf0078,
0x8fbe0074, 0x8fb50070, 0x8fb3006c, 0x8fb10068, 0x3e00008, 0x27bd0080,
0x3e00008, 0x0, 0x803821, 0x8f8600e4, 0x8f8400e0, 0x2402fff8,
0x8cc30004, 0x822024, 0x10c4000d, 0x3c020100, 0x3c050100, 0x651024,
@@ -4338,14 +4366,14 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0xaf8800c8, 0xaf8700e4, 0xaf8700e8, 0x3e00008, 0x0, 0x27bdff70,
0xafbf0088, 0xafbe0084, 0xafb50080, 0xafb3007c, 0xafb10078, 0x92c200ed,
0xa3a0004f, 0x1040000b, 0xa3a00067, 0x8ecd00f0, 0xafad0034, 0x8ece00f4,
-0xafae002c, 0x8ecd00fc, 0x8ed500f8, 0xafad006c, 0x8ece0100, 0x100000d9,
-0xafae003c, 0x3c020001, 0x8c4233b8, 0x40f809, 0x27a40020, 0x1040026e,
+0xafae002c, 0x8ecd00fc, 0x8ed500f8, 0xafad006c, 0x8ece0100, 0x100000e9,
+0xafae003c, 0x3c020001, 0x8c423518, 0x40f809, 0x27a40020, 0x10400295,
0x0, 0x8fa30024, 0x8fb50020, 0x306dffff, 0x25adfffc, 0xafad0034,
0x92a20000, 0xafb5002c, 0x30420001, 0x10400017, 0xafa3006c, 0x8ec2011c,
0x3c03ffff, 0x431024, 0x14400012, 0x2402ffff, 0x8ea30000, 0x14620004,
0x3402ffff, 0x96a30004, 0x1062000c, 0x0, 0xc0022ad, 0x2a02021,
-0x304200ff, 0x14400007, 0x0, 0x3c020001, 0x8c4233b0, 0x40f809,
-0x0, 0x1000024e, 0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff,
+0x304200ff, 0x14400007, 0x0, 0x3c020001, 0x8c423510, 0x40f809,
+0x0, 0x10000275, 0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff,
0x431024, 0x3c03ffff, 0x432824, 0x14a00003, 0xafa20024, 0x10000053,
0x1821, 0x3c020080, 0xa21024, 0x50400007, 0x3c040040, 0x8ec202e4,
0x24420001, 0xaec202e4, 0x8ec202e4, 0x10000049, 0x24030001, 0x3c070004,
@@ -4362,1001 +4390,1008 @@ u32 tigon2FwText[(MAX_TEXT_LEN/4) + 1] = {
0x8ec20128, 0x10000006, 0x42042, 0x8ec202e0, 0x24420001, 0xaec202e0,
0x8ec202e0, 0x42042, 0x1488ffc6, 0x851824, 0x24030001, 0x8f420260,
0x8fae0034, 0x4e102b, 0x10400015, 0x306400ff, 0x8f8200e0, 0xafa20010,
-0x8f8200e4, 0x3c040001, 0x24842dfc, 0xafa20014, 0x8fa60020, 0x8fa70024,
-0x3c050006, 0xc0028eb, 0x34a5f003, 0x8ec30150, 0x8fad006c, 0x3c020100,
+0x8f8200e4, 0x3c040001, 0x24842f5c, 0xafa20014, 0x8fa60020, 0x8fa70024,
+0x3c050006, 0xc00290f, 0x34a5f003, 0x8ec30150, 0x8fad006c, 0x3c020100,
0x24040001, 0x1a26825, 0x24630001, 0xafad006c, 0xaec30150, 0x8ec20150,
0x1080000f, 0x0, 0x8f420218, 0x30420800, 0x1440000b, 0x3c020180,
0x8fae006c, 0x1c21024, 0x10400005, 0x0, 0x8ec20174, 0x24420001,
-0xaec20174, 0x8ec20174, 0x100001bd, 0x8fa30034, 0x8f420218, 0x30420400,
+0xaec20174, 0x8ec20174, 0x100001e4, 0x8fa30034, 0x8f420218, 0x30420400,
0x10400004, 0x0, 0x8fad0034, 0x25ad0004, 0xafad0034, 0x8ec20050,
-0x5040001d, 0xafa0003c, 0x8fae0034, 0x4e102b, 0x50400019, 0xafa0003c,
-0x8ec20050, 0x1c21023, 0xafa2003c, 0x8ecd0050, 0x10000013, 0xafad0034,
-0x8ec2005c, 0xafa20010, 0x8ec20060, 0x3c040001, 0x24842e08, 0xafa20014,
-0x8ec6003c, 0x8ec70044, 0x3c050006, 0xc0028eb, 0x34a5f002, 0x8ec202b4,
-0x2403ffbf, 0x283a024, 0x24420001, 0xaec202b4, 0x10000172, 0x8ec202b4,
-0x96e20460, 0x8fae0034, 0x4e102b, 0x10400004, 0x0, 0x240d0001,
-0xa3ad004f, 0x8fae0034, 0x11c00189, 0x3c02ffff, 0x8fad006c, 0x1a21024,
-0xafa20074, 0x8ec20068, 0x8f430280, 0x24420001, 0x304203ff, 0x1062015f,
-0x0, 0x93a2004f, 0x10400015, 0x0, 0x8ec3005c, 0x8ec20060,
-0x1062000a, 0x26ce0060, 0x8ec60060, 0xafae0054, 0x8ec30060, 0x21140,
-0x24424dc0, 0x2e28821, 0x24630001, 0x10000014, 0x306300ff, 0x92c20064,
-0x1440ffc9, 0x0, 0x8ec202c8, 0x24420001, 0xaec202c8, 0x8ec202c8,
-0x8ec3003c, 0x8ec20044, 0x1062ffc1, 0x26cd0044, 0x8ec60044, 0xafad0054,
-0x8ec30044, 0x21140, 0x24420dc0, 0x2e28821, 0x24630001, 0x306301ff,
-0xafa3005c, 0x96e20462, 0x30420010, 0x1040001a, 0x340e8100, 0x96a2000c,
-0x144e0017, 0x0, 0x92c200ed, 0x14400014, 0x0, 0x96a2000e,
-0xa6220016, 0x8ea20008, 0x8ea30004, 0x8fad0034, 0x8ea40000, 0x25adfffc,
-0xafad0034, 0xaea2000c, 0xaea30008, 0xaea40004, 0x9622000e, 0x8fae002c,
-0x240d0001, 0xa3ad0067, 0x25ce0004, 0x34420200, 0xafae002c, 0xa622000e,
-0x9627000a, 0x8fae0034, 0xee102b, 0x14400002, 0x30f3fff8, 0x8fb30034,
-0x8e240000, 0x8e250004, 0x8fad002c, 0x24020007, 0xae2d0018, 0xafa20010,
-0xafa60014, 0x8ec20004, 0x8fa6002c, 0xafa20018, 0x8ec200a8, 0x40f809,
-0x2603821, 0x1440001a, 0x3c050006, 0x3c040001, 0x24842e14, 0x8e220018,
-0x34a5f009, 0xafa20010, 0x8e220000, 0x8e230004, 0x2203021, 0x2603821,
-0xc0028eb, 0xafa30014, 0x93a20067, 0x104000fb, 0x0, 0x8ea20004,
-0x8ea30008, 0x8ea4000c, 0x340e8100, 0xa6ae000c, 0xaea20000, 0xaea30004,
-0xaea40008, 0x96220016, 0x100000f0, 0xa6a2000e, 0x8fad0034, 0x166d0089,
-0x0, 0x962e000a, 0xafae0044, 0x8fae003c, 0x9623000e, 0x1ae1021,
-0xa622000a, 0x34620004, 0xa622000e, 0x8fad0074, 0x11a00006, 0x307effff,
-0x34620404, 0xa622000e, 0x8fae006c, 0xe1402, 0xa6220014, 0x8ec30068,
-0x8ee40478, 0x8ee5047c, 0x24020004, 0xafa20010, 0x8ec20068, 0x2203021,
-0x24070020, 0xafa20014, 0x8ec20008, 0x31940, 0x604821, 0xafa20018,
-0x8ec200a8, 0x4021, 0xa92821, 0xa9182b, 0x882021, 0x40f809,
-0x832021, 0x54400018, 0xa2c000ed, 0x97ad0046, 0xa63e000e, 0xa62d000a,
-0x8f820100, 0xafa20010, 0x8f820104, 0x3c040001, 0x24842e20, 0x3c050006,
-0xafa20014, 0x8ec60068, 0x34a5f00b, 0xc0028eb, 0x2203821, 0x93a20067,
-0x104000b6, 0x0, 0x8ea20004, 0x8ea30008, 0x8ea4000c, 0x340e8100,
-0x10000083, 0xa6ae000c, 0x8fae005c, 0x8fad0054, 0xadae0000, 0x8ec202c4,
-0x8ec30068, 0x2442ffff, 0xaec202c4, 0x8ec202c4, 0x24630001, 0x306303ff,
-0x26c20060, 0x15a20006, 0xaec30068, 0x8ec202c0, 0x2442ffff, 0xaec202c0,
-0x10000005, 0x8ec202c0, 0x8ec202bc, 0x2442ffff, 0xaec202bc, 0x8ec202bc,
-0x8ec20048, 0x24420001, 0xaec20048, 0x8f430240, 0x43102b, 0x54400090,
-0xafa00034, 0x8ed10068, 0x8ee40490, 0x8ee50494, 0x8ec30008, 0x8f860120,
-0x24020013, 0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x24070008,
-0x40f809, 0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001, 0x24842dac,
-0xafb10010, 0xafa00014, 0x8ec60068, 0x8f470228, 0x3c050009, 0xc0028eb,
-0x34a5f008, 0x1021, 0x14400005, 0x24020001, 0x3c010001, 0x370821,
-0x1000000a, 0xac2281e0, 0x3c010001, 0x370821, 0xac2081e0, 0x8ec20268,
-0xaec00048, 0xaed1006c, 0x24420001, 0xaec20268, 0x8ec20268, 0x8ec2027c,
-0x24420001, 0xaec2027c, 0x8ec2027c, 0x10000062, 0xafa00034, 0x962d000a,
-0xafad0044, 0x9622000e, 0xa633000a, 0x8fae0074, 0x11c00006, 0x305effff,
-0x34420400, 0xa622000e, 0x8fad006c, 0xd1402, 0xa6220014, 0x8ec30068,
-0x8ee40478, 0x8ee5047c, 0x24020004, 0xafa20010, 0x8ec20068, 0x2203021,
-0x24070020, 0xafa20014, 0x8ec20008, 0x31940, 0x604821, 0xafa20018,
-0x8ec200a8, 0x4021, 0xa92821, 0xa9182b, 0x882021, 0x40f809,
-0x832021, 0x1440001f, 0x3c04001f, 0x97ae0046, 0xa63e000e, 0xa62e000a,
-0x8f820100, 0xafa20010, 0x8f820104, 0x3c040001, 0x24842e20, 0x3c050006,
-0xafa20014, 0x8ec60068, 0x34a5f00d, 0xc0028eb, 0x2203821, 0x93a20067,
-0x10400032, 0x340d8100, 0x8ea20004, 0x8ea30008, 0x8ea4000c, 0xa6ad000c,
-0xaea20000, 0xaea30004, 0xaea40008, 0x96220016, 0xa6a2000e, 0x9622000e,
-0x3042fdff, 0x10000025, 0xa622000e, 0x8ec202c4, 0x8fae002c, 0x3484ffff,
-0x1d37021, 0x2442ffff, 0xafae002c, 0xaec202c4, 0x8ec202c4, 0x8ec302bc,
-0x24020001, 0x8e202b, 0xa2c200ed, 0x2463ffff, 0xaec302bc, 0x10800004,
-0x8ec202bc, 0x8ec20540, 0x1c27023, 0xafae002c, 0x8fad0034, 0x8fae0054,
-0x1b36823, 0xafad0034, 0x8fad005c, 0xadcd0000, 0x8ec20068, 0xa3a0004f,
-0x8ec30048, 0x24420001, 0x304203ff, 0x24630001, 0xaec20068, 0xaec30048,
-0x8fae0034, 0x15c0fe9d, 0x0, 0x8fad0034, 0x11a0001f, 0x0,
-0xaecd00f0, 0x8fae002c, 0xaece00f4, 0xaed500f8, 0x93a20067, 0x10400004,
-0x0, 0x8ec200f8, 0x24420004, 0xaec200f8, 0x8fad006c, 0x8ec20068,
-0xaecd00fc, 0x8fae003c, 0xaece0100, 0x8f430280, 0x24420001, 0x304203ff,
-0x14620006, 0x0, 0x8ec202b8, 0x24420001, 0xaec202b8, 0x10000016,
-0x8ec202b8, 0x8ec202b0, 0x24420001, 0xaec202b0, 0x10000011, 0x8ec202b0,
-0x8fad006c, 0x31a4ffff, 0x2484fffc, 0x801821, 0x8ec401b8, 0x8ec501bc,
-0x3c060001, 0x8cc633b0, 0x1021, 0xa32821, 0xa3382b, 0x822021,
-0x872021, 0xaec401b8, 0xc0f809, 0xaec501bc, 0x8fbf0088, 0x8fbe0084,
-0x8fb50080, 0x8fb3007c, 0x8fb10078, 0x3e00008, 0x27bd0090, 0x3e00008,
-0x0, 0x27bdff90, 0xafbf0068, 0xafbe0064, 0xafb50060, 0xafb3005c,
-0xafb10058, 0x92c200ed, 0xafa0002c, 0x10400007, 0xa3a00037, 0x8ecf00fc,
-0x8ec800f0, 0x8ec900f4, 0x8ed500f8, 0x100000d1, 0xafaf003c, 0x3c020001,
-0x8c4233b8, 0x40f809, 0x27a40020, 0x104001ae, 0x0, 0x8fa30024,
-0x8fb50020, 0x3068ffff, 0x92a20000, 0x2508fffc, 0x2a04821, 0x30420001,
-0x1040001a, 0xafa3003c, 0x8ec2011c, 0x3c03ffff, 0x431024, 0x14400015,
-0x2402ffff, 0x8ea30000, 0x14620005, 0x2a02021, 0x96a30004, 0x3402ffff,
-0x1062000e, 0x0, 0xafa80048, 0xc0022ad, 0xafa9004c, 0x304200ff,
-0x8fa80048, 0x14400007, 0x8fa9004c, 0x3c020001, 0x8c4233b0, 0x40f809,
-0x0, 0x1000018c, 0x0, 0x8fa20024, 0x3c03ffbf, 0x3463ffff,
-0x431024, 0x3c03ffff, 0x432824, 0x14a00003, 0xafa20024, 0x10000053,
-0x1821, 0x3c020080, 0xa21024, 0x50400007, 0x3c040040, 0x8ec202e4,
-0x24420001, 0xaec202e4, 0x8ec202e4, 0x10000049, 0x24030001, 0x3c070004,
-0x3c0e0001, 0x3c0d0002, 0x3c060010, 0x3c0c0008, 0x8ec20178, 0x3c0b0020,
-0x340a8000, 0x24420001, 0xaec20178, 0x8ec20178, 0x851824, 0x10670021,
-0xe3102b, 0x14400007, 0x0, 0x106e0011, 0x0, 0x106d0015,
-0x0, 0x10000030, 0x42042, 0x10660023, 0xc3102b, 0x14400005,
-0x0, 0x106c0019, 0x0, 0x10000028, 0x42042, 0x106b0021,
-0x0, 0x10000024, 0x42042, 0x8ec2012c, 0x24420001, 0xaec2012c,
-0x8ec2012c, 0x1000001e, 0x42042, 0x8ec202d4, 0x24420001, 0xaec202d4,
-0x8ec202d4, 0x10000018, 0x42042, 0x8ec202d8, 0x24420001, 0xaec202d8,
-0x8ec202d8, 0x10000012, 0x42042, 0x8ec202dc, 0x24420001, 0xaec202dc,
-0x8ec202dc, 0x1000000c, 0x42042, 0x8ec20128, 0x24420001, 0xaec20128,
-0x8ec20128, 0x10000006, 0x42042, 0x8ec202e0, 0x24420001, 0xaec202e0,
-0x8ec202e0, 0x42042, 0x148affc6, 0x851824, 0x24030001, 0x8f420260,
-0x48102b, 0x10400019, 0x306400ff, 0x8f8200e0, 0xafa20010, 0x8f8200e4,
-0x3c040001, 0x24842dfc, 0xafa20014, 0x8fa60020, 0x8fa70024, 0x3c050006,
-0x34a5f003, 0xafa80048, 0xc0028eb, 0xafa9004c, 0x8ec30150, 0x8faf003c,
-0x3c020100, 0x24040001, 0x1e27825, 0x24630001, 0xafaf003c, 0xaec30150,
-0x8ec20150, 0x8fa9004c, 0x8fa80048, 0x10800025, 0x0, 0x8f420218,
-0x30420800, 0x14400021, 0x3c020180, 0x8faf003c, 0x1e21024, 0x104000fe,
-0x1001821, 0x8ec20174, 0x24420001, 0xaec20174, 0x8ec20174, 0x100000f8,
-0x1001821, 0x8ec2005c, 0xafa20010, 0x8ec20060, 0x3c040001, 0x24842e08,
-0xafa20014, 0x8ec6003c, 0x8ec70044, 0x3c050006, 0x34a5f002, 0xafa80048,
-0xc0028eb, 0xafa9004c, 0x8ec202b4, 0x2403ffbf, 0x283a024, 0x24420001,
-0xaec202b4, 0x8ec202b4, 0x8fa80048, 0x100000c2, 0x8fa9004c, 0x8f420218,
-0x30420400, 0x54400001, 0x25080004, 0x96e20460, 0x48102b, 0x10400003,
-0x0, 0x3c0f8000, 0xafaf002c, 0x110000d2, 0x3c02ffff, 0x8faf003c,
-0x1e21024, 0xafa20044, 0x8ec20068, 0x8f430280, 0x24420001, 0x304203ff,
-0x106200ad, 0x0, 0x8faf002c, 0x11e00014, 0x0, 0x8ec3005c,
-0x8ec20060, 0x10620009, 0x26cb0060, 0x8ec60060, 0x8ec30060, 0x21140,
-0x24424dc0, 0x2e28821, 0x24630001, 0x10000014, 0x306a00ff, 0x92c20064,
-0x1440ffc4, 0x0, 0x8ec202c8, 0x24420001, 0xaec202c8, 0x8ec202c8,
-0x8ec3003c, 0x8ec20044, 0x1062ffbc, 0x26cb0044, 0x8ec60044, 0xafa0002c,
-0x8ec30044, 0x21140, 0x24420dc0, 0x2e28821, 0x24630001, 0x306a01ff,
-0x96e20462, 0x30420010, 0x10400017, 0x0, 0x96a2000c, 0x340f8100,
-0x144f0013, 0x0, 0x92c200ed, 0x14400010, 0x0, 0x96a2000e,
-0xa6220016, 0x8ea20008, 0x8ea30004, 0x8ea40000, 0x2508fffc, 0xaea2000c,
-0xaea30008, 0xaea40004, 0x9622000e, 0x25290004, 0x240f0001, 0xa3af0037,
-0x34420200, 0xa622000e, 0x9623000a, 0x68102b, 0x14400002, 0x3073fff8,
-0x1009821, 0x92c300ed, 0x2e62003d, 0x2c630001, 0x621824, 0x1060000f,
-0x260f021, 0x9523000c, 0x24020800, 0x5462000c, 0xae290018, 0x91220017,
-0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x50600004,
-0xae290018, 0x95220010, 0x245e000e, 0xae290018, 0x92c300ed, 0x8e240000,
-0x8e250004, 0x8faf002c, 0x2402000b, 0xafa20010, 0x3182b, 0x31ec0,
-0xcf1025, 0x431025, 0xafa20014, 0x8ec20004, 0xafa20018, 0x8ec200a8,
-0x3c03821, 0x1203021, 0xafa80048, 0xafa9004c, 0xafaa0050, 0x40f809,
-0xafab0054, 0x8fa80048, 0x8fa9004c, 0x8faa0050, 0x8fab0054, 0x1440001d,
-0x3c050006, 0x3c040001, 0x24842e14, 0x8e220018, 0x34a5f009, 0xafa20010,
-0x8e220000, 0x8e230004, 0x2203021, 0x3c03821, 0xafa80048, 0xafa9004c,
-0xc0028eb, 0xafa30014, 0x93a20037, 0x8fa80048, 0x8fa9004c, 0x1040002a,
-0x340f8100, 0x8ea20004, 0x8ea30008, 0x8ea4000c, 0xa6af000c, 0xaea20000,
-0xaea30004, 0xaea40008, 0x96220016, 0x10000020, 0xa6a2000e, 0x8faf0044,
-0x11e00007, 0x0, 0x8faf003c, 0x9623000e, 0xf1402, 0x34630400,
-0xa6220014, 0xa623000e, 0x56680008, 0x1334821, 0x9622000e, 0xa628000a,
-0x4021, 0x34420004, 0xa622000e, 0x1000000c, 0xa2c000ed, 0x3c03001f,
-0x3463ffff, 0x24020001, 0x69182b, 0xa633000a, 0x10600003, 0xa2c200ed,
-0x8ec20540, 0x1224823, 0x1134023, 0xafa0002c, 0x1500ff4f, 0xad6a0000,
-0x1100001b, 0x0, 0xaec800f0, 0xaec900f4, 0xaed500f8, 0x93a20037,
-0x10400004, 0x0, 0x8ec200f8, 0x24420004, 0xaec200f8, 0x8faf003c,
-0x8ec20068, 0xaecf00fc, 0x8f430280, 0x24420001, 0x14620006, 0x0,
-0x8ec202b8, 0x24420001, 0xaec202b8, 0x10000016, 0x8ec202b8, 0x8ec202b0,
-0x24420001, 0xaec202b0, 0x10000011, 0x8ec202b0, 0x8faf003c, 0x31e4ffff,
-0x2484fffc, 0x801821, 0x8ec401b8, 0x8ec501bc, 0x3c060001, 0x8cc633b0,
-0x1021, 0xa32821, 0xa3382b, 0x822021, 0x872021, 0xaec401b8,
-0xc0f809, 0xaec501bc, 0x8fbf0068, 0x8fbe0064, 0x8fb50060, 0x8fb3005c,
-0x8fb10058, 0x3e00008, 0x27bd0070, 0x3e00008, 0x0, 0x27bdffd8,
-0xafbf0024, 0xafb10020, 0x8ec30040, 0x8ec20038, 0x1062004d, 0x0,
-0x8ec30038, 0x8ec20040, 0x623823, 0x4e20001, 0x24e70200, 0x8ec30044,
-0x8ec20040, 0x43102b, 0x14400004, 0x24020200, 0x8ec30040, 0x10000005,
-0x431823, 0x8ec20044, 0x8ec30040, 0x431023, 0x2443ffff, 0xe08821,
-0x71102a, 0x54400001, 0x608821, 0x8ec90040, 0x8ee40458, 0x8ee5045c,
-0x8ec60040, 0x113940, 0x24080002, 0xafa80010, 0x8ec80040, 0x94940,
-0x1201821, 0x1021, 0xafa80014, 0x8ec80010, 0xa32821, 0xa3482b,
-0x822021, 0x892021, 0x63140, 0xafa80018, 0x8ec200a4, 0x24c60dc0,
-0x40f809, 0x2e63021, 0x1440000e, 0x24030040, 0x8ec20040, 0xafa20010,
-0x8ec20044, 0x3c040001, 0x24842e2c, 0xafa20014, 0x8ec60038, 0x8ec7003c,
-0x3c050007, 0xc0028eb, 0x34a5f001, 0x10000010, 0x0, 0x8ec20030,
-0x24420001, 0x50430003, 0x1021, 0x8ec20030, 0x24420001, 0xaec20030,
-0x8ec20030, 0x21080, 0x571021, 0xac510cc0, 0x8ec20040, 0x511021,
-0x304201ff, 0xaec20040, 0x8ec30040, 0x8ec20038, 0x14620017, 0x0,
-0x8ec20000, 0x10400007, 0x2403fdff, 0xaf80004c, 0x8f82004c, 0x1040fffd,
-0x0, 0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd,
-0x0, 0x8f820060, 0x431024, 0xaf820060, 0x8ec20000, 0x10400003,
-0x0, 0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb10020,
-0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024,
-0xafb10020, 0x8ec30058, 0x8ec20054, 0x1062004d, 0x0, 0x8ec30054,
-0x8ec20058, 0x623823, 0x4e20001, 0x24e70100, 0x8ec30060, 0x8ec20058,
-0x43102b, 0x14400004, 0x24020100, 0x8ec30058, 0x10000005, 0x431823,
-0x8ec20060, 0x8ec30058, 0x431023, 0x2443ffff, 0xe08821, 0x71102a,
-0x54400001, 0x608821, 0x8ec90058, 0x8ee40468, 0x8ee5046c, 0x8ec60058,
-0x113940, 0x24080003, 0xafa80010, 0x8ec80058, 0x94940, 0x1201821,
-0x1021, 0xafa80014, 0x8ec80010, 0xa32821, 0xa3482b, 0x822021,
-0x892021, 0x63140, 0xafa80018, 0x8ec200a4, 0x24c64dc0, 0x40f809,
-0x2e63021, 0x1440000e, 0x24030040, 0x8ec20058, 0xafa20010, 0x8ec20060,
-0x3c040001, 0x24842e38, 0xafa20014, 0x8ec60054, 0x8ec7005c, 0x3c050007,
-0xc0028eb, 0x34a5f010, 0x10000010, 0x0, 0x8ec20030, 0x24420001,
-0x50430003, 0x1021, 0x8ec20030, 0x24420001, 0xaec20030, 0x8ec20030,
-0x21080, 0x571021, 0xac510cc0, 0x8ec20058, 0x511021, 0x304200ff,
-0xaec20058, 0x8ec30058, 0x8ec20054, 0x14620017, 0x0, 0x8ec20000,
-0x10400007, 0x2403feff, 0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0,
-0x10000005, 0x0, 0xaf800048, 0x8f820048, 0x1040fffd, 0x0,
-0x8f820060, 0x431024, 0xaf820060, 0x8ec20000, 0x10400003, 0x0,
-0x10000002, 0xaf80004c, 0xaf800048, 0x8fbf0024, 0x8fb10020, 0x3e00008,
-0x27bd0028, 0x3e00008, 0x0, 0x8f820120, 0x8ec300e8, 0x8f820124,
-0x8f860128, 0x24020040, 0x24630001, 0x50620003, 0x1021, 0x8ec200e8,
-0x24420001, 0xaec200e8, 0x8ec200e8, 0x8ec400e8, 0x8ec300e4, 0x210c0,
-0x24426fc0, 0x14830007, 0x2e22821, 0x8f820128, 0x24420020, 0xaf820128,
-0x8f820128, 0x10000011, 0xaca00000, 0x8ec200e8, 0x24030040, 0x24420001,
-0x50430003, 0x1021, 0x8ec200e8, 0x24420001, 0x220c0, 0x2e41021,
-0x8c426fc4, 0x8f830128, 0x21140, 0x621821, 0x2e41021, 0xaf830128,
-0xac406fc0, 0x8cc20018, 0x2443fffe, 0x2c620018, 0x1040000a, 0x31080,
-0x3c010001, 0x220821, 0x8c222e48, 0x400008, 0x0, 0x24020001,
-0x3c010001, 0x370821, 0xac2281e8, 0x3e00008, 0x0, 0x3e00008,
-0x0, 0x27bdffa8, 0xafbf0050, 0xafbe004c, 0xafb50048, 0xafb30044,
-0xafb10040, 0x8f830128, 0x8f820124, 0x106201e1, 0x0, 0x8f9e0128,
-0x8f820128, 0x24420020, 0xaf820128, 0x8fc40018, 0x8f820128, 0x2402000b,
-0x1482018f, 0x24020002, 0x8fc3001c, 0x97c20016, 0x3064ffff, 0xafc20014,
-0x3c028000, 0x621024, 0xafc4001c, 0xafa2002c, 0x8fab002c, 0x3c020800,
-0x11600004, 0x622824, 0x41140, 0x10000003, 0x24424dc0, 0x41140,
-0x24420dc0, 0x2e2a821, 0x96a2000e, 0x3043fffc, 0x30420400, 0x10400003,
-0xa6a3000e, 0x10000137, 0x8821, 0x10a00004, 0x8821, 0x97d10016,
-0x10000132, 0x0, 0x8eab0018, 0xafab0034, 0x9563000c, 0x96eb0462,
-0x24020800, 0x1462012b, 0xafab003c, 0x8fab0034, 0x2573000e, 0x8fab003c,
-0x31620002, 0x1040003f, 0x3c030020, 0x8ec70540, 0x263102b, 0x14400002,
-0x2604821, 0x2674823, 0x25220014, 0x43102b, 0x10400027, 0x24030005,
-0x91220000, 0x3042000f, 0x14430024, 0x1202021, 0x952a0000, 0x25290002,
-0x95280000, 0x25290002, 0x95270000, 0x25290002, 0x95260000, 0x25290002,
-0x95250000, 0x25290002, 0x95230000, 0x25290002, 0x95220000, 0x25290002,
-0x95240000, 0x25290002, 0x1485021, 0x1475021, 0x1465021, 0x1455021,
-0x1435021, 0x1425021, 0x95220000, 0x95230002, 0x1445021, 0x1425021,
-0x1435021, 0xa1c02, 0x3142ffff, 0x625021, 0xa1c02, 0x3142ffff,
-0x10000009, 0x625021, 0x1202021, 0x90850000, 0x3c060020, 0x8ec200ac,
-0x30a5000f, 0x40f809, 0x52840, 0x304affff, 0x3143ffff, 0x50600001,
-0x3403ffff, 0x96a2000e, 0x34420002, 0x10000002, 0xa6a2000e, 0x1821,
-0xa6a30010, 0x8fab003c, 0x31620001, 0x104000e1, 0x0, 0x92620009,
-0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x106000d9,
-0x3c030020, 0x8fa60034, 0x8ec70540, 0xc3102b, 0x50400001, 0xc73023,
-0x24c2000e, 0x43102b, 0x1040001a, 0xc02021, 0x94c70000, 0x24c60002,
-0x94c50000, 0x24c60002, 0x94c30000, 0x24c60002, 0x94c20000, 0x24c60002,
-0x94c40000, 0x24c60002, 0xe53821, 0xe33821, 0xe23821, 0x94c20000,
-0x94c30002, 0xe43821, 0xe23821, 0xe33821, 0x71c02, 0x30e2ffff,
-0x623821, 0x71c02, 0x30e2ffff, 0x10000006, 0x623821, 0x8ec200ac,
-0x24050007, 0x40f809, 0x3c060020, 0x3047ffff, 0x8fab003c, 0x31620008,
-0x10400003, 0x30e8ffff, 0x1000005b, 0x4821, 0x96620006, 0x30421fff,
-0x10400007, 0x2602821, 0x92620000, 0x96630002, 0x3042000f, 0x21080,
-0x10000051, 0x624823, 0x3c070020, 0x8ec30540, 0xa7102b, 0x50400001,
-0xa32823, 0x24a20014, 0x47102b, 0x10400015, 0xa02021, 0x90a20000,
-0x94a30002, 0x3042000f, 0x21080, 0x623023, 0xafa20020, 0x90a30009,
-0x24a5000c, 0x94a20000, 0x24a50002, 0x94a40000, 0x24a50002, 0xc33021,
-0xc23021, 0x94a20000, 0x94a30002, 0xc43021, 0xc23021, 0x1000002d,
-0xc33021, 0x24a50002, 0xa7102b, 0x50400001, 0xa32823, 0x94a60000,
-0x802821, 0xa7102b, 0x50400001, 0xa32823, 0x90a20000, 0x24850009,
-0x3042000f, 0x21080, 0xc23023, 0xafa20020, 0xa7102b, 0x50400001,
-0xa32823, 0x90a20000, 0x2485000c, 0xc23021, 0xa7102b, 0x50400001,
-0xa32823, 0x94a20000, 0x24a50002, 0xc23021, 0xa7102b, 0x50400001,
-0xa32823, 0x94a20000, 0x24a50002, 0xc23021, 0xa7102b, 0x50400001,
-0xa32823, 0x94a20000, 0x24a50002, 0xc23021, 0xa7102b, 0x50400001,
-0xa32823, 0x94a20000, 0xc23021, 0x61c02, 0x30c2ffff, 0x623021,
-0x61402, 0x30c3ffff, 0x431021, 0x3049ffff, 0x96a2000e, 0x30420004,
-0x10400041, 0x0, 0x8f420218, 0x30420400, 0x1040003d, 0x3c070020,
-0x97c2000e, 0x8fc30008, 0x8ec60540, 0x621821, 0x2463fffc, 0x67102b,
-0x50400001, 0x661823, 0x602821, 0x24a20004, 0x47102b, 0x5040000a,
-0xa7102b, 0x90a20000, 0x90a40001, 0x90a30002, 0x21200, 0x441021,
-0x90a40003, 0x31a00, 0x10000017, 0x431021, 0x50400001, 0xa62823,
-0x90a20000, 0x24a50001, 0x22200, 0xa7102b, 0x50400001, 0xa62823,
-0x90a20000, 0x24a50001, 0x822021, 0xa7102b, 0x50400001, 0xa62823,
-0x90a20000, 0x24a50001, 0x21200, 0x822021, 0xa7102b, 0x50400001,
-0xa62823, 0x90a20000, 0x822021, 0x41c02, 0x3082ffff, 0x622021,
-0x41402, 0x3083ffff, 0x431021, 0x3042ffff, 0x1024021, 0x81c02,
-0x3102ffff, 0x624021, 0x81c02, 0x3102ffff, 0x624021, 0x3108ffff,
-0x8fc20014, 0x488823, 0x111402, 0x2228821, 0x2298821, 0x111402,
-0x2228821, 0x3231ffff, 0x52200001, 0x3411ffff, 0x96a2000e, 0x34420001,
-0xa6a2000e, 0x96a2000e, 0x24080002, 0x30420004, 0x10400002, 0xa6b10012,
-0x24080004, 0x8ec90068, 0x8ee40478, 0x8ee5047c, 0xafa80010, 0x8ec80068,
-0x8fab002c, 0x2a03021, 0x24070020, 0x10b4025, 0xafa80014, 0x8ec80008,
-0x94940, 0x1201821, 0xafa80018, 0x8ec800a8, 0x1021, 0xa32821,
-0xa3482b, 0x822021, 0x100f809, 0x892021, 0x1440000e, 0x0,
-0x8f820120, 0xafa20010, 0x8f820128, 0x3c040001, 0x24842ea8, 0xafa20014,
-0x8fc6001c, 0x8f870124, 0x3c050008, 0xc0028eb, 0x34a50001, 0x1000005f,
-0x0, 0x8ec20068, 0x24420001, 0x304203ff, 0xaec20068, 0x8fab002c,
-0x11600006, 0x0, 0x8ec202c0, 0x2442ffff, 0xaec202c0, 0x10000005,
-0x8ec202c0, 0x8ec202bc, 0x2442ffff, 0xaec202bc, 0x8ec202bc, 0x8ec202c4,
-0x2442ffff, 0xaec202c4, 0x1000004a, 0x8ec202c4, 0x14820005, 0x24020004,
-0x8ec20048, 0x24420001, 0x10000044, 0xaec20048, 0x14820036, 0x38830011,
-0x97c2001e, 0xafc2001c, 0x8ec20048, 0x24420001, 0xaec20048, 0x8f430240,
-0x43102b, 0x14400039, 0x24070008, 0x8ed10068, 0x8ee40490, 0x8ee50494,
-0x8ec30008, 0x8f860120, 0x24020013, 0xafa20010, 0xafb10014, 0xafa30018,
-0x8ec200a8, 0x40f809, 0x24c6001c, 0x1440000b, 0x24020001, 0x3c040001,
-0x24842dac, 0xafb10010, 0xafa00014, 0x8ec60068, 0x8f470228, 0x3c050009,
-0xc0028eb, 0x34a5f008, 0x1021, 0x14400005, 0x24020001, 0x3c010001,
-0x370821, 0x1000000a, 0xac2281e0, 0x3c010001, 0x370821, 0xac2081e0,
-0x8ec20268, 0xaec00048, 0xaed1006c, 0x24420001, 0xaec20268, 0x8ec20268,
-0x8ec2027c, 0x24420001, 0xaec2027c, 0x1000000d, 0x8ec2027c, 0x2c630001,
-0x38820013, 0x2c420001, 0x621825, 0x14600004, 0x24020001, 0x24020012,
-0x14820004, 0x24020001, 0x3c010001, 0x370821, 0xac2281e8, 0x8fbf0050,
-0x8fbe004c, 0x8fb50048, 0x8fb30044, 0x8fb10040, 0x3e00008, 0x27bd0058,
-0x3e00008, 0x0, 0x0, 0x0, 0x8ec20538, 0xaf8200c0,
-0x8ec20538, 0xaf8200c4, 0x8ec20538, 0xaf8200c8, 0x8ec20534, 0xaf8200d0,
-0x8ec20534, 0xaf8200d4, 0x8ec20534, 0x3e00008, 0xaf8200d8, 0x27bdffe8,
-0x27840208, 0x27450200, 0xafbf0010, 0xc00297e, 0x24060008, 0x8f420204,
-0xc003c3a, 0xaf820210, 0x24040001, 0x8f460248, 0x24020004, 0x3c010001,
-0xac2232ac, 0xc004680, 0x24050004, 0x3c020001, 0x8c4232a8, 0x30420001,
-0x10400007, 0x24020001, 0x3c010001, 0xac2232ac, 0x24040001, 0x24050001,
-0xc004680, 0x3c06601b, 0x8ec20548, 0x8ec4054c, 0x8ec30550, 0x3c010001,
-0xac2032a4, 0x3c010001, 0xac2032bc, 0x21640, 0x42140, 0x34840403,
-0x441025, 0x31bc0, 0x431025, 0xaf82021c, 0x8fbf0010, 0x3e00008,
-0x27bd0018, 0x27bdffe0, 0x3c050008, 0x34a50400, 0xafbf0018, 0xafa00010,
-0xafa00014, 0x8f860200, 0x3c040001, 0x24842f7c, 0xc0028eb, 0x3821,
-0x8ec20368, 0x24420001, 0xaec20368, 0x8ec20368, 0x8f830200, 0x3c023f00,
-0x621824, 0x8fbf0018, 0x3c020400, 0x3e00008, 0x27bd0020, 0x27bdffd8,
-0xafbf0020, 0xafb3001c, 0xafb10018, 0x8f910220, 0x8ec202fc, 0x24420001,
-0xaec202fc, 0x8ec202fc, 0x8ec30310, 0x3c020001, 0x8c4232bc, 0x3c040001,
-0x24842f88, 0xafa20014, 0xafa30010, 0x8ec70314, 0x3c050008, 0xc0028eb,
-0x2203021, 0x3c024000, 0x2221024, 0x104000e5, 0x3c040100, 0x8ec20314,
-0x24420001, 0xaec20314, 0x8ec20314, 0x8f820220, 0x3c0308ff, 0x3463ffff,
-0x431024, 0x34420004, 0xaf820220, 0x8f8200e0, 0x8f8300c4, 0x3c02001f,
-0x3442ffff, 0x24690008, 0x49102b, 0x10400003, 0x0, 0x8ec20540,
-0x1224823, 0x8f8700c8, 0x8f850120, 0x8f840124, 0x10000005, 0x5821,
-0x8ec20534, 0x82102b, 0x50400001, 0x27644800, 0x10a40010, 0x316200ff,
-0x8c820018, 0x38430007, 0x2c630001, 0x3842000b, 0x2c420001, 0x621825,
-0x5060fff3, 0x24840020, 0x8ec20328, 0x240b0001, 0x24420001, 0xaec20328,
-0x8ec20328, 0x8c870008, 0x316200ff, 0x14400078, 0x0, 0x92c200ed,
-0x14400075, 0x0, 0x8f8500e4, 0x8f8200e0, 0x2403fff8, 0x433024,
-0xc51023, 0x218c3, 0x4620001, 0x24630100, 0x8f8a00c4, 0x10600005,
-0x24020001, 0x10620009, 0x0, 0x10000021, 0x0, 0x8ec20318,
-0x1403821, 0x24420001, 0xaec20318, 0x10000060, 0x8ec20318, 0x8ec2031c,
-0x24420001, 0xaec2031c, 0x8ca70000, 0x8ec20540, 0x8ec3031c, 0x1471823,
-0x43102b, 0x10400004, 0x2c62233f, 0x8ec20540, 0x621821, 0x2c62233f,
-0x14400051, 0x3c020100, 0xaca20004, 0x8f8200e8, 0x24420008, 0xaf8200e8,
-0x8f8200e8, 0x8f8200e4, 0x1403821, 0x24420008, 0xaf8200e4, 0x10000046,
-0x8f8200e4, 0x8ec20320, 0x24420001, 0xaec20320, 0x8ca80000, 0x8ec20540,
-0x8ec30320, 0x1092023, 0x44102b, 0x10400003, 0x0, 0x8ec20540,
-0x822021, 0x8ec20544, 0x44102b, 0x10400003, 0x3c030100, 0x10000034,
-0x1003821, 0x8ca20004, 0x431025, 0xaca20004, 0x8f8200e4, 0x24450008,
-0xaf8500e4, 0x8f8500e4, 0x10a60025, 0x3c080100, 0x8ec20174, 0x24420001,
-0xaec20174, 0x8ca20004, 0x8ec30174, 0x481024, 0x1440000e, 0x0,
-0x8ca30000, 0x8ec20540, 0x692023, 0x44102b, 0x10400003, 0x0,
-0x8ec20540, 0x822021, 0x8ec20544, 0x44102b, 0x10400006, 0x0,
-0x603821, 0x8ec20544, 0x44102b, 0x1440000a, 0x0, 0x8ca20004,
-0x481025, 0xaca20004, 0x8f8200e4, 0x24450008, 0xaf8500e4, 0x8f8500e4,
-0x14a6ffdf, 0x0, 0x14a60005, 0x0, 0x1403821, 0xaf8600e4,
-0x10000003, 0xaf8600e8, 0xaf8500e4, 0xaf8500e8, 0x8f8300c8, 0x8ec20540,
-0x692023, 0x44102b, 0x10400003, 0x0, 0x8ec20540, 0x822021,
-0x8ec20544, 0x82102b, 0x50400008, 0x5821, 0x8ec20540, 0xe92023,
+0x5040002d, 0xafa0003c, 0x8fae0034, 0x4e102b, 0x50400029, 0xafa0003c,
+0x8ec20050, 0x1c21023, 0xafa2003c, 0x8ecd0050, 0x10000023, 0xafad0034,
+0x8ec2005c, 0xafa20010, 0x8ec20060, 0x3c040001, 0x24842f68, 0xafa20014,
+0x8ec6003c, 0x8ec70044, 0x3c050006, 0xc00290f, 0x34a5f002, 0x8ec202b4,
+0x2403ffbf, 0x283a024, 0x24420001, 0xaec202b4, 0x10000199, 0x8ec202b4,
+0x8e220018, 0x8fa70034, 0x3c040001, 0x24842f74, 0xafa20010, 0x8e220000,
+0x8e230004, 0x34a5f709, 0x2203021, 0xc00290f, 0xafa30014, 0x8ec20298,
+0x24420001, 0xaec20298, 0x10000189, 0x8ec20298, 0x96e20460, 0x8fae0034,
+0x4e102b, 0x10400004, 0x0, 0x240d0001, 0xa3ad004f, 0x8fae0034,
+0x11c001a0, 0x3c02ffff, 0x8fad006c, 0x1a21024, 0xafa20074, 0x8ec20068,
+0x8f430280, 0x24420001, 0x304203ff, 0x10620176, 0x0, 0x93a2004f,
+0x10400015, 0x0, 0x8ec3005c, 0x8ec20060, 0x1062000a, 0x26ce0060,
+0x8ec60060, 0xafae0054, 0x8ec30060, 0x21140, 0x24424dc0, 0x2e28821,
+0x24630001, 0x10000014, 0x306300ff, 0x92c20064, 0x1440ffb9, 0x0,
+0x8ec202c8, 0x24420001, 0xaec202c8, 0x8ec202c8, 0x8ec3003c, 0x8ec20044,
+0x1062ffb1, 0x26cd0044, 0x8ec60044, 0xafad0054, 0x8ec30044, 0x21140,
+0x24420dc0, 0x2e28821, 0x24630001, 0x306301ff, 0xafa3005c, 0x8f83012c,
+0x10600011, 0x24040002, 0x8f820124, 0x431023, 0x21143, 0x58400001,
+0x24420040, 0x82102a, 0x1040000a, 0x1021, 0x8f820128, 0x431023,
+0x21143, 0x58400001, 0x24420040, 0x82102a, 0x14400002, 0x24020001,
+0x1021, 0x304200ff, 0x1040ffa3, 0x3c050006, 0x96e20462, 0x30420010,
+0x1040001a, 0x340e8100, 0x96a2000c, 0x144e0017, 0x0, 0x92c200ed,
+0x14400014, 0x0, 0x96a2000e, 0xa6220016, 0x8ea20008, 0x8ea30004,
+0x8fad0034, 0x8ea40000, 0x25adfffc, 0xafad0034, 0xaea2000c, 0xaea30008,
+0xaea40004, 0x9622000e, 0x8fae002c, 0x240d0001, 0xa3ad0067, 0x25ce0004,
+0x34420200, 0xafae002c, 0xa622000e, 0x9627000a, 0x8fae0034, 0xee102b,
+0x14400002, 0x30f3fff8, 0x8fb30034, 0x8e240000, 0x8e250004, 0x8fad002c,
+0x24020007, 0xae2d0018, 0xafa20010, 0xafa60014, 0x8ec20004, 0x8fa6002c,
+0xafa20018, 0x8ec200a8, 0x40f809, 0x2603821, 0x1440001a, 0x3c050006,
+0x3c040001, 0x24842f80, 0x8e220018, 0x34a5f009, 0xafa20010, 0x8e220000,
+0x8e230004, 0x2203021, 0x2603821, 0xc00290f, 0xafa30014, 0x93a20067,
+0x104000fb, 0x0, 0x8ea20004, 0x8ea30008, 0x8ea4000c, 0x340e8100,
+0xa6ae000c, 0xaea20000, 0xaea30004, 0xaea40008, 0x96220016, 0x100000f0,
+0xa6a2000e, 0x8fad0034, 0x166d0089, 0x0, 0x962e000a, 0xafae0044,
+0x8fae003c, 0x9623000e, 0x1ae1021, 0xa622000a, 0x34620004, 0xa622000e,
+0x8fad0074, 0x11a00006, 0x307effff, 0x34620404, 0xa622000e, 0x8fae006c,
+0xe1402, 0xa6220014, 0x8ec30068, 0x8ee40478, 0x8ee5047c, 0x24020004,
+0xafa20010, 0x8ec20068, 0x2203021, 0x24070020, 0xafa20014, 0x8ec20008,
+0x31940, 0x604821, 0xafa20018, 0x8ec200a8, 0x4021, 0xa92821,
+0xa9182b, 0x882021, 0x40f809, 0x832021, 0x54400018, 0xa2c000ed,
+0x97ad0046, 0xa63e000e, 0xa62d000a, 0x8f820100, 0xafa20010, 0x8f820104,
+0x3c040001, 0x24842f8c, 0x3c050006, 0xafa20014, 0x8ec60068, 0x34a5f00b,
+0xc00290f, 0x2203821, 0x93a20067, 0x104000b6, 0x0, 0x8ea20004,
+0x8ea30008, 0x8ea4000c, 0x340e8100, 0x10000083, 0xa6ae000c, 0x8fae005c,
+0x8fad0054, 0xadae0000, 0x8ec202c4, 0x8ec30068, 0x2442ffff, 0xaec202c4,
+0x8ec202c4, 0x24630001, 0x306303ff, 0x26c20060, 0x15a20006, 0xaec30068,
+0x8ec202c0, 0x2442ffff, 0xaec202c0, 0x10000005, 0x8ec202c0, 0x8ec202bc,
+0x2442ffff, 0xaec202bc, 0x8ec202bc, 0x8ec20048, 0x24420001, 0xaec20048,
+0x8f430240, 0x43102b, 0x54400090, 0xafa00034, 0x8ed10068, 0x8ee40490,
+0x8ee50494, 0x8ec30008, 0x8f860120, 0x24020013, 0xafa20010, 0xafb10014,
+0xafa30018, 0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c, 0x1440000b,
+0x24020001, 0x3c040001, 0x24842f0c, 0xafb10010, 0xafa00014, 0x8ec60068,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f008, 0x1021, 0x14400005,
+0x24020001, 0x3c010001, 0x370821, 0x1000000a, 0xac2281e0, 0x3c010001,
+0x370821, 0xac2081e0, 0x8ec20268, 0xaec00048, 0xaed1006c, 0x24420001,
+0xaec20268, 0x8ec20268, 0x8ec2027c, 0x24420001, 0xaec2027c, 0x8ec2027c,
+0x10000062, 0xafa00034, 0x962d000a, 0xafad0044, 0x9622000e, 0xa633000a,
+0x8fae0074, 0x11c00006, 0x305effff, 0x34420400, 0xa622000e, 0x8fad006c,
+0xd1402, 0xa6220014, 0x8ec30068, 0x8ee40478, 0x8ee5047c, 0x24020004,
+0xafa20010, 0x8ec20068, 0x2203021, 0x24070020, 0xafa20014, 0x8ec20008,
+0x31940, 0x604821, 0xafa20018, 0x8ec200a8, 0x4021, 0xa92821,
+0xa9182b, 0x882021, 0x40f809, 0x832021, 0x1440001f, 0x3c04001f,
+0x97ae0046, 0xa63e000e, 0xa62e000a, 0x8f820100, 0xafa20010, 0x8f820104,
+0x3c040001, 0x24842f8c, 0x3c050006, 0xafa20014, 0x8ec60068, 0x34a5f00d,
+0xc00290f, 0x2203821, 0x93a20067, 0x10400032, 0x340d8100, 0x8ea20004,
+0x8ea30008, 0x8ea4000c, 0xa6ad000c, 0xaea20000, 0xaea30004, 0xaea40008,
+0x96220016, 0xa6a2000e, 0x9622000e, 0x3042fdff, 0x10000025, 0xa622000e,
+0x8ec202c4, 0x8fae002c, 0x3484ffff, 0x1d37021, 0x2442ffff, 0xafae002c,
+0xaec202c4, 0x8ec202c4, 0x8ec302bc, 0x24020001, 0x8e202b, 0xa2c200ed,
+0x2463ffff, 0xaec302bc, 0x10800004, 0x8ec202bc, 0x8ec20540, 0x1c27023,
+0xafae002c, 0x8fad0034, 0x8fae0054, 0x1b36823, 0xafad0034, 0x8fad005c,
+0xadcd0000, 0x8ec20068, 0xa3a0004f, 0x8ec30048, 0x24420001, 0x304203ff,
+0x24630001, 0xaec20068, 0xaec30048, 0x8fae0034, 0x15c0fe86, 0x0,
+0x8fad0034, 0x11a0001f, 0x0, 0xaecd00f0, 0x8fae002c, 0xaece00f4,
+0xaed500f8, 0x93a20067, 0x10400004, 0x0, 0x8ec200f8, 0x24420004,
+0xaec200f8, 0x8fad006c, 0x8ec20068, 0xaecd00fc, 0x8fae003c, 0xaece0100,
+0x8f430280, 0x24420001, 0x304203ff, 0x14620006, 0x0, 0x8ec202b8,
+0x24420001, 0xaec202b8, 0x10000016, 0x8ec202b8, 0x8ec202b0, 0x24420001,
+0xaec202b0, 0x10000011, 0x8ec202b0, 0x8fad006c, 0x31a4ffff, 0x2484fffc,
+0x801821, 0x8ec401b8, 0x8ec501bc, 0x3c060001, 0x8cc63510, 0x1021,
+0xa32821, 0xa3382b, 0x822021, 0x872021, 0xaec401b8, 0xc0f809,
+0xaec501bc, 0x8fbf0088, 0x8fbe0084, 0x8fb50080, 0x8fb3007c, 0x8fb10078,
+0x3e00008, 0x27bd0090, 0x3e00008, 0x0, 0x27bdff90, 0xafbf0068,
+0xafbe0064, 0xafb50060, 0xafb3005c, 0xafb10058, 0x92c200ed, 0xafa0002c,
+0x10400007, 0xa3a00037, 0x8ecf00fc, 0x8ec800f0, 0x8ec900f4, 0x8ed500f8,
+0x100000d1, 0xafaf003c, 0x3c020001, 0x8c423518, 0x40f809, 0x27a40020,
+0x104001ae, 0x0, 0x8fa30024, 0x8fb50020, 0x3068ffff, 0x92a20000,
+0x2508fffc, 0x2a04821, 0x30420001, 0x1040001a, 0xafa3003c, 0x8ec2011c,
+0x3c03ffff, 0x431024, 0x14400015, 0x2402ffff, 0x8ea30000, 0x14620005,
+0x2a02021, 0x96a30004, 0x3402ffff, 0x1062000e, 0x0, 0xafa80048,
+0xc0022ad, 0xafa9004c, 0x304200ff, 0x8fa80048, 0x14400007, 0x8fa9004c,
+0x3c020001, 0x8c423510, 0x40f809, 0x0, 0x1000018c, 0x0,
+0x8fa20024, 0x3c03ffbf, 0x3463ffff, 0x431024, 0x3c03ffff, 0x432824,
+0x14a00003, 0xafa20024, 0x10000053, 0x1821, 0x3c020080, 0xa21024,
+0x50400007, 0x3c040040, 0x8ec202e4, 0x24420001, 0xaec202e4, 0x8ec202e4,
+0x10000049, 0x24030001, 0x3c070004, 0x3c0e0001, 0x3c0d0002, 0x3c060010,
+0x3c0c0008, 0x8ec20178, 0x3c0b0020, 0x340a8000, 0x24420001, 0xaec20178,
+0x8ec20178, 0x851824, 0x10670021, 0xe3102b, 0x14400007, 0x0,
+0x106e0011, 0x0, 0x106d0015, 0x0, 0x10000030, 0x42042,
+0x10660023, 0xc3102b, 0x14400005, 0x0, 0x106c0019, 0x0,
+0x10000028, 0x42042, 0x106b0021, 0x0, 0x10000024, 0x42042,
+0x8ec2012c, 0x24420001, 0xaec2012c, 0x8ec2012c, 0x1000001e, 0x42042,
+0x8ec202d4, 0x24420001, 0xaec202d4, 0x8ec202d4, 0x10000018, 0x42042,
+0x8ec202d8, 0x24420001, 0xaec202d8, 0x8ec202d8, 0x10000012, 0x42042,
+0x8ec202dc, 0x24420001, 0xaec202dc, 0x8ec202dc, 0x1000000c, 0x42042,
+0x8ec20128, 0x24420001, 0xaec20128, 0x8ec20128, 0x10000006, 0x42042,
+0x8ec202e0, 0x24420001, 0xaec202e0, 0x8ec202e0, 0x42042, 0x148affc6,
+0x851824, 0x24030001, 0x8f420260, 0x48102b, 0x10400019, 0x306400ff,
+0x8f8200e0, 0xafa20010, 0x8f8200e4, 0x3c040001, 0x24842f5c, 0xafa20014,
+0x8fa60020, 0x8fa70024, 0x3c050006, 0x34a5f003, 0xafa80048, 0xc00290f,
+0xafa9004c, 0x8ec30150, 0x8faf003c, 0x3c020100, 0x24040001, 0x1e27825,
+0x24630001, 0xafaf003c, 0xaec30150, 0x8ec20150, 0x8fa9004c, 0x8fa80048,
+0x10800025, 0x0, 0x8f420218, 0x30420800, 0x14400021, 0x3c020180,
+0x8faf003c, 0x1e21024, 0x104000fe, 0x1001821, 0x8ec20174, 0x24420001,
+0xaec20174, 0x8ec20174, 0x100000f8, 0x1001821, 0x8ec2005c, 0xafa20010,
+0x8ec20060, 0x3c040001, 0x24842f68, 0xafa20014, 0x8ec6003c, 0x8ec70044,
+0x3c050006, 0x34a5f002, 0xafa80048, 0xc00290f, 0xafa9004c, 0x8ec202b4,
+0x2403ffbf, 0x283a024, 0x24420001, 0xaec202b4, 0x8ec202b4, 0x8fa80048,
+0x100000c2, 0x8fa9004c, 0x8f420218, 0x30420400, 0x54400001, 0x25080004,
+0x96e20460, 0x48102b, 0x10400003, 0x0, 0x3c0f8000, 0xafaf002c,
+0x110000d2, 0x3c02ffff, 0x8faf003c, 0x1e21024, 0xafa20044, 0x8ec20068,
+0x8f430280, 0x24420001, 0x304203ff, 0x106200ad, 0x0, 0x8faf002c,
+0x11e00014, 0x0, 0x8ec3005c, 0x8ec20060, 0x10620009, 0x26cb0060,
+0x8ec60060, 0x8ec30060, 0x21140, 0x24424dc0, 0x2e28821, 0x24630001,
+0x10000014, 0x306a00ff, 0x92c20064, 0x1440ffc4, 0x0, 0x8ec202c8,
+0x24420001, 0xaec202c8, 0x8ec202c8, 0x8ec3003c, 0x8ec20044, 0x1062ffbc,
+0x26cb0044, 0x8ec60044, 0xafa0002c, 0x8ec30044, 0x21140, 0x24420dc0,
+0x2e28821, 0x24630001, 0x306a01ff, 0x96e20462, 0x30420010, 0x10400017,
+0x0, 0x96a2000c, 0x340f8100, 0x144f0013, 0x0, 0x92c200ed,
+0x14400010, 0x0, 0x96a2000e, 0xa6220016, 0x8ea20008, 0x8ea30004,
+0x8ea40000, 0x2508fffc, 0xaea2000c, 0xaea30008, 0xaea40004, 0x9622000e,
+0x25290004, 0x240f0001, 0xa3af0037, 0x34420200, 0xa622000e, 0x9623000a,
+0x68102b, 0x14400002, 0x3073fff8, 0x1009821, 0x92c200ed, 0x14400012,
+0x260f021, 0x9523000c, 0x24020800, 0x5462000f, 0xae290018, 0x91220017,
+0x38430006, 0x2c630001, 0x38420011, 0x2c420001, 0x621825, 0x50600007,
+0xae290018, 0x95220010, 0x2443000e, 0x73102b, 0x54400001, 0x60f021,
+0xae290018, 0x92c300ed, 0x8e240000, 0x8e250004, 0x8faf002c, 0x2402000b,
+0xafa20010, 0x3182b, 0x31ec0, 0xcf1025, 0x431025, 0xafa20014,
+0x8ec20004, 0xafa20018, 0x8ec200a8, 0x3c03821, 0x1203021, 0xafa80048,
+0xafa9004c, 0xafaa0050, 0x40f809, 0xafab0054, 0x8fa80048, 0x8fa9004c,
+0x8faa0050, 0x8fab0054, 0x1440001d, 0x3c050006, 0x3c040001, 0x24842f80,
+0x8e220018, 0x34a5f009, 0xafa20010, 0x8e220000, 0x8e230004, 0x2203021,
+0x3c03821, 0xafa80048, 0xafa9004c, 0xc00290f, 0xafa30014, 0x93a20037,
+0x8fa80048, 0x8fa9004c, 0x1040002a, 0x340f8100, 0x8ea20004, 0x8ea30008,
+0x8ea4000c, 0xa6af000c, 0xaea20000, 0xaea30004, 0xaea40008, 0x96220016,
+0x10000020, 0xa6a2000e, 0x8faf0044, 0x11e00007, 0x0, 0x8faf003c,
+0x9623000e, 0xf1402, 0x34630400, 0xa6220014, 0xa623000e, 0x56680008,
+0x1334821, 0x9622000e, 0xa628000a, 0x4021, 0x34420004, 0xa622000e,
+0x1000000c, 0xa2c000ed, 0x3c03001f, 0x3463ffff, 0x24020001, 0x69182b,
+0xa633000a, 0x10600003, 0xa2c200ed, 0x8ec20540, 0x1224823, 0x1134023,
+0xafa0002c, 0x1500ff4f, 0xad6a0000, 0x1100001b, 0x0, 0xaec800f0,
+0xaec900f4, 0xaed500f8, 0x93a20037, 0x10400004, 0x0, 0x8ec200f8,
+0x24420004, 0xaec200f8, 0x8faf003c, 0x8ec20068, 0xaecf00fc, 0x8f430280,
+0x24420001, 0x14620006, 0x0, 0x8ec202b8, 0x24420001, 0xaec202b8,
+0x10000016, 0x8ec202b8, 0x8ec202b0, 0x24420001, 0xaec202b0, 0x10000011,
+0x8ec202b0, 0x8faf003c, 0x31e4ffff, 0x2484fffc, 0x801821, 0x8ec401b8,
+0x8ec501bc, 0x3c060001, 0x8cc63510, 0x1021, 0xa32821, 0xa3382b,
+0x822021, 0x872021, 0xaec401b8, 0xc0f809, 0xaec501bc, 0x8fbf0068,
+0x8fbe0064, 0x8fb50060, 0x8fb3005c, 0x8fb10058, 0x3e00008, 0x27bd0070,
+0x3e00008, 0x0, 0x27bdffd8, 0xafbf0024, 0xafb10020, 0x8ec30040,
+0x8ec20038, 0x1062004d, 0x0, 0x8ec30038, 0x8ec20040, 0x623823,
+0x4e20001, 0x24e70200, 0x8ec30044, 0x8ec20040, 0x43102b, 0x14400004,
+0x24020200, 0x8ec30040, 0x10000005, 0x431823, 0x8ec20044, 0x8ec30040,
+0x431023, 0x2443ffff, 0xe08821, 0x71102a, 0x54400001, 0x608821,
+0x8ec90040, 0x8ee40458, 0x8ee5045c, 0x8ec60040, 0x113940, 0x24080002,
+0xafa80010, 0x8ec80040, 0x94940, 0x1201821, 0x1021, 0xafa80014,
+0x8ec80010, 0xa32821, 0xa3482b, 0x822021, 0x892021, 0x63140,
+0xafa80018, 0x8ec200a4, 0x24c60dc0, 0x40f809, 0x2e63021, 0x1440000e,
+0x24030040, 0x8ec20040, 0xafa20010, 0x8ec20044, 0x3c040001, 0x24842f98,
+0xafa20014, 0x8ec60038, 0x8ec7003c, 0x3c050007, 0xc00290f, 0x34a5f001,
+0x10000010, 0x0, 0x8ec20030, 0x24420001, 0x50430003, 0x1021,
+0x8ec20030, 0x24420001, 0xaec20030, 0x8ec20030, 0x21080, 0x571021,
+0xac510cc0, 0x8ec20040, 0x511021, 0x304201ff, 0xaec20040, 0x8ec30040,
+0x8ec20038, 0x14620017, 0x0, 0x8ec20000, 0x10400007, 0x2403fdff,
+0xaf80004c, 0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0,
+0xaf800048, 0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x431024,
+0xaf820060, 0x8ec20000, 0x10400003, 0x0, 0x10000002, 0xaf80004c,
+0xaf800048, 0x8fbf0024, 0x8fb10020, 0x3e00008, 0x27bd0028, 0x3e00008,
+0x0, 0x27bdffd8, 0xafbf0024, 0xafb10020, 0x8ec30058, 0x8ec20054,
+0x1062004d, 0x0, 0x8ec30054, 0x8ec20058, 0x623823, 0x4e20001,
+0x24e70100, 0x8ec30060, 0x8ec20058, 0x43102b, 0x14400004, 0x24020100,
+0x8ec30058, 0x10000005, 0x431823, 0x8ec20060, 0x8ec30058, 0x431023,
+0x2443ffff, 0xe08821, 0x71102a, 0x54400001, 0x608821, 0x8ec90058,
+0x8ee40468, 0x8ee5046c, 0x8ec60058, 0x113940, 0x24080003, 0xafa80010,
+0x8ec80058, 0x94940, 0x1201821, 0x1021, 0xafa80014, 0x8ec80010,
+0xa32821, 0xa3482b, 0x822021, 0x892021, 0x63140, 0xafa80018,
+0x8ec200a4, 0x24c64dc0, 0x40f809, 0x2e63021, 0x1440000e, 0x24030040,
+0x8ec20058, 0xafa20010, 0x8ec20060, 0x3c040001, 0x24842fa4, 0xafa20014,
+0x8ec60054, 0x8ec7005c, 0x3c050007, 0xc00290f, 0x34a5f010, 0x10000010,
+0x0, 0x8ec20030, 0x24420001, 0x50430003, 0x1021, 0x8ec20030,
+0x24420001, 0xaec20030, 0x8ec20030, 0x21080, 0x571021, 0xac510cc0,
+0x8ec20058, 0x511021, 0x304200ff, 0xaec20058, 0x8ec30058, 0x8ec20054,
+0x14620017, 0x0, 0x8ec20000, 0x10400007, 0x2403feff, 0xaf80004c,
+0x8f82004c, 0x1040fffd, 0x0, 0x10000005, 0x0, 0xaf800048,
+0x8f820048, 0x1040fffd, 0x0, 0x8f820060, 0x431024, 0xaf820060,
+0x8ec20000, 0x10400003, 0x0, 0x10000002, 0xaf80004c, 0xaf800048,
+0x8fbf0024, 0x8fb10020, 0x3e00008, 0x27bd0028, 0x3e00008, 0x0,
+0x8f820120, 0x8ec300e8, 0x8f820124, 0x8f860128, 0x24020040, 0x24630001,
+0x50620003, 0x1021, 0x8ec200e8, 0x24420001, 0xaec200e8, 0x8ec200e8,
+0x8ec400e8, 0x8ec300e4, 0x210c0, 0x24426fc0, 0x14830007, 0x2e22821,
+0x8f820128, 0x24420020, 0xaf820128, 0x8f820128, 0x10000011, 0xaca00000,
+0x8ec200e8, 0x24030040, 0x24420001, 0x50430003, 0x1021, 0x8ec200e8,
+0x24420001, 0x220c0, 0x2e41021, 0x8c426fc4, 0x8f830128, 0x21140,
+0x621821, 0x2e41021, 0xaf830128, 0xac406fc0, 0x8cc20018, 0x2443fffe,
+0x2c620018, 0x1040000a, 0x31080, 0x3c010001, 0x220821, 0x8c222fb0,
+0x400008, 0x0, 0x24020001, 0x3c010001, 0x370821, 0xac2281e8,
+0x3e00008, 0x0, 0x3e00008, 0x0, 0x27bdffa8, 0xafbf0050,
+0xafbe004c, 0xafb50048, 0xafb30044, 0xafb10040, 0x8f830128, 0x8f820124,
+0x106201e1, 0x0, 0x8f9e0128, 0x8f820128, 0x24420020, 0xaf820128,
+0x8fc40018, 0x8f820128, 0x2402000b, 0x1482018f, 0x24020002, 0x8fc3001c,
+0x97c20016, 0x3064ffff, 0xafc20014, 0x3c028000, 0x621024, 0xafc4001c,
+0xafa2002c, 0x8fab002c, 0x3c020800, 0x11600004, 0x622824, 0x41140,
+0x10000003, 0x24424dc0, 0x41140, 0x24420dc0, 0x2e2a821, 0x96a2000e,
+0x3043fffc, 0x30420400, 0x10400003, 0xa6a3000e, 0x10000137, 0x8821,
+0x10a00004, 0x8821, 0x97d10016, 0x10000132, 0x0, 0x8eab0018,
+0xafab0034, 0x9563000c, 0x96eb0462, 0x24020800, 0x1462012b, 0xafab003c,
+0x8fab0034, 0x2573000e, 0x8fab003c, 0x31620002, 0x1040003f, 0x3c030020,
+0x8ec70540, 0x263102b, 0x14400002, 0x2604821, 0x2674823, 0x25220014,
+0x43102b, 0x10400027, 0x24030005, 0x91220000, 0x3042000f, 0x14430024,
+0x1202021, 0x952a0000, 0x25290002, 0x95280000, 0x25290002, 0x95270000,
+0x25290002, 0x95260000, 0x25290002, 0x95250000, 0x25290002, 0x95230000,
+0x25290002, 0x95220000, 0x25290002, 0x95240000, 0x25290002, 0x1485021,
+0x1475021, 0x1465021, 0x1455021, 0x1435021, 0x1425021, 0x95220000,
+0x95230002, 0x1445021, 0x1425021, 0x1435021, 0xa1c02, 0x3142ffff,
+0x625021, 0xa1c02, 0x3142ffff, 0x10000009, 0x625021, 0x1202021,
+0x90850000, 0x3c060020, 0x8ec200ac, 0x30a5000f, 0x40f809, 0x52840,
+0x304affff, 0x3143ffff, 0x50600001, 0x3403ffff, 0x96a2000e, 0x34420002,
+0x10000002, 0xa6a2000e, 0x1821, 0xa6a30010, 0x8fab003c, 0x31620001,
+0x104000e1, 0x0, 0x92620009, 0x38430006, 0x2c630001, 0x38420011,
+0x2c420001, 0x621825, 0x106000d9, 0x3c030020, 0x8fa60034, 0x8ec70540,
+0xc3102b, 0x50400001, 0xc73023, 0x24c2000e, 0x43102b, 0x1040001a,
+0xc02021, 0x94c70000, 0x24c60002, 0x94c50000, 0x24c60002, 0x94c30000,
+0x24c60002, 0x94c20000, 0x24c60002, 0x94c40000, 0x24c60002, 0xe53821,
+0xe33821, 0xe23821, 0x94c20000, 0x94c30002, 0xe43821, 0xe23821,
+0xe33821, 0x71c02, 0x30e2ffff, 0x623821, 0x71c02, 0x30e2ffff,
+0x10000006, 0x623821, 0x8ec200ac, 0x24050007, 0x40f809, 0x3c060020,
+0x3047ffff, 0x8fab003c, 0x31620008, 0x10400003, 0x30e8ffff, 0x1000005b,
+0x4821, 0x96620006, 0x30421fff, 0x10400007, 0x2602821, 0x92620000,
+0x96630002, 0x3042000f, 0x21080, 0x10000051, 0x624823, 0x3c070020,
+0x8ec30540, 0xa7102b, 0x50400001, 0xa32823, 0x24a20014, 0x47102b,
+0x10400015, 0xa02021, 0x90a20000, 0x94a30002, 0x3042000f, 0x21080,
+0x623023, 0xafa20020, 0x90a30009, 0x24a5000c, 0x94a20000, 0x24a50002,
+0x94a40000, 0x24a50002, 0xc33021, 0xc23021, 0x94a20000, 0x94a30002,
+0xc43021, 0xc23021, 0x1000002d, 0xc33021, 0x24a50002, 0xa7102b,
+0x50400001, 0xa32823, 0x94a60000, 0x802821, 0xa7102b, 0x50400001,
+0xa32823, 0x90a20000, 0x24850009, 0x3042000f, 0x21080, 0xc23023,
+0xafa20020, 0xa7102b, 0x50400001, 0xa32823, 0x90a20000, 0x2485000c,
+0xc23021, 0xa7102b, 0x50400001, 0xa32823, 0x94a20000, 0x24a50002,
+0xc23021, 0xa7102b, 0x50400001, 0xa32823, 0x94a20000, 0x24a50002,
+0xc23021, 0xa7102b, 0x50400001, 0xa32823, 0x94a20000, 0x24a50002,
+0xc23021, 0xa7102b, 0x50400001, 0xa32823, 0x94a20000, 0xc23021,
+0x61c02, 0x30c2ffff, 0x623021, 0x61402, 0x30c3ffff, 0x431021,
+0x3049ffff, 0x96a2000e, 0x30420004, 0x10400041, 0x0, 0x8f420218,
+0x30420400, 0x1040003d, 0x3c070020, 0x97c2000e, 0x8fc30008, 0x8ec60540,
+0x621821, 0x2463fffc, 0x67102b, 0x50400001, 0x661823, 0x602821,
+0x24a20004, 0x47102b, 0x5040000a, 0xa7102b, 0x90a20000, 0x90a40001,
+0x90a30002, 0x21200, 0x441021, 0x90a40003, 0x31a00, 0x10000017,
+0x431021, 0x50400001, 0xa62823, 0x90a20000, 0x24a50001, 0x22200,
+0xa7102b, 0x50400001, 0xa62823, 0x90a20000, 0x24a50001, 0x822021,
+0xa7102b, 0x50400001, 0xa62823, 0x90a20000, 0x24a50001, 0x21200,
+0x822021, 0xa7102b, 0x50400001, 0xa62823, 0x90a20000, 0x822021,
+0x41c02, 0x3082ffff, 0x622021, 0x41402, 0x3083ffff, 0x431021,
+0x3042ffff, 0x1024021, 0x81c02, 0x3102ffff, 0x624021, 0x81c02,
+0x3102ffff, 0x624021, 0x3108ffff, 0x8fc20014, 0x488823, 0x111402,
+0x2228821, 0x2298821, 0x111402, 0x2228821, 0x3231ffff, 0x52200001,
+0x3411ffff, 0x96a2000e, 0x34420001, 0xa6a2000e, 0x96a2000e, 0x24080002,
+0x30420004, 0x10400002, 0xa6b10012, 0x24080004, 0x8ec90068, 0x8ee40478,
+0x8ee5047c, 0xafa80010, 0x8ec80068, 0x8fab002c, 0x2a03021, 0x24070020,
+0x10b4025, 0xafa80014, 0x8ec80008, 0x94940, 0x1201821, 0xafa80018,
+0x8ec800a8, 0x1021, 0xa32821, 0xa3482b, 0x822021, 0x100f809,
+0x892021, 0x1440000e, 0x0, 0x8f820120, 0xafa20010, 0x8f820128,
+0x3c040001, 0x24843010, 0xafa20014, 0x8fc6001c, 0x8f870124, 0x3c050008,
+0xc00290f, 0x34a50001, 0x1000005f, 0x0, 0x8ec20068, 0x24420001,
+0x304203ff, 0xaec20068, 0x8fab002c, 0x11600006, 0x0, 0x8ec202c0,
+0x2442ffff, 0xaec202c0, 0x10000005, 0x8ec202c0, 0x8ec202bc, 0x2442ffff,
+0xaec202bc, 0x8ec202bc, 0x8ec202c4, 0x2442ffff, 0xaec202c4, 0x1000004a,
+0x8ec202c4, 0x14820005, 0x24020004, 0x8ec20048, 0x24420001, 0x10000044,
+0xaec20048, 0x14820036, 0x38830011, 0x97c2001e, 0xafc2001c, 0x8ec20048,
+0x24420001, 0xaec20048, 0x8f430240, 0x43102b, 0x14400039, 0x24070008,
+0x8ed10068, 0x8ee40490, 0x8ee50494, 0x8ec30008, 0x8f860120, 0x24020013,
+0xafa20010, 0xafb10014, 0xafa30018, 0x8ec200a8, 0x40f809, 0x24c6001c,
+0x1440000b, 0x24020001, 0x3c040001, 0x24842f0c, 0xafb10010, 0xafa00014,
+0x8ec60068, 0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f008, 0x1021,
+0x14400005, 0x24020001, 0x3c010001, 0x370821, 0x1000000a, 0xac2281e0,
+0x3c010001, 0x370821, 0xac2081e0, 0x8ec20268, 0xaec00048, 0xaed1006c,
+0x24420001, 0xaec20268, 0x8ec20268, 0x8ec2027c, 0x24420001, 0xaec2027c,
+0x1000000d, 0x8ec2027c, 0x2c630001, 0x38820013, 0x2c420001, 0x621825,
+0x14600004, 0x24020001, 0x24020012, 0x14820004, 0x24020001, 0x3c010001,
+0x370821, 0xac2281e8, 0x8fbf0050, 0x8fbe004c, 0x8fb50048, 0x8fb30044,
+0x8fb10040, 0x3e00008, 0x27bd0058, 0x3e00008, 0x0, 0x0,
+0x0, 0x0, 0x8ec20538, 0xaf8200c0, 0x8ec20538, 0xaf8200c4,
+0x8ec20538, 0xaf8200c8, 0x8ec20534, 0xaf8200d0, 0x8ec20534, 0xaf8200d4,
+0x8ec20534, 0x3e00008, 0xaf8200d8, 0x27bdffe8, 0x27840208, 0x27450200,
+0xafbf0010, 0xc0029a2, 0x24060008, 0x8f420204, 0xc003c86, 0xaf820210,
+0x24040001, 0x8f460248, 0x24020004, 0x3c010001, 0xac22340c, 0xc0046cc,
+0x24050004, 0x3c020001, 0x8c423408, 0x30420001, 0x10400007, 0x24020001,
+0x3c010001, 0xac22340c, 0x24040001, 0x24050001, 0xc0046cc, 0x3c06601b,
+0x8ec20548, 0x8ec4054c, 0x8ec30550, 0x3c010001, 0xac203404, 0x3c010001,
+0xac20341c, 0x21640, 0x42140, 0x34840403, 0x441025, 0x31bc0,
+0x431025, 0xaf82021c, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0,
+0x3c050008, 0x34a50400, 0xafbf0018, 0xafa00010, 0xafa00014, 0x8f860200,
+0x3c040001, 0x248430dc, 0xc00290f, 0x3821, 0x8ec20368, 0x24420001,
+0xaec20368, 0x8ec20368, 0x8f830200, 0x3c023f00, 0x621824, 0x8fbf0018,
+0x3c020400, 0x3e00008, 0x27bd0020, 0x27bdffd8, 0xafbf0020, 0xafb3001c,
+0xafb10018, 0x8f910220, 0x8ec202fc, 0x24420001, 0xaec202fc, 0x8ec202fc,
+0x8ec30310, 0x3c020001, 0x8c42341c, 0x3c040001, 0x248430e8, 0xafa20014,
+0xafa30010, 0x8ec70314, 0x3c050008, 0xc00290f, 0x2203021, 0x3c024000,
+0x2221024, 0x104000e5, 0x3c040100, 0x8ec20314, 0x24420001, 0xaec20314,
+0x8ec20314, 0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420004,
+0xaf820220, 0x8f8200e0, 0x8f8300c4, 0x3c02001f, 0x3442ffff, 0x24690008,
+0x49102b, 0x10400003, 0x0, 0x8ec20540, 0x1224823, 0x8f8700c8,
+0x8f850120, 0x8f840124, 0x10000005, 0x5821, 0x8ec20534, 0x82102b,
+0x50400001, 0x27644800, 0x10a40010, 0x316200ff, 0x8c820018, 0x38430007,
+0x2c630001, 0x3842000b, 0x2c420001, 0x621825, 0x5060fff3, 0x24840020,
+0x8ec20328, 0x240b0001, 0x24420001, 0xaec20328, 0x8ec20328, 0x8c870008,
+0x316200ff, 0x14400078, 0x0, 0x92c200ed, 0x14400075, 0x0,
+0x8f8500e4, 0x8f8200e0, 0x2403fff8, 0x433024, 0xc51023, 0x218c3,
+0x4620001, 0x24630100, 0x8f8a00c4, 0x10600005, 0x24020001, 0x10620009,
+0x0, 0x10000021, 0x0, 0x8ec20318, 0x1403821, 0x24420001,
+0xaec20318, 0x10000060, 0x8ec20318, 0x8ec2031c, 0x24420001, 0xaec2031c,
+0x8ca70000, 0x8ec20540, 0x8ec3031c, 0x1471823, 0x43102b, 0x10400004,
+0x2c62233f, 0x8ec20540, 0x621821, 0x2c62233f, 0x14400051, 0x3c020100,
+0xaca20004, 0x8f8200e8, 0x24420008, 0xaf8200e8, 0x8f8200e8, 0x8f8200e4,
+0x1403821, 0x24420008, 0xaf8200e4, 0x10000046, 0x8f8200e4, 0x8ec20320,
+0x24420001, 0xaec20320, 0x8ca80000, 0x8ec20540, 0x8ec30320, 0x1092023,
0x44102b, 0x10400003, 0x0, 0x8ec20540, 0x822021, 0x8ec20544,
-0x82102b, 0x10400006, 0x316200ff, 0x1440001c, 0x3c02fdff, 0x92c200ed,
-0x14400019, 0x3c02fdff, 0xaf8700c8, 0x8f8400c8, 0x8f8300c4, 0x8ec20540,
-0x832023, 0x44102b, 0x10400003, 0x0, 0x8ec20540, 0x822021,
-0x8ec20544, 0x2c830001, 0x44102b, 0x431025, 0x10400009, 0x3c02fdff,
-0x8f820220, 0x3c0308ff, 0x3463fffb, 0x431024, 0x3c034000, 0x431025,
-0x10000075, 0xaf820220, 0x3442ffff, 0x8ec30324, 0x282a024, 0x24020001,
-0xa2c200ec, 0x24630001, 0xaec30324, 0x1000006c, 0x8ec20324, 0x2241024,
-0x10400013, 0x3c130200, 0x8ec20300, 0x24420001, 0xaec20300, 0x8ec20300,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x441025, 0xaf820220,
-0x3c020004, 0x2221024, 0x14400005, 0x3c130200, 0xc003a65, 0x0,
-0x10000057, 0x0, 0x2331024, 0x50400008, 0x3c130400, 0x8ec20304,
-0x24420001, 0xaec20304, 0xc003a65, 0x8ec20304, 0x10000019, 0x0,
-0x2331024, 0x1040001d, 0x3c020800, 0x8f830224, 0x24021402, 0x14620009,
-0x3c050008, 0x3c040001, 0x24842f94, 0xafa00010, 0xafa00014, 0x8f860224,
-0x34a5ffff, 0xc0028eb, 0x3821, 0x8ec20308, 0x24420001, 0xaec20308,
-0x8ec20308, 0x8f820220, 0x2202021, 0x34420002, 0xc004430, 0xaf820220,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x531025, 0x1000002e,
-0xaf820220, 0x2221024, 0x10400009, 0x3c050008, 0x3c040001, 0x24842f7c,
-0xafa00010, 0xafa00014, 0x8f860220, 0x34a50403, 0xc0028eb, 0x3821,
-0x3c021000, 0x2221024, 0x10400009, 0x3c050008, 0x3c040001, 0x24842f7c,
-0xafa00010, 0xafa00014, 0x8f860220, 0x34a50401, 0xc0028eb, 0x3821,
-0x3c022000, 0x2221024, 0x10400009, 0x3c050008, 0x3c040001, 0x24842f7c,
-0xafa00010, 0xafa00014, 0x8f860220, 0x34a50402, 0xc0028eb, 0x3821,
-0x6210009, 0x3c050008, 0x3c040001, 0x24842f7c, 0xafa00010, 0xafa00014,
-0x8f860220, 0x34a50404, 0xc0028eb, 0x3821, 0x8fbf0020, 0x8fb3001c,
-0x8fb10018, 0x3e00008, 0x27bd0028, 0x3e00008, 0x0, 0x3c020001,
-0x8c4232bc, 0x27bdffc0, 0xafbf0038, 0xafbe0034, 0xafb50030, 0xafb3002c,
-0x1040000f, 0xafb10028, 0x3c040001, 0x24842fa0, 0x3c050008, 0xafa00010,
-0xafa00014, 0x8f860220, 0x34a50498, 0x24020001, 0x3c010001, 0xac2032bc,
-0x3c010001, 0xac2232b0, 0xc0028eb, 0x3821, 0x3c037fff, 0x8f420268,
-0x3463ffff, 0x3c04fdff, 0x431024, 0xaf420268, 0x8ee204a8, 0x3484ffff,
-0x30420002, 0x10400091, 0x284a024, 0x3c040600, 0x8ee204a8, 0x34842000,
-0x2403fffd, 0x431024, 0xaee204a8, 0xafa40020, 0x8ec3002c, 0x240200ff,
-0x10620004, 0x27a70020, 0x8ec2002c, 0x10000002, 0x24530001, 0x9821,
-0x8f420228, 0x1662000f, 0x0, 0x3c040001, 0x24842f58, 0xafa00010,
-0xafa00014, 0x8ec6002c, 0x8f470228, 0x3c050009, 0xc0028eb, 0x34a5f00f,
-0x8ec202a0, 0x24420001, 0xaec202a0, 0x1000006d, 0x8ec202a0, 0x8ec2002c,
-0x210c0, 0x571021, 0x8ce30000, 0x8ce40004, 0xac4304c0, 0xac4404c4,
-0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001e,
-0xa821, 0x241e000c, 0x8ec8002c, 0x8ee40428, 0x8ee5042c, 0x8ec6002c,
-0x24070008, 0xafbe0010, 0xafb30014, 0x840c0, 0x1001821, 0x1021,
-0x8ec80008, 0xa32821, 0xa3482b, 0x822021, 0x892021, 0x630c0,
-0xafa80018, 0x8ec200a8, 0x24c604c0, 0x40f809, 0x2e63021, 0x54400006,
-0x24150001, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffe5, 0x0,
-0x32a200ff, 0x54400011, 0xaed3002c, 0x3c040001, 0x24842f64, 0xafa00010,
-0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x10000030, 0x34a5f010,
-0x8ec2026c, 0x24150001, 0x24420001, 0xaec2026c, 0x8ec2026c, 0x1000001f,
-0x32a200ff, 0x8f830054, 0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9,
-0x10400017, 0xa821, 0x3c1e0020, 0x24130011, 0x8ec20008, 0x8ee40488,
-0x8ee5048c, 0x8ec3002c, 0x8f860120, 0xafb30010, 0x5e1025, 0xafa30014,
-0xafa20018, 0x8ec200a8, 0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe2,
-0x0, 0x8f820054, 0x2221023, 0x2c4203e9, 0x1440ffed, 0x0,
-0x32a200ff, 0x1440000f, 0x0, 0x3c040001, 0x24842f70, 0xafa00010,
-0xafa00014, 0x8f860120, 0x8f870124, 0x3c050009, 0x34a5f011, 0xc0028eb,
-0x0, 0x8ec202d0, 0x24420001, 0xaec202d0, 0x8ec202d0, 0x8ec20250,
-0x24420001, 0xaec20250, 0x8ec20250, 0x8fbf0038, 0x8fbe0034, 0x8fb50030,
-0x8fb3002c, 0x8fb10028, 0x3e00008, 0x27bd0040, 0x3c020001, 0x8c4232bc,
-0x27bdffe0, 0x1440000d, 0xafbf0018, 0x3c040001, 0x24842fac, 0x3c050008,
-0xafa00010, 0xafa00014, 0x8f860220, 0x34a50499, 0x24020001, 0x3c010001,
-0xac2232bc, 0xc0028eb, 0x3821, 0x92c2011d, 0x10400008, 0x24040001,
-0x8f820220, 0x3c0308ff, 0x3463ffff, 0x431024, 0x34420008, 0xaf820220,
-0x24040001, 0xc004785, 0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008,
-0x27bd0020, 0x0, 0x86102b, 0x50400001, 0x872023, 0xc41023,
-0x24843, 0x125102b, 0x1040001b, 0x91040, 0x824021, 0x88102b,
-0x10400007, 0x1821, 0x94820000, 0x24840002, 0x621821, 0x88102b,
-0x1440fffb, 0x0, 0x602021, 0xc73023, 0xa91023, 0x21040,
-0xc22821, 0xc5102b, 0x10400007, 0x1821, 0x94c20000, 0x24c60002,
-0x621821, 0xc5102b, 0x1440fffb, 0x0, 0x1000000d, 0x832021,
-0x51040, 0x822821, 0x85102b, 0x10400007, 0x1821, 0x94820000,
-0x24840002, 0x621821, 0x85102b, 0x1440fffb, 0x0, 0x602021,
-0x41c02, 0x3082ffff, 0x622021, 0x41c02, 0x3082ffff, 0x622021,
-0x3e00008, 0x3082ffff, 0x3e00008, 0x0, 0x8f820220, 0x34420002,
-0xaf820220, 0x3c020001, 0x8c4254b8, 0x30424000, 0x10400054, 0x24040001,
-0x8f820200, 0x24067fff, 0x8f830200, 0x30450002, 0x2402fffd, 0x621824,
-0xaf830200, 0xaf840204, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
-0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820224,
-0x1444004d, 0x42040, 0xc4102b, 0x1040fff1, 0x0, 0x8f820200,
-0x451025, 0xaf820200, 0x8f820220, 0x34428000, 0xaf820220, 0x8f830054,
-0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002,
-0x1440fffc, 0x0, 0x8f820220, 0x3c030004, 0x431024, 0x1440000f,
-0x0, 0x8f820220, 0x3c03ffff, 0x34637fff, 0x431024, 0xaf820220,
+0x44102b, 0x10400003, 0x3c030100, 0x10000034, 0x1003821, 0x8ca20004,
+0x431025, 0xaca20004, 0x8f8200e4, 0x24450008, 0xaf8500e4, 0x8f8500e4,
+0x10a60025, 0x3c080100, 0x8ec20174, 0x24420001, 0xaec20174, 0x8ca20004,
+0x8ec30174, 0x481024, 0x1440000e, 0x0, 0x8ca30000, 0x8ec20540,
+0x692023, 0x44102b, 0x10400003, 0x0, 0x8ec20540, 0x822021,
+0x8ec20544, 0x44102b, 0x10400006, 0x0, 0x603821, 0x8ec20544,
+0x44102b, 0x1440000a, 0x0, 0x8ca20004, 0x481025, 0xaca20004,
+0x8f8200e4, 0x24450008, 0xaf8500e4, 0x8f8500e4, 0x14a6ffdf, 0x0,
+0x14a60005, 0x0, 0x1403821, 0xaf8600e4, 0x10000003, 0xaf8600e8,
+0xaf8500e4, 0xaf8500e8, 0x8f8300c8, 0x8ec20540, 0x692023, 0x44102b,
+0x10400003, 0x0, 0x8ec20540, 0x822021, 0x8ec20544, 0x82102b,
+0x50400008, 0x5821, 0x8ec20540, 0xe92023, 0x44102b, 0x10400003,
+0x0, 0x8ec20540, 0x822021, 0x8ec20544, 0x82102b, 0x10400006,
+0x316200ff, 0x1440001c, 0x3c02fdff, 0x92c200ed, 0x14400019, 0x3c02fdff,
+0xaf8700c8, 0x8f8400c8, 0x8f8300c4, 0x8ec20540, 0x832023, 0x44102b,
+0x10400003, 0x0, 0x8ec20540, 0x822021, 0x8ec20544, 0x2c830001,
+0x44102b, 0x431025, 0x10400009, 0x3c02fdff, 0x8f820220, 0x3c0308ff,
+0x3463fffb, 0x431024, 0x3c034000, 0x431025, 0x10000075, 0xaf820220,
+0x3442ffff, 0x8ec30324, 0x282a024, 0x24020001, 0xa2c200ec, 0x24630001,
+0xaec30324, 0x1000006c, 0x8ec20324, 0x2241024, 0x10400013, 0x3c130200,
+0x8ec20300, 0x24420001, 0xaec20300, 0x8ec20300, 0x8f820220, 0x3c0308ff,
+0x3463ffff, 0x431024, 0x441025, 0xaf820220, 0x3c020004, 0x2221024,
+0x14400005, 0x3c130200, 0xc003ab1, 0x0, 0x10000057, 0x0,
+0x2331024, 0x50400008, 0x3c130400, 0x8ec20304, 0x24420001, 0xaec20304,
+0xc003ab1, 0x8ec20304, 0x10000019, 0x0, 0x2331024, 0x1040001d,
+0x3c020800, 0x8f830224, 0x24021402, 0x14620009, 0x3c050008, 0x3c040001,
+0x248430f4, 0xafa00010, 0xafa00014, 0x8f860224, 0x34a5ffff, 0xc00290f,
+0x3821, 0x8ec20308, 0x24420001, 0xaec20308, 0x8ec20308, 0x8f820220,
+0x2202021, 0x34420002, 0xc00447c, 0xaf820220, 0x8f820220, 0x3c0308ff,
+0x3463ffff, 0x431024, 0x531025, 0x1000002e, 0xaf820220, 0x2221024,
+0x10400009, 0x3c050008, 0x3c040001, 0x248430dc, 0xafa00010, 0xafa00014,
+0x8f860220, 0x34a50403, 0xc00290f, 0x3821, 0x3c021000, 0x2221024,
+0x10400009, 0x3c050008, 0x3c040001, 0x248430dc, 0xafa00010, 0xafa00014,
+0x8f860220, 0x34a50401, 0xc00290f, 0x3821, 0x3c022000, 0x2221024,
+0x10400009, 0x3c050008, 0x3c040001, 0x248430dc, 0xafa00010, 0xafa00014,
+0x8f860220, 0x34a50402, 0xc00290f, 0x3821, 0x6210009, 0x3c050008,
+0x3c040001, 0x248430dc, 0xafa00010, 0xafa00014, 0x8f860220, 0x34a50404,
+0xc00290f, 0x3821, 0x8fbf0020, 0x8fb3001c, 0x8fb10018, 0x3e00008,
+0x27bd0028, 0x3e00008, 0x0, 0x3c020001, 0x8c42341c, 0x27bdffc0,
+0xafbf0038, 0xafbe0034, 0xafb50030, 0xafb3002c, 0x1040000f, 0xafb10028,
+0x3c040001, 0x24843100, 0x3c050008, 0xafa00010, 0xafa00014, 0x8f860220,
+0x34a50498, 0x24020001, 0x3c010001, 0xac20341c, 0x3c010001, 0xac223410,
+0xc00290f, 0x3821, 0x3c037fff, 0x8f420268, 0x3463ffff, 0x3c04fdff,
+0x431024, 0xaf420268, 0x8ee204a8, 0x3484ffff, 0x30420002, 0x10400091,
+0x284a024, 0x3c040600, 0x8ee204a8, 0x34842000, 0x2403fffd, 0x431024,
+0xaee204a8, 0xafa40020, 0x8ec3002c, 0x240200ff, 0x10620004, 0x27a70020,
+0x8ec2002c, 0x10000002, 0x24530001, 0x9821, 0x8f420228, 0x1662000f,
+0x0, 0x3c040001, 0x248430b8, 0xafa00010, 0xafa00014, 0x8ec6002c,
+0x8f470228, 0x3c050009, 0xc00290f, 0x34a5f00f, 0x8ec202a0, 0x24420001,
+0xaec202a0, 0x1000006d, 0x8ec202a0, 0x8ec2002c, 0x210c0, 0x571021,
+0x8ce30000, 0x8ce40004, 0xac4304c0, 0xac4404c4, 0x8f830054, 0x8f820054,
+0x247103e8, 0x2221023, 0x2c4203e9, 0x1040001e, 0xa821, 0x241e000c,
+0x8ec8002c, 0x8ee40428, 0x8ee5042c, 0x8ec6002c, 0x24070008, 0xafbe0010,
+0xafb30014, 0x840c0, 0x1001821, 0x1021, 0x8ec80008, 0xa32821,
+0xa3482b, 0x822021, 0x892021, 0x630c0, 0xafa80018, 0x8ec200a8,
+0x24c604c0, 0x40f809, 0x2e63021, 0x54400006, 0x24150001, 0x8f820054,
+0x2221023, 0x2c4203e9, 0x1440ffe5, 0x0, 0x32a200ff, 0x54400011,
+0xaed3002c, 0x3c040001, 0x248430c4, 0xafa00010, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0x10000030, 0x34a5f010, 0x8ec2026c, 0x24150001,
+0x24420001, 0xaec2026c, 0x8ec2026c, 0x1000001f, 0x32a200ff, 0x8f830054,
+0x8f820054, 0x247103e8, 0x2221023, 0x2c4203e9, 0x10400017, 0xa821,
+0x3c1e0020, 0x24130011, 0x8ec20008, 0x8ee40488, 0x8ee5048c, 0x8ec3002c,
+0x8f860120, 0xafb30010, 0x5e1025, 0xafa30014, 0xafa20018, 0x8ec200a8,
+0x24070008, 0x40f809, 0x24c6001c, 0x1440ffe2, 0x0, 0x8f820054,
+0x2221023, 0x2c4203e9, 0x1440ffed, 0x0, 0x32a200ff, 0x1440000f,
+0x0, 0x3c040001, 0x248430d0, 0xafa00010, 0xafa00014, 0x8f860120,
+0x8f870124, 0x3c050009, 0x34a5f011, 0xc00290f, 0x0, 0x8ec202d0,
+0x24420001, 0xaec202d0, 0x8ec202d0, 0x8ec20250, 0x24420001, 0xaec20250,
+0x8ec20250, 0x8fbf0038, 0x8fbe0034, 0x8fb50030, 0x8fb3002c, 0x8fb10028,
+0x3e00008, 0x27bd0040, 0x3c020001, 0x8c42341c, 0x27bdffe0, 0x1440000d,
+0xafbf0018, 0x3c040001, 0x2484310c, 0x3c050008, 0xafa00010, 0xafa00014,
+0x8f860220, 0x34a50499, 0x24020001, 0x3c010001, 0xac22341c, 0xc00290f,
+0x3821, 0x92c2011d, 0x10400008, 0x24040001, 0x8f820220, 0x3c0308ff,
+0x3463ffff, 0x431024, 0x34420008, 0xaf820220, 0x24040001, 0xc0047d1,
+0x24050004, 0xaf420268, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0,
+0x86102b, 0x50400001, 0x872023, 0xc41023, 0x24843, 0x125102b,
+0x1040001b, 0x91040, 0x824021, 0x88102b, 0x10400007, 0x1821,
+0x94820000, 0x24840002, 0x621821, 0x88102b, 0x1440fffb, 0x0,
+0x602021, 0xc73023, 0xa91023, 0x21040, 0xc22821, 0xc5102b,
+0x10400007, 0x1821, 0x94c20000, 0x24c60002, 0x621821, 0xc5102b,
+0x1440fffb, 0x0, 0x1000000d, 0x832021, 0x51040, 0x822821,
+0x85102b, 0x10400007, 0x1821, 0x94820000, 0x24840002, 0x621821,
+0x85102b, 0x1440fffb, 0x0, 0x602021, 0x41c02, 0x3082ffff,
+0x622021, 0x41c02, 0x3082ffff, 0x622021, 0x3e00008, 0x3082ffff,
+0x3e00008, 0x0, 0x8f820220, 0x34420002, 0xaf820220, 0x3c020001,
+0x8c425618, 0x30424000, 0x10400054, 0x24040001, 0x8f820200, 0x24067fff,
+0x8f830200, 0x30450002, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204,
0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x8f820220, 0x3c030004, 0x431024,
-0x1440000d, 0x0, 0x8f820220, 0x34428000, 0xaf820220, 0x8f830054,
-0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002,
-0x1440fffc, 0x0, 0x8f820220, 0x3c030004, 0x431024, 0x1040001b,
-0x1021, 0x8f830220, 0x24020001, 0x10000015, 0x3c04f700, 0x8f820220,
-0x3c04f700, 0x441025, 0xaf820220, 0x8f820220, 0x2403fffd, 0x431024,
-0xaf820220, 0x8f820220, 0x3c030300, 0x431024, 0x14400003, 0x0,
-0x10000008, 0x1021, 0x8f820220, 0x34420002, 0xaf820220, 0x8f830220,
-0x24020001, 0x641825, 0xaf830220, 0x3e00008, 0x0, 0x2021,
-0x3c050100, 0x24020001, 0xaf80021c, 0xaf820200, 0xaf820220, 0x27625000,
-0xaf8200c0, 0x27625000, 0xaf8200c4, 0x27625000, 0xaf8200c8, 0x27625000,
-0xaf8200d0, 0x27625000, 0xaf8200d4, 0x27625000, 0xaf8200d8, 0x27623000,
-0xaf8200e0, 0x27623000, 0xaf8200e4, 0x27623000, 0xaf8200e8, 0x27622800,
-0xaf8200f0, 0x27622800, 0xaf8200f4, 0x27622800, 0xaf8200f8, 0x418c0,
-0x24840001, 0x3631021, 0xac453004, 0x3631021, 0xac403000, 0x28820200,
-0x1440fff9, 0x418c0, 0x2021, 0x418c0, 0x24840001, 0x3631021,
-0xac402804, 0x3631021, 0xac402800, 0x28820100, 0x1440fff9, 0x418c0,
-0xaf80023c, 0x24030080, 0x24040100, 0xac600000, 0x24630004, 0x64102b,
-0x5440fffd, 0xac600000, 0x8f830040, 0x3c02f000, 0x621824, 0x3c025000,
-0x1062000c, 0x43102b, 0x14400006, 0x3c026000, 0x3c024000, 0x10620008,
-0x24020800, 0x10000008, 0x0, 0x10620004, 0x24020800, 0x10000004,
-0x0, 0x24020700, 0x3c010001, 0xac2232c0, 0x3e00008, 0x0,
-0x27bdffc8, 0xafbf0034, 0xafb50030, 0xafb3002c, 0xafb10028, 0x3c010001,
-0xc00440d, 0xac2032a8, 0x24040001, 0x2821, 0x27a60020, 0x34028000,
-0xc00402a, 0xa7a20020, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064,
-0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050001,
-0xc003fe8, 0x27a60020, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064,
-0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050001,
-0xc003fe8, 0x27a60020, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064,
-0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050002,
-0xc003fe8, 0x27a60018, 0x8f830054, 0x8f820054, 0x10000002, 0x24630064,
-0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x24040001, 0x24050003,
-0xc003fe8, 0x27a6001a, 0x97a20020, 0x10400024, 0x24020001, 0x3c020001,
-0x8c4232a8, 0x97a30018, 0x34420001, 0x3c010001, 0xac2232a8, 0x24020015,
-0x14620004, 0x3402f423, 0x97a3001a, 0x10620018, 0x24020003, 0x97a30018,
-0x24027810, 0x14620014, 0x24020002, 0x97a3001a, 0x24020001, 0x14620010,
-0x24020002, 0x1000000e, 0x24020004, 0x3c020001, 0x8c4232a8, 0x34420008,
-0x3c010001, 0xac2232a8, 0x10000058, 0x24020004, 0x3c020001, 0x8c4232a8,
-0x34420004, 0x3c010001, 0x100000a8, 0xac2232a8, 0x3c010001, 0xac2233dc,
-0x24020e00, 0xaf820238, 0x8f840054, 0x8f820054, 0x24030008, 0x3c010001,
-0xac2332ac, 0x10000002, 0x248401f4, 0x8f820054, 0x821023, 0x2c4201f5,
-0x1440fffc, 0x3c0200c8, 0x344201fb, 0xaf820238, 0x8f830054, 0x8f820054,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820224, 0x1444004d, 0x42040,
+0xc4102b, 0x1040fff1, 0x0, 0x8f820200, 0x451025, 0xaf820200,
+0x8f820220, 0x34428000, 0xaf820220, 0x8f830054, 0x8f820054, 0x10000002,
+0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0,
+0x8f820220, 0x3c030004, 0x431024, 0x1440000f, 0x0, 0x8f820220,
+0x3c03ffff, 0x34637fff, 0x431024, 0xaf820220, 0x8f830054, 0x8f820054,
+0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
+0x0, 0x8f820220, 0x3c030004, 0x431024, 0x1440000d, 0x0,
+0x8f820220, 0x34428000, 0xaf820220, 0x8f830054, 0x8f820054, 0x10000002,
+0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0,
+0x8f820220, 0x3c030004, 0x431024, 0x1040001b, 0x1021, 0x8f830220,
+0x24020001, 0x10000015, 0x3c04f700, 0x8f820220, 0x3c04f700, 0x441025,
+0xaf820220, 0x8f820220, 0x2403fffd, 0x431024, 0xaf820220, 0x8f820220,
+0x3c030300, 0x431024, 0x14400003, 0x0, 0x10000008, 0x1021,
+0x8f820220, 0x34420002, 0xaf820220, 0x8f830220, 0x24020001, 0x641825,
+0xaf830220, 0x3e00008, 0x0, 0x2021, 0x3c050100, 0x24020001,
+0xaf80021c, 0xaf820200, 0xaf820220, 0x27625000, 0xaf8200c0, 0x27625000,
+0xaf8200c4, 0x27625000, 0xaf8200c8, 0x27625000, 0xaf8200d0, 0x27625000,
+0xaf8200d4, 0x27625000, 0xaf8200d8, 0x27623000, 0xaf8200e0, 0x27623000,
+0xaf8200e4, 0x27623000, 0xaf8200e8, 0x27622800, 0xaf8200f0, 0x27622800,
+0xaf8200f4, 0x27622800, 0xaf8200f8, 0x418c0, 0x24840001, 0x3631021,
+0xac453004, 0x3631021, 0xac403000, 0x28820200, 0x1440fff9, 0x418c0,
+0x2021, 0x418c0, 0x24840001, 0x3631021, 0xac402804, 0x3631021,
+0xac402800, 0x28820100, 0x1440fff9, 0x418c0, 0xaf80023c, 0x24030080,
+0x24040100, 0xac600000, 0x24630004, 0x64102b, 0x5440fffd, 0xac600000,
+0x8f830040, 0x3c02f000, 0x621824, 0x3c025000, 0x1062000c, 0x43102b,
+0x14400006, 0x3c026000, 0x3c024000, 0x10620008, 0x24020800, 0x10000008,
+0x0, 0x10620004, 0x24020800, 0x10000004, 0x0, 0x24020700,
+0x3c010001, 0xac223420, 0x3e00008, 0x0, 0x27bdffc8, 0xafbf0034,
+0xafb50030, 0xafb3002c, 0xafb10028, 0x3c010001, 0xc004459, 0xac203408,
+0x24040001, 0x2821, 0x27a60020, 0x34028000, 0xc004076, 0xa7a20020,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023,
+0x2c420065, 0x1440fffc, 0x24040001, 0x24050001, 0xc004034, 0x27a60020,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023,
+0x2c420065, 0x1440fffc, 0x24040001, 0x24050001, 0xc004034, 0x27a60020,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023,
+0x2c420065, 0x1440fffc, 0x24040001, 0x24050002, 0xc004034, 0x27a60018,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023,
+0x2c420065, 0x1440fffc, 0x24040001, 0x24050003, 0xc004034, 0x27a6001a,
+0x97a20020, 0x10400024, 0x24020001, 0x3c020001, 0x8c423408, 0x97a30018,
+0x34420001, 0x3c010001, 0xac223408, 0x24020015, 0x14620004, 0x3402f423,
+0x97a3001a, 0x10620018, 0x24020003, 0x97a30018, 0x24027810, 0x14620014,
+0x24020002, 0x97a3001a, 0x24020001, 0x14620010, 0x24020002, 0x1000000e,
+0x24020004, 0x3c020001, 0x8c423408, 0x34420008, 0x3c010001, 0xac223408,
+0x10000058, 0x24020004, 0x3c020001, 0x8c423408, 0x34420004, 0x3c010001,
+0x100000a8, 0xac223408, 0x3c010001, 0xac22353c, 0x24020e00, 0xaf820238,
+0x8f840054, 0x8f820054, 0x24030008, 0x3c010001, 0xac23340c, 0x10000002,
+0x248401f4, 0x8f820054, 0x821023, 0x2c4201f5, 0x1440fffc, 0x3c0200c8,
+0x344201fb, 0xaf820238, 0x8f830054, 0x8f820054, 0x10000002, 0x246301f4,
+0x8f820054, 0x621023, 0x2c4201f5, 0x1440fffc, 0x8821, 0x3c1300c8,
+0x367301f6, 0x2415fffd, 0xc003f77, 0x0, 0x8f830054, 0x8f820054,
0x10000002, 0x246301f4, 0x8f820054, 0x621023, 0x2c4201f5, 0x1440fffc,
-0x8821, 0x3c1300c8, 0x367301f6, 0x2415fffd, 0xc003f2b, 0x0,
-0x8f830054, 0x8f820054, 0x10000002, 0x246301f4, 0x8f820054, 0x621023,
-0x2c4201f5, 0x1440fffc, 0x0, 0xaf930238, 0x8f830054, 0x8f820054,
-0x10000002, 0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc,
-0x0, 0x8f820220, 0x34420002, 0xaf820220, 0x8f820200, 0x24040001,
-0x24057fff, 0x551024, 0xaf820200, 0xaf840204, 0x8f830054, 0x8f820054,
+0x0, 0xaf930238, 0x8f830054, 0x8f820054, 0x10000002, 0x2463000a,
+0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, 0x0, 0x8f820220,
+0x34420002, 0xaf820220, 0x8f820200, 0x24040001, 0x24057fff, 0x551024,
+0xaf820200, 0xaf840204, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820224,
+0x14440005, 0x34028000, 0x42040, 0xa4102b, 0x1040fff0, 0x34028000,
+0x1082ffa6, 0x26310001, 0x2e220014, 0x1440ffce, 0x24020004, 0x3c010001,
+0xac22340c, 0x8821, 0x3c13ffff, 0x36733f7f, 0xc003f77, 0x0,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x531024, 0x34425080,
+0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x2463000a, 0x8f820054,
+0x621023, 0x2c42000b, 0x1440fffc, 0x0, 0x8f820044, 0x531024,
+0x3442f080, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x2463000a,
+0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, 0x0, 0x8f820220,
+0x3c03f700, 0x431025, 0xaf820220, 0x8f830054, 0x8f820054, 0x10000002,
+0x24630064, 0x8f820054, 0x621023, 0x2c420065, 0x1440fffc, 0x0,
+0x8f820220, 0x24040001, 0x34420002, 0xaf820220, 0x8f830200, 0x24057fff,
+0x2402fffd, 0x621824, 0xaf830200, 0xaf840204, 0x8f830054, 0x8f820054,
0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
0x0, 0x8f820224, 0x14440005, 0x34028000, 0x42040, 0xa4102b,
-0x1040fff0, 0x34028000, 0x1082ffa6, 0x26310001, 0x2e220014, 0x1440ffce,
-0x24020004, 0x3c010001, 0xac2232ac, 0x8821, 0x3c13ffff, 0x36733f7f,
-0xc003f2b, 0x0, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
-0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044,
-0x531024, 0x34425080, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002,
-0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc, 0x0,
-0x8f820044, 0x531024, 0x3442f080, 0xaf820044, 0x8f830054, 0x8f820054,
-0x10000002, 0x2463000a, 0x8f820054, 0x621023, 0x2c42000b, 0x1440fffc,
-0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0x8f830054,
-0x8f820054, 0x10000002, 0x24630064, 0x8f820054, 0x621023, 0x2c420065,
-0x1440fffc, 0x0, 0x8f820220, 0x24040001, 0x34420002, 0xaf820220,
-0x8f830200, 0x24057fff, 0x2402fffd, 0x621824, 0xaf830200, 0xaf840204,
-0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x8f820224, 0x14440005, 0x34028000,
-0x42040, 0xa4102b, 0x1040fff0, 0x34028000, 0x1082ff57, 0x26310001,
-0x2e220064, 0x1440ffb0, 0x0, 0x3c020001, 0x8c4232a8, 0x30420004,
-0x14400007, 0x3c08fff0, 0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024,
-0xaf820044, 0x3c08fff0, 0x3508bdc0, 0x8f830054, 0x97a60018, 0x3c070001,
-0x8ce733dc, 0x3c040001, 0x24843080, 0x24020001, 0x3c010001, 0xac2232b0,
-0xafa60010, 0x3c060001, 0x8cc632a8, 0x97a2001a, 0x3c05000d, 0x34a50100,
-0x3c010001, 0xac2032ac, 0x681821, 0x3c010001, 0xac2333d4, 0xc0028eb,
-0xafa20014, 0x8fbf0034, 0x8fb50030, 0x8fb3002c, 0x8fb10028, 0x3e00008,
-0x27bd0038, 0x27bdffe8, 0x24070004, 0x3c040001, 0x8c8432ac, 0x3021,
-0x24020001, 0x1482000a, 0xafbf0010, 0x3c020001, 0x8c4254bc, 0x3c050004,
-0x30428000, 0x1040000c, 0x34a593e0, 0x3c05000f, 0x10000009, 0x34a54240,
-0x3c020001, 0x8c4254bc, 0x3c05000f, 0x30428000, 0x10400003, 0x34a54240,
-0x3c05001e, 0x34a58480, 0x3c020001, 0x8c4233d4, 0x8f830054, 0x451021,
-0x431023, 0x45102b, 0x1440002e, 0x0, 0x3c020001, 0x8c4232b4,
-0x1440002a, 0x2cc20001, 0x7182b, 0x431024, 0x1040001d, 0x0,
-0x3c090001, 0x8d2932a8, 0x240b0001, 0x3c054000, 0x3c080001, 0x250854bc,
-0x250afffc, 0x42042, 0x14800002, 0x24e7ffff, 0x24040008, 0x891024,
-0x5040000b, 0x2cc20001, 0x148b0004, 0x0, 0x8d020000, 0x10000003,
-0x451024, 0x8d420000, 0x451024, 0x54400001, 0x24060001, 0x2cc20001,
-0x7182b, 0x431024, 0x5440ffed, 0x42042, 0x3c010001, 0x10c00020,
-0xac2432ac, 0x8f830054, 0x24020001, 0x3c010001, 0xac2232b0, 0x3c010001,
-0xac2333d4, 0x3c020001, 0x8c4232b0, 0x10400004, 0x24020001, 0x3c010001,
-0xac2032b0, 0xaee279c8, 0x8ee379c8, 0x24020008, 0x10620005, 0x24020001,
-0xc003dd7, 0x0, 0x1000000b, 0x0, 0x3c030001, 0x8c6332ac,
-0x10620007, 0x2402000e, 0x3c030001, 0x8c635430, 0x10620003, 0x0,
-0xc004430, 0x8f840220, 0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0,
-0x3c03fdff, 0x3c040001, 0x8c8432ac, 0x3c020001, 0x8c4232c4, 0x3463ffff,
-0x283a024, 0x14820006, 0xafbf0018, 0x8ee379c8, 0x3c020001, 0x8c4232c8,
-0x10620006, 0x0, 0x8ee279c8, 0x3c010001, 0xac2432c4, 0x3c010001,
-0xac2232c8, 0x3c030001, 0x8c6332ac, 0x24020002, 0x10620139, 0x2c620003,
-0x10400005, 0x24020001, 0x1062000a, 0x0, 0x10000131, 0x0,
-0x24020004, 0x10620070, 0x24020008, 0x106200ac, 0x24020001, 0x1000012a,
-0x0, 0x8ee279c8, 0x2443ffff, 0x2c620008, 0x10400127, 0x31080,
-0x3c010001, 0x220821, 0x8c223098, 0x400008, 0x0, 0xc003f2b,
-0x0, 0x3c020001, 0x8c4232b8, 0x3c010001, 0xac203240, 0x104000e8,
-0x24020002, 0xaee279c8, 0x3c010001, 0x10000116, 0xac2032b8, 0xc00406b,
-0x0, 0x3c030001, 0x8c6332d0, 0x24020011, 0x1462010f, 0x24020003,
-0x100000aa, 0x0, 0x3c050001, 0x8ca532ac, 0x3c060001, 0x8cc654bc,
-0xc004680, 0x24040001, 0x24020005, 0x3c010001, 0xac2032b8, 0x10000102,
-0xaee279c8, 0x3c040001, 0x2484308c, 0x3c05000f, 0x34a50100, 0x3021,
-0x3821, 0xafa00010, 0xc0028eb, 0xafa00014, 0x100000f7, 0x0,
-0x8f820220, 0x3c03f700, 0x431025, 0x100000ae, 0xaf820220, 0x8f820220,
-0x3c030004, 0x431024, 0x144000bc, 0x24020007, 0x8f830054, 0x3c020001,
-0x8c4233d0, 0x2463d8f0, 0x431023, 0x2c422710, 0x144000e5, 0x24020001,
-0x100000e1, 0x0, 0x3c050001, 0x8ca532ac, 0xc004785, 0x24040001,
-0xc00484d, 0x24040001, 0x3c030001, 0x8c6354b4, 0x46100d7, 0x24020001,
-0x3c020008, 0x621024, 0x10400006, 0x0, 0x8f820214, 0x3c03ffff,
-0x431024, 0x10000005, 0x3442251f, 0x8f820214, 0x3c03ffff, 0x431024,
-0x3442241f, 0xaf820214, 0x8f820220, 0x3c030200, 0x283a025, 0x34420002,
-0xaf820220, 0x24020008, 0xc003b1e, 0xaee279c8, 0x100000c1, 0x0,
-0x8ee279c8, 0x2443ffff, 0x2c620008, 0x104000bc, 0x31080, 0x3c010001,
-0x220821, 0x8c2230b8, 0x400008, 0x0, 0xc003a65, 0x0,
-0x3c010001, 0xac2032b0, 0xaf800204, 0x3c010001, 0xc003f2b, 0xac205480,
-0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, 0x34425080, 0xaf820044,
-0x8f830054, 0x3c010001, 0xac203240, 0x10000062, 0x24020002, 0x3c020001,
-0x8c4254b8, 0x30424000, 0x10400004, 0x0, 0x8f820044, 0x10000006,
-0x3442f080, 0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, 0x3442a080,
-0xaf820044, 0x8f830054, 0x10000051, 0x24020004, 0xc003b78, 0x0,
-0x1040008d, 0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c8433c8,
-0x431024, 0x3442251f, 0xaf820214, 0x24020008, 0x14800067, 0xaee279c8,
-0x1000006c, 0x0, 0x8ee279c8, 0x2443ffff, 0x2c620007, 0x1040007e,
-0x31080, 0x3c010001, 0x220821, 0x8c2230d8, 0x400008, 0x0,
-0xc003a65, 0x0, 0x3c010001, 0xac2032b0, 0xaf800204, 0x3c010001,
-0xc003f2b, 0xac205480, 0x8f830054, 0x3c010001, 0xac203240, 0x1000002a,
-0x24020002, 0x8f830054, 0x3c020001, 0x8c4233d0, 0x2463d8f0, 0x431023,
-0x2c422710, 0x14400064, 0x24020003, 0x10000062, 0xaee279c8, 0x3c020001,
-0x8c4254b8, 0x30424000, 0x10400003, 0x3c0200c8, 0x10000002, 0x344201f6,
-0x344201fe, 0xaf820238, 0x8f830054, 0x10000014, 0x24020004, 0x8f830054,
-0x3c020001, 0x8c4233d0, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440004e,
-0x24020005, 0x1000004c, 0xaee279c8, 0x8f820220, 0x3c03f700, 0x431025,
-0xaf820220, 0xaf800204, 0x3c010001, 0xac205480, 0x8f830054, 0x24020006,
-0xaee279c8, 0x3c010001, 0x1000003f, 0xac2333d0, 0x3c05fffe, 0x34a57960,
-0x3c040001, 0x8f820054, 0x3c030001, 0x8c6333d0, 0x3484869f, 0x451021,
-0x621823, 0x83202b, 0x10800033, 0x0, 0x24020007, 0x10000030,
-0xaee279c8, 0xc003b78, 0x0, 0x1040002a, 0x24020001, 0x8f820214,
-0x3c03ffff, 0x3c040001, 0x8c8433c8, 0x431024, 0x3442251f, 0xaf820214,
-0x24020008, 0x1080000b, 0xaee279c8, 0x8f820220, 0x34420002, 0xaf820220,
-0x24020001, 0x3c010001, 0xac225430, 0xc004430, 0x8f840220, 0x10000018,
-0x0, 0x8f820220, 0x3c030008, 0x431024, 0x14400013, 0x3c020200,
-0x282a025, 0x2402000e, 0x3c010001, 0xac225430, 0xc00484d, 0x24040001,
-0x8f820220, 0x34420002, 0xc003b1e, 0xaf820220, 0x3c050001, 0x8ca532ac,
-0xc004785, 0x24040001, 0x10000003, 0x0, 0x3c010001, 0xac2232b0,
-0x8fbf0018, 0x3e00008, 0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220,
-0x34420004, 0xaf820220, 0x8f820200, 0x3c040001, 0x8c8432ac, 0x34420004,
-0xaf820200, 0x24020002, 0x1082003a, 0x2c820003, 0x10400005, 0x24020001,
-0x1082000a, 0x3c03f0ff, 0x100000a8, 0x0, 0x24020004, 0x10820055,
-0x24020008, 0x10820074, 0x3c02f0ff, 0x100000a1, 0x0, 0x8f820050,
-0x3463ffff, 0x3c05ffff, 0x34a53f7f, 0x431024, 0x3c030700, 0x431025,
-0xaf820050, 0x24020e00, 0xaf840200, 0xaf840220, 0xaf820238, 0x8f820044,
-0x3c030001, 0x8c633298, 0x3c040001, 0x8c8433dc, 0x451024, 0x34630022,
-0xaf820044, 0x24020004, 0x1082000c, 0xaf830200, 0x3c020001, 0x8c4232c0,
-0x3c030001, 0x8c6332a4, 0x3c040001, 0x8c84329c, 0x34428000, 0x621825,
-0x641825, 0x1000007e, 0x34620002, 0x3c020001, 0x8c4232a4, 0x3c030001,
-0x8c6332c0, 0x3c040001, 0x8c84329c, 0x431025, 0x441025, 0x10000074,
-0x34420002, 0x8f830050, 0x3c02f0ff, 0x3442ffff, 0x3c040001, 0x8c8433c8,
-0x621824, 0x3c020d00, 0x621825, 0x24020001, 0xaf830050, 0xaf820200,
-0xaf820220, 0x24020e00, 0xaf820238, 0x10800005, 0x3c033f00, 0x3c020001,
-0x8c423290, 0x10000004, 0x34630070, 0x3c020001, 0x8c423290, 0x34630072,
-0x431025, 0xaf820200, 0x3c030001, 0x8c633294, 0x3c04f700, 0x3c020001,
-0x8c4232a4, 0x3c050001, 0x8ca532c0, 0x641825, 0x431025, 0x10000050,
-0x451025, 0x3c03f0ff, 0x8f820050, 0x3463ffff, 0x3c04ffff, 0x431024,
-0x3c030a00, 0x431025, 0xaf820050, 0x24020001, 0xaf820200, 0xaf820220,
-0x24020e01, 0xaf820238, 0x8f820044, 0x34843f7f, 0x3c030001, 0x8c6333c8,
-0x441024, 0x34420080, 0xaf820044, 0x10600005, 0x3c033f00, 0x3c020001,
-0x8c423290, 0x10000004, 0x346300e0, 0x3c020001, 0x8c423290, 0x346300e2,
-0x431025, 0xaf820200, 0x10000025, 0x3c05f700, 0x8f830050, 0x3c040001,
-0x8c8433c8, 0x3442ffff, 0x621824, 0xaf830050, 0x10800013, 0x3c0500c8,
-0x34a501fb, 0x3c063f00, 0x3c030001, 0x8c6332a0, 0x3c040001, 0x8c843290,
-0x34c600e0, 0x24020001, 0xaf820200, 0xaf820220, 0xaf850238, 0x24630001,
-0x862025, 0x3c010001, 0xac2332a0, 0xaf840200, 0x1000000b, 0x3c05f700,
-0x3c0200c8, 0x344201fb, 0x3c030001, 0x8c633290, 0x3c043f00, 0x348400e2,
-0xaf820238, 0x641825, 0xaf830200, 0x3c05f700, 0x34a58000, 0x3c030001,
-0x8c633294, 0x3c020001, 0x8c4232a4, 0x3c040001, 0x8c8432c0, 0x651825,
-0x431025, 0x441025, 0xaf820220, 0x3e00008, 0x0, 0x0,
-0x27bdffd8, 0xafb50018, 0x80a821, 0xafbe001c, 0xa0f021, 0xafb30014,
-0xc09821, 0xafb10010, 0x8821, 0xafbf0020, 0xa6600000, 0xc0043e7,
-0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x24040001, 0xc0043e7,
-0x2021, 0x24110010, 0x2b11024, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fffa, 0x2b11024, 0x24110010, 0x3d11024,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x3d11024, 0xc00440d, 0x34118000, 0xc00440d, 0x0, 0xc0043c7,
-0x0, 0x50400005, 0x118842, 0x96620000, 0x511025, 0xa6620000,
-0x118842, 0x1620fff7, 0x0, 0xc00440d, 0x0, 0x8fbf0020,
-0x8fbe001c, 0x8fb50018, 0x8fb30014, 0x8fb10010, 0x3e00008, 0x27bd0028,
-0x27bdffd8, 0xafb30014, 0x809821, 0xafb50018, 0xa0a821, 0xafbe001c,
-0xc0f021, 0xafb10010, 0x8821, 0xafbf0020, 0xc0043e7, 0x24040001,
-0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc0043e7, 0x2021,
-0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001,
-0x24110010, 0x2711024, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fffa, 0x2711024, 0x24110010, 0x2b11024, 0x10400002,
-0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x2b11024,
-0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x34118000, 0x97c20000,
-0x511024, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fff8, 0x0, 0xc00440d, 0x0, 0x8fbf0020, 0x8fbe001c,
-0x8fb50018, 0x8fb30014, 0x8fb10010, 0x3e00008, 0x27bd0028, 0x3c030001,
-0x8c6332d0, 0x3c020001, 0x8c423314, 0x27bdffd8, 0xafbf0020, 0xafb3001c,
-0x10620003, 0xafb10018, 0x3c010001, 0xac233314, 0x2463ffff, 0x2c620013,
-0x10400349, 0x31080, 0x3c010001, 0x220821, 0x8c223100, 0x400008,
-0x0, 0xc00440d, 0x8821, 0x34028000, 0xa7a20010, 0x27b30010,
-0xc0043e7, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0,
-0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021,
-0xc0043e7, 0x24040001, 0x24110010, 0x32220001, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220001, 0x24110010,
-0xc0043e7, 0x2021, 0x118842, 0x1620fffc, 0x0, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x2021, 0x34118000, 0x96620000, 0x511024,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fff8,
-0x0, 0xc00440d, 0x0, 0x1000030e, 0x24020002, 0x27b30010,
-0xa7a00010, 0x8821, 0xc0043e7, 0x24040001, 0x26310001, 0x2e220020,
-0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001,
-0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x24110010, 0x32220001,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x32220001, 0x24110010, 0xc0043e7, 0x2021, 0x118842, 0x1620fffc,
-0x0, 0xc00440d, 0x34118000, 0xc00440d, 0x0, 0xc0043c7,
-0x0, 0x50400005, 0x118842, 0x96620000, 0x511025, 0xa6620000,
-0x118842, 0x1620fff7, 0x0, 0xc00440d, 0x0, 0x97a20010,
-0x30428000, 0x144002dc, 0x24020003, 0x100002d8, 0x0, 0x24021200,
-0xa7a20010, 0x27b30010, 0x8821, 0xc0043e7, 0x24040001, 0x26310001,
-0x2e220020, 0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0x24110010,
-0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fffa, 0x32220001, 0x24110010, 0xc0043e7, 0x2021, 0x118842,
-0x1620fffc, 0x0, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021,
-0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fff8, 0x0, 0xc00440d, 0x0,
-0x8f830054, 0x10000296, 0x24020004, 0x8f830054, 0x3c020001, 0x8c4233d8,
-0x2463ff9c, 0x431023, 0x2c420064, 0x1440029e, 0x24020002, 0x3c030001,
-0x8c6333dc, 0x10620297, 0x2c620003, 0x14400296, 0x24020011, 0x24020003,
-0x10620005, 0x24020004, 0x10620291, 0x2402000f, 0x1000028f, 0x24020011,
-0x1000028d, 0x24020005, 0x24020014, 0xa7a20010, 0x27b30010, 0x8821,
-0xc0043e7, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0,
-0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021,
-0xc0043e7, 0x24040001, 0x24110010, 0x32220001, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220001, 0x24110010,
-0x32220012, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fffa, 0x32220012, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021,
-0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fff8, 0x0, 0xc00440d, 0x0,
-0x8f830054, 0x10000248, 0x24020006, 0x8f830054, 0x3c020001, 0x8c4233d8,
-0x2463ff9c, 0x431023, 0x2c420064, 0x14400250, 0x24020007, 0x1000024c,
-0x0, 0x24020006, 0xa7a20010, 0x27b30010, 0x8821, 0xc0043e7,
-0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0xc0043e7,
+0x1040fff0, 0x34028000, 0x1082ff57, 0x26310001, 0x2e220064, 0x1440ffb0,
+0x0, 0x3c020001, 0x8c423408, 0x30420004, 0x14400007, 0x3c08fff0,
+0x8f820044, 0x3c03ffff, 0x34633f7f, 0x431024, 0xaf820044, 0x3c08fff0,
+0x3508bdc0, 0x8f830054, 0x97a60018, 0x3c070001, 0x8ce7353c, 0x3c040001,
+0x248431e0, 0x24020001, 0x3c010001, 0xac223410, 0xafa60010, 0x3c060001,
+0x8cc63408, 0x97a2001a, 0x3c05000d, 0x34a50100, 0x3c010001, 0xac20340c,
+0x681821, 0x3c010001, 0xac233534, 0xc00290f, 0xafa20014, 0x8fbf0034,
+0x8fb50030, 0x8fb3002c, 0x8fb10028, 0x3e00008, 0x27bd0038, 0x27bdffe8,
+0x24070004, 0x3c040001, 0x8c84340c, 0x3021, 0x24020001, 0x1482000a,
+0xafbf0010, 0x3c020001, 0x8c42561c, 0x3c050004, 0x30428000, 0x1040000c,
+0x34a593e0, 0x3c05000f, 0x10000009, 0x34a54240, 0x3c020001, 0x8c42561c,
+0x3c05000f, 0x30428000, 0x10400003, 0x34a54240, 0x3c05001e, 0x34a58480,
+0x3c020001, 0x8c423534, 0x8f830054, 0x451021, 0x431023, 0x45102b,
+0x1440002e, 0x0, 0x3c020001, 0x8c423414, 0x1440002a, 0x2cc20001,
+0x7182b, 0x431024, 0x1040001d, 0x0, 0x3c090001, 0x8d293408,
+0x240b0001, 0x3c054000, 0x3c080001, 0x2508561c, 0x250afffc, 0x42042,
+0x14800002, 0x24e7ffff, 0x24040008, 0x891024, 0x5040000b, 0x2cc20001,
+0x148b0004, 0x0, 0x8d020000, 0x10000003, 0x451024, 0x8d420000,
+0x451024, 0x54400001, 0x24060001, 0x2cc20001, 0x7182b, 0x431024,
+0x5440ffed, 0x42042, 0x3c010001, 0x10c00020, 0xac24340c, 0x8f830054,
+0x24020001, 0x3c010001, 0xac223410, 0x3c010001, 0xac233534, 0x3c020001,
+0x8c423410, 0x10400004, 0x24020001, 0x3c010001, 0xac203410, 0xaee279c8,
+0x8ee379c8, 0x24020008, 0x10620005, 0x24020001, 0xc003e23, 0x0,
+0x1000000b, 0x0, 0x3c030001, 0x8c63340c, 0x10620007, 0x2402000e,
+0x3c030001, 0x8c635590, 0x10620003, 0x0, 0xc00447c, 0x8f840220,
+0x8fbf0010, 0x3e00008, 0x27bd0018, 0x27bdffe0, 0x3c03fdff, 0x3c040001,
+0x8c84340c, 0x3c020001, 0x8c423424, 0x3463ffff, 0x283a024, 0x14820006,
+0xafbf0018, 0x8ee379c8, 0x3c020001, 0x8c423428, 0x10620006, 0x0,
+0x8ee279c8, 0x3c010001, 0xac243424, 0x3c010001, 0xac223428, 0x3c030001,
+0x8c63340c, 0x24020002, 0x10620139, 0x2c620003, 0x10400005, 0x24020001,
+0x1062000a, 0x0, 0x10000131, 0x0, 0x24020004, 0x10620070,
+0x24020008, 0x106200ac, 0x24020001, 0x1000012a, 0x0, 0x8ee279c8,
+0x2443ffff, 0x2c620008, 0x10400127, 0x31080, 0x3c010001, 0x220821,
+0x8c2231f8, 0x400008, 0x0, 0xc003f77, 0x0, 0x3c020001,
+0x8c423418, 0x3c010001, 0xac2033a0, 0x104000e8, 0x24020002, 0xaee279c8,
+0x3c010001, 0x10000116, 0xac203418, 0xc0040b7, 0x0, 0x3c030001,
+0x8c633430, 0x24020011, 0x1462010f, 0x24020003, 0x100000aa, 0x0,
+0x3c050001, 0x8ca5340c, 0x3c060001, 0x8cc6561c, 0xc0046cc, 0x24040001,
+0x24020005, 0x3c010001, 0xac203418, 0x10000102, 0xaee279c8, 0x3c040001,
+0x248431ec, 0x3c05000f, 0x34a50100, 0x3021, 0x3821, 0xafa00010,
+0xc00290f, 0xafa00014, 0x100000f7, 0x0, 0x8f820220, 0x3c03f700,
+0x431025, 0x100000ae, 0xaf820220, 0x8f820220, 0x3c030004, 0x431024,
+0x144000bc, 0x24020007, 0x8f830054, 0x3c020001, 0x8c423530, 0x2463d8f0,
+0x431023, 0x2c422710, 0x144000e5, 0x24020001, 0x100000e1, 0x0,
+0x3c050001, 0x8ca5340c, 0xc0047d1, 0x24040001, 0xc004899, 0x24040001,
+0x3c030001, 0x8c635614, 0x46100d7, 0x24020001, 0x3c020008, 0x621024,
+0x10400006, 0x0, 0x8f820214, 0x3c03ffff, 0x431024, 0x10000005,
+0x3442251f, 0x8f820214, 0x3c03ffff, 0x431024, 0x3442241f, 0xaf820214,
+0x8f820220, 0x3c030200, 0x283a025, 0x34420002, 0xaf820220, 0x24020008,
+0xc003b6a, 0xaee279c8, 0x100000c1, 0x0, 0x8ee279c8, 0x2443ffff,
+0x2c620008, 0x104000bc, 0x31080, 0x3c010001, 0x220821, 0x8c223218,
+0x400008, 0x0, 0xc003ab1, 0x0, 0x3c010001, 0xac203410,
+0xaf800204, 0x3c010001, 0xc003f77, 0xac2055e0, 0x8f820044, 0x3c03ffff,
+0x34633f7f, 0x431024, 0x34425080, 0xaf820044, 0x8f830054, 0x3c010001,
+0xac2033a0, 0x10000062, 0x24020002, 0x3c020001, 0x8c425618, 0x30424000,
+0x10400004, 0x0, 0x8f820044, 0x10000006, 0x3442f080, 0x8f820044,
+0x3c03ffff, 0x34633f7f, 0x431024, 0x3442a080, 0xaf820044, 0x8f830054,
+0x10000051, 0x24020004, 0xc003bc4, 0x0, 0x1040008d, 0x24020001,
+0x8f820214, 0x3c03ffff, 0x3c040001, 0x8c843528, 0x431024, 0x3442251f,
+0xaf820214, 0x24020008, 0x14800067, 0xaee279c8, 0x1000006c, 0x0,
+0x8ee279c8, 0x2443ffff, 0x2c620007, 0x1040007e, 0x31080, 0x3c010001,
+0x220821, 0x8c223238, 0x400008, 0x0, 0xc003ab1, 0x0,
+0x3c010001, 0xac203410, 0xaf800204, 0x3c010001, 0xc003f77, 0xac2055e0,
+0x8f830054, 0x3c010001, 0xac2033a0, 0x1000002a, 0x24020002, 0x8f830054,
+0x3c020001, 0x8c423530, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400064,
+0x24020003, 0x10000062, 0xaee279c8, 0x3c020001, 0x8c425618, 0x30424000,
+0x10400003, 0x3c0200c8, 0x10000002, 0x344201f6, 0x344201fe, 0xaf820238,
+0x8f830054, 0x10000014, 0x24020004, 0x8f830054, 0x3c020001, 0x8c423530,
+0x2463d8f0, 0x431023, 0x2c422710, 0x1440004e, 0x24020005, 0x1000004c,
+0xaee279c8, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0xaf800204,
+0x3c010001, 0xac2055e0, 0x8f830054, 0x24020006, 0xaee279c8, 0x3c010001,
+0x1000003f, 0xac233530, 0x3c05fffe, 0x34a57960, 0x3c040001, 0x8f820054,
+0x3c030001, 0x8c633530, 0x3484869f, 0x451021, 0x621823, 0x83202b,
+0x10800033, 0x0, 0x24020007, 0x10000030, 0xaee279c8, 0xc003bc4,
+0x0, 0x1040002a, 0x24020001, 0x8f820214, 0x3c03ffff, 0x3c040001,
+0x8c843528, 0x431024, 0x3442251f, 0xaf820214, 0x24020008, 0x1080000b,
+0xaee279c8, 0x8f820220, 0x34420002, 0xaf820220, 0x24020001, 0x3c010001,
+0xac225590, 0xc00447c, 0x8f840220, 0x10000018, 0x0, 0x8f820220,
+0x3c030008, 0x431024, 0x14400013, 0x3c020200, 0x282a025, 0x2402000e,
+0x3c010001, 0xac225590, 0xc004899, 0x24040001, 0x8f820220, 0x34420002,
+0xc003b6a, 0xaf820220, 0x3c050001, 0x8ca5340c, 0xc0047d1, 0x24040001,
+0x10000003, 0x0, 0x3c010001, 0xac223410, 0x8fbf0018, 0x3e00008,
+0x27bd0020, 0x8f820200, 0x8f820220, 0x8f820220, 0x34420004, 0xaf820220,
+0x8f820200, 0x3c040001, 0x8c84340c, 0x34420004, 0xaf820200, 0x24020002,
+0x1082003a, 0x2c820003, 0x10400005, 0x24020001, 0x1082000a, 0x3c03f0ff,
+0x100000a8, 0x0, 0x24020004, 0x10820055, 0x24020008, 0x10820074,
+0x3c02f0ff, 0x100000a1, 0x0, 0x8f820050, 0x3463ffff, 0x3c05ffff,
+0x34a53f7f, 0x431024, 0x3c030700, 0x431025, 0xaf820050, 0x24020e00,
+0xaf840200, 0xaf840220, 0xaf820238, 0x8f820044, 0x3c030001, 0x8c6333f8,
+0x3c040001, 0x8c84353c, 0x451024, 0x34630022, 0xaf820044, 0x24020004,
+0x1082000c, 0xaf830200, 0x3c020001, 0x8c423420, 0x3c030001, 0x8c633404,
+0x3c040001, 0x8c8433fc, 0x34428000, 0x621825, 0x641825, 0x1000007e,
+0x34620002, 0x3c020001, 0x8c423404, 0x3c030001, 0x8c633420, 0x3c040001,
+0x8c8433fc, 0x431025, 0x441025, 0x10000074, 0x34420002, 0x8f830050,
+0x3c02f0ff, 0x3442ffff, 0x3c040001, 0x8c843528, 0x621824, 0x3c020d00,
+0x621825, 0x24020001, 0xaf830050, 0xaf820200, 0xaf820220, 0x24020e00,
+0xaf820238, 0x10800005, 0x3c033f00, 0x3c020001, 0x8c4233f0, 0x10000004,
+0x34630070, 0x3c020001, 0x8c4233f0, 0x34630072, 0x431025, 0xaf820200,
+0x3c030001, 0x8c6333f4, 0x3c04f700, 0x3c020001, 0x8c423404, 0x3c050001,
+0x8ca53420, 0x641825, 0x431025, 0x10000050, 0x451025, 0x3c03f0ff,
+0x8f820050, 0x3463ffff, 0x3c04ffff, 0x431024, 0x3c030a00, 0x431025,
+0xaf820050, 0x24020001, 0xaf820200, 0xaf820220, 0x24020e01, 0xaf820238,
+0x8f820044, 0x34843f7f, 0x3c030001, 0x8c633528, 0x441024, 0x34420080,
+0xaf820044, 0x10600005, 0x3c033f00, 0x3c020001, 0x8c4233f0, 0x10000004,
+0x346300e0, 0x3c020001, 0x8c4233f0, 0x346300e2, 0x431025, 0xaf820200,
+0x10000025, 0x3c05f700, 0x8f830050, 0x3c040001, 0x8c843528, 0x3442ffff,
+0x621824, 0xaf830050, 0x10800013, 0x3c0500c8, 0x34a501fb, 0x3c063f00,
+0x3c030001, 0x8c633400, 0x3c040001, 0x8c8433f0, 0x34c600e0, 0x24020001,
+0xaf820200, 0xaf820220, 0xaf850238, 0x24630001, 0x862025, 0x3c010001,
+0xac233400, 0xaf840200, 0x1000000b, 0x3c05f700, 0x3c0200c8, 0x344201fb,
+0x3c030001, 0x8c6333f0, 0x3c043f00, 0x348400e2, 0xaf820238, 0x641825,
+0xaf830200, 0x3c05f700, 0x34a58000, 0x3c030001, 0x8c6333f4, 0x3c020001,
+0x8c423404, 0x3c040001, 0x8c843420, 0x651825, 0x431025, 0x441025,
+0xaf820220, 0x3e00008, 0x0, 0x0, 0x27bdffd8, 0xafb50018,
+0x80a821, 0xafbe001c, 0xa0f021, 0xafb30014, 0xc09821, 0xafb10010,
+0x8821, 0xafbf0020, 0xa6600000, 0xc004433, 0x24040001, 0x26310001,
+0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021, 0xc004433,
+0x24040001, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0x24110010,
+0x2b11024, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fffa, 0x2b11024, 0x24110010, 0x3d11024, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x3d11024, 0xc004459,
+0x34118000, 0xc004459, 0x0, 0xc004413, 0x0, 0x50400005,
+0x118842, 0x96620000, 0x511025, 0xa6620000, 0x118842, 0x1620fff7,
+0x0, 0xc004459, 0x0, 0x8fbf0020, 0x8fbe001c, 0x8fb50018,
+0x8fb30014, 0x8fb10010, 0x3e00008, 0x27bd0028, 0x27bdffd8, 0xafb30014,
+0x809821, 0xafb50018, 0xa0a821, 0xafbe001c, 0xc0f021, 0xafb10010,
+0x8821, 0xafbf0020, 0xc004433, 0x24040001, 0x26310001, 0x2e220020,
+0x1440fffb, 0x0, 0xc004433, 0x2021, 0xc004433, 0x24040001,
+0xc004433, 0x2021, 0xc004433, 0x24040001, 0x24110010, 0x2711024,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa,
+0x2711024, 0x24110010, 0x2b11024, 0x10400002, 0x2021, 0x24040001,
+0xc004433, 0x118842, 0x1620fffa, 0x2b11024, 0xc004433, 0x24040001,
+0xc004433, 0x2021, 0x34118000, 0x97c20000, 0x511024, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fff8, 0x0,
+0xc004459, 0x0, 0x8fbf0020, 0x8fbe001c, 0x8fb50018, 0x8fb30014,
+0x8fb10010, 0x3e00008, 0x27bd0028, 0x3c030001, 0x8c633430, 0x3c020001,
+0x8c423474, 0x27bdffd8, 0xafbf0020, 0xafb3001c, 0x10620003, 0xafb10018,
+0x3c010001, 0xac233474, 0x2463ffff, 0x2c620013, 0x10400349, 0x31080,
+0x3c010001, 0x220821, 0x8c223260, 0x400008, 0x0, 0xc004459,
+0x8821, 0x34028000, 0xa7a20010, 0x27b30010, 0xc004433, 0x24040001,
+0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021,
+0xc004433, 0x24040001, 0xc004433, 0x2021, 0xc004433, 0x24040001,
+0x24110010, 0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0xc004433, 0x2021,
+0x118842, 0x1620fffc, 0x0, 0xc004433, 0x24040001, 0xc004433,
+0x2021, 0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fff8, 0x0, 0xc004459,
+0x0, 0x1000030e, 0x24020002, 0x27b30010, 0xa7a00010, 0x8821,
+0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0,
+0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433, 0x24040001,
+0xc004433, 0x2021, 0x24110010, 0x32220001, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001, 0x24110010,
+0xc004433, 0x2021, 0x118842, 0x1620fffc, 0x0, 0xc004459,
+0x34118000, 0xc004459, 0x0, 0xc004413, 0x0, 0x50400005,
+0x118842, 0x96620000, 0x511025, 0xa6620000, 0x118842, 0x1620fff7,
+0x0, 0xc004459, 0x0, 0x97a20010, 0x30428000, 0x144002dc,
+0x24020003, 0x100002d8, 0x0, 0x24021200, 0xa7a20010, 0x27b30010,
+0x8821, 0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
+0x0, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433,
+0x2021, 0xc004433, 0x24040001, 0x24110010, 0x32220001, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001,
+0x24110010, 0xc004433, 0x2021, 0x118842, 0x1620fffc, 0x0,
+0xc004433, 0x24040001, 0xc004433, 0x2021, 0x34118000, 0x96620000,
+0x511024, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fff8, 0x0, 0xc004459, 0x0, 0x8f830054, 0x10000296,
+0x24020004, 0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c, 0x431023,
+0x2c420064, 0x1440029e, 0x24020002, 0x3c030001, 0x8c63353c, 0x10620297,
+0x2c620003, 0x14400296, 0x24020011, 0x24020003, 0x10620005, 0x24020004,
+0x10620291, 0x2402000f, 0x1000028f, 0x24020011, 0x1000028d, 0x24020005,
+0x24020014, 0xa7a20010, 0x27b30010, 0x8821, 0xc004433, 0x24040001,
+0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021,
+0xc004433, 0x24040001, 0xc004433, 0x2021, 0xc004433, 0x24040001,
+0x24110010, 0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220012, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220012,
+0xc004433, 0x24040001, 0xc004433, 0x2021, 0x34118000, 0x96620000,
+0x511024, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fff8, 0x0, 0xc004459, 0x0, 0x8f830054, 0x10000248,
+0x24020006, 0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c, 0x431023,
+0x2c420064, 0x14400250, 0x24020007, 0x1000024c, 0x0, 0x24020006,
+0xa7a20010, 0x27b30010, 0x8821, 0xc004433, 0x24040001, 0x26310001,
+0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0x24110010,
+0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fffa, 0x32220001, 0x24110010, 0x32220013, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220013, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0x34118000, 0x96620000, 0x511024,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fff8,
+0x0, 0xc004459, 0x0, 0x8f830054, 0x10000207, 0x24020008,
+0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c, 0x431023, 0x2c420064,
+0x1440020f, 0x24020009, 0x1000020b, 0x0, 0x27b30010, 0xa7a00010,
+0x8821, 0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
+0x0, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0x24110010, 0x32220001, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001,
+0x24110010, 0x32220018, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fffa, 0x32220018, 0xc004459, 0x34118000, 0xc004459,
+0x0, 0xc004413, 0x0, 0x50400005, 0x118842, 0x96620000,
+0x511025, 0xa6620000, 0x118842, 0x1620fff7, 0x0, 0xc004459,
+0x8821, 0x97a20010, 0x27b30010, 0x34420001, 0xa7a20010, 0xc004433,
+0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc004433,
+0x2021, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0xc004433,
0x24040001, 0x24110010, 0x32220001, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220013,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x32220013, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x34118000,
-0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fff8, 0x0, 0xc00440d, 0x0, 0x8f830054,
-0x10000207, 0x24020008, 0x8f830054, 0x3c020001, 0x8c4233d8, 0x2463ff9c,
-0x431023, 0x2c420064, 0x1440020f, 0x24020009, 0x1000020b, 0x0,
-0x27b30010, 0xa7a00010, 0x8821, 0xc0043e7, 0x24040001, 0x26310001,
-0x2e220020, 0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x24110010,
-0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fffa, 0x32220001, 0x24110010, 0x32220018, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220018, 0xc00440d,
-0x34118000, 0xc00440d, 0x0, 0xc0043c7, 0x0, 0x50400005,
+0xc004433, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220018,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa,
+0x32220018, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0x34118000,
+0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fff8, 0x0, 0xc004459, 0x0, 0x8f830054,
+0x10000193, 0x2402000a, 0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c,
+0x431023, 0x2c420064, 0x1440019b, 0x2402000b, 0x10000197, 0x0,
+0x27b30010, 0xa7a00010, 0x8821, 0xc004433, 0x24040001, 0x26310001,
+0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021, 0xc004433,
+0x24040001, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0x24110010,
+0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fffa, 0x32220001, 0x24110010, 0x32220017, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220017, 0xc004459,
+0x34118000, 0xc004459, 0x0, 0xc004413, 0x0, 0x50400005,
0x118842, 0x96620000, 0x511025, 0xa6620000, 0x118842, 0x1620fff7,
-0x0, 0xc00440d, 0x8821, 0x97a20010, 0x27b30010, 0x34420001,
-0xa7a20010, 0xc0043e7, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
-0x0, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0x24110010, 0x32220001, 0x10400002,
-0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220001,
-0x24110010, 0x32220018, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fffa, 0x32220018, 0xc0043e7, 0x24040001, 0xc0043e7,
+0x0, 0xc004459, 0x8821, 0x97a20010, 0x27b30010, 0x34420700,
+0xa7a20010, 0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
+0x0, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433,
+0x2021, 0xc004433, 0x24040001, 0x24110010, 0x32220001, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001,
+0x24110010, 0x32220017, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fffa, 0x32220017, 0xc004433, 0x24040001, 0xc004433,
0x2021, 0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fff8, 0x0, 0xc00440d,
-0x0, 0x8f830054, 0x10000193, 0x2402000a, 0x8f830054, 0x3c020001,
-0x8c4233d8, 0x2463ff9c, 0x431023, 0x2c420064, 0x1440019b, 0x2402000b,
-0x10000197, 0x0, 0x27b30010, 0xa7a00010, 0x8821, 0xc0043e7,
-0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x24040001, 0xc0043e7,
+0x24040001, 0xc004433, 0x118842, 0x1620fff8, 0x0, 0xc004459,
+0x0, 0x8f830054, 0x1000011f, 0x2402000c, 0x8f830054, 0x3c020001,
+0x8c423538, 0x2463ff9c, 0x431023, 0x2c420064, 0x14400127, 0x24020012,
+0x10000123, 0x0, 0x27b30010, 0xa7a00010, 0x8821, 0xc004433,
+0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc004433,
+0x2021, 0xc004433, 0x24040001, 0xc004433, 0x24040001, 0xc004433,
0x2021, 0x24110010, 0x32220001, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220017,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x32220017, 0xc00440d, 0x34118000, 0xc00440d, 0x0, 0xc0043c7,
+0xc004433, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220014,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa,
+0x32220014, 0xc004459, 0x34118000, 0xc004459, 0x0, 0xc004413,
0x0, 0x50400005, 0x118842, 0x96620000, 0x511025, 0xa6620000,
-0x118842, 0x1620fff7, 0x0, 0xc00440d, 0x8821, 0x97a20010,
-0x27b30010, 0x34420700, 0xa7a20010, 0xc0043e7, 0x24040001, 0x26310001,
-0x2e220020, 0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0x24110010,
-0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fffa, 0x32220001, 0x24110010, 0x32220017, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220017, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x2021, 0x34118000, 0x96620000, 0x511024,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fff8,
-0x0, 0xc00440d, 0x0, 0x8f830054, 0x1000011f, 0x2402000c,
-0x8f830054, 0x3c020001, 0x8c4233d8, 0x2463ff9c, 0x431023, 0x2c420064,
-0x14400127, 0x24020012, 0x10000123, 0x0, 0x27b30010, 0xa7a00010,
-0x8821, 0xc0043e7, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
-0x0, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x2021, 0x24110010, 0x32220001, 0x10400002,
-0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220001,
-0x24110010, 0x32220014, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fffa, 0x32220014, 0xc00440d, 0x34118000, 0xc00440d,
-0x0, 0xc0043c7, 0x0, 0x50400005, 0x118842, 0x96620000,
-0x511025, 0xa6620000, 0x118842, 0x1620fff7, 0x0, 0xc00440d,
-0x8821, 0x97a20010, 0x27b30010, 0x34420010, 0xa7a20010, 0xc0043e7,
-0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0xc0043e7,
+0x118842, 0x1620fff7, 0x0, 0xc004459, 0x8821, 0x97a20010,
+0x27b30010, 0x34420010, 0xa7a20010, 0xc004433, 0x24040001, 0x26310001,
+0x2e220020, 0x1440fffb, 0x0, 0xc004433, 0x2021, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0x24110010,
+0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fffa, 0x32220001, 0x24110010, 0x32220014, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220014, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0x34118000, 0x96620000, 0x511024,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fff8,
+0x0, 0xc004459, 0x0, 0x8f830054, 0x100000ab, 0x24020013,
+0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c, 0x431023, 0x2c420064,
+0x144000b3, 0x2402000d, 0x100000af, 0x0, 0x27b30010, 0xa7a00010,
+0x8821, 0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
+0x0, 0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433,
+0x24040001, 0xc004433, 0x2021, 0x24110010, 0x32220001, 0x10400002,
+0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001,
+0x24110010, 0x32220018, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fffa, 0x32220018, 0xc004459, 0x34118000, 0xc004459,
+0x0, 0xc004413, 0x0, 0x50400005, 0x118842, 0x96620000,
+0x511025, 0xa6620000, 0x118842, 0x1620fff7, 0x0, 0xc004459,
+0x8821, 0x97a20010, 0x27b30010, 0x3042fffe, 0xa7a20010, 0xc004433,
+0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0, 0xc004433,
+0x2021, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0xc004433,
0x24040001, 0x24110010, 0x32220001, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220014,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x32220014, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x34118000,
-0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fff8, 0x0, 0xc00440d, 0x0, 0x8f830054,
-0x100000ab, 0x24020013, 0x8f830054, 0x3c020001, 0x8c4233d8, 0x2463ff9c,
-0x431023, 0x2c420064, 0x144000b3, 0x2402000d, 0x100000af, 0x0,
-0x27b30010, 0xa7a00010, 0x8821, 0xc0043e7, 0x24040001, 0x26310001,
-0x2e220020, 0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7,
-0x24040001, 0xc0043e7, 0x24040001, 0xc0043e7, 0x2021, 0x24110010,
-0x32220001, 0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842,
-0x1620fffa, 0x32220001, 0x24110010, 0x32220018, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220018, 0xc00440d,
-0x34118000, 0xc00440d, 0x0, 0xc0043c7, 0x0, 0x50400005,
-0x118842, 0x96620000, 0x511025, 0xa6620000, 0x118842, 0x1620fff7,
-0x0, 0xc00440d, 0x8821, 0x97a20010, 0x27b30010, 0x3042fffe,
-0xa7a20010, 0xc0043e7, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb,
-0x0, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0xc0043e7,
-0x2021, 0xc0043e7, 0x24040001, 0x24110010, 0x32220001, 0x10400002,
-0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa, 0x32220001,
-0x24110010, 0x32220018, 0x10400002, 0x2021, 0x24040001, 0xc0043e7,
-0x118842, 0x1620fffa, 0x32220018, 0xc0043e7, 0x24040001, 0xc0043e7,
-0x2021, 0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021,
-0x24040001, 0xc0043e7, 0x118842, 0x1620fff8, 0x0, 0xc00440d,
-0x0, 0x8f830054, 0x10000037, 0x2402000e, 0x24020840, 0xa7a20010,
-0x27b30010, 0x8821, 0xc0043e7, 0x24040001, 0x26310001, 0x2e220020,
-0x1440fffb, 0x0, 0xc0043e7, 0x2021, 0xc0043e7, 0x24040001,
-0xc0043e7, 0x2021, 0xc0043e7, 0x24040001, 0x24110010, 0x32220001,
-0x10400002, 0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fffa,
-0x32220001, 0x24110010, 0x32220013, 0x10400002, 0x2021, 0x24040001,
-0xc0043e7, 0x118842, 0x1620fffa, 0x32220013, 0xc0043e7, 0x24040001,
-0xc0043e7, 0x2021, 0x34118000, 0x96620000, 0x511024, 0x10400002,
-0x2021, 0x24040001, 0xc0043e7, 0x118842, 0x1620fff8, 0x0,
-0xc00440d, 0x0, 0x8f830054, 0x24020010, 0x3c010001, 0xac2232d0,
-0x3c010001, 0x1000000c, 0xac2333d8, 0x8f830054, 0x3c020001, 0x8c4233d8,
-0x2463ff9c, 0x431023, 0x2c420064, 0x14400004, 0x0, 0x24020011,
-0x3c010001, 0xac2232d0, 0x8fbf0020, 0x8fb3001c, 0x8fb10018, 0x3e00008,
-0x27bd0028, 0x8f850044, 0x8f820044, 0x3c030001, 0x431025, 0x3c030008,
-0xaf820044, 0x8f840054, 0x8f820054, 0xa32824, 0x10000002, 0x24840001,
-0x8f820054, 0x821023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044,
-0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054,
-0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
-0x0, 0x3e00008, 0xa01021, 0x8f830044, 0x3c02fff0, 0x3442ffff,
-0x42480, 0x621824, 0x3c020002, 0x822025, 0x641825, 0xaf830044,
-0x8f820044, 0x3c030001, 0x431025, 0xaf820044, 0x8f830054, 0x8f820054,
-0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
-0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044,
-0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023,
-0x2c420002, 0x1440fffc, 0x0, 0x3e00008, 0x0, 0x8f820044,
-0x3c03fff0, 0x3463ffff, 0x431024, 0xaf820044, 0x8f820044, 0x3c030001,
+0xc004433, 0x118842, 0x1620fffa, 0x32220001, 0x24110010, 0x32220018,
+0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842, 0x1620fffa,
+0x32220018, 0xc004433, 0x24040001, 0xc004433, 0x2021, 0x34118000,
+0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001, 0xc004433,
+0x118842, 0x1620fff8, 0x0, 0xc004459, 0x0, 0x8f830054,
+0x10000037, 0x2402000e, 0x24020840, 0xa7a20010, 0x27b30010, 0x8821,
+0xc004433, 0x24040001, 0x26310001, 0x2e220020, 0x1440fffb, 0x0,
+0xc004433, 0x2021, 0xc004433, 0x24040001, 0xc004433, 0x2021,
+0xc004433, 0x24040001, 0x24110010, 0x32220001, 0x10400002, 0x2021,
+0x24040001, 0xc004433, 0x118842, 0x1620fffa, 0x32220001, 0x24110010,
+0x32220013, 0x10400002, 0x2021, 0x24040001, 0xc004433, 0x118842,
+0x1620fffa, 0x32220013, 0xc004433, 0x24040001, 0xc004433, 0x2021,
+0x34118000, 0x96620000, 0x511024, 0x10400002, 0x2021, 0x24040001,
+0xc004433, 0x118842, 0x1620fff8, 0x0, 0xc004459, 0x0,
+0x8f830054, 0x24020010, 0x3c010001, 0xac223430, 0x3c010001, 0x1000000c,
+0xac233538, 0x8f830054, 0x3c020001, 0x8c423538, 0x2463ff9c, 0x431023,
+0x2c420064, 0x14400004, 0x0, 0x24020011, 0x3c010001, 0xac223430,
+0x8fbf0020, 0x8fb3001c, 0x8fb10018, 0x3e00008, 0x27bd0028, 0x8f850044,
+0x8f820044, 0x3c030001, 0x431025, 0x3c030008, 0xaf820044, 0x8f840054,
+0x8f820054, 0xa32824, 0x10000002, 0x24840001, 0x8f820054, 0x821023,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff,
+0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008,
+0xa01021, 0x8f830044, 0x3c02fff0, 0x3442ffff, 0x42480, 0x621824,
+0x3c020002, 0x822025, 0x641825, 0xaf830044, 0x8f820044, 0x3c030001,
0x431025, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x8f820044,
0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820044, 0x8f830054, 0x8f820054,
0x10000002, 0x24630001, 0x8f820054, 0x621023, 0x2c420002, 0x1440fffc,
-0x0, 0x3e00008, 0x0, 0x0, 0x27bdffe8, 0xafbf0010,
-0x8ee379c8, 0x24020008, 0x146201ca, 0x0, 0x3c020001, 0x8c4233c8,
-0x14400005, 0x0, 0xc003a65, 0x8f840224, 0x100001c2, 0x0,
-0x8f820220, 0x3c030008, 0x431024, 0x10400026, 0x24020001, 0x8f840224,
-0x8f820220, 0x3c030400, 0x431024, 0x10400006, 0x0, 0x3c010001,
-0xac205440, 0x3c010001, 0x1000000b, 0xac205460, 0x3c030001, 0x24635440,
-0x8c620000, 0x24420001, 0xac620000, 0x2c420002, 0x14400003, 0x24020001,
-0x3c010001, 0xac225460, 0x3c020001, 0x8c425460, 0x10400006, 0x30820040,
-0x10400004, 0x24020001, 0x3c010001, 0x10000003, 0xac225464, 0x3c010001,
-0xac205464, 0x3c010001, 0xac24543c, 0x3c010001, 0x1000000b, 0xac205470,
-0x3c010001, 0xac225470, 0x3c010001, 0xac205460, 0x3c010001, 0xac205440,
-0x3c010001, 0xac205464, 0x3c010001, 0xac20543c, 0x3c030001, 0x8c635430,
-0x3c020001, 0x8c425434, 0x50620004, 0x2463ffff, 0x3c010001, 0xac235434,
-0x2463ffff, 0x2c62000e, 0x1040017e, 0x31080, 0x3c010001, 0x220821,
-0x8c223150, 0x400008, 0x0, 0x3c02fdff, 0x3442ffff, 0x282a024,
-0x24020002, 0x3c010001, 0xac205460, 0x3c010001, 0xac205440, 0x3c010001,
-0xac205470, 0x3c010001, 0xac20543c, 0x3c010001, 0xac205464, 0x3c010001,
-0xac205458, 0x3c010001, 0xac205450, 0xaf800224, 0x3c010001, 0xac225430,
-0xc003a65, 0x0, 0xaf800204, 0x8f820200, 0x2403fffd, 0x431024,
-0xaf820200, 0x3c010001, 0xac205480, 0x8f830054, 0x3c020001, 0x8c425458,
-0x24040001, 0x3c010001, 0xac24546c, 0x24420001, 0x3c010001, 0xac225458,
-0x2c420004, 0x3c010001, 0xac235454, 0x14400006, 0x24020003, 0x3c010001,
-0xac2432b0, 0x3c010001, 0x10000148, 0xac205458, 0x3c010001, 0x10000145,
-0xac225430, 0x8f830054, 0x3c020001, 0x8c425454, 0x2463d8f0, 0x431023,
-0x2c422710, 0x1440013d, 0x24020004, 0x3c010001, 0x1000013a, 0xac225430,
-0x3c040001, 0x8c8433cc, 0x3c010001, 0xc004602, 0xac205448, 0x3c020001,
-0x8c42547c, 0xaf820204, 0x8f820204, 0x30420030, 0x14400125, 0x24020002,
-0x3c030001, 0x8c63547c, 0x24020005, 0x3c010001, 0xac225430, 0x3c010001,
-0x10000126, 0xac235480, 0x3c020001, 0x8c425460, 0x10400122, 0x0,
-0x3c020001, 0x8c42543c, 0x1040011e, 0x0, 0x3c010001, 0xac225468,
-0x24020003, 0x3c010001, 0xac225440, 0x100000c1, 0x24020006, 0x3c010001,
-0xac205448, 0x8f820204, 0x34420040, 0xaf820204, 0x3c020001, 0x8c425480,
-0x24030007, 0x3c010001, 0xac235430, 0x34420040, 0x3c010001, 0xac225480,
-0x3c020001, 0x8c425460, 0x10400005, 0x0, 0x3c020001, 0x8c42543c,
-0x104000f9, 0x24020002, 0x3c050001, 0x24a55440, 0x8ca20000, 0x2c424e21,
-0x104000f3, 0x24020002, 0x3c020001, 0x8c425464, 0x104000f8, 0x2404ffbf,
-0x3c020001, 0x8c42543c, 0x3c030001, 0x8c635468, 0x441024, 0x641824,
-0x14430007, 0x24020001, 0x24020003, 0xaca20000, 0x24020008, 0x3c010001,
-0x100000ea, 0xac225430, 0x3c010001, 0x100000e7, 0xac225430, 0x3c020001,
-0x8c42546c, 0x1040000c, 0x24020001, 0x3c040001, 0xc00460f, 0x8c84543c,
-0x3c020001, 0x8c425488, 0x14400005, 0x24020001, 0x3c020001, 0x8c425484,
-0x10400006, 0x24020001, 0x3c010001, 0xac2232b0, 0x3c010001, 0x100000d3,
-0xac205458, 0x8f820204, 0x34420040, 0xaf820204, 0x3c020001, 0x8c425480,
-0x3c030001, 0x8c635450, 0x34420040, 0x3c010001, 0xac225480, 0x3c020001,
-0x8c42543c, 0x2c630001, 0x318c0, 0x3c010001, 0xac235450, 0x30420008,
-0x3c010001, 0xac22544c, 0x8f830054, 0x24020009, 0x3c010001, 0xac225430,
-0x3c010001, 0x100000b9, 0xac235454, 0x8f830054, 0x3c020001, 0x8c425454,
-0x2463d8f0, 0x431023, 0x2c422710, 0x1440009f, 0x0, 0x3c020001,
-0x8c425460, 0x10400005, 0x0, 0x3c020001, 0x8c42543c, 0x104000a0,
-0x24020002, 0x3c030001, 0x24635440, 0x8c620000, 0x2c424e21, 0x1040009a,
-0x24020002, 0x3c020001, 0x8c42546c, 0x1040000e, 0x0, 0x3c020001,
-0x8c42543c, 0x3c010001, 0xac20546c, 0x30420080, 0x1040002f, 0x2402000c,
-0x8f820204, 0x30420080, 0x1440000c, 0x24020003, 0x10000029, 0x2402000c,
-0x3c020001, 0x8c42543c, 0x30420080, 0x14400005, 0x24020003, 0x8f820204,
-0x30420080, 0x1040001f, 0x24020003, 0xac620000, 0x2402000a, 0x3c010001,
-0xac225430, 0x3c040001, 0x24845478, 0x8c820000, 0x3c030001, 0x8c635450,
-0x431025, 0xaf820204, 0x8c830000, 0x3c040001, 0x8c845450, 0x2402000b,
-0x3c010001, 0xac225430, 0x641825, 0x3c010001, 0xac235480, 0x3c050001,
-0x24a55440, 0x8ca20000, 0x2c424e21, 0x10400066, 0x24020002, 0x3c020001,
-0x8c425470, 0x10400005, 0x0, 0x2402000c, 0x3c010001, 0x10000067,
-0xac225430, 0x3c020001, 0x8c425460, 0x10400063, 0x0, 0x3c040001,
-0x8c84543c, 0x10800055, 0x30820008, 0x3c030001, 0x8c63544c, 0x1062005b,
-0x24020003, 0x3c010001, 0xac245468, 0xaca20000, 0x24020006, 0x3c010001,
-0x10000054, 0xac225430, 0x8f820200, 0x34420002, 0xaf820200, 0x8f830054,
-0x2402000d, 0x3c010001, 0xac225430, 0x3c010001, 0xac235454, 0x8f830054,
-0x3c020001, 0x8c425454, 0x2463d8f0, 0x431023, 0x2c422710, 0x14400031,
-0x0, 0x3c020001, 0x8c425470, 0x10400020, 0x2402000e, 0x3c030001,
-0x8c635484, 0x3c010001, 0x14600015, 0xac225430, 0xc003b1e, 0x0,
-0x3c050001, 0x8ca532ac, 0xc004785, 0x24040001, 0x3c030001, 0x8c6332ac,
-0x24020004, 0x14620005, 0x2403fffb, 0x3c020001, 0x8c4232a8, 0x10000003,
-0x2403fff7, 0x3c020001, 0x8c4232a8, 0x431024, 0x3c010001, 0xac2232a8,
-0x8f830224, 0x3c020200, 0x3c010001, 0xac23548c, 0x10000020, 0x282a025,
-0x3c020001, 0x8c425460, 0x10400005, 0x0, 0x3c020001, 0x8c42543c,
-0x1040000f, 0x24020002, 0x3c020001, 0x8c425440, 0x2c424e21, 0x1040000a,
-0x24020002, 0x3c020001, 0x8c425460, 0x1040000f, 0x0, 0x3c020001,
-0x8c42543c, 0x1440000b, 0x0, 0x24020002, 0x3c010001, 0x10000007,
-0xac225430, 0x3c020001, 0x8c425460, 0x10400003, 0x0, 0xc003a65,
-0x0, 0x8f820220, 0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010,
-0x3e00008, 0x27bd0018, 0x3c030001, 0x24635488, 0x8c620000, 0x10400005,
-0x34422000, 0x3c010001, 0xac22547c, 0x10000003, 0xac600000, 0x3c010001,
-0xac24547c, 0x3e00008, 0x0, 0x27bdffe0, 0x30820030, 0xafbf0018,
-0x3c010001, 0xac225484, 0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024,
-0x14400061, 0x24020030, 0x30822000, 0x1040005d, 0x30838000, 0x31a02,
-0x30820001, 0x21200, 0x3c040001, 0x8c8433cc, 0x621825, 0x331c2,
-0x3c030001, 0x2463332c, 0x30828000, 0x21202, 0x30840001, 0x42200,
-0x441025, 0x239c2, 0x61080, 0x431021, 0x471021, 0x90430000,
-0x24020001, 0x10620025, 0x0, 0x10600007, 0x24020002, 0x10620013,
-0x24020003, 0x1062002c, 0x3c05000f, 0x10000037, 0x0, 0x8f820200,
-0x2403feff, 0x431024, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff,
-0x431024, 0xaf820220, 0x3c010001, 0xac2054c4, 0x3c010001, 0x10000034,
-0xac2054cc, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe,
-0x3463ffff, 0x431024, 0xaf820220, 0x24020100, 0x3c010001, 0xac2254c4,
-0x3c010001, 0x10000026, 0xac2054cc, 0x8f820200, 0x2403feff, 0x431024,
-0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 0x3c010001,
-0xac2054c4, 0x3c010001, 0x10000019, 0xac2354cc, 0x8f820200, 0x34420100,
-0xaf820200, 0x8f820220, 0x3c030001, 0x431025, 0xaf820220, 0x24020100,
-0x3c010001, 0xac2254c4, 0x3c010001, 0x1000000c, 0xac2354cc, 0x34a5ffff,
-0x3c040001, 0x24843188, 0xafa30010, 0xc0028eb, 0xafa00014, 0x10000004,
-0x0, 0x24020030, 0x3c010001, 0xac225488, 0x8fbf0018, 0x3e00008,
-0x27bd0020, 0x0, 0x27bdffc8, 0xafb30024, 0x809821, 0xafbe002c,
-0xa0f021, 0xafb10020, 0xc08821, 0x3c040001, 0x248431a0, 0x3c050009,
-0x3c020001, 0x8c4232ac, 0x34a59001, 0x2603021, 0x3c03821, 0xafbf0030,
-0xafb50028, 0xa7a0001a, 0xafb10014, 0xc0028eb, 0xafa20010, 0x24020002,
-0x13c200e7, 0x2fc20003, 0x10400005, 0x24020001, 0x13c2000a, 0x3c02fffb,
-0x100000e1, 0x0, 0x24020004, 0x13c2006d, 0x24020008, 0x13c2006c,
-0x3c02ffec, 0x100000da, 0x0, 0x3442ffff, 0x2228824, 0x13a940,
-0x3c010001, 0x350821, 0xac31549c, 0x3c024000, 0x2221024, 0x10400046,
-0x1123c2, 0x30840030, 0x111382, 0x3042000c, 0x3c030001, 0x246332d4,
-0x431021, 0x823821, 0x3c020020, 0x2221024, 0x10400006, 0x24020100,
-0x3c010001, 0x350821, 0xac2254a0, 0x10000005, 0x3c020080, 0x3c010001,
-0x350821, 0xac2054a0, 0x3c020080, 0x2221024, 0x10400006, 0x131940,
-0x3c020001, 0x3c010001, 0x230821, 0x10000005, 0xac2254a8, 0x131140,
-0x3c010001, 0x220821, 0xac2054a8, 0x94e30000, 0x32224000, 0x10400003,
-0xa7a30018, 0x34624000, 0xa7a20018, 0x24040001, 0x94e20002, 0x24050004,
-0x24e60002, 0x34420001, 0xc00402a, 0xa4e20002, 0x24040001, 0x2821,
-0xc00402a, 0x27a60018, 0x3c020001, 0x8c4232ac, 0x24130001, 0x3c010001,
-0xac3332b8, 0x145e0004, 0x32228000, 0xc003a65, 0x0, 0x32228000,
-0x10400093, 0x0, 0xc003a65, 0x0, 0x24020002, 0x3c010001,
-0xac3332b0, 0x3c010001, 0x1000008b, 0xac2232ac, 0x24040001, 0x24050004,
-0x27b1001a, 0xc00402a, 0x2203021, 0x24040001, 0x2821, 0xc00402a,
-0x2203021, 0x3c020001, 0x551021, 0x8c425494, 0x3c040001, 0x8c8432ac,
-0x3c03bfff, 0x3463ffff, 0x3c010001, 0xac3e32b8, 0x431024, 0x3c010001,
-0x350821, 0x109e0072, 0xac225494, 0x10000072, 0x0, 0x3c02ffec,
-0x3442ffff, 0x2228824, 0x3c020008, 0x2228825, 0x131140, 0x3c010001,
-0x220821, 0xac315498, 0x3c022000, 0x2221024, 0x10400005, 0x24020001,
-0x3c010001, 0xac2233c8, 0x10000004, 0x3c024000, 0x3c010001, 0xac2033c8,
-0x3c024000, 0x2221024, 0x1440001a, 0x0, 0x3c020001, 0x8c4233c8,
-0x10400005, 0x24022020, 0x3c010001, 0xac2233cc, 0x24020001, 0xaee279c8,
-0x3c04bfff, 0x131940, 0x3c020001, 0x431021, 0x8c425490, 0x3c050001,
-0x8ca532ac, 0x3484ffff, 0x441024, 0x3c010001, 0x230821, 0xac225490,
-0x24020001, 0x10a20044, 0x0, 0x10000040, 0x0, 0x3c020001,
-0x8c4233c8, 0x1040001c, 0x24022000, 0x3c010001, 0xac2233cc, 0x3c0300a0,
-0x2231024, 0x14430005, 0x131140, 0x3402a000, 0x3c010001, 0x1000002d,
-0xac2233cc, 0x3c030001, 0x621821, 0x8c635498, 0x3c020020, 0x621024,
-0x10400004, 0x24022001, 0x3c010001, 0x10000023, 0xac2233cc, 0x3c020080,
-0x621024, 0x1040001f, 0x3402a001, 0x3c010001, 0x1000001c, 0xac2233cc,
-0x3c020020, 0x2221024, 0x10400007, 0x131940, 0x24020100, 0x3c010001,
-0x230821, 0xac2254a4, 0x10000006, 0x3c020080, 0x131140, 0x3c010001,
-0x220821, 0xac2054a4, 0x3c020080, 0x2221024, 0x10400006, 0x131940,
-0x3c020001, 0x3c010001, 0x230821, 0x10000005, 0xac2254ac, 0x131140,
-0x3c010001, 0x220821, 0xac2054ac, 0x3c030001, 0x8c6332ac, 0x24020001,
-0x10620003, 0x0, 0xc003a65, 0x0, 0x8fbf0030, 0x8fbe002c,
-0x8fb50028, 0x8fb30024, 0x8fb10020, 0x3e00008, 0x27bd0038, 0x27bdffc8,
-0xafb50028, 0xa821, 0xafbe002c, 0xf021, 0xafb30024, 0x9821,
-0x24020002, 0xafbf0030, 0xafb10020, 0xafa4001c, 0xa7a00012, 0x10a2006a,
-0xa7a00010, 0x2ca20003, 0x10400005, 0x24020001, 0x10a2000a, 0x3c024000,
-0x100000ad, 0x2601021, 0x24020004, 0x10a20060, 0x24020008, 0x10a2005e,
-0x2601021, 0x100000a6, 0x0, 0x8fa7001c, 0x78940, 0x3c030001,
-0x711821, 0x8c63549c, 0x621024, 0x14400009, 0x24040001, 0x3c027fff,
-0x3442ffff, 0x629824, 0x3c010001, 0x310821, 0xac335494, 0x10000096,
-0x2601021, 0x24050001, 0xc003fe8, 0x27a60010, 0x24040001, 0x24050001,
-0xc003fe8, 0x27a60010, 0x97a20010, 0x30420004, 0x10400034, 0x3c134000,
-0x3c030001, 0x8c6333dc, 0x24020003, 0x10620008, 0x2c620004, 0x14400029,
-0x3c028000, 0x24020004, 0x10620014, 0x24040001, 0x10000024, 0x3c028000,
-0x24040001, 0x24050011, 0x27b10012, 0xc003fe8, 0x2203021, 0x24040001,
-0x24050011, 0xc003fe8, 0x2203021, 0x97a30012, 0x30624000, 0x10400002,
-0x3c1e0010, 0x3c1e0008, 0x3c150001, 0x10000010, 0x30628000, 0x24050014,
-0x27b10012, 0xc003fe8, 0x2203021, 0x24040001, 0x24050014, 0xc003fe8,
-0x2203021, 0x97a30012, 0x30621000, 0x10400002, 0x3c1e0010, 0x3c1e0008,
-0x3c150001, 0x30620800, 0x54400001, 0x3c150002, 0x3c028000, 0x2621025,
-0x2be1825, 0x10000007, 0x439825, 0x3c130001, 0x2719821, 0x8e73549c,
-0x3c027fff, 0x3442ffff, 0x2629824, 0x8fa7001c, 0x71140, 0x3c010001,
-0x220821, 0xac335494, 0x1000004b, 0x2601021, 0x8fa7001c, 0x72140,
-0x3c030001, 0x641821, 0x8c635498, 0x3c024000, 0x621024, 0x14400008,
-0x3c027fff, 0x3442ffff, 0x629824, 0x3c010001, 0x240821, 0xac335490,
-0x1000003b, 0x2601021, 0x3c020001, 0x8c4232bc, 0x1040002e, 0x3c13c00c,
-0x3c020001, 0x8c4233c8, 0x3c03e00c, 0x3c010001, 0x240821, 0x8c2454a4,
-0x2102b, 0x21023, 0x431024, 0x10800004, 0x539825, 0x3c020020,
-0x10000004, 0x2629825, 0x3c02ffdf, 0x3442ffff, 0x2629824, 0x8fa7001c,
-0x71140, 0x3c010001, 0x220821, 0x8c2254ac, 0x10400003, 0x3c020080,
-0x10000004, 0x2629825, 0x3c02ff7f, 0x3442ffff, 0x2629824, 0x3c020001,
-0x8c423320, 0x10400002, 0x3c020800, 0x2629825, 0x3c020001, 0x8c423324,
-0x10400002, 0x3c020400, 0x2629825, 0x3c020001, 0x8c423328, 0x10400006,
-0x3c020100, 0x10000004, 0x2629825, 0x3c027fff, 0x3442ffff, 0x629824,
-0x8fa7001c, 0x71140, 0x3c010001, 0x220821, 0xac335490, 0x2601021,
-0x8fbf0030, 0x8fbe002c, 0x8fb50028, 0x8fb30024, 0x8fb10020, 0x3e00008,
-0x27bd0038, 0x27bdffe0, 0xafb50018, 0x80a821, 0xafbf001c, 0xafb30014,
-0xafb10010, 0x8f840200, 0x3c030001, 0x8c6332ac, 0x8f860220, 0x24020002,
-0x106200a3, 0x2c620003, 0x10400005, 0x24020001, 0x1062000a, 0x151940,
-0x1000009d, 0x0, 0x24020004, 0x10620053, 0x24020008, 0x10620052,
-0x159940, 0x10000096, 0x0, 0x3c050001, 0xa32821, 0x8ca5549c,
-0x3c110001, 0x2238821, 0x8e315494, 0x3c024000, 0xa21024, 0x10400038,
-0x3c020008, 0x2221024, 0x10400020, 0x34840002, 0x3c020001, 0x431021,
-0x8c4254a0, 0x10400005, 0x34840020, 0x34840100, 0x3c020020, 0x10000006,
-0x2228825, 0x2402feff, 0x822024, 0x3c02ffdf, 0x3442ffff, 0x2228824,
-0x151140, 0x3c010001, 0x220821, 0x8c2254a8, 0x10400005, 0x3c020001,
-0xc23025, 0x3c020080, 0x10000016, 0x2228825, 0x3c02fffe, 0x3442ffff,
-0xc23024, 0x3c02ff7f, 0x3442ffff, 0x1000000f, 0x2228824, 0x2402fedf,
-0x822024, 0x3c02fffe, 0x3442ffff, 0xc23024, 0x3c02ff5f, 0x3442ffff,
-0x2228824, 0x3c010001, 0x230821, 0xac2054a0, 0x3c010001, 0x230821,
-0xac2054a8, 0xaf840200, 0xaf860220, 0x8f820220, 0x34420002, 0xaf820220,
-0x1000000a, 0x151140, 0x3c02bfff, 0x3442ffff, 0x8f830200, 0x2228824,
-0x2402fffd, 0x621824, 0xc003a65, 0xaf830200, 0x151140, 0x3c010001,
-0x220821, 0x10000048, 0xac315494, 0x159940, 0x3c050001, 0xb32821,
-0x8ca55498, 0x3c110001, 0x2338821, 0x8e315490, 0x3c024000, 0xa21024,
-0x14400010, 0x0, 0x3c020001, 0x8c4233c8, 0x14400005, 0x3c02bfff,
-0x8f820200, 0x34420002, 0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc003a65,
-0x2228824, 0x3c010001, 0x330821, 0x1000002e, 0xac315490, 0x3c020001,
-0x8c4233c8, 0x14400027, 0x151140, 0x3c020020, 0xa21024, 0x10400007,
-0x34840020, 0x24020100, 0x3c010001, 0x330821, 0xac2254a4, 0x10000006,
-0x34840100, 0x3c010001, 0x330821, 0xac2054a4, 0x2402feff, 0x822024,
-0x3c020080, 0xa21024, 0x10400007, 0x151940, 0x3c020001, 0x3c010001,
-0x230821, 0xac2254ac, 0x10000008, 0xc23025, 0x151140, 0x3c010001,
-0x220821, 0xac2054ac, 0x3c02fffe, 0x3442ffff, 0xc23024, 0xaf840200,
-0xaf860220, 0x8f820220, 0x34420002, 0xaf820220, 0x151140, 0x3c010001,
-0x220821, 0xac315490, 0x8fbf001c, 0x8fb50018, 0x8fb30014, 0x8fb10010,
-0x3e00008, 0x27bd0020, 0x0, 0x0, 0x1821, 0x308400ff,
-0x2405ffdf, 0x2406ffbf, 0x641007, 0x30420001, 0x10400004, 0x0,
-0x8f820044, 0x10000003, 0x34420040, 0x8f820044, 0x461024, 0xaf820044,
-0x8f820044, 0x34420020, 0xaf820044, 0x8f820044, 0x451024, 0xaf820044,
-0x24630001, 0x28620008, 0x5440ffee, 0x641007, 0x3e00008, 0x0,
-0x0, 0x0, 0x0 };
-u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] = {
+0x0, 0x3e00008, 0x0, 0x8f820044, 0x3c03fff0, 0x3463ffff,
+0x431024, 0xaf820044, 0x8f820044, 0x3c030001, 0x431025, 0xaf820044,
+0x8f830054, 0x8f820054, 0x10000002, 0x24630001, 0x8f820054, 0x621023,
+0x2c420002, 0x1440fffc, 0x0, 0x8f820044, 0x3c03fffe, 0x3463ffff,
+0x431024, 0xaf820044, 0x8f830054, 0x8f820054, 0x10000002, 0x24630001,
+0x8f820054, 0x621023, 0x2c420002, 0x1440fffc, 0x0, 0x3e00008,
+0x0, 0x0, 0x27bdffe8, 0xafbf0010, 0x8ee379c8, 0x24020008,
+0x146201ca, 0x0, 0x3c020001, 0x8c423528, 0x14400005, 0x0,
+0xc003ab1, 0x8f840224, 0x100001c2, 0x0, 0x8f820220, 0x3c030008,
+0x431024, 0x10400026, 0x24020001, 0x8f840224, 0x8f820220, 0x3c030400,
+0x431024, 0x10400006, 0x0, 0x3c010001, 0xac2055a0, 0x3c010001,
+0x1000000b, 0xac2055c0, 0x3c030001, 0x246355a0, 0x8c620000, 0x24420001,
+0xac620000, 0x2c420002, 0x14400003, 0x24020001, 0x3c010001, 0xac2255c0,
+0x3c020001, 0x8c4255c0, 0x10400006, 0x30820040, 0x10400004, 0x24020001,
+0x3c010001, 0x10000003, 0xac2255c4, 0x3c010001, 0xac2055c4, 0x3c010001,
+0xac24559c, 0x3c010001, 0x1000000b, 0xac2055d0, 0x3c010001, 0xac2255d0,
+0x3c010001, 0xac2055c0, 0x3c010001, 0xac2055a0, 0x3c010001, 0xac2055c4,
+0x3c010001, 0xac20559c, 0x3c030001, 0x8c635590, 0x3c020001, 0x8c425594,
+0x50620004, 0x2463ffff, 0x3c010001, 0xac235594, 0x2463ffff, 0x2c62000e,
+0x1040017e, 0x31080, 0x3c010001, 0x220821, 0x8c2232b0, 0x400008,
+0x0, 0x3c02fdff, 0x3442ffff, 0x282a024, 0x24020002, 0x3c010001,
+0xac2055c0, 0x3c010001, 0xac2055a0, 0x3c010001, 0xac2055d0, 0x3c010001,
+0xac20559c, 0x3c010001, 0xac2055c4, 0x3c010001, 0xac2055b8, 0x3c010001,
+0xac2055b0, 0xaf800224, 0x3c010001, 0xac225590, 0xc003ab1, 0x0,
+0xaf800204, 0x8f820200, 0x2403fffd, 0x431024, 0xaf820200, 0x3c010001,
+0xac2055e0, 0x8f830054, 0x3c020001, 0x8c4255b8, 0x24040001, 0x3c010001,
+0xac2455cc, 0x24420001, 0x3c010001, 0xac2255b8, 0x2c420004, 0x3c010001,
+0xac2355b4, 0x14400006, 0x24020003, 0x3c010001, 0xac243410, 0x3c010001,
+0x10000148, 0xac2055b8, 0x3c010001, 0x10000145, 0xac225590, 0x8f830054,
+0x3c020001, 0x8c4255b4, 0x2463d8f0, 0x431023, 0x2c422710, 0x1440013d,
+0x24020004, 0x3c010001, 0x1000013a, 0xac225590, 0x3c040001, 0x8c84352c,
+0x3c010001, 0xc00464e, 0xac2055a8, 0x3c020001, 0x8c4255dc, 0xaf820204,
+0x8f820204, 0x30420030, 0x14400125, 0x24020002, 0x3c030001, 0x8c6355dc,
+0x24020005, 0x3c010001, 0xac225590, 0x3c010001, 0x10000126, 0xac2355e0,
+0x3c020001, 0x8c4255c0, 0x10400122, 0x0, 0x3c020001, 0x8c42559c,
+0x1040011e, 0x0, 0x3c010001, 0xac2255c8, 0x24020003, 0x3c010001,
+0xac2255a0, 0x100000c1, 0x24020006, 0x3c010001, 0xac2055a8, 0x8f820204,
+0x34420040, 0xaf820204, 0x3c020001, 0x8c4255e0, 0x24030007, 0x3c010001,
+0xac235590, 0x34420040, 0x3c010001, 0xac2255e0, 0x3c020001, 0x8c4255c0,
+0x10400005, 0x0, 0x3c020001, 0x8c42559c, 0x104000f9, 0x24020002,
+0x3c050001, 0x24a555a0, 0x8ca20000, 0x2c424e21, 0x104000f3, 0x24020002,
+0x3c020001, 0x8c4255c4, 0x104000f8, 0x2404ffbf, 0x3c020001, 0x8c42559c,
+0x3c030001, 0x8c6355c8, 0x441024, 0x641824, 0x14430007, 0x24020001,
+0x24020003, 0xaca20000, 0x24020008, 0x3c010001, 0x100000ea, 0xac225590,
+0x3c010001, 0x100000e7, 0xac225590, 0x3c020001, 0x8c4255cc, 0x1040000c,
+0x24020001, 0x3c040001, 0xc00465b, 0x8c84559c, 0x3c020001, 0x8c4255e8,
+0x14400005, 0x24020001, 0x3c020001, 0x8c4255e4, 0x10400006, 0x24020001,
+0x3c010001, 0xac223410, 0x3c010001, 0x100000d3, 0xac2055b8, 0x8f820204,
+0x34420040, 0xaf820204, 0x3c020001, 0x8c4255e0, 0x3c030001, 0x8c6355b0,
+0x34420040, 0x3c010001, 0xac2255e0, 0x3c020001, 0x8c42559c, 0x2c630001,
+0x318c0, 0x3c010001, 0xac2355b0, 0x30420008, 0x3c010001, 0xac2255ac,
+0x8f830054, 0x24020009, 0x3c010001, 0xac225590, 0x3c010001, 0x100000b9,
+0xac2355b4, 0x8f830054, 0x3c020001, 0x8c4255b4, 0x2463d8f0, 0x431023,
+0x2c422710, 0x1440009f, 0x0, 0x3c020001, 0x8c4255c0, 0x10400005,
+0x0, 0x3c020001, 0x8c42559c, 0x104000a0, 0x24020002, 0x3c030001,
+0x246355a0, 0x8c620000, 0x2c424e21, 0x1040009a, 0x24020002, 0x3c020001,
+0x8c4255cc, 0x1040000e, 0x0, 0x3c020001, 0x8c42559c, 0x3c010001,
+0xac2055cc, 0x30420080, 0x1040002f, 0x2402000c, 0x8f820204, 0x30420080,
+0x1440000c, 0x24020003, 0x10000029, 0x2402000c, 0x3c020001, 0x8c42559c,
+0x30420080, 0x14400005, 0x24020003, 0x8f820204, 0x30420080, 0x1040001f,
+0x24020003, 0xac620000, 0x2402000a, 0x3c010001, 0xac225590, 0x3c040001,
+0x248455d8, 0x8c820000, 0x3c030001, 0x8c6355b0, 0x431025, 0xaf820204,
+0x8c830000, 0x3c040001, 0x8c8455b0, 0x2402000b, 0x3c010001, 0xac225590,
+0x641825, 0x3c010001, 0xac2355e0, 0x3c050001, 0x24a555a0, 0x8ca20000,
+0x2c424e21, 0x10400066, 0x24020002, 0x3c020001, 0x8c4255d0, 0x10400005,
+0x0, 0x2402000c, 0x3c010001, 0x10000067, 0xac225590, 0x3c020001,
+0x8c4255c0, 0x10400063, 0x0, 0x3c040001, 0x8c84559c, 0x10800055,
+0x30820008, 0x3c030001, 0x8c6355ac, 0x1062005b, 0x24020003, 0x3c010001,
+0xac2455c8, 0xaca20000, 0x24020006, 0x3c010001, 0x10000054, 0xac225590,
+0x8f820200, 0x34420002, 0xaf820200, 0x8f830054, 0x2402000d, 0x3c010001,
+0xac225590, 0x3c010001, 0xac2355b4, 0x8f830054, 0x3c020001, 0x8c4255b4,
+0x2463d8f0, 0x431023, 0x2c422710, 0x14400031, 0x0, 0x3c020001,
+0x8c4255d0, 0x10400020, 0x2402000e, 0x3c030001, 0x8c6355e4, 0x3c010001,
+0x14600015, 0xac225590, 0xc003b6a, 0x0, 0x3c050001, 0x8ca5340c,
+0xc0047d1, 0x24040001, 0x3c030001, 0x8c63340c, 0x24020004, 0x14620005,
+0x2403fffb, 0x3c020001, 0x8c423408, 0x10000003, 0x2403fff7, 0x3c020001,
+0x8c423408, 0x431024, 0x3c010001, 0xac223408, 0x8f830224, 0x3c020200,
+0x3c010001, 0xac2355ec, 0x10000020, 0x282a025, 0x3c020001, 0x8c4255c0,
+0x10400005, 0x0, 0x3c020001, 0x8c42559c, 0x1040000f, 0x24020002,
+0x3c020001, 0x8c4255a0, 0x2c424e21, 0x1040000a, 0x24020002, 0x3c020001,
+0x8c4255c0, 0x1040000f, 0x0, 0x3c020001, 0x8c42559c, 0x1440000b,
+0x0, 0x24020002, 0x3c010001, 0x10000007, 0xac225590, 0x3c020001,
+0x8c4255c0, 0x10400003, 0x0, 0xc003ab1, 0x0, 0x8f820220,
+0x3c03f700, 0x431025, 0xaf820220, 0x8fbf0010, 0x3e00008, 0x27bd0018,
+0x3c030001, 0x246355e8, 0x8c620000, 0x10400005, 0x34422000, 0x3c010001,
+0xac2255dc, 0x10000003, 0xac600000, 0x3c010001, 0xac2455dc, 0x3e00008,
+0x0, 0x27bdffe0, 0x30820030, 0xafbf0018, 0x3c010001, 0xac2255e4,
+0x14400067, 0x3c02ffff, 0x34421f0e, 0x821024, 0x14400061, 0x24020030,
+0x30822000, 0x1040005d, 0x30838000, 0x31a02, 0x30820001, 0x21200,
+0x3c040001, 0x8c84352c, 0x621825, 0x331c2, 0x3c030001, 0x2463348c,
+0x30828000, 0x21202, 0x30840001, 0x42200, 0x441025, 0x239c2,
+0x61080, 0x431021, 0x471021, 0x90430000, 0x24020001, 0x10620025,
+0x0, 0x10600007, 0x24020002, 0x10620013, 0x24020003, 0x1062002c,
+0x3c05000f, 0x10000037, 0x0, 0x8f820200, 0x2403feff, 0x431024,
+0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024, 0xaf820220,
+0x3c010001, 0xac205624, 0x3c010001, 0x10000034, 0xac20562c, 0x8f820200,
+0x34420100, 0xaf820200, 0x8f820220, 0x3c03fffe, 0x3463ffff, 0x431024,
+0xaf820220, 0x24020100, 0x3c010001, 0xac225624, 0x3c010001, 0x10000026,
+0xac20562c, 0x8f820200, 0x2403feff, 0x431024, 0xaf820200, 0x8f820220,
+0x3c030001, 0x431025, 0xaf820220, 0x3c010001, 0xac205624, 0x3c010001,
+0x10000019, 0xac23562c, 0x8f820200, 0x34420100, 0xaf820200, 0x8f820220,
+0x3c030001, 0x431025, 0xaf820220, 0x24020100, 0x3c010001, 0xac225624,
+0x3c010001, 0x1000000c, 0xac23562c, 0x34a5ffff, 0x3c040001, 0x248432e8,
+0xafa30010, 0xc00290f, 0xafa00014, 0x10000004, 0x0, 0x24020030,
+0x3c010001, 0xac2255e8, 0x8fbf0018, 0x3e00008, 0x27bd0020, 0x0,
+0x27bdffc8, 0xafb30024, 0x809821, 0xafbe002c, 0xa0f021, 0xafb10020,
+0xc08821, 0x3c040001, 0x24843300, 0x3c050009, 0x3c020001, 0x8c42340c,
+0x34a59001, 0x2603021, 0x3c03821, 0xafbf0030, 0xafb50028, 0xa7a0001a,
+0xafb10014, 0xc00290f, 0xafa20010, 0x24020002, 0x13c200e7, 0x2fc20003,
+0x10400005, 0x24020001, 0x13c2000a, 0x3c02fffb, 0x100000e1, 0x0,
+0x24020004, 0x13c2006d, 0x24020008, 0x13c2006c, 0x3c02ffec, 0x100000da,
+0x0, 0x3442ffff, 0x2228824, 0x13a940, 0x3c010001, 0x350821,
+0xac3155fc, 0x3c024000, 0x2221024, 0x10400046, 0x1123c2, 0x30840030,
+0x111382, 0x3042000c, 0x3c030001, 0x24633434, 0x431021, 0x823821,
+0x3c020020, 0x2221024, 0x10400006, 0x24020100, 0x3c010001, 0x350821,
+0xac225600, 0x10000005, 0x3c020080, 0x3c010001, 0x350821, 0xac205600,
+0x3c020080, 0x2221024, 0x10400006, 0x131940, 0x3c020001, 0x3c010001,
+0x230821, 0x10000005, 0xac225608, 0x131140, 0x3c010001, 0x220821,
+0xac205608, 0x94e30000, 0x32224000, 0x10400003, 0xa7a30018, 0x34624000,
+0xa7a20018, 0x24040001, 0x94e20002, 0x24050004, 0x24e60002, 0x34420001,
+0xc004076, 0xa4e20002, 0x24040001, 0x2821, 0xc004076, 0x27a60018,
+0x3c020001, 0x8c42340c, 0x24130001, 0x3c010001, 0xac333418, 0x145e0004,
+0x32228000, 0xc003ab1, 0x0, 0x32228000, 0x10400093, 0x0,
+0xc003ab1, 0x0, 0x24020002, 0x3c010001, 0xac333410, 0x3c010001,
+0x1000008b, 0xac22340c, 0x24040001, 0x24050004, 0x27b1001a, 0xc004076,
+0x2203021, 0x24040001, 0x2821, 0xc004076, 0x2203021, 0x3c020001,
+0x551021, 0x8c4255f4, 0x3c040001, 0x8c84340c, 0x3c03bfff, 0x3463ffff,
+0x3c010001, 0xac3e3418, 0x431024, 0x3c010001, 0x350821, 0x109e0072,
+0xac2255f4, 0x10000072, 0x0, 0x3c02ffec, 0x3442ffff, 0x2228824,
+0x3c020008, 0x2228825, 0x131140, 0x3c010001, 0x220821, 0xac3155f8,
+0x3c022000, 0x2221024, 0x10400005, 0x24020001, 0x3c010001, 0xac223528,
+0x10000004, 0x3c024000, 0x3c010001, 0xac203528, 0x3c024000, 0x2221024,
+0x1440001a, 0x0, 0x3c020001, 0x8c423528, 0x10400005, 0x24022020,
+0x3c010001, 0xac22352c, 0x24020001, 0xaee279c8, 0x3c04bfff, 0x131940,
+0x3c020001, 0x431021, 0x8c4255f0, 0x3c050001, 0x8ca5340c, 0x3484ffff,
+0x441024, 0x3c010001, 0x230821, 0xac2255f0, 0x24020001, 0x10a20044,
+0x0, 0x10000040, 0x0, 0x3c020001, 0x8c423528, 0x1040001c,
+0x24022000, 0x3c010001, 0xac22352c, 0x3c0300a0, 0x2231024, 0x14430005,
+0x131140, 0x3402a000, 0x3c010001, 0x1000002d, 0xac22352c, 0x3c030001,
+0x621821, 0x8c6355f8, 0x3c020020, 0x621024, 0x10400004, 0x24022001,
+0x3c010001, 0x10000023, 0xac22352c, 0x3c020080, 0x621024, 0x1040001f,
+0x3402a001, 0x3c010001, 0x1000001c, 0xac22352c, 0x3c020020, 0x2221024,
+0x10400007, 0x131940, 0x24020100, 0x3c010001, 0x230821, 0xac225604,
+0x10000006, 0x3c020080, 0x131140, 0x3c010001, 0x220821, 0xac205604,
+0x3c020080, 0x2221024, 0x10400006, 0x131940, 0x3c020001, 0x3c010001,
+0x230821, 0x10000005, 0xac22560c, 0x131140, 0x3c010001, 0x220821,
+0xac20560c, 0x3c030001, 0x8c63340c, 0x24020001, 0x10620003, 0x0,
+0xc003ab1, 0x0, 0x8fbf0030, 0x8fbe002c, 0x8fb50028, 0x8fb30024,
+0x8fb10020, 0x3e00008, 0x27bd0038, 0x27bdffc8, 0xafb50028, 0xa821,
+0xafbe002c, 0xf021, 0xafb30024, 0x9821, 0x24020002, 0xafbf0030,
+0xafb10020, 0xafa4001c, 0xa7a00012, 0x10a2006a, 0xa7a00010, 0x2ca20003,
+0x10400005, 0x24020001, 0x10a2000a, 0x3c024000, 0x100000ad, 0x2601021,
+0x24020004, 0x10a20060, 0x24020008, 0x10a2005e, 0x2601021, 0x100000a6,
+0x0, 0x8fa7001c, 0x78940, 0x3c030001, 0x711821, 0x8c6355fc,
+0x621024, 0x14400009, 0x24040001, 0x3c027fff, 0x3442ffff, 0x629824,
+0x3c010001, 0x310821, 0xac3355f4, 0x10000096, 0x2601021, 0x24050001,
+0xc004034, 0x27a60010, 0x24040001, 0x24050001, 0xc004034, 0x27a60010,
+0x97a20010, 0x30420004, 0x10400034, 0x3c134000, 0x3c030001, 0x8c63353c,
+0x24020003, 0x10620008, 0x2c620004, 0x14400029, 0x3c028000, 0x24020004,
+0x10620014, 0x24040001, 0x10000024, 0x3c028000, 0x24040001, 0x24050011,
+0x27b10012, 0xc004034, 0x2203021, 0x24040001, 0x24050011, 0xc004034,
+0x2203021, 0x97a30012, 0x30624000, 0x10400002, 0x3c1e0010, 0x3c1e0008,
+0x3c150001, 0x10000010, 0x30628000, 0x24050014, 0x27b10012, 0xc004034,
+0x2203021, 0x24040001, 0x24050014, 0xc004034, 0x2203021, 0x97a30012,
+0x30621000, 0x10400002, 0x3c1e0010, 0x3c1e0008, 0x3c150001, 0x30620800,
+0x54400001, 0x3c150002, 0x3c028000, 0x2621025, 0x2be1825, 0x10000007,
+0x439825, 0x3c130001, 0x2719821, 0x8e7355fc, 0x3c027fff, 0x3442ffff,
+0x2629824, 0x8fa7001c, 0x71140, 0x3c010001, 0x220821, 0xac3355f4,
+0x1000004b, 0x2601021, 0x8fa7001c, 0x72140, 0x3c030001, 0x641821,
+0x8c6355f8, 0x3c024000, 0x621024, 0x14400008, 0x3c027fff, 0x3442ffff,
+0x629824, 0x3c010001, 0x240821, 0xac3355f0, 0x1000003b, 0x2601021,
+0x3c020001, 0x8c42341c, 0x1040002e, 0x3c13c00c, 0x3c020001, 0x8c423528,
+0x3c03e00c, 0x3c010001, 0x240821, 0x8c245604, 0x2102b, 0x21023,
+0x431024, 0x10800004, 0x539825, 0x3c020020, 0x10000004, 0x2629825,
+0x3c02ffdf, 0x3442ffff, 0x2629824, 0x8fa7001c, 0x71140, 0x3c010001,
+0x220821, 0x8c22560c, 0x10400003, 0x3c020080, 0x10000004, 0x2629825,
+0x3c02ff7f, 0x3442ffff, 0x2629824, 0x3c020001, 0x8c423480, 0x10400002,
+0x3c020800, 0x2629825, 0x3c020001, 0x8c423484, 0x10400002, 0x3c020400,
+0x2629825, 0x3c020001, 0x8c423488, 0x10400006, 0x3c020100, 0x10000004,
+0x2629825, 0x3c027fff, 0x3442ffff, 0x629824, 0x8fa7001c, 0x71140,
+0x3c010001, 0x220821, 0xac3355f0, 0x2601021, 0x8fbf0030, 0x8fbe002c,
+0x8fb50028, 0x8fb30024, 0x8fb10020, 0x3e00008, 0x27bd0038, 0x27bdffe0,
+0xafb50018, 0x80a821, 0xafbf001c, 0xafb30014, 0xafb10010, 0x8f840200,
+0x3c030001, 0x8c63340c, 0x8f860220, 0x24020002, 0x106200a3, 0x2c620003,
+0x10400005, 0x24020001, 0x1062000a, 0x151940, 0x1000009d, 0x0,
+0x24020004, 0x10620053, 0x24020008, 0x10620052, 0x159940, 0x10000096,
+0x0, 0x3c050001, 0xa32821, 0x8ca555fc, 0x3c110001, 0x2238821,
+0x8e3155f4, 0x3c024000, 0xa21024, 0x10400038, 0x3c020008, 0x2221024,
+0x10400020, 0x34840002, 0x3c020001, 0x431021, 0x8c425600, 0x10400005,
+0x34840020, 0x34840100, 0x3c020020, 0x10000006, 0x2228825, 0x2402feff,
+0x822024, 0x3c02ffdf, 0x3442ffff, 0x2228824, 0x151140, 0x3c010001,
+0x220821, 0x8c225608, 0x10400005, 0x3c020001, 0xc23025, 0x3c020080,
+0x10000016, 0x2228825, 0x3c02fffe, 0x3442ffff, 0xc23024, 0x3c02ff7f,
+0x3442ffff, 0x1000000f, 0x2228824, 0x2402fedf, 0x822024, 0x3c02fffe,
+0x3442ffff, 0xc23024, 0x3c02ff5f, 0x3442ffff, 0x2228824, 0x3c010001,
+0x230821, 0xac205600, 0x3c010001, 0x230821, 0xac205608, 0xaf840200,
+0xaf860220, 0x8f820220, 0x34420002, 0xaf820220, 0x1000000a, 0x151140,
+0x3c02bfff, 0x3442ffff, 0x8f830200, 0x2228824, 0x2402fffd, 0x621824,
+0xc003ab1, 0xaf830200, 0x151140, 0x3c010001, 0x220821, 0x10000048,
+0xac3155f4, 0x159940, 0x3c050001, 0xb32821, 0x8ca555f8, 0x3c110001,
+0x2338821, 0x8e3155f0, 0x3c024000, 0xa21024, 0x14400010, 0x0,
+0x3c020001, 0x8c423528, 0x14400005, 0x3c02bfff, 0x8f820200, 0x34420002,
+0xaf820200, 0x3c02bfff, 0x3442ffff, 0xc003ab1, 0x2228824, 0x3c010001,
+0x330821, 0x1000002e, 0xac3155f0, 0x3c020001, 0x8c423528, 0x14400027,
+0x151140, 0x3c020020, 0xa21024, 0x10400007, 0x34840020, 0x24020100,
+0x3c010001, 0x330821, 0xac225604, 0x10000006, 0x34840100, 0x3c010001,
+0x330821, 0xac205604, 0x2402feff, 0x822024, 0x3c020080, 0xa21024,
+0x10400007, 0x151940, 0x3c020001, 0x3c010001, 0x230821, 0xac22560c,
+0x10000008, 0xc23025, 0x151140, 0x3c010001, 0x220821, 0xac20560c,
+0x3c02fffe, 0x3442ffff, 0xc23024, 0xaf840200, 0xaf860220, 0x8f820220,
+0x34420002, 0xaf820220, 0x151140, 0x3c010001, 0x220821, 0xac3155f0,
+0x8fbf001c, 0x8fb50018, 0x8fb30014, 0x8fb10010, 0x3e00008, 0x27bd0020,
+0x0, 0x0, 0x1821, 0x308400ff, 0x2405ffdf, 0x2406ffbf,
+0x641007, 0x30420001, 0x10400004, 0x0, 0x8f820044, 0x10000003,
+0x34420040, 0x8f820044, 0x461024, 0xaf820044, 0x8f820044, 0x34420020,
+0xaf820044, 0x8f820044, 0x451024, 0xaf820044, 0x24630001, 0x28620008,
+0x5440ffee, 0x641007, 0x3e00008, 0x0, 0x0, 0x0,
+0x0 };
+u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] __initdata = {
0x1, 0x1, 0x1, 0xc001fc, 0x3ffc, 0xc00000,
0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x0, 0x0,
0x416c7465, 0x6f6e2041, 0x63654e49, 0x43205600, 0x42424242, 0x0,
@@ -5373,7 +5408,7 @@ u32 tigon2FwData[(MAX_DATA_LEN/4) + 1] = {
0x12000060, 0x12000180, 0x120001e0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x30001, 0x1,
0x30201, 0x0, 0x0 };
-u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] = {
+u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] __initdata = {
0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
0x772f6765, 0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 0x66776d61,
0x696e2e63, 0x2c762031, 0x2e312e34, 0x372e3420, 0x31393938, 0x2f31302f,
@@ -5429,12 +5464,14 @@ u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] = {
0x0, 0x4d634465, 0x6c4e6f45, 0x0, 0x24486561, 0x6465723a,
0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963,
0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 0x646d612e, 0x632c7620, 0x312e312e,
-0x31322e31, 0x20313939, 0x382f3038, 0x2f303420, 0x32313a35, 0x343a3339,
+0x31322e33, 0x20313939, 0x382f3132, 0x2f303420, 0x32323a35, 0x313a3135,
0x20736875, 0x616e6720, 0x45787020, 0x24000000, 0x3f6e6f51, 0x64547845,
0x0, 0x3f6e6f51, 0x64527845, 0x0, 0x6576526e, 0x6746756c,
0x6c000000, 0x3f456e71, 0x45767400, 0x3f6e6f51, 0x64457650, 0x0,
0x6661696c, 0x456e454d, 0x0, 0x656e714d, 0x45764661, 0x696c0000,
0x656e714d, 0x45765046, 0x61696c00, 0x646d6172, 0x6441544e, 0x0,
+0x2a50414e, 0x49432a00, 0x2e2e2f2e, 0x2e2f2e2e, 0x2f2e2e2f, 0x2e2e2f73,
+0x72632f6e, 0x69632f66, 0x77322f63, 0x6f6d6d6f, 0x6e2f646d, 0x612e6300,
0x646d6177, 0x7241544e, 0x0, 0x0, 0x0, 0x0,
0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563, 0x74732f72, 0x63732f73,
0x772f6765, 0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 0x74726163,
@@ -5444,9 +5481,9 @@ u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] = {
0x772f6765, 0x2f6e6963, 0x2f667732, 0x2f636f6d, 0x6d6f6e2f, 0x64617461,
0x2e632c76, 0x20312e31, 0x2e322e34, 0x20313939, 0x382f3036, 0x2f323320,
0x30313a32, 0x393a3330, 0x20736875, 0x616e6720, 0x45787020, 0x24000000,
-0x46575f56, 0x45525349, 0x4f4e3a20, 0x23312046, 0x7269204f, 0x63742031,
-0x36203130, 0x3a31353a, 0x30362050, 0x44542031, 0x39393800, 0x46575f43,
-0x4f4d5049, 0x4c455f54, 0x494d453a, 0x2031303a, 0x31353a30, 0x36000000,
+0x46575f56, 0x45525349, 0x4f4e3a20, 0x2331204d, 0x6f6e2044, 0x65632037,
+0x2031343a, 0x35383a32, 0x34205053, 0x54203139, 0x39380000, 0x46575f43,
+0x4f4d5049, 0x4c455f54, 0x494d453a, 0x2031343a, 0x35383a32, 0x34000000,
0x46575f43, 0x4f4d5049, 0x4c455f42, 0x593a2064, 0x65767263, 0x73000000,
0x46575f43, 0x4f4d5049, 0x4c455f48, 0x4f53543a, 0x20636f6d, 0x70757465,
0x0, 0x46575f43, 0x4f4d5049, 0x4c455f44, 0x4f4d4149, 0x4e3a2065,
@@ -5469,20 +5506,20 @@ u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] = {
0x756e6b72, 0x64747970, 0x65000000, 0x3f546370, 0x436b7375, 0x6d000000,
0x0, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f667732, 0x2f636f6d,
-0x6d6f6e2f, 0x72656376, 0x2e632c76, 0x20312e31, 0x2e322e33, 0x35203139,
-0x39382f30, 0x372f3239, 0x2030303a, 0x30373a32, 0x37207368, 0x75616e67,
+0x6d6f6e2f, 0x72656376, 0x2e632c76, 0x20312e31, 0x2e34322e, 0x33203139,
+0x39382f31, 0x322f3034, 0x2030303a, 0x31303a33, 0x38207368, 0x75616e67,
0x20457870, 0x20240000, 0x3f6e6f51, 0x64547845, 0x0, 0x3f6e6f51,
0x64527845, 0x0, 0x6576526e, 0x6746756c, 0x6c000000, 0x3f456e71,
0x45767400, 0x3f6e6f51, 0x64457650, 0x0, 0x6661696c, 0x456e454d,
0x0, 0x656e714d, 0x45764661, 0x696c0000, 0x656e714d, 0x45765046,
0x61696c00, 0x66726d32, 0x4c617267, 0x65000000, 0x72784e6f, 0x52784264,
-0x0, 0x72785144, 0x6d614446, 0x0, 0x72785144, 0x6d614246,
-0x0, 0x3f724264, 0x446d6146, 0x0, 0x3f724a42, 0x64446d46,
-0x0, 0x0, 0xdabc, 0xdabc, 0xdabc, 0xdabc,
-0xdabc, 0xdabc, 0xdabc, 0xdabc, 0xdabc, 0xdabc,
-0xdabc, 0xdabc, 0xdabc, 0xdabc, 0xdabc, 0xdaac,
-0xdaac, 0xdaac, 0xdabc, 0xdabc, 0xdabc, 0xdabc,
-0xdabc, 0xdabc, 0x572d444d, 0x41456e46, 0x0, 0x0,
+0x0, 0x72785144, 0x6d447446, 0x0, 0x72785144, 0x6d614446,
+0x0, 0x72785144, 0x6d614246, 0x0, 0x3f724264, 0x446d6146,
+0x0, 0x3f724a42, 0x64446d46, 0x0, 0xdbe8, 0xdbe8,
+0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8,
+0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8,
+0xdbe8, 0xdbd8, 0xdbd8, 0xdbd8, 0xdbe8, 0xdbe8,
+0xdbe8, 0xdbe8, 0xdbe8, 0xdbe8, 0x572d444d, 0x41456e46,
0x0, 0x0, 0x24486561, 0x6465723a, 0x202f7072, 0x6f6a6563,
0x74732f72, 0x63732f73, 0x772f6765, 0x2f6e6963, 0x2f667732, 0x2f636f6d,
0x6d6f6e2f, 0x6d61632e, 0x632c7620, 0x312e312e, 0x31372e31, 0x20313939,
@@ -5503,15 +5540,15 @@ u32 tigon2FwRodata[(MAX_RODATA_LEN/4) + 1] = {
0x64457650, 0x0, 0x6661696c, 0x456e454d, 0x0, 0x656e714d,
0x45764661, 0x696c0000, 0x656e714d, 0x45765046, 0x61696c00, 0x0,
0x50726f62, 0x65506879, 0x0, 0x6c6e6b41, 0x53535254, 0x0,
-0xf81c, 0xf84c, 0xf870, 0xf89c, 0xf8c8, 0xf8dc,
-0xf918, 0xfca0, 0xf9c8, 0xfaf4, 0xfa14, 0xfb4c,
-0xfb74, 0xfba8, 0xfa58, 0xfca0, 0xfac0, 0xfaf4,
-0xfb1c, 0xfb4c, 0xfb74, 0xfba8, 0xfbe4, 0x0,
-0x0, 0x0, 0x101fc, 0x102cc, 0x103a4, 0x10474,
-0x104d0, 0x105ac, 0x105d4, 0x106b0, 0x106d8, 0x10880,
-0x108a8, 0x10a50, 0x10c48, 0x10edc, 0x10df0, 0x10edc,
-0x10f08, 0x10a78, 0x10c20, 0x0, 0x1120c, 0x11260,
-0x112dc, 0x11308, 0x11358, 0x11394, 0x113c8, 0x11454,
-0x1150c, 0x115dc, 0x1161c, 0x116a0, 0x116c4, 0x117d4,
+0xf94c, 0xf97c, 0xf9a0, 0xf9cc, 0xf9f8, 0xfa0c,
+0xfa48, 0xfdd0, 0xfaf8, 0xfc24, 0xfb44, 0xfc7c,
+0xfca4, 0xfcd8, 0xfb88, 0xfdd0, 0xfbf0, 0xfc24,
+0xfc4c, 0xfc7c, 0xfca4, 0xfcd8, 0xfd14, 0x0,
+0x0, 0x0, 0x1032c, 0x103fc, 0x104d4, 0x105a4,
+0x10600, 0x106dc, 0x10704, 0x107e0, 0x10808, 0x109b0,
+0x109d8, 0x10b80, 0x10d78, 0x1100c, 0x10f20, 0x1100c,
+0x11038, 0x10ba8, 0x10d50, 0x0, 0x1133c, 0x11390,
+0x1140c, 0x11438, 0x11488, 0x114c4, 0x114f8, 0x11584,
+0x1163c, 0x1170c, 0x1174c, 0x117d0, 0x117f4, 0x11904,
0x646f4261, 0x73655067, 0x0, 0x0, 0x0, 0x0,
0x73746d61, 0x634c4e4b, 0x0, 0x0, 0x0 };
diff --git a/drivers/net/apne.c b/drivers/net/apne.c
index d3578f5da..f4e682f4d 100644
--- a/drivers/net/apne.c
+++ b/drivers/net/apne.c
@@ -119,22 +119,26 @@ static int init_pcmcia(void);
static const char *version =
"apne.c:v1.1 7/10/98 Alain Malek (Alain.Malek@cryogen.ch)\n";
+static int apne_owned = 0; /* signal if card already owned */
__initfunc(int apne_probe(struct device *dev))
{
#ifndef MANUAL_CONFIG
char tuple[8];
#endif
+
+ if (apne_owned)
+ return -ENODEV;
if ( !(AMIGAHW_PRESENT(PCMCIA)) )
- return (ENODEV);
+ return (-ENODEV);
printk("Looking for PCMCIA ethernet card : ");
/* check if a card is inserted */
if (!(PCMCIA_INSERTED)) {
printk("NO PCMCIA card inserted\n");
- return (ENODEV);
+ return (-ENODEV);
}
/* disable pcmcia irq for readtuple */
@@ -144,7 +148,7 @@ __initfunc(int apne_probe(struct device *dev))
if ((pcmcia_copy_tuple(CISTPL_FUNCID, tuple, 8) < 3) ||
(tuple[2] != CISTPL_FUNCID_NETWORK)) {
printk("not an ethernet card\n");
- return (ENODEV);
+ return (-ENODEV);
}
#endif
@@ -153,7 +157,7 @@ __initfunc(int apne_probe(struct device *dev))
if (init_pcmcia())
return apne_probe1(dev, IOBASE+GAYLE_IO);
else
- return (ENODEV);
+ return (-ENODEV);
}
@@ -169,7 +173,7 @@ __initfunc(static int apne_probe1(struct device *dev, int ioaddr))
int neX000, ctron;
#endif
static unsigned version_printed = 0;
- static int pcmcia_offsets[16]={
+ static u32 pcmcia_offsets[16]={
0, 1+GAYLE_ODD, 2, 3+GAYLE_ODD,
4, 5+GAYLE_ODD, 6, 7+GAYLE_ODD,
8, 9+GAYLE_ODD, 0xa, 0xb+GAYLE_ODD,
@@ -197,7 +201,7 @@ __initfunc(static int apne_probe1(struct device *dev, int ioaddr))
while ((readb(ioaddr + NE_EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) {
printk(" not found (no reset ack).\n");
- return ENODEV;
+ return -ENODEV;
}
writeb(0xff, ioaddr + NE_EN0_ISR); /* Ack all intr. */
@@ -328,6 +332,8 @@ __initfunc(static int apne_probe1(struct device *dev, int ioaddr))
pcmcia_ack_int(pcmcia_get_intreq()); /* ack PCMCIA int req */
pcmcia_enable_irq();
+ apne_owned = 1;
+
return 0;
}
@@ -390,7 +396,7 @@ apne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if (ei_status.dmaing) {
printk("%s: DMAing conflict in ne_get_8390_hdr "
- "[DMAstat:%d][irqlock:%d][intr:%d].\n",
+ "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
dev->name, ei_status.dmaing, ei_status.irqlock,
dev->interrupt);
return;
@@ -439,7 +445,7 @@ apne_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_of
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if (ei_status.dmaing) {
printk("%s: DMAing conflict in ne_block_input "
- "[DMAstat:%d][irqlock:%d][intr:%d].\n",
+ "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
dev->name, ei_status.dmaing, ei_status.irqlock,
dev->interrupt);
return;
@@ -488,7 +494,7 @@ apne_block_output(struct device *dev, int count,
/* This *shouldn't* happen. If it does, it's the last thing you'll see */
if (ei_status.dmaing) {
printk("%s: DMAing conflict in ne_block_output."
- "[DMAstat:%d][irqlock:%d][intr:%d]\n",
+ "[DMAstat:%d][irqlock:%d][intr:%ld]\n",
dev->name, ei_status.dmaing, ei_status.irqlock,
dev->interrupt);
return;
@@ -577,15 +583,17 @@ int init_module(void)
void cleanup_module(void)
{
+ unregister_netdev(&apne_dev);
+
pcmcia_disable_irq();
free_irq(IRQ_AMIGA_PORTS, &apne_dev);
pcmcia_reset();
- unregister_netdev(&apne_dev);
-
unlock_8390_module();
+
+ apne_owned = 0;
}
#endif
diff --git a/drivers/net/ariadne2.c b/drivers/net/ariadne2.c
index 0b71b5987..c58a90932 100644
--- a/drivers/net/ariadne2.c
+++ b/drivers/net/ariadne2.c
@@ -33,6 +33,7 @@
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/amigaints.h>
+#include <asm/amigahw.h>
#include "8390.h"
@@ -107,7 +108,7 @@ __initfunc(static int ariadne2_init(struct device *dev, unsigned int key,
unsigned char SA_prom[32];
const char *name = NULL;
int start_page, stop_page;
- static int ariadne2_offsets[16] = {
+ static u32 ariadne2_offsets[16] = {
0x00, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e,
0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e,
};
@@ -417,7 +418,7 @@ void cleanup_module(void)
unsigned int key = ((struct ei_device *)ariadne2_dev.priv)->priv;
free_irq(IRQ_AMIGA_PORTS, &ariadne2_dev);
unregister_netdev(&ariadne2_dev);
- zorro_config_board(key, 0);
+ zorro_unconfig_board(key, 0);
unlock_8390_module();
}
diff --git a/drivers/net/at1700.c b/drivers/net/at1700.c
index 77641a0f4..9ba40dd13 100644
--- a/drivers/net/at1700.c
+++ b/drivers/net/at1700.c
@@ -12,8 +12,12 @@
Center of Excellence in Space Data and Information Sciences
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
- This is a device driver for the Allied Telesis AT1700, which is a
- straight-forward Fujitsu MB86965 implementation.
+ This is a device driver for the Allied Telesis AT1700, and
+ Fujitsu FMV-181/182/181A/182A/183/184/183A/184A, which are
+ straight-forward Fujitsu MB86965 implementations.
+
+ Modification for Fujitsu FMV-18X cards is done by Yutaka Tamiya
+ (tamy@flab.fujitsu.co.jp).
Sources:
The Fujitsu MB86965 datasheet.
@@ -81,7 +85,7 @@ static int at1700_probe_list[] = {
/*
* MCA
*/
-
+#ifdef CONFIG_MCA
static int at1700_ioaddr_pattern[] = {
0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07
};
@@ -94,6 +98,7 @@ static int at1700_irq_pattern[] = {
0x00, 0x00, 0x00, 0x30, 0x70, 0xb0, 0x00, 0x00,
0x00, 0xf0, 0x34, 0x74, 0xb4, 0x00, 0x00, 0xf4, 0x00
};
+#endif
/* use 0 for production, 1 for verification, >2 for debug */
#ifndef NET_DEBUG
@@ -109,6 +114,8 @@ struct net_local {
unsigned char mc_filter[8];
uint jumpered:1; /* Set iff the board has jumper config. */
uint tx_started:1; /* Packets are on the Tx queue. */
+ uint tx_queue_ready:1; /* Tx queue is ready to be sent. */
+ uint rx_started:1; /* Packets are Rxing. */
uint invalid_irq:1;
uchar tx_queue; /* Number of packet on the Tx queue. */
char mca_slot; /* -1 means ISA */
@@ -129,10 +136,13 @@ struct net_local {
/* Run-time register bank 2 definitions. */
#define DATAPORT 8 /* Word-wide DMA or programmed-I/O dataport. */
#define TX_START 10
+#define COL16CNTL 11 /* Controll Reg for 16 collisions */
#define MODE13 13
/* Configuration registers only on the '865A/B chips. */
#define EEPROM_Ctrl 16
#define EEPROM_Data 17
+#define CARDSTATUS 16 /* FMV-18x Card Status */
+#define CARDSTATUS1 17 /* FMV-18x Card Status */
#define IOCONFIG 18 /* Either read the jumper, or move the I/O. */
#define IOCONFIG1 19
#define SAPROM 20 /* The station address PROM, if no EEPROM. */
@@ -214,9 +224,9 @@ int at1700_probe(struct device *dev)
int at1700_probe1(struct device *dev, int ioaddr)
{
char fmv_irqmap[4] = {3, 7, 10, 15};
+ char fmv_irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
char at1700_irqmap[8] = {3, 4, 5, 9, 10, 11, 14, 15};
unsigned int i, irq, is_fmv18x = 0, is_at1700 = 0;
- int l_i;
int slot;
/* Resetting the chip doesn't reset the ISA interface, so don't bother.
@@ -238,16 +248,17 @@ int at1700_probe1(struct device *dev, int ioaddr)
/* redone for multi-card detection by ZP Gu (zpg@castle.net) */
/* now works as a module */
- if( MCA_bus ) {
+ if (MCA_bus) {
int j;
+ int l_i;
u_char pos3, pos4;
- for( j = 0; at1720_mca_adapters[j].name != NULL; j ++ ) {
+ for (j = 0; at1720_mca_adapters[j].name != NULL; j ++) {
slot = 0;
- while( slot != MCA_NOTFOUND ) {
+ while (slot != MCA_NOTFOUND) {
slot = mca_find_unused_adapter( at1720_mca_adapters[j].id, slot );
- if( slot == MCA_NOTFOUND ) break;
+ if (slot == MCA_NOTFOUND) break;
/* if we get this far, an adapter has been detected and is
enabled */
@@ -292,15 +303,16 @@ int at1700_probe1(struct device *dev, int ioaddr)
&& read_eeprom(ioaddr, 4) == 0x0000
&& (read_eeprom(ioaddr, 5) & 0xff00) == 0xF400)
is_at1700 = 1;
- else if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] == ioaddr
- && inb(ioaddr + SAPROM ) == 0x00
+ else if (inb(ioaddr + SAPROM ) == 0x00
&& inb(ioaddr + SAPROM + 1) == 0x00
&& inb(ioaddr + SAPROM + 2) == 0x0e)
is_fmv18x = 1;
else
return -ENODEV;
+#ifdef CONFIG_MCA
found:
+#endif
/* Reset the internal state machines. */
outb(0, ioaddr + RESET);
@@ -312,24 +324,46 @@ found:
if (is_at1700)
irq = at1700_irqmap[(read_eeprom(ioaddr, 12)&0x04)
| (read_eeprom(ioaddr, 0)>>14)];
- else
- if (is_fmv18x)
+ else {
+ /* Check PnP mode for FMV-183/184/183A/184A. */
+ /* This PnP routine is very poor. IO and IRQ should be known. */
+ if (inb(ioaddr + CARDSTATUS1) & 0x20) {
+ irq = dev->irq;
+ for (i = 0; i < 8; i++) {
+ if (irq == fmv_irqmap_pnp[i])
+ break;
+ }
+ if (i == 8)
+ return -ENODEV;
+ } else {
+ if (fmv18x_probe_list[inb(ioaddr + IOCONFIG) & 0x07] != ioaddr)
+ return -ENODEV;
irq = fmv_irqmap[(inb(ioaddr + IOCONFIG)>>6) & 0x03];
-
+ }
+ }
+
/* Grab the region so that we can find another board if the IRQ request
fails. */
request_region(ioaddr, AT1700_IO_EXTENT, dev->name);
- printk("%s: AT1700 found at %#3x, IRQ %d, address ", dev->name,
- ioaddr, irq);
+ printk("%s: %s found at %#3x, IRQ %d, address ", dev->name,
+ is_at1700 ? "AT1700" : "FMV-18X", ioaddr, irq);
dev->base_addr = ioaddr;
dev->irq = irq;
- for(i = 0; i < 3; i++) {
- unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
- printk("%04x", eeprom_val);
- ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
+ if (is_at1700) {
+ for(i = 0; i < 3; i++) {
+ unsigned short eeprom_val = read_eeprom(ioaddr, 4+i);
+ printk("%04x", eeprom_val);
+ ((unsigned short *)dev->dev_addr)[i] = ntohs(eeprom_val);
+ }
+ } else {
+ for(i = 0; i < 6; i++) {
+ unsigned char val = inb(ioaddr + SAPROM + i);
+ printk("%02x", val);
+ dev->dev_addr[i] = val;
+ }
}
/* The EEPROM word 12 bit 0x0400 means use regular 100 ohm 10baseT signals,
@@ -340,32 +374,44 @@ found:
*/
{
const char *porttype[] = {"auto-sense", "10baseT", "auto-sense", "10base2"};
- ushort setup_value = read_eeprom(ioaddr, 12);
-
- dev->if_port = setup_value >> 8;
+ if (is_at1700) {
+ ushort setup_value = read_eeprom(ioaddr, 12);
+ dev->if_port = setup_value >> 8;
+ } else {
+ ushort setup_value = inb(ioaddr + CARDSTATUS);
+ switch (setup_value & 0x07) {
+ case 0x01: /* 10base5 */
+ case 0x02: /* 10base2 */
+ dev->if_port = 0x18; break;
+ case 0x04: /* 10baseT */
+ dev->if_port = 0x08; break;
+ default: /* auto-sense */
+ dev->if_port = 0x00; break;
+ }
+ }
printk(" %s interface.\n", porttype[(dev->if_port>>3) & 3]);
}
+ /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
+ bus access, two 4K Tx queues, and disabled Tx and Rx. */
+ outb(0xda, ioaddr + CONFIG_0);
+
/* Set the station address in bank zero. */
- outb(0xe0, ioaddr + CONFIG_1);
+ outb(0x00, ioaddr + CONFIG_1);
for (i = 0; i < 6; i++)
outb(dev->dev_addr[i], ioaddr + 8 + i);
/* Switch to bank 1 and set the multicast table to accept none. */
- outb(0xe4, ioaddr + CONFIG_1);
+ outb(0x04, ioaddr + CONFIG_1);
for (i = 0; i < 8; i++)
outb(0x00, ioaddr + 8 + i);
- /* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
- bus access, two 4K Tx queues, and disabled Tx and Rx. */
- outb(0xda, ioaddr + CONFIG_0);
-
- /* Switch to bank 2 and lock our I/O address. */
- outb(0xe8, ioaddr + CONFIG_1);
- outb(dev->if_port, MODE13);
- /* Power-down the chip. Aren't we green! */
- outb(0x00, ioaddr + CONFIG_1);
+ /* Switch to bank 2 */
+ /* Lock our I/O address, and set manual processing mode for 16 collisions. */
+ outb(0x08, ioaddr + CONFIG_1);
+ outb(dev->if_port, ioaddr + MODE13);
+ outb(0x00, ioaddr + COL16CNTL);
if (net_debug)
printk(version);
@@ -456,35 +502,29 @@ static int net_open(struct device *dev)
{
struct net_local *lp = (struct net_local *)dev->priv;
int ioaddr = dev->base_addr;
- int i;
-
- /* Powerup the chip, initialize config register 1, and select bank 0. */
- outb(0xe0, ioaddr + CONFIG_1);
-
- /* Set the station address in bank zero. */
- for (i = 0; i < 6; i++)
- outb(dev->dev_addr[i], ioaddr + 8 + i);
-
- /* Switch to bank 1 and set the multicast table to accept none. */
- outb(0xe4, ioaddr + CONFIG_1);
- for (i = 0; i < 8; i++)
- outb(0x00, ioaddr + 8 + i);
/* Set the configuration register 0 to 32K 100ns. byte-wide memory, 16 bit
bus access, and two 4K Tx queues. */
- outb(0xda, ioaddr + CONFIG_0);
+ outb(0x5a, ioaddr + CONFIG_0);
- /* Switch to register bank 2, enable the Rx and Tx. */
- outw(0xe85a, ioaddr + CONFIG_0);
+ /* Powerup, switch to register bank 2, and enable the Rx and Tx. */
+ outb(0xe8, ioaddr + CONFIG_1);
lp->tx_started = 0;
+ lp->tx_queue_ready = 1;
+ lp->rx_started = 0;
lp->tx_queue = 0;
lp->tx_queue_len = 0;
- /* Turn on Rx interrupts, leave Tx interrupts off until packet Tx. */
- outb(0x00, ioaddr + TX_INTR);
+ /* Turn on hardware Tx and Rx interrupts. */
+ outb(0x82, ioaddr + TX_INTR);
outb(0x81, ioaddr + RX_INTR);
+ /* Enable the IRQ on boards of fmv18x it is feasible. */
+ if (lp->jumpered) {
+ outb(0x80, ioaddr + IOCONFIG1);
+ }
+
dev->tbusy = 0;
dev->interrupt = 0;
dev->start = 1;
@@ -518,10 +558,14 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
outw(0xffff, ioaddr + 24);
outw(0xffff, ioaddr + TX_STATUS);
outw(0xe85a, ioaddr + CONFIG_0);
- outw(0x8100, ioaddr + TX_INTR);
+ outw(0x8182, ioaddr + TX_INTR);
+ outb(0x00, ioaddr + TX_START);
+ outb(0x03, ioaddr + COL16CNTL);
dev->tbusy=0;
dev->trans_start = jiffies;
lp->tx_started = 0;
+ lp->tx_queue_ready = 1;
+ lp->rx_started = 0;
lp->tx_queue = 0;
lp->tx_queue_len = 0;
}
@@ -534,14 +578,20 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
unsigned char *buf = skb->data;
- /* Turn off the possible Tx interrupts. */
- outb(0x00, ioaddr + TX_INTR);
-
- outw(length, ioaddr + DATAPORT);
- outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
-
- lp->tx_queue++;
- lp->tx_queue_len += length + 2;
+ /* We may not start transmitting unless we finish transferring
+ a packet into the Tx queue. During executing the following
+ codes we possibly catch a Tx interrupt. Thus we flag off
+ tx_queue_ready, so that we prevent the interrupt routine
+ (net_interrupt) to start transmitting. */
+ lp->tx_queue_ready = 0;
+ {
+ outw(length, ioaddr + DATAPORT);
+ outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
+
+ lp->tx_queue++;
+ lp->tx_queue_len += length + 2;
+ }
+ lp->tx_queue_ready = 1;
if (lp->tx_started == 0) {
/* If the Tx is idle, always trigger a transmit. */
@@ -554,9 +604,6 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
} else if (lp->tx_queue_len < 4096 - 1502)
/* Yes, there is room for one more packet. */
dev->tbusy = 0;
-
- /* Turn on Tx interrupts back on. */
- outb(0x82, ioaddr + TX_INTR);
}
dev_kfree_skb (skb);
@@ -585,14 +632,35 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if (net_debug > 4)
printk("%s: Interrupt with status %04x.\n", dev->name, status);
- if (status & 0xff00
- || (inb(ioaddr + RX_MODE) & 0x40) == 0) { /* Got a packet(s). */
+ if (lp->rx_started == 0 &&
+ (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
+ /* Got a packet(s).
+ We cannot execute net_rx more than once at the same time for
+ the same device. During executing net_rx, we possibly catch a
+ Tx interrupt. Thus we flag on rx_started, so that we prevent
+ the interrupt routine (net_interrupt) to dive into net_rx
+ again. */
+ lp->rx_started = 1;
+ outb(0x00, ioaddr + RX_INTR); /* Disable RX intr. */
net_rx(dev);
+ outb(0x81, ioaddr + RX_INTR); /* Enable RX intr. */
+ lp->rx_started = 0;
}
if (status & 0x00ff) {
- if (status & 0x80) {
+ if (status & 0x02) {
+ /* More than 16 collisions occurred */
+ if (net_debug > 4)
+ printk("%s: 16 Collision occur during Txing.\n", dev->name);
+ /* Cancel sending a packet. */
+ outb(0x03, ioaddr + COL16CNTL);
+ lp->stats.collisions++;
+ }
+ if (status & 0x82) {
lp->stats.tx_packets++;
- if (lp->tx_queue) {
+ /* The Tx queue has any packets and is not being
+ transferred a packet from the host, start
+ transmitting. */
+ if (lp->tx_queue && lp->tx_queue_ready) {
outb(0x80 | lp->tx_queue, ioaddr + TX_START);
lp->tx_queue = 0;
lp->tx_queue_len = 0;
@@ -601,8 +669,6 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
mark_bh(NET_BH); /* Inform upper layers. */
} else {
lp->tx_started = 0;
- /* Turn on Tx interrupts off. */
- outb(0x00, ioaddr + TX_INTR);
dev->tbusy = 0;
mark_bh(NET_BH); /* Inform upper layers. */
}
@@ -698,7 +764,7 @@ net_rx(struct device *dev)
/* The inverse routine to net_open(). */
static int net_close(struct device *dev)
{
-/* struct net_local *lp = (struct net_local *)dev->priv;*/
+ struct net_local *lp = (struct net_local *)dev->priv;
int ioaddr = dev->base_addr;
dev->tbusy = 1;
@@ -709,13 +775,11 @@ static int net_close(struct device *dev)
/* No statistic counters on the chip to update. */
-#if 0
- /* Disable the IRQ on boards where it is feasible. */
+ /* Disable the IRQ on boards of fmv18x where it is feasible. */
if (lp->jumpered) {
outb(0x00, ioaddr + IOCONFIG1);
free_irq(dev->irq, dev);
}
-#endif
/* Power-down the chip. Green, green, green! */
outb(0x00, ioaddr + CONFIG_1);
@@ -820,6 +884,10 @@ static struct device dev_at1700 = {
static int io = 0x260;
static int irq = 0;
+MODULE_PARM(io, "i");
+MODULE_PARM(irq, "i");
+MODULE_PARM(net_debug, "i");
+
int init_module(void)
{
if (io == 0)
@@ -836,12 +904,14 @@ int init_module(void)
void
cleanup_module(void)
{
+#ifdef CONFIG_MCA
struct net_local *lp = dev_at1700.priv;
- unregister_netdev(&dev_at1700);
if(lp->mca_slot)
{
mca_mark_as_unused(lp->mca_slot);
}
+#endif
+ unregister_netdev(&dev_at1700);
kfree(dev_at1700.priv);
dev_at1700.priv = NULL;
diff --git a/drivers/net/bmac.c b/drivers/net/bmac.c
index c2e26819b..f9be725cd 100644
--- a/drivers/net/bmac.c
+++ b/drivers/net/bmac.c
@@ -5,6 +5,7 @@
* Copyright (C) 1998 Randy Gobbel.
*/
#include <linux/config.h>
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
@@ -59,7 +60,6 @@ struct bmac_data {
int rx_fill;
int rx_empty;
struct sk_buff *tx_bufs[N_TX_RING];
- char *tx_double[N_TX_RING]; /* yuck--double buffering */
int tx_fill;
int tx_empty;
unsigned char tx_fullup;
@@ -297,7 +297,7 @@ bmac_mif_read(struct device *dev, unsigned int addr)
val = bmac_mif_readbits(dev, 17);
bmwrite(dev, MIFCSR, 4);
MIFDELAY;
- printk(KERN_DEBUG "bmac_mif_read(%x) -> %x\n", addr, val);
+ /* printk(KERN_DEBUG "bmac_mif_read(%x) -> %x\n", addr, val); */
return val;
}
@@ -438,9 +438,11 @@ bmac_init_chip(struct device *dev)
bmac_mif_write(dev, 4, 0xa1);
bmac_mif_write(dev, 0, 0x1200);
}
+#if 0
/* XXX debugging */
bmac_mif_read(dev, 0);
bmac_mif_read(dev, 4);
+#endif
}
bmac_init_registers(dev);
return 1;
@@ -488,23 +490,15 @@ static inline void bmac_set_timeout(struct device *dev)
}
static void
-bmac_construct_xmt(struct sk_buff *skb, volatile struct dbdma_cmd *cp,
- char *doubleBuf)
+bmac_construct_xmt(struct sk_buff *skb, volatile struct dbdma_cmd *cp)
{
- void *vaddr, *page_break;
+ void *vaddr;
unsigned long baddr;
unsigned long len;
len = skb->len;
vaddr = skb->data;
baddr = virt_to_bus(vaddr);
- page_break = round_page(vaddr);
- if (trunc_page(vaddr) != trunc_page(vaddr+len) &&
- (unsigned long)round_page(baddr) != virt_to_bus(page_break)) {
- baddr = virt_to_bus(doubleBuf);
- XXDEBUG(("bmac: double buffering, double=%#08x, skb->data=%#08x, len=%d\n", doubleBuf, skb->data, len));
- } else
- flush_page_to_ram((unsigned long)vaddr);
dbdma_setcmd(cp, (OUTPUT_LAST | INTR_ALWAYS | WAIT_IFCLR), len, baddr, 0);
}
@@ -530,17 +524,8 @@ bitrev(unsigned char b)
static int
bmac_init_tx_ring(struct bmac_data *bp)
{
- int i;
volatile struct dbdma_regs *td = bp->tx_dma;
- char *addr;
-
- if (!bp->tx_allocated) {
- /* zero out tx cmds, alloc space for double buffering */
- addr = (char *)kmalloc(ETHERMTU * N_TX_RING, GFP_DMA);
- if (addr == NULL) return 0;
- for (i = 0; i < N_TX_RING; i++, addr += ETHERMTU) bp->tx_double[i] = addr;
- bp->tx_allocated = 1;
- }
+
memset((char *)bp->tx_cmds, 0, (N_TX_RING+1) * sizeof(struct dbdma_cmd));
bp->tx_empty = 0;
@@ -615,7 +600,7 @@ static int bmac_transmit_packet(struct sk_buff *skb, struct device *dev)
dbdma_setcmd(&bp->tx_cmds[i], DBDMA_STOP, 0, 0, 0);
- bmac_construct_xmt(skb, &bp->tx_cmds[bp->tx_fill], bp->tx_double[bp->tx_fill]);
+ bmac_construct_xmt(skb, &bp->tx_cmds[bp->tx_fill]);
bp->tx_bufs[bp->tx_fill] = skb;
bp->tx_fill = i;
@@ -1177,6 +1162,8 @@ static int bmac_reset_and_enable(struct device *dev, int enable)
{
struct bmac_data *bp = dev->priv;
unsigned long flags;
+ struct sk_buff *skb;
+ unsigned char *data;
save_flags(flags); cli();
bp->reset_and_enabled = 0;
@@ -1187,16 +1174,17 @@ static int bmac_reset_and_enable(struct device *dev, int enable)
bmac_start_chip(dev);
bmwrite(dev, INTDISABLE, EnableNormal);
bp->reset_and_enabled = 1;
- /* { */
- /* unsigned char random_packet[100]; */
- /* unsigned int i; */
- /* struct sk_buff *skb = dev_alloc_skb(RX_BUFLEN+2); */
- /* unsigned char *data = skb_put(skb, sizeof(random_packet)); */
- /* XXDEBUG(("transmitting random packet\n")); */
- /* for (i = 0; i < sizeof(random_packet); i++) data[i] = i; */
- /* bmac_transmit_packet(skb, dev); */
- /* XXDEBUG(("done transmitting random packet\n")); */
- /* } */
+
+ /*
+ * It seems that the bmac can't receive until it's transmitted
+ * a packet. So we give it a dummy packet to transmit.
+ */
+ skb = dev_alloc_skb(ETHERMINPACKET);
+ data = skb_put(skb, ETHERMINPACKET);
+ memset(data, 0, ETHERMINPACKET);
+ memcpy(data, dev->dev_addr, 6);
+ memcpy(data+6, dev->dev_addr, 6);
+ bmac_transmit_packet(skb, dev);
}
restore_flags(flags);
return 1;
@@ -1241,8 +1229,13 @@ bmac_probe(struct device *dev)
dev->priv = kmalloc(PRIV_BYTES, GFP_KERNEL);
if (dev->priv == 0) return -ENOMEM;
}
+
+#ifdef MODULE
+ bmac_devs = dev;
+#endif
- dev->base_addr = bmacs->addrs[0].address;
+ dev->base_addr = (unsigned long)
+ ioremap(bmacs->addrs[0].address, bmacs->addrs[0].size);
dev->irq = bmacs->intrs[0].line;
bmwrite(dev, INTDISABLE, DisableAll);
@@ -1257,7 +1250,7 @@ bmac_probe(struct device *dev)
}
}
- printk(KERN_INFO "%s: BMAC at", dev->name);
+ printk(KERN_INFO "%s: BMAC%s at", dev->name, (is_bmac_plus? "+": ""));
rev = addr[0] == 0 && addr[1] == 0xA0;
for (j = 0; j < 6; ++j) {
dev->dev_addr[j] = rev? bitrev(addr[j]): addr[j];
@@ -1280,9 +1273,11 @@ bmac_probe(struct device *dev)
bp = (struct bmac_data *) dev->priv;
memset(bp, 0, sizeof(struct bmac_data));
- bp->tx_dma = (volatile struct dbdma_regs *) bmacs->addrs[1].address;
+ bp->tx_dma = (volatile struct dbdma_regs *)
+ ioremap(bmacs->addrs[1].address, bmacs->addrs[1].size);
bp->tx_dma_intr = bmacs->intrs[1].line;
- bp->rx_dma = (volatile struct dbdma_regs *) bmacs->addrs[2].address;
+ bp->rx_dma = (volatile struct dbdma_regs *)
+ ioremap(bmacs->addrs[2].address, bmacs->addrs[2].size);
bp->rx_dma_intr = bmacs->intrs[2].line;
bp->tx_cmds = (volatile struct dbdma_cmd *) DBDMA_ALIGN(bp + 1);
@@ -1370,8 +1365,6 @@ static int bmac_close(struct device *dev)
}
}
bp->rx_allocated = 0;
- XXDEBUG(("bmac: free doubles\n"));/*MEMORY LEAK BELOW!!! FIX!!! */
- if (bp->tx_double[0] != NULL) kfree(bp->tx_double[0]);
XXDEBUG(("bmac: free tx bufs\n"));
for (i = 0; i<N_TX_RING; i++) {
if (bp->tx_bufs[i] != NULL) {
@@ -1379,7 +1372,6 @@ static int bmac_close(struct device *dev)
bp->tx_bufs[i] = NULL;
}
}
- bp->tx_allocated = 0;
bp->reset_and_enabled = 0;
XXDEBUG(("bmac: all bufs freed\n"));
@@ -1539,3 +1531,32 @@ bmac_proc_info(char *buffer, char **start, off_t offset, int length, int dummy)
return len;
}
+
+#ifdef MODULE
+
+MODULE_AUTHOR("Randy Gobbel/Paul Mackerras");
+MODULE_DESCRIPTION("PowerMac BMAC ethernet driver.");
+
+int init_module(void)
+{
+ int res;
+
+ if(bmac_devs != NULL)
+ return -EBUSY;
+ res = bmac_probe(NULL);
+ return res;
+}
+void cleanup_module(void)
+{
+ struct bmac_data *bp = (struct bmac_data *) bmac_devs->priv;
+ unregister_netdev(bmac_devs);
+
+ free_irq(bmac_devs->irq, bmac_misc_intr);
+ free_irq(bp->tx_dma_intr, bmac_txdma_intr);
+ free_irq(bp->rx_dma_intr, bmac_rxdma_intr);
+
+ kfree(bmac_devs);
+ bmac_devs = NULL;
+}
+
+#endif
diff --git a/drivers/net/cops.h b/drivers/net/cops.h
index a064bc12b..69721566f 100644
--- a/drivers/net/cops.h
+++ b/drivers/net/cops.h
@@ -34,7 +34,7 @@
/* Same on both card types */
#define COPS_CLEAR_INT 1
-/* LAP response codes recieved from the cards. */
+/* LAP response codes received from the cards. */
#define LAP_INIT 1 /* Init cmd */
#define LAP_INIT_RSP 2 /* Init response */
#define LAP_WRITE 3 /* Write cmd */
diff --git a/drivers/net/cosa.c b/drivers/net/cosa.c
new file mode 100644
index 000000000..5c76aa0d4
--- /dev/null
+++ b/drivers/net/cosa.c
@@ -0,0 +1,1909 @@
+/* $Id: cosa.c,v 1.11 1998/12/24 23:44:23 kas Exp $ */
+
+/*
+ * Copyright (C) 1995-1997 Jan "Yenya" Kasprzak <kas@fi.muni.cz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * The driver for the SRP and COSA synchronous serial cards.
+ *
+ * HARDWARE INFO
+ *
+ * Both cards are developed at the Institute of Computer Science,
+ * Masaryk University (http://www.ics.muni.cz/). The hardware is
+ * developed by Jiri Novotny <novotny@ics.muni.cz>. More information
+ * and the photo of both cards is available at
+ * http://www.kozakmartin.cz/cosa.html. The card documentation, firmwares
+ * and other goods can be downloaded from ftp://ftp.ics.muni.cz/pub/cosa/.
+ * For Linux-specific utilities, see below in the "Software info" section.
+ * If you want to order the card, contact Jiri Novotny.
+ *
+ * The SRP (serial port?, the Czech word "srp" means "sickle") card
+ * is a 2-port intelligent (with its own 8-bit CPU) synchronous serial card
+ * with V.24 interfaces up to 80kb/s each.
+ *
+ * The COSA (communication serial adapter?, the Czech word "kosa" means
+ * "scythe") is a next-generation sync/async board with two interfaces
+ * - currently any of V.24, X.21, V.35 and V.36 can be selected.
+ * It has a 16-bit SAB80166 CPU and can do up to 10 Mb/s per channel.
+ * The 8-channels version is in development.
+ *
+ * Both types have downloadable firmware and communicate via ISA DMA.
+ * COSA can be also a bus-mastering device.
+ *
+ * SOFTWARE INFO
+ *
+ * The homepage of the Linux driver is at http://www.fi.muni.cz/~kas/cosa/.
+ * The CVS tree of Linux driver can be viewed there, as well as the
+ * firmware binaries and user-space utilities for downloading the firmware
+ * into the card and setting up the card.
+ *
+ * The Linux driver (unlike the present *BSD drivers :-) can work even
+ * for the COSA and SRP in one computer and allows each channel to work
+ * in one of the three modes (character device, Cisco HDLC, Sync PPP).
+ *
+ * AUTHOR
+ *
+ * The Linux driver was written by Jan "Yenya" Kasprzak <kas@fi.muni.cz>.
+ *
+ * You can mail me bugfixes and even success reports. I am especially
+ * interested in the SMP and/or muliti-channel success/failure reports
+ * (I wonder if I did the locking properly :-).
+ *
+ * THE AUTHOR USED THE FOLLOWING SOURCES WHEN PROGRAMMING THE DRIVER
+ *
+ * The COSA/SRP NetBSD driver by Zdenek Salvet and Ivos Cernohlavek
+ * The skeleton.c by Donald Becker
+ * The SDL Riscom/N2 driver by Mike Natale
+ * The Comtrol Hostess SV11 driver by Alan Cox
+ * The Sync PPP/Cisco HDLC layer (syncppp.c) ported to Linux by Alan Cox
+ */
+
+/* ---------- Headers, macros, data structures ---------- */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/malloc.h>
+#include <linux/poll.h>
+#include <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/interrupt.h>
+#include <linux/delay.h>
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/netdevice.h>
+
+#undef COSA_SLOW_IO /* for testing purposes only */
+#undef REALLY_SLOW_IO
+
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/byteorder.h>
+#include <asm/spinlock.h>
+
+#include "syncppp.h"
+#include "cosa.h"
+
+/* Maximum length of the identification string. */
+#define COSA_MAX_ID_STRING 128
+
+/* Maximum length of the channel name */
+#define COSA_MAX_NAME (sizeof("cosaXXXcXXX")+1)
+
+/* Per-channel data structure */
+
+struct channel_data {
+ int usage; /* Usage count; >0 for chrdev, -1 for netdev */
+ int num; /* Number of the channel */
+ struct cosa_data *cosa; /* Pointer to the per-card structure */
+ int txsize; /* Size of transmitted data */
+ char *txbuf; /* Transmit buffer */
+ char name[COSA_MAX_NAME]; /* channel name */
+
+ /* The HW layer interface */
+ /* routine called from the RX interrupt */
+ char *(*setup_rx)(struct channel_data *channel, int size);
+ /* routine called when the RX is done (from the EOT interrupt) */
+ int (*rx_done)(struct channel_data *channel);
+ /* routine called when the TX is done (from the EOT interrupt) */
+ int (*tx_done)(struct channel_data *channel, int size);
+
+ /* Character device parts */
+ struct semaphore rsem, wsem;
+ char *rxdata;
+ int rxsize;
+ struct wait_queue *txwaitq, *rxwaitq;
+ int tx_status, rx_status;
+
+ /* SPPP/HDLC device parts */
+ struct ppp_device pppdev;
+ struct sk_buff *rx_skb, *tx_skb;
+ struct net_device_stats stats;
+};
+
+struct cosa_data {
+ int num; /* Card number */
+ char name[COSA_MAX_NAME]; /* Card name - e.g "cosa0" */
+ unsigned int datareg, statusreg; /* I/O ports */
+ unsigned short irq, dma; /* IRQ and DMA number */
+ unsigned short startaddr; /* Firmware start address */
+ int nchannels; /* # of channels on this card */
+ int driver_status; /* For communicating with firware */
+ int firmware_status; /* Downloaded, reseted, etc. */
+ int rxbitmap, txbitmap; /* Bitmap of channels who are willing to send/receive data */
+ int rxtx; /* RX or TX in progress? */
+ int usage; /* usage count */
+ int txchan, txsize, rxsize;
+ struct channel_data *rxchan;
+ char *bouncebuf;
+ char *txbuf, *rxbuf;
+ struct channel_data *chan;
+ spinlock_t lock; /* For exclusive operations on this structure */
+ char id_string[COSA_MAX_ID_STRING]; /* ROM monitor ID string */
+ char *type; /* card type */
+};
+
+/*
+ * Define this if you want all the possible ports to be autoprobed.
+ * It is here but it probably is not a good idea to use this.
+ */
+/* #define COSA_ISA_AUTOPROBE 1 */
+
+/*
+ * Character device major number. 117 was allocated for us.
+ * The value of 0 means to allocate a first free one.
+ */
+static int cosa_major = 117;
+
+/*
+ * Encoding of the minor numbers:
+ * The lowest CARD_MINOR_BITS bits means the channel on the single card,
+ * the highest bits means the card number.
+ */
+#define CARD_MINOR_BITS 4 /* How many bits in minor number are reserved
+ * for the single card */
+/*
+ * The following depends on CARD_MINOR_BITS. Unfortunately, the "MODULE_STRING"
+ * macro doesn't like anything other than the raw number as an argument :-(
+ */
+#define MAX_CARDS 16
+/* #define MAX_CARDS (1 << (8-CARD_MINOR_BITS)) */
+
+#define DRIVER_RX_READY 0x0001
+#define DRIVER_TX_READY 0x0002
+#define DRIVER_TXMAP_SHIFT 2
+#define DRIVER_TXMAP_MASK 0x0c /* FIXME: 0xfc for 8-channel version */
+
+/*
+ * for cosa->rxtx - indicates whether either transmit or receive is
+ * in progress. These values are mean number of the bit.
+ */
+#define TXBIT 0
+#define RXBIT 1
+#define IRQBIT 2
+
+#define COSA_MTU 2000 /* FIXME: I don't know this exactly */
+
+#undef DEBUG_DATA 1 /* Dump the data read or written to the channel */
+#undef DEBUG_IRQS 1 /* Print the message when the IRQ is received */
+#undef DEBUG_IO 1 /* Dump the I/O traffic */
+
+/* Maybe the following should be allocated dynamically */
+static struct cosa_data cosa_cards[MAX_CARDS];
+static int nr_cards = 0;
+
+#ifdef COSA_ISA_AUTOPROBE
+static int io[MAX_CARDS+1] = { 0x220, 0x228, 0x210, 0x218, 0, };
+/* NOTE: DMA is not autoprobed!!! */
+static int dma[MAX_CARDS+1] = { 1, 7, 1, 7, 1, 7, 1, 7, 0, };
+#else
+int io[MAX_CARDS+1] = { 0, };
+int dma[MAX_CARDS+1] = { 0, };
+#endif
+/* IRQ can be safely autoprobed */
+static int irq[MAX_CARDS+1] = { -1, -1, -1, -1, -1, -1, 0, };
+
+#ifdef MODULE
+MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i");
+MODULE_PARM_DESC(io, "The I/O bases of the COSA or SRP cards");
+MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i");
+MODULE_PARM_DESC(irq, "The IRQ lines of the COSA or SRP cards");
+MODULE_PARM(dma, "1-" __MODULE_STRING(MAX_CARDS) "i");
+MODULE_PARM_DESC(dma, "The DMA channels of the COSA or SRP cards");
+
+MODULE_AUTHOR("Jan \"Yenya\" Kasprzak, <kas@fi.muni.cz>");
+MODULE_DESCRIPTION("Modular driver for the COSA or SRP synchronous card");
+#endif
+
+/* I use this mainly for testing purposes */
+#ifdef COSA_SLOW_IO
+#define cosa_outb outb_p
+#define cosa_outw outw_p
+#define cosa_inb inb_p
+#define cosa_inw inw_p
+#else
+#define cosa_outb outb
+#define cosa_outw outw
+#define cosa_inb inb
+#define cosa_inw inw
+#endif
+
+#define is_8bit(cosa) (!(cosa->datareg & 0x08))
+
+#define cosa_getstatus(cosa) (cosa_inb(cosa->statusreg))
+#define cosa_putstatus(cosa, stat) (cosa_outb(stat, cosa->statusreg))
+#define cosa_getdata16(cosa) (cosa_inw(cosa->datareg))
+#define cosa_getdata8(cosa) (cosa_inb(cosa->datareg))
+#define cosa_putdata16(cosa, dt) (cosa_outw(dt, cosa->datareg))
+#define cosa_putdata8(cosa, dt) (cosa_outb(dt, cosa->datareg))
+
+/* Initialization stuff */
+static int cosa_probe(int ioaddr, int irq, int dma);
+
+/* HW interface */
+static void cosa_enable_rx(struct channel_data *chan);
+static void cosa_disable_rx(struct channel_data *chan);
+static int cosa_start_tx(struct channel_data *channel, char *buf, int size);
+static void cosa_kick(struct cosa_data *cosa);
+static int cosa_dma_able(struct channel_data *chan, char *buf, int data);
+
+/* SPPP/HDLC stuff */
+static void sppp_channel_init(struct channel_data *chan);
+static void sppp_channel_delete(struct channel_data *chan);
+static int cosa_sppp_open(struct device *d);
+static int cosa_sppp_close(struct device *d);
+static int cosa_sppp_tx(struct sk_buff *skb, struct device *d);
+static char *sppp_setup_rx(struct channel_data *channel, int size);
+static int sppp_rx_done(struct channel_data *channel);
+static int sppp_tx_done(struct channel_data *channel, int size);
+static int cosa_sppp_ioctl(struct device *dev, struct ifreq *ifr, int cmd);
+static struct net_device_stats *cosa_net_stats(struct device *dev);
+
+/* Character device */
+static void chardev_channel_init(struct channel_data *chan);
+static char *chrdev_setup_rx(struct channel_data *channel, int size);
+static int chrdev_rx_done(struct channel_data *channel);
+static int chrdev_tx_done(struct channel_data *channel, int size);
+static long long cosa_lseek(struct file *file,
+ long long offset, int origin);
+static ssize_t cosa_read(struct file *file,
+ char *buf, size_t count, loff_t *ppos);
+static ssize_t cosa_write(struct file *file,
+ const char *buf, size_t count, loff_t *ppos);
+static unsigned int cosa_poll(struct file *file, poll_table *poll);
+static int cosa_open(struct inode *inode, struct file *file);
+static int cosa_release(struct inode *inode, struct file *file);
+static int cosa_chardev_ioctl(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg);
+#ifdef COSA_FASYNC_WORKING
+static int cosa_fasync(struct inode *inode, struct file *file, int on);
+#endif
+
+static struct file_operations cosa_fops = {
+ cosa_lseek,
+ cosa_read,
+ cosa_write,
+ NULL, /* readdir */
+ cosa_poll,
+ cosa_chardev_ioctl,
+ NULL, /* mmap */
+ cosa_open,
+ NULL, /* flush */
+ cosa_release,
+ NULL, /* fsync */
+#ifdef COSA_FASYNC_WORKING
+ cosa_fasync,
+#else
+ NULL,
+#endif
+ NULL, /* check media change */
+ NULL, /* revalidate */
+ NULL /* lock */
+};
+
+/* Ioctls */
+static int cosa_start(struct cosa_data *cosa, int address);
+static int cosa_reset(struct cosa_data *cosa);
+static int cosa_download(struct cosa_data *cosa, struct cosa_download *d);
+static int cosa_readmem(struct cosa_data *cosa, struct cosa_download *d);
+
+/* COSA/SRP ROM monitor */
+static int download(struct cosa_data *cosa, char *data, int addr, int len);
+static int startmicrocode(struct cosa_data *cosa, int address);
+static int readmem(struct cosa_data *cosa, char *data, int addr, int len);
+static int cosa_reset_and_read_id(struct cosa_data *cosa, char *id);
+
+/* Auxilliary functions */
+static int get_wait_data(struct cosa_data *cosa);
+static int put_wait_data(struct cosa_data *cosa, int data);
+static int puthexnumber(struct cosa_data *cosa, int number);
+static void put_driver_status_common(struct cosa_data *cosa, int nolock);
+#define put_driver_status(x) put_driver_status_common((x), 0)
+#define put_driver_status_nolock(x) put_driver_status_common((x), 1)
+
+/* Interrupt handling */
+static void cosa_interrupt(int irq, void *cosa, struct pt_regs *regs);
+
+/* I/O ops debugging */
+#ifdef DEBUG_IO
+static void debug_data_in(struct cosa_data *cosa, int data);
+static void debug_data_out(struct cosa_data *cosa, int data);
+static void debug_data_cmd(struct cosa_data *cosa, int data);
+static void debug_status_in(struct cosa_data *cosa, int status);
+static void debug_status_out(struct cosa_data *cosa, int status);
+#endif
+
+
+/* ---------- Initialization stuff ---------- */
+
+#ifdef MODULE
+int init_module(void)
+#else
+__initfunc(static int cosa_init(void))
+#endif
+{
+ int i;
+ printk(KERN_INFO "cosa v1.03 (c) 1997-8 Jan Kasprzak <kas@fi.muni.cz>\n");
+#ifdef __SMP__
+ printk(KERN_INFO "cosa: SMP found. Please mail any success/failure reports to the author.\n");
+#endif
+ if (cosa_major > 0) {
+ if (register_chrdev(cosa_major, "cosa", &cosa_fops)) {
+ printk(KERN_WARNING "cosa: unable to get major %d\n",
+ cosa_major);
+ return -EIO;
+ }
+ } else {
+ if (!(cosa_major=register_chrdev(0, "cosa", &cosa_fops))) {
+ printk(KERN_WARNING "cosa: unable to register chardev\n");
+ return -EIO;
+ }
+ }
+ for (i=0; i<MAX_CARDS; i++)
+ cosa_cards[i].num = -1;
+ for (i=0; io[i] != 0 && i < MAX_CARDS; i++)
+ cosa_probe(io[i], irq[i], dma[i]);
+ if (!nr_cards) {
+ printk(KERN_WARNING "cosa: no devices found.\n");
+ unregister_chrdev(cosa_major, "cosa");
+ return -ENODEV;
+ }
+ return 0;
+}
+
+#ifdef MODULE
+void cleanup_module (void)
+{
+ struct cosa_data *cosa;
+ printk(KERN_INFO "Unloading the cosa module\n");
+
+ for (cosa=cosa_cards; nr_cards--; cosa++) {
+ int i;
+ /* Clean up the per-channel data */
+ for (i=0; i<cosa->nchannels; i++) {
+ /* Chardev driver has no alloc'd per-channel data */
+ sppp_channel_delete(cosa->chan+i);
+ }
+ /* Clean up the per-card data */
+ kfree(cosa->chan);
+ kfree(cosa->bouncebuf);
+ free_irq(cosa->irq, cosa);
+ free_dma(cosa->dma);
+ release_region(cosa->datareg,is_8bit(cosa)?2:4);
+ }
+ unregister_chrdev(cosa_major, "cosa");
+}
+#endif
+
+/*
+ * This function should register all the net devices needed for the
+ * single channel.
+ */
+static __inline__ void channel_init(struct channel_data *chan)
+{
+ sprintf(chan->name, "cosa%dc%d", chan->cosa->num, chan->num);
+
+ /* Initialize the chardev data structures */
+ chardev_channel_init(chan);
+
+ /* Register the sppp interface */
+ sppp_channel_init(chan);
+}
+
+static int cosa_probe(int base, int irq, int dma)
+{
+ struct cosa_data *cosa = cosa_cards+nr_cards;
+ int i;
+
+ memset(cosa, 0, sizeof(struct cosa_data));
+
+ /* Checking validity of parameters: */
+ /* IRQ should be 2-7 or 10-15; negative IRQ means autoprobe */
+ if ((irq >= 0 && irq < 2) || irq > 15 || (irq < 10 && irq > 7)) {
+ printk (KERN_INFO "cosa_probe: invalid IRQ %d\n", irq);
+ return -1;
+ }
+ /* I/O address should be between 0x100 and 0x3ff and should be
+ * multiple of 8. */
+ if (base < 0x100 || base > 0x3ff || base & 0x7) {
+ printk (KERN_INFO "cosa_probe: invalid I/O address 0x%x\n",
+ base);
+ return -1;
+ }
+ /* DMA should be 0,1 or 3-7 */
+ if (dma < 0 || dma == 4 || dma > 7) {
+ printk (KERN_INFO "cosa_probe: invalid DMA %d\n", dma);
+ return -1;
+ }
+ /* and finally, on 16-bit COSA DMA should be 4-7 and
+ * I/O base should not be multiple of 0x10 */
+ if (((base & 0x8) && dma < 4) || (!(base & 0x8) && dma > 3)) {
+ printk (KERN_INFO "cosa_probe: 8/16 bit base and DMA mismatch"
+ " (base=0x%x, dma=%d)\n", base, dma);
+ return -1;
+ }
+
+ cosa->dma = dma;
+ cosa->datareg = base;
+ cosa->statusreg = is_8bit(cosa)?base+1:base+2;
+ spin_lock_init(&cosa->lock);
+
+ if (check_region(base, is_8bit(cosa)?2:4))
+ return -1;
+
+ if (cosa_reset_and_read_id(cosa, cosa->id_string) < 0) {
+ printk(KERN_DEBUG "cosa: probe at 0x%x failed.\n", base);
+ return -1;
+ }
+
+ /* Test the validity of identification string */
+ if (!strncmp(cosa->id_string, "SRP", 3))
+ cosa->type = "srp";
+ else if (!strncmp(cosa->id_string, "COSA", 4))
+ cosa->type = is_8bit(cosa)? "cosa8": "cosa16";
+ else {
+/* Print a warning only if we are not autoprobing */
+#ifndef COSA_ISA_AUTOPROBE
+ printk(KERN_INFO "cosa: valid signature not found at 0x%x.\n",
+ base);
+#endif
+ return -1;
+ }
+
+ /* Now do IRQ autoprobe */
+ if (irq < 0) {
+ unsigned long irqs;
+/* printk(KERN_INFO "IRQ autoprobe\n"); */
+ sti();
+ irqs = probe_irq_on();
+ /*
+ * Enable interrupt on tx buffer empty (it sure is)
+ * really sure ?
+ * FIXME: When this code is not used as module, we should
+ * probably call udelay() instead of the interruptible sleep.
+ */
+ current->state = TASK_INTERRUPTIBLE;
+ cosa_putstatus(cosa, SR_TX_INT_ENA);
+ schedule_timeout(30);
+ current->state = TASK_RUNNING;
+ irq = probe_irq_off(irqs);
+ /* Disable all IRQs from the card */
+ cosa_putstatus(cosa, 0);
+ /* Empty the received data register */
+ cosa_getdata8(cosa);
+
+ if (irq < 0) {
+ printk (KERN_INFO "cosa IRQ autoprobe: multiple interrupts obtained (%d, board at 0x%x)\n",
+ irq, cosa->datareg);
+ return -1;
+ }
+ if (irq == 0) {
+ printk (KERN_INFO "cosa IRQ autoprobe: no interrupt obtained (board at 0x%x)\n",
+ cosa->datareg);
+ /* return -1; */
+ }
+ }
+
+ cosa->irq = irq;
+ cosa->num = nr_cards;
+ cosa->usage = 0;
+ cosa->nchannels = 2; /* FIXME: how to determine this? */
+
+ request_region(base, is_8bit(cosa)?2:4, cosa->type);
+ if (request_irq(cosa->irq, cosa_interrupt, 0, cosa->type, cosa))
+ goto bad1;
+ if (request_dma(cosa->dma, cosa->type)) {
+ free_irq(cosa->irq, cosa);
+bad1: release_region(cosa->datareg,is_8bit(cosa)?2:4);
+ printk(KERN_NOTICE "cosa%d: allocating resources failed\n",
+ cosa->num);
+ return -1;
+ }
+
+ cosa->bouncebuf = kmalloc(COSA_MTU, GFP_KERNEL|GFP_DMA);
+ sprintf(cosa->name, "cosa%d", cosa->num);
+
+ /* Initialize the per-channel data */
+ cosa->chan = kmalloc(sizeof(struct channel_data)*cosa->nchannels,
+ GFP_KERNEL);
+ memset(cosa->chan, 0, sizeof(struct channel_data)*cosa->nchannels);
+ for (i=0; i<cosa->nchannels; i++) {
+ cosa->chan[i].cosa = cosa;
+ cosa->chan[i].num = i;
+ channel_init(cosa->chan+i);
+ }
+
+ printk (KERN_INFO "cosa%d: %s (%s at 0x%x irq %d dma %d), %d channels\n",
+ cosa->num, cosa->id_string, cosa->type,
+ cosa->datareg, cosa->irq, cosa->dma, cosa->nchannels);
+
+ return nr_cards++;
+}
+
+
+/*---------- SPPP/HDLC netdevice ---------- */
+
+static void sppp_channel_init(struct channel_data *chan)
+{
+ struct device *d;
+ sppp_attach(&chan->pppdev);
+ d=&chan->pppdev.dev;
+ d->name = chan->name;
+ d->base_addr = chan->cosa->datareg;
+ d->irq = chan->cosa->irq;
+ d->dma = chan->cosa->dma;
+ d->priv = chan;
+ d->init = NULL;
+ d->open = cosa_sppp_open;
+ d->stop = cosa_sppp_close;
+ d->hard_start_xmit = cosa_sppp_tx;
+ d->do_ioctl = cosa_sppp_ioctl;
+ d->get_stats = cosa_net_stats;
+ dev_init_buffers(d);
+ if (register_netdev(d) == -1) {
+ printk(KERN_WARNING "%s: register_netdev failed.\n", d->name);
+ sppp_detach(&chan->pppdev.dev);
+ return;
+ }
+}
+
+static void sppp_channel_delete(struct channel_data *chan)
+{
+ sppp_detach(&chan->pppdev.dev);
+ unregister_netdev(&chan->pppdev.dev);
+}
+
+
+static int cosa_sppp_open(struct device *d)
+{
+ struct channel_data *chan = d->priv;
+ int err, flags;
+
+ spin_lock_irqsave(&chan->cosa->lock, flags);
+ if (chan->usage != 0) {
+ printk(KERN_WARNING "%s: sppp_open called with usage count %d\n",
+ chan->name, chan->usage);
+ return -EBUSY;
+ }
+ chan->setup_rx = sppp_setup_rx;
+ chan->tx_done = sppp_tx_done;
+ chan->rx_done = sppp_rx_done;
+ chan->usage=-1;
+ chan->cosa->usage++;
+ MOD_INC_USE_COUNT;
+ spin_unlock_irqrestore(&chan->cosa->lock, flags);
+
+ err = sppp_open(d);
+ if (err) {
+ spin_lock_irqsave(&chan->cosa->lock, flags);
+ chan->usage=0;
+ chan->cosa->usage--;
+ MOD_DEC_USE_COUNT;
+
+ spin_unlock_irqrestore(&chan->cosa->lock, flags);
+ return err;
+ }
+
+ d->tbusy = 0;
+ cosa_enable_rx(chan);
+ return 0;
+}
+
+static int cosa_sppp_tx(struct sk_buff *skb, struct device *dev)
+{
+ struct channel_data *chan = dev->priv;
+
+ if (dev->tbusy) {
+ if (time_before(jiffies, dev->trans_start+2*HZ))
+ return 1; /* Two seconds timeout */
+ cosa_kick(chan->cosa);
+ chan->stats.tx_errors++;
+ chan->stats.tx_aborted_errors++;
+ if (chan->tx_skb) {
+ dev_kfree_skb(chan->tx_skb);
+ chan->tx_skb = 0;
+ }
+ dev->tbusy = 0;
+ }
+ if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
+ printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
+ return 1;
+ }
+
+ chan->tx_skb = skb;
+ dev->trans_start = jiffies;
+ cosa_start_tx(chan, skb->data, skb->len);
+ return 0;
+}
+
+static int cosa_sppp_close(struct device *d)
+{
+ struct channel_data *chan = d->priv;
+ int flags;
+
+ sppp_close(d);
+ d->tbusy = 1;
+ cosa_disable_rx(chan);
+ spin_lock_irqsave(&chan->cosa->lock, flags);
+ chan->usage=0;
+ chan->cosa->usage--;
+ MOD_DEC_USE_COUNT;
+ spin_unlock_irqrestore(&chan->cosa->lock, flags);
+ return 0;
+}
+
+static char *sppp_setup_rx(struct channel_data *chan, int size)
+{
+ /*
+ * We can safely fall back to non-dma-able memory, because we have
+ * the cosa->bouncebuf pre-allocated.
+ */
+ if (chan->rx_skb)
+ kfree_skb(chan->rx_skb);
+ chan->rx_skb = dev_alloc_skb(size);
+ if (chan->rx_skb == NULL) {
+ printk(KERN_NOTICE "%s: Memory squeeze, dropping packet\n",
+ chan->name);
+ chan->stats.rx_dropped++;
+ return NULL;
+ }
+ chan->pppdev.dev.trans_start = jiffies;
+ return skb_put(chan->rx_skb, size);
+}
+
+static int sppp_rx_done(struct channel_data *chan)
+{
+ if (!chan->rx_skb) {
+ printk(KERN_WARNING "%s: rx_done with empty skb!\n",
+ chan->name);
+ chan->stats.rx_errors++;
+ chan->stats.rx_frame_errors++;
+ return 0;
+ }
+ chan->rx_skb->protocol = htons(ETH_P_WAN_PPP);
+ chan->rx_skb->dev = &chan->pppdev.dev;
+ chan->rx_skb->mac.raw = chan->rx_skb->data;
+ chan->stats.rx_packets++;
+ chan->stats.rx_bytes += chan->cosa->rxsize;
+ netif_rx(chan->rx_skb);
+ chan->rx_skb = 0;
+ chan->pppdev.dev.trans_start = jiffies;
+ return 0;
+}
+
+/* ARGSUSED */
+static int sppp_tx_done(struct channel_data *chan, int size)
+{
+ if (!chan->tx_skb) {
+ printk(KERN_WARNING "%s: tx_done with empty skb!\n",
+ chan->name);
+ chan->stats.tx_errors++;
+ chan->stats.tx_aborted_errors++;
+ return 1;
+ }
+ dev_kfree_skb(chan->tx_skb);
+ chan->tx_skb = 0;
+ chan->stats.tx_packets++;
+ chan->stats.tx_bytes += size;
+ chan->pppdev.dev.tbusy = 0;
+ mark_bh(NET_BH);
+ return 1;
+}
+
+static struct net_device_stats *cosa_net_stats(struct device *dev)
+{
+ struct channel_data *chan = dev->priv;
+ return &chan->stats;
+}
+
+
+/*---------- Character device ---------- */
+
+static void chardev_channel_init(struct channel_data *chan)
+{
+ chan->rsem = MUTEX;
+ chan->wsem = MUTEX;
+}
+
+static long long cosa_lseek(struct file * file,
+ long long offset, int origin)
+{
+ return -ESPIPE;
+}
+
+static ssize_t cosa_read(struct file *file,
+ char *buf, size_t count, loff_t *ppos)
+{
+ struct wait_queue wait = { current, NULL };
+ int flags;
+ struct channel_data *chan = (struct channel_data *)file->private_data;
+ struct cosa_data *cosa = chan->cosa;
+ char *kbuf;
+
+ if (down_interruptible(&chan->rsem))
+ return -ERESTARTSYS;
+
+ if ((chan->rxdata = kmalloc(COSA_MTU, GFP_DMA|GFP_KERNEL)) == NULL) {
+ printk(KERN_INFO "%s: cosa_read() - OOM\n", cosa->name);
+ up(&chan->rsem);
+ return -ENOMEM;
+ }
+
+ chan->rx_status = 0;
+ cosa_enable_rx(chan);
+ spin_lock_irqsave(&cosa->lock, flags);
+ add_wait_queue(&chan->rxwaitq, &wait);
+ while(!chan->rx_status) {
+ current->state = TASK_INTERRUPTIBLE;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ schedule();
+ spin_lock_irqsave(&cosa->lock, flags);
+ if (signal_pending(current) && chan->rx_status == 0) {
+ chan->rx_status = 1;
+ remove_wait_queue(&chan->rxwaitq, &wait);
+ current->state = TASK_RUNNING;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ up(&chan->rsem);
+ return -ERESTARTSYS;
+ }
+ }
+ remove_wait_queue(&chan->rxwaitq, &wait);
+ current->state = TASK_RUNNING;
+ kbuf = chan->rxdata;
+ count = chan->rxsize;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ up(&chan->rsem);
+
+ if (copy_to_user(buf, kbuf, count)) {
+ kfree(buf);
+ return -EFAULT;
+ }
+ kfree(kbuf);
+ return count;
+}
+
+static char *chrdev_setup_rx(struct channel_data *chan, int size)
+{
+ /* Expect size <= COSA_MTU */
+ chan->rxsize = size;
+ return chan->rxdata;
+}
+
+static int chrdev_rx_done(struct channel_data *chan)
+{
+ if (chan->rx_status) { /* Reader has died */
+ kfree(chan->rxdata);
+ up(&chan->wsem);
+ }
+ chan->rx_status = 1;
+ wake_up_interruptible(&chan->rxwaitq);
+ return 1;
+}
+
+
+static ssize_t cosa_write(struct file *file,
+ const char *buf, size_t count, loff_t *ppos)
+{
+ struct channel_data *chan = (struct channel_data *)file->private_data;
+ struct wait_queue wait = { current, NULL };
+ struct cosa_data *cosa = chan->cosa;
+ unsigned int flags;
+ char *kbuf;
+
+ if (down_interruptible(&chan->wsem))
+ return -ERESTARTSYS;
+
+ if (count > COSA_MTU)
+ count = COSA_MTU;
+
+ /* Allocate the buffer */
+ if ((kbuf = kmalloc(count, GFP_KERNEL|GFP_DMA)) == NULL) {
+ printk(KERN_NOTICE "%s: cosa_write() OOM - dropping packet\n",
+ cosa->name);
+ up(&chan->wsem);
+ return -ENOMEM;
+ }
+ if (copy_from_user(kbuf, buf, count)) {
+ up(&chan->wsem);
+ kfree(kbuf);
+ return -EFAULT;
+ }
+ chan->tx_status=0;
+ cosa_start_tx(chan, kbuf, count);
+
+ spin_lock_irqsave(&cosa->lock, flags);
+ add_wait_queue(&chan->txwaitq, &wait);
+ while(!chan->tx_status) {
+ current->state = TASK_INTERRUPTIBLE;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ schedule();
+ spin_lock_irqsave(&cosa->lock, flags);
+ if (signal_pending(current) && chan->tx_status == 0) {
+ chan->tx_status = 1;
+ remove_wait_queue(&chan->txwaitq, &wait);
+ current->state = TASK_RUNNING;
+ chan->tx_status = 1;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return -ERESTARTSYS;
+ }
+ }
+ remove_wait_queue(&chan->txwaitq, &wait);
+ current->state = TASK_RUNNING;
+ up(&chan->wsem);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ kfree(kbuf);
+ return count;
+}
+
+static int chrdev_tx_done(struct channel_data *chan, int size)
+{
+ if (chan->tx_status) { /* Writer was interrupted */
+ kfree(chan->txbuf);
+ up(&chan->wsem);
+ }
+ chan->tx_status = 1;
+ wake_up_interruptible(&chan->txwaitq);
+ return 1;
+}
+
+static unsigned int cosa_poll(struct file *file, poll_table *poll)
+{
+ printk(KERN_INFO "cosa_poll is here\n");
+ return 0;
+}
+
+static int cosa_open(struct inode *inode, struct file *file)
+{
+ struct cosa_data *cosa;
+ struct channel_data *chan;
+ unsigned long flags;
+ int n;
+
+ if ((n=MINOR(file->f_dentry->d_inode->i_rdev)>>CARD_MINOR_BITS)
+ >= nr_cards)
+ return -ENODEV;
+ cosa = cosa_cards+n;
+
+ if ((n=MINOR(file->f_dentry->d_inode->i_rdev)
+ & ((1<<CARD_MINOR_BITS)-1)) >= cosa->nchannels)
+ return -ENODEV;
+ chan = cosa->chan + n;
+
+ file->private_data = chan;
+
+ spin_lock_irqsave(&cosa->lock, flags);
+
+ if (chan->usage < 0) { /* in netdev mode */
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return -EBUSY;
+ }
+ cosa->usage++;
+ chan->usage++;
+
+ chan->tx_done = chrdev_tx_done;
+ chan->setup_rx = chrdev_setup_rx;
+ chan->rx_done = chrdev_rx_done;
+#ifdef MODULE
+ MOD_INC_USE_COUNT;
+#endif
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return 0;
+}
+
+static int cosa_release(struct inode *inode, struct file *file)
+{
+ struct channel_data *channel = (struct channel_data *)file->private_data;
+ struct cosa_data *cosa = channel->cosa;
+ unsigned long flags;
+
+ spin_lock_irqsave(&cosa->lock, flags);
+ cosa->usage--;
+ channel->usage--;
+#ifdef MODULE
+ MOD_DEC_USE_COUNT;
+#endif
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return 0;
+}
+
+#ifdef COSA_FASYNC_WORKING
+static struct fasync_struct *fasync[256] = { NULL, };
+
+/* To be done ... */
+static int cosa_fasync(struct inode *inode, struct file *file, int on)
+{
+ int port = MINOR(inode->i_rdev);
+ int rv = fasync_helper(inode, file, on, &fasync[port]);
+ return rv < 0 ? rv : 0;
+}
+#endif
+
+
+/* ---------- Ioctls ---------- */
+
+/*
+ * Ioctl subroutines can safely be made inline, because they are called
+ * only from cosa_ioctl().
+ */
+static inline int cosa_reset(struct cosa_data *cosa)
+{
+ char idstring[COSA_MAX_ID_STRING];
+ if (cosa->usage > 1)
+ printk(KERN_INFO "cosa%d: WARNING: reset requested with cosa->usage > 1 (%d). Odd things may happen.\n",
+ cosa->num, cosa->usage);
+ if (cosa_reset_and_read_id(cosa, idstring) < 0) {
+ printk(KERN_NOTICE "cosa%d: reset failed\n", cosa->num);
+ return -EIO;
+ }
+ printk(KERN_INFO "cosa%d: resetting device: %s\n", cosa->num,
+ idstring);
+ return 0;
+}
+
+/* High-level function to download data into COSA memory. Calls download() */
+static inline int cosa_download(struct cosa_data *cosa, struct cosa_download *d)
+{
+ int i;
+ int addr, len;
+ char *code;
+
+ if (cosa->usage > 1)
+ printk(KERN_INFO "cosa%d: WARNING: download of microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
+ cosa->num, cosa->usage);
+#if 0
+ if (cosa->status != CARD_STATUS_RESETED && cosa->status != CARD_STATUS_DOWNLOADED) {
+ printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n",
+ cosa->num, cosa->status);
+ return -EPERM;
+ }
+#endif
+ get_user_ret(addr, &(d->addr), -EFAULT);
+ get_user_ret(len, &(d->len), -EFAULT);
+ get_user_ret(code, &(d->code), -EFAULT);
+
+ if (d->addr < 0 || d->addr > COSA_MAX_FIRMWARE_SIZE)
+ return -EINVAL;
+ if (d->len < 0 || d->len > COSA_MAX_FIRMWARE_SIZE)
+ return -EINVAL;
+
+ if ((i=download(cosa, d->code, len, addr)) < 0) {
+ printk(KERN_NOTICE "cosa%d: microcode download failed: %d\n",
+ cosa->num, i);
+ return -EIO;
+ }
+ printk(KERN_INFO "cosa%d: downloading microcode - 0x%04x bytes at 0x%04x\n",
+ cosa->num, len, addr);
+ return 0;
+}
+
+/* High-level function to read COSA memory. Calls readmem() */
+static inline int cosa_readmem(struct cosa_data *cosa, struct cosa_download *d)
+{
+ int i;
+ int addr, len;
+ char *code;
+
+ if (cosa->usage > 1)
+ printk(KERN_INFO "cosa%d: WARNING: readmem requested with "
+ "cosa->usage > 1 (%d). Odd things may happen.\n",
+ cosa->num, cosa->usage);
+#if 0
+ if (cosa->status != CARD_STATUS_RESETED &&
+ cosa->status != CARD_STATUS_DOWNLOADED) {
+ printk(KERN_NOTICE "cosa%d: reset the card first (status %d).\n",
+ cosa->num, cosa->status);
+ return -EPERM;
+ }
+#endif
+ get_user_ret(addr, &(d->addr), -EFAULT);
+ get_user_ret(len, &(d->len), -EFAULT);
+ get_user_ret(code, &(d->code), -EFAULT);
+
+ if ((i=readmem(cosa, d->code, len, addr)) < 0) {
+ printk(KERN_NOTICE "cosa%d: reading memory failed: %d\n",
+ cosa->num, i);
+ return -EIO;
+ }
+ printk(KERN_INFO "cosa%d: reading card memory - 0x%04x bytes at 0x%04x\n",
+ cosa->num, len, addr);
+ return 0;
+}
+
+/* High-level function to start microcode. Calls startmicrocode(). */
+static inline int cosa_start(struct cosa_data *cosa, int address)
+{
+ int i;
+
+ if (cosa->usage > 1)
+ printk(KERN_INFO "cosa%d: WARNING: start microcode requested with cosa->usage > 1 (%d). Odd things may happen.\n",
+ cosa->num, cosa->usage);
+#if 0
+ if (cosa->status != CARD_STATUS_DOWNLOADED) {
+ printk(KERN_NOTICE "cosa%d: download the microcode first (status %d).\n",
+ cosa->num, cosa->status);
+ return -EPERM;
+ }
+#endif
+ if ((i=startmicrocode(cosa, address)) < 0) {
+ printk(KERN_NOTICE "cosa%d: start microcode at 0x%04x failed: %d\n",
+ cosa->num, address, i);
+ return -EIO;
+ }
+ printk(KERN_INFO "cosa%d: starting microcode at 0x%04x\n",
+ cosa->num, address);
+ cosa->startaddr = address;
+ return 0;
+}
+
+/* Buffer of size at least COSA_MAX_ID_STRING is expected */
+static inline int cosa_getidstr(struct cosa_data *cosa, char *string)
+{
+ int l = strlen(cosa->id_string)+1;
+ copy_to_user_ret(string, cosa->id_string, l, -EFAULT);
+ return l;
+}
+
+/* Buffer of size at least COSA_MAX_ID_STRING is expected */
+static inline int cosa_gettype(struct cosa_data *cosa, char *string)
+{
+ int l = strlen(cosa->type)+1;
+ copy_to_user_ret(string, cosa->type, l, -EFAULT);
+ return l;
+}
+
+static int cosa_ioctl_common(struct cosa_data *cosa,
+ struct channel_data *channel, unsigned int cmd, unsigned long arg)
+{
+ switch(cmd) {
+ case COSAIORSET: /* Reset the device */
+ if (!suser())
+ return -EACCES;
+ return cosa_reset(cosa);
+ case COSAIOSTRT: /* Start the firmware */
+ if (!suser())
+ return -EACCES;
+ return cosa_start(cosa, arg);
+ case COSAIODOWNLD: /* Download the firmware */
+ if (!suser())
+ return -EACCES;
+ return cosa_download(cosa, (struct cosa_download *)arg);
+ case COSAIORMEM:
+ if (!suser())
+ return -EACCES;
+ return cosa_readmem(cosa, (struct cosa_download *)arg);
+ case COSAIORTYPE:
+ return cosa_gettype(cosa, (char *)arg);
+ case COSAIORIDSTR:
+ return cosa_getidstr(cosa, (char *)arg);
+/*
+ * These two are _very_ugly_hack_(tm). Don't even look at this.
+ * Implementing this saved me few reboots after some process segfaulted
+ * inside this module.
+ */
+#ifdef MODULE
+#if 0
+ case COSAIOMINC:
+ MOD_INC_USE_COUNT;
+ return 0;
+ case COSAIOMDEC:
+ MOD_DEC_USE_COUNT;
+ return 0;
+#endif
+#endif
+ case COSAIONRCARDS:
+ return nr_cards;
+ case COSAIONRCHANS:
+ return cosa->nchannels;
+ }
+ return -ENOIOCTLCMD;
+}
+
+static int cosa_sppp_ioctl(struct device *dev, struct ifreq *ifr,
+ int cmd)
+{
+ int rv;
+ struct channel_data *chan = (struct channel_data *)dev->priv;
+ rv = cosa_ioctl_common(chan->cosa, chan, cmd, (int)ifr->ifr_data);
+ if (rv == -ENOIOCTLCMD) {
+ return sppp_do_ioctl(dev, ifr, cmd);
+ }
+ return rv;
+}
+
+static int cosa_chardev_ioctl(struct inode *inode, struct file *file,
+ unsigned int cmd, unsigned long arg)
+{
+ struct channel_data *channel = (struct channel_data *)file->private_data;
+ struct cosa_data *cosa = channel->cosa;
+ return cosa_ioctl_common(cosa, channel, cmd, arg);
+}
+
+
+/*---------- HW layer interface ---------- */
+
+/*
+ * The higher layer can bind itself to the HW layer by setting the callbacks
+ * in the channel_data structure and by using these routines.
+ */
+static void cosa_enable_rx(struct channel_data *chan)
+{
+ struct cosa_data *cosa = chan->cosa;
+
+ if (!test_and_set_bit(chan->num, &cosa->rxbitmap))
+ put_driver_status(cosa);
+}
+
+static void cosa_disable_rx(struct channel_data *chan)
+{
+ struct cosa_data *cosa = chan->cosa;
+
+ if (test_and_clear_bit(chan->num, &cosa->rxbitmap))
+ put_driver_status(cosa);
+}
+
+/*
+ * FIXME: This routine probably should check for cosa_start_tx() called when
+ * the previous transmit is still unfinished. In this case the non-zero
+ * return value should indicate to the caller that the queuing(sp?) up
+ * the transmit has failed.
+ */
+static int cosa_start_tx(struct channel_data *chan, char *buf, int len)
+{
+ struct cosa_data *cosa = chan->cosa;
+ int flags;
+#ifdef DEBUG_DATA
+ int i;
+
+ printk(KERN_INFO "cosa%dc%d: starting tx(0x%x)", chan->cosa->num,
+ chan->num, len);
+ for (i=0; i<len; i++)
+ printk(" %02x", buf[i]&0xff);
+ printk("\n");
+#endif
+ spin_lock_irqsave(&cosa->lock, flags);
+ chan->txbuf = buf;
+ chan->txsize = len;
+ if (len > COSA_MTU)
+ chan->txsize = COSA_MTU;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+
+ /* Tell the firmware we are ready */
+ set_bit(chan->num, &cosa->txbitmap);
+ put_driver_status(cosa);
+
+ return 0;
+}
+
+static void put_driver_status_common(struct cosa_data *cosa, int nolock)
+{
+ unsigned flags=0;
+ int status;
+
+ if (!nolock)
+ spin_lock_irqsave(&cosa->lock, flags);
+
+ status = (cosa->rxbitmap ? DRIVER_RX_READY : 0)
+ | (cosa->txbitmap ? DRIVER_TX_READY : 0)
+ | (cosa->txbitmap? ~(cosa->txbitmap<<DRIVER_TXMAP_SHIFT)
+ &DRIVER_TXMAP_MASK : 0);
+ if (!cosa->rxtx || nolock) {
+#ifdef DEBUG_IO
+ debug_data_cmd(cosa, status);
+#endif
+ cosa_putdata8(cosa, status);
+ if (cosa->rxbitmap|cosa->txbitmap) {
+ cosa_putstatus(cosa, SR_RX_INT_ENA);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, SR_RX_INT_ENA);
+#endif
+ } else {
+ cosa_putstatus(cosa, 0);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, 0);
+#endif
+ }
+ }
+ if (!nolock)
+ spin_unlock_irqrestore(&cosa->lock, flags);
+}
+
+/*
+ * The "kickme" function: When the DMA times out, this is called to
+ * clean up the driver status.
+ * FIXME: Preliminary support, the interface is probably wrong.
+ */
+static void cosa_kick(struct cosa_data *cosa)
+{
+ unsigned flags, flags1;
+
+ printk(KERN_INFO "%s: DMA timeout - restarting.\n", cosa->name);
+
+ spin_lock_irqsave(&cosa->lock, flags);
+ cosa->rxtx = 0;
+
+ flags1 = claim_dma_lock();
+ disable_dma(cosa->dma);
+ clear_dma_ff(cosa->dma);
+ release_dma_lock(flags1);
+
+ /* FIXME: Anything else? */
+ put_driver_status_nolock(cosa);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+}
+
+/*
+ * Check if the whole buffer is DMA-able. It means it is below the 16M of
+ * physical memory and doesn't span the 64k boundary. For now it seems
+ * SKB's never do this, but we'll check this anyway.
+ */
+static int cosa_dma_able(struct channel_data *chan, char *buf, int len)
+{
+ static int count = 0;
+ unsigned long b = (unsigned long)buf;
+ if (b+len >= MAX_DMA_ADDRESS)
+ return 0;
+ if ((b^ (b+len)) & 0x10000) {
+ if (count++ < 5)
+ printk(KERN_INFO "%s: packet spanning a 64k boundary\n",
+ chan->name);
+ return 0;
+ }
+ return 1;
+}
+
+
+/* ---------- The SRP/COSA ROM monitor functions ---------- */
+
+/*
+ * Downloading SRP microcode: say "w" to SRP monitor, it answers by "w=",
+ * drivers need to say 4-digit hex number meaning start address of the microcode
+ * separated by a single space. Monitor replies by saying " =". Now driver
+ * has to write 4-digit hex number meaning the last byte address ended
+ * by a single space. Monitor has to reply with a space. Now the download
+ * begins. After the download monitor replies with "\r\n." (CR LF dot).
+ */
+static int download(struct cosa_data *cosa, char *microcode, int length, int address)
+{
+ int i;
+
+ if (put_wait_data(cosa, 'w') == -1) return -1;
+ if ((i=get_wait_data(cosa)) != 'w') { printk("dnld: 0x%04x\n",i); return -2;}
+ if (get_wait_data(cosa) != '=') return -3;
+
+ if (puthexnumber(cosa, address) < 0) return -4;
+ if (put_wait_data(cosa, ' ') == -1) return -10;
+ if (get_wait_data(cosa) != ' ') return -11;
+ if (get_wait_data(cosa) != '=') return -12;
+
+ if (puthexnumber(cosa, address+length-1) < 0) return -13;
+ if (put_wait_data(cosa, ' ') == -1) return -18;
+ if (get_wait_data(cosa) != ' ') return -19;
+
+ while (length--) {
+ char c;
+#ifndef SRP_DOWNLOAD_AT_BOOT
+ get_user_ret(c,microcode, -23);
+#else
+ c = *microcode;
+#endif
+ if (put_wait_data(cosa, c) == -1)
+ return -20;
+ microcode++;
+ }
+
+ if (get_wait_data(cosa) != '\r') return -21;
+ if (get_wait_data(cosa) != '\n') return -22;
+ if (get_wait_data(cosa) != '.') return -23;
+#if 0
+ printk(KERN_DEBUG "cosa%d: download completed.\n", cosa->num);
+#endif
+ return 0;
+}
+
+
+/*
+ * Starting microcode is done via the "g" command of the SRP monitor.
+ * The chat should be the following: "g" "g=" "<addr><CR>"
+ * "<CR><CR><LF><CR><LF>".
+ */
+static int startmicrocode(struct cosa_data *cosa, int address)
+{
+ if (put_wait_data(cosa, 'g') == -1) return -1;
+ if (get_wait_data(cosa) != 'g') return -2;
+ if (get_wait_data(cosa) != '=') return -3;
+
+ if (puthexnumber(cosa, address) < 0) return -4;
+ if (put_wait_data(cosa, '\r') == -1) return -5;
+
+ if (get_wait_data(cosa) != '\r') return -6;
+ if (get_wait_data(cosa) != '\r') return -7;
+ if (get_wait_data(cosa) != '\n') return -8;
+ if (get_wait_data(cosa) != '\r') return -9;
+ if (get_wait_data(cosa) != '\n') return -10;
+#if 0
+ printk(KERN_DEBUG "cosa%d: microcode started\n", cosa->num);
+#endif
+ return 0;
+}
+
+/*
+ * Reading memory is done via the "r" command of the SRP monitor.
+ * The chat is the following "r" "r=" "<addr> " " =" "<last_byte> " " "
+ * Then driver can read the data and the conversation is finished
+ * by SRP monitor sending "<CR><LF>." (dot at the end).
+ *
+ * This routine is not needed during the normal operation and serves
+ * for debugging purposes only.
+ */
+static int readmem(struct cosa_data *cosa, char *microcode, int length, int address)
+{
+ if (put_wait_data(cosa, 'r') == -1) return -1;
+ if ((get_wait_data(cosa)) != 'r') return -2;
+ if ((get_wait_data(cosa)) != '=') return -3;
+
+ if (puthexnumber(cosa, address) < 0) return -4;
+ if (put_wait_data(cosa, ' ') == -1) return -5;
+ if (get_wait_data(cosa) != ' ') return -6;
+ if (get_wait_data(cosa) != '=') return -7;
+
+ if (puthexnumber(cosa, address+length-1) < 0) return -8;
+ if (put_wait_data(cosa, ' ') == -1) return -9;
+ if (get_wait_data(cosa) != ' ') return -10;
+
+ while (length--) {
+ char c;
+ int i;
+ if ((i=get_wait_data(cosa)) == -1) {
+ printk (KERN_INFO "cosa: 0x%04x bytes remaining\n",
+ length);
+ return -11;
+ }
+ c=i;
+#if 1
+ put_user_ret(c,microcode, -23);
+#else
+ *microcode = c;
+#endif
+ microcode++;
+ }
+
+ if (get_wait_data(cosa) != '\r') return -21;
+ if (get_wait_data(cosa) != '\n') return -22;
+ if (get_wait_data(cosa) != '.') return -23;
+#if 0
+ printk(KERN_DEBUG "cosa%d: readmem completed.\n", cosa->num);
+#endif
+ return 0;
+}
+
+/*
+ * This function resets the device and reads the initial prompt
+ * of the device's ROM monitor.
+ */
+static int cosa_reset_and_read_id(struct cosa_data *cosa, char *idstring)
+{
+ int i=0, id=0, prev=0, curr=0;
+
+ /* Reset the card ... */
+ cosa_putstatus(cosa, 0);
+ cosa_getdata8(cosa);
+ cosa_putstatus(cosa, SR_RST);
+#ifdef MODULE
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(HZ/2);
+ current->state = TASK_RUNNING;
+#else
+ udelay(5*100000);
+#endif
+ /* Disable all IRQs from the card */
+ cosa_putstatus(cosa, 0);
+
+ /*
+ * Try to read the ID string. The card then prints out the
+ * identification string ended by the "\n\x2e".
+ *
+ * The following loop is indexed through i (instead of id)
+ * to avoid looping forever when for any reason
+ * the port returns '\r', '\n' or '\x2e' permanently.
+ */
+ for (i=0; i<COSA_MAX_ID_STRING-1; i++, prev=curr) {
+ if ((curr = get_wait_data(cosa)) == -1) {
+ return -1;
+ }
+ curr &= 0xff;
+ if (curr != '\r' && curr != '\n' && curr != 0x2e)
+ idstring[id++] = curr;
+ if (curr == 0x2e && prev == '\n')
+ break;
+ }
+ /* Perhaps we should fail when i==COSA_MAX_ID_STRING-1 ? */
+ idstring[id] = '\0';
+ return id;
+}
+
+
+/* ---------- Auxiliary routines for COSA/SRP monitor ---------- */
+
+/*
+ * This routine gets the data byte from the card waiting for the SR_RX_RDY
+ * bit to be set in a loop. It should be used in the exceptional cases
+ * only (for example when resetting the card or downloading the firmware.
+ */
+static int get_wait_data(struct cosa_data *cosa)
+{
+ int retries = 1000;
+
+ while (--retries) {
+ /* read data and return them */
+ if (cosa_getstatus(cosa) & SR_RX_RDY) {
+ short r;
+ r = cosa_getdata8(cosa);
+#if 0
+ printk(KERN_INFO "cosa: get_wait_data returning after %d retries\n", 999-retries);
+#endif
+ return r;
+ }
+ /* sleep if not ready to read */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(1);
+ current->state = TASK_RUNNING;
+ }
+ printk(KERN_INFO "cosa: timeout in get_wait_data (status 0x%x)\n",
+ cosa_getstatus(cosa));
+ return -1;
+}
+
+/*
+ * This routine puts the data byte to the card waiting for the SR_TX_RDY
+ * bit to be set in a loop. It should be used in the exceptional cases
+ * only (for example when resetting the card or downloading the firmware).
+ */
+static int put_wait_data(struct cosa_data *cosa, int data)
+{
+ int retries = 1000;
+ while (--retries) {
+ /* read data and return them */
+ if (cosa_getstatus(cosa) & SR_TX_RDY) {
+ cosa_putdata8(cosa, data);
+#if 0
+ printk(KERN_INFO "Putdata: %d retries\n", 999-retries);
+#endif
+ return 0;
+ }
+#if 0
+ /* sleep if not ready to read */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(1);
+ current->state = TASK_RUNNING;
+#endif
+ }
+ printk(KERN_INFO "cosa%d: timeout in put_wait_data (status 0x%x)\n",
+ cosa->num, cosa_getstatus(cosa));
+ return -1;
+}
+
+/*
+ * The following routine puts the hexadecimal number into the SRP monitor
+ * and verifies the proper echo of the sent bytes. Returns 0 on success,
+ * negative number on failure (-1,-3,-5,-7) means that put_wait_data() failed,
+ * (-2,-4,-6,-8) means that reading echo failed.
+ */
+static int puthexnumber(struct cosa_data *cosa, int number)
+{
+ char temp[5];
+ int i;
+
+ /* Well, I should probably replace this by something faster. */
+ sprintf(temp, "%04X", number);
+ for (i=0; i<4; i++) {
+ if (put_wait_data(cosa, temp[i]) == -1) {
+ printk(KERN_NOTICE "cosa%d: puthexnumber failed to write byte %d\n",
+ cosa->num, i);
+ return -1-2*i;
+ }
+ if (get_wait_data(cosa) != temp[i]) {
+ printk(KERN_NOTICE "cosa%d: puthexhumber failed to read echo of byte %d\n",
+ cosa->num, i);
+ return -2-2*i;
+ }
+ }
+ return 0;
+}
+
+
+/* ---------- Interrupt routines ---------- */
+
+/*
+ * There are three types of interrupt:
+ * At the beginning of transmit - this handled is in tx_interrupt(),
+ * at the beginning of receive - it is in rx_interrupt() and
+ * at the end of transmit/receive - it is the eot_interrupt() function.
+ * These functions are multiplexed by cosa_interrupt() according to the
+ * COSA status byte. I have moved the rx/tx/eot interrupt handling into
+ * separate functions to make it more readable. These functions are inline,
+ * so there should be no overhead of function call.
+ */
+
+/*
+ * Transmit interrupt routine - called when COSA is willing to obtain
+ * data from the OS. The most tricky part of the routine is selection
+ * of channel we (OS) want to send packet for. For SRP we should probably
+ * use the round-robin approach. The newer COSA firmwares have a simple
+ * flow-control - in the status word has bits 2 and 3 set to 1 means that the
+ * channel 0 or 1 doesn't want to receive data.
+ */
+static inline void tx_interrupt(struct cosa_data *cosa, int status)
+{
+ unsigned long flags, flags1;
+#ifdef DEBUG_IRQS
+ printk(KERN_INFO "cosa%d: SR_DOWN_REQUEST status=0x%04x\n",
+ cosa->num, status);
+#endif
+ spin_lock_irqsave(&cosa->lock, flags);
+ set_bit(TXBIT, &cosa->rxtx);
+ if (!test_bit(IRQBIT, &cosa->rxtx)) {
+ /* flow control */
+ int i=0;
+ do {
+ if (i++ > cosa->nchannels) {
+ printk(KERN_WARNING
+ "%s: No channel wants data in TX IRQ\n",
+ cosa->name);
+ clear_bit(TXBIT, &cosa->rxtx);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return;
+ }
+ cosa->txchan++;
+ if (cosa->txchan >= cosa->nchannels)
+ cosa->txchan = 0;
+ } while ((!(cosa->txbitmap & (1<<cosa->txchan)))
+ || status & (1<<(cosa->txchan+DRIVER_TXMAP_SHIFT)));
+
+ cosa->txsize = cosa->chan[cosa->txchan].txsize;
+ if (cosa_dma_able(cosa->chan+cosa->txchan,
+ cosa->chan[cosa->txchan].txbuf, cosa->txsize)) {
+ cosa->txbuf = cosa->chan[cosa->txchan].txbuf;
+ } else {
+ memcpy(cosa->bouncebuf, cosa->chan[cosa->txchan].txbuf,
+ cosa->txsize);
+ cosa->txbuf = cosa->bouncebuf;
+ }
+ }
+
+ if (is_8bit(cosa)) {
+ if (!test_bit(IRQBIT, &cosa->rxtx)) {
+ cosa_putdata8(cosa, ((cosa->txchan << 5) & 0xe0)|
+ ((cosa->txsize >> 8) & 0x1f));
+ cosa_putstatus(cosa, SR_TX_INT_ENA);
+#ifdef DEBUG_IO
+ debug_data_out(cosa, ((cosa->txchan << 5) & 0xe0)|
+ ((cosa->txsize >> 8) & 0x1f));
+ debug_status_out(cosa, SR_TX_INT_ENA);
+ debug_data_in(cosa, cosa_getdata8(cosa));
+#else
+ cosa_getdata8(cosa);
+#endif
+ set_bit(IRQBIT, &cosa->rxtx);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return;
+ } else {
+ clear_bit(IRQBIT, &cosa->rxtx);
+ cosa_putstatus(cosa, 0);
+ cosa_putdata8(cosa, cosa->txsize&0xff);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, 0);
+ debug_data_out(cosa, cosa->txsize&0xff);
+#endif
+ }
+ } else {
+ cosa_putdata16(cosa, ((cosa->txchan<<13) & 0xe000)
+ | (cosa->txsize & 0x1fff));
+ cosa_getdata16(cosa);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, ((cosa->txchan<<13) & 0xe000)
+ | (cosa->txsize & 0x1fff));
+ debug_data_in(cosa, cosa_getdata16(cosa));
+#else
+ cosa_getdata16(cosa);
+#endif
+ }
+
+ /* start the DMA */
+ flags1 = claim_dma_lock();
+ disable_dma(cosa->dma);
+ clear_dma_ff(cosa->dma);
+ set_dma_mode(cosa->dma, DMA_MODE_WRITE);
+ set_dma_addr(cosa->dma, virt_to_bus(cosa->txbuf));
+ set_dma_count(cosa->dma, cosa->txsize);
+ enable_dma(cosa->dma);
+ release_dma_lock(flags1);
+ cosa_putstatus(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, SR_TX_DMA_ENA|SR_USR_INT_ENA);
+#endif
+ spin_unlock_irqrestore(&cosa->lock, flags);
+}
+
+static inline void rx_interrupt(struct cosa_data *cosa, int status)
+{
+ unsigned long flags;
+#ifdef DEBUG_IRQS
+ printk(KERN_INFO "cosa%d: SR_UP_REQUEST\n", cosa->num);
+#endif
+
+ spin_lock_irqsave(&cosa->lock, flags);
+ set_bit(RXBIT, &cosa->rxtx);
+
+ if (is_8bit(cosa)) {
+ if (!test_bit(IRQBIT, &cosa->rxtx)) {
+ set_bit(IRQBIT, &cosa->rxtx);
+ cosa_putstatus(cosa, 0);
+ cosa->rxsize = cosa_getdata8(cosa) <<8;
+#ifdef DEBUG_IO
+ debug_status_out(cosa, 0);
+ debug_data_in(cosa, cosa->rxsize >> 8);
+#endif
+ put_driver_status_nolock(cosa);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ return;
+ } else {
+ clear_bit(IRQBIT, &cosa->rxtx);
+ cosa_putstatus(cosa, 0);
+ cosa->rxsize |= cosa_getdata8(cosa) & 0xff;
+#ifdef DEBUG_IO
+ debug_status_out(cosa, 0);
+ debug_data_in(cosa, cosa->rxsize & 0xff);
+#endif
+#if 0
+ printk(KERN_INFO "cosa%d: receive rxsize = (0x%04x).\n",
+ cosa->num, cosa->rxsize);
+#endif
+ }
+ } else {
+ cosa->rxsize = cosa_getdata16(cosa);
+ cosa_putstatus(cosa, 0);
+ cosa_putdata8(cosa, DRIVER_RX_READY);
+#ifdef DEBUG_IO
+ debug_data_in(cosa, cosa->rxsize);
+ debug_status_out(cosa, 0);
+ debug_cmd_out(cosa, DRIVER_RX_READY);
+#endif
+#if 0
+ printk(KERN_INFO "cosa%d: receive rxsize = (0x%04x).\n",
+ cosa->num, cosa->rxsize);
+#endif
+ }
+ if (((cosa->rxsize & 0xe000) >> 13) >= cosa->nchannels) {
+ printk(KERN_WARNING "%s: rx for unknown channel (0x%04x)\n",
+ cosa->name, cosa->rxsize);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+ goto reject;
+ }
+ cosa->rxchan = cosa->chan + ((cosa->rxsize & 0xe000) >> 13);
+ cosa->rxsize &= 0x1fff;
+ spin_unlock_irqrestore(&cosa->lock, flags);
+
+ cosa->rxbuf = NULL;
+ if (cosa->rxchan->setup_rx)
+ cosa->rxbuf = cosa->rxchan->setup_rx(cosa->rxchan, cosa->rxsize);
+
+ if (!cosa->rxbuf) {
+reject: /* Reject the packet */
+ printk(KERN_INFO "cosa%d: rejecting packet on channel %d\n",
+ cosa->num, cosa->rxchan->num);
+ /* FIXME: This works for COSA only (not SRP) */
+ cosa->rxtx = 0;
+ put_driver_status(cosa);
+ return;
+ }
+
+ /* start the DMA */
+ flags = claim_dma_lock();
+ disable_dma(cosa->dma);
+ clear_dma_ff(cosa->dma);
+ set_dma_mode(cosa->dma, DMA_MODE_READ);
+ if (cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize & 0x1fff)) {
+ set_dma_addr(cosa->dma, virt_to_bus(cosa->rxbuf));
+ } else {
+ set_dma_addr(cosa->dma, virt_to_bus(cosa->bouncebuf));
+ }
+ set_dma_count(cosa->dma, (cosa->rxsize&0x1fff));
+ enable_dma(cosa->dma);
+ release_dma_lock(flags);
+ spin_lock_irqsave(&cosa->lock, flags);
+ cosa_putstatus(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA);
+#ifdef DEBUG_IO
+ debug_status_out(cosa, SR_RX_DMA_ENA|SR_USR_INT_ENA);
+#endif
+ spin_unlock_irqrestore(&cosa->lock, flags);
+}
+
+static void inline eot_interrupt(struct cosa_data *cosa, int status)
+{
+ unsigned long flags, flags1;
+ spin_lock_irqsave(&cosa->lock, flags);
+ if (test_bit(TXBIT, &cosa->rxtx)) {
+ struct channel_data *chan = cosa->chan+cosa->txchan;
+#ifdef DEBUG_IRQS
+ printk(KERN_INFO "cosa%d: end of transfer.\n", cosa->num);
+#endif
+ if (chan->tx_done)
+ if (chan->tx_done(chan, cosa->txsize))
+ clear_bit(chan->num, &cosa->txbitmap);
+ } else if (test_bit(RXBIT, &cosa->rxtx)) {
+#ifdef DEBUG_DATA
+ {
+ int i;
+ printk(KERN_INFO "cosa%dc%d: done rx(0x%x)", cosa->num,
+ cosa->rxchan->num, cosa->rxsize);
+ for (i=0; i<cosa->rxsize; i++)
+ printk (" %02x", cosa->rxbuf[i]&0xff);
+ printk("\n");
+ }
+#endif
+ if (!cosa_dma_able(cosa->rxchan, cosa->rxbuf, cosa->rxsize))
+ memcpy(cosa->rxbuf, cosa->bouncebuf, cosa->rxsize);
+ if (cosa->rxchan->rx_done)
+ if (cosa->rxchan->rx_done(cosa->rxchan))
+ clear_bit(cosa->rxchan->num, &cosa->rxbitmap);
+ } else {
+ printk(KERN_NOTICE "cosa%d: unexpected EOT interrupt\n",
+ cosa->num);
+ }
+ /*
+ * Clear the RXBIT, TXBIT and IRQBIT (the latest should be
+ * cleared anyway).
+ */
+ flags1 = claim_dma_lock();
+ disable_dma(cosa->dma);
+ clear_dma_ff(cosa->dma);
+ release_dma_lock(flags1);
+ cosa->rxtx = 0;
+ put_driver_status_nolock(cosa);
+ spin_unlock_irqrestore(&cosa->lock, flags);
+}
+
+static void cosa_interrupt(int irq, void *cosa_, struct pt_regs *regs)
+{
+ int status;
+ int count = 0;
+ struct cosa_data *cosa = cosa_;
+again:
+ status = cosa_getstatus(cosa);
+#ifdef DEBUG_IRQS
+ printk(KERN_INFO "cosa%d: got IRQ, status 0x%02x\n", cosa->num,
+ status & 0xff);
+#endif
+#ifdef DEBUG_IO
+ debug_status_in(cosa, status);
+#endif
+ switch (status & SR_CMD_FROM_SRP_MASK) {
+ case SR_DOWN_REQUEST:
+ tx_interrupt(cosa, status);
+ break;
+ case SR_UP_REQUEST:
+ rx_interrupt(cosa, status);
+ break;
+ case SR_END_OF_TRANSFER:
+ eot_interrupt(cosa, status);
+ break;
+ default:
+ /* We may be too fast for SRP. Try to wait a bit more. */
+ if (count++ < 100) {
+ udelay(100);
+ goto again;
+ }
+ printk(KERN_INFO "cosa%d: unknown status 0x%02x in IRQ after %d retries\n",
+ cosa->num, status & 0xff, count);
+ }
+#ifdef DEBUG_IRQS
+ if (count)
+ printk(KERN_INFO "%s: %d-times got unknown status in IRQ\n",
+ cosa->name, count);
+ else
+ printk(KERN_INFO "%s: returning from IRQ\n", cosa->name);
+#endif
+}
+
+
+/* ---------- I/O debugging routines ---------- */
+/*
+ * These routines can be used to monitor COSA/SRP I/O and to printk()
+ * the data being transfered on the data and status I/O port in a
+ * readable way.
+ */
+
+#ifdef DEBUG_IO
+static void debug_status_in(struct cosa_data *cosa, int status)
+{
+ char *s;
+ switch(status & SR_CMD_FROM_SRP_MASK) {
+ case SR_UP_REQUEST:
+ s = "RX_REQ";
+ break;
+ case SR_DOWN_REQUEST:
+ s = "TX_REQ";
+ break;
+ case SR_END_OF_TRANSFER:
+ s = "ET_REQ";
+ break;
+ default:
+ s = "NO_REQ";
+ break;
+ }
+ printk(KERN_INFO "%s: IO: status -> 0x%02x (%s%s%s%s)\n",
+ cosa->name,
+ status,
+ status & SR_USR_RQ ? "USR_RQ|":"",
+ status & SR_TX_RDY ? "TX_RDY|":"",
+ status & SR_RX_RDY ? "RX_RDY|":"",
+ s);
+}
+
+static void debug_status_out(struct cosa_data *cosa, int status)
+{
+ printk(KERN_INFO "%s: IO: status <- 0x%02x (%s%s%s%s%s%s)\n",
+ cosa->name,
+ status,
+ status & SR_RX_DMA_ENA ? "RXDMA|":"!rxdma|",
+ status & SR_TX_DMA_ENA ? "TXDMA|":"!txdma|",
+ status & SR_RST ? "RESET|":"",
+ status & SR_USR_INT_ENA ? "USRINT|":"!usrint|",
+ status & SR_TX_INT_ENA ? "TXINT|":"!txint|",
+ status & SR_RX_INT_ENA ? "RXINT":"!rxint");
+}
+
+static void debug_data_in(struct cosa_data *cosa, int data)
+{
+ printk(KERN_INFO "%s: IO: data -> 0x%04x\n", cosa->name, data);
+}
+
+static void debug_data_out(struct cosa_data *cosa, int data)
+{
+ printk(KERN_INFO "%s: IO: data <- 0x%04x\n", cosa->name, data);
+}
+
+static void debug_data_cmd(struct cosa_data *cosa, int data)
+{
+ printk(KERN_INFO "%s: IO: data <- 0x%04x (%s|%s)\n",
+ cosa->name, data,
+ data & SR_RDY_RCV ? "RX_RDY" : "!rx_rdy",
+ data & SR_RDY_SND ? "TX_RDY" : "!tx_rdy");
+}
+#endif
+
+/* EOF -- this file has not been truncated */
diff --git a/drivers/net/cosa.h b/drivers/net/cosa.h
new file mode 100644
index 000000000..09f2e243d
--- /dev/null
+++ b/drivers/net/cosa.h
@@ -0,0 +1,102 @@
+/* $Id: cosa.h,v 1.5 1998/12/24 12:40:18 kas Exp $ */
+
+/*
+ * Copyright (C) 1995-1997 Jan "Yenya" Kasprzak <kas@fi.muni.cz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef COSA_H__
+#define COSA_H__
+
+#include <linux/ioctl.h>
+
+#ifdef __KERNEL__
+/* status register - output bits */
+#define SR_RX_DMA_ENA 0x04 /* receiver DMA enable bit */
+#define SR_TX_DMA_ENA 0x08 /* transmitter DMA enable bit */
+#define SR_RST 0x10 /* SRP reset */
+#define SR_USR_INT_ENA 0x20 /* user interrupt enable bit */
+#define SR_TX_INT_ENA 0x40 /* transmitter interrupt enable bit */
+#define SR_RX_INT_ENA 0x80 /* receiver interrupt enable bit */
+
+/* status register - input bits */
+#define SR_USR_RQ 0x20 /* user interupt request pending */
+#define SR_TX_RDY 0x40 /* transmitter empty (ready) */
+#define SR_RX_RDY 0x80 /* receiver data ready */
+
+#define SR_UP_REQUEST 0x02 /* request from SRP to transfer data
+ up to PC */
+#define SR_DOWN_REQUEST 0x01 /* SRP is able to transfer data down
+ from PC to SRP */
+#define SR_END_OF_TRANSFER 0x03 /* SRP signalize end of
+ transfer (up or down) */
+
+#define SR_CMD_FROM_SRP_MASK 0x03 /* mask to get SRP command */
+
+/* bits in driver status byte definitions : */
+#define SR_RDY_RCV 0x01 /* ready to receive packet */
+#define SR_RDY_SND 0x02 /* ready to send packet */
+#define SR_CMD_PND 0x04 /* command pending */ /* not currently used */
+
+/* ???? */
+#define SR_PKT_UP 0x01 /* transfer of packet up in progress */
+#define SR_PKT_DOWN 0x02 /* transfer of packet down in progress */
+
+#endif /* __KERNEL__ */
+
+#define SR_LOAD_ADDR 0x4400 /* SRP microcode load address */
+#define SR_START_ADDR 0x4400 /* SRP microcode start address */
+
+#define COSA_LOAD_ADDR 0x400 /* SRP microcode load address */
+#define COSA_MAX_FIRMWARE_SIZE 0x10000
+
+/* ioctls */
+struct cosa_download {
+ int addr, len;
+ char *code;
+};
+
+/* Reset the device */
+#define COSAIORSET _IO('C',0xf0)
+
+/* Start microcode at given address */
+#define COSAIOSTRT _IOW('C',0xf1,sizeof(int))
+
+/* Read the block from the device memory */
+#define COSAIORMEM _IOR('C',0xf2,sizeof(struct cosa_download *))
+
+/* Write the block to the device memory (i.e. download the microcode) */
+#define COSAIODOWNLD _IOW('C',0xf2,sizeof(struct cosa_download *))
+
+/* Read the device type (one of "srp", "cosa", and "cosa8" for now) */
+#define COSAIORTYPE _IOR('C',0xf3,sizeof(char *))
+
+/* Read the device identification string */
+#define COSAIORIDSTR _IOR('C',0xf4,sizeof(char *))
+/* Maximum length of the identification string. */
+#define COSA_MAX_ID_STRING 128
+
+/* Increment/decrement the module usage count :-) */
+/* #define COSAIOMINC _IO('C',0xf5) */
+/* #define COSAIOMDEC _IO('C',0xf6) */
+
+/* Get the total number of cards installed */
+#define COSAIONRCARDS _IO('C',0xf7)
+
+/* Get the number of channels on this card */
+#define COSAIONRCHANS _IO('C',0xf8)
+
+#endif /* !COSA_H__ */
diff --git a/drivers/net/daynaport.c b/drivers/net/daynaport.c
index 00c0ed9b6..777a1dcab 100644
--- a/drivers/net/daynaport.c
+++ b/drivers/net/daynaport.c
@@ -340,13 +340,13 @@ int ns8390_probe1(struct device *dev, int word16, char *model_name, int type, in
{
static unsigned version_printed = 0;
- static int fwrd4_offsets[16]={
+ static u32 fwrd4_offsets[16]={
0, 4, 8, 12,
16, 20, 24, 28,
32, 36, 40, 44,
48, 52, 56, 60
};
- static int back4_offsets[16]={
+ static u32 back4_offsets[16]={
60, 56, 52, 48,
44, 40, 36, 32,
28, 24, 20, 16,
diff --git a/drivers/net/de4x5.c b/drivers/net/de4x5.c
index bbc86f2a2..0ce0e89f9 100644
--- a/drivers/net/de4x5.c
+++ b/drivers/net/de4x5.c
@@ -415,11 +415,12 @@
alignment for Alpha's and avoid their unaligned
access traps. This flag is merely for log messages:
should do something more definitive though...
+ 0.543 30-Dec-98 Add SMP spin locking.
=========================================================================
*/
-static const char *version = "de4x5.c:V0.542 1998/9/15 davies@maniac.ultranet.com\n";
+static const char *version = "de4x5.c:V0.543 1998/12/30 davies@maniac.ultranet.com\n";
#include <linux/config.h>
#include <linux/module.h>
@@ -443,6 +444,7 @@ static const char *version = "de4x5.c:V0.542 1998/9/15 davies@maniac.ultranet.co
#include <asm/byteorder.h>
#include <asm/unaligned.h>
#include <asm/uaccess.h>
+#include <asm/spinlock.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
@@ -508,11 +510,11 @@ struct sia_phy {
** recognised by this driver.
*/
static struct phy_table phy_info[] = {
- {0, NATIONAL_TX, 1, {0x19, 0x40, 0x00}}, /* National TX */
- {1, BROADCOM_T4, 1, {0x10, 0x02, 0x02}}, /* Broadcom T4 */
- {0, SEEQ_T4 , 1, {0x12, 0x10, 0x10}}, /* SEEQ T4 */
- {0, CYPRESS_T4 , 1, {0x05, 0x20, 0x20}}, /* Cypress T4 */
- {0, 0x7810 , 1, {0x05, 0x0380, 0x0380}} /* Level One? */
+ {0, NATIONAL_TX, 1, {0x19, 0x40, 0x00}}, /* National TX */
+ {1, BROADCOM_T4, 1, {0x10, 0x02, 0x02}}, /* Broadcom T4 */
+ {0, SEEQ_T4 , 1, {0x12, 0x10, 0x10}}, /* SEEQ T4 */
+ {0, CYPRESS_T4 , 1, {0x05, 0x20, 0x20}}, /* Cypress T4 */
+ {0, 0x7810 , 1, {0x14, 0x0800, 0x0800}} /* Level One LTX970 */
};
/*
@@ -759,7 +761,8 @@ struct de4x5_private {
int tx_new, tx_old; /* TX descriptor ring pointers */
char setup_frame[SETUP_FRAME_LEN]; /* Holds MCA and PA info. */
char frame[64]; /* Min sized packet for loopback*/
- struct net_device_stats stats; /* Public stats */
+ spinlock_t lock; /* Adapter specific spinlock */
+ struct net_device_stats stats; /* Public stats */
struct {
u_int bins[DE4X5_PKT_STAT_SZ]; /* Private stats counters */
u_int unicast;
@@ -1192,6 +1195,7 @@ de4x5_hw_init(struct device *dev, u_long iobase))
lp->timeout = -1;
lp->useSROM = useSROM;
memcpy((char *)&lp->srom,(char *)&bus.srom,sizeof(struct de4x5_srom));
+ lp->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
de4x5_parse_params(dev);
/*
@@ -1345,7 +1349,7 @@ de4x5_open(struct device *dev)
** Re-initialize the DE4X5...
*/
status = de4x5_init(dev);
-
+ lp->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
lp->state = OPEN;
de4x5_dbg_open(dev);
@@ -1497,6 +1501,7 @@ de4x5_queue_pkt(struct sk_buff *skb, struct device *dev)
struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
u_long iobase = dev->base_addr;
int status = 0;
+ u_long flags = 0;
test_and_set_bit(0, (void*)&dev->tbusy); /* Stop send re-tries */
if (lp->tx_enable == NO) { /* Cannot send for now */
@@ -1508,9 +1513,9 @@ de4x5_queue_pkt(struct sk_buff *skb, struct device *dev)
** interrupts are lost by delayed descriptor status updates relative to
** the irq assertion, especially with a busy PCI bus.
*/
- cli();
+ spin_lock_irqsave(&lp->lock, flags);
de4x5_tx(dev);
- sti();
+ spin_unlock_irqrestore(&lp->lock, flags);
/* Test if cache is already locked - requeue skb if so */
if (test_and_set_bit(0, (void *)&lp->cache.lock) && !lp->interrupt)
@@ -1534,7 +1539,7 @@ de4x5_queue_pkt(struct sk_buff *skb, struct device *dev)
}
while (skb && !dev->tbusy && !lp->tx_skb[lp->tx_new]) {
- cli();
+ spin_lock_irqsave(&lp->lock, flags);
test_and_set_bit(0, (void*)&dev->tbusy);
load_packet(dev, skb->data, TD_IC | TD_LS | TD_FS | skb->len, skb);
lp->stats.tx_bytes += skb->len;
@@ -1547,7 +1552,7 @@ de4x5_queue_pkt(struct sk_buff *skb, struct device *dev)
dev->tbusy = 0; /* Another pkt may be queued */
}
skb = de4x5_get_cache(dev);
- sti();
+ spin_unlock_irqrestore(&lp->lock, flags);
}
if (skb) de4x5_putb_cache(dev, skb);
}
@@ -1581,6 +1586,7 @@ de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs)
return;
}
lp = (struct de4x5_private *)dev->priv;
+ spin_lock(&lp->lock);
iobase = dev->base_addr;
DISABLE_IRQs; /* Ensure non re-entrancy */
@@ -1628,6 +1634,7 @@ de4x5_interrupt(int irq, void *dev_id, struct pt_regs *regs)
lp->interrupt = UNMASK_INTERRUPTS;
ENABLE_IRQs;
+ spin_unlock(&lp->lock);
return;
}
@@ -2069,7 +2076,9 @@ eisa_probe(struct device *dev, u_long ioaddr))
irq = inb(EISA_REG0);
irq = de4x5_irq[(irq >> 1) & 0x03];
- if (is_DC2114x) device |= (cfrv & CFRV_RN);
+ if (is_DC2114x) {
+ device = ((cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
+ }
lp->chipset = device;
/* Write the PCI Configuration Registers */
@@ -2165,7 +2174,9 @@ pci_probe(struct device *dev, u_long ioaddr))
lp->bus_num = pb;
/* Set the chipset information */
- if (is_DC2114x) device |= (cfrv & CFRV_RN);
+ if (is_DC2114x) {
+ device = ((cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
+ }
lp->chipset = device;
/* Get the board I/O address (64 bits on sparc64) */
@@ -2249,7 +2260,9 @@ srom_search(struct pci_dev *dev))
lp->bus_num = pb;
/* Set the chipset information */
- if (is_DC2114x) device |= (cfrv & CFRV_RN);
+ if (is_DC2114x) {
+ device = ((cfrv & CFRV_RN) < DC2114x_BRK ? DC21142 : DC21143);
+ }
lp->chipset = device;
/* Get the board I/O address (64 bits on sparc64) */
@@ -3223,18 +3236,19 @@ de4x5_init_connection(struct device *dev)
{
struct de4x5_private *lp = (struct de4x5_private *)dev->priv;
u_long iobase = dev->base_addr;
+ u_long flags = 0;
if (lp->media != lp->c_media) {
de4x5_dbg_media(dev);
lp->c_media = lp->media; /* Stop scrolling media messages */
}
- cli();
+ spin_lock_irqsave(&lp->lock, flags);
de4x5_rst_desc_ring(dev);
de4x5_setup_intr(dev);
lp->tx_enable = YES;
dev->tbusy = 0;
- sti();
+ spin_unlock_irqrestore(&lp->lock, flags);
outl(POLL_DEMAND, DE4X5_TPD);
mark_bh(NET_BH);
@@ -5524,116 +5538,90 @@ de4x5_ioctl(struct device *dev, struct ifreq *rq, int cmd)
u16 sval[72];
u32 lval[36];
} tmp;
+ u_long flags = 0;
switch(ioc->cmd) {
case DE4X5_GET_HWADDR: /* Get the hardware address */
ioc->len = ETH_ALEN;
- status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len);
- if (status)
- break;
+ if (verify_area(VERIFY_WRITE, ioc->data, ioc->len)) return -EFAULT;
for (i=0; i<ETH_ALEN; i++) {
tmp.addr[i] = dev->dev_addr[i];
}
copy_to_user(ioc->data, tmp.addr, ioc->len);
-
break;
+
case DE4X5_SET_HWADDR: /* Set the hardware address */
- status = verify_area(VERIFY_READ, (void *)ioc->data, ETH_ALEN);
- if (status)
- break;
- status = -EPERM;
- if (!capable(CAP_NET_ADMIN))
- break;
- status = 0;
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ if (verify_area(VERIFY_READ, ioc->data, ETH_ALEN)) return -EFAULT;
copy_from_user(tmp.addr, ioc->data, ETH_ALEN);
for (i=0; i<ETH_ALEN; i++) {
dev->dev_addr[i] = tmp.addr[i];
}
build_setup_frame(dev, PHYS_ADDR_ONLY);
/* Set up the descriptor and give ownership to the card */
- while (test_and_set_bit(0, (void *)&dev->tbusy) != 0);
+ while (test_and_set_bit(0, (void *)&dev->tbusy) != 0) barrier();
load_packet(dev, lp->setup_frame, TD_IC | PERFECT_F | TD_SET |
SETUP_FRAME_LEN, NULL);
lp->tx_new = (++lp->tx_new) % lp->txRingSize;
outl(POLL_DEMAND, DE4X5_TPD); /* Start the TX */
dev->tbusy = 0; /* Unlock the TX ring */
-
break;
+
case DE4X5_SET_PROM: /* Set Promiscuous Mode */
- if (capable(CAP_NET_ADMIN)) {
- omr = inl(DE4X5_OMR);
- omr |= OMR_PR;
- outl(omr, DE4X5_OMR);
- dev->flags |= IFF_PROMISC;
- } else {
- status = -EPERM;
- }
-
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ omr = inl(DE4X5_OMR);
+ omr |= OMR_PR;
+ outl(omr, DE4X5_OMR);
+ dev->flags |= IFF_PROMISC;
break;
+
case DE4X5_CLR_PROM: /* Clear Promiscuous Mode */
- if (capable(CAP_NET_ADMIN)) {
- omr = inl(DE4X5_OMR);
- omr &= ~OMR_PR;
- outb(omr, DE4X5_OMR);
- dev->flags &= ~IFF_PROMISC;
- } else {
- status = -EPERM;
- }
-
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ omr = inl(DE4X5_OMR);
+ omr &= ~OMR_PR;
+ outb(omr, DE4X5_OMR);
+ dev->flags &= ~IFF_PROMISC;
break;
+
case DE4X5_SAY_BOO: /* Say "Boo!" to the kernel log file */
printk("%s: Boo!\n", dev->name);
-
break;
+
case DE4X5_MCA_EN: /* Enable pass all multicast addressing */
- if (capable(CAP_NET_ADMIN)) {
- omr = inl(DE4X5_OMR);
- omr |= OMR_PM;
- outl(omr, DE4X5_OMR);
- } else {
- status = -EPERM;
- }
-
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ omr = inl(DE4X5_OMR);
+ omr |= OMR_PM;
+ outl(omr, DE4X5_OMR);
break;
+
case DE4X5_GET_STATS: /* Get the driver statistics */
ioc->len = sizeof(lp->pktStats);
- status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len);
- if (status)
- break;
-
- cli();
+ if (verify_area(VERIFY_WRITE, ioc->data, ioc->len)) return -EFAULT;
+ spin_lock_irqsave(&lp->lock, flags);
copy_to_user(ioc->data, &lp->pktStats, ioc->len);
- sti();
-
+ spin_unlock_irqrestore(&lp->lock, flags);
break;
+
case DE4X5_CLR_STATS: /* Zero out the driver statistics */
- if (capable(CAP_NET_ADMIN)) {
- cli();
- memset(&lp->pktStats, 0, sizeof(lp->pktStats));
- sti();
- } else {
- status = -EPERM;
- }
-
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ spin_lock_irqsave(&lp->lock, flags);
+ memset(&lp->pktStats, 0, sizeof(lp->pktStats));
+ spin_unlock_irqrestore(&lp->lock, flags);
break;
+
case DE4X5_GET_OMR: /* Get the OMR Register contents */
tmp.addr[0] = inl(DE4X5_OMR);
- if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, 1))) {
- copy_to_user(ioc->data, tmp.addr, 1);
- }
-
+ if (verify_area(VERIFY_WRITE, ioc->data, 1)) return -EFAULT;
+ copy_to_user(ioc->data, tmp.addr, 1);
break;
+
case DE4X5_SET_OMR: /* Set the OMR Register contents */
- if (capable(CAP_NET_ADMIN)) {
- if (!(status = verify_area(VERIFY_READ, (void *)ioc->data, 1))) {
- copy_from_user(tmp.addr, ioc->data, 1);
- outl(tmp.addr[0], DE4X5_OMR);
- }
- } else {
- status = -EPERM;
- }
-
+ if (!capable(CAP_NET_ADMIN)) return -EPERM;
+ if (verify_area(VERIFY_READ, ioc->data, 1)) return -EFAULT;
+ copy_from_user(tmp.addr, ioc->data, 1);
+ outl(tmp.addr[0], DE4X5_OMR);
break;
+
case DE4X5_GET_REG: /* Get the DE4X5 Registers */
j = 0;
tmp.lval[0] = inl(DE4X5_STS); j+=4;
@@ -5645,9 +5633,8 @@ de4x5_ioctl(struct device *dev, struct ifreq *rq, int cmd)
tmp.lval[6] = inl(DE4X5_STRR); j+=4;
tmp.lval[7] = inl(DE4X5_SIGR); j+=4;
ioc->len = j;
- if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
- copy_to_user(ioc->data, tmp.addr, ioc->len);
- }
+ if (verify_area(VERIFY_WRITE, ioc->data, ioc->len)) return -EFAULT;
+ copy_to_user(ioc->data, tmp.addr, ioc->len);
break;
#define DE4X5_DUMP 0x0f /* Dump the DE4X5 Status */
@@ -5736,14 +5723,13 @@ de4x5_ioctl(struct device *dev, struct ifreq *rq, int cmd)
tmp.addr[j++] = dev->tbusy;
ioc->len = j;
- if (!(status = verify_area(VERIFY_WRITE, (void *)ioc->data, ioc->len))) {
- copy_to_user(ioc->data, tmp.addr, ioc->len);
- }
-
+ if (verify_area(VERIFY_WRITE, ioc->data, ioc->len)) return -EFAULT;
+ copy_to_user(ioc->data, tmp.addr, ioc->len);
break;
+
*/
default:
- status = -EOPNOTSUPP;
+ return -EOPNOTSUPP;
}
return status;
@@ -5775,6 +5761,12 @@ init_module(void)
if (!mdev) mdev = p;
if (register_netdev(p) != 0) {
+ struct de4x5_private *lp = (struct de4x5_private *)p->priv;
+ if (lp) {
+ release_region(p->base_addr, (lp->bus == PCI ?
+ DE4X5_PCI_TOTAL_SIZE :
+ DE4X5_EISA_TOTAL_SIZE));
+ }
kfree(p);
} else {
status = 0; /* At least one adapter will work */
diff --git a/drivers/net/de4x5.h b/drivers/net/de4x5.h
index 24ab33873..6e5aeae0f 100644
--- a/drivers/net/de4x5.h
+++ b/drivers/net/de4x5.h
@@ -121,6 +121,7 @@
#define DC2114x DC2114x_DID
#define DC21142 (DC2114x_DID | 0x0010)
#define DC21143 (DC2114x_DID | 0x0030)
+#define DC2114x_BRK 0x0020 /* CFRV break between DC21142 & DC21143 */
#define is_DC21040 ((vendor == DC21040_VID) && (device == DC21040_DID))
#define is_DC21041 ((vendor == DC21041_VID) && (device == DC21041_DID))
diff --git a/drivers/net/dgrs.c b/drivers/net/dgrs.c
index c379b3a43..2d4e08482 100644
--- a/drivers/net/dgrs.c
+++ b/drivers/net/dgrs.c
@@ -1098,7 +1098,7 @@ dgrs_download(struct device *dev0))
*/
proc_reset(dev0, 0);
- for (i = jiffies + 8 * HZ; i > jiffies; )
+ for (i = jiffies + 8 * HZ; time_after(i, jiffies); )
{
if (priv0->bcomm->bc_status >= BC_RUN)
break;
@@ -1196,7 +1196,7 @@ dgrs_probe1(struct device *dev))
return (rc);
priv->intrcnt = 0;
- for (i = jiffies + 2*HZ + HZ/2; i > jiffies; )
+ for (i = jiffies + 2*HZ + HZ/2; time_after(i, jiffies); )
if (priv->intrcnt >= 2)
break;
if (priv->intrcnt < 2)
diff --git a/drivers/net/dgrs_i82596.h b/drivers/net/dgrs_i82596.h
index 614efe746..b1c83b5b9 100644
--- a/drivers/net/dgrs_i82596.h
+++ b/drivers/net/dgrs_i82596.h
@@ -393,7 +393,7 @@ typedef volatile struct
/* cmd halfword values */
#define I596_SCB_ACK 0xF000 /* ACKNOWLEDGMENTS */
#define I596_SCB_ACK_CX 0x8000 /* Ack command completion */
-#define I596_SCB_ACK_FR 0x4000 /* Ack recieved frame */
+#define I596_SCB_ACK_FR 0x4000 /* Ack received frame */
#define I596_SCB_ACK_CNA 0x2000 /* Ack command unit not active */
#define I596_SCB_ACK_RNR 0x1000 /* Ack rcv unit not ready */
#define I596_SCB_ACK_ALL 0xF000 /* Ack everything */
@@ -419,7 +419,7 @@ typedef volatile struct
/* status halfword values */
#define I596_SCB_STAT 0xF000 /* STATUS */
#define I596_SCB_CX 0x8000 /* command completion */
-#define I596_SCB_FR 0x4000 /* recieved frame */
+#define I596_SCB_FR 0x4000 /* received frame */
#define I596_SCB_CNA 0x2000 /* command unit not active */
#define I596_SCB_RNR 0x1000 /* rcv unit not ready */
diff --git a/drivers/net/e2100.c b/drivers/net/e2100.c
index d95d34a4a..529158e81 100644
--- a/drivers/net/e2100.c
+++ b/drivers/net/e2100.c
@@ -449,7 +449,6 @@ cleanup_module(void)
void *priv = dev->priv;
/* NB: e21_close() handles free_irq */
release_region(dev->base_addr, E21_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c
index b26a1bfc0..08a9a17ac 100644
--- a/drivers/net/eepro.c
+++ b/drivers/net/eepro.c
@@ -8,7 +8,7 @@
according to the terms of the GNU Public License,
incorporated herein by reference.
- The author may be reached at bao.ha@srs.gov
+ The author may be reached at bao.ha@srs.gov
or 418 Hastings Place, Martinez, GA 30907.
Things remaining to do:
@@ -23,6 +23,38 @@
This is a compatibility hardware problem.
Versions:
+ 0.11d added __initdata, __initfunc stuff; call spin_lock_init
+ in eepro_probe1. Replaced "eepro" by dev->name. Augmented
+ the code protected by spin_lock in interrupt routine
+ (PdP, 12/12/1998)
+ 0.11c minor cleanup (PdP, RMC, 09/12/1998)
+ 0.11b Pascal Dupuis (dupuis@lei.ucl.ac.be): works as a module
+ under 2.1.xx. Debug messages are flagged as KERN_DEBUG to
+ avoid console flooding. Added locking at critical parts. Now
+ the dawn thing is SMP safe.
+ 0.11a Attempt to get 2.1.xx support up (RMC)
+ 0.11 Brian Candler added support for multiple cards. Tested as
+ a module, no idea if it works when compiled into kernel.
+
+ 0.10e Rick Bressler notified me that ifconfig up;ifconfig down fails
+ because the irq is lost somewhere. Fixed that by moving
+ request_irq and free_irq to eepro_open and eepro_close respectively.
+ 0.10d Ugh! Now Wakeup works. Was seriously broken in my first attempt.
+ I'll need to find a way to specify an ioport other than
+ the default one in the PnP case. PnP definitively sucks.
+ And, yes, this is not the only reason.
+ 0.10c PnP Wakeup Test for 595FX. uncomment #define PnPWakeup;
+ to use.
+ 0.10b Should work now with (some) Pro/10+. At least for
+ me (and my two cards) it does. _No_ guarantee for
+ function with non-Pro/10+ cards! (don't have any)
+ (RMC, 9/11/96)
+
+ 0.10 Added support for the Etherexpress Pro/10+. The
+ IRQ map was changed significantly from the old
+ pro/10. The new interrupt map was provided by
+ Rainer M. Canavan (Canavan@Zeus.cs.bonn.edu).
+ (BCH, 9/3/96)
0.09 Fixed a race condition in the transmit algorithm,
which causes crashes under heavy load with fast
@@ -38,7 +70,7 @@
0.07a Fix a stat report which counts every packet as a
heart-beat failure. (BCH, 6/3/95)
- 0.07 Modified to support all other 82595-based lan cards.
+ 0.07 Modified to support all other 82595-based lan cards.
The IRQ vector of the EtherExpress Pro will be set
according to the value saved in the EEPROM. For other
cards, I will do autoirq_request() to grab the next
@@ -48,37 +80,37 @@
print out format. (BCH, 3/9/95 and 3/14/95)
0.06 First stable release that I am comfortable with. (BCH,
- 3/2/95)
+ 3/2/95)
- 0.05 Complete testing of multicast. (BCH, 2/23/95)
+ 0.05 Complete testing of multicast. (BCH, 2/23/95)
- 0.04 Adding multicast support. (BCH, 2/14/95)
+ 0.04 Adding multicast support. (BCH, 2/14/95)
- 0.03 First widely alpha release for public testing.
- (BCH, 2/14/95)
+ 0.03 First widely alpha release for public testing.
+ (BCH, 2/14/95)
*/
static const char *version =
- "eepro.c: v0.09 7/31/96 Bao C. Ha (bao.ha@srs.gov)\n";
+ "eepro.c: v0.11d 08/12/1998 dupuis@lei.ucl.ac.be\n";
#include <linux/module.h>
/*
Sources:
- This driver wouldn't have been written without the availability
- of the Crynwr's Lan595 driver source code. It helps me to
- familiarize with the 82595 chipset while waiting for the Intel
- documentation. I also learned how to detect the 82595 using
+ This driver wouldn't have been written without the availability
+ of the Crynwr's Lan595 driver source code. It helps me to
+ familiarize with the 82595 chipset while waiting for the Intel
+ documentation. I also learned how to detect the 82595 using
the packet driver's technique.
This driver is written by cutting and pasting the skeleton.c driver
provided by Donald Becker. I also borrowed the EEPROM routine from
Donald Becker's 82586 driver.
- Datasheet for the Intel 82595 (including the TX and FX version). It
- provides just enough info that the casual reader might think that it
+ Datasheet for the Intel 82595 (including the TX and FX version). It
+ provides just enough info that the casual reader might think that it
documents the i82595.
The User Manual for the 82595. It provides a lot of the missing
@@ -101,22 +133,60 @@ static const char *version =
#include <asm/io.h>
#include <asm/dma.h>
#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/delay.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
+/* need to remove these asap */
+/* 2.1.xx compatibility macros... */
+/* */
+
+
+#include <linux/version.h>
+
+/* For linux 2.1.xx */
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+
+#include <asm/spinlock.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+
+#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb) )
+/* I had reports of looong delays with SLOW_DOWN defined as udelay(2) */
+#define SLOW_DOWN inb(0x80)
+/* udelay(2) */
+#define compat_init_func(X) __initfunc(X)
+#define compat_init_data __initdata
+
+#else
+/* for 2.x */
+
+#define compat_dev_kfree_skb( skb, mode ) dev_kfree_skb( (skb), (mode) )
+#define test_and_set_bit(a,b) set_bit((a),(b))
+#define SLOW_DOWN SLOW_DOWN_IO
+#define compat_init_func(X) X
+#define compat_init_data
+
+#endif
+
+
/* First, a few definitions that the brave might change. */
/* A zero-terminated list of I/O addresses to be probed. */
-static unsigned int eepro_portlist[] __initdata =
- { 0x200, 0x240, 0x280, 0x2C0, 0x300, 0x320, 0x340, 0x360, 0};
+static unsigned int eepro_portlist[] compat_init_data =
+ { 0x300, 0x210, 0x240, 0x280, 0x2C0, 0x200, 0x320, 0x340, 0x360, 0};
+/* note: 0x300 is default, the 595FX supports ALL IO Ports
+ from 0x000 to 0x3F0, some of which are reserved in PCs */
+
+/* To try the (not-really PnP Wakeup: */
+/*
+#define PnPWakeup
+*/
/* use 0 for production, 1 for verification, >2 for debug */
#ifndef NET_DEBUG
-#define NET_DEBUG 3
+#define NET_DEBUG 0
#endif
static unsigned int net_debug = NET_DEBUG;
@@ -130,23 +200,107 @@ static unsigned int net_debug = NET_DEBUG;
/* Information that need to be kept for each board. */
struct eepro_local {
- struct net_device_stats stats;
+ struct enet_statistics stats;
unsigned rx_start;
unsigned tx_start; /* start of the transmit chain */
int tx_last; /* pointer to last packet in the transmit chain */
unsigned tx_end; /* end of the transmit chain (plus 1) */
- int eepro; /* a flag, TRUE=1 for the EtherExpress Pro/10,
- FALSE = 0 for other 82595-based lan cards. */
+ int eepro; /* 1 for the EtherExpress Pro/10,
+ 2 for the EtherExpress Pro/10+,
+ 0 for other 82595-based lan cards. */
int version; /* a flag to indicate if this is a TX or FX
version of the 82595 chip. */
int stepping;
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spinlock_t lock; /* Serializing lock */
+#endif
};
/* The station (ethernet) address prefix, used for IDing the board. */
-#define SA_ADDR0 0x00
+#define SA_ADDR0 0x00 /* Etherexpress Pro/10 */
#define SA_ADDR1 0xaa
#define SA_ADDR2 0x00
+#define GetBit(x,y) ((x & (1<<y))>>y)
+
+/* EEPROM Word 0: */
+#define ee_PnP 0 /* Plug 'n Play enable bit */
+#define ee_Word1 1 /* Word 1? */
+#define ee_BusWidth 2 /* 8/16 bit */
+#define ee_FlashAddr 3 /* Flash Address */
+#define ee_FlashMask 0x7 /* Mask */
+#define ee_AutoIO 6 /* */
+#define ee_reserved0 7 /* =0! */
+#define ee_Flash 8 /* Flash there? */
+#define ee_AutoNeg 9 /* Auto Negotiation enabled? */
+#define ee_IO0 10 /* IO Address LSB */
+#define ee_IO0Mask 0x /*...*/
+#define ee_IO1 15 /* IO MSB */
+
+/* EEPROM Word 1: */
+#define ee_IntSel 0 /* Interrupt */
+#define ee_IntMask 0x7
+#define ee_LI 3 /* Link Integrity 0= enabled */
+#define ee_PC 4 /* Polarity Correction 0= enabled */
+#define ee_TPE_AUI 5 /* PortSelection 1=TPE */
+#define ee_Jabber 6 /* Jabber prevention 0= enabled */
+#define ee_AutoPort 7 /* Auto Port Selection 1= Disabled */
+#define ee_SMOUT 8 /* SMout Pin Control 0= Input */
+#define ee_PROM 9 /* Flash EPROM / PROM 0=Flash */
+#define ee_reserved1 10 /* .. 12 =0! */
+#define ee_AltReady 13 /* Alternate Ready, 0=normal */
+#define ee_reserved2 14 /* =0! */
+#define ee_Duplex 15
+
+/* Word2,3,4: */
+#define ee_IA5 0 /*bit start for individual Addr Byte 5 */
+#define ee_IA4 8 /*bit start for individual Addr Byte 5 */
+#define ee_IA3 0 /*bit start for individual Addr Byte 5 */
+#define ee_IA2 8 /*bit start for individual Addr Byte 5 */
+#define ee_IA1 0 /*bit start for individual Addr Byte 5 */
+#define ee_IA0 8 /*bit start for individual Addr Byte 5 */
+
+/* Word 5: */
+#define ee_BNC_TPE 0 /* 0=TPE */
+#define ee_BootType 1 /* 00=None, 01=IPX, 10=ODI, 11=NDIS */
+#define ee_BootTypeMask 0x3
+#define ee_NumConn 3 /* Number of Connections 0= One or Two */
+#define ee_FlashSock 4 /* Presence of Flash Socket 0= Present */
+#define ee_PortTPE 5
+#define ee_PortBNC 6
+#define ee_PortAUI 7
+#define ee_PowerMgt 10 /* 0= disabled */
+#define ee_CP 13 /* Concurrent Processing */
+#define ee_CPMask 0x7
+
+/* Word 6: */
+#define ee_Stepping 0 /* Stepping info */
+#define ee_StepMask 0x0F
+#define ee_BoardID 4 /* Manucaturer Board ID, reserved */
+#define ee_BoardMask 0x0FFF
+
+/* Word 7: */
+#define ee_INT_TO_IRQ 0 /* int to IRQ Mapping = 0x1EB8 for Pro/10+ */
+#define ee_FX_INT2IRQ 0x1EB8 /* the _only_ mapping allowed for FX chips */
+
+/*..*/
+#define ee_SIZE 0x40 /* total EEprom Size */
+#define ee_Checksum 0xBABA /* initial and final value for adding checksum */
+
+
+/* Card identification via EEprom: */
+#define ee_addr_vendor 0x10 /* Word offset for EISA Vendor ID */
+#define ee_addr_id 0x11 /* Word offset for Card ID */
+#define ee_addr_SN 0x12 /* Serial Number */
+#define ee_addr_CRC_8 0x14 /* CRC over last thee Bytes */
+
+
+#define ee_vendor_intel0 0x25 /* Vendor ID Intel */
+#define ee_vendor_intel1 0xD4
+#define ee_id_eepro10p0 0x10 /* ID for eepro/10+ */
+#define ee_id_eepro10p1 0x31
+
+
/* Index to functions, as function prototypes. */
extern int eepro_probe(struct device *dev);
@@ -158,15 +312,15 @@ static void eepro_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static void eepro_rx(struct device *dev);
static void eepro_transmit_interrupt(struct device *dev);
static int eepro_close(struct device *dev);
-static struct net_device_stats *eepro_get_stats(struct device *dev);
-static void set_multicast_list(struct device *dev);
+static struct enet_statistics *eepro_get_stats(struct device *dev);
+static void set_multicast_list(struct device *dev);
static int read_eeprom(int ioaddr, int location);
static void hardware_send_packet(struct device *dev, void *buf, short length);
static int eepro_grab_irq(struct device *dev);
/*
- Details of the i82595.
+ Details of the i82595.
You will need either the datasheet or the user manual to understand what
is going on here. The 82595 is very different from the 82586, 82593.
@@ -186,10 +340,10 @@ single packet. In other systems with faster computers and more congested
network traffics, the ring linked list should improve performance by
allowing up to 8K worth of packets to be queued.
-The sizes of the receive and transmit buffers can now be changed via lilo
+The sizes of the receive and transmit buffers can now be changed via lilo
or insmod. Lilo uses the appended line "ether=io,irq,debug,rx-buffer,eth0"
where rx-buffer is in KB unit. Modules uses the parameter mem which is
-also in KB unit, for example "insmod io=io-address irq=0 mem=rx-buffer."
+also in KB unit, for example "insmod io=io-address irq=0 mem=rx-buffer."
The receive buffer has to be more than 3K or less than 29K. Otherwise,
it is reset to the default of 24K, and, hence, 8K for the trasnmit
buffer (transmit-buffer = 32K - receive-buffer).
@@ -197,14 +351,14 @@ buffer (transmit-buffer = 32K - receive-buffer).
*/
#define RAM_SIZE 0x8000
#define RCV_HEADER 8
-#define RCV_RAM 0x6000 /* 24KB default for RCV buffer */
+#define RCV_RAM 0x6000 /* 24KB default for RCV buffer */
#define RCV_LOWER_LIMIT 0x00 /* 0x0000 */
/* #define RCV_UPPER_LIMIT ((RCV_RAM - 2) >> 8) */ /* 0x5ffe */
-#define RCV_UPPER_LIMIT (((rcv_ram) - 2) >> 8)
+#define RCV_UPPER_LIMIT (((rcv_ram) - 2) >> 8)
/* #define XMT_RAM (RAM_SIZE - RCV_RAM) */ /* 8KB for XMT buffer */
#define XMT_RAM (RAM_SIZE - (rcv_ram)) /* 8KB for XMT buffer */
/* #define XMT_LOWER_LIMIT (RCV_RAM >> 8) */ /* 0x6000 */
-#define XMT_LOWER_LIMIT ((rcv_ram) >> 8)
+#define XMT_LOWER_LIMIT ((rcv_ram) >> 8)
#define XMT_UPPER_LIMIT ((RAM_SIZE - 2) >> 8) /* 0x7ffe */
#define XMT_HEADER 8
@@ -218,9 +372,9 @@ buffer (transmit-buffer = 32K - receive-buffer).
#define XMT_CHAIN 0x04
#define XMT_COUNT 0x06
-#define BANK0_SELECT 0x00
-#define BANK1_SELECT 0x40
-#define BANK2_SELECT 0x80
+#define BANK0_SELECT 0x00
+#define BANK1_SELECT 0x40
+#define BANK2_SELECT 0x80
/* Bank 0 registers */
#define COMMAND_REG 0x00 /* Register 0 */
@@ -280,7 +434,7 @@ buffer (transmit-buffer = 32K - receive-buffer).
#define REG13 0x0d
#define FDX 0x00
#define A_N_ENABLE 0x02
-
+
#define I_ADD_REG0 0x04
#define I_ADD_REG1 0x05
#define I_ADD_REG2 0x06
@@ -295,7 +449,7 @@ buffer (transmit-buffer = 32K - receive-buffer).
#define EEDO 0x08
-/* Check for a network adaptor of this type, and return '0' iff one exists.
+/* Check for a network adaptor of this type, and return '0' if one exists.
If dev->base_addr == 0, probe all likely locations.
If dev->base_addr == 1, always return failure.
If dev->base_addr == 2, allocate space for the device and return success
@@ -307,19 +461,51 @@ buffer (transmit-buffer = 32K - receive-buffer).
struct netdev_entry netcard_drv =
{"eepro", eepro_probe1, EEPRO_IO_EXTENT, eepro_portlist};
#else
-__initfunc(int
-eepro_probe(struct device *dev))
+compat_init_func(int eepro_probe(struct device *dev))
{
int i;
int base_addr = dev ? dev->base_addr : 0;
+
+#ifdef PnPWakeup
+ /* XXXX for multiple cards should this only be run once? */
+
+ /* Wakeup: */
+ #define WakeupPort 0x279
+ #define WakeupSeq {0x6A, 0xB5, 0xDA, 0xED, 0xF6, 0xFB, 0x7D, 0xBE,\
+ 0xDF, 0x6F, 0x37, 0x1B, 0x0D, 0x86, 0xC3, 0x61,\
+ 0xB0, 0x58, 0x2C, 0x16, 0x8B, 0x45, 0xA2, 0xD1,\
+ 0xE8, 0x74, 0x3A, 0x9D, 0xCE, 0xE7, 0x73, 0x43}
+
+ {
+ unsigned short int WS[32]=WakeupSeq;
+
+ if (check_region(WakeupPort, 2)==0) {
+
+ if (net_debug>5)
+ printk(KERN_DEBUG "Waking UP\n");
+
+ outb_p(0,WakeupPort);
+ outb_p(0,WakeupPort);
+ for (i=0; i<32; i++) {
+ outb_p(WS[i],WakeupPort);
+ if (net_debug>5) printk(KERN_DEBUG ": %#x ",WS[i]);
+ }
+ } else printk(KERN_WARNING "Checkregion Failed!\n");
+ }
+#endif
+
+
if (base_addr > 0x1ff) /* Check a single specified location. */
return eepro_probe1(dev, base_addr);
+
else if (base_addr != 0) /* Don't probe at all. */
return ENXIO;
+
for (i = 0; eepro_portlist[i]; i++) {
int ioaddr = eepro_portlist[i];
+
if (check_region(ioaddr, EEPRO_IO_EXTENT))
continue;
if (eepro_probe1(dev, ioaddr) == 0)
@@ -330,30 +516,89 @@ eepro_probe(struct device *dev))
}
#endif
+void printEEPROMInfo(short ioaddr)
+{
+ unsigned short Word;
+ int i,j;
+
+ for (i=0, j=ee_Checksum; i<ee_SIZE; i++)
+ j+=read_eeprom(ioaddr,i);
+ printk("Checksum: %#x\n",j&0xffff);
+
+ Word=read_eeprom(ioaddr, 0);
+ printk(KERN_DEBUG "Word0:\n");
+ printk(KERN_DEBUG " Plug 'n Pray: %d\n",GetBit(Word,ee_PnP));
+ printk(KERN_DEBUG " Buswidth: %d\n",(GetBit(Word,ee_BusWidth)+1)*8 );
+ printk(KERN_DEBUG " AutoNegotiation: %d\n",GetBit(Word,ee_AutoNeg));
+ printk(KERN_DEBUG " IO Address: %#x\n", (Word>>ee_IO0)<<4);
+
+ if (net_debug>4) {
+ Word=read_eeprom(ioaddr, 1);
+ printk(KERN_DEBUG "Word1:\n");
+ printk(KERN_DEBUG " INT: %d\n", Word & ee_IntMask);
+ printk(KERN_DEBUG " LI: %d\n", GetBit(Word,ee_LI));
+ printk(KERN_DEBUG " PC: %d\n", GetBit(Word,ee_PC));
+ printk(KERN_DEBUG " TPE/AUI: %d\n", GetBit(Word,ee_TPE_AUI));
+ printk(KERN_DEBUG " Jabber: %d\n", GetBit(Word,ee_Jabber));
+ printk(KERN_DEBUG " AutoPort: %d\n", GetBit(!Word,ee_Jabber));
+ printk(KERN_DEBUG " Duplex: %d\n", GetBit(Word,ee_Duplex));
+ }
+
+ Word=read_eeprom(ioaddr, 5);
+ printk(KERN_DEBUG "Word5:\n");
+ printk(KERN_DEBUG " BNC: %d\n",GetBit(Word,ee_BNC_TPE));
+ printk(KERN_DEBUG " NumConnectors: %d\n",GetBit(Word,ee_NumConn));
+ printk(KERN_DEBUG " Has ");
+ if (GetBit(Word,ee_PortTPE)) printk("TPE ");
+ if (GetBit(Word,ee_PortBNC)) printk("BNC ");
+ if (GetBit(Word,ee_PortAUI)) printk("AUI ");
+ printk("port(s) \n");
+
+ Word=read_eeprom(ioaddr, 6);
+ printk(KERN_DEBUG "Word6:\n");
+ printk(KERN_DEBUG " Stepping: %d\n",Word & ee_StepMask);
+ printk(KERN_DEBUG " BoardID: %d\n",Word>>ee_BoardID);
+
+ Word=read_eeprom(ioaddr, 7);
+ printk(KERN_DEBUG "Word7:\n");
+ printk(KERN_DEBUG " INT to IRQ:\n");
+
+ printk(KERN_DEBUG);
+
+ for (i=0, j=0; i<15; i++)
+ if (GetBit(Word,i)) printk(" INT%d -> IRQ %d;",j++,i);
+
+ printk("\n");
+}
+
/* This is the real probe routine. Linux has a history of friendly device
- probes on the ISA bus. A good device probes avoids doing writes, and
+ probes on the ISA bus. A good device probe avoids doing writes, and
verifies that the correct device exists and functions. */
-__initfunc(int eepro_probe1(struct device *dev, short ioaddr))
+int eepro_probe1(struct device *dev, short ioaddr)
{
unsigned short station_addr[6], id, counter;
- int i;
- int eepro; /* a flag, TRUE=1 for the EtherExpress Pro/10,
- FALSE = 0 for other 82595-based lan cards. */
+ int i,j, irqMask;
+ int eepro;
const char *ifmap[] = {"AUI", "10Base2", "10BaseT"};
enum iftype { AUI=0, BNC=1, TPE=2 };
/* Now, we are going to check for the signature of the
ID_REG (register 2 of bank 0) */
- if (((id=inb(ioaddr + ID_REG)) & ID_REG_MASK) == ID_REG_SIG) {
+ id=inb(ioaddr + ID_REG);
+
+ printk(KERN_DEBUG " id: %#x ",id);
+ printk(" io: %#x ",ioaddr);
+
+ if (((id) & ID_REG_MASK) == ID_REG_SIG) {
/* We seem to have the 82595 signature, let's
play with its counter (last 2 bits of
register 2 of bank 0) to be sure. */
-
- counter = (id & R_ROBIN_BITS);
- if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS) ==
+
+ counter = (id & R_ROBIN_BITS);
+ if (((id=inb(ioaddr+ID_REG)) & R_ROBIN_BITS) ==
(counter + 0x40)) {
/* Yes, the 82595 has been found */
@@ -366,83 +611,99 @@ __initfunc(int eepro_probe1(struct device *dev, short ioaddr))
station_addr[2] = read_eeprom(ioaddr, 4);
/* Check the station address for the manufacturer's code */
-
- if (station_addr[2] != 0x00aa || (station_addr[1] & 0xff00) != 0x0000) {
- eepro = 0;
- printk("%s: Intel 82595-based lan card at %#x,",
+ if (net_debug>3)
+ printEEPROMInfo(ioaddr);
+
+ if (read_eeprom(ioaddr,7)== ee_FX_INT2IRQ) { /* int to IRQ Mask */
+ eepro = 2;
+ printk("%s: Intel EtherExpress Pro/10+ ISA\n at %#x,",
+ dev->name, ioaddr);
+ } else
+ if (station_addr[2] == 0x00aa) {
+ eepro = 1;
+ printk("%s: Intel EtherExpress Pro/10 ISA at %#x,",
dev->name, ioaddr);
}
else {
- eepro = 1;
- printk("%s: Intel EtherExpress Pro/10 at %#x,",
+ eepro = 0;
+ printk("%s: Intel 82595-based lan card at %#x,",
dev->name, ioaddr);
}
- /* Fill in the 'dev' fields. */
+ /* Fill in the 'dev' fields. */
dev->base_addr = ioaddr;
-
+
for (i=0; i < 6; i++) {
dev->dev_addr[i] = ((unsigned char *) station_addr)[5-i];
printk("%c%02x", i ? ':' : ' ', dev->dev_addr[i]);
}
-
+
if ((dev->mem_end & 0x3f) < 3 || /* RX buffer must be more than 3K */
(dev->mem_end & 0x3f) > 29) /* and less than 29K */
dev->mem_end = RCV_RAM; /* or it will be set to 24K */
else dev->mem_end = 1024*dev->mem_end; /* Maybe I should shift << 10 */
/* From now on, dev->mem_end contains the actual size of rx buffer */
-
+
if (net_debug > 3)
printk(", %dK RCV buffer", (int)(dev->mem_end)/1024);
+
+
+ /* ............... */
+
+ if (GetBit( read_eeprom(ioaddr, 5),ee_BNC_TPE))
+ dev->if_port = BNC;
+ else dev->if_port = TPE;
+
+ /* ............... */
- outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
- id = inb(ioaddr + REG3);
- if (id & TPE_BIT)
- dev->if_port = TPE;
- else dev->if_port = BNC;
- if (dev->irq < 2 && eepro) {
+ if ((dev->irq < 2) && (eepro!=0)) {
i = read_eeprom(ioaddr, 1);
- switch (i & 0x07) {
- case 0: dev->irq = 9; break;
- case 1: dev->irq = 3; break;
- case 2: dev->irq = 5; break;
- case 3: dev->irq = 10; break;
- case 4: dev->irq = 11; break;
- default: /* should never get here !!!!! */
- printk(" illegal interrupt vector stored in EEPROM.\n");
- return ENODEV;
+ irqMask = read_eeprom(ioaddr, 7);
+ i &= 0x07; /* Mask off INT number */
+
+ for (j=0; ((j<16) && (i>=0)); j++) {
+ if ((irqMask & (1<<j))!=0) {
+ if (i==0) {
+ dev->irq = j;
+ break; /* found bit corresponding to irq */
+ }
+ i--; /* count bits set in irqMask */
}
}
- else if (dev->irq == 2)
- dev->irq = 9;
+ if (dev -> irq<2) {
+ printk(" Duh! illegal interrupt vector stored in EEPROM.\n");
+ return ENODEV;
+ } else
+
+ if (dev->irq==2) dev->irq = 9;
+ else if (dev->irq == 2)
+ dev->irq = 9;
+ }
+
if (dev->irq > 2) {
printk(", IRQ %d, %s.\n", dev->irq,
ifmap[dev->if_port]);
- if (request_irq(dev->irq, &eepro_interrupt, 0, "eepro", dev)) {
- printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
- return -EAGAIN;
- }
}
else printk(", %s.\n", ifmap[dev->if_port]);
-
+
if ((dev->mem_start & 0xf) > 0) /* I don't know if this is */
net_debug = dev->mem_start & 7; /* still useful or not */
if (net_debug > 3) {
i = read_eeprom(ioaddr, 5);
if (i & 0x2000) /* bit 13 of EEPROM word 5 */
- printk("%s: Concurrent Processing is enabled but not used!\n",
+ printk(KERN_DEBUG "%s: Concurrent Processing is enabled but not used!\n",
dev->name);
}
- if (net_debug)
+ if (net_debug)
printk(version);
/* Grab the region so we can find another board if autoIRQ fails. */
- request_region(ioaddr, EEPRO_IO_EXTENT, "eepro");
+ request_region(ioaddr, EEPRO_IO_EXTENT, dev->name);
/* Initialize the device structure */
dev->priv = kmalloc(sizeof(struct eepro_local), GFP_KERNEL);
@@ -450,10 +711,13 @@ __initfunc(int eepro_probe1(struct device *dev, short ioaddr))
return -ENOMEM;
memset(dev->priv, 0, sizeof(struct eepro_local));
- dev->open = eepro_open;
- dev->stop = eepro_close;
- dev->hard_start_xmit = eepro_send_packet;
- dev->get_stats = eepro_get_stats;
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_lock_init(&(((struct eepro_local *)dev->priv)->lock));
+#endif
+ dev->open = eepro_open;
+ dev->stop = eepro_close;
+ dev->hard_start_xmit = eepro_send_packet;
+ dev->get_stats = eepro_get_stats;
dev->set_multicast_list = &set_multicast_list;
/* Fill in the fields of the device structure with
@@ -481,21 +745,23 @@ __initfunc(int eepro_probe1(struct device *dev, short ioaddr))
*/
static char irqrmap[] = {-1,-1,0,1,-1,2,-1,-1,-1,0,3,4,-1,-1,-1,-1};
+static char irqrmap2[] = {-1,-1,4,0,1,2,-1,3,-1,4,5,6,7,-1,-1,-1};
static int eepro_grab_irq(struct device *dev)
{
- int irqlist[] = { 5, 9, 10, 11, 4, 3, 0};
+ int irqlist[] = { 3, 4, 5, 7, 9, 10, 11, 12 };
int *irqp = irqlist, temp_reg, ioaddr = dev->base_addr;
-
+
outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */
/* Enable the interrupt line. */
temp_reg = inb(ioaddr + REG1);
outb(temp_reg | INT_ENABLE, ioaddr + REG1);
-
+
outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */
/* clear all interrupts */
outb(ALL_MASK, ioaddr + STATUS_REG);
+
/* Let EXEC event to interrupt */
outb(ALL_MASK & ~(EXEC_MASK), ioaddr + INT_MASK_REG);
@@ -507,18 +773,17 @@ static int eepro_grab_irq(struct device *dev)
outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
- if (request_irq (*irqp, NULL, 0, "bogus", NULL) != EBUSY) {
+ if (request_irq (*irqp, NULL, 0, "bogus", dev) != EBUSY) {
/* Twinkle the interrupt, and check if it's seen */
autoirq_setup(0);
outb(DIAGNOSE_CMD, ioaddr); /* RESET the 82595 */
-
- if (*irqp == autoirq_report(2) && /* It's a good IRQ line */
- (request_irq(dev->irq = *irqp, &eepro_interrupt, 0, "eepro", dev) == 0))
- break;
+
+ if (*irqp == autoirq_report(2)) /* It's a good IRQ line */
+ break;
/* clear all interrupts */
- outb(ALL_MASK, ioaddr + STATUS_REG);
+ outb(ALL_MASK, ioaddr + STATUS_REG);
}
} while (*++irqp);
@@ -526,40 +791,64 @@ static int eepro_grab_irq(struct device *dev)
/* Disable the physical interrupt line. */
temp_reg = inb(ioaddr + REG1);
- outb(temp_reg & 0x7f, ioaddr + REG1);
+ outb(temp_reg & 0x7f, ioaddr + REG1);
outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
/* Mask all the interrupts. */
- outb(ALL_MASK, ioaddr + INT_MASK_REG);
+ outb(ALL_MASK, ioaddr + INT_MASK_REG);
/* clear all interrupts */
- outb(ALL_MASK, ioaddr + STATUS_REG);
+ outb(ALL_MASK, ioaddr + STATUS_REG);
return dev->irq;
}
-static int
-eepro_open(struct device *dev)
+static int eepro_open(struct device *dev)
{
unsigned short temp_reg, old8, old9;
+ int irqMask;
int i, ioaddr = dev->base_addr, rcv_ram = dev->mem_end;
struct eepro_local *lp = (struct eepro_local *)dev->priv;
if (net_debug > 3)
- printk("eepro: entering eepro_open routine.\n");
+ printk(KERN_DEBUG "%s: entering eepro_open routine.\n", dev->name);
+
+ if ((irqMask=read_eeprom(ioaddr,7))== ee_FX_INT2IRQ) /* INT to IRQ Mask */
+ {
+ lp->eepro = 2; /* Yes, an Intel EtherExpress Pro/10+ */
+ if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 2;\n");
+ }
- if (dev->dev_addr[0] == SA_ADDR0 &&
+ else if ((dev->dev_addr[0] == SA_ADDR0 &&
dev->dev_addr[1] == SA_ADDR1 &&
- dev->dev_addr[2] == SA_ADDR2)
- lp->eepro = 1; /* Yes, an Intel EtherExpress Pro/10 */
+ dev->dev_addr[2] == SA_ADDR2))
+ {
+ lp->eepro = 1;
+ if (net_debug > 3) printk(KERN_DEBUG "p->eepro = 1;\n");
+ } /* Yes, an Intel EtherExpress Pro/10 */
+
else lp->eepro = 0; /* No, it is a generic 82585 lan card */
- /* Get the interrupt vector for the 82595 */
+ /* Get the interrupt vector for the 82595 */
if (dev->irq < 2 && eepro_grab_irq(dev) == 0) {
printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
return -EAGAIN;
}
+
+ if (request_irq(dev->irq , &eepro_interrupt, 0, dev->name, dev)) {
+ printk("%s: unable to get IRQ %d.\n", dev->name, dev->irq);
+ return -EAGAIN;
+ }
+
+#ifdef irq2dev_map
+ if (((irq2dev_map[dev->irq] != 0)
+ || (irq2dev_map[dev->irq] = dev) == 0) &&
+ (irq2dev_map[dev->irq]!=dev)) {
+ /* printk("%s: IRQ map wrong\n", dev->name); */
+ return -EAGAIN;
+ }
+#endif
/* Initialize the 82595. */
@@ -567,18 +856,18 @@ eepro_open(struct device *dev)
temp_reg = inb(ioaddr + EEPROM_REG);
lp->stepping = temp_reg >> 5; /* Get the stepping number of the 595 */
-
+
if (net_debug > 3)
- printk("The stepping of the 82595 is %d\n", lp->stepping);
+ printk(KERN_DEBUG "The stepping of the 82595 is %d\n", lp->stepping);
if (temp_reg & 0x10) /* Check the TurnOff Enable bit */
outb(temp_reg & 0xef, ioaddr + EEPROM_REG);
- for (i=0; i < 6; i++)
- outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i);
-
+ for (i=0; i < 6; i++)
+ outb(dev->dev_addr[i] , ioaddr + I_ADD_REG0 + i);
+
temp_reg = inb(ioaddr + REG1); /* Setup Transmit Chaining */
outb(temp_reg | XMT_Chain_Int | XMT_Chain_ErrStop /* and discard bad RCV frames */
- | RCV_Discard_BadFrame, ioaddr + REG1);
+ | RCV_Discard_BadFrame, ioaddr + REG1);
temp_reg = inb(ioaddr + REG2); /* Match broadcast */
outb(temp_reg | 0x14, ioaddr + REG2);
@@ -589,51 +878,71 @@ eepro_open(struct device *dev)
/* Set the receiving mode */
outb(BANK1_SELECT, ioaddr); /* be CAREFUL, BANK 1 now */
+ /* Set the interrupt vector */
+ temp_reg = inb(ioaddr + INT_NO_REG);
+ if (lp->eepro == 2)
+ outb((temp_reg & 0xf8) | irqrmap2[dev->irq], ioaddr + INT_NO_REG);
+ else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
+
+
temp_reg = inb(ioaddr + INT_NO_REG);
- outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
+ if (lp->eepro == 2)
+ outb((temp_reg & 0xf0) | irqrmap2[dev->irq] | 0x08,ioaddr+INT_NO_REG);
+ else outb((temp_reg & 0xf8) | irqrmap[dev->irq], ioaddr + INT_NO_REG);
+
+ if (net_debug > 3)
+ printk(KERN_DEBUG "eepro_open: content of INT Reg is %x\n", temp_reg);
+
/* Initialize the RCV and XMT upper and lower limits */
- outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG);
- outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG);
- outb(XMT_LOWER_LIMIT, ioaddr + XMT_LOWER_LIMIT_REG);
- outb(XMT_UPPER_LIMIT, ioaddr + XMT_UPPER_LIMIT_REG);
+ outb(RCV_LOWER_LIMIT, ioaddr + RCV_LOWER_LIMIT_REG);
+ outb(RCV_UPPER_LIMIT, ioaddr + RCV_UPPER_LIMIT_REG);
+ outb(XMT_LOWER_LIMIT, ioaddr + XMT_LOWER_LIMIT_REG);
+ outb(XMT_UPPER_LIMIT, ioaddr + XMT_UPPER_LIMIT_REG);
/* Enable the interrupt line. */
temp_reg = inb(ioaddr + REG1);
- outb(temp_reg | INT_ENABLE, ioaddr + REG1);
+ outb(temp_reg | INT_ENABLE, ioaddr + REG1);
outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
/* Let RX and TX events to interrupt */
- outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
+ outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
+
/* clear all interrupts */
- outb(ALL_MASK, ioaddr + STATUS_REG);
+ outb(ALL_MASK, ioaddr + STATUS_REG);
/* Initialize RCV */
- outw(RCV_LOWER_LIMIT << 8, ioaddr + RCV_BAR);
+ outw(RCV_LOWER_LIMIT << 8, ioaddr + RCV_BAR);
lp->rx_start = (RCV_LOWER_LIMIT << 8) ;
- outw((RCV_UPPER_LIMIT << 8) | 0xfe, ioaddr + RCV_STOP);
+ outw((RCV_UPPER_LIMIT << 8) | 0xfe, ioaddr + RCV_STOP);
/* Initialize XMT */
- outw(XMT_LOWER_LIMIT << 8, ioaddr + XMT_BAR);
+ outw(XMT_LOWER_LIMIT << 8, ioaddr + XMT_BAR);
/* Check for the i82595TX and i82595FX */
old8 = inb(ioaddr + 8);
outb(~old8, ioaddr + 8);
+
if ((temp_reg = inb(ioaddr + 8)) == old8) {
if (net_debug > 3)
- printk("i82595 detected!\n");
+ printk(KERN_DEBUG "i82595 detected!\n");
lp->version = LAN595;
}
else {
lp->version = LAN595TX;
outb(old8, ioaddr + 8);
old9 = inb(ioaddr + 9);
- outb(~old9, ioaddr + 9);
- if ((temp_reg = inb(ioaddr + 9)) == ~old9) {
+ /*outb(~old9, ioaddr + 9);
+ if (((temp_reg = inb(ioaddr + 9)) == ( (~old9)&0xff) )) {*/
+
+ if (irqMask==ee_FX_INT2IRQ) {
enum iftype { AUI=0, BNC=1, TPE=2 };
- if (net_debug > 3)
- printk("i82595FX detected!\n");
+
+ if (net_debug > 3) {
+ printk(KERN_DEBUG "IrqMask: %#x\n",irqMask);
+ printk(KERN_DEBUG "i82595FX detected!\n");
+ }
lp->version = LAN595FX;
outb(old9, ioaddr + 9);
if (dev->if_port != TPE) { /* Hopefully, this will fix the
@@ -647,24 +956,27 @@ eepro_open(struct device *dev)
outb(BANK0_SELECT, ioaddr); /* be CAREFUL, BANK 0 now */
}
}
- else if (net_debug > 3)
- printk("i82595TX detected!\n");
+ else if (net_debug > 3) {
+ printk(KERN_DEBUG "temp_reg: %#x ~old9: %#x\n",temp_reg,((~old9)&0xff));
+ printk(KERN_DEBUG "i82595TX detected!\n");
+ }
}
-
+
outb(SEL_RESET_CMD, ioaddr);
+
/* We are supposed to wait for 2 us after a SEL_RESET */
-
- udelay(2);
+ SLOW_DOWN;
+ SLOW_DOWN;
lp->tx_start = lp->tx_end = XMT_LOWER_LIMIT << 8; /* or = RCV_RAM */
lp->tx_last = 0;
-
+
dev->tbusy = 0;
dev->interrupt = 0;
dev->start = 1;
if (net_debug > 3)
- printk("eepro: exiting eepro_open routine.\n");
+ printk(KERN_DEBUG "%s: exiting eepro_open routine.\n", dev->name);
outb(RCV_ENABLE_CMD, ioaddr);
@@ -672,36 +984,45 @@ eepro_open(struct device *dev)
return 0;
}
-static int
-eepro_send_packet(struct sk_buff *skb, struct device *dev)
+static int eepro_send_packet(struct sk_buff *skb, struct device *dev)
{
struct eepro_local *lp = (struct eepro_local *)dev->priv;
int ioaddr = dev->base_addr;
int rcv_ram = dev->mem_end;
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ unsigned long flags;
+#endif
+
if (net_debug > 5)
- printk("eepro: entering eepro_send_packet routine.\n");
-
+ printk(KERN_DEBUG "%s: entering eepro_send_packet routine.\n", dev->name);
+
if (dev->tbusy) {
/* If we get here, some higher level has decided we are broken.
There should really be a "kick me" function call instead. */
int tickssofar = jiffies - dev->trans_start;
if (tickssofar < 40)
return 1;
- if (net_debug > 1)
- printk("%s: transmit timed out, %s?\n", dev->name,
- "network cable problem");
+
+ /* if (net_debug > 1) */
+ printk(KERN_ERR "%s: transmit timed out, %s?\n", dev->name,
+ "network cable problem");
+ /* This is not a duplicate. One message for the console,
+ one for the the log file */
+ printk(KERN_DEBUG "%s: transmit timed out, %s?\n", dev->name,
+ "network cable problem");
lp->stats.tx_errors++;
/* Try to restart the adaptor. */
- outb(SEL_RESET_CMD, ioaddr);
+ outb(SEL_RESET_CMD, ioaddr);
/* We are supposed to wait for 2 us after a SEL_RESET */
- udelay(2);
+ SLOW_DOWN;
+ SLOW_DOWN;
/* Do I also need to flush the transmit buffers here? YES? */
- lp->tx_start = lp->tx_end = rcv_ram;
+ lp->tx_start = lp->tx_end = rcv_ram;
lp->tx_last = 0;
-
+
dev->tbusy=0;
dev->trans_start = jiffies;
@@ -709,84 +1030,132 @@ eepro_send_packet(struct sk_buff *skb, struct device *dev)
}
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x20155
+ /* If some higher layer thinks we've missed an tx-done interrupt
+ we are passed NULL. Caution: dev_tint() handles the cli()/sti()
+ itself. */
+ /* if (skb == NULL) {
+ dev_tint(dev);
+ return 0;
+ }*/
+ /* according to A. Cox, this is obsolete since 1.0 */
+#endif
+
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_lock_irqsave(&lp->lock, flags);
+#endif
+
/* Block a timer-based transmit from overlapping. */
- if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
- printk("%s: Transmitter access conflict.\n", dev->name);
- else {
+ if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
+ printk(KERN_WARNING "%s: Transmitter access conflict.\n", dev->name);
+
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_unlock_irqrestore(&lp->lock, flags);
+#endif
+ } else {
short length = ETH_ZLEN < skb->len ? skb->len : ETH_ZLEN;
unsigned char *buf = skb->data;
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ lp->stats.tx_bytes+=skb->len;
+#endif
+
hardware_send_packet(dev, buf, length);
dev->trans_start = jiffies;
+
}
- dev_kfree_skb (skb);
+ compat_dev_kfree_skb (skb, FREE_WRITE);
/* You might need to clean up and record Tx statistics here. */
/* lp->stats.tx_aborted_errors++; */
if (net_debug > 5)
- printk("eepro: exiting eepro_send_packet routine.\n");
+ printk(KERN_DEBUG "%s: exiting eepro_send_packet routine.\n", dev->name);
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_unlock_irqrestore(&lp->lock, flags);
+#endif
+
return 0;
}
/* The typical workload of the driver:
Handle the network interface interrupts. */
+
static void
eepro_interrupt(int irq, void *dev_id, struct pt_regs * regs)
{
- struct device *dev = dev_id;
+ struct device *dev = (struct device *)dev_id;
+ /* (struct device *)(irq2dev_map[irq]);*/
+ struct eepro_local *lp = (struct eepro_local *)dev->priv;
int ioaddr, status, boguscount = 20;
- if (net_debug > 5)
- printk("eepro: entering eepro_interrupt routine.\n");
-
if (dev == NULL) {
- printk ("eepro_interrupt(): irq %d for unknown device.\n", irq);
+ printk (KERN_ERR "eepro_interrupt(): irq %d for unknown device.\\n", irq);
+ return;
+ }
+
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_lock(&lp->lock);
+#endif
+
+ if (dev->interrupt) {
+ printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
+
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_unlock(&lp->lock);
+ /* FIXME : with the lock, could this ever happen ? */
+#endif
+
return;
}
dev->interrupt = 1;
+ if (net_debug > 5)
+ printk(KERN_DEBUG "%s: entering eepro_interrupt routine.\n", dev->name);
+
ioaddr = dev->base_addr;
- do {
+ do {
status = inb(ioaddr + STATUS_REG);
-
+
if (status & RX_INT) {
if (net_debug > 4)
- printk("eepro: packet received interrupt.\n");
+ printk(KERN_DEBUG "%s: packet received interrupt.\n", dev->name);
/* Acknowledge the RX_INT */
outb(RX_INT, ioaddr + STATUS_REG);
-
/* Get the received packets */
eepro_rx(dev);
}
else if (status & TX_INT) {
if (net_debug > 4)
- printk("eepro: packet transmit interrupt.\n");
+ printk(KERN_DEBUG "%s: packet transmit interrupt.\n", dev->name);
/* Acknowledge the TX_INT */
- outb(TX_INT, ioaddr + STATUS_REG);
+ outb(TX_INT, ioaddr + STATUS_REG);
/* Process the status of transmitted packets */
eepro_transmit_interrupt(dev);
}
-
+
} while ((boguscount-- > 0) && (status & 0x06));
- dev->interrupt = 0;
+ dev->interrupt = 0;
+
if (net_debug > 5)
- printk("eepro: exiting eepro_interrupt routine.\n");
+ printk(KERN_DEBUG "%s: exiting eepro_interrupt routine.\n", dev->name);
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ spin_unlock(&lp->lock);
+#endif
return;
}
-static int
-eepro_close(struct device *dev)
+static int eepro_close(struct device *dev)
{
struct eepro_local *lp = (struct eepro_local *)dev->priv;
int ioaddr = dev->base_addr;
@@ -800,40 +1169,44 @@ eepro_close(struct device *dev)
/* Disable the physical interrupt line. */
temp_reg = inb(ioaddr + REG1);
- outb(temp_reg & 0x7f, ioaddr + REG1);
+ outb(temp_reg & 0x7f, ioaddr + REG1);
outb(BANK0_SELECT, ioaddr); /* Switch back to Bank 0 */
/* Flush the Tx and disable Rx. */
- outb(STOP_RCV_CMD, ioaddr);
+ outb(STOP_RCV_CMD, ioaddr);
lp->tx_start = lp->tx_end = rcv_ram ;
lp->tx_last = 0;
/* Mask all the interrupts. */
- outb(ALL_MASK, ioaddr + INT_MASK_REG);
+ outb(ALL_MASK, ioaddr + INT_MASK_REG);
/* clear all interrupts */
- outb(ALL_MASK, ioaddr + STATUS_REG);
+ outb(ALL_MASK, ioaddr + STATUS_REG);
/* Reset the 82595 */
- outb(RESET_CMD, ioaddr);
+ outb(RESET_CMD, ioaddr);
/* release the interrupt */
free_irq(dev->irq, dev);
+#ifdef irq2dev_map
+ irq2dev_map[dev->irq] = 0;
+#endif
+
/* Update the statistics here. What statistics? */
/* We are supposed to wait for 200 us after a RESET */
+ SLOW_DOWN;
+ SLOW_DOWN; /* May not be enough? */
- udelay(200);
-
MOD_DEC_USE_COUNT;
return 0;
}
/* Get the current statistics. This may be called with the card open or
closed. */
-static struct net_device_stats *
+static struct enet_statistics *
eepro_get_stats(struct device *dev)
{
struct eepro_local *lp = (struct eepro_local *)dev->priv;
@@ -851,7 +1224,7 @@ set_multicast_list(struct device *dev)
unsigned short mode;
struct dev_mc_list *dmi=dev->mc_list;
- if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63)
+ if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63)
{
/*
* We must make the kernel realise we had to move
@@ -859,17 +1232,18 @@ set_multicast_list(struct device *dev)
* the cable. If it was a promisc request the
* flag is already set. If not we assert it.
*/
- dev->flags|=IFF_PROMISC;
+ dev->flags|=IFF_PROMISC;
outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
mode = inb(ioaddr + REG2);
- outb(mode | PRMSC_Mode, ioaddr + REG2);
+ outb(mode | PRMSC_Mode, ioaddr + REG2);
mode = inb(ioaddr + REG3);
outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
printk("%s: promiscuous mode enabled.\n", dev->name);
}
- else if (dev->mc_count==0 )
+
+ else if (dev->mc_count==0 )
{
outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
mode = inb(ioaddr + REG2);
@@ -878,11 +1252,12 @@ set_multicast_list(struct device *dev)
outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
}
- else
+
+ else
{
unsigned short status, *eaddrs;
int i, boguscount = 0;
-
+
/* Disable RX and TX interrupts. Necessary to avoid
corruption of the HOST_ADDRESS_REG by interrupt
service routines. */
@@ -890,7 +1265,7 @@ set_multicast_list(struct device *dev)
outb(BANK2_SELECT, ioaddr); /* be CAREFUL, BANK 2 now */
mode = inb(ioaddr + REG2);
- outb(mode | Multi_IA, ioaddr + REG2);
+ outb(mode | Multi_IA, ioaddr + REG2);
mode = inb(ioaddr + REG3);
outb(mode, ioaddr + REG3); /* writing reg. 3 to complete the update */
outb(BANK0_SELECT, ioaddr); /* Return to BANK 0 now */
@@ -899,7 +1274,8 @@ set_multicast_list(struct device *dev)
outw(0, ioaddr + IO_PORT);
outw(0, ioaddr + IO_PORT);
outw(6*(dev->mc_count + 1), ioaddr + IO_PORT);
- for (i = 0; i < dev->mc_count; i++)
+
+ for (i = 0; i < dev->mc_count; i++)
{
eaddrs=(unsigned short *)dmi->dmi_addr;
dmi=dmi->next;
@@ -907,6 +1283,7 @@ set_multicast_list(struct device *dev)
outw(*eaddrs++, ioaddr + IO_PORT);
outw(*eaddrs++, ioaddr + IO_PORT);
}
+
eaddrs = (unsigned short *) dev->dev_addr;
outw(eaddrs[0], ioaddr + IO_PORT);
outw(eaddrs[1], ioaddr + IO_PORT);
@@ -916,9 +1293,10 @@ set_multicast_list(struct device *dev)
/* Update the transmit queue */
i = lp->tx_end + XMT_HEADER + 6*(dev->mc_count + 1);
- if (lp->tx_start != lp->tx_end)
+
+ if (lp->tx_start != lp->tx_end)
{
- /* update the next address and the chain bit in the
+ /* update the next address and the chain bit in the
last packet */
outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
outw(i, ioaddr + IO_PORT);
@@ -933,26 +1311,29 @@ set_multicast_list(struct device *dev)
/* Acknowledge that the MC setup is done */
do { /* We should be doing this in the eepro_interrupt()! */
- udelay(2);
- if (inb(ioaddr + STATUS_REG) & 0x08)
+ SLOW_DOWN;
+ SLOW_DOWN;
+ if (inb(ioaddr + STATUS_REG) & 0x08)
{
i = inb(ioaddr);
outb(0x08, ioaddr + STATUS_REG);
+
if (i & 0x20) { /* command ABORTed */
- printk("%s: multicast setup failed.\n",
+ printk("%s: multicast setup failed.\n",
dev->name);
break;
} else if ((i & 0x0f) == 0x03) { /* MC-Done */
- printk("%s: set Rx mode to %d addresses.\n",
- dev->name, dev->mc_count);
+ printk("%s: set Rx mode to %d address%s.\n",
+ dev->name, dev->mc_count,
+ dev->mc_count > 1 ? "es":"");
break;
}
}
} while (++boguscount < 100);
/* Re-enable RX and TX interrupts */
- outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
-
+ outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
+
}
outb(RCV_ENABLE_CMD, ioaddr);
}
@@ -961,7 +1342,7 @@ set_multicast_list(struct device *dev)
/* IMPORTANT - the 82595 will be set to Bank 0 after the eeprom is read */
/* The delay between EEPROM clock transitions. */
-#define eeprom_delay() { udelay(40); }
+#define eeprom_delay() { udelay(40); }
#define EE_READ_CMD (6 << 6)
int
@@ -972,10 +1353,10 @@ read_eeprom(int ioaddr, int location)
short ee_addr = ioaddr + EEPROM_REG;
int read_cmd = location | EE_READ_CMD;
short ctrl_val = EECS ;
-
+
outb(BANK2_SELECT, ioaddr);
outb(ctrl_val, ee_addr);
-
+
/* Shift the read command bits out. */
for (i = 8; i >= 0; i--) {
short outval = (read_cmd & (1 << i)) ? ctrl_val | EEDI
@@ -987,7 +1368,7 @@ read_eeprom(int ioaddr, int location)
eeprom_delay();
}
outb(ctrl_val, ee_addr);
-
+
for (i = 16; i > 0; i--) {
outb(ctrl_val | EESK, ee_addr); eeprom_delay();
retval = (retval << 1) | ((inb(ee_addr) & EEDO) ? 1 : 0);
@@ -1013,18 +1394,18 @@ hardware_send_packet(struct device *dev, void *buf, short length)
unsigned status, tx_available, last, end, boguscount = 100;
if (net_debug > 5)
- printk("eepro: entering hardware_send_packet routine.\n");
+ printk(KERN_DEBUG "%s: entering hardware_send_packet routine.\n", dev->name);
while (boguscount-- > 0) {
/* Disable RX and TX interrupts. Necessary to avoid
- corruption of the HOST_ADDRESS_REG by interrupt
- service routines. */
+ corruption of the HOST_ADDRESS_REG by interrupt
+ service routines. */
outb(ALL_MASK, ioaddr + INT_MASK_REG);
if (dev->interrupt == 1) {
/* Enable RX and TX interrupts */
- outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
+ outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
continue;
}
@@ -1035,13 +1416,13 @@ hardware_send_packet(struct device *dev, void *buf, short length)
tx_available = lp->tx_start - lp->tx_end;
else tx_available = XMT_RAM;
- if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER)
+ if (((((length + 3) >> 1) << 1) + 2*XMT_HEADER)
>= tx_available) /* No space available ??? */
{
eepro_transmit_interrupt(dev); /* Clean up the transmiting queue */
/* Enable RX and TX interrupts */
- outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
+ outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
continue;
}
@@ -1049,17 +1430,20 @@ hardware_send_packet(struct device *dev, void *buf, short length)
end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
if (end >= RAM_SIZE) { /* the transmit buffer is wrapped around */
- if ((RAM_SIZE - last) <= XMT_HEADER) {
- /* Arrrr!!!, must keep the xmt header together,
- several days were lost to chase this one down. */
+
+ if ((RAM_SIZE - last) <= XMT_HEADER) {
+ /* Arrrr!!!, must keep the xmt header together,
+ several days were lost to chase this one down. */
+
last = rcv_ram;
end = last + (((length + 3) >> 1) << 1) + XMT_HEADER;
}
+
else end = rcv_ram + (end - RAM_SIZE);
}
outw(last, ioaddr + HOST_ADDRESS_REG);
- outw(XMT_CMD, ioaddr + IO_PORT);
+ outw(XMT_CMD, ioaddr + IO_PORT);
outw(0, ioaddr + IO_PORT);
outw(end, ioaddr + IO_PORT);
outw(length, ioaddr + IO_PORT);
@@ -1074,22 +1458,24 @@ hardware_send_packet(struct device *dev, void *buf, short length)
}
/* A dummy read to flush the DRAM write pipeline */
- status = inw(ioaddr + IO_PORT);
+ status = inw(ioaddr + IO_PORT);
- if (lp->tx_start == lp->tx_end) {
+ if (lp->tx_start == lp->tx_end) {
outw(last, ioaddr + XMT_BAR);
outb(XMT_CMD, ioaddr);
lp->tx_start = last; /* I don't like to change tx_start here */
}
else {
- /* update the next address and the chain bit in the
- last packet */
+ /* update the next address and the chain bit in the
+ last packet */
+
if (lp->tx_end != last) {
outw(lp->tx_last + XMT_CHAIN, ioaddr + HOST_ADDRESS_REG);
- outw(last, ioaddr + IO_PORT);
+ outw(last, ioaddr + IO_PORT);
}
+
outw(lp->tx_last + XMT_COUNT, ioaddr + HOST_ADDRESS_REG);
- status = inw(ioaddr + IO_PORT);
+ status = inw(ioaddr + IO_PORT);
outw(status | CHAIN_BIT, ioaddr + IO_PORT);
/* Continue the transmit command */
@@ -1099,23 +1485,21 @@ hardware_send_packet(struct device *dev, void *buf, short length)
lp->tx_last = last;
lp->tx_end = end;
- /* Enable RX and TX interrupts */
- outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
-
if (dev->tbusy) {
dev->tbusy = 0;
}
-
- lp->stats.tx_bytes += length;
+
+ /* Enable RX and TX interrupts */
+ outb(ALL_MASK & ~(RX_MASK | TX_MASK), ioaddr + INT_MASK_REG);
if (net_debug > 5)
- printk("eepro: exiting hardware_send_packet routine.\n");
+ printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", dev->name);
return;
}
dev->tbusy = 1;
if (net_debug > 5)
- printk("eepro: exiting hardware_send_packet routine.\n");
+ printk(KERN_DEBUG "%s: exiting hardware_send_packet routine.\n", dev->name);
}
static void
@@ -1128,25 +1512,31 @@ eepro_rx(struct device *dev)
unsigned rcv_event, rcv_status, rcv_next_frame, rcv_size;
if (net_debug > 5)
- printk("eepro: entering eepro_rx routine.\n");
-
+ printk(KERN_DEBUG "%s: entering eepro_rx routine.\n", dev->name);
+
/* Set the read pointer to the start of the RCV */
outw(rcv_car, ioaddr + HOST_ADDRESS_REG);
+
rcv_event = inw(ioaddr + IO_PORT);
while (rcv_event == RCV_DONE) {
- rcv_status = inw(ioaddr + IO_PORT);
+
+ rcv_status = inw(ioaddr + IO_PORT);
rcv_next_frame = inw(ioaddr + IO_PORT);
- rcv_size = inw(ioaddr + IO_PORT);
+ rcv_size = inw(ioaddr + IO_PORT);
if ((rcv_status & (RX_OK | RX_ERROR)) == RX_OK) {
+
/* Malloc up new buffer. */
struct sk_buff *skb;
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+ lp->stats.rx_bytes+=rcv_size;
+#endif
rcv_size &= 0x3fff;
skb = dev_alloc_skb(rcv_size+5);
if (skb == NULL) {
- printk("%s: Memory squeeze, dropping packet.\n", dev->name);
+ printk(KERN_NOTICE "%s: Memory squeeze, dropping packet.\n", dev->name);
lp->stats.rx_dropped++;
break;
}
@@ -1155,33 +1545,39 @@ eepro_rx(struct device *dev)
if (lp->version == LAN595)
insw(ioaddr+IO_PORT, skb_put(skb,rcv_size), (rcv_size + 3) >> 1);
- else { /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
+ else { /* LAN595TX or LAN595FX, capable of 32-bit I/O processing */
unsigned short temp = inb(ioaddr + INT_MASK_REG);
outb(temp | IO_32_BIT, ioaddr + INT_MASK_REG);
- insl(ioaddr+IO_PORT_32_BIT, skb_put(skb,rcv_size), (rcv_size + 3) >> 2);
+ insl(ioaddr+IO_PORT_32_BIT, skb_put(skb,rcv_size),
+ (rcv_size + 3) >> 2);
outb(temp & ~(IO_32_BIT), ioaddr + INT_MASK_REG);
}
-
-
- skb->protocol = eth_type_trans(skb,dev);
+
+ skb->protocol = eth_type_trans(skb,dev);
netif_rx(skb);
lp->stats.rx_packets++;
- lp->stats.rx_bytes += rcv_size;
}
- else { /* Not sure will ever reach here,
- I set the 595 to discard bad received frames */
+
+ else { /* Not sure will ever reach here,
+ I set the 595 to discard bad received frames */
lp->stats.rx_errors++;
+
if (rcv_status & 0x0100)
lp->stats.rx_over_errors++;
+
else if (rcv_status & 0x0400)
lp->stats.rx_frame_errors++;
+
else if (rcv_status & 0x0800)
lp->stats.rx_crc_errors++;
- printk("%s: event = %#x, status = %#x, next = %#x, size = %#x\n",
+
+ printk("%s: event = %#x, status = %#x, next = %#x, size = %#x\n",
dev->name, rcv_event, rcv_status, rcv_next_frame, rcv_size);
}
+
if (rcv_status & 0x1000)
lp->stats.rx_length_errors++;
+
if (--boguscount == 0)
break;
@@ -1190,13 +1586,14 @@ eepro_rx(struct device *dev)
outw(rcv_next_frame, ioaddr + HOST_ADDRESS_REG);
rcv_event = inw(ioaddr + IO_PORT);
- }
+ }
if (rcv_car == 0)
rcv_car = (RCV_UPPER_LIMIT << 8) | 0xff;
+
outw(rcv_car - 1, ioaddr + RCV_STOP);
if (net_debug > 5)
- printk("eepro: exiting eepro_rx routine.\n");
+ printk(KERN_DEBUG "%s: exiting eepro_rx routine.\n", dev->name);
}
static void
@@ -1204,33 +1601,47 @@ eepro_transmit_interrupt(struct device *dev)
{
struct eepro_local *lp = (struct eepro_local *)dev->priv;
short ioaddr = dev->base_addr;
- short boguscount = 20;
+ short boguscount = 20;
short xmt_status;
+
+ /*
+ if (dev->tbusy == 0) {
+ printk("%s: transmit_interrupt called with tbusy = 0 ??\n",
+ dev->name);
+ printk(KERN_DEBUG "%s: transmit_interrupt called with tbusy = 0 ??\n",
+ dev->name);
+ }
+ */
- while (lp->tx_start != lp->tx_end) {
-
- outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG);
+ while (lp->tx_start != lp->tx_end) {
+
+ outw(lp->tx_start, ioaddr + HOST_ADDRESS_REG);
xmt_status = inw(ioaddr+IO_PORT);
+
if ((xmt_status & TX_DONE_BIT) == 0) break;
- xmt_status = inw(ioaddr+IO_PORT);
+ xmt_status = inw(ioaddr+IO_PORT);
lp->tx_start = inw(ioaddr+IO_PORT);
dev->tbusy = 0;
mark_bh(NET_BH);
if (xmt_status & 0x2000)
- lp->stats.tx_packets++;
+ lp->stats.tx_packets++;
else {
lp->stats.tx_errors++;
if (xmt_status & 0x0400)
lp->stats.tx_carrier_errors++;
printk("%s: XMT status = %#x\n",
dev->name, xmt_status);
+ printk(KERN_DEBUG "%s: XMT status = %#x\n",
+ dev->name, xmt_status);
}
+
if (xmt_status & 0x000f) {
lp->stats.collisions += (xmt_status & 0x000f);
}
+
if ((xmt_status & 0x0040) == 0x0) {
lp->stats.tx_heartbeat_errors++;
}
@@ -1241,43 +1652,76 @@ eepro_transmit_interrupt(struct device *dev)
}
#ifdef MODULE
-static char devicename[9] = { 0, };
-static struct device dev_eepro = {
- devicename, /* device name is inserted by linux/drivers/net/net_init.c */
- 0, 0, 0, 0,
- 0, 0,
- 0, 0, 0, NULL, eepro_probe };
-static int io = 0x200;
-static int irq = 0;
-static int mem = (RCV_RAM/1024); /* Size of the rx buffer in KB */
+#define MAX_EEPRO 8
+static char devicename[MAX_EEPRO][9];
+static struct device dev_eepro[MAX_EEPRO];
+static int io[MAX_EEPRO] = {
+#ifdef PnPWakeup
+ 0x210, /*: default for PnP enabled FX chips */
+#else
+ 0x200, /* Why? */
+#endif
+ -1, -1, -1, -1, -1, -1, -1};
+static int irq[MAX_EEPRO] = {0, 0, 0, 0, 0, 0, 0, 0};
+static int mem[MAX_EEPRO] = { /* Size of the rx buffer in KB */
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024),
+ (RCV_RAM/1024)
+};
+
+static int n_eepro = 0;
+/* For linux 2.1.xx */
+#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE > 0x20155
+MODULE_AUTHOR("Pascal Dupuis <dupuis@lei.ucl.ac.be> for the 2.1 stuff (locking,...)");
+MODULE_DESCRIPTION("Intel i82595 ISA EtherExpressPro10/10+ driver");
MODULE_PARM(io, "i");
MODULE_PARM(irq, "i");
MODULE_PARM(mem, "i");
+#endif
-int
+int
init_module(void)
{
- if (io == 0)
- printk("eepro: You should not use auto-probing with insmod!\n");
- dev_eepro.base_addr = io;
- dev_eepro.irq = irq;
- dev_eepro.mem_end = mem;
-
- if (register_netdev(&dev_eepro) != 0)
- return -EIO;
- return 0;
+ if (io[0] == 0)
+ printk("eepro_init_module: You should not use auto-probing with insmod!\n");
+
+ while (n_eepro < MAX_EEPRO && io[n_eepro] >= 0) {
+ struct device *d = &dev_eepro[n_eepro];
+ d->name = devicename[n_eepro]; /* inserted by drivers/net/net_init.c */
+ d->mem_end = mem[n_eepro];
+ d->base_addr = io[n_eepro];
+ d->irq = irq[n_eepro];
+ d->init = eepro_probe;
+
+ if (register_netdev(d) == 0)
+ n_eepro++;
+ }
+
+ return n_eepro ? 0 : -ENODEV;
}
void
cleanup_module(void)
{
- unregister_netdev(&dev_eepro);
- kfree_s(dev_eepro.priv,sizeof(struct eepro_local));
- dev_eepro.priv=NULL;
+ int i;
+
+ for (i=0; i<n_eepro; i++) {
+ struct device *d = &dev_eepro[i];
+ unregister_netdev(d);
+
+ kfree_s(d->priv,sizeof(struct eepro_local));
+ d->priv=NULL;
- /* If we don't do this, we can't re-insmod it later. */
- release_region(dev_eepro.base_addr, EEPRO_IO_EXTENT);
+ /* If we don't do this, we can't re-insmod it later. */
+ release_region(d->base_addr, EEPRO_IO_EXTENT);
+
+ }
}
#endif /* MODULE */
diff --git a/drivers/net/eepro100.c b/drivers/net/eepro100.c
index 14354fd1a..94546d995 100644
--- a/drivers/net/eepro100.c
+++ b/drivers/net/eepro100.c
@@ -1110,6 +1110,7 @@ static void speedo_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
/* Free the original skb. */
if (sp->tx_skbuff[entry]) {
sp->stats.tx_packets++; /* Count only user packets. */
+ sp->stats.tx_bytes += sp->tx_skbuff[entry]->len; /* Count transmitted bytes */
dev_free_skb(sp->tx_skbuff[entry]);
sp->tx_skbuff[entry] = 0;
} else if ((sp->tx_ring[entry].status&0x70000) == CmdNOp << 16)
@@ -1228,6 +1229,7 @@ speedo_rx(struct device *dev)
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
sp->stats.rx_packets++;
+ sp->stats.rx_bytes += pkt_len; /* Count received bytes */
}
entry = (++sp->cur_rx) % RX_RING_SIZE;
}
diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c
index 057fe5b86..005c574df 100644
--- a/drivers/net/eexpress.c
+++ b/drivers/net/eexpress.c
@@ -97,6 +97,7 @@
#include <asm/system.h>
#include <asm/bitops.h>
#include <asm/io.h>
+#include <asm/irq.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/init.h>
@@ -506,7 +507,7 @@ static int eexp_xmit(struct sk_buff *buf, struct device *dev)
printk(KERN_DEBUG "%s: eexp_xmit()\n", dev->name);
#endif
- outb(SIRQ_dis|irqrmap[dev->irq],dev->base_addr+SET_IRQ);
+ disable_irq(dev->irq);
/* If dev->tbusy is set, all our tx buffers are full but the kernel
* is calling us anyway. Check that nothing bad is happening.
@@ -543,7 +544,7 @@ static int eexp_xmit(struct sk_buff *buf, struct device *dev)
eexp_hw_tx_pio(dev,data,length);
}
dev_kfree_skb(buf);
- outb(SIRQ_en|irqrmap[dev->irq],dev->base_addr+SET_IRQ);
+ enable_irq(dev->irq);
return 0;
}
diff --git a/drivers/net/epic100.c b/drivers/net/epic100.c
index dc52fd84e..e56ddf5b0 100644
--- a/drivers/net/epic100.c
+++ b/drivers/net/epic100.c
@@ -1,25 +1,24 @@
-/* epic100.c: A SMC 83c170 EPIC/100 fast ethernet driver for Linux. */
+/* epic100.c: A SMC 83c170 EPIC/100 Fast Ethernet driver for Linux. */
/*
- NOTICE: THIS IS THE ALPHA TEST VERSION!
- Written 1997 by Donald Becker.
+ Written/copyright 1997-1998 by Donald Becker.
This software may be used and distributed according to the terms
of the GNU Public License, incorporated herein by reference.
- All other rights reserved.
+ All other rights reserved.
- This driver is for the SMC EtherPower II 9432 PCI ethernet adapter based on
- the SMC83c170.
+ This driver is for the SMC83c170/175 "EPIC" series, as used on the
+ SMC EtherPower II 9432 PCI adapter, and several CardBus cards.
The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
- Center of Excellence in Space Data and Information Sciences
+ USRA Center of Excellence in Space Data and Information Sciences
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
- Support and updates available at
+ Information and updates available at
http://cesdis.gsfc.nasa.gov/linux/drivers/epic100.html
*/
static const char *version =
-"epic100.c:v0.10 10/14/97 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/epic100.html\n";
+"epic100.c:v1.04 8/23/98 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/epic100.html\n";
/* A few user-configurable values. */
@@ -32,7 +31,7 @@ static const char *version =
/* Set the copy breakpoint for the copy-only-tiny-frames scheme.
Setting to > 1518 effectively disables this feature. */
-static const int rx_copybreak = 200;
+static int rx_copybreak = 200;
/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
static int max_interrupt_work = 10;
@@ -44,35 +43,38 @@ static int max_interrupt_work = 10;
#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
/* Bytes transferred to chip before transmission starts. */
-#define TX_FIFO_THRESH 128 /* Rounded down to 4 byte units. */
+#define TX_FIFO_THRESH 256 /* Rounded down to 4 byte units. */
#define RX_FIFO_THRESH 1 /* 0-3, 0==32, 64,96, or 3==128 bytes */
-#include <linux/config.h>
+#include <linux/version.h> /* Evil, but neccessary */
#ifdef MODULE
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>
-#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
#include <linux/kernel.h>
-#include <linux/sched.h>
#include <linux/string.h>
#include <linux/timer.h>
-#include <linux/ptrace.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/malloc.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
+#if LINUX_VERSION_CODE >= 0x20155
+#define PCI_SUPPORT_VER2
+#else
+#include <linux/bios32.h>
+#endif
+#include <linux/delay.h>
+
#include <asm/processor.h> /* Processor type for cache alignment. */
#include <asm/bitops.h>
#include <asm/io.h>
-#include <asm/dma.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
@@ -80,70 +82,39 @@ static int max_interrupt_work = 10;
/* Kernel compatibility defines, common to David Hind's PCMCIA package.
This is only in the support-all-kernels source code. */
-#include <linux/version.h> /* Evil, but neccessary */
-
-#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10300
-#define RUN_AT(x) (x) /* What to put in timer->expires. */
-#define DEV_ALLOC_SKB(len) alloc_skb(len, GFP_ATOMIC)
-#define virt_to_bus(addr) ((unsigned long)addr)
-#define bus_to_virt(addr) ((void*)addr)
-
-#else /* 1.3.0 and later */
-#define RUN_AT(x) (jiffies + (x))
-#define DEV_ALLOC_SKB(len) dev_alloc_skb(len + 2)
-#endif
-
-#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10338
-#ifdef MODULE
-#if !defined(CONFIG_MODVERSIONS) && !defined(__NO_VERSION__)
-char kernel_version[] = UTS_RELEASE;
-#endif
-#else
-#undef MOD_INC_USE_COUNT
-#define MOD_INC_USE_COUNT
-#undef MOD_DEC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
-#endif /* 1.3.38 */
-#if (LINUX_VERSION_CODE >= 0x10344)
-#define NEW_MULTICAST
-#include <linux/delay.h>
+#if ! defined (LINUX_VERSION_CODE) || LINUX_VERSION_CODE < 0x20000
+#warning This driver version is only for kernel versions 2.0.0 and later.
#endif
-#ifdef SA_SHIRQ
-#define FREE_IRQ(irqnum, dev) free_irq(irqnum, dev)
-#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n, instance)
-#define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
-#else
-#define FREE_IRQ(irqnum, dev) free_irq(irqnum)
-#define REQUEST_IRQ(i,h,f,n, instance) request_irq(i,h,f,n)
-#define IRQ(irq, dev_id, pt_regs) (irq, pt_regs)
-#endif
+#define RUN_AT(x) (jiffies + (x))
-#if (LINUX_VERSION_CODE < 0x20123)
-#define test_and_set_bit(val, addr) set_bit(val, addr)
-#include <linux/bios32.h>
-#else
-#ifdef MODULE
+#if defined(MODULE) && (LINUX_VERSION_CODE >= 0x20115)
MODULE_AUTHOR("Donald Becker <becker@cesdis.gsfc.nasa.gov>");
-MODULE_DESCRIPTION("SMC 82c170 EPIC series Ethernet driver");
+MODULE_DESCRIPTION("SMC 83c170 EPIC series Ethernet driver");
MODULE_PARM(debug, "i");
MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
MODULE_PARM(rx_copybreak, "i");
MODULE_PARM(max_interrupt_work, "i");
#endif
+#if LINUX_VERSION_CODE < 0x20123
+#define test_and_set_bit(val, addr) set_bit(val, addr)
+#endif
+#if LINUX_VERSION_CODE <= 0x20139
+#define net_device_stats enet_statistics
+#define NETSTATS_VER2
+#endif
+#if LINUX_VERSION_CODE < 0x20159
+#define DEV_FREE_SKB(skb) dev_kfree_skb(skb, FREE_WRITE);
+#else /* Grrr, unneeded incompatible change. */
+#define DEV_FREE_SKB(skb) dev_kfree_skb(skb);
#endif
/* The I/O extent. */
#define EPIC_TOTAL_SIZE 0x100
-#ifdef HAVE_DEVLIST
-struct netdev_entry epic100_drv =
-{"Epic100", epic100_pci_probe, EPIC_TOTAL_SIZE, NULL};
-#endif
-
+#define epic_debug debug
static int epic_debug = 1;
/*
@@ -151,11 +122,10 @@ static int epic_debug = 1;
I. Board Compatibility
-This device driver is designed for the SMC "EPCI/100", the SMC
-single-chip ethernet controllers for PCI. This chip is used on
+This device driver is designed for the SMC "EPIC/100", the SMC
+single-chip Ethernet controllers for PCI. This chip is used on
the SMC EtherPower II boards.
-
II. Board-specific settings
PCI bus devices are configured by the system at boot time, so no jumpers
@@ -170,25 +140,44 @@ IIIa. Ring buffers
IVb. References
-http://www.smc.com/components/catalog/smc83c170.html
+http://www.smsc.com/main/datasheets/83c171.pdf
+http://www.smsc.com/main/datasheets/83c175.pdf
http://cesdis.gsfc.nasa.gov/linux/misc/NWay.html
-http://www.national.com/pf/DP/DP83840.html
+http://www.national.com/pf/DP/DP83840A.html
IVc. Errata
*/
-#ifndef PCI_VENDOR_ID_SMC
-#define PCI_VENDOR_ID_SMC 0x10B8
-#endif
-#ifndef PCI_DEVICE_ID_SMC_EPIC100
-#define PCI_DEVICE_ID_SMC_EPIC100 0x0005
-#endif
-
/* The rest of these values should never change. */
+
+static struct device *epic_probe1(int pci_bus, int pci_devfn,
+ struct device *dev, long ioaddr, int irq,
+ int chip_id, int card_idx);
+
+enum pci_flags_bit {
+ PCI_USES_IO=1, PCI_USES_MEM=2, PCI_USES_MASTER=4,
+ PCI_ADDR0=0x10<<0, PCI_ADDR1=0x10<<1, PCI_ADDR2=0x10<<2, PCI_ADDR3=0x10<<3,
+};
+
+struct chip_info {
+ const char *name;
+ u16 vendor_id, device_id, device_id_mask, pci_flags;
+ int io_size, min_latency;
+ struct device *(*probe1)(int pci_bus, int pci_devfn, struct device *dev,
+ long ioaddr, int irq, int chip_idx, int fnd_cnt);
+} chip_tbl[] = {
+ {"SMSC EPIC/100 83c170", 0x10B8, 0x0005, 0x7fff,
+ PCI_USES_IO|PCI_USES_MASTER|PCI_ADDR0, EPIC_TOTAL_SIZE, 32, epic_probe1},
+ {"SMSC EPIC/C 83c175", 0x10B8, 0x0006, 0x7fff,
+ PCI_USES_IO|PCI_USES_MASTER|PCI_ADDR0, EPIC_TOTAL_SIZE, 32, epic_probe1},
+ {0,},
+};
+
/* Offsets to registers, using the (ugh) SMC names. */
enum epic_registers {
COMMAND=0, INTSTAT=4, INTMASK=8, GENCTL=0x0C, NVCTL=0x10, EECTL=0x14,
+ PCIBurstCnt=0x18,
TEST1=0x1C, CRCCNT=0x20, ALICNT=0x24, MPCNT=0x28, /* Rx error counters. */
MIICtrl=0x30, MIIData=0x34, MIICfg=0x38,
LAN0=64, /* MAC address. */
@@ -199,8 +188,9 @@ enum epic_registers {
/* Interrupt register bits, using my own meaningful names. */
enum IntrStatus {
- TxIdle=0x40000, RxIdle=0x20000,
- CntFull=0x0200, TxUnderrun=0x0100,
+ TxIdle=0x40000, RxIdle=0x20000, IntrSummary=0x010000,
+ PCIBusErr170=0x7000, PCIBusErr175=0x1000, PhyEvent175=0x8000,
+ RxStarted=0x0800, RxEarlyWarn=0x0400, CntFull=0x0200, TxUnderrun=0x0100,
TxEmpty=0x0080, TxDone=0x0020, RxError=0x0010,
RxOverflow=0x0008, RxFull=0x0004, RxHeader=0x0002, RxDone=0x0001,
};
@@ -213,7 +203,7 @@ struct epic_tx_desc {
u32 bufaddr;
u16 buflength;
u16 control;
- u32 next;
+ u32 next;
};
struct epic_rx_desc {
@@ -221,29 +211,36 @@ struct epic_rx_desc {
u16 rxlength;
u32 bufaddr;
u32 buflength;
- u32 next;
+ u32 next;
};
struct epic_private {
char devname[8]; /* Used only for kernel debugging. */
const char *product_name;
struct device *next_module;
+
+ /* Tx and Rx rings here so that they remain paragraph aligned. */
struct epic_rx_desc rx_ring[RX_RING_SIZE];
struct epic_tx_desc tx_ring[TX_RING_SIZE];
/* The saved address of a sent-in-place packet/buffer, for skfree(). */
struct sk_buff* tx_skbuff[TX_RING_SIZE];
/* The addresses of receive-in-place skbuffs. */
struct sk_buff* rx_skbuff[RX_RING_SIZE];
- int chip_id;
- int revision;
- struct enet_statistics stats;
- struct timer_list timer; /* Media selection timer. */
+
+ /* Ring pointers. */
unsigned int cur_rx, cur_tx; /* The next free ring entry */
unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
+
+ u8 pci_bus, pci_dev_fn; /* PCI bus location. */
+ u16 chip_id;
+
+ struct net_device_stats stats;
+ struct timer_list timer; /* Media selection timer. */
unsigned char mc_filter[8];
signed char phys[4]; /* MII device addresses. */
unsigned int tx_full:1; /* The Tx queue is full. */
- unsigned int full_duplex:1; /* Full-duplex operation requested. */
+ unsigned int full_duplex:1; /* Current duplex setting. */
+ unsigned int force_fd:1; /* Full-duplex operation requested. */
unsigned int default_port:4; /* Last dev->if_port value. */
unsigned int media2:4; /* Secondary monitored media port. */
unsigned int medialock:1; /* Don't sense media type. */
@@ -251,162 +248,174 @@ struct epic_private {
int pad0, pad1; /* Used for 8-byte alignment */
};
-static int full_duplex[] = {-1, -1, -1, -1, -1, -1, -1, -1};
-#ifdef MODULE
/* Used to pass the full-duplex flag, etc. */
-static int options[] = {-1, -1, -1, -1, -1, -1, -1, -1};
-#endif
+#define MAX_UNITS 8
+static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
+static int options[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
-static struct device *epic100_probe1(struct device *dev, int ioaddr, int irq,
- int chip_id, int options, int card_idx);
static int epic_open(struct device *dev);
-static int read_eeprom(int ioaddr, int location);
-static int mii_read(int ioaddr, int phy_id, int location);
+static int read_eeprom(long ioaddr, int location);
+static int mdio_read(long ioaddr, int phy_id, int location);
+static void mdio_write(long ioaddr, int phy_id, int location, int value);
+static void epic_restart(struct device *dev);
static void epic_timer(unsigned long data);
static void epic_tx_timeout(struct device *dev);
static void epic_init_ring(struct device *dev);
static int epic_start_xmit(struct sk_buff *skb, struct device *dev);
static int epic_rx(struct device *dev);
static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs);
+static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd);
static int epic_close(struct device *dev);
-static struct enet_statistics *epic_get_stats(struct device *dev);
-#ifdef NEW_MULTICAST
+static struct net_device_stats *epic_get_stats(struct device *dev);
static void set_rx_mode(struct device *dev);
-#else
-static void set_rx_mode(struct device *dev, int num_addrs, void *addrs);
-#endif
-
-#ifdef MODULE
/* A list of all installed EPIC devices, for removing the driver module. */
static struct device *root_epic_dev = NULL;
-#endif
+#ifndef CARDBUS
int epic100_probe(struct device *dev)
{
int cards_found = 0;
- static int pci_index = 0; /* Static, for multiple probe calls. */
-
- /* Ideally we would detect all network cards in slot order. That would
- be best done a central PCI probe dispatch, which wouldn't work
- well with the current structure. So instead we detect just the
- Epic cards in slot order. */
+ int chip_idx, irq;
+ u16 pci_command, new_command;
+ unsigned char pci_bus, pci_device_fn;
+
+#ifdef PCI_SUPPORT_VER2
+ struct pci_dev *pcidev = NULL;
+ while ((pcidev = pci_find_class(PCI_CLASS_NETWORK_ETHERNET << 8, pcidev))
+ != NULL) {
+ long pci_ioaddr = pcidev->base_address[0] & ~3;
+ int vendor = pcidev->vendor;
+ int device = pcidev->device;
+
+ for (chip_idx = 0; chip_tbl[chip_idx].vendor_id; chip_idx++)
+ if (vendor == chip_tbl[chip_idx].vendor_id
+ && (device & chip_tbl[chip_idx].device_id_mask) ==
+ chip_tbl[chip_idx].device_id)
+ break;
+ if (chip_tbl[chip_idx].vendor_id == 0 /* Compiled out! */
+ || check_region(pci_ioaddr, chip_tbl[chip_idx].io_size))
+ continue;
+ pci_bus = pcidev->bus->number;
+ pci_device_fn = pcidev->devfn;
+ irq = pcidev->irq;
+#else
+ int pci_index;
- if (pci_present()) {
- unsigned char pci_bus, pci_device_fn;
+ if ( ! pcibios_present())
+ return -ENODEV;
- for (;pci_index < 0xff; pci_index++) {
-#if LINUX_VERSION_CODE >= 0x20155
- unsigned int pci_irq_line;
- struct pci_dev *pdev;
-#else
- unsigned char pci_irq_line;
-#endif
- unsigned char pci_latency;
- unsigned short pci_command, vendor, device;
- unsigned int pci_ioaddr, chip_idx = 0;
+ for (pci_index = 0; pci_index < 0xff; pci_index++) {
+ u8 pci_irq_line;
+ u16 vendor, device;
+ u32 pci_ioaddr;
- if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
-#ifdef REVERSE_PROBE_ORDER
- 0xff - pci_index,
-#else
- pci_index,
-#endif
- &pci_bus, &pci_device_fn)
- != PCIBIOS_SUCCESSFUL)
+ if (pcibios_find_class (PCI_CLASS_NETWORK_ETHERNET << 8,
+ pci_index, &pci_bus, &pci_device_fn)
+ != PCIBIOS_SUCCESSFUL)
+ break;
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_VENDOR_ID, &vendor);
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_DEVICE_ID, &device);
+
+ for (chip_idx = 0; chip_tbl[chip_idx].vendor_id; chip_idx++)
+ if (vendor == chip_tbl[chip_idx].vendor_id
+ && (device & chip_tbl[chip_idx].device_id_mask) ==
+ chip_tbl[chip_idx].device_id)
break;
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_VENDOR_ID, &vendor);
- if (vendor != PCI_VENDOR_ID_SMC)
- continue;
-
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_DEVICE_ID, &device);
-#if LINUX_VERSION_CODE >= 0x20155
- pdev = pci_find_slot(pci_bus, pci_device_fn);
- pci_irq_line = pdev->irq;
- pci_ioaddr = pdev->base_address[0];
-#else
- pcibios_read_config_byte(pci_bus, pci_device_fn,
- PCI_INTERRUPT_LINE, &pci_irq_line);
- pcibios_read_config_dword(pci_bus, pci_device_fn,
- PCI_BASE_ADDRESS_0, &pci_ioaddr);
+ if (chip_tbl[chip_idx].vendor_id == 0) /* Compiled out! */
+ continue;
+
+ pcibios_read_config_dword(pci_bus, pci_device_fn,
+ PCI_BASE_ADDRESS_0, &pci_ioaddr);
+ pcibios_read_config_byte(pci_bus, pci_device_fn,
+ PCI_INTERRUPT_LINE, &pci_irq_line);
+ /* Remove I/O space marker in bit 0. */
+ pci_ioaddr &= ~3;
+ irq = pci_irq_line;
+
+ if (check_region(pci_ioaddr, chip_tbl[chip_idx].io_size))
+ continue;
#endif
- /* Remove I/O space marker in bit 0. */
- pci_ioaddr &= ~3;
-
- if (device != PCI_DEVICE_ID_SMC_EPIC100) {
- printk("Unknown SMC PCI ethernet chip type %4.4x detected:"
- " not configured.\n", device);
- continue;
- }
- if (epic_debug > 2)
- printk("Found SMC PCI EPIC/100 at I/O %#x, IRQ %d.\n",
- pci_ioaddr, pci_irq_line);
- if (check_region(pci_ioaddr, EPIC_TOTAL_SIZE))
- continue;
+ /* EPIC-specific code: Soft-reset the chip ere setting as master. */
+ outl(0x0001, pci_ioaddr + GENCTL);
+
+ /* Activate the card: fix for brain-damaged Win98 BIOSes. */
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, &pci_command);
+ new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
+ if (pci_command != new_command) {
+ printk(KERN_INFO " The PCI BIOS has not enabled Ethernet"
+ " device %4.4x-%4.4x."
+ " Updating PCI command %4.4x->%4.4x.\n",
+ vendor, device, pci_command, new_command);
+ pcibios_write_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, new_command);
+ }
-#ifdef MODULE
- dev = epic100_probe1(dev, pci_ioaddr, pci_irq_line, chip_idx,
- options[cards_found], cards_found);
-#else
- dev = epic100_probe1(dev, pci_ioaddr, pci_irq_line, chip_idx,
- dev ? dev->mem_start : 0, -1);
-#endif
+ dev = chip_tbl[chip_idx].probe1(pci_bus, pci_device_fn, dev, pci_ioaddr,
+ irq, chip_idx, cards_found);
- if (dev) {
- /* Get and check the bus-master and latency values. */
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_COMMAND, &pci_command);
- if ( ! (pci_command & PCI_COMMAND_MASTER)) {
- printk(" PCI Master Bit has not been set! Setting...\n");
- pci_command |= PCI_COMMAND_MASTER;
- pcibios_write_config_word(pci_bus, pci_device_fn,
- PCI_COMMAND, pci_command);
- }
- pcibios_read_config_byte(pci_bus, pci_device_fn,
- PCI_LATENCY_TIMER, &pci_latency);
- if (pci_latency < 10) {
- printk(" PCI latency timer (CFLT) is unreasonably low at %d."
- " Setting to 255 clocks.\n", pci_latency);
+ /* Check the latency timer. */
+ if (dev) {
+ u8 pci_latency;
+ pcibios_read_config_byte(pci_bus, pci_device_fn,
+ PCI_LATENCY_TIMER, &pci_latency);
+ if (pci_latency < chip_tbl[chip_idx].min_latency) {
+ printk(KERN_INFO " PCI latency timer (CFLT) value of %d is "
+ "unreasonably low, setting to %d.\n", pci_latency,
+ chip_tbl[chip_idx].min_latency);
pcibios_write_config_byte(pci_bus, pci_device_fn,
- PCI_LATENCY_TIMER, 255);
- } else if (epic_debug > 1)
- printk(" PCI latency timer (CFLT) is %#x.\n", pci_latency);
- dev = 0;
- cards_found++;
+ PCI_LATENCY_TIMER,
+ chip_tbl[chip_idx].min_latency);
}
+ dev = 0;
+ cards_found++;
}
}
-#if defined (MODULE)
- return cards_found;
-#else
return cards_found ? 0 : -ENODEV;
-#endif
}
+#endif /* not CARDBUS */
-static struct device *epic100_probe1(struct device *dev, int ioaddr, int irq,
- int chip_id, int options, int card_idx)
+static struct device *epic_probe1(int pci_bus, int pci_devfn,
+ struct device *dev, long ioaddr, int irq,
+ int chip_idx, int card_idx)
{
- static int did_version = 0; /* Already printed version info. */
- struct epic_private *tp;
- int i;
-
- if (epic_debug > 0 && did_version++ == 0)
- printk(version);
+ struct epic_private *ep;
+ int i, option = 0, duplex = 0;
+
+ if (dev && dev->mem_start) {
+ option = dev->mem_start;
+ duplex = (dev->mem_start & 16) ? 1 : 0;
+ } else if (card_idx >= 0 && card_idx < MAX_UNITS) {
+ if (options[card_idx] >= 0)
+ option = options[card_idx];
+ if (full_duplex[card_idx] >= 0)
+ duplex = full_duplex[card_idx];
+ }
dev = init_etherdev(dev, 0);
- printk("%s: SMC EPIC/100 at %#3x, IRQ %d, ", dev->name, ioaddr, irq);
+ dev->base_addr = ioaddr;
+ dev->irq = irq;
+ printk(KERN_INFO "%s: SMC EPIC/100 at %#lx, IRQ %d, ",
+ dev->name, ioaddr, dev->irq);
/* Bring the chip out of low-power mode. */
- outl(0x0200, ioaddr + GENCTL);
+ outl(0x4200, ioaddr + GENCTL);
/* Magic?! If we don't set this bit the MII interface won't work. */
outl(0x0008, ioaddr + TEST1);
+ /* Turn on the MII transceiver. */
+ outl(0x12, ioaddr + MIICfg);
+ if (chip_idx == 1)
+ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
+ outl(0x0200, ioaddr + GENCTL);
+
/* This could also be read from the EEPROM. */
for (i = 0; i < 3; i++)
((u16 *)dev->dev_addr)[i] = inw(ioaddr + LAN0 + i*4);
@@ -416,65 +425,68 @@ static struct device *epic100_probe1(struct device *dev, int ioaddr, int irq,
printk("%2.2x.\n", dev->dev_addr[i]);
if (epic_debug > 1) {
- printk("%s: EEPROM contents\n", dev->name);
- for (i = 0; i < 64; i++)
- printk(" %4.4x%s", read_eeprom(ioaddr, i), i % 16 == 15 ? "\n" : "");
+ printk(KERN_DEBUG "%s: EEPROM contents\n", dev->name);
+ for (i = 0; i < 64; i++)
+ printk(" %4.4x%s", read_eeprom(ioaddr, i),
+ i % 16 == 15 ? "\n" : "");
}
/* We do a request_region() to register /proc/ioports info. */
- request_region(ioaddr, EPIC_TOTAL_SIZE, "SMC EPIC/100");
-
- dev->base_addr = ioaddr;
- dev->irq = irq;
+ request_region(ioaddr, EPIC_TOTAL_SIZE, dev->name);
/* The data structures must be quadword aligned. */
- tp = kmalloc(sizeof(*tp), GFP_KERNEL | GFP_DMA);
- memset(tp, 0, sizeof(*tp));
- dev->priv = tp;
+ ep = kmalloc(sizeof(*ep), GFP_KERNEL | GFP_DMA);
+ memset(ep, 0, sizeof(*ep));
+ dev->priv = ep;
-#ifdef MODULE
- tp->next_module = root_epic_dev;
+ ep->next_module = root_epic_dev;
root_epic_dev = dev;
-#endif
- tp->chip_id = chip_id;
+ ep->pci_bus = pci_bus;
+ ep->pci_dev_fn = pci_devfn;
+#if defined(PCI_SUPPORT_VER2)
+ ep->chip_id = pci_find_slot(pci_bus, pci_devfn)->device;
+#else
+ ep->chip_id = chip_tbl[chip_idx].device_id;
+#endif
/* Find the connected MII xcvrs.
Doing this in open() would allow detecting external xcvrs later, but
takes too much time. */
{
int phy, phy_idx;
- for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
+ for (phy = 1, phy_idx = 0; phy < 32 && phy_idx < sizeof(ep->phys);
phy++) {
- int mii_status = mii_read(ioaddr, phy, 0);
+ int mii_status = mdio_read(ioaddr, phy, 1);
if (mii_status != 0xffff && mii_status != 0x0000) {
- tp->phys[phy_idx++] = phy;
- printk("%s: MII transceiver found at address %d.\n",
- dev->name, phy);
+ ep->phys[phy_idx++] = phy;
+ printk(KERN_INFO "%s: MII transceiver #%d control "
+ "%4.4x status %4.4x.\n"
+ KERN_INFO "%s: Autonegotiation advertising %4.4x "
+ "link partner %4.4x.\n",
+ dev->name, phy, mdio_read(ioaddr, phy, 0), mii_status,
+ dev->name, mdio_read(ioaddr, phy, 4),
+ mdio_read(ioaddr, phy, 5));
}
}
if (phy_idx == 0) {
- printk("%s: ***WARNING***: No MII transceiver found!\n",
+ printk(KERN_WARNING "%s: ***WARNING***: No MII transceiver found!\n",
dev->name);
/* Use the known PHY address of the EPII. */
- tp->phys[0] = 3;
+ ep->phys[0] = 3;
}
}
- /* Leave the chip in low-power mode. */
+ /* Turn off the MII xcvr (175 only!), leave the chip in low-power mode. */
+ if (ep->chip_id == 6)
+ outl(inl(ioaddr + NVCTL) & ~0x483C, ioaddr + NVCTL);
outl(0x0008, ioaddr + GENCTL);
/* The lower four bits are the media type. */
- if (options > 0) {
- tp->full_duplex = (options & 16) ? 1 : 0;
- tp->default_port = options & 15;
- if (tp->default_port)
- tp->medialock = 1;
- }
- if (card_idx >= 0) {
- if (full_duplex[card_idx] >= 0)
- tp->full_duplex = full_duplex[card_idx];
- }
+ ep->force_fd = duplex;
+ ep->default_port = option;
+ if (ep->default_port)
+ ep->medialock = 1;
/* The Epic-specific entries in the device structure. */
dev->open = &epic_open;
@@ -482,6 +494,7 @@ static struct device *epic100_probe1(struct device *dev, int ioaddr, int irq,
dev->stop = &epic_close;
dev->get_stats = &epic_get_stats;
dev->set_multicast_list = &set_rx_mode;
+ dev->do_ioctl = &mii_ioctl;
return dev;
}
@@ -498,41 +511,42 @@ static struct device *epic100_probe1(struct device *dev, int ioaddr, int irq,
#define EE_ENB (0x0001 | EE_CS)
/* Delay between EEPROM clock transitions.
- The 1.2 code is a "nasty" timing loop, but PC compatible machines are
- *supposed* to delay an ISA-compatible period for the SLOW_DOWN_IO macro. */
+ No extra delay is needed with 33Mhz PCI, but 66Mhz is untested.
+ */
+
#ifdef _LINUX_DELAY_H
-#define eeprom_delay(nanosec) udelay((nanosec + 999)/1000)
+#define eeprom_delay(nanosec) udelay(1)
#else
-#define eeprom_delay(nanosec) do { int _i = 3; while (--_i > 0) { __SLOW_DOWN_IO; }} while (0)
+#define eeprom_delay(nanosec) do { ; } while (0)
#endif
/* The EEPROM commands include the alway-set leading bit. */
#define EE_WRITE_CMD (5 << 6)
-#define EE_READ_CMD (6 << 6)
+#define EE_READ64_CMD (6 << 6)
+#define EE_READ256_CMD (6 << 8)
#define EE_ERASE_CMD (7 << 6)
-static int read_eeprom(int ioaddr, int location)
+static int read_eeprom(long ioaddr, int location)
{
int i;
int retval = 0;
- int ee_addr = ioaddr + EECTL;
- int read_cmd = location | EE_READ_CMD;
-
+ long ee_addr = ioaddr + EECTL;
+ int read_cmd = location |
+ (inl(ee_addr) & 0x40) ? EE_READ64_CMD : EE_READ256_CMD;
+
outl(EE_ENB & ~EE_CS, ee_addr);
outl(EE_ENB, ee_addr);
-
+
/* Shift the read command bits out. */
- for (i = 10; i >= 0; i--) {
- short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;
+ for (i = 12; i >= 0; i--) {
+ short dataval = (read_cmd & (1 << i)) ? EE_WRITE_1 : EE_WRITE_0;
outl(EE_ENB | dataval, ee_addr);
eeprom_delay(100);
outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);
eeprom_delay(150);
- outl(EE_ENB | dataval, ee_addr); /* Finish EEPROM a clock tick. */
- eeprom_delay(250);
}
outl(EE_ENB, ee_addr);
-
+
for (i = 16; i > 0; i--) {
outl(EE_ENB | EE_SHIFT_CLK, ee_addr);
eeprom_delay(100);
@@ -548,7 +562,7 @@ static int read_eeprom(int ioaddr, int location)
#define MII_READOP 1
#define MII_WRITEOP 2
-static int mii_read(int ioaddr, int phy_id, int location)
+static int mdio_read(long ioaddr, int phy_id, int location)
{
int i;
@@ -556,66 +570,82 @@ static int mii_read(int ioaddr, int phy_id, int location)
/* Typical operation takes < 50 ticks. */
for (i = 4000; i > 0; i--)
if ((inl(ioaddr + MIICtrl) & MII_READOP) == 0)
+ return inw(ioaddr + MIIData);
+ return 0xffff;
+}
+
+static void mdio_write(long ioaddr, int phy_id, int location, int value)
+{
+ int i;
+
+ outw(value, ioaddr + MIIData);
+ outl((phy_id << 9) | (location << 4) | MII_WRITEOP, ioaddr + MIICtrl);
+ for (i = 10000; i > 0; i--) {
+ if ((inl(ioaddr + MIICtrl) & MII_WRITEOP) == 0)
break;
- return inw(ioaddr + MIIData);
+ }
+ return;
}
static int
epic_open(struct device *dev)
{
- struct epic_private *tp = (struct epic_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
int i;
int mii_reg5;
- int full_duplex = 0;
+ ep->full_duplex = ep->force_fd;
/* Soft reset the chip. */
- outl(0x0001, ioaddr + GENCTL);
+ outl(0x4001, ioaddr + GENCTL);
-#ifdef SA_SHIRQ
- if (request_irq(dev->irq, &epic_interrupt, SA_SHIRQ,
- "SMC EPIC/100", dev)) {
- return -EAGAIN;
- }
-#else
- if (irq2dev_map[dev->irq] != NULL
- || (irq2dev_map[dev->irq] = dev) == NULL
- || dev->irq == 0
- || request_irq(dev->irq, &epic_interrupt, 0, "SMC EPIC/100")) {
+ if (request_irq(dev->irq, &epic_interrupt, SA_SHIRQ, "SMC EPIC/100", dev))
return -EAGAIN;
- }
-#endif
MOD_INC_USE_COUNT;
epic_init_ring(dev);
- /* This next line by Ken Yamaguchi.. ?? */
- outl(0x8, ioaddr + 0x1c);
+ outl(0x4000, ioaddr + GENCTL);
+ /* This next magic! line by Ken Yamaguchi.. ?? */
+ outl(0x0008, ioaddr + TEST1);
- /* Pull the chip out of low-power mode, enable interrupts, and set for PCI read multiple. */
+ /* Pull the chip out of low-power mode, enable interrupts, and set for
+ PCI read multiple. The MIIcfg setting and strange write order are
+ required by the details of which bits are reset and the transceiver
+ wiring on the Ositech CardBus card.
+ */
+ outl(0x12, ioaddr + MIICfg);
+ if (ep->chip_id == 6)
+ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
+
+#if defined(__powerpc__) || defined(__sparc__) /* Big endian */
+ outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
+#else
outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
+#endif
for (i = 0; i < 3; i++)
outl(((u16*)dev->dev_addr)[i], ioaddr + LAN0 + i*4);
outl(TX_FIFO_THRESH, ioaddr + TxThresh);
- full_duplex = tp->full_duplex;
- mii_reg5 = mii_read(ioaddr, tp->phys[0], 5);
- if (mii_reg5 != 0xffff && (mii_reg5 & 0x0100)) {
- full_duplex = 1;
+ mii_reg5 = mdio_read(ioaddr, ep->phys[0], 5);
+ if (mii_reg5 != 0xffff) {
+ if ((mii_reg5 & 0x0100) || (mii_reg5 & 0x01C0) == 0x0040)
+ ep->full_duplex = 1;
+ else if (! (mii_reg5 & 0x4000))
+ mdio_write(ioaddr, ep->phys[0], 0, 0x1200);
if (epic_debug > 1)
- printk("%s: Setting %s-duplex based on MII xcvr %d"
+ printk(KERN_INFO "%s: Setting %s-duplex based on MII xcvr %d"
" register read of %4.4x.\n", dev->name,
- full_duplex ? "full" : "half", tp->phys[0],
- mii_read(ioaddr, tp->phys[0], 5));
+ ep->full_duplex ? "full" : "half", ep->phys[0], mii_reg5);
}
- outl(full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
- outl(virt_to_bus(tp->rx_ring), ioaddr + PRxCDAR);
- outl(virt_to_bus(tp->tx_ring), ioaddr + PTxCDAR);
+ outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
+ outl(virt_to_bus(ep->rx_ring), ioaddr + PRxCDAR);
+ outl(virt_to_bus(ep->tx_ring), ioaddr + PTxCDAR);
/* Start the chip's Rx process. */
set_rx_mode(dev);
@@ -626,67 +656,160 @@ epic_open(struct device *dev)
dev->start = 1;
/* Enable interrupts by setting the interrupt mask. */
- outl(CntFull | TxUnderrun | TxDone
+ outl((ep->chip_id == 6 ? PCIBusErr175 : PCIBusErr170)
+ | CntFull | TxUnderrun | TxDone
| RxError | RxOverflow | RxFull | RxHeader | RxDone,
ioaddr + INTMASK);
if (epic_debug > 1)
- printk("%s: epic_open() ioaddr %4.4x IRQ %d status %4.4x %s-duplex.\n",
+ printk(KERN_DEBUG "%s: epic_open() ioaddr %lx IRQ %d status %4.4x "
+ "%s-duplex.\n",
dev->name, ioaddr, dev->irq, inl(ioaddr + GENCTL),
- full_duplex ? "full" : "half");
+ ep->full_duplex ? "full" : "half");
/* Set the timer to switch to check for link beat and perhaps switch
to an alternate media type. */
- init_timer(&tp->timer);
- tp->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */
- tp->timer.data = (unsigned long)dev;
- tp->timer.function = &epic_timer; /* timer handler */
- add_timer(&tp->timer);
+ init_timer(&ep->timer);
+ ep->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */
+ ep->timer.data = (unsigned long)dev;
+ ep->timer.function = &epic_timer; /* timer handler */
+ add_timer(&ep->timer);
return 0;
}
+/* Reset the chip to recover from a PCI transaction error.
+ This may occur at interrupt time. */
+static void epic_pause(struct device *dev)
+{
+ long ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+
+ /* Disable interrupts by clearing the interrupt mask. */
+ outl(0x00000000, ioaddr + INTMASK);
+ /* Stop the chip's Tx and Rx DMA processes. */
+ outw(0x0061, ioaddr + COMMAND);
+
+ /* Update the error counts. */
+ if (inw(ioaddr + COMMAND) != 0xffff) {
+ ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
+ ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
+ ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
+ }
+
+ /* Remove the packets on the Rx queue. */
+ epic_rx(dev);
+}
+
+static void epic_restart(struct device *dev)
+{
+ long ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ int i;
+
+ printk(KERN_DEBUG "%s: Restarting the EPIC chip, Rx %d/%d Tx %d/%d.\n",
+ dev->name, ep->cur_rx, ep->dirty_rx, ep->dirty_tx, ep->cur_tx);
+ /* Soft reset the chip. */
+ outl(0x0001, ioaddr + GENCTL);
+
+ udelay(1);
+ /* Duplicate code from epic_open(). */
+ outl(0x0008, ioaddr + TEST1);
+
+#if defined(__powerpc__) /* Big endian */
+ outl(0x0432 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
+#else
+ outl(0x0412 | (RX_FIFO_THRESH<<8), ioaddr + GENCTL);
+#endif
+ outl(0x12, ioaddr + MIICfg);
+ if (ep->chip_id == 6)
+ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
+
+ for (i = 0; i < 3; i++)
+ outl(((u16*)dev->dev_addr)[i], ioaddr + LAN0 + i*4);
+
+ outl(TX_FIFO_THRESH, ioaddr + TxThresh);
+ outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
+ outl(virt_to_bus(&ep->rx_ring[ep->cur_rx%RX_RING_SIZE]), ioaddr + PRxCDAR);
+ outl(virt_to_bus(&ep->tx_ring[ep->dirty_tx%TX_RING_SIZE]),
+ ioaddr + PTxCDAR);
+
+ /* Start the chip's Rx process. */
+ set_rx_mode(dev);
+ outl(0x000A, ioaddr + COMMAND);
+
+ /* Enable interrupts by setting the interrupt mask. */
+ outl((ep->chip_id == 6 ? PCIBusErr175 : PCIBusErr170)
+ | CntFull | TxUnderrun | TxDone
+ | RxError | RxOverflow | RxFull | RxHeader | RxDone,
+ ioaddr + INTMASK);
+ printk(KERN_DEBUG "%s: epic_restart() done, cmd status %4.4x, ctl %4.4x"
+ " interrupt %4.4x.\n",
+ dev->name, inl(ioaddr + COMMAND), inl(ioaddr + GENCTL),
+ inl(ioaddr + INTSTAT));
+ return;
+}
+
static void epic_timer(unsigned long data)
{
struct device *dev = (struct device *)data;
- struct epic_private *tp = (struct epic_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
int next_tick = 0;
+ int mii_reg5 = mdio_read(ioaddr, ep->phys[0], 5);
if (epic_debug > 3) {
- printk("%s: Media selection tick, Tx status %8.8x.\n",
+ printk(KERN_DEBUG "%s: Media selection tick, Tx status %8.8x.\n",
dev->name, inl(ioaddr + TxSTAT));
- printk("%s: Other registers are IntMask %4.4x IntStatus %4.4x RxStatus"
- " %4.4x.\n",
+ printk(KERN_DEBUG "%s: Other registers are IntMask %4.4x "
+ "IntStatus %4.4x RxStatus %4.4x.\n",
dev->name, inl(ioaddr + INTMASK), inl(ioaddr + INTSTAT),
inl(ioaddr + RxSTAT));
}
+ if (! ep->force_fd && mii_reg5 != 0xffff) {
+ int duplex = (mii_reg5&0x0100) || (mii_reg5 & 0x01C0) == 0x0040;
+ if (ep->full_duplex != duplex) {
+ ep->full_duplex = duplex;
+ printk(KERN_INFO "%s: Setting %s-duplex based on MII #%d link"
+ " partner capability of %4.4x.\n", dev->name,
+ ep->full_duplex ? "full" : "half", ep->phys[0], mii_reg5);
+ outl(ep->full_duplex ? 0x7F : 0x79, ioaddr + TxCtrl);
+ }
+ next_tick = 60*HZ;
+ }
if (next_tick) {
- tp->timer.expires = RUN_AT(next_tick);
- add_timer(&tp->timer);
+ ep->timer.expires = RUN_AT(next_tick);
+ add_timer(&ep->timer);
}
}
static void epic_tx_timeout(struct device *dev)
{
- struct epic_private *tp = (struct epic_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
if (epic_debug > 0) {
- printk("%s: Transmit timeout using MII device, Tx status %4.4x.\n",
+ printk(KERN_WARNING "%s: Transmit timeout using MII device, "
+ "Tx status %4.4x.\n",
dev->name, inw(ioaddr + TxSTAT));
if (epic_debug > 1) {
- printk("%s: Tx indices: dirty_tx %d, cur_tx %d.\n",
- dev->name, tp->dirty_tx, tp->cur_tx);
+ printk(KERN_DEBUG "%s: Tx indices: dirty_tx %d, cur_tx %d.\n",
+ dev->name, ep->dirty_tx, ep->cur_tx);
}
}
+ if (inw(ioaddr + TxSTAT) & 0x10) { /* Tx FIFO underflow. */
+ ep->stats.tx_fifo_errors++;
+ /* Restart the transmit process. */
+ outl(0x0080, ioaddr + COMMAND);
+ }
+
/* Perhaps stop and restart the chip's Tx processes . */
/* Trigger a transmit demand. */
outl(0x0004, dev->base_addr + COMMAND);
dev->trans_start = jiffies;
- tp->stats.tx_errors++;
+ ep->stats.tx_errors++;
return;
}
@@ -694,66 +817,51 @@ static void epic_tx_timeout(struct device *dev)
static void
epic_init_ring(struct device *dev)
{
- struct epic_private *tp = (struct epic_private *)dev->priv;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
int i;
- tp->tx_full = 0;
- tp->cur_rx = tp->cur_tx = 0;
- tp->dirty_rx = tp->dirty_tx = 0;
+ ep->tx_full = 0;
+ ep->cur_rx = ep->cur_tx = 0;
+ ep->dirty_rx = ep->dirty_tx = 0;
for (i = 0; i < RX_RING_SIZE; i++) {
- tp->rx_ring[i].status = 0x8000; /* Owned by Epic chip */
- tp->rx_ring[i].buflength = PKT_BUF_SZ;
+ ep->rx_ring[i].status = 0x8000; /* Owned by Epic chip */
+ ep->rx_ring[i].buflength = PKT_BUF_SZ;
{
/* Note the receive buffer must be longword aligned.
dev_alloc_skb() provides 16 byte alignment. But do *not*
use skb_reserve() to align the IP header! */
struct sk_buff *skb;
- skb = DEV_ALLOC_SKB(PKT_BUF_SZ);
- tp->rx_skbuff[i] = skb;
+ skb = dev_alloc_skb(PKT_BUF_SZ);
+ ep->rx_skbuff[i] = skb;
if (skb == NULL)
break; /* Bad news! */
skb->dev = dev; /* Mark as being used by this device. */
-#if LINUX_VERSION_CODE > 0x10300
skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
- tp->rx_ring[i].bufaddr = virt_to_bus(skb->tail);
-#else
- tp->rx_ring[i].bufaddr = virt_to_bus(skb->data);
-#endif
+ ep->rx_ring[i].bufaddr = virt_to_bus(skb->tail);
}
- tp->rx_ring[i].next = virt_to_bus(&tp->rx_ring[i+1]);
+ ep->rx_ring[i].next = virt_to_bus(&ep->rx_ring[i+1]);
}
/* Mark the last entry as wrapping the ring. */
- tp->rx_ring[i-1].next = virt_to_bus(&tp->rx_ring[0]);
+ ep->rx_ring[i-1].next = virt_to_bus(&ep->rx_ring[0]);
/* The Tx buffer descriptor is filled in as needed, but we
do need to clear the ownership bit. */
for (i = 0; i < TX_RING_SIZE; i++) {
- tp->tx_skbuff[i] = 0;
- tp->tx_ring[i].status = 0x0000;
- tp->tx_ring[i].next = virt_to_bus(&tp->tx_ring[i+1]);
+ ep->tx_skbuff[i] = 0;
+ ep->tx_ring[i].status = 0x0000;
+ ep->tx_ring[i].next = virt_to_bus(&ep->tx_ring[i+1]);
}
- tp->tx_ring[i-1].next = virt_to_bus(&tp->tx_ring[0]);
+ ep->tx_ring[i-1].next = virt_to_bus(&ep->tx_ring[0]);
}
static int
epic_start_xmit(struct sk_buff *skb, struct device *dev)
{
- struct epic_private *tp = (struct epic_private *)dev->priv;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
int entry;
u32 flag;
-#ifndef final_version
- if (skb == NULL || skb->len <= 0) {
- printk("%s: Obsolete driver layer request made: skbuff==NULL.\n",
- dev->name);
-#if 0
- dev_tint(dev);
-#endif
- return 0;
- }
-#endif
-
/* Block a timer-based transmit from overlapping. This could better be
done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
@@ -767,37 +875,40 @@ epic_start_xmit(struct sk_buff *skb, struct device *dev)
with the "ownership" bits last. */
/* Calculate the next Tx descriptor entry. */
- entry = tp->cur_tx % TX_RING_SIZE;
+ entry = ep->cur_tx % TX_RING_SIZE;
- tp->tx_skbuff[entry] = skb;
- tp->tx_ring[entry].txlength = (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN);
- tp->tx_ring[entry].bufaddr = virt_to_bus(skb->data);
- tp->tx_ring[entry].buflength = skb->len;
+ ep->tx_skbuff[entry] = skb;
+ ep->tx_ring[entry].txlength = (skb->len >= ETH_ZLEN ? skb->len : ETH_ZLEN);
+ ep->tx_ring[entry].bufaddr = virt_to_bus(skb->data);
+ ep->tx_ring[entry].buflength = skb->len;
- if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
+ /* tx_bytes counting -- Nolan Leake */
+ ep->stats.tx_bytes += ep->tx_ring[entry].txlength;
+
+ if (ep->cur_tx - ep->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
flag = 0x10; /* No interrupt */
- dev->tbusy = 0;
- } else if (tp->cur_tx - tp->dirty_tx == TX_RING_SIZE/2) {
+ clear_bit(0, (void*)&dev->tbusy);
+ } else if (ep->cur_tx - ep->dirty_tx == TX_RING_SIZE/2) {
flag = 0x14; /* Tx-done intr. */
- dev->tbusy = 0;
- } else if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE - 2) {
+ clear_bit(0, (void*)&dev->tbusy);
+ } else if (ep->cur_tx - ep->dirty_tx < TX_RING_SIZE - 2) {
flag = 0x10; /* No Tx-done intr. */
- dev->tbusy = 0;
+ clear_bit(0, (void*)&dev->tbusy);
} else {
/* Leave room for two additional entries. */
flag = 0x14; /* Tx-done intr. */
- tp->tx_full = 1;
+ ep->tx_full = 1;
}
- tp->tx_ring[entry].control = flag;
- tp->tx_ring[entry].status = 0x8000; /* Pass ownership to the chip. */
- tp->cur_tx++;
+ ep->tx_ring[entry].control = flag;
+ ep->tx_ring[entry].status = 0x8000; /* Pass ownership to the chip. */
+ ep->cur_tx++;
/* Trigger an immediate transmit demand. */
outl(0x0004, dev->base_addr + COMMAND);
dev->trans_start = jiffies;
if (epic_debug > 4)
- printk("%s: Queued Tx packet size %d to slot %d, "
+ printk(KERN_DEBUG "%s: Queued Tx packet size %d to slot %d, "
"flag %2.2x Tx status %8.8x.\n",
dev->name, (int)skb->len, entry, flag,
inl(dev->base_addr + TxSTAT));
@@ -807,27 +918,28 @@ epic_start_xmit(struct sk_buff *skb, struct device *dev)
/* The interrupt handler does all of the Rx thread work and cleans up
after the Tx thread. */
-static void epic_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs)
+static void epic_interrupt(int irq, void *dev_instance, struct pt_regs *regs)
{
-#ifdef SA_SHIRQ
struct device *dev = (struct device *)dev_instance;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ int status, boguscnt = max_interrupt_work;
+
+#if defined(__i386__)
+ /* A lock to prevent simultaneous entry bug on Intel SMP machines. */
+ if (test_and_set_bit(0, (void*)&dev->interrupt)) {
+ printk(KERN_ERR "%s: SMP simultaneous entry of an interrupt handler.\n",
+ dev->name);
+ dev->interrupt = 0; /* Avoid halting machine. */
+ return;
+ }
#else
- struct device *dev = (struct device *)(irq2dev_map[irq]);
-#endif
- struct epic_private *lp;
- int status, ioaddr, boguscnt = max_interrupt_work;
-
- if (dev == NULL) {
- printk ("epic_interrupt(): irq %d for unknown device.\n", irq);
+ if (dev->interrupt) {
+ printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
return;
}
-
- ioaddr = dev->base_addr;
- lp = (struct epic_private *)dev->priv;
- if (dev->interrupt)
- printk("%s: Re-entering the interrupt handler.\n", dev->name);
-
dev->interrupt = 1;
+#endif
do {
status = inl(ioaddr + INTSTAT);
@@ -838,18 +950,18 @@ static void epic_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs
printk("%s: interrupt interrupt=%#8.8x new intstat=%#8.8x.\n",
dev->name, status, inl(ioaddr + INTSTAT));
- if ((status & (RxDone | TxEmpty | TxDone)) == 0)
+ if ((status & IntrSummary) == 0)
break;
- if (status & RxDone) /* Rx interrupt */
+ if (status & (RxDone | RxStarted | RxEarlyWarn))
epic_rx(dev);
if (status & (TxEmpty | TxDone)) {
int dirty_tx;
- for (dirty_tx = lp->dirty_tx; dirty_tx < lp->cur_tx; dirty_tx++) {
+ for (dirty_tx = ep->dirty_tx; dirty_tx < ep->cur_tx; dirty_tx++) {
int entry = dirty_tx % TX_RING_SIZE;
- int txstatus = lp->tx_ring[entry].status;
+ int txstatus = ep->tx_ring[entry].status;
if (txstatus < 0)
break; /* It still hasn't been Txed */
@@ -861,66 +973,77 @@ static void epic_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs
printk("%s: Transmit error, Tx status %8.8x.\n",
dev->name, txstatus);
#endif
- lp->stats.tx_errors++;
- if (txstatus & 0x1050) lp->stats.tx_aborted_errors++;
- if (txstatus & 0x0008) lp->stats.tx_carrier_errors++;
- if (txstatus & 0x0040) lp->stats.tx_window_errors++;
- if (txstatus & 0x0010) lp->stats.tx_fifo_errors++;
+ ep->stats.tx_errors++;
+ if (txstatus & 0x1050) ep->stats.tx_aborted_errors++;
+ if (txstatus & 0x0008) ep->stats.tx_carrier_errors++;
+ if (txstatus & 0x0040) ep->stats.tx_window_errors++;
+ if (txstatus & 0x0010) ep->stats.tx_fifo_errors++;
#ifdef ETHER_STATS
- if (txstatus & 0x1000) lp->stats.collisions16++;
+ if (txstatus & 0x1000) ep->stats.collisions16++;
#endif
} else {
#ifdef ETHER_STATS
- if ((txstatus & 0x0002) != 0) lp->stats.tx_deferred++;
+ if ((txstatus & 0x0002) != 0) ep->stats.tx_deferred++;
#endif
- lp->stats.collisions += (txstatus >> 8) & 15;
- lp->stats.tx_packets++;
+ ep->stats.collisions += (txstatus >> 8) & 15;
+ ep->stats.tx_packets++;
}
/* Free the original skb. */
- dev_kfree_skb(lp->tx_skbuff[entry]);
- lp->tx_skbuff[entry] = 0;
+ DEV_FREE_SKB(ep->tx_skbuff[entry]);
+ ep->tx_skbuff[entry] = 0;
}
#ifndef final_version
- if (lp->cur_tx - dirty_tx > TX_RING_SIZE) {
+ if (ep->cur_tx - dirty_tx > TX_RING_SIZE) {
printk("%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
- dev->name, dirty_tx, lp->cur_tx, lp->tx_full);
+ dev->name, dirty_tx, ep->cur_tx, ep->tx_full);
dirty_tx += TX_RING_SIZE;
}
#endif
- if (lp->tx_full && dev->tbusy
- && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
+ if (ep->tx_full && dev->tbusy
+ && dirty_tx > ep->cur_tx - TX_RING_SIZE + 2) {
/* The ring is no longer full, clear tbusy. */
- lp->tx_full = 0;
- dev->tbusy = 0;
+ ep->tx_full = 0;
+ clear_bit(0, (void*)&dev->tbusy);
mark_bh(NET_BH);
}
- lp->dirty_tx = dirty_tx;
+ ep->dirty_tx = dirty_tx;
}
/* Check uncommon events all at once. */
- if (status & (CntFull | TxUnderrun | RxOverflow)) {
+ if (status & (CntFull | TxUnderrun | RxOverflow |
+ PCIBusErr170 | PCIBusErr175)) {
+ if (status == 0xffffffff) /* Chip failed or removed (CardBus). */
+ break;
/* Always update the error counts to avoid overhead later. */
- lp->stats.rx_missed_errors += inb(ioaddr + MPCNT);
- lp->stats.rx_frame_errors += inb(ioaddr + ALICNT);
- lp->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
+ ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
+ ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
+ ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
if (status & TxUnderrun) { /* Tx FIFO underflow. */
- lp->stats.tx_fifo_errors++;
- /* Restart the transmit process. */
- outl(0x0080, ioaddr + COMMAND);
+ ep->stats.tx_fifo_errors++;
+ outl(1536, ioaddr + TxThresh);
+ /* Restart the transmit process. */
+ outl(0x0080, ioaddr + COMMAND);
}
if (status & RxOverflow) { /* Missed a Rx frame. */
- lp->stats.rx_errors++;
+ ep->stats.rx_errors++;
+ }
+ if (status & PCIBusErr170) {
+ printk(KERN_ERR "%s: PCI Bus Error! EPIC status %4.4x.\n",
+ dev->name, status);
+ epic_pause(dev);
+ epic_restart(dev);
}
/* Clear all error sources. */
outl(status & 0x7f18, ioaddr + INTSTAT);
}
if (--boguscnt < 0) {
- printk("%s: Too much work at interrupt, IntrStatus=0x%8.8x.\n",
+ printk(KERN_ERR "%s: Too much work at interrupt, "
+ "IntrStatus=0x%8.8x.\n",
dev->name, status);
/* Clear all interrupt sources. */
outl(0x0001ffff, ioaddr + INTSTAT);
@@ -929,133 +1052,103 @@ static void epic_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs
} while (1);
if (epic_debug > 3)
- printk("%s: exiting interrupt, intr_status=%#4.4x.\n",
+ printk(KERN_DEBUG "%s: exiting interrupt, intr_status=%#4.4x.\n",
dev->name, inl(ioaddr + INTSTAT));
- /* Code that should never be run! Perhaps remove after testing.. */
- {
- static int stopit = 10;
- if (dev->start == 0 && --stopit < 0) {
- printk("%s: Emergency stop, looping startup interrupt.\n",
- dev->name);
- FREE_IRQ(irq, dev);
- }
- }
-
+#if defined(__i386__)
+ clear_bit(0, (void*)&dev->interrupt);
+#else
dev->interrupt = 0;
+#endif
return;
}
-static int
-epic_rx(struct device *dev)
+static int epic_rx(struct device *dev)
{
- struct epic_private *lp = (struct epic_private *)dev->priv;
- int entry = lp->cur_rx % RX_RING_SIZE;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ int entry = ep->cur_rx % RX_RING_SIZE;
+ int work_done = 0;
if (epic_debug > 4)
- printk(" In epic_rx(), entry %d %8.8x.\n", entry,
- lp->rx_ring[entry].status);
+ printk(KERN_DEBUG " In epic_rx(), entry %d %8.8x.\n", entry,
+ ep->rx_ring[entry].status);
/* If we own the next entry, it's a new packet. Send it up. */
- while (lp->rx_ring[entry].status >= 0) {
- int status = lp->rx_ring[entry].status;
+ while (ep->rx_ring[entry].status >= 0 && ep->rx_skbuff[entry]) {
+ int status = ep->rx_ring[entry].status;
if (epic_debug > 4)
- printk(" epic_rx() status was %8.8x.\n", status);
- if (status & 0x2000) {
- printk("%s: Oversized Ethernet frame spanned multiple buffers,"
- " status %4.4x!\n", dev->name, status);
- lp->stats.rx_length_errors++;
- } else if (status & 0x0006) {
- /* Rx Frame errors are counted in hardware. */
- lp->stats.rx_errors++;
+ printk(KERN_DEBUG " epic_rx() status was %8.8x.\n", status);
+ if (status & 0x2006) {
+ if (status & 0x2000) {
+ printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
+ "multiple buffers, status %4.4x!\n", dev->name, status);
+ ep->stats.rx_length_errors++;
+ } else if (status & 0x0006)
+ /* Rx Frame errors are counted in hardware. */
+ ep->stats.rx_errors++;
} else {
/* Malloc up new buffer, compatible with net-2e. */
/* Omit the four octet CRC from the length. */
- short pkt_len = lp->rx_ring[entry].rxlength - 4;
+ short pkt_len = ep->rx_ring[entry].rxlength - 4;
struct sk_buff *skb;
- int rx_in_place = 0;
-
- /* Check if the packet is long enough to just accept without
- copying to a properly sized skbuff. */
- if (pkt_len > rx_copybreak) {
- struct sk_buff *newskb;
- char *temp;
-
- /* Pass up the skb already on the Rx ring. */
- skb = lp->rx_skbuff[entry];
- temp = skb_put(skb, pkt_len);
- if (bus_to_virt(lp->rx_ring[entry].bufaddr) != temp)
- printk("%s: Warning -- the skbuff addresses do not match"
- " in epic_rx: %p vs. %p / %p.\n", dev->name,
- bus_to_virt(lp->rx_ring[entry].bufaddr),
- skb->head, temp);
- /* Get a fresh skbuff to replace the filled one. */
- newskb = DEV_ALLOC_SKB(PKT_BUF_SZ);
- if (newskb) {
- rx_in_place = 1;
- lp->rx_skbuff[entry] = newskb;
- newskb->dev = dev;
-#if LINUX_VERSION_CODE > 0x10300
- /* Align IP on 16 byte boundaries */
- skb_reserve(newskb, 2);
- lp->rx_ring[entry].bufaddr = virt_to_bus(newskb->tail);
+
+ /* Check if the packet is long enough to accept without copying
+ to a minimally-sized skbuff. */
+ if (pkt_len < rx_copybreak
+ && (skb = dev_alloc_skb(pkt_len + 2)) != NULL) {
+ skb->dev = dev;
+ skb_reserve(skb, 2); /* 16 byte align the IP header */
+#if 1 /* USE_IP_COPYSUM */
+ eth_copy_and_sum(skb, bus_to_virt(ep->rx_ring[entry].bufaddr),
+ pkt_len, 0);
+ skb_put(skb, pkt_len);
#else
- lp->rx_ring[entry].bufaddr = virt_to_bus(newskb->data);
-#endif
- } else /* No memory, drop the packet. */
- skb = 0;
- } else
- skb = DEV_ALLOC_SKB(pkt_len + 2);
- if (skb == NULL) {
- int i;
- printk("%s: Memory squeeze, deferring packet.\n", dev->name);
- /* Check that at least two ring entries are free.
- If not, free one and mark stats->rx_dropped++. */
- for (i = 0; i < RX_RING_SIZE; i++)
- if (lp->rx_ring[(entry+i) % RX_RING_SIZE].status < 0)
- break;
-
- if (i > RX_RING_SIZE -2) {
- lp->stats.rx_dropped++;
- lp->rx_ring[entry].status = 0x8000;
- lp->cur_rx++;
- }
- break;
- }
- skb->dev = dev;
- if (! rx_in_place) {
- skb_reserve(skb, 2); /* 16 byte align the data fields */
memcpy(skb_put(skb, pkt_len),
- bus_to_virt(lp->rx_ring[entry].bufaddr), pkt_len);
+ bus_to_virt(ep->rx_ring[entry].bufaddr), pkt_len);
+#endif
+ } else {
+ skb_put(skb = ep->rx_skbuff[entry], pkt_len);
+ ep->rx_skbuff[entry] = NULL;
}
-#if LINUX_VERSION_CODE > 0x10300
skb->protocol = eth_type_trans(skb, dev);
-#else
- skb->len = pkt_len;
-#endif
netif_rx(skb);
- lp->stats.rx_packets++;
+ ep->stats.rx_packets++;
+ /* rx_bytes counting -- Nolan Leake */
+ ep->stats.rx_bytes += pkt_len;
}
-
- lp->rx_ring[entry].status = 0x8000;
- entry = (++lp->cur_rx) % RX_RING_SIZE;
+ work_done++;
+ entry = (++ep->cur_rx) % RX_RING_SIZE;
}
- return 0;
+ /* Refill the Rx ring buffers. */
+ for (; ep->cur_rx - ep->dirty_rx > 0; ep->dirty_rx++) {
+ entry = ep->dirty_rx % RX_RING_SIZE;
+ if (ep->rx_skbuff[entry] == NULL) {
+ struct sk_buff *skb;
+ skb = ep->rx_skbuff[entry] = dev_alloc_skb(PKT_BUF_SZ);
+ if (skb == NULL)
+ break;
+ skb->dev = dev; /* Mark as being used by this device. */
+ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
+ ep->rx_ring[entry].bufaddr = virt_to_bus(skb->tail);
+ work_done++;
+ }
+ ep->rx_ring[entry].status = 0x8000;
+ }
+ return work_done;
}
-static int
-epic_close(struct device *dev)
+static int epic_close(struct device *dev)
{
- int ioaddr = dev->base_addr;
- struct epic_private *tp = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
int i;
dev->start = 0;
dev->tbusy = 1;
if (epic_debug > 1)
- printk("%s: Shutting down ethercard, status was %2.2x.\n",
+ printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
dev->name, inl(ioaddr + INTSTAT));
/* Disable interrupts by clearing the interrupt mask. */
@@ -1064,67 +1157,61 @@ epic_close(struct device *dev)
outw(0x0061, ioaddr + COMMAND);
/* Update the error counts. */
- tp->stats.rx_missed_errors += inb(ioaddr + MPCNT);
- tp->stats.rx_frame_errors += inb(ioaddr + ALICNT);
- tp->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
+ ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
+ ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
+ ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
- del_timer(&tp->timer);
+ del_timer(&ep->timer);
-#ifdef SA_SHIRQ
free_irq(dev->irq, dev);
-#else
- free_irq(dev->irq);
- irq2dev_map[dev->irq] = 0;
-#endif
/* Free all the skbuffs in the Rx queue. */
for (i = 0; i < RX_RING_SIZE; i++) {
- struct sk_buff *skb = tp->rx_skbuff[i];
- tp->rx_skbuff[i] = 0;
- tp->rx_ring[i].status = 0; /* Not owned by Epic chip. */
- tp->rx_ring[i].buflength = 0;
- tp->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */
+ struct sk_buff *skb = ep->rx_skbuff[i];
+ ep->rx_skbuff[i] = 0;
+ ep->rx_ring[i].status = 0; /* Not owned by Epic chip. */
+ ep->rx_ring[i].buflength = 0;
+ ep->rx_ring[i].bufaddr = 0xBADF00D0; /* An invalid address. */
if (skb) {
#if LINUX_VERSION_CODE < 0x20100
skb->free = 1;
#endif
- dev_kfree_skb(skb);
+ DEV_FREE_SKB(skb);
}
}
for (i = 0; i < TX_RING_SIZE; i++) {
- if (tp->tx_skbuff[i])
- dev_kfree_skb(tp->tx_skbuff[i]);
- tp->tx_skbuff[i] = 0;
+ if (ep->tx_skbuff[i])
+ DEV_FREE_SKB(ep->tx_skbuff[i]);
+ ep->tx_skbuff[i] = 0;
}
/* Green! Leave the chip in low-power mode. */
outl(0x0008, ioaddr + GENCTL);
-
+
MOD_DEC_USE_COUNT;
return 0;
}
-static struct enet_statistics *
-epic_get_stats(struct device *dev)
+static struct net_device_stats *epic_get_stats(struct device *dev)
{
- struct epic_private *tp = (struct epic_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
if (dev->start) {
/* Update the error counts. */
- tp->stats.rx_missed_errors += inb(ioaddr + MPCNT);
- tp->stats.rx_frame_errors += inb(ioaddr + ALICNT);
- tp->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
+ ep->stats.rx_missed_errors += inb(ioaddr + MPCNT);
+ ep->stats.rx_frame_errors += inb(ioaddr + ALICNT);
+ ep->stats.rx_crc_errors += inb(ioaddr + CRCCNT);
}
- return &tp->stats;
+ return &ep->stats;
}
/* Set or clear the multicast filter for this adaptor.
Note that we only use exclusion around actually queueing the
- new frame, not around filling tp->setup_frame. This is non-deterministic
+ new frame, not around filling ep->setup_frame. This is non-deterministic
when re-entered but still correct. */
/* The little-endian AUTODIN II ethernet CRC calculation.
@@ -1149,21 +1236,17 @@ static inline unsigned ether_crc_le(int length, unsigned char *data)
}
-#ifdef NEW_MULTICAST
static void set_rx_mode(struct device *dev)
-#else
-static void set_rx_mode(struct device *dev, int num_addrs, void *addrs);
-#endif
{
- int ioaddr = dev->base_addr;
- struct epic_private *tp = (struct epic_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ struct epic_private *ep = (struct epic_private *)dev->priv;
unsigned char mc_filter[8]; /* Multicast hash filter */
int i;
if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */
outl(0x002C, ioaddr + RxCtrl);
/* Unconditionally log net taps. */
- printk("%s: Promiscuous mode enabled.\n", dev->name);
+ printk(KERN_INFO "%s: Promiscuous mode enabled.\n", dev->name);
memset(mc_filter, 0xff, sizeof(mc_filter));
} else if ((dev->mc_count > 0) || (dev->flags & IFF_ALLMULTI)) {
/* There is apparently a chip bug, so the multicast filter
@@ -1184,45 +1267,176 @@ static void set_rx_mode(struct device *dev, int num_addrs, void *addrs);
mc_filter);
}
/* ToDo: perhaps we need to stop the Tx and Rx process here? */
- if (memcmp(mc_filter, tp->mc_filter, sizeof(mc_filter))) {
+ if (memcmp(mc_filter, ep->mc_filter, sizeof(mc_filter))) {
for (i = 0; i < 4; i++)
outw(((u16 *)mc_filter)[i], ioaddr + MC0 + i*4);
- memcpy(tp->mc_filter, mc_filter, sizeof(mc_filter));
+ memcpy(ep->mc_filter, mc_filter, sizeof(mc_filter));
}
return;
}
+
+static int mii_ioctl(struct device *dev, struct ifreq *rq, int cmd)
+{
+ long ioaddr = dev->base_addr;
+ u16 *data = (u16 *)&rq->ifr_data;
+
+ switch(cmd) {
+ case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
+ data[0] = ((struct epic_private *)dev->priv)->phys[0] & 0x1f;
+ /* Fall Through */
+ case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
+ if (! dev->start) {
+ outl(0x0200, ioaddr + GENCTL);
+ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
+ }
+ data[3] = mdio_read(ioaddr, data[0] & 0x1f, data[1] & 0x1f);
+ if (! dev->start) {
+#ifdef notdef
+ outl(0x0008, ioaddr + GENCTL);
+ outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL);
+#endif
+ }
+ return 0;
+ case SIOCDEVPRIVATE+2: /* Write the specified MII register */
+ if (!suser())
+ return -EPERM;
+ if (! dev->start) {
+ outl(0x0200, ioaddr + GENCTL);
+ outl((inl(ioaddr + NVCTL) & ~0x003C) | 0x4800, ioaddr + NVCTL);
+ }
+ mdio_write(ioaddr, data[0] & 0x1f, data[1] & 0x1f, data[2]);
+ if (! dev->start) {
+#ifdef notdef
+ outl(0x0008, ioaddr + GENCTL);
+ outl((inl(ioaddr + NVCTL) & ~0x483C) | 0x0000, ioaddr + NVCTL);
+#endif
+ }
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+}
+
-#ifdef MODULE
+#ifdef CARDBUS
-/* An additional parameter that may be passed in... */
-static int debug = -1;
+#include <pcmcia/driver_ops.h>
-int
-init_module(void)
+static dev_node_t *epic_attach(dev_locator_t *loc)
{
- int cards_found;
+ struct device *dev;
+ u16 dev_id;
+ u32 io;
+ u8 bus, devfn, irq;
+
+ if (loc->bus != LOC_PCI) return NULL;
+ bus = loc->b.pci.bus; devfn = loc->b.pci.devfn;
+ printk(KERN_DEBUG "epic_attach(bus %d, function %d)\n", bus, devfn);
+ pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io);
+ pcibios_read_config_byte(bus, devfn, PCI_INTERRUPT_LINE, &irq);
+ pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id);
+ io &= ~3;
+ if (io == 0 || irq == 0) {
+ printk(KERN_ERR "The EPIC/C CardBus Ethernet interface was not "
+ "assigned an %s.\n" KERN_ERR " It will not be activated.\n",
+ io == 0 ? "I/O address" : "IRQ");
+ return NULL;
+ }
+ dev = epic_probe1(bus, devfn, NULL, io, irq, 2, -1);
+ if (dev) {
+ dev_node_t *node = kmalloc(sizeof(dev_node_t), GFP_KERNEL);
+ strcpy(node->dev_name, dev->name);
+ node->major = node->minor = 0;
+ node->next = NULL;
+ MOD_INC_USE_COUNT;
+ return node;
+ }
+ return NULL;
+}
- if (debug >= 0)
- epic_debug = debug;
+static void epic_suspend(dev_node_t *node)
+{
+ struct device **devp, **next;
+ printk(KERN_INFO "epic_suspend(%s)\n", node->dev_name);
+ for (devp = &root_epic_dev; *devp; devp = next) {
+ next = &((struct epic_private *)(*devp)->priv)->next_module;
+ if (strcmp((*devp)->name, node->dev_name) == 0) break;
+ }
+ if (*devp) {
+ long ioaddr = (*devp)->base_addr;
+ epic_pause(*devp);
+ /* Put the chip into low-power mode. */
+ outl(0x0008, ioaddr + GENCTL);
+ }
+}
+static void epic_resume(dev_node_t *node)
+{
+ struct device **devp, **next;
+ printk(KERN_INFO "epic_resume(%s)\n", node->dev_name);
+ for (devp = &root_epic_dev; *devp; devp = next) {
+ next = &((struct epic_private *)(*devp)->priv)->next_module;
+ if (strcmp((*devp)->name, node->dev_name) == 0) break;
+ }
+ if (*devp) {
+ epic_restart(*devp);
+ }
+}
+static void epic_detach(dev_node_t *node)
+{
+ struct device **devp, **next;
+ printk(KERN_INFO "epic_detach(%s)\n", node->dev_name);
+ for (devp = &root_epic_dev; *devp; devp = next) {
+ next = &((struct epic_private *)(*devp)->priv)->next_module;
+ if (strcmp((*devp)->name, node->dev_name) == 0) break;
+ }
+ if (*devp) {
+ unregister_netdev(*devp);
+ kfree(*devp);
+ *devp = *next;
+ kfree(node);
+ MOD_DEC_USE_COUNT;
+ }
+}
- root_epic_dev = NULL;
- cards_found = epic100_probe(0);
+struct driver_operations epic_ops = {
+ "epic_cb", epic_attach, epic_suspend, epic_resume, epic_detach
+};
- return cards_found ? 0 : -ENODEV;
+#endif /* Cardbus support */
+
+
+#ifdef MODULE
+
+int init_module(void)
+{
+ if (epic_debug)
+ printk(KERN_INFO "%s", version);
+
+#ifdef CARDBUS
+ register_driver(&epic_ops);
+ return 0;
+#else
+ return epic100_probe(0);
+#endif
}
-void
-cleanup_module(void)
+void cleanup_module(void)
{
struct device *next_dev;
+#ifdef CARDBUS
+ unregister_driver(&epic_ops);
+#endif
+
/* No need to check MOD_IN_USE, as sys_delete_module() checks. */
while (root_epic_dev) {
- next_dev = ((struct epic_private *)root_epic_dev->priv)->next_module;
+ struct epic_private *ep = (struct epic_private *)root_epic_dev->priv;
+ next_dev = ep->next_module;
unregister_netdev(root_epic_dev);
release_region(root_epic_dev->base_addr, EPIC_TOTAL_SIZE);
kfree(root_epic_dev);
root_epic_dev = next_dev;
+ kfree(ep);
}
}
@@ -1230,7 +1444,8 @@ cleanup_module(void)
/*
* Local variables:
- * compile-command: "gcc -DMODULE -DMODVERSIONS -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c epic100.c"
+ * compile-command: "gcc -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c epic100.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
+ * cardbus-compile-command: "gcc -DCARDBUS -DMODULE -D__KERNEL__ -Wall -Wstrict-prototypes -O6 -c epic100.c -o epic_cb.o -I/usr/src/pcmcia-cs-3.0.5/include/"
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 4
diff --git a/drivers/net/es3210.c b/drivers/net/es3210.c
index 6aeb146db..f57e76cda 100644
--- a/drivers/net/es3210.c
+++ b/drivers/net/es3210.c
@@ -439,7 +439,6 @@ cleanup_module(void)
void *priv = dev->priv;
free_irq(dev->irq, dev);
release_region(dev->base_addr, ES_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/eth16i.c b/drivers/net/eth16i.c
index 59921bfc2..391f6194a 100644
--- a/drivers/net/eth16i.c
+++ b/drivers/net/eth16i.c
@@ -799,12 +799,12 @@ static int eth16i_receive_probe_packet(int ioaddr)
if( (jiffies - starttime) > TX_TIMEOUT) {
if(eth16i_debug > 1)
- printk(KERN_DEBUG "Timeout occured waiting transmit packet received\n");
+ printk(KERN_DEBUG "Timeout occurred waiting transmit packet received\n");
starttime = jiffies;
while((inb(ioaddr + RX_STATUS_REG) & 0x80) == 0) {
if( (jiffies - starttime) > TX_TIMEOUT) {
if(eth16i_debug > 1)
- printk(KERN_DEBUG "Timeout occured waiting receive packet\n");
+ printk(KERN_DEBUG "Timeout occurred waiting receive packet\n");
return -1;
}
}
diff --git a/drivers/net/fmv18x.c b/drivers/net/fmv18x.c
index 3350d0d5c..749e1f123 100644
--- a/drivers/net/fmv18x.c
+++ b/drivers/net/fmv18x.c
@@ -32,7 +32,7 @@
*/
static const char *version =
- "fmv18x.c:v1.3.71e 03/04/96 Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)\n";
+ "fmv18x.c:v2.2.0 09/24/98 Yutaka TAMIYA (tamy@flab.fujitsu.co.jp)\n";
#include <linux/module.h>
@@ -74,6 +74,8 @@ struct net_local {
struct net_device_stats stats;
long open_time; /* Useless example local info. */
uint tx_started:1; /* Number of packet on the Tx queue. */
+ uint tx_queue_ready:1; /* Tx queue is ready to be sent. */
+ uint rx_started:1; /* Packets are Rxing. */
uchar tx_queue; /* Number of packet on the Tx queue. */
ushort tx_queue_len; /* Current length of the Tx queue. */
};
@@ -92,7 +94,7 @@ struct net_local {
/* Run-time register bank 2 definitions. */
#define DATAPORT 8 /* Word-wide DMA or programmed-I/O dataport. */
#define TX_START 10
-#define COL16CNTL 11
+#define COL16CNTL 11 /* Controll Reg for 16 collisions */
#define MODE13 13
/* Fujitsu FMV-18x Card Configuration */
#define FJ_STATUS0 0x10
@@ -164,6 +166,7 @@ fmv18x_probe(struct device *dev))
__initfunc(int fmv18x_probe1(struct device *dev, short ioaddr))
{
char irqmap[4] = {3, 7, 10, 15};
+ char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15};
unsigned int i, irq;
/* Resetting the chip doesn't reset the ISA interface, so don't bother.
@@ -171,13 +174,26 @@ __initfunc(int fmv18x_probe1(struct device *dev, short ioaddr))
*/
/* Check I/O address configuration and Fujitsu vendor code */
- if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr
- || inb(ioaddr+FJ_MACADDR ) != 0x00
+ if (inb(ioaddr+FJ_MACADDR ) != 0x00
|| inb(ioaddr+FJ_MACADDR+1) != 0x00
|| inb(ioaddr+FJ_MACADDR+2) != 0x0e)
return -ENODEV;
- irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
+ /* Check PnP mode for FMV-183/184/183A/184A. */
+ /* This PnP routine is very poor. IO and IRQ should be known. */
+ if (inb(ioaddr + FJ_STATUS1) & 0x20) {
+ irq = dev->irq;
+ for (i = 0; i < 8; i++) {
+ if (irq == irqmap_pnp[i])
+ break;
+ }
+ if (i == 8)
+ return -ENODEV;
+ } else {
+ if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr)
+ return -ENODEV;
+ irq = irqmap[(inb(ioaddr + FJ_CONFIG0)>>6) & 0x03];
+ }
/* Snarf the interrupt vector now. */
if (request_irq(irq, &net_interrupt, 0, "fmv18x", dev)) {
@@ -247,6 +263,7 @@ __initfunc(int fmv18x_probe1(struct device *dev, short ioaddr))
/* Switch to bank 2 and lock our I/O address. */
outb(0x08, ioaddr + CONFIG_1);
outb(dev->if_port, ioaddr + MODE13);
+ outb(0x00, ioaddr + COL16CNTL);
if (net_debug)
printk(version);
@@ -283,6 +300,8 @@ static int net_open(struct device *dev)
outb(0xe8, ioaddr + CONFIG_1);
lp->tx_started = 0;
+ lp->tx_queue_ready = 1;
+ lp->rx_started = 0;
lp->tx_queue = 0;
lp->tx_queue_len = 0;
@@ -364,14 +383,20 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
printk("%s: Transmitting a packet of length %lu.\n", dev->name,
(unsigned long)skb->len);
- /* Disable both interrupts. */
- outw(0x0000, ioaddr + TX_INTR);
-
- outw(length, ioaddr + DATAPORT);
- outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
-
- lp->tx_queue++;
- lp->tx_queue_len += length + 2;
+ /* We may not start transmitting unless we finish transferring
+ a packet into the Tx queue. During executing the following
+ codes we possibly catch a Tx interrupt. Thus we flag off
+ tx_queue_ready, so that we prevent the interrupt routine
+ (net_interrupt) to start transmitting. */
+ lp->tx_queue_ready = 0;
+ {
+ outw(length, ioaddr + DATAPORT);
+ outsw(ioaddr + DATAPORT, buf, (length + 1) >> 1);
+
+ lp->tx_queue++;
+ lp->tx_queue_len += length + 2;
+ }
+ lp->tx_queue_ready = 1;
if (lp->tx_started == 0) {
/* If the Tx is idle, always trigger a transmit. */
@@ -384,9 +409,6 @@ net_send_packet(struct sk_buff *skb, struct device *dev)
} else if (lp->tx_queue_len < 4096 - 1502)
/* Yes, there is room for one more packet. */
dev->tbusy = 0;
-
- /* Re-enable interrupts */
- outw(0x8182, ioaddr + TX_INTR);
}
dev_kfree_skb (skb);
@@ -410,23 +432,37 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
ioaddr = dev->base_addr;
lp = (struct net_local *)dev->priv;
-
- /* Avoid multiple interrupts. */
- outw(0x0000, ioaddr + TX_INTR);
-
- status = inw(ioaddr + TX_STATUS);
+ status = inw(ioaddr + TX_STATUS);
outw(status, ioaddr + TX_STATUS);
if (net_debug > 4)
printk("%s: Interrupt with status %04x.\n", dev->name, status);
- if (status & 0xff00
- || (inb(ioaddr + RX_MODE) & 0x40) == 0) { /* Got a packet(s). */
+ if (lp->rx_started == 0 &&
+ (status & 0xff00 || (inb(ioaddr + RX_MODE) & 0x40) == 0)) {
+ /* Got a packet(s).
+ We cannot execute net_rx more than once at the same time for
+ the same device. During executing net_rx, we possibly catch a
+ Tx interrupt. Thus we flag on rx_started, so that we prevent
+ the interrupt routine (net_interrupt) to dive into net_rx
+ again. */
+ lp->rx_started = 1;
+ outb(0x00, ioaddr + RX_INTR); /* Disable RX intr. */
net_rx(dev);
+ outb(0x81, ioaddr + RX_INTR); /* Enable RX intr. */
+ lp->rx_started = 0;
}
if (status & 0x00ff) {
- if (status & 0x80) {
+ if (status & 0x02) {
+ /* More than 16 collisions occurred */
+ if (net_debug > 4)
+ printk("%s: 16 Collision occur during Txing.\n", dev->name);
+ /* Cancel sending a packet. */
+ outb(0x03, ioaddr + COL16CNTL);
+ lp->stats.collisions++;
+ }
+ if (status & 0x82) {
lp->stats.tx_packets++;
- if (lp->tx_queue) {
+ if (lp->tx_queue && lp->tx_queue_ready) {
outb(0x80 | lp->tx_queue, ioaddr + TX_START);
lp->tx_queue = 0;
lp->tx_queue_len = 0;
@@ -439,16 +475,9 @@ net_interrupt(int irq, void *dev_id, struct pt_regs *regs)
mark_bh(NET_BH); /* Inform upper layers. */
}
}
- if (status & 0x02 ) {
- if (net_debug > 4)
- printk("%s: 16 Collision occur during Txing.\n", dev->name);
- /* Retry to send the packet */
- outb(0x02, ioaddr + COL16CNTL);
- }
}
dev->interrupt = 0;
- outw(0x8182, ioaddr + TX_INTR);
return;
}
@@ -458,7 +487,7 @@ net_rx(struct device *dev)
{
struct net_local *lp = (struct net_local *)dev->priv;
int ioaddr = dev->base_addr;
- int boguscount = 10; /* 5 -> 10: by agy 19940922 */
+ int boguscount = 5;
while ((inb(ioaddr + RX_MODE) & 0x40) == 0) {
/* Clear PKT_RDY bit: by agy 19940922 */
@@ -619,6 +648,7 @@ static int irq = 0;
MODULE_PARM(io, "i");
MODULE_PARM(irq, "i");
+MODULE_PARM(net_debug, "i");
int init_module(void)
{
diff --git a/drivers/net/hamradio/Config.in b/drivers/net/hamradio/Config.in
index 2aaa087a1..023a4b1b6 100644
--- a/drivers/net/hamradio/Config.in
+++ b/drivers/net/hamradio/Config.in
@@ -13,8 +13,8 @@ fi
tristate 'BAYCOM ser12 fullduplex driver for AX.25' CONFIG_BAYCOM_SER_FDX
tristate 'BAYCOM ser12 halfduplex driver for AX.25' CONFIG_BAYCOM_SER_HDX
-tristate 'BAYCOM picpar and par96 driver for AX.25' CONFIG_BAYCOM_PAR
-tristate 'BAYCOM epp driver for AX.25' CONFIG_BAYCOM_EPP
+dep_tristate 'BAYCOM picpar and par96 driver for AX.25' CONFIG_BAYCOM_PAR $CONFIG_PARPORT
+dep_tristate 'BAYCOM epp driver for AX.25' CONFIG_BAYCOM_EPP $CONFIG_PARPORT
tristate 'Soundcard modem driver' CONFIG_SOUNDMODEM
if [ "$CONFIG_SOUNDMODEM" != "n" ]; then
diff --git a/drivers/net/hamradio/baycom_ser_fdx.c b/drivers/net/hamradio/baycom_ser_fdx.c
index cf6d0dfeb..6129b4b44 100644
--- a/drivers/net/hamradio/baycom_ser_fdx.c
+++ b/drivers/net/hamradio/baycom_ser_fdx.c
@@ -83,6 +83,7 @@
#include <linux/netdevice.h>
#include <linux/hdlcdrv.h>
#include <linux/baycom.h>
+#include <linux/version.h>
/* --------------------------------------------------------------------- */
diff --git a/drivers/net/hamradio/baycom_ser_hdx.c b/drivers/net/hamradio/baycom_ser_hdx.c
index f472c8b9e..088f9318e 100644
--- a/drivers/net/hamradio/baycom_ser_hdx.c
+++ b/drivers/net/hamradio/baycom_ser_hdx.c
@@ -72,6 +72,7 @@
#include <linux/netdevice.h>
#include <linux/hdlcdrv.h>
#include <linux/baycom.h>
+#include <linux/version.h>
/* --------------------------------------------------------------------- */
diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c
index 258c5c58c..b2358447d 100644
--- a/drivers/net/hamradio/hdlcdrv.c
+++ b/drivers/net/hamradio/hdlcdrv.c
@@ -41,6 +41,7 @@
/*****************************************************************************/
#include <linux/config.h>
+#include <linux/version.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/types.h>
@@ -58,10 +59,8 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/hdlcdrv.h>
-#if defined(CONFIG_AX25) || defined(CONFIG_AX25_MODULE)
/* prototypes for ax25_encapsulate and ax25_rebuild_header */
#include <net/ax25.h>
-#endif /* CONFIG_AX25 || CONFIG_AX25_MODULE */
/* make genksyms happy */
#include <linux/ip.h>
diff --git a/drivers/net/hamradio/scc.c b/drivers/net/hamradio/scc.c
index 736d6b26b..48ef86a9b 100644
--- a/drivers/net/hamradio/scc.c
+++ b/drivers/net/hamradio/scc.c
@@ -1,4 +1,4 @@
-#define RCS_ID "$Id: scc.c,v 1.73 1998/01/29 17:38:51 jreuter Exp jreuter $"
+#define RCS_ID "$Id: scc.c,v 1.75 1998/11/04 15:15:01 jreuter Exp jreuter $"
#define VERSION "3.0"
#define BANNER "Z8530 SCC driver version "VERSION".dl1bke (experimental) by DL1BKE\n"
@@ -60,22 +60,22 @@
Incomplete history of z8530drv:
-------------------------------
- 940913 - started to write the driver, rescued most of my own
- code (and Hans Alblas' memory buffer pool concept) from
- an earlier project "sccdrv" which was initiated by
- Guido ten Dolle. Not much of the old driver survived,
- though. The first version I put my hands on was sccdrv1.3
- from August 1993. The memory buffer pool concept
- appeared in an unauthorized sccdrv version (1.5) from
- August 1994.
+ 1994-09-13 started to write the driver, rescued most of my own
+ code (and Hans Alblas' memory buffer pool concept) from
+ an earlier project "sccdrv" which was initiated by
+ Guido ten Dolle. Not much of the old driver survived,
+ though. The first version I put my hands on was sccdrv1.3
+ from August 1993. The memory buffer pool concept
+ appeared in an unauthorized sccdrv version (1.5) from
+ August 1994.
- 950131 - changed copyright notice to GPL without limitations.
+ 1995-01-31 changed copyright notice to GPL without limitations.
.
. <SNIP>
.
- 961005 - New semester, new driver...
+ 1996-10-05 New semester, new driver...
* KISS TNC emulator removed (TTY driver)
* Source moved to drivers/net/
@@ -88,12 +88,22 @@
The move to version number 3.0 reflects theses changes.
You can use 'kissbridge' if you need a KISS TNC emulator.
- 961213 - Fixed for Linux networking changes. (G4KLX)
- 970108 - Fixed the remaining problems.
- 970402 - Hopefully fixed the problems with the new *_timer()
- routines, added calibration code.
- 971012 - Made SCC_DELAY a CONFIG option, added CONFIG_SCC_TRXECHO
- 980129 - Small fix to avoid lock-up on initialization
+ 1996-12-13 Fixed for Linux networking changes. (G4KLX)
+ 1997-01-08 Fixed the remaining problems.
+ 1997-04-02 Hopefully fixed the problems with the new *_timer()
+ routines, added calibration code.
+ 1997-10-12 Made SCC_DELAY a CONFIG option, added CONFIG_SCC_TRXECHO
+ 1998-01-29 Small fix to avoid lock-up on initialization
+ 1998-09-29 Fixed the "grouping" bugs, tx_inhibit works again,
+ using dev->tx_queue_len now instead of MAXQUEUE now.
+ 1998-10-21 Postponed the spinlock changes, would need a lot of
+ testing I currently don't have the time to. Softdcd doesn't
+ work.
+ 1998-11-04 Softdcd does not work correctly in DPLL mode, in fact it
+ never did. The DPLL locks on noise, the SYNC unit sees
+ flags that aren't... Restarting the DPLL does not help
+ either, it resynchronizes too slow and the first received
+ frame gets lost.
Thanks to all who contributed to this driver with ideas and bug
reports!
@@ -119,22 +129,22 @@
Joerg Reuter ampr-net: dl1bke@db0pra.ampr.org
AX-25 : DL1BKE @ DB0ACH.#NRW.DEU.EU
Internet: jreuter@poboxes.com
- www : http://www.rat.de/jr
+ www : http://poboxes.com/jreuter/
*/
/* ----------------------------------------------------------------------- */
#undef SCC_LDELAY 1 /* slow it even a bit more down */
-#undef DONT_CHECK /* don't look if the SCCs you specified are available */
+#undef SCC_DONT_CHECK /* don't look if the SCCs you specified are available */
-#define MAXSCC 4 /* number of max. supported chips */
-#define BUFSIZE 384 /* must not exceed 4096 */
-#define MAXQUEUE 8 /* number of buffers we queue ourself */
-#undef DISABLE_ALL_INTS /* use cli()/sti() in ISR instead of */
+#define SCC_MAXCHIPS 4 /* number of max. supported chips */
+#define SCC_BUFSIZE 384 /* must not exceed 4096 */
+#undef SCC_DISABLE_ALL_INTS /* use cli()/sti() in ISR instead of */
/* enable_irq()/disable_irq() */
#undef SCC_DEBUG
-#define DEFAULT_CLOCK 4915200 /* default pclock if nothing is specified */
+#define SCC_DEFAULT_CLOCK 4915200
+ /* default pclock if nothing is specified */
/* ----------------------------------------------------------------------- */
@@ -214,13 +224,13 @@ static unsigned char *SCC_DriverName = "scc";
static struct irqflags { unsigned char used : 1; } Ivec[16];
-static struct scc_channel SCC_Info[2 * MAXSCC]; /* information per channel */
+static struct scc_channel SCC_Info[2 * SCC_MAXCHIPS]; /* information per channel */
static struct scc_ctrl {
io_port chan_A;
io_port chan_B;
int irq;
-} SCC_ctrl[MAXSCC+1];
+} SCC_ctrl[SCC_MAXCHIPS+1];
static unsigned char Driver_Initialized = 0;
static int Nchips = 0;
@@ -236,7 +246,7 @@ MODULE_SUPPORTED_DEVICE("scc");
/* These provide interrupt save 2-step access to the Z8530 registers */
-extern __inline__ unsigned char InReg(io_port port, unsigned char reg)
+static inline unsigned char InReg(io_port port, unsigned char reg)
{
unsigned long flags;
unsigned char r;
@@ -256,7 +266,7 @@ extern __inline__ unsigned char InReg(io_port port, unsigned char reg)
return r;
}
-extern __inline__ void OutReg(io_port port, unsigned char reg, unsigned char val)
+static inline void OutReg(io_port port, unsigned char reg, unsigned char val)
{
unsigned long flags;
@@ -272,31 +282,31 @@ extern __inline__ void OutReg(io_port port, unsigned char reg, unsigned char val
restore_flags(flags);
}
-extern __inline__ void wr(struct scc_channel *scc, unsigned char reg,
+static inline void wr(struct scc_channel *scc, unsigned char reg,
unsigned char val)
{
OutReg(scc->ctrl, reg, (scc->wreg[reg] = val));
}
-extern __inline__ void or(struct scc_channel *scc, unsigned char reg, unsigned char val)
+static inline void or(struct scc_channel *scc, unsigned char reg, unsigned char val)
{
OutReg(scc->ctrl, reg, (scc->wreg[reg] |= val));
}
-extern __inline__ void cl(struct scc_channel *scc, unsigned char reg, unsigned char val)
+static inline void cl(struct scc_channel *scc, unsigned char reg, unsigned char val)
{
OutReg(scc->ctrl, reg, (scc->wreg[reg] &= ~val));
}
-#ifdef DISABLE_ALL_INTS
-extern __inline__ void scc_cli(int irq)
+#ifdef SCC_DISABLE_ALL_INTS
+static inline void scc_cli(int irq)
{ cli(); }
-extern __inline__ void scc_sti(int irq)
+static inline void scc_sti(int irq)
{ sti(); }
#else
-static __inline__ void scc_cli(int irq)
+static inline void scc_cli(int irq)
{ disable_irq(irq); }
-static __inline__ void scc_sti(int irq)
+static inline void scc_sti(int irq)
{ enable_irq(irq); }
#endif
@@ -305,17 +315,17 @@ static __inline__ void scc_sti(int irq)
/* ******************************************************************** */
-extern __inline__ void scc_lock_dev(struct scc_channel *scc)
+static inline void scc_lock_dev(struct scc_channel *scc)
{
scc->dev->tbusy = 1;
}
-extern __inline__ void scc_unlock_dev(struct scc_channel *scc)
+static inline void scc_unlock_dev(struct scc_channel *scc)
{
scc->dev->tbusy = 0;
}
-extern __inline__ void scc_discard_buffers(struct scc_channel *scc)
+static inline void scc_discard_buffers(struct scc_channel *scc)
{
unsigned long flags;
@@ -343,7 +353,7 @@ extern __inline__ void scc_discard_buffers(struct scc_channel *scc)
/* ----> subroutines for the interrupt handlers <---- */
-extern __inline__ void scc_notify(struct scc_channel *scc, int event)
+static inline void scc_notify(struct scc_channel *scc, int event)
{
struct sk_buff *skb;
char *bp;
@@ -362,7 +372,7 @@ extern __inline__ void scc_notify(struct scc_channel *scc, int event)
scc->stat.nospace++;
}
-extern __inline__ void flush_rx_FIFO(struct scc_channel *scc)
+static inline void flush_rx_FIFO(struct scc_channel *scc)
{
int k;
@@ -377,12 +387,18 @@ extern __inline__ void flush_rx_FIFO(struct scc_channel *scc)
}
}
+static void start_hunt(struct scc_channel *scc)
+{
+ if ((scc->modem.clocksrc != CLK_EXTERNAL))
+ OutReg(scc->ctrl,R14,SEARCH|scc->wreg[R14]); /* DPLL: enter search mode */
+ or(scc,R3,ENT_HM|RxENABLE); /* enable the receiver, hunt mode */
+}
/* ----> four different interrupt handlers for Tx, Rx, changing of */
/* DCD/CTS and Rx/Tx errors */
/* Transmitter interrupt handler */
-extern __inline__ void scc_txint(struct scc_channel *scc)
+static inline void scc_txint(struct scc_channel *scc)
{
struct sk_buff *skb;
@@ -446,7 +462,7 @@ extern __inline__ void scc_txint(struct scc_channel *scc)
/* External/Status interrupt handler */
-extern __inline__ void scc_exint(struct scc_channel *scc)
+static inline void scc_exint(struct scc_channel *scc)
{
unsigned char status,changes,chg_and_stat;
@@ -461,35 +477,39 @@ extern __inline__ void scc_exint(struct scc_channel *scc)
if (chg_and_stat & BRK_ABRT) /* Received an ABORT */
flush_rx_FIFO(scc);
+ /* HUNT: software DCD; on = waiting for SYNC, off = receiving frame */
+
+ if ((changes & SYNC_HUNT) && scc->kiss.softdcd)
+ {
+ if (status & SYNC_HUNT)
+ {
+ scc->dcd = 0;
+ flush_rx_FIFO(scc);
+ if ((scc->modem.clocksrc != CLK_EXTERNAL))
+ OutReg(scc->ctrl,R14,SEARCH|scc->wreg[R14]); /* DPLL: enter search mode */
+ } else {
+ scc->dcd = 1;
+ }
+
+ scc_notify(scc, scc->dcd? HWEV_DCD_OFF:HWEV_DCD_ON);
+ }
/* DCD: on = start to receive packet, off = ABORT condition */
/* (a successfully received packet generates a special condition int) */
- if(changes & DCD) /* DCD input changed state */
+ if((changes & DCD) && !scc->kiss.softdcd) /* DCD input changed state */
{
if(status & DCD) /* DCD is now ON */
{
- if (scc->modem.clocksrc != CLK_EXTERNAL)
- OutReg(scc->ctrl,R14,SEARCH|scc->wreg[R14]); /* DPLL: enter search mode */
-
- or(scc,R3,ENT_HM|RxENABLE); /* enable the receiver, hunt mode */
+ start_hunt(scc);
+ scc->dcd = 1;
} else { /* DCD is now OFF */
cl(scc,R3,ENT_HM|RxENABLE); /* disable the receiver */
flush_rx_FIFO(scc);
+ scc->dcd = 0;
}
- if (!scc->kiss.softdcd)
- scc_notify(scc, (status & DCD)? HWEV_DCD_ON:HWEV_DCD_OFF);
- }
-
- /* HUNT: software DCD; on = waiting for SYNC, off = receiving frame */
-
- if (changes & SYNC_HUNT)
- {
- if (scc->kiss.softdcd)
- scc_notify(scc, (status & SYNC_HUNT)? HWEV_DCD_OFF:HWEV_DCD_ON);
- else
- cl(scc,R15,SYNCIE); /* oops, we were too lazy to disable this? */
+ scc_notify(scc, scc->dcd? HWEV_DCD_ON:HWEV_DCD_OFF);
}
#ifdef notdef
@@ -527,7 +547,7 @@ extern __inline__ void scc_exint(struct scc_channel *scc)
/* Receiver interrupt handler */
-extern __inline__ void scc_rxint(struct scc_channel *scc)
+static inline void scc_rxint(struct scc_channel *scc)
{
struct sk_buff *skb;
@@ -575,7 +595,7 @@ extern __inline__ void scc_rxint(struct scc_channel *scc)
/* Receive Special Condition interrupt handler */
-extern __inline__ void scc_spint(struct scc_channel *scc)
+static inline void scc_spint(struct scc_channel *scc)
{
unsigned char status;
struct sk_buff *skb;
@@ -646,8 +666,6 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
struct scc_ctrl *ctrl;
int k;
- scc_cli(irq);
-
if (Vector_Latch)
{
for(k=0; k < SCC_IRQTIMEOUT; k++)
@@ -665,7 +683,6 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
OutReg(scc->ctrl,R0,RES_H_IUS); /* Reset Highest IUS */
}
- scc_sti(irq);
if (k == SCC_IRQTIMEOUT)
printk(KERN_WARNING "z8530drv: endless loop in scc_isr()?\n");
@@ -718,8 +735,6 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
} else
ctrl++;
}
-
- scc_sti(irq);
}
@@ -731,7 +746,7 @@ static void scc_isr(int irq, void *dev_id, struct pt_regs *regs)
/* ----> set SCC channel speed <---- */
-extern __inline__ void set_brg(struct scc_channel *scc, unsigned int tc)
+static inline void set_brg(struct scc_channel *scc, unsigned int tc)
{
cl(scc,R14,BRENABL); /* disable baudrate generator */
wr(scc,R12,tc & 255); /* brg rate LOW */
@@ -739,7 +754,7 @@ extern __inline__ void set_brg(struct scc_channel *scc, unsigned int tc)
or(scc,R14,BRENABL); /* enable baudrate generator */
}
-extern __inline__ void set_speed(struct scc_channel *scc)
+static inline void set_speed(struct scc_channel *scc)
{
disable_irq(scc->irq);
@@ -752,7 +767,7 @@ extern __inline__ void set_speed(struct scc_channel *scc)
/* ----> initialize a SCC channel <---- */
-extern __inline__ void init_brg(struct scc_channel *scc)
+static inline void init_brg(struct scc_channel *scc)
{
wr(scc, R14, BRSRC); /* BRG source = PCLK */
OutReg(scc->ctrl, R14, SSBR|scc->wreg[R14]); /* DPLL source = BRG */
@@ -875,19 +890,15 @@ static void init_channel(struct scc_channel *scc)
wr(scc,R7,AUTOEOM);
}
- if((InReg(scc->ctrl,R0)) & DCD) /* DCD is now ON */
+ if(scc->kiss.softdcd || (InReg(scc->ctrl,R0) & DCD))
+ /* DCD is now ON */
{
- if (scc->modem.clocksrc != CLK_EXTERNAL)
- or(scc,R14, SEARCH);
-
- or(scc,R3,ENT_HM|RxENABLE); /* enable the receiver, hunt mode */
+ start_hunt(scc);
}
/* enable ABORT, DCD & SYNC/HUNT interrupts */
- wr(scc,R15, BRKIE|TxUIE|DCDIE);
- if (scc->kiss.softdcd)
- or(scc,R15, SYNCIE);
+ wr(scc,R15, BRKIE|TxUIE|(scc->kiss.softdcd? SYNCIE:DCDIE));
Outb(scc->ctrl,RES_EXT_INT); /* reset ext/status interrupts */
Outb(scc->ctrl,RES_EXT_INT); /* must be done twice */
@@ -940,14 +951,21 @@ static void scc_key_trx(struct scc_channel *scc, char tx)
{
#ifdef CONFIG_SCC_TRXECHO
cl(scc, R3, RxENABLE|ENT_HM); /* switch off receiver */
- cl(scc, R15, DCDIE); /* No DCD changes, please */
+ cl(scc, R15, DCDIE|SYNCIE); /* No DCD changes, please */
#endif
set_brg(scc, time_const); /* reprogram baudrate generator */
/* DPLL -> Rx clk, BRG -> Tx CLK, TRxC mode output, TRxC = BRG */
wr(scc, R11, RCDPLL|TCBR|TRxCOI|TRxCBR);
- or(scc,R5,RTS|TxENAB); /* set the RTS line and enable TX */
+ /* By popular demand: tx_inhibit */
+ if (scc->kiss.tx_inhibit)
+ {
+ or(scc,R5, TxENAB);
+ scc->wreg[R5] |= RTS;
+ } else {
+ or(scc,R5,RTS|TxENAB); /* set the RTS line and enable TX */
+ }
} else {
cl(scc,R5,RTS|TxENAB);
@@ -955,10 +973,14 @@ static void scc_key_trx(struct scc_channel *scc, char tx)
/* DPLL -> Rx clk, DPLL -> Tx CLK, TRxC mode output, TRxC = DPLL */
wr(scc, R11, RCDPLL|TCDPLL|TRxCOI|TRxCDP);
-#ifdef CONFIG_SCC_TRXECHO
- or(scc,R3,RxENABLE|ENT_HM);
- or(scc,R15, DCDIE);
+
+#ifndef CONFIG_SCC_TRXECHO
+ if (scc->kiss.softdcd)
#endif
+ {
+ or(scc,R15, scc->kiss.softdcd? SYNCIE:DCDIE);
+ start_hunt(scc);
+ }
}
} else {
if (tx)
@@ -967,22 +989,30 @@ static void scc_key_trx(struct scc_channel *scc, char tx)
if (scc->kiss.fulldup == KISS_DUPLEX_HALF)
{
cl(scc, R3, RxENABLE);
- cl(scc, R15, DCDIE);
+ cl(scc, R15, DCDIE|SYNCIE);
}
#endif
-
- or(scc,R5,RTS|TxENAB); /* enable tx */
+ if (scc->kiss.tx_inhibit)
+ {
+ or(scc,R5, TxENAB);
+ scc->wreg[R5] |= RTS;
+ } else {
+ or(scc,R5,RTS|TxENAB); /* enable tx */
+ }
} else {
cl(scc,R5,RTS|TxENAB); /* disable tx */
-#ifdef CONFIG_SCC_TRXECHO
- if (scc->kiss.fulldup == KISS_DUPLEX_HALF)
+ if ((scc->kiss.fulldup == KISS_DUPLEX_HALF) &&
+#ifndef CONFIG_SCC_TRXECHO
+ scc->kiss.softdcd)
+#else
+ 1)
+#endif
{
- or(scc, R3, RxENABLE|ENT_HM);
- or(scc, R15, DCDIE);
+ or(scc, R15, scc->kiss.softdcd? SYNCIE:DCDIE);
+ start_hunt(scc);
}
-#endif
}
}
@@ -1088,7 +1118,7 @@ static void scc_tx_done(struct scc_channel *scc)
static unsigned char Rand = 17;
-extern __inline__ int is_grouped(struct scc_channel *scc)
+static inline int is_grouped(struct scc_channel *scc)
{
int k;
struct scc_channel *scc2;
@@ -1109,7 +1139,7 @@ extern __inline__ int is_grouped(struct scc_channel *scc)
if ( (grp1 & TXGROUP) && (scc2->wreg[R5] & RTS) )
return 1;
- if ( (grp1 & RXGROUP) && (scc2->status & DCD) )
+ if ( (grp1 & RXGROUP) && scc2->dcd )
return 1;
}
}
@@ -1144,7 +1174,7 @@ static void t_dwait(unsigned long channel)
{
Rand = Rand * 17 + 31;
- if ( (scc->kiss.softdcd? !(scc->status & SYNC_HUNT):(scc->status & DCD)) || (scc->kiss.persist) < Rand || (scc->kiss.group && is_grouped(scc)) )
+ if (scc->dcd || (scc->kiss.persist) < Rand || (scc->kiss.group && is_grouped(scc)) )
{
scc_start_defer(scc);
scc_start_tx_timer(scc, t_dwait, scc->kiss.slottime);
@@ -1317,8 +1347,6 @@ static void scc_init_timer(struct scc_channel *scc)
static unsigned int scc_set_param(struct scc_channel *scc, unsigned int cmd, unsigned int arg)
{
- int dcd;
-
switch (cmd)
{
case PARAM_TXDELAY: scc->kiss.txdelay=arg; break;
@@ -1338,9 +1366,14 @@ static unsigned int scc_set_param(struct scc_channel *scc, unsigned int cmd, uns
case PARAM_SOFTDCD:
scc->kiss.softdcd=arg;
if (arg)
+ {
or(scc, R15, SYNCIE);
- else
+ cl(scc, R15, DCDIE);
+ start_hunt(scc);
+ } else {
+ or(scc, R15, DCDIE);
cl(scc, R15, SYNCIE);
+ }
break;
case PARAM_SPEED:
@@ -1369,8 +1402,7 @@ static unsigned int scc_set_param(struct scc_channel *scc, unsigned int cmd, uns
break;
case PARAM_HWEVENT:
- dcd = (scc->kiss.softdcd? !(scc->status & SYNC_HUNT):(scc->status & DCD));
- scc_notify(scc, dcd? HWEV_DCD_ON:HWEV_DCD_OFF);
+ scc_notify(scc, scc->dcd? HWEV_DCD_ON:HWEV_DCD_OFF);
break;
default: return -EINVAL;
@@ -1449,9 +1481,10 @@ scc_start_calibrate(struct scc_channel *scc, int duration, unsigned char pattern
scc->tx_wdog.data = (unsigned long) scc;
scc->tx_wdog.function = scc_stop_calibrate;
- scc->tx_wdog.expires = jiffies + HZ*scc->kiss.maxkeyup;
+ scc->tx_wdog.expires = jiffies + HZ*duration;
add_timer(&scc->tx_wdog);
-
+
+ /* This doesn't seem to work. Why not? */
wr(scc, R6, 0);
wr(scc, R7, pattern);
@@ -1680,6 +1713,7 @@ static void scc_net_rx(struct scc_channel *scc, struct sk_buff *skb)
skb->dev = scc->dev;
skb->protocol = htons(ETH_P_AX25);
skb->mac.raw = skb->data;
+ skb->pkt_type = PACKET_HOST;
netif_rx(skb);
return;
@@ -1722,7 +1756,7 @@ static int scc_net_tx(struct sk_buff *skb, struct device *dev)
save_flags(flags);
cli();
- if (skb_queue_len(&scc->tx_queue) >= MAXQUEUE-1)
+ if (skb_queue_len(&scc->tx_queue) > scc->dev->tx_queue_len)
{
struct sk_buff *skb_del;
skb_del = __skb_dequeue(&scc->tx_queue);
@@ -1791,7 +1825,7 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
if (!suser()) return -EPERM;
if (!arg) return -EFAULT;
- if (Nchips >= MAXSCC)
+ if (Nchips >= SCC_MAXCHIPS)
return -EINVAL;
if (copy_from_user(&hwcfg, arg, sizeof(hwcfg)))
@@ -1811,14 +1845,15 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
Vector_Latch = hwcfg.vector_latch;
if (hwcfg.clock == 0)
- hwcfg.clock = DEFAULT_CLOCK;
+ hwcfg.clock = SCC_DEFAULT_CLOCK;
-#ifndef DONT_CHECK
+#ifndef SCC_DONT_CHECK
disable_irq(hwcfg.irq);
check_region(scc->ctrl, 1);
Outb(hwcfg.ctrl_a, 0);
- udelay(5);
+ OutReg(hwcfg.ctrl_a, R9, FHWRES);
+ udelay(100);
OutReg(hwcfg.ctrl_a,R13,0x55); /* is this chip really there? */
udelay(5);
@@ -1853,7 +1888,7 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
SCC_Info[2*Nchips+chan].option = hwcfg.option;
SCC_Info[2*Nchips+chan].enhanced = hwcfg.escc;
-#ifdef DONT_CHECK
+#ifdef SCC_DONT_CHECK
printk(KERN_INFO "%s: data port = 0x%3.3x control port = 0x%3.3x\n",
device_name,
SCC_Info[2*Nchips+chan].data,
@@ -1903,7 +1938,7 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
if (!suser()) return -EPERM;
if (!arg) return -EINVAL;
- scc->stat.bufsize = BUFSIZE;
+ scc->stat.bufsize = SCC_BUFSIZE;
if (copy_from_user(&scc->modem, arg, sizeof(struct scc_modem)))
return -EINVAL;
@@ -1980,7 +2015,7 @@ static int scc_net_ioctl(struct device *dev, struct ifreq *ifr, int cmd)
case SIOCSCCCAL:
if (!suser()) return -EPERM;
- if (!arg || copy_from_user(&cal, arg, sizeof(cal)))
+ if (!arg || copy_from_user(&cal, arg, sizeof(cal)) || cal.time == 0)
return -EINVAL;
scc_start_calibrate(scc, cal.time, cal.pattern);
@@ -2169,7 +2204,7 @@ __initfunc(int scc_init (void))
/* pre-init channel information */
- for (chip = 0; chip < MAXSCC; chip++)
+ for (chip = 0; chip < SCC_MAXCHIPS; chip++)
{
memset((char *) &SCC_Info[2*chip ], 0, sizeof(struct scc_channel));
memset((char *) &SCC_Info[2*chip+1], 0, sizeof(struct scc_channel));
diff --git a/drivers/net/hamradio/soundmodem/sm.c b/drivers/net/hamradio/soundmodem/sm.c
index d1760af4b..15b5239fd 100644
--- a/drivers/net/hamradio/soundmodem/sm.c
+++ b/drivers/net/hamradio/soundmodem/sm.c
@@ -61,6 +61,7 @@
#include <asm/bitops.h>
#include <linux/delay.h>
#include <linux/errno.h>
+#include <linux/version.h>
#include "sm.h"
/* --------------------------------------------------------------------- */
diff --git a/drivers/net/hp-plus.c b/drivers/net/hp-plus.c
index 55506e0ef..bcb76242a 100644
--- a/drivers/net/hp-plus.c
+++ b/drivers/net/hp-plus.c
@@ -474,7 +474,6 @@ cleanup_module(void)
void *priv = dev->priv;
/* NB: hpp_close() handles free_irq */
release_region(ioaddr, HP_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/hp.c b/drivers/net/hp.c
index a7dcba56b..8963b5562 100644
--- a/drivers/net/hp.c
+++ b/drivers/net/hp.c
@@ -445,7 +445,6 @@ cleanup_module(void)
void *priv = dev->priv;
free_irq(dev->irq, dev);
release_region(ioaddr, HP_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/hp100.c b/drivers/net/hp100.c
index 4b415d6cc..5ac9da0a3 100644
--- a/drivers/net/hp100.c
+++ b/drivers/net/hp100.c
@@ -1365,7 +1365,7 @@ static void hp100_init_pdls( struct device *dev )
/* They return how much memory the fragments need. */
static int hp100_init_rxpdl( struct device *dev, register hp100_ring_t *ringptr, register u32 *pdlptr )
{
- /* pdlptr is starting adress for this pdl */
+ /* pdlptr is starting address for this pdl */
if( 0!=( ((unsigned)pdlptr) & 0xf) )
printk("hp100: %s: Init rxpdl: Unaligned pdlptr 0x%x.\n",dev->name,(unsigned)pdlptr);
@@ -2796,9 +2796,9 @@ static int hp100_down_vg_link( struct device *dev )
time=jiffies+(HZ/4);
do{
if ( hp100_inb( VG_LAN_CFG_1 ) & HP100_LINK_CABLE_ST ) break;
- } while (time>jiffies);
+ } while (time_after(time, jiffies));
- if ( jiffies >= time ) /* no signal->no logout */
+ if ( time_after_eq(jiffies, time) ) /* no signal->no logout */
return 0;
/* Drop the VG Link by clearing the link up cmd and load addr.*/
@@ -2810,10 +2810,10 @@ static int hp100_down_vg_link( struct device *dev )
time=jiffies+(HZ/2);
do{
if ( !(hp100_inb( VG_LAN_CFG_1) & HP100_LINK_UP_ST) ) break;
- } while(time>jiffies);
+ } while(time_after(time, jiffies));
#ifdef HP100_DEBUG
- if (jiffies>=time)
+ if (time_after_eq(jiffies, time))
printk("hp100: %s: down_vg_link: Link does not go down?\n", dev->name);
#endif
@@ -2848,7 +2848,7 @@ static int hp100_down_vg_link( struct device *dev )
time=jiffies+(HZ*5);
do{
if( !(hp100_inb(MAC_CFG_4) & HP100_MAC_SEL_ST) ) break;
- } while(time>jiffies);
+ } while(time_after(time, jiffies));
hp100_orb( HP100_AUTO_MODE, MAC_CFG_3); /* Autosel back on */
hp100_outl(savelan, 10_LAN_CFG_1);
@@ -2857,9 +2857,9 @@ static int hp100_down_vg_link( struct device *dev )
time=jiffies+(3*HZ); /* Timeout 3s */
do {
if ( (hp100_inb( VG_LAN_CFG_1 )&HP100_LINK_CABLE_ST) == 0) break;
- } while (time>jiffies);
+ } while (time_after(time, jiffies));
- if(time<=jiffies)
+ if(time_before_eq(time, jiffies))
{
#ifdef HP100_DEBUG
printk( "hp100: %s: down_vg_link: timeout\n", dev->name );
@@ -2868,7 +2868,7 @@ static int hp100_down_vg_link( struct device *dev )
}
time=jiffies+(2*HZ); /* This seems to take a while.... */
- do {} while (time>jiffies);
+ do {} while (time_after(time, jiffies));
return 0;
}
@@ -2918,7 +2918,7 @@ static int hp100_login_to_vg_hub( struct device *dev, u_short force_relogin )
time = jiffies + (HZ/10);
do {
if (~(hp100_inb( VG_LAN_CFG_1 )& HP100_LINK_UP_ST) ) break;
- } while (time>jiffies);
+ } while (time_after(time, jiffies));
/* Start an addressed training and optionally request promiscuous port */
if ( (dev->flags) & IFF_PROMISC )
@@ -2955,9 +2955,9 @@ static int hp100_login_to_vg_hub( struct device *dev, u_short force_relogin )
time = jiffies + ( 1*HZ ); /* 1 sec timeout for cable st */
do {
if ( hp100_inb( VG_LAN_CFG_1 ) & HP100_LINK_CABLE_ST ) break;
- } while ( jiffies < time );
+ } while ( time_before(jiffies, time) );
- if ( jiffies >= time )
+ if ( time_after_eq(jiffies, time) )
{
#ifdef HP100_DEBUG_TRAINING
printk( "hp100: %s: Link cable status not ok? Training aborted.\n", dev->name );
@@ -2979,11 +2979,11 @@ static int hp100_login_to_vg_hub( struct device *dev, u_short force_relogin )
#endif
break;
}
- } while ( time > jiffies );
+ } while ( time_after(time, jiffies) );
}
/* If LINK_UP_ST is set, then we are logged into the hub. */
- if ( (jiffies<=time) && (val & HP100_LINK_UP_ST) )
+ if ( time_before_eq(jiffies, time) && (val & HP100_LINK_UP_ST) )
{
#ifdef HP100_DEBUG_TRAINING
printk( "hp100: %s: Successfully logged into the HUB.\n", dev->name);
diff --git a/drivers/net/ibmtr.c b/drivers/net/ibmtr.c
index f781abbf3..990610648 100644
--- a/drivers/net/ibmtr.c
+++ b/drivers/net/ibmtr.c
@@ -66,8 +66,17 @@
* + lifted 2000 byte mtu limit. now depends on shared-RAM size.
* May 25 1998)
* + can't allocate 2k recv buff at 8k shared-RAM. (20 October 1998)
+ *
+ * Changes by Joel Sloan (jjs@c-me.com) :
+ * + disable verbose debug messages by default - to enable verbose
+ * debugging, edit the IBMTR_DEBUG_MESSAGES define below
*/
+/* change the define of IBMTR_DEBUG_MESSAGES to a nonzero value
+in the event that chatty debug messages are desired - jjs 12/30/98 */
+
+#define IBMTR_DEBUG_MESSAGES 0
+
#ifdef PCMCIA
#define MODULE
#endif
@@ -95,7 +104,8 @@
/* version and credits */
static char *version =
"ibmtr.c: v1.3.57 8/ 7/94 Peter De Schrijver and Mark Swanson\n"
-" v2.1.125 10/20/98 Paul Norton <pnorton@ieee.org>\n";
+" v2.1.125 10/20/98 Paul Norton <pnorton@ieee.org>\n"
+" v2.2.0 12/30/98 Joel Sloan <jjs@c-me.com>\n";
static char pcchannelid[] = {
0x05, 0x00, 0x04, 0x09,
@@ -791,10 +801,10 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
struct tok_info *ti;
struct device *dev;
+ dev = dev_id;
#if TR_VERBOSE
DPRINTK("Int from tok_driver, dev : %p\n",dev);
#endif
- dev = dev_id;
ti = (struct tok_info *) dev->priv;
/* Disable interrupts till processing is finished */
@@ -999,6 +1009,7 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
DPRINTK("error on dir_read_log: %02X\n",
(int)readb(ti->srb+offsetof(struct srb_read_log, ret_code)));
else
+ if (IBMTR_DEBUG_MESSAGES) {
DPRINTK(
"Line errors %02X, Internal errors %02X, Burst errors %02X\n"
"A/C errors %02X, Abort delimiters %02X, Lost frames %02X\n"
@@ -1023,6 +1034,7 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
frequency_errors)),
(int)readb(ti->srb+offsetof(struct srb_read_log,
token_errors)));
+ }
dev->tbusy=0;
break;
@@ -1230,7 +1242,7 @@ static int tok_init_card(struct device *dev)
{
struct tok_info *ti;
short PIOaddr;
- int i;
+ unsigned long i;
PIOaddr = dev->base_addr;
ti=(struct tok_info *) dev->priv;
@@ -1252,7 +1264,7 @@ static int tok_init_card(struct device *dev)
#endif
outb(0, PIOaddr+ADAPTRESET);
- for (i=jiffies+TR_RESET_INTERVAL; jiffies<=i;); /* wait 50ms */
+ for (i=jiffies+TR_RESET_INTERVAL; time_before_eq(jiffies, i);); /* wait 50ms */
outb(0,PIOaddr+ADAPTRESETREL);
#if !TR_NEWFORMAT
diff --git a/drivers/net/irda/.cvsignore b/drivers/net/irda/.cvsignore
new file mode 100644
index 000000000..857dd22e9
--- /dev/null
+++ b/drivers/net/irda/.cvsignore
@@ -0,0 +1,2 @@
+.depend
+.*.flags
diff --git a/drivers/net/irda/Config.in b/drivers/net/irda/Config.in
new file mode 100644
index 000000000..c40b6f5c8
--- /dev/null
+++ b/drivers/net/irda/Config.in
@@ -0,0 +1,17 @@
+mainmenu_option next_comment
+comment 'Infrared-port device drivers'
+
+dep_tristate 'IrTTY (uses serial driver)' CONFIG_IRTTY_SIR $CONFIG_IRDA
+if [ "$CONFIG_IRTTY_SIR" != "n" ]; then
+ comment ' Dongle support'
+ bool ' Serial dongle support' CONFIG_DONGLE
+ if [ "$CONFIG_DONGLE" != "n" ]; then
+ dep_tristate ' ESI JetEye PC dongle' CONFIG_ESI_DONGLE $CONFIG_IRTTY_SIR
+ dep_tristate ' ACTiSYS IR-220L and IR220L+ dongle' CONFIG_ACTISYS_DONGLE $CONFIG_IRTTY_SIR
+ dep_tristate ' Tekram IrMate 210B dongle' CONFIG_TEKRAM_DONGLE $CONFIG_IRTTY_SIR
+ fi
+fi
+dep_tristate ' NSC PC87108' CONFIG_NSC_FIR $CONFIG_IRDA
+dep_tristate ' Winbond W83977AF (IR)' CONFIG_WINBOND_FIR $CONFIG_IRDA
+dep_tristate ' Sharp UIRCC' CONFIG_SHARP_FIR $CONFIG_IRDA
+endmenu
diff --git a/drivers/net/irda/Makefile b/drivers/net/irda/Makefile
new file mode 100644
index 000000000..05880d5e1
--- /dev/null
+++ b/drivers/net/irda/Makefile
@@ -0,0 +1,80 @@
+# File: drivers/irda/Makefile
+#
+# Makefile for the Linux IrDA infrared port device drivers.
+#
+
+SUB_DIRS :=
+MOD_SUB_DIRS := $(SUB_DIRS)
+ALL_SUB_DIRS := $(SUB_DIRS)
+
+L_TARGET := irda_drivers.a
+L_OBJS :=
+M_OBJS :=
+MOD_LIST_NAME := IRDA_MODULES
+
+ifeq ($(CONFIG_IRTTY_SIR),y)
+L_OBJS += irtty.o
+else
+ ifeq ($(CONFIG_IRTTY_SIR),m)
+ M_OBJS += irtty.o
+ endif
+endif
+
+ifeq ($(CONFIG_NSC_FIR),y)
+L_OBJS += pc87108.o
+else
+ ifeq ($(CONFIG_NSC_FIR),m)
+ M_OBJS += pc87108.o
+ endif
+endif
+
+ifeq ($(CONFIG_WINBOND_FIR),y)
+L_OBJS += w83977af_ir.o
+else
+ ifeq ($(CONFIG_WINBOND_FIR),m)
+ M_OBJS += w83977af_ir.o
+ endif
+endif
+
+ifeq ($(CONFIG_SHARP_FIR),y)
+L_OBJS += uircc.o irport.o
+else
+ ifeq ($(CONFIG_SHARP_FIR),m)
+ M_OBJS += uircc.o irport.o
+ endif
+endif
+
+ifeq ($(CONFIG_ESI_DONGLE),y)
+L_OBJS += esi.o
+else
+ ifeq ($(CONFIG_ESI_DONGLE),m)
+ M_OBJS += esi.o
+ endif
+endif
+
+ifeq ($(CONFIG_TEKRAM_DONGLE),y)
+L_OBJS += tekram.o
+else
+ ifeq ($(CONFIG_TEKRAM_DONGLE),m)
+ M_OBJS += tekram.o
+ endif
+endif
+
+ifeq ($(CONFIG_ACTISYS_DONGLE),y)
+L_OBJS += actisys.o
+else
+ ifeq ($(CONFIG_ACTISYS_DONGLE),m)
+ M_OBJS += actisys.o
+ endif
+endif
+
+include $(TOPDIR)/Rules.make
+
+clean:
+ rm -f core *.o *.a *.s
+
+
+
+
+
+
diff --git a/drivers/net/irda/actisys.c b/drivers/net/irda/actisys.c
new file mode 100644
index 000000000..97fb5fa27
--- /dev/null
+++ b/drivers/net/irda/actisys.c
@@ -0,0 +1,314 @@
+/*********************************************************************
+ *
+ * Filename: actisys.c
+ * Version: 0.4
+ * Description: Implementation for the ACTiSYS IR-220L and IR-220L+
+ * dongles
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Wed Oct 21 20:02:35 1998
+ * Modified at: Mon Jan 18 11:30:25 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1998 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/tty.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+
+#include <asm/ioctls.h>
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irda_device.h>
+#include <net/irda/irtty.h>
+#include <net/irda/dongle.h>
+
+static void actisys_reset( struct irda_device *dev, int unused);
+static void actisys_open( struct irda_device *idev, int type);
+static void actisys_close( struct irda_device *dev);
+static void actisys_change_speed( struct irda_device *dev, int baudrate);
+static void actisys_reset( struct irda_device *dev, int unused);
+static void actisys_init_qos( struct irda_device *idev, struct qos_info *qos);
+
+/* These are the baudrates supported */
+static int baud_rates[] = { 9600, 19200, 57600, 115200, 38400};
+
+static struct dongle dongle = {
+ ACTISYS_DONGLE,
+ actisys_open,
+ actisys_close,
+ actisys_reset,
+ actisys_change_speed,
+ actisys_init_qos,
+};
+
+__initfunc(void actisys_init(void))
+{
+ irtty_register_dongle(&dongle);
+}
+
+void actisys_cleanup(void)
+{
+ irtty_unregister_dongle(&dongle);
+}
+
+static void actisys_open( struct irda_device *idev, int type)
+{
+ strcat( idev->name, " <-> actisys");
+
+ idev->io.dongle_id = type;
+
+ MOD_INC_USE_COUNT;
+}
+
+static void actisys_close( struct irda_device *dev)
+{
+ MOD_DEC_USE_COUNT;
+}
+
+/*
+ * Function actisys_change_speed (tty, baud)
+ *
+ * Change speed of the ACTiSYS IR-220L and IR-220L+ type IrDA dongles.
+ * To cycle through the available baud rates, pulse RTS low for a few ms.
+ * To be compatible with the new IR-220L+, we have to reset the dongle
+ * first since its not possible cycle around anymore and still be
+ * compatible with both dongles :-(
+ */
+static void actisys_change_speed( struct irda_device *idev, int baudrate)
+{
+ struct irtty_cb *self;
+ struct tty_struct *tty;
+ int arg;
+ struct termios old_termios;
+ int cflag;
+ int current_baudrate;
+ int index = 0;
+ mm_segment_t fs;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ current_baudrate = idev->qos.baud_rate.value;
+
+ /* Find the correct baudrate index for the currently used baudrate */
+ while ( current_baudrate != baud_rates[index])
+ index++;
+
+ DEBUG( 0, __FUNCTION__ "(), index=%d\n", index);
+
+ if ( !self->tty)
+ return;
+
+ tty = self->tty;
+
+ /* Cycle through avaiable baudrates until we reach the correct one */
+ while ( current_baudrate != baudrate) {
+ DEBUG( 0, __FUNCTION__ "(), current baudrate = %d\n",
+ baud_rates[index]);
+ DEBUG( 0, __FUNCTION__ "(), Clearing RTS\n");
+
+ /* Set DTR, clear RTS */
+ arg = TIOCM_DTR|TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg)) {
+ DEBUG( 0, __FUNCTION__
+ "Error clearing RTS!\n");
+ }
+ set_fs(fs);
+
+ /* Wait at a few ms */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(2);
+
+ /* Set DTR, Set RTS */
+ arg = TIOCM_DTR | TIOCM_RTS |TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg)) {
+ DEBUG( 0, __FUNCTION__ "Error setting RTS!\n");
+ }
+ set_fs(fs);
+
+ /* Wait at a few ms again */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout( 2);
+
+ /* Go to next baudrate */
+ if ( idev->io.dongle_id == ACTISYS_DONGLE)
+ index = (index+1) % 4; /* IR-220L */
+ else
+ index = (index+1) % 5; /* IR-220L+ */
+
+ current_baudrate = baud_rates[index];
+ }
+ DEBUG( 0, __FUNCTION__ "(), current baudrate = %d\n",
+ baud_rates[index]);
+
+ /* Now change the speed of the serial port */
+ old_termios = *(tty->termios);
+ cflag = tty->termios->c_cflag;
+
+ cflag &= ~CBAUD;
+
+ switch ( baudrate) {
+ case 9600:
+ default:
+ cflag |= B9600;
+ break;
+ case 19200:
+ cflag |= B19200;
+ break;
+ case 38400:
+ cflag |= B38400;
+ break;
+ case 57600:
+ cflag |= B57600;
+ break;
+ case 115200:
+ cflag |= B115200;
+ break;
+ }
+
+ tty->termios->c_cflag = cflag;
+
+ DEBUG( 0, __FUNCTION__ "(), Setting the speed of the serial port\n");
+ tty->driver.set_termios( tty, &old_termios);
+}
+
+/*
+ * Function actisys_reset (dev)
+ *
+ * Reset the Actisys type dongle. Warning, this function must only be
+ * called with a process context!
+ *
+ * 1. Clear DTR for a few ms.
+ *
+ */
+static void actisys_reset( struct irda_device *idev, int unused)
+{
+ struct irtty_cb *self;
+ struct tty_struct *tty;
+ int arg = 0;
+ mm_segment_t fs;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ tty = self->tty;
+ if ( !tty)
+ return;
+
+ DEBUG( 0, __FUNCTION__ "(), Clearing DTR\n");
+ arg = TIOCM_RTS | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg))
+ {
+ DEBUG( 0, __FUNCTION__"(), ioctl error!\n");
+ }
+ set_fs(fs);
+
+ /* Sleep 10-20 ms*/
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(2);
+
+ DEBUG( 0, __FUNCTION__ "(), Setting DTR\n");
+ arg = TIOCM_RTS | TIOCM_DTR | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg))
+ {
+ DEBUG( 0, __FUNCTION__"(), ioctl error!\n");
+ }
+ set_fs(fs);
+
+ idev->qos.baud_rate.value = 9600;
+}
+
+/*
+ * Function actisys_init_qos (qos)
+ *
+ * Initialize QoS capabilities
+ *
+ */
+static void actisys_init_qos( struct irda_device *idev, struct qos_info *qos)
+{
+ qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200;
+
+ /* Remove support for 38400 if this is not a 220L+ dongle */
+ if ( idev->io.dongle_id == ACTISYS_DONGLE)
+ qos->baud_rate.bits &= ~IR_38400;
+
+ qos->min_turn_time.bits &= 0xfe; /* All except 0 ms */
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ * Initialize Actisys module
+ *
+ */
+int init_module(void)
+{
+ actisys_init();
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ * Cleanup Actisys module
+ *
+ */
+void cleanup_module(void)
+{
+ actisys_cleanup();
+}
+
+#endif
diff --git a/drivers/net/irda/esi.c b/drivers/net/irda/esi.c
new file mode 100644
index 000000000..a93e167aa
--- /dev/null
+++ b/drivers/net/irda/esi.c
@@ -0,0 +1,194 @@
+/*********************************************************************
+ *
+ * Filename: esi.c
+ * Version: 1.1
+ * Description: Driver for the Extended Systems JetEye PC
+ * Status: Experimental.
+ * Author: Thomas Davis, <ratbert@radiks.net>
+ * Created at: Sat Feb 21 18:54:38 1998
+ * Modified at: Mon Jan 18 11:30:32 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ * Sources: esi.c
+ *
+ * Copyright (c) 1998, Thomas Davis, <ratbert@radiks.net>,
+ * Copyright (c) 1998, Dag Brattli, <dagb@cs.uit.no>
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * I, Thomas Davis, provide no warranty for any of this software.
+ * This material is provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+
+#include <linux/delay.h>
+#include <linux/tty.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+
+#include <asm/ioctls.h>
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irda_device.h>
+#include <net/irda/irtty.h>
+#include <net/irda/dongle.h>
+
+static void esi_open( struct irda_device *idev, int type);
+static void esi_close( struct irda_device *driver);
+static void esi_change_speed( struct irda_device *idev, int baud);
+static void esi_reset( struct irda_device *idev, int unused);
+static void esi_qos_init( struct irda_device *idev, struct qos_info *qos);
+
+static struct dongle dongle = {
+ ESI_DONGLE,
+ esi_open,
+ esi_close,
+ esi_reset,
+ esi_change_speed,
+ esi_qos_init,
+};
+
+__initfunc(void esi_init(void))
+{
+ irtty_register_dongle( &dongle);
+}
+
+void esi_cleanup(void)
+{
+ irtty_unregister_dongle( &dongle);
+}
+
+static void esi_open( struct irda_device *idev, int type)
+{
+ strcat( idev->description, " <-> esi");
+
+ idev->io.dongle_id = type;
+
+ MOD_INC_USE_COUNT;
+}
+
+static void esi_close( struct irda_device *driver)
+{
+ MOD_DEC_USE_COUNT;
+}
+
+/*
+ * Function esi_change_speed (tty, baud)
+ *
+ * Set the speed for the Extended Systems JetEye PC ESI-9680 type dongle
+ *
+ */
+static void esi_change_speed( struct irda_device *idev, int baud)
+{
+ struct irtty_cb *self;
+ struct tty_struct *tty;
+ int arg = TIOCM_OUT2;
+ struct termios old_termios;
+ int cflag;
+ mm_segment_t fs;
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ if ( !self->tty)
+ return;
+
+ tty = self->tty;
+
+ old_termios = *(tty->termios);
+ cflag = tty->termios->c_cflag;
+
+ cflag &= ~CBAUD;
+
+ switch (baud) {
+ case 19200:
+ cflag |= B19200;
+ arg |= TIOCM_DTR;
+ break;
+ case 115200:
+ cflag |= B115200;
+ arg |= TIOCM_RTS | TIOCM_DTR;
+ break;
+ case 9600:
+ default:
+ cflag |= B9600;
+ arg |= TIOCM_RTS;
+ break;
+ }
+
+ tty->termios->c_cflag = cflag;
+ tty->driver.set_termios( tty, &old_termios);
+
+ /*
+ * The ioctl function, or actually set_modem_info in serial.c
+ * expects a pointer to the argument in user space. To hack us
+ * around this we use the set_fs function to fool the routines
+ * that check if they are called from user space. We also need
+ * to send a pointer to the argument so get_user() gets happy.
+ * DB.
+ */
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET, (unsigned long) &arg)) {
+ DEBUG( 0, __FUNCTION__ "(), error setting ESI speed!\n");
+ }
+ set_fs(fs);
+}
+
+static void esi_reset( struct irda_device *idev, int unused)
+{
+ /* Empty */
+}
+
+/*
+ * Function esi_qos_init (qos)
+ *
+ * Init QoS capabilities for the dongle
+ *
+ */
+static void esi_qos_init( struct irda_device *idev, struct qos_info *qos)
+{
+ qos->baud_rate.bits &= IR_9600|IR_19200|IR_115200;
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ * Initialize ESI module
+ *
+ */
+int init_module(void)
+{
+ esi_init();
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ * Cleanup ESI module
+ *
+ */
+void cleanup_module(void)
+{
+ esi_cleanup();
+}
+
+#endif
+
diff --git a/drivers/net/irda/irport.c b/drivers/net/irda/irport.c
new file mode 100644
index 000000000..ae8bcb27b
--- /dev/null
+++ b/drivers/net/irda/irport.c
@@ -0,0 +1,403 @@
+/*********************************************************************
+ *
+ * Filename: irport.c
+ * Version: 0.8
+ * Description: Serial driver for IrDA.
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Sun Aug 3 13:49:59 1997
+ * Modified at: Sat May 23 23:15:20 1998
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ * Sources: serial.c by Linus Torvalds
+ * serial_serial.c by Aage Kvalnes <aage@cs.uit.no>
+ *
+ * Copyright (c) 1997,1998 Dag Brattli <dagb@cs.uit.no>
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ * NOTICE:
+ *
+ * This driver is ment to be a small serial driver to be used for
+ * IR-chipsets that has a UART (16550) compatibility mode. If your
+ * chipset is is UART only, you should probably use IrTTY instead since
+ * the Linux serial driver is probably more robust and optimized.
+ *
+ * The functions in this file may be used by FIR drivers, but this
+ * driver knows nothing about FIR drivers so don't ever insert such
+ * code into this file. Instead you should code your FIR driver in a
+ * separate file, and then call the functions in this file if
+ * necessary. This is becase it is difficult to use the Linux serial
+ * driver with a FIR driver becase they must share interrupts etc. Most
+ * FIR chipsets can function in advanced SIR mode, and you should
+ * probably use that mode instead of the UART compatibility mode (and
+ * then just forget about this file)
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/ioport.h>
+#include <linux/malloc.h>
+#include <linux/string.h>
+#include <asm/system.h>
+#include <asm/bitops.h>
+#include <asm/io.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+
+#include <linux/skbuff.h>
+#include <linux/serial_reg.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/wrapper.h>
+#include <net/irda/irport.h>
+
+#define IO_EXTENT 8
+
+static unsigned int io[] = { 0x3e8, ~0, ~0, ~0 };
+static unsigned int irq[] = { 11, 0, 0, 0 };
+
+static void irport_write_wakeup( struct irda_device *idev);
+static int irport_write( int iobase, int fifo_size, __u8 *buf, int len);
+static void irport_receive( struct irda_device *idev);
+
+__initfunc(int irport_init(void))
+{
+/* int i; */
+
+/* for ( i=0; (io[i] < 2000) && (i < 4); i++) { */
+/* int ioaddr = io[i]; */
+/* if (check_region(ioaddr, IO_EXTENT)) */
+/* continue; */
+/* if (irport_open( i, io[i], io2[i], irq[i], dma[i]) == 0) */
+/* return 0; */
+/* } */
+/* return -ENODEV; */
+ return 0;
+}
+
+/*
+ * Function pc87108_cleanup ()
+ *
+ * Close all configured chips
+ *
+ */
+#ifdef MODULE
+static void irport_cleanup(void)
+{
+ int i;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* for ( i=0; i < 4; i++) { */
+/* if ( dev_self[i]) */
+/* irport_close( &(dev_self[i]->idev)); */
+/* } */
+}
+#endif /* MODULE */
+
+/*
+ * Function irport_open (void)
+ *
+ * Start IO port
+ *
+ */
+int irport_open( int iobase)
+{
+ DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
+
+ /* Initialize UART */
+ outb( UART_LCR_WLEN8, iobase+UART_LCR); /* Reset DLAB */
+ outb(( UART_MCR_DTR | UART_MCR_RTS | UART_MCR_OUT2), iobase+UART_MCR);
+
+ /* Turn on interrups */
+ outb(( UART_IER_THRI |UART_IER_RLSI | UART_IER_RDI), iobase+UART_IER);
+
+ return 0;
+}
+
+/*
+ * Function irport_cleanup ()
+ *
+ * Stop IO port
+ *
+ */
+void irport_close( int iobase)
+{
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* Reset UART */
+ outb( 0, iobase+UART_MCR);
+
+ /* Turn off interrupts */
+ outb( 0, iobase+UART_IER);
+}
+
+/*
+ * Function irport_change_speed (idev, speed)
+ *
+ * Set speed of port to specified baudrate
+ *
+ */
+void irport_change_speed( int iobase, int speed)
+{
+ int fcr; /* FIFO control reg */
+ int lcr; /* Line control reg */
+ int divisor;
+
+ DEBUG( 0, __FUNCTION__ "(), Setting speed to: %d\n", speed);
+
+ DEBUG( 0, __FUNCTION__ "(), iobase=%#x\n", iobase);
+
+ /* Turn off interrupts */
+ outb( 0, iobase+UART_IER);
+
+ divisor = SPEED_MAX/speed;
+
+ fcr = UART_FCR_ENABLE_FIFO | UART_FCR_TRIGGER_14;
+
+ /* IrDA ports use 8N1 */
+ lcr = UART_LCR_WLEN8;
+
+ outb( UART_LCR_DLAB | lcr, iobase+UART_LCR); /* Set DLAB */
+ outb( divisor & 0xff, iobase+UART_DLL); /* Set speed */
+ outb( divisor >> 8, iobase+UART_DLM);
+ outb( lcr, iobase+UART_LCR); /* Set 8N1 */
+ outb( fcr, iobase+UART_FCR); /* Enable FIFO's */
+
+ /* Turn on interrups */
+ outb( UART_IER_THRI|UART_IER_RLSI|UART_IER_RDI, iobase+UART_IER);
+}
+
+/*
+ * Function irport_interrupt (irq, dev_id, regs)
+ *
+ *
+ */
+void irport_interrupt( int irq, void *dev_id, struct pt_regs *regs)
+{
+ struct irda_device *idev = (struct irda_device *) dev_id;
+
+ int iobase, status;
+ int iir;
+
+ DEBUG( 4, __FUNCTION__ "(), irq %d\n", irq);
+
+ if ( !idev) {
+ printk( KERN_WARNING __FUNCTION__
+ "() irq %d for unknown device.\n", irq);
+ return;
+ }
+
+ idev->netdev.interrupt = 1;
+
+ iobase = idev->io.iobase2;
+
+ iir = inb(iobase + UART_IIR);
+ do {
+ status = inb( iobase+UART_LSR);
+
+ if (status & UART_LSR_DR) {
+ /* Receive interrupt */
+ irport_receive(idev);
+ }
+ if (status & UART_LSR_THRE) {
+ /* Transmitter ready for data */
+ irport_write_wakeup(idev);
+ }
+ } while (!(inb(iobase+UART_IIR) & UART_IIR_NO_INT));
+
+ idev->netdev.interrupt = 0;
+}
+
+/*
+ * Function irport_write_wakeup (tty)
+ *
+ * Called by the driver when there's room for more data. If we have
+ * more packets to send, we send them here.
+ *
+ */
+static void irport_write_wakeup( struct irda_device *idev)
+{
+ int actual = 0, count;
+
+ DEBUG( 4, __FUNCTION__ "() <%ld>\n", jiffies);
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ /* Finished with frame? */
+ if ( idev->tx_buff.offset == idev->tx_buff.len) {
+
+ /*
+ * Now serial buffer is almost free & we can start
+ * transmission of another packet
+ */
+ DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->stats.tx_packets++;
+
+ /* Schedule network layer, so we can get some more frames */
+ mark_bh( NET_BH);
+
+ return;
+ }
+
+ /* Write data left in transmit buffer */
+ count = idev->tx_buff.len - idev->tx_buff.offset;
+ actual = irport_write( idev->io.iobase2, idev->io.fifo_size,
+ idev->tx_buff.head, count);
+ idev->tx_buff.offset += actual;
+ idev->tx_buff.head += actual;
+}
+
+/*
+ * Function irport_write (driver)
+ *
+ *
+ *
+ */
+static int irport_write( int iobase, int fifo_size, __u8 *buf, int len)
+{
+ int actual = 0;
+
+ /* Tx FIFO should be empty! */
+ if (!(inb( iobase+UART_LSR) & UART_LSR_THRE)) {
+ DEBUG( 0, __FUNCTION__ "(), failed, fifo not empty!\n");
+ return -1;
+ }
+
+ /* Fill FIFO with current frame */
+ while (( fifo_size-- > 0) && (actual < len)) {
+ /* Transmit next byte */
+ outb( buf[actual], iobase+UART_TX);
+
+ actual++;
+ }
+
+ DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n",
+ fifo_size, actual, len);
+
+ return actual;
+}
+
+/*
+ * Function irport_xmit (void)
+ *
+ * Transmits the current frame until FIFO is full, then
+ * waits until the next transmitt interrupt, and continues until the
+ * frame is transmited.
+ */
+int irport_hard_xmit( struct sk_buff *skb, struct device *dev)
+{
+ struct irda_device *idev;
+ int xbofs;
+ int actual;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return -1;);
+
+ if ( dev->tbusy) {
+ DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
+
+ return -EBUSY;
+ }
+
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ /* Lock transmit buffer */
+ if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+ return -EBUSY;
+
+ /*
+ * Transfer skb to tx_buff while wrapping, stuffing and making CRC
+ */
+ idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data,
+ idev->tx_buff.truesize);
+
+ actual = irport_write( idev->io.iobase2, idev->io.fifo_size,
+ idev->tx_buff.data, idev->tx_buff.len);
+
+ idev->tx_buff.offset = actual;
+ idev->tx_buff.head = idev->tx_buff.data + actual;
+
+ dev_kfree_skb( skb);
+
+ return 0;
+}
+
+/*
+ * Function irport_receive (void)
+ *
+ * Receive one frame from the infrared port
+ *
+ */
+static void irport_receive( struct irda_device *idev)
+{
+ int iobase;
+
+ if ( !idev)
+ return;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ iobase = idev->io.iobase2;
+
+ if ( idev->rx_buff.len == 0)
+ idev->rx_buff.head = idev->rx_buff.data;
+
+ /*
+ * Receive all characters in Rx FIFO, unwrap and unstuff them.
+ * async_unwrap_char will deliver all found frames
+ */
+ do {
+ async_unwrap_char( idev, inb( iobase+UART_RX));
+
+ } while ( inb( iobase+UART_LSR) & UART_LSR_DR);
+}
+
+#ifdef MODULE
+
+/*
+ * Function cleanup_module (void)
+ *
+ *
+ *
+ */
+void cleanup_module(void)
+{
+ irport_cleanup();
+}
+
+/*
+ * Function init_module (void)
+ *
+ *
+ */
+int init_module(void)
+{
+ if (irport_init() < 0) {
+ cleanup_module();
+ return 1;
+ }
+ return(0);
+}
+
+#endif /* MODULE */
+
diff --git a/drivers/net/irda/irtty.c b/drivers/net/irda/irtty.c
new file mode 100644
index 000000000..09853b5b6
--- /dev/null
+++ b/drivers/net/irda/irtty.c
@@ -0,0 +1,748 @@
+/*********************************************************************
+ *
+ * Filename: irtty.c
+ * Version: 1.0
+ * Description: IrDA line discipline implementation
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Tue Dec 9 21:18:38 1997
+ * Modified at: Mon Jan 18 15:32:03 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ * Sources: slip.c by Laurence Culhane, <loz@holmes.demon.co.uk>
+ * Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
+ *
+ * Copyright (c) 1998 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#include <linux/config.h>
+#include <linux/module.h>
+#include <asm/uaccess.h>
+#include <linux/kernel.h>
+#include <linux/tty.h>
+#include <asm/segment.h>
+#include <linux/init.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irtty.h>
+#include <net/irda/wrapper.h>
+#include <net/irda/irlap.h>
+#include <net/irda/timer.h>
+#include <net/irda/irda_device.h>
+#include <linux/kmod.h>
+
+static hashbin_t *irtty = NULL;
+static hashbin_t *dongles = NULL;
+
+static struct tty_ldisc irda_ldisc;
+
+static int irtty_hard_xmit( struct sk_buff *skb, struct device *dev);
+static void irtty_wait_until_sent( struct irda_device *driver);
+static int irtty_is_receiving( struct irda_device *idev);
+static int irtty_net_init( struct device *dev);
+static int irtty_net_open(struct device *dev);
+static int irtty_net_close(struct device *dev);
+
+static int irtty_open( struct tty_struct *tty);
+static void irtty_close( struct tty_struct *tty);
+static int irtty_ioctl( struct tty_struct *, void *, int, void *);
+static int irtty_receive_room( struct tty_struct *tty);
+static void irtty_change_speed( struct irda_device *dev, int baud);
+static void irtty_write_wakeup( struct tty_struct *tty);
+
+static void irtty_receive_buf( struct tty_struct *, const unsigned char *,
+ char *, int);
+char *driver_name = "irtty";
+
+__initfunc(int irtty_init(void))
+{
+ int status;
+
+ irtty = hashbin_new( HB_LOCAL);
+ if ( irtty == NULL) {
+ printk( KERN_WARNING "IrDA: Can't allocate irtty hashbin!\n");
+ return -ENOMEM;
+ }
+
+ dongles = hashbin_new( HB_LOCAL);
+ if ( dongles == NULL) {
+ printk( KERN_WARNING
+ "IrDA: Can't allocate dongles hashbin!\n");
+ return -ENOMEM;
+ }
+
+ /* Fill in our line protocol discipline, and register it */
+ memset( &irda_ldisc, 0, sizeof( irda_ldisc));
+
+ irda_ldisc.magic = TTY_LDISC_MAGIC;
+ irda_ldisc.name = "irda";
+ irda_ldisc.flags = 0;
+ irda_ldisc.open = irtty_open;
+ irda_ldisc.close = irtty_close;
+ irda_ldisc.read = NULL;
+ irda_ldisc.write = NULL;
+ irda_ldisc.ioctl = (int (*)(struct tty_struct *, struct file *,
+ unsigned int, unsigned long)) irtty_ioctl;
+ irda_ldisc.poll = NULL;
+ irda_ldisc.receive_buf = irtty_receive_buf;
+ irda_ldisc.receive_room = irtty_receive_room;
+ irda_ldisc.write_wakeup = irtty_write_wakeup;
+
+ if (( status = tty_register_ldisc( N_IRDA, &irda_ldisc)) != 0) {
+ printk( KERN_ERR
+ "IrDA: can't register line discipline (err = %d)\n",
+ status);
+ }
+
+ return status;
+}
+
+/*
+ * Function irtty_cleanup ( )
+ *
+ * Called when the irda module is removed. Here we remove all instances
+ * of the driver, and the master array.
+ */
+#ifdef MODULE
+static void irtty_cleanup(void)
+{
+ int ret;
+
+ /*
+ * Unregister tty line-discipline
+ */
+ if (( ret = tty_register_ldisc( N_IRDA, NULL))) {
+ printk( KERN_ERR
+ "IrTTY: can't unregister line discipline (err = %d)\n",
+ ret);
+ }
+
+ /*
+ * The TTY should care of deallocating the instances by using the
+ * callback to irtty_close(), therefore we do give any deallocation
+ * function to hashbin_destroy().
+ */
+ hashbin_delete( irtty, NULL);
+ hashbin_delete( dongles, NULL);
+}
+#endif /* MODULE */
+
+/*
+ * Function irtty_open(tty)
+ *
+ * This function is called by the TTY module when the IrDA line
+ * discipline is called for. Because we are sure the tty line exists,
+ * we only have to link it to a free IrDA channel.
+ */
+static int irtty_open( struct tty_struct *tty)
+{
+ struct irtty_cb *self;
+ char name[16];
+
+ ASSERT( tty != NULL, return -EEXIST;);
+
+ /* First make sure we're not already connected. */
+ self = (struct irtty_cb *) tty->disc_data;
+ if ( self != NULL && self->magic == IRTTY_MAGIC)
+ return -EEXIST;
+
+ /*
+ * Allocate new instance of the driver
+ */
+ self = kmalloc( sizeof(struct irtty_cb), GFP_KERNEL);
+ if ( self == NULL) {
+ printk( KERN_ERR "IrDA: Can't allocate memory for "
+ "IrDA control block!\n");
+ return -ENOMEM;
+ }
+ memset( self, 0, sizeof(struct irtty_cb));
+
+ self->tty = tty;
+ tty->disc_data = self;
+
+ /* Give self a name */
+ sprintf( name, "%s%d", tty->driver.name,
+ MINOR(tty->device) - tty->driver.minor_start +
+ tty->driver.name_base);
+
+ /* hashbin_insert( irtty, (QUEUE*) self, 0, self->name); */
+ hashbin_insert( irtty, (QUEUE*) self, (int) self, NULL);
+
+ if (tty->driver.flush_buffer) {
+ tty->driver.flush_buffer(tty);
+ }
+
+ if (tty->ldisc.flush_buffer) {
+ tty->ldisc.flush_buffer(tty);
+ }
+
+ self->magic = IRTTY_MAGIC;
+
+ /*
+ * Initialize driver
+ */
+ /* self->idev.flags |= SIR_MODE | IO_PIO; */
+ self->idev.rx_buff.state = OUTSIDE_FRAME;
+
+ /*
+ * Initialize QoS capabilities, we fill in all the stuff that
+ * we support. Be careful not to place any restrictions on values
+ * that are not device dependent (such as link disconnect time) so
+ * this parameter can be set by IrLAP (or the user) instead. DB
+ */
+ irda_init_max_qos_capabilies( &self->idev.qos);
+
+ /* The only value we must override it the baudrate */
+ self->idev.qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
+ IR_115200;
+ self->idev.qos.min_turn_time.bits = 0x03;
+ irda_qos_bits_to_value( &self->idev.qos);
+
+ /* Specify which buffer allocation policy we need */
+ self->idev.rx_buff.flags = GFP_KERNEL;
+ self->idev.tx_buff.flags = GFP_KERNEL;
+
+ /* Specify how much memory we want */
+ self->idev.rx_buff.truesize = 4000;
+ self->idev.tx_buff.truesize = 4000;
+
+ /* Initialize callbacks */
+ self->idev.change_speed = irtty_change_speed;
+ self->idev.is_receiving = irtty_is_receiving;
+ /* self->idev.is_tbusy = irtty_is_tbusy; */
+ self->idev.wait_until_sent = irtty_wait_until_sent;
+
+ /* Override the network functions we need to use */
+ self->idev.netdev.init = irtty_net_init;
+ self->idev.netdev.hard_start_xmit = irtty_hard_xmit;
+ self->idev.netdev.open = irtty_net_open;
+ self->idev.netdev.stop = irtty_net_close;
+
+ /* Open the IrDA device */
+ irda_device_open( &self->idev, name, self);
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+}
+
+/*
+ * Function irtty_close ( tty)
+ *
+ * Close down a IrDA channel. This means flushing out any pending queues,
+ * and then restoring the TTY line discipline to what it was before it got
+ * hooked to IrDA (which usually is TTY again).
+ */
+static void irtty_close( struct tty_struct *tty)
+{
+ struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
+
+ /* First make sure we're connected. */
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ /* We are not using any dongle anymore! */
+ if ( self->dongle_q)
+ self->dongle_q->dongle->close( &self->idev);
+
+ /* Remove driver */
+ irda_device_close( &self->idev);
+
+ /* Stop tty */
+ tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+ tty->disc_data = 0;
+
+ self->tty = NULL;
+ self->magic = 0;
+
+ /* hashbin_remove( irtty, 0, self->name); */
+ self = hashbin_remove( irtty, (int) self, NULL);
+
+ if ( self != NULL)
+ kfree( self);
+
+ MOD_DEC_USE_COUNT;
+
+ DEBUG( 4, "IrTTY: close() -->\n");
+}
+
+/*
+ * Function irtty_change_speed ( self, baud)
+ *
+ * Change the speed of the serial port. The driver layer must check that
+ * all transmission has finished using the irtty_wait_until_sent()
+ * function.
+ */
+static void irtty_change_speed( struct irda_device *idev, int baud)
+{
+ struct termios old_termios;
+ struct irtty_cb *self;
+ int cflag;
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ old_termios = *(self->tty->termios);
+ cflag = self->tty->termios->c_cflag;
+
+ cflag &= ~CBAUD;
+
+ DEBUG( 4, __FUNCTION__ "(), Setting speed to %d\n", baud);
+
+ switch( baud) {
+ case 1200:
+ cflag |= B1200;
+ break;
+ case 2400:
+ cflag |= B2400;
+ break;
+ case 4800:
+ cflag |= B4800;
+ break;
+ case 19200:
+ cflag |= B19200;
+ break;
+ case 38400:
+ cflag |= B38400;
+ break;
+ case 57600:
+ cflag |= B57600;
+ break;
+ case 115200:
+ cflag |= B115200;
+ break;
+ case 9600:
+ default:
+ cflag |= B9600;
+ break;
+ }
+
+ self->tty->termios->c_cflag = cflag;
+ self->tty->driver.set_termios( self->tty, &old_termios);
+}
+
+/*
+ * Function irtty_init_dongle (self, type)
+ *
+ * Initialize attached dongle. Warning, must be called with a process
+ * context!
+ */
+static void irtty_init_dongle( struct irtty_cb *self, int type)
+{
+ struct dongle_q *node;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+#ifdef CONFIG_KMOD
+ /* Try to load the module needed */
+ switch( type) {
+ case ESI_DONGLE:
+ DEBUG( 0, __FUNCTION__ "(), ESI dongle!\n");
+ request_module( "esi");
+ break;
+ case TEKRAM_DONGLE:
+ DEBUG( 0, __FUNCTION__ "(), Tekram dongle!\n");
+ request_module( "tekram");
+ break;
+ case ACTISYS_DONGLE:
+ DEBUG( 0, __FUNCTION__ "(), ACTiSYS dongle!\n");
+ request_module( "actisys");
+ break;
+ default:
+ DEBUG( 0, __FUNCTION__ "(), Unknown dongle type!\n");
+ return;
+ break;
+ }
+#endif /* CONFIG_KMOD */
+
+ node = hashbin_find( dongles, type, NULL);
+ if ( !node) {
+ DEBUG( 0, __FUNCTION__
+ "(), Unable to find requested dongle\n");
+ return;
+ }
+ self->dongle_q = node;
+
+ /* Use this change speed function instead of the default */
+ self->idev.change_speed = node->dongle->change_speed;
+
+ /*
+ * Now initialize the dongle!
+ */
+ node->dongle->open( &self->idev, type);
+ node->dongle->qos_init( &self->idev, &self->idev.qos);
+
+ /* Reset dongle */
+ node->dongle->reset( &self->idev, 0);
+
+ /* Set to default baudrate */
+ node->dongle->change_speed( &self->idev, 9600);
+}
+
+/*
+ * Function irtty_ioctl (tty, file, cmd, arg)
+ *
+ * The Swiss army knife of system calls :-)
+ *
+ */
+static int irtty_ioctl( struct tty_struct *tty, void *file, int cmd,
+ void *arg)
+{
+ struct irtty_cb *self;
+ int err = 0;
+ int size = _IOC_SIZE(cmd);
+
+ self = (struct irtty_cb *) tty->disc_data;
+
+ ASSERT( self != NULL, return -ENODEV;);
+ ASSERT( self->magic == IRTTY_MAGIC, return -EBADR;);
+
+ if ( _IOC_DIR(cmd) & _IOC_READ)
+ err = verify_area( VERIFY_WRITE, (void *) arg, size);
+ else if ( _IOC_DIR(cmd) & _IOC_WRITE)
+ err = verify_area( VERIFY_READ, (void *) arg, size);
+ if ( err)
+ return err;
+
+ switch(cmd) {
+ case TCGETS:
+ case TCGETA:
+ return n_tty_ioctl( tty, (struct file *) file, cmd,
+ (unsigned long) arg);
+ break;
+ case IRTTY_IOCTDONGLE:
+ /* Initialize dongle */
+ irtty_init_dongle( self, (int) arg);
+ break;
+ default:
+ return -ENOIOCTLCMD;
+ }
+ return 0;
+}
+
+/*
+ * Function irtty_receive_buf( tty, cp, count)
+ *
+ * Handle the 'receiver data ready' interrupt. This function is called
+ * by the 'tty_io' module in the kernel when a block of IrDA data has
+ * been received, which can now be decapsulated and delivered for
+ * further processing
+ */
+static void irtty_receive_buf( struct tty_struct *tty, const unsigned
+ char *cp, char *fp, int count)
+{
+ struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ /* Read the characters out of the buffer */
+ while (count--) {
+ /*
+ * Characters received with a parity error, etc?
+ */
+ if (fp && *fp++) {
+ DEBUG( 0, "Framing or parity error!\n");
+ irda_device_set_media_busy( &self->idev, TRUE);
+ /* sl->rx_errors++; */
+ cp++;
+ continue;
+ }
+ /*
+ * Unwrap and destuff one byte
+ */
+ async_unwrap_char( &self->idev, *cp++);
+ /* self->rx_over_errors++; */
+ }
+}
+
+/*
+ * Function irtty_hard_xmit (skb, dev)
+ *
+ * Transmit skb
+ *
+ */
+static int irtty_hard_xmit( struct sk_buff *skb, struct device *dev)
+{
+ struct irtty_cb *self;
+ struct irda_device *idev;
+ int actual = 0;
+
+ ASSERT( dev != NULL, return 0;);
+ ASSERT( skb != NULL, return 0;);
+
+ if ( dev->tbusy) {
+ DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
+
+ return -EBUSY;
+ }
+
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return 0;);
+ ASSERT( self->magic == IRTTY_MAGIC, return 0;);
+
+ /* Lock transmit buffer */
+ if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+ return 0;
+
+ /*
+ * Transfer skb to tx_buff while wrapping, stuffing and making CRC
+ */
+ idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data,
+ idev->tx_buff.truesize);
+
+ self->tty->flags |= (1 << TTY_DO_WRITE_WAKEUP);
+
+ dev->trans_start = jiffies;
+
+ if ( self->tty->driver.write)
+ actual = self->tty->driver.write( self->tty, 0,
+ idev->tx_buff.data,
+ idev->tx_buff.len);
+
+ idev->tx_buff.offset = actual;
+ idev->tx_buff.head = idev->tx_buff.data + actual;
+#if 0
+ /*
+ * Did we transmit the whole frame? Commented out for now since
+ * I must check if this optimalization really works. DB.
+ */
+ if (( idev->tx.count - idev->tx.ptr) <= 0) {
+ DEBUG( 4, "irtty_xmit_buf: finished with frame!\n");
+ self->tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+ irda_unlock( &self->tbusy);
+ }
+#endif
+
+ dev_kfree_skb( skb);
+
+ return 0;
+}
+
+/*
+ * Function irtty_receive_room (tty)
+ *
+ * Used by the TTY to find out how much data we can receive at a time
+ *
+*/
+static int irtty_receive_room( struct tty_struct *tty)
+{
+ return 65536; /* We can handle an infinite amount of data. :-) */
+}
+
+/*
+ * Function irtty_write_wakeup (tty)
+ *
+ * Called by the driver when there's room for more data. If we have
+ * more packets to send, we send them here.
+ *
+ */
+static void irtty_write_wakeup( struct tty_struct *tty)
+{
+ int actual = 0, count;
+ struct irtty_cb *self = (struct irtty_cb *) tty->disc_data;
+ struct irda_device *idev;
+
+ /*
+ * First make sure we're connected.
+ */
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ idev = &self->idev;
+
+ /*
+ * Finished with frame?
+ */
+ if ( idev->tx_buff.offset == idev->tx_buff.len) {
+
+ /*
+ * Now serial buffer is almost free & we can start
+ * transmission of another packet
+ */
+ DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+
+ tty->flags &= ~(1 << TTY_DO_WRITE_WAKEUP);
+
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->stats.tx_packets++;
+ idev->stats.tx_bytes += idev->tx_buff.len;
+
+ /* Tell network layer that we want more frames */
+ mark_bh( NET_BH);
+
+ return;
+ }
+ /*
+ * Write data left in transmit buffer
+ */
+ count = idev->tx_buff.len - idev->tx_buff.offset;
+ actual = tty->driver.write( tty, 0, idev->tx_buff.head, count);
+ idev->tx_buff.offset += actual;
+ idev->tx_buff.head += actual;
+
+ DEBUG( 4, "actual=%d, sent %d\n", actual, count);
+}
+
+/*
+ * Function irtty_is_receiving (idev)
+ *
+ * Return TRUE is we are currently receiving a frame
+ *
+ */
+static int irtty_is_receiving( struct irda_device *idev)
+{
+ return ( idev->rx_buff.state != OUTSIDE_FRAME);
+}
+
+/*
+ * Function irtty_change_speed_ready (idev)
+ *
+ * Are we completely finished with transmitting frames so its possible
+ * to change the speed of the serial port. Warning this function must
+ * be called with a process context!
+ */
+static void irtty_wait_until_sent( struct irda_device *idev)
+{
+ struct irtty_cb *self = (struct irtty_cb *) idev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ DEBUG( 4, "Chars in buffer %d\n",
+ self->tty->driver.chars_in_buffer( self->tty));
+
+ tty_wait_until_sent( self->tty, 0);
+}
+
+int irtty_register_dongle( struct dongle *dongle)
+{
+ struct dongle_q *new;
+
+ /* Check if this compressor has been registred before */
+ if ( hashbin_find ( dongles, dongle->type, NULL)) {
+ DEBUG( 0, __FUNCTION__ "(), Dongle already registered\n");
+ return 0;
+ }
+
+ /* Make new IrDA dongle */
+ new = (struct dongle_q *) kmalloc (sizeof (struct dongle_q),
+ GFP_KERNEL);
+ if (new == NULL) {
+ return 1;
+
+ }
+ memset( new, 0, sizeof( struct dongle_q));
+ new->dongle = dongle;
+
+ /* Insert IrDA compressor into hashbin */
+ hashbin_insert( dongles, (QUEUE *) new, dongle->type, NULL);
+
+ return 0;
+}
+
+void irtty_unregister_dongle( struct dongle *dongle)
+{
+ struct dongle_q *node;
+
+ node = hashbin_remove( dongles, dongle->type, NULL);
+ if ( !node) {
+ DEBUG( 0, __FUNCTION__ "(), dongle not found!\n");
+ return;
+ }
+ kfree( node);
+}
+
+static int irtty_net_init( struct device *dev)
+{
+ /* Set up to be a normal IrDA network device driver */
+ irda_device_setup( dev);
+
+ /* Insert overrides below this line! */
+
+ return 0;
+}
+
+
+static int irtty_net_open( struct device *dev)
+{
+ ASSERT( dev != NULL, return -1;);
+
+ /* Ready to play! */
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 1;
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+}
+
+static int irtty_net_close(struct device *dev)
+{
+ ASSERT( dev != NULL, return -1;);
+
+ /* Stop device */
+ dev->tbusy = 1;
+ dev->start = 0;
+
+ MOD_DEC_USE_COUNT;
+
+ return 0;
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ * Initialize IrTTY module
+ *
+ */
+int init_module(void)
+{
+ irtty_init();
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ * Cleanup IrTTY module
+ *
+ */
+void cleanup_module(void)
+{
+ irtty_cleanup();
+}
+
+#endif /* MODULE */
+
+
+
+
+
+
+
diff --git a/drivers/net/irda/pc87108.c b/drivers/net/irda/pc87108.c
new file mode 100644
index 000000000..faf9eea33
--- /dev/null
+++ b/drivers/net/irda/pc87108.c
@@ -0,0 +1,1502 @@
+/*********************************************************************
+ *
+ * Filename: pc87108.c
+ * Version: 0.8
+ * Description: FIR/MIR driver for the NS PC87108 chip
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Sat Nov 7 21:43:15 1998
+ * Modified at: Mon Dec 28 08:46:16 1998
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
+ * Copyright (c) 1998 Lichen Wang, <lwang@actisys.com>
+ * Copyright (c) 1998 Actisys Corp., www.actisys.com
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ * Notice that all functions that needs to access the chip in _any_
+ * way, must save BSR register on entry, and restore it on exit.
+ * It is _very_ important to follow this policy!
+ *
+ * __u8 bank;
+ *
+ * bank = inb( iobase+BSR);
+ *
+ * do_your_stuff_here();
+ *
+ * outb( bank, iobase+BSR);
+ *
+ * If you find bugs in this file, its very likely that the same bug
+ * will also be in w83977af_ir.c since the implementations is quite
+ * similar.
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/byteorder.h>
+
+#include <net/irda/wrapper.h>
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irlap_frame.h>
+#include <net/irda/irda_device.h>
+
+#include <net/irda/pc87108.h>
+
+#define BROKEN_DONGLE_ID
+
+static char *driver_name = "pc87108";
+
+#define CHIP_IO_EXTENT 8
+
+static unsigned int io[] = { 0x2f8, ~0, ~0, ~0 };
+static unsigned int io2[] = { 0x150, 0, 0, 0};
+static unsigned int irq[] = { 3, 0, 0, 0 };
+static unsigned int dma[] = { 0, 0, 0, 0 };
+
+static struct pc87108 *dev_self[] = { NULL, NULL, NULL, NULL};
+
+static char *dongle_types[] = {
+ "Differential serial interface",
+ "Differential serial interface",
+ "Reserved",
+ "Reserved",
+ "Sharp RY5HD01",
+ "Reserved",
+ "Single-ended serial interface",
+ "Consumer-IR only",
+ "HP HSDL-2300, HP HSDL-3600/HSDL-3610",
+ "IBM31T1100 or Temic TFDS6000/TFDS6500",
+ "Reserved",
+ "Reserved",
+ "HP HSDL-1100/HSDL-2100",
+ "HP HSDL-1100/HSDL-2100"
+ "Supports SIR Mode only",
+ "No dongle connected",
+};
+
+/* Some prototypes */
+static int pc87108_open( int i, unsigned int iobase, unsigned int board_addr,
+ unsigned int irq, unsigned int dma);
+static int pc87108_close( struct irda_device *idev);
+static int pc87108_probe( int iobase, int board_addr, int irq, int dma);
+static void pc87108_pio_receive( struct irda_device *idev);
+static int pc87108_dma_receive( struct irda_device *idev);
+static int pc87108_dma_receive_complete(struct irda_device *idev, int iobase);
+static int pc87108_hard_xmit( struct sk_buff *skb, struct device *dev);
+static int pc87108_pio_write( int iobase, __u8 *buf, int len, int fifo_size);
+static void pc87108_dma_write( struct irda_device *idev, int iobase);
+static void pc87108_change_speed( struct irda_device *idev, int baud);
+static void pc87108_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static void pc87108_wait_until_sent( struct irda_device *idev);
+static int pc87108_is_receiving( struct irda_device *idev);
+static int pc87108_read_dongle_id ( int iobase);
+static void pc87108_init_dongle_interface ( int iobase, int dongle_id);
+
+static int pc87108_net_init( struct device *dev);
+static int pc87108_net_open( struct device *dev);
+static int pc87108_net_close( struct device *dev);
+
+/*
+ * Function pc87108_init ()
+ *
+ * Initialize chip. Just try to find out how many chips we are dealing with
+ * and where they are
+ */
+__initfunc(int pc87108_init(void))
+{
+ int i;
+
+ for ( i=0; (io[i] < 2000) && (i < 4); i++) {
+ int ioaddr = io[i];
+ if (check_region(ioaddr, CHIP_IO_EXTENT))
+ continue;
+ if (pc87108_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
+ return 0;
+ }
+ return -ENODEV;
+}
+
+/*
+ * Function pc87108_cleanup ()
+ *
+ * Close all configured chips
+ *
+ */
+#ifdef MODULE
+static void pc87108_cleanup(void)
+{
+ int i;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ for ( i=0; i < 4; i++) {
+ if ( dev_self[i])
+ pc87108_close( &(dev_self[i]->idev));
+ }
+}
+#endif /* MODULE */
+
+/*
+ * Function pc87108_open (iobase, irq)
+ *
+ * Open driver instance
+ *
+ */
+static int pc87108_open( int i, unsigned int iobase, unsigned int board_addr,
+ unsigned int irq, unsigned int dma)
+{
+ struct pc87108 *self;
+ struct irda_device *idev;
+ int ret;
+ int dongle_id;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ if (( dongle_id = pc87108_probe( iobase, board_addr, irq, dma)) == -1)
+ return -1;
+
+ /*
+ * Allocate new instance of the driver
+ */
+ self = kmalloc( sizeof(struct pc87108), GFP_KERNEL);
+ if ( self == NULL) {
+ printk( KERN_ERR "IrDA: Can't allocate memory for "
+ "IrDA control block!\n");
+ return -ENOMEM;
+ }
+ memset( self, 0, sizeof(struct pc87108));
+
+ /* Need to store self somewhere */
+ dev_self[i] = self;
+
+ idev = &self->idev;
+
+ /* Initialize IO */
+ idev->io.iobase = iobase;
+ idev->io.irq = irq;
+ idev->io.io_ext = CHIP_IO_EXTENT;
+ idev->io.dma = dma;
+ idev->io.fifo_size = 32;
+
+ /* Lock the port that we need */
+ ret = check_region( idev->io.iobase, idev->io.io_ext);
+ if ( ret < 0) {
+ DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+ idev->io.iobase);
+ /* pc87108_cleanup( self->idev); */
+ return -ENODEV;
+ }
+ request_region( idev->io.iobase, idev->io.io_ext, idev->name);
+
+ /* Initialize QoS for this device */
+ irda_init_max_qos_capabilies( &idev->qos);
+
+ /* The only value we must override it the baudrate */
+ idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
+ IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
+
+ idev->qos.min_turn_time.bits = 0x07;
+ irda_qos_bits_to_value( &idev->qos);
+
+ /* Specify which buffer allocation policy we need */
+ idev->rx_buff.flags = GFP_KERNEL | GFP_DMA;
+ idev->tx_buff.flags = GFP_KERNEL | GFP_DMA;
+
+ /* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
+ idev->rx_buff.truesize = 14384;
+ idev->tx_buff.truesize = 4000;
+
+ /* Initialize callbacks */
+ idev->hard_xmit = pc87108_hard_xmit;
+ idev->change_speed = pc87108_change_speed;
+ idev->wait_until_sent = pc87108_wait_until_sent;
+ idev->is_receiving = pc87108_is_receiving;
+
+ /* Override the network functions we need to use */
+ idev->netdev.init = pc87108_net_init;
+ idev->netdev.hard_start_xmit = pc87108_hard_xmit;
+ idev->netdev.open = pc87108_net_open;
+ idev->netdev.stop = pc87108_net_close;
+
+ idev->io.dongle_id = dongle_id;
+ pc87108_init_dongle_interface( iobase, dongle_id);
+
+ /* Open the IrDA device */
+ irda_device_open( idev, driver_name, self);
+
+ return 0;
+}
+
+/*
+ * Function pc87108_close (idev)
+ *
+ * Close driver instance
+ *
+ */
+static int pc87108_close( struct irda_device *idev)
+{
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ iobase = idev->io.iobase;
+
+ /* Release the PORT that this driver is using */
+ DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n",
+ idev->io.iobase);
+ release_region( idev->io.iobase, idev->io.io_ext);
+
+ irda_device_close( idev);
+
+ return 0;
+}
+
+/*
+ * Function pc87108_probe (iobase, board_addr, irq, dma)
+ *
+ * Returns non-negative on success.
+ *
+ */
+static int pc87108_probe( int iobase, int board_addr, int irq, int dma)
+{
+ int version;
+ __u8 temp=0;
+ int dongle_id;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Base Address and Interrupt Control Register BAIC */
+ outb(0, board_addr);
+ switch ( iobase) {
+ case 0x3E8: outb( 0x14, board_addr+1); break;
+ case 0x2E8: outb( 0x15, board_addr+1); break;
+ case 0x3F8: outb( 0x16, board_addr+1); break;
+ case 0x2F8: outb( 0x17, board_addr+1); break;
+ default: DEBUG(0, __FUNCTION__ "(), invalid base_address");
+ }
+
+ /* Control Signal Routing Register CSRT */
+ switch (irq) {
+ case 3: temp = 0x01; break;
+ case 4: temp = 0x02; break;
+ case 5: temp = 0x03; break;
+ case 7: temp = 0x04; break;
+ case 9: temp = 0x05; break;
+ case 11: temp = 0x06; break;
+ case 15: temp = 0x07; break;
+ default: DEBUG( 0, __FUNCTION__ "(), invalid irq");
+ }
+ outb( 1, board_addr);
+
+ switch (dma) {
+ case 0: outb( 0x08+temp, board_addr+1); break;
+ case 1: outb( 0x10+temp, board_addr+1); break;
+ case 3: outb( 0x18+temp, board_addr+1); break;
+ default: DEBUG( 0, __FUNCTION__ "(), invalid dma");
+ }
+
+ /* Mode Control Register MCTL */
+ outb( 2, board_addr);
+ outb( 0x03, board_addr+1);
+
+ /* read the Module ID */
+ switch_bank( iobase, BANK3);
+ version = inb( iobase+MID);
+
+ /* should be 0x2? */
+ if (0x20 != (version & 0xf0))
+ {
+ DEBUG( 0, __FUNCTION__ "(), Wrong chip version");
+ return -1;
+ }
+
+ /* Switch to advanced mode */
+ switch_bank( iobase, BANK2);
+ outb( ECR1_EXT_SL, iobase+ECR1);
+ switch_bank( iobase, BANK0);
+
+ dongle_id = pc87108_read_dongle_id( iobase);
+ DEBUG( 0, __FUNCTION__ "(), Found dongle: %s\n",
+ dongle_types[ dongle_id]);
+
+ /* Set FIFO threshold to TX17, RX16, reset and enable FIFO's */
+ switch_bank( iobase, BANK0);
+ outb( FCR_RXTH|FCR_TXTH|FCR_TXSR|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
+
+ /* Set FIFO size to 32 */
+ switch_bank( iobase, BANK2);
+ outb( EXCR2_RFSIZ|EXCR2_TFSIZ, iobase+EXCR2);
+
+ /* IRCR2: FEND_MD is set */
+ switch_bank( iobase, BANK5);
+ outb( 0x2a, iobase+4);
+
+ /* Make sure that some defaults are OK */
+ switch_bank( iobase, BANK6);
+ outb( 0x20, iobase+0); /* Set 32 bits FIR CRC */
+ outb( 0x0a, iobase+1); /* Set MIR pulse width */
+ outb( 0x0d, iobase+2); /* Set SIR pulse width */
+ outb( 0x2a, iobase+4); /* Set beginning frag, and preamble length */
+
+ /* Receiver frame length */
+ switch_bank( iobase, BANK4);
+ outb( 2048 & 0xff, iobase+6);
+ outb(( 2048 >> 8) & 0x1f, iobase+7);
+
+ /* Transmitter frame length */
+ outb( 2048 & 0xff, iobase+4);
+ outb(( 2048 >> 8) & 0x1f, iobase+5);
+
+ DEBUG( 0, "PC87108 driver loaded. Version: 0x%02x\n", version);
+
+ /* Enable receive interrupts */
+ switch_bank( iobase, BANK0);
+ outb( IER_RXHDL_IE, iobase+IER);
+
+ return dongle_id;
+}
+
+/*
+ * Function pc87108_read_dongle_id (void)
+ *
+ * Try to read dongle indentification. This procedure needs to be executed
+ * once after power-on/reset. It also needs to be used whenever you suspect
+ * that the user may have plugged/unplugged the IrDA Dongle.
+ *
+ */
+static int pc87108_read_dongle_id ( int iobase)
+{
+ int dongle_id;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ bank = inb( iobase+BSR);
+
+ /* Select Bank 7 */
+ switch_bank( iobase, BANK7);
+
+ /* IRCFG4: IRSL0_DS and IRSL21_DS are cleared */
+ outb( 0x00, iobase+7);
+
+ /* ID0, 1, and 2 are pulled up/down very slowly */
+ udelay(50);
+
+ /* IRCFG1: read the ID bits */
+ dongle_id = inb( iobase+4) & 0x0f;
+
+#ifdef BROKEN_DONGLE_ID
+ if ( dongle_id == 0x0a)
+ dongle_id = 0x09;
+#endif
+
+ /* Go back to bank 0 before returning */
+ switch_bank( iobase, BANK0);
+
+ DEBUG( 0, __FUNCTION__ "(), Dongle = %#x\n", dongle_id);
+
+ outb( bank, iobase+BSR);
+
+ return dongle_id;
+}
+
+/*
+ * Function pc87108_init_dongle_interface (iobase, dongle_id)
+ *
+ * This function initializes the dongle for the transceiver that is
+ * used. This procedure needs to be executed once after
+ * power-on/reset. It also needs to be used whenever you suspect that
+ * the dongle is changed.
+ */
+static void pc87108_init_dongle_interface ( int iobase, int dongle_id)
+{
+ int bank;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Select Bank 7 */
+ switch_bank( iobase, BANK7);
+
+ /* IRCFG4: set according to dongle_id */
+ switch (dongle_id) {
+ case 0x00: /* same as */
+ case 0x01: /* Differential serial interface */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x02: /* same as */
+ case 0x03: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x04: /* Sharp RY5HD01 */
+ DEBUG( 0, __FUNCTION__ "(), %s not supported yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x05: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet",
+ dongle_types[dongle_id]);
+ break;
+ case 0x06: /* Single-ended serial interface */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x07: /* Consumer-IR only */
+ DEBUG( 0, __FUNCTION__ "(), %s is not for IrDA mode\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x08: /* HP HSDL-2300, HP HSDL-3600/HSDL-3610 */
+ DEBUG( 0, __FUNCTION__ "(), %s not supported yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x09: /* IBM31T1100 or Temic TFDS6000/TFDS6500 */
+ outb_p( 0x28, iobase+7); /* Set irsl[0-2] as output */
+ break;
+ case 0x0A: /* same as */
+ case 0x0B: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x0C: /* same as */
+ case 0x0D: /* HP HSDL-1100/HSDL-2100 */
+ /*
+ * Set irsl0 as input, irsl[1-2] as output, and separate
+ * inputs are used for SIR and MIR/FIR
+ */
+ outb( 0x48, iobase+7);
+ break;
+ case 0x0E: /* Supports SIR Mode only */
+ outb( 0x28, iobase+7); /* Set irsl[0-2] as output */
+ break;
+ case 0x0F: /* No dongle connected */
+ DEBUG( 0, __FUNCTION__ "(), %s\n",
+ dongle_types[dongle_id]);
+ DEBUG( 0, "***\n");
+
+ switch_bank( iobase, BANK0);
+ outb( 0x62, iobase+MCR);
+ break;
+ default:
+ DEBUG( 0, __FUNCTION__ "(), invalid dongle_id %#x", dongle_id);
+ }
+
+ /* IRCFG1: IRSL1 and 2 are set to IrDA mode */
+ outb( 0x00, iobase+4);
+
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+} /* set_up_dongle_interface */
+
+/*
+ * Function pc87108_change_dongle_speed (iobase, speed, dongle_id)
+ *
+ * Change speed of the attach dongle
+ *
+ */
+static void pc87108_change_dongle_speed( int iobase, int speed, int dongle_id)
+{
+ unsigned long flags;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Select Bank 7 */
+ switch_bank( iobase, BANK7);
+
+ /* IRCFG1: set according to dongle_id */
+ switch (dongle_id) {
+ case 0x00: /* same as */
+ case 0x01: /* Differential serial interface */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x02: /* same as */
+ case 0x03: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x04: /* Sharp RY5HD01 */
+ DEBUG( 0, __FUNCTION__ "(), %s not supported yet\n",
+ dongle_types[dongle_id]);
+ case 0x05: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x06: /* Single-ended serial interface */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x07: /* Consumer-IR only */
+ DEBUG( 0, __FUNCTION__ "(), %s is not for IrDA mode\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x08: /* HP HSDL-2300, HP HSDL-3600/HSDL-3610 */
+ DEBUG( 0, __FUNCTION__ "(), %s not supported yet\n",
+ dongle_types[dongle_id]);
+ case 0x09: /* IBM31T1100 or Temic TFDS6000/TFDS6500 */
+ switch_bank( iobase, BANK7);
+ outb_p( 0x01, iobase+4);
+
+ if ( speed == 4000000) {
+ save_flags(flags);
+ cli();
+ outb( 0x81, iobase+4);
+ outb( 0x80, iobase+4);
+ restore_flags(flags);
+ }
+ else
+ outb_p( 0x00, iobase+4);
+ break;
+ case 0x0A: /* same as */
+ case 0x0B: /* Reserved */
+ DEBUG( 0, __FUNCTION__ "(), %s not defined by irda yet\n",
+ dongle_types[dongle_id]);
+ break;
+ case 0x0C: /* same as */
+ case 0x0D: /* HP HSDL-1100/HSDL-2100 */
+ break;
+ case 0x0E: /* Supports SIR Mode only */
+ break;
+ case 0x0F: /* No dongle connected */
+ DEBUG( 0, __FUNCTION__ "(), %s is not for IrDA mode\n",
+ dongle_types[dongle_id]);
+
+ switch_bank( iobase, BANK0);
+ outb( 0x62, iobase+MCR);
+ break;
+ default:
+ DEBUG( 0, __FUNCTION__ "(), invalid data_rate\n");
+ }
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+}
+
+/*
+ * Function pc87108_change_speed (idev, baud)
+ *
+ * Change the speed of the device
+ *
+ */
+static void pc87108_change_speed( struct irda_device *idev, int speed)
+{
+ __u8 mcr = MCR_SIR;
+ __u8 bank;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ /* Update accounting for new speed */
+ idev->io.baudrate = speed;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Disable interrupts */
+ switch_bank( iobase, BANK0);
+ outb( 0, iobase+IER);
+
+ /* Select Bank 2 */
+ switch_bank( iobase, BANK2);
+
+ outb( 0x00, iobase+BGDH);
+ switch ( speed) {
+ case 9600: outb( 0x0c, iobase+BGDL); break;
+ case 19200: outb( 0x06, iobase+BGDL); break;
+ case 37600: outb( 0x03, iobase+BGDL); break;
+ case 57600: outb( 0x02, iobase+BGDL); break;
+ case 115200: outb( 0x01, iobase+BGDL); break;
+ case 576000:
+ switch_bank( iobase, BANK5);
+
+ /* IRCR2: MDRS is set */
+ outb( inb( iobase+4) | 0x04, iobase+4);
+
+ mcr = MCR_MIR;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 576000\n");
+ break;
+ case 1152000:
+ mcr = MCR_MIR;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 1152000\n");
+ break;
+ case 4000000:
+ mcr = MCR_FIR;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
+ break;
+ default:
+ mcr = MCR_FIR;
+ DEBUG( 0, __FUNCTION__ "(), unknown baud rate of %d\n", speed);
+ break;
+ }
+
+ /* Set appropriate speed mode */
+ switch_bank(iobase, BANK0);
+ outb( mcr|MCR_TX_DFR, iobase+MCR);
+
+ /* Give some hits to the transceiver */
+ pc87108_change_dongle_speed( iobase, speed, idev->io.dongle_id);
+
+ /* Set FIFO threshold to TX17, RX16 */
+ switch_bank( iobase, BANK0);
+ outb( FCR_RXTH| /* Set Rx FIFO threshold */
+ FCR_TXTH| /* Set Tx FIFO threshold */
+ FCR_TXSR| /* Reset Tx FIFO */
+ FCR_RXSR| /* Reset Rx FIFO */
+ FCR_FIFO_EN, /* Enable FIFOs */
+ iobase+FCR);
+ /* outb( 0xa7, iobase+FCR); */
+
+ /* Set FIFO size to 32 */
+ switch_bank( iobase, BANK2);
+ outb( EXCR2_RFSIZ|EXCR2_TFSIZ, iobase+EXCR2);
+
+ idev->netdev.tbusy = 0;
+
+ /* Enable some interrupts so we can receive frames */
+ switch_bank( iobase, BANK0);
+ if ( speed > 115200) {
+ outb( IER_SFIF_IE, iobase+IER);
+ pc87108_dma_receive( idev);
+ } else
+ outb( IER_RXHDL_IE, iobase+IER);
+
+ /* Restore BSR */
+ outb( bank, iobase+BSR);
+}
+
+/*
+ * Function pc87108_hard_xmit (skb, dev)
+ *
+ * Transmit the frame!
+ *
+ */
+static int pc87108_hard_xmit( struct sk_buff *skb, struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 bank;
+ int mtt;
+
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+
+ if ( dev->tbusy) {
+ DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
+
+ return -EBUSY;
+ }
+
+ /* Lock transmit buffer */
+ if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+ return -EBUSY;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Decide if we should use PIO or DMA transfer */
+ if ( idev->io.baudrate > 115200) {
+ memcpy( idev->tx_buff.data, skb->data, skb->len);
+ idev->tx_buff.len = skb->len;
+ idev->tx_buff.head = idev->tx_buff.data;
+ idev->tx_buff.offset = 0;
+
+ mtt = irda_get_mtt( skb);
+ if ( mtt > 50) {
+ /* Adjust for timer resolution */
+ mtt = mtt / 125 + 1;
+
+ /* Setup timer */
+ switch_bank( iobase, BANK4);
+ outb( mtt & 0xff, iobase+TMRL);
+ outb(( mtt >> 8) & 0x0f, iobase+TMRH);
+
+ /* Start timer */
+ outb( IRCR1_TMR_EN, iobase+IRCR1);
+ idev->io.direction = IO_XMIT;
+
+ /* Enable timer interrupt */
+ switch_bank( iobase, BANK0);
+ outb( IER_TMR_IE, iobase+IER);
+ } else {
+ /* Use udelay for delays less than 50 us. */
+ if (mtt)
+ udelay( mtt);
+
+ /* Enable DMA interrupt */
+ switch_bank( iobase, BANK0);
+ outb( IER_DMA_IE, iobase+IER);
+ pc87108_dma_write( idev, iobase);
+ }
+ } else {
+ idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data,
+ idev->tx_buff.truesize);
+
+ idev->tx_buff.offset = 0;
+ idev->tx_buff.head = idev->tx_buff.data;
+
+ /* Add interrupt on tx low level (will fire immediately) */
+ switch_bank( iobase, BANK0);
+ outb( IER_TXLDL_IE, iobase+IER);
+ }
+ dev_kfree_skb( skb);
+
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ return 0;
+}
+
+/*
+ * Function pc87108_dma_xmit (idev, iobase)
+ *
+ * Transmit data using DMA
+ *
+ */
+static void pc87108_dma_write( struct irda_device *idev, int iobase)
+{
+ int bsr;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Save current bank */
+ bsr = inb( iobase+BSR);
+
+ /* Disable DMA */
+ switch_bank(iobase, BANK0);
+ outb( inb( iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
+
+ setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len,
+ DMA_MODE_WRITE);
+
+ /* idev->media_busy = TRUE; */
+ idev->io.direction = IO_XMIT;
+
+ /* Choose transmit DMA channel */
+ switch_bank(iobase, BANK2);
+ outb( inb( iobase+ECR1) | ECR1_DMASWP|ECR1_DMANF|ECR1_EXT_SL,
+ iobase+ECR1);
+
+ /* Enable DMA */
+ switch_bank( iobase, BANK0);
+ outb( inb( iobase+MCR)|MCR_DMA_EN, iobase+MCR);
+
+ /* Restore bank register */
+ outb( bsr, iobase+BSR);
+}
+
+/*
+ * Function pc87108_pio_xmit (idev, iobase)
+ *
+ * Transmit data using PIO. Returns the number of bytes that actually
+ * got transfered
+ *
+ */
+static int pc87108_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
+{
+ int actual = 0;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ switch_bank( iobase, BANK0);
+ if (!(inb_p( iobase+LSR) & LSR_TXEMP)) {
+ DEBUG( 4, __FUNCTION__ "(), warning, FIFO not empty yet!\n");
+
+ fifo_size -= 17;
+ DEBUG( 4, __FUNCTION__ "%d bytes left in tx fifo\n", fifo_size);
+ }
+
+ /* Fill FIFO with current frame */
+ while (( fifo_size-- > 0) && (actual < len)) {
+ /* Transmit next byte */
+ outb( buf[actual++], iobase+TXD);
+ }
+
+ DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n",
+ fifo_size, actual, len);
+
+ /* Restore bank */
+ outb( bank, iobase+BSR);
+
+ return actual;
+}
+
+/*
+ * Function pc87108_dma_xmit_complete (idev)
+ *
+ * The transfer of a frame in finished. This function will only be called
+ * by the interrupt handler
+ *
+ */
+static void pc87108_dma_xmit_complete( struct irda_device *idev)
+{
+ int iobase;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Disable DMA */
+ switch_bank( iobase, BANK0);
+ outb( inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
+
+ /* Check for underrrun! */
+ if ( inb( iobase+ASCR) & ASCR_TXUR) {
+ idev->stats.tx_errors++;
+ idev->stats.tx_fifo_errors++;
+
+ /* Clear bit, by writing 1 into it */
+ outb( ASCR_TXUR, iobase+ASCR);
+ } else {
+ idev->stats.tx_packets++;
+ idev->stats.tx_bytes += idev->tx_buff.len;
+ }
+
+ /* Unlock tx_buff and request another frame */
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->media_busy = FALSE;
+
+ /* Tell the network layer, that we can accept more frames */
+ mark_bh( NET_BH);
+
+ /* Restore bank */
+ outb( bank, iobase+BSR);
+}
+
+/*
+ * Function pc87108_dma_receive (idev)
+ *
+ * Get ready for receiving a frame. The device will initiate a DMA
+ * if it starts to receive a frame.
+ *
+ */
+static int pc87108_dma_receive( struct irda_device *idev)
+{
+ struct pc87108 *self;
+ int iobase;
+ __u8 bsr;
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ DEBUG( 4, __FUNCTION__ "\n");
+
+ self = idev->priv;
+ iobase= idev->io.iobase;
+
+ /* Save current bank */
+ bsr = inb( iobase+BSR);
+
+ /* Disable DMA */
+ switch_bank( iobase, BANK0);
+ outb( inb(iobase+MCR) & ~MCR_DMA_EN, iobase+MCR);
+
+ setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize,
+ DMA_MODE_READ);
+
+ /* driver->media_busy = FALSE; */
+ idev->io.direction = IO_RECV;
+ idev->rx_buff.head = idev->rx_buff.data;
+ idev->rx_buff.offset = 0;
+
+ /* Reset Rx FIFO. This will also flush the ST_FIFO */
+ outb( FCR_RXTH|FCR_TXTH|FCR_RXSR|FCR_FIFO_EN, iobase+FCR);
+ self->st_fifo.len = self->st_fifo.tail = self->st_fifo.head = 0;
+
+ /* Choose DMA Rx, DMA Fairness, and Advanced mode */
+ switch_bank(iobase, BANK2);
+ outb(( inb( iobase+ECR1) & ~ECR1_DMASWP)|ECR1_DMANF|ECR1_EXT_SL,
+ iobase+ECR1);
+
+ /* enable DMA */
+ switch_bank(iobase, BANK0);
+ outb( inb( iobase+MCR)|MCR_DMA_EN, iobase+MCR);
+
+ /* Restore bank register */
+ outb( bsr, iobase+BSR);
+
+ DEBUG( 4, __FUNCTION__ "(), done!\n");
+
+ return 0;
+}
+
+/*
+ * Function pc87108_dma_receive_complete (idev)
+ *
+ * Finished with receiving frames
+ *
+ *
+ */
+static int pc87108_dma_receive_complete( struct irda_device *idev, int iobase)
+{
+ struct sk_buff *skb;
+ struct pc87108 *self;
+ struct st_fifo *st_fifo;
+ int len;
+ __u8 bank;
+ __u8 status;
+
+ self = idev->priv;
+ st_fifo = &self->st_fifo;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ iobase = idev->io.iobase;
+
+ /* Read status FIFO */
+ switch_bank(iobase, BANK5);
+ while (( status = inb( iobase+FRM_ST)) & FRM_ST_VLD) {
+ st_fifo->entries[ st_fifo->tail].status = status;
+
+ st_fifo->entries[ st_fifo->tail].len = inb(iobase+RFLFL);
+ st_fifo->entries[ st_fifo->tail].len |= inb(iobase+RFLFH) << 8;
+
+ st_fifo->tail++;
+ st_fifo->len++;
+ }
+
+ /* Try to process all entries in status FIFO */
+ switch_bank( iobase, BANK0);
+ while ( st_fifo->len) {
+
+ /* Get first entry */
+ status = st_fifo->entries[ st_fifo->head].status;
+ len = st_fifo->entries[ st_fifo->head].len;
+ st_fifo->head++;
+ st_fifo->len--;
+
+ /* Check for errors */
+ if ( status & FRM_ST_ERR_MSK) {
+ if ( status & FRM_ST_LOST_FR) {
+ /* Add number of lost frames to stats */
+ idev->stats.rx_errors += len;
+ } else {
+ /* Skip frame */
+ idev->stats.rx_errors++;
+
+ idev->rx_buff.offset += len;
+ idev->rx_buff.head += len;
+
+ if ( status & FRM_ST_MAX_LEN)
+ idev->stats.rx_length_errors++;
+
+ if ( status & FRM_ST_PHY_ERR)
+ idev->stats.rx_frame_errors++;
+
+ if ( status & FRM_ST_BAD_CRC)
+ idev->stats.rx_crc_errors++;
+ }
+ /* The errors below can be reported in both cases */
+ if ( status & FRM_ST_OVR1)
+ idev->stats.rx_fifo_errors++;
+
+ if ( status & FRM_ST_OVR2)
+ idev->stats.rx_fifo_errors++;
+
+ } else {
+ /* Check if we have transfered all data to memory */
+ if ( inb( iobase+LSR) & LSR_RXDA) {
+ /* Put this entry back in fifo */
+ st_fifo->head--;
+ st_fifo->len++;
+ st_fifo->entries[st_fifo->head].status = status;
+ st_fifo->entries[ st_fifo->head].len = len;
+
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ return FALSE; /* I'll be back! */
+ }
+
+ /* Should be OK then */
+ skb = dev_alloc_skb( len+1);
+ if (skb == NULL) {
+ printk( KERN_INFO __FUNCTION__
+ "(), memory squeeze, dropping frame.\n");
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ return FALSE;
+ }
+
+ /* Make sure IP header gets aligned */
+ skb_reserve( skb, 1);
+
+ /* Copy frame without CRC */
+ if ( idev->io.baudrate < 4000000) {
+ skb_put( skb, len-2);
+ memcpy( skb->data, idev->rx_buff.head, len-2);
+ } else {
+ skb_put( skb, len-4);
+ memcpy( skb->data, idev->rx_buff.head, len-4);
+ }
+
+ /* Move to next frame */
+ idev->rx_buff.offset += len;
+ idev->rx_buff.head += len;
+ idev->stats.rx_packets++;
+
+ skb->dev = &idev->netdev;
+ skb->mac.raw = skb->data;
+ skb->protocol = htons(ETH_P_IRDA);
+ netif_rx( skb);
+ }
+ }
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ return TRUE;
+}
+
+/*
+ * Function pc87108_pio_receive (idev)
+ *
+ * Receive all data in receiver FIFO
+ *
+ */
+static void pc87108_pio_receive( struct irda_device *idev)
+{
+ __u8 byte = 0x00;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ if ( idev->rx_buff.len == 0) {
+ idev->rx_buff.head = idev->rx_buff.data;
+ }
+
+ /* Receive all characters in Rx FIFO */
+ do {
+ byte = inb( iobase+RXD);
+ async_unwrap_char( idev, byte);
+
+ } while ( inb( iobase+LSR) & LSR_RXDA); /* Data available */
+}
+
+/*
+ * Function pc87108_sir_interrupt (idev, eir)
+ *
+ * Handle SIR interrupt
+ *
+ */
+static __u8 pc87108_sir_interrupt( struct irda_device *idev, int eir)
+{
+ int len;
+ int actual;
+ __u8 new_ier = 0;
+
+ /* Transmit FIFO low on data */
+ if ( eir & EIR_TXLDL_EV) {
+ /* Write data left in transmit buffer */
+ len = idev->tx_buff.len - idev->tx_buff.offset;
+
+ ASSERT( len > 0, return 0;);
+ actual = pc87108_pio_write( idev->io.iobase,
+ idev->tx_buff.head,
+ len, idev->io.fifo_size);
+ idev->tx_buff.offset += actual;
+ idev->tx_buff.head += actual;
+
+ idev->io.direction = IO_XMIT;
+ ASSERT( actual <= len, return 0;);
+
+ /* Check if finished */
+ if ( actual == len) {
+ DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->stats.tx_packets++;
+
+ mark_bh(NET_BH);
+
+ new_ier |= IER_TXEMP_IE;
+ } else
+ new_ier |= IER_TXLDL_IE;
+ }
+ /* Check if transmission has completed */
+ if ( eir & EIR_TXEMP_EV) {
+
+ /* Turn around and get ready to receive some data */
+ idev->io.direction = IO_RECV;
+ new_ier |= IER_RXHDL_IE;
+ }
+
+ /* Rx FIFO threshold or timeout */
+ if ( eir & EIR_RXHDL_EV) {
+ pc87108_pio_receive( idev);
+
+ /* Keep receiving */
+ new_ier |= IER_RXHDL_IE;
+ }
+ return new_ier;
+}
+
+/*
+ * Function pc87108_fir_interrupt (idev, eir)
+ *
+ * Handle MIR/FIR interrupt
+ *
+ */
+static __u8 pc87108_fir_interrupt( struct irda_device *idev, int iobase,
+ int eir)
+{
+ __u8 new_ier = 0;
+ __u8 bank;
+
+ bank = inb( iobase+BSR);
+
+ /* Status event, or end of frame detected in FIFO */
+ if ( eir & (EIR_SFIF_EV|EIR_LS_EV)) {
+ if ( pc87108_dma_receive_complete( idev, iobase)) {
+
+ /* Wait for next status FIFO interrupt */
+ new_ier |= IER_SFIF_IE;
+ } else {
+ /* DMA not finished yet */
+
+ /* Set timer value, resolution 125 us */
+ switch_bank( iobase, BANK4);
+ outb( 0x0f, iobase+TMRL); /* 125 us */
+ outb( 0x00, iobase+TMRH);
+
+ /* Start timer */
+ outb( IRCR1_TMR_EN, iobase+IRCR1);
+
+ new_ier |= IER_TMR_IE;
+ }
+ }
+ /* Timer finished */
+ if ( eir & EIR_TMR_EV) {
+ /* Disable timer */
+ switch_bank( iobase, BANK4);
+ outb( 0, iobase+IRCR1);
+
+ /* Clear timer event */
+ switch_bank(iobase, BANK0);
+ outb( ASCR_CTE, iobase+ASCR);
+
+ /* Check if this is a TX timer interrupt */
+ if ( idev->io.direction == IO_XMIT) {
+ pc87108_dma_write( idev, iobase);
+
+ /* Interrupt on DMA */
+ new_ier |= IER_DMA_IE;
+ } else {
+ /* Check if DMA has now finished */
+ pc87108_dma_receive_complete( idev, iobase);
+
+ new_ier |= IER_SFIF_IE;
+ }
+ }
+ /* Finished with transmission */
+ if ( eir & EIR_DMA_EV) {
+ pc87108_dma_xmit_complete( idev);
+
+ /* Check if there are more frames to be transmitted */
+ if ( irda_device_txqueue_empty( idev)) {
+ /* Prepare for receive */
+ pc87108_dma_receive( idev);
+
+ new_ier = IER_LS_IE|IER_SFIF_IE;
+ }
+ }
+ outb( bank, iobase+BSR);
+
+ return new_ier;
+}
+
+/*
+ * Function pc87108_interrupt (irq, dev_id, regs)
+ *
+ * An interrupt from the chip has arrived. Time to do some work
+ *
+ */
+static void pc87108_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ __u8 bsr, eir, ier;
+ int iobase;
+
+ struct irda_device *idev = (struct irda_device *) dev_id;
+
+ if (idev == NULL) {
+ printk( KERN_WARNING "%s: irq %d for unknown device.\n",
+ driver_name, irq);
+ return;
+ }
+
+ idev->netdev.interrupt = 1;
+
+ iobase = idev->io.iobase;
+
+ /* Save current bank */
+ bsr = inb( iobase+BSR);
+
+ switch_bank( iobase, BANK0);
+ ier = inb( iobase+IER);
+ eir = inb( iobase+EIR) & ier; /* Mask out the interesting ones */
+
+ outb( 0, iobase+IER); /* Disable interrupts */
+
+ if ( eir) {
+ /* Dispatch interrupt handler for the current speed */
+ if ( idev->io.baudrate > 115200)
+ ier = pc87108_fir_interrupt( idev, iobase, eir);
+ else
+ ier = pc87108_sir_interrupt( idev, eir);
+ }
+
+ outb( ier, iobase+IER); /* Restore interrupts */
+ outb( bsr, iobase+BSR); /* Restore bank register */
+
+ idev->netdev.interrupt = 0;
+}
+
+/*
+ * Function pc87108_wait_until_sent (idev)
+ *
+ * This function should put the current thread to sleep until all data
+ * have been sent, so it is safe to f.eks. change the speed.
+ */
+static void pc87108_wait_until_sent( struct irda_device *idev)
+{
+ /* Just delay 60 ms */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(6);
+}
+
+/*
+ * Function pc87108_is_receiving (idev)
+ *
+ * Return TRUE is we are currently receiving a frame
+ *
+ */
+static int pc87108_is_receiving( struct irda_device *idev)
+{
+ int status = FALSE;
+ int iobase;
+ __u8 bank;
+
+ ASSERT( idev != NULL, return FALSE;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
+
+ if ( idev->io.baudrate > 115200) {
+ iobase = idev->io.iobase;
+
+ /* Check if rx FIFO is not empty */
+ bank = inb( iobase+BSR);
+ switch_bank( iobase, BANK2);
+ if (( inb( iobase+RXFLV) & 0x3f) != 0) {
+ /* We are receiving something */
+ status = TRUE;
+ }
+ outb( bank, iobase+BSR);
+ } else
+ status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+
+ return status;
+}
+
+/*
+ * Function pc87108_net_init (dev)
+ *
+ * Initialize network device
+ *
+ */
+static int pc87108_net_init( struct device *dev)
+{
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Setup to be a normal IrDA network device driver */
+ irda_device_setup( dev);
+
+ /* Insert overrides below this line! */
+
+ return 0;
+}
+
+
+/*
+ * Function pc87108_net_open (dev)
+ *
+ * Start the device
+ *
+ */
+static int pc87108_net_open( struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ if (request_irq( idev->io.irq, pc87108_interrupt, 0, idev->name,
+ (void *) idev)) {
+ return -EAGAIN;
+ }
+ /*
+ * Always allocate the DMA channel after the IRQ,
+ * and clean up on failure.
+ */
+ if (request_dma(idev->io.dma, idev->name)) {
+ free_irq( idev->io.irq, idev);
+ return -EAGAIN;
+ }
+
+ /* Ready to play! */
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 1;
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* turn on interrupts */
+ switch_bank( iobase, BANK0);
+ outb( IER_LS_IE | IER_RXHDL_IE, iobase+IER);
+
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+}
+
+/*
+ * Function pc87108_net_close (dev)
+ *
+ * Stop the device
+ *
+ */
+static int pc87108_net_close(struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 bank;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Stop device */
+ dev->tbusy = 1;
+ dev->start = 0;
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ disable_dma( idev->io.dma);
+
+ /* Save current bank */
+ bank = inb( iobase+BSR);
+
+ /* Disable interrupts */
+ switch_bank( iobase, BANK0);
+ outb( 0, iobase+IER);
+
+ free_irq( idev->io.irq, idev);
+ free_dma( idev->io.dma);
+
+ /* Restore bank register */
+ outb( bank, iobase+BSR);
+
+ MOD_DEC_USE_COUNT;
+
+ return 0;
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ *
+ *
+ */
+int init_module(void)
+{
+ pc87108_init();
+
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ *
+ *
+ */
+void cleanup_module(void)
+{
+ pc87108_cleanup();
+}
+
+#endif
+
diff --git a/drivers/net/irda/tekram.c b/drivers/net/irda/tekram.c
new file mode 100644
index 000000000..bdada4afa
--- /dev/null
+++ b/drivers/net/irda/tekram.c
@@ -0,0 +1,314 @@
+/*********************************************************************
+ *
+ * Filename: tekram.c
+ * Version: 0.4
+ * Description: Implementation of the Tekram IrMate IR-210B dongle
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Wed Oct 21 20:02:35 1998
+ * Modified at: Mon Jan 18 11:30:38 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1998 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/tty.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+
+#include <asm/ioctls.h>
+#include <asm/segment.h>
+#include <asm/uaccess.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irda_device.h>
+#include <net/irda/irtty.h>
+#include <net/irda/dongle.h>
+
+static void tekram_reset( struct irda_device *dev, int unused);
+static void tekram_open( struct irda_device *dev, int type);
+static void tekram_close( struct irda_device *dev);
+static void tekram_change_speed( struct irda_device *dev, int baud);
+static void tekram_init_qos( struct irda_device *idev, struct qos_info *qos);
+
+static struct dongle dongle = {
+ TEKRAM_DONGLE,
+ tekram_open,
+ tekram_close,
+ tekram_reset,
+ tekram_change_speed,
+ tekram_init_qos,
+};
+
+__initfunc(void tekram_init(void))
+{
+ irtty_register_dongle( &dongle);
+}
+
+void tekram_cleanup(void)
+{
+ irtty_unregister_dongle( &dongle);
+}
+
+static void tekram_open( struct irda_device *dev, int type)
+{
+ strcat( dev->name, " <-> tekram");
+
+ MOD_INC_USE_COUNT;
+}
+
+static void tekram_close( struct irda_device *dev)
+{
+ MOD_DEC_USE_COUNT;
+}
+
+/*
+ * Function tekram_change_speed (tty, baud)
+ *
+ * Set the speed for the Tekram IRMate 210 type dongle. Warning, this
+ * function must be called with a process context!
+ *
+ * Algorithm
+ * 1. clear DTR
+ * 2. set RTS, and wait at least 7 us
+ * 3. send Control Byte to the IR-210 through TXD to set new baud rate
+ * wait until the stop bit of Control Byte is sent (for 9600 baud rate,
+ * it takes about 100 msec)
+ * 5. clear RTS (return to NORMAL Operation)
+ * 6. wait at least 50 us, new setting (baud rate, etc) takes effect here
+ * after
+ */
+static void tekram_change_speed( struct irda_device *dev, int baud)
+{
+ struct irtty_cb *self;
+ struct tty_struct *tty;
+ struct termios old_termios;
+ int arg = 0;
+ int cflag;
+ __u8 byte;
+ int actual;
+ mm_segment_t fs;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return;);
+ ASSERT( dev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) dev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ if ( !self->tty)
+ return;
+
+ tty = self->tty;
+
+ old_termios = *(tty->termios);
+ cflag = tty->termios->c_cflag;
+
+ cflag &= ~CBAUD;
+
+ switch (baud) {
+ case 9600:
+ default:
+ cflag |= B9600;
+ byte = 4;
+ break;
+ case 19200:
+ cflag |= B19200;
+ byte = 3;
+ break;
+ case 34800:
+ cflag |= B38400;
+ byte = 2;
+ break;
+ case 57600:
+ cflag |= B57600;
+ byte = 1;
+ break;
+ case 115200:
+ cflag |= B115200;
+ byte = 0;
+ break;
+ }
+
+ /* Set DTR, Clear RTS */
+ DEBUG( 0, __FUNCTION__ "(), Setting DTR, Clearing RTS\n");
+ arg = TIOCM_DTR | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg)) {
+ DEBUG( 0, "error setting Tekram speed!\n");
+ }
+ set_fs(fs);
+
+ /* Wait at least 7us */
+ udelay( 7);
+
+ DEBUG( 0, __FUNCTION__ "(), Writing control byte\n");
+ /* Write control byte */
+ if ( tty->driver.write)
+ actual = tty->driver.write( self->tty, 0, &byte, 1);
+
+ /* Wait at least 100 ms */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout( 10);
+
+ /* Set DTR, Set RTS */
+ DEBUG( 0, __FUNCTION__ "(), Setting DTR, Setting RTS\n");
+ arg = TIOCM_DTR | TIOCM_RTS | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg)) {
+ DEBUG( 0, "error setting Tekram speed!\n");
+ }
+ set_fs(fs);
+
+ DEBUG( 0, __FUNCTION__ "(), Setting new speed on serial port\n");
+ /* Now change the speed of the serial port */
+ tty->termios->c_cflag = cflag;
+ tty->driver.set_termios( tty, &old_termios);
+}
+
+/*
+ * Function tekram_reset (driver)
+ *
+ * This function resets the tekram dongle. Warning, this function
+ * must be called with a process context!!
+ *
+ * Algorithm:
+ * 0. set RTS and DTR, and wait 50 ms
+ * ( power off the IR-210 )
+ * 1. clear RTS
+ * 2. set DTR, and wait at least 1 ms
+ * 3. clear DTR to SPACE state, wait at least 50 us for further
+ * operation
+ */
+void tekram_reset( struct irda_device *dev, int unused)
+{
+ struct irtty_cb *self;
+ struct tty_struct *tty;
+ int arg = 0;
+ mm_segment_t fs;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return;);
+ ASSERT( dev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = (struct irtty_cb *) dev->priv;
+
+ ASSERT( self != NULL, return;);
+ ASSERT( self->magic == IRTTY_MAGIC, return;);
+
+ tty = self->tty;
+ if ( !tty)
+ return;
+
+ DEBUG( 0, __FUNCTION__ "(), Power off dongle\n");
+ arg = TIOCM_RTS | TIOCM_DTR | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg))
+ {
+ DEBUG(0, "error setting ESI speed!\n");
+ }
+ set_fs(fs);
+
+ /* Sleep 50 ms */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(5);
+
+ DEBUG( 0, __FUNCTION__ "(), Set DTR, clear RTS\n");
+ /* Set DTR, clear RTS */
+ arg = TIOCM_DTR | TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET,
+ (unsigned long) &arg)) {
+ DEBUG( 0, "Error setting Tekram speed!\n");
+ }
+ set_fs(fs);
+
+ /* Should sleep 1 ms, but 10-20 should not do any harm */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(2);
+
+ DEBUG( 0, __FUNCTION__ "(), STATE3\n");
+ /* Clear DTR, clear RTS */
+ arg = TIOCM_OUT2;
+
+ fs = get_fs();
+ set_fs( get_ds());
+
+ if ( tty->driver.ioctl( tty, NULL, TIOCMSET, (unsigned long) &arg)) {
+ DEBUG( 0, "error setting Tekram speed!\n");
+ }
+ set_fs(fs);
+
+ /* Finished! */
+}
+
+/*
+ * Function tekram_init_qos (qos)
+ *
+ * Initialize QoS capabilities
+ *
+ */
+static void tekram_init_qos( struct irda_device *idev, struct qos_info *qos)
+{
+ qos->baud_rate.bits &= IR_9600|IR_19200|IR_38400|IR_57600|IR_115200;
+ qos->min_turn_time.bits &= 0xfe; /* All except 0 ms */
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ * Initialize Tekram module
+ *
+ */
+int init_module(void)
+{
+ tekram_init();
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ * Cleanup Tekram module
+ *
+ */
+void cleanup_module(void)
+{
+ tekram_cleanup();
+}
+
+#endif
diff --git a/drivers/net/irda/uircc.c b/drivers/net/irda/uircc.c
new file mode 100644
index 000000000..05da78a00
--- /dev/null
+++ b/drivers/net/irda/uircc.c
@@ -0,0 +1,914 @@
+/*********************************************************************
+ *
+ * Filename: uircc.c
+ * Version: 0.1
+ * Description: Driver for the Sharp Universal Infrared
+ * Communications Controller (UIRCC)
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Sat Dec 26 10:59:03 1998
+ * Modified at: Tue Jan 19 23:54:04 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1998 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ * Applicable Models : Tecra 510CDT, 500C Series, 530CDT, 520CDT,
+ * 740CDT, Portege 300CT, 660CDT, Satellite 220C Series,
+ * Satellite Pro, 440C Series, 470CDT, 460C Series, 480C Series
+ *
+ * Notice that FIR mode is not working yet, since I don't know
+ * how to make the UIRCC drive the interrupt line, and not the
+ * UART (which is used for SIR speeds). Please mail me if you know!
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/malloc.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/byteorder.h>
+
+#include <net/irda/wrapper.h>
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/irlap_frame.h>
+#include <net/irda/irda_device.h>
+
+#include <net/irda/uircc.h>
+#include <net/irda/irport.h>
+
+static char *driver_name = "uircc";
+
+#define CHIP_IO_EXTENT 16
+
+static unsigned int io[] = { 0x300, ~0, ~0, ~0 };
+static unsigned int io2[] = { 0x3e8, 0, 0, 0};
+static unsigned int irq[] = { 11, 0, 0, 0 };
+static unsigned int dma[] = { 5, 0, 0, 0 };
+
+static struct uircc_cb *dev_self[] = { NULL, NULL, NULL, NULL};
+
+/* Some prototypes */
+static int uircc_open( int i, unsigned int iobase, unsigned int board_addr,
+ unsigned int irq, unsigned int dma);
+static int uircc_close( struct irda_device *idev);
+static int uircc_probe( int iobase, int board_addr, int irq, int dma);
+static int uircc_dma_receive( struct irda_device *idev);
+static int uircc_dma_receive_complete(struct irda_device *idev, int iobase);
+static int uircc_hard_xmit( struct sk_buff *skb, struct device *dev);
+static void uircc_dma_write( struct irda_device *idev, int iobase);
+static void uircc_change_speed( struct irda_device *idev, int baud);
+static void uircc_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static void uircc_wait_until_sent( struct irda_device *idev);
+static int uircc_is_receiving( struct irda_device *idev);
+
+static int uircc_net_init( struct device *dev);
+static int uircc_net_open( struct device *dev);
+static int uircc_net_close( struct device *dev);
+
+/*
+ * Function uircc_init ()
+ *
+ * Initialize chip. Just try to find out how many chips we are dealing with
+ * and where they are
+ */
+__initfunc(int uircc_init(void))
+{
+ int i;
+
+ for ( i=0; (io[i] < 2000) && (i < 4); i++) {
+ int ioaddr = io[i];
+ if (check_region(ioaddr, CHIP_IO_EXTENT))
+ continue;
+ if (uircc_open( i, io[i], io2[i], irq[i], dma[i]) == 0)
+ return 0;
+ }
+ return -ENODEV;
+}
+
+/*
+ * Function uircc_cleanup ()
+ *
+ * Close all configured chips
+ *
+ */
+#ifdef MODULE
+static void uircc_cleanup(void)
+{
+ int i;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ for ( i=0; i < 4; i++) {
+ if ( dev_self[i])
+ uircc_close( &(dev_self[i]->idev));
+ }
+}
+#endif /* MODULE */
+
+/*
+ * Function uircc_open (iobase, irq)
+ *
+ * Open driver instance
+ *
+ */
+static int uircc_open( int i, unsigned int iobase, unsigned int iobase2,
+ unsigned int irq, unsigned int dma)
+{
+ struct uircc_cb *self;
+ struct irda_device *idev;
+ int ret;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ if (( uircc_probe( iobase, iobase2, irq, dma)) == -1)
+ return -1;
+
+ /*
+ * Allocate new instance of the driver
+ */
+ self = kmalloc( sizeof(struct uircc_cb), GFP_KERNEL);
+ if ( self == NULL) {
+ printk( KERN_ERR "IrDA: Can't allocate memory for "
+ "IrDA control block!\n");
+ return -ENOMEM;
+ }
+ memset( self, 0, sizeof(struct uircc_cb));
+
+ /* Need to store self somewhere */
+ dev_self[i] = self;
+
+ idev = &self->idev;
+
+ /* Initialize IO */
+ idev->io.iobase = iobase;
+ idev->io.iobase2 = iobase2; /* Used by irport */
+ idev->io.irq = irq;
+ idev->io.io_ext = CHIP_IO_EXTENT;
+ idev->io.io_ext2 = 8; /* Used by irport */
+ idev->io.dma = dma;
+ idev->io.fifo_size = 16;
+
+ /* Lock the port that we need */
+ ret = check_region( idev->io.iobase, idev->io.io_ext);
+ if ( ret < 0) {
+ DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+ idev->io.iobase);
+ /* uircc_cleanup( self->idev); */
+ return -ENODEV;
+ }
+ ret = check_region( idev->io.iobase2, idev->io.io_ext2);
+ if ( ret < 0) {
+ DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+ idev->io.iobase2);
+ /* uircc_cleanup( self->idev); */
+ return -ENODEV;
+ }
+ request_region( idev->io.iobase, idev->io.io_ext, idev->name);
+ request_region( idev->io.iobase2, idev->io.io_ext2, idev->name);
+
+ /* Initialize QoS for this device */
+ irda_init_max_qos_capabilies( &idev->qos);
+
+ /* The only value we must override it the baudrate */
+ idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
+ IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
+
+ idev->qos.min_turn_time.bits = 0x07;
+ irda_qos_bits_to_value( &idev->qos);
+
+ /* Specify which buffer allocation policy we need */
+ idev->rx_buff.flags = GFP_KERNEL | GFP_DMA;
+ idev->tx_buff.flags = GFP_KERNEL | GFP_DMA;
+
+ /* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
+ idev->rx_buff.truesize = 4000;
+ idev->tx_buff.truesize = 4000;
+
+ /* Initialize callbacks */
+ idev->hard_xmit = uircc_hard_xmit;
+ idev->change_speed = uircc_change_speed;
+ idev->wait_until_sent = uircc_wait_until_sent;
+ idev->is_receiving = uircc_is_receiving;
+
+ /* Override the network functions we need to use */
+ idev->netdev.init = uircc_net_init;
+ idev->netdev.hard_start_xmit = uircc_hard_xmit;
+ idev->netdev.open = uircc_net_open;
+ idev->netdev.stop = uircc_net_close;
+
+ irport_open( iobase2);
+
+ /* Open the IrDA device */
+ irda_device_open( idev, driver_name, self);
+
+ return 0;
+}
+
+/*
+ * Function uircc_close (idev)
+ *
+ * Close driver instance
+ *
+ */
+static int uircc_close( struct irda_device *idev)
+{
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ iobase = idev->io.iobase;
+
+ /* Disable modem */
+ outb( 0x00, iobase+UIRCC_CR10);
+
+ irport_close( idev->io.iobase2);
+
+ /* Release the PORT that this driver is using */
+ DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n", idev->io.iobase);
+ release_region( idev->io.iobase, idev->io.io_ext);
+
+ if ( idev->io.iobase2) {
+ DEBUG( 4, __FUNCTION__ "(), Releasing Region %03x\n",
+ idev->io.iobase2);
+ release_region( idev->io.iobase2, idev->io.io_ext2);
+ }
+
+ irda_device_close( idev);
+
+ return 0;
+}
+
+/*
+ * Function uircc_probe (iobase, board_addr, irq, dma)
+ *
+ * Returns non-negative on success.
+ *
+ */
+static int uircc_probe( int iobase, int iobase2, int irq, int dma)
+{
+ int version;
+ int probe_irq=0;
+ unsigned long mask;
+ int i;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* read the chip version, should be 0x03 */
+ version = inb( iobase+UIRCC_SR8);
+
+ if ( version != 0x03) {
+ DEBUG( 0, __FUNCTION__ "(), Wrong chip version");
+ return -1;
+ }
+ DEBUG( 0, "UIRCC driver loaded. Version: 0x%02x\n", version);
+
+ /* Reset chip */
+ outb( UIRCC_CR0_SYS_RST, iobase+UIRCC_CR0);
+
+ /* Initialize some registers */
+ outb( 0, iobase+UIRCC_CR11);
+ outb( 0, iobase+UIRCC_CR9);
+
+ /* Enable DMA single mode */
+ outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET,
+ iobase+UIRCC_CR1);
+
+ /* Disable interrupts */
+ outb( 0xff, iobase+UIRCC_CR2);
+
+#if 0
+ irport_close( iobase2);
+
+ for (i=0;i<1;i++) {
+
+ /* Set appropriate speed mode */
+ outb( UIRCC_CR10_FIR, iobase+UIRCC_CR10);
+
+ /* Enable DMA single mode */
+ outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET,
+ iobase+UIRCC_CR1);
+
+ /* Set up timer */
+ outb( 0x01, iobase+UIRCC_CR12);
+ outb( 0x00, iobase+UIRCC_CR13);
+
+ /* Set interrupt mask */
+ outb( 0x82, iobase+UIRCC_CR2);
+
+ DEBUG( 0, __FUNCTION__ "(*), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n",
+ inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2),
+ inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
+
+ mask = probe_irq_on();
+
+ /* Enable timer */
+ outb( 0x08, iobase+UIRCC_CR11);
+
+ udelay( 10000); /* Wait for interrupt! */
+
+ probe_irq = probe_irq_off( mask);
+
+ DEBUG( 0, "Found irq=%d\n", probe_irq);
+
+ DEBUG( 0, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x, sr12=%#x\n",
+ inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2),
+ inb( iobase+UIRCC_SR10), inb( iobase+UIRCC_SR12));
+
+
+ /* Diable timer */
+ outb( 0x00, iobase+UIRCC_CR11);
+ }
+#endif
+
+ /* Set self poll address */
+
+ return 0;
+}
+
+/*
+ * Function uircc_change_speed (idev, baud)
+ *
+ * Change the speed of the device
+ *
+ */
+static void uircc_change_speed( struct irda_device *idev, int speed)
+{
+ struct uircc_cb *self;
+ int iobase;
+ int modem = UIRCC_CR10_SIR;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = idev->priv;
+ iobase = idev->io.iobase;
+
+ /* Update accounting for new speed */
+ idev->io.baudrate = speed;
+
+ /* Disable interrupts */
+ outb( 0xff, iobase+UIRCC_CR2);
+
+ switch ( speed) {
+ case 9600:
+ case 19200:
+ case 37600:
+ case 57600:
+ case 115200:
+/* irport_open( idev->io.iobase2); */
+ irport_change_speed( idev->io.iobase2, speed);
+ modem = UIRCC_CR10_SIR;
+ break;
+ case 576000:
+
+ DEBUG(0, __FUNCTION__ "(), handling baud of 576000\n");
+ break;
+ case 1152000:
+
+ DEBUG(0, __FUNCTION__ "(), handling baud of 1152000\n");
+ break;
+ case 4000000:
+ irport_close( idev->io.iobase2);
+ modem = UIRCC_CR10_FIR;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
+ break;
+ default:
+ DEBUG( 0, __FUNCTION__ "(), unknown baud rate of %d\n", speed);
+ break;
+ }
+
+ /* Set appropriate speed mode */
+ outb( modem, iobase+UIRCC_CR10);
+
+ idev->netdev.tbusy = 0;
+
+ /* Enable some interrupts so we can receive frames */
+ if ( speed > 115200) {
+ /* Enable DMA single mode */
+ outb( UIRCC_CR1_RX_DMA|UIRCC_CR1_TX_DMA|UIRCC_CR1_MUST_SET,
+ iobase+UIRCC_CR1);
+
+ /* outb( UIRCC_CR2_RECV_MASK, iobase+UIRCC_CR2); */
+ outb( 0, iobase+UIRCC_CR2);
+ uircc_dma_receive( idev);
+ }
+}
+
+/*
+ * Function uircc_hard_xmit (skb, dev)
+ *
+ * Transmit the frame!
+ *
+ */
+static int uircc_hard_xmit( struct sk_buff *skb, struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ int mtt;
+
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ DEBUG(0, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+
+ /* Use irport for SIR speeds */
+ if ( idev->io.baudrate <= 115200) {
+ return irport_hard_xmit( skb, dev);
+ }
+
+ if ( dev->tbusy) {
+ __u8 sr3;
+
+ DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
+
+ return -EBUSY;
+ }
+
+ /* Lock transmit buffer */
+ if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+ return -EBUSY;
+
+ memcpy( idev->tx_buff.data, skb->data, skb->len);
+
+ /* Make sure that the length is a multiple of 16 bits */
+ if ( skb->len & 0x01)
+ skb->len++;
+
+ idev->tx_buff.len = skb->len;
+ idev->tx_buff.head = idev->tx_buff.data;
+ idev->tx_buff.offset = 0;
+
+ mtt = irda_get_mtt( skb);
+
+ /* Use udelay for delays less than 50 us. */
+ if (mtt)
+ udelay( mtt);
+
+ /* Enable transmit interrupts */
+ /* outb( UIRCC_CR2_XMIT_MASK, iobase+UIRCC_CR2); */
+ outb( 0, iobase+UIRCC_CR2);
+
+ uircc_dma_write( idev, iobase);
+
+ dev_kfree_skb( skb);
+
+ return 0;
+}
+
+/*
+ * Function uircc_dma_xmit (idev, iobase)
+ *
+ * Transmit data using DMA
+ *
+ */
+static void uircc_dma_write( struct irda_device *idev, int iobase)
+{
+ struct uircc_cb *self;
+ int i;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = idev->priv;
+
+ /* Receiving disable */
+ self->cr3 &= ~UIRCC_CR3_RECV_EN;
+ outb( self->cr3, iobase+UIRCC_CR3);
+
+ setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len,
+ DMA_MODE_WRITE);
+
+ DEBUG( 0, __FUNCTION__ "residue=%d\n",
+ get_dma_residue( idev->io.dma));
+
+ idev->io.direction = IO_XMIT;
+
+ /* Set frame length */
+ outb( idev->tx_buff.len & 0xff, iobase+UIRCC_CR4); /* Low byte */
+ outb( idev->tx_buff.len >> 8, iobase+UIRCC_CR5); /* High byte */
+
+ /* Enable transmit and transmit CRC */
+ self->cr3 |= (UIRCC_CR3_XMIT_EN|UIRCC_CR3_TX_CRC_EN);
+ outb( self->cr3, iobase+UIRCC_CR3);
+}
+
+/*
+ * Function uircc_dma_xmit_complete (idev)
+ *
+ * The transfer of a frame in finished. This function will only be called
+ * by the interrupt handler
+ *
+ */
+static void uircc_dma_xmit_complete( struct irda_device *idev, int underrun)
+{
+ struct uircc_cb *self;
+ int iobase;
+ int len;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ self = idev->priv;
+
+ iobase = idev->io.iobase;
+
+ /* Select TX counter */
+ outb( UIRCC_CR0_CNT_SWT, iobase+UIRCC_CR0);
+
+ /* Read TX length counter */
+ len = inb( iobase+UIRCC_SR4); /* Low byte */
+ len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+
+ /* Disable transmit */
+ self->cr3 &= ~UIRCC_CR3_XMIT_EN;
+ outb( self->cr3, iobase+UIRCC_CR3);
+
+ /* Check for underrrun! */
+ if ( underrun) {
+ idev->stats.tx_errors++;
+ idev->stats.tx_fifo_errors++;
+ } else {
+ idev->stats.tx_packets++;
+ idev->stats.tx_bytes += idev->tx_buff.len;
+ }
+
+ /* Unlock tx_buff and request another frame */
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->media_busy = FALSE;
+
+ /* Tell the network layer, that we can accept more frames */
+ mark_bh( NET_BH);
+}
+
+/*
+ * Function uircc_dma_receive (idev)
+ *
+ * Get ready for receiving a frame. The device will initiate a DMA
+ * if it starts to receive a frame.
+ *
+ */
+static int uircc_dma_receive( struct irda_device *idev)
+{
+ struct uircc_cb *self;
+ int iobase;
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ DEBUG( 0, __FUNCTION__ "\n");
+
+ self = idev->priv;
+ iobase= idev->io.iobase;
+
+ /* Disable DMA */
+
+ setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize,
+ DMA_MODE_READ);
+
+ /* driver->media_busy = FALSE; */
+ idev->io.direction = IO_RECV;
+ idev->rx_buff.head = idev->rx_buff.data;
+ idev->rx_buff.offset = 0;
+
+ /* Enable receiving with CRC */
+ self->cr3 |= (UIRCC_CR3_RECV_EN|UIRCC_CR3_RX_CRC_EN);
+ outb( self->cr3, iobase+UIRCC_CR3);
+
+ /* Address check? */
+
+ DEBUG( 4, __FUNCTION__ "(), done!\n");
+
+ return 0;
+}
+
+/*
+ * Function uircc_dma_receive_complete (idev)
+ *
+ * Finished with receiving frames
+ *
+ *
+ */
+static int uircc_dma_receive_complete( struct irda_device *idev, int iobase)
+{
+ struct sk_buff *skb;
+ struct uircc_cb *self;
+ int len;
+
+ self = idev->priv;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* Check for CRC or framing error */
+ if ( inb( iobase+UIRCC_SR0) & UIRCC_SR0_RX_CRCFRM) {
+ DEBUG( 0, __FUNCTION__ "(), crc or frm error\n");
+ return -1;
+ }
+
+ /* Select receive length counter */
+ outb( 0x00, iobase+UIRCC_CR0);
+
+ /* Read frame length */
+ len = inb( iobase+UIRCC_SR4); /* Low byte */
+ len |= inb( iobase+UIRCC_SR5) << 8; /* High byte */
+
+ DEBUG( 0, __FUNCTION__ "(), len=%d\n", len);
+
+ /* Receiving disable */
+ self->cr3 &= ~UIRCC_CR3_RECV_EN;
+ outb( self->cr3, iobase+UIRCC_CR3);
+
+ skb = dev_alloc_skb( len+1);
+ if (skb == NULL) {
+ printk( KERN_INFO __FUNCTION__
+ "(), memory squeeze, dropping frame.\n");
+ /* Restore bank register */
+ return FALSE;
+ }
+
+ /* Make sure IP header gets aligned */
+ skb_reserve( skb, 1);
+
+ /* Copy frame without CRC */
+ /* if ( idev->io.baudrate < 4000000) { */
+/* skb_put( skb, len-2); */
+/* memcpy( skb->data, idev->rx_buff.head, len-2); */
+/* } else { */
+/* skb_put( skb, len-4); */
+/* memcpy( skb->data, idev->rx_buff.head, len-4); */
+/* } */
+
+ skb_put( skb, len);
+ memcpy( skb->data, idev->rx_buff.head, len);
+ idev->stats.rx_packets++;
+
+ skb->dev = &idev->netdev;
+ skb->mac.raw = skb->data;
+ skb->protocol = htons(ETH_P_IRDA);
+ netif_rx( skb);
+
+ return TRUE;
+}
+
+/*
+ * Function uircc_interrupt (irq, dev_id, regs)
+ *
+ * An interrupt from the chip has arrived. Time to do some work
+ *
+ */
+static void uircc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ __u8 sr3;
+ int iobase;
+
+ struct irda_device *idev = (struct irda_device *) dev_id;
+
+ if (idev == NULL) {
+ printk( KERN_WARNING "%s: irq %d for unknown device.\n",
+ driver_name, irq);
+ return;
+ }
+
+ if (idev->io.baudrate <= 115200)
+ return irport_interrupt( irq, dev_id, regs);
+
+ iobase = idev->io.iobase;
+
+ /* Read interrupt status */
+ sr3 = inb( iobase+UIRCC_SR3);
+ if (!sr3) {
+ return;
+ }
+
+ idev->netdev.interrupt = 1;
+
+ DEBUG( 4, __FUNCTION__ "(), sr3=%#x, sr2=%#x, sr10=%#x\n",
+ inb( iobase+UIRCC_SR3), inb( iobase+UIRCC_SR2),
+ inb( iobase+UIRCC_SR10));
+
+ /*
+ * Check what interrupt this is. The UIRCC will not report two
+ * different interrupts at the same time!
+ */
+ switch( sr3) {
+ case UIRCC_SR3_RX_EOF: /* Check of end of frame */
+ uircc_dma_receive_complete( idev, iobase);
+ break;
+ case UIRCC_SR3_TXUR: /* Check for transmit underrun */
+ uircc_dma_xmit_complete( idev, TRUE);
+ break;
+ case UIRCC_SR3_TX_DONE:
+ uircc_dma_xmit_complete( idev, FALSE);
+ break;
+ case UIRCC_SR3_TMR_OUT:
+ /* Disable timer */
+ outb( inb( iobase+UIRCC_CR11) & ~UIRCC_CR11_TMR_EN,
+ iobase+UIRCC_CR11);
+ break;
+ default:
+ DEBUG( 0, __FUNCTION__ "(), unknown interrupt status=%#x\n",
+ sr3);
+ break;
+ }
+
+ idev->netdev.interrupt = 0;
+}
+
+/*
+ * Function uircc_wait_until_sent (idev)
+ *
+ * This function should put the current thread to sleep until all data
+ * have been sent, so it is safe to change the speed.
+ */
+static void uircc_wait_until_sent( struct irda_device *idev)
+{
+ /* Just delay 60 ms */
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(6);
+}
+
+/*
+ * Function uircc_is_receiving (idev)
+ *
+ * Return TRUE is we are currently receiving a frame
+ *
+ */
+static int uircc_is_receiving( struct irda_device *idev)
+{
+ int status = FALSE;
+ /* int iobase; */
+
+ ASSERT( idev != NULL, return FALSE;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
+
+ if ( idev->io.baudrate > 115200) {
+
+ } else
+ status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+
+ return status;
+}
+
+/*
+ * Function uircc_net_init (dev)
+ *
+ * Initialize network device
+ *
+ */
+static int uircc_net_init( struct device *dev)
+{
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Setup to be a normal IrDA network device driver */
+ irda_device_setup( dev);
+
+ /* Insert overrides below this line! */
+
+ return 0;
+}
+
+
+/*
+ * Function uircc_net_open (dev)
+ *
+ * Start the device
+ *
+ */
+static int uircc_net_open( struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ if (request_irq( idev->io.irq, uircc_interrupt, 0, idev->name,
+ (void *) idev)) {
+ return -EAGAIN;
+ }
+ /*
+ * Always allocate the DMA channel after the IRQ,
+ * and clean up on failure.
+ */
+ if (request_dma(idev->io.dma, idev->name)) {
+ free_irq( idev->io.irq, idev);
+ return -EAGAIN;
+ }
+
+ /* Ready to play! */
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 1;
+
+ /* turn on interrupts */
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+}
+
+/*
+ * Function uircc_net_close (dev)
+ *
+ * Stop the device
+ *
+ */
+static int uircc_net_close(struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Stop device */
+ dev->tbusy = 1;
+ dev->start = 0;
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ disable_dma( idev->io.dma);
+
+ /* Disable interrupts */
+
+ free_irq( idev->io.irq, idev);
+ free_dma( idev->io.dma);
+
+ MOD_DEC_USE_COUNT;
+
+ return 0;
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ *
+ *
+ */
+int init_module(void)
+{
+ uircc_init();
+
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ *
+ *
+ */
+void cleanup_module(void)
+{
+ uircc_cleanup();
+}
+
+#endif
+
diff --git a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c
new file mode 100644
index 000000000..5a7995ef7
--- /dev/null
+++ b/drivers/net/irda/w83977af_ir.c
@@ -0,0 +1,1273 @@
+/*********************************************************************
+ *
+ * Filename: w83977af_ir.c
+ * Version: 0.8
+ * Description: FIR/MIR driver for the Winbond W83977AF Super I/O chip
+ * Status: Experimental.
+ * Author: Paul VanderSpek
+ * Created at: Wed Nov 4 11:46:16 1998
+ * Modified at: Mon Dec 14 21:51:53 1998
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1998 Corel Computer Corp.
+ * Copyright (c) 1998 Dag Brattli <dagb@cs.uit.no>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Paul VanderSpek nor Corel Computer Corp. admit liability
+ * nor provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ * If you find bugs in this file, its very likely that the same bug
+ * will also be in w83977af_ir.c since the implementations is quite
+ * similar.
+ *
+ * Notice that all functions that needs to access the chip in _any_
+ * way, must save BSR register on entry, and restore it on exit.
+ * It is _very_ important to follow this policy!
+ *
+ * __u8 bank;
+ *
+ * bank = inb( iobase+BSR);
+ *
+ * do_your_stuff_here();
+ *
+ * outb( bank, iobase+BSR);
+ *
+ ********************************************************************/
+
+#include <linux/module.h>
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/ioport.h>
+#include <linux/delay.h>
+#include <linux/malloc.h>
+#include <linux/init.h>
+
+#include <asm/io.h>
+#include <asm/dma.h>
+#include <asm/byteorder.h>
+
+#include <net/irda/irda.h>
+#include <net/irda/irmod.h>
+#include <net/irda/wrapper.h>
+#include <net/irda/irda_device.h>
+#include <net/irda/w83977af.h>
+#include <net/irda/w83977af_ir.h>
+
+#define NETWINDER
+
+static char *driver_name = "w83977af_ir";
+
+#define CHIP_IO_EXTENT 8
+
+static unsigned int io[] = { 0x400, ~0, ~0, ~0 };
+static unsigned int irq[] = { 22, 0, 0, 0 };
+static unsigned int dma[] = { 0, 0, 0, 0 };
+
+static struct irda_device *dev_self[] = { NULL, NULL, NULL, NULL};
+
+/* For storing entries in the status FIFO */
+struct st_fifo_entry {
+ int status;
+ int len;
+};
+
+static struct st_fifo_entry prev;
+
+/* Some prototypes */
+static int w83977af_open( int i, unsigned int iobase, unsigned int irq,
+ unsigned int dma);
+static int w83977af_close( struct irda_device *idev);
+static int w83977af_probe( int iobase, int irq, int dma);
+static int w83977af_dma_receive(struct irda_device *idev);
+static int w83977af_dma_receive_complete(struct irda_device *idev);
+static int w83977af_hard_xmit( struct sk_buff *skb, struct device *dev);
+static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size);
+static void w83977af_dma_write( struct irda_device *idev, int iobase);
+static void w83977af_change_speed( struct irda_device *idev, int baud);
+static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static void w83977af_wait_until_sent( struct irda_device *idev);
+static int w83977af_is_receiving( struct irda_device *idev);
+
+static int w83977af_net_init( struct device *dev);
+static int w83977af_net_open( struct device *dev);
+static int w83977af_net_close( struct device *dev);
+
+/*
+ * Function w83977af_init ()
+ *
+ * Initialize chip. Just try to find out how many chips we are dealing with
+ * and where they are
+ */
+__initfunc(int w83977af_init(void))
+{
+ int i;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ prev.status = 0;
+
+ for ( i=0; (io[i] < 2000) && (i < 4); i++) {
+ int ioaddr = io[i];
+ if (check_region(ioaddr, CHIP_IO_EXTENT))
+ continue;
+ if (w83977af_open( i, io[i], irq[i], dma[i]) == 0)
+ return 0;
+ }
+ return -ENODEV;
+}
+
+/*
+ * Function w83977af_cleanup ()
+ *
+ * Close all configured chips
+ *
+ */
+#ifdef MODULE
+void w83977af_cleanup(void)
+{
+ int i;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ for ( i=0; i < 4; i++) {
+ if ( dev_self[i])
+ w83977af_close( dev_self[i]);
+ }
+}
+#endif /* MODULE */
+
+/*
+ * Function w83977af_open (iobase, irq)
+ *
+ * Open driver instance
+ *
+ */
+int w83977af_open( int i, unsigned int iobase, unsigned int irq,
+ unsigned int dma)
+{
+ struct irda_device *idev;
+ int ret;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ if ( w83977af_probe( iobase, irq, dma) == -1)
+ return -1;
+
+ /*
+ * Allocate new instance of the driver
+ */
+ idev = kmalloc( sizeof(struct irda_device), GFP_KERNEL);
+ if ( idev == NULL) {
+ printk( KERN_ERR "IrDA: Can't allocate memory for "
+ "IrDA control block!\n");
+ return -ENOMEM;
+ }
+ memset( idev, 0, sizeof(struct irda_device));
+
+ /* Need to store self somewhere */
+ dev_self[i] = idev;
+
+ /* Initialize IO */
+ idev->io.iobase = iobase;
+ idev->io.irq = irq;
+ idev->io.io_ext = CHIP_IO_EXTENT;
+ idev->io.dma = dma;
+ idev->io.fifo_size = 32;
+
+ /* Lock the port that we need */
+ ret = check_region( idev->io.iobase, idev->io.io_ext);
+ if ( ret < 0) {
+ DEBUG( 0, __FUNCTION__ "(), can't get iobase of 0x%03x\n",
+ idev->io.iobase);
+ /* w83977af_cleanup( self->idev); */
+ return -ENODEV;
+ }
+ request_region( idev->io.iobase, idev->io.io_ext, idev->name);
+
+ /* Initialize QoS for this device */
+ irda_init_max_qos_capabilies( &idev->qos);
+
+ /* The only value we must override it the baudrate */
+
+ /* FIXME: The HP HDLS-1100 does not support 1152000! */
+ idev->qos.baud_rate.bits = IR_9600|IR_19200|IR_38400|IR_57600|
+ IR_115200|IR_576000|IR_1152000|(IR_4000000 << 8);
+
+ /* The HP HDLS-1100 needs 1 ms according to the specs */
+ idev->qos.min_turn_time.bits = 0x03; /* 1ms and more */
+ irda_qos_bits_to_value( &idev->qos);
+
+ /* Specify which buffer allocation policy we need */
+ idev->rx_buff.flags = GFP_KERNEL | GFP_DMA;
+ idev->tx_buff.flags = GFP_KERNEL | GFP_DMA;
+
+ /* Max DMA buffer size needed = (data_size + 6) * (window_size) + 6; */
+ idev->rx_buff.truesize = 14384;
+ idev->tx_buff.truesize = 4000;
+
+ /* Initialize callbacks */
+ idev->hard_xmit = w83977af_hard_xmit;
+ idev->change_speed = w83977af_change_speed;
+ idev->wait_until_sent = w83977af_wait_until_sent;
+ idev->is_receiving = w83977af_is_receiving;
+
+ /* Override the network functions we need to use */
+ idev->netdev.init = w83977af_net_init;
+ idev->netdev.hard_start_xmit = w83977af_hard_xmit;
+ idev->netdev.open = w83977af_net_open;
+ idev->netdev.stop = w83977af_net_close;
+
+ /* Open the IrDA device */
+ irda_device_open( idev, driver_name, NULL);
+
+ return 0;
+}
+
+/*
+ * Function w83977af_close (idev)
+ *
+ * Close driver instance
+ *
+ */
+static int w83977af_close( struct irda_device *idev)
+{
+ int iobase;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ iobase = idev->io.iobase;
+
+ /* enter PnP configuration mode */
+ w977_efm_enter();
+
+ w977_select_device(W977_DEVICE_IR);
+
+ /* Deactivate device */
+ w977_write_reg(0x30, 0x00);
+
+ w977_efm_exit();
+
+ /* Release the PORT that this driver is using */
+ DEBUG(0 , __FUNCTION__ "(), Releasing Region %03x\n",
+ idev->io.iobase);
+ release_region( idev->io.iobase, idev->io.io_ext);
+
+ irda_device_close( idev);
+
+ return 0;
+}
+
+/*
+ * Function w83977af_probe (iobase, irq, dma)
+ *
+ * Returns non-negative on success.
+ *
+ */
+int w83977af_probe( int iobase, int irq, int dma)
+{
+ int version;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* Enter PnP configuration mode */
+ w977_efm_enter();
+
+ w977_select_device(W977_DEVICE_IR);
+
+ /* Configure PnP port, IRQ, and DMA channel */
+ w977_write_reg(0x60, (iobase >> 8) & 0xff);
+ w977_write_reg(0x61, (iobase) & 0xff);
+ w977_write_reg(0x70, 0x06);
+#ifdef NETWINDER
+ w977_write_reg(0x74, dma+1); /* Netwinder uses 1 higher than Linux */
+#else
+ w977_write_reg(0x74, dma);
+#endif
+ w977_write_reg(0x75, dma); /* Disable Tx DMA */
+
+ /* Set append hardware CRC, enable IR bank selection */
+ w977_write_reg(0xf0, APEDCRC|ENBNKSEL);
+
+ /* Activate device */
+ w977_write_reg(0x30, 0x01);
+
+ w977_efm_exit();
+
+ /* Disable Advanced mode */
+ switch_bank( iobase, SET2);
+ outb(iobase+2, 0x00);
+
+ /* Turn on UART (global) interrupts */
+ switch_bank( iobase, SET0);
+ outb( HCR_EN_IRQ, iobase+HCR);
+
+ /* Switch to advanced mode */
+ switch_bank( iobase, SET2);
+ outb( inb( iobase+ADCR1) | ADCR1_ADV_SL, iobase+ADCR1);
+
+ /* Set default IR-mode */
+ switch_bank( iobase, SET0);
+ outb( HCR_SIR, iobase+HCR);
+
+ /* Read the Advanced IR ID */
+ switch_bank(iobase, SET3);
+ version = inb( iobase+AUID);
+
+ /* Should be 0x1? */
+ if (0x10 != (version & 0xf0)) {
+ DEBUG( 0, __FUNCTION__ "(), Wrong chip version");
+ return -1;
+ }
+
+ /* Set FIFO size to 32 */
+ switch_bank( iobase, SET2);
+ outb( ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2);
+
+ /* Set FIFO threshold to TX17, RX16 */
+ switch_bank(iobase, SET0);
+ outb(UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO,iobase+UFR);
+/* outb( 0xa7, iobase+UFR); */
+
+ /* Receiver frame length */
+ switch_bank( iobase, SET4);
+ outb( 2048 & 0xff, iobase+6);
+ outb(( 2048 >> 8) & 0x1f, iobase+7);
+
+ /*
+ * Init HP HSDL-1100 transceiver.
+ *
+ * Set IRX_MSL since we have 2 * receive paths IRRX, and
+ * IRRXH. Clear IRSL0D since we want IRSL0 * to be a input pin used
+ * for IRRXH
+ *
+ * IRRX pin 37 connected to receiver
+ * IRTX pin 38 connected to transmitter
+ * FIRRX pin 39 connected to receiver (IRSL0)
+ * CIRRX pin 40 connected to pin 37
+ */
+ switch_bank( iobase, SET7);
+ outb( 0x40, iobase+7);
+
+ DEBUG(0, "W83977AF (IR) driver loaded. Version: 0x%02x\n", version);
+
+ return 0;
+}
+
+/*
+ * Function w83977af_change_speed (idev, baud)
+ *
+ * Change the speed of the device
+ *
+ */
+void w83977af_change_speed( struct irda_device *idev, int speed)
+{
+ int ir_mode = HCR_SIR;
+ int iobase;
+ __u8 set;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ /* Update accounting for new speed */
+ idev->io.baudrate = speed;
+
+ /* Save current bank */
+ set = inb( iobase+SSR);
+
+ /* Disable interrupts */
+ switch_bank( iobase, SET0);
+ outb( 0, iobase+ICR);
+
+ /* Select Set 2 */
+ switch_bank( iobase, SET2);
+
+ outb( 0x00, iobase+ABHL);
+ switch ( speed) {
+ case 9600: outb( 0x0c, iobase+ABLL); break;
+ case 19200: outb( 0x06, iobase+ABLL); break;
+ case 37600: outb( 0x03, iobase+ABLL); break;
+ case 57600: outb( 0x02, iobase+ABLL); break;
+ case 115200: outb( 0x01, iobase+ABLL); break;
+ case 576000:
+ ir_mode = HCR_MIR_576;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 576000\n");
+ break;
+ case 1152000:
+ ir_mode = HCR_MIR_1152;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 1152000\n");
+ break;
+ case 4000000:
+ ir_mode = HCR_FIR;
+ DEBUG(0, __FUNCTION__ "(), handling baud of 4000000\n");
+ break;
+ default:
+ ir_mode = HCR_FIR;
+ DEBUG( 0, __FUNCTION__ "(), unknown baud rate of %d\n", speed);
+ break;
+ }
+
+ /* Set speed mode */
+ switch_bank(iobase, SET0);
+ outb( ir_mode, iobase+HCR);
+
+ /* set FIFO size to 32 */
+ switch_bank( iobase, SET2);
+ outb( ADCR2_RXFS32|ADCR2_TXFS32, iobase+ADCR2);
+
+ /* set FIFO threshold to TX17, RX16 */
+ switch_bank(iobase, SET0);
+ outb( UFR_RXTL|UFR_TXTL|UFR_TXF_RST|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
+
+ idev->netdev.tbusy = 0;
+
+ /* Enable some interrupts so we can receive frames */
+ switch_bank(iobase, SET0);
+ if ( speed > 115200) {
+ outb( ICR_EFSFI, iobase+ICR);
+ w83977af_dma_receive( idev);
+ } else
+ outb( ICR_ERBRI, iobase+ICR);
+
+ /* Restore SSR */
+ outb( set, iobase+SSR);
+}
+
+/*
+ * Function w83977af_hard_xmit (skb, dev)
+ *
+ * Sets up a DMA transfer to send the current frame.
+ *
+ */
+int w83977af_hard_xmit( struct sk_buff *skb, struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 set;
+ int mtt;
+
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ DEBUG(4, __FUNCTION__ "(%ld), skb->len=%d\n", jiffies, (int) skb->len);
+
+ if ( dev->tbusy) {
+ DEBUG( 4, __FUNCTION__ "(), tbusy==TRUE\n");
+
+ return -EBUSY;
+ }
+
+ /* Lock transmit buffer */
+ if ( irda_lock( (void *) &dev->tbusy) == FALSE)
+ return -EBUSY;
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Decide if we should use PIO or DMA transfer */
+ if ( idev->io.baudrate > 115200) {
+ memcpy( idev->tx_buff.data, skb->data, skb->len);
+ idev->tx_buff.len = skb->len;
+ idev->tx_buff.head = idev->tx_buff.data;
+ idev->tx_buff.offset = 0;
+
+ mtt = irda_get_mtt( skb);
+ if ( mtt > 50) {
+ /* Adjust for timer resolution */
+ mtt /= 1000+1;
+
+ /* Setup timer */
+ switch_bank( iobase, SET4);
+ outb( mtt & 0xff, iobase+TMRL);
+ outb(( mtt >> 8) & 0x0f, iobase+TMRH);
+
+ /* Start timer */
+ outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+ idev->io.direction = IO_XMIT;
+
+ /* Enable timer interrupt */
+ switch_bank( iobase, SET0);
+ outb( ICR_ETMRI, iobase+ICR);
+ } else {
+ if ( mtt)
+ udelay( mtt);
+
+ /* Enable DMA interrupt */
+ switch_bank( iobase, SET0);
+ outb( ICR_EDMAI, iobase+ICR);
+ w83977af_dma_write( idev, iobase);
+ }
+ } else {
+ idev->tx_buff.len = async_wrap_skb( skb, idev->tx_buff.data,
+ idev->tx_buff.truesize);
+
+ idev->tx_buff.offset = 0;
+ idev->tx_buff.head = idev->tx_buff.data;
+
+ /* Add interrupt on tx low level (will fire immediately) */
+ switch_bank( iobase, SET0);
+ outb( ICR_ETXTHI, iobase+ICR);
+ }
+ dev_kfree_skb( skb);
+
+ /* Restore set register */
+ outb( set, iobase+SSR);
+
+ return 0;
+}
+
+
+/*
+ * Function w83977af_dma_write (idev, iobase)
+ *
+ *
+ *
+ */
+static void w83977af_dma_write( struct irda_device *idev, int iobase)
+{
+ __u8 set;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Disable DMA */
+ switch_bank(iobase, SET0);
+ outb( inb( iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
+
+ setup_dma( idev->io.dma, idev->tx_buff.data, idev->tx_buff.len,
+ DMA_MODE_WRITE);
+
+ /* idev->media_busy = TRUE; */
+ idev->io.direction = IO_XMIT;
+
+ /* Choose transmit DMA channel */
+ switch_bank(iobase, SET2);
+ outb( inb( iobase+ADCR1) | ADCR1_D_CHSW|ADCR1_DMA_F|ADCR1_ADV_SL,
+ iobase+ADCR1);
+
+ /* Enable DMA */
+ switch_bank( iobase, SET0);
+ outb( inb( iobase+HCR) | HCR_EN_DMA, iobase+HCR);
+
+ /* Restore set register */
+ outb( set, iobase+SSR);
+}
+
+/*
+ * Function w83977af_pio_write (iobase, buf, len, fifo_size)
+ *
+ *
+ *
+ */
+static int w83977af_pio_write( int iobase, __u8 *buf, int len, int fifo_size)
+{
+ int actual = 0;
+ __u8 set;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ /* Save current bank */
+ set = inb( iobase+SSR);
+
+ switch_bank( iobase, SET0);
+ if (!( inb_p( iobase+USR) & USR_TSRE)) {
+ DEBUG( 4, __FUNCTION__ "(), warning, FIFO not empty yet!\n");
+
+ fifo_size -= 17;
+ DEBUG( 4, __FUNCTION__ "%d bytes left in tx fifo\n", fifo_size);
+ }
+
+ /* Fill FIFO with current frame */
+ while (( fifo_size-- > 0) && (actual < len)) {
+ /* Transmit next byte */
+ outb( buf[actual++], iobase+TBR);
+ }
+
+ DEBUG( 4, __FUNCTION__ "(), fifo_size %d ; %d sent of %d\n",
+ fifo_size, actual, len);
+
+ /* Restore bank */
+ outb( set, iobase+SSR);
+
+ return actual;
+}
+
+/*
+ * Function w83977af_dma_xmit_complete (idev)
+ *
+ * The transfer of a frame in finished. So do the necessary things
+ *
+ *
+ */
+void w83977af_dma_xmit_complete( struct irda_device *idev)
+{
+ int iobase;
+ __u8 set;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Disable DMA */
+ switch_bank(iobase, SET0);
+ outb( inb(iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
+
+ /* Check for underrrun! */
+ if ( inb( iobase+AUDR) & AUDR_UNDR) {
+ DEBUG( 0, __FUNCTION__ "(), Transmit underrun!\n");
+
+ idev->stats.tx_errors++;
+ idev->stats.tx_fifo_errors++;
+
+ /* Clear bit, by writing 1 to it */
+ outb( AUDR_UNDR, iobase+AUDR);
+ } else
+ idev->stats.tx_packets++;
+
+ /* Unlock tx_buff and request another frame */
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->media_busy = FALSE;
+
+ /* Tell the network layer, that we want more frames */
+ mark_bh( NET_BH);
+
+ /* Restore set */
+ outb( set, iobase+SSR);
+}
+
+/*
+ * Function w83977af_dma_receive (idev)
+ *
+ * Get ready for receiving a frame. The device will initiate a DMA
+ * if it starts to receive a frame.
+ *
+ */
+int w83977af_dma_receive( struct irda_device *idev)
+{
+ int iobase;
+ __u8 set;
+#ifdef NETWINDER
+ unsigned long flags;
+ __u8 hcr;
+#endif
+
+ ASSERT( idev != NULL, return -1;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return -1;);
+
+ DEBUG( 0, __FUNCTION__ "\n");
+
+ iobase= idev->io.iobase;
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Disable DMA */
+ switch_bank( iobase, SET0);
+ outb( inb( iobase+HCR) & ~HCR_EN_DMA, iobase+HCR);
+
+#ifdef NETWINDER
+ save_flags(flags);
+ cli();
+
+ disable_dma( idev->io.dma);
+ clear_dma_ff( idev->io.dma);
+ set_dma_mode( idev->io.dma, DMA_MODE_READ);
+ set_dma_addr( idev->io.dma, virt_to_bus(idev->rx_buff.data));
+ set_dma_count( idev->io.dma, idev->rx_buff.truesize);
+#else
+ setup_dma( idev->io.dma, idev->rx_buff.data, idev->rx_buff.truesize,
+ DMA_MODE_READ);
+#endif
+ /* driver->media_busy = FALSE; */
+ idev->io.direction = IO_RECV;
+ idev->rx_buff.head = idev->rx_buff.data;
+ idev->rx_buff.offset = 0;
+
+ /*
+ * Reset Rx FIFO. This will also flush the ST_FIFO, it's very
+ * important that we don't reset the Tx FIFO since it might not
+ * be finished transmitting yet
+ */
+ outb( UFR_RXTL|UFR_TXTL|UFR_RXF_RST|UFR_EN_FIFO, iobase+UFR);
+ prev.status = 0;
+
+ /* Choose DMA Rx, DMA Fairness, and Advanced mode */
+ switch_bank(iobase, SET2);
+ outb(( inb( iobase+ADCR1) & ~ADCR1_D_CHSW)|ADCR1_DMA_F|ADCR1_ADV_SL,
+ iobase+ADCR1);
+
+ /* Enable DMA */
+ switch_bank(iobase, SET0);
+#ifdef NETWINDER
+ hcr = inb( iobase+HCR);
+ enable_dma( idev->io.dma);
+ outb( hcr | HCR_EN_DMA, iobase+HCR);
+ restore_flags(flags);
+#else
+ outb( inb( iobase+HCR) | HCR_EN_DMA, iobase+HCR);
+#endif
+
+ /* Restore set */
+ outb( set, iobase+SSR);
+
+ DEBUG( 4, __FUNCTION__ "(), done!\n");
+
+ return 0;
+}
+
+/*
+ * Function w83977af_receive_complete (idev)
+ *
+ * Finished with receiving a frame
+ *
+ */
+int w83977af_dma_receive_complete(struct irda_device *idev)
+{
+ struct sk_buff *skb;
+ int len;
+ int iobase;
+ __u8 set;
+ __u8 status;
+
+ DEBUG( 0, __FUNCTION__ "\n");
+
+ iobase = idev->io.iobase;
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ iobase = idev->io.iobase;
+
+ switch_bank(iobase, SET5);
+ if ( prev.status & FS_FO_FSFDR) {
+ status = prev.status;
+ len = prev.len;
+
+ prev.status = 0;
+ } else {
+ status = inb( iobase+FS_FO);
+ len = inb( iobase+RFLFL);
+ len |= inb( iobase+RFLFH) << 8;
+ }
+
+ while ( status & FS_FO_FSFDR) {
+ /* Check for errors */
+ if ( status & FS_FO_ERR_MSK) {
+ if ( status & FS_FO_LST_FR) {
+ /* Add number of lost frames to stats */
+ idev->stats.rx_errors += len;
+ } else {
+ /* Skip frame */
+ idev->stats.rx_errors++;
+
+ idev->rx_buff.offset += len;
+ idev->rx_buff.head += len;
+
+ if ( status & FS_FO_MX_LEX)
+ idev->stats.rx_length_errors++;
+
+ if ( status & FS_FO_PHY_ERR)
+ idev->stats.rx_frame_errors++;
+
+ if ( status & FS_FO_CRC_ERR)
+ idev->stats.rx_crc_errors++;
+ }
+ /* The errors below can be reported in both cases */
+ if ( status & FS_FO_RX_OV)
+ idev->stats.rx_fifo_errors++;
+
+ if ( status & FS_FO_FSF_OV)
+ idev->stats.rx_fifo_errors++;
+
+ } else {
+ /* Check if we have transfered all data to memory */
+ switch_bank(iobase, SET0);
+ if ( inb( iobase+USR) & USR_RDR) {
+ /* Put this entry back in fifo */
+ prev.status = status;
+ prev.len = len;
+
+ /* Restore set register */
+ outb( set, iobase+SSR);
+
+ return FALSE; /* I'll be back! */
+ }
+
+ skb = dev_alloc_skb( len+1);
+ if (skb == NULL) {
+ printk( KERN_INFO __FUNCTION__
+ "(), memory squeeze, dropping frame.\n");
+ /* Restore set register */
+ outb( set, iobase+SSR);
+
+ return FALSE;
+ }
+
+ /* Align to 20 bytes */
+ skb_reserve( skb, 1);
+
+ /* Copy frame without CRC */
+ if ( idev->io.baudrate < 4000000) {
+ skb_put( skb, len-2);
+ memcpy( skb->data, idev->rx_buff.head, len-2);
+ } else {
+ skb_put( skb, len-4);
+ memcpy( skb->data, idev->rx_buff.head, len-4);
+ }
+
+ /* Move to next frame */
+ idev->rx_buff.offset += len;
+ idev->rx_buff.head += len;
+
+ skb->dev = &idev->netdev;
+ skb->mac.raw = skb->data;
+ skb->protocol = htons(ETH_P_IRDA);
+ netif_rx( skb);
+ idev->stats.rx_packets++;
+ }
+ /* Read next entry in ST_FIFO */
+ switch_bank(iobase, SET5);
+ status = inb( iobase+FS_FO);
+ len = inb( iobase+RFLFL);
+ len |= inb( iobase+RFLFH) << 8;
+ }
+ /* Restore set register */
+ outb( set, iobase+SSR);
+
+ return TRUE;
+}
+
+/*
+ * Function pc87108_pio_receive (idev)
+ *
+ * Receive all data in receiver FIFO
+ *
+ */
+static void w83977af_pio_receive( struct irda_device *idev)
+{
+ __u8 byte = 0x00;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "()\n");
+
+ ASSERT( idev != NULL, return;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return;);
+
+ iobase = idev->io.iobase;
+
+ if ( idev->rx_buff.len == 0) {
+ idev->rx_buff.head = idev->rx_buff.data;
+ }
+
+ /* Receive all characters in Rx FIFO */
+ do {
+ byte = inb( iobase+RBR);
+ async_unwrap_char( idev, byte);
+
+ } while ( inb( iobase+USR) & USR_RDR); /* Data available */
+}
+
+/*
+ * Function w83977af_sir_interrupt (idev, eir)
+ *
+ * Handle SIR interrupt
+ *
+ */
+static __u8 w83977af_sir_interrupt( struct irda_device *idev, int isr)
+{
+ int len;
+ int actual;
+ __u8 new_icr = 0;
+
+ DEBUG( 4, __FUNCTION__ "(), isr=%#x\n", isr);
+
+ /* Transmit FIFO low on data */
+ if ( isr & ISR_TXTH_I) {
+ /* Write data left in transmit buffer */
+ len = idev->tx_buff.len - idev->tx_buff.offset;
+
+ ASSERT( len > 0, return 0;);
+ actual = w83977af_pio_write( idev->io.iobase,
+ idev->tx_buff.head,
+ len, idev->io.fifo_size);
+ idev->tx_buff.offset += actual;
+ idev->tx_buff.head += actual;
+
+ idev->io.direction = IO_XMIT;
+ ASSERT( actual <= len, return 0;);
+ /* Check if finished */
+ if ( actual == len) {
+ DEBUG( 4, __FUNCTION__ "(), finished with frame!\n");
+ idev->netdev.tbusy = 0; /* Unlock */
+ idev->stats.tx_packets++;
+
+ /* Schedule network layer */
+ mark_bh(NET_BH);
+
+ new_icr |= ICR_ETBREI;
+ } else
+ new_icr |= ICR_ETXTHI;
+ }
+ /* Check if transmission has completed */
+ if ( isr & ISR_TXEMP_I) {
+
+ /* Turn around and get ready to receive some data */
+ idev->io.direction = IO_RECV;
+ new_icr |= ICR_ERBRI;
+ }
+
+ /* Rx FIFO threshold or timeout */
+ if ( isr & ISR_RXTH_I) {
+ w83977af_pio_receive( idev);
+
+ /* Keep receiving */
+ new_icr |= ICR_ERBRI;
+ }
+ return new_icr;
+}
+
+/*
+ * Function pc87108_fir_interrupt (idev, eir)
+ *
+ * Handle MIR/FIR interrupt
+ *
+ */
+static __u8 w83977af_fir_interrupt( struct irda_device *idev, int isr)
+{
+ __u8 new_icr = 0;
+ __u8 set;
+ int iobase;
+
+ DEBUG( 4, __FUNCTION__ "(), isr=%#x\n", isr);
+
+ iobase = idev->io.iobase;
+
+ set = inb( iobase+SSR);
+
+ /* End of frame detected in FIFO */
+ if ( isr & (ISR_FEND_I|ISR_FSF_I)) {
+ if ( w83977af_dma_receive_complete( idev)) {
+
+ new_icr |= ICR_EFSFI;
+ } else {
+ /* DMA not finished yet */
+
+ /* Set timer value, resolution 1 ms */
+ switch_bank( iobase, SET4);
+ outb( 0x01, iobase+TMRL); /* 1 ms */
+ outb( 0x00, iobase+TMRH);
+
+ /* Start timer */
+ outb( IR_MSL_EN_TMR, iobase+IR_MSL);
+
+ new_icr |= ICR_ETMRI;
+ }
+ }
+ /* Timer finished */
+ if ( isr & ISR_TMR_I) {
+ /* Disable timer */
+ switch_bank( iobase, SET4);
+ outb( 0, iobase+IR_MSL);
+
+ /* Clear timer event */
+ /* switch_bank(iobase, SET0); */
+/* outb( ASCR_CTE, iobase+ASCR); */
+
+ /* Check if this is a TX timer interrupt */
+ if ( idev->io.direction == IO_XMIT) {
+ w83977af_dma_write( idev, iobase);
+
+ new_icr |= ICR_EDMAI;
+ } else {
+ /* Check if DMA has now finished */
+ w83977af_dma_receive_complete( idev);
+
+ new_icr |= ICR_EFSFI;
+ }
+ }
+ /* Finished with DMA */
+ if ( isr & ISR_DMA_I) {
+ w83977af_dma_xmit_complete( idev);
+
+ /* Check if there are more frames to be transmitted */
+ if ( irda_device_txqueue_empty( idev)) {
+
+ /* Prepare for receive */
+ w83977af_dma_receive( idev);
+ new_icr = ICR_EFSFI;
+ }
+ }
+
+ /* Restore set */
+ outb( set, iobase+SSR);
+
+ return new_icr;
+}
+
+/*
+ * Function pc87108_interrupt (irq, dev_id, regs)
+ *
+ * An interrupt from the chip has arrived. Time to do some work
+ *
+ */
+static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+ __u8 set, icr, isr;
+ int iobase;
+
+ struct irda_device *idev = (struct irda_device *) dev_id;
+
+ if ( idev == NULL) {
+ printk( KERN_WARNING "%s: irq %d for unknown device.\n",
+ driver_name, irq);
+ return;
+ }
+
+ idev->netdev.interrupt = 1;
+
+ iobase = idev->io.iobase;
+
+ /* Save current bank */
+ set = inb( iobase+SSR);
+ switch_bank( iobase, SET0);
+
+ icr = inb( iobase+ICR);
+ isr = inb( iobase+ISR) & icr; /* Mask out the interesting ones */
+
+ outb( 0, iobase+ICR); /* Disable interrupts */
+
+ if ( isr) {
+ /* Dispatch interrupt handler for the current speed */
+ if ( idev->io.baudrate > 115200)
+ icr = w83977af_fir_interrupt( idev, isr);
+ else
+ icr = w83977af_sir_interrupt( idev, isr);
+ }
+
+ outb( icr, iobase+ICR); /* Restore (new) interrupts */
+ outb( set, iobase+SSR); /* Restore bank register */
+
+ idev->netdev.interrupt = 0;
+}
+
+/*
+ * Function w83977af_wait_until_sent (idev)
+ *
+ * This function should put the current thread to sleep until all data
+ * have been sent, so it is safe to f.eks. change the speed.
+ */
+static void w83977af_wait_until_sent( struct irda_device *idev)
+{
+ current->state = TASK_INTERRUPTIBLE;
+ schedule_timeout(6);
+}
+
+/*
+ * Function w83977af_is_receiving (idev)
+ *
+ * Return TRUE is we are currently receiving a frame
+ *
+ */
+static int w83977af_is_receiving( struct irda_device *idev)
+{
+ int status = FALSE;
+ int iobase;
+ __u8 set;
+
+ ASSERT( idev != NULL, return FALSE;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return FALSE;);
+
+ if ( idev->io.baudrate > 115200) {
+ iobase = idev->io.iobase;
+
+ /* Check if rx FIFO is not empty */
+ set = inb( iobase+SSR);
+ switch_bank( iobase, SET2);
+ if (( inb( iobase+RXFDTH) & 0x3f) != 0) {
+ /* We are receiving something */
+ status = TRUE;
+ }
+ outb( set, iobase+SSR);
+ } else
+ status = ( idev->rx_buff.state != OUTSIDE_FRAME);
+
+ return status;
+}
+
+/*
+ * Function w83977af_net_init (dev)
+ *
+ *
+ *
+ */
+static int w83977af_net_init( struct device *dev)
+{
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* Set up to be a normal IrDA network device driver */
+ irda_device_setup( dev);
+
+ /* Insert overrides below this line! */
+
+ return 0;
+}
+
+
+/*
+ * Function w83977af_net_open (dev)
+ *
+ * Start the device
+ *
+ */
+static int w83977af_net_open( struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 set;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ if (request_irq( idev->io.irq, w83977af_interrupt, 0, idev->name,
+ (void *) idev)) {
+ return -EAGAIN;
+ }
+ /*
+ * Always allocate the DMA channel after the IRQ,
+ * and clean up on failure.
+ */
+ if (request_dma(idev->io.dma, idev->name)) {
+ free_irq( idev->io.irq, idev);
+ return -EAGAIN;
+ }
+
+ /* Ready to play! */
+ dev->tbusy = 0;
+ dev->interrupt = 0;
+ dev->start = 1;
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Enable some interrupts so we can receive frames again */
+ switch_bank(iobase, SET0);
+ if ( idev->io.baudrate > 115200) {
+ outb( ICR_EFSFI, iobase+ICR);
+ w83977af_dma_receive( idev);
+ } else
+ outb( ICR_ERBRI, iobase+ICR);
+
+ /* Restore bank register */
+ outb( set, iobase+SSR);
+
+ MOD_INC_USE_COUNT;
+
+ return 0;
+}
+
+/*
+ * Function w83977af_net_close (dev)
+ *
+ * Stop the device
+ *
+ */
+static int w83977af_net_close(struct device *dev)
+{
+ struct irda_device *idev;
+ int iobase;
+ __u8 set;
+
+ DEBUG( 0, __FUNCTION__ "()\n");
+
+ /* Stop device */
+ dev->tbusy = 1;
+ dev->start = 0;
+
+ ASSERT( dev != NULL, return -1;);
+ idev = (struct irda_device *) dev->priv;
+
+ ASSERT( idev != NULL, return 0;);
+ ASSERT( idev->magic == IRDA_DEVICE_MAGIC, return 0;);
+
+ iobase = idev->io.iobase;
+
+ disable_dma( idev->io.dma);
+
+ /* Save current set */
+ set = inb( iobase+SSR);
+
+ /* Disable interrupts */
+ switch_bank( iobase, SET0);
+ outb( 0, iobase+ICR);
+
+ free_irq( idev->io.irq, idev);
+ free_dma( idev->io.dma);
+
+ /* Restore bank register */
+ outb( set, iobase+SSR);
+
+ MOD_DEC_USE_COUNT;
+
+ return 0;
+}
+
+#ifdef MODULE
+
+/*
+ * Function init_module (void)
+ *
+ *
+ *
+ */
+int init_module(void)
+{
+ w83977af_init();
+
+ return(0);
+}
+
+/*
+ * Function cleanup_module (void)
+ *
+ *
+ *
+ */
+void cleanup_module(void)
+{
+ w83977af_cleanup();
+}
+
+#endif
diff --git a/drivers/net/lance.c b/drivers/net/lance.c
index 15f7f9ad7..659983655 100644
--- a/drivers/net/lance.c
+++ b/drivers/net/lance.c
@@ -1,6 +1,6 @@
-/* lance.c: An AMD LANCE ethernet driver for linux. */
+/* lance.c: An AMD LANCE/PCnet ethernet driver for Linux. */
/*
- Written 1993,1994,1995 by Donald Becker.
+ Written/copyright 1993-1998 by Donald Becker.
Copyright 1993 United States Government as represented by the
Director, National Security Agency.
@@ -8,13 +8,12 @@
of the GNU Public License, incorporated herein by reference.
This driver is for the Allied Telesis AT1500 and HP J2405A, and should work
- with most other LANCE-based bus-master (NE2100 clone) ethercards.
+ with most other LANCE-based bus-master (NE2100/NE2500) ethercards.
The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
Center of Excellence in Space Data and Information Sciences
Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771
-
Fixing alignment problem with 1.3.* kernel and some minor changes
by Andrey V. Savochkin, 1996.
@@ -28,14 +27,28 @@
But I should to inform you that I'm not an expert in the LANCE card
and it may occurs that you will receive no answer on your mail
to Donald Becker. I didn't receive any answer on all my letters
- to him. Who knows why... But may be you are more lucky? ;-)
+ to him. Who knows why... But may be you are more lucky? ;->
SAW
- Fixed 7990 autoIRQ failure and reversed unneeded alignment. 8/20/96 djb
+
+ Thomas Bogendoerfer (tsbogend@bigbug.franken.de):
+ - added support for Linux/Alpha, but removed most of it, because
+ it worked only for the PCI chip.
+ - added hook for the 32bit lance driver
+ - added PCnetPCI II (79C970A) to chip table
+ Paul Gortmaker (gpg109@rsphy1.anu.edu.au):
+ - hopefully fix above so Linux/Alpha can use ISA cards too.
+ 8/20/96 Fixed 7990 autoIRQ failure and reversed unneeded alignment -djb
+ v1.12 10/27/97 Module support -djb
+ v1.14 2/3/98 Module support modified, made PCI support optional -djb
+
+ Forward ported v1.14 to 2.1.129, merged the PCI and misc changes from
+ the 2.1 version of the old driver - Alan Cox
*/
-static const char *version = "lance.c:v1.09 Aug 20 1996 dplatt@3do.com, becker@cesdis.gsfc.nasa.gov\n";
+static const char *version = "lance.c:v1.14ac 1998/11/20 dplatt@3do.com, becker@cesdis.gsfc.nasa.gov\n";
#include <linux/config.h>
+#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
@@ -54,13 +67,9 @@ static const char *version = "lance.c:v1.09 Aug 20 1996 dplatt@3do.com, becker@c
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
-static unsigned int lance_portlist[] __initdata = {0x300, 0x320, 0x340, 0x360, 0};
-void lance_probe1(int ioaddr);
-
-#ifdef HAVE_DEVLIST
-struct netdev_entry lance_drv =
-{"lance", lance_probe1, LANCE_TOTAL_SIZE, lance_portlist};
-#endif
+static unsigned int lance_portlist[] __initdata = { 0x300, 0x320, 0x340, 0x360, 0};
+int lance_probe(struct device *dev);
+int lance_probe1(struct device *dev, int ioaddr, int irq, int options);
#ifdef LANCE_DEBUG
int lance_debug = LANCE_DEBUG;
@@ -96,7 +105,7 @@ of the otherwise-unused dev->mem_start value (aka PARAM1). If unset it is
probed for by enabling each free DMA channel in turn and checking if
initialization succeeds.
-The HP-J2405A board is an exception: with this board it's easy to read the
+The HP-J2405A board is an exception: with this board it is easy to read the
EEPROM-set values for the base, IRQ, and DMA. (Of course you must already
_know_ the base address -- that field is for writing the EEPROM.)
@@ -147,36 +156,19 @@ queue slot is empty, it clears the tbusy flag when finished otherwise it sets
the 'lp->tx_full' flag.
The interrupt handler has exclusive control over the Rx ring and records stats
-from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so
+from the Tx ring. (The Tx-done interrupt can't be selectively turned off, so
we can't avoid the interrupt overhead by having the Tx routine reap the Tx
stats.) After reaping the stats, it marks the queue entry as empty by setting
-the 'base' to zero. Iff the 'lp->tx_full' flag is set, it clears both the
+the 'base' to zero. Iff the 'lp->tx_full' flag is set, it clears both the
tx_full and tbusy flags.
*/
-/* Memory accessed from LANCE card must be aligned on 8-byte boundaries.
- But we can't believe that kmalloc()'ed memory satisfies it. -- SAW */
-#define LANCE_KMALLOC(x) \
- ((void *) (((unsigned long)kmalloc((x)+7, GFP_DMA | GFP_KERNEL)+7) & ~7))
-
-/*
- * Changes:
- * Thomas Bogendoerfer (tsbogend@alpha.franken.de):
- * - added support for Linux/Alpha, but removed most of it, because
- * it worked only for the PCI chip.
- * - added hook for the 32bit lance driver
- * - added PCnetPCI II (79C970A) to chip table
- * - made 32bit driver standalone
- * - changed setting of autoselect bit
- *
- * Paul Gortmaker (gpg109@rsphy1.anu.edu.au):
- * - hopefully fix above so Linux/Alpha can use ISA cards too.
- */
-
/* Set the number of Tx and Rx buffers, using Log_2(# buffers).
Reasonable default values are 16 Tx buffers, and 16 Rx buffers.
- That translates to 4 and 4 (16 == 2^^4). */
+ That translates to 4 and 4 (16 == 2^^4).
+ This is a compile-time option for efficiency.
+ */
#ifndef LANCE_LOG_TX_BUFFERS
#define LANCE_LOG_TX_BUFFERS 4
#define LANCE_LOG_RX_BUFFERS 4
@@ -230,6 +222,8 @@ struct lance_private {
const char *name;
/* The saved address of a sent-in-place packet/buffer, for skfree(). */
struct sk_buff* tx_skbuff[TX_RING_SIZE];
+ /* The addresses of receive-in-place skbuffs. */
+ struct sk_buff* rx_skbuff[RX_RING_SIZE];
unsigned long rx_buffs; /* Address of Rx and Tx buffers. */
/* Tx low-memory "bounce buffer" address. */
char (*tx_bounce_buffs)[PKT_BUF_SZ];
@@ -247,7 +241,6 @@ struct lance_private {
#define LANCE_MUST_REINIT_RING 0x00000004
#define LANCE_MUST_UNRESET 0x00000008
#define LANCE_HAS_MISSED_FRAME 0x00000010
-#define PCNET32_POSSIBLE 0x00000020
/* A mapping from the chip ID number to the part number and features.
These are from the datasheets -- in real life the '970 version
@@ -267,21 +260,15 @@ static struct lance_chip_type {
LANCE_HAS_MISSED_FRAME},
{0x2420, "PCnet/PCI 79C970", /* 79C970 or 79C974 PCnet-SCSI, PCI. */
LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- LANCE_HAS_MISSED_FRAME + PCNET32_POSSIBLE},
+ LANCE_HAS_MISSED_FRAME},
/* Bug: the PCnet/PCI actually uses the PCnet/VLB ID number, so just call
it the PCnet32. */
{0x2430, "PCnet32", /* 79C965 PCnet for VL bus. */
LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- LANCE_HAS_MISSED_FRAME + PCNET32_POSSIBLE},
+ LANCE_HAS_MISSED_FRAME},
{0x2621, "PCnet/PCI-II 79C970A", /* 79C970A PCInetPCI II. */
LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- LANCE_HAS_MISSED_FRAME + PCNET32_POSSIBLE},
- {0x2623, "PCnet/FAST 79C971", /* 79C971 PCInetFAST. */
- LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- LANCE_HAS_MISSED_FRAME + PCNET32_POSSIBLE},
- {0x2624, "PCnet/FAST+ 79C972", /* 79C972 PCInetFAST+. */
- LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
- LANCE_HAS_MISSED_FRAME + PCNET32_POSSIBLE},
+ LANCE_HAS_MISSED_FRAME},
{0x0, "PCnet (unknown)",
LANCE_ENABLE_AUTOSELECT + LANCE_MUST_REINIT_RING +
LANCE_HAS_MISSED_FRAME},
@@ -298,7 +285,7 @@ static unsigned char lance_need_isa_bounce_buffers = 1;
static int lance_open(struct device *dev);
static int lance_open_fail(struct device *dev);
-static void lance_init_ring(struct device *dev);
+static void lance_init_ring(struct device *dev, int mode);
static int lance_start_xmit(struct sk_buff *skb, struct device *dev);
static int lance_rx(struct device *dev);
static void lance_interrupt(int irq, void *dev_id, struct pt_regs *regs);
@@ -308,24 +295,88 @@ static void set_multicast_list(struct device *dev);
-/* This lance probe is unlike the other board probes in 1.0.*. The LANCE may
- have to allocate a contiguous low-memory region for bounce buffers.
- This requirement is satisfied by having the lance initialization occur
- before the memory management system is started, and thus well before the
- other probes. */
+#ifdef MODULE
+#define MAX_CARDS 8 /* Max number of interfaces (cards) per module */
+#define IF_NAMELEN 8 /* # of chars for storing dev->name */
+
+static int io[MAX_CARDS] = { 0, };
+static int dma[MAX_CARDS] = { 0, };
+static int irq[MAX_CARDS] = { 0, };
-__initfunc(int lance_init(void))
+MODULE_PARM(io, "1-" __MODULE_STRING(MAX_CARDS) "i");
+MODULE_PARM(dma, "1-" __MODULE_STRING(MAX_CARDS) "i");
+MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_CARDS) "i");
+
+static char ifnames[MAX_CARDS][IF_NAMELEN] = { {0, }, };
+static struct device dev_lance[MAX_CARDS] =
+{{
+ 0, /* device name is inserted by linux/drivers/net/net_init.c */
+ 0, 0, 0, 0,
+ 0, 0,
+ 0, 0, 0, NULL, NULL}};
+
+int init_module(void)
+{
+ int this_dev, found = 0;
+
+ for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
+ struct device *dev = &dev_lance[this_dev];
+ dev->name = ifnames[this_dev];
+ dev->irq = irq[this_dev];
+ dev->base_addr = io[this_dev];
+ dev->dma = dma[this_dev];
+ dev->init = lance_probe;
+ if (io[this_dev] == 0) {
+ if (this_dev != 0) break; /* only complain once */
+ printk(KERN_NOTICE "lance.c: Module autoprobing not allowed. Append \"io=0xNNN\" value(s).\n");
+ return -EPERM;
+ }
+ if (register_netdev(dev) != 0) {
+ printk(KERN_WARNING "lance.c: No PCnet/LANCE card found (i/o = 0x%x).\n", io[this_dev]);
+ if (found != 0) return 0; /* Got at least one. */
+ return -ENXIO;
+ }
+ found++;
+ }
+
+ return 0;
+}
+
+void cleanup_module(void)
{
- int *port;
+ int this_dev;
+
+ for (this_dev = 0; this_dev < MAX_CARDS; this_dev++) {
+ struct device *dev = &dev_lance[this_dev];
+ if (dev->priv != NULL) {
+ kfree(dev->priv);
+ dev->priv = NULL;
+ free_dma(dev->dma);
+ release_region(dev->base_addr, LANCE_TOTAL_SIZE);
+ unregister_netdev(dev);
+ }
+ }
+}
+#endif /* MODULE */
- if (virt_to_bus(high_memory) <= 16*1024*1024)
+/* Starting in v2.1.*, the LANCE/PCnet probe is now similar to the other
+ board probes now that kmalloc() can allocate ISA DMA-able regions.
+ This also allows the LANCE driver to be used as a module.
+ */
+int lance_probe(struct device *dev)
+{
+ int *port, result;
+
+ if (high_memory <= phys_to_virt(16*1024*1024))
lance_need_isa_bounce_buffers = 0;
-#if defined(CONFIG_PCI) && !(defined(CONFIG_PCNET32) || defined(CONFIG_PCNET32_MODULE))
- if (pci_present()) {
- struct pci_dev *pdev = NULL;
+#if defined(CONFIG_PCI)
+ if (pci_present())
+ {
+ struct pci_dev *pdev = NULL;
if (lance_debug > 1)
- printk("lance.c: PCI is present, checking for devices...\n");
+ printk("lance.c: PCI bios is present, checking for devices...\n");
+
while ((pdev = pci_find_device(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, pdev))) {
unsigned int pci_ioaddr;
unsigned short pci_command;
@@ -344,8 +395,9 @@ __initfunc(int lance_init(void))
}
printk("Found PCnet/PCI at %#x, irq %d.\n",
pci_ioaddr, pci_irq_line);
- lance_probe1(pci_ioaddr);
+ result = lance_probe1(dev, pci_ioaddr, pci_irq_line, 0);
pci_irq_line = 0;
+ if (!result) return 0;
}
}
#endif /* defined(CONFIG_PCI) */
@@ -359,16 +411,17 @@ __initfunc(int lance_init(void))
char offset15, offset14 = inb(ioaddr + 14);
if ((offset14 == 0x52 || offset14 == 0x57) &&
- ((offset15 = inb(ioaddr + 15)) == 0x57 || offset15 == 0x44))
- lance_probe1(ioaddr);
+ ((offset15 = inb(ioaddr + 15)) == 0x57 || offset15 == 0x44)) {
+ result = lance_probe1(dev, ioaddr, 0, 0);
+ if ( !result ) return 0;
+ }
}
}
- return 0;
+ return -ENODEV;
}
-__initfunc(void lance_probe1(int ioaddr))
+__initfunc(int lance_probe1(struct device *dev, int ioaddr, int irq, int options))
{
- struct device *dev;
struct lance_private *lp;
short dma_channels; /* Mark spuriously-busy DMA channels */
int i, reset_val, lance_version;
@@ -406,7 +459,7 @@ __initfunc(void lance_probe1(int ioaddr))
outw(0x0000, ioaddr+LANCE_ADDR); /* Switch to window 0 */
if (inw(ioaddr+LANCE_DATA) != 0x0004)
- return;
+ return -ENODEV;
/* Get the version of the chip. */
outw(88, ioaddr+LANCE_ADDR);
@@ -419,24 +472,17 @@ __initfunc(void lance_probe1(int ioaddr))
if (lance_debug > 2)
printk(" LANCE chip version is %#x.\n", chip_version);
if ((chip_version & 0xfff) != 0x003)
- return;
+ return -ENODEV;
chip_version = (chip_version >> 12) & 0xffff;
for (lance_version = 1; chip_table[lance_version].id_number; lance_version++) {
if (chip_table[lance_version].id_number == chip_version)
break;
}
}
-
-#if defined(CONFIG_PCNET32) || defined (CONFIG_PCNET32_MODULE)
- /*
- * if pcnet32 is configured and the chip is capable of 32bit mode
- * leave the card alone
- */
- if (chip_table[lance_version].flags & PCNET32_POSSIBLE)
- return;
-#endif
- dev = init_etherdev(0, 0);
+ /* We can't use init_etherdev() to allocate dev->priv because it must
+ a ISA DMA-able region. */
+ dev = init_etherdev(dev, 0);
dev->open = lance_open_fail;
chipname = chip_table[lance_version].name;
printk("%s: %s at %#3x,", dev->name, chipname, ioaddr);
@@ -450,6 +496,7 @@ __initfunc(void lance_probe1(int ioaddr))
request_region(ioaddr, LANCE_TOTAL_SIZE, chip_table[lance_version].name);
/* Make certain the data structures used by the LANCE are aligned and DMAble. */
+
lp = (struct lance_private *)(((unsigned long)kmalloc(sizeof(*lp)+7,
GFP_DMA | GFP_KERNEL)+7) & ~7);
if (lance_debug > 6) printk(" (#0x%05lx)", (unsigned long)lp);
@@ -483,9 +530,9 @@ __initfunc(void lance_probe1(int ioaddr))
outw(0x0000, ioaddr+LANCE_ADDR);
inw(ioaddr+LANCE_ADDR);
- if (pci_irq_line) {
+ if (irq) { /* Set iff PCI card. */
dev->dma = 4; /* Native bus-master, no DMA channel needed. */
- dev->irq = pci_irq_line;
+ dev->irq = irq;
} else if (hp_builtin) {
static const char dma_tbl[4] = {3, 5, 6, 0};
static const char irq_tbl[4] = {3, 4, 5, 9};
@@ -534,7 +581,7 @@ __initfunc(void lance_probe1(int ioaddr))
printk(", probed IRQ %d", dev->irq);
else {
printk(", failed to detect IRQ line.\n");
- return;
+ return -ENODEV;
}
/* Check for the initialization done bit, 0x0100, which means
@@ -548,7 +595,7 @@ __initfunc(void lance_probe1(int ioaddr))
} else if (dev->dma) {
if (request_dma(dev->dma, chipname)) {
printk("DMA %d allocation failed.\n", dev->dma);
- return;
+ return -ENODEV;
} else
printk(", assigned DMA %d.\n", dev->dma);
} else { /* OK, we have to auto-DMA. */
@@ -588,7 +635,7 @@ __initfunc(void lance_probe1(int ioaddr))
}
if (i == 4) { /* Failure: bail. */
printk("DMA detection failed.\n");
- return;
+ return -ENODEV;
}
}
@@ -601,7 +648,7 @@ __initfunc(void lance_probe1(int ioaddr))
dev->irq = autoirq_report(4);
if (dev->irq == 0) {
printk(" Failed to detect the 7990 IRQ line.\n");
- return;
+ return -ENODEV;
}
printk(" Auto-IRQ detected IRQ%d.\n", dev->irq);
}
@@ -610,8 +657,8 @@ __initfunc(void lance_probe1(int ioaddr))
/* Turn on auto-select of media (10baseT or BNC) so that the user
can watch the LEDs even if the board isn't opened. */
outw(0x0002, ioaddr+LANCE_ADDR);
- /* set autoselect and clean xmausel */
- outw((inw(ioaddr+LANCE_BUS_IF) & 0xfffe) | 0x0002, ioaddr+LANCE_BUS_IF);
+ /* Don't touch 10base2 power bit. */
+ outw(inw(ioaddr+LANCE_BUS_IF) | 0x0002, ioaddr+LANCE_BUS_IF);
}
if (lance_debug > 0 && did_version++ == 0)
@@ -624,7 +671,7 @@ __initfunc(void lance_probe1(int ioaddr))
dev->get_stats = lance_get_stats;
dev->set_multicast_list = set_multicast_list;
- return;
+ return 0;
}
static int
@@ -647,6 +694,8 @@ lance_open(struct device *dev)
return -EAGAIN;
}
+ MOD_INC_USE_COUNT;
+
/* We used to allocate DMA here, but that was silly.
DMA lines can't be shared! We now permanently allocate them. */
@@ -668,9 +717,9 @@ lance_open(struct device *dev)
if (chip_table[lp->chip_version].flags & LANCE_ENABLE_AUTOSELECT) {
/* This is 79C960-specific: Turn on auto-select of media (AUI, BNC). */
outw(0x0002, ioaddr+LANCE_ADDR);
- /* set autoselect and clean xmausel */
- outw((inw(ioaddr+LANCE_BUS_IF) & 0xfffe) | 0x0002, ioaddr+LANCE_BUS_IF);
- }
+ /* Only touch autoselect bit. */
+ outw(inw(ioaddr+LANCE_BUS_IF) | 0x0002, ioaddr+LANCE_BUS_IF);
+ }
if (lance_debug > 1)
printk("%s: lance_open() irq %d dma %d tx/rx rings %#x/%#x init %#x.\n",
@@ -679,7 +728,7 @@ lance_open(struct device *dev)
(u32) virt_to_bus(lp->rx_ring),
(u32) virt_to_bus(&lp->init_block));
- lance_init_ring(dev);
+ lance_init_ring(dev, GFP_KERNEL);
/* Re-initialize the LANCE, and start it when done. */
outw(0x0001, ioaddr+LANCE_ADDR);
outw((short) (u32) virt_to_bus(&lp->init_block), ioaddr+LANCE_DATA);
@@ -741,7 +790,7 @@ lance_purge_tx_ring(struct device *dev)
/* Initialize the LANCE Rx and Tx rings. */
static void
-lance_init_ring(struct device *dev)
+lance_init_ring(struct device *dev, int gfp)
{
struct lance_private *lp = (struct lance_private *)dev->priv;
int i;
@@ -751,12 +800,26 @@ lance_init_ring(struct device *dev)
lp->dirty_rx = lp->dirty_tx = 0;
for (i = 0; i < RX_RING_SIZE; i++) {
- lp->rx_ring[i].base = (u32)virt_to_bus((char *)lp->rx_buffs + i*PKT_BUF_SZ) | 0x80000000;
+ struct sk_buff *skb;
+ void *rx_buff;
+
+ skb = alloc_skb(PKT_BUF_SZ, GFP_DMA | gfp);
+ lp->rx_skbuff[i] = skb;
+ if (skb) {
+ skb->dev = dev;
+ rx_buff = skb->tail;
+ } else
+ rx_buff = kmalloc(PKT_BUF_SZ, GFP_DMA | gfp);
+ if (rx_buff == NULL)
+ lp->rx_ring[i].base = 0;
+ else
+ lp->rx_ring[i].base = (u32)virt_to_bus(rx_buff) | 0x80000000;
lp->rx_ring[i].buf_length = -PKT_BUF_SZ;
}
/* The Tx buffer address is filled in as needed, but we do need to clear
the upper ownership bit. */
for (i = 0; i < TX_RING_SIZE; i++) {
+ lp->tx_skbuff[i] = 0;
lp->tx_ring[i].base = 0;
}
@@ -777,7 +840,7 @@ lance_restart(struct device *dev, unsigned int csr0_bits, int must_reinit)
if (must_reinit ||
(chip_table[lp->chip_version].flags & LANCE_MUST_REINIT_RING)) {
lance_purge_tx_ring(dev);
- lance_init_ring(dev);
+ lance_init_ring(dev, GFP_ATOMIC);
}
outw(0x0000, dev->base_addr + LANCE_ADDR);
outw(csr0_bits, dev->base_addr + LANCE_DATA);
@@ -872,14 +935,14 @@ static int lance_start_xmit(struct sk_buff *skb, struct device *dev)
memcpy(&lp->tx_bounce_buffs[entry], skb->data, skb->len);
lp->tx_ring[entry].base =
((u32)virt_to_bus((lp->tx_bounce_buffs + entry)) & 0xffffff) | 0x83000000;
- dev_kfree_skb (skb);
+ dev_kfree_skb(skb);
} else {
lp->tx_skbuff[entry] = skb;
lp->tx_ring[entry].base = ((u32)virt_to_bus(skb->data) & 0xffffff) | 0x83000000;
}
lp->cur_tx++;
- lp->stats.tx_bytes+=skb->len;
-
+ lp->stats.tx_bytes += skb->len;
+
/* Trigger an immediate send poll. */
outw(0x0000, ioaddr+LANCE_ADDR);
outw(0x0048, ioaddr+LANCE_DATA);
@@ -915,7 +978,7 @@ lance_interrupt(int irq, void *dev_id, struct pt_regs * regs)
ioaddr = dev->base_addr;
lp = (struct lance_private *)dev->priv;
if (dev->interrupt)
- printk("%s: Re-entering the interrupt handler.\n", dev->name);
+ printk(KERN_WARNING "%s: Re-entering the interrupt handler.\n", dev->name);
dev->interrupt = 1;
@@ -1110,6 +1173,7 @@ lance_close(struct device *dev)
{
int ioaddr = dev->base_addr;
struct lance_private *lp = (struct lance_private *)dev->priv;
+ int i;
dev->start = 0;
dev->tbusy = 1;
@@ -1134,9 +1198,23 @@ lance_close(struct device *dev)
disable_dma(dev->dma);
release_dma_lock(flags);
}
-
free_irq(dev->irq, dev);
+ /* Free all the skbuffs in the Rx and Tx queues. */
+ for (i = 0; i < RX_RING_SIZE; i++) {
+ struct sk_buff *skb = lp->rx_skbuff[i];
+ lp->rx_skbuff[i] = 0;
+ lp->rx_ring[i].base = 0; /* Not owned by LANCE chip. */
+ if (skb)
+ dev_kfree_skb(skb);
+ }
+ for (i = 0; i < TX_RING_SIZE; i++) {
+ if (lp->tx_skbuff[i])
+ dev_kfree_skb(lp->tx_skbuff[i]);
+ lp->tx_skbuff[i] = 0;
+ }
+
+ MOD_DEC_USE_COUNT;
return 0;
}
@@ -1195,11 +1273,3 @@ static void set_multicast_list(struct device *dev)
}
-
-/*
- * Local variables:
- * compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c lance.c"
- * c-indent-level: 4
- * tab-width: 4
- * End:
- */
diff --git a/drivers/net/lne390.c b/drivers/net/lne390.c
index 1d3b02a86..1fa60e04d 100644
--- a/drivers/net/lne390.c
+++ b/drivers/net/lne390.c
@@ -430,7 +430,6 @@ void cleanup_module(void)
release_region(dev->base_addr, LNE390_IO_EXTENT);
if (ei_status.reg0)
iounmap((void *)dev->mem_start);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/ltpc.c b/drivers/net/ltpc.c
index c90f05945..1ffe0f368 100644
--- a/drivers/net/ltpc.c
+++ b/drivers/net/ltpc.c
@@ -1059,14 +1059,14 @@ __initfunc(int ltpc_probe_dma(int base))
inb_p(io+1);
inb_p(io+0);
- timeout = jiffies+100;
- while(timeout>jiffies) {
+ timeout = jiffies+100*HZ/100;
+ while(time_before(jiffies, timeout)) {
if ( 0xfa == inb_p(io+6) ) break;
}
inb_p(io+3);
inb_p(io+2);
- while(timeout>jiffies) {
+ while(time_before(jiffies, timeout)) {
if ( 0xfb == inb_p(io+6) ) break;
}
@@ -1161,8 +1161,8 @@ __initfunc(int ltpc_probe(struct device *dev))
inb_p(io+1);
inb_p(io+3);
- timeout = jiffies+2;
- while(timeout>jiffies) ; /* hold it in reset for a coupla jiffies */
+ timeout = jiffies+2*HZ/100;
+ while(time_before(jiffies, timeout)) ; /* hold it in reset for a coupla jiffies */
inb_p(io+0);
inb_p(io+2);
inb_p(io+7); /* clear reset */
@@ -1171,9 +1171,9 @@ __initfunc(int ltpc_probe(struct device *dev))
inb_p(io+5); /* enable dma */
inb_p(io+6); /* tri-state interrupt line */
- timeout = jiffies+100;
+ timeout = jiffies+100*HZ/100;
- while(timeout>jiffies) {
+ while(time_before(jiffies, timeout)) {
/* wait for the card to complete initialization */
}
@@ -1220,8 +1220,8 @@ __initfunc(int ltpc_probe(struct device *dev))
(void) inb_p(io+3);
(void) inb_p(io+2);
- timeout = jiffies+100;
- while(timeout>jiffies) {
+ timeout = jiffies+100*HZ/100;
+ while(time_before(jiffies, timeout)) {
if( 0xf9 == inb_p(io+6)) break;
}
@@ -1335,7 +1335,7 @@ void cleanup_module(void)
/* if it's in process, wait a bit for it to finish */
timeout = jiffies+HZ;
add_timer(&ltpc_timer);
- while(del_timer(&ltpc_timer) && (timeout > jiffies))
+ while(del_timer(&ltpc_timer) && time_after(timeout, jiffies))
{
add_timer(&ltpc_timer);
schedule();
diff --git a/drivers/net/ne.c b/drivers/net/ne.c
index ab284bf09..36b9123e8 100644
--- a/drivers/net/ne.c
+++ b/drivers/net/ne.c
@@ -68,8 +68,9 @@ static const char *version =
/* A zero-terminated list of I/O addresses to be probed at boot. */
#ifndef MODULE
-static unsigned int netcard_portlist[] __initdata =
-{ 0x300, 0x280, 0x320, 0x340, 0x360, 0x380, 0};
+static unsigned int netcard_portlist[] __initdata = {
+ 0x300, 0x280, 0x320, 0x340, 0x360, 0x380, 0
+};
#endif
#ifdef CONFIG_PCI
@@ -85,6 +86,8 @@ pci_clone_list[] __initdata = {
{PCI_VENDOR_ID_SURECOM, PCI_DEVICE_ID_SURECOM_NE34, "SureCom NE34"},
{0,}
};
+
+static int probe_pci = 1;
#endif
#ifdef SUPPORT_NE_BAD_CLONES
@@ -175,32 +178,32 @@ struct netdev_entry netcard_drv =
__initfunc(int ne_probe(struct device *dev))
{
- int base_addr = dev ? dev->base_addr : 0;
+ int base_addr = dev ? dev->base_addr : 0;
- /* First check any supplied i/o locations. User knows best. <cough> */
- if (base_addr > 0x1ff) /* Check a single specified location. */
- return ne_probe1(dev, base_addr);
- else if (base_addr != 0) /* Don't probe at all. */
- return ENXIO;
+ /* First check any supplied i/o locations. User knows best. <cough> */
+ if (base_addr > 0x1ff) /* Check a single specified location. */
+ return ne_probe1(dev, base_addr);
+ else if (base_addr != 0) /* Don't probe at all. */
+ return ENXIO;
#ifdef CONFIG_PCI
- /* Then look for any installed PCI clones */
- if (pci_present() && (ne_probe_pci(dev) == 0))
- return 0;
+ /* Then look for any installed PCI clones */
+ if (probe_pci && pci_present() && (ne_probe_pci(dev) == 0))
+ return 0;
#endif
#ifndef MODULE
- /* Last resort. The semi-risky ISA auto-probe. */
- for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
- int ioaddr = netcard_portlist[base_addr];
- if (check_region(ioaddr, NE_IO_EXTENT))
- continue;
- if (ne_probe1(dev, ioaddr) == 0)
- return 0;
- }
+ /* Last resort. The semi-risky ISA auto-probe. */
+ for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) {
+ int ioaddr = netcard_portlist[base_addr];
+ if (check_region(ioaddr, NE_IO_EXTENT))
+ continue;
+ if (ne_probe1(dev, ioaddr) == 0)
+ return 0;
+ }
#endif
- return ENODEV;
+ return ENODEV;
}
#endif
@@ -223,7 +226,7 @@ __initfunc(static int ne_probe_pci(struct device *dev))
}
if (!pdev)
continue;
- printk("ne.c: PCI BIOS reports %s at i/o %#x, irq %d.\n",
+ printk(KERN_INFO "ne.c: PCI BIOS reports %s at i/o %#x, irq %d.\n",
pci_clone_list[i].name,
pci_ioaddr, pci_irq_line);
printk("*\n* Use of the PCI-NE2000 driver with this card is recommended!\n*\n");
@@ -241,61 +244,65 @@ __initfunc(static int ne_probe_pci(struct device *dev))
__initfunc(static int ne_probe1(struct device *dev, int ioaddr))
{
- int i;
- unsigned char SA_prom[32];
- int wordlength = 2;
- const char *name = NULL;
- int start_page, stop_page;
- int neX000, ctron, bad_card;
- int reg0 = inb_p(ioaddr);
- static unsigned version_printed = 0;
-
- if (reg0 == 0xFF)
- return ENODEV;
-
- /* Do a preliminary verification that we have a 8390. */
- { int regd;
- outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
- regd = inb_p(ioaddr + 0x0d);
- outb_p(0xff, ioaddr + 0x0d);
- outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
- inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
- if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
- outb_p(reg0, ioaddr);
- outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */
- return ENODEV;
+ int i;
+ unsigned char SA_prom[32];
+ int wordlength = 2;
+ const char *name = NULL;
+ int start_page, stop_page;
+ int neX000, ctron, copam, bad_card;
+ int reg0 = inb_p(ioaddr);
+ static unsigned version_printed = 0;
+
+ if (reg0 == 0xFF)
+ return ENODEV;
+
+ /* Do a preliminary verification that we have a 8390. */
+ {
+ int regd;
+ outb_p(E8390_NODMA+E8390_PAGE1+E8390_STOP, ioaddr + E8390_CMD);
+ regd = inb_p(ioaddr + 0x0d);
+ outb_p(0xff, ioaddr + 0x0d);
+ outb_p(E8390_NODMA+E8390_PAGE0, ioaddr + E8390_CMD);
+ inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */
+ if (inb_p(ioaddr + EN0_COUNTER0) != 0) {
+ outb_p(reg0, ioaddr);
+ outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */
+ return ENODEV;
+ }
}
- }
- if (load_8390_module("ne.c"))
- return -ENOSYS;
+ if (load_8390_module("ne.c"))
+ return -ENOSYS;
+
+ /* We should have a "dev" from Space.c or the static module table. */
+ if (dev == NULL)
+ {
+ printk(KERN_ERR "ne.c: Passed a NULL device.\n");
+ dev = init_etherdev(0, 0);
+ }
- /* We should have a "dev" from Space.c or the static module table. */
- if (dev == NULL) {
- printk(KERN_ERR "ne.c: Passed a NULL device.\n");
- dev = init_etherdev(0, 0);
- }
+ if (ei_debug && version_printed++ == 0)
+ printk(version);
- if (ei_debug && version_printed++ == 0)
- printk(version);
+ printk(KERN_INFO "NE*000 ethercard probe at %#3x:", ioaddr);
- printk("NE*000 ethercard probe at %#3x:", ioaddr);
+ /* A user with a poor card that fails to ack the reset, or that
+ does not have a valid 0x57,0x57 signature can still use this
+ without having to recompile. Specifying an i/o address along
+ with an otherwise unused dev->mem_end value of "0xBAD" will
+ cause the driver to skip these parts of the probe. */
- /* A user with a poor card that fails to ack the reset, or that
- does not have a valid 0x57,0x57 signature can still use this
- without having to recompile. Specifying an i/o address along
- with an otherwise unused dev->mem_end value of "0xBAD" will
- cause the driver to skip these parts of the probe. */
+ bad_card = ((dev->base_addr != 0) && (dev->mem_end == 0xbad));
- bad_card = ((dev->base_addr != 0) && (dev->mem_end == 0xbad));
+ /* Reset card. Who knows what dain-bramaged state it was left in. */
- /* Reset card. Who knows what dain-bramaged state it was left in. */
- { unsigned long reset_start_time = jiffies;
+ {
+ unsigned long reset_start_time = jiffies;
- /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
- outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
+ /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
+ outb(inb(ioaddr + NE_RESET), ioaddr + NE_RESET);
- while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
+ while ((inb_p(ioaddr + EN0_ISR) & ENISR_RESET) == 0)
if (jiffies - reset_start_time > 2*HZ/100) {
if (bad_card) {
printk(" (warning: no reset ack)");
@@ -305,252 +312,265 @@ __initfunc(static int ne_probe1(struct device *dev, int ioaddr))
return ENODEV;
}
}
+
+ outb_p(0xff, ioaddr + EN0_ISR); /* Ack all intr. */
+ }
+
+ /* Read the 16 bytes of station address PROM.
+ We must first initialize registers, similar to NS8390_init(eifdev, 0).
+ We can't reliably read the SAPROM address without this.
+ (I learned the hard way!). */
+ {
+ struct {unsigned char value, offset; } program_seq[] =
+ {
+ {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
+ {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */
+ {0x00, EN0_RCNTLO}, /* Clear the count regs. */
+ {0x00, EN0_RCNTHI},
+ {0x00, EN0_IMR}, /* Mask completion irq. */
+ {0xFF, EN0_ISR},
+ {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */
+ {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
+ {32, EN0_RCNTLO},
+ {0x00, EN0_RCNTHI},
+ {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */
+ {0x00, EN0_RSARHI},
+ {E8390_RREAD+E8390_START, E8390_CMD},
+ };
+
+ for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
+ outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
- outb_p(0xff, ioaddr + EN0_ISR); /* Ack all intr. */
- }
-
- /* Read the 16 bytes of station address PROM.
- We must first initialize registers, similar to NS8390_init(eifdev, 0).
- We can't reliably read the SAPROM address without this.
- (I learned the hard way!). */
- {
- struct {unsigned char value, offset; } program_seq[] = {
- {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/
- {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */
- {0x00, EN0_RCNTLO}, /* Clear the count regs. */
- {0x00, EN0_RCNTHI},
- {0x00, EN0_IMR}, /* Mask completion irq. */
- {0xFF, EN0_ISR},
- {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */
- {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */
- {32, EN0_RCNTLO},
- {0x00, EN0_RCNTHI},
- {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */
- {0x00, EN0_RSARHI},
- {E8390_RREAD+E8390_START, E8390_CMD},
- };
- for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++)
- outb_p(program_seq[i].value, ioaddr + program_seq[i].offset);
-
- }
- for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
- SA_prom[i] = inb(ioaddr + NE_DATAPORT);
- SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
- if (SA_prom[i] != SA_prom[i+1])
- wordlength = 1;
- }
-
- /* At this point, wordlength *only* tells us if the SA_prom is doubled
- up or not because some broken PCI cards don't respect the byte-wide
- request in program_seq above, and hence don't have doubled up values.
- These broken cards would otherwise be detected as an ne1000. */
-
- if (wordlength == 2)
- for (i = 0; i < 16; i++)
- SA_prom[i] = SA_prom[i+i];
-
- if (pci_irq_line || ioaddr >= 0x400)
- wordlength = 2; /* Catch broken PCI cards mentioned above. */
-
- if (wordlength == 2) {
- /* We must set the 8390 for word mode. */
- outb_p(0x49, ioaddr + EN0_DCFG);
- start_page = NESM_START_PG;
- stop_page = NESM_STOP_PG;
- } else {
- start_page = NE1SM_START_PG;
- stop_page = NE1SM_STOP_PG;
- }
-
- neX000 = (SA_prom[14] == 0x57 && SA_prom[15] == 0x57);
- ctron = (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
-
- /* Set up the rest of the parameters. */
- if (neX000 || bad_card) {
- name = (wordlength == 2) ? "NE2000" : "NE1000";
- } else if (ctron) {
- name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
- start_page = 0x01;
- stop_page = (wordlength == 2) ? 0x40 : 0x20;
- } else {
-#ifdef SUPPORT_NE_BAD_CLONES
- /* Ack! Well, there might be a *bad* NE*000 clone there.
- Check for total bogus addresses. */
- for (i = 0; bad_clone_list[i].name8; i++) {
- if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
- SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
- SA_prom[2] == bad_clone_list[i].SAprefix[2]) {
- if (wordlength == 2) {
- name = bad_clone_list[i].name16;
- } else {
- name = bad_clone_list[i].name8;
- }
- break;
- }
}
- if (bad_clone_list[i].name8 == NULL) {
- printk(" not found (invalid signature %2.2x %2.2x).\n",
- SA_prom[14], SA_prom[15]);
- return ENXIO;
+ for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) {
+ SA_prom[i] = inb(ioaddr + NE_DATAPORT);
+ SA_prom[i+1] = inb(ioaddr + NE_DATAPORT);
+ if (SA_prom[i] != SA_prom[i+1])
+ wordlength = 1;
}
+
+ /* At this point, wordlength *only* tells us if the SA_prom is doubled
+ up or not because some broken PCI cards don't respect the byte-wide
+ request in program_seq above, and hence don't have doubled up values.
+ These broken cards would otherwise be detected as an ne1000. */
+
+ if (wordlength == 2)
+ for (i = 0; i < 16; i++)
+ SA_prom[i] = SA_prom[i+i];
+
+ if (pci_irq_line || ioaddr >= 0x400)
+ wordlength = 2; /* Catch broken PCI cards mentioned above. */
+
+ if (wordlength == 2)
+ {
+ /* We must set the 8390 for word mode. */
+ outb_p(0x49, ioaddr + EN0_DCFG);
+ start_page = NESM_START_PG;
+ stop_page = NESM_STOP_PG;
+ } else {
+ start_page = NE1SM_START_PG;
+ stop_page = NE1SM_STOP_PG;
+ }
+
+ neX000 = (SA_prom[14] == 0x57 && SA_prom[15] == 0x57);
+ ctron = (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
+ copam = (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
+
+
+ /* Set up the rest of the parameters. */
+ if (neX000 || bad_card || copam) {
+ name = (wordlength == 2) ? "NE2000" : "NE1000";
+ }
+ else if (ctron)
+ {
+ name = (wordlength == 2) ? "Ctron-8" : "Ctron-16";
+ start_page = 0x01;
+ stop_page = (wordlength == 2) ? 0x40 : 0x20;
+ }
+ else
+ {
+#ifdef SUPPORT_NE_BAD_CLONES
+ /* Ack! Well, there might be a *bad* NE*000 clone there.
+ Check for total bogus addresses. */
+ for (i = 0; bad_clone_list[i].name8; i++)
+ {
+ if (SA_prom[0] == bad_clone_list[i].SAprefix[0] &&
+ SA_prom[1] == bad_clone_list[i].SAprefix[1] &&
+ SA_prom[2] == bad_clone_list[i].SAprefix[2])
+ {
+ if (wordlength == 2)
+ {
+ name = bad_clone_list[i].name16;
+ } else {
+ name = bad_clone_list[i].name8;
+ }
+ break;
+ }
+ }
+ if (bad_clone_list[i].name8 == NULL)
+ {
+ printk(" not found (invalid signature %2.2x %2.2x).\n",
+ SA_prom[14], SA_prom[15]);
+ return ENXIO;
+ }
#else
- printk(" not found.\n");
- return ENXIO;
+ printk(" not found.\n");
+ return ENXIO;
#endif
+ }
- }
-
- if (pci_irq_line)
- dev->irq = pci_irq_line;
-
- if (dev->irq < 2) {
- autoirq_setup(0);
- outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
- outb_p(0x00, ioaddr + EN0_RCNTLO);
- outb_p(0x00, ioaddr + EN0_RCNTHI);
- outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
- mdelay(10); /* wait 10ms for interrupt to propagate */
- outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */
- dev->irq = autoirq_report(0);
- if (ei_debug > 2)
- printk(" autoirq is %d\n", dev->irq);
- } else if (dev->irq == 2)
- /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
- or don't know which one to set. */
- dev->irq = 9;
-
- if (! dev->irq) {
- printk(" failed to detect IRQ line.\n");
- return EAGAIN;
- }
-
- /* Allocate dev->priv and fill in 8390 specific dev fields. */
- if (ethdev_init(dev)) {
- printk (" unable to get memory for dev->priv.\n");
- return -ENOMEM;
- }
+ if (pci_irq_line)
+ dev->irq = pci_irq_line;
+
+ if (dev->irq < 2)
+ {
+ autoirq_setup(0);
+ outb_p(0x50, ioaddr + EN0_IMR); /* Enable one interrupt. */
+ outb_p(0x00, ioaddr + EN0_RCNTLO);
+ outb_p(0x00, ioaddr + EN0_RCNTHI);
+ outb_p(E8390_RREAD+E8390_START, ioaddr); /* Trigger it... */
+ mdelay(10); /* wait 10ms for interrupt to propagate */
+ outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */
+ dev->irq = autoirq_report(0);
+ if (ei_debug > 2)
+ printk(" autoirq is %d\n", dev->irq);
+ } else if (dev->irq == 2)
+ /* Fixup for users that don't know that IRQ 2 is really IRQ 9,
+ or don't know which one to set. */
+ dev->irq = 9;
+
+ if (! dev->irq) {
+ printk(" failed to detect IRQ line.\n");
+ return EAGAIN;
+ }
+
+ /* Allocate dev->priv and fill in 8390 specific dev fields. */
+ if (ethdev_init(dev))
+ {
+ printk (" unable to get memory for dev->priv.\n");
+ return -ENOMEM;
+ }
- /* Snarf the interrupt now. There's no point in waiting since we cannot
- share and the board will usually be enabled. */
- {
- int irqval = request_irq(dev->irq, ei_interrupt,
- pci_irq_line ? SA_SHIRQ : 0, name, dev);
- if (irqval) {
- printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
+ /* Snarf the interrupt now. There's no point in waiting since we cannot
+ share and the board will usually be enabled. */
- kfree(dev->priv);
- dev->priv = NULL;
- return EAGAIN;
+ {
+ int irqval = request_irq(dev->irq, ei_interrupt,
+ pci_irq_line ? SA_SHIRQ : 0, name, dev);
+ if (irqval) {
+ printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval);
+ kfree(dev->priv);
+ dev->priv = NULL;
+ return EAGAIN;
+ }
}
- }
- dev->base_addr = ioaddr;
- request_region(ioaddr, NE_IO_EXTENT, name);
+ dev->base_addr = ioaddr;
+ request_region(ioaddr, NE_IO_EXTENT, name);
- for(i = 0; i < ETHER_ADDR_LEN; i++) {
- printk(" %2.2x", SA_prom[i]);
- dev->dev_addr[i] = SA_prom[i];
- }
+ for(i = 0; i < ETHER_ADDR_LEN; i++) {
+ printk(" %2.2x", SA_prom[i]);
+ dev->dev_addr[i] = SA_prom[i];
+ }
- printk("\n%s: %s found at %#x, using IRQ %d.\n",
- dev->name, name, ioaddr, dev->irq);
+ printk("\n%s: %s found at %#x, using IRQ %d.\n",
+ dev->name, name, ioaddr, dev->irq);
- ei_status.name = name;
- ei_status.tx_start_page = start_page;
- ei_status.stop_page = stop_page;
- ei_status.word16 = (wordlength == 2);
+ ei_status.name = name;
+ ei_status.tx_start_page = start_page;
+ ei_status.stop_page = stop_page;
+ ei_status.word16 = (wordlength == 2);
- ei_status.rx_start_page = start_page + TX_PAGES;
+ ei_status.rx_start_page = start_page + TX_PAGES;
#ifdef PACKETBUF_MEMSIZE
- /* Allow the packet buffer size to be overridden by know-it-alls. */
- ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
+ /* Allow the packet buffer size to be overridden by know-it-alls. */
+ ei_status.stop_page = ei_status.tx_start_page + PACKETBUF_MEMSIZE;
#endif
- ei_status.reset_8390 = &ne_reset_8390;
- ei_status.block_input = &ne_block_input;
- ei_status.block_output = &ne_block_output;
- ei_status.get_8390_hdr = &ne_get_8390_hdr;
- dev->open = &ne_open;
- dev->stop = &ne_close;
- NS8390_init(dev, 0);
- return 0;
+ ei_status.reset_8390 = &ne_reset_8390;
+ ei_status.block_input = &ne_block_input;
+ ei_status.block_output = &ne_block_output;
+ ei_status.get_8390_hdr = &ne_get_8390_hdr;
+ dev->open = &ne_open;
+ dev->stop = &ne_close;
+ NS8390_init(dev, 0);
+ return 0;
}
-static int
-ne_open(struct device *dev)
+static int ne_open(struct device *dev)
{
- ei_open(dev);
- MOD_INC_USE_COUNT;
- return 0;
+ ei_open(dev);
+ MOD_INC_USE_COUNT;
+ return 0;
}
-static int
-ne_close(struct device *dev)
+static int ne_close(struct device *dev)
{
- if (ei_debug > 1)
- printk("%s: Shutting down ethercard.\n", dev->name);
- ei_close(dev);
- MOD_DEC_USE_COUNT;
- return 0;
+ if (ei_debug > 1)
+ printk(KERN_DEBUG "%s: Shutting down ethercard.\n", dev->name);
+ ei_close(dev);
+ MOD_DEC_USE_COUNT;
+ return 0;
}
/* Hard reset the card. This used to pause for the same period that a
8390 reset command required, but that shouldn't be necessary. */
-static void
-ne_reset_8390(struct device *dev)
+
+static void ne_reset_8390(struct device *dev)
{
- unsigned long reset_start_time = jiffies;
+ unsigned long reset_start_time = jiffies;
- if (ei_debug > 1) printk("resetting the 8390 t=%ld...", jiffies);
+ if (ei_debug > 1)
+ printk(KERN_DEBUG "resetting the 8390 t=%ld...", jiffies);
- /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
- outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
+ /* DON'T change these to inb_p/outb_p or reset will fail on clones. */
+ outb(inb(NE_BASE + NE_RESET), NE_BASE + NE_RESET);
- ei_status.txing = 0;
- ei_status.dmaing = 0;
+ ei_status.txing = 0;
+ ei_status.dmaing = 0;
- /* This check _should_not_ be necessary, omit eventually. */
- while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
- if (jiffies - reset_start_time > 2*HZ/100) {
- printk("%s: ne_reset_8390() did not complete.\n", dev->name);
- break;
- }
- outb_p(ENISR_RESET, NE_BASE + EN0_ISR); /* Ack intr. */
+ /* This check _should_not_ be necessary, omit eventually. */
+ while ((inb_p(NE_BASE+EN0_ISR) & ENISR_RESET) == 0)
+ if (jiffies - reset_start_time > 2*HZ/100) {
+ printk(KERN_WARNING "%s: ne_reset_8390() did not complete.\n", dev->name);
+ break;
+ }
+ outb_p(ENISR_RESET, NE_BASE + EN0_ISR); /* Ack intr. */
}
/* Grab the 8390 specific header. Similar to the block_input routine, but
we don't need to be concerned with ring wrap as the header will be at
the start of a page, so we optimize accordingly. */
-static void
-ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
+static void ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
{
+ int nic_base = dev->base_addr;
- int nic_base = dev->base_addr;
+ /* This *shouldn't* happen. If it does, it's the last thing you'll see */
- /* This *shouldn't* happen. If it does, it's the last thing you'll see */
- if (ei_status.dmaing) {
- printk("%s: DMAing conflict in ne_get_8390_hdr "
- "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
- dev->name, ei_status.dmaing, ei_status.irqlock,
- dev->interrupt);
- return;
- }
-
- ei_status.dmaing |= 0x01;
- outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
- outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
- outb_p(0, nic_base + EN0_RCNTHI);
- outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
- outb_p(ring_page, nic_base + EN0_RSARHI);
- outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
-
- if (ei_status.word16)
- insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
- else
- insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
-
- outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
- ei_status.dmaing &= ~0x01;
+ if (ei_status.dmaing)
+ {
+ printk(KERN_EMERG "%s: DMAing conflict in ne_get_8390_hdr "
+ "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
+ dev->name, ei_status.dmaing, ei_status.irqlock,
+ dev->interrupt);
+ return;
+ }
+
+ ei_status.dmaing |= 0x01;
+ outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
+ outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO);
+ outb_p(0, nic_base + EN0_RCNTHI);
+ outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */
+ outb_p(ring_page, nic_base + EN0_RSARHI);
+ outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
+
+ if (ei_status.word16)
+ insw(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr)>>1);
+ else
+ insb(NE_BASE + NE_DATAPORT, hdr, sizeof(struct e8390_pkt_hdr));
+
+ outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
+ ei_status.dmaing &= ~0x01;
}
/* Block input and output, similar to the Crynwr packet driver. If you
@@ -558,164 +578,176 @@ ne_get_8390_hdr(struct device *dev, struct e8390_pkt_hdr *hdr, int ring_page)
The NEx000 doesn't share the on-board packet memory -- you have to put
the packet out through the "remote DMA" dataport using outb. */
-static void
-ne_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset)
+static void ne_block_input(struct device *dev, int count, struct sk_buff *skb, int ring_offset)
{
#ifdef NE_SANITY_CHECK
- int xfer_count = count;
+ int xfer_count = count;
#endif
- int nic_base = dev->base_addr;
- char *buf = skb->data;
-
- /* This *shouldn't* happen. If it does, it's the last thing you'll see */
- if (ei_status.dmaing) {
- printk("%s: DMAing conflict in ne_block_input "
- "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
- dev->name, ei_status.dmaing, ei_status.irqlock,
- dev->interrupt);
- return;
- }
- ei_status.dmaing |= 0x01;
- outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
- outb_p(count & 0xff, nic_base + EN0_RCNTLO);
- outb_p(count >> 8, nic_base + EN0_RCNTHI);
- outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
- outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
- outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
- if (ei_status.word16) {
- insw(NE_BASE + NE_DATAPORT,buf,count>>1);
- if (count & 0x01) {
- buf[count-1] = inb(NE_BASE + NE_DATAPORT);
+ int nic_base = dev->base_addr;
+ char *buf = skb->data;
+
+ /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+ if (ei_status.dmaing)
+ {
+ printk(KERN_EMERG "%s: DMAing conflict in ne_block_input "
+ "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
+ dev->name, ei_status.dmaing, ei_status.irqlock,
+ dev->interrupt);
+ return;
+ }
+ ei_status.dmaing |= 0x01;
+ outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD);
+ outb_p(count & 0xff, nic_base + EN0_RCNTLO);
+ outb_p(count >> 8, nic_base + EN0_RCNTHI);
+ outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO);
+ outb_p(ring_offset >> 8, nic_base + EN0_RSARHI);
+ outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
+ if (ei_status.word16)
+ {
+ insw(NE_BASE + NE_DATAPORT,buf,count>>1);
+ if (count & 0x01)
+ {
+ buf[count-1] = inb(NE_BASE + NE_DATAPORT);
#ifdef NE_SANITY_CHECK
- xfer_count++;
+ xfer_count++;
#endif
- }
- } else {
- insb(NE_BASE + NE_DATAPORT, buf, count);
- }
+ }
+ } else {
+ insb(NE_BASE + NE_DATAPORT, buf, count);
+ }
#ifdef NE_SANITY_CHECK
- /* This was for the ALPHA version only, but enough people have
- been encountering problems so it is still here. If you see
- this message you either 1) have a slightly incompatible clone
- or 2) have noise/speed problems with your bus. */
- if (ei_debug > 1) { /* DMA termination address check... */
- int addr, tries = 20;
- do {
- /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
- -- it's broken for Rx on some cards! */
- int high = inb_p(nic_base + EN0_RSARHI);
- int low = inb_p(nic_base + EN0_RSARLO);
- addr = (high << 8) + low;
- if (((ring_offset + xfer_count) & 0xff) == low)
- break;
- } while (--tries > 0);
- if (tries <= 0)
- printk("%s: RX transfer address mismatch,"
- "%#4.4x (expected) vs. %#4.4x (actual).\n",
- dev->name, ring_offset + xfer_count, addr);
- }
+ /* This was for the ALPHA version only, but enough people have
+ been encountering problems so it is still here. If you see
+ this message you either 1) have a slightly incompatible clone
+ or 2) have noise/speed problems with your bus. */
+
+ if (ei_debug > 1)
+ {
+ /* DMA termination address check... */
+ int addr, tries = 20;
+ do {
+ /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here
+ -- it's broken for Rx on some cards! */
+ int high = inb_p(nic_base + EN0_RSARHI);
+ int low = inb_p(nic_base + EN0_RSARLO);
+ addr = (high << 8) + low;
+ if (((ring_offset + xfer_count) & 0xff) == low)
+ break;
+ } while (--tries > 0);
+ if (tries <= 0)
+ printk(KERN_WARNING "%s: RX transfer address mismatch,"
+ "%#4.4x (expected) vs. %#4.4x (actual).\n",
+ dev->name, ring_offset + xfer_count, addr);
+ }
#endif
- outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
- ei_status.dmaing &= ~0x01;
+ outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
+ ei_status.dmaing &= ~0x01;
}
-static void
-ne_block_output(struct device *dev, int count,
+static void ne_block_output(struct device *dev, int count,
const unsigned char *buf, const int start_page)
{
- int nic_base = NE_BASE;
- unsigned long dma_start;
+ int nic_base = NE_BASE;
+ unsigned long dma_start;
#ifdef NE_SANITY_CHECK
- int retries = 0;
+ int retries = 0;
#endif
- /* Round the count up for word writes. Do we need to do this?
- What effect will an odd byte count have on the 8390?
- I should check someday. */
- if (ei_status.word16 && (count & 0x01))
- count++;
-
- /* This *shouldn't* happen. If it does, it's the last thing you'll see */
- if (ei_status.dmaing) {
- printk("%s: DMAing conflict in ne_block_output."
- "[DMAstat:%d][irqlock:%d][intr:%ld]\n",
- dev->name, ei_status.dmaing, ei_status.irqlock,
- dev->interrupt);
- return;
- }
- ei_status.dmaing |= 0x01;
- /* We should already be in page 0, but to be safe... */
- outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
+ /* Round the count up for word writes. Do we need to do this?
+ What effect will an odd byte count have on the 8390?
+ I should check someday. */
+
+ if (ei_status.word16 && (count & 0x01))
+ count++;
+
+ /* This *shouldn't* happen. If it does, it's the last thing you'll see */
+ if (ei_status.dmaing)
+ {
+ printk(KERN_EMERG "%s: DMAing conflict in ne_block_output."
+ "[DMAstat:%d][irqlock:%d][intr:%ld]\n",
+ dev->name, ei_status.dmaing, ei_status.irqlock,
+ dev->interrupt);
+ return;
+ }
+ ei_status.dmaing |= 0x01;
+ /* We should already be in page 0, but to be safe... */
+ outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD);
#ifdef NE_SANITY_CHECK
- retry:
+retry:
#endif
#ifdef NE8390_RW_BUGFIX
- /* Handle the read-before-write bug the same way as the
- Crynwr packet driver -- the NatSemi method doesn't work.
- Actually this doesn't always work either, but if you have
- problems with your NEx000 this is better than nothing! */
- outb_p(0x42, nic_base + EN0_RCNTLO);
- outb_p(0x00, nic_base + EN0_RCNTHI);
- outb_p(0x42, nic_base + EN0_RSARLO);
- outb_p(0x00, nic_base + EN0_RSARHI);
- outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
- /* Make certain that the dummy read has occurred. */
- udelay(6);
+ /* Handle the read-before-write bug the same way as the
+ Crynwr packet driver -- the NatSemi method doesn't work.
+ Actually this doesn't always work either, but if you have
+ problems with your NEx000 this is better than nothing! */
+
+ outb_p(0x42, nic_base + EN0_RCNTLO);
+ outb_p(0x00, nic_base + EN0_RCNTHI);
+ outb_p(0x42, nic_base + EN0_RSARLO);
+ outb_p(0x00, nic_base + EN0_RSARHI);
+ outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD);
+ /* Make certain that the dummy read has occurred. */
+ udelay(6);
#endif
- outb_p(ENISR_RDC, nic_base + EN0_ISR);
+ outb_p(ENISR_RDC, nic_base + EN0_ISR);
- /* Now the normal output. */
- outb_p(count & 0xff, nic_base + EN0_RCNTLO);
- outb_p(count >> 8, nic_base + EN0_RCNTHI);
- outb_p(0x00, nic_base + EN0_RSARLO);
- outb_p(start_page, nic_base + EN0_RSARHI);
+ /* Now the normal output. */
+ outb_p(count & 0xff, nic_base + EN0_RCNTLO);
+ outb_p(count >> 8, nic_base + EN0_RCNTHI);
+ outb_p(0x00, nic_base + EN0_RSARLO);
+ outb_p(start_page, nic_base + EN0_RSARHI);
- outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
- if (ei_status.word16) {
- outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
- } else {
- outsb(NE_BASE + NE_DATAPORT, buf, count);
- }
+ outb_p(E8390_RWRITE+E8390_START, nic_base + NE_CMD);
+ if (ei_status.word16) {
+ outsw(NE_BASE + NE_DATAPORT, buf, count>>1);
+ } else {
+ outsb(NE_BASE + NE_DATAPORT, buf, count);
+ }
- dma_start = jiffies;
+ dma_start = jiffies;
#ifdef NE_SANITY_CHECK
- /* This was for the ALPHA version only, but enough people have
- been encountering problems so it is still here. */
- if (ei_debug > 1) { /* DMA termination address check... */
- int addr, tries = 20;
- do {
- int high = inb_p(nic_base + EN0_RSARHI);
- int low = inb_p(nic_base + EN0_RSARLO);
- addr = (high << 8) + low;
- if ((start_page << 8) + count == addr)
- break;
- } while (--tries > 0);
- if (tries <= 0) {
- printk("%s: Tx packet transfer address mismatch,"
- "%#4.4x (expected) vs. %#4.4x (actual).\n",
- dev->name, (start_page << 8) + count, addr);
- if (retries++ == 0)
- goto retry;
+ /* This was for the ALPHA version only, but enough people have
+ been encountering problems so it is still here. */
+
+ if (ei_debug > 1)
+ {
+ /* DMA termination address check... */
+ int addr, tries = 20;
+ do {
+ int high = inb_p(nic_base + EN0_RSARHI);
+ int low = inb_p(nic_base + EN0_RSARLO);
+ addr = (high << 8) + low;
+ if ((start_page << 8) + count == addr)
+ break;
+ } while (--tries > 0);
+
+ if (tries <= 0)
+ {
+ printk(KERN_WARNING "%s: Tx packet transfer address mismatch,"
+ "%#4.4x (expected) vs. %#4.4x (actual).\n",
+ dev->name, (start_page << 8) + count, addr);
+ if (retries++ == 0)
+ goto retry;
+ }
}
- }
#endif
- while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
- if (jiffies - dma_start > 2*HZ/100) { /* 20ms */
- printk("%s: timeout waiting for Tx RDC.\n", dev->name);
- ne_reset_8390(dev);
- NS8390_init(dev,1);
- break;
- }
+ while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0)
+ if (jiffies - dma_start > 2*HZ/100) { /* 20ms */
+ printk(KERN_WARNING "%s: timeout waiting for Tx RDC.\n", dev->name);
+ ne_reset_8390(dev);
+ NS8390_init(dev,1);
+ break;
+ }
- outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
- ei_status.dmaing &= ~0x01;
- return;
+ outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */
+ ei_status.dmaing &= ~0x01;
+ return;
}
@@ -740,13 +772,16 @@ MODULE_PARM(io, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
MODULE_PARM(irq, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
MODULE_PARM(bad, "1-" __MODULE_STRING(MAX_NE_CARDS) "i");
+#ifdef CONFIG_PCI
+MODULE_PARM(probe_pci, "i");
+#endif
+
/* This is set up so that no ISA autoprobe takes place. We can't guarantee
that the ne2k probe is the last 8390 based probe to take place (as it
is at boot) and so the probe will get confused by any other 8390 cards.
ISA device autoprobes on a running machine are not recommended anyway. */
-int
-init_module(void)
+int init_module(void)
{
int this_dev, found = 0;
@@ -775,8 +810,7 @@ init_module(void)
return 0;
}
-void
-cleanup_module(void)
+void cleanup_module(void)
{
int this_dev;
@@ -786,7 +820,6 @@ cleanup_module(void)
void *priv = dev->priv;
free_irq(dev->irq, dev);
release_region(dev->base_addr, NE_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/ne2.c b/drivers/net/ne2.c
index 429699c34..60a729f24 100644
--- a/drivers/net/ne2.c
+++ b/drivers/net/ne2.c
@@ -43,6 +43,9 @@
- Added code that unregisters irq and proc-info
- Version# bump
+ Mon Nov 16 15:28:23 CET 1998 (Wim Dumon)
+ - pass 'dev' as last parameter of request_irq in stead of 'NULL'
+
* WARNING
-------
This is alpha-test software. It is not guaranteed to work. As a
@@ -51,8 +54,7 @@
If it doesn't work, be sure to send me a mail with the problems !
*/
-static const char *version =
-"ne2.c:v0.90 Oct 14 1998 David Weinehall <tao@acc.umu.se>\n";
+static const char *version = "ne2.c:v0.91 Nov 16 1998 Wim Dumon <wimpie@kotnet.org>\n";
#include <linux/module.h>
#include <linux/version.h>
@@ -317,7 +319,7 @@ __initfunc (static int ne2_probe1(struct device *dev, int slot))
share and the board will usually be enabled. */
{
int irqval = request_irq(dev->irq, ei_interrupt,
- 0, name, NULL);
+ 0, name, dev);
if (irqval) {
printk (" unable to get IRQ %d (irqval=%d).\n",
dev->irq, +irqval);
@@ -330,7 +332,7 @@ __initfunc (static int ne2_probe1(struct device *dev, int slot))
/* Allocate dev->priv and fill in 8390 specific dev fields. */
if (ethdev_init(dev)) {
printk (" unable to get memory for dev->priv.\n");
- free_irq(dev->irq, NULL);
+ free_irq(dev->irq, dev);
return -ENOMEM;
}
@@ -677,10 +679,7 @@ void cleanup_module(void)
mca_mark_as_unused(ei_status.priv);
mca_set_adapter_procfn( ei_status.priv, NULL, NULL);
kfree(dev->priv);
- dev->priv = NULL;
free_irq(dev->irq, dev);
- /* removed (temporary) fot */
- /* irq2dev_map[dev->irq] = NULL; */
release_region(dev->base_addr, NE_IO_EXTENT);
unregister_netdev(dev);
}
diff --git a/drivers/net/ne2k-pci.c b/drivers/net/ne2k-pci.c
index 8f152673c..1b48abd36 100644
--- a/drivers/net/ne2k-pci.c
+++ b/drivers/net/ne2k-pci.c
@@ -70,6 +70,7 @@ pci_clone_list[] __initdata = {
{0x4a14, 0x5000, "NetVin NV5000SC"},
{0x1106, 0x0926, "Via 82C926"},
{0x10bd, 0x0e34, "SureCom NE34"},
+ {0x1050, 0x5a5a, "Winbond"},
{0,}
};
diff --git a/drivers/net/ne3210.c b/drivers/net/ne3210.c
index d5764928a..eb3098095 100644
--- a/drivers/net/ne3210.c
+++ b/drivers/net/ne3210.c
@@ -421,7 +421,6 @@ void cleanup_module(void)
release_region(dev->base_addr, NE3210_IO_EXTENT);
if (ei_status.reg0)
iounmap((void *)dev->mem_start);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/net_init.c b/drivers/net/net_init.c
index 5e381d985..edb41febb 100644
--- a/drivers/net/net_init.c
+++ b/drivers/net/net_init.c
@@ -165,6 +165,9 @@ static int fddi_change_mtu(struct device *dev, int new_mtu)
#endif
#ifdef CONFIG_HIPPI
+#define MAX_HIP_CARDS 4
+static struct device *hipdev_index[MAX_HIP_CARDS];
+
static int hippi_change_mtu(struct device *dev, int new_mtu)
{
/*
@@ -193,32 +196,60 @@ static int hippi_mac_addr(struct device *dev, void *p)
struct device *init_hippi_dev(struct device *dev, int sizeof_priv)
{
- struct device *tmp_dev; /* pointer to a device structure */
+ int new_device = 0;
+ int i;
- /* Find next free HIPPI entry */
+ /* Use an existing correctly named device in Space.c:dev_base. */
+ if (dev == NULL) {
+ int alloc_size = sizeof(struct device) + sizeof("hip%d ")
+ + sizeof_priv + 3;
+ struct device *cur_dev;
+ char pname[8];
- for (tmp_dev = dev; tmp_dev != NULL; tmp_dev = tmp_dev->next)
- if ((strncmp(tmp_dev->name, "hip", 3) == 0) &&
- (tmp_dev->base_addr == 0))
- break;
+ for (i = 0; i < MAX_HIP_CARDS; ++i)
+ if (hipdev_index[i] == NULL) {
+ sprintf(pname, "hip%d", i);
+ for (cur_dev = dev_base; cur_dev; cur_dev = cur_dev->next)
+ if (strcmp(pname, cur_dev->name) == 0) {
+ dev = cur_dev;
+ dev->init = NULL;
+ sizeof_priv = (sizeof_priv + 3) & ~3;
+ dev->priv = sizeof_priv
+ ? kmalloc(sizeof_priv, GFP_KERNEL)
+ : NULL;
+ if (dev->priv) memset(dev->priv, 0, sizeof_priv);
+ goto hipfound;
+ }
+ }
- if (tmp_dev == NULL)
- {
- printk("Could not find free HIPPI device structure.\n");
- return NULL;
+ alloc_size &= ~3; /* Round to dword boundary. */
+
+ dev = (struct device *)kmalloc(alloc_size, GFP_KERNEL);
+ memset(dev, 0, alloc_size);
+ if (sizeof_priv)
+ dev->priv = (void *) (dev + 1);
+ dev->name = sizeof_priv + (char *)(dev + 1);
+ new_device = 1;
}
-
- tmp_dev->init = NULL;
- sizeof_priv = (sizeof_priv + 3) & ~3;
- tmp_dev->priv = sizeof_priv ? kmalloc(sizeof_priv, GFP_KERNEL) : NULL;
- if (tmp_dev->priv)
- memset(dev->priv, 0, sizeof_priv);
+hipfound: /* From the double loop above. */
- /* Initialize remaining device structure information */
+ if (dev->name &&
+ ((dev->name[0] == '\0') || (dev->name[0] == ' '))) {
+ for (i = 0; i < MAX_HIP_CARDS; ++i)
+ if (hipdev_index[i] == NULL) {
+ sprintf(dev->name, "hip%d", i);
+ hipdev_index[i] = dev;
+ break;
+ }
+ }
- hippi_setup(tmp_dev);
- return tmp_dev;
+ hippi_setup(dev);
+
+ if (new_device)
+ register_netdevice(dev);
+
+ return dev;
}
static int hippi_neigh_setup_dev(struct device *dev, struct neigh_parms *p)
@@ -312,6 +343,19 @@ void fddi_setup(struct device *dev)
#ifdef CONFIG_HIPPI
void hippi_setup(struct device *dev)
{
+ int i;
+
+ if (dev->name && (strncmp(dev->name, "hip", 3) == 0)) {
+ i = simple_strtoul(dev->name + 3, NULL, 0);
+ if (hipdev_index[i] == NULL) {
+ hipdev_index[i] = dev;
+ }
+ else if (dev != hipdev_index[i]) {
+ printk("hippi_setup: Ouch! Someone else took %s\n",
+ dev->name);
+ }
+ }
+
dev->set_multicast_list = NULL;
dev->change_mtu = hippi_change_mtu;
dev->hard_header = hippi_header;
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c
index a80d460d0..0e3b0c109 100644
--- a/drivers/net/pcnet32.c
+++ b/drivers/net/pcnet32.c
@@ -1,6 +1,6 @@
/* pcnet32.c: An AMD PCnet32 ethernet driver for linux. */
/*
- * Copyright 1996,97,98 Thomas Bogendoerfer
+ * Copyright 1996-1999 Thomas Bogendoerfer
*
* Derived from the lance driver written 1993,1994,1995 by Donald Becker.
*
@@ -13,7 +13,7 @@
* This driver is for PCnet32 and PCnetPCI based ethercards
*/
-static const char *version = "pcnet32.c:v1.02 3.9.98 tsbogend@alpha.franken.de\n";
+static const char *version = "pcnet32.c:v1.11 17.1.99 tsbogend@alpha.franken.de\n";
#include <linux/config.h>
#include <linux/module.h>
@@ -56,6 +56,17 @@ static struct device *pcnet32_dev = NULL;
static const int max_interrupt_work = 20;
static const int rx_copybreak = 200;
+#define PORT_AUI 0x00
+#define PORT_10BT 0x01
+#define PORT_GPSI 0x02
+#define PORT_MII 0x03
+
+#define PORT_PORTSEL 0x03
+#define PORT_ASEL 0x04
+#define PORT_FD 0x80
+
+static int options = PORT_ASEL; /* port selection */
+
/*
* Theory of Operation
*
@@ -106,6 +117,10 @@ static const int rx_copybreak = 200;
* v1.01: do ring dumps, only when debugging the driver
* increased the transmit timeout
* v1.02: fixed memory leak in pcnet32_init_ring()
+ * v1.10: workaround for stopped transmitter
+ * added port selection for modules
+ * detect special T1/E1 WAN card and setup port selection
+ * v1.11: fixed wrong checking of Tx errors
*/
@@ -181,8 +196,9 @@ struct pcnet32_private {
int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
struct net_device_stats stats;
char tx_full;
- unsigned long lock;
- char shared_irq; /* shared irq possible */
+ int options;
+ int shared_irq:1, /* shared irq possible */
+ full_duplex:1; /* full duplex possible */
#ifdef MODULE
struct device *next;
#endif
@@ -260,11 +276,13 @@ __initfunc(int pcnet32_probe (struct device *dev))
unsigned int ioaddr = *port;
if ( check_region(ioaddr, PCNET32_TOTAL_SIZE) == 0) {
- if (pcnet32_probe1(dev, ioaddr, 0, 0) == 0)
+ /* check if there is really a pcnet chip on that ioaddr */
+ if ((inb(ioaddr + 14) == 0x57) &&
+ (inb(ioaddr + 15) == 0x57) &&
+ (pcnet32_probe1(dev, ioaddr, 0, 0) == 0))
return 0;
}
}
-
return ENODEV;
}
@@ -273,13 +291,9 @@ __initfunc(int pcnet32_probe (struct device *dev))
__initfunc(static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, unsigned char irq_line, int shared))
{
struct pcnet32_private *lp;
- int i;
+ int i,full_duplex = 0;
char *chipname;
- /* check if there is really a pcnet chip on that ioaddr */
- if ((inb(ioaddr + 14) != 0x57) || (inb(ioaddr + 15) != 0x57))
- return ENODEV;
-
inw(ioaddr+PCNET32_RESET); /* Reset the PCNET32 */
outw(0x0000, ioaddr+PCNET32_ADDR); /* Switch to window 0 */
@@ -305,16 +319,22 @@ __initfunc(static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, un
chipname = "PCnet/PCI 79C970";
break;
case 0x2430:
- chipname = "PCnet32";
+ if (shared)
+ chipname = "PCnet/PCI 79C970"; /* 970 gives the wrong chip id back */
+ else
+ chipname = "PCnet/32 79C965";
break;
case 0x2621:
chipname = "PCnet/PCI II 79C970A";
+ full_duplex = 1;
break;
case 0x2623:
chipname = "PCnet/FAST 79C971";
+ full_duplex = 1;
break;
case 0x2624:
chipname = "PCnet/FAST+ 79C972";
+ full_duplex = 1;
break;
default:
printk("pcnet32: PCnet version %#x, no PCnet32 chip.\n",chip_version);
@@ -352,8 +372,14 @@ __initfunc(static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, un
dev->priv = lp;
lp->name = chipname;
lp->shared_irq = shared;
+ lp->full_duplex = full_duplex;
+ lp->options = options;
+
+ /* detect special T1/E1 WAN card by checking for MAC address */
+ if (dev->dev_addr[0] == 0x00 && dev->dev_addr[1] == 0xe0 && dev->dev_addr[2] == 0x75)
+ lp->options = PORT_FD | PORT_GPSI;
- lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */
+ lp->init_block.mode = le16_to_cpu(0x0003); /* Disable Rx and Tx. */
lp->init_block.tlen_rlen = le16_to_cpu(TX_RING_LEN_BITS | RX_RING_LEN_BITS);
for (i = 0; i < 6; i++)
lp->init_block.phys_addr[i] = dev->dev_addr[i];
@@ -402,11 +428,6 @@ __initfunc(static int pcnet32_probe1(struct device *dev, unsigned int ioaddr, un
}
}
- outw(0x0002, ioaddr+PCNET32_ADDR);
- /* only touch autoselect bit */
- outw(inw(ioaddr+PCNET32_BUS_IF) | 0x0002, ioaddr+PCNET32_BUS_IF);
-
-
if (pcnet32_debug > 0)
printk(version);
@@ -433,6 +454,7 @@ pcnet32_open(struct device *dev)
{
struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
unsigned int ioaddr = dev->base_addr;
+ unsigned short val;
int i;
if (dev->irq == 0 ||
@@ -448,19 +470,40 @@ pcnet32_open(struct device *dev)
outw(0x0014, ioaddr+PCNET32_ADDR);
outw(0x0002, ioaddr+PCNET32_BUS_IF);
- /* Turn on auto-select of media (AUI, BNC). */
- outw(0x0002, ioaddr+PCNET32_ADDR);
- /* only touch autoselect bit */
- outw(inw(ioaddr+PCNET32_BUS_IF) | 0x0002, ioaddr+PCNET32_BUS_IF);
-
if (pcnet32_debug > 1)
printk("%s: pcnet32_open() irq %d tx/rx rings %#x/%#x init %#x.\n",
dev->name, dev->irq,
(u32) virt_to_bus(lp->tx_ring),
(u32) virt_to_bus(lp->rx_ring),
(u32) virt_to_bus(&lp->init_block));
-
- lp->init_block.mode = 0x0000;
+
+ /* set/reset autoselect bit */
+ outw(0x0002, ioaddr+PCNET32_ADDR);
+ val = inw(ioaddr+PCNET32_BUS_IF) & ~2;
+ if (lp->options & PORT_ASEL)
+ val |= 2;
+ outw(val, ioaddr+PCNET32_BUS_IF);
+
+ /* handle full duplex setting */
+ if (lp->full_duplex) {
+ outw (0x0009, ioaddr+PCNET32_ADDR);
+ val = inw(ioaddr+PCNET32_BUS_IF) & ~3;
+ if (lp->options & PORT_FD) {
+ val |= 1;
+ if (lp->options == (PORT_FD | PORT_AUI))
+ val |= 2;
+ }
+ outw(val, ioaddr+PCNET32_BUS_IF);
+ }
+
+ /* set/reset GPSI bit in test register */
+ outw (0x007c, ioaddr+PCNET32_ADDR);
+ val = inw(ioaddr+PCNET32_DATA) & ~0x10;
+ if ((lp->options & PORT_PORTSEL) == PORT_GPSI)
+ val |= 0x10;
+ outw(val, ioaddr+PCNET32_DATA);
+
+ lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);
lp->init_block.filter[0] = 0x00000000;
lp->init_block.filter[1] = 0x00000000;
if (pcnet32_init_ring(dev))
@@ -535,7 +578,7 @@ pcnet32_init_ring(struct device *dev)
struct pcnet32_private *lp = (struct pcnet32_private *)dev->priv;
int i;
- lp->lock = 0, lp->tx_full = 0;
+ lp->tx_full = 0;
lp->cur_rx = lp->cur_tx = 0;
lp->dirty_rx = lp->dirty_tx = 0;
@@ -633,7 +676,6 @@ pcnet32_start_xmit(struct sk_buff *skb, struct device *dev)
outw(0x0000, ioaddr+PCNET32_ADDR);
printk("%s: pcnet32_start_xmit() called, csr0 %4.4x.\n", dev->name,
inw(ioaddr+PCNET32_DATA));
- outw(0x0000, ioaddr+PCNET32_DATA);
}
/* Block a timer-based transmit from overlapping. This could better be
@@ -643,12 +685,8 @@ pcnet32_start_xmit(struct sk_buff *skb, struct device *dev)
return 1;
}
- if (test_and_set_bit(0, (void*)&lp->lock) != 0) {
- if (pcnet32_debug > 0)
- printk("%s: tx queue lock!.\n", dev->name);
- /* don't clear dev->tbusy flag. */
- return 1;
- }
+ save_flags (flags);
+ cli ();
/* Fill in a Tx ring entry */
@@ -678,15 +716,11 @@ pcnet32_start_xmit(struct sk_buff *skb, struct device *dev)
dev->trans_start = jiffies;
- save_flags(flags);
- cli();
- lp->lock = 0;
if (lp->tx_ring[(entry+1) & TX_RING_MOD_MASK].base == 0)
clear_bit (0, (void *)&dev->tbusy);
else
lp->tx_full = 1;
restore_flags(flags);
-
return 0;
}
@@ -698,6 +732,7 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
struct pcnet32_private *lp;
unsigned int csr0, ioaddr;
int boguscnt = max_interrupt_work;
+ int must_restart;
if (dev == NULL) {
printk ("pcnet32_interrupt(): irq %d for unknown device.\n", irq);
@@ -716,6 +751,8 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
/* Acknowledge all of the current interrupt sources ASAP. */
outw(csr0 & ~0x004f, dev->base_addr + PCNET32_DATA);
+ must_restart = 0;
+
if (pcnet32_debug > 5)
printk("%s: interrupt csr0=%#2.2x new csr=%#2.2x.\n",
dev->name, csr0, inw(dev->base_addr + PCNET32_DATA));
@@ -737,7 +774,7 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
if (status & 0x4000) {
/* There was an major error, log it. */
- int err_status = le16_to_cpu(lp->tx_ring[entry].misc);
+ int err_status = le32_to_cpu(lp->tx_ring[entry].misc);
lp->stats.tx_errors++;
if (err_status & 0x04000000) lp->stats.tx_aborted_errors++;
if (err_status & 0x08000000) lp->stats.tx_carrier_errors++;
@@ -748,10 +785,7 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
/* Remove this verbosity later! */
printk("%s: Tx FIFO error! Status %4.4x.\n",
dev->name, csr0);
- /* stop the chip to clear the error condition, then restart */
- outw(0x0000, dev->base_addr + PCNET32_ADDR);
- outw(0x0004, dev->base_addr + PCNET32_DATA);
- pcnet32_restart(dev, 0x0002);
+ must_restart = 1;
}
} else {
if (status & 0x1800)
@@ -805,6 +839,13 @@ pcnet32_interrupt(int irq, void *dev_id, struct pt_regs * regs)
dev->name, csr0);
/* unlike for the lance, there is no restart needed */
}
+
+ if (must_restart) {
+ /* stop the chip to clear the error condition, then restart */
+ outw(0x0000, dev->base_addr + PCNET32_ADDR);
+ outw(0x0004, dev->base_addr + PCNET32_DATA);
+ pcnet32_restart(dev, 0x0002);
+ }
}
/* Clear any other interrupt, and set interrupt enable. */
@@ -1038,9 +1079,9 @@ static void pcnet32_set_multicast_list(struct device *dev)
if (dev->flags&IFF_PROMISC) {
/* Log any net taps. */
printk("%s: Promiscuous mode enabled.\n", dev->name);
- lp->init_block.mode = le16_to_cpu(0x8000);
+ lp->init_block.mode = le16_to_cpu(0x8000 | (lp->options & PORT_PORTSEL) << 7);
} else {
- lp->init_block.mode = 0x0000;
+ lp->init_block.mode = le16_to_cpu((lp->options & PORT_PORTSEL) << 7);
pcnet32_load_multicast (dev);
}
@@ -1052,6 +1093,7 @@ static void pcnet32_set_multicast_list(struct device *dev)
#ifdef MODULE
MODULE_PARM(debug, "i");
+MODULE_PARM(options, "i");
MODULE_PARM(max_interrupt_work, "i");
MODULE_PARM(rx_copybreak, "i");
diff --git a/drivers/net/plip.c b/drivers/net/plip.c
index 91666827e..c41da1866 100644
--- a/drivers/net/plip.c
+++ b/drivers/net/plip.c
@@ -21,6 +21,10 @@
* - Make sure other end is OK, before sending a packet.
* - Fix immediate timer problem.
*
+ * Al Viro
+ * - Changed {enable,disable}_irq handling to make it work
+ * with new ("stack") semantics.
+ *
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
@@ -120,6 +124,9 @@ static const char *version = "NET3 PLIP version 2.3-parport gniibe@mri.co.jp\n";
#endif
static unsigned int net_debug = NET_DEBUG;
+#define ENABLE(irq) enable_irq(irq)
+#define DISABLE(irq) disable_irq(irq)
+
/* In micro second */
#define PLIP_DELAY_UNIT 1
@@ -333,6 +340,7 @@ static int plip_bh_timeout_error(struct device *dev, struct net_local *nl,
#define OK 0
#define TIMEOUT 1
#define ERROR 2
+#define HS_TIMEOUT 3
typedef int (*plip_func)(struct device *dev, struct net_local *nl,
struct plip_local *snd, struct plip_local *rcv);
@@ -371,13 +379,22 @@ plip_bh_timeout_error(struct device *dev, struct net_local *nl,
int error)
{
unsigned char c0;
+ /*
+ * This is tricky. If we got here from the beginning of send (either
+ * with ERROR or HS_TIMEOUT) we have IRQ enabled. Otherwise it's
+ * already disabled. With the old variant of {enable,disable}_irq()
+ * extra disable_irq() was a no-op. Now it became mortal - it's
+ * unbalanced and thus we'll never re-enable IRQ (until rmmod plip,
+ * that is). So we have to treat HS_TIMEOUT and ERROR from send
+ * in a special way.
+ */
spin_lock_irq(&nl->lock);
if (nl->connection == PLIP_CN_SEND) {
if (error != ERROR) { /* Timeout */
nl->timeout_count++;
- if ((snd->state == PLIP_PK_TRIGGER
+ if ((error == HS_TIMEOUT
&& nl->timeout_count <= 10)
|| nl->timeout_count <= 3) {
spin_unlock_irq(&nl->lock);
@@ -387,7 +404,8 @@ plip_bh_timeout_error(struct device *dev, struct net_local *nl,
c0 = inb(PAR_STATUS(dev));
printk(KERN_WARNING "%s: transmit timeout(%d,%02x)\n",
dev->name, snd->state, c0);
- }
+ } else
+ error = HS_TIMEOUT;
nl->enet_stats.tx_errors++;
nl->enet_stats.tx_aborted_errors++;
} else if (nl->connection == PLIP_CN_RECEIVE) {
@@ -419,8 +437,10 @@ plip_bh_timeout_error(struct device *dev, struct net_local *nl,
snd->skb = NULL;
}
spin_unlock_irq(&nl->lock);
- disable_irq(dev->irq);
- synchronize_irq();
+ if (error == HS_TIMEOUT) {
+ DISABLE(dev->irq);
+ synchronize_irq();
+ }
outb(PAR_INTR_OFF, PAR_CONTROL(dev));
dev->tbusy = 1;
nl->connection = PLIP_CN_ERROR;
@@ -498,7 +518,7 @@ plip_receive_packet(struct device *dev, struct net_local *nl,
switch (rcv->state) {
case PLIP_PK_TRIGGER:
- disable_irq(dev->irq);
+ DISABLE(dev->irq);
/* Don't need to synchronize irq, as we can safely ignore it */
outb(PAR_INTR_OFF, PAR_CONTROL(dev));
dev->interrupt = 0;
@@ -518,7 +538,7 @@ plip_receive_packet(struct device *dev, struct net_local *nl,
nl->connection = PLIP_CN_SEND;
queue_task(&nl->deferred, &tq_timer);
outb(PAR_INTR_ON, PAR_CONTROL(dev));
- enable_irq(dev->irq);
+ ENABLE(dev->irq);
return OK;
}
} else {
@@ -592,13 +612,13 @@ plip_receive_packet(struct device *dev, struct net_local *nl,
queue_task(&nl->immediate, &tq_immediate);
mark_bh(IMMEDIATE_BH);
outb(PAR_INTR_ON, PAR_CONTROL(dev));
- enable_irq(dev->irq);
+ ENABLE(dev->irq);
return OK;
} else {
nl->connection = PLIP_CN_NONE;
spin_unlock_irq(&nl->lock);
outb(PAR_INTR_ON, PAR_CONTROL(dev));
- enable_irq(dev->irq);
+ ENABLE(dev->irq);
return OK;
}
}
@@ -674,7 +694,7 @@ plip_send_packet(struct device *dev, struct net_local *nl,
switch (snd->state) {
case PLIP_PK_TRIGGER:
if ((inb(PAR_STATUS(dev)) & 0xf8) != 0x80)
- return TIMEOUT;
+ return HS_TIMEOUT;
/* Trigger remote rx interrupt. */
outb(0x08, data_addr);
@@ -691,12 +711,16 @@ plip_send_packet(struct device *dev, struct net_local *nl,
c0 = inb(PAR_STATUS(dev));
if (c0 & 0x08) {
spin_unlock_irq(&nl->lock);
- disable_irq(dev->irq);
+ DISABLE(dev->irq);
synchronize_irq();
if (nl->connection == PLIP_CN_RECEIVE) {
/* Interrupted.
We don't need to enable irq,
as it is soon disabled. */
+ /* Yes, we do. New variant of
+ {enable,disable}_irq *counts*
+ them. -- AV */
+ ENABLE(dev->irq);
nl->enet_stats.collisions++;
return OK;
}
@@ -711,7 +735,7 @@ plip_send_packet(struct device *dev, struct net_local *nl,
spin_unlock_irq(&nl->lock);
if (--cx == 0) {
outb(0x00, data_addr);
- return TIMEOUT;
+ return HS_TIMEOUT;
}
}
@@ -760,7 +784,7 @@ plip_send_packet(struct device *dev, struct net_local *nl,
nl->is_deferred = 1;
queue_task(&nl->deferred, &tq_timer);
outb(PAR_INTR_ON, PAR_CONTROL(dev));
- enable_irq(dev->irq);
+ ENABLE(dev->irq);
return OK;
}
return OK;
@@ -800,7 +824,7 @@ plip_error(struct device *dev, struct net_local *nl,
dev->tbusy = 0;
dev->interrupt = 0;
outb(PAR_INTR_ON, PAR_CONTROL(dev));
- enable_irq(dev->irq);
+ ENABLE(dev->irq);
mark_bh(NET_BH);
} else {
nl->is_deferred = 1;
@@ -1000,7 +1024,7 @@ plip_close(struct device *dev)
dev->tbusy = 1;
dev->start = 0;
- disable_irq(dev->irq);
+ DISABLE(dev->irq);
synchronize_irq();
#ifdef NOTDEF
@@ -1203,7 +1227,6 @@ __initfunc(int
plip_init(void))
{
struct parport *pb = parport_enumerate();
- int devices=0;
int i=0;
if (parport[0] == -2)
@@ -1214,7 +1237,7 @@ plip_init(void))
timid = 0;
}
- /* When user feeds parameters, use them */
+ /* If the user feeds parameters, use them */
while (pb) {
if ((parport[0] == -1 && (!timid || !pb->devices)) ||
plip_searchfor(parport, i)) {
@@ -1242,14 +1265,13 @@ plip_init(void))
kfree(dev_plip[i]->name);
kfree(dev_plip[i]);
} else {
- devices++;
+ i++;
}
}
- i++;
pb = pb->next;
}
- if (devices == 0) {
+ if (i == 0) {
printk(KERN_INFO "plip: no devices registered\n");
return -EIO;
}
diff --git a/drivers/net/ppp.c b/drivers/net/ppp.c
index c578ba87d..b2c07b3fa 100644
--- a/drivers/net/ppp.c
+++ b/drivers/net/ppp.c
@@ -4,7 +4,7 @@
* Al Longyear <longyear@netcom.com>
* Extensively rewritten by Paul Mackerras <paulus@cs.anu.edu.au>
*
- * ==FILEVERSION 981004==
+ * ==FILEVERSION 990114==
*
* NOTE TO MAINTAINERS:
* If you modify this file at all, please set the number above to the
@@ -1216,6 +1216,7 @@ typedef struct ppp_proto_struct {
} ppp_proto_type;
static int rcv_proto_ip (struct ppp *, struct sk_buff *);
+static int rcv_proto_ipv6 (struct ppp *, struct sk_buff *);
static int rcv_proto_ipx (struct ppp *, struct sk_buff *);
static int rcv_proto_at (struct ppp *, struct sk_buff *);
static int rcv_proto_vjc_comp (struct ppp *, struct sk_buff *);
@@ -1226,6 +1227,7 @@ static int rcv_proto_unknown (struct ppp *, struct sk_buff *);
static
ppp_proto_type proto_list[] = {
{ PPP_IP, rcv_proto_ip },
+ { PPP_IPV6, rcv_proto_ipv6 },
{ PPP_IPX, rcv_proto_ipx },
{ PPP_AT, rcv_proto_at },
{ PPP_VJC_COMP, rcv_proto_vjc_comp },
@@ -2003,6 +2005,19 @@ rcv_proto_ip(struct ppp *ppp, struct sk_buff *skb)
}
/*
+ * Process the receipt of an IPv6 frame
+ */
+static int
+rcv_proto_ipv6(struct ppp *ppp, struct sk_buff *skb)
+{
+ CHECK_PPP(0);
+ if ((ppp2dev(ppp)->flags & IFF_UP) && (skb->len > 0)
+ && ppp->sc_npmode[NP_IPV6] == NPMODE_PASS)
+ return ppp_rcv_rx(ppp, ETH_P_IPV6, skb);
+ return 0;
+}
+
+/*
* Process the receipt of an IPX frame
*/
static int
@@ -2041,7 +2056,7 @@ rcv_proto_vjc_comp(struct ppp *ppp, struct sk_buff *skb)
return 0;
new_count = slhc_uncompress(ppp->slcomp, skb->data + PPP_HDRLEN,
skb->len - PPP_HDRLEN);
- if (new_count < 0) {
+ if (new_count<=0) {
if (ppp->flags & SC_DEBUG)
printk(KERN_NOTICE
"ppp: error in VJ decompression\n");
@@ -2383,6 +2398,10 @@ ppp_dev_xmit(struct sk_buff *skb, struct device *dev)
proto = PPP_IP;
npmode = ppp->sc_npmode[NP_IP];
break;
+ case ETH_P_IPV6:
+ proto = PPP_IPV6;
+ npmode = ppp->sc_npmode[NP_IPV6];
+ break;
case ETH_P_IPX:
proto = PPP_IPX;
npmode = ppp->sc_npmode[NP_IPX];
diff --git a/drivers/net/rcif.h b/drivers/net/rcif.h
new file mode 100644
index 000000000..a41f05aac
--- /dev/null
+++ b/drivers/net/rcif.h
@@ -0,0 +1,299 @@
+/*
+** *************************************************************************
+**
+**
+** R C I F . H
+**
+**
+** RedCreek InterFace include file.
+**
+** ---------------------------------------------------------------------
+** --- Copyright (c) 1998-1999, RedCreek Communications Inc. ---
+** --- All rights reserved. ---
+** ---------------------------------------------------------------------
+**
+** File Description:
+**
+** Header file private ioctl commands.
+**
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+** *************************************************************************
+*/
+
+#ifndef RCIF_H
+#define RCIF_H
+
+/* The following protocol revision # should be incremented every time
+ a new protocol or new structures are used in this file. */
+int USER_PROTOCOL_REV = 2; /* used to track different protocol revisions */
+
+/* define a single TCB & buffer */
+typedef struct /* a single buffer */
+{
+ U32 context; /* context */
+ U32 scount; /* segment count */
+ U32 size; /* segment size */
+ U32 addr; /* segment physical address */
+}
+__attribute__((packed))
+singleB, *psingleB ;
+typedef struct /* a single TCB */
+{
+ /*
+ ** +-----------------------+
+ ** | 1 | one buffer in the TCB
+ ** +-----------------------+
+ ** | <user's Context> | user's buffer reference
+ ** +-----------------------+
+ ** | 1 | one segment buffer
+ ** +-----------------------+ _
+ ** | <buffer size> | size \
+ ** +-----------------------+ \ segment descriptor
+ ** | <physical address> | physical address of buffer /
+ ** +-----------------------+ _/
+ */
+ U32 bcount; /* buffer count */
+ singleB b; /* buffer */
+
+}
+__attribute__((packed))
+singleTCB, *psingleTCB;
+
+/*
+ When adding new entries, please add all 5 related changes, since
+ it helps keep everything consistent:
+ 1) User structure entry
+ 2) User data entry
+ 3) Structure short-cut entry
+ 4) Data short-cut entry
+ 5) Command identifier entry
+
+ For Example ("GETSPEED"):
+ 1) struct RCgetspeed_tag { U32 LinkSpeedCode; } RCgetspeed;
+ 2) struct RCgetspeed_tag *getspeed;
+ 3) #define RCUS_GETSPEED data.RCgetspeed;
+ 4) #define RCUD_GETSPEED _RC_user_data.getspeed
+ 5) #define RCUC_GETSPEED 0x02
+
+ Notes for the "GETSPEED" entry, above:
+ 1) RCgetspeed - RC{name}
+ RCgetspeed_tag - RC{name}_tag
+ LinkSpeedCode - create any structure format desired (not too large,
+ since memory will be unioned with all other entries)
+ 2) RCgetspeed_tag - RC{name}_tag chosen in #1
+ getspeed - arbitrary name (ptr to structure in #1)
+ 3) RCUS_GETSPEED - RCUS_{NAME} ("NAME" & "name" do not have to the same)
+ data.RCgetspeed - data.RC{name} ("RC{name}" from #1)
+ 4) RCUD_GETSPEED - _RC_user_data.getspeed ("getspeed" from #2)
+ 5) RCUC_GETSPEED - unique hex identifier entry.
+*/
+
+typedef struct RC_user_tag RCuser_struct;
+
+/* 1) User structure entry */
+struct RC_user_tag
+{
+ int cmd;
+ union
+ {
+ /* GETINFO structure */
+ struct RCgetinfo_tag {
+ unsigned long int mem_start;
+ unsigned long int mem_end;
+ unsigned long int base_addr;
+ unsigned char irq;
+ unsigned char dma;
+ unsigned char port;
+ } RCgetinfo; /* <---- RCgetinfo */
+
+ /* GETSPEED structure */
+ struct RCgetspeed_tag {
+ U32 LinkSpeedCode;
+ } RCgetspeed; /* <---- RCgetspeed */
+
+ /* SETSPEED structure */
+ struct RCsetspeed_tag {
+ U16 LinkSpeedCode;
+ } RCsetspeed; /* <---- RCsetspeed */
+
+ /* GETPROM structure */
+ struct RCgetprom_tag {
+ U32 PromMode;
+ } RCgetprom; /* <---- RCgetprom */
+
+ /* SETPROM structure */
+ struct RCsetprom_tag {
+ U16 PromMode;
+ } RCsetprom; /* <---- RCsetprom */
+
+ /* GETBROADCAST structure */
+ struct RCgetbroadcast_tag {
+ U32 BroadcastMode;
+ } RCgetbroadcast; /* <---- RCgetbroadcast */
+
+ /* SETBROADCAST structure */
+ struct RCsetbroadcast_tag {
+ U16 BroadcastMode;
+ } RCsetbroadcast; /* <---- RCsetbroadcast */
+
+ /* GETFIRMWAREVER structure */
+ #define FirmStringLen 80
+ struct RCgetfwver_tag {
+ U8 FirmString[FirmStringLen];
+ } RCgetfwver; /* <---- RCgetfwver */
+
+ /* GETIPANDMASK structure */
+ struct RCgetipnmask_tag {
+ U32 IpAddr;
+ U32 NetMask;
+ } RCgetipandmask; /* <---- RCgetipandmask */
+
+ /* SETIPANDMASK structure */
+ struct RCsetipnmask_tag {
+ U32 IpAddr;
+ U32 NetMask;
+ } RCsetipandmask; /* <---- RCsetipandmask */
+
+ /* GETMAC structure */
+ #define MAC_SIZE 10
+ struct RCgetmac_tag {
+ U8 mac[MAC_SIZE];
+ } RCgetmac; /* <---- RCgetmac */
+
+ /* SETMAC structure */
+ struct RCsetmac_tag {
+ U8 mac[MAC_SIZE];
+ } RCsetmac; /* <---- RCsetmac */
+
+ /* GETLINKSTATUS structure */
+ struct RCgetlnkstatus_tag {
+ U32 ReturnStatus;
+ } RCgetlnkstatus; /* <---- RCgetlnkstatus */
+
+ /* GETLINKSTATISTICS structure */
+ struct RCgetlinkstats_tag {
+ RCLINKSTATS StatsReturn;
+ } RCgetlinkstats; /* <---- RCgetlinkstats */
+
+ /* DEFAULT structure (when no command was recognized) */
+ struct RCdefault_tag {
+ int rc;
+ } RCdefault; /* <---- RCdefault */
+
+ } data;
+
+}; /* struct RC_user_tag { ... } */
+
+/* 2) User data entry */
+/* RCUD = RedCreek User Data */
+union RC_user_data_tag { /* structure tags used are taken from RC_user_tag structure above */
+ struct RCgetinfo_tag *getinfo;
+ struct RCgetspeed_tag *getspeed;
+ struct RCgetprom_tag *getprom;
+ struct RCgetbroadcast_tag *getbroadcast;
+ struct RCgetfwver_tag *getfwver;
+ struct RCgetipnmask_tag *getipandmask;
+ struct RCgetmac_tag *getmac;
+ struct RCgetlnkstatus_tag *getlinkstatus;
+ struct RCgetlinkstats_tag *getlinkstatistics;
+ struct RCdefault_tag *rcdefault;
+ struct RCsetspeed_tag *setspeed;
+ struct RCsetprom_tag *setprom;
+ struct RCsetbroadcast_tag *setbroadcast;
+ struct RCsetipnmask_tag *setipandmask;
+ struct RCsetmac_tag *setmac;
+} _RC_user_data; /* declare as a global, so the defines below will work */
+
+/* 3) Structure short-cut entry */
+/* define structure short-cuts */ /* structure names are taken from RC_user_tag structure above */
+#define RCUS_GETINFO data.RCgetinfo;
+#define RCUS_GETSPEED data.RCgetspeed;
+#define RCUS_GETPROM data.RCgetprom;
+#define RCUS_GETBROADCAST data.RCgetbroadcast;
+#define RCUS_GETFWVER data.RCgetfwver;
+#define RCUS_GETIPANDMASK data.RCgetipandmask;
+#define RCUS_GETMAC data.RCgetmac;
+#define RCUS_GETLINKSTATUS data.RCgetlnkstatus;
+#define RCUS_GETLINKSTATISTICS data.RCgetlinkstats;
+#define RCUS_DEFAULT data.RCdefault;
+#define RCUS_SETSPEED data.RCsetspeed;
+#define RCUS_SETPROM data.RCsetprom;
+#define RCUS_SETBROADCAST data.RCsetbroadcast;
+#define RCUS_SETIPANDMASK data.RCsetipandmask;
+#define RCUS_SETMAC data.RCsetmac;
+
+/* 4) Data short-cut entry */
+/* define data short-cuts */ /* pointer names are from RC_user_data_tag union (just below RC_user_tag) */
+#define RCUD_GETINFO _RC_user_data.getinfo
+#define RCUD_GETSPEED _RC_user_data.getspeed
+#define RCUD_GETPROM _RC_user_data.getprom
+#define RCUD_GETBROADCAST _RC_user_data.getbroadcast
+#define RCUD_GETFWVER _RC_user_data.getfwver
+#define RCUD_GETIPANDMASK _RC_user_data.getipandmask
+#define RCUD_GETMAC _RC_user_data.getmac
+#define RCUD_GETLINKSTATUS _RC_user_data.getlinkstatus
+#define RCUD_GETLINKSTATISTICS _RC_user_data.getlinkstatistics
+#define RCUD_DEFAULT _RC_user_data.rcdefault
+#define RCUD_SETSPEED _RC_user_data.setspeed
+#define RCUD_SETPROM _RC_user_data.setprom
+#define RCUD_SETBROADCAST _RC_user_data.setbroadcast
+#define RCUD_SETIPANDMASK _RC_user_data.setipandmask
+#define RCUD_SETMAC _RC_user_data.setmac
+
+/* 5) Command identifier entry */
+/* define command identifiers */
+#define RCUC_GETINFO 0x01
+#define RCUC_GETSPEED 0x02
+#define RCUC_GETFWVER 0x03
+#define RCUC_GETIPANDMASK 0x04
+#define RCUC_GETMAC 0x05
+#define RCUC_GETLINKSTATUS 0x06
+#define RCUC_GETLINKSTATISTICS 0x07
+#define RCUC_GETPROM 0x14
+#define RCUC_GETBROADCAST 0x15
+#define RCUC_DEFAULT 0xff
+#define RCUC_SETSPEED 0x08
+#define RCUC_SETIPANDMASK 0x09
+#define RCUC_SETMAC 0x0a
+#define RCUC_SETPROM 0x16
+#define RCUC_SETBROADCAST 0x17
+
+/* define ioctl commands to use, when talking to RC 45/PCI driver */
+#define RCU_PROTOCOL_REV SIOCDEVPRIVATE
+#define RCU_COMMAND SIOCDEVPRIVATE+1
+
+/*
+ Intended use for the above defines is shown below (GETINFO, as this example):
+
+ RCuser_struct RCuser; // declare RCuser structure
+ struct ifreq ifr; // declare an interface request structure
+
+ RCuser.cmd = RCUC_GETINFO; // set user command to GETINFO
+ ifr->ifr_data = (caddr_t) &RCuser; // set point to user structure
+
+ sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); // get a socket
+ ioctl(sock, RCU_COMMAND, &ifr); // do ioctl on socket
+
+ RCUD_GETINFO = &RCuser.RCUS_GETINFO; // set data pointer for GETINFO
+
+ // print results
+ printf("memory 0x%lx-0x%lx, base address 0x%x, irq 0x%x\n",
+ RCUD_GETINFO->mem_start, RCUD_GETINFO->mem_end,
+ RCUD_GETINFO->base_addr, RCUD_GETINFO->irq);
+*/
+
+#endif /* RCIF_H */
+
diff --git a/drivers/net/rclanmtl.c b/drivers/net/rclanmtl.c
new file mode 100644
index 000000000..971fb49b6
--- /dev/null
+++ b/drivers/net/rclanmtl.c
@@ -0,0 +1,2307 @@
+/*
+** *************************************************************************
+**
+**
+** R C L A N M T L . C $Revision: 5 $
+**
+**
+** RedCreek I2O LAN Message Transport Layer program module.
+**
+** ---------------------------------------------------------------------
+** --- Copyright (c) 1997-1999, RedCreek Communications Inc. ---
+** --- All rights reserved. ---
+** ---------------------------------------------------------------------
+**
+** File Description:
+**
+** Host side I2O (Intelligent I/O) LAN message transport layer.
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+** *************************************************************************
+*/
+
+#undef DEBUG
+
+#define RC_LINUX_MODULE
+#include "rclanmtl.h"
+
+#define dprintf kprintf
+
+extern int printk(const char * fmt, ...);
+
+ /* RedCreek LAN device Target ID */
+#define RC_LAN_TARGET_ID 0x10
+ /* RedCreek's OSM default LAN receive Initiator */
+#define DEFAULT_RECV_INIT_CONTEXT 0xA17
+
+
+/*
+** I2O message structures
+*/
+
+#define I2O_TID_SZ 12
+#define I2O_FUNCTION_SZ 8
+
+/* Transaction Reply Lists (TRL) Control Word structure */
+
+#define I2O_TRL_FLAGS_SINGLE_FIXED_LENGTH 0x00
+#define I2O_TRL_FLAGS_SINGLE_VARIABLE_LENGTH 0x40
+#define I2O_TRL_FLAGS_MULTIPLE_FIXED_LENGTH 0x80
+
+/* LAN Class specific functions */
+
+#define I2O_LAN_PACKET_SEND 0x3B
+#define I2O_LAN_SDU_SEND 0x3D
+#define I2O_LAN_RECEIVE_POST 0x3E
+#define I2O_LAN_RESET 0x35
+#define I2O_LAN_SHUTDOWN 0x37
+
+/* Private Class specfic function */
+#define I2O_PRIVATE 0xFF
+
+/* I2O Executive Function Codes. */
+
+#define I2O_EXEC_ADAPTER_ASSIGN 0xB3
+#define I2O_EXEC_ADAPTER_READ 0xB2
+#define I2O_EXEC_ADAPTER_RELEASE 0xB5
+#define I2O_EXEC_BIOS_INFO_SET 0xA5
+#define I2O_EXEC_BOOT_DEVICE_SET 0xA7
+#define I2O_EXEC_CONFIG_VALIDATE 0xBB
+#define I2O_EXEC_CONN_SETUP 0xCA
+#define I2O_EXEC_DEVICE_ASSIGN 0xB7
+#define I2O_EXEC_DEVICE_RELEASE 0xB9
+#define I2O_EXEC_HRT_GET 0xA8
+#define I2O_EXEC_IOP_CLEAR 0xBE
+#define I2O_EXEC_IOP_CONNECT 0xC9
+#define I2O_EXEC_IOP_RESET 0xBD
+#define I2O_EXEC_LCT_NOTIFY 0xA2
+#define I2O_EXEC_OUTBOUND_INIT 0xA1
+#define I2O_EXEC_PATH_ENABLE 0xD3
+#define I2O_EXEC_PATH_QUIESCE 0xC5
+#define I2O_EXEC_PATH_RESET 0xD7
+#define I2O_EXEC_STATIC_MF_CREATE 0xDD
+#define I2O_EXEC_STATIC_MF_RELEASE 0xDF
+#define I2O_EXEC_STATUS_GET 0xA0
+#define I2O_EXEC_SW_DOWNLOAD 0xA9
+#define I2O_EXEC_SW_UPLOAD 0xAB
+#define I2O_EXEC_SW_REMOVE 0xAD
+#define I2O_EXEC_SYS_ENABLE 0xD1
+#define I2O_EXEC_SYS_MODIFY 0xC1
+#define I2O_EXEC_SYS_QUIESCE 0xC3
+#define I2O_EXEC_SYS_TAB_SET 0xA3
+
+
+ /* Init Outbound Q status */
+#define I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS 0x01
+#define I2O_EXEC_OUTBOUND_INIT_REJECTED 0x02
+#define I2O_EXEC_OUTBOUND_INIT_FAILED 0x03
+#define I2O_EXEC_OUTBOUND_INIT_COMPLETE 0x04
+
+
+#define I2O_UTIL_NOP 0x00
+
+
+/* I2O Get Status State values */
+
+#define I2O_IOP_STATE_INITIALIZING 0x01
+#define I2O_IOP_STATE_RESET 0x02
+#define I2O_IOP_STATE_HOLD 0x04
+#define I2O_IOP_STATE_READY 0x05
+#define I2O_IOP_STATE_OPERATIONAL 0x08
+#define I2O_IOP_STATE_FAILED 0x10
+#define I2O_IOP_STATE_FAULTED 0x11
+
+
+/* Defines for Request Status Codes: Table 3-1 Reply Status Codes. */
+
+#define I2O_REPLY_STATUS_SUCCESS 0x00
+#define I2O_REPLY_STATUS_ABORT_DIRTY 0x01
+#define I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 0x02
+#define I2O_REPLY_STATUS_ABORT_PARTIAL_TRANSFER 0x03
+#define I2O_REPLY_STATUS_ERROR_DIRTY 0x04
+#define I2O_REPLY_STATUS_ERROR_NO_DATA_TRANSFER 0x05
+#define I2O_REPLY_STATUS_ERROR_PARTIAL_TRANSFER 0x06
+#define I2O_REPLY_STATUS_PROCESS_ABORT_DIRTY 0x07
+#define I2O_REPLY_STATUS_PROCESS_ABORT_NO_DATA_TRANSFER 0x08
+#define I2O_REPLY_STATUS_PROCESS_ABORT_PARTIAL_TRANSFER 0x09
+#define I2O_REPLY_STATUS_TRANSACTION_ERROR 0x0A
+#define I2O_REPLY_STATUS_PROGRESS_REPORT 0x80
+
+
+/* DetailedStatusCode defines for ALL messages: Table 3-2 Detailed Status Codes.*/
+
+#define I2O_DETAIL_STATUS_SUCCESS 0x0000
+#define I2O_DETAIL_STATUS_BAD_KEY 0x0001
+#define I2O_DETAIL_STATUS_CHAIN_BUFFER_TOO_LARGE 0x0002
+#define I2O_DETAIL_STATUS_DEVICE_BUSY 0x0003
+#define I2O_DETAIL_STATUS_DEVICE_LOCKED 0x0004
+#define I2O_DETAIL_STATUS_DEVICE_NOT_AVAILABLE 0x0005
+#define I2O_DETAIL_STATUS_DEVICE_RESET 0x0006
+#define I2O_DETAIL_STATUS_INAPPROPRIATE_FUNCTION 0x0007
+#define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_HARD 0x0008
+#define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_SOFT 0x0009
+#define I2O_DETAIL_STATUS_INVALID_INITIATOR_ADDRESS 0x000A
+#define I2O_DETAIL_STATUS_INVALID_MESSAGE_FLAGS 0x000B
+#define I2O_DETAIL_STATUS_INVALID_OFFSET 0x000C
+#define I2O_DETAIL_STATUS_INVALID_PARAMETER 0x000D
+#define I2O_DETAIL_STATUS_INVALID_REQUEST 0x000E
+#define I2O_DETAIL_STATUS_INVALID_TARGET_ADDRESS 0x000F
+#define I2O_DETAIL_STATUS_MESSAGE_TOO_LARGE 0x0010
+#define I2O_DETAIL_STATUS_MESSAGE_TOO_SMALL 0x0011
+#define I2O_DETAIL_STATUS_MISSING_PARAMETER 0x0012
+#define I2O_DETAIL_STATUS_NO_SUCH_PAGE 0x0013
+#define I2O_DETAIL_STATUS_REPLY_BUFFER_FULL 0x0014
+#define I2O_DETAIL_STATUS_TCL_ERROR 0x0015
+#define I2O_DETAIL_STATUS_TIMEOUT 0x0016
+#define I2O_DETAIL_STATUS_UNKNOWN_ERROR 0x0017
+#define I2O_DETAIL_STATUS_UNKNOWN_FUNCTION 0x0018
+#define I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION 0x0019
+#define I2O_DETAIL_STATUS_UNSUPPORTED_VERSION 0x001A
+
+ /* I2O msg header defines for VersionOffset */
+#define I2OMSGVER_1_5 0x0001
+#define SGL_OFFSET_0 I2OMSGVER_1_5
+#define SGL_OFFSET_4 (0x0040 | I2OMSGVER_1_5)
+#define TRL_OFFSET_5 (0x0050 | I2OMSGVER_1_5)
+#define TRL_OFFSET_6 (0x0060 | I2OMSGVER_1_5)
+
+ /* I2O msg header defines for MsgFlags */
+#define MSG_STATIC 0x0100
+#define MSG_64BIT_CNTXT 0x0200
+#define MSG_MULTI_TRANS 0x1000
+#define MSG_FAIL 0x2000
+#define MSG_LAST 0x4000
+#define MSG_REPLY 0x8000
+
+ /* normal LAN request message MsgFlags and VersionOffset (0x1041) */
+#define LAN_MSG_REQST (MSG_MULTI_TRANS | SGL_OFFSET_4)
+
+ /* minimum size msg */
+#define THREE_WORD_MSG_SIZE 0x00030000
+#define FOUR_WORD_MSG_SIZE 0x00040000
+#define FIVE_WORD_MSG_SIZE 0x00050000
+#define SIX_WORD_MSG_SIZE 0x00060000
+#define SEVEN_WORD_MSG_SIZE 0x00070000
+#define EIGHT_WORD_MSG_SIZE 0x00080000
+#define NINE_WORD_MSG_SIZE 0x00090000
+
+/* Special TID Assignments */
+
+#define I2O_IOP_TID 0
+#define I2O_HOST_TID 1
+
+ /* RedCreek I2O private message codes */
+#define RC_PRIVATE_GET_MAC_ADDR 0x0001/**/ /* OBSOLETE */
+#define RC_PRIVATE_SET_MAC_ADDR 0x0002
+#define RC_PRIVATE_GET_NIC_STATS 0x0003
+#define RC_PRIVATE_GET_LINK_STATUS 0x0004
+#define RC_PRIVATE_SET_LINK_SPEED 0x0005
+#define RC_PRIVATE_SET_IP_AND_MASK 0x0006
+/* #define RC_PRIVATE_GET_IP_AND_MASK 0x0007 */ /* OBSOLETE */
+#define RC_PRIVATE_GET_LINK_SPEED 0x0008
+#define RC_PRIVATE_GET_FIRMWARE_REV 0x0009
+/* #define RC_PRIVATE_GET_MAC_ADDR 0x000A *//**/
+#define RC_PRIVATE_GET_IP_AND_MASK 0x000B /**/
+#define RC_PRIVATE_DEBUG_MSG 0x000C
+#define RC_PRIVATE_REPORT_DRIVER_CAPABILITY 0x000D
+#define RC_PRIVATE_SET_PROMISCUOUS_MODE 0x000e
+#define RC_PRIVATE_GET_PROMISCUOUS_MODE 0x000f
+#define RC_PRIVATE_SET_BROADCAST_MODE 0x0010
+#define RC_PRIVATE_GET_BROADCAST_MODE 0x0011
+
+#define RC_PRIVATE_REBOOT 0x00FF
+
+
+/* I2O message header */
+typedef struct _I2O_MESSAGE_FRAME
+{
+ U8 VersionOffset;
+ U8 MsgFlags;
+ U16 MessageSize;
+ BF TargetAddress:I2O_TID_SZ;
+ BF InitiatorAddress:I2O_TID_SZ;
+ BF Function:I2O_FUNCTION_SZ;
+ U32 InitiatorContext;
+ /* SGL[] */
+}
+I2O_MESSAGE_FRAME, *PI2O_MESSAGE_FRAME;
+
+
+ /* assumed a 16K minus 256 byte space for outbound queue message frames */
+#define MSG_FRAME_SIZE 512
+#define NMBR_MSG_FRAMES 30
+
+/*
+** Message Unit CSR definitions for RedCreek PCI45 board
+*/
+typedef struct tag_rcatu
+{
+ volatile unsigned long APICRegSel; /* APIC Register Select */
+ volatile unsigned long reserved0;
+ volatile unsigned long APICWinReg; /* APIC Window Register */
+ volatile unsigned long reserved1;
+ volatile unsigned long InMsgReg0; /* inbound message register 0 */
+ volatile unsigned long InMsgReg1; /* inbound message register 1 */
+ volatile unsigned long OutMsgReg0; /* outbound message register 0 */
+ volatile unsigned long OutMsgReg1; /* outbound message register 1 */
+ volatile unsigned long InDoorReg; /* inbound doorbell register */
+ volatile unsigned long InIntStat; /* inbound interrupt status register */
+ volatile unsigned long InIntMask; /* inbound interrupt mask register */
+ volatile unsigned long OutDoorReg; /* outbound doorbell register */
+ volatile unsigned long OutIntStat; /* outbound interrupt status register */
+ volatile unsigned long OutIntMask; /* outbound interrupt mask register */
+ volatile unsigned long reserved2;
+ volatile unsigned long reserved3;
+ volatile unsigned long InQueue; /* inbound queue port */
+ volatile unsigned long OutQueue; /* outbound queue port */
+ volatile unsigned long reserved4;
+ volatile unsigned long reserver5;
+ /* RedCreek extension */
+ volatile unsigned long EtherMacLow;
+ volatile unsigned long EtherMacHi;
+ volatile unsigned long IPaddr;
+ volatile unsigned long IPmask;
+}
+ATU, *PATU;
+
+ /*
+ ** typedef PAB
+ **
+ ** PCI Adapter Block - holds instance specific information and is located
+ ** in a reserved space at the start of the message buffer allocated by user.
+ */
+typedef struct
+{
+ PATU p_atu; /* ptr to ATU register block */
+ PU8 pPci45LinBaseAddr;
+ PU8 pLinOutMsgBlock;
+ U32 outMsgBlockPhyAddr;
+ PFNTXCALLBACK pTransCallbackFunc;
+ PFNRXCALLBACK pRecvCallbackFunc;
+ PFNCALLBACK pRebootCallbackFunc;
+ PFNCALLBACK pCallbackFunc;
+ U16 IOPState;
+ U16 InboundMFrameSize;
+}
+PAB, *PPAB;
+
+ /*
+ ** in reserved space right after PAB in host memory is area for returning
+ ** values from card
+ */
+
+ /*
+ ** Array of pointers to PCI Adapter Blocks.
+ ** Indexed by a zero based (0-31) interface number.
+ */
+#define MAX_ADAPTERS 32
+static PPAB PCIAdapterBlock[MAX_ADAPTERS] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+
+/*
+** typedef NICSTAT
+**
+** Data structure for NIC statistics retruned from PCI card. Data copied from
+** here to user allocated RCLINKSTATS (see rclanmtl.h) structure.
+*/
+typedef struct tag_NicStat
+{
+ unsigned long TX_good;
+ unsigned long TX_maxcol;
+ unsigned long TX_latecol;
+ unsigned long TX_urun;
+ unsigned long TX_crs; /* lost carrier sense */
+ unsigned long TX_def; /* transmit deferred */
+ unsigned long TX_singlecol; /* single collisions */
+ unsigned long TX_multcol;
+ unsigned long TX_totcol;
+ unsigned long Rcv_good;
+ unsigned long Rcv_CRCerr;
+ unsigned long Rcv_alignerr;
+ unsigned long Rcv_reserr; /* rnr'd pkts */
+ unsigned long Rcv_orun;
+ unsigned long Rcv_cdt;
+ unsigned long Rcv_runt;
+ unsigned long dump_status; /* last field directly from the chip */
+}
+NICSTAT, *P_NICSTAT;
+
+
+#define DUMP_DONE 0x0000A005 /* completed statistical dump */
+#define DUMP_CLEAR 0x0000A007 /* completed stat dump and clear counters */
+
+
+static volatile int msgFlag;
+
+
+/* local function prototypes */
+static void ProcessOutboundI2OMsg(PPAB pPab, U32 phyMsgAddr);
+static int FillI2OMsgSGLFromTCB(PU32 pMsg, PRCTCB pXmitCntrlBlock);
+static int GetI2OStatus(PPAB pPab);
+static int SendI2OOutboundQInitMsg(PPAB pPab);
+static int SendEnableSysMsg(PPAB pPab);
+
+
+/* 1st 100h bytes of message block is reserved for messenger instance */
+#define ADAPTER_BLOCK_RESERVED_SPACE 0x100
+
+/*
+** =========================================================================
+** RCInitI2OMsgLayer()
+**
+** Initialize the RedCreek I2O Module and adapter.
+**
+** Inputs: AdapterID - interface number from 0 to 15
+** pciBaseAddr - virual base address of PCI (set by BIOS)
+** p_msgbuf - virual address to private message block (min. 16K)
+** p_phymsgbuf - physical address of private message block
+** TransmitCallbackFunction - address of transmit callback function
+** ReceiveCallbackFunction - address of receive callback function
+**
+** private message block is allocated by user. It must be in locked pages.
+** p_msgbuf and p_phymsgbuf point to the same location. Must be contigous
+** memory block of a minimum of 16K byte and long word aligned.
+** =========================================================================
+*/
+RC_RETURN
+RCInitI2OMsgLayer(U16 AdapterID, U32 pciBaseAddr,
+ PU8 p_msgbuf, PU8 p_phymsgbuf,
+ PFNTXCALLBACK TransmitCallbackFunction,
+ PFNRXCALLBACK ReceiveCallbackFunction,
+ PFNCALLBACK RebootCallbackFunction)
+{
+ int result;
+ PPAB pPab;
+
+#ifdef DEBUG
+ kprintf("InitI2O: Adapter:0x%04.4ux ATU:0x%08.8ulx msgbuf:0x%08.8ulx phymsgbuf:0x%08.8ulx\n"
+ "TransmitCallbackFunction:0x%08.8ulx ReceiveCallbackFunction:0x%08.8ulx\n",
+ AdapterID, pciBaseAddr, p_msgbuf, p_phymsgbuf, TransmitCallbackFunction, ReceiveCallbackFunction);
+#endif /* DEBUG */
+
+
+ /* Check if this interface already initialized - if so, shut it down */
+ if (PCIAdapterBlock[AdapterID] != NULL)
+ {
+ printk("PCIAdapterBlock[%d]!=NULL\n", AdapterID);
+// RCResetLANCard(AdapterID, 0, (PU32)NULL, (PFNCALLBACK)NULL);
+ PCIAdapterBlock[AdapterID] = NULL;
+ }
+
+ /*
+ ** store adapter instance values in adapter block.
+ ** Adapter block is at beginning of message buffer
+ */
+ pPab = (PPAB)p_msgbuf;
+
+ pPab->p_atu = (PATU)pciBaseAddr;
+ pPab->pPci45LinBaseAddr = (PU8)pciBaseAddr;
+
+ /* Set outbound message frame addr - skip over Adapter Block */
+ pPab->outMsgBlockPhyAddr = (U32)(p_phymsgbuf + ADAPTER_BLOCK_RESERVED_SPACE);
+ pPab->pLinOutMsgBlock = (PU8)(p_msgbuf + ADAPTER_BLOCK_RESERVED_SPACE);
+
+ /* store callback function addresses */
+ pPab->pTransCallbackFunc = TransmitCallbackFunction;
+ pPab->pRecvCallbackFunc = ReceiveCallbackFunction;
+ pPab->pRebootCallbackFunc = RebootCallbackFunction;
+ pPab->pCallbackFunc = (PFNCALLBACK)NULL;
+
+ /*
+ ** Initialize I2O IOP
+ */
+ result = GetI2OStatus(pPab);
+
+ if (result != RC_RTN_NO_ERROR)
+ return result;
+
+ if (pPab->IOPState == I2O_IOP_STATE_OPERATIONAL)
+ {
+ printk("pPab->IOPState == op: resetting adapter\n");
+ RCResetLANCard(AdapterID, 0, (PU32)NULL, (PFNCALLBACK)NULL);
+ }
+
+ result = SendI2OOutboundQInitMsg(pPab);
+
+ if (result != RC_RTN_NO_ERROR)
+ return result;
+
+ result = SendEnableSysMsg(pPab);
+
+ if (result != RC_RTN_NO_ERROR)
+ return result;
+
+ PCIAdapterBlock[AdapterID] = pPab;
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** =========================================================================
+** Disable and Enable I2O interrupts. I2O interrupts are enabled at Init time
+** but can be disabled and re-enabled through these two function calls.
+** Packets will still be put into any posted received buffers and packets will
+** be sent through RCI2OSendPacket() functions. Disabling I2O interrupts
+** will prevent hardware interrupt to host even though the outbound I2O msg
+** queue is not emtpy.
+** =========================================================================
+*/
+#define i960_OUT_POST_Q_INT_BIT 0x0008 /* bit set masks interrupts */
+
+RC_RETURN RCDisableI2OInterrupts(U16 AdapterID)
+{
+ PPAB pPab;
+
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ pPab->p_atu->OutIntMask |= i960_OUT_POST_Q_INT_BIT;
+
+ return RC_RTN_NO_ERROR;
+}
+
+RC_RETURN RCEnableI2OInterrupts(U16 AdapterID)
+{
+ PPAB pPab;
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ pPab->p_atu->OutIntMask &= ~i960_OUT_POST_Q_INT_BIT;
+
+ return RC_RTN_NO_ERROR;
+
+}
+
+
+/*
+** =========================================================================
+** RCI2OSendPacket()
+** =========================================================================
+*/
+RC_RETURN
+RCI2OSendPacket(U16 AdapterID, U32 InitiatorContext, PRCTCB pTransCtrlBlock)
+{
+ U32 msgOffset;
+ PU32 pMsg;
+ int size;
+ PPAB pPab;
+
+#ifdef DEBUG
+ kprintf("RCI2OSendPacket()...\n");
+#endif /* DEBUG */
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ /* get Inbound free Q entry - reading from In Q gets free Q entry */
+ /* offset to Msg Frame in PCI msg block */
+
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("RCI2OSendPacket(): Inbound Free Q empty!\n");
+#endif /* DEBUG */
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ size = FillI2OMsgSGLFromTCB(pMsg + 4, pTransCtrlBlock);
+
+ if (size == -1) /* error processing TCB - send NOP msg */
+ {
+#ifdef DEBUG
+ kprintf("RCI2OSendPacket(): Error Rrocess TCB!\n");
+#endif /* DEBUG */
+ pMsg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_UTIL_NOP << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ return RC_RTN_TCB_ERROR;
+ }
+ else /* send over msg header */
+ {
+ pMsg[0] = (size + 4) << 16 | LAN_MSG_REQST; /* send over message size and flags */
+ pMsg[1] = I2O_LAN_PACKET_SEND << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = InitiatorContext;
+ pMsg[3] = 0; /* batch reply */
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+ return RC_RTN_NO_ERROR;
+ }
+}
+
+
+/*
+** =========================================================================
+** RCI2OPostRecvBuffer()
+**
+** inputs: pBufrCntrlBlock - pointer to buffer control block
+**
+** returns TRUE if successful in sending message, else FALSE.
+** =========================================================================
+*/
+RC_RETURN
+RCPostRecvBuffers(U16 AdapterID, PRCTCB pTransCtrlBlock)
+{
+ U32 msgOffset;
+ PU32 pMsg;
+ int size;
+ PPAB pPab;
+
+#ifdef DEBUG
+ kprintf("RCPostRecvBuffers()...\n");
+#endif /* DEBUG */
+
+ /* search for DeviceHandle */
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+
+ /* get Inbound free Q entry - reading from In Q gets free Q entry */
+ /* offset to Msg Frame in PCI msg block */
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("RCPostRecvBuffers(): Inbound Free Q empty!\n");
+#endif /* DEBUG */
+ return RC_RTN_FREE_Q_EMPTY;
+
+ }
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ size = FillI2OMsgSGLFromTCB(pMsg + 4, pTransCtrlBlock);
+
+ if (size == -1) /* error prcessing TCB - send 3 DWORD private msg == NOP */
+ {
+#ifdef DEBUG
+ kprintf("RCPostRecvBuffers(): Error Processing TCB! size = %d\n", size);
+#endif /* DEBUG */
+ pMsg[0] = THREE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_UTIL_NOP << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ /* post to Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+ return RC_RTN_TCB_ERROR;
+ }
+ else /* send over size msg header */
+ {
+ pMsg[0] = (size + 4) << 16 | LAN_MSG_REQST; /* send over message size and flags */
+ pMsg[1] = I2O_LAN_RECEIVE_POST << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = *(PU32)pTransCtrlBlock; /* number of packet buffers */
+ /* post to Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+ return RC_RTN_NO_ERROR;
+ }
+}
+
+
+/*
+** =========================================================================
+** RCProcI2OMsgQ()
+**
+** Process I2O outbound message queue until empty.
+** =========================================================================
+*/
+void
+RCProcI2OMsgQ(U16 AdapterID)
+{
+ U32 phyAddrMsg;
+ PU8 p8Msg;
+ PU32 p32;
+ U16 count;
+ PPAB pPab;
+ unsigned char debug_msg[20];
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return;
+
+ phyAddrMsg = pPab->p_atu->OutQueue;
+
+ while (phyAddrMsg != 0xFFFFFFFF)
+ {
+ p8Msg = pPab->pLinOutMsgBlock + (phyAddrMsg - pPab->outMsgBlockPhyAddr);
+ p32 = (PU32)p8Msg;
+
+ //printk(" msg: 0x%x 0x%x \n", p8Msg[7], p32[5]);
+
+ /*
+ ** Send Packet Reply Msg
+ */
+ if (I2O_LAN_PACKET_SEND == p8Msg[7]) /* function code byte */
+ {
+ count = *(PU16)(p8Msg+2);
+ count -= p8Msg[0] >> 4;
+ /* status, count, context[], adapter */
+ (*pPab->pTransCallbackFunc)(p8Msg[19], count, p32+5, AdapterID);
+ }
+ /*
+ ** Receive Packet Reply Msg */
+ else if (I2O_LAN_RECEIVE_POST == p8Msg[7])
+ {
+#ifdef DEBUG
+ kprintf("I2O_RECV_REPLY pPab:0x%08.8ulx p8Msg:0x%08.8ulx p32:0x%08.8ulx\n", pPab, p8Msg, p32);
+ kprintf("msg: 0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n",
+ p32[0], p32[1], p32[2], p32[3]);
+ kprintf(" 0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n",
+ p32[4], p32[5], p32[6], p32[7]);
+ kprintf(" 0x%08.8ulx:0X%08.8ulx:0x%08.8ulx:0x%08.8ulx\n",
+ p32[8], p32[9], p32[10], p32[11]);
+#endif
+ /* status, count, buckets remaining, packetParmBlock, adapter */
+ (*pPab->pRecvCallbackFunc)(p8Msg[19], p8Msg[12], p32[5], p32+6, AdapterID);
+
+
+ }
+ else if (I2O_LAN_RESET == p8Msg[7] || I2O_LAN_SHUTDOWN == p8Msg[7])
+ {
+ if (pPab->pCallbackFunc)
+ {
+ (*pPab->pCallbackFunc)(p8Msg[19],0,0,AdapterID);
+ }
+ else
+ {
+ pPab->pCallbackFunc = (PFNCALLBACK) 1;
+ }
+ //PCIAdapterBlock[AdapterID] = 0;
+ }
+ else if (I2O_PRIVATE == p8Msg[7])
+ {
+ //printk("i2o private 0x%x, 0x%x \n", p8Msg[7], p32[5]);
+ switch (p32[5])
+ {
+ case RC_PRIVATE_DEBUG_MSG:
+ msgFlag = 1;
+ /*printk("Received I2O_PRIVATE msg\n");*/
+ debug_msg[15] = (p32[6]&0xff000000) >> 24;
+ debug_msg[14] = (p32[6]&0x00ff0000) >> 16;
+ debug_msg[13] = (p32[6]&0x0000ff00) >> 8;
+ debug_msg[12] = (p32[6]&0x000000ff);
+
+ debug_msg[11] = (p32[7]&0xff000000) >> 24;
+ debug_msg[10] = (p32[7]&0x00ff0000) >> 16;
+ debug_msg[ 9] = (p32[7]&0x0000ff00) >> 8;
+ debug_msg[ 8] = (p32[7]&0x000000ff);
+
+ debug_msg[ 7] = (p32[8]&0xff000000) >> 24;
+ debug_msg[ 6] = (p32[8]&0x00ff0000) >> 16;
+ debug_msg[ 5] = (p32[8]&0x0000ff00) >> 8;
+ debug_msg[ 4] = (p32[8]&0x000000ff);
+
+ debug_msg[ 3] = (p32[9]&0xff000000) >> 24;
+ debug_msg[ 2] = (p32[9]&0x00ff0000) >> 16;
+ debug_msg[ 1] = (p32[9]&0x0000ff00) >> 8;
+ debug_msg[ 0] = (p32[9]&0x000000ff);
+
+ debug_msg[16] = '\0';
+ printk (debug_msg);
+ break;
+ case RC_PRIVATE_REBOOT:
+ printk("Adapter reboot initiated...\n");
+ if (pPab->pRebootCallbackFunc)
+ {
+ (*pPab->pRebootCallbackFunc)(0,0,0,AdapterID);
+ }
+ break;
+ default:
+ printk("Unknown private I2O msg received: 0x%x\n",
+ p32[5]);
+ break;
+ }
+ }
+
+ /*
+ ** Process other Msg's
+ */
+ else
+ {
+ ProcessOutboundI2OMsg(pPab, phyAddrMsg);
+ }
+
+ /* return MFA to outbound free Q*/
+ pPab->p_atu->OutQueue = phyAddrMsg;
+
+ /* any more msgs? */
+ phyAddrMsg = pPab->p_atu->OutQueue;
+ }
+}
+
+
+/*
+** =========================================================================
+** Returns LAN interface statistical counters to space provided by caller at
+** StatsReturnAddr. Returns 0 if success, else RC_RETURN code.
+** This function will call the WaitCallback function provided by
+** user while waiting for card to respond.
+** =========================================================================
+*/
+RC_RETURN
+RCGetLinkStatistics(U16 AdapterID,
+ P_RCLINKSTATS StatsReturnAddr,
+ PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset;
+ volatile U32 timeout;
+ volatile PU32 pMsg;
+ volatile PU32 p32, pReturnAddr;
+ P_NICSTAT pStats;
+ int i;
+ PPAB pPab;
+
+/*kprintf("Get82558Stats() StatsReturnAddr:0x%08.8ulx\n", StatsReturnAddr);*/
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("Get8255XStats(): Inbound Free Q empty!\n");
+#endif
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+/*dprintf("Get82558Stats - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
+/*dprintf("Get82558Stats - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
+
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = 0x112; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_NIC_STATS;
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ p32 = (PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+
+ pStats = (P_NICSTAT)p32;
+ pStats->dump_status = 0xFFFFFFFF;
+
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+
+ timeout = 100000;
+ while (1)
+ {
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++)
+ ;
+
+ if (pStats->dump_status != 0xFFFFFFFF)
+ break;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("RCGet82558Stats() Timeout waiting for NIC statistics\n");
+#endif
+ return RC_RTN_MSG_REPLY_TIMEOUT;
+ }
+ }
+
+ pReturnAddr = (PU32)StatsReturnAddr;
+
+ /* copy Nic stats to user's structure */
+ for (i = 0; i < (int) sizeof(RCLINKSTATS) / 4; i++)
+ pReturnAddr[i] = p32[i];
+
+ return RC_RTN_NO_ERROR;
+}
+
+
+/*
+** =========================================================================
+** Get82558LinkStatus()
+** =========================================================================
+*/
+RC_RETURN
+RCGetLinkStatus(U16 AdapterID, PU32 ReturnAddr, PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset;
+ volatile U32 timeout;
+ volatile PU32 pMsg;
+ volatile PU32 p32;
+ PPAB pPab;
+
+/*kprintf("Get82558LinkStatus() ReturnPhysAddr:0x%08.8ulx\n", ReturnAddr);*/
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ dprintf("Get82558LinkStatus(): Inbound Free Q empty!\n");
+#endif
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+/*dprintf("Get82558LinkStatus - pMsg = 0x%08ulx, InQ msgOffset = 0x%08ulx\n", pMsg, msgOffset);*/
+/*dprintf("Get82558LinkStatus - pMsg = 0x%08X, InQ msgOffset = 0x%08X\n", pMsg, msgOffset);*/
+
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = 0x112; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_LINK_STATUS;
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ p32 = (PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ *p32 = 0xFFFFFFFF;
+
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+
+ timeout = 100000;
+ while (1)
+ {
+ U32 i;
+
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++)
+ ;
+
+ if (*p32 != 0xFFFFFFFF)
+ break;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("Timeout waiting for link status\n");
+#endif
+ return RC_RTN_MSG_REPLY_TIMEOUT;
+ }
+ }
+
+ *ReturnAddr = *p32; /* 1 = up 0 = down */
+
+ return RC_RTN_NO_ERROR;
+
+}
+
+/*
+** =========================================================================
+** RCGetMAC()
+**
+** get the MAC address the adapter is listening for in non-promiscous mode.
+** MAC address is in media format.
+** =========================================================================
+*/
+RC_RETURN
+RCGetMAC(U16 AdapterID, PU8 mac, PFNWAITCALLBACK WaitCallback)
+{
+ unsigned i, timeout;
+ U32 off;
+ PU32 p;
+ U32 temp[2];
+ PPAB pPab;
+ PATU p_atu;
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ p_atu = pPab->p_atu;
+
+ p_atu->EtherMacLow = 0; /* first zero return data */
+ p_atu->EtherMacHi = 0;
+
+ off = p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ p = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+#ifdef RCDEBUG
+ printk("RCGetMAC: p_atu 0x%08x, off 0x%08x, p 0x%08x\n",
+ (uint)p_atu, (uint)off, (uint)p);
+#endif /* RCDEBUG */
+ /* setup private message */
+ p[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ p[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ p[2] = 0; /* initiator context */
+ p[3] = 0x218; /* transaction context */
+ p[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_MAC_ADDR;
+
+
+ p_atu->InQueue = off; /* send it to the I2O device */
+#ifdef RCDEBUG
+ printk("RCGetMAC: p_atu 0x%08x, off 0x%08x, p 0x%08x\n",
+ (uint)p_atu, (uint)off, (uint)p);
+#endif /* RCDEBUG */
+
+ /* wait for the rcpci45 board to update the info */
+ timeout = 1000000;
+ while (0 == p_atu->EtherMacLow)
+ {
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++)
+ ;
+
+ if (!timeout--)
+ {
+ printk("rc_getmac: Timeout\n");
+ return RC_RTN_MSG_REPLY_TIMEOUT;
+ }
+ }
+
+ /* read the mac address */
+ temp[0] = p_atu->EtherMacLow;
+ temp[1] = p_atu->EtherMacHi;
+ memcpy((char *)mac, (char *)temp, 6);
+
+
+#ifdef RCDEBUG
+// printk("rc_getmac: 0x%X\n", ptr);
+#endif /* RCDEBUG */
+
+ return RC_RTN_NO_ERROR;
+}
+
+
+/*
+** =========================================================================
+** RCSetMAC()
+**
+** set MAC address the adapter is listening for in non-promiscous mode.
+** MAC address is in media format.
+** =========================================================================
+*/
+RC_RETURN
+RCSetMAC(U16 AdapterID, PU8 mac)
+{
+ U32 off;
+ PU32 pMsg;
+ PPAB pPab;
+
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_MAC_ADDR;
+ pMsg[5] = *(unsigned *)mac; /* first four bytes */
+ pMsg[6] = *(unsigned *)(mac + 4); /* last two bytes */
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+
+ return RC_RTN_NO_ERROR ;
+}
+
+
+/*
+** =========================================================================
+** RCSetLinkSpeed()
+**
+** set ethernet link speed.
+** input: speedControl - determines action to take as follows
+** 0 = reset and auto-negotiate (NWay)
+** 1 = Full Duplex 100BaseT
+** 2 = Half duplex 100BaseT
+** 3 = Full Duplex 10BaseT
+** 4 = Half duplex 10BaseT
+** all other values are ignore (do nothing)
+** =========================================================================
+*/
+RC_RETURN
+RCSetLinkSpeed(U16 AdapterID, U16 LinkSpeedCode)
+{
+ U32 off;
+ PU32 pMsg;
+ PPAB pPab;
+
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_LINK_SPEED;
+ pMsg[5] = LinkSpeedCode; /* link speed code */
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+
+ return RC_RTN_NO_ERROR ;
+}
+/*
+** =========================================================================
+** RCSetPromiscuousMode()
+**
+** Defined values for Mode:
+** 0 - turn off promiscuous mode
+** 1 - turn on promiscuous mode
+**
+** =========================================================================
+*/
+RC_RETURN
+RCSetPromiscuousMode(U16 AdapterID, U16 Mode)
+{
+ U32 off;
+ PU32 pMsg;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_PROMISCUOUS_MODE;
+ pMsg[5] = Mode; /* promiscuous mode setting */
+
+ pPab->p_atu->InQueue = off; /* send it to the device */
+
+ return RC_RTN_NO_ERROR ;
+}
+/*
+** =========================================================================
+** RCGetPromiscuousMode()
+**
+** get promiscuous mode setting
+**
+** Possible return values placed in pMode:
+** 0 = promisuous mode not set
+** 1 = promisuous mode is set
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetPromiscuousMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ volatile PU32 p32;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+
+ msgOffset = pPab->p_atu->InQueue;
+
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+ kprintf("RCGetLinkSpeed(): Inbound Free Q empty!\n");
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virtual address of msg - virtual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ /* virtual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0xff;
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_PROMISCUOUS_MODE;
+ /* phys address to return status - area right after PAB */
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ /* post to Inbound Post Q */
+
+ pPab->p_atu->InQueue = msgOffset;
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] != 0xff)
+ break;
+
+ if (!timeout--)
+ {
+ kprintf("Timeout waiting for promiscuous mode from adapter\n");
+ kprintf("0x%08.8ulx\n", p32[0]);
+ return RC_RTN_NO_LINK_SPEED;
+ }
+ }
+
+ /* get mode */
+ *pMode = (U8)((volatile PU8)p32)[0] & 0x0f;
+
+ return RC_RTN_NO_ERROR;
+}
+/*
+** =========================================================================
+** RCSetBroadcastMode()
+**
+** Defined values for Mode:
+** 0 - turn off promiscuous mode
+** 1 - turn on promiscuous mode
+**
+** =========================================================================
+*/
+RC_RETURN
+RCSetBroadcastMode(U16 AdapterID, U16 Mode)
+{
+ U32 off;
+ PU32 pMsg;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_BROADCAST_MODE;
+ pMsg[5] = Mode; /* promiscuous mode setting */
+
+ pPab->p_atu->InQueue = off; /* send it to the device */
+
+ return RC_RTN_NO_ERROR ;
+}
+/*
+** =========================================================================
+** RCGetBroadcastMode()
+**
+** get promiscuous mode setting
+**
+** Possible return values placed in pMode:
+** 0 = promisuous mode not set
+** 1 = promisuous mode is set
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetBroadcastMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ volatile PU32 p32;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+
+ msgOffset = pPab->p_atu->InQueue;
+
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+ kprintf("RCGetLinkSpeed(): Inbound Free Q empty!\n");
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virtual address of msg - virtual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ /* virtual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0xff;
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_BROADCAST_MODE;
+ /* phys address to return status - area right after PAB */
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ /* post to Inbound Post Q */
+
+ pPab->p_atu->InQueue = msgOffset;
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] != 0xff)
+ break;
+
+ if (!timeout--)
+ {
+ kprintf("Timeout waiting for promiscuous mode from adapter\n");
+ kprintf("0x%08.8ulx\n", p32[0]);
+ return RC_RTN_NO_LINK_SPEED;
+ }
+ }
+
+ /* get mode */
+ *pMode = (U8)((volatile PU8)p32)[0] & 0x0f;
+
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** =========================================================================
+** RCGetLinkSpeed()
+**
+** get ethernet link speed.
+**
+** 0 = Unknown
+** 1 = Full Duplex 100BaseT
+** 2 = Half duplex 100BaseT
+** 3 = Full Duplex 10BaseT
+** 4 = Half duplex 10BaseT
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetLinkSpeed(U16 AdapterID, PU32 pLinkSpeedCode, PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ volatile PU32 p32;
+ U8 IOPLinkSpeed;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+
+ msgOffset = pPab->p_atu->InQueue;
+
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+ kprintf("RCGetLinkSpeed(): Inbound Free Q empty!\n");
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virtual address of msg - virtual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ /* virtual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0xff;
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_LINK_SPEED;
+ /* phys address to return status - area right after PAB */
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ /* post to Inbound Post Q */
+
+ pPab->p_atu->InQueue = msgOffset;
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] != 0xff)
+ break;
+
+ if (!timeout--)
+ {
+ kprintf("Timeout waiting for link speed from IOP\n");
+ kprintf("0x%08.8ulx\n", p32[0]);
+ return RC_RTN_NO_LINK_SPEED;
+ }
+ }
+
+ /* get Link speed */
+ IOPLinkSpeed = (U8)((volatile PU8)p32)[0] & 0x0f;
+
+ *pLinkSpeedCode= IOPLinkSpeed;
+
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** =========================================================================
+** RCReportDriverCapability(U16 AdapterID, U32 capability)
+**
+** Currently defined bits:
+** WARM_REBOOT_CAPABLE 0x01
+**
+** =========================================================================
+*/
+RC_RETURN
+RCReportDriverCapability(U16 AdapterID, U32 capability)
+{
+ U32 off;
+ PU32 pMsg;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_REPORT_DRIVER_CAPABILITY;
+ pMsg[5] = capability;
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+
+ return RC_RTN_NO_ERROR ;
+}
+
+/*
+** =========================================================================
+** RCGetFirmwareVer()
+**
+** Return firmware version in the form "SoftwareVersion : Bt BootVersion"
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetFirmwareVer(U16 AdapterID, PU8 pFirmString, PFNWAITCALLBACK WaitCallback)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ volatile PU32 p32;
+ PPAB pPab;
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ msgOffset = pPab->p_atu->InQueue;
+
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+ kprintf("RCGetFirmwareVer(): Inbound Free Q empty!\n");
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virtual address of msg - virtual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ /* virtual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0xff;
+
+ /* setup private message */
+ pMsg[0] = SIX_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_FIRMWARE_REV;
+ /* phys address to return status - area right after PAB */
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+
+
+ /* post to Inbound Post Q */
+
+ pPab->p_atu->InQueue = msgOffset;
+
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] != 0xff)
+ break;
+
+ if (!timeout--)
+ {
+ kprintf("Timeout waiting for link speed from IOP\n");
+ return RC_RTN_NO_FIRM_VER;
+ }
+ }
+
+ strcpy(pFirmString, (PU8)p32);
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** =========================================================================
+** RCResetLANCard()
+**
+** ResourceFlags indicates whether to return buffer resource explicitly
+** to host or keep and reuse.
+** CallbackFunction (if not NULL) is the function to be called when
+** reset is complete.
+** If CallbackFunction is NULL, ReturnAddr will have a 1 placed in it when
+** reset is done (if not NULL).
+**
+** =========================================================================
+*/
+RC_RETURN
+RCResetLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction)
+{
+ unsigned long off;
+ unsigned long *pMsg;
+ PPAB pPab;
+ int i;
+ long timeout = 0;
+
+
+ pPab =PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pPab->pCallbackFunc = CallbackFunction;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup message */
+ pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_LAN_RESET << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = ResourceFlags << 16; /* resource flags */
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+
+ if (CallbackFunction == (PFNCALLBACK)NULL)
+ {
+ /* call RCProcI2OMsgQ() until something in pPab->pCallbackFunc
+ or until timer goes off */
+ while (pPab->pCallbackFunc == (PFNCALLBACK)NULL)
+ {
+ RCProcI2OMsgQ(AdapterID);
+ for (i = 0; i < 100000; i++) /* please don't hog the bus!!! */
+ ;
+ timeout++;
+ if (timeout > 10000)
+ {
+ break;
+ }
+ }
+ if (ReturnAddr != (PU32)NULL)
+ *ReturnAddr = (U32)pPab->pCallbackFunc;
+ }
+
+ return RC_RTN_NO_ERROR ;
+}
+/*
+** =========================================================================
+** RCResetIOP()
+**
+** Send StatusGet Msg, wait for results return directly to buffer.
+**
+** =========================================================================
+*/
+RC_RETURN
+RCResetIOP(U16 AdapterID)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ PPAB pPab;
+ volatile PU32 p32;
+
+ pPab = PCIAdapterBlock[AdapterID];
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virtual address of msg - virtual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ pMsg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_EXEC_IOP_RESET << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
+ pMsg[2] = 0; /* universal context */
+ pMsg[3] = 0; /* universal context */
+ pMsg[4] = 0; /* universal context */
+ pMsg[5] = 0; /* universal context */
+ /* phys address to return status - area right after PAB */
+ pMsg[6] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+ pMsg[7] = 0;
+ pMsg[8] = 1; /* return 1 byte */
+
+ /* virual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0;
+ p32[1] = 0;
+
+ /* post to Inbound Post Q */
+
+ pPab->p_atu->InQueue = msgOffset;
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] || p32[1])
+ break;
+
+ if (!timeout--)
+ {
+ printk("RCResetIOP timeout\n");
+ return RC_RTN_MSG_REPLY_TIMEOUT;
+ }
+ }
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** =========================================================================
+** RCShutdownLANCard()
+**
+** ResourceFlags indicates whether to return buffer resource explicitly
+** to host or keep and reuse.
+** CallbackFunction (if not NULL) is the function to be called when
+** shutdown is complete.
+** If CallbackFunction is NULL, ReturnAddr will have a 1 placed in it when
+** shutdown is done (if not NULL).
+**
+** =========================================================================
+*/
+RC_RETURN
+RCShutdownLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction)
+{
+ volatile PU32 pMsg;
+ U32 off;
+ PPAB pPab;
+ int i;
+ long timeout = 0;
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pPab->pCallbackFunc = CallbackFunction;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup message */
+ pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_LAN_SHUTDOWN << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = ResourceFlags << 16; /* resource flags */
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+
+ if (CallbackFunction == (PFNCALLBACK)NULL)
+ {
+ /* call RCProcI2OMsgQ() until something in pPab->pCallbackFunc
+ or until timer goes off */
+ while (pPab->pCallbackFunc == (PFNCALLBACK)NULL)
+ {
+ RCProcI2OMsgQ(AdapterID);
+ for (i = 0; i < 100000; i++) /* please don't hog the bus!!! */
+ ;
+ timeout++;
+ if (timeout > 10000)
+ {
+ printk("RCShutdownLANCard(): timeout\n");
+ break;
+ }
+ }
+ if (ReturnAddr != (PU32)NULL)
+ *ReturnAddr = (U32)pPab->pCallbackFunc;
+ }
+ return RC_RTN_NO_ERROR ;
+}
+
+
+/*
+** =========================================================================
+** RCSetRavlinIPandMask()
+**
+** Set the Ravlin 45/PCI cards IP address and network mask.
+**
+** IP address and mask must be in network byte order.
+** For example, IP address 1.2.3.4 and mask 255.255.255.0 would be
+** 0x04030201 and 0x00FFFFFF on a little endian machine.
+**
+** =========================================================================
+*/
+RC_RETURN
+RCSetRavlinIPandMask(U16 AdapterID, U32 ipAddr, U32 netMask)
+{
+ volatile PU32 pMsg;
+ U32 off;
+ PPAB pPab;
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ off = pPab->p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+ /* setup private message */
+ pMsg[0] = SEVEN_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x219; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_SET_IP_AND_MASK;
+ pMsg[5] = ipAddr;
+ pMsg[6] = netMask;
+
+
+ pPab->p_atu->InQueue = off; /* send it to the I2O device */
+ return RC_RTN_NO_ERROR ;
+
+}
+
+/*
+** =========================================================================
+** RCGetRavlinIPandMask()
+**
+** get the IP address and MASK from the card
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetRavlinIPandMask(U16 AdapterID, PU32 pIpAddr, PU32 pNetMask,
+ PFNWAITCALLBACK WaitCallback)
+{
+ unsigned i, timeout;
+ U32 off;
+ PU32 pMsg, p32;
+ PPAB pPab;
+ PATU p_atu;
+
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: pIpAddr is 0x%08.8ulx, *IpAddr is 0x%08.8ulx\n", pIpAddr, *pIpAddr);
+#endif /* DEBUG */
+
+ pPab = PCIAdapterBlock[AdapterID];
+
+ if (pPab == NULL)
+ return RC_RTN_ADPTR_NOT_REGISTERED;
+
+ p_atu = pPab->p_atu;
+ off = p_atu->InQueue; /* get addresss of message */
+
+ if (0xFFFFFFFF == off)
+ return RC_RTN_FREE_Q_EMPTY;
+
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ *p32 = 0xFFFFFFFF;
+
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + off);
+
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: p_atu 0x%08.8ulx, off 0x%08.8ulx, p32 0x%08.8ulx\n", p_atu, off, p32);
+#endif /* DEBUG */
+ /* setup private message */
+ pMsg[0] = FIVE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_PRIVATE << 24 | I2O_HOST_TID << 12 | RC_LAN_TARGET_ID;
+ pMsg[2] = 0; /* initiator context */
+ pMsg[3] = 0x218; /* transaction context */
+ pMsg[4] = RC_PCI45_VENDOR_ID << 16 | RC_PRIVATE_GET_IP_AND_MASK;
+ pMsg[5] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ p_atu->InQueue = off; /* send it to the I2O device */
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: p_atu 0x%08.8ulx, off 0x%08.8ulx, p32 0x%08.8ulx\n", p_atu, off, p32);
+#endif /* DEBUG */
+
+ /* wait for the rcpci45 board to update the info */
+ timeout = 100000;
+ while (0xffffffff == *p32)
+ {
+ if (WaitCallback)
+ (*WaitCallback)();
+
+ for (i = 0; i < 1000; i++)
+ ;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: Timeout\n");
+#endif /* DEBUG */
+ return RC_RTN_MSG_REPLY_TIMEOUT;
+ }
+ }
+
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: after time out\n", \
+ "p32[0] (IpAddr) 0x%08.8ulx, p32[1] (IPmask) 0x%08.8ulx\n", p32[0], p32[1]);
+#endif /* DEBUG */
+
+ /* send IP and mask to user's space */
+ *pIpAddr = p32[0];
+ *pNetMask = p32[1];
+
+
+#ifdef DEBUG
+ kprintf("RCGetRavlinIPandMask: pIpAddr is 0x%08.8ulx, *IpAddr is 0x%08.8ulx\n", pIpAddr, *pIpAddr);
+#endif /* DEBUG */
+
+ return RC_RTN_NO_ERROR;
+}
+
+/*
+** /////////////////////////////////////////////////////////////////////////
+** /////////////////////////////////////////////////////////////////////////
+**
+** local functions
+**
+** /////////////////////////////////////////////////////////////////////////
+** /////////////////////////////////////////////////////////////////////////
+*/
+
+/*
+** =========================================================================
+** SendI2OOutboundQInitMsg()
+**
+** =========================================================================
+*/
+static int
+SendI2OOutboundQInitMsg(PPAB pPab)
+{
+ U32 msgOffset, timeout, phyOutQFrames, i;
+ volatile PU32 pMsg;
+ volatile PU32 p32;
+
+
+
+ msgOffset = pPab->p_atu->InQueue;
+
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("SendI2OOutboundQInitMsg(): Inbound Free Q empty!\n");
+#endif /* DEBUG */
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+#ifdef DEBUG
+ kprintf("SendI2OOutboundQInitMsg - pMsg = 0x%08.8ulx, InQ msgOffset = 0x%08.8ulx\n", pMsg, msgOffset);
+#endif /* DEBUG */
+
+ pMsg[0] = EIGHT_WORD_MSG_SIZE | TRL_OFFSET_6;
+ pMsg[1] = I2O_EXEC_OUTBOUND_INIT << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = 0x106; /* transaction context */
+ pMsg[4] = 4096; /* Host page frame size */
+ pMsg[5] = MSG_FRAME_SIZE << 16 | 0x80; /* outbound msg frame size and Initcode */
+ pMsg[6] = 0xD0000004; /* simple sgl element LE, EOB */
+ /* phys address to return status - area right after PAB */
+ pMsg[7] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+
+ /* virual pointer to return buffer - clear first two dwords */
+ p32 = (PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0;
+
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+
+ /* wait for response */
+ timeout = 100000;
+ while(1)
+ {
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0])
+ break;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("Timeout wait for InitOutQ InPrgress status from IOP\n");
+#endif /* DEBUG */
+ return RC_RTN_NO_I2O_STATUS;
+ }
+ }
+
+ timeout = 100000;
+ while(1)
+ {
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] == I2O_EXEC_OUTBOUND_INIT_COMPLETE)
+ break;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("Timeout wait for InitOutQ Complete status from IOP\n");
+#endif /* DEBUG */
+ return RC_RTN_NO_I2O_STATUS;
+ }
+ }
+
+ /* load PCI outbound free Q with MF physical addresses */
+ phyOutQFrames = pPab->outMsgBlockPhyAddr;
+
+ for (i = 0; i < NMBR_MSG_FRAMES; i++)
+ {
+ pPab->p_atu->OutQueue = phyOutQFrames;
+ phyOutQFrames += MSG_FRAME_SIZE;
+ }
+ return RC_RTN_NO_ERROR;
+}
+
+
+/*
+** =========================================================================
+** GetI2OStatus()
+**
+** Send StatusGet Msg, wait for results return directly to buffer.
+**
+** =========================================================================
+*/
+static int
+GetI2OStatus(PPAB pPab)
+{
+ U32 msgOffset, timeout;
+ PU32 pMsg;
+ volatile PU32 p32;
+
+
+ msgOffset = pPab->p_atu->InQueue;
+#ifdef DEBUG
+ printk("GetI2OStatus: msg offset = 0x%x\n", msgOffset);
+#endif /* DEBUG */
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("GetI2OStatus(): Inbound Free Q empty!\n");
+#endif /* DEBUG */
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+ pMsg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_EXEC_STATUS_GET << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
+ pMsg[2] = 0; /* universal context */
+ pMsg[3] = 0; /* universal context */
+ pMsg[4] = 0; /* universal context */
+ pMsg[5] = 0; /* universal context */
+ /* phys address to return status - area right after PAB */
+ pMsg[6] = pPab->outMsgBlockPhyAddr - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB);
+ pMsg[7] = 0;
+ pMsg[8] = 88; /* return 88 bytes */
+
+ /* virual pointer to return buffer - clear first two dwords */
+ p32 = (volatile PU32)(pPab->pLinOutMsgBlock - ADAPTER_BLOCK_RESERVED_SPACE + sizeof(PAB));
+ p32[0] = 0;
+ p32[1] = 0;
+
+#ifdef DEBUG
+ kprintf("GetI2OStatus - pMsg:0x%08.8ulx, msgOffset:0x%08.8ulx, [1]:0x%08.8ulx, [6]:0x%08.8ulx\n",
+ pMsg, msgOffset, pMsg[1], pMsg[6]);
+#endif /* DEBUG */
+
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+
+#ifdef DEBUG
+ kprintf("Return status to p32 = 0x%08.8ulx\n", p32);
+#endif /* DEBUG */
+
+ /* wait for response */
+ timeout = 1000000;
+ while(1)
+ {
+ int i;
+
+ for (i = 0; i < 1000; i++) /* please don't hog the bus!!! */
+ ;
+
+ if (p32[0] && p32[1])
+ break;
+
+ if (!timeout--)
+ {
+#ifdef DEBUG
+ kprintf("Timeout waiting for status from IOP\n");
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[0], p32[1], p32[2], p32[3]);
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[4], p32[5], p32[6], p32[7]);
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[8], p32[9], p32[10], p32[11]);
+#endif /* DEBUG */
+ return RC_RTN_NO_I2O_STATUS;
+ }
+ }
+
+#ifdef DEBUG
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[0], p32[1], p32[2], p32[3]);
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[4], p32[5], p32[6], p32[7]);
+ kprintf("0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[8], p32[9], p32[10], p32[11]);
+#endif /* DEBUG */
+ /* get IOP state */
+ pPab->IOPState = ((volatile PU8)p32)[10];
+ pPab->InboundMFrameSize = ((volatile PU16)p32)[6];
+
+#ifdef DEBUG
+ kprintf("IOP state 0x%02.2x InFrameSize = 0x%04.4x\n",
+ pPab->IOPState, pPab->InboundMFrameSize);
+#endif /* DEBUG */
+ return RC_RTN_NO_ERROR;
+}
+
+
+/*
+** =========================================================================
+** SendEnableSysMsg()
+**
+**
+** =========================================================================
+*/
+static int
+SendEnableSysMsg(PPAB pPab)
+{
+ U32 msgOffset; // timeout;
+ volatile PU32 pMsg;
+
+ msgOffset = pPab->p_atu->InQueue;
+
+ if (msgOffset == 0xFFFFFFFF)
+ {
+#ifdef DEBUG
+ kprintf("SendEnableSysMsg(): Inbound Free Q empty!\n");
+#endif /* DEBUG */
+ return RC_RTN_FREE_Q_EMPTY;
+ }
+
+ /* calc virual address of msg - virual already mapped to physical */
+ pMsg = (PU32)(pPab->pPci45LinBaseAddr + msgOffset);
+
+#ifdef DEBUG
+ kprintf("SendEnableSysMsg - pMsg = 0x%08.8ulx, InQ msgOffset = 0x%08.8ulx\n", pMsg, msgOffset);
+#endif /* DEBUG */
+
+ pMsg[0] = FOUR_WORD_MSG_SIZE | SGL_OFFSET_0;
+ pMsg[1] = I2O_EXEC_SYS_ENABLE << 24 | I2O_HOST_TID << 12 | I2O_IOP_TID;
+ pMsg[2] = DEFAULT_RECV_INIT_CONTEXT;
+ pMsg[3] = 0x110; /* transaction context */
+ pMsg[4] = 0x50657465; /* RedCreek Private */
+
+ /* post to Inbound Post Q */
+ pPab->p_atu->InQueue = msgOffset;
+
+ return RC_RTN_NO_ERROR;
+}
+
+
+/*
+** =========================================================================
+** FillI2OMsgFromTCB()
+**
+** inputs pMsgU32 - virual pointer (mapped to physical) of message frame
+** pXmitCntrlBlock - pointer to caller buffer control block.
+**
+** fills in LAN SGL after Transaction Control Word or Bucket Count.
+** =========================================================================
+*/
+static int
+FillI2OMsgSGLFromTCB(PU32 pMsgFrame, PRCTCB pTransCtrlBlock)
+{
+ unsigned int nmbrBuffers, nmbrSeg, nmbrDwords, context, flags;
+ PU32 pTCB, pMsg;
+
+ /* SGL element flags */
+#define EOB 0x40000000
+#define LE 0x80000000
+#define SIMPLE_SGL 0x10000000
+#define BC_PRESENT 0x01000000
+
+ pTCB = (PU32)pTransCtrlBlock;
+ pMsg = pMsgFrame;
+ nmbrDwords = 0;
+
+#ifdef DEBUG
+ kprintf("FillI2OMsgSGLFromTCBX\n");
+ kprintf("TCB 0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n",
+ pTCB[0], pTCB[1], pTCB[2], pTCB[3], pTCB[4]);
+ kprintf("pTCB 0x%08.8ulx, pMsg 0x%08.8ulx\n", pTCB, pMsg);
+#endif /* DEBUG */
+
+ nmbrBuffers = *pTCB++;
+
+ if (!nmbrBuffers)
+ {
+ return -1;
+ }
+
+ do
+ {
+ context = *pTCB++; /* buffer tag (context) */
+ nmbrSeg = *pTCB++; /* number of segments */
+
+ if (!nmbrSeg)
+ {
+ return -1;
+ }
+
+ flags = SIMPLE_SGL | BC_PRESENT;
+
+ if (1 == nmbrSeg)
+ {
+ flags |= EOB;
+
+ if (1 == nmbrBuffers)
+ flags |= LE;
+ }
+
+ /* 1st SGL buffer element has context */
+ pMsg[0] = pTCB[0] | flags ; /* send over count (segment size) */
+ pMsg[1] = context;
+ pMsg[2] = pTCB[1]; /* send buffer segment physical address */
+ nmbrDwords += 3;
+ pMsg += 3;
+ pTCB += 2;
+
+
+ if (--nmbrSeg)
+ {
+ do
+ {
+ flags = SIMPLE_SGL;
+
+ if (1 == nmbrSeg)
+ {
+ flags |= EOB;
+
+ if (1 == nmbrBuffers)
+ flags |= LE;
+ }
+
+ pMsg[0] = pTCB[0] | flags; /* send over count */
+ pMsg[1] = pTCB[1]; /* send buffer segment physical address */
+ nmbrDwords += 2;
+ pTCB += 2;
+ pMsg += 2;
+
+ } while (--nmbrSeg);
+ }
+
+ } while (--nmbrBuffers);
+
+ return nmbrDwords;
+}
+
+
+/*
+** =========================================================================
+** ProcessOutboundI2OMsg()
+**
+** process I2O reply message
+** * change to msg structure *
+** =========================================================================
+*/
+static void
+ProcessOutboundI2OMsg(PPAB pPab, U32 phyAddrMsg)
+{
+ PU8 p8Msg;
+ PU32 p32;
+ // U16 count;
+
+
+ p8Msg = pPab->pLinOutMsgBlock + (phyAddrMsg - pPab->outMsgBlockPhyAddr);
+ p32 = (PU32)p8Msg;
+
+#ifdef DEBUG
+ kprintf("VXD: ProcessOutboundI2OMsg - pPab 0x%08.8ulx, phyAdr 0x%08.8ulx, linAdr 0x%08.8ulx\n", pPab, phyAddrMsg, p8Msg);
+ kprintf("msg :0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[0], p32[1], p32[2], p32[3]);
+ kprintf("msg :0x%08.8ulx:0x%08.8ulx:0x%08.8ulx:0x%08.8ulx\n", p32[4], p32[5], p32[6], p32[7]);
+#endif /* DEBUG */
+
+ if (p32[4] >> 24 != I2O_REPLY_STATUS_SUCCESS)
+ {
+#ifdef DEBUG
+ kprintf("Message reply status not success\n");
+#endif /* DEBUG */
+ return;
+ }
+
+ switch (p8Msg[7] ) /* function code byte */
+ {
+ case I2O_EXEC_SYS_TAB_SET:
+ msgFlag = 1;
+#ifdef DEBUG
+ kprintf("Received I2O_EXEC_SYS_TAB_SET reply\n");
+#endif /* DEBUG */
+ break;
+
+ case I2O_EXEC_HRT_GET:
+ msgFlag = 1;
+#ifdef DEBUG
+ kprintf("Received I2O_EXEC_HRT_GET reply\n");
+#endif /* DEBUG */
+ break;
+
+ case I2O_EXEC_LCT_NOTIFY:
+ msgFlag = 1;
+#ifdef DEBUG
+ kprintf("Received I2O_EXEC_LCT_NOTIFY reply\n");
+#endif /* DEBUG */
+ break;
+
+ case I2O_EXEC_SYS_ENABLE:
+ msgFlag = 1;
+#ifdef DEBUG
+ kprintf("Received I2O_EXEC_SYS_ENABLE reply\n");
+#endif /* DEBUG */
+ break;
+
+ default:
+#ifdef DEBUG
+ kprintf("Received UNKNOWN reply\n");
+#endif /* DEBUG */
+ break;
+ }
+}
diff --git a/drivers/net/rclanmtl.h b/drivers/net/rclanmtl.h
new file mode 100644
index 000000000..2521b1cee
--- /dev/null
+++ b/drivers/net/rclanmtl.h
@@ -0,0 +1,637 @@
+/*
+** *************************************************************************
+**
+**
+** R C L A N M T L . H $Revision: 5 $
+**
+**
+** RedCreek I2O LAN Message Transport Layer header file.
+**
+** ---------------------------------------------------------------------
+** --- Copyright (c) 1997-1999, RedCreek Communications Inc. ---
+** --- All rights reserved. ---
+** ---------------------------------------------------------------------
+**
+** File Description:
+**
+** Header file for host I2O (Intelligent I/O) LAN message transport layer
+** API and data types.
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+** *************************************************************************
+*/
+
+#ifndef RCLANMTL_H
+#define RCLANMTL_H
+
+/* Linux specific includes */
+#define kprintf printk
+#ifdef RC_LINUX_MODULE /* linux modules need non-library version of string functions */
+#include <linux/string.h>
+#else
+#include <string.h>
+#endif
+
+/* PCI/45 Configuration space values */
+#define RC_PCI45_VENDOR_ID 0x4916
+#define RC_PCI45_DEVICE_ID 0x1960
+
+
+ /* RedCreek API function return values */
+#define RC_RTN_NO_ERROR 0
+#define RC_RTN_I2O_NOT_INIT 1
+#define RC_RTN_FREE_Q_EMPTY 2
+#define RC_RTN_TCB_ERROR 3
+#define RC_RTN_TRANSACTION_ERROR 4
+#define RC_RTN_ADAPTER_ALREADY_INIT 5
+#define RC_RTN_MALLOC_ERROR 6
+#define RC_RTN_ADPTR_NOT_REGISTERED 7
+#define RC_RTN_MSG_REPLY_TIMEOUT 8
+#define RC_RTN_NO_I2O_STATUS 9
+#define RC_RTN_NO_FIRM_VER 10
+#define RC_RTN_NO_LINK_SPEED 11
+
+/* Driver capability flags */
+#define WARM_REBOOT_CAPABLE 0x01
+
+ /* scalar data types */
+typedef unsigned char U8;
+typedef unsigned char* PU8;
+typedef unsigned short U16;
+typedef unsigned short* PU16;
+typedef unsigned long U32;
+typedef unsigned long* PU32;
+typedef unsigned long BF;
+typedef int RC_RETURN;
+
+
+ /*
+ ** type PFNWAITCALLBACK
+ **
+ ** pointer to void function - type used for WaitCallback in some functions
+ */
+typedef void (*PFNWAITCALLBACK)(void); /* void argument avoids compiler complaint */
+
+ /*
+ ** type PFNTXCALLBACK
+ **
+ ** Pointer to user's transmit callback function. This user function is
+ ** called from RCProcI2OMsgQ() when packet have been transmitted from buffers
+ ** given in the RCI2OSendPacket() function. BufferContext is a pointer to
+ ** an array of 32 bit context values. These are the values the user assigned
+ ** and passed in the TCB to the RCI2OSendPacket() function. PcktCount
+ ** indicates the number of buffer context values in the BufferContext[] array.
+ ** The User's TransmitCallbackFunction should recover (put back in free queue)
+ ** the packet buffers associated with the buffer context values.
+ */
+typedef void (*PFNTXCALLBACK)(U32 Status,
+ U16 PcktCount,
+ PU32 BufferContext,
+ U16 AdaterID);
+
+ /*
+ ** type PFNRXCALLBACK
+ **
+ ** Pointer to user's receive callback function. This user function
+ ** is called from RCProcI2OMsgQ() when packets have been received into
+ ** previously posted packet buffers throught the RCPostRecvBuffers() function.
+ ** The received callback function should process the Packet Descriptor Block
+ ** pointed to by PacketDescBlock. See Packet Decription Block below.
+ */
+typedef void (*PFNRXCALLBACK)(U32 Status,
+ U8 PktCount,
+ U32 BucketsRemain,
+ PU32 PacketDescBlock,
+ U16 AdapterID);
+
+ /*
+ ** type PFNCALLBACK
+ **
+ ** Pointer to user's generic callback function. This user function
+ ** can be passed to LANReset or LANShutdown and is called when the
+ ** the reset or shutdown is complete.
+ ** Param1 and Param2 are invalid for LANReset and LANShutdown.
+ */
+typedef void (*PFNCALLBACK)(U32 Status,
+ U32 Param1,
+ U32 Param2,
+ U16 AdapterID);
+
+/*
+** Status - Transmit and Receive callback status word
+**
+** A 32 bit Status is returned to the TX and RX callback functions. This value
+** contains both the reply status and the detailed status as follows:
+**
+** 32 24 16 0
+** +------+------+------------+
+** | Reply| | Detailed |
+** |Status| 0 | Status |
+** +------+------+------------+
+**
+** Reply Status and Detailed Status of zero indicates No Errors.
+*/
+ /* reply message status defines */
+#define I2O_REPLY_STATUS_SUCCESS 0x00
+#define I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 0x02
+#define I2O_REPLY_STATUS_TRANSACTION_ERROR 0x0A
+
+
+/* DetailedStatusCode defines */
+#define I2O_LAN_DSC_SUCCESS 0x0000
+#define I2O_LAN_DSC_DEVICE_FAILURE 0x0001
+#define I2O_LAN_DSC_DESTINATION_NOT_FOUND 0x0002
+#define I2O_LAN_DSC_TRANSMIT_ERROR 0x0003
+#define I2O_LAN_DSC_TRANSMIT_ABORTED 0x0004
+#define I2O_LAN_DSC_RECEIVE_ERROR 0x0005
+#define I2O_LAN_DSC_RECEIVE_ABORTED 0x0006
+#define I2O_LAN_DSC_DMA_ERROR 0x0007
+#define I2O_LAN_DSC_BAD_PACKET_DETECTED 0x0008
+#define I2O_LAN_DSC_OUT_OF_MEMORY 0x0009
+#define I2O_LAN_DSC_BUCKET_OVERRUN 0x000A
+#define I2O_LAN_DSC_IOP_INTERNAL_ERROR 0x000B
+#define I2O_LAN_DSC_CANCELED 0x000C
+#define I2O_LAN_DSC_INVALID_TRANSACTION_CONTEXT 0x000D
+#define I2O_LAN_DSC_DESTINATION_ADDRESS_DETECTED 0x000E
+#define I2O_LAN_DSC_DESTINATION_ADDRESS_OMITTED 0x000F
+#define I2O_LAN_DSC_PARTIAL_PACKET_RETURNED 0x0010
+
+
+/*
+** Packet Description Block (Received packets)
+**
+** A pointer to this block structure is returned to the ReceiveCallback
+** function. It contains the list of packet buffers which have either been
+** filled with a packet or returned to host due to a LANReset function.
+** Currently there will only be one packet per receive bucket (buffer) posted.
+**
+** 32 24 0
+** +-----------------------+ -\
+** | Buffer 1 Context | \
+** +-----------------------+ \
+** | 0xC0000000 | / First Bucket Descriptor
+** +-----+-----------------+ /
+** | 0 | packet 1 length | /
+** +-----------------------+ -\
+** | Buffer 2 Context | \
+** +-----------------------+ \
+** | 0xC0000000 | / Second Bucket Descriptor
+** +-----+-----------------+ /
+** | 0 | packet 2 length | /
+** +-----+-----------------+ -
+** | ... | ----- more bucket descriptors
+** +-----------------------+ -\
+** | Buffer n Context | \
+** +-----------------------+ \
+** | 0xC0000000 | / Last Bucket Descriptor
+** +-----+-----------------+ /
+** | 0 | packet n length | /
+** +-----+-----------------+ -
+**
+** Buffer Context values are those given to adapter in the TCB on calls to
+** RCPostRecvBuffers().
+**
+*/
+
+
+
+/*
+** Transaction Control Block (TCB) structure
+**
+** A structure like this is filled in by the user and passed by reference to
+** RCI2OSendPacket() and RCPostRecvBuffers() functions. Minimum size is five
+** 32-bit words for one buffer with one segment descriptor.
+** MAX_NMBR_POST_BUFFERS_PER_MSG defines the maximum single segment buffers
+** that can be described in a given TCB.
+**
+** 32 0
+** +-----------------------+
+** | Buffer Count | Number of buffers in the TCB
+** +-----------------------+
+** | Buffer 1 Context | first buffer reference
+** +-----------------------+
+** | Buffer 1 Seg Count | number of segments in buffer
+** +-----------------------+
+** | Buffer 1 Seg Desc 1 | first segment descriptor (size, physical address)
+** +-----------------------+
+** | ... | more segment descriptors (size, physical address)
+** +-----------------------+
+** | Buffer 1 Seg Desc n | last segment descriptor (size, physical address)
+** +-----------------------+
+** | Buffer 2 Context | second buffer reference
+** +-----------------------+
+** | Buffer 2 Seg Count | number of segments in buffer
+** +-----------------------+
+** | Buffer 2 Seg Desc 1 | segment descriptor (size, physical address)
+** +-----------------------+
+** | ... | more segment descriptors (size, physical address)
+** +-----------------------+
+** | Buffer 2 Seg Desc n |
+** +-----------------------+
+** | ... | more buffer descriptor blocks ...
+** +-----------------------+
+** | Buffer n Context |
+** +-----------------------+
+** | Buffer n Seg Count |
+** +-----------------------+
+** | Buffer n Seg Desc 1 |
+** +-----------------------+
+** | ... |
+** +-----------------------+
+** | Buffer n Seg Desc n |
+** +-----------------------+
+**
+**
+** A TCB for one contigous packet buffer would look like the following:
+**
+** 32 0
+** +-----------------------+
+** | 1 | one buffer in the TCB
+** +-----------------------+
+** | <user's Context> | user's buffer reference
+** +-----------------------+
+** | 1 | one segment buffer
+** +-----------------------+ _
+** | <buffer size> | size \
+** +-----------------------+ \ segment descriptor
+** | <physical address> | physical address of buffer /
+** +-----------------------+ _/
+**
+*/
+
+ /* Buffer Segment Descriptor */
+typedef struct
+{
+ U32 size;
+ U32 phyAddress;
+}
+ BSD, *PBSD;
+
+typedef PU32 PRCTCB;
+/*
+** -------------------------------------------------------------------------
+** Exported functions comprising the API to the LAN I2O message transport layer
+** -------------------------------------------------------------------------
+*/
+
+
+ /*
+ ** InitRCI2OMsgLayer()
+ **
+ ** Called once prior to using the I2O LAN message transport layer. User
+ ** provides both the physical and virual address of a locked page buffer
+ ** that is used as a private buffer for the RedCreek I2O message
+ ** transport layer. This buffer must be a contigous memory block of a
+ ** minimum of 16K bytes and long word aligned. The user also must provide
+ ** the base address of the RedCreek PCI adapter assigned by BIOS or operating
+ ** system. The user provided value AdapterID is a zero based index of the
+ ** Ravlin 45/PCI adapter. This interface number is used in all subsequent API
+ ** calls to identify which adpapter for which the function is intended.
+ ** Up to sixteen interfaces are supported with this API.
+ **
+ ** Inputs: AdapterID - interface number from 0 to 15
+ ** pciBaseAddr - virual base address of PCI (set by BIOS)
+ ** p_msgbuf - virual address to private message block (min. 16K)
+ ** p_phymsgbuf - physical address of private message block
+ ** TransmitCallbackFunction - address of user's TX callback function
+ ** ReceiveCallbackFunction - address of user's RX callback function
+ **
+ */
+RC_RETURN RCInitI2OMsgLayer(U16 AdapterID, U32 pciBaseAddr,
+ PU8 p_msgbuf, PU8 p_phymsgbuf,
+ PFNTXCALLBACK TransmitCallbackFunction,
+ PFNRXCALLBACK ReceiveCallbackFunction,
+ PFNCALLBACK RebootCallbackFunction);
+
+ /*
+ ** RCSetRavlinIPandMask()
+ **
+ ** Set the Ravlin 45/PCI cards IP address and network mask.
+ **
+ ** IP address and mask must be in network byte order.
+ ** For example, IP address 1.2.3.4 and mask 255.255.255.0 would be
+ ** 0x04030201 and 0x00FFFFFF on a little endian machine.
+ **
+ */
+RC_RETURN RCSetRavlinIPandMask(U16 AdapterID, U32 ipAddr, U32 netMask);
+
+
+/*
+** =========================================================================
+** RCGetRavlinIPandMask()
+**
+** get the IP address and MASK from the card
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetRavlinIPandMask(U16 AdapterID, PU32 pIpAddr, PU32 pNetMask,
+ PFNWAITCALLBACK WaitCallback);
+
+ /*
+ ** RCProcI2OMsgQ()
+ **
+ ** Called from user's polling loop or Interrupt Service Routine for a PCI
+ ** interrupt from the RedCreek PCI adapter. User responsible for determining
+ ** and hooking the PCI interrupt. This function will call the registered
+ ** callback functions, TransmitCallbackFunction or ReceiveCallbackFunction,
+ ** if a TX or RX transaction has completed.
+ */
+void RCProcI2OMsgQ(U16 AdapterID);
+
+
+ /*
+ ** Disable and Enable I2O interrupts. I2O interrupts are enabled at Init time
+ ** but can be disabled and re-enabled through these two function calls.
+ ** Packets will still be put into any posted recieved buffers and packets will
+ ** be sent through RCI2OSendPacket() functions. Disabling I2O interrupts
+ ** will prevent hardware interrupt to host even though the outbound I2O msg
+ ** queue is not emtpy.
+ */
+RC_RETURN RCEnableI2OInterrupts(U16 adapterID);
+RC_RETURN RCDisableI2OInterrupts(U16 AdapterID);
+
+
+ /*
+ ** RCPostRecvBuffers()
+ **
+ ** Post user's page locked buffers for use by the PCI adapter to
+ ** return ethernet packets received from the LAN. Transaction Control Block,
+ ** provided by user, contains buffer descriptor(s) which includes a buffer
+ ** context number along with buffer size and physical address. See TCB above.
+ ** The buffer context and actual packet length are returned to the
+ ** ReceiveCallbackFunction when packets have been received. Buffers posted
+ ** to the RedCreek adapter are considered owned by the adapter until the
+ ** context is return to user through the ReceiveCallbackFunction.
+ */
+RC_RETURN RCPostRecvBuffers(U16 AdapterID, PRCTCB pTransactionCtrlBlock);
+#define MAX_NMBR_POST_BUFFERS_PER_MSG 32
+
+ /*
+ ** RCI2OSendPacket()
+ **
+ ** Send user's ethernet packet from a locked page buffer.
+ ** Packet must have full MAC header, however without a CRC.
+ ** Initiator context is a user provided value that is returned
+ ** to the TransmitCallbackFunction when packet buffer is free.
+ ** Transmit buffer are considered owned by the adapter until context's
+ ** returned to user through the TransmitCallbackFunction.
+ */
+RC_RETURN RCI2OSendPacket(U16 AdapterID,
+ U32 context,
+ PRCTCB pTransactionCtrlBlock);
+
+
+ /* Ethernet Link Statistics structure */
+typedef struct tag_RC_link_stats
+{
+ U32 TX_good; /* good transmit frames */
+ U32 TX_maxcol; /* frames not TX due to MAX collisions */
+ U32 TX_latecol; /* frames not TX due to late collisions */
+ U32 TX_urun; /* frames not TX due to DMA underrun */
+ U32 TX_crs; /* frames TX with lost carrier sense */
+ U32 TX_def; /* frames deferred due to activity on link */
+ U32 TX_singlecol; /* frames TX with one and only on collision */
+ U32 TX_multcol; /* frames TX with more than one collision */
+ U32 TX_totcol; /* total collisions detected during TX */
+ U32 Rcv_good; /* good frames received */
+ U32 Rcv_CRCerr; /* frames RX and discarded with CRC errors */
+ U32 Rcv_alignerr; /* frames RX with alignment and CRC errors */
+ U32 Rcv_reserr; /* good frames discarded due to no RX buffer */
+ U32 Rcv_orun; /* RX frames lost due to FIFO overrun */
+ U32 Rcv_cdt; /* RX frames with collision during RX */
+ U32 Rcv_runt; /* RX frames shorter than 64 bytes */
+}
+ RCLINKSTATS, *P_RCLINKSTATS;
+
+ /*
+ ** RCGetLinkStatistics()
+ **
+ ** Returns link statistics in user's structure at address StatsReturnAddr
+ ** If given, not NULL, the function WaitCallback is called during the wait
+ ** loop while waiting for the adapter to respond.
+ */
+RC_RETURN RCGetLinkStatistics(U16 AdapterID,
+ P_RCLINKSTATS StatsReturnAddr,
+ PFNWAITCALLBACK WaitCallback);
+
+ /*
+ ** RCGetLinkStatus()
+ **
+ ** Return link status, up or down, to user's location addressed by ReturnAddr.
+ ** If given, not NULL, the function WaitCallback is called during the wait
+ ** loop while waiting for the adapter to respond.
+ */
+RC_RETURN RCGetLinkStatus(U16 AdapterID,
+ PU32 pReturnStatus,
+ PFNWAITCALLBACK WaitCallback);
+
+ /* Link Status defines - value returned in pReturnStatus */
+#define RC_LAN_LINK_STATUS_DOWN 0
+#define RC_LAN_LINK_STATUS_UP 1
+
+ /*
+ ** RCGetMAC()
+ **
+ ** Get the current MAC address assigned to user. RedCreek Ravlin 45/PCI
+ ** has two MAC addresses. One which is private to the PCI Card, and
+ ** another MAC which is given to the user as its link layer MAC address. The
+ ** adapter runs in promiscous mode because of the dual address requirement.
+ ** The MAC address is returned to the unsigned char array pointer to by mac.
+ */
+RC_RETURN RCGetMAC(U16 AdapterID, PU8 mac, PFNWAITCALLBACK WaitCallback);
+
+ /*
+ ** RCSetMAC()
+ **
+ ** Set a new user port MAC address. This address will be returned on
+ ** subsequent RCGetMAC() calls.
+ */
+RC_RETURN RCSetMAC(U16 AdapterID, PU8 mac);
+
+ /*
+ ** RCSetLinkSpeed()
+ **
+ ** set adapter's link speed based on given input code.
+ */
+RC_RETURN RCSetLinkSpeed(U16 AdapterID, U16 LinkSpeedCode);
+ /* Set link speed codes */
+#define LNK_SPD_AUTO_NEG_NWAY 0
+#define LNK_SPD_100MB_FULL 1
+#define LNK_SPD_100MB_HALF 2
+#define LNK_SPD_10MB_FULL 3
+#define LNK_SPD_10MB_HALF 4
+
+
+
+
+ /*
+ ** RCGetLinkSpeed()
+ **
+ ** Return link speed code.
+ */
+ /* Return link speed codes */
+#define LNK_SPD_UNKNOWN 0
+#define LNK_SPD_100MB_FULL 1
+#define LNK_SPD_100MB_HALF 2
+#define LNK_SPD_10MB_FULL 3
+#define LNK_SPD_10MB_HALF 4
+
+RC_RETURN
+RCGetLinkSpeed(U16 AdapterID, PU32 pLinkSpeedCode, PFNWAITCALLBACK WaitCallback);
+/*
+** =========================================================================
+** RCSetPromiscuousMode(U16 AdapterID, U16 Mode)
+**
+** Defined values for Mode:
+** 0 - turn off promiscuous mode
+** 1 - turn on promiscuous mode
+**
+** =========================================================================
+*/
+#define PROMISCUOUS_MODE_OFF 0
+#define PROMISCUOUS_MODE_ON 1
+RC_RETURN
+RCSetPromiscuousMode(U16 AdapterID, U16 Mode);
+/*
+** =========================================================================
+** RCGetPromiscuousMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
+**
+** get promiscuous mode setting
+**
+** Possible return values placed in pMode:
+** 0 = promisuous mode not set
+** 1 = promisuous mode is set
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetPromiscuousMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback);
+
+/*
+** =========================================================================
+** RCSetBroadcastMode(U16 AdapterID, U16 Mode)
+**
+** Defined values for Mode:
+** 0 - turn off promiscuous mode
+** 1 - turn on promiscuous mode
+**
+** =========================================================================
+*/
+#define BROADCAST_MODE_OFF 0
+#define BROADCAST_MODE_ON 1
+RC_RETURN
+RCSetBroadcastMode(U16 AdapterID, U16 Mode);
+/*
+** =========================================================================
+** RCGetBroadcastMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback)
+**
+** get broadcast mode setting
+**
+** Possible return values placed in pMode:
+** 0 = broadcast mode not set
+** 1 = broadcast mode is set
+**
+** =========================================================================
+*/
+RC_RETURN
+RCGetBroadcastMode(U16 AdapterID, PU32 pMode, PFNWAITCALLBACK WaitCallback);
+/*
+** =========================================================================
+** RCReportDriverCapability(U16 AdapterID, U32 capability)
+**
+** Currently defined bits:
+** WARM_REBOOT_CAPABLE 0x01
+**
+** =========================================================================
+*/
+RC_RETURN
+RCReportDriverCapability(U16 AdapterID, U32 capability);
+
+/*
+** RCGetFirmwareVer()
+**
+** Return firmware version in the form "SoftwareVersion : Bt BootVersion"
+**
+** WARNING: user's space pointed to by pFirmString should be at least 60 bytes.
+*/
+RC_RETURN
+RCGetFirmwareVer(U16 AdapterID, PU8 pFirmString, PFNWAITCALLBACK WaitCallback);
+
+/*
+** ----------------------------------------------
+** LAN adapter Reset and Shutdown functions
+** ----------------------------------------------
+*/
+ /* resource flag bit assignments for RCResetLANCard() & RCShutdownLANCard() */
+#define RC_RESOURCE_RETURN_POSTED_RX_BUCKETS 0x0001
+#define RC_RESOURCE_RETURN_PEND_TX_BUFFERS 0x0002
+
+ /*
+ ** RCResetLANCard()
+ **
+ ** Reset LAN card operation. Causes a software reset of the ethernet
+ ** controller and restarts the command and receive units. Depending on
+ ** the ResourceFlags given, the buffers are either returned to the
+ ** host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER and
+ ** detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
+ ** posted after issuing this) OR the buffers are kept and reused by
+ ** the ethernet controller. If CallbackFunction is not NULL, the function
+ ** will be called when the reset is complete. If the CallbackFunction is
+ ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset
+ ** to complete (please disable I2O interrupts during this method).
+ ** Any outstanding transmit or receive buffers that are complete will be
+ ** returned via the normal reply messages before the requested resource
+ ** buffers are returned.
+ ** A call to RCPostRecvBuffers() is needed to return the ethernet to full
+ ** operation if the receive buffers were returned during LANReset.
+ ** Note: The IOP status is not affected by a LAN reset.
+ */
+RC_RETURN RCResetLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction);
+
+
+ /*
+ ** RCShutdownLANCard()
+ **
+ ** Shutdown LAN card operation and put into an idle (suspended) state.
+ ** The LAN card is restarted with RCResetLANCard() function.
+ ** Depending on the ResourceFlags given, the buffers are either returned
+ ** to the host with reply status of I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER
+ ** and detailed status of I2O_LAN_DSC_CANCELED (new receive buffers must be
+ ** posted after issuing this) OR the buffers are kept and reused by
+ ** the ethernet controller. If CallbackFunction is not NULL, the function
+ ** will be called when the reset is complete. If the CallbackFunction is
+ ** NULL,a 1 will be put into the ReturnAddr after waiting for the reset
+ ** to complete (please disable I2O interrupts during this method).
+ ** Any outstanding transmit or receive buffers that are complete will be
+ ** returned via the normal reply messages before the requested resource
+ ** buffers are returned.
+ ** Note: The IOP status is not affected by a LAN shutdown.
+ */
+RC_RETURN
+RCShutdownLANCard(U16 AdapterID, U16 ResourceFlags, PU32 ReturnAddr, PFNCALLBACK CallbackFunction);
+
+ /*
+ ** RCResetIOP();
+ ** Initializes IOPState to I2O_IOP_STATE_RESET.
+ ** Stops access to outbound message Q.
+ ** Discards any outstanding transmit or posted receive buffers.
+ ** Clears outbound message Q.
+ */
+RC_RETURN
+RCResetIOP(U16 AdapterID);
+
+#endif /* RCLANMTL_H */
diff --git a/drivers/net/rcpci45.c b/drivers/net/rcpci45.c
new file mode 100644
index 000000000..2c5a070ee
--- /dev/null
+++ b/drivers/net/rcpci45.c
@@ -0,0 +1,1419 @@
+/*
+** RCpci45.c
+**
+**
+**
+** ---------------------------------------------------------------------
+** --- Copyright (c) 1998, 1999, RedCreek Communications Inc. ---
+** --- All rights reserved. ---
+** ---------------------------------------------------------------------
+**
+** Written by Pete Popov and Brian Moyle.
+**
+** Known Problems
+**
+** None known at this time.
+**
+** TODO:
+** -Get rid of the wait loops in the API and replace them
+** with system independent delays ...something like
+** "delayms(2)". However, under normal circumstances, the
+** delays are very short so they're not a problem.
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+**
+**
+** Pete Popov, January 11,99: Fixed a couple of 2.1.x problems
+** (virt_to_bus() not called), tested it under 2.2pre5, and added a
+** #define to enable the use of the same file for both, the 2.0.x kernels
+** as well as the 2.1.x.
+**
+** Ported to 2.1.x by Alan Cox 1998/12/9.
+**
+***************************************************************************/
+
+static char *version =
+"RedCreek Communications PCI linux driver version 2.00\n";
+
+
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/string.h>
+#include <linux/ptrace.h>
+#include <linux/errno.h>
+#include <linux/in.h>
+#include <linux/ioport.h>
+#include <linux/malloc.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/bios32.h>
+#include <linux/timer.h>
+#include <asm/irq.h> /* For NR_IRQS only. */
+#include <asm/bitops.h>
+#include <asm/io.h>
+
+#if LINUX_VERSION_CODE >= 0x020100
+#define LINUX_2_1
+#endif
+
+#ifdef LINUX_2_1
+#include <asm/uaccess.h>
+#endif
+
+#include <linux/if_ether.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/skbuff.h>
+
+
+#define RC_LINUX_MODULE
+#include "rclanmtl.h"
+#include "rcif.h"
+
+#define RUN_AT(x) (jiffies + (x))
+
+#define NEW_MULTICAST
+#include <linux/delay.h>
+
+#ifndef LINUX_2_1
+#define ioremap vremap
+#define iounmap vfree
+#endif
+
+/* PCI/45 Configuration space values */
+#define RC_PCI45_VENDOR_ID 0x4916
+#define RC_PCI45_DEVICE_ID 0x1960
+
+#define MAX_ETHER_SIZE 1520
+#define MAX_NMBR_RCV_BUFFERS 96
+#define RC_POSTED_BUFFERS_LOW_MARK MAX_NMBR_RCV_BUFFERS-16
+#define BD_SIZE 3 /* Bucket Descriptor size */
+#define BD_LEN_OFFSET 2 /* Bucket Descriptor offset to length field */
+
+
+/* RedCreek LAN device Target ID */
+#define RC_LAN_TARGET_ID 0x10
+/* RedCreek's OSM default LAN receive Initiator */
+#define DEFAULT_RECV_INIT_CONTEXT 0xA17
+
+
+static U32 DriverControlWord = 0;
+
+static void rc_timer(unsigned long);
+
+/*
+ * Driver Private Area, DPA.
+ */
+typedef struct
+{
+
+ /*
+ * pointer to the device structure which is part
+ * of the interface to the Linux kernel.
+ */
+ struct device *dev;
+
+ char devname[8]; /* "ethN" string */
+ U8 id; /* the AdapterID */
+ U32 pci_addr; /* the pci address of the adapter */
+ U32 bus;
+ U32 function;
+ struct timer_list timer; /* timer */
+ struct enet_statistics stats; /* the statistics structure */
+ struct device *next; /* points to the next RC adapter */
+ unsigned long numOutRcvBuffers;/* number of outstanding receive buffers*/
+ unsigned char shutdown;
+ unsigned char reboot;
+ unsigned char nexus;
+ PU8 PLanApiPA; /* Pointer to Lan Api Private Area */
+
+}
+DPA, *PDPA;
+
+#define MAX_ADAPTERS 32
+
+static PDPA PCIAdapters[MAX_ADAPTERS] =
+{
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
+};
+
+
+static int RCscan(void);
+static struct device
+*RCfound_device(struct device *, int, int, int, int, int, int);
+
+static int RCprobe1(struct device *);
+static int RCopen(struct device *);
+static int RC_xmit_packet(struct sk_buff *, struct device *);
+static void RCinterrupt(int, void *, struct pt_regs *);
+static int RCclose(struct device *dev);
+static struct enet_statistics *RCget_stats(struct device *);
+static int RCioctl(struct device *, struct ifreq *, int);
+static int RCconfig(struct device *, struct ifmap *);
+static void RCxmit_callback(U32, U16, PU32, U16);
+static void RCrecv_callback(U32, U8, U32, PU32, U16);
+static void RCreset_callback(U32, U32, U32, U16);
+static void RCreboot_callback(U32, U32, U32, U16);
+static int RC_allocate_and_post_buffers(struct device *, int);
+
+
+/* A list of all installed RC devices, for removing the driver module. */
+static struct device *root_RCdev = NULL;
+
+#ifdef MODULE
+int init_module(void)
+#else
+int rcpci_probe(struct netdevice *dev)
+#endif
+{
+ int cards_found;
+
+ printk(version);
+
+ root_RCdev = NULL;
+ cards_found = RCscan();
+#ifdef MODULE
+ return cards_found ? 0 : -ENODEV;
+#else
+ return -1;
+#endif
+}
+
+static int RCscan()
+{
+ int cards_found = 0;
+ struct device *dev = 0;
+
+ if (pcibios_present())
+ {
+ static int pci_index = 0;
+ unsigned char pci_bus, pci_device_fn;
+ int scan_status;
+ int board_index = 0;
+
+ for (;pci_index < 0xff; pci_index++)
+ {
+ unsigned char pci_irq_line;
+ unsigned short pci_command, vendor, device, class;
+ unsigned int pci_ioaddr;
+
+
+ scan_status =
+ (pcibios_find_device (RC_PCI45_VENDOR_ID,
+ RC_PCI45_DEVICE_ID,
+ pci_index,
+ &pci_bus,
+ &pci_device_fn));
+#ifdef RCDEBUG
+ printk("rc scan_status = 0x%X\n", scan_status);
+#endif
+ if (scan_status != PCIBIOS_SUCCESSFUL)
+ break;
+ pcibios_read_config_word(pci_bus,
+ pci_device_fn,
+ PCI_VENDOR_ID, &vendor);
+ pcibios_read_config_word(pci_bus,
+ pci_device_fn,
+ PCI_DEVICE_ID, &device);
+ pcibios_read_config_byte(pci_bus,
+ pci_device_fn,
+ PCI_INTERRUPT_LINE, &pci_irq_line);
+ pcibios_read_config_dword(pci_bus,
+ pci_device_fn,
+ PCI_BASE_ADDRESS_0, &pci_ioaddr);
+ pcibios_read_config_word(pci_bus,
+ pci_device_fn,
+ PCI_CLASS_DEVICE, &class);
+
+ pci_ioaddr &= ~0xf;
+
+#ifdef RCDEBUG
+ printk("rc: Found RedCreek PCI adapter\n");
+ printk("rc: pci class = 0x%x 0x%x \n", class, class>>8);
+ printk("rc: pci_bus = %d, pci_device_fn = %d\n", pci_bus, pci_device_fn);
+ printk("rc: pci_irq_line = 0x%x \n", pci_irq_line);
+ printk("rc: pci_ioaddr = 0x%x\n", pci_ioaddr);
+#endif
+
+#if 1
+ if (check_region(pci_ioaddr, 2*32768))
+ {
+ printk("rc: check_region failed\n");
+ continue;
+ }
+ else
+ {
+ printk("rc: check_region passed\n");
+ }
+#endif
+
+ /*
+ * Get and check the bus-master and latency values.
+ * Some PCI BIOSes fail to set the master-enable bit.
+ */
+
+ pcibios_read_config_word(pci_bus,
+ pci_device_fn,
+ PCI_COMMAND,
+ &pci_command);
+ if ( ! (pci_command & PCI_COMMAND_MASTER)) {
+ printk("rc: PCI Master Bit has not been set!\n");
+
+ pci_command |= PCI_COMMAND_MASTER;
+ pcibios_write_config_word(pci_bus,
+ pci_device_fn,
+ PCI_COMMAND,
+ pci_command);
+ }
+ if ( ! (pci_command & PCI_COMMAND_MEMORY)) {
+ /*
+ * If the BIOS did not set the memory enable bit, what else
+ * did it not initialize? Skip this adapter.
+ */
+ printk("rc: Adapter %d, PCI Memory Bit has not been set!\n",
+ cards_found);
+ printk("rc: Bios problem? \n");
+ continue;
+ }
+
+ dev = RCfound_device(dev, pci_ioaddr, pci_irq_line,
+ pci_bus, pci_device_fn,
+ board_index++, cards_found);
+
+ if (dev) {
+ dev = 0;
+ cards_found++;
+ }
+ }
+ }
+ printk("rc: found %d cards \n", cards_found);
+ return cards_found;
+}
+
+static struct device *
+RCfound_device(struct device *dev, int memaddr, int irq,
+ int bus, int function, int product_index, int card_idx)
+{
+ int dev_size = 32768;
+ unsigned long *vaddr=0;
+ PDPA pDpa;
+ int init_status;
+
+ /*
+ * Allocate and fill new device structure.
+ * We need enough for struct device plus DPA plus the LAN API private
+ * area, which requires a minimum of 16KB. The top of the allocated
+ * area will be assigned to struct device; the next chunk will be
+ * assigned to DPA; and finally, the rest will be assigned to the
+ * the LAN API layer.
+ */
+ dev = (struct device *) kmalloc(dev_size, GFP_DMA | GFP_KERNEL |GFP_ATOMIC);
+ memset(dev, 0, dev_size);
+#ifdef RCDEBUG
+ printk("rc: dev = 0x%08X\n", (uint)dev);
+#endif
+
+ /*
+ * dev->priv will point to the start of DPA.
+ */
+ dev->priv = (void *)(((long)dev + sizeof(struct device) + 15) & ~15);
+ pDpa = dev->priv;
+ dev->name = pDpa->devname;
+
+ pDpa->dev = dev; /* this is just for easy reference */
+ pDpa->function = function;
+ pDpa->bus = bus;
+ pDpa->id = card_idx; /* the device number */
+ pDpa->pci_addr = memaddr;
+ PCIAdapters[card_idx] = pDpa;
+#ifdef RCDEBUG
+ printk("rc: pDpa = 0x%x, id = %d \n", (uint)pDpa, (uint)pDpa->id);
+#endif
+
+ /*
+ * Save the starting address of the LAN API private area. We'll
+ * pass that to RCInitI2OMsgLayer().
+ */
+ pDpa->PLanApiPA = (void *)(((long)pDpa + sizeof(DPA) + 0xff) & ~0xff);
+#ifdef RCDEBUG
+ printk("rc: pDpa->PLanApiPA = 0x%x\n", (uint)pDpa->PLanApiPA);
+#endif
+
+ /* The adapter is accessable through memory-access read/write, not
+ * I/O read/write. Thus, we need to map it to some virtual address
+ * area in order to access the registers are normal memory.
+ */
+ vaddr = (ulong *) ioremap (memaddr, 2*32768);
+#ifdef RCDEBUG
+ printk("rc: RCfound_device: 0x%x, priv = 0x%x, vaddr = 0x%x\n",
+ (uint)dev, (uint)dev->priv, (uint)vaddr);
+#endif
+ dev->base_addr = (unsigned long)vaddr;
+ dev->irq = irq;
+ dev->interrupt = 0;
+
+ /*
+ * Request a shared interrupt line.
+ */
+ if ( request_irq(dev->irq, (void *)RCinterrupt,
+ SA_INTERRUPT|SA_SHIRQ, "RedCreek VPN Adapter", dev) )
+ {
+ printk( "RC PCI 45: %s: unable to get IRQ %d\n", (PU8)dev->name, (uint)dev->irq );
+ iounmap(vaddr);
+ kfree(dev);
+ return 0;
+ }
+
+ init_status = RCInitI2OMsgLayer(pDpa->id, dev->base_addr,
+ pDpa->PLanApiPA, (PU8)virt_to_bus((void *)pDpa->PLanApiPA),
+ (PFNTXCALLBACK)RCxmit_callback,
+ (PFNRXCALLBACK)RCrecv_callback,
+ (PFNCALLBACK)RCreboot_callback);
+#ifdef RCDEBUG
+ printk("rc: I2O msg initted: status = 0x%x\n", init_status);
+#endif
+ if (init_status)
+ {
+ printk("rc: Unable to initialize msg layer\n");
+ free_irq(dev->irq, dev);
+ iounmap(vaddr);
+ kfree(dev);
+ return 0;
+ }
+ if (RCGetMAC(pDpa->id, dev->dev_addr, NULL))
+ {
+ printk("rc: Unable to get adapter MAC\n");
+ free_irq(dev->irq, dev);
+ iounmap(vaddr);
+ kfree(dev);
+ return 0;
+ }
+
+ DriverControlWord |= WARM_REBOOT_CAPABLE;
+ RCReportDriverCapability(pDpa->id, DriverControlWord);
+
+ dev->init = RCprobe1;
+ ether_setup(dev); /* linux kernel interface */
+
+ pDpa->next = root_RCdev;
+ root_RCdev = dev;
+
+ if (register_netdev(dev) != 0) /* linux kernel interface */
+ {
+ printk("rc: unable to register device \n");
+ free_irq(dev->irq, dev);
+ iounmap(vaddr);
+ kfree(dev);
+ return 0;
+ }
+ return dev;
+}
+
+static int RCprobe1(struct device *dev)
+{
+ dev->open = RCopen;
+ dev->hard_start_xmit = RC_xmit_packet;
+ dev->stop = RCclose;
+ dev->get_stats = RCget_stats;
+ dev->do_ioctl = RCioctl;
+ dev->set_config = RCconfig;
+ return 0;
+}
+
+static int
+RCopen(struct device *dev)
+{
+ int post_buffers = MAX_NMBR_RCV_BUFFERS;
+ PDPA pDpa = (PDPA) dev->priv;
+ int count = 0;
+ int requested = 0;
+
+#ifdef RCDEBUG
+ printk("rc: RCopen\n");
+#endif
+ RCEnableI2OInterrupts(pDpa->id);
+
+ if (pDpa->nexus)
+ {
+ /* This is not the first time RCopen is called. Thus,
+ * the interface was previously opened and later closed
+ * by RCclose(). RCclose() does a Shutdown; to wake up
+ * the adapter, a reset is mandatory before we can post
+ * receive buffers. However, if the adapter initiated
+ * a reboot while the interface was closed -- and interrupts
+ * were turned off -- we need will need to reinitialize
+ * the adapter, rather than simply waking it up.
+ */
+ printk("rc: Waking up adapter...\n");
+ RCResetLANCard(pDpa->id,0,0,0);
+ }
+ else
+ {
+ pDpa->nexus = 1;
+ }
+
+ while(post_buffers)
+ {
+ if (post_buffers > MAX_NMBR_POST_BUFFERS_PER_MSG)
+ requested = MAX_NMBR_POST_BUFFERS_PER_MSG;
+ else
+ requested = post_buffers;
+ count = RC_allocate_and_post_buffers(dev, requested);
+
+ if ( count < requested )
+ {
+ /*
+ * Check to see if we were able to post any buffers at all.
+ */
+ if (post_buffers == MAX_NMBR_RCV_BUFFERS)
+ {
+ printk("rc: Error RCopen: not able to allocate any buffers\r\n");
+ return(-ENOMEM);
+ }
+ printk("rc: Warning RCopen: not able to allocate all requested buffers\r\n");
+ break; /* we'll try to post more buffers later */
+ }
+ else
+ post_buffers -= count;
+ }
+ pDpa->numOutRcvBuffers = MAX_NMBR_RCV_BUFFERS - post_buffers;
+ pDpa->shutdown = 0; /* just in case */
+#ifdef RCDEBUG
+ printk("rc: RCopen: posted %d buffers\n", (uint)pDpa->numOutRcvBuffers);
+#endif
+ MOD_INC_USE_COUNT;
+ return 0;
+}
+
+static int
+RC_xmit_packet(struct sk_buff *skb, struct device *dev)
+{
+
+ PDPA pDpa = (PDPA) dev->priv;
+ singleTCB tcb;
+ psingleTCB ptcb = &tcb;
+ RC_RETURN status = 0;
+
+ if (dev->tbusy || pDpa->shutdown || pDpa->reboot)
+ {
+#ifdef RCDEBUG
+ printk("rc: RC_xmit_packet: tbusy!\n");
+#endif
+ return 1;
+ }
+
+ if ( skb->len <= 0 )
+ {
+ printk("RC_xmit_packet: skb->len less than 0!\n");
+ return 0;
+ }
+
+ /*
+ * The user is free to reuse the TCB after RCI2OSendPacket() returns, since
+ * the function copies the necessary info into its own private space. Thus,
+ * our TCB can be a local structure. The skb, on the other hand, will be
+ * freed up in our interrupt handler.
+ */
+ ptcb->bcount = 1;
+ /*
+ * we'll get the context when the adapter interrupts us to tell us that
+ * the transmision is done. At that time, we can free skb.
+ */
+ ptcb->b.context = (U32)skb;
+ ptcb->b.scount = 1;
+ ptcb->b.size = skb->len;
+ ptcb->b.addr = virt_to_bus((void *)skb->data);
+
+#ifdef RCDEBUG
+ printk("rc: RC xmit: skb = 0x%x, pDpa = 0x%x, id = %d, ptcb = 0x%x\n",
+ (uint)skb, (uint)pDpa, (uint)pDpa->id, (uint)ptcb);
+#endif
+ if ( (status = RCI2OSendPacket(pDpa->id, (U32)NULL, (PRCTCB)ptcb))
+ != RC_RTN_NO_ERROR)
+ {
+#ifdef RCDEBUG
+ printk("rc: RC send error 0x%x\n", (uint)status);
+#endif
+ dev->tbusy = 1;
+ return 1;
+ }
+ else
+ {
+ dev->trans_start = jiffies;
+ // dev->tbusy = 0;
+ }
+ /*
+ * That's it!
+ */
+ return 0;
+}
+
+/*
+ * RCxmit_callback()
+ *
+ * The transmit callback routine. It's called by RCProcI2OMsgQ()
+ * because the adapter is done with one or more transmit buffers and
+ * it's returning them to us, or we asked the adapter to return the
+ * outstanding transmit buffers by calling RCResetLANCard() with
+ * RC_RESOURCE_RETURN_PEND_TX_BUFFERS flag.
+ * All we need to do is free the buffers.
+ */
+static void
+RCxmit_callback(U32 Status,
+ U16 PcktCount,
+ PU32 BufferContext,
+ U16 AdapterID)
+{
+ struct sk_buff *skb;
+ PDPA pDpa;
+ struct device *dev;
+
+ pDpa = PCIAdapters[AdapterID];
+ if (!pDpa)
+ {
+ printk("rc: Fatal error: xmit callback, !pDpa\n");
+ return;
+ }
+ dev = pDpa->dev;
+
+ // printk("xmit_callback: Status = 0x%x\n", (uint)Status);
+ if (Status != I2O_REPLY_STATUS_SUCCESS)
+ {
+ printk("rc: xmit_callback: Status = 0x%x\n", (uint)Status);
+ }
+#ifdef RCDEBUG
+ if (pDpa->shutdown || pDpa->reboot)
+ printk("rc: xmit callback: shutdown||reboot\n");
+#endif
+
+#ifdef RCDEBUG
+ printk("rc: xmit_callback: PcktCount = %d, BC = 0x%x\n",
+ (uint)PcktCount, (uint)BufferContext);
+#endif
+ while (PcktCount--)
+ {
+ skb = (struct sk_buff *)(BufferContext[0]);
+#ifdef RCDEBUG
+ printk("rc: skb = 0x%x\n", (uint)skb);
+#endif
+ BufferContext++;
+#ifdef LINUX_2_1
+ dev_kfree_skb (skb);
+#else
+ dev_kfree_skb (skb, FREE_WRITE);
+#endif
+ }
+ dev->tbusy = 0;
+
+}
+
+static void
+RCreset_callback(U32 Status, U32 p1, U32 p2, U16 AdapterID)
+{
+ PDPA pDpa;
+ struct device *dev;
+
+ pDpa = PCIAdapters[AdapterID];
+ dev = pDpa->dev;
+#ifdef RCDEBUG
+ printk("rc: RCreset_callback Status 0x%x\n", (uint)Status);
+#endif
+ /*
+ * Check to see why we were called.
+ */
+ if (pDpa->shutdown)
+ {
+ printk("rc: Shutting down interface\n");
+ pDpa->shutdown = 0;
+ pDpa->reboot = 0;
+ MOD_DEC_USE_COUNT;
+ }
+ else if (pDpa->reboot)
+ {
+ printk("rc: reboot, shutdown adapter\n");
+ /*
+ * We don't set any of the flags in RCShutdownLANCard()
+ * and we don't pass a callback routine to it.
+ * The adapter will have already initiated the reboot by
+ * the time the function returns.
+ */
+ RCDisableI2OInterrupts(pDpa->id);
+ RCShutdownLANCard(pDpa->id,0,0,0);
+ printk("rc: scheduling timer...\n");
+ init_timer(&pDpa->timer);
+ pDpa->timer.expires = RUN_AT((30*HZ)/10); /* 3 sec. */
+ pDpa->timer.data = (unsigned long)dev;
+ pDpa->timer.function = &rc_timer; /* timer handler */
+ add_timer(&pDpa->timer);
+ }
+
+
+
+}
+
+static void
+RCreboot_callback(U32 Status, U32 p1, U32 p2, U16 AdapterID)
+{
+ PDPA pDpa;
+
+ pDpa = PCIAdapters[AdapterID];
+#ifdef RCDEBUG
+ printk("rc: RCreboot: rcv buffers outstanding = %d\n",
+ (uint)pDpa->numOutRcvBuffers);
+#endif
+ if (pDpa->shutdown)
+ {
+ printk("rc: skipping reboot sequence -- shutdown already initiated\n");
+ return;
+ }
+ pDpa->reboot = 1;
+ /*
+ * OK, we reset the adapter and ask it to return all
+ * outstanding transmit buffers as well as the posted
+ * receive buffers. When the adapter is done returning
+ * those buffers, it will call our RCreset_callback()
+ * routine. In that routine, we'll call RCShutdownLANCard()
+ * to tell the adapter that it's OK to start the reboot and
+ * schedule a timer callback routine to execute 3 seconds
+ * later; this routine will reinitialize the adapter at that time.
+ */
+ RCResetLANCard(pDpa->id,
+ RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
+ RC_RESOURCE_RETURN_PEND_TX_BUFFERS,0,
+ (PFNCALLBACK)RCreset_callback);
+}
+
+
+int broadcast_packet(unsigned char * address)
+{
+ int i;
+ for (i=0; i<6; i++)
+ if (address[i] != 0xff) return 0;
+
+ return 1;
+}
+
+/*
+ * RCrecv_callback()
+ *
+ * The receive packet callback routine. This is called by
+ * RCProcI2OMsgQ() after the adapter posts buffers which have been
+ * filled (one ethernet packet per buffer).
+ */
+static void
+RCrecv_callback(U32 Status,
+ U8 PktCount,
+ U32 BucketsRemain,
+ PU32 PacketDescBlock,
+ U16 AdapterID)
+{
+
+ U32 len, count;
+ PDPA pDpa;
+ struct sk_buff *skb;
+ struct device *dev;
+ singleTCB tcb;
+ psingleTCB ptcb = &tcb;
+
+
+ pDpa = PCIAdapters[AdapterID];
+ dev = pDpa->dev;
+
+ ptcb->bcount = 1;
+
+#ifdef RCDEBUG
+ printk("rc: RCrecv_callback: 0x%x, 0x%x, 0x%x\n",
+ (uint)PktCount, (uint)BucketsRemain, (uint)PacketDescBlock);
+#endif
+
+#ifdef RCDEBUG
+ if ((pDpa->shutdown || pDpa->reboot) && !Status)
+ printk("shutdown||reboot && !Status: PktCount = %d\n",PktCount);
+#endif
+
+ if ( (Status != I2O_REPLY_STATUS_SUCCESS) || pDpa->shutdown)
+ {
+ /*
+ * Free whatever buffers the adapter returned, but don't
+ * pass them to the kernel.
+ */
+
+ if (!pDpa->shutdown && !pDpa->reboot)
+ printk("rc: RCrecv error: status = 0x%x\n", (uint)Status);
+ else
+ printk("rc: Returning %d buffers, status = 0x%x\n",
+ PktCount, (uint)Status);
+ /*
+ * TO DO: check the nature of the failure and put the adapter in
+ * failed mode if it's a hard failure. Send a reset to the adapter
+ * and free all outstanding memory.
+ */
+ if (Status == I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER)
+ {
+#ifdef RCDEBUG
+ printk("RCrecv status ABORT NO DATA TRANSFER\n");
+#endif
+ }
+ /* check for reset status: I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER */
+ if (PacketDescBlock)
+ {
+ while(PktCount--)
+ {
+ skb = (struct sk_buff *)PacketDescBlock[0];
+#ifndef LINUX_2_1
+ skb->free = 1;
+ skb->lock = 0;
+#endif
+#ifdef RCDEBUG
+ printk("free skb 0x%p\n", skb);
+#endif
+#ifdef LINUX_2_1
+ dev_kfree_skb (skb);
+#else
+ dev_kfree_skb(skb, FREE_READ);
+#endif
+ pDpa->numOutRcvBuffers--;
+ PacketDescBlock += BD_SIZE; /* point to next context field */
+ }
+ }
+ return;
+ }
+ else
+ {
+ while(PktCount--)
+ {
+ skb = (struct sk_buff *)PacketDescBlock[0];
+#ifdef RCDEBUG
+ if (pDpa->shutdown)
+ printk("shutdown: skb=0x%x\n", (uint)skb);
+
+ printk("skb = 0x%x: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", (uint)skb,
+ (uint)skb->data[0], (uint)skb->data[1], (uint)skb->data[2],
+ (uint)skb->data[3], (uint)skb->data[4], (uint)skb->data[5]);
+#endif
+ if ( (memcmp(dev->dev_addr, skb->data, 6)) &&
+ (!broadcast_packet(skb->data)))
+ {
+ /*
+ * Re-post the buffer to the adapter. Since the adapter usually
+ * return 1 to 2 receive buffers at a time, it's not too inefficient
+ * post one buffer at a time but ... may be that should be
+ * optimized at some point.
+ */
+ ptcb->b.context = (U32)skb;
+ ptcb->b.scount = 1;
+ ptcb->b.size = MAX_ETHER_SIZE;
+ ptcb->b.addr = virt_to_bus((void *)skb->data);
+
+ if ( RCPostRecvBuffers(pDpa->id, (PRCTCB)ptcb ) != RC_RTN_NO_ERROR)
+ {
+ printk("rc: RCrecv_callback: post buffer failed!\n");
+#ifdef LINUX_2_1
+ dev_kfree_skb (skb);
+#else
+ skb->free = 1;
+ dev_kfree_skb(skb, FREE_READ);
+#endif
+ }
+ else
+ {
+ pDpa->numOutRcvBuffers++;
+ }
+ }
+ else
+ {
+ len = PacketDescBlock[2];
+ skb->dev = dev;
+ skb_put( skb, len ); /* adjust length and tail */
+ skb->protocol = eth_type_trans(skb, dev);
+ netif_rx(skb); /* send the packet to the kernel */
+ dev->last_rx = jiffies;
+ }
+ pDpa->numOutRcvBuffers--;
+ PacketDescBlock += BD_SIZE; /* point to next context field */
+ }
+ }
+
+ /*
+ * Replenish the posted receive buffers.
+ * DO NOT replenish buffers if the driver has already
+ * initiated a reboot or shutdown!
+ */
+
+ if (!pDpa->shutdown && !pDpa->reboot)
+ {
+ count = RC_allocate_and_post_buffers(dev,
+ MAX_NMBR_RCV_BUFFERS-pDpa->numOutRcvBuffers);
+ pDpa->numOutRcvBuffers += count;
+ }
+
+}
+
+/*
+ * RCinterrupt()
+ *
+ * Interrupt handler.
+ * This routine sets up a couple of pointers and calls
+ * RCProcI2OMsgQ(), which in turn process the message and
+ * calls one of our callback functions.
+ */
+static void
+RCinterrupt(int irq, void *dev_id, struct pt_regs *regs)
+{
+
+ PDPA pDpa;
+ struct device *dev = (struct device *)(dev_id);
+
+ pDpa = (PDPA) (dev->priv);
+
+ if (pDpa->shutdown)
+ printk("rc: shutdown: service irq\n");
+
+#ifdef RCDEBUG
+ printk("RC irq: pDpa = 0x%x, dev = 0x%x, id = %d\n",
+ (uint)pDpa, (uint)dev, (uint)pDpa->id);
+ printk("dev = 0x%x\n", (uint)dev);
+#endif
+ if (dev->interrupt)
+ printk("%s: Re-entering the interrupt handler.\n", dev->name);
+ dev->interrupt = 1;
+
+ RCProcI2OMsgQ(pDpa->id);
+ dev->interrupt = 0;
+
+ return;
+}
+
+#define REBOOT_REINIT_RETRY_LIMIT 10
+static void rc_timer(unsigned long data)
+{
+ struct device *dev = (struct device *)data;
+ PDPA pDpa = (PDPA) (dev->priv);
+ int init_status;
+ static int retry = 0;
+ int post_buffers = MAX_NMBR_RCV_BUFFERS;
+ int count = 0;
+ int requested = 0;
+
+ if (pDpa->reboot)
+ {
+
+ init_status = RCInitI2OMsgLayer(pDpa->id, dev->base_addr,
+ pDpa->PLanApiPA, pDpa->PLanApiPA,
+ (PFNTXCALLBACK)RCxmit_callback,
+ (PFNRXCALLBACK)RCrecv_callback,
+ (PFNCALLBACK)RCreboot_callback);
+
+ switch(init_status)
+ {
+ case RC_RTN_NO_ERROR:
+
+ pDpa->reboot = 0;
+ pDpa->shutdown = 0; /* just in case */
+ RCReportDriverCapability(pDpa->id, DriverControlWord);
+ RCEnableI2OInterrupts(pDpa->id);
+
+ if (dev->flags & IFF_UP)
+ {
+ while(post_buffers)
+ {
+ if (post_buffers > MAX_NMBR_POST_BUFFERS_PER_MSG)
+ requested = MAX_NMBR_POST_BUFFERS_PER_MSG;
+ else
+ requested = post_buffers;
+ count = RC_allocate_and_post_buffers(dev, requested);
+ post_buffers -= count;
+ if ( count < requested )
+ break;
+ }
+ pDpa->numOutRcvBuffers =
+ MAX_NMBR_RCV_BUFFERS - post_buffers;
+ printk("rc: posted %d buffers \r\n",
+ (uint)pDpa->numOutRcvBuffers);
+ }
+ printk("rc: Initialization done.\n");
+ return;
+ case RC_RTN_FREE_Q_EMPTY:
+ retry++;
+ printk("rc: inbound free q emtpy\n");
+ break;
+ default:
+ retry++;
+ printk("rc: unexpected bad status after reboot\n");
+ break;
+ }
+
+ if (retry > REBOOT_REINIT_RETRY_LIMIT)
+ {
+ printk("rc: unable to reinitialize adapter after reboot\n");
+ printk("rc: decrementing driver and closing interface\n");
+ RCDisableI2OInterrupts(pDpa->id);
+ dev->flags &= ~IFF_UP;
+ MOD_DEC_USE_COUNT;
+ }
+ else
+ {
+ printk("rc: rescheduling timer...\n");
+ init_timer(&pDpa->timer);
+ pDpa->timer.expires = RUN_AT((30*HZ)/10); /* 3 sec. */
+ pDpa->timer.data = (unsigned long)dev;
+ pDpa->timer.function = &rc_timer; /* timer handler */
+ add_timer(&pDpa->timer);
+ }
+ }
+ else
+ {
+ printk("rc: timer??\n");
+ }
+}
+
+static int
+RCclose(struct device *dev)
+{
+
+ PDPA pDpa = (PDPA) dev->priv;
+
+#ifdef RCDEBUG
+ printk("rc: RCclose\r\n");
+#endif
+ if (pDpa->reboot)
+ {
+ printk("rc: skipping reset -- adapter already in reboot mode\n");
+ dev->flags &= ~IFF_UP;
+ pDpa->shutdown = 1;
+ return 0;
+ }
+#ifdef RCDEBUG
+ printk("rc: receive buffers outstanding: %d\n",
+ (uint)pDpa->numOutRcvBuffers);
+#endif
+
+ pDpa->shutdown = 1;
+
+ /*
+ * We can't allow the driver to be unloaded until the adapter returns
+ * all posted receive buffers. It doesn't hurt to tell the adapter
+ * to return all posted receive buffers and outstanding xmit buffers,
+ * even if there are none.
+ */
+
+ RCShutdownLANCard(pDpa->id,
+ RC_RESOURCE_RETURN_POSTED_RX_BUCKETS |
+ RC_RESOURCE_RETURN_PEND_TX_BUFFERS,0,
+ (PFNCALLBACK)RCreset_callback);
+
+ dev->flags &= ~IFF_UP;
+ return 0;
+}
+
+static struct enet_statistics *
+RCget_stats(struct device *dev)
+{
+ RCLINKSTATS RCstats;
+
+ PDPA pDpa = dev->priv;
+
+ if (!pDpa)
+ {
+ printk("rc: RCget_stats: !pDpa\n");
+ return 0;
+ }
+ else if (!(dev->flags & IFF_UP))
+ {
+#ifdef RCDEBUG
+ printk("rc: RCget_stats: device down\n");
+#endif
+ return 0;
+ }
+
+ memset(&RCstats, 0, sizeof(RCLINKSTATS));
+ if ( (RCGetLinkStatistics(pDpa->id, &RCstats, (void *)0)) == RC_RTN_NO_ERROR )
+ {
+#ifdef RCDEBUG
+ printk("rc: TX_good 0x%x\n", (uint)RCstats.TX_good);
+ printk("rc: TX_maxcol 0x%x\n", (uint)RCstats.TX_maxcol);
+ printk("rc: TX_latecol 0x%x\n", (uint)RCstats.TX_latecol);
+ printk("rc: TX_urun 0x%x\n", (uint)RCstats.TX_urun);
+ printk("rc: TX_crs 0x%x\n", (uint)RCstats.TX_crs);
+ printk("rc: TX_def 0x%x\n", (uint)RCstats.TX_def);
+ printk("rc: TX_singlecol 0x%x\n", (uint)RCstats.TX_singlecol);
+ printk("rc: TX_multcol 0x%x\n", (uint)RCstats.TX_multcol);
+ printk("rc: TX_totcol 0x%x\n", (uint)RCstats.TX_totcol);
+
+ printk("rc: Rcv_good 0x%x\n", (uint)RCstats.Rcv_good);
+ printk("rc: Rcv_CRCerr 0x%x\n", (uint)RCstats.Rcv_CRCerr);
+ printk("rc: Rcv_alignerr 0x%x\n", (uint)RCstats.Rcv_alignerr);
+ printk("rc: Rcv_reserr 0x%x\n", (uint)RCstats.Rcv_reserr);
+ printk("rc: Rcv_orun 0x%x\n", (uint)RCstats.Rcv_orun);
+ printk("rc: Rcv_cdt 0x%x\n", (uint)RCstats.Rcv_cdt);
+ printk("rc: Rcv_runt 0x%x\n", (uint)RCstats.Rcv_runt);
+#endif
+
+ pDpa->stats.rx_packets = RCstats.Rcv_good; /* total packets received */
+ pDpa->stats.tx_packets = RCstats.TX_good; /* total packets transmitted */
+
+ pDpa->stats.rx_errors =
+ RCstats.Rcv_CRCerr +
+ RCstats.Rcv_alignerr +
+ RCstats.Rcv_reserr +
+ RCstats.Rcv_orun +
+ RCstats.Rcv_cdt +
+ RCstats.Rcv_runt; /* bad packets received */
+
+ pDpa->stats.tx_errors =
+ RCstats.TX_urun +
+ RCstats.TX_crs +
+ RCstats.TX_def +
+ RCstats.TX_totcol; /* packet transmit problems */
+
+ /*
+ * This needs improvement.
+ */
+ pDpa->stats.rx_dropped = 0; /* no space in linux buffers */
+ pDpa->stats.tx_dropped = 0; /* no space available in linux */
+ pDpa->stats.multicast = 0; /* multicast packets received */
+ pDpa->stats.collisions = RCstats.TX_totcol;
+
+ /* detailed rx_errors: */
+ pDpa->stats.rx_length_errors = 0;
+ pDpa->stats.rx_over_errors = RCstats.Rcv_orun; /* receiver ring buff overflow */
+ pDpa->stats.rx_crc_errors = RCstats.Rcv_CRCerr; /* recved pkt with crc error */
+ pDpa->stats.rx_frame_errors = 0; /* recv'd frame alignment error */
+ pDpa->stats.rx_fifo_errors = 0; /* recv'r fifo overrun */
+ pDpa->stats.rx_missed_errors = 0; /* receiver missed packet */
+
+ /* detailed tx_errors */
+ pDpa->stats.tx_aborted_errors = 0;
+ pDpa->stats.tx_carrier_errors = 0;
+ pDpa->stats.tx_fifo_errors = 0;
+ pDpa->stats.tx_heartbeat_errors = 0;
+ pDpa->stats.tx_window_errors = 0;
+
+ return ((struct enet_statistics *)&(pDpa->stats));
+ }
+ return 0;
+}
+
+static int RCioctl(struct device *dev, struct ifreq *rq, int cmd)
+{
+ RCuser_struct RCuser;
+ PDPA pDpa = dev->priv;
+
+#if RCDEBUG
+ printk("RCioctl: cmd = 0x%x\n", cmd);
+#endif
+
+ switch (cmd) {
+
+ case RCU_PROTOCOL_REV:
+ /*
+ * Assign user protocol revision, to tell user-level
+ * controller program whether or not it's in sync.
+ */
+ rq->ifr_ifru.ifru_data = (caddr_t) USER_PROTOCOL_REV;
+ break;
+
+
+ case RCU_COMMAND:
+ {
+#ifdef LINUX_2_1
+ if(copy_from_user(&RCuser, rq->ifr_data, sizeof(RCuser)))
+ return -EFAULT;
+#else
+ int error;
+ error=verify_area(VERIFY_WRITE, rq->ifr_data, sizeof(RCuser));
+ if (error) {
+ return error;
+ }
+ memcpy_fromfs(&RCuser, rq->ifr_data, sizeof(RCuser));
+#endif
+
+#ifdef RCDEBUG
+ printk("RCioctl: RCuser_cmd = 0x%x\n", RCuser.cmd);
+#endif
+
+ switch(RCuser.cmd)
+ {
+ case RCUC_GETFWVER:
+ printk("RC GETFWVER\n");
+ RCUD_GETFWVER = &RCuser.RCUS_GETFWVER;
+ RCGetFirmwareVer(pDpa->id, (PU8) &RCUD_GETFWVER->FirmString, NULL);
+ break;
+ case RCUC_GETINFO:
+ printk("RC GETINFO\n");
+ RCUD_GETINFO = &RCuser.RCUS_GETINFO;
+ RCUD_GETINFO -> mem_start = dev->base_addr;
+ RCUD_GETINFO -> mem_end = dev->base_addr + 2*32768;
+ RCUD_GETINFO -> base_addr = pDpa->pci_addr;
+ RCUD_GETINFO -> irq = dev->irq;
+ break;
+ case RCUC_GETIPANDMASK:
+ printk("RC GETIPANDMASK\n");
+ RCUD_GETIPANDMASK = &RCuser.RCUS_GETIPANDMASK;
+ RCGetRavlinIPandMask(pDpa->id, (PU32) &RCUD_GETIPANDMASK->IpAddr,
+ (PU32) &RCUD_GETIPANDMASK->NetMask, NULL);
+ break;
+ case RCUC_GETLINKSTATISTICS:
+ printk("RC GETLINKSTATISTICS\n");
+ RCUD_GETLINKSTATISTICS = &RCuser.RCUS_GETLINKSTATISTICS;
+ RCGetLinkStatistics(pDpa->id, (P_RCLINKSTATS) &RCUD_GETLINKSTATISTICS->StatsReturn, NULL);
+ break;
+ case RCUC_GETLINKSTATUS:
+ printk("RC GETLINKSTATUS\n");
+ RCUD_GETLINKSTATUS = &RCuser.RCUS_GETLINKSTATUS;
+ RCGetLinkStatus(pDpa->id, (PU32) &RCUD_GETLINKSTATUS->ReturnStatus, NULL);
+ break;
+ case RCUC_GETMAC:
+ printk("RC GETMAC\n");
+ RCUD_GETMAC = &RCuser.RCUS_GETMAC;
+ RCGetMAC(pDpa->id, (PU8) &RCUD_GETMAC->mac, NULL);
+ break;
+ case RCUC_GETPROM:
+ printk("RC GETPROM\n");
+ RCUD_GETPROM = &RCuser.RCUS_GETPROM;
+ RCGetPromiscuousMode(pDpa->id, (PU32) &RCUD_GETPROM->PromMode, NULL);
+ break;
+ case RCUC_GETBROADCAST:
+ printk("RC GETBROADCAST\n");
+ RCUD_GETBROADCAST = &RCuser.RCUS_GETBROADCAST;
+ RCGetBroadcastMode(pDpa->id, (PU32) &RCUD_GETBROADCAST->BroadcastMode, NULL);
+ break;
+ case RCUC_GETSPEED:
+ printk("RC GETSPEED\n");
+ if (!(dev->flags & IFF_UP))
+ {
+ printk("RCioctl, GETSPEED error: interface down\n");
+ return -ENODATA;
+ }
+ RCUD_GETSPEED = &RCuser.RCUS_GETSPEED;
+ RCGetLinkSpeed(pDpa->id, (PU32) &RCUD_GETSPEED->LinkSpeedCode, NULL);
+ printk("RC speed = 0x%ld\n", RCUD_GETSPEED->LinkSpeedCode);
+ break;
+ case RCUC_SETIPANDMASK:
+ printk("RC SETIPANDMASK\n");
+ RCUD_SETIPANDMASK = &RCuser.RCUS_SETIPANDMASK;
+ printk ("RC New IP Addr = %d.%d.%d.%d, ", (U8) ((RCUD_SETIPANDMASK->IpAddr) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->IpAddr >> 8) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->IpAddr >> 16) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->IpAddr >> 24) & 0xff));
+ printk ("RC New Mask = %d.%d.%d.%d\n", (U8) ((RCUD_SETIPANDMASK->NetMask) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->NetMask >> 8) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->NetMask >> 16) & 0xff),
+ (U8) ((RCUD_SETIPANDMASK->NetMask >> 24) & 0xff));
+ RCSetRavlinIPandMask(pDpa->id, (U32) RCUD_SETIPANDMASK->IpAddr,
+ (U32) RCUD_SETIPANDMASK->NetMask);
+ break;
+ case RCUC_SETMAC:
+ printk("RC SETMAC\n");
+ RCUD_SETMAC = &RCuser.RCUS_SETMAC;
+ printk ("RC New MAC addr = %02X:%02X:%02X:%02X:%02X:%02X\n",
+ (U8) (RCUD_SETMAC->mac[0]), (U8) (RCUD_SETMAC->mac[1]), (U8) (RCUD_SETMAC->mac[2]),
+ (U8) (RCUD_SETMAC->mac[3]), (U8) (RCUD_SETMAC->mac[4]), (U8) (RCUD_SETMAC->mac[5]));
+ RCSetMAC(pDpa->id, (PU8) &RCUD_SETMAC->mac);
+ break;
+ case RCUC_SETSPEED:
+ printk("RC SETSPEED\n");
+ RCUD_SETSPEED = &RCuser.RCUS_SETSPEED;
+ RCSetLinkSpeed(pDpa->id, (U16) RCUD_SETSPEED->LinkSpeedCode);
+ printk("RC New speed = 0x%d\n", RCUD_SETSPEED->LinkSpeedCode);
+ break;
+ case RCUC_SETPROM:
+ printk("RC SETPROM\n");
+ RCUD_SETPROM = &RCuser.RCUS_SETPROM;
+ RCSetPromiscuousMode(pDpa->id,(U16)RCUD_SETPROM->PromMode);
+ printk("RC New prom mode = 0x%d\n", RCUD_SETPROM->PromMode);
+ break;
+ case RCUC_SETBROADCAST:
+ printk("RC SETBROADCAST\n");
+ RCUD_SETBROADCAST = &RCuser.RCUS_SETBROADCAST;
+ RCSetBroadcastMode(pDpa->id,(U16)RCUD_SETBROADCAST->BroadcastMode);
+ printk("RC New broadcast mode = 0x%d\n", RCUD_SETBROADCAST->BroadcastMode);
+ break;
+ default:
+ printk("RC command default\n");
+ RCUD_DEFAULT = &RCuser.RCUS_DEFAULT;
+ RCUD_DEFAULT -> rc = 0x11223344;
+ break;
+ }
+#ifdef LINUX_2_1
+ copy_to_user(rq->ifr_data, &RCuser, sizeof(RCuser));
+#else
+ memcpy_tofs(rq->ifr_data, &RCuser, sizeof(RCuser));
+#endif
+ break;
+ } /* RCU_COMMAND */
+
+ default:
+ printk("RC default\n");
+ rq->ifr_ifru.ifru_data = (caddr_t) 0x12345678;
+ break;
+ }
+ return 0;
+}
+
+static int RCconfig(struct device *dev, struct ifmap *map)
+{
+ /*
+ * To be completed ...
+ */
+ printk("rc: RCconfig\n");
+ return 0;
+ if (dev->flags & IFF_UP) /* can't act on a running interface */
+ return -EBUSY;
+
+ /* Don't allow changing the I/O address */
+ if (map->base_addr != dev->base_addr) {
+ printk(KERN_WARNING "RC pci45: Change I/O address not implemented\n");
+ return -EOPNOTSUPP;
+ }
+ return 0;
+}
+
+void
+cleanup_module(void)
+{
+ PDPA pDpa;
+ struct device *next;
+
+
+#ifdef RCDEBUG
+ printk("rc: RC cleanup_module\n");
+ printk("rc: root_RCdev = 0x%x\n", (uint)root_RCdev);
+#endif
+
+
+ while (root_RCdev)
+ {
+ pDpa = (PDPA) root_RCdev->priv;
+#ifdef RCDEBUG
+ printk("rc: cleanup 0x%08X\n", (uint)root_RCdev);
+#endif
+ printk("IOP reset: 0x%x\n", RCResetIOP(pDpa->id));
+ unregister_netdev(root_RCdev);
+ next = pDpa->next;
+
+ iounmap((unsigned long *)root_RCdev->base_addr);
+ free_irq( root_RCdev->irq, root_RCdev );
+ kfree(root_RCdev);
+ root_RCdev = next;
+ }
+}
+
+static int
+RC_allocate_and_post_buffers(struct device *dev, int numBuffers)
+{
+
+ int i;
+ PDPA pDpa = (PDPA)dev->priv;
+ PU32 p;
+ psingleB pB;
+ struct sk_buff *skb;
+ RC_RETURN status;
+
+ if (!numBuffers)
+ return 0;
+ else if (numBuffers > MAX_NMBR_POST_BUFFERS_PER_MSG)
+ {
+#ifdef RCDEBUG
+ printk("rc: Too many buffers requested!\n");
+ printk("rc: attempting to allocate only 32 buffers\n");
+#endif
+ numBuffers = 32;
+ }
+
+ p = (PU32) kmalloc(sizeof(U32) + numBuffers*sizeof(singleB), GFP_ATOMIC);
+
+#ifdef RCDEBUG
+ printk("rc: TCB = 0x%x\n", (uint)p);
+#endif
+
+ if (!p)
+ {
+ printk("rc: RCopen: unable to allocate TCB\n");
+ return 0;
+ }
+
+ p[0] = 0; /* Buffer Count */
+ pB = (psingleB)((U32)p + sizeof(U32)); /* point to the first buffer */
+
+#ifdef RCDEBUG
+ printk("rc: p[0] = 0x%x, p = 0x%x, pB = 0x%x\n", (uint)p[0], (uint)p, (uint)pB);
+ printk("rc: pB = 0x%x\n", (uint)pB);
+#endif
+
+ for (i=0; i<numBuffers; i++)
+ {
+ skb = dev_alloc_skb(MAX_ETHER_SIZE+2);
+ if (!skb)
+ {
+ printk("rc: Doh! RCopen: unable to allocate enough skbs!\n");
+ if (*p != 0) /* did we allocate any buffers at all? */
+ {
+#ifdef RCDEBUG
+ printk("rc: will post only %d buffers \n", (uint)(*p));
+#endif
+ break;
+ }
+ else
+ {
+ kfree(p); /* Free the TCB */
+ return 0;
+ }
+ }
+#ifdef RCDEBUG
+ printk("post 0x%x\n", (uint)skb);
+#endif
+ skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */
+ pB->context = (U32)skb;
+ pB->scount = 1; /* segment count */
+ pB->size = MAX_ETHER_SIZE;
+ pB->addr = virt_to_bus((void *)skb->data);
+ p[0]++;
+ pB++;
+ }
+
+ if ( (status = RCPostRecvBuffers(pDpa->id, (PRCTCB)p )) != RC_RTN_NO_ERROR)
+ {
+ printk("rc: Post buffer failed with error code 0x%x!\n", status);
+ pB = (psingleB)((U32)p + sizeof(U32)); /* point to the first buffer */
+ while(p[0])
+ {
+ skb = (struct sk_buff *)pB->context;
+#ifndef LINUX_2_1
+ skb->free = 1;
+#endif
+#ifdef RCDEBUG
+ printk("rc: freeing 0x%x\n", (uint)skb);
+#endif
+#ifdef LINUX_2_1
+ dev_kfree_skb (skb);
+#else
+ dev_kfree_skb(skb, FREE_READ);
+#endif
+ p[0]--;
+ pB++;
+ }
+#ifdef RCDEBUG
+ printk("rc: freed all buffers, p[0] = %ld\n", p[0]);
+#endif
+ }
+ kfree(p);
+ return(p[0]); /* return the number of posted buffers */
+}
diff --git a/drivers/net/rrunner.c b/drivers/net/rrunner.c
index 8d053abf6..9b175bffa 100644
--- a/drivers/net/rrunner.c
+++ b/drivers/net/rrunner.c
@@ -39,9 +39,11 @@
#include <asm/byteorder.h>
#include <asm/io.h>
#include <asm/irq.h>
+#include <asm/uaccess.h>
#include "rrunner.h"
+
/*
* Implementation notes:
*
@@ -57,7 +59,7 @@
* stack will need to know about I/O vectors or something similar.
*/
-static const char *version = "rrunner.c: v0.06 09/02/98 Jes Sorensen (Jes.Sorensen@cern.ch)\n";
+static const char *version = "rrunner.c: v0.09 12/14/98 Jes Sorensen (Jes.Sorensen@cern.ch)\n";
static unsigned int read_eeprom(struct rr_private *rrpriv,
unsigned long offset,
@@ -68,6 +70,14 @@ static u32 read_eeprom_word(struct rr_private *rrpriv,
static int rr_load_firmware(struct device *dev);
+/*
+ * These are checked at init time to see if they are at least 256KB
+ * and increased to 256KB if they are not. This is done to avoid ending
+ * up with socket buffers smaller than the MTU size,
+ */
+extern __u32 sysctl_wmem_max;
+extern __u32 sysctl_rmem_max;
+
__initfunc(int rr_hippi_probe (struct device *dev))
{
static int i = 0;
@@ -116,6 +126,9 @@ __initfunc(int rr_hippi_probe (struct device *dev))
if (dev == NULL)
break;
+ if (!dev->priv)
+ dev->priv = kmalloc(sizeof(*rrpriv), GFP_KERNEL);
+
rrpriv = (struct rr_private *)dev->priv;
/* Read register base address from
@@ -194,12 +207,8 @@ __initfunc(int rr_hippi_probe (struct device *dev))
rr_init(dev);
boards_found++;
-
- /*
- * This is bollocks, but we need to tell the net-init
- * code that it shall go for the next device.
- */
dev->base_addr = 0;
+ dev = NULL;
}
/*
@@ -347,6 +356,7 @@ static int rr_reset(struct device *dev)
return 0;
}
+
/*
* Read a string from the EEPROM.
*/
@@ -356,18 +366,21 @@ static unsigned int read_eeprom(struct rr_private *rrpriv,
unsigned long length)
{
struct rr_regs *regs = rrpriv->regs;
- u32 misc, io, i;
+ u32 misc, io, host, i;
io = regs->ExtIo;
regs->ExtIo = 0;
misc = regs->LocalCtrl;
regs->LocalCtrl = 0;
+ host = regs->HostCtrl;
+ regs->HostCtrl |= HALT_NIC;
for (i = 0; i < length; i++){
regs->WinBase = (EEPROM_BASE + ((offset+i) << 3));
buf[i] = (regs->WinData >> 24) & 0xff;
}
+ regs->HostCtrl = host;
regs->LocalCtrl = misc;
regs->ExtIo = io;
@@ -391,6 +404,58 @@ static u32 read_eeprom_word(struct rr_private *rrpriv,
}
+/*
+ * Write a string to the EEPROM.
+ *
+ * This is only called when the firmware is not running.
+ */
+static unsigned int write_eeprom(struct rr_private *rrpriv,
+ unsigned long offset,
+ unsigned char *buf,
+ unsigned long length)
+{
+ struct rr_regs *regs = rrpriv->regs;
+ u32 misc, io, data, i, j, ready, error = 0;
+
+ io = regs->ExtIo;
+ regs->ExtIo = 0;
+ misc = regs->LocalCtrl;
+ regs->LocalCtrl = ENABLE_EEPROM_WRITE;
+
+ for (i = 0; i < length; i++){
+ regs->WinBase = (EEPROM_BASE + ((offset+i) << 3));
+ data = buf[i] << 24;
+ /*
+ * Only try to write the data if it is not the same
+ * value already.
+ */
+ if ((regs->WinData & 0xff000000) != data){
+ regs->WinData = data;
+ ready = 0;
+ j = 0;
+ mb();
+ while(!ready){
+ udelay(1000);
+ if ((regs->WinData & 0xff000000) == data)
+ ready = 1;
+ if (j++ > 5000){
+ printk("data mismatch: %08x, "
+ "WinData %08x\n", data,
+ regs->WinData);
+ ready = 1;
+ error = 1;
+ }
+ }
+ }
+ }
+
+ regs->LocalCtrl = misc;
+ regs->ExtIo = io;
+
+ return error;
+}
+
+
__initfunc(static int rr_init(struct device *dev))
{
struct rr_private *rrpriv;
@@ -404,8 +469,13 @@ __initfunc(static int rr_init(struct device *dev))
if (rev > 0x00020024)
printk(" Firmware revision: %i.%i.%i\n", (rev >> 16),
((rev >> 8) & 0xff), (rev & 0xff));
- else{
- printk(" Firmware revision too old: %i.%i.%i, please upgrade to 2.0.37 or later.\n",
+ else if (rev >= 0x00020000) {
+ printk(" Firmware revision: %i.%i.%i (2.0.37 or "
+ "later is recommended)\n", (rev >> 16),
+ ((rev >> 8) & 0xff), (rev & 0xff));
+ }else{
+ printk(" Firmware revision too old: %i.%i.%i, please "
+ "upgrade to 2.0.37 or later.\n",
(rev >> 16), ((rev >> 8) & 0xff), (rev & 0xff));
return -EFAULT;
@@ -416,6 +486,18 @@ __initfunc(static int rr_init(struct device *dev))
sram_size = read_eeprom_word(rrpriv, (void *)8);
printk(" SRAM size 0x%06x\n", sram_size);
+ if (sysctl_rmem_max < 262144){
+ printk(" Receive socket buffer limit too low (%i), "
+ "setting to 262144\n", sysctl_rmem_max);
+ sysctl_rmem_max = 262144;
+ }
+
+ if (sysctl_wmem_max < 262144){
+ printk(" Transmit socket buffer limit too low (%i), "
+ "setting to 262144\n", sysctl_wmem_max);
+ sysctl_wmem_max = 262144;
+ }
+
return 0;
}
@@ -574,7 +656,9 @@ static int rr_init1(struct device *dev)
}
#endif
dev->tbusy = 0;
+#if 0
dev->interrupt = 0;
+#endif
dev->start = 1;
return 0;
}
@@ -590,9 +674,6 @@ static u32 rr_handle_event(struct device *dev, u32 prodidx)
struct rr_private *rrpriv;
struct rr_regs *regs;
u32 tmp, eidx;
-#if 0
- short i;
-#endif
rrpriv = (struct rr_private *)dev->priv;
regs = rrpriv->regs;
@@ -710,7 +791,8 @@ static int rx_int(struct device *dev, u32 rxlimit)
if (pkt_len < PKT_COPY_THRESHOLD) {
skb = alloc_skb(pkt_len, GFP_ATOMIC);
if (skb == NULL){
- printk("%s: Out of memory deferring packet\n", dev->name);
+ printk("%s: Out of memory deferring "
+ "packet\n", dev->name);
rrpriv->stats.rx_dropped++;
goto defer;
}else
@@ -720,14 +802,16 @@ static int rx_int(struct device *dev, u32 rxlimit)
}else{
struct sk_buff *newskb;
- newskb = alloc_skb(dev->mtu + HIPPI_HLEN, GFP_ATOMIC);
+ newskb = alloc_skb(dev->mtu + HIPPI_HLEN,
+ GFP_ATOMIC);
if (newskb){
skb = rrpriv->rx_skbuff[index];
skb_put(skb, pkt_len);
rrpriv->rx_skbuff[index] = newskb;
rrpriv->rx_ring[index].addr = virt_to_bus(newskb->data);
}else{
- printk("%s: Out of memory, deferring packet\n", dev->name);
+ printk("%s: Out of memory, deferring "
+ "packet\n", dev->name);
rrpriv->stats.rx_dropped++;
goto defer;
}
@@ -766,18 +850,15 @@ static void rr_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
rrpriv = (struct rr_private *)dev->priv;
regs = rrpriv->regs;
- if (!(regs->HostCtrl & RR_INT)){
-#if 0
- /* These are harmless */
- printk("%s: spurious interrupt detected\n", dev->name);
-#endif
+ if (!(regs->HostCtrl & RR_INT))
return;
- }
+#if 0
if (test_and_set_bit(0, (void*)&dev->interrupt) != 0) {
printk("%s: Re-entering the interrupt handler.\n", dev->name);
return;
}
+#endif
spin_lock_irqsave(&rrpriv->lock, flags);
@@ -828,7 +909,9 @@ static void rr_interrupt(int irq, void *dev_id, struct pt_regs *ptregs)
spin_unlock_irqrestore(&rrpriv->lock, flags);
+#if 0
dev->interrupt = 0;
+#endif
}
@@ -844,7 +927,7 @@ static int rr_open(struct device *dev)
regs->HostCtrl |= (HALT_NIC | RR_CLEAR_INT);
#endif
- if (request_irq(dev->irq, rr_interrupt, 0, rrpriv->name, dev))
+ if (request_irq(dev->irq, rr_interrupt, SA_SHIRQ, rrpriv->name, dev))
{
printk(KERN_WARNING "%s: Requested IRQ %d is busy\n",
dev->name, dev->irq);
@@ -858,7 +941,9 @@ static int rr_open(struct device *dev)
rr_init1(dev);
dev->tbusy = 0;
+#if 0
dev->interrupt = 0;
+#endif
dev->start = 1;
MOD_INC_USE_COUNT;
@@ -942,6 +1027,12 @@ static int rr_close(struct device *dev)
rrpriv = (struct rr_private *)dev->priv;
regs = rrpriv->regs;
+ /*
+ * Lock to make sure we are not cleaning up while another CPU
+ * handling interrupts.
+ */
+ spin_lock(&rrpriv->lock);
+
tmp = regs->HostCtrl;
if (tmp & NIC_HALTED){
printk("%s: NIC already halted\n", dev->name);
@@ -950,11 +1041,7 @@ static int rr_close(struct device *dev)
tmp |= HALT_NIC;
regs->HostCtrl = tmp;
- /*
- * Lock to make sure we are not cleaning up while another CPU
- * handling interrupts.
- */
- spin_lock(&rrpriv->lock);
+ rrpriv->fw_running = 0;
regs->TxPi = 0;
regs->IpRxPi = 0;
@@ -1080,9 +1167,6 @@ static int rr_load_firmware(struct device *dev)
{
struct rr_private *rrpriv;
struct rr_regs *regs;
-#if 0
- unsigned long flags;
-#endif
int i, j;
u32 localctrl, eptr, sptr, segptr, len, tmp;
u32 p2len, p2size, nr_seg, revision, io, sram_size;
@@ -1179,30 +1263,117 @@ out:
static int rr_ioctl(struct device *dev, struct ifreq *rq, int cmd)
{
struct rr_private *rrpriv;
+ unsigned char *image, *oldimage;
+ unsigned int i;
+ int error = -EOPNOTSUPP;
rrpriv = (struct rr_private *)dev->priv;
+ spin_lock(&rrpriv->lock);
+
switch(cmd){
+ case SIOCRRGFW:
+ if (!suser()){
+ error = -EPERM;
+ goto out;
+ }
+
+ if (rrpriv->fw_running){
+ printk("%s: Firmware already running\n", dev->name);
+ error = -EPERM;
+ goto out;
+ }
+
+ image = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
+ if (!image){
+ printk(KERN_ERR "%s: Unable to allocate memory "
+ "for EEPROM image\n", dev->name);
+ error = -ENOMEM;
+ goto out;
+ }
+ i = read_eeprom(rrpriv, 0, image, EEPROM_BYTES);
+ if (i != EEPROM_BYTES){
+ kfree(image);
+ printk(KERN_ERR "%s: Error reading EEPROM\n",
+ dev->name);
+ error = -EFAULT;
+ goto out;
+ }
+ error = copy_to_user(rq->ifr_data, image, EEPROM_BYTES);
+ if (error)
+ error = -EFAULT;
+ kfree(image);
+ break;
case SIOCRRPFW:
- if (!suser())
- return -EPERM;
+ if (!suser()){
+ error = -EPERM;
+ goto out;
+ }
if (rrpriv->fw_running){
- printk("%s: firmware already running\n", dev->name);
- return -EPERM;
+ printk("%s: Firmware already running\n", dev->name);
+ error = -EPERM;
+ goto out;
}
- printk("%s: updating firmware", dev->name);
+
+ image = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
+ if (!image){
+ printk(KERN_ERR "%s: Unable to allocate memory "
+ "for EEPROM image\n", dev->name);
+ error = -ENOMEM;
+ goto out;
+ }
+
+ oldimage = kmalloc(EEPROM_WORDS * sizeof(u32), GFP_KERNEL);
+ if (!image){
+ printk(KERN_ERR "%s: Unable to allocate memory "
+ "for old EEPROM image\n", dev->name);
+ error = -ENOMEM;
+ goto out;
+ }
+
+ error = copy_from_user(image, rq->ifr_data, EEPROM_BYTES);
+ if (error)
+ error = -EFAULT;
+
+ printk("%s: Updating EEPROM firmware\n", dev->name);
+
+ error = write_eeprom(rrpriv, 0, image, EEPROM_BYTES);
+ if (error)
+ printk(KERN_ERR "%s: Error writing EEPROM\n",
+ dev->name);
+
+ i = read_eeprom(rrpriv, 0, oldimage, EEPROM_BYTES);
+ if (i != EEPROM_BYTES)
+ printk(KERN_ERR "%s: Error reading back EEPROM "
+ "image\n", dev->name);
+
+ error = memcmp(image, oldimage, EEPROM_BYTES);
+ if (error){
+ printk(KERN_ERR "%s: Error verifying EEPROM image\n",
+ dev->name);
+ error = -EFAULT;
+ }
+
+ kfree(image);
+ kfree(oldimage);
+ break;
+ case SIOCRRID:
+ error = put_user(0x52523032, (int *)(&rq->ifr_data[0]));
+ if (error)
+ error = -EFAULT;
break;
default:
- return -EOPNOTSUPP;
}
- return 0;
+ out:
+ spin_unlock(&rrpriv->lock);
+ return error;
}
/*
* Local variables:
- * compile-command: "gcc -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -pipe -fomit-frame-pointer -fno-strength-reduce -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -c rrunner.c"
+ * compile-command: "gcc -D__SMP__ -D__KERNEL__ -I../../include -Wall -Wstrict-prototypes -O2 -pipe -fomit-frame-pointer -fno-strength-reduce -m486 -malign-loops=2 -malign-jumps=2 -malign-functions=2 -DCPU=686 -c rrunner.c"
* End:
*/
diff --git a/drivers/net/rrunner.h b/drivers/net/rrunner.h
index f6e6b3c31..d47513700 100644
--- a/drivers/net/rrunner.h
+++ b/drivers/net/rrunner.h
@@ -550,6 +550,7 @@ struct rx_desc{
#define SIOCRRPFW SIOCDEVPRIVATE /* put firmware */
#define SIOCRRGFW SIOCDEVPRIVATE+1 /* get firmware */
+#define SIOCRRID SIOCDEVPRIVATE+2 /* identify */
struct seg_hdr {
@@ -560,6 +561,8 @@ struct seg_hdr {
#define EEPROM_BASE 0x80000000
+#define EEPROM_WORDS 8192
+#define EEPROM_BYTES (EEPROM_WORDS * sizeof(u32))
struct eeprom_boot {
u32 key1;
diff --git a/drivers/net/sdla.c b/drivers/net/sdla.c
index c8740a8d1..32f22e14d 100644
--- a/drivers/net/sdla.c
+++ b/drivers/net/sdla.c
@@ -248,7 +248,7 @@ int sdla_z80_poll(struct device *dev, int z80_addr, int jiffs, char resp1, char
temp += z80_addr & SDLA_ADDR_MASK;
resp = ~resp1;
- while ((jiffies < done) && (resp != resp1) && (!resp2 || (resp != resp2)))
+ while (time_before(jiffies, done) && (resp != resp1) && (!resp2 || (resp != resp2)))
{
if (jiffies != now)
{
@@ -257,7 +257,7 @@ int sdla_z80_poll(struct device *dev, int z80_addr, int jiffs, char resp1, char
resp = *temp;
}
}
- return(jiffies < done ? jiffies - start : -1);
+ return(time_before(jiffies, done) ? jiffies - start : -1);
}
/* constants for Z80 CPU speed */
@@ -444,7 +444,7 @@ static int sdla_cmd(struct device *dev, int cmd, short dlci, short flags,
waiting = 1;
len = 0;
- while (waiting && (jiffies <= jiffs))
+ while (waiting && time_before_eq(jiffies, jiffs))
{
if (waiting++ % 3)
{
diff --git a/drivers/net/sdla_fr.c b/drivers/net/sdla_fr.c
index 0a886c6db..ecf784758 100644
--- a/drivers/net/sdla_fr.c
+++ b/drivers/net/sdla_fr.c
@@ -1078,6 +1078,8 @@ static int if_send(struct sk_buff *skb, struct device *dev)
++chan->if_send_bfrs_passed_to_adptr;
++chan->ifstats.tx_packets;
++card->wandev.stats.tx_packets;
+ chan->ifstats.tx_bytes += skb->len;
+ card->wandev.stats.tx_bytes += skb->len;
}
}
}
@@ -1501,6 +1503,8 @@ static void fr502_rx_intr(sdla_t * card)
netif_rx(skb);
++chan->ifstats.rx_packets;
++card->wandev.stats.rx_packets;
+ chan->ifstats.rx_bytes += skb->len;
+ card->wandev.stats.rx_bytes += skb->len;
}
}
sdla_mapmem(&card->hw, FR_MB_VECTOR);
@@ -1621,6 +1625,8 @@ static void fr508_rx_intr(sdla_t * card)
++chan->rx_intr_bfr_passed_to_stack;
++chan->ifstats.rx_packets;
++card->wandev.stats.rx_packets;
+ chan->ifstats.rx_bytes += skb->len;
+ card->wandev.stats.rx_bytes += skb->len;
}
}
}
diff --git a/drivers/net/sdla_ppp.c b/drivers/net/sdla_ppp.c
index 69038be9a..ec9b71b85 100644
--- a/drivers/net/sdla_ppp.c
+++ b/drivers/net/sdla_ppp.c
@@ -698,6 +698,7 @@ static int if_send(struct sk_buff *skb, struct device *dev)
} else {
++ppp_priv_area->if_send_bfr_passed_to_adptr;
++card->wandev.stats.tx_packets;
+ card->wandev.stats.tx_bytes += skb->len;
}
}
tx_done:
@@ -1202,6 +1203,7 @@ static void rx_intr(sdla_t * card)
skb->mac.raw = skb->data;
netif_rx(skb);
++card->wandev.stats.rx_packets;
+ card->wandev.stats.rx_bytes += skb->len;
++ppp_priv_area->rx_intr_bfr_passed_to_stack;
}
} else {
diff --git a/drivers/net/sdla_x25.c b/drivers/net/sdla_x25.c
index 5aa649117..0ef2771d8 100644
--- a/drivers/net/sdla_x25.c
+++ b/drivers/net/sdla_x25.c
@@ -38,9 +38,6 @@
* Jan 07, 1997 Gene Kozin Initial version.
*****************************************************************************/
-#if !defined(__KERNEL__) || !defined(MODULE)
-#error This code MUST be compiled as a kernel module!
-#endif
#include <linux/kernel.h> /* printk(), and other useful stuff */
#include <linux/stddef.h> /* offsetof(), etc. */
@@ -1031,6 +1028,7 @@ static void rx_intr (sdla_t* card)
{
netif_rx(skb);
++chan->ifstats.rx_packets;
+ chan->ifstats.rx_bytes += skb->len;
}
}
}
@@ -2125,6 +2123,7 @@ static int chan_send (struct device* dev, struct sk_buff* skb)
return 1;
}
++chan->ifstats.tx_packets;
+ chan->ifstats.tx_bytes += skb->len;
break;
case 0x33: /* Tx busy */
diff --git a/drivers/net/sdladrv.c b/drivers/net/sdladrv.c
index 46992d97a..1ddf31a98 100644
--- a/drivers/net/sdladrv.c
+++ b/drivers/net/sdladrv.c
@@ -493,7 +493,7 @@ int sdla_down (sdlahw_t* hw)
}
/*============================================================================
- * Map shared memory window into SDLA adress space.
+ * Map shared memory window into SDLA address space.
*/
EXPORT_SYMBOL(sdla_mapmem);
diff --git a/drivers/net/sdlamain.c b/drivers/net/sdlamain.c
index 00454c5d6..3c7eef8c2 100644
--- a/drivers/net/sdlamain.c
+++ b/drivers/net/sdlamain.c
@@ -29,10 +29,6 @@
* Jan 02, 1997 Gene Kozin Initial version.
*****************************************************************************/
-#if !defined(__KERNEL__) || !defined(MODULE)
-#error This code MUST be compiled as a kernel module!
-#endif
-
#include <linux/config.h> /* OS configuration options */
#include <linux/stddef.h> /* offsetof(), etc. */
#include <linux/errno.h> /* return codes */
@@ -122,7 +118,12 @@ static struct tq_struct sdla_tq =
* < 0 error.
* Context: process
*/
+
+#ifdef MODULE
int init_module (void)
+#else
+int wanpipe_init(void)
+#endif
{
int cnt, err = 0;
@@ -173,6 +174,7 @@ int init_module (void)
return err;
}
+#ifdef MODULE
/*============================================================================
* Module 'remove' entry point.
* o unregister all adapters from the WAN router
@@ -190,6 +192,8 @@ void cleanup_module (void)
kfree(card_array);
}
+#endif
+
/******* WAN Device Driver Entry Points *************************************/
/*============================================================================
diff --git a/drivers/net/seeq8005.c b/drivers/net/seeq8005.c
index b571dc28c..c01c31d5b 100644
--- a/drivers/net/seeq8005.c
+++ b/drivers/net/seeq8005.c
@@ -247,10 +247,10 @@ __initfunc(static int seeq8005_probe1(struct device *dev, int ioaddr))
outw(0x5a5a, SEEQ_BUFFER);
}
j=jiffies+HZ;
- while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && jiffies < j )
+ while ( ((inw(SEEQ_STATUS) & SEEQSTAT_FIFO_EMPTY) != SEEQSTAT_FIFO_EMPTY) && time_before(jiffies, j) )
mb();
outw( 0 , SEEQ_DMAAR);
- while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && jiffies < j+HZ)
+ while ( ((inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, j+HZ))
mb();
if ( (inw(SEEQ_STATUS) & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
outw( SEEQCMD_WINDOW_INT_ACK | (inw(SEEQ_STATUS)& SEEQCMD_INT_MASK), SEEQ_CMD);
@@ -707,7 +707,7 @@ static void hardware_send_packet(struct device * dev, char *buf, int length)
/* drain FIFO */
tmp = jiffies;
- while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies < tmp + HZ))
+ while ( (((status=inw(SEEQ_STATUS)) & SEEQSTAT_FIFO_EMPTY) == 0) && (jiffies - tmp < HZ))
mb();
/* doit ! */
@@ -729,7 +729,7 @@ inline void wait_for_buffer(struct device * dev)
int status;
tmp = jiffies + HZ;
- while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && jiffies < tmp)
+ while ( ( ((status=inw(SEEQ_STATUS)) & SEEQSTAT_WINDOW_INT) != SEEQSTAT_WINDOW_INT) && time_before(jiffies, tmp))
mb();
if ( (status & SEEQSTAT_WINDOW_INT) == SEEQSTAT_WINDOW_INT)
diff --git a/drivers/net/sktr.c b/drivers/net/sktr.c
index f86acd1fb..7bc4f256f 100644
--- a/drivers/net/sktr.c
+++ b/drivers/net/sktr.c
@@ -1020,7 +1020,7 @@ static void sktr_timer_chk(unsigned long data)
return;
sktr_chk_outstanding_cmds(dev);
- if(tp->LastSendTime + SEND_TIMEOUT < jiffies
+ if(time_before(tp->LastSendTime + SEND_TIMEOUT, jiffies)
&& (tp->QueueSkb < MAX_TX_QUEUE || tp->TplFree != tp->TplBusy))
{
/* Anything to send, but stalled to long */
@@ -1068,7 +1068,7 @@ static void sktr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
if(!sktr_chk_ssb(tp, irq_type))
{
- printk(KERN_INFO "%s: DATA LATE occured\n", dev->name);
+ printk(KERN_INFO "%s: DATA LATE occurred\n", dev->name);
break;
}
@@ -1526,11 +1526,11 @@ static void sktr_wait(unsigned long time)
{
long tmp;
- tmp = time/(1000000/HZ);
+ tmp = jiffies + time/(1000000/HZ);
do {
- current->state = TASK_INTERRUPTIBLE;
+ current->state = TASK_INTERRUPTIBLE;
tmp = schedule_timeout(tmp);
- } while(tmp);
+ } while(time_after(tmp, jiffies));
return;
}
@@ -1583,7 +1583,7 @@ static int sktr_reset_adapter(struct device *dev)
c |= ACL_SPEED16; /* Set 16Mbps */
}
- /* In case a comand is pending - forget it */
+ /* In case a command is pending - forget it */
tp->ScbInUse = 0;
c &= ~ACL_ARESET; /* Clear adapter reset bit */
@@ -1672,7 +1672,7 @@ static int sktr_bringup_diags(struct device *dev)
} while(retry_cnt > 0);
Status = inw(ioaddr + SIFSTS);
- Status &= STS_ERROR_MASK; /* Hardware error occured! */
+ Status &= STS_ERROR_MASK; /* Hardware error occurred! */
printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n",
dev->name, Status);
@@ -1761,7 +1761,7 @@ static int sktr_init_adapter(struct device *dev)
{
if((Status & STS_ERROR) != 0)
{
- /* Initialization error occured */
+ /* Initialization error occurred */
Status = inw(ioaddr + SIFSTS);
Status &= STS_ERROR_MASK;
/* ShowInitialisationErrorCode(Status); */
diff --git a/drivers/net/sktr_firmware.h b/drivers/net/sktr_firmware.h
index bef17faa4..25dd973d4 100644
--- a/drivers/net/sktr_firmware.h
+++ b/drivers/net/sktr_firmware.h
@@ -1,6 +1,6 @@
/*
* The firmware this driver downloads into the tokenring card is a
- * seperate program and is not GPL'd source code, even though the Linux
+ * separate program and is not GPL'd source code, even though the Linux
* side driver and the routine that loads this data into the card are.
*
* This firmware is licensed to you strictly for use in conjunction
diff --git a/drivers/net/slhc.c b/drivers/net/slhc.c
index 13a020869..118a0e1ec 100644
--- a/drivers/net/slhc.c
+++ b/drivers/net/slhc.c
@@ -51,14 +51,16 @@
*/
#include <linux/config.h>
-#ifdef CONFIG_INET
-/* Entire module is for IP only */
#include <linux/module.h>
-
#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+
+#ifdef CONFIG_INET
+/* Entire module is for IP only */
#include <linux/sched.h>
#include <linux/mm.h>
-#include <linux/string.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/termios.h>
@@ -72,7 +74,6 @@
#include <net/tcp.h>
#include <linux/skbuff.h>
#include <net/sock.h>
-#include <linux/errno.h>
#include <linux/timer.h>
#include <asm/system.h>
#include <asm/uaccess.h>
@@ -758,4 +759,52 @@ __initfunc(void slhc_install(void))
}
#endif /* MODULE */
+#else /* CONFIG_INET */
+EXPORT_SYMBOL(slhc_init);
+EXPORT_SYMBOL(slhc_free);
+EXPORT_SYMBOL(slhc_remember);
+EXPORT_SYMBOL(slhc_compress);
+EXPORT_SYMBOL(slhc_uncompress);
+EXPORT_SYMBOL(slhc_toss);
+
+int
+slhc_toss(struct slcompress *comp)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_toss");
+ return -EINVAL;
+}
+int
+slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_uncompress");
+ return -EINVAL;
+}
+int
+slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
+ unsigned char *ocp, unsigned char **cpp, int compress_cid)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_compress");
+ return -EINVAL;
+}
+
+int
+slhc_remember(struct slcompress *comp, unsigned char *icp, int isize)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_remember");
+ return -EINVAL;
+}
+
+void
+slhc_free(struct slcompress *comp)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_free");
+ return;
+}
+struct slcompress *
+slhc_init(int rslots, int tslots)
+{
+ printk(KERN_DEBUG "Called IP function on non IP-system: slhc_init");
+ return NULL;
+}
+
#endif /* CONFIG_INET */
diff --git a/drivers/net/smc-mca.c b/drivers/net/smc-mca.c
index cd10798a2..a588a1b9a 100644
--- a/drivers/net/smc-mca.c
+++ b/drivers/net/smc-mca.c
@@ -375,7 +375,6 @@ void cleanup_module(void)
/* NB: ultra_close_card() does free_irq */
int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET;
release_region(ioaddr, ULTRA_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/smc-ultra.c b/drivers/net/smc-ultra.c
index f51ced5ad..dbb30af09 100644
--- a/drivers/net/smc-ultra.c
+++ b/drivers/net/smc-ultra.c
@@ -483,7 +483,6 @@ cleanup_module(void)
void *priv = dev->priv;
/* NB: ultra_close_card() does free_irq */
release_region(ioaddr, ULTRA_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/smc-ultra32.c b/drivers/net/smc-ultra32.c
index 64772c48c..f78f02a6e 100644
--- a/drivers/net/smc-ultra32.c
+++ b/drivers/net/smc-ultra32.c
@@ -413,7 +413,6 @@ void cleanup_module(void)
void *priv = dev->priv;
/* NB: ultra32_close_card() does free_irq */
release_region(ioaddr, ULTRA32_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
}
diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c
index e93207339..d3d2fba46 100644
--- a/drivers/net/tlan.c
+++ b/drivers/net/tlan.c
@@ -2797,7 +2797,7 @@ void TLan_EeReceiveByte( u16 io_base, u8 *data, int stop )
*
* Returns:
* No error = 0, else, the stage at which the error
- * occured.
+ * occurred.
* Parms:
* io_base The IO port base address for the
* TLAN device with the EEPROM to
diff --git a/drivers/net/tulip.c b/drivers/net/tulip.c
index 04ddcef20..555776826 100644
--- a/drivers/net/tulip.c
+++ b/drivers/net/tulip.c
@@ -1,13 +1,13 @@
-/* tulip.c: A DEC 21040-family ethernet driver for linux. */
+/* tulip.c: A DEC 21040-family ethernet driver for Linux. */
/*
- NOTICE: THIS IS THE ALPHA TEST VERSION!
- Written 1994-1997 by Donald Becker.
+ Written 1994-1998 by Donald Becker.
This software may be used and distributed according to the terms
of the GNU Public License, incorporated herein by reference.
- This driver is for the SMC EtherPower PCI ethernet adapter.
- It should work with most other DEC 21*40-based ethercards.
+ This driver is for the Digital "Tulip" ethernet adapter interface.
+ It should work with most DEC 21*4*-based chips/ethercards, as well as
+ PNIC and MXIC chips.
The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O
Center of Excellence in Space Data and Information Sciences
@@ -17,14 +17,27 @@
http://cesdis.gsfc.nasa.gov/linux/drivers/tulip.html
*/
-static const char *version = "tulip.c:v0.83 10/19/97 becker@cesdis.gsfc.nasa.gov\n";
+#define SMP_CHECK
+static const char version[] = "tulip.c:v0.89H 5/23/98 becker@cesdis.gsfc.nasa.gov\n";
/* A few user-configurable values. */
+/* Maximum events (Rx packets, etc.) to handle at each interrupt. */
+static int max_interrupt_work = 25;
+
+#define MAX_UNITS 8
/* Used to pass the full-duplex flag, etc. */
-static int full_duplex[8] = {0, };
-static int options[8] = {0, };
-static int mtu[8] = {0, }; /* Jumbo MTU for interfaces. */
+static int full_duplex[MAX_UNITS] = {0, };
+static int options[MAX_UNITS] = {0, };
+static int mtu[MAX_UNITS] = {0, }; /* Jumbo MTU for interfaces. */
+
+/* The possible media types that can be set in options[] are: */
+static const char * const medianame[] = {
+ "10baseT", "10base2", "AUI", "100baseTx",
+ "10baseT-FD", "100baseTx-FD", "100baseT4", "100baseFx",
+ "100baseFx-FD", "MII 10baseT", "MII 10baseT-FD", "MII",
+ "10baseT(forced)", "MII 100baseTx", "MII 100baseTx-FD", "MII 100baseT4",
+};
/* Set if the PCI BIOS detects the chips on a multiport board backwards. */
#ifdef REVERSE_PROBE_ORDER
@@ -38,40 +51,20 @@ static int reverse_probe = 0;
bonding and packet priority.
There are no ill effects from too-large receive rings. */
#define TX_RING_SIZE 16
-#define RX_RING_SIZE 16
+#define RX_RING_SIZE 32
/* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
#ifdef __alpha__
-static const int rx_copybreak = 1518;
+static int rx_copybreak = 1518;
#else
-static const int rx_copybreak = 100;
+static int rx_copybreak = 100;
#endif
-/* The following example shows how to always use the 10base2 port. */
-#ifdef notdef
-#define TULIP_DEFAULT_MEDIA 1 /* 1 == 10base2 */
-#define TULIP_NO_MEDIA_SWITCH /* Don't switch from this port */
-#endif
-
-/* Define to force full-duplex operation on all Tulip interfaces. */
-/* #define TULIP_FULL_DUPLEX 1 */
-
/* Operational parameters that usually are not changed. */
/* Time in jiffies before concluding the transmitter is hung. */
-#define TX_TIMEOUT ((2000*HZ)/1000)
+#define TX_TIMEOUT (4*HZ)
-#include <linux/config.h>
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
#include <linux/module.h>
-#include <linux/version.h>
-#else
-#define MOD_INC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
-
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
@@ -82,6 +75,7 @@ static const int rx_copybreak = 100;
#include <linux/malloc.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
+
#include <asm/processor.h> /* Processor type for cache alignment. */
#include <asm/bitops.h>
#include <asm/io.h>
@@ -106,28 +100,10 @@ static const int rx_copybreak = 100;
#define DEV_ALLOC_SKB(len) dev_alloc_skb(len + 2)
#endif
-#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE < 0x10338
-#ifdef MODULE
-#if !defined(CONFIG_MODVERSIONS) && !defined(__NO_VERSION__)
-char kernel_version[] = UTS_RELEASE;
-#endif
-#else
-#undef MOD_INC_USE_COUNT
-#define MOD_INC_USE_COUNT
-#undef MOD_DEC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
-#endif /* 1.3.38 */
-
#if (LINUX_VERSION_CODE >= 0x10344)
#define NEW_MULTICAST
#include <linux/delay.h>
#endif
-#if (LINUX_VERSION_CODE >= 0x20100)
-#ifdef MODULE
-char kernel_version[] = UTS_RELEASE;
-#endif
-#endif
#ifdef SA_SHIRQ
#define IRQ(irq, dev_id, pt_regs) (irq, dev_id, pt_regs)
#else
@@ -135,8 +111,8 @@ char kernel_version[] = UTS_RELEASE;
#endif
#if (LINUX_VERSION_CODE < 0x20123)
+#define hard_smp_processor_id() smp_processor_id()
#define test_and_set_bit(val, addr) set_bit(val, addr)
-#include <linux/bios32.h>
#endif
/* This my implementation of shared IRQs, now only used for 1.2.13. */
@@ -167,7 +143,7 @@ I. Board Compatibility
This device driver is designed for the DECchip "Tulip", Digital's
single-chip ethernet controllers for PCI. Supported members of the family
-are the 21040, 21041, 21140, 21140A and 21142. These chips are used on
+are the 21040, 21041, 21140, 21140A, 21142, and 21143. These chips are used on
many PCI boards including the SMC EtherPower series.
@@ -268,44 +244,65 @@ register of the set CSR12-15 written. Hmmm, now how is that possible? */
#ifndef PCI_VENDOR_ID_LITEON
#define PCI_VENDOR_ID_LITEON 0x11AD
-#define PCI_DEVICE_ID_PNIC 0x0002
-#define PCI_DEVICE_ID_PNIC_X 0x0168
-#else
-/* Now PCI_VENDOR_ID_LITEON is defined, but device IDs have different names */
-#define PCI_DEVICE_ID_PNIC PCI_DEVICE_ID_LITEON_LNE100TX
-#define PCI_DEVICE_ID_PNIC_X 0x0168
+#endif
+
+#ifndef PCI_VENDOR_ID_MXIC
+#define PCI_VENDOR_ID_MXIC 0x10d9
+#define PCI_DEVICE_ID_MX98713 0x0512
+#define PCI_DEVICE_ID_MX98715 0x0531
+#define PCI_DEVICE_ID_MX98725 0x0531
#endif
/* The rest of these values should never change. */
static void tulip_timer(unsigned long data);
+static void t21142_timer(unsigned long data);
+static void mxic_timer(unsigned long data);
+static void pnic_timer(unsigned long data);
/* A table describing the chip types. */
+enum tbl_flag { HAS_MII=1, HAS_MEDIA_TABLE = 2, CSR12_IN_SROM = 4,};
static struct tulip_chip_table {
- int device_id;
- char *chip_name;
- int flags;
- void (*media_timer)(unsigned long data);
+ int vendor_id, device_id;
+ char *chip_name;
+ int io_size;
+ int valid_intrs; /* CSR7 interrupt enable settings */
+ int flags;
+ void (*media_timer)(unsigned long data);
} tulip_tbl[] = {
- { PCI_DEVICE_ID_DEC_TULIP, "Digital DS21040 Tulip", 0, tulip_timer },
- { PCI_DEVICE_ID_DEC_TULIP_PLUS, "Digital DS21041 Tulip", 0, tulip_timer },
- { PCI_DEVICE_ID_DEC_TULIP_FAST, "Digital DS21140 Tulip", 0, tulip_timer },
- { PCI_DEVICE_ID_DEC_TULIP_21142, "Digital DS21142/3 Tulip", 0, tulip_timer },
- { PCI_DEVICE_ID_PNIC_X, "Lite-On 82c168 PNIC", 0, tulip_timer },
+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
+ "Digital DC21040 Tulip", 128, 0x0001ebef, 0, tulip_timer },
+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
+ "Digital DC21041 Tulip", 128, 0x0001ebef, HAS_MEDIA_TABLE, tulip_timer },
+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_FAST,
+ "Digital DS21140 Tulip", 128, 0x0001ebef,
+ HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM,
+ tulip_timer },
+ { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_21142,
+ "Digital DS21142/3 Tulip", 128, 0x0801fbff,
+ HAS_MII | HAS_MEDIA_TABLE, t21142_timer },
+ { PCI_VENDOR_ID_LITEON, 0x0002,
+ "Lite-On 82c168 PNIC", 256, 0x0001ebef, HAS_MII, pnic_timer },
+ { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98713,
+ "Macronix 98713 PMAC", 128, 0x0001ebef,
+ HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM, tulip_timer /* Tulip-like! */ },
+ { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98715,
+ "Macronix 98715 PMAC", 256, 0x0001ebef, HAS_MEDIA_TABLE, mxic_timer },
+ { PCI_VENDOR_ID_MXIC, PCI_DEVICE_ID_MX98725,
+ "Macronix 98725 PMAC", 256, 0x0001ebef, HAS_MEDIA_TABLE, mxic_timer },
+ { 0x125B, 0x1400, "ASIX AX88140", 128, 0x0001fbff,
+ HAS_MII | HAS_MEDIA_TABLE | CSR12_IN_SROM, tulip_timer },
{0, 0, 0, 0},
};
/* This matches the table above. */
-enum chips { DC21040=0, DC21041=1, DC21140=2, DC21142=3, LC82C168};
-
-static const char * const medianame[] = {
- "10baseT", "10base2", "AUI", "100baseTx",
- "10baseT-FD", "100baseTx-FD", "100baseT4", "100baseFx",
- "100baseFx-FD", "MII 10baseT", "MII 10baseT-FD", "MII",
- "10baseT(forced)", "MII 100baseTx", "MII 100baseTx-FD", "MII 100baseT4",
-};
-/* A full-duplex map for above. */
-static const char media_fd[] =
-{0,0,0,0, 0xff,0xff,0,0, 0xff,0,0xff,0x01, 0,0,0xff,0 };
+enum chips { DC21040=0, DC21041=1, DC21140=2, DC21142=3, DC21143=3,
+ LC82C168, MX98713, MX98715, MX98725};
+
+/* A full-duplex map for media types. */
+enum MediaIs {MediaIsFD = 1, MediaAlwaysFD=2, MediaIsMII=4, MediaIsFx=8,
+ MediaIs100=16};
+static const char media_cap[] =
+{0,0,0,16, 3,19,16,24, 27,4,7,5, 0,20,23,20 };
/* 21041 transceiver register settings: 10-T, 10-2, AUI, 10-T, 10T-FD*/
static u16 t21041_csr13[] = { 0xEF05, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
static u16 t21041_csr14[] = { 0x7F3F, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
@@ -325,9 +322,9 @@ enum tulip_offsets {
/* The bits in the CSR5 status registers, mostly interrupt sources. */
enum status_bits {
TimerInt=0x800, TPLnkFail=0x1000, TPLnkPass=0x10,
+ NormalIntr=0x10000, AbnormalIntr=0x8000,
RxJabber=0x200, RxDied=0x100, RxNoBuf=0x80, RxIntr=0x40,
- TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02,
- TxIntr=0x01,
+ TxFIFOUnderflow=0x20, TxJabber=0x08, TxNoBuf=0x04, TxDied=0x02, TxIntr=0x01,
};
/* The Tulip Rx and Tx buffer descriptors. */
@@ -352,7 +349,7 @@ struct medialeaf {
struct mediatable {
u16 defaultmedia;
u8 leafcount, csr12dir; /* General purpose pin directions. */
- unsigned has_mii:1;
+ unsigned has_mii:1, has_nonmii:1;
struct medialeaf mleaf[0];
};
@@ -360,7 +357,6 @@ struct mediainfo {
struct mediainfo *next;
int info_type;
int index;
- struct non_mii { char media; unsigned char csr12val; char bitnum, flags;} non_mii;
unsigned char *info;
};
@@ -384,32 +380,38 @@ struct tulip_private {
struct enet_statistics stats;
#endif
struct timer_list timer; /* Media selection timer. */
-#ifdef CONFIG_NET_HW_FLOWCONTROL
- int fc_bit;
+ int interrupt; /* In-interrupt flag. */
+#ifdef SMP_CHECK
+ int smp_proc_id; /* Which processor in IRQ handler. */
#endif
unsigned int cur_rx, cur_tx; /* The next free ring entry */
unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */
unsigned int tx_full:1; /* The Tx queue is full. */
unsigned int full_duplex:1; /* Full-duplex operation requested. */
unsigned int full_duplex_lock:1;
+ unsigned int fake_addr:1; /* Multiport board faked address. */
unsigned int default_port:4; /* Last dev->if_port value. */
unsigned int media2:4; /* Secondary monitored media port. */
unsigned int medialock:1; /* Don't sense media type. */
unsigned int mediasense:1; /* Media sensing in progress. */
unsigned int csr6; /* Current CSR6 control settings. */
unsigned char eeprom[128]; /* Serial EEPROM contents. */
- signed char phys[4]; /* MII device addresses. */
+ u16 to_advertise; /* NWay capabilities advertised. */
+ u16 advertising[4];
+ signed char phys[4], mii_cnt; /* MII device addresses. */
struct mediatable *mtable;
int cur_index; /* Current media index. */
- unsigned char pci_bus, pci_device_fn;
+ unsigned char pci_bus, pci_dev_fn;
int pad0, pad1; /* Used for 8-byte alignment */
};
-static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
+static struct device *tulip_probe1(int pci_bus, int pci_devfn,
+ struct device *dev,
int chip_id, int options);
static void parse_eeprom(struct device *dev);
-static int read_eeprom(int ioaddr, int location);
-static int mdio_read(int ioaddr, int phy_id, int location);
+static int read_eeprom(long ioaddr, int location);
+static int mdio_read(struct device *dev, int phy_id, int location);
+static void mdio_write(struct device *dev, int phy_id, int location, int value);
static void select_media(struct device *dev, int startup);
static int tulip_open(struct device *dev);
static void tulip_timer(unsigned long data);
@@ -420,24 +422,19 @@ static int tulip_rx(struct device *dev);
static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *regs);
static int tulip_close(struct device *dev);
static struct enet_statistics *tulip_get_stats(struct device *dev);
+#ifdef HAVE_PRIVATE_IOCTL
+static int private_ioctl(struct device *dev, struct ifreq *rq, int cmd);
+#endif
#ifdef NEW_MULTICAST
-static void set_multicast_list(struct device *dev);
+static void set_rx_mode(struct device *dev);
#else
-static void set_multicast_list(struct device *dev, int num_addrs, void *addrs);
-#endif
-#ifdef CONFIG_NET_FASTROUTE
-#include <linux/if_arp.h>
-#include <net/ip.h>
-
-static int tulip_accept_fastpath(struct device *dev, struct dst_entry *dst);
+static void set_rx_mode(struct device *dev, int num_addrs, void *addrs);
#endif
-#ifdef MODULE
/* A list of all installed Tulip devices, for removing the driver module. */
static struct device *root_tulip_dev = NULL;
-#endif
/* This 21040 probe no longer uses a large fixed contiguous Rx buffer region,
but now receives directly into full-sized skbuffs that are allocated
@@ -449,121 +446,118 @@ int tulip_probe(struct device *dev)
{
int cards_found = 0;
static int pci_index = 0; /* Static, for multiple probe calls. */
+ unsigned char pci_bus, pci_device_fn;
/* Ideally we would detect all network cards in slot order. That would
be best done a central PCI probe dispatch, which wouldn't work
well with the current structure. So instead we detect just the
Tulip cards in slot order. */
- if (pci_present()) {
- unsigned char pci_bus, pci_device_fn;
-
- for (;pci_index < 0xff; pci_index++) {
- unsigned char pci_latency;
#if LINUX_VERSION_CODE >= 0x20155
- unsigned int pci_irq_line;
- struct pci_dev *pdev;
+ if (! pci_present())
+ return -ENODEV;
#else
- unsigned char pci_irq_line;
-#endif
- unsigned short pci_command, vendor, device;
- unsigned int pci_ioaddr, chip_idx = 0;
-
- if (pcibios_find_class
- (PCI_CLASS_NETWORK_ETHERNET << 8,
- reverse_probe ? 0xfe - pci_index : pci_index,
- &pci_bus, &pci_device_fn) != PCIBIOS_SUCCESSFUL) {
- if (reverse_probe)
- continue;
- else
- break;
- }
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_VENDOR_ID, &vendor);
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_DEVICE_ID, &device);
+ if (! pcibios_present())
+ return -ENODEV;
+#endif
+ for (;pci_index < 0xff; pci_index++) {
+ u16 vendor, device, pci_command, new_command;
+ unsigned long pci_ioaddr = 0;
+ int chip_idx = 0;
+
+ if (pcibios_find_class
+ (PCI_CLASS_NETWORK_ETHERNET << 8,
+ reverse_probe ? 0xfe - pci_index : pci_index,
+ &pci_bus, &pci_device_fn) != PCIBIOS_SUCCESSFUL)
+ if (reverse_probe)
+ continue;
+ else
+ break;
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_VENDOR_ID, &vendor);
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_DEVICE_ID, &device);
+
+ for (chip_idx = 0; tulip_tbl[chip_idx].chip_name; chip_idx++)
+ if (vendor == tulip_tbl[chip_idx].vendor_id &&
+ device == tulip_tbl[chip_idx].device_id)
+ break;
+ if (tulip_tbl[chip_idx].chip_name == 0) {
+ if (vendor == PCI_VENDOR_ID_DEC ||
+ vendor == PCI_VENDOR_ID_LITEON)
+ printk(KERN_INFO "Unknown Tulip-style PCI ethernet chip type"
+ " %4.4x %4.4x"" detected: not configured.\n",
+ vendor, device);
+ continue;
+ }
#if LINUX_VERSION_CODE >= 0x20155
- pdev = pci_find_slot(pci_bus, pci_device_fn);
- pci_irq_line = pdev->irq;
- pci_ioaddr = pdev->base_address[0];
+ pci_ioaddr = pci_find_slot(pci_bus, pci_device_fn)->base_address[0];
#else
- pcibios_read_config_byte(pci_bus, pci_device_fn,
- PCI_INTERRUPT_LINE, &pci_irq_line);
- pcibios_read_config_dword(pci_bus, pci_device_fn,
- PCI_BASE_ADDRESS_0, &pci_ioaddr);
+ pcibios_read_config_dword(pci_bus, pci_device_fn, PCI_BASE_ADDRESS_0,
+ &pci_ioaddr);
#endif
- /* Remove I/O space marker in bit 0. */
- pci_ioaddr &= ~3;
-
- if (vendor != PCI_VENDOR_ID_DEC
- && vendor != PCI_VENDOR_ID_LITEON)
- continue;
- if (vendor == PCI_VENDOR_ID_LITEON)
- device = PCI_DEVICE_ID_PNIC_X;
-
- for (chip_idx = 0; tulip_tbl[chip_idx].chip_name; chip_idx++)
- if (device == tulip_tbl[chip_idx].device_id)
- break;
- if (tulip_tbl[chip_idx].chip_name == 0) {
- printk(KERN_INFO "Unknown Digital PCI ethernet chip type"
- " %4.4x"" detected: not configured.\n", device);
- continue;
- }
- if (tulip_debug > 2)
- printk(KERN_DEBUG "Found DEC PCI Tulip at I/O %#x, IRQ %d.\n",
- pci_ioaddr, pci_irq_line);
+ /* Remove I/O space marker in bit 0. */
+ pci_ioaddr &= ~3;
- if (check_region(pci_ioaddr, TULIP_TOTAL_SIZE))
- continue;
+ if (tulip_debug > 2)
+ printk(KERN_DEBUG "Found %s at I/O %#lx.\n",
+ tulip_tbl[chip_idx].chip_name, pci_ioaddr);
+
+ if (check_region(pci_ioaddr, tulip_tbl[chip_idx].io_size))
+ continue;
+
+ pcibios_read_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, &pci_command);
+ new_command = pci_command | PCI_COMMAND_MASTER|PCI_COMMAND_IO;
+ if (pci_command != new_command) {
+ printk(KERN_INFO " The PCI BIOS has not enabled this"
+ " device! Updating PCI command %4.4x->%4.4x.\n",
+ pci_command, new_command);
+ pcibios_write_config_word(pci_bus, pci_device_fn,
+ PCI_COMMAND, new_command);
+ }
-#ifdef MODULE
- dev = tulip_probe1(dev, pci_ioaddr, pci_irq_line, chip_idx,
- cards_found);
-#else
- dev = tulip_probe1(dev, pci_ioaddr, pci_irq_line, chip_idx, -1);
-#endif
+ dev = tulip_probe1(pci_bus, pci_device_fn, dev, chip_idx, cards_found);
- if (dev) {
- /* Get and check the bus-master and latency values. */
- pcibios_read_config_word(pci_bus, pci_device_fn,
- PCI_COMMAND, &pci_command);
- if ( ! (pci_command & PCI_COMMAND_MASTER)) {
- printk(KERN_INFO " PCI Master Bit has not been set! Setting...\n");
- pci_command |= PCI_COMMAND_MASTER;
- pcibios_write_config_word(pci_bus, pci_device_fn,
- PCI_COMMAND, pci_command);
- }
- pcibios_read_config_byte(pci_bus, pci_device_fn,
- PCI_LATENCY_TIMER, &pci_latency);
- if (pci_latency < 10) {
- printk(KERN_INFO " PCI latency timer (CFLT) is unreasonably"
- " low at %d. Setting to 64 clocks.\n", pci_latency);
+ /* Get and check the bus-master and latency values. */
+ if (dev) {
+ unsigned char pci_latency;
+ pcibios_read_config_byte(pci_bus, pci_device_fn,
+ PCI_LATENCY_TIMER, &pci_latency);
+ if (pci_latency < 10) {
+ printk(KERN_INFO " PCI latency timer (CFLT) is "
+ "unreasonably low at %d. Setting to 64 clocks.\n",
+ pci_latency);
pcibios_write_config_byte(pci_bus, pci_device_fn,
PCI_LATENCY_TIMER, 64);
- } else if (tulip_debug > 1)
- printk(KERN_INFO " PCI latency timer (CFLT) is %#x.\n",
- pci_latency);
- /* Bring the 21143 out power-down mode. */
- if (device == PCI_DEVICE_ID_DEC_TULIP_21142)
+ } else if (tulip_debug > 1)
+ printk(KERN_INFO " PCI latency timer (CFLT) is %#x, "
+ " PCI command is %4.4x.\n",
+ pci_latency, new_command);
+ /* Bring the 21143 out power-down mode. */
+ if (device == PCI_DEVICE_ID_DEC_TULIP_21142)
pcibios_write_config_dword(pci_bus, pci_device_fn,
- 0x40, 0x40000000);
- dev = 0;
- cards_found++;
- }
+ 0x40, 0x40000000);
+ dev = 0;
+ cards_found++;
}
}
return cards_found ? 0 : -ENODEV;
}
-static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
+static struct device *tulip_probe1(int pci_bus, int pci_device_fn,
+ struct device *dev,
int chip_id, int board_idx)
{
static int did_version = 0; /* Already printed version info. */
struct tulip_private *tp;
+ long ioaddr;
+ int irq;
/* See note below on the multiport cards. */
static unsigned char last_phys_addr[6] = {0x00, 'L', 'i', 'n', 'u', 'x'};
static int last_irq = 0;
+ static int multiport_cnt = 0; /* For four-port boards w/one EEPROM */
int i;
unsigned short sum;
@@ -572,7 +566,25 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
dev = init_etherdev(dev, 0);
- printk(KERN_INFO "%s: %s at %#3x,",
+#if LINUX_VERSION_CODE >= 0x20155
+ irq = pci_find_slot(pci_bus, pci_device_fn)->irq;
+ ioaddr = pci_find_slot(pci_bus, pci_device_fn)->base_address[0];
+#else
+ {
+ u8 pci_irq_line;
+ u32 pci_ioaddr;
+ pcibios_read_config_byte(pci_bus, pci_device_fn,
+ PCI_INTERRUPT_LINE, &pci_irq_line);
+ pcibios_read_config_dword(pci_bus, pci_device_fn, PCI_BASE_ADDRESS_0,
+ &pci_ioaddr);
+ irq = pci_irq_line;
+ ioaddr = pci_ioaddr;
+ }
+#endif
+ /* Remove I/O space marker in bit 0. */
+ ioaddr &= ~3;
+
+ printk(KERN_INFO "%s: %s at %#3lx,",
dev->name, tulip_tbl[chip_id].chip_name, ioaddr);
/* Stop the chip's Tx and Rx processes. */
@@ -629,6 +641,10 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
for (i = 0; i < 8; i ++)
if (ee_data[i] != ee_data[16+i])
sa_offset = 20;
+ if (ee_data[0] == 0xff && ee_data[1] == 0xff && ee_data[2] == 0) {
+ sa_offset = 2; /* Grrr, damn Matrox boards. */
+ multiport_cnt = 4;
+ }
for (i = 0; i < 6; i ++) {
dev->dev_addr[i] = ee_data[i + sa_offset];
sum += ee_data[i + sa_offset];
@@ -655,13 +671,15 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
irq = last_irq;
#endif
}
+
for (i = 0; i < 6; i++)
printk(" %2.2x", last_phys_addr[i] = dev->dev_addr[i]);
printk(", IRQ %d.\n", irq);
last_irq = irq;
/* We do a request_region() only to register /proc/ioports info. */
- request_region(ioaddr, TULIP_TOTAL_SIZE, tulip_tbl[chip_id].chip_name);
+ /* Note that proper size is tulip_tbl[chip_id].chip_name, but... */
+ request_region(ioaddr, TULIP_TOTAL_SIZE, dev->name);
dev->base_addr = ioaddr;
dev->irq = irq;
@@ -671,11 +689,11 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
memset(tp, 0, sizeof(*tp));
dev->priv = tp;
-#ifdef MODULE
tp->next_module = root_tulip_dev;
root_tulip_dev = dev;
-#endif
+ tp->pci_bus = pci_bus;
+ tp->pci_dev_fn = pci_device_fn;
tp->chip_id = chip_id;
#ifdef TULIP_FULL_DUPLEX
@@ -690,36 +708,64 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
#endif
/* The lower four bits are the media type. */
- if (board_idx >= 0) {
- tp->full_duplex = (options[board_idx]&16) || full_duplex[board_idx]>0;
- if (tp->full_duplex)
- tp->full_duplex_lock = 1;
+ if (board_idx >= 0 && board_idx < MAX_UNITS) {
tp->default_port = options[board_idx] & 15;
- if (tp->default_port)
- tp->medialock = 1;
+ if ((options[board_idx] & 0x90) || full_duplex[board_idx] > 0)
+ tp->full_duplex = 1;
if (mtu[board_idx] > 0)
dev->mtu = mtu[board_idx];
}
+ if (dev->mem_start)
+ tp->default_port = dev->mem_start;
+ if (tp->default_port) {
+ tp->medialock = 1;
+ if (media_cap[tp->default_port] & MediaAlwaysFD)
+ tp->full_duplex = 1;
+ }
+ if (tp->full_duplex)
+ tp->full_duplex_lock = 1;
/* This is logically part of probe1(), but too complex to write inline. */
- if (chip_id != DC21040 && chip_id != LC82C168)
+ if (tulip_tbl[chip_id].flags & HAS_MEDIA_TABLE)
parse_eeprom(dev);
- if (tp->mtable && tp->mtable->has_mii) {
+ if (media_cap[tp->default_port] & MediaIsMII) {
+ u16 media2advert[] = { 0x20, 0x40, 0x03e0, 0x60, 0x80, 0x100, 0x200 };
+ tp->to_advertise = media2advert[tp->default_port - 9];
+ } else
+ tp->to_advertise = 0x03e1;
+
+ if ((tp->mtable && tp->mtable->has_mii) ||
+ ( ! tp->mtable && (tulip_tbl[tp->chip_id].flags & HAS_MII))) {
int phy, phy_idx;
/* Find the connected MII xcvrs.
Doing this in open() would allow detecting external xcvrs later,
but takes much time. */
for (phy = 0, phy_idx = 0; phy < 32 && phy_idx < sizeof(tp->phys);
phy++) {
- int mii_status = mdio_read(ioaddr, phy, 0);
- if (mii_status != 0xffff && mii_status != 0x0000) {
- tp->phys[phy_idx++] = phy;
- printk(KERN_INFO "%s: MII transceiver found at MDIO address %d.\n",
- dev->name, phy);
+ int mii_status = mdio_read(dev, phy, 1);
+ if (mii_status != 0xffff && mii_status != 0x0000) {
+ int mii_reg0 = mdio_read(dev, phy, 0);
+ int reg4 = ((mii_status>>6) & tp->to_advertise) | 1;
+ tp->phys[phy_idx] = phy;
+ tp->advertising[phy_idx++] = reg4;
+ printk(KERN_INFO "%s: MII transceiver found at MDIO address "
+ "%d, config %4.4x status %4.4x.\n",
+ dev->name, phy, mii_reg0, mii_status);
+ if (1 || (media_cap[tp->default_port] & MediaIsMII)) {
+ printk(KERN_DEBUG "%s: Advertising %4.4x on PHY %d,"
+ " previously advertising %4.4x.\n",
+ dev->name, reg4, phy, mdio_read(dev, phy, 4));
+ mdio_write(dev, phy, 4, reg4);
+ }
+ /* Enable autonegotiation: some boards default to off. */
+ mdio_write(dev, phy, 0, mii_reg0 |
+ (tp->full_duplex ? 0x1100 : 0x1000) |
+ (media_cap[tp->default_port]&MediaIs100 ? 0x2000:0));
}
}
- if (phy_idx == 0) {
+ tp->mii_cnt = phy_idx;
+ if (tp->mtable && tp->mtable->has_mii && phy_idx == 0) {
printk(KERN_INFO "%s: ***WARNING***: No MII transceiver found!\n",
dev->name);
tp->phys[0] = 1;
@@ -731,11 +777,11 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
dev->hard_start_xmit = &tulip_start_xmit;
dev->stop = &tulip_close;
dev->get_stats = &tulip_get_stats;
-#ifdef HAVE_MULTICAST
- dev->set_multicast_list = &set_multicast_list;
+#ifdef HAVE_PRIVATE_IOCTL
+ dev->do_ioctl = &private_ioctl;
#endif
-#ifdef CONFIG_NET_FASTROUTE
- dev->accept_fastpath = tulip_accept_fastpath;
+#ifdef HAVE_MULTICAST
+ dev->set_multicast_list = &set_rx_mode;
#endif
/* Reset the xcvr interface and turn on heartbeat. */
@@ -744,20 +790,37 @@ static struct device *tulip_probe1(struct device *dev, int ioaddr, int irq,
outl(0x00000000, ioaddr + CSR13);
outl(0xFFFFFFFF, ioaddr + CSR14);
outl(0x00000008, ioaddr + CSR15); /* Listen on AUI also. */
- outl(inl(ioaddr + CSR6) | 0x200, ioaddr + CSR6);
+ outl(inl(ioaddr + CSR6) | 0x0200, ioaddr + CSR6);
outl(0x0000EF05, ioaddr + CSR13);
break;
- case DC21140: case DC21142:
- if (tp->mtable)
- outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
- break;
case DC21040:
outl(0x00000000, ioaddr + CSR13);
outl(0x00000004, ioaddr + CSR13);
break;
+ case DC21140: default:
+ if (tp->mtable)
+ outl(tp->mtable->csr12dir | 0x100, ioaddr + CSR12);
+ break;
+ case DC21142:
+ outl(0x82420200, ioaddr + CSR6);
+ outl(0x0001, ioaddr + CSR13);
+ outl(0x0003FFFF, ioaddr + CSR14);
+ outl(0x0008, ioaddr + CSR15);
+ outl(0x0001, ioaddr + CSR13);
+ outl(0x1301, ioaddr + CSR12); /* Start NWay. */
+ break;
case LC82C168:
- outl(0x33, ioaddr + CSR12);
- outl(0x0201F078, ioaddr + 0xB8); /* Turn on autonegotiation. */
+ if ( ! tp->mii_cnt) {
+ outl(0x00420000, ioaddr + CSR6);
+ outl(0x30, ioaddr + CSR12);
+ outl(0x0001F078, ioaddr + 0xB8);
+ outl(0x0201F078, ioaddr + 0xB8); /* Turn on autonegotiation. */
+ }
+ break;
+ case MX98713: case MX98715: case MX98725:
+ outl(0x00000000, ioaddr + CSR6);
+ outl(0x000711C0, ioaddr + CSR14); /* Turn on NWay. */
+ outl(0x00000001, ioaddr + CSR13);
break;
}
@@ -782,7 +845,9 @@ static struct fixups {
{"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x021f,
0x0000, 0x009E, /* 10baseT */
0x0903, 0x006D, /* 100baseTx */ }},
- {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x013f,
+ {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x033f,
+ 0x0107, 0x8021, /* 100baseFx */
+ 0x0108, 0x8021, /* 100baseFx-FD */
0x0103, 0x006D, /* 100baseTx */ }},
{"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0313,
0x1001, 0x009E, /* 10base2, CSR12 0x10*/
@@ -796,9 +861,15 @@ static struct fixups {
{0, 0, 0, 0, {}}};
static const char * block_name[] = {"21140 non-MII", "21140 MII PHY",
- "21142 non-MII PHY", "21142 MII PHY", "21143 SYM PHY", "21143 reset method"};
+ "21142 Serial PHY", "21142 MII PHY", "21143 SYM PHY", "21143 reset method"};
#define EEPROM_SIZE 128
+#if defined(__i386__)
+#define get_u16(ptr) (*(u16 *)(ptr))
+#else
+#define get_u16(ptr) (((u8*)(ptr))[0] + (((u8*)(ptr))[1]<<8))
+#endif
+
static void parse_eeprom(struct device *dev)
{
/* The last media info list parsed, for multiport boards. */
@@ -806,7 +877,7 @@ static void parse_eeprom(struct device *dev)
static unsigned char *last_ee_data = NULL;
static int controller_index = 0;
struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
unsigned char *ee_data = tp->eeprom;
int i;
@@ -870,30 +941,45 @@ static void parse_eeprom(struct device *dev)
}
subsequent_board:
- if (tp->chip_id == DC21041) {
+ if (ee_data[27] == 0) { /* No valid media table. */
+ } else if (tp->chip_id == DC21041) {
unsigned char *p = (void *)ee_data + ee_data[27 + controller_index*3];
- short media = *(u16 *)p;
- int count = p[2];
+ short media;
+ int count;
+
+ media = get_u16(p);
+ p += 2;
+ count = *p++;
printk(KERN_INFO "%s:21041 Media information at %d, default media "
"%4.4x (%s).\n", dev->name, ee_data[27], media,
media & 0x0800 ? "Autosense" : medianame[media & 15]);
for (i = 0; i < count; i++) {
- unsigned char media_code = p[3 + i*7];
- u16 *csrvals = (u16 *)&p[3 + i*7 + 1];
- printk(KERN_INFO "%s: 21041 media %2.2x (%s),"
- " csr13 %4.4x csr14 %4.4x csr15 %4.4x.\n",
- dev->name, media_code & 15, medianame[media_code & 15],
- csrvals[0], csrvals[1], csrvals[2]);
+ unsigned char media_code = *p++;
+ u16 csrvals[3];
+ int idx;
+ for (idx = 0; idx < 3; idx++) {
+ csrvals[idx] = get_u16(p);
+ p += 2;
+ }
+ if (media_code & 0x40) {
+ printk(KERN_INFO "%s: 21041 media %2.2x (%s),"
+ " csr13 %4.4x csr14 %4.4x csr15 %4.4x.\n",
+ dev->name, media_code & 15, medianame[media_code & 15],
+ csrvals[0], csrvals[1], csrvals[2]);
+ } else
+ printk(KERN_INFO "%s: 21041 media #%d, %s.\n",
+ dev->name, media_code & 15, medianame[media_code & 15]);
}
} else {
unsigned char *p = (void *)ee_data + ee_data[27];
unsigned char csr12dir = 0;
int count;
struct mediatable *mtable;
- u16 media = *((u16 *)p)++;
+ u16 media = get_u16(p);
- if (tp->chip_id == DC21140)
+ p += 2;
+ if (tulip_tbl[tp->chip_id].flags & CSR12_IN_SROM)
csr12dir = *p++;
count = *p++;
mtable = (struct mediatable *)
@@ -905,7 +991,7 @@ subsequent_board:
mtable->defaultmedia = media;
mtable->leafcount = count;
mtable->csr12dir = csr12dir;
- mtable->has_mii = 0;
+ mtable->has_nonmii = mtable->has_mii = 0;
printk(KERN_INFO "%s: EEPROM default media type %s.\n", dev->name,
media & 0x0800 ? "Autosense" : medianame[media & 15]);
@@ -916,14 +1002,18 @@ subsequent_board:
leaf->type = 0;
leaf->media = p[0] & 0x3f;
leaf->leafdata = p;
+ if ((p[2] & 0x61) == 0x01) /* Bogus, but Znyx boards do it. */
+ mtable->has_mii = 1;
p += 4;
} else {
leaf->type = p[1];
if (p[1] & 1) {
mtable->has_mii = 1;
leaf->media = 11;
- } else
+ } else {
+ mtable->has_nonmii = 1;
leaf->media = p[2] & 0x0f;
+ }
leaf->leafdata = p + 2;
p += (p[0] & 0x3f) + 1;
}
@@ -966,11 +1056,11 @@ subsequent_board:
#define EE_READ_CMD (6 << 6)
#define EE_ERASE_CMD (7 << 6)
-static int read_eeprom(int ioaddr, int location)
+static int read_eeprom(long ioaddr, int location)
{
int i;
unsigned short retval = 0;
- int ee_addr = ioaddr + CSR9;
+ long ee_addr = ioaddr + CSR9;
int read_cmd = location | EE_READ_CMD;
outl(EE_ENB & ~EE_CS, ee_addr);
@@ -1001,6 +1091,16 @@ static int read_eeprom(int ioaddr, int location)
return retval;
}
+/* MII transceiver control section.
+ Read and write the MII registers using software-generated serial
+ MDIO protocol. See the MII specifications or DP83840A data sheet
+ for details. */
+
+/* The maximum data clock rate is 2.5 Mhz. The minimum timing is usually
+ met by back-to-back PCI I/O cycles, but we insert a delay to avoid
+ "overclocking" issues or future 66Mhz PCI. */
+#define mdio_delay() inl(mdio_addr)
+
/* Read and write the MII registers using software-generated serial
MDIO protocol. It is just different enough from the EEPROM protocol
to not share code. The maxium data clock rate is 2.5 Mhz. */
@@ -1010,18 +1110,24 @@ static int read_eeprom(int ioaddr, int location)
#define MDIO_ENB 0x00000 /* Ignore the 0x02000 databook setting. */
#define MDIO_ENB_IN 0x40000
#define MDIO_DATA_READ 0x80000
-#ifdef _LINUX_DELAY_H
-#define mdio_delay() udelay(1)
-#else
-#define mdio_delay() __SLOW_DOWN_IO
-#endif
-static int mdio_read(int ioaddr, int phy_id, int location)
+static int mdio_read(struct device *dev, int phy_id, int location)
{
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
int i;
int read_cmd = (0xf6 << 10) | (phy_id << 5) | location;
- unsigned short retval = 0;
- int mdio_addr = ioaddr + CSR9;
+ int retval = 0;
+ long mdio_addr = dev->base_addr + CSR9;
+
+ if (tp->chip_id == LC82C168) {
+ long ioaddr = dev->base_addr;
+ int i = 1000;
+ outl(0x60020000 + (phy_id<<23) + (location<<18), ioaddr + 0xA0);
+ while (--i > 0)
+ if ( ! ((retval = inl(ioaddr + 0xA0)) & 0x80000000))
+ return retval & 0xffff;
+ return 0xffff;
+ }
/* Establish sync by sending at least 32 logic ones. */
for (i = 32; i >= 0; i--) {
@@ -1031,60 +1137,78 @@ static int mdio_read(int ioaddr, int phy_id, int location)
mdio_delay();
}
/* Shift the read command bits out. */
- for (i = 17; i >= 0; i--) {
+ for (i = 15; i >= 0; i--) {
int dataval = (read_cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
- outl(dataval, mdio_addr);
- mdio_delay();
- outl(dataval | MDIO_SHIFT_CLK, mdio_addr);
+ outl(MDIO_ENB | dataval, mdio_addr);
mdio_delay();
- outl(dataval, mdio_addr);
+ outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
mdio_delay();
}
- outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
- mdio_delay();
- outl(MDIO_ENB_IN, mdio_addr);
-
- for (i = 16; i > 0; i--) {
- outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
- mdio_delay();
- retval = (retval << 1) | ((inl(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
+ /* Read the two transition, 16 data, and wire-idle bits. */
+ for (i = 19; i > 0; i--) {
outl(MDIO_ENB_IN, mdio_addr);
mdio_delay();
- }
- /* Clear out extra bits. */
- for (i = 16; i > 0; i--) {
+ retval = (retval << 1) | ((inl(mdio_addr) & MDIO_DATA_READ) ? 1 : 0);
outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
mdio_delay();
- outl(MDIO_ENB_IN, mdio_addr);
- mdio_delay();
}
- return retval;
+ return (retval>>1) & 0xffff;
}
-#ifdef CONFIG_NET_HW_FLOWCONTROL
-/* Enable receiver */
-
-void tulip_xon(struct device *dev)
+static void mdio_write(struct device *dev, int phy_id, int location, int value)
{
- struct tulip_private *lp = (struct tulip_private *)dev->priv;
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ int i;
+ int cmd = (0x5002 << 16) | (phy_id << 23) | (location<<18) | value;
+ long mdio_addr = dev->base_addr + CSR9;
+
+ if (tp->chip_id == LC82C168) {
+ long ioaddr = dev->base_addr;
+ int i = 1000;
+ outl(cmd, ioaddr + 0xA0);
+ do
+ if ( ! (inl(ioaddr + 0xA0) & 0x80000000))
+ break;
+ while (--i > 0);
+ return;
+ }
- clear_bit(lp->fc_bit, &netdev_fc_xoff);
- if (dev->start)
- outl(lp->csr6 | 0x2002, dev->base_addr + CSR6);
+ /* Establish sync by sending 32 logic ones. */
+ for (i = 32; i >= 0; i--) {
+ outl(MDIO_ENB | MDIO_DATA_WRITE1, mdio_addr);
+ mdio_delay();
+ outl(MDIO_ENB | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, mdio_addr);
+ mdio_delay();
+ }
+ /* Shift the command bits out. */
+ for (i = 31; i >= 0; i--) {
+ int dataval = (cmd & (1 << i)) ? MDIO_DATA_WRITE1 : 0;
+ outl(MDIO_ENB | dataval, mdio_addr);
+ mdio_delay();
+ outl(MDIO_ENB | dataval | MDIO_SHIFT_CLK, mdio_addr);
+ mdio_delay();
+ }
+ /* Clear out extra bits. */
+ for (i = 2; i > 0; i--) {
+ outl(MDIO_ENB_IN, mdio_addr);
+ mdio_delay();
+ outl(MDIO_ENB_IN | MDIO_SHIFT_CLK, mdio_addr);
+ mdio_delay();
+ }
+ return;
}
-#endif
static int
tulip_open(struct device *dev)
{
struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int i = 0;
/* On some chip revs we must set the MII/SYM port before the reset!? */
- if (tp->mtable && tp->mtable->has_mii)
+ if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii))
outl(0x00040000, ioaddr + CSR6);
/* Reset the chip, holding bit 0 set at least 50 PCI cycles. */
@@ -1106,31 +1230,30 @@ tulip_open(struct device *dev)
Tx and Rx queues and the address filter list. */
#if defined(__alpha__)
/* ToDo: Alpha setting could be better. */
- outl(0x00200000 | 0xE000, ioaddr + CSR0);
+ outl(0x01A00000 | 0xE000, ioaddr + CSR0);
#elif defined(__powerpc__)
- outl(0x00200080 | 0x8000, ioaddr + CSR0);
+ outl(0x01A00080 | 0x8000, ioaddr + CSR0);
#elif defined(__i386__)
#if defined(MODULE)
/* When a module we don't have 'x86' to check. */
- outl(0x00200000 | 0x4800, ioaddr + CSR0);
+ outl(0x01A00000 | 0x4800, ioaddr + CSR0);
#else
-#ifndef ORIGINAL_TEXT
-#define x86 (boot_cpu_data.x86)
+#if (LINUX_VERSION_CODE > 0x2014c)
+#define x86 boot_cpu_data.x86
#endif
- outl(0x00200000 | (x86 <= 4 ? 0x4800 : 0x8000), ioaddr + CSR0);
+ outl(0x01A00000 | (x86 <= 4 ? 0x4800 : 0x8000), ioaddr + CSR0);
if (x86 <= 4)
printk(KERN_INFO "%s: This is a 386/486 PCI system, setting cache "
"alignment to %x.\n", dev->name,
- 0x00200000 | (x86 <= 4 ? 0x4800 : 0x8000));
+ 0x01A00000 | (x86 <= 4 ? 0x4800 : 0x8000));
#endif
#else
- outl(0x00200000 | 0x4800, ioaddr + CSR0);
+ outl(0x01A00000 | 0x4800, ioaddr + CSR0);
#warning Processor architecture undefined!
#endif
#ifdef SA_SHIRQ
- if (request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ,
- tulip_tbl[tp->chip_id].chip_name, dev)) {
+ if (request_irq(dev->irq, &tulip_interrupt, SA_SHIRQ, dev->name, dev)) {
return -EAGAIN;
}
#else
@@ -1178,7 +1301,7 @@ tulip_open(struct device *dev)
outl(virt_to_bus(tp->tx_ring), ioaddr + CSR4);
if (dev->if_port == 0)
- dev->if_port = tp->default_port;
+ dev->if_port = tp->default_port;
if (tp->chip_id == DC21041 && dev->if_port > 4)
/* Invalid: Select initial TP, autosense, autonegotiate. */
dev->if_port = 4;
@@ -1186,14 +1309,16 @@ tulip_open(struct device *dev)
/* Allow selecting a default media. */
if (tp->mtable == NULL)
goto media_picked;
- if (dev->if_port)
+ if (dev->if_port) {
+ int looking_for = media_cap[dev->if_port] & MediaIsMII ? 11 :
+ (dev->if_port == 12 ? 0 : dev->if_port);
for (i = 0; i < tp->mtable->leafcount; i++)
- if (tp->mtable->mleaf[i].media ==
- (dev->if_port == 12 ? 0 : dev->if_port)) {
- printk(KERN_INFO "%s: Using user-specified media %s.\n",
- dev->name, medianame[dev->if_port]);
- goto media_picked;
- }
+ if (tp->mtable->mleaf[i].media == looking_for) {
+ printk(KERN_INFO "%s: Using user-specified media %s.\n",
+ dev->name, medianame[dev->if_port]);
+ goto media_picked;
+ }
+ }
if ((tp->mtable->defaultmedia & 0x0800) == 0)
for (i = 0; i < tp->mtable->leafcount; i++)
if (tp->mtable->mleaf[i].media == (tp->mtable->defaultmedia & 15)) {
@@ -1201,55 +1326,61 @@ tulip_open(struct device *dev)
dev->name, medianame[tp->mtable->mleaf[i].media]);
goto media_picked;
}
+ /* Start sensing first non-full-duplex media. */
for (i = tp->mtable->leafcount - 1;
- (media_fd[tp->mtable->mleaf[i].media] & 2) && i > 0; i--)
+ (media_cap[tp->mtable->mleaf[i].media] & MediaAlwaysFD) && i > 0; i--)
;
media_picked:
- tp->cur_index = i;
tp->csr6 = 0;
- select_media(dev, 1);
+ tp->cur_index = i;
+ if (dev->if_port == 0 && tp->chip_id == DC21142) {
+ tp->csr6 = 0x82420200;
+ outl(0x0003FFFF, ioaddr + CSR14);
+ outl(0x0008, ioaddr + CSR15);
+ outl(0x0001, ioaddr + CSR13);
+ outl(0x1301, ioaddr + CSR12);
+ } else if (tp->chip_id == LC82C168 && tp->mii_cnt && ! tp->medialock) {
+ dev->if_port = 11;
+ tp->csr6 = 0x816C0000 | (tp->full_duplex ? 0x0200 : 0);
+ outl(0x0001, ioaddr + CSR15);
+ } else
+ select_media(dev, 1);
/* Start the chip's Tx to process setup frame. */
outl(tp->csr6, ioaddr + CSR6);
outl(tp->csr6 | 0x2000, ioaddr + CSR6);
dev->tbusy = 0;
- dev->interrupt = 0;
+ tp->interrupt = 0;
dev->start = 1;
-
/* Enable interrupts by setting the interrupt mask. */
- outl(0x0001ebef, ioaddr + CSR7);
+ outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR5);
+ outl(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7);
outl(tp->csr6 | 0x2002, ioaddr + CSR6);
outl(0, ioaddr + CSR2); /* Rx poll demand */
if (tulip_debug > 2) {
- printk(KERN_DEBUG "%s: Done tulip_open(), CSR0 %8.8x, CSR5 %8.8x CSR13 %8.8x.\n",
+ printk(KERN_DEBUG "%s: Done tulip_open(), CSR0 %8.8x, CSR5 %8.8x CSR6 %8.8x.\n",
dev->name, inl(ioaddr + CSR0), inl(ioaddr + CSR5),
- inl(ioaddr + CSR13));
+ inl(ioaddr + CSR6));
}
/* Set the timer to switch to check for link beat and perhaps switch
to an alternate media type. */
init_timer(&tp->timer);
- tp->timer.expires = RUN_AT((24*HZ)/10); /* 2.4 sec. */
+ tp->timer.expires = RUN_AT(5*HZ);
tp->timer.data = (unsigned long)dev;
- tp->timer.function = &tulip_timer; /* timer handler */
+ tp->timer.function = tulip_tbl[tp->chip_id].media_timer;
add_timer(&tp->timer);
-#ifdef CONFIG_NET_HW_FLOWCONTROL
- tp->fc_bit = netdev_register_fc(dev, tulip_xon);
-#endif
-#ifdef CONFIG_NET_FASTROUTE
- dev->tx_semaphore = 1;
-#endif
return 0;
}
/* Set up the transceiver control registers for the selected media type. */
static void select_media(struct device *dev, int startup)
{
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
struct tulip_private *tp = (struct tulip_private *)dev->priv;
struct mediatable *mtable = tp->mtable;
u32 new_csr6;
@@ -1261,8 +1392,8 @@ static void select_media(struct device *dev, int startup)
switch (mleaf->type) {
case 0: /* 21140 non-MII xcvr. */
if (tulip_debug > 1)
- printk(KERN_DEBUG "%s: Using a 21140 non-MII transceiver with control"
- " setting %2.2x.\n",
+ printk(KERN_DEBUG "%s: Using a 21140 non-MII transceiver"
+ " with control setting %2.2x.\n",
dev->name, p[1]);
dev->if_port = p[0];
if (startup)
@@ -1270,26 +1401,11 @@ static void select_media(struct device *dev, int startup)
outl(p[1], ioaddr + CSR12);
new_csr6 = 0x02000000 | ((p[2] & 0x71) << 18);
break;
- case 1:
- if (startup) {
- outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
- dev->if_port = 11;
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s: Doing a reset sequence of length %d.\n",
- dev->name, p[2 + p[1]]);
- for (i = 0; i < p[2 + p[1]]; i++)
- outl(p[3 + p[1] + i], ioaddr + CSR12);
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s Doing a transceiver setup sequence of length %d.\n",
- dev->name, p[1]);
- for (i = 0; i < p[1]; i++)
- outl(p[2 + i], ioaddr + CSR12);
- }
- check_mii = 1;
- new_csr6 = 0x020C0000;
- break;
case 2: case 4: {
- u16 *setup = (u16*)&p[1];
+ u16 setup[3];
+ for (i = 0; i < 3; i++)
+ setup[i] = get_u16(&p[i*2 + 1]);
+
dev->if_port = p[0] & 15;
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: 21142 non-MII %s transceiver control %4.4x/%4.4x.\n",
@@ -1299,59 +1415,74 @@ static void select_media(struct device *dev, int startup)
outl(setup[1], ioaddr + CSR14);
outl(setup[2], ioaddr + CSR15);
outl(setup[0], ioaddr + CSR13);
- setup += 3;
- } else {
+ for (i = 0; i < 3; i++) /* Re-fill setup[] */
+ setup[i] = get_u16(&p[i*2 + 7]);
+ } else if (dev->if_port <= 4) {
outl(0, ioaddr + CSR13);
outl(t21142_csr14[dev->if_port], ioaddr + CSR14);
outl(t21142_csr15[dev->if_port], ioaddr + CSR15);
outl(t21142_csr13[dev->if_port], ioaddr + CSR13);
+ } else {
+ outl(0, ioaddr + CSR14);
+ outl(8, ioaddr + CSR15);
+ outl(0, ioaddr + CSR13);
}
outl(setup[0]<<16, ioaddr + CSR15); /* Direction */
outl(setup[1]<<16, ioaddr + CSR15); /* Data */
if (mleaf->type == 4)
- new_csr6 = 0x02000000 | ((setup[2] & 0x71) << 18);
+ new_csr6 = 0x82020000 | ((setup[2] & 0x71) << 18);
else
new_csr6 = 0x82420000;
break;
}
- case 3: {
+ case 1: case 3: {
+ int phy_num = p[0];
int init_length = p[1];
- u16 * init_sequence = (u16*)(p + 2);
- int reset_length = p[2 + init_length*2];
- u16 * reset_sequence = (u16*)&p[3 + init_length*2];
+ u16 *misc_info;
+ u16 to_advertise;
dev->if_port = 11;
- if (startup) {
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s: Doing a 21142 reset sequence of length %d.\n",
- dev->name, reset_length);
- for (i = 0; i < reset_length; i++)
- outl(reset_sequence[i] << 16, ioaddr + CSR15);
- }
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s: Doing a 21142 xcvr setup sequence of length %d.\n",
- dev->name, init_length);
- for (i = 0; i < init_length; i++)
- outl(init_sequence[i] << 16, ioaddr + CSR15);
check_mii = 1;
- new_csr6 = 0x020C0000;
+ new_csr6 = 0x020E0000;
+ if (mleaf->type == 3) { /* 21142 */
+ u16 *init_sequence = (u16*)(p+2);
+ u16 *reset_sequence = &((u16*)(p+3))[init_length];
+ int reset_length = p[2 + init_length*2];
+ misc_info = reset_sequence + reset_length;
+ if (startup)
+ for (i = 0; i < reset_length; i++)
+ outl(get_u16(&reset_sequence[i]) << 16, ioaddr + CSR15);
+ for (i = 0; i < init_length; i++)
+ outl(get_u16(&init_sequence[i]) << 16, ioaddr + CSR15);
+ } else {
+ u8 *init_sequence = p + 2;
+ u8 *reset_sequence = p + 3 + init_length;
+ int reset_length = p[2 + init_length];
+ misc_info = (u16*)(reset_sequence + reset_length);
+ if (startup) {
+ outl(mtable->csr12dir | 0x100, ioaddr + CSR12);
+ for (i = 0; i < reset_length; i++)
+ outl(reset_sequence[i], ioaddr + CSR12);
+ }
+ for (i = 0; i < init_length; i++)
+ outl(init_sequence[i], ioaddr + CSR12);
+ }
+ to_advertise = (get_u16(&misc_info[1]) & tp->to_advertise) | 1;
+ tp->advertising[phy_num] = to_advertise;
+ if (tulip_debug > 1 || 1)
+ printk(KERN_DEBUG "%s: Advertising %4.4x on PHY %d (%d).\n",
+ dev->name, to_advertise, phy_num, tp->phys[phy_num]);
+ /* Bogus: put in by a committee? */
+ mdio_write(dev, tp->phys[phy_num], 4, to_advertise);
break;
}
default:
- new_csr6 = 0x020C0000;
+ new_csr6 = 0x020E0000;
}
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: Using media type %s, CSR12 is %2.2x.\n",
dev->name, medianame[dev->if_port],
inl(ioaddr + CSR12) & 0xff);
- } else if (tp->chip_id == DC21140) {
- /* Set media type to MII @ 100mbps: 0x020C0000 */
- new_csr6 = 0x020C0000;
- dev->if_port = 11;
- if (tulip_debug > 1) {
- printk(KERN_DEBUG "%s: Unknown media control, assuming MII, CSR12 %2.2x.\n",
- dev->name, inl(ioaddr + CSR12) & 0xff);
- }
} else if (tp->chip_id == DC21041) {
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: 21041 using media %s, CSR12 is %4.4x.\n",
@@ -1363,14 +1494,24 @@ static void select_media(struct device *dev, int startup)
outl(t21041_csr13[dev->if_port], ioaddr + CSR13);
new_csr6 = 0x80020000;
} else if (tp->chip_id == LC82C168) {
- if (startup)
- dev->if_port = 3;
+ if (startup && ! tp->medialock)
+ dev->if_port = tp->mii_cnt ? 11 : 0;
if (tulip_debug > 1)
- printk(KERN_DEBUG "%s: LiteOn PHY status is %3.3x, CSR12 %4.4x,"
+ printk(KERN_DEBUG "%s: PNIC PHY status is %3.3x, CSR12 %4.4x,"
" media %s.\n",
dev->name, inl(ioaddr + 0xB8), inl(ioaddr + CSR12),
medianame[dev->if_port]);
- if (dev->if_port == 3 || dev->if_port == 5) {
+ if (tp->mii_cnt) {
+ new_csr6 = 0x812C0000;
+ outl(0x0001, ioaddr + CSR15);
+ outl(0x0201B07A, ioaddr + 0xB8);
+ } else if (startup) {
+ /* Start with 10mbps to do autonegotiation. */
+ outl(0x32, ioaddr + CSR12);
+ new_csr6 = 0x00420000;
+ outl(0x0001B078, ioaddr + 0xB8);
+ outl(0x0201B078, ioaddr + 0xB8);
+ } else if (dev->if_port == 3 || dev->if_port == 5) {
outl(0x33, ioaddr + CSR12);
new_csr6 = 0x01860000;
if (startup)
@@ -1382,7 +1523,7 @@ static void select_media(struct device *dev, int startup)
new_csr6 = 0x00420000;
outl(0x1F078, ioaddr + 0xB8);
}
- } else { /* 21040 */
+ } else if (tp->chip_id == DC21040) { /* 21040 */
/* Turn on the xcvr interface. */
int csr12 = inl(ioaddr + CSR12);
if (tulip_debug > 1)
@@ -1393,6 +1534,23 @@ static void select_media(struct device *dev, int startup)
outl(FULL_DUPLEX_MAGIC, ioaddr + CSR11);
outl(0x00000000, ioaddr + CSR13); /* Reset the serial interface */
outl(dev->if_port ? 0x0000000C : 0x00000004, ioaddr + CSR13);
+ } else { /* Unknown chip type with no media table. */
+ if (tp->default_port == 0)
+ if (tp->mii_cnt) {
+ dev->if_port = 11;
+ } else
+ dev->if_port = 3;
+ if (media_cap[dev->if_port] & MediaIsMII) {
+ new_csr6 = 0x020E0000;
+ } else if (media_cap[dev->if_port] & MediaIsFx) {
+ new_csr6 = 0x028600000;
+ } else
+ new_csr6 = 0x038600000;
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG "%s: No media description table, assuming "
+ "%s transceiver, CSR12 %2.2x.\n",
+ dev->name, medianame[dev->if_port],
+ inl(ioaddr + CSR12));
}
tp->csr6 = new_csr6 | (tp->csr6 & 0xfdff) | (tp->full_duplex ? 0x0200 : 0);
@@ -1403,7 +1561,7 @@ static void tulip_timer(unsigned long data)
{
struct device *dev = (struct device *)data;
struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
u32 csr12 = inl(ioaddr + CSR12);
int next_tick = 0;
@@ -1467,167 +1625,366 @@ static void tulip_timer(unsigned long data)
break;
}
break;
- case LC82C168: {
+ case DC21140: case DC21142: case MX98713: default: {
+ struct medialeaf *mleaf;
+ unsigned char *p;
+ if (tp->mtable == NULL) { /* No EEPROM info, use generic code. */
+ /* Not much that can be done.
+ Assume this a generic MII or SYM transceiver. */
+ next_tick = 60*HZ;
+ if (tulip_debug > 2)
+ printk(KERN_DEBUG "%s: network media monitor CSR6 %8.8x "
+ "CSR12 0x%2.2x.\n",
+ dev->name, inl(ioaddr + CSR6), csr12 & 0xff);
+ break;
+ }
+ mleaf = &tp->mtable->mleaf[tp->cur_index];
+ p = mleaf->leafdata;
+ switch (mleaf->type) {
+ case 0: case 4: {
+ /* Type 0 serial or 4 SYM transceiver. Check the link beat bit. */
+ int offset = mleaf->type == 4 ? 5 : 2;
+ s8 bitnum = p[offset];
+ if (p[offset+1] & 0x80) {
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG"%s: Transceiver monitor tick "
+ "CSR12=%#2.2x, no media sense.\n",
+ dev->name, csr12);
+ if (mleaf->type == 4) {
+ if (mleaf->media == 3 && (csr12 & 0x02))
+ goto select_next_media;
+ }
+ break;
+ }
+ if (tulip_debug > 2)
+ printk(KERN_DEBUG "%s: Transceiver monitor tick: CSR12=%#2.2x"
+ " bit %d is %d, expecting %d.\n",
+ dev->name, csr12, (bitnum >> 1) & 7,
+ (csr12 & (1 << ((bitnum >> 1) & 7))) != 0,
+ (bitnum >= 0));
+ /* Check that the specified bit has the proper value. */
+ if ((bitnum < 0) !=
+ ((csr12 & (1 << ((bitnum >> 1) & 7))) != 0)) {
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG "%s: Link beat detected for %s.\n", dev->name,
+ medianame[mleaf->media]);
+ if ((p[2] & 0x61) == 0x01) /* Bogus Znyx board. */
+ goto actually_mii;
+ break;
+ }
+ if (tp->medialock)
+ break;
+ select_next_media:
+ if (--tp->cur_index < 0) {
+ /* We start again, but should instead look for default. */
+ tp->cur_index = tp->mtable->leafcount - 1;
+ }
+ dev->if_port = tp->mtable->mleaf[tp->cur_index].media;
+ if (media_cap[dev->if_port] & MediaIsFD)
+ goto select_next_media; /* Skip FD entries. */
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG "%s: No link beat on media %s,"
+ " trying transceiver type %s.\n",
+ dev->name, medianame[mleaf->media & 15],
+ medianame[tp->mtable->mleaf[tp->cur_index].media]);
+ select_media(dev, 0);
+ /* Restart the transmit process. */
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ next_tick = (24*HZ)/10;
+ break;
+ }
+ case 1: case 3: { /* 21140, 21142 MII */
+ int mii_reg1, mii_reg5;
+ actually_mii:
+ mii_reg1 = mdio_read(dev, tp->phys[0], 1);
+ mii_reg5 = mdio_read(dev, tp->phys[0], 5);
+ if (tulip_debug > 1)
+ printk(KERN_INFO "%s: MII status %4.4x, Link partner report "
+ "%4.4x, CSR12 %2.2x, %cD.\n",
+ dev->name, mii_reg1, mii_reg5, csr12,
+ tp->full_duplex ? 'F' : 'H');
+ if (mii_reg1 != 0xffff && (mii_reg1 & 0x0004) == 0) {
+ int new_reg1 = mdio_read(dev, tp->phys[0], 1);
+ if ((new_reg1 & 0x0004) == 0) {
+ printk(KERN_INFO "%s: No link beat on the MII interface,"
+ " status then %4.4x now %4.4x.\n",
+ dev->name, mii_reg1, new_reg1);
+ if (tp->mtable && tp->mtable->has_nonmii)
+ goto select_next_media;
+ }
+ }
+ if (mii_reg5 == 0xffff || mii_reg5 == 0x0000)
+ ; /* No MII device or no link partner report */
+ else if (tp->full_duplex_lock)
+ ;
+ else {
+ int negotiated = mii_reg5 & tp->advertising[0];
+ int duplex = ((negotiated & 0x0100) != 0
+ || (negotiated & 0x00C0) == 0x0040);
+ /* 100baseTx-FD or 10T-FD, but not 100-HD */
+ if (tp->full_duplex != duplex) {
+ tp->full_duplex = duplex;
+ if (tp->full_duplex)
+ tp->csr6 |= 0x0200;
+ else
+ tp->csr6 &= ~0x0200;
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ if (tulip_debug > 0) /* Gurppp, should be >1 */
+ printk(KERN_INFO "%s: Setting %s-duplex based on MII"
+ " Xcvr #%d parter capability of %4.4x.\n",
+ dev->name, tp->full_duplex ? "full" : "half",
+ tp->phys[0], mii_reg5);
+ }
+ }
+ next_tick = 60*HZ;
+ break;
+ }
+ case 2: /* 21142 serial block has no link beat. */
+ default:
+ break;
+ }
+ }
+ break;
+ }
+ if (next_tick) {
+ tp->timer.expires = RUN_AT(next_tick);
+ add_timer(&tp->timer);
+ }
+}
+
+/* Handle the 21143 uniquely: do autoselect with NWay, not the EEPROM list
+ of available transceivers. */
+static void t21142_timer(unsigned long data)
+{
+ struct device *dev = (struct device *)data;
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ int csr12 = inl(ioaddr + CSR12);
+ int next_tick = 60*HZ;
+ int new_csr6 = 0;
+
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: 21142 negotiation status %8.8x, %s.\n",
+ dev->name, csr12, medianame[dev->if_port]);
+ if (dev->if_port == 3) {
+ if (csr12 & 2) { /* No 100mbps link beat, revert to 10mbps. */
+ new_csr6 = 0x82420200;
+ outl(new_csr6, ioaddr + CSR6);
+ outl(0x0000, ioaddr + CSR13);
+ outl(0x0003FFFF, ioaddr + CSR14);
+ outl(0x0008, ioaddr + CSR15);
+ outl(0x0001, ioaddr + CSR13);
+ outl(0x1301, ioaddr + CSR12); /* Start NWay. */
+ }
+ } else if ((csr12 & 0x7000) != 0x5000) {
+ /* Negotiation failed. Search media types. */
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: 21142 negotiation failed, status %8.8x.\n",
+ dev->name, csr12);
+ if (!(csr12 & 4)) { /* 10mbps link beat good. */
+ new_csr6 = 0x82420000;
+ dev->if_port = 0;
+ outl(0, ioaddr + CSR13);
+ outl(0x0003FFFF, ioaddr + CSR14);
+ outl(t21142_csr15[dev->if_port], ioaddr + CSR15);
+ outl(t21142_csr13[dev->if_port], ioaddr + CSR13);
+ } else if (csr12 & 0x100) {
+ new_csr6 = 0x82420200;
+ dev->if_port = 2;
+ outl(0, ioaddr + CSR13);
+ outl(0x0003FFFF, ioaddr + CSR14);
+ outl(0x0008, ioaddr + CSR15);
+ outl(0x0001, ioaddr + CSR13);
+ } else {
+ /* Select 100mbps port to check for link beat. */
+ new_csr6 = 0x83860000;
+ dev->if_port = 3;
+ outl(0, ioaddr + CSR13);
+ outl(0x0003FF7F, ioaddr + CSR14);
+ outl(8, ioaddr + CSR15);
+ outl(1, ioaddr + CSR13);
+ }
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: Testing new 21142 media %s.\n",
+ dev->name, medianame[dev->if_port]);
+ if (new_csr6 != (tp->csr6 & ~0x00D5)) {
+ tp->csr6 &= 0x00D5;
+ tp->csr6 |= new_csr6;
+ outl(0x0301, ioaddr + CSR12);
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ }
+ }
+ tp->timer.expires = RUN_AT(next_tick);
+ add_timer(&tp->timer);
+}
+
+static void t21142_lnk_change( struct device *dev)
+{
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ int csr12 = inl(ioaddr + CSR12);
+
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: 21142 link status interrupt %8.8x, CSR5 %x.\n",
+ dev->name, csr12, inl(ioaddr + CSR5));
+
+ if ((csr12 & 0x7000) == 0x5000) {
+ if (csr12 & 0x01800000) {
+ /* Switch to 100mbps mode. */
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ if (csr12 & 0x01000000) {
+ dev->if_port = 5;
+ tp->csr6 = 0x83860200;
+ } else {
+ dev->if_port = 3;
+ tp->csr6 = 0x83860000;
+ }
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ } /* Else 10baseT-FD is handled automatically. */
+ } else if (dev->if_port == 3) {
+ if (!(csr12 & 2))
+ printk(KERN_INFO"%s: 21142 100baseTx link beat good.\n",
+ dev->name);
+ else
+ dev->if_port = 0;
+ } else if (dev->if_port == 0) {
+ if (!(csr12 & 4))
+ printk(KERN_INFO"%s: 21142 10baseT link beat good.\n",
+ dev->name);
+ } else if (!(csr12 & 4)) { /* 10mbps link beat good. */
+ printk(KERN_INFO"%s: 21142 10mpbs sensed media.\n",
+ dev->name);
+ dev->if_port = 0;
+ } else { /* 100mbps link beat good. */
+ printk(KERN_INFO"%s: 21142 100baseTx sensed media.\n",
+ dev->name);
+ dev->if_port = 3;
+ tp->csr6 = 0x83860000;
+ outl(0x0003FF7F, ioaddr + CSR14);
+ outl(0x0301, ioaddr + CSR12);
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ }
+}
+
+
+static void mxic_timer(unsigned long data)
+{
+ struct device *dev = (struct device *)data;
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ int next_tick = 60*HZ;
+
+ if (tulip_debug > 3) {
+ printk(KERN_INFO"%s: MXIC negotiation status %8.8x.\n", dev->name,
+ inl(ioaddr + CSR12));
+ }
+ if (next_tick) {
+ tp->timer.expires = RUN_AT(next_tick);
+ add_timer(&tp->timer);
+ }
+}
+
+static void pnic_timer(unsigned long data)
+{
+ struct device *dev = (struct device *)data;
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ int csr12 = inl(ioaddr + CSR12);
+ int next_tick = 60*HZ;
+ int new_csr6 = tp->csr6 & ~0x40C40200;
+
+ if (media_cap[dev->if_port] & MediaIsMII) {
+ int negotiated = mdio_read(dev, tp->phys[0], 5) & tp->advertising[0];
+
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG "%s: LC82C168 negotiated capability %8.8x, "
+ "CSR5 %8.8x.\n",
+ dev->name, negotiated, inl(ioaddr + CSR5));
+
+ if (negotiated & 0x0380) /* 10 vs 100mbps */
+ new_csr6 |= 0x812E0000;
+ else
+ new_csr6 |= 0x816E0000;
+ if (((negotiated & 0x0300) == 0x0100) /* Duplex */
+ || (negotiated & 0x00C0) == 0x0040
+ || tp->full_duplex_lock) {
+ tp->full_duplex = 1;
+ new_csr6 |= 0x0200;
+ }
+ if (tulip_debug > 1)
+ printk(KERN_DEBUG "%s: LC82C168 MII PHY status %4.4x, Link "
+ "partner report %4.4x, csr6 %8.8x/%8.8x.\n",
+ dev->name, mdio_read(dev, tp->phys[0], 1), negotiated,
+ tp->csr6, inl(ioaddr + CSR6));
+ } else {
int phy_reg = inl(ioaddr + 0xB8);
+ int csr5 = inl(ioaddr + CSR5);
+
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: LC82C168 phy status %8.8x, CSR5 %8.8x.\n",
- dev->name, phy_reg, inl(ioaddr + CSR5));
+ dev->name, phy_reg, csr5);
+
if (phy_reg & 0x04000000) { /* Remote link fault */
- outl(0x0201F078, ioaddr + 0xB8);
- next_tick = (24*HZ)/10;
- } else
- next_tick = 10*HZ;
+ /*outl(0x0201F078, ioaddr + 0xB8);*/
+ next_tick = 3*HZ;
+ }
if (inl(ioaddr + CSR5) & TPLnkFail) { /* 100baseTx link beat */
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: %s link beat failed, CSR12 %4.4x, "
"CSR5 %8.8x, PHY %3.3x.\n",
dev->name, medianame[dev->if_port], csr12,
inl(ioaddr + CSR5), inl(ioaddr + 0xB8));
- if (dev->if_port == 0) {
+ if (tp->medialock) {
+ } else if (dev->if_port == 0) {
dev->if_port = 3;
- } else
- dev->if_port = 0;
- next_tick = (24*HZ)/10;
- select_media(dev, 0);
- outl(tp->csr6 | 0x0002, ioaddr + CSR6);
- outl(tp->csr6 | 0x2002, ioaddr + CSR6);
- dev->trans_start = jiffies;
- }
- break;
- }
- case DC21140: case DC21142: {
- struct medialeaf *mleaf;
- unsigned char *p;
- if (tp->mtable == NULL) { /* No EEPROM info, use generic code. */
- /* Assume this is like a SMC card, and check its link beat bit. */
- if ((dev->if_port == 0 && (csr12 & 0x0080)) ||
- (dev->if_port == 1 && (csr12 & 0x0040) == 0)) {
- dev->if_port ^= 1;
- /* Stop the transmit process. */
- tp->csr6 = (dev->if_port ? 0x03860000 : 0x02420000);
- outl(tp->csr6 | 0x0002, ioaddr + CSR6);
- printk(KERN_INFO "%s: link beat timed out, CSR12 is 0x%2.2x, switching to"
- " %s media.\n", dev->name,
- csr12 & 0xff,
- dev->if_port ? "100baseTx" : "10baseT");
- outl(tp->csr6 | 0xA002, ioaddr + CSR6);
- dev->trans_start = jiffies;
- next_tick = (24*HZ)/10;
+ outl(0x33, ioaddr + CSR12);
+ new_csr6 = 0x01860000;
+ outl(0x1F868, ioaddr + 0xB8);
} else {
- next_tick = 10*HZ;
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s: network media monitor 0x%2.2x, link"
- " beat detected as %s.\n", dev->name,
- csr12 & 0xff,
- dev->if_port ? "100baseTx" : "10baseT");
+ dev->if_port = 0;
+ outl(0x32, ioaddr + CSR12);
+ new_csr6 = 0x00420000;
+ outl(0x1F078, ioaddr + 0xB8);
}
- break;
+ new_csr6 |= (tp->csr6 & 0xfdff);
+ next_tick = 3*HZ;
+ } else
+ new_csr6 = tp->csr6;
+ if (tp->full_duplex_lock || (phy_reg & 0x30000000) != 0) {
+ tp->full_duplex = 1;
+ new_csr6 |= 0x00000200;
}
- mleaf = &tp->mtable->mleaf[tp->cur_index];
- p = mleaf->leafdata;
- switch (mleaf->type) {
- case 0: case 4: {
- /* Type 0 non-MII or #4 SYM transceiver. Check the link beat bit. */
- s8 bitnum = p[mleaf->type == 4 ? 5 : 2];
- if (tulip_debug > 2)
- printk(KERN_DEBUG "%s: Transceiver monitor tick: CSR12=%#2.2x bit %d is"
- " %d, expecting %d.\n",
- dev->name, csr12, (bitnum >> 1) & 7,
- (csr12 & (1 << ((bitnum >> 1) & 7))) != 0,
- (bitnum >= 0));
- /* Check that the specified bit has the proper value. */
- if ((bitnum < 0) !=
- ((csr12 & (1 << ((bitnum >> 1) & 7))) != 0)) {
- if (tulip_debug > 1)
- printk(KERN_DEBUG "%s: Link beat detected for %s.\n", dev->name,
- medianame[mleaf->media]);
- break;
- }
- if (tp->medialock)
- break;
- select_next_media:
- if (--tp->cur_index < 0) {
- /* We start again, but should instead look for default. */
- tp->cur_index = tp->mtable->leafcount - 1;
- }
- dev->if_port = tp->mtable->mleaf[tp->cur_index].media;
- if (media_fd[dev->if_port])
- goto select_next_media; /* Skip FD entries. */
- if (tulip_debug > 1)
- printk(KERN_DEBUG "%s: No link beat on media %s,"
- " trying transceiver type %s.\n",
- dev->name, medianame[mleaf->media & 15],
- medianame[tp->mtable->mleaf[tp->cur_index].media]);
- select_media(dev, 0);
- /* Restart the transmit process. */
- outl(tp->csr6 | 0x0002, ioaddr + CSR6);
- outl(tp->csr6 | 0x2002, ioaddr + CSR6);
- next_tick = (24*HZ)/10;
- break;
- }
- case 1: case 3: /* 21140, 21142 MII */
- {
- int mii_reg1 = mdio_read(ioaddr, tp->phys[0], 1);
- int mii_reg5 = mdio_read(ioaddr, tp->phys[0], 5);
- printk(KERN_INFO "%s: MII monitoring tick: CSR12 %2.2x, "
- "MII status %4.4x, Link partner report %4.4x.\n",
- dev->name, csr12, mii_reg1, mii_reg5);
-#ifdef notdef
- if (mii_reg1 != 0xffff && (mii_reg1 & 0x0004) == 0)
- goto select_next_media;
-#else
- if (mii_reg1 != 0xffff && (mii_reg1 & 0x0004) == 0)
- printk(KERN_INFO "%s: No link beat on the MII interface, "
- "status then %4.4x now %4.4x.\n",
- dev->name, mii_reg1,
- mdio_read(ioaddr, tp->phys[0], 1));
-#endif
- if (mii_reg5 == 0xffff || mii_reg5 == 0x0000)
- ; /* No MII device or no link partner report */
- else if (tp->full_duplex_lock)
- ;
- else if ((mii_reg5 & 0x0100) != 0
- || (mii_reg5 & 0x00C0) == 0x0040) {
- /* 100baseTx-FD or 10T-FD, but not 100-HD */
- if (tp->full_duplex == 0) {
- tp->full_duplex = 1;
- tp->csr6 |= 0x0200;
- outl(tp->csr6 | 0x0002, ioaddr + CSR6);
- outl(tp->csr6 | 0x2002, ioaddr + CSR6);
- }
- if (tulip_debug > 0) /* Gurppp, should be >1 */
- printk(KERN_INFO "%s: Setting %s-duplex based on MII"
- " Xcvr #%d parter capability of %4.4x.\n",
- dev->name, full_duplex ? "full" : "half",
- tp->phys[0], mii_reg5);
- }
- }
- break;
- case 2: /* 21142 serial block has no link beat. */
- default:
- break;
- }
- }
- break;
- default: /* Invalid chip type. */
- break;
}
- if (next_tick) {
- tp->timer.expires = RUN_AT(next_tick);
- add_timer(&tp->timer);
+ if (tp->csr6 != new_csr6) {
+ tp->csr6 = new_csr6;
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6); /* Restart Tx */
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ dev->trans_start = jiffies;
+ if (tulip_debug > 0) /* Gurppp, should be >1 */
+ printk(KERN_INFO "%s: Changing PNIC configuration to %s-duplex, "
+ "CSR6 %8.8x.\n",
+ dev->name, tp->full_duplex ? "full" : "half", new_csr6);
}
+ tp->timer.expires = RUN_AT(next_tick);
+ add_timer(&tp->timer);
}
static void tulip_tx_timeout(struct device *dev)
{
struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
- if (tp->mtable && tp->mtable->has_mii) {
- /* Do nothing -- the media monitor should handle this. */
- if (tulip_debug > 1)
- printk(KERN_WARNING "%s: Transmit timeout using MII device.\n",
- dev->name);
+ if (media_cap[dev->if_port] & MediaIsMII) {
+ /* Do nothing -- the media monitor should handle this. */
+ if (tulip_debug > 1)
+ printk(KERN_WARNING "%s: Transmit timeout using MII device.\n",
+ dev->name);
+ dev->trans_start = jiffies;
+ return;
} else if (tp->chip_id == DC21040) {
if (inl(ioaddr + CSR12) & 0x0002) {
printk(KERN_INFO "%s: transmit timed out, switching to %s media.\n",
@@ -1637,20 +1994,6 @@ static void tulip_tx_timeout(struct device *dev)
}
dev->trans_start = jiffies;
return;
- } else if (tp->chip_id == DC21140 || tp->chip_id == DC21142) {
- /* Stop the transmit process. */
- outl(tp->csr6 | 0x0002, ioaddr + CSR6);
- dev->if_port ^= 1;
- printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, "
- "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
- dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12),
- inl(ioaddr + CSR13), inl(ioaddr + CSR14), inl(ioaddr + CSR15));
- printk(KERN_WARNING "%s: transmit timed out, switching to %s media.\n",
- dev->name, dev->if_port ? "100baseTx" : "10baseT");
- outl(tp->csr6 | 0x2002, ioaddr + CSR6);
- tp->stats.tx_errors++;
- dev->trans_start = jiffies;
- return;
} else if (tp->chip_id == DC21041) {
u32 csr12 = inl(ioaddr + CSR12);
@@ -1659,19 +2002,38 @@ static void tulip_tx_timeout(struct device *dev)
dev->name, inl(ioaddr + CSR5), csr12,
inl(ioaddr + CSR13), inl(ioaddr + CSR14));
tp->mediasense = 1;
-
- if (dev->if_port == 1 || dev->if_port == 2) {
+ if (dev->if_port == 1 || dev->if_port == 2)
if (csr12 & 0x0004) {
dev->if_port = 2 - dev->if_port;
} else
dev->if_port = 0;
- } else
+ else
dev->if_port = 1;
-
select_media(dev, 0);
tp->stats.tx_errors++;
dev->trans_start = jiffies;
return;
+ } else if (tp->chip_id == DC21140 || tp->chip_id == DC21142
+ || tp->chip_id == MX98713) {
+ /* Stop the transmit process. */
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ printk(KERN_WARNING "%s: 21140 transmit timed out, status %8.8x, "
+ "SIA %8.8x %8.8x %8.8x %8.8x, resetting...\n",
+ dev->name, inl(ioaddr + CSR5), inl(ioaddr + CSR12),
+ inl(ioaddr + CSR13), inl(ioaddr + CSR14), inl(ioaddr + CSR15));
+ if (tp->mtable) {
+ if (--tp->cur_index < 0) {
+ /* We start again, but should instead look for default. */
+ tp->cur_index = tp->mtable->leafcount - 1;
+ }
+ select_media(dev, 0);
+ printk(KERN_WARNING "%s: transmit timed out, switching to %s media.\n",
+ dev->name, dev->if_port ? "100baseTx" : "10baseT");
+ }
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ tp->stats.tx_errors++;
+ dev->trans_start = jiffies;
+ return;
} else
printk(KERN_WARNING "%s: transmit timed out, status %8.8x, CSR12 %8.8x,"
" resetting...\n",
@@ -1753,40 +2115,12 @@ tulip_start_xmit(struct sk_buff *skb, struct device *dev)
int entry;
u32 flag;
-#ifdef ORIGINAL_TEXT
-#ifndef final_version
- if (skb == NULL || skb->len <= 0) {
- printk(KERN_ERR "%s: Obsolete driver layer request made: skbuff==NULL.\n",
- dev->name);
- dev_tint(dev);
- return 0;
- }
-#endif
-#endif
-
-#ifdef CONFIG_NET_FASTROUTE
- cli();
- if (xchg(&dev->tx_semaphore,0) == 0) {
- sti();
- /* With new queueing algorithm returning 1 when dev->tbusy == 0
- should not result in lockups, but I am still not sure. --ANK
- */
- if (net_ratelimit())
- printk(KERN_CRIT "Please check: are you still alive?\n");
- return 1;
- }
-#endif
/* Block a timer-based transmit from overlapping. This could better be
done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
-#ifdef CONFIG_NET_FASTROUTE
- sti();
-#endif
- if (jiffies - dev->trans_start >= TX_TIMEOUT)
- tulip_tx_timeout(dev);
-#ifdef CONFIG_NET_FASTROUTE
- dev->tx_semaphore = 1;
-#endif
+ if (jiffies - dev->trans_start < TX_TIMEOUT)
+ return 1;
+ tulip_tx_timeout(dev);
return 1;
}
@@ -1816,7 +2150,6 @@ tulip_start_xmit(struct sk_buff *skb, struct device *dev)
if (entry == TX_RING_SIZE-1)
flag |= 0xe2000000;
- tp->stats.tx_bytes += skb->len;
tp->tx_ring[entry].length = skb->len | flag;
tp->tx_ring[entry].status = 0x80000000; /* Pass ownership to the chip. */
tp->cur_tx++;
@@ -1824,10 +2157,6 @@ tulip_start_xmit(struct sk_buff *skb, struct device *dev)
outl(0, dev->base_addr + CSR1);
dev->trans_start = jiffies;
-#ifdef CONFIG_NET_FASTROUTE
- dev->tx_semaphore = 1;
- sti();
-#endif
return 0;
}
@@ -1842,8 +2171,9 @@ static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *reg
struct device *dev = (struct device *)(irq2dev_map[irq]);
#endif
- struct tulip_private *lp;
- int csr5, ioaddr, boguscnt = 12;
+ struct tulip_private *tp;
+ long ioaddr;
+ int csr5, work_budget = max_interrupt_work;
if (dev == NULL) {
printk (KERN_ERR" tulip_interrupt(): irq %d for unknown device.\n",
@@ -1852,11 +2182,21 @@ static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *reg
}
ioaddr = dev->base_addr;
- lp = (struct tulip_private *)dev->priv;
- if (dev->interrupt)
+ tp = (struct tulip_private *)dev->priv;
+ if (test_and_set_bit(0, (void*)&tp->interrupt)) {
+#ifdef SMP_CHECK
+ printk(KERN_ERR "%s: Re-entering the interrupt handler with proc %d,"
+ " proc %d already handling.\n", dev->name,
+ tp->smp_proc_id, hard_smp_processor_id());
+#else
printk(KERN_ERR "%s: Re-entering the interrupt handler.\n", dev->name);
-
+#endif
+ return;
+ }
dev->interrupt = 1;
+#ifdef SMP_CHECK
+ tp->smp_proc_id = hard_smp_processor_id();
+#endif
do {
csr5 = inl(ioaddr + CSR5);
@@ -1867,23 +2207,24 @@ static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *reg
printk(KERN_DEBUG "%s: interrupt csr5=%#8.8x new csr5=%#8.8x.\n",
dev->name, csr5, inl(dev->base_addr + CSR5));
- if ((csr5 & 0x00018000) == 0)
+ if ((csr5 & (NormalIntr|AbnormalIntr)) == 0)
break;
- if (csr5 & RxIntr)
- tulip_rx(dev);
+ if (csr5 & (RxIntr | RxNoBuf))
+ work_budget -= tulip_rx(dev);
if (csr5 & (TxNoBuf | TxDied | TxIntr)) {
- int dirty_tx;
+ unsigned int dirty_tx;
- for (dirty_tx = lp->dirty_tx; dirty_tx < lp->cur_tx; dirty_tx++) {
+ for (dirty_tx = tp->dirty_tx; tp->cur_tx - dirty_tx > 0;
+ dirty_tx++) {
int entry = dirty_tx % TX_RING_SIZE;
- int status = lp->tx_ring[entry].status;
+ int status = tp->tx_ring[entry].status;
if (status < 0)
break; /* It still hasn't been Txed */
/* Check for Rx filter setup frames. */
- if (lp->tx_skbuff[entry] == NULL)
+ if (tp->tx_skbuff[entry] == NULL)
continue;
if (status & 0x8000) {
@@ -1893,74 +2234,104 @@ static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *reg
printk(KERN_DEBUG "%s: Transmit error, Tx status %8.8x.\n",
dev->name, status);
#endif
- lp->stats.tx_errors++;
- if (status & 0x4104) lp->stats.tx_aborted_errors++;
- if (status & 0x0C00) lp->stats.tx_carrier_errors++;
- if (status & 0x0200) lp->stats.tx_window_errors++;
- if (status & 0x0002) lp->stats.tx_fifo_errors++;
- if ((status & 0x0080) && lp->full_duplex == 0)
- lp->stats.tx_heartbeat_errors++;
+ tp->stats.tx_errors++;
+ if (status & 0x4104) tp->stats.tx_aborted_errors++;
+ if (status & 0x0C00) tp->stats.tx_carrier_errors++;
+ if (status & 0x0200) tp->stats.tx_window_errors++;
+ if (status & 0x0002) tp->stats.tx_fifo_errors++;
+ if ((status & 0x0080) && tp->full_duplex == 0)
+ tp->stats.tx_heartbeat_errors++;
#ifdef ETHER_STATS
- if (status & 0x0100) lp->stats.collisions16++;
+ if (status & 0x0100) tp->stats.collisions16++;
#endif
} else {
#ifdef ETHER_STATS
- if (status & 0x0001) lp->stats.tx_deferred++;
+ if (status & 0x0001) tp->stats.tx_deferred++;
#endif
- lp->stats.collisions += (status >> 3) & 15;
- lp->stats.tx_packets++;
+#if LINUX_VERSION_CODE > 0x20127
+ tp->stats.tx_bytes += tp->tx_ring[entry].length & 0x7ff;
+#endif
+ tp->stats.collisions += (status >> 3) & 15;
+ tp->stats.tx_packets++;
}
/* Free the original skb. */
- dev_kfree_skb(lp->tx_skbuff[entry]);
- lp->tx_skbuff[entry] = 0;
+#if (LINUX_VERSION_CODE > 0x20155)
+ dev_kfree_skb(tp->tx_skbuff[entry]);
+#else
+ dev_kfree_skb(tp->tx_skbuff[entry], FREE_WRITE);
+#endif
+ tp->tx_skbuff[entry] = 0;
}
#ifndef final_version
- if (lp->cur_tx - dirty_tx > TX_RING_SIZE) {
+ if (tp->cur_tx - dirty_tx > TX_RING_SIZE) {
printk(KERN_ERR "%s: Out-of-sync dirty pointer, %d vs. %d, full=%d.\n",
- dev->name, dirty_tx, lp->cur_tx, lp->tx_full);
+ dev->name, dirty_tx, tp->cur_tx, tp->tx_full);
dirty_tx += TX_RING_SIZE;
}
#endif
- if (lp->tx_full && dev->tbusy
- && dirty_tx > lp->cur_tx - TX_RING_SIZE + 2) {
+ if (tp->tx_full && dev->tbusy
+ && tp->cur_tx - dirty_tx < TX_RING_SIZE - 2) {
/* The ring is no longer full, clear tbusy. */
- lp->tx_full = 0;
+ tp->tx_full = 0;
dev->tbusy = 0;
mark_bh(NET_BH);
}
- lp->dirty_tx = dirty_tx;
+ tp->dirty_tx = dirty_tx;
+ if (csr5 & TxDied) {
+ if (tulip_debug > 1)
+ printk(KERN_WARNING "%s: The transmitter stopped!"
+ " CSR5 is %x, CSR6 %x.\n",
+ dev->name, csr5, inl(ioaddr + CSR6));
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
+ }
}
/* Log errors. */
- if (csr5 & 0x8000) { /* Abnormal error summary bit. */
- if (csr5 & TxJabber) lp->stats.tx_errors++;
+ if (csr5 & AbnormalIntr) { /* Abnormal error summary bit. */
+ if (csr5 & TxJabber) tp->stats.tx_errors++;
if (csr5 & TxFIFOUnderflow) {
- lp->csr6 |= 0x00200000; /* Reconfigure to store-n-forward. */
- /* Restart the transmit process. */
- outl(lp->csr6 | 0x0002, ioaddr + CSR6);
- outl(lp->csr6 | 0x2002, ioaddr + CSR6);
+ if ((tp->csr6 & 0xC000) != 0xC000)
+ tp->csr6 += 0x4000; /* Bump up the Tx threshold */
+ else
+ tp->csr6 |= 0x00200000; /* Store-n-forward. */
+ /* Restart the transmit process. */
+ outl(tp->csr6 | 0x0002, ioaddr + CSR6);
+ outl(tp->csr6 | 0x2002, ioaddr + CSR6);
}
if (csr5 & RxDied) { /* Missed a Rx frame. */
- lp->stats.rx_errors++;
- lp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
+ tp->stats.rx_errors++;
+ tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
}
if (csr5 & TimerInt) {
printk(KERN_ERR "%s: Something Wicked happened! %8.8x.\n",
dev->name, csr5);
/* Hmmmmm, it's not clear what to do here. */
}
+ if (csr5 & (TPLnkPass | TPLnkFail | 0x08000000)
+ && tp->chip_id == DC21142) {
+ if (tulip_debug > 1)
+ printk(KERN_INFO"%s: 21142 link change, CSR5 = %8.8x.\n",
+ dev->name, csr5);
+ t21142_lnk_change(dev);
+ }
/* Clear all error sources, included undocumented ones! */
- outl(0x000f7ba, ioaddr + CSR5);
+ outl(0x0800f7ba, ioaddr + CSR5);
}
- if (--boguscnt < 0) {
- printk(KERN_WARNING "%s: Too much work at interrupt, csr5=0x%8.8x.\n",
- dev->name, csr5);
- /* Clear all interrupt sources. */
- outl(0x0001ffff, ioaddr + CSR5);
+ if (--work_budget < 0) {
+ if (tulip_debug > 1)
+ printk(KERN_WARNING "%s: Too much work at interrupt, "
+ "csr5=0x%8.8x.\n", dev->name, csr5);
+ /* Acknowledge all interrupt sources. */
+ outl(0x8001ffff, ioaddr + CSR5);
+#ifdef notdef
+ /* Clear all but standard interrupt sources. */
+ outl((~csr5) & 0x0001ebef, ioaddr + CSR7);
+#endif
break;
}
} while (1);
@@ -1969,271 +2340,82 @@ static void tulip_interrupt IRQ(int irq, void *dev_instance, struct pt_regs *reg
printk(KERN_DEBUG "%s: exiting interrupt, csr5=%#4.4x.\n",
dev->name, inl(ioaddr + CSR5));
- /* Code that should never be run! Perhaps remove after testing.. */
- {
- static int stopit = 10;
- if (dev->start == 0 && --stopit < 0) {
- printk(KERN_ERR "%s: Emergency stop, looping startup interrupt.\n"
- KERN_ERR "%s: Disabling interrupt handler %d to avoid "
- "locking up the machine.\n",
- dev->name, dev->name, dev->irq);
-#ifdef SA_SHIRQ
- free_irq(irq, dev);
-#else
- free_irq(irq);
-#endif
- }
- }
-
dev->interrupt = 0;
+ clear_bit(0, (void*)&tp->interrupt);
return;
}
-#ifdef CONFIG_NET_FASTROUTE
-/* DMAing cards are the most easy in this respect,
- they are able to make fast route to any device.
-
- Now we allow to make it only to another ethernet card.
- */
-static int tulip_accept_fastpath(struct device *dev, struct dst_entry *dst)
-{
- struct device *odev = dst->dev;
-
- if (dst->ops->protocol != __constant_htons(ETH_P_IP))
- return -1;
- if (odev->type != ARPHRD_ETHER || odev->accept_fastpath == NULL)
- return -1;
-
- return 0;
-}
-
-/*
- Return values:
-
- 0 - packet has gone by fast path.
- 1 - fast path is OK, but device deferred xmit. (semifast path)
-
- 2 - fast path is hit, but packet is a bit strange. (NI)
- 3 - oom
-
- 4 - fast path miss.
- */
-
-static int tulip_fast_forward(struct device *dev, int entry, int len)
-{
- struct tulip_private *lp = (struct tulip_private *)dev->priv;
- struct sk_buff *skb = lp->rx_skbuff[entry];
- struct ethhdr *eth = (void*)skb->data;
-
- if (eth->h_proto == __constant_htons(ETH_P_IP)) {
- struct rtable *rt;
- struct iphdr *iph;
- unsigned h;
-
- iph = (struct iphdr*)(skb->data + ETH_HLEN);
- h = (*(u8*)&iph->daddr^*(u8*)&iph->saddr)&NETDEV_FASTROUTE_HMASK;
- rt = (struct rtable*)(dev->fastpath[h]);
- if (rt &&
- ((u16*)&iph->daddr)[0] == ((u16*)&rt->key.dst)[0] &&
- ((u16*)&iph->daddr)[1] == ((u16*)&rt->key.dst)[1] &&
- ((u16*)&iph->saddr)[0] == ((u16*)&rt->key.src)[0] &&
- ((u16*)&iph->saddr)[1] == ((u16*)&rt->key.src)[1] &&
- rt->u.dst.obsolete == 0) {
- struct device *odev = rt->u.dst.dev;
-
- dev_fastroute_stat.hits++;
-
- if (*(u8*)iph != 0x45 ||
- (eth->h_dest[0]&1) ||
- !neigh_is_valid(rt->u.dst.neighbour) ||
- iph->ttl <= 1)
- goto alas2;
-
- ip_decrease_ttl(iph);
-
- if (1) {
- struct sk_buff *skb2 = DEV_ALLOC_SKB(PKT_BUF_SZ);
- if (skb2 == NULL)
- goto oom;
- lp->rx_ring[entry].buffer1 = virt_to_bus(skb2->tail);
- skb2->dev = dev;
- lp->rx_skbuff[entry] = skb2;
- }
-
- skb_put(skb, len);
-
- ip_statistics.IpInReceives++;
- ip_statistics.IpForwDatagrams++;
-
- /* Could use hh cache */
- memcpy(eth->h_source, odev->dev_addr, 6);
- memcpy(eth->h_dest, rt->u.dst.neighbour->ha, 6);
- skb->dev = odev;
-
-#ifdef FAST_SKB_RECYCLE /* DO NOT DEFINE IT! READ COMMENT */
- /* We could use fast buffer recycling here if odev
- is not DMAing.
-
- The only problem is that we must allocate skb2
- BEFORE we lose skb, otherwise we would make hole in
- tulip rx array. Hence, to implement FAST_SKB_RECYCLE
- we need always keep at least one skb in a safe place.
- */
- atomic_inc(&skb->users);
-#endif
-
- if (odev->tx_semaphore &&
- odev->tbusy == 0 &&
- odev->interrupt == 0 &&
- odev->hard_start_xmit(skb, odev) == 0) {
-#ifdef FAST_SKB_RECYCLE
- if (atomic_read(&skb->users) == 1) {
- skb->tail = skb->data;
- skb->len = 0;
- }
-#endif
- dev_fastroute_stat.succeed++;
- return 0;
- }
-#ifdef FAST_SKB_RECYCLE
- atomic_dec(&skb->users);
-#endif
-
- /* Otherwise... */
- skb->pkt_type = PACKET_FASTROUTE;
- skb->nh.raw = skb->data + ETH_HLEN;
- skb->protocol = __constant_htons(ETH_P_IP);
- dev_fastroute_stat.deferred++;
- return 1;
- }
- }
- return 4;
-
-oom:
- return 3;
-
-alas2:
-#ifdef not_yet
- skb->dst = dst_clone(&rt->u.dst);
- return 2;
-#else
- return 4;
-#endif
-}
-#endif
-
static int
tulip_rx(struct device *dev)
{
- struct tulip_private *lp = (struct tulip_private *)dev->priv;
- int entry = lp->cur_rx % RX_RING_SIZE;
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ int entry = tp->cur_rx % RX_RING_SIZE;
+ int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
+ int work_done = 0;
if (tulip_debug > 4)
printk(KERN_DEBUG " In tulip_rx(), entry %d %8.8x.\n", entry,
- lp->rx_ring[entry].status);
+ tp->rx_ring[entry].status);
/* If we own the next entry, it's a new packet. Send it up. */
- while (lp->rx_ring[entry].status >= 0) {
- int status = lp->rx_ring[entry].status;
+ while (tp->rx_ring[entry].status >= 0) {
+ s32 status = tp->rx_ring[entry].status;
+ if (--rx_work_limit < 0)
+ break;
if ((status & 0x0300) != 0x0300) {
if ((status & 0xffff) != 0x7fff) { /* Ingore earlier buffers. */
- printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
- "multiple buffers, status %8.8x!\n", dev->name, status);
- lp->stats.rx_length_errors++;
+ if (tulip_debug > 1)
+ printk(KERN_WARNING "%s: Oversized Ethernet frame spanned "
+ "multiple buffers, status %8.8x!\n",
+ dev->name, status);
+ tp->stats.rx_length_errors++;
}
} else if (status & 0x8000) {
/* There was a fatal error. */
- lp->stats.rx_errors++; /* end of a packet.*/
- if (status & 0x0890) lp->stats.rx_length_errors++;
- if (status & 0x0004) lp->stats.rx_frame_errors++;
- if (status & 0x0002) lp->stats.rx_crc_errors++;
- if (status & 0x0001) lp->stats.rx_fifo_errors++;
+ if (tulip_debug > 2)
+ printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
+ dev->name, status);
+ tp->stats.rx_errors++; /* end of a packet.*/
+ if (status & 0x0890) tp->stats.rx_length_errors++;
+ if (status & 0x0004) tp->stats.rx_frame_errors++;
+ if (status & 0x0002) tp->stats.rx_crc_errors++;
+ if (status & 0x0001) tp->stats.rx_fifo_errors++;
} else {
- /* Malloc up new buffer, compatible with net-2e. */
/* Omit the four octet CRC from the length. */
- short pkt_len = (lp->rx_ring[entry].status >> 16) - 4;
+ short pkt_len = (status >> 16) - 4;
struct sk_buff *skb;
- int rx_in_place = 0;
-#ifdef CONFIG_NET_HW_FLOWCONTROL
- if (netdev_dropping)
- goto throttle;
-#endif
-
- skb = lp->rx_skbuff[entry];
-
-#ifdef CONFIG_NET_FASTROUTE
- switch (tulip_fast_forward(dev, entry, pkt_len)) {
- case 0:
- goto gone;
- case 1:
- goto semi_gone;
- case 2:
- break;
- case 3:
- skb = NULL;
- goto memory_squeeze;
- }
-#endif
/* Check if the packet is long enough to just accept without
copying to a properly sized skbuff. */
- if (pkt_len > rx_copybreak) {
- struct sk_buff *newskb;
- char *temp;
-
- /* Get a fresh skbuff to replace the filled one. */
- newskb = DEV_ALLOC_SKB(PKT_BUF_SZ);
- if (newskb == NULL) {
- skb = NULL; /* No memory, drop the packet. */
- goto memory_squeeze;
- }
- /* Pass up the skb already on the Rx ring. */
- temp = skb_put(skb, pkt_len);
- if (bus_to_virt(lp->rx_ring[entry].buffer1) != temp)
- printk(KERN_ERR "%s: Internal consistency error -- the "
- "skbuff addresses do not match"
- " in tulip_rx: %p vs. %p / %p.\n", dev->name,
- bus_to_virt(lp->rx_ring[entry].buffer1),
- skb->head, temp);
- rx_in_place = 1;
- lp->rx_skbuff[entry] = newskb;
- newskb->dev = dev;
- /* Longword alignment required: do not skb_reserve(2)! */
- lp->rx_ring[entry].buffer1 = virt_to_bus(newskb->tail);
- } else
- skb = DEV_ALLOC_SKB(pkt_len + 2);
-memory_squeeze:
- if (skb == NULL) {
- int i;
- printk(KERN_WARNING "%s: Memory squeeze, deferring packet.\n",
- dev->name);
- /* Check that at least two ring entries are free.
- If not, free one and mark stats->rx_dropped++. */
- for (i = 0; i < RX_RING_SIZE; i++)
- if (lp->rx_ring[(entry+i) % RX_RING_SIZE].status < 0)
- break;
-
- if (i > RX_RING_SIZE -2) {
- lp->stats.rx_dropped++;
- lp->rx_ring[entry].status = 0x80000000;
- lp->cur_rx++;
- }
- break;
- }
- skb->dev = dev;
- if (! rx_in_place) {
- skb_reserve(skb, 2); /* 16 byte align the data fields */
-#if LINUX_VERSION_CODE < 0x20200 || defined(__alpha__)
+ if (pkt_len < rx_copybreak
+ && (skb = DEV_ALLOC_SKB(pkt_len+2)) != NULL) {
+ skb->dev = dev;
+ skb_reserve(skb, 2); /* 16 byte align the IP header */
+#if LINUX_VERSION_CODE < 0x10300
+ memcpy(skb->data, tp->rx_ring[entry].buffer1, pkt_len);
+#elif LINUX_VERSION_CODE < 0x20200 || defined(__alpha__)
memcpy(skb_put(skb, pkt_len),
- bus_to_virt(lp->rx_ring[entry].buffer1), pkt_len);
-#else
-#ifdef ORIGINAL_TEXT
-#warning Code untested
+ bus_to_virt(tp->rx_ring[entry].buffer1), pkt_len);
#else
-#error Code is wrong, and it has nothing to do with 2.2 :-)
+ eth_copy_and_sum(skb, bus_to_virt(tp->rx_ring[entry].buffer1),
+ pkt_len, 0);
+ skb_put(skb, pkt_len);
#endif
- eth_copy_and_sum(skb, bus_to_virt(lp->rx_ring[entry].buffer1),
- pkt_len, 0);
+ work_done++;
+ } else { /* Pass up the skb already on the Rx ring. */
+ skb = tp->rx_skbuff[entry];
+ tp->rx_skbuff[entry] = NULL;
+#ifndef final_version
+ {
+ void *temp = skb_put(skb, pkt_len);
+ if (bus_to_virt(tp->rx_ring[entry].buffer1) != temp)
+ printk(KERN_ERR "%s: Internal consistency error! The "
+ "skbuff addresses do not match in tulip_rx:"
+ " %p vs. %p / %p.\n", dev->name,
+ bus_to_virt(tp->rx_ring[entry].buffer1),
+ skb->head, temp);
+ }
+#else
skb_put(skb, pkt_len);
#endif
}
@@ -2242,56 +2424,48 @@ memory_squeeze:
#else
skb->len = pkt_len;
#endif
-#ifdef CONFIG_NET_FASTROUTE
-semi_gone:
-#endif
netif_rx(skb);
-#ifdef CONFIG_NET_HW_FLOWCONTROL
- if (netdev_dropping) {
-throttle:
- if (lp->fc_bit) {
- outl(lp->csr6 | 0x2000, dev->base_addr + CSR6);
- set_bit(lp->fc_bit, &netdev_fc_xoff);
- }
- }
-#endif
-#ifdef CONFIG_NET_FASTROUTE
-gone:
-#endif
- lp->stats.rx_packets++;
-#ifndef ORIGINAL_TEXT
- lp->stats.rx_bytes += pkt_len;
+ dev->last_rx = jiffies;
+ tp->stats.rx_packets++;
+#if LINUX_VERSION_CODE > 0x20127
+ tp->stats.rx_bytes += pkt_len;
#endif
}
+ entry = (++tp->cur_rx) % RX_RING_SIZE;
+ }
- lp->rx_ring[entry].status = 0x80000000;
- entry = (++lp->cur_rx) % RX_RING_SIZE;
+ /* Refill the Rx ring buffers. */
+ for (; tp->cur_rx - tp->dirty_rx > 0; tp->dirty_rx++) {
+ entry = tp->dirty_rx % RX_RING_SIZE;
+ if (tp->rx_skbuff[entry] == NULL) {
+ struct sk_buff *skb;
+ skb = tp->rx_skbuff[entry] = DEV_ALLOC_SKB(PKT_BUF_SZ);
+ if (skb == NULL)
+ break;
+ skb->dev = dev; /* Mark as being used by this device. */
+#if LINUX_VERSION_CODE > 0x10300
+ tp->rx_ring[entry].buffer1 = virt_to_bus(skb->tail);
+#else
+ tp->rx_ring[entry].buffer1 = virt_to_bus(skb->data);
+#endif
+ work_done++;
+ }
+ tp->rx_ring[entry].status = 0x80000000;
}
- return 0;
+ return work_done;
}
static int
tulip_close(struct device *dev)
{
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
struct tulip_private *tp = (struct tulip_private *)dev->priv;
int i;
-#ifdef CONFIG_NET_FASTROUTE
- dev->tx_semaphore = 0;
-#endif
dev->start = 0;
dev->tbusy = 1;
-#ifdef CONFIG_NET_HW_FLOWCONTROL
- if (tp->fc_bit) {
- int bit = tp->fc_bit;
- tp->fc_bit = 0;
- netdev_unregister_fc(bit);
- }
-#endif
-
if (tulip_debug > 1)
printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n",
dev->name, inl(ioaddr + CSR5));
@@ -2326,12 +2500,20 @@ tulip_close(struct device *dev)
#if LINUX_VERSION_CODE < 0x20100
skb->free = 1;
#endif
+#if (LINUX_VERSION_CODE > 0x20155)
dev_kfree_skb(skb);
+#else
+ dev_kfree_skb(skb, FREE_WRITE);
+#endif
}
}
for (i = 0; i < TX_RING_SIZE; i++) {
if (tp->tx_skbuff[i])
+#if (LINUX_VERSION_CODE > 0x20155)
dev_kfree_skb(tp->tx_skbuff[i]);
+#else
+ dev_kfree_skb(tp->tx_skbuff[i], FREE_WRITE);
+#endif
tp->tx_skbuff[i] = 0;
}
@@ -2345,7 +2527,7 @@ static struct enet_statistics *
tulip_get_stats(struct device *dev)
{
struct tulip_private *tp = (struct tulip_private *)dev->priv;
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
if (dev->start)
tp->stats.rx_missed_errors += inl(ioaddr + CSR8) & 0xffff;
@@ -2353,6 +2535,71 @@ tulip_get_stats(struct device *dev)
return &tp->stats;
}
+#ifdef HAVE_PRIVATE_IOCTL
+/* Provide ioctl() calls to examine the MII xcvr state. */
+static int private_ioctl(struct device *dev, struct ifreq *rq, int cmd)
+{
+ struct tulip_private *tp = (struct tulip_private *)dev->priv;
+ long ioaddr = dev->base_addr;
+ u16 *data = (u16 *)&rq->ifr_data;
+ int phy = tp->phys[0] & 0x1f;
+ long flags;
+
+ switch(cmd) {
+ case SIOCDEVPRIVATE: /* Get the address of the PHY in use. */
+ if (tp->mtable && tp->mtable->has_mii)
+ data[0] = phy;
+ else if (tp->chip_id == DC21142)
+ data[0] = 32;
+ else
+ return -ENODEV;
+ return 0;
+ case SIOCDEVPRIVATE+1: /* Read the specified MII register. */
+ if (data[0] == 32) { /* 21142 pseudo-MII */
+ int csr12 = inl(ioaddr + CSR12);
+ int csr14 = inl(ioaddr + CSR14);
+ switch (data[1]) {
+ case 0: {
+ data[3] = ((csr14<<13)&0x4000) + ((csr14<<5)&0x1000);
+ break; }
+ case 1:
+ data[3] = 0x7848 + ((csr12&0x7000) == 0x5000 ? 0x20 : 0)
+ + (csr12&0x06 ? 0x04 : 0);
+ break;
+ case 4: {
+ int csr14 = inl(ioaddr + CSR14);
+ data[3] = ((csr14>>9)&0x0380) + ((csr14>>1)&0x20) + 1;
+ break;
+ }
+ case 5: data[3] = inl(ioaddr + CSR12) >> 16; break;
+ default: data[3] = 0; break;
+ }
+ } else {
+ save_flags(flags);
+ cli();
+ data[3] = mdio_read(dev, data[0] & 0x1f, data[1] & 0x1f);
+ restore_flags(flags);
+ }
+ return 0;
+ case SIOCDEVPRIVATE+2: /* Write the specified MII register */
+ if (!suser())
+ return -EPERM;
+ if (data[0] == 32) { /* 21142 pseudo-MII */
+ } else {
+ save_flags(flags);
+ cli();
+ mdio_write(dev, data[0] & 0x1f, data[1] & 0x1f, data[2]);
+ restore_flags(flags);
+ }
+ return 0;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ return -EOPNOTSUPP;
+}
+#endif /* HAVE_PRIVATE_IOCTL */
+
/* Set or clear the multicast filter for this adaptor.
Note that we only use exclusion around actually queueing the
new frame, not around filling tp->setup_frame. This is non-deterministic
@@ -2380,12 +2627,12 @@ static inline unsigned ether_crc_le(int length, unsigned char *data)
}
#ifdef NEW_MULTICAST
-static void set_multicast_list(struct device *dev)
+static void set_rx_mode(struct device *dev)
#else
-static void set_multicast_list(struct device *dev, int num_addrs, void *addrs)
+static void set_rx_mode(struct device *dev, int num_addrs, void *addrs)
#endif
{
- int ioaddr = dev->base_addr;
+ long ioaddr = dev->base_addr;
int csr6 = inl(ioaddr + CSR6) & ~0x00D5;
struct tulip_private *tp = (struct tulip_private *)dev->priv;
@@ -2442,9 +2689,9 @@ static void set_multicast_list(struct device *dev, int num_addrs, void *addrs)
}
eaddrs = (u16 *)dev->dev_addr;
do {
- *setup_frm++ = eaddrs[0];
- *setup_frm++ = eaddrs[1];
- *setup_frm++ = eaddrs[2];
+ *setup_frm++ = eaddrs[0];
+ *setup_frm++ = eaddrs[1];
+ *setup_frm++ = eaddrs[2];
} while (++i < 15);
/* Now add this frame to the Tx list. */
if (tp->cur_tx - tp->dirty_tx > TX_RING_SIZE - 2) {
@@ -2457,19 +2704,19 @@ static void set_multicast_list(struct device *dev, int num_addrs, void *addrs)
entry = tp->cur_tx++ % TX_RING_SIZE;
if (entry != 0) {
- /* Avoid a chip errata by prefixing a dummy entry. */
- tp->tx_skbuff[entry] = 0;
- tp->tx_ring[entry].length =
- (entry == TX_RING_SIZE-1) ? 0x02000000 : 0;
- tp->tx_ring[entry].buffer1 = 0;
- tp->tx_ring[entry].status = 0x80000000;
- entry = tp->cur_tx++ % TX_RING_SIZE;
+ /* Avoid a chip errata by prefixing a dummy entry. */
+ tp->tx_skbuff[entry] = 0;
+ tp->tx_ring[entry].length =
+ (entry == TX_RING_SIZE-1) ? 0x02000000 : 0;
+ tp->tx_ring[entry].buffer1 = 0;
+ tp->tx_ring[entry].status = 0x80000000;
+ entry = tp->cur_tx++ % TX_RING_SIZE;
}
tp->tx_skbuff[entry] = 0;
/* Put the setup frame on the Tx list. */
if (entry == TX_RING_SIZE-1)
- tx_flags |= 0x02000000; /* Wrap ring. */
+ tx_flags |= 0x02000000; /* Wrap ring. */
tp->tx_ring[entry].length = tx_flags;
tp->tx_ring[entry].buffer1 = virt_to_bus(tp->setup_frame);
tp->tx_ring[entry].status = 0x80000000;
@@ -2485,15 +2732,69 @@ static void set_multicast_list(struct device *dev, int num_addrs, void *addrs)
}
}
+#ifdef CARDBUS
+
+#include <pcmcia/driver_ops.h>
+
+static dev_node_t *tulip_attach(dev_locator_t *loc)
+{
+ u16 dev_id;
+ u32 io;
+ u8 bus, devfn;
+ struct device *dev;
+
+ if (loc->bus != LOC_PCI) return NULL;
+ bus = loc->b.pci.bus; devfn = loc->b.pci.devfn;
+ printk(KERN_INFO "tulip_attach(bus %d, function %d)\n", bus, devfn);
+ pcibios_read_config_dword(bus, devfn, PCI_BASE_ADDRESS_0, &io);
+ pcibios_read_config_word(bus, devfn, PCI_DEVICE_ID, &dev_id);
+ io &= ~3;
+ dev = tulip_probe1(bus, devfn, NULL, DC21142, -1);
+ if (dev) {
+ dev_node_t *node = kmalloc(sizeof(dev_node_t), GFP_KERNEL);
+ strcpy(node->dev_name, dev->name);
+ node->major = node->minor = 0;
+ node->next = NULL;
+ MOD_INC_USE_COUNT;
+ return node;
+ }
+ return NULL;
+}
+
+static void tulip_detach(dev_node_t *node)
+{
+ struct device **devp, **next;
+ printk(KERN_INFO "tulip_detach(%s)\n", node->dev_name);
+ for (devp = &root_tulip_dev; *devp; devp = next) {
+ next = &((struct tulip_private *)(*devp)->priv)->next_module;
+ if (strcmp((*devp)->name, node->dev_name) == 0) break;
+ }
+ if (*devp) {
+ unregister_netdev(*devp);
+ kfree(*devp);
+ *devp = *next;
+ kfree(node);
+ MOD_DEC_USE_COUNT;
+ }
+}
+
+struct driver_operations tulip_ops = {
+ "tulip_cb", tulip_attach, NULL, NULL, tulip_detach
+};
+
+#endif /* Cardbus support */
+
+
#ifdef MODULE
#if LINUX_VERSION_CODE > 0x20118
MODULE_AUTHOR("Donald Becker <becker@cesdis.gsfc.nasa.gov>");
MODULE_DESCRIPTION("Digital 21*4* Tulip ethernet driver");
MODULE_PARM(debug, "i");
+MODULE_PARM(max_interrupt_work, "i");
MODULE_PARM(reverse_probe, "i");
MODULE_PARM(rx_copybreak, "i");
-MODULE_PARM(options, "1-" __MODULE_STRING(8) "i");
-MODULE_PARM(full_duplex, "1-" __MODULE_STRING(8) "i");
+MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
+MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");
#endif
/* An additional parameter that may be passed in... */
@@ -2505,8 +2806,12 @@ init_module(void)
if (debug >= 0)
tulip_debug = debug;
- root_tulip_dev = NULL;
+#ifdef CARDBUS
+ register_driver(&tulip_ops);
+ return 0;
+#else
return tulip_probe(NULL);
+#endif
}
void
@@ -2514,6 +2819,10 @@ cleanup_module(void)
{
struct device *next_dev;
+#ifdef CARDBUS
+ unregister_driver(&tulip_ops);
+#endif
+
/* No need to check MOD_IN_USE, as sys_delete_module() checks. */
while (root_tulip_dev) {
next_dev = ((struct tulip_private *)root_tulip_dev->priv)->next_module;
@@ -2528,7 +2837,8 @@ cleanup_module(void)
/*
* Local variables:
- * compile-command: "gcc -DMODVERSIONS -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c tulip.c"
+ * SMP-compile-command: "gcc -D__SMP__ -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c tulip.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
+ * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -c tulip.c `[ -f /usr/include/linux/modversions.h ] && echo -DMODVERSIONS`"
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 4
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c
index fead49fcb..19a937c41 100644
--- a/drivers/net/via-rhine.c
+++ b/drivers/net/via-rhine.c
@@ -64,19 +64,9 @@ static const int multicast_filter_limit = 32;
#define PKT_BUF_SZ 1536 /* Size of each temporary Rx buffer.*/
-/* Include files, designed to support most kernel versions 2.0.0 and later. */
-#include <linux/version.h>
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
#include <linux/module.h>
-#else
-#define MOD_INC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
-
#include <linux/kernel.h>
+#include <linux/version.h>
#include <linux/string.h>
#include <linux/timer.h>
#include <linux/errno.h>
@@ -115,7 +105,6 @@ static const int multicast_filter_limit = 32;
#define RUN_AT(x) (jiffies + (x))
#if (LINUX_VERSION_CODE >= 0x20100)
-char kernel_version[] = UTS_RELEASE;
#else
#ifndef __alpha__
#define ioremap vremap
diff --git a/drivers/net/wd.c b/drivers/net/wd.c
index 52cc5815a..99d2318d0 100644
--- a/drivers/net/wd.c
+++ b/drivers/net/wd.c
@@ -508,7 +508,6 @@ cleanup_module(void)
int ioaddr = dev->base_addr - WD_NIC_OFFSET;
free_irq(dev->irq, dev);
release_region(ioaddr, WD_IO_EXTENT);
- dev->priv = NULL;
unregister_netdev(dev);
kfree(priv);
unlock_8390_module();
diff --git a/drivers/net/yellowfin.c b/drivers/net/yellowfin.c
index 3411fd189..410121e2e 100644
--- a/drivers/net/yellowfin.c
+++ b/drivers/net/yellowfin.c
@@ -63,17 +63,7 @@ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
/* Time in jiffies before concluding the transmitter is hung. */
#define TX_TIMEOUT ((2000*HZ)/1000)
-#ifdef MODULE
-#ifdef MODVERSIONS
-#include <linux/modversions.h>
-#endif
#include <linux/module.h>
-#include <linux/version.h>
-#else
-#define MOD_INC_USE_COUNT
-#define MOD_DEC_USE_COUNT
-#endif
-
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/string.h>
@@ -93,13 +83,10 @@ static int full_duplex[MAX_UNITS] = {-1, -1, -1, -1, -1, -1, -1, -1};
#include <linux/skbuff.h>
/* Kernel compatibility defines, most common to the PCCard package. */
-#include <linux/version.h> /* Evil, but neccessary */
+#include <linux/version.h> /* Evil and unneccessary */
#define RUN_AT(x) (jiffies + (x))
-#if (LINUX_VERSION_CODE >= 0x20100)
-char kernel_version[] = UTS_RELEASE;
-#endif
#if (LINUX_VERSION_CODE < 0x20123)
#define test_and_set_bit(val, addr) set_bit(val, addr)
#endif
@@ -214,7 +201,7 @@ See Packet Engines confidential appendix (prototype chips only).
static void yellowfin_timer(unsigned long data);
enum capability_flags {HasMII=1, FullTxStatus=2};
-struct chip_info {
+static struct chip_info {
u16 vendor_id, device_id, device_id_mask, pci_flags;
const char *name;
void (*media_timer)(unsigned long data);
diff --git a/drivers/net/z85230.c b/drivers/net/z85230.c
index 26cf57793..7e7cc5d14 100644
--- a/drivers/net/z85230.c
+++ b/drivers/net/z85230.c
@@ -227,7 +227,7 @@ static void z8530_rtsdtr(struct z8530_channel *c, int set)
* Receive handler. This is much like the async one but not quite the
* same or as complex
*
- * Note: Its intended that this handler can easily be seperated from
+ * Note: Its intended that this handler can easily be separated from
* the main code to run realtime. That'll be needed for some machines
* (eg to ever clock 64kbits on a sparc ;)).
*
@@ -605,7 +605,7 @@ static char reg_init[16]=
int z8530_sync_open(struct device *dev, struct z8530_channel *c)
{
c->sync = 1;
- c->mtu = dev->mtu;
+ c->mtu = dev->mtu+64;
c->count = 0;
c->skb = NULL;
c->skb2 = NULL;
@@ -641,7 +641,7 @@ int z8530_sync_dma_open(struct device *dev, struct z8530_channel *c)
unsigned long flags;
c->sync = 1;
- c->mtu = dev->mtu;
+ c->mtu = dev->mtu+64;
c->count = 0;
c->skb = NULL;
c->skb2 = NULL;
@@ -822,7 +822,7 @@ int z8530_sync_txdma_open(struct device *dev, struct z8530_channel *c)
{
printk("Opening sync interface for TX-DMA\n");
c->sync = 1;
- c->mtu = dev->mtu;
+ c->mtu = dev->mtu+64;
c->count = 0;
c->skb = NULL;
c->skb2 = NULL;
diff --git a/drivers/net/znet.c b/drivers/net/znet.c
index 2dff6d16b..0884cb0d8 100644
--- a/drivers/net/znet.c
+++ b/drivers/net/znet.c
@@ -207,11 +207,11 @@ __initfunc(int znet_probe(struct device *dev))
char *p;
/* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */
- for(p = (char *)0xf0000; p < (char *)0x100000; p++)
+ for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++)
if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0)
break;
- if (p >= (char *)0x100000) {
+ if (p >= (char *)phys_to_virt(0x100000)) {
if (znet_debug > 1)
printk(KERN_INFO "No Z-Note ethernet adaptor found.\n");
return ENODEV;