diff options
Diffstat (limited to 'drivers')
157 files changed, 3778 insertions, 39473 deletions
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 48718b7f4fa0..76656acd00d4 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
| @@ -188,6 +188,11 @@ static ssize_t driver_bind(struct device_driver *drv, | |||
| 188 | up(&dev->sem); | 188 | up(&dev->sem); |
| 189 | if (dev->parent) | 189 | if (dev->parent) |
| 190 | up(&dev->parent->sem); | 190 | up(&dev->parent->sem); |
| 191 | |||
| 192 | if (err > 0) /* success */ | ||
| 193 | err = count; | ||
| 194 | else if (err == 0) /* driver didn't accept device */ | ||
| 195 | err = -ENODEV; | ||
| 191 | } | 196 | } |
| 192 | put_device(dev); | 197 | put_device(dev); |
| 193 | put_bus(bus); | 198 | put_bus(bus); |
diff --git a/drivers/base/class.c b/drivers/base/class.c index df7fdabd0730..0e71dff327cd 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
| @@ -562,14 +562,13 @@ int class_device_add(struct class_device *class_dev) | |||
| 562 | kobject_uevent(&class_dev->kobj, KOBJ_ADD); | 562 | kobject_uevent(&class_dev->kobj, KOBJ_ADD); |
| 563 | 563 | ||
| 564 | /* notify any interfaces this device is now here */ | 564 | /* notify any interfaces this device is now here */ |
| 565 | if (parent_class) { | 565 | down(&parent_class->sem); |
| 566 | down(&parent_class->sem); | 566 | list_add_tail(&class_dev->node, &parent_class->children); |
| 567 | list_add_tail(&class_dev->node, &parent_class->children); | 567 | list_for_each_entry(class_intf, &parent_class->interfaces, node) { |
| 568 | list_for_each_entry(class_intf, &parent_class->interfaces, node) | 568 | if (class_intf->add) |
| 569 | if (class_intf->add) | 569 | class_intf->add(class_dev, class_intf); |
| 570 | class_intf->add(class_dev, class_intf); | ||
| 571 | up(&parent_class->sem); | ||
| 572 | } | 570 | } |
| 571 | up(&parent_class->sem); | ||
| 573 | 572 | ||
| 574 | register_done: | 573 | register_done: |
| 575 | if (error) { | 574 | if (error) { |
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 730a9ce0a14a..889c71111239 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c | |||
| @@ -209,7 +209,7 @@ static void __device_release_driver(struct device * dev) | |||
| 209 | sysfs_remove_link(&dev->kobj, "driver"); | 209 | sysfs_remove_link(&dev->kobj, "driver"); |
| 210 | klist_remove(&dev->knode_driver); | 210 | klist_remove(&dev->knode_driver); |
| 211 | 211 | ||
| 212 | if (dev->bus->remove) | 212 | if (dev->bus && dev->bus->remove) |
| 213 | dev->bus->remove(dev); | 213 | dev->bus->remove(dev); |
| 214 | else if (drv->remove) | 214 | else if (drv->remove) |
| 215 | drv->remove(dev); | 215 | drv->remove(dev); |
diff --git a/drivers/base/power/suspend.c b/drivers/base/power/suspend.c index bdb60663f2ef..662209d3f42d 100644 --- a/drivers/base/power/suspend.c +++ b/drivers/base/power/suspend.c | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/vt_kern.h> | 11 | #include <linux/vt_kern.h> |
| 12 | #include <linux/device.h> | 12 | #include <linux/device.h> |
| 13 | #include <linux/kallsyms.h> | ||
| 14 | #include <linux/pm.h> | ||
| 13 | #include "../base.h" | 15 | #include "../base.h" |
| 14 | #include "power.h" | 16 | #include "power.h" |
| 15 | 17 | ||
| @@ -58,6 +60,7 @@ int suspend_device(struct device * dev, pm_message_t state) | |||
| 58 | if (dev->bus && dev->bus->suspend && !dev->power.power_state.event) { | 60 | if (dev->bus && dev->bus->suspend && !dev->power.power_state.event) { |
| 59 | dev_dbg(dev, "suspending\n"); | 61 | dev_dbg(dev, "suspending\n"); |
| 60 | error = dev->bus->suspend(dev, state); | 62 | error = dev->bus->suspend(dev, state); |
| 63 | suspend_report_result(dev->bus->suspend, error); | ||
| 61 | } | 64 | } |
| 62 | up(&dev->sem); | 65 | up(&dev->sem); |
| 63 | return error; | 66 | return error; |
| @@ -169,3 +172,12 @@ int device_power_down(pm_message_t state) | |||
| 169 | 172 | ||
| 170 | EXPORT_SYMBOL_GPL(device_power_down); | 173 | EXPORT_SYMBOL_GPL(device_power_down); |
| 171 | 174 | ||
| 175 | void __suspend_report_result(const char *function, void *fn, int ret) | ||
| 176 | { | ||
| 177 | if (ret) { | ||
| 178 | printk(KERN_ERR "%s(): ", function); | ||
| 179 | print_fn_descriptor_symbol("%s() returns ", (unsigned long)fn); | ||
| 180 | printk("%d\n", ret); | ||
| 181 | } | ||
| 182 | } | ||
| 183 | EXPORT_SYMBOL_GPL(__suspend_report_result); | ||
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 1b0fd31c57c3..1319d8f20640 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
| @@ -1180,6 +1180,53 @@ static int revalidate_allvol(ctlr_info_t *host) | |||
| 1180 | return 0; | 1180 | return 0; |
| 1181 | } | 1181 | } |
| 1182 | 1182 | ||
| 1183 | static inline void complete_buffers(struct bio *bio, int status) | ||
| 1184 | { | ||
| 1185 | while (bio) { | ||
| 1186 | struct bio *xbh = bio->bi_next; | ||
| 1187 | int nr_sectors = bio_sectors(bio); | ||
| 1188 | |||
| 1189 | bio->bi_next = NULL; | ||
| 1190 | blk_finished_io(len); | ||
| 1191 | bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO); | ||
| 1192 | bio = xbh; | ||
| 1193 | } | ||
| 1194 | |||
| 1195 | } | ||
| 1196 | |||
| 1197 | static void cciss_softirq_done(struct request *rq) | ||
| 1198 | { | ||
| 1199 | CommandList_struct *cmd = rq->completion_data; | ||
| 1200 | ctlr_info_t *h = hba[cmd->ctlr]; | ||
| 1201 | unsigned long flags; | ||
| 1202 | u64bit temp64; | ||
| 1203 | int i, ddir; | ||
| 1204 | |||
| 1205 | if (cmd->Request.Type.Direction == XFER_READ) | ||
| 1206 | ddir = PCI_DMA_FROMDEVICE; | ||
| 1207 | else | ||
| 1208 | ddir = PCI_DMA_TODEVICE; | ||
| 1209 | |||
| 1210 | /* command did not need to be retried */ | ||
| 1211 | /* unmap the DMA mapping for all the scatter gather elements */ | ||
| 1212 | for(i=0; i<cmd->Header.SGList; i++) { | ||
| 1213 | temp64.val32.lower = cmd->SG[i].Addr.lower; | ||
| 1214 | temp64.val32.upper = cmd->SG[i].Addr.upper; | ||
| 1215 | pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); | ||
| 1216 | } | ||
| 1217 | |||
| 1218 | complete_buffers(rq->bio, rq->errors); | ||
| 1219 | |||
| 1220 | #ifdef CCISS_DEBUG | ||
| 1221 | printk("Done with %p\n", rq); | ||
| 1222 | #endif /* CCISS_DEBUG */ | ||
| 1223 | |||
| 1224 | spin_lock_irqsave(&h->lock, flags); | ||
| 1225 | end_that_request_last(rq, rq->errors); | ||
| 1226 | cmd_free(h, cmd,1); | ||
| 1227 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 1228 | } | ||
| 1229 | |||
| 1183 | /* This function will check the usage_count of the drive to be updated/added. | 1230 | /* This function will check the usage_count of the drive to be updated/added. |
| 1184 | * If the usage_count is zero then the drive information will be updated and | 1231 | * If the usage_count is zero then the drive information will be updated and |
| 1185 | * the disk will be re-registered with the kernel. If not then it will be | 1232 | * the disk will be re-registered with the kernel. If not then it will be |
| @@ -1248,6 +1295,8 @@ static void cciss_update_drive_info(int ctlr, int drv_index) | |||
| 1248 | 1295 | ||
| 1249 | blk_queue_max_sectors(disk->queue, 512); | 1296 | blk_queue_max_sectors(disk->queue, 512); |
| 1250 | 1297 | ||
| 1298 | blk_queue_softirq_done(disk->queue, cciss_softirq_done); | ||
| 1299 | |||
| 1251 | disk->queue->queuedata = hba[ctlr]; | 1300 | disk->queue->queuedata = hba[ctlr]; |
| 1252 | 1301 | ||
| 1253 | blk_queue_hardsect_size(disk->queue, | 1302 | blk_queue_hardsect_size(disk->queue, |
| @@ -2147,20 +2196,6 @@ static void start_io( ctlr_info_t *h) | |||
| 2147 | addQ (&(h->cmpQ), c); | 2196 | addQ (&(h->cmpQ), c); |
| 2148 | } | 2197 | } |
| 2149 | } | 2198 | } |
| 2150 | |||
| 2151 | static inline void complete_buffers(struct bio *bio, int status) | ||
| 2152 | { | ||
| 2153 | while (bio) { | ||
| 2154 | struct bio *xbh = bio->bi_next; | ||
| 2155 | int nr_sectors = bio_sectors(bio); | ||
| 2156 | |||
| 2157 | bio->bi_next = NULL; | ||
| 2158 | blk_finished_io(len); | ||
| 2159 | bio_endio(bio, nr_sectors << 9, status ? 0 : -EIO); | ||
| 2160 | bio = xbh; | ||
| 2161 | } | ||
| 2162 | |||
| 2163 | } | ||
| 2164 | /* Assumes that CCISS_LOCK(h->ctlr) is held. */ | 2199 | /* Assumes that CCISS_LOCK(h->ctlr) is held. */ |
| 2165 | /* Zeros out the error record and then resends the command back */ | 2200 | /* Zeros out the error record and then resends the command back */ |
| 2166 | /* to the controller */ | 2201 | /* to the controller */ |
| @@ -2178,39 +2213,6 @@ static inline void resend_cciss_cmd( ctlr_info_t *h, CommandList_struct *c) | |||
| 2178 | start_io(h); | 2213 | start_io(h); |
| 2179 | } | 2214 | } |
| 2180 | 2215 | ||
| 2181 | static void cciss_softirq_done(struct request *rq) | ||
| 2182 | { | ||
| 2183 | CommandList_struct *cmd = rq->completion_data; | ||
| 2184 | ctlr_info_t *h = hba[cmd->ctlr]; | ||
| 2185 | unsigned long flags; | ||
| 2186 | u64bit temp64; | ||
| 2187 | int i, ddir; | ||
| 2188 | |||
| 2189 | if (cmd->Request.Type.Direction == XFER_READ) | ||
| 2190 | ddir = PCI_DMA_FROMDEVICE; | ||
| 2191 | else | ||
| 2192 | ddir = PCI_DMA_TODEVICE; | ||
| 2193 | |||
| 2194 | /* command did not need to be retried */ | ||
| 2195 | /* unmap the DMA mapping for all the scatter gather elements */ | ||
| 2196 | for(i=0; i<cmd->Header.SGList; i++) { | ||
| 2197 | temp64.val32.lower = cmd->SG[i].Addr.lower; | ||
| 2198 | temp64.val32.upper = cmd->SG[i].Addr.upper; | ||
| 2199 | pci_unmap_page(h->pdev, temp64.val, cmd->SG[i].Len, ddir); | ||
| 2200 | } | ||
| 2201 | |||
| 2202 | complete_buffers(rq->bio, rq->errors); | ||
| 2203 | |||
| 2204 | #ifdef CCISS_DEBUG | ||
| 2205 | printk("Done with %p\n", rq); | ||
| 2206 | #endif /* CCISS_DEBUG */ | ||
| 2207 | |||
| 2208 | spin_lock_irqsave(&h->lock, flags); | ||
| 2209 | end_that_request_last(rq, rq->errors); | ||
| 2210 | cmd_free(h, cmd,1); | ||
| 2211 | spin_unlock_irqrestore(&h->lock, flags); | ||
| 2212 | } | ||
| 2213 | |||
| 2214 | /* checks the status of the job and calls complete buffers to mark all | 2216 | /* checks the status of the job and calls complete buffers to mark all |
| 2215 | * buffers for the completed job. Note that this function does not need | 2217 | * buffers for the completed job. Note that this function does not need |
| 2216 | * to hold the hba/queue lock. | 2218 | * to hold the hba/queue lock. |
diff --git a/drivers/char/agp/efficeon-agp.c b/drivers/char/agp/efficeon-agp.c index fed0a87448d8..86a966b65236 100644 --- a/drivers/char/agp/efficeon-agp.c +++ b/drivers/char/agp/efficeon-agp.c | |||
| @@ -64,6 +64,12 @@ static struct gatt_mask efficeon_generic_masks[] = | |||
| 64 | {.mask = 0x00000001, .type = 0} | 64 | {.mask = 0x00000001, .type = 0} |
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | /* This function does the same thing as mask_memory() for this chipset... */ | ||
| 68 | static inline unsigned long efficeon_mask_memory(unsigned long addr) | ||
| 69 | { | ||
| 70 | return addr | 0x00000001; | ||
| 71 | } | ||
| 72 | |||
| 67 | static struct aper_size_info_lvl2 efficeon_generic_sizes[4] = | 73 | static struct aper_size_info_lvl2 efficeon_generic_sizes[4] = |
| 68 | { | 74 | { |
| 69 | {256, 65536, 0}, | 75 | {256, 65536, 0}, |
| @@ -251,7 +257,7 @@ static int efficeon_insert_memory(struct agp_memory * mem, off_t pg_start, int t | |||
| 251 | last_page = NULL; | 257 | last_page = NULL; |
| 252 | for (i = 0; i < count; i++) { | 258 | for (i = 0; i < count; i++) { |
| 253 | int index = pg_start + i; | 259 | int index = pg_start + i; |
| 254 | unsigned long insert = mem->memory[i]; | 260 | unsigned long insert = efficeon_mask_memory(mem->memory[i]); |
| 255 | 261 | ||
| 256 | page = (unsigned int *) efficeon_private.l1_table[index >> 10]; | 262 | page = (unsigned int *) efficeon_private.l1_table[index >> 10]; |
| 257 | 263 | ||
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index f70a47eadb52..841f0bd3eaaf 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
| @@ -2734,7 +2734,7 @@ static void __do_SAK(void *arg) | |||
| 2734 | printk(KERN_NOTICE "SAK: killed process %d" | 2734 | printk(KERN_NOTICE "SAK: killed process %d" |
| 2735 | " (%s): fd#%d opened to the tty\n", | 2735 | " (%s): fd#%d opened to the tty\n", |
| 2736 | p->pid, p->comm, i); | 2736 | p->pid, p->comm, i); |
| 2737 | send_sig(SIGKILL, p, 1); | 2737 | force_sig(SIGKILL, p); |
| 2738 | break; | 2738 | break; |
| 2739 | } | 2739 | } |
| 2740 | } | 2740 | } |
diff --git a/drivers/firmware/Makefile b/drivers/firmware/Makefile index 85429979d0db..98e395f4bb29 100644 --- a/drivers/firmware/Makefile +++ b/drivers/firmware/Makefile | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | # | 1 | # |
| 2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
| 3 | # | 3 | # |
| 4 | obj-$(CONFIG_EDD) += edd.o | 4 | obj-$(CONFIG_DMI) += dmi_scan.o |
| 5 | obj-$(CONFIG_EDD) += edd.o | ||
| 5 | obj-$(CONFIG_EFI_VARS) += efivars.o | 6 | obj-$(CONFIG_EFI_VARS) += efivars.o |
| 6 | obj-$(CONFIG_EFI_PCDP) += pcdp.o | 7 | obj-$(CONFIG_EFI_PCDP) += pcdp.o |
| 7 | obj-$(CONFIG_DELL_RBU) += dell_rbu.o | 8 | obj-$(CONFIG_DELL_RBU) += dell_rbu.o |
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c new file mode 100644 index 000000000000..948bd7e1445a --- /dev/null +++ b/drivers/firmware/dmi_scan.c | |||
| @@ -0,0 +1,358 @@ | |||
| 1 | #include <linux/types.h> | ||
| 2 | #include <linux/string.h> | ||
| 3 | #include <linux/init.h> | ||
| 4 | #include <linux/module.h> | ||
| 5 | #include <linux/dmi.h> | ||
| 6 | #include <linux/efi.h> | ||
| 7 | #include <linux/bootmem.h> | ||
| 8 | #include <linux/slab.h> | ||
| 9 | #include <asm/dmi.h> | ||
| 10 | |||
| 11 | static char * __init dmi_string(struct dmi_header *dm, u8 s) | ||
| 12 | { | ||
| 13 | u8 *bp = ((u8 *) dm) + dm->length; | ||
| 14 | char *str = ""; | ||
| 15 | |||
| 16 | if (s) { | ||
| 17 | s--; | ||
| 18 | while (s > 0 && *bp) { | ||
| 19 | bp += strlen(bp) + 1; | ||
| 20 | s--; | ||
| 21 | } | ||
| 22 | |||
| 23 | if (*bp != 0) { | ||
| 24 | str = dmi_alloc(strlen(bp) + 1); | ||
| 25 | if (str != NULL) | ||
| 26 | strcpy(str, bp); | ||
| 27 | else | ||
| 28 | printk(KERN_ERR "dmi_string: out of memory.\n"); | ||
| 29 | } | ||
| 30 | } | ||
| 31 | |||
| 32 | return str; | ||
| 33 | } | ||
| 34 | |||
| 35 | /* | ||
| 36 | * We have to be cautious here. We have seen BIOSes with DMI pointers | ||
| 37 | * pointing to completely the wrong place for example | ||
| 38 | */ | ||
| 39 | static int __init dmi_table(u32 base, int len, int num, | ||
| 40 | void (*decode)(struct dmi_header *)) | ||
| 41 | { | ||
| 42 | u8 *buf, *data; | ||
| 43 | int i = 0; | ||
| 44 | |||
| 45 | buf = dmi_ioremap(base, len); | ||
| 46 | if (buf == NULL) | ||
| 47 | return -1; | ||
| 48 | |||
| 49 | data = buf; | ||
| 50 | |||
| 51 | /* | ||
| 52 | * Stop when we see all the items the table claimed to have | ||
| 53 | * OR we run off the end of the table (also happens) | ||
| 54 | */ | ||
| 55 | while ((i < num) && (data - buf + sizeof(struct dmi_header)) <= len) { | ||
| 56 | struct dmi_header *dm = (struct dmi_header *)data; | ||
| 57 | /* | ||
| 58 | * We want to know the total length (formated area and strings) | ||
| 59 | * before decoding to make sure we won't run off the table in | ||
| 60 | * dmi_decode or dmi_string | ||
| 61 | */ | ||
| 62 | data += dm->length; | ||
| 63 | while ((data - buf < len - 1) && (data[0] || data[1])) | ||
| 64 | data++; | ||
| 65 | if (data - buf < len - 1) | ||
| 66 | decode(dm); | ||
| 67 | data += 2; | ||
| 68 | i++; | ||
| 69 | } | ||
| 70 | dmi_iounmap(buf, len); | ||
| 71 | return 0; | ||
| 72 | } | ||
| 73 | |||
| 74 | static int __init dmi_checksum(u8 *buf) | ||
| 75 | { | ||
| 76 | u8 sum = 0; | ||
| 77 | int a; | ||
| 78 | |||
| 79 | for (a = 0; a < 15; a++) | ||
| 80 | sum += buf[a]; | ||
| 81 | |||
| 82 | return sum == 0; | ||
| 83 | } | ||
| 84 | |||
| 85 | static char *dmi_ident[DMI_STRING_MAX]; | ||
| 86 | static LIST_HEAD(dmi_devices); | ||
| 87 | |||
| 88 | /* | ||
| 89 | * Save a DMI string | ||
| 90 | */ | ||
| 91 | static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string) | ||
| 92 | { | ||
| 93 | char *p, *d = (char*) dm; | ||
| 94 | |||
| 95 | if (dmi_ident[slot]) | ||
| 96 | return; | ||
| 97 | |||
| 98 | p = dmi_string(dm, d[string]); | ||
| 99 | if (p == NULL) | ||
| 100 | return; | ||
| 101 | |||
| 102 | dmi_ident[slot] = p; | ||
| 103 | } | ||
| 104 | |||
| 105 | static void __init dmi_save_devices(struct dmi_header *dm) | ||
| 106 | { | ||
| 107 | int i, count = (dm->length - sizeof(struct dmi_header)) / 2; | ||
| 108 | struct dmi_device *dev; | ||
| 109 | |||
| 110 | for (i = 0; i < count; i++) { | ||
| 111 | char *d = (char *)(dm + 1) + (i * 2); | ||
| 112 | |||
| 113 | /* Skip disabled device */ | ||
| 114 | if ((*d & 0x80) == 0) | ||
| 115 | continue; | ||
| 116 | |||
| 117 | dev = dmi_alloc(sizeof(*dev)); | ||
| 118 | if (!dev) { | ||
| 119 | printk(KERN_ERR "dmi_save_devices: out of memory.\n"); | ||
| 120 | break; | ||
| 121 | } | ||
| 122 | |||
| 123 | dev->type = *d++ & 0x7f; | ||
| 124 | dev->name = dmi_string(dm, *d); | ||
| 125 | dev->device_data = NULL; | ||
| 126 | |||
| 127 | list_add(&dev->list, &dmi_devices); | ||
| 128 | } | ||
| 129 | } | ||
| 130 | |||
| 131 | static void __init dmi_save_ipmi_device(struct dmi_header *dm) | ||
| 132 | { | ||
| 133 | struct dmi_device *dev; | ||
| 134 | void * data; | ||
| 135 | |||
| 136 | data = dmi_alloc(dm->length); | ||
| 137 | if (data == NULL) { | ||
| 138 | printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); | ||
| 139 | return; | ||
| 140 | } | ||
| 141 | |||
| 142 | memcpy(data, dm, dm->length); | ||
| 143 | |||
| 144 | dev = dmi_alloc(sizeof(*dev)); | ||
| 145 | if (!dev) { | ||
| 146 | printk(KERN_ERR "dmi_save_ipmi_device: out of memory.\n"); | ||
| 147 | return; | ||
| 148 | } | ||
| 149 | |||
| 150 | dev->type = DMI_DEV_TYPE_IPMI; | ||
| 151 | dev->name = "IPMI controller"; | ||
| 152 | dev->device_data = data; | ||
| 153 | |||
| 154 | list_add(&dev->list, &dmi_devices); | ||
| 155 | } | ||
| 156 | |||
| 157 | /* | ||
| 158 | * Process a DMI table entry. Right now all we care about are the BIOS | ||
| 159 | * and machine entries. For 2.5 we should pull the smbus controller info | ||
| 160 | * out of here. | ||
| 161 | */ | ||
| 162 | static void __init dmi_decode(struct dmi_header *dm) | ||
| 163 | { | ||
| 164 | switch(dm->type) { | ||
| 165 | case 0: /* BIOS Information */ | ||
| 166 | dmi_save_ident(dm, DMI_BIOS_VENDOR, 4); | ||
| 167 | dmi_save_ident(dm, DMI_BIOS_VERSION, 5); | ||
| 168 | dmi_save_ident(dm, DMI_BIOS_DATE, 8); | ||
| 169 | break; | ||
| 170 | case 1: /* System Information */ | ||
| 171 | dmi_save_ident(dm, DMI_SYS_VENDOR, 4); | ||
| 172 | dmi_save_ident(dm, DMI_PRODUCT_NAME, 5); | ||
| 173 | dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6); | ||
| 174 | dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7); | ||
| 175 | break; | ||
| 176 | case 2: /* Base Board Information */ | ||
| 177 | dmi_save_ident(dm, DMI_BOARD_VENDOR, 4); | ||
| 178 | dmi_save_ident(dm, DMI_BOARD_NAME, 5); | ||
| 179 | dmi_save_ident(dm, DMI_BOARD_VERSION, 6); | ||
| 180 | break; | ||
| 181 | case 10: /* Onboard Devices Information */ | ||
| 182 | dmi_save_devices(dm); | ||
| 183 | break; | ||
| 184 | case 38: /* IPMI Device Information */ | ||
| 185 | dmi_save_ipmi_device(dm); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 189 | static int __init dmi_present(char __iomem *p) | ||
| 190 | { | ||
| 191 | u8 buf[15]; | ||
| 192 | memcpy_fromio(buf, p, 15); | ||
| 193 | if ((memcmp(buf, "_DMI_", 5) == 0) && dmi_checksum(buf)) { | ||
| 194 | u16 num = (buf[13] << 8) | buf[12]; | ||
| 195 | u16 len = (buf[7] << 8) | buf[6]; | ||
| 196 | u32 base = (buf[11] << 24) | (buf[10] << 16) | | ||
| 197 | (buf[9] << 8) | buf[8]; | ||
| 198 | |||
| 199 | /* | ||
| 200 | * DMI version 0.0 means that the real version is taken from | ||
| 201 | * the SMBIOS version, which we don't know at this point. | ||
| 202 | */ | ||
| 203 | if (buf[14] != 0) | ||
| 204 | printk(KERN_INFO "DMI %d.%d present.\n", | ||
| 205 | buf[14] >> 4, buf[14] & 0xF); | ||
| 206 | else | ||
| 207 | printk(KERN_INFO "DMI present.\n"); | ||
| 208 | if (dmi_table(base,len, num, dmi_decode) == 0) | ||
| 209 | return 0; | ||
| 210 | } | ||
| 211 | return 1; | ||
| 212 | } | ||
| 213 | |||
| 214 | void __init dmi_scan_machine(void) | ||
| 215 | { | ||
| 216 | char __iomem *p, *q; | ||
| 217 | int rc; | ||
| 218 | |||
| 219 | if (efi_enabled) { | ||
| 220 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) | ||
| 221 | goto out; | ||
| 222 | |||
| 223 | /* This is called as a core_initcall() because it isn't | ||
| 224 | * needed during early boot. This also means we can | ||
| 225 | * iounmap the space when we're done with it. | ||
| 226 | */ | ||
| 227 | p = dmi_ioremap(efi.smbios, 32); | ||
| 228 | if (p == NULL) | ||
| 229 | goto out; | ||
| 230 | |||
| 231 | rc = dmi_present(p + 0x10); /* offset of _DMI_ string */ | ||
| 232 | dmi_iounmap(p, 32); | ||
| 233 | if (!rc) | ||
| 234 | return; | ||
| 235 | } | ||
| 236 | else { | ||
| 237 | /* | ||
| 238 | * no iounmap() for that ioremap(); it would be a no-op, but | ||
| 239 | * it's so early in setup that sucker gets confused into doing | ||
| 240 | * what it shouldn't if we actually call it. | ||
| 241 | */ | ||
| 242 | p = dmi_ioremap(0xF0000, 0x10000); | ||
| 243 | if (p == NULL) | ||
| 244 | goto out; | ||
| 245 | |||
| 246 | for (q = p; q < p + 0x10000; q += 16) { | ||
| 247 | rc = dmi_present(q); | ||
| 248 | if (!rc) | ||
| 249 | return; | ||
| 250 | } | ||
| 251 | } | ||
| 252 | out: printk(KERN_INFO "DMI not present or invalid.\n"); | ||
| 253 | } | ||
| 254 | |||
| 255 | /** | ||
| 256 | * dmi_check_system - check system DMI data | ||
| 257 | * @list: array of dmi_system_id structures to match against | ||
| 258 | * | ||
| 259 | * Walk the blacklist table running matching functions until someone | ||
| 260 | * returns non zero or we hit the end. Callback function is called for | ||
| 261 | * each successfull match. Returns the number of matches. | ||
| 262 | */ | ||
| 263 | int dmi_check_system(struct dmi_system_id *list) | ||
| 264 | { | ||
| 265 | int i, count = 0; | ||
| 266 | struct dmi_system_id *d = list; | ||
| 267 | |||
| 268 | while (d->ident) { | ||
| 269 | for (i = 0; i < ARRAY_SIZE(d->matches); i++) { | ||
| 270 | int s = d->matches[i].slot; | ||
| 271 | if (s == DMI_NONE) | ||
| 272 | continue; | ||
| 273 | if (dmi_ident[s] && strstr(dmi_ident[s], d->matches[i].substr)) | ||
| 274 | continue; | ||
| 275 | /* No match */ | ||
| 276 | goto fail; | ||
| 277 | } | ||
| 278 | count++; | ||
| 279 | if (d->callback && d->callback(d)) | ||
| 280 | break; | ||
| 281 | fail: d++; | ||
| 282 | } | ||
| 283 | |||
| 284 | return count; | ||
| 285 | } | ||
| 286 | EXPORT_SYMBOL(dmi_check_system); | ||
| 287 | |||
| 288 | /** | ||
| 289 | * dmi_get_system_info - return DMI data value | ||
| 290 | * @field: data index (see enum dmi_filed) | ||
| 291 | * | ||
| 292 | * Returns one DMI data value, can be used to perform | ||
| 293 | * complex DMI data checks. | ||
| 294 | */ | ||
| 295 | char *dmi_get_system_info(int field) | ||
| 296 | { | ||
| 297 | return dmi_ident[field]; | ||
| 298 | } | ||
| 299 | EXPORT_SYMBOL(dmi_get_system_info); | ||
| 300 | |||
| 301 | /** | ||
| 302 | * dmi_find_device - find onboard device by type/name | ||
| 303 | * @type: device type or %DMI_DEV_TYPE_ANY to match all device types | ||
| 304 | * @desc: device name string or %NULL to match all | ||
| 305 | * @from: previous device found in search, or %NULL for new search. | ||
| 306 | * | ||
| 307 | * Iterates through the list of known onboard devices. If a device is | ||
| 308 | * found with a matching @vendor and @device, a pointer to its device | ||
| 309 | * structure is returned. Otherwise, %NULL is returned. | ||
| 310 | * A new search is initiated by passing %NULL to the @from argument. | ||
| 311 | * If @from is not %NULL, searches continue from next device. | ||
| 312 | */ | ||
| 313 | struct dmi_device * dmi_find_device(int type, const char *name, | ||
| 314 | struct dmi_device *from) | ||
| 315 | { | ||
| 316 | struct list_head *d, *head = from ? &from->list : &dmi_devices; | ||
| 317 | |||
| 318 | for(d = head->next; d != &dmi_devices; d = d->next) { | ||
| 319 | struct dmi_device *dev = list_entry(d, struct dmi_device, list); | ||
| 320 | |||
| 321 | if (((type == DMI_DEV_TYPE_ANY) || (dev->type == type)) && | ||
| 322 | ((name == NULL) || (strcmp(dev->name, name) == 0))) | ||
| 323 | return dev; | ||
| 324 | } | ||
| 325 | |||
| 326 | return NULL; | ||
| 327 | } | ||
| 328 | EXPORT_SYMBOL(dmi_find_device); | ||
| 329 | |||
| 330 | /** | ||
| 331 | * dmi_get_year - Return year of a DMI date | ||
| 332 | * @field: data index (like dmi_get_system_info) | ||
| 333 | * | ||
| 334 | * Returns -1 when the field doesn't exist. 0 when it is broken. | ||
| 335 | */ | ||
| 336 | int dmi_get_year(int field) | ||
| 337 | { | ||
| 338 | int year; | ||
| 339 | char *s = dmi_get_system_info(field); | ||
| 340 | |||
| 341 | if (!s) | ||
| 342 | return -1; | ||
| 343 | if (*s == '\0') | ||
| 344 | return 0; | ||
| 345 | s = strrchr(s, '/'); | ||
| 346 | if (!s) | ||
| 347 | return 0; | ||
| 348 | |||
| 349 | s += 1; | ||
| 350 | year = simple_strtoul(s, NULL, 0); | ||
| 351 | if (year && year < 100) { /* 2-digit year */ | ||
| 352 | year += 1900; | ||
| 353 | if (year < 1996) /* no dates < spec 1.0 */ | ||
| 354 | year += 100; | ||
| 355 | } | ||
| 356 | |||
| 357 | return year; | ||
| 358 | } | ||
diff --git a/drivers/hwmon/w83792d.c b/drivers/hwmon/w83792d.c index 6865c64d8a51..958602e28412 100644 --- a/drivers/hwmon/w83792d.c +++ b/drivers/hwmon/w83792d.c | |||
| @@ -1161,7 +1161,7 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 1161 | bank. */ | 1161 | bank. */ |
| 1162 | if (kind < 0) { | 1162 | if (kind < 0) { |
| 1163 | if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) { | 1163 | if (w83792d_read_value(client, W83792D_REG_CONFIG) & 0x80) { |
| 1164 | dev_warn(dev, "Detection failed at step 3\n"); | 1164 | dev_dbg(dev, "Detection failed at step 1\n"); |
| 1165 | goto ERROR1; | 1165 | goto ERROR1; |
| 1166 | } | 1166 | } |
| 1167 | val1 = w83792d_read_value(client, W83792D_REG_BANK); | 1167 | val1 = w83792d_read_value(client, W83792D_REG_BANK); |
| @@ -1170,6 +1170,7 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 1170 | if (!(val1 & 0x07)) { /* is Bank0 */ | 1170 | if (!(val1 & 0x07)) { /* is Bank0 */ |
| 1171 | if (((!(val1 & 0x80)) && (val2 != 0xa3)) || | 1171 | if (((!(val1 & 0x80)) && (val2 != 0xa3)) || |
| 1172 | ((val1 & 0x80) && (val2 != 0x5c))) { | 1172 | ((val1 & 0x80) && (val2 != 0x5c))) { |
| 1173 | dev_dbg(dev, "Detection failed at step 2\n"); | ||
| 1173 | goto ERROR1; | 1174 | goto ERROR1; |
| 1174 | } | 1175 | } |
| 1175 | } | 1176 | } |
| @@ -1177,7 +1178,7 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind) | |||
| 1177 | should match */ | 1178 | should match */ |
| 1178 | if (w83792d_read_value(client, | 1179 | if (w83792d_read_value(client, |
| 1179 | W83792D_REG_I2C_ADDR) != address) { | 1180 | W83792D_REG_I2C_ADDR) != address) { |
| 1180 | dev_warn(dev, "Detection failed at step 5\n"); | 1181 | dev_dbg(dev, "Detection failed at step 3\n"); |
| 1181 | goto ERROR1; | 1182 | goto ERROR1; |
| 1182 | } | 1183 | } |
| 1183 | } | 1184 | } |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 089c6f5b24de..d6d44946a283 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -286,7 +286,10 @@ config I2C_PARPORT | |||
| 286 | This driver is a replacement for (and was inspired by) an older | 286 | This driver is a replacement for (and was inspired by) an older |
| 287 | driver named i2c-philips-par. The new driver supports more devices, | 287 | driver named i2c-philips-par. The new driver supports more devices, |
| 288 | and makes it easier to add support for new devices. | 288 | and makes it easier to add support for new devices. |
| 289 | 289 | ||
| 290 | An adapter type parameter is now mandatory. Please read the file | ||
| 291 | Documentation/i2c/busses/i2c-parport for details. | ||
| 292 | |||
| 290 | Another driver exists, named i2c-parport-light, which doesn't depend | 293 | Another driver exists, named i2c-parport-light, which doesn't depend |
| 291 | on the parport driver. This is meant for embedded systems. Don't say | 294 | on the parport driver. This is meant for embedded systems. Don't say |
| 292 | Y here if you intend to say Y or M there. | 295 | Y here if you intend to say Y or M there. |
diff --git a/drivers/i2c/busses/i2c-parport-light.c b/drivers/i2c/busses/i2c-parport-light.c index c63025a4c861..e09ebbb2f9f0 100644 --- a/drivers/i2c/busses/i2c-parport-light.c +++ b/drivers/i2c/busses/i2c-parport-light.c | |||
| @@ -121,9 +121,14 @@ static struct i2c_adapter parport_adapter = { | |||
| 121 | 121 | ||
| 122 | static int __init i2c_parport_init(void) | 122 | static int __init i2c_parport_init(void) |
| 123 | { | 123 | { |
| 124 | if (type < 0 || type >= ARRAY_SIZE(adapter_parm)) { | 124 | if (type < 0) { |
| 125 | printk(KERN_WARNING "i2c-parport: adapter type unspecified\n"); | ||
| 126 | return -ENODEV; | ||
| 127 | } | ||
| 128 | |||
| 129 | if (type >= ARRAY_SIZE(adapter_parm)) { | ||
| 125 | printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); | 130 | printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); |
| 126 | type = 0; | 131 | return -ENODEV; |
| 127 | } | 132 | } |
| 128 | 133 | ||
| 129 | if (base == 0) { | 134 | if (base == 0) { |
diff --git a/drivers/i2c/busses/i2c-parport.c b/drivers/i2c/busses/i2c-parport.c index 7e2e8cd1c14a..934bd55bae15 100644 --- a/drivers/i2c/busses/i2c-parport.c +++ b/drivers/i2c/busses/i2c-parport.c | |||
| @@ -241,9 +241,14 @@ static struct parport_driver i2c_parport_driver = { | |||
| 241 | 241 | ||
| 242 | static int __init i2c_parport_init(void) | 242 | static int __init i2c_parport_init(void) |
| 243 | { | 243 | { |
| 244 | if (type < 0 || type >= ARRAY_SIZE(adapter_parm)) { | 244 | if (type < 0) { |
| 245 | printk(KERN_WARNING "i2c-parport: adapter type unspecified\n"); | ||
| 246 | return -ENODEV; | ||
| 247 | } | ||
| 248 | |||
| 249 | if (type >= ARRAY_SIZE(adapter_parm)) { | ||
| 245 | printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); | 250 | printk(KERN_WARNING "i2c-parport: invalid type (%d)\n", type); |
| 246 | type = 0; | 251 | return -ENODEV; |
| 247 | } | 252 | } |
| 248 | 253 | ||
| 249 | return parport_register_driver(&i2c_parport_driver); | 254 | return parport_register_driver(&i2c_parport_driver); |
diff --git a/drivers/i2c/busses/i2c-parport.h b/drivers/i2c/busses/i2c-parport.h index d702e5e0388d..9ddd816d5d0f 100644 --- a/drivers/i2c/busses/i2c-parport.h +++ b/drivers/i2c/busses/i2c-parport.h | |||
| @@ -90,7 +90,7 @@ static struct adapter_parm adapter_parm[] = { | |||
| 90 | }, | 90 | }, |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | static int type; | 93 | static int type = -1; |
| 94 | module_param(type, int, 0); | 94 | module_param(type, int, 0); |
| 95 | MODULE_PARM_DESC(type, | 95 | MODULE_PARM_DESC(type, |
| 96 | "Type of adapter:\n" | 96 | "Type of adapter:\n" |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index 3024907cdafe..1a73c0532fc7 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
| @@ -43,13 +43,6 @@ | |||
| 43 | #include <linux/init.h> | 43 | #include <linux/init.h> |
| 44 | #include <asm/io.h> | 44 | #include <asm/io.h> |
| 45 | 45 | ||
| 46 | /* | ||
| 47 | HISTORY: | ||
| 48 | 2003-05-11 1.0.0 Updated from lm_sensors project for kernel 2.5 | ||
| 49 | (was i2c-sis645.c from lm_sensors 2.7.0) | ||
| 50 | */ | ||
| 51 | #define SIS96x_VERSION "1.0.0" | ||
| 52 | |||
| 53 | /* base address register in PCI config space */ | 46 | /* base address register in PCI config space */ |
| 54 | #define SIS96x_BAR 0x04 | 47 | #define SIS96x_BAR 0x04 |
| 55 | 48 | ||
| @@ -337,7 +330,6 @@ static struct pci_driver sis96x_driver = { | |||
| 337 | 330 | ||
| 338 | static int __init i2c_sis96x_init(void) | 331 | static int __init i2c_sis96x_init(void) |
| 339 | { | 332 | { |
| 340 | printk(KERN_INFO "i2c-sis96x version %s\n", SIS96x_VERSION); | ||
| 341 | return pci_register_driver(&sis96x_driver); | 333 | return pci_register_driver(&sis96x_driver); |
| 342 | } | 334 | } |
| 343 | 335 | ||
diff --git a/drivers/i2c/chips/ds1374.c b/drivers/i2c/chips/ds1374.c index 03d09ed5ec2c..4630f1969a09 100644 --- a/drivers/i2c/chips/ds1374.c +++ b/drivers/i2c/chips/ds1374.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/rtc.h> | 27 | #include <linux/rtc.h> |
| 28 | #include <linux/bcd.h> | 28 | #include <linux/bcd.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/workqueue.h> | ||
| 30 | 31 | ||
| 31 | #define DS1374_REG_TOD0 0x00 | 32 | #define DS1374_REG_TOD0 0x00 |
| 32 | #define DS1374_REG_TOD1 0x01 | 33 | #define DS1374_REG_TOD1 0x01 |
| @@ -139,7 +140,7 @@ ulong ds1374_get_rtc_time(void) | |||
| 139 | return t1; | 140 | return t1; |
| 140 | } | 141 | } |
| 141 | 142 | ||
| 142 | static void ds1374_set_tlet(ulong arg) | 143 | static void ds1374_set_work(void *arg) |
| 143 | { | 144 | { |
| 144 | ulong t1, t2; | 145 | ulong t1, t2; |
| 145 | int limit = 10; /* arbitrary retry limit */ | 146 | int limit = 10; /* arbitrary retry limit */ |
| @@ -168,17 +169,18 @@ static void ds1374_set_tlet(ulong arg) | |||
| 168 | 169 | ||
| 169 | static ulong new_time; | 170 | static ulong new_time; |
| 170 | 171 | ||
| 171 | static DECLARE_TASKLET_DISABLED(ds1374_tasklet, ds1374_set_tlet, | 172 | static struct workqueue_struct *ds1374_workqueue; |
| 172 | (ulong) & new_time); | 173 | |
| 174 | static DECLARE_WORK(ds1374_work, ds1374_set_work, &new_time); | ||
| 173 | 175 | ||
| 174 | int ds1374_set_rtc_time(ulong nowtime) | 176 | int ds1374_set_rtc_time(ulong nowtime) |
| 175 | { | 177 | { |
| 176 | new_time = nowtime; | 178 | new_time = nowtime; |
| 177 | 179 | ||
| 178 | if (in_interrupt()) | 180 | if (in_interrupt()) |
| 179 | tasklet_schedule(&ds1374_tasklet); | 181 | queue_work(ds1374_workqueue, &ds1374_work); |
| 180 | else | 182 | else |
| 181 | ds1374_set_tlet((ulong) & new_time); | 183 | ds1374_set_work(&new_time); |
| 182 | 184 | ||
| 183 | return 0; | 185 | return 0; |
| 184 | } | 186 | } |
| @@ -204,6 +206,8 @@ static int ds1374_probe(struct i2c_adapter *adap, int addr, int kind) | |||
| 204 | client->adapter = adap; | 206 | client->adapter = adap; |
| 205 | client->driver = &ds1374_driver; | 207 | client->driver = &ds1374_driver; |
| 206 | 208 | ||
| 209 | ds1374_workqueue = create_singlethread_workqueue("ds1374"); | ||
| 210 | |||
| 207 | if ((rc = i2c_attach_client(client)) != 0) { | 211 | if ((rc = i2c_attach_client(client)) != 0) { |
| 208 | kfree(client); | 212 | kfree(client); |
| 209 | return rc; | 213 | return rc; |
| @@ -227,7 +231,7 @@ static int ds1374_detach(struct i2c_client *client) | |||
| 227 | 231 | ||
| 228 | if ((rc = i2c_detach_client(client)) == 0) { | 232 | if ((rc = i2c_detach_client(client)) == 0) { |
| 229 | kfree(i2c_get_clientdata(client)); | 233 | kfree(i2c_get_clientdata(client)); |
| 230 | tasklet_kill(&ds1374_tasklet); | 234 | destroy_workqueue(ds1374_workqueue); |
| 231 | } | 235 | } |
| 232 | return rc; | 236 | return rc; |
| 233 | } | 237 | } |
diff --git a/drivers/i2c/chips/m41t00.c b/drivers/i2c/chips/m41t00.c index b5aabe7cf792..27fc9ff2961a 100644 --- a/drivers/i2c/chips/m41t00.c +++ b/drivers/i2c/chips/m41t00.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/rtc.h> | 25 | #include <linux/rtc.h> |
| 26 | #include <linux/bcd.h> | 26 | #include <linux/bcd.h> |
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/workqueue.h> | ||
| 28 | 29 | ||
| 29 | #include <asm/time.h> | 30 | #include <asm/time.h> |
| 30 | #include <asm/rtc.h> | 31 | #include <asm/rtc.h> |
| @@ -111,7 +112,7 @@ m41t00_get_rtc_time(void) | |||
| 111 | } | 112 | } |
| 112 | 113 | ||
| 113 | static void | 114 | static void |
| 114 | m41t00_set_tlet(ulong arg) | 115 | m41t00_set(void *arg) |
| 115 | { | 116 | { |
| 116 | struct rtc_time tm; | 117 | struct rtc_time tm; |
| 117 | ulong nowtime = *(ulong *)arg; | 118 | ulong nowtime = *(ulong *)arg; |
| @@ -145,9 +146,9 @@ m41t00_set_tlet(ulong arg) | |||
| 145 | return; | 146 | return; |
| 146 | } | 147 | } |
| 147 | 148 | ||
| 148 | static ulong new_time; | 149 | static ulong new_time; |
| 149 | 150 | static struct workqueue_struct *m41t00_wq; | |
| 150 | DECLARE_TASKLET_DISABLED(m41t00_tasklet, m41t00_set_tlet, (ulong)&new_time); | 151 | static DECLARE_WORK(m41t00_work, m41t00_set, &new_time); |
| 151 | 152 | ||
| 152 | int | 153 | int |
| 153 | m41t00_set_rtc_time(ulong nowtime) | 154 | m41t00_set_rtc_time(ulong nowtime) |
| @@ -155,9 +156,9 @@ m41t00_set_rtc_time(ulong nowtime) | |||
| 155 | new_time = nowtime; | 156 | new_time = nowtime; |
| 156 | 157 | ||
| 157 | if (in_interrupt()) | 158 | if (in_interrupt()) |
| 158 | tasklet_schedule(&m41t00_tasklet); | 159 | queue_work(m41t00_wq, &m41t00_work); |
| 159 | else | 160 | else |
| 160 | m41t00_set_tlet((ulong)&new_time); | 161 | m41t00_set(&new_time); |
| 161 | 162 | ||
| 162 | return 0; | 163 | return 0; |
| 163 | } | 164 | } |
| @@ -189,6 +190,7 @@ m41t00_probe(struct i2c_adapter *adap, int addr, int kind) | |||
| 189 | return rc; | 190 | return rc; |
| 190 | } | 191 | } |
| 191 | 192 | ||
| 193 | m41t00_wq = create_singlethread_workqueue("m41t00"); | ||
| 192 | save_client = client; | 194 | save_client = client; |
| 193 | return 0; | 195 | return 0; |
| 194 | } | 196 | } |
| @@ -206,7 +208,7 @@ m41t00_detach(struct i2c_client *client) | |||
| 206 | 208 | ||
| 207 | if ((rc = i2c_detach_client(client)) == 0) { | 209 | if ((rc = i2c_detach_client(client)) == 0) { |
| 208 | kfree(client); | 210 | kfree(client); |
| 209 | tasklet_kill(&m41t00_tasklet); | 211 | destroy_workqueue(m41t00_wq); |
| 210 | } | 212 | } |
| 211 | return rc; | 213 | return rc; |
| 212 | } | 214 | } |
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index c57a3871184c..50364c0b090c 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
| @@ -302,7 +302,7 @@ static void ib_cache_setup_one(struct ib_device *device) | |||
| 302 | kmalloc(sizeof *device->cache.pkey_cache * | 302 | kmalloc(sizeof *device->cache.pkey_cache * |
| 303 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); | 303 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); |
| 304 | device->cache.gid_cache = | 304 | device->cache.gid_cache = |
| 305 | kmalloc(sizeof *device->cache.pkey_cache * | 305 | kmalloc(sizeof *device->cache.gid_cache * |
| 306 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); | 306 | (end_port(device) - start_port(device) + 1), GFP_KERNEL); |
| 307 | 307 | ||
| 308 | if (!device->cache.pkey_cache || !device->cache.gid_cache) { | 308 | if (!device->cache.pkey_cache || !device->cache.gid_cache) { |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index ba54c856b0e5..3a702da83e41 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
| @@ -2311,6 +2311,7 @@ static void local_completions(void *data) | |||
| 2311 | local = list_entry(mad_agent_priv->local_list.next, | 2311 | local = list_entry(mad_agent_priv->local_list.next, |
| 2312 | struct ib_mad_local_private, | 2312 | struct ib_mad_local_private, |
| 2313 | completion_list); | 2313 | completion_list); |
| 2314 | list_del(&local->completion_list); | ||
| 2314 | spin_unlock_irqrestore(&mad_agent_priv->lock, flags); | 2315 | spin_unlock_irqrestore(&mad_agent_priv->lock, flags); |
| 2315 | if (local->mad_priv) { | 2316 | if (local->mad_priv) { |
| 2316 | recv_mad_agent = local->recv_mad_agent; | 2317 | recv_mad_agent = local->recv_mad_agent; |
| @@ -2362,7 +2363,6 @@ local_send_completion: | |||
| 2362 | &mad_send_wc); | 2363 | &mad_send_wc); |
| 2363 | 2364 | ||
| 2364 | spin_lock_irqsave(&mad_agent_priv->lock, flags); | 2365 | spin_lock_irqsave(&mad_agent_priv->lock, flags); |
| 2365 | list_del(&local->completion_list); | ||
| 2366 | atomic_dec(&mad_agent_priv->refcount); | 2366 | atomic_dec(&mad_agent_priv->refcount); |
| 2367 | if (!recv) | 2367 | if (!recv) |
| 2368 | kmem_cache_free(ib_mad_cache, local->mad_priv); | 2368 | kmem_cache_free(ib_mad_cache, local->mad_priv); |
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c index cae0845f472a..b78e7dc69330 100644 --- a/drivers/infiniband/core/verbs.c +++ b/drivers/infiniband/core/verbs.c | |||
| @@ -45,6 +45,40 @@ | |||
| 45 | #include <rdma/ib_verbs.h> | 45 | #include <rdma/ib_verbs.h> |
| 46 | #include <rdma/ib_cache.h> | 46 | #include <rdma/ib_cache.h> |
| 47 | 47 | ||
| 48 | int ib_rate_to_mult(enum ib_rate rate) | ||
| 49 | { | ||
| 50 | switch (rate) { | ||
| 51 | case IB_RATE_2_5_GBPS: return 1; | ||
| 52 | case IB_RATE_5_GBPS: return 2; | ||
| 53 | case IB_RATE_10_GBPS: return 4; | ||
| 54 | case IB_RATE_20_GBPS: return 8; | ||
| 55 | case IB_RATE_30_GBPS: return 12; | ||
| 56 | case IB_RATE_40_GBPS: return 16; | ||
| 57 | case IB_RATE_60_GBPS: return 24; | ||
| 58 | case IB_RATE_80_GBPS: return 32; | ||
| 59 | case IB_RATE_120_GBPS: return 48; | ||
| 60 | default: return -1; | ||
| 61 | } | ||
| 62 | } | ||
| 63 | EXPORT_SYMBOL(ib_rate_to_mult); | ||
| 64 | |||
| 65 | enum ib_rate mult_to_ib_rate(int mult) | ||
| 66 | { | ||
| 67 | switch (mult) { | ||
| 68 | case 1: return IB_RATE_2_5_GBPS; | ||
| 69 | case 2: return IB_RATE_5_GBPS; | ||
| 70 | case 4: return IB_RATE_10_GBPS; | ||
| 71 | case 8: return IB_RATE_20_GBPS; | ||
| 72 | case 12: return IB_RATE_30_GBPS; | ||
| 73 | case 16: return IB_RATE_40_GBPS; | ||
| 74 | case 24: return IB_RATE_60_GBPS; | ||
| 75 | case 32: return IB_RATE_80_GBPS; | ||
| 76 | case 48: return IB_RATE_120_GBPS; | ||
| 77 | default: return IB_RATE_PORT_CURRENT; | ||
| 78 | } | ||
| 79 | } | ||
| 80 | EXPORT_SYMBOL(mult_to_ib_rate); | ||
| 81 | |||
| 48 | /* Protection domains */ | 82 | /* Protection domains */ |
| 49 | 83 | ||
| 50 | struct ib_pd *ib_alloc_pd(struct ib_device *device) | 84 | struct ib_pd *ib_alloc_pd(struct ib_device *device) |
diff --git a/drivers/infiniband/hw/mthca/Kconfig b/drivers/infiniband/hw/mthca/Kconfig index e88be85b3d5c..9aa5a4468a75 100644 --- a/drivers/infiniband/hw/mthca/Kconfig +++ b/drivers/infiniband/hw/mthca/Kconfig | |||
| @@ -7,10 +7,11 @@ config INFINIBAND_MTHCA | |||
| 7 | ("Tavor") and the MT25208 PCI Express HCA ("Arbel"). | 7 | ("Tavor") and the MT25208 PCI Express HCA ("Arbel"). |
| 8 | 8 | ||
| 9 | config INFINIBAND_MTHCA_DEBUG | 9 | config INFINIBAND_MTHCA_DEBUG |
| 10 | bool "Verbose debugging output" | 10 | bool "Verbose debugging output" if EMBEDDED |
| 11 | depends on INFINIBAND_MTHCA | 11 | depends on INFINIBAND_MTHCA |
| 12 | default n | 12 | default y |
| 13 | ---help--- | 13 | ---help--- |
| 14 | This option causes the mthca driver produce a bunch of debug | 14 | This option causes debugging code to be compiled into the |
| 15 | messages. Select this is you are developing the driver or | 15 | mthca driver. The output can be turned on via the |
| 16 | trying to diagnose a problem. | 16 | debug_level module parameter (which can also be set after |
| 17 | the driver is loaded through sysfs). | ||
diff --git a/drivers/infiniband/hw/mthca/Makefile b/drivers/infiniband/hw/mthca/Makefile index 47ec5a7cba0b..e388d95d0cf1 100644 --- a/drivers/infiniband/hw/mthca/Makefile +++ b/drivers/infiniband/hw/mthca/Makefile | |||
| @@ -1,7 +1,3 @@ | |||
| 1 | ifdef CONFIG_INFINIBAND_MTHCA_DEBUG | ||
| 2 | EXTRA_CFLAGS += -DDEBUG | ||
| 3 | endif | ||
| 4 | |||
| 5 | obj-$(CONFIG_INFINIBAND_MTHCA) += ib_mthca.o | 1 | obj-$(CONFIG_INFINIBAND_MTHCA) += ib_mthca.o |
| 6 | 2 | ||
| 7 | ib_mthca-y := mthca_main.o mthca_cmd.o mthca_profile.o mthca_reset.o \ | 3 | ib_mthca-y := mthca_main.o mthca_cmd.o mthca_profile.o mthca_reset.o \ |
diff --git a/drivers/infiniband/hw/mthca/mthca_av.c b/drivers/infiniband/hw/mthca/mthca_av.c index bc5bdcbe51b5..b12aa03be251 100644 --- a/drivers/infiniband/hw/mthca/mthca_av.c +++ b/drivers/infiniband/hw/mthca/mthca_av.c | |||
| @@ -42,6 +42,20 @@ | |||
| 42 | 42 | ||
| 43 | #include "mthca_dev.h" | 43 | #include "mthca_dev.h" |
| 44 | 44 | ||
| 45 | enum { | ||
| 46 | MTHCA_RATE_TAVOR_FULL = 0, | ||
| 47 | MTHCA_RATE_TAVOR_1X = 1, | ||
| 48 | MTHCA_RATE_TAVOR_4X = 2, | ||
| 49 | MTHCA_RATE_TAVOR_1X_DDR = 3 | ||
| 50 | }; | ||
| 51 | |||
| 52 | enum { | ||
| 53 | MTHCA_RATE_MEMFREE_FULL = 0, | ||
| 54 | MTHCA_RATE_MEMFREE_QUARTER = 1, | ||
| 55 | MTHCA_RATE_MEMFREE_EIGHTH = 2, | ||
| 56 | MTHCA_RATE_MEMFREE_HALF = 3 | ||
| 57 | }; | ||
| 58 | |||
| 45 | struct mthca_av { | 59 | struct mthca_av { |
| 46 | __be32 port_pd; | 60 | __be32 port_pd; |
| 47 | u8 reserved1; | 61 | u8 reserved1; |
| @@ -55,6 +69,90 @@ struct mthca_av { | |||
| 55 | __be32 dgid[4]; | 69 | __be32 dgid[4]; |
| 56 | }; | 70 | }; |
| 57 | 71 | ||
| 72 | static enum ib_rate memfree_rate_to_ib(u8 mthca_rate, u8 port_rate) | ||
| 73 | { | ||
| 74 | switch (mthca_rate) { | ||
| 75 | case MTHCA_RATE_MEMFREE_EIGHTH: | ||
| 76 | return mult_to_ib_rate(port_rate >> 3); | ||
| 77 | case MTHCA_RATE_MEMFREE_QUARTER: | ||
| 78 | return mult_to_ib_rate(port_rate >> 2); | ||
| 79 | case MTHCA_RATE_MEMFREE_HALF: | ||
| 80 | return mult_to_ib_rate(port_rate >> 1); | ||
| 81 | case MTHCA_RATE_MEMFREE_FULL: | ||
| 82 | default: | ||
| 83 | return mult_to_ib_rate(port_rate); | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | static enum ib_rate tavor_rate_to_ib(u8 mthca_rate, u8 port_rate) | ||
| 88 | { | ||
| 89 | switch (mthca_rate) { | ||
| 90 | case MTHCA_RATE_TAVOR_1X: return IB_RATE_2_5_GBPS; | ||
| 91 | case MTHCA_RATE_TAVOR_1X_DDR: return IB_RATE_5_GBPS; | ||
| 92 | case MTHCA_RATE_TAVOR_4X: return IB_RATE_10_GBPS; | ||
| 93 | default: return port_rate; | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u8 port) | ||
| 98 | { | ||
| 99 | if (mthca_is_memfree(dev)) { | ||
| 100 | /* Handle old Arbel FW */ | ||
| 101 | if (dev->limits.stat_rate_support == 0x3 && mthca_rate) | ||
| 102 | return IB_RATE_2_5_GBPS; | ||
| 103 | |||
| 104 | return memfree_rate_to_ib(mthca_rate, dev->rate[port - 1]); | ||
| 105 | } else | ||
| 106 | return tavor_rate_to_ib(mthca_rate, dev->rate[port - 1]); | ||
| 107 | } | ||
| 108 | |||
| 109 | static u8 ib_rate_to_memfree(u8 req_rate, u8 cur_rate) | ||
| 110 | { | ||
| 111 | if (cur_rate <= req_rate) | ||
| 112 | return 0; | ||
| 113 | |||
| 114 | /* | ||
| 115 | * Inter-packet delay (IPD) to get from rate X down to a rate | ||
| 116 | * no more than Y is (X - 1) / Y. | ||
| 117 | */ | ||
| 118 | switch ((cur_rate - 1) / req_rate) { | ||
| 119 | case 0: return MTHCA_RATE_MEMFREE_FULL; | ||
| 120 | case 1: return MTHCA_RATE_MEMFREE_HALF; | ||
| 121 | case 2: /* fall through */ | ||
| 122 | case 3: return MTHCA_RATE_MEMFREE_QUARTER; | ||
| 123 | default: return MTHCA_RATE_MEMFREE_EIGHTH; | ||
| 124 | } | ||
| 125 | } | ||
| 126 | |||
| 127 | static u8 ib_rate_to_tavor(u8 static_rate) | ||
| 128 | { | ||
| 129 | switch (static_rate) { | ||
| 130 | case IB_RATE_2_5_GBPS: return MTHCA_RATE_TAVOR_1X; | ||
| 131 | case IB_RATE_5_GBPS: return MTHCA_RATE_TAVOR_1X_DDR; | ||
| 132 | case IB_RATE_10_GBPS: return MTHCA_RATE_TAVOR_4X; | ||
| 133 | default: return MTHCA_RATE_TAVOR_FULL; | ||
| 134 | } | ||
| 135 | } | ||
| 136 | |||
| 137 | u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u8 port) | ||
| 138 | { | ||
| 139 | u8 rate; | ||
| 140 | |||
| 141 | if (!static_rate || ib_rate_to_mult(static_rate) >= dev->rate[port - 1]) | ||
| 142 | return 0; | ||
| 143 | |||
| 144 | if (mthca_is_memfree(dev)) | ||
| 145 | rate = ib_rate_to_memfree(ib_rate_to_mult(static_rate), | ||
| 146 | dev->rate[port - 1]); | ||
| 147 | else | ||
| 148 | rate = ib_rate_to_tavor(static_rate); | ||
| 149 | |||
| 150 | if (!(dev->limits.stat_rate_support & (1 << rate))) | ||
| 151 | rate = 1; | ||
| 152 | |||
| 153 | return rate; | ||
| 154 | } | ||
| 155 | |||
| 58 | int mthca_create_ah(struct mthca_dev *dev, | 156 | int mthca_create_ah(struct mthca_dev *dev, |
| 59 | struct mthca_pd *pd, | 157 | struct mthca_pd *pd, |
| 60 | struct ib_ah_attr *ah_attr, | 158 | struct ib_ah_attr *ah_attr, |
| @@ -107,7 +205,7 @@ on_hca_fail: | |||
| 107 | av->g_slid = ah_attr->src_path_bits; | 205 | av->g_slid = ah_attr->src_path_bits; |
| 108 | av->dlid = cpu_to_be16(ah_attr->dlid); | 206 | av->dlid = cpu_to_be16(ah_attr->dlid); |
| 109 | av->msg_sr = (3 << 4) | /* 2K message */ | 207 | av->msg_sr = (3 << 4) | /* 2K message */ |
| 110 | ah_attr->static_rate; | 208 | mthca_get_rate(dev, ah_attr->static_rate, ah_attr->port_num); |
| 111 | av->sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); | 209 | av->sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); |
| 112 | if (ah_attr->ah_flags & IB_AH_GRH) { | 210 | if (ah_attr->ah_flags & IB_AH_GRH) { |
| 113 | av->g_slid |= 0x80; | 211 | av->g_slid |= 0x80; |
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.c b/drivers/infiniband/hw/mthca/mthca_cmd.c index 343eca507870..1985b5dfa481 100644 --- a/drivers/infiniband/hw/mthca/mthca_cmd.c +++ b/drivers/infiniband/hw/mthca/mthca_cmd.c | |||
| @@ -965,6 +965,7 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev, | |||
| 965 | u32 *outbox; | 965 | u32 *outbox; |
| 966 | u8 field; | 966 | u8 field; |
| 967 | u16 size; | 967 | u16 size; |
| 968 | u16 stat_rate; | ||
| 968 | int err; | 969 | int err; |
| 969 | 970 | ||
| 970 | #define QUERY_DEV_LIM_OUT_SIZE 0x100 | 971 | #define QUERY_DEV_LIM_OUT_SIZE 0x100 |
| @@ -995,6 +996,7 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev, | |||
| 995 | #define QUERY_DEV_LIM_MTU_WIDTH_OFFSET 0x36 | 996 | #define QUERY_DEV_LIM_MTU_WIDTH_OFFSET 0x36 |
| 996 | #define QUERY_DEV_LIM_VL_PORT_OFFSET 0x37 | 997 | #define QUERY_DEV_LIM_VL_PORT_OFFSET 0x37 |
| 997 | #define QUERY_DEV_LIM_MAX_GID_OFFSET 0x3b | 998 | #define QUERY_DEV_LIM_MAX_GID_OFFSET 0x3b |
| 999 | #define QUERY_DEV_LIM_RATE_SUPPORT_OFFSET 0x3c | ||
| 998 | #define QUERY_DEV_LIM_MAX_PKEY_OFFSET 0x3f | 1000 | #define QUERY_DEV_LIM_MAX_PKEY_OFFSET 0x3f |
| 999 | #define QUERY_DEV_LIM_FLAGS_OFFSET 0x44 | 1001 | #define QUERY_DEV_LIM_FLAGS_OFFSET 0x44 |
| 1000 | #define QUERY_DEV_LIM_RSVD_UAR_OFFSET 0x48 | 1002 | #define QUERY_DEV_LIM_RSVD_UAR_OFFSET 0x48 |
| @@ -1086,6 +1088,8 @@ int mthca_QUERY_DEV_LIM(struct mthca_dev *dev, | |||
| 1086 | dev_lim->num_ports = field & 0xf; | 1088 | dev_lim->num_ports = field & 0xf; |
| 1087 | MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_GID_OFFSET); | 1089 | MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_GID_OFFSET); |
| 1088 | dev_lim->max_gids = 1 << (field & 0xf); | 1090 | dev_lim->max_gids = 1 << (field & 0xf); |
| 1091 | MTHCA_GET(stat_rate, outbox, QUERY_DEV_LIM_RATE_SUPPORT_OFFSET); | ||
| 1092 | dev_lim->stat_rate_support = stat_rate; | ||
| 1089 | MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_PKEY_OFFSET); | 1093 | MTHCA_GET(field, outbox, QUERY_DEV_LIM_MAX_PKEY_OFFSET); |
| 1090 | dev_lim->max_pkeys = 1 << (field & 0xf); | 1094 | dev_lim->max_pkeys = 1 << (field & 0xf); |
| 1091 | MTHCA_GET(dev_lim->flags, outbox, QUERY_DEV_LIM_FLAGS_OFFSET); | 1095 | MTHCA_GET(dev_lim->flags, outbox, QUERY_DEV_LIM_FLAGS_OFFSET); |
diff --git a/drivers/infiniband/hw/mthca/mthca_cmd.h b/drivers/infiniband/hw/mthca/mthca_cmd.h index e4ec35c40dd3..2f976f2051d6 100644 --- a/drivers/infiniband/hw/mthca/mthca_cmd.h +++ b/drivers/infiniband/hw/mthca/mthca_cmd.h | |||
| @@ -146,6 +146,7 @@ struct mthca_dev_lim { | |||
| 146 | int max_vl; | 146 | int max_vl; |
| 147 | int num_ports; | 147 | int num_ports; |
| 148 | int max_gids; | 148 | int max_gids; |
| 149 | u16 stat_rate_support; | ||
| 149 | int max_pkeys; | 150 | int max_pkeys; |
| 150 | u32 flags; | 151 | u32 flags; |
| 151 | int reserved_uars; | 152 | int reserved_uars; |
diff --git a/drivers/infiniband/hw/mthca/mthca_dev.h b/drivers/infiniband/hw/mthca/mthca_dev.h index ad52edbefe98..4c1dcb4c1822 100644 --- a/drivers/infiniband/hw/mthca/mthca_dev.h +++ b/drivers/infiniband/hw/mthca/mthca_dev.h | |||
| @@ -151,6 +151,7 @@ struct mthca_limits { | |||
| 151 | int reserved_qps; | 151 | int reserved_qps; |
| 152 | int num_srqs; | 152 | int num_srqs; |
| 153 | int max_srq_wqes; | 153 | int max_srq_wqes; |
| 154 | int max_srq_sge; | ||
| 154 | int reserved_srqs; | 155 | int reserved_srqs; |
| 155 | int num_eecs; | 156 | int num_eecs; |
| 156 | int reserved_eecs; | 157 | int reserved_eecs; |
| @@ -172,6 +173,7 @@ struct mthca_limits { | |||
| 172 | int reserved_pds; | 173 | int reserved_pds; |
| 173 | u32 page_size_cap; | 174 | u32 page_size_cap; |
| 174 | u32 flags; | 175 | u32 flags; |
| 176 | u16 stat_rate_support; | ||
| 175 | u8 port_width_cap; | 177 | u8 port_width_cap; |
| 176 | }; | 178 | }; |
| 177 | 179 | ||
| @@ -353,10 +355,24 @@ struct mthca_dev { | |||
| 353 | struct ib_mad_agent *send_agent[MTHCA_MAX_PORTS][2]; | 355 | struct ib_mad_agent *send_agent[MTHCA_MAX_PORTS][2]; |
| 354 | struct ib_ah *sm_ah[MTHCA_MAX_PORTS]; | 356 | struct ib_ah *sm_ah[MTHCA_MAX_PORTS]; |
| 355 | spinlock_t sm_lock; | 357 | spinlock_t sm_lock; |
| 358 | u8 rate[MTHCA_MAX_PORTS]; | ||
| 356 | }; | 359 | }; |
| 357 | 360 | ||
| 358 | #define mthca_dbg(mdev, format, arg...) \ | 361 | #ifdef CONFIG_INFINIBAND_MTHCA_DEBUG |
| 359 | dev_dbg(&mdev->pdev->dev, format, ## arg) | 362 | extern int mthca_debug_level; |
| 363 | |||
| 364 | #define mthca_dbg(mdev, format, arg...) \ | ||
| 365 | do { \ | ||
| 366 | if (mthca_debug_level) \ | ||
| 367 | dev_printk(KERN_DEBUG, &mdev->pdev->dev, format, ## arg); \ | ||
| 368 | } while (0) | ||
| 369 | |||
| 370 | #else /* CONFIG_INFINIBAND_MTHCA_DEBUG */ | ||
| 371 | |||
| 372 | #define mthca_dbg(mdev, format, arg...) do { (void) mdev; } while (0) | ||
| 373 | |||
| 374 | #endif /* CONFIG_INFINIBAND_MTHCA_DEBUG */ | ||
| 375 | |||
| 360 | #define mthca_err(mdev, format, arg...) \ | 376 | #define mthca_err(mdev, format, arg...) \ |
| 361 | dev_err(&mdev->pdev->dev, format, ## arg) | 377 | dev_err(&mdev->pdev->dev, format, ## arg) |
| 362 | #define mthca_info(mdev, format, arg...) \ | 378 | #define mthca_info(mdev, format, arg...) \ |
| @@ -492,6 +508,7 @@ void mthca_free_srq(struct mthca_dev *dev, struct mthca_srq *srq); | |||
| 492 | int mthca_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr, | 508 | int mthca_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr, |
| 493 | enum ib_srq_attr_mask attr_mask); | 509 | enum ib_srq_attr_mask attr_mask); |
| 494 | int mthca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr); | 510 | int mthca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr); |
| 511 | int mthca_max_srq_sge(struct mthca_dev *dev); | ||
| 495 | void mthca_srq_event(struct mthca_dev *dev, u32 srqn, | 512 | void mthca_srq_event(struct mthca_dev *dev, u32 srqn, |
| 496 | enum ib_event_type event_type); | 513 | enum ib_event_type event_type); |
| 497 | void mthca_free_srq_wqe(struct mthca_srq *srq, u32 wqe_addr); | 514 | void mthca_free_srq_wqe(struct mthca_srq *srq, u32 wqe_addr); |
| @@ -542,6 +559,8 @@ int mthca_read_ah(struct mthca_dev *dev, struct mthca_ah *ah, | |||
| 542 | struct ib_ud_header *header); | 559 | struct ib_ud_header *header); |
| 543 | int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr); | 560 | int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr); |
| 544 | int mthca_ah_grh_present(struct mthca_ah *ah); | 561 | int mthca_ah_grh_present(struct mthca_ah *ah); |
| 562 | u8 mthca_get_rate(struct mthca_dev *dev, int static_rate, u8 port); | ||
| 563 | enum ib_rate mthca_rate_to_ib(struct mthca_dev *dev, u8 mthca_rate, u8 port); | ||
| 545 | 564 | ||
| 546 | int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); | 565 | int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); |
| 547 | int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); | 566 | int mthca_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid); |
diff --git a/drivers/infiniband/hw/mthca/mthca_mad.c b/drivers/infiniband/hw/mthca/mthca_mad.c index dfb482eac9a2..f235c7ea42f0 100644 --- a/drivers/infiniband/hw/mthca/mthca_mad.c +++ b/drivers/infiniband/hw/mthca/mthca_mad.c | |||
| @@ -49,6 +49,30 @@ enum { | |||
| 49 | MTHCA_VENDOR_CLASS2 = 0xa | 49 | MTHCA_VENDOR_CLASS2 = 0xa |
| 50 | }; | 50 | }; |
| 51 | 51 | ||
| 52 | int mthca_update_rate(struct mthca_dev *dev, u8 port_num) | ||
| 53 | { | ||
| 54 | struct ib_port_attr *tprops = NULL; | ||
| 55 | int ret; | ||
| 56 | |||
| 57 | tprops = kmalloc(sizeof *tprops, GFP_KERNEL); | ||
| 58 | if (!tprops) | ||
| 59 | return -ENOMEM; | ||
| 60 | |||
| 61 | ret = ib_query_port(&dev->ib_dev, port_num, tprops); | ||
| 62 | if (ret) { | ||
| 63 | printk(KERN_WARNING "ib_query_port failed (%d) for %s port %d\n", | ||
| 64 | ret, dev->ib_dev.name, port_num); | ||
| 65 | goto out; | ||
| 66 | } | ||
| 67 | |||
| 68 | dev->rate[port_num - 1] = tprops->active_speed * | ||
| 69 | ib_width_enum_to_int(tprops->active_width); | ||
| 70 | |||
| 71 | out: | ||
| 72 | kfree(tprops); | ||
| 73 | return ret; | ||
| 74 | } | ||
| 75 | |||
| 52 | static void update_sm_ah(struct mthca_dev *dev, | 76 | static void update_sm_ah(struct mthca_dev *dev, |
| 53 | u8 port_num, u16 lid, u8 sl) | 77 | u8 port_num, u16 lid, u8 sl) |
| 54 | { | 78 | { |
| @@ -90,6 +114,7 @@ static void smp_snoop(struct ib_device *ibdev, | |||
| 90 | mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) && | 114 | mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) && |
| 91 | mad->mad_hdr.method == IB_MGMT_METHOD_SET) { | 115 | mad->mad_hdr.method == IB_MGMT_METHOD_SET) { |
| 92 | if (mad->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO) { | 116 | if (mad->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO) { |
| 117 | mthca_update_rate(to_mdev(ibdev), port_num); | ||
| 93 | update_sm_ah(to_mdev(ibdev), port_num, | 118 | update_sm_ah(to_mdev(ibdev), port_num, |
| 94 | be16_to_cpup((__be16 *) (mad->data + 58)), | 119 | be16_to_cpup((__be16 *) (mad->data + 58)), |
| 95 | (*(u8 *) (mad->data + 76)) & 0xf); | 120 | (*(u8 *) (mad->data + 76)) & 0xf); |
| @@ -246,6 +271,7 @@ int mthca_create_agents(struct mthca_dev *dev) | |||
| 246 | { | 271 | { |
| 247 | struct ib_mad_agent *agent; | 272 | struct ib_mad_agent *agent; |
| 248 | int p, q; | 273 | int p, q; |
| 274 | int ret; | ||
| 249 | 275 | ||
| 250 | spin_lock_init(&dev->sm_lock); | 276 | spin_lock_init(&dev->sm_lock); |
| 251 | 277 | ||
| @@ -255,11 +281,23 @@ int mthca_create_agents(struct mthca_dev *dev) | |||
| 255 | q ? IB_QPT_GSI : IB_QPT_SMI, | 281 | q ? IB_QPT_GSI : IB_QPT_SMI, |
| 256 | NULL, 0, send_handler, | 282 | NULL, 0, send_handler, |
| 257 | NULL, NULL); | 283 | NULL, NULL); |
| 258 | if (IS_ERR(agent)) | 284 | if (IS_ERR(agent)) { |
| 285 | ret = PTR_ERR(agent); | ||
| 259 | goto err; | 286 | goto err; |
| 287 | } | ||
| 260 | dev->send_agent[p][q] = agent; | 288 | dev->send_agent[p][q] = agent; |
| 261 | } | 289 | } |
| 262 | 290 | ||
| 291 | |||
| 292 | for (p = 1; p <= dev->limits.num_ports; ++p) { | ||
| 293 | ret = mthca_update_rate(dev, p); | ||
| 294 | if (ret) { | ||
| 295 | mthca_err(dev, "Failed to obtain port %d rate." | ||
| 296 | " aborting.\n", p); | ||
| 297 | goto err; | ||
| 298 | } | ||
| 299 | } | ||
| 300 | |||
| 263 | return 0; | 301 | return 0; |
| 264 | 302 | ||
| 265 | err: | 303 | err: |
| @@ -268,7 +306,7 @@ err: | |||
| 268 | if (dev->send_agent[p][q]) | 306 | if (dev->send_agent[p][q]) |
| 269 | ib_unregister_mad_agent(dev->send_agent[p][q]); | 307 | ib_unregister_mad_agent(dev->send_agent[p][q]); |
| 270 | 308 | ||
| 271 | return PTR_ERR(agent); | 309 | return ret; |
| 272 | } | 310 | } |
| 273 | 311 | ||
| 274 | void __devexit mthca_free_agents(struct mthca_dev *dev) | 312 | void __devexit mthca_free_agents(struct mthca_dev *dev) |
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 266f347c6707..9b9ff7bff357 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
| @@ -52,6 +52,14 @@ MODULE_DESCRIPTION("Mellanox InfiniBand HCA low-level driver"); | |||
| 52 | MODULE_LICENSE("Dual BSD/GPL"); | 52 | MODULE_LICENSE("Dual BSD/GPL"); |
| 53 | MODULE_VERSION(DRV_VERSION); | 53 | MODULE_VERSION(DRV_VERSION); |
| 54 | 54 | ||
| 55 | #ifdef CONFIG_INFINIBAND_MTHCA_DEBUG | ||
| 56 | |||
| 57 | int mthca_debug_level = 0; | ||
| 58 | module_param_named(debug_level, mthca_debug_level, int, 0644); | ||
| 59 | MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0"); | ||
| 60 | |||
| 61 | #endif /* CONFIG_INFINIBAND_MTHCA_DEBUG */ | ||
| 62 | |||
| 55 | #ifdef CONFIG_PCI_MSI | 63 | #ifdef CONFIG_PCI_MSI |
| 56 | 64 | ||
| 57 | static int msi_x = 0; | 65 | static int msi_x = 0; |
| @@ -69,6 +77,10 @@ MODULE_PARM_DESC(msi, "attempt to use MSI if nonzero"); | |||
| 69 | 77 | ||
| 70 | #endif /* CONFIG_PCI_MSI */ | 78 | #endif /* CONFIG_PCI_MSI */ |
| 71 | 79 | ||
| 80 | static int tune_pci = 0; | ||
| 81 | module_param(tune_pci, int, 0444); | ||
| 82 | MODULE_PARM_DESC(tune_pci, "increase PCI burst from the default set by BIOS if nonzero"); | ||
| 83 | |||
| 72 | static const char mthca_version[] __devinitdata = | 84 | static const char mthca_version[] __devinitdata = |
| 73 | DRV_NAME ": Mellanox InfiniBand HCA driver v" | 85 | DRV_NAME ": Mellanox InfiniBand HCA driver v" |
| 74 | DRV_VERSION " (" DRV_RELDATE ")\n"; | 86 | DRV_VERSION " (" DRV_RELDATE ")\n"; |
| @@ -90,6 +102,9 @@ static int __devinit mthca_tune_pci(struct mthca_dev *mdev) | |||
| 90 | int cap; | 102 | int cap; |
| 91 | u16 val; | 103 | u16 val; |
| 92 | 104 | ||
| 105 | if (!tune_pci) | ||
| 106 | return 0; | ||
| 107 | |||
| 93 | /* First try to max out Read Byte Count */ | 108 | /* First try to max out Read Byte Count */ |
| 94 | cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX); | 109 | cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX); |
| 95 | if (cap) { | 110 | if (cap) { |
| @@ -176,6 +191,7 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim | |||
| 176 | mdev->limits.reserved_srqs = dev_lim->reserved_srqs; | 191 | mdev->limits.reserved_srqs = dev_lim->reserved_srqs; |
| 177 | mdev->limits.reserved_eecs = dev_lim->reserved_eecs; | 192 | mdev->limits.reserved_eecs = dev_lim->reserved_eecs; |
| 178 | mdev->limits.max_desc_sz = dev_lim->max_desc_sz; | 193 | mdev->limits.max_desc_sz = dev_lim->max_desc_sz; |
| 194 | mdev->limits.max_srq_sge = mthca_max_srq_sge(mdev); | ||
| 179 | /* | 195 | /* |
| 180 | * Subtract 1 from the limit because we need to allocate a | 196 | * Subtract 1 from the limit because we need to allocate a |
| 181 | * spare CQE so the HCA HW can tell the difference between an | 197 | * spare CQE so the HCA HW can tell the difference between an |
| @@ -191,6 +207,18 @@ static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim | |||
| 191 | mdev->limits.port_width_cap = dev_lim->max_port_width; | 207 | mdev->limits.port_width_cap = dev_lim->max_port_width; |
| 192 | mdev->limits.page_size_cap = ~(u32) (dev_lim->min_page_sz - 1); | 208 | mdev->limits.page_size_cap = ~(u32) (dev_lim->min_page_sz - 1); |
| 193 | mdev->limits.flags = dev_lim->flags; | 209 | mdev->limits.flags = dev_lim->flags; |
| 210 | /* | ||
| 211 | * For old FW that doesn't return static rate support, use a | ||
| 212 | * value of 0x3 (only static rate values of 0 or 1 are handled), | ||
| 213 | * except on Sinai, where even old FW can handle static rate | ||
| 214 | * values of 2 and 3. | ||
| 215 | */ | ||
| 216 | if (dev_lim->stat_rate_support) | ||
| 217 | mdev->limits.stat_rate_support = dev_lim->stat_rate_support; | ||
| 218 | else if (mdev->mthca_flags & MTHCA_FLAG_SINAI_OPT) | ||
| 219 | mdev->limits.stat_rate_support = 0xf; | ||
| 220 | else | ||
| 221 | mdev->limits.stat_rate_support = 0x3; | ||
| 194 | 222 | ||
| 195 | /* IB_DEVICE_RESIZE_MAX_WR not supported by driver. | 223 | /* IB_DEVICE_RESIZE_MAX_WR not supported by driver. |
| 196 | May be doable since hardware supports it for SRQ. | 224 | May be doable since hardware supports it for SRQ. |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c index 2c250bc11c33..565a24b1756f 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.c +++ b/drivers/infiniband/hw/mthca/mthca_provider.c | |||
| @@ -106,7 +106,7 @@ static int mthca_query_device(struct ib_device *ibdev, | |||
| 106 | props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp; | 106 | props->max_res_rd_atom = props->max_qp_rd_atom * props->max_qp; |
| 107 | props->max_srq = mdev->limits.num_srqs - mdev->limits.reserved_srqs; | 107 | props->max_srq = mdev->limits.num_srqs - mdev->limits.reserved_srqs; |
| 108 | props->max_srq_wr = mdev->limits.max_srq_wqes; | 108 | props->max_srq_wr = mdev->limits.max_srq_wqes; |
| 109 | props->max_srq_sge = mdev->limits.max_sg; | 109 | props->max_srq_sge = mdev->limits.max_srq_sge; |
| 110 | props->local_ca_ack_delay = mdev->limits.local_ca_ack_delay; | 110 | props->local_ca_ack_delay = mdev->limits.local_ca_ack_delay; |
| 111 | props->atomic_cap = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ? | 111 | props->atomic_cap = mdev->limits.flags & DEV_LIM_FLAG_ATOMIC ? |
| 112 | IB_ATOMIC_HCA : IB_ATOMIC_NONE; | 112 | IB_ATOMIC_HCA : IB_ATOMIC_NONE; |
diff --git a/drivers/infiniband/hw/mthca/mthca_provider.h b/drivers/infiniband/hw/mthca/mthca_provider.h index 2e7f52136965..6676a786d690 100644 --- a/drivers/infiniband/hw/mthca/mthca_provider.h +++ b/drivers/infiniband/hw/mthca/mthca_provider.h | |||
| @@ -257,6 +257,8 @@ struct mthca_qp { | |||
| 257 | atomic_t refcount; | 257 | atomic_t refcount; |
| 258 | u32 qpn; | 258 | u32 qpn; |
| 259 | int is_direct; | 259 | int is_direct; |
| 260 | u8 port; /* for SQP and memfree use only */ | ||
| 261 | u8 alt_port; /* for memfree use only */ | ||
| 260 | u8 transport; | 262 | u8 transport; |
| 261 | u8 state; | 263 | u8 state; |
| 262 | u8 atomic_rd_en; | 264 | u8 atomic_rd_en; |
| @@ -278,7 +280,6 @@ struct mthca_qp { | |||
| 278 | 280 | ||
| 279 | struct mthca_sqp { | 281 | struct mthca_sqp { |
| 280 | struct mthca_qp qp; | 282 | struct mthca_qp qp; |
| 281 | int port; | ||
| 282 | int pkey_index; | 283 | int pkey_index; |
| 283 | u32 qkey; | 284 | u32 qkey; |
| 284 | u32 send_psn; | 285 | u32 send_psn; |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 057c8e6af87b..f37b0e367323 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
| @@ -248,6 +248,9 @@ void mthca_qp_event(struct mthca_dev *dev, u32 qpn, | |||
| 248 | return; | 248 | return; |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | if (event_type == IB_EVENT_PATH_MIG) | ||
| 252 | qp->port = qp->alt_port; | ||
| 253 | |||
| 251 | event.device = &dev->ib_dev; | 254 | event.device = &dev->ib_dev; |
| 252 | event.event = event_type; | 255 | event.event = event_type; |
| 253 | event.element.qp = &qp->ibqp; | 256 | event.element.qp = &qp->ibqp; |
| @@ -392,10 +395,16 @@ static void to_ib_ah_attr(struct mthca_dev *dev, struct ib_ah_attr *ib_ah_attr, | |||
| 392 | { | 395 | { |
| 393 | memset(ib_ah_attr, 0, sizeof *path); | 396 | memset(ib_ah_attr, 0, sizeof *path); |
| 394 | ib_ah_attr->port_num = (be32_to_cpu(path->port_pkey) >> 24) & 0x3; | 397 | ib_ah_attr->port_num = (be32_to_cpu(path->port_pkey) >> 24) & 0x3; |
| 398 | |||
| 399 | if (ib_ah_attr->port_num == 0 || ib_ah_attr->port_num > dev->limits.num_ports) | ||
| 400 | return; | ||
| 401 | |||
| 395 | ib_ah_attr->dlid = be16_to_cpu(path->rlid); | 402 | ib_ah_attr->dlid = be16_to_cpu(path->rlid); |
| 396 | ib_ah_attr->sl = be32_to_cpu(path->sl_tclass_flowlabel) >> 28; | 403 | ib_ah_attr->sl = be32_to_cpu(path->sl_tclass_flowlabel) >> 28; |
| 397 | ib_ah_attr->src_path_bits = path->g_mylmc & 0x7f; | 404 | ib_ah_attr->src_path_bits = path->g_mylmc & 0x7f; |
| 398 | ib_ah_attr->static_rate = path->static_rate & 0x7; | 405 | ib_ah_attr->static_rate = mthca_rate_to_ib(dev, |
| 406 | path->static_rate & 0x7, | ||
| 407 | ib_ah_attr->port_num); | ||
| 399 | ib_ah_attr->ah_flags = (path->g_mylmc & (1 << 7)) ? IB_AH_GRH : 0; | 408 | ib_ah_attr->ah_flags = (path->g_mylmc & (1 << 7)) ? IB_AH_GRH : 0; |
| 400 | if (ib_ah_attr->ah_flags) { | 409 | if (ib_ah_attr->ah_flags) { |
| 401 | ib_ah_attr->grh.sgid_index = path->mgid_index & (dev->limits.gid_table_len - 1); | 410 | ib_ah_attr->grh.sgid_index = path->mgid_index & (dev->limits.gid_table_len - 1); |
| @@ -455,8 +464,10 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m | |||
| 455 | qp_attr->cap.max_recv_sge = qp->rq.max_gs; | 464 | qp_attr->cap.max_recv_sge = qp->rq.max_gs; |
| 456 | qp_attr->cap.max_inline_data = qp->max_inline_data; | 465 | qp_attr->cap.max_inline_data = qp->max_inline_data; |
| 457 | 466 | ||
| 458 | to_ib_ah_attr(dev, &qp_attr->ah_attr, &context->pri_path); | 467 | if (qp->transport == RC || qp->transport == UC) { |
| 459 | to_ib_ah_attr(dev, &qp_attr->alt_ah_attr, &context->alt_path); | 468 | to_ib_ah_attr(dev, &qp_attr->ah_attr, &context->pri_path); |
| 469 | to_ib_ah_attr(dev, &qp_attr->alt_ah_attr, &context->alt_path); | ||
| 470 | } | ||
| 460 | 471 | ||
| 461 | qp_attr->pkey_index = be32_to_cpu(context->pri_path.port_pkey) & 0x7f; | 472 | qp_attr->pkey_index = be32_to_cpu(context->pri_path.port_pkey) & 0x7f; |
| 462 | qp_attr->alt_pkey_index = be32_to_cpu(context->alt_path.port_pkey) & 0x7f; | 473 | qp_attr->alt_pkey_index = be32_to_cpu(context->alt_path.port_pkey) & 0x7f; |
| @@ -484,11 +495,11 @@ out: | |||
| 484 | } | 495 | } |
| 485 | 496 | ||
| 486 | static int mthca_path_set(struct mthca_dev *dev, struct ib_ah_attr *ah, | 497 | static int mthca_path_set(struct mthca_dev *dev, struct ib_ah_attr *ah, |
| 487 | struct mthca_qp_path *path) | 498 | struct mthca_qp_path *path, u8 port) |
| 488 | { | 499 | { |
| 489 | path->g_mylmc = ah->src_path_bits & 0x7f; | 500 | path->g_mylmc = ah->src_path_bits & 0x7f; |
| 490 | path->rlid = cpu_to_be16(ah->dlid); | 501 | path->rlid = cpu_to_be16(ah->dlid); |
| 491 | path->static_rate = !!ah->static_rate; | 502 | path->static_rate = mthca_get_rate(dev, ah->static_rate, port); |
| 492 | 503 | ||
| 493 | if (ah->ah_flags & IB_AH_GRH) { | 504 | if (ah->ah_flags & IB_AH_GRH) { |
| 494 | if (ah->grh.sgid_index >= dev->limits.gid_table_len) { | 505 | if (ah->grh.sgid_index >= dev->limits.gid_table_len) { |
| @@ -634,7 +645,7 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
| 634 | 645 | ||
| 635 | if (qp->transport == MLX) | 646 | if (qp->transport == MLX) |
| 636 | qp_context->pri_path.port_pkey |= | 647 | qp_context->pri_path.port_pkey |= |
| 637 | cpu_to_be32(to_msqp(qp)->port << 24); | 648 | cpu_to_be32(qp->port << 24); |
| 638 | else { | 649 | else { |
| 639 | if (attr_mask & IB_QP_PORT) { | 650 | if (attr_mask & IB_QP_PORT) { |
| 640 | qp_context->pri_path.port_pkey |= | 651 | qp_context->pri_path.port_pkey |= |
| @@ -657,7 +668,8 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
| 657 | } | 668 | } |
| 658 | 669 | ||
| 659 | if (attr_mask & IB_QP_AV) { | 670 | if (attr_mask & IB_QP_AV) { |
| 660 | if (mthca_path_set(dev, &attr->ah_attr, &qp_context->pri_path)) | 671 | if (mthca_path_set(dev, &attr->ah_attr, &qp_context->pri_path, |
| 672 | attr_mask & IB_QP_PORT ? attr->port_num : qp->port)) | ||
| 661 | return -EINVAL; | 673 | return -EINVAL; |
| 662 | 674 | ||
| 663 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_PRIMARY_ADDR_PATH); | 675 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_PRIMARY_ADDR_PATH); |
| @@ -681,7 +693,8 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
| 681 | return -EINVAL; | 693 | return -EINVAL; |
| 682 | } | 694 | } |
| 683 | 695 | ||
| 684 | if (mthca_path_set(dev, &attr->alt_ah_attr, &qp_context->alt_path)) | 696 | if (mthca_path_set(dev, &attr->alt_ah_attr, &qp_context->alt_path, |
| 697 | attr->alt_ah_attr.port_num)) | ||
| 685 | return -EINVAL; | 698 | return -EINVAL; |
| 686 | 699 | ||
| 687 | qp_context->alt_path.port_pkey |= cpu_to_be32(attr->alt_pkey_index | | 700 | qp_context->alt_path.port_pkey |= cpu_to_be32(attr->alt_pkey_index | |
| @@ -791,6 +804,10 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
| 791 | qp->atomic_rd_en = attr->qp_access_flags; | 804 | qp->atomic_rd_en = attr->qp_access_flags; |
| 792 | if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) | 805 | if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) |
| 793 | qp->resp_depth = attr->max_dest_rd_atomic; | 806 | qp->resp_depth = attr->max_dest_rd_atomic; |
| 807 | if (attr_mask & IB_QP_PORT) | ||
| 808 | qp->port = attr->port_num; | ||
| 809 | if (attr_mask & IB_QP_ALT_PATH) | ||
| 810 | qp->alt_port = attr->alt_port_num; | ||
| 794 | 811 | ||
| 795 | if (is_sqp(dev, qp)) | 812 | if (is_sqp(dev, qp)) |
| 796 | store_attrs(to_msqp(qp), attr, attr_mask); | 813 | store_attrs(to_msqp(qp), attr, attr_mask); |
| @@ -802,13 +819,13 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
| 802 | if (is_qp0(dev, qp)) { | 819 | if (is_qp0(dev, qp)) { |
| 803 | if (cur_state != IB_QPS_RTR && | 820 | if (cur_state != IB_QPS_RTR && |
| 804 | new_state == IB_QPS_RTR) | 821 | new_state == IB_QPS_RTR) |
| 805 | init_port(dev, to_msqp(qp)->port); | 822 | init_port(dev, qp->port); |
| 806 | 823 | ||
| 807 | if (cur_state != IB_QPS_RESET && | 824 | if (cur_state != IB_QPS_RESET && |
| 808 | cur_state != IB_QPS_ERR && | 825 | cur_state != IB_QPS_ERR && |
| 809 | (new_state == IB_QPS_RESET || | 826 | (new_state == IB_QPS_RESET || |
| 810 | new_state == IB_QPS_ERR)) | 827 | new_state == IB_QPS_ERR)) |
| 811 | mthca_CLOSE_IB(dev, to_msqp(qp)->port, &status); | 828 | mthca_CLOSE_IB(dev, qp->port, &status); |
| 812 | } | 829 | } |
| 813 | 830 | ||
| 814 | /* | 831 | /* |
| @@ -1212,6 +1229,9 @@ int mthca_alloc_qp(struct mthca_dev *dev, | |||
| 1212 | if (qp->qpn == -1) | 1229 | if (qp->qpn == -1) |
| 1213 | return -ENOMEM; | 1230 | return -ENOMEM; |
| 1214 | 1231 | ||
| 1232 | /* initialize port to zero for error-catching. */ | ||
| 1233 | qp->port = 0; | ||
| 1234 | |||
| 1215 | err = mthca_alloc_qp_common(dev, pd, send_cq, recv_cq, | 1235 | err = mthca_alloc_qp_common(dev, pd, send_cq, recv_cq, |
| 1216 | send_policy, qp); | 1236 | send_policy, qp); |
| 1217 | if (err) { | 1237 | if (err) { |
| @@ -1261,7 +1281,7 @@ int mthca_alloc_sqp(struct mthca_dev *dev, | |||
| 1261 | if (err) | 1281 | if (err) |
| 1262 | goto err_out; | 1282 | goto err_out; |
| 1263 | 1283 | ||
| 1264 | sqp->port = port; | 1284 | sqp->qp.port = port; |
| 1265 | sqp->qp.qpn = mqpn; | 1285 | sqp->qp.qpn = mqpn; |
| 1266 | sqp->qp.transport = MLX; | 1286 | sqp->qp.transport = MLX; |
| 1267 | 1287 | ||
| @@ -1404,10 +1424,10 @@ static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp *sqp, | |||
| 1404 | sqp->ud_header.lrh.source_lid = IB_LID_PERMISSIVE; | 1424 | sqp->ud_header.lrh.source_lid = IB_LID_PERMISSIVE; |
| 1405 | sqp->ud_header.bth.solicited_event = !!(wr->send_flags & IB_SEND_SOLICITED); | 1425 | sqp->ud_header.bth.solicited_event = !!(wr->send_flags & IB_SEND_SOLICITED); |
| 1406 | if (!sqp->qp.ibqp.qp_num) | 1426 | if (!sqp->qp.ibqp.qp_num) |
| 1407 | ib_get_cached_pkey(&dev->ib_dev, sqp->port, | 1427 | ib_get_cached_pkey(&dev->ib_dev, sqp->qp.port, |
| 1408 | sqp->pkey_index, &pkey); | 1428 | sqp->pkey_index, &pkey); |
| 1409 | else | 1429 | else |
| 1410 | ib_get_cached_pkey(&dev->ib_dev, sqp->port, | 1430 | ib_get_cached_pkey(&dev->ib_dev, sqp->qp.port, |
| 1411 | wr->wr.ud.pkey_index, &pkey); | 1431 | wr->wr.ud.pkey_index, &pkey); |
| 1412 | sqp->ud_header.bth.pkey = cpu_to_be16(pkey); | 1432 | sqp->ud_header.bth.pkey = cpu_to_be16(pkey); |
| 1413 | sqp->ud_header.bth.destination_qpn = cpu_to_be32(wr->wr.ud.remote_qpn); | 1433 | sqp->ud_header.bth.destination_qpn = cpu_to_be32(wr->wr.ud.remote_qpn); |
diff --git a/drivers/infiniband/hw/mthca/mthca_srq.c b/drivers/infiniband/hw/mthca/mthca_srq.c index 2dd3aea05341..adcaf85355ae 100644 --- a/drivers/infiniband/hw/mthca/mthca_srq.c +++ b/drivers/infiniband/hw/mthca/mthca_srq.c | |||
| @@ -192,7 +192,7 @@ int mthca_alloc_srq(struct mthca_dev *dev, struct mthca_pd *pd, | |||
| 192 | 192 | ||
| 193 | /* Sanity check SRQ size before proceeding */ | 193 | /* Sanity check SRQ size before proceeding */ |
| 194 | if (attr->max_wr > dev->limits.max_srq_wqes || | 194 | if (attr->max_wr > dev->limits.max_srq_wqes || |
| 195 | attr->max_sge > dev->limits.max_sg) | 195 | attr->max_sge > dev->limits.max_srq_sge) |
| 196 | return -EINVAL; | 196 | return -EINVAL; |
| 197 | 197 | ||
| 198 | srq->max = attr->max_wr; | 198 | srq->max = attr->max_wr; |
| @@ -660,6 +660,31 @@ int mthca_arbel_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr, | |||
| 660 | return err; | 660 | return err; |
| 661 | } | 661 | } |
| 662 | 662 | ||
| 663 | int mthca_max_srq_sge(struct mthca_dev *dev) | ||
| 664 | { | ||
| 665 | if (mthca_is_memfree(dev)) | ||
| 666 | return dev->limits.max_sg; | ||
| 667 | |||
| 668 | /* | ||
| 669 | * SRQ allocations are based on powers of 2 for Tavor, | ||
| 670 | * (although they only need to be multiples of 16 bytes). | ||
| 671 | * | ||
| 672 | * Therefore, we need to base the max number of sg entries on | ||
| 673 | * the largest power of 2 descriptor size that is <= to the | ||
| 674 | * actual max WQE descriptor size, rather than return the | ||
| 675 | * max_sg value given by the firmware (which is based on WQE | ||
| 676 | * sizes as multiples of 16, not powers of 2). | ||
| 677 | * | ||
| 678 | * If SRQ implementation is changed for Tavor to be based on | ||
| 679 | * multiples of 16, the calculation below can be deleted and | ||
| 680 | * the FW max_sg value returned. | ||
| 681 | */ | ||
| 682 | return min_t(int, dev->limits.max_sg, | ||
| 683 | ((1 << (fls(dev->limits.max_desc_sz) - 1)) - | ||
| 684 | sizeof (struct mthca_next_seg)) / | ||
| 685 | sizeof (struct mthca_data_seg)); | ||
| 686 | } | ||
| 687 | |||
| 663 | int __devinit mthca_init_srq_table(struct mthca_dev *dev) | 688 | int __devinit mthca_init_srq_table(struct mthca_dev *dev) |
| 664 | { | 689 | { |
| 665 | int err; | 690 | int err; |
diff --git a/drivers/infiniband/ulp/ipoib/Kconfig b/drivers/infiniband/ulp/ipoib/Kconfig index 8d2e04cac68e..13d6d01c72c0 100644 --- a/drivers/infiniband/ulp/ipoib/Kconfig +++ b/drivers/infiniband/ulp/ipoib/Kconfig | |||
| @@ -10,8 +10,9 @@ config INFINIBAND_IPOIB | |||
| 10 | group: <http://www.ietf.org/html.charters/ipoib-charter.html>. | 10 | group: <http://www.ietf.org/html.charters/ipoib-charter.html>. |
| 11 | 11 | ||
| 12 | config INFINIBAND_IPOIB_DEBUG | 12 | config INFINIBAND_IPOIB_DEBUG |
| 13 | bool "IP-over-InfiniBand debugging" | 13 | bool "IP-over-InfiniBand debugging" if EMBEDDED |
| 14 | depends on INFINIBAND_IPOIB | 14 | depends on INFINIBAND_IPOIB |
| 15 | default y | ||
| 15 | ---help--- | 16 | ---help--- |
| 16 | This option causes debugging code to be compiled into the | 17 | This option causes debugging code to be compiled into the |
| 17 | IPoIB driver. The output can be turned on via the | 18 | IPoIB driver. The output can be turned on via the |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index b640107fb732..12a1e0572ef2 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
| @@ -65,6 +65,8 @@ enum { | |||
| 65 | 65 | ||
| 66 | IPOIB_RX_RING_SIZE = 128, | 66 | IPOIB_RX_RING_SIZE = 128, |
| 67 | IPOIB_TX_RING_SIZE = 64, | 67 | IPOIB_TX_RING_SIZE = 64, |
| 68 | IPOIB_MAX_QUEUE_SIZE = 8192, | ||
| 69 | IPOIB_MIN_QUEUE_SIZE = 2, | ||
| 68 | 70 | ||
| 69 | IPOIB_NUM_WC = 4, | 71 | IPOIB_NUM_WC = 4, |
| 70 | 72 | ||
| @@ -230,6 +232,9 @@ static inline struct ipoib_neigh **to_ipoib_neigh(struct neighbour *neigh) | |||
| 230 | INFINIBAND_ALEN, sizeof(void *)); | 232 | INFINIBAND_ALEN, sizeof(void *)); |
| 231 | } | 233 | } |
| 232 | 234 | ||
| 235 | struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neigh); | ||
| 236 | void ipoib_neigh_free(struct ipoib_neigh *neigh); | ||
| 237 | |||
| 233 | extern struct workqueue_struct *ipoib_workqueue; | 238 | extern struct workqueue_struct *ipoib_workqueue; |
| 234 | 239 | ||
| 235 | /* functions */ | 240 | /* functions */ |
| @@ -329,6 +334,8 @@ static inline void ipoib_unregister_debugfs(void) { } | |||
| 329 | #define ipoib_warn(priv, format, arg...) \ | 334 | #define ipoib_warn(priv, format, arg...) \ |
| 330 | ipoib_printk(KERN_WARNING, priv, format , ## arg) | 335 | ipoib_printk(KERN_WARNING, priv, format , ## arg) |
| 331 | 336 | ||
| 337 | extern int ipoib_sendq_size; | ||
| 338 | extern int ipoib_recvq_size; | ||
| 332 | 339 | ||
| 333 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 340 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
| 334 | extern int ipoib_debug_level; | 341 | extern int ipoib_debug_level; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_fs.c b/drivers/infiniband/ulp/ipoib/ipoib_fs.c index 685258e34034..5dde380e8dbe 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_fs.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_fs.c | |||
| @@ -213,7 +213,7 @@ static int ipoib_path_seq_show(struct seq_file *file, void *iter_ptr) | |||
| 213 | gid_buf, path.pathrec.dlid ? "yes" : "no"); | 213 | gid_buf, path.pathrec.dlid ? "yes" : "no"); |
| 214 | 214 | ||
| 215 | if (path.pathrec.dlid) { | 215 | if (path.pathrec.dlid) { |
| 216 | rate = ib_sa_rate_enum_to_int(path.pathrec.rate) * 25; | 216 | rate = ib_rate_to_mult(path.pathrec.rate) * 25; |
| 217 | 217 | ||
| 218 | seq_printf(file, | 218 | seq_printf(file, |
| 219 | " DLID: 0x%04x\n" | 219 | " DLID: 0x%04x\n" |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index ed65202878d8..a54da42849ae 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
| @@ -161,7 +161,7 @@ static int ipoib_ib_post_receives(struct net_device *dev) | |||
| 161 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 161 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 162 | int i; | 162 | int i; |
| 163 | 163 | ||
| 164 | for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) { | 164 | for (i = 0; i < ipoib_recvq_size; ++i) { |
| 165 | if (ipoib_alloc_rx_skb(dev, i)) { | 165 | if (ipoib_alloc_rx_skb(dev, i)) { |
| 166 | ipoib_warn(priv, "failed to allocate receive buffer %d\n", i); | 166 | ipoib_warn(priv, "failed to allocate receive buffer %d\n", i); |
| 167 | return -ENOMEM; | 167 | return -ENOMEM; |
| @@ -187,7 +187,7 @@ static void ipoib_ib_handle_wc(struct net_device *dev, | |||
| 187 | if (wr_id & IPOIB_OP_RECV) { | 187 | if (wr_id & IPOIB_OP_RECV) { |
| 188 | wr_id &= ~IPOIB_OP_RECV; | 188 | wr_id &= ~IPOIB_OP_RECV; |
| 189 | 189 | ||
| 190 | if (wr_id < IPOIB_RX_RING_SIZE) { | 190 | if (wr_id < ipoib_recvq_size) { |
| 191 | struct sk_buff *skb = priv->rx_ring[wr_id].skb; | 191 | struct sk_buff *skb = priv->rx_ring[wr_id].skb; |
| 192 | dma_addr_t addr = priv->rx_ring[wr_id].mapping; | 192 | dma_addr_t addr = priv->rx_ring[wr_id].mapping; |
| 193 | 193 | ||
| @@ -252,9 +252,9 @@ static void ipoib_ib_handle_wc(struct net_device *dev, | |||
| 252 | struct ipoib_tx_buf *tx_req; | 252 | struct ipoib_tx_buf *tx_req; |
| 253 | unsigned long flags; | 253 | unsigned long flags; |
| 254 | 254 | ||
| 255 | if (wr_id >= IPOIB_TX_RING_SIZE) { | 255 | if (wr_id >= ipoib_sendq_size) { |
| 256 | ipoib_warn(priv, "completion event with wrid %d (> %d)\n", | 256 | ipoib_warn(priv, "completion event with wrid %d (> %d)\n", |
| 257 | wr_id, IPOIB_TX_RING_SIZE); | 257 | wr_id, ipoib_sendq_size); |
| 258 | return; | 258 | return; |
| 259 | } | 259 | } |
| 260 | 260 | ||
| @@ -275,7 +275,7 @@ static void ipoib_ib_handle_wc(struct net_device *dev, | |||
| 275 | spin_lock_irqsave(&priv->tx_lock, flags); | 275 | spin_lock_irqsave(&priv->tx_lock, flags); |
| 276 | ++priv->tx_tail; | 276 | ++priv->tx_tail; |
| 277 | if (netif_queue_stopped(dev) && | 277 | if (netif_queue_stopped(dev) && |
| 278 | priv->tx_head - priv->tx_tail <= IPOIB_TX_RING_SIZE / 2) | 278 | priv->tx_head - priv->tx_tail <= ipoib_sendq_size >> 1) |
| 279 | netif_wake_queue(dev); | 279 | netif_wake_queue(dev); |
| 280 | spin_unlock_irqrestore(&priv->tx_lock, flags); | 280 | spin_unlock_irqrestore(&priv->tx_lock, flags); |
| 281 | 281 | ||
| @@ -344,13 +344,13 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
| 344 | * means we have to make sure everything is properly recorded and | 344 | * means we have to make sure everything is properly recorded and |
| 345 | * our state is consistent before we call post_send(). | 345 | * our state is consistent before we call post_send(). |
| 346 | */ | 346 | */ |
| 347 | tx_req = &priv->tx_ring[priv->tx_head & (IPOIB_TX_RING_SIZE - 1)]; | 347 | tx_req = &priv->tx_ring[priv->tx_head & (ipoib_sendq_size - 1)]; |
| 348 | tx_req->skb = skb; | 348 | tx_req->skb = skb; |
| 349 | addr = dma_map_single(priv->ca->dma_device, skb->data, skb->len, | 349 | addr = dma_map_single(priv->ca->dma_device, skb->data, skb->len, |
| 350 | DMA_TO_DEVICE); | 350 | DMA_TO_DEVICE); |
| 351 | pci_unmap_addr_set(tx_req, mapping, addr); | 351 | pci_unmap_addr_set(tx_req, mapping, addr); |
| 352 | 352 | ||
| 353 | if (unlikely(post_send(priv, priv->tx_head & (IPOIB_TX_RING_SIZE - 1), | 353 | if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), |
| 354 | address->ah, qpn, addr, skb->len))) { | 354 | address->ah, qpn, addr, skb->len))) { |
| 355 | ipoib_warn(priv, "post_send failed\n"); | 355 | ipoib_warn(priv, "post_send failed\n"); |
| 356 | ++priv->stats.tx_errors; | 356 | ++priv->stats.tx_errors; |
| @@ -363,7 +363,7 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
| 363 | address->last_send = priv->tx_head; | 363 | address->last_send = priv->tx_head; |
| 364 | ++priv->tx_head; | 364 | ++priv->tx_head; |
| 365 | 365 | ||
| 366 | if (priv->tx_head - priv->tx_tail == IPOIB_TX_RING_SIZE) { | 366 | if (priv->tx_head - priv->tx_tail == ipoib_sendq_size) { |
| 367 | ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); | 367 | ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); |
| 368 | netif_stop_queue(dev); | 368 | netif_stop_queue(dev); |
| 369 | } | 369 | } |
| @@ -488,7 +488,7 @@ static int recvs_pending(struct net_device *dev) | |||
| 488 | int pending = 0; | 488 | int pending = 0; |
| 489 | int i; | 489 | int i; |
| 490 | 490 | ||
| 491 | for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) | 491 | for (i = 0; i < ipoib_recvq_size; ++i) |
| 492 | if (priv->rx_ring[i].skb) | 492 | if (priv->rx_ring[i].skb) |
| 493 | ++pending; | 493 | ++pending; |
| 494 | 494 | ||
| @@ -527,7 +527,7 @@ int ipoib_ib_dev_stop(struct net_device *dev) | |||
| 527 | */ | 527 | */ |
| 528 | while ((int) priv->tx_tail - (int) priv->tx_head < 0) { | 528 | while ((int) priv->tx_tail - (int) priv->tx_head < 0) { |
| 529 | tx_req = &priv->tx_ring[priv->tx_tail & | 529 | tx_req = &priv->tx_ring[priv->tx_tail & |
| 530 | (IPOIB_TX_RING_SIZE - 1)]; | 530 | (ipoib_sendq_size - 1)]; |
| 531 | dma_unmap_single(priv->ca->dma_device, | 531 | dma_unmap_single(priv->ca->dma_device, |
| 532 | pci_unmap_addr(tx_req, mapping), | 532 | pci_unmap_addr(tx_req, mapping), |
| 533 | tx_req->skb->len, | 533 | tx_req->skb->len, |
| @@ -536,7 +536,7 @@ int ipoib_ib_dev_stop(struct net_device *dev) | |||
| 536 | ++priv->tx_tail; | 536 | ++priv->tx_tail; |
| 537 | } | 537 | } |
| 538 | 538 | ||
| 539 | for (i = 0; i < IPOIB_RX_RING_SIZE; ++i) | 539 | for (i = 0; i < ipoib_recvq_size; ++i) |
| 540 | if (priv->rx_ring[i].skb) { | 540 | if (priv->rx_ring[i].skb) { |
| 541 | dma_unmap_single(priv->ca->dma_device, | 541 | dma_unmap_single(priv->ca->dma_device, |
| 542 | pci_unmap_addr(&priv->rx_ring[i], | 542 | pci_unmap_addr(&priv->rx_ring[i], |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 9b0bd7c746ca..cb078a7d0bf5 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | #include <linux/init.h> | 41 | #include <linux/init.h> |
| 42 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
| 43 | #include <linux/vmalloc.h> | 43 | #include <linux/vmalloc.h> |
| 44 | #include <linux/kernel.h> | ||
| 44 | 45 | ||
| 45 | #include <linux/if_arp.h> /* For ARPHRD_xxx */ | 46 | #include <linux/if_arp.h> /* For ARPHRD_xxx */ |
| 46 | 47 | ||
| @@ -53,6 +54,14 @@ MODULE_AUTHOR("Roland Dreier"); | |||
| 53 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); | 54 | MODULE_DESCRIPTION("IP-over-InfiniBand net driver"); |
| 54 | MODULE_LICENSE("Dual BSD/GPL"); | 55 | MODULE_LICENSE("Dual BSD/GPL"); |
| 55 | 56 | ||
| 57 | int ipoib_sendq_size __read_mostly = IPOIB_TX_RING_SIZE; | ||
| 58 | int ipoib_recvq_size __read_mostly = IPOIB_RX_RING_SIZE; | ||
| 59 | |||
| 60 | module_param_named(send_queue_size, ipoib_sendq_size, int, 0444); | ||
| 61 | MODULE_PARM_DESC(send_queue_size, "Number of descriptors in send queue"); | ||
| 62 | module_param_named(recv_queue_size, ipoib_recvq_size, int, 0444); | ||
| 63 | MODULE_PARM_DESC(recv_queue_size, "Number of descriptors in receive queue"); | ||
| 64 | |||
| 56 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG | 65 | #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG |
| 57 | int ipoib_debug_level; | 66 | int ipoib_debug_level; |
| 58 | 67 | ||
| @@ -252,8 +261,8 @@ static void path_free(struct net_device *dev, struct ipoib_path *path) | |||
| 252 | */ | 261 | */ |
| 253 | if (neigh->ah) | 262 | if (neigh->ah) |
| 254 | ipoib_put_ah(neigh->ah); | 263 | ipoib_put_ah(neigh->ah); |
| 255 | *to_ipoib_neigh(neigh->neighbour) = NULL; | 264 | |
| 256 | kfree(neigh); | 265 | ipoib_neigh_free(neigh); |
| 257 | } | 266 | } |
| 258 | 267 | ||
| 259 | spin_unlock_irqrestore(&priv->lock, flags); | 268 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -327,9 +336,8 @@ void ipoib_flush_paths(struct net_device *dev) | |||
| 327 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 336 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 328 | struct ipoib_path *path, *tp; | 337 | struct ipoib_path *path, *tp; |
| 329 | LIST_HEAD(remove_list); | 338 | LIST_HEAD(remove_list); |
| 330 | unsigned long flags; | ||
| 331 | 339 | ||
| 332 | spin_lock_irqsave(&priv->lock, flags); | 340 | spin_lock_irq(&priv->lock); |
| 333 | 341 | ||
| 334 | list_splice(&priv->path_list, &remove_list); | 342 | list_splice(&priv->path_list, &remove_list); |
| 335 | INIT_LIST_HEAD(&priv->path_list); | 343 | INIT_LIST_HEAD(&priv->path_list); |
| @@ -337,14 +345,15 @@ void ipoib_flush_paths(struct net_device *dev) | |||
| 337 | list_for_each_entry(path, &remove_list, list) | 345 | list_for_each_entry(path, &remove_list, list) |
| 338 | rb_erase(&path->rb_node, &priv->path_tree); | 346 | rb_erase(&path->rb_node, &priv->path_tree); |
| 339 | 347 | ||
| 340 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 341 | |||
| 342 | list_for_each_entry_safe(path, tp, &remove_list, list) { | 348 | list_for_each_entry_safe(path, tp, &remove_list, list) { |
| 343 | if (path->query) | 349 | if (path->query) |
| 344 | ib_sa_cancel_query(path->query_id, path->query); | 350 | ib_sa_cancel_query(path->query_id, path->query); |
| 351 | spin_unlock_irq(&priv->lock); | ||
| 345 | wait_for_completion(&path->done); | 352 | wait_for_completion(&path->done); |
| 346 | path_free(dev, path); | 353 | path_free(dev, path); |
| 354 | spin_lock_irq(&priv->lock); | ||
| 347 | } | 355 | } |
| 356 | spin_unlock_irq(&priv->lock); | ||
| 348 | } | 357 | } |
| 349 | 358 | ||
| 350 | static void path_rec_completion(int status, | 359 | static void path_rec_completion(int status, |
| @@ -373,16 +382,9 @@ static void path_rec_completion(int status, | |||
| 373 | struct ib_ah_attr av = { | 382 | struct ib_ah_attr av = { |
| 374 | .dlid = be16_to_cpu(pathrec->dlid), | 383 | .dlid = be16_to_cpu(pathrec->dlid), |
| 375 | .sl = pathrec->sl, | 384 | .sl = pathrec->sl, |
| 376 | .port_num = priv->port | 385 | .port_num = priv->port, |
| 386 | .static_rate = pathrec->rate | ||
| 377 | }; | 387 | }; |
| 378 | int path_rate = ib_sa_rate_enum_to_int(pathrec->rate); | ||
| 379 | |||
| 380 | if (path_rate > 0 && priv->local_rate > path_rate) | ||
| 381 | av.static_rate = (priv->local_rate - 1) / path_rate; | ||
| 382 | |||
| 383 | ipoib_dbg(priv, "static_rate %d for local port %dX, path %dX\n", | ||
| 384 | av.static_rate, priv->local_rate, | ||
| 385 | ib_sa_rate_enum_to_int(pathrec->rate)); | ||
| 386 | 388 | ||
| 387 | ah = ipoib_create_ah(dev, priv->pd, &av); | 389 | ah = ipoib_create_ah(dev, priv->pd, &av); |
| 388 | } | 390 | } |
| @@ -481,7 +483,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
| 481 | struct ipoib_path *path; | 483 | struct ipoib_path *path; |
| 482 | struct ipoib_neigh *neigh; | 484 | struct ipoib_neigh *neigh; |
| 483 | 485 | ||
| 484 | neigh = kmalloc(sizeof *neigh, GFP_ATOMIC); | 486 | neigh = ipoib_neigh_alloc(skb->dst->neighbour); |
| 485 | if (!neigh) { | 487 | if (!neigh) { |
| 486 | ++priv->stats.tx_dropped; | 488 | ++priv->stats.tx_dropped; |
| 487 | dev_kfree_skb_any(skb); | 489 | dev_kfree_skb_any(skb); |
| @@ -489,8 +491,6 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
| 489 | } | 491 | } |
| 490 | 492 | ||
| 491 | skb_queue_head_init(&neigh->queue); | 493 | skb_queue_head_init(&neigh->queue); |
| 492 | neigh->neighbour = skb->dst->neighbour; | ||
| 493 | *to_ipoib_neigh(skb->dst->neighbour) = neigh; | ||
| 494 | 494 | ||
| 495 | /* | 495 | /* |
| 496 | * We can only be called from ipoib_start_xmit, so we're | 496 | * We can only be called from ipoib_start_xmit, so we're |
| @@ -503,7 +503,7 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
| 503 | path = path_rec_create(dev, | 503 | path = path_rec_create(dev, |
| 504 | (union ib_gid *) (skb->dst->neighbour->ha + 4)); | 504 | (union ib_gid *) (skb->dst->neighbour->ha + 4)); |
| 505 | if (!path) | 505 | if (!path) |
| 506 | goto err; | 506 | goto err_path; |
| 507 | 507 | ||
| 508 | __path_add(dev, path); | 508 | __path_add(dev, path); |
| 509 | } | 509 | } |
| @@ -521,17 +521,17 @@ static void neigh_add_path(struct sk_buff *skb, struct net_device *dev) | |||
| 521 | __skb_queue_tail(&neigh->queue, skb); | 521 | __skb_queue_tail(&neigh->queue, skb); |
| 522 | 522 | ||
| 523 | if (!path->query && path_rec_start(dev, path)) | 523 | if (!path->query && path_rec_start(dev, path)) |
| 524 | goto err; | 524 | goto err_list; |
| 525 | } | 525 | } |
| 526 | 526 | ||
| 527 | spin_unlock(&priv->lock); | 527 | spin_unlock(&priv->lock); |
| 528 | return; | 528 | return; |
| 529 | 529 | ||
| 530 | err: | 530 | err_list: |
| 531 | *to_ipoib_neigh(skb->dst->neighbour) = NULL; | ||
| 532 | list_del(&neigh->list); | 531 | list_del(&neigh->list); |
| 533 | kfree(neigh); | ||
| 534 | 532 | ||
| 533 | err_path: | ||
| 534 | ipoib_neigh_free(neigh); | ||
| 535 | ++priv->stats.tx_dropped; | 535 | ++priv->stats.tx_dropped; |
| 536 | dev_kfree_skb_any(skb); | 536 | dev_kfree_skb_any(skb); |
| 537 | 537 | ||
| @@ -763,8 +763,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
| 763 | if (neigh->ah) | 763 | if (neigh->ah) |
| 764 | ah = neigh->ah; | 764 | ah = neigh->ah; |
| 765 | list_del(&neigh->list); | 765 | list_del(&neigh->list); |
| 766 | *to_ipoib_neigh(n) = NULL; | 766 | ipoib_neigh_free(neigh); |
| 767 | kfree(neigh); | ||
| 768 | } | 767 | } |
| 769 | 768 | ||
| 770 | spin_unlock_irqrestore(&priv->lock, flags); | 769 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -773,6 +772,26 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
| 773 | ipoib_put_ah(ah); | 772 | ipoib_put_ah(ah); |
| 774 | } | 773 | } |
| 775 | 774 | ||
| 775 | struct ipoib_neigh *ipoib_neigh_alloc(struct neighbour *neighbour) | ||
| 776 | { | ||
| 777 | struct ipoib_neigh *neigh; | ||
| 778 | |||
| 779 | neigh = kmalloc(sizeof *neigh, GFP_ATOMIC); | ||
| 780 | if (!neigh) | ||
| 781 | return NULL; | ||
| 782 | |||
| 783 | neigh->neighbour = neighbour; | ||
| 784 | *to_ipoib_neigh(neighbour) = neigh; | ||
| 785 | |||
| 786 | return neigh; | ||
| 787 | } | ||
| 788 | |||
| 789 | void ipoib_neigh_free(struct ipoib_neigh *neigh) | ||
| 790 | { | ||
| 791 | *to_ipoib_neigh(neigh->neighbour) = NULL; | ||
| 792 | kfree(neigh); | ||
| 793 | } | ||
| 794 | |||
| 776 | static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) | 795 | static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) |
| 777 | { | 796 | { |
| 778 | parms->neigh_destructor = ipoib_neigh_destructor; | 797 | parms->neigh_destructor = ipoib_neigh_destructor; |
| @@ -785,20 +804,19 @@ int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port) | |||
| 785 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 804 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 786 | 805 | ||
| 787 | /* Allocate RX/TX "rings" to hold queued skbs */ | 806 | /* Allocate RX/TX "rings" to hold queued skbs */ |
| 788 | 807 | priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring, | |
| 789 | priv->rx_ring = kzalloc(IPOIB_RX_RING_SIZE * sizeof (struct ipoib_rx_buf), | ||
| 790 | GFP_KERNEL); | 808 | GFP_KERNEL); |
| 791 | if (!priv->rx_ring) { | 809 | if (!priv->rx_ring) { |
| 792 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", | 810 | printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n", |
| 793 | ca->name, IPOIB_RX_RING_SIZE); | 811 | ca->name, ipoib_recvq_size); |
| 794 | goto out; | 812 | goto out; |
| 795 | } | 813 | } |
| 796 | 814 | ||
| 797 | priv->tx_ring = kzalloc(IPOIB_TX_RING_SIZE * sizeof (struct ipoib_tx_buf), | 815 | priv->tx_ring = kzalloc(ipoib_sendq_size * sizeof *priv->tx_ring, |
| 798 | GFP_KERNEL); | 816 | GFP_KERNEL); |
| 799 | if (!priv->tx_ring) { | 817 | if (!priv->tx_ring) { |
| 800 | printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", | 818 | printk(KERN_WARNING "%s: failed to allocate TX ring (%d entries)\n", |
| 801 | ca->name, IPOIB_TX_RING_SIZE); | 819 | ca->name, ipoib_sendq_size); |
| 802 | goto out_rx_ring_cleanup; | 820 | goto out_rx_ring_cleanup; |
| 803 | } | 821 | } |
| 804 | 822 | ||
| @@ -866,7 +884,7 @@ static void ipoib_setup(struct net_device *dev) | |||
| 866 | dev->hard_header_len = IPOIB_ENCAP_LEN + INFINIBAND_ALEN; | 884 | dev->hard_header_len = IPOIB_ENCAP_LEN + INFINIBAND_ALEN; |
| 867 | dev->addr_len = INFINIBAND_ALEN; | 885 | dev->addr_len = INFINIBAND_ALEN; |
| 868 | dev->type = ARPHRD_INFINIBAND; | 886 | dev->type = ARPHRD_INFINIBAND; |
| 869 | dev->tx_queue_len = IPOIB_TX_RING_SIZE * 2; | 887 | dev->tx_queue_len = ipoib_sendq_size * 2; |
| 870 | dev->features = NETIF_F_VLAN_CHALLENGED | NETIF_F_LLTX; | 888 | dev->features = NETIF_F_VLAN_CHALLENGED | NETIF_F_LLTX; |
| 871 | 889 | ||
| 872 | /* MTU will be reset when mcast join happens */ | 890 | /* MTU will be reset when mcast join happens */ |
| @@ -1118,6 +1136,14 @@ static int __init ipoib_init_module(void) | |||
| 1118 | { | 1136 | { |
| 1119 | int ret; | 1137 | int ret; |
| 1120 | 1138 | ||
| 1139 | ipoib_recvq_size = roundup_pow_of_two(ipoib_recvq_size); | ||
| 1140 | ipoib_recvq_size = min(ipoib_recvq_size, IPOIB_MAX_QUEUE_SIZE); | ||
| 1141 | ipoib_recvq_size = max(ipoib_recvq_size, IPOIB_MIN_QUEUE_SIZE); | ||
| 1142 | |||
| 1143 | ipoib_sendq_size = roundup_pow_of_two(ipoib_sendq_size); | ||
| 1144 | ipoib_sendq_size = min(ipoib_sendq_size, IPOIB_MAX_QUEUE_SIZE); | ||
| 1145 | ipoib_sendq_size = max(ipoib_sendq_size, IPOIB_MIN_QUEUE_SIZE); | ||
| 1146 | |||
| 1121 | ret = ipoib_register_debugfs(); | 1147 | ret = ipoib_register_debugfs(); |
| 1122 | if (ret) | 1148 | if (ret) |
| 1123 | return ret; | 1149 | return ret; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 93c462eaf4fd..1dae4b238252 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
| @@ -114,8 +114,7 @@ static void ipoib_mcast_free(struct ipoib_mcast *mcast) | |||
| 114 | */ | 114 | */ |
| 115 | if (neigh->ah) | 115 | if (neigh->ah) |
| 116 | ipoib_put_ah(neigh->ah); | 116 | ipoib_put_ah(neigh->ah); |
| 117 | *to_ipoib_neigh(neigh->neighbour) = NULL; | 117 | ipoib_neigh_free(neigh); |
| 118 | kfree(neigh); | ||
| 119 | } | 118 | } |
| 120 | 119 | ||
| 121 | spin_unlock_irqrestore(&priv->lock, flags); | 120 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -251,6 +250,7 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
| 251 | .port_num = priv->port, | 250 | .port_num = priv->port, |
| 252 | .sl = mcast->mcmember.sl, | 251 | .sl = mcast->mcmember.sl, |
| 253 | .ah_flags = IB_AH_GRH, | 252 | .ah_flags = IB_AH_GRH, |
| 253 | .static_rate = mcast->mcmember.rate, | ||
| 254 | .grh = { | 254 | .grh = { |
| 255 | .flow_label = be32_to_cpu(mcast->mcmember.flow_label), | 255 | .flow_label = be32_to_cpu(mcast->mcmember.flow_label), |
| 256 | .hop_limit = mcast->mcmember.hop_limit, | 256 | .hop_limit = mcast->mcmember.hop_limit, |
| @@ -258,17 +258,8 @@ static int ipoib_mcast_join_finish(struct ipoib_mcast *mcast, | |||
| 258 | .traffic_class = mcast->mcmember.traffic_class | 258 | .traffic_class = mcast->mcmember.traffic_class |
| 259 | } | 259 | } |
| 260 | }; | 260 | }; |
| 261 | int path_rate = ib_sa_rate_enum_to_int(mcast->mcmember.rate); | ||
| 262 | |||
| 263 | av.grh.dgid = mcast->mcmember.mgid; | 261 | av.grh.dgid = mcast->mcmember.mgid; |
| 264 | 262 | ||
| 265 | if (path_rate > 0 && priv->local_rate > path_rate) | ||
| 266 | av.static_rate = (priv->local_rate - 1) / path_rate; | ||
| 267 | |||
| 268 | ipoib_dbg_mcast(priv, "static_rate %d for local port %dX, mcmember %dX\n", | ||
| 269 | av.static_rate, priv->local_rate, | ||
| 270 | ib_sa_rate_enum_to_int(mcast->mcmember.rate)); | ||
| 271 | |||
| 272 | ah = ipoib_create_ah(dev, priv->pd, &av); | 263 | ah = ipoib_create_ah(dev, priv->pd, &av); |
| 273 | if (!ah) { | 264 | if (!ah) { |
| 274 | ipoib_warn(priv, "ib_address_create failed\n"); | 265 | ipoib_warn(priv, "ib_address_create failed\n"); |
| @@ -618,6 +609,22 @@ int ipoib_mcast_start_thread(struct net_device *dev) | |||
| 618 | return 0; | 609 | return 0; |
| 619 | } | 610 | } |
| 620 | 611 | ||
| 612 | static void wait_for_mcast_join(struct ipoib_dev_priv *priv, | ||
| 613 | struct ipoib_mcast *mcast) | ||
| 614 | { | ||
| 615 | spin_lock_irq(&priv->lock); | ||
| 616 | if (mcast && mcast->query) { | ||
| 617 | ib_sa_cancel_query(mcast->query_id, mcast->query); | ||
| 618 | mcast->query = NULL; | ||
| 619 | spin_unlock_irq(&priv->lock); | ||
| 620 | ipoib_dbg_mcast(priv, "waiting for MGID " IPOIB_GID_FMT "\n", | ||
| 621 | IPOIB_GID_ARG(mcast->mcmember.mgid)); | ||
| 622 | wait_for_completion(&mcast->done); | ||
| 623 | } | ||
| 624 | else | ||
| 625 | spin_unlock_irq(&priv->lock); | ||
| 626 | } | ||
| 627 | |||
| 621 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush) | 628 | int ipoib_mcast_stop_thread(struct net_device *dev, int flush) |
| 622 | { | 629 | { |
| 623 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 630 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| @@ -637,28 +644,10 @@ int ipoib_mcast_stop_thread(struct net_device *dev, int flush) | |||
| 637 | if (flush) | 644 | if (flush) |
| 638 | flush_workqueue(ipoib_workqueue); | 645 | flush_workqueue(ipoib_workqueue); |
| 639 | 646 | ||
| 640 | spin_lock_irq(&priv->lock); | 647 | wait_for_mcast_join(priv, priv->broadcast); |
| 641 | if (priv->broadcast && priv->broadcast->query) { | ||
| 642 | ib_sa_cancel_query(priv->broadcast->query_id, priv->broadcast->query); | ||
| 643 | priv->broadcast->query = NULL; | ||
| 644 | spin_unlock_irq(&priv->lock); | ||
| 645 | ipoib_dbg_mcast(priv, "waiting for bcast\n"); | ||
| 646 | wait_for_completion(&priv->broadcast->done); | ||
| 647 | } else | ||
| 648 | spin_unlock_irq(&priv->lock); | ||
| 649 | 648 | ||
| 650 | list_for_each_entry(mcast, &priv->multicast_list, list) { | 649 | list_for_each_entry(mcast, &priv->multicast_list, list) |
| 651 | spin_lock_irq(&priv->lock); | 650 | wait_for_mcast_join(priv, mcast); |
| 652 | if (mcast->query) { | ||
| 653 | ib_sa_cancel_query(mcast->query_id, mcast->query); | ||
| 654 | mcast->query = NULL; | ||
| 655 | spin_unlock_irq(&priv->lock); | ||
| 656 | ipoib_dbg_mcast(priv, "waiting for MGID " IPOIB_GID_FMT "\n", | ||
| 657 | IPOIB_GID_ARG(mcast->mcmember.mgid)); | ||
| 658 | wait_for_completion(&mcast->done); | ||
| 659 | } else | ||
| 660 | spin_unlock_irq(&priv->lock); | ||
| 661 | } | ||
| 662 | 651 | ||
| 663 | return 0; | 652 | return 0; |
| 664 | } | 653 | } |
| @@ -772,13 +761,11 @@ out: | |||
| 772 | if (skb->dst && | 761 | if (skb->dst && |
| 773 | skb->dst->neighbour && | 762 | skb->dst->neighbour && |
| 774 | !*to_ipoib_neigh(skb->dst->neighbour)) { | 763 | !*to_ipoib_neigh(skb->dst->neighbour)) { |
| 775 | struct ipoib_neigh *neigh = kmalloc(sizeof *neigh, GFP_ATOMIC); | 764 | struct ipoib_neigh *neigh = ipoib_neigh_alloc(skb->dst->neighbour); |
| 776 | 765 | ||
| 777 | if (neigh) { | 766 | if (neigh) { |
| 778 | kref_get(&mcast->ah->ref); | 767 | kref_get(&mcast->ah->ref); |
| 779 | neigh->ah = mcast->ah; | 768 | neigh->ah = mcast->ah; |
| 780 | neigh->neighbour = skb->dst->neighbour; | ||
| 781 | *to_ipoib_neigh(skb->dst->neighbour) = neigh; | ||
| 782 | list_add_tail(&neigh->list, &mcast->neigh_list); | 769 | list_add_tail(&neigh->list, &mcast->neigh_list); |
| 783 | } | 770 | } |
| 784 | } | 771 | } |
| @@ -913,6 +900,7 @@ void ipoib_mcast_restart_task(void *dev_ptr) | |||
| 913 | 900 | ||
| 914 | /* We have to cancel outside of the spinlock */ | 901 | /* We have to cancel outside of the spinlock */ |
| 915 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { | 902 | list_for_each_entry_safe(mcast, tmcast, &remove_list, list) { |
| 903 | wait_for_mcast_join(priv, mcast); | ||
| 916 | ipoib_mcast_leave(mcast->dev, mcast); | 904 | ipoib_mcast_leave(mcast->dev, mcast); |
| 917 | ipoib_mcast_free(mcast); | 905 | ipoib_mcast_free(mcast); |
| 918 | } | 906 | } |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c index 5f0388027b25..1d49d1643c59 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c | |||
| @@ -159,8 +159,8 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) | |||
| 159 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 159 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
| 160 | struct ib_qp_init_attr init_attr = { | 160 | struct ib_qp_init_attr init_attr = { |
| 161 | .cap = { | 161 | .cap = { |
| 162 | .max_send_wr = IPOIB_TX_RING_SIZE, | 162 | .max_send_wr = ipoib_sendq_size, |
| 163 | .max_recv_wr = IPOIB_RX_RING_SIZE, | 163 | .max_recv_wr = ipoib_recvq_size, |
| 164 | .max_send_sge = 1, | 164 | .max_send_sge = 1, |
| 165 | .max_recv_sge = 1 | 165 | .max_recv_sge = 1 |
| 166 | }, | 166 | }, |
| @@ -175,7 +175,7 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) | |||
| 175 | } | 175 | } |
| 176 | 176 | ||
| 177 | priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, | 177 | priv->cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, |
| 178 | IPOIB_TX_RING_SIZE + IPOIB_RX_RING_SIZE + 1); | 178 | ipoib_sendq_size + ipoib_recvq_size + 1); |
| 179 | if (IS_ERR(priv->cq)) { | 179 | if (IS_ERR(priv->cq)) { |
| 180 | printk(KERN_WARNING "%s: failed to create CQ\n", ca->name); | 180 | printk(KERN_WARNING "%s: failed to create CQ\n", ca->name); |
| 181 | goto out_free_pd; | 181 | goto out_free_pd; |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index fd8a95a9c5d3..5f2b3f6e4c47 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
| @@ -1434,6 +1434,7 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target) | |||
| 1434 | p = match_strdup(args); | 1434 | p = match_strdup(args); |
| 1435 | if (strlen(p) != 32) { | 1435 | if (strlen(p) != 32) { |
| 1436 | printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p); | 1436 | printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p); |
| 1437 | kfree(p); | ||
| 1437 | goto out; | 1438 | goto out; |
| 1438 | } | 1439 | } |
| 1439 | 1440 | ||
diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index a0927d1b7a0c..918742271c79 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c | |||
| @@ -109,7 +109,7 @@ isdn_ppp_free(isdn_net_local * lp) | |||
| 109 | { | 109 | { |
| 110 | struct ippp_struct *is; | 110 | struct ippp_struct *is; |
| 111 | 111 | ||
| 112 | if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { | 112 | if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { |
| 113 | printk(KERN_ERR "%s: ppp_slot(%d) out of range\n", | 113 | printk(KERN_ERR "%s: ppp_slot(%d) out of range\n", |
| 114 | __FUNCTION__, lp->ppp_slot); | 114 | __FUNCTION__, lp->ppp_slot); |
| 115 | return 0; | 115 | return 0; |
| @@ -126,7 +126,7 @@ isdn_ppp_free(isdn_net_local * lp) | |||
| 126 | lp->netdev->pb->ref_ct--; | 126 | lp->netdev->pb->ref_ct--; |
| 127 | spin_unlock(&lp->netdev->pb->lock); | 127 | spin_unlock(&lp->netdev->pb->lock); |
| 128 | #endif /* CONFIG_ISDN_MPP */ | 128 | #endif /* CONFIG_ISDN_MPP */ |
| 129 | if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { | 129 | if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { |
| 130 | printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n", | 130 | printk(KERN_ERR "%s: ppp_slot(%d) now invalid\n", |
| 131 | __FUNCTION__, lp->ppp_slot); | 131 | __FUNCTION__, lp->ppp_slot); |
| 132 | return 0; | 132 | return 0; |
| @@ -279,7 +279,7 @@ isdn_ppp_open(int min, struct file *file) | |||
| 279 | int slot; | 279 | int slot; |
| 280 | struct ippp_struct *is; | 280 | struct ippp_struct *is; |
| 281 | 281 | ||
| 282 | if (min < 0 || min > ISDN_MAX_CHANNELS) | 282 | if (min < 0 || min >= ISDN_MAX_CHANNELS) |
| 283 | return -ENODEV; | 283 | return -ENODEV; |
| 284 | 284 | ||
| 285 | slot = isdn_ppp_get_slot(); | 285 | slot = isdn_ppp_get_slot(); |
| @@ -1042,7 +1042,7 @@ isdn_ppp_push_higher(isdn_net_dev * net_dev, isdn_net_local * lp, struct sk_buff | |||
| 1042 | if (lp->master) { // FIXME? | 1042 | if (lp->master) { // FIXME? |
| 1043 | mlp = (isdn_net_local *) lp->master->priv; | 1043 | mlp = (isdn_net_local *) lp->master->priv; |
| 1044 | slot = mlp->ppp_slot; | 1044 | slot = mlp->ppp_slot; |
| 1045 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 1045 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 1046 | printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n", | 1046 | printk(KERN_ERR "isdn_ppp_push_higher: master->ppp_slot(%d)\n", |
| 1047 | lp->ppp_slot); | 1047 | lp->ppp_slot); |
| 1048 | goto drop_packet; | 1048 | goto drop_packet; |
| @@ -1264,7 +1264,7 @@ isdn_ppp_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
| 1264 | /* we have our lp locked from now on */ | 1264 | /* we have our lp locked from now on */ |
| 1265 | 1265 | ||
| 1266 | slot = lp->ppp_slot; | 1266 | slot = lp->ppp_slot; |
| 1267 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 1267 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 1268 | printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n", | 1268 | printk(KERN_ERR "isdn_ppp_xmit: lp->ppp_slot(%d)\n", |
| 1269 | lp->ppp_slot); | 1269 | lp->ppp_slot); |
| 1270 | kfree_skb(skb); | 1270 | kfree_skb(skb); |
| @@ -1603,7 +1603,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, | |||
| 1603 | mp = net_dev->pb; | 1603 | mp = net_dev->pb; |
| 1604 | stats = &mp->stats; | 1604 | stats = &mp->stats; |
| 1605 | slot = lp->ppp_slot; | 1605 | slot = lp->ppp_slot; |
| 1606 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 1606 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 1607 | printk(KERN_ERR "%s: lp->ppp_slot(%d)\n", | 1607 | printk(KERN_ERR "%s: lp->ppp_slot(%d)\n", |
| 1608 | __FUNCTION__, lp->ppp_slot); | 1608 | __FUNCTION__, lp->ppp_slot); |
| 1609 | stats->frame_drops++; | 1609 | stats->frame_drops++; |
| @@ -1640,7 +1640,7 @@ static void isdn_ppp_mp_receive(isdn_net_dev * net_dev, isdn_net_local * lp, | |||
| 1640 | is->last_link_seqno = minseq = newseq; | 1640 | is->last_link_seqno = minseq = newseq; |
| 1641 | for (lpq = net_dev->queue;;) { | 1641 | for (lpq = net_dev->queue;;) { |
| 1642 | slot = lpq->ppp_slot; | 1642 | slot = lpq->ppp_slot; |
| 1643 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 1643 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 1644 | printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n", | 1644 | printk(KERN_ERR "%s: lpq->ppp_slot(%d)\n", |
| 1645 | __FUNCTION__, lpq->ppp_slot); | 1645 | __FUNCTION__, lpq->ppp_slot); |
| 1646 | } else { | 1646 | } else { |
| @@ -2648,7 +2648,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, | |||
| 2648 | 2648 | ||
| 2649 | printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n", | 2649 | printk(KERN_DEBUG "Received CCP frame from peer slot(%d)\n", |
| 2650 | lp->ppp_slot); | 2650 | lp->ppp_slot); |
| 2651 | if (lp->ppp_slot < 0 || lp->ppp_slot > ISDN_MAX_CHANNELS) { | 2651 | if (lp->ppp_slot < 0 || lp->ppp_slot >= ISDN_MAX_CHANNELS) { |
| 2652 | printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n", | 2652 | printk(KERN_ERR "%s: lp->ppp_slot(%d) out of range\n", |
| 2653 | __FUNCTION__, lp->ppp_slot); | 2653 | __FUNCTION__, lp->ppp_slot); |
| 2654 | return; | 2654 | return; |
| @@ -2658,7 +2658,7 @@ static void isdn_ppp_receive_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, | |||
| 2658 | 2658 | ||
| 2659 | if(lp->master) { | 2659 | if(lp->master) { |
| 2660 | int slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; | 2660 | int slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; |
| 2661 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 2661 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 2662 | printk(KERN_ERR "%s: slot(%d) out of range\n", | 2662 | printk(KERN_ERR "%s: slot(%d) out of range\n", |
| 2663 | __FUNCTION__, slot); | 2663 | __FUNCTION__, slot); |
| 2664 | return; | 2664 | return; |
| @@ -2845,7 +2845,7 @@ static void isdn_ppp_send_ccp(isdn_net_dev *net_dev, isdn_net_local *lp, struct | |||
| 2845 | 2845 | ||
| 2846 | if (lp->master) { | 2846 | if (lp->master) { |
| 2847 | slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; | 2847 | slot = ((isdn_net_local *) (lp->master->priv))->ppp_slot; |
| 2848 | if (slot < 0 || slot > ISDN_MAX_CHANNELS) { | 2848 | if (slot < 0 || slot >= ISDN_MAX_CHANNELS) { |
| 2849 | printk(KERN_ERR "%s: slot(%d) out of range\n", | 2849 | printk(KERN_ERR "%s: slot(%d) out of range\n", |
| 2850 | __FUNCTION__, slot); | 2850 | __FUNCTION__, slot); |
| 2851 | return; | 2851 | return; |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 1ed5152db450..434ca39d19c1 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -163,6 +163,7 @@ void md_new_event(mddev_t *mddev) | |||
| 163 | { | 163 | { |
| 164 | atomic_inc(&md_event_count); | 164 | atomic_inc(&md_event_count); |
| 165 | wake_up(&md_event_waiters); | 165 | wake_up(&md_event_waiters); |
| 166 | sysfs_notify(&mddev->kobj, NULL, "sync_action"); | ||
| 166 | } | 167 | } |
| 167 | EXPORT_SYMBOL_GPL(md_new_event); | 168 | EXPORT_SYMBOL_GPL(md_new_event); |
| 168 | 169 | ||
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 010d4a39269b..e9716b10acea 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
| @@ -366,7 +366,15 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, | |||
| 366 | static int | 366 | static int |
| 367 | mptsas_slave_configure(struct scsi_device *sdev) | 367 | mptsas_slave_configure(struct scsi_device *sdev) |
| 368 | { | 368 | { |
| 369 | sas_read_port_mode_page(sdev); | 369 | struct Scsi_Host *host = sdev->host; |
| 370 | MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata; | ||
| 371 | |||
| 372 | /* | ||
| 373 | * RAID volumes placed beyond the last expected port. | ||
| 374 | * Ignore sending sas mode pages in that case.. | ||
| 375 | */ | ||
| 376 | if (sdev->channel < hd->ioc->num_ports) | ||
| 377 | sas_read_port_mode_page(sdev); | ||
| 370 | 378 | ||
| 371 | return mptscsih_slave_configure(sdev); | 379 | return mptscsih_slave_configure(sdev); |
| 372 | } | 380 | } |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index c4e12b5cbb92..3d306681919e 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) | 3 | * Copyright (C) 2002 David S. Miller (davem@redhat.com) |
| 4 | * Fixed by Pekka Pietikainen (pp@ee.oulu.fi) | 4 | * Fixed by Pekka Pietikainen (pp@ee.oulu.fi) |
| 5 | * Copyright (C) 2006 Broadcom Corporation. | ||
| 5 | * | 6 | * |
| 6 | * Distribute under GPL. | 7 | * Distribute under GPL. |
| 7 | */ | 8 | */ |
| @@ -28,8 +29,8 @@ | |||
| 28 | 29 | ||
| 29 | #define DRV_MODULE_NAME "b44" | 30 | #define DRV_MODULE_NAME "b44" |
| 30 | #define PFX DRV_MODULE_NAME ": " | 31 | #define PFX DRV_MODULE_NAME ": " |
| 31 | #define DRV_MODULE_VERSION "0.97" | 32 | #define DRV_MODULE_VERSION "1.00" |
| 32 | #define DRV_MODULE_RELDATE "Nov 30, 2005" | 33 | #define DRV_MODULE_RELDATE "Apr 7, 2006" |
| 33 | 34 | ||
| 34 | #define B44_DEF_MSG_ENABLE \ | 35 | #define B44_DEF_MSG_ENABLE \ |
| 35 | (NETIF_MSG_DRV | \ | 36 | (NETIF_MSG_DRV | \ |
| @@ -136,7 +137,7 @@ static inline unsigned long br32(const struct b44 *bp, unsigned long reg) | |||
| 136 | return readl(bp->regs + reg); | 137 | return readl(bp->regs + reg); |
| 137 | } | 138 | } |
| 138 | 139 | ||
| 139 | static inline void bw32(const struct b44 *bp, | 140 | static inline void bw32(const struct b44 *bp, |
| 140 | unsigned long reg, unsigned long val) | 141 | unsigned long reg, unsigned long val) |
| 141 | { | 142 | { |
| 142 | writel(val, bp->regs + reg); | 143 | writel(val, bp->regs + reg); |
| @@ -286,13 +287,13 @@ static void __b44_cam_write(struct b44 *bp, unsigned char *data, int index) | |||
| 286 | val |= ((u32) data[4]) << 8; | 287 | val |= ((u32) data[4]) << 8; |
| 287 | val |= ((u32) data[5]) << 0; | 288 | val |= ((u32) data[5]) << 0; |
| 288 | bw32(bp, B44_CAM_DATA_LO, val); | 289 | bw32(bp, B44_CAM_DATA_LO, val); |
| 289 | val = (CAM_DATA_HI_VALID | | 290 | val = (CAM_DATA_HI_VALID | |
| 290 | (((u32) data[0]) << 8) | | 291 | (((u32) data[0]) << 8) | |
| 291 | (((u32) data[1]) << 0)); | 292 | (((u32) data[1]) << 0)); |
| 292 | bw32(bp, B44_CAM_DATA_HI, val); | 293 | bw32(bp, B44_CAM_DATA_HI, val); |
| 293 | bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE | | 294 | bw32(bp, B44_CAM_CTRL, (CAM_CTRL_WRITE | |
| 294 | (index << CAM_CTRL_INDEX_SHIFT))); | 295 | (index << CAM_CTRL_INDEX_SHIFT))); |
| 295 | b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); | 296 | b44_wait_bit(bp, B44_CAM_CTRL, CAM_CTRL_BUSY, 100, 1); |
| 296 | } | 297 | } |
| 297 | 298 | ||
| 298 | static inline void __b44_disable_ints(struct b44 *bp) | 299 | static inline void __b44_disable_ints(struct b44 *bp) |
| @@ -410,25 +411,18 @@ static void __b44_set_flow_ctrl(struct b44 *bp, u32 pause_flags) | |||
| 410 | 411 | ||
| 411 | static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote) | 412 | static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote) |
| 412 | { | 413 | { |
| 413 | u32 pause_enab = bp->flags & (B44_FLAG_TX_PAUSE | | 414 | u32 pause_enab = 0; |
| 414 | B44_FLAG_RX_PAUSE); | ||
| 415 | 415 | ||
| 416 | if (local & ADVERTISE_PAUSE_CAP) { | 416 | /* The driver supports only rx pause by default because |
| 417 | if (local & ADVERTISE_PAUSE_ASYM) { | 417 | the b44 mac tx pause mechanism generates excessive |
| 418 | if (remote & LPA_PAUSE_CAP) | 418 | pause frames. |
| 419 | pause_enab |= (B44_FLAG_TX_PAUSE | | 419 | Use ethtool to turn on b44 tx pause if necessary. |
| 420 | B44_FLAG_RX_PAUSE); | 420 | */ |
| 421 | else if (remote & LPA_PAUSE_ASYM) | 421 | if ((local & ADVERTISE_PAUSE_CAP) && |
| 422 | pause_enab |= B44_FLAG_RX_PAUSE; | 422 | (local & ADVERTISE_PAUSE_ASYM)){ |
| 423 | } else { | 423 | if ((remote & LPA_PAUSE_ASYM) && |
| 424 | if (remote & LPA_PAUSE_CAP) | 424 | !(remote & LPA_PAUSE_CAP)) |
| 425 | pause_enab |= (B44_FLAG_TX_PAUSE | | 425 | pause_enab |= B44_FLAG_RX_PAUSE; |
| 426 | B44_FLAG_RX_PAUSE); | ||
| 427 | } | ||
| 428 | } else if (local & ADVERTISE_PAUSE_ASYM) { | ||
| 429 | if ((remote & LPA_PAUSE_CAP) && | ||
| 430 | (remote & LPA_PAUSE_ASYM)) | ||
| 431 | pause_enab |= B44_FLAG_TX_PAUSE; | ||
| 432 | } | 426 | } |
| 433 | 427 | ||
| 434 | __b44_set_flow_ctrl(bp, pause_enab); | 428 | __b44_set_flow_ctrl(bp, pause_enab); |
| @@ -1063,7 +1057,7 @@ static int b44_change_mtu(struct net_device *dev, int new_mtu) | |||
| 1063 | spin_unlock_irq(&bp->lock); | 1057 | spin_unlock_irq(&bp->lock); |
| 1064 | 1058 | ||
| 1065 | b44_enable_ints(bp); | 1059 | b44_enable_ints(bp); |
| 1066 | 1060 | ||
| 1067 | return 0; | 1061 | return 0; |
| 1068 | } | 1062 | } |
| 1069 | 1063 | ||
| @@ -1381,7 +1375,7 @@ static void b44_init_hw(struct b44 *bp) | |||
| 1381 | bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset); | 1375 | bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset); |
| 1382 | 1376 | ||
| 1383 | bw32(bp, B44_DMARX_PTR, bp->rx_pending); | 1377 | bw32(bp, B44_DMARX_PTR, bp->rx_pending); |
| 1384 | bp->rx_prod = bp->rx_pending; | 1378 | bp->rx_prod = bp->rx_pending; |
| 1385 | 1379 | ||
| 1386 | bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); | 1380 | bw32(bp, B44_MIB_CTRL, MIB_CTRL_CLR_ON_READ); |
| 1387 | 1381 | ||
| @@ -1553,9 +1547,9 @@ static void __b44_set_rx_mode(struct net_device *dev) | |||
| 1553 | val |= RXCONFIG_ALLMULTI; | 1547 | val |= RXCONFIG_ALLMULTI; |
| 1554 | else | 1548 | else |
| 1555 | i = __b44_load_mcast(bp, dev); | 1549 | i = __b44_load_mcast(bp, dev); |
| 1556 | 1550 | ||
| 1557 | for (; i < 64; i++) { | 1551 | for (; i < 64; i++) { |
| 1558 | __b44_cam_write(bp, zero, i); | 1552 | __b44_cam_write(bp, zero, i); |
| 1559 | } | 1553 | } |
| 1560 | bw32(bp, B44_RXCONFIG, val); | 1554 | bw32(bp, B44_RXCONFIG, val); |
| 1561 | val = br32(bp, B44_CAM_CTRL); | 1555 | val = br32(bp, B44_CAM_CTRL); |
| @@ -1737,7 +1731,7 @@ static int b44_set_ringparam(struct net_device *dev, | |||
| 1737 | spin_unlock_irq(&bp->lock); | 1731 | spin_unlock_irq(&bp->lock); |
| 1738 | 1732 | ||
| 1739 | b44_enable_ints(bp); | 1733 | b44_enable_ints(bp); |
| 1740 | 1734 | ||
| 1741 | return 0; | 1735 | return 0; |
| 1742 | } | 1736 | } |
| 1743 | 1737 | ||
| @@ -1782,7 +1776,7 @@ static int b44_set_pauseparam(struct net_device *dev, | |||
| 1782 | spin_unlock_irq(&bp->lock); | 1776 | spin_unlock_irq(&bp->lock); |
| 1783 | 1777 | ||
| 1784 | b44_enable_ints(bp); | 1778 | b44_enable_ints(bp); |
| 1785 | 1779 | ||
| 1786 | return 0; | 1780 | return 0; |
| 1787 | } | 1781 | } |
| 1788 | 1782 | ||
| @@ -1898,7 +1892,7 @@ static int __devinit b44_get_invariants(struct b44 *bp) | |||
| 1898 | bp->core_unit = ssb_core_unit(bp); | 1892 | bp->core_unit = ssb_core_unit(bp); |
| 1899 | bp->dma_offset = SB_PCI_DMA; | 1893 | bp->dma_offset = SB_PCI_DMA; |
| 1900 | 1894 | ||
| 1901 | /* XXX - really required? | 1895 | /* XXX - really required? |
| 1902 | bp->flags |= B44_FLAG_BUGGY_TXPTR; | 1896 | bp->flags |= B44_FLAG_BUGGY_TXPTR; |
| 1903 | */ | 1897 | */ |
| 1904 | out: | 1898 | out: |
| @@ -1946,7 +1940,7 @@ static int __devinit b44_init_one(struct pci_dev *pdev, | |||
| 1946 | "aborting.\n"); | 1940 | "aborting.\n"); |
| 1947 | goto err_out_free_res; | 1941 | goto err_out_free_res; |
| 1948 | } | 1942 | } |
| 1949 | 1943 | ||
| 1950 | err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); | 1944 | err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); |
| 1951 | if (err) { | 1945 | if (err) { |
| 1952 | printk(KERN_ERR PFX "No usable DMA configuration, " | 1946 | printk(KERN_ERR PFX "No usable DMA configuration, " |
| @@ -2041,9 +2035,9 @@ static int __devinit b44_init_one(struct pci_dev *pdev, | |||
| 2041 | 2035 | ||
| 2042 | pci_save_state(bp->pdev); | 2036 | pci_save_state(bp->pdev); |
| 2043 | 2037 | ||
| 2044 | /* Chip reset provides power to the b44 MAC & PCI cores, which | 2038 | /* Chip reset provides power to the b44 MAC & PCI cores, which |
| 2045 | * is necessary for MAC register access. | 2039 | * is necessary for MAC register access. |
| 2046 | */ | 2040 | */ |
| 2047 | b44_chip_reset(bp); | 2041 | b44_chip_reset(bp); |
| 2048 | 2042 | ||
| 2049 | printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name); | 2043 | printk(KERN_INFO "%s: Broadcom 4400 10/100BaseT Ethernet ", dev->name); |
| @@ -2091,10 +2085,10 @@ static int b44_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 2091 | 2085 | ||
| 2092 | del_timer_sync(&bp->timer); | 2086 | del_timer_sync(&bp->timer); |
| 2093 | 2087 | ||
| 2094 | spin_lock_irq(&bp->lock); | 2088 | spin_lock_irq(&bp->lock); |
| 2095 | 2089 | ||
| 2096 | b44_halt(bp); | 2090 | b44_halt(bp); |
| 2097 | netif_carrier_off(bp->dev); | 2091 | netif_carrier_off(bp->dev); |
| 2098 | netif_device_detach(bp->dev); | 2092 | netif_device_detach(bp->dev); |
| 2099 | b44_free_rings(bp); | 2093 | b44_free_rings(bp); |
| 2100 | 2094 | ||
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 2671da20a496..5ca99e26660a 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -63,7 +63,7 @@ | |||
| 63 | /* Time in jiffies before concluding the transmitter is hung. */ | 63 | /* Time in jiffies before concluding the transmitter is hung. */ |
| 64 | #define TX_TIMEOUT (5*HZ) | 64 | #define TX_TIMEOUT (5*HZ) |
| 65 | 65 | ||
| 66 | static char version[] __devinitdata = | 66 | static const char version[] __devinitdata = |
| 67 | "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 67 | "Broadcom NetXtreme II Gigabit Ethernet Driver " DRV_MODULE_NAME " v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
| 68 | 68 | ||
| 69 | MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>"); | 69 | MODULE_AUTHOR("Michael Chan <mchan@broadcom.com>"); |
diff --git a/drivers/net/hydra.h b/drivers/net/hydra.h deleted file mode 100644 index 37414146258d..000000000000 --- a/drivers/net/hydra.h +++ /dev/null | |||
| @@ -1,177 +0,0 @@ | |||
| 1 | /* $Linux: hydra.h,v 1.0 1994/10/26 02:03:47 cgd Exp $ */ | ||
| 2 | |||
| 3 | /* | ||
| 4 | * Copyright (c) 1994 Timo Rossi | ||
| 5 | * All rights reserved. | ||
| 6 | * | ||
| 7 | * Redistribution and use in source and binary forms, with or without | ||
| 8 | * modification, are permitted provided that the following conditions | ||
| 9 | * are met: | ||
| 10 | * 1. Redistributions of source code must retain the above copyright | ||
| 11 | * notice, this list of conditions and the following disclaimer. | ||
| 12 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 13 | * notice, this list of conditions and the following disclaimer in the | ||
| 14 | * documentation and/or other materials provided with the distribution. | ||
| 15 | * 3. All advertising materials mentioning features or use of this software | ||
| 16 | * must display the following acknowledgement: | ||
| 17 | * This product includes software developed by Timo Rossi | ||
| 18 | * 4. The name of the author may not be used to endorse or promote products | ||
| 19 | * derived from this software without specific prior written permission | ||
| 20 | * | ||
| 21 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | ||
| 22 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
| 23 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | ||
| 24 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
| 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 26 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| 27 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| 28 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 29 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
| 30 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 31 | */ | ||
| 32 | |||
| 33 | /* | ||
| 34 | * The Hydra Systems card uses the National Semiconductor | ||
| 35 | * 8390 NIC (Network Interface Controller) chip, located | ||
| 36 | * at card base address + 0xffe1. NIC registers are accessible | ||
| 37 | * only at odd byte addresses, so the register offsets must | ||
| 38 | * be multiplied by two. | ||
| 39 | * | ||
| 40 | * Card address PROM is located at card base + 0xffc0 (even byte addresses) | ||
| 41 | * | ||
| 42 | * RAM starts at the card base address, and is 16K or 64K. | ||
| 43 | * The current Amiga NetBSD hydra driver is hardwired for 16K. | ||
| 44 | * It seems that the RAM should be accessed as words or longwords only. | ||
| 45 | * | ||
| 46 | */ | ||
| 47 | |||
| 48 | /* adapted for Linux by Topi Kanerva 03/29/95 | ||
| 49 | with original author's permission */ | ||
| 50 | |||
| 51 | #define HYDRA_NIC_BASE 0xffe1 | ||
| 52 | |||
| 53 | /* Page0 registers */ | ||
| 54 | |||
| 55 | #define NIC_CR 0 /* Command register */ | ||
| 56 | #define NIC_PSTART (1*2) /* Page start (write) */ | ||
| 57 | #define NIC_PSTOP (2*2) /* Page stop (write) */ | ||
| 58 | #define NIC_BNDRY (3*2) /* Boundary pointer */ | ||
| 59 | #define NIC_TSR (4*2) /* Transmit status (read) */ | ||
| 60 | #define NIC_TPSR (4*2) /* Transmit page start (write) */ | ||
| 61 | #define NIC_NCR (5*2) /* Number of collisions, read */ | ||
| 62 | #define NIC_TBCR0 (5*2) /* Transmit byte count low (write) */ | ||
| 63 | #define NIC_FIFO (6*2) /* FIFO reg. (read) */ | ||
| 64 | #define NIC_TBCR1 (6*2) /* Transmit byte count high (write) */ | ||
| 65 | #define NIC_ISR (7*2) /* Interrupt status register */ | ||
| 66 | #define NIC_RBCR0 (0xa*2) /* Remote byte count low (write) */ | ||
| 67 | #define NIC_RBCR1 (0xb*2) /* Remote byte count high (write) */ | ||
| 68 | #define NIC_RSR (0xc*2) /* Receive status (read) */ | ||
| 69 | #define NIC_RCR (0xc*2) /* Receive config (write) */ | ||
| 70 | #define NIC_CNTR0 (0xd*2) /* Frame alignment error count (read) */ | ||
| 71 | #define NIC_TCR (0xd*2) /* Transmit config (write) */ | ||
| 72 | #define NIC_CNTR1 (0xe*2) /* CRC error counter (read) */ | ||
| 73 | #define NIC_DCR (0xe*2) /* Data config (write) */ | ||
| 74 | #define NIC_CNTR2 (0xf*2) /* missed packet counter (read) */ | ||
| 75 | #define NIC_IMR (0xf*2) /* Interrupt mask reg. (write) */ | ||
| 76 | |||
| 77 | /* Page1 registers */ | ||
| 78 | |||
| 79 | #define NIC_PAR0 (1*2) /* Physical address */ | ||
| 80 | #define NIC_PAR1 (2*2) | ||
| 81 | #define NIC_PAR2 (3*2) | ||
| 82 | #define NIC_PAR3 (4*2) | ||
| 83 | #define NIC_PAR4 (5*2) | ||
| 84 | #define NIC_PAR5 (6*2) | ||
| 85 | #define NIC_CURR (7*2) /* Current RX ring-buffer page */ | ||
| 86 | #define NIC_MAR0 (8*2) /* Multicast address */ | ||
| 87 | #define NIC_MAR1 (9*2) | ||
| 88 | #define NIC_MAR2 (0xa*2) | ||
| 89 | #define NIC_MAR3 (0xb*2) | ||
| 90 | #define NIC_MAR4 (0xc*2) | ||
| 91 | #define NIC_MAR5 (0xd*2) | ||
| 92 | #define NIC_MAR6 (0xe*2) | ||
| 93 | #define NIC_MAR7 (0xf*2) | ||
| 94 | |||
| 95 | /* Command register definitions */ | ||
| 96 | |||
| 97 | #define CR_STOP 0x01 /* Stop -- software reset command */ | ||
| 98 | #define CR_START 0x02 /* Start */ | ||
| 99 | #define CR_TXP 0x04 /* Transmit packet */ | ||
| 100 | |||
| 101 | #define CR_RD0 0x08 /* Remote DMA cmd */ | ||
| 102 | #define CR_RD1 0x10 | ||
| 103 | #define CR_RD2 0x20 | ||
| 104 | |||
| 105 | #define CR_NODMA CR_RD2 | ||
| 106 | |||
| 107 | #define CR_PS0 0x40 /* Page select */ | ||
| 108 | #define CR_PS1 0x80 | ||
| 109 | |||
| 110 | #define CR_PAGE0 0 | ||
| 111 | #define CR_PAGE1 CR_PS0 | ||
| 112 | #define CR_PAGE2 CR_PS1 | ||
| 113 | |||
| 114 | /* Interrupt status reg. definitions */ | ||
| 115 | |||
| 116 | #define ISR_PRX 0x01 /* Packet received without errors */ | ||
| 117 | #define ISR_PTX 0x02 /* Packet transmitted without errors */ | ||
| 118 | #define ISR_RXE 0x04 /* Receive error */ | ||
| 119 | #define ISR_TXE 0x08 /* Transmit error */ | ||
| 120 | #define ISR_OVW 0x10 /* Ring buffer overrun */ | ||
| 121 | #define ISR_CNT 0x20 /* Counter overflow */ | ||
| 122 | #define ISR_RDC 0x40 /* Remote DMA compile */ | ||
| 123 | #define ISR_RST 0x80 /* Reset status */ | ||
| 124 | |||
| 125 | /* Data config reg. definitions */ | ||
| 126 | |||
| 127 | #define DCR_WTS 0x01 /* Word transfer select */ | ||
| 128 | #define DCR_BOS 0x02 /* Byte order select */ | ||
| 129 | #define DCR_LAS 0x04 /* Long address select */ | ||
| 130 | #define DCR_LS 0x08 /* Loopback select */ | ||
| 131 | #define DCR_AR 0x10 /* Auto-init remote */ | ||
| 132 | #define DCR_FT0 0x20 /* FIFO threshold select */ | ||
| 133 | #define DCR_FT1 0x40 | ||
| 134 | |||
| 135 | /* Transmit config reg. definitions */ | ||
| 136 | |||
| 137 | #define TCR_CRC 0x01 /* Inhibit CRC */ | ||
| 138 | #define TCR_LB0 0x02 /* Loopback control */ | ||
| 139 | #define TCR_LB1 0x04 | ||
| 140 | #define TCR_ATD 0x08 /* Auto transmit disable */ | ||
| 141 | #define TCR_OFST 0x10 /* Collision offset enable */ | ||
| 142 | |||
| 143 | /* Transmit status reg. definitions */ | ||
| 144 | |||
| 145 | #define TSR_PTX 0x01 /* Packet transmitted */ | ||
| 146 | #define TSR_COL 0x04 /* Transmit collided */ | ||
| 147 | #define TSR_ABT 0x08 /* Transmit aborted */ | ||
| 148 | #define TSR_CRS 0x10 /* Carrier sense lost */ | ||
| 149 | #define TSR_FU 0x20 /* FIFO underrun */ | ||
| 150 | #define TSR_CDH 0x40 /* CD Heartbeat */ | ||
| 151 | #define TSR_OWC 0x80 /* Out of Window Collision */ | ||
| 152 | |||
| 153 | /* Receiver config register definitions */ | ||
| 154 | |||
| 155 | #define RCR_SEP 0x01 /* Save errored packets */ | ||
| 156 | #define RCR_AR 0x02 /* Accept runt packets */ | ||
| 157 | #define RCR_AB 0x04 /* Accept broadcast */ | ||
| 158 | #define RCR_AM 0x08 /* Accept multicast */ | ||
| 159 | #define RCR_PRO 0x10 /* Promiscuous mode */ | ||
| 160 | #define RCR_MON 0x20 /* Monitor mode */ | ||
| 161 | |||
| 162 | /* Receiver status register definitions */ | ||
| 163 | |||
| 164 | #define RSR_PRX 0x01 /* Packet received without error */ | ||
| 165 | #define RSR_CRC 0x02 /* CRC error */ | ||
| 166 | #define RSR_FAE 0x04 /* Frame alignment error */ | ||
| 167 | #define RSR_FO 0x08 /* FIFO overrun */ | ||
| 168 | #define RSR_MPA 0x10 /* Missed packet */ | ||
| 169 | #define RSR_PHY 0x20 /* Physical address */ | ||
| 170 | #define RSR_DIS 0x40 /* Received disabled */ | ||
| 171 | #define RSR_DFR 0x80 /* Deferring (jabber) */ | ||
| 172 | |||
| 173 | /* Hydra System card address PROM offset */ | ||
| 174 | |||
| 175 | #define HYDRA_ADDRPROM 0xffc0 | ||
| 176 | |||
| 177 | |||
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index 606243d11793..96bdb73c2283 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c | |||
| @@ -1815,14 +1815,14 @@ static int irda_usb_probe(struct usb_interface *intf, | |||
| 1815 | self->needspatch = (ret < 0); | 1815 | self->needspatch = (ret < 0); |
| 1816 | if (ret < 0) { | 1816 | if (ret < 0) { |
| 1817 | printk("patch_device failed\n"); | 1817 | printk("patch_device failed\n"); |
| 1818 | goto err_out_4; | 1818 | goto err_out_5; |
| 1819 | } | 1819 | } |
| 1820 | 1820 | ||
| 1821 | /* replace IrDA class descriptor with what patched device is now reporting */ | 1821 | /* replace IrDA class descriptor with what patched device is now reporting */ |
| 1822 | irda_desc = irda_usb_find_class_desc (self->usbintf); | 1822 | irda_desc = irda_usb_find_class_desc (self->usbintf); |
| 1823 | if (irda_desc == NULL) { | 1823 | if (irda_desc == NULL) { |
| 1824 | ret = -ENODEV; | 1824 | ret = -ENODEV; |
| 1825 | goto err_out_4; | 1825 | goto err_out_5; |
| 1826 | } | 1826 | } |
| 1827 | if (self->irda_desc) | 1827 | if (self->irda_desc) |
| 1828 | kfree (self->irda_desc); | 1828 | kfree (self->irda_desc); |
| @@ -1832,6 +1832,8 @@ static int irda_usb_probe(struct usb_interface *intf, | |||
| 1832 | 1832 | ||
| 1833 | return 0; | 1833 | return 0; |
| 1834 | 1834 | ||
| 1835 | err_out_5: | ||
| 1836 | unregister_netdev(self->netdev); | ||
| 1835 | err_out_4: | 1837 | err_out_4: |
| 1836 | kfree(self->speed_buff); | 1838 | kfree(self->speed_buff); |
| 1837 | err_out_3: | 1839 | err_out_3: |
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index bbcfc8ec35a1..58f76cefbc83 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
| @@ -225,6 +225,8 @@ static int __init smsc_superio_lpc(unsigned short cfg_base); | |||
| 225 | #ifdef CONFIG_PCI | 225 | #ifdef CONFIG_PCI |
| 226 | static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); | 226 | static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf); |
| 227 | static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); | 227 | static int __init preconfigure_through_82801(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); |
| 228 | static void __init preconfigure_ali_port(struct pci_dev *dev, | ||
| 229 | unsigned short port); | ||
| 228 | static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); | 230 | static int __init preconfigure_through_ali(struct pci_dev *dev, struct smsc_ircc_subsystem_configuration *conf); |
| 229 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | 231 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, |
| 230 | unsigned short ircc_fir, | 232 | unsigned short ircc_fir, |
| @@ -2327,9 +2329,14 @@ static int __init smsc_superio_lpc(unsigned short cfg_base) | |||
| 2327 | * pre-configuration not properly done by the BIOS (especially laptops) | 2329 | * pre-configuration not properly done by the BIOS (especially laptops) |
| 2328 | * This code is based in part on smcinit.c, tosh1800-smcinit.c | 2330 | * This code is based in part on smcinit.c, tosh1800-smcinit.c |
| 2329 | * and tosh2450-smcinit.c. The table lists the device entries | 2331 | * and tosh2450-smcinit.c. The table lists the device entries |
| 2330 | * for ISA bridges with an LPC (Local Peripheral Configurator) | 2332 | * for ISA bridges with an LPC (Low Pin Count) controller which |
| 2331 | * that are in turn used to configure the SMSC device with default | 2333 | * handles the communication with the SMSC device. After the LPC |
| 2332 | * SIR and FIR I/O ports, DMA and IRQ. | 2334 | * controller is initialized through PCI, the SMSC device is initialized |
| 2335 | * through a dedicated port in the ISA port-mapped I/O area, this latter | ||
| 2336 | * area is used to configure the SMSC device with default | ||
| 2337 | * SIR and FIR I/O ports, DMA and IRQ. Different vendors have | ||
| 2338 | * used different sets of parameters and different control port | ||
| 2339 | * addresses making a subsystem device table necessary. | ||
| 2333 | */ | 2340 | */ |
| 2334 | #ifdef CONFIG_PCI | 2341 | #ifdef CONFIG_PCI |
| 2335 | #define PCIID_VENDOR_INTEL 0x8086 | 2342 | #define PCIID_VENDOR_INTEL 0x8086 |
| @@ -2340,9 +2347,10 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __dev | |||
| 2340 | .device = 0x24cc, | 2347 | .device = 0x24cc, |
| 2341 | .subvendor = 0x103c, | 2348 | .subvendor = 0x103c, |
| 2342 | .subdevice = 0x088c, | 2349 | .subdevice = 0x088c, |
| 2343 | .sir_io = 0x02f8, /* Quite certain these are the same for nc8000 as for nc6000 */ | 2350 | /* Quite certain these are the same for nc8000 as for nc6000 */ |
| 2351 | .sir_io = 0x02f8, | ||
| 2344 | .fir_io = 0x0130, | 2352 | .fir_io = 0x0130, |
| 2345 | .fir_irq = 0x09, | 2353 | .fir_irq = 0x05, |
| 2346 | .fir_dma = 0x03, | 2354 | .fir_dma = 0x03, |
| 2347 | .cfg_base = 0x004e, | 2355 | .cfg_base = 0x004e, |
| 2348 | .preconfigure = preconfigure_through_82801, | 2356 | .preconfigure = preconfigure_through_82801, |
| @@ -2355,60 +2363,79 @@ static struct smsc_ircc_subsystem_configuration subsystem_configurations[] __dev | |||
| 2355 | .subdevice = 0x0890, | 2363 | .subdevice = 0x0890, |
| 2356 | .sir_io = 0x02f8, | 2364 | .sir_io = 0x02f8, |
| 2357 | .fir_io = 0x0130, | 2365 | .fir_io = 0x0130, |
| 2358 | .fir_irq = 0x09, | 2366 | .fir_irq = 0x05, |
| 2359 | .fir_dma = 0x03, | 2367 | .fir_dma = 0x03, |
| 2360 | .cfg_base = 0x004e, | 2368 | .cfg_base = 0x004e, |
| 2361 | .preconfigure = preconfigure_through_82801, | 2369 | .preconfigure = preconfigure_through_82801, |
| 2362 | .name = "HP nc6000", | 2370 | .name = "HP nc6000", |
| 2363 | }, | 2371 | }, |
| 2364 | { | 2372 | { |
| 2365 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */ | 2373 | /* Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge */ |
| 2374 | .vendor = PCIID_VENDOR_INTEL, | ||
| 2366 | .device = 0x24c0, | 2375 | .device = 0x24c0, |
| 2367 | .subvendor = 0x1179, | 2376 | .subvendor = 0x1179, |
| 2368 | .subdevice = 0xffff, /* 0xffff is "any", Not sure, 0x0001 or 0x0002 */ | 2377 | .subdevice = 0xffff, /* 0xffff is "any" */ |
| 2369 | .sir_io = 0x03f8, | 2378 | .sir_io = 0x03f8, |
| 2370 | .fir_io = 0x0130, | 2379 | .fir_io = 0x0130, |
| 2371 | .fir_irq = 0x07, | 2380 | .fir_irq = 0x07, |
| 2372 | .fir_dma = 0x01, | 2381 | .fir_dma = 0x01, |
| 2373 | .cfg_base = 0x002e, | 2382 | .cfg_base = 0x002e, |
| 2374 | .preconfigure = preconfigure_through_82801, | 2383 | .preconfigure = preconfigure_through_82801, |
| 2375 | .name = "Toshiba Satellite 2450", | 2384 | .name = "Toshiba laptop with Intel 82801DB/DBL LPC bridge", |
| 2376 | }, | 2385 | }, |
| 2377 | { | 2386 | { |
| 2378 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801CAM ISA bridge */ | 2387 | .vendor = PCIID_VENDOR_INTEL, /* Intel 82801CAM ISA bridge */ |
| 2379 | .device = 0x248c, /* Some use 24cc? */ | 2388 | .device = 0x248c, |
| 2380 | .subvendor = 0x1179, | 2389 | .subvendor = 0x1179, |
| 2381 | .subdevice = 0xffff, /* 0xffff is "any", Not sure, 0x0001 or 0x0002 */ | 2390 | .subdevice = 0xffff, /* 0xffff is "any" */ |
| 2382 | .sir_io = 0x03f8, | 2391 | .sir_io = 0x03f8, |
| 2383 | .fir_io = 0x0130, | 2392 | .fir_io = 0x0130, |
| 2384 | .fir_irq = 0x03, | 2393 | .fir_irq = 0x03, |
| 2385 | .fir_dma = 0x03, | 2394 | .fir_dma = 0x03, |
| 2386 | .cfg_base = 0x002e, | 2395 | .cfg_base = 0x002e, |
| 2387 | .preconfigure = preconfigure_through_82801, | 2396 | .preconfigure = preconfigure_through_82801, |
| 2388 | .name = "Toshiba Satellite 5100/5200, Tecra 9100", | 2397 | .name = "Toshiba laptop with Intel 82801CAM ISA bridge", |
| 2389 | }, | 2398 | }, |
| 2390 | { | 2399 | { |
| 2391 | .vendor = PCIID_VENDOR_ALI, /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */ | 2400 | /* 82801DBM (ICH4-M) LPC Interface Bridge */ |
| 2401 | .vendor = PCIID_VENDOR_INTEL, | ||
| 2402 | .device = 0x24cc, | ||
| 2403 | .subvendor = 0x1179, | ||
| 2404 | .subdevice = 0xffff, /* 0xffff is "any" */ | ||
| 2405 | .sir_io = 0x03f8, | ||
| 2406 | .fir_io = 0x0130, | ||
| 2407 | .fir_irq = 0x03, | ||
| 2408 | .fir_dma = 0x03, | ||
| 2409 | .cfg_base = 0x002e, | ||
| 2410 | .preconfigure = preconfigure_through_82801, | ||
| 2411 | .name = "Toshiba laptop with Intel 8281DBM LPC bridge", | ||
| 2412 | }, | ||
| 2413 | { | ||
| 2414 | /* ALi M1533/M1535 PCI to ISA Bridge [Aladdin IV/V/V+] */ | ||
| 2415 | .vendor = PCIID_VENDOR_ALI, | ||
| 2392 | .device = 0x1533, | 2416 | .device = 0x1533, |
| 2393 | .subvendor = 0x1179, | 2417 | .subvendor = 0x1179, |
| 2394 | .subdevice = 0xffff, /* 0xffff is "any", Not sure, 0x0001 or 0x0002 */ | 2418 | .subdevice = 0xffff, /* 0xffff is "any" */ |
| 2395 | .sir_io = 0x02e8, | 2419 | .sir_io = 0x02e8, |
| 2396 | .fir_io = 0x02f8, | 2420 | .fir_io = 0x02f8, |
| 2397 | .fir_irq = 0x07, | 2421 | .fir_irq = 0x07, |
| 2398 | .fir_dma = 0x03, | 2422 | .fir_dma = 0x03, |
| 2399 | .cfg_base = 0x002e, | 2423 | .cfg_base = 0x002e, |
| 2400 | .preconfigure = preconfigure_through_ali, | 2424 | .preconfigure = preconfigure_through_ali, |
| 2401 | .name = "Toshiba Satellite 1800", | 2425 | .name = "Toshiba laptop with ALi ISA bridge", |
| 2402 | }, | 2426 | }, |
| 2403 | { } // Terminator | 2427 | { } // Terminator |
| 2404 | }; | 2428 | }; |
| 2405 | 2429 | ||
| 2406 | 2430 | ||
| 2407 | /* | 2431 | /* |
| 2408 | * This sets up the basic SMSC parameters (FIR port, SIR port, FIR DMA, FIR IRQ) | 2432 | * This sets up the basic SMSC parameters |
| 2433 | * (FIR port, SIR port, FIR DMA, FIR IRQ) | ||
| 2409 | * through the chip configuration port. | 2434 | * through the chip configuration port. |
| 2410 | */ | 2435 | */ |
| 2411 | static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuration *conf) | 2436 | static int __init preconfigure_smsc_chip(struct |
| 2437 | smsc_ircc_subsystem_configuration | ||
| 2438 | *conf) | ||
| 2412 | { | 2439 | { |
| 2413 | unsigned short iobase = conf->cfg_base; | 2440 | unsigned short iobase = conf->cfg_base; |
| 2414 | unsigned char tmpbyte; | 2441 | unsigned char tmpbyte; |
| @@ -2416,7 +2443,9 @@ static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuratio | |||
| 2416 | outb(LPC47N227_CFGACCESSKEY, iobase); // enter configuration state | 2443 | outb(LPC47N227_CFGACCESSKEY, iobase); // enter configuration state |
| 2417 | outb(SMSCSIOFLAT_DEVICEID_REG, iobase); // set for device ID | 2444 | outb(SMSCSIOFLAT_DEVICEID_REG, iobase); // set for device ID |
| 2418 | tmpbyte = inb(iobase +1); // Read device ID | 2445 | tmpbyte = inb(iobase +1); // Read device ID |
| 2419 | IRDA_DEBUG(0, "Detected Chip id: 0x%02x, setting up registers...\n",tmpbyte); | 2446 | IRDA_DEBUG(0, |
| 2447 | "Detected Chip id: 0x%02x, setting up registers...\n", | ||
| 2448 | tmpbyte); | ||
| 2420 | 2449 | ||
| 2421 | /* Disable UART1 and set up SIR I/O port */ | 2450 | /* Disable UART1 and set up SIR I/O port */ |
| 2422 | outb(0x24, iobase); // select CR24 - UART1 base addr | 2451 | outb(0x24, iobase); // select CR24 - UART1 base addr |
| @@ -2426,6 +2455,7 @@ static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuratio | |||
| 2426 | tmpbyte = inb(iobase + 1); | 2455 | tmpbyte = inb(iobase + 1); |
| 2427 | if (tmpbyte != (conf->sir_io >> 2) ) { | 2456 | if (tmpbyte != (conf->sir_io >> 2) ) { |
| 2428 | IRDA_WARNING("ERROR: could not configure SIR ioport.\n"); | 2457 | IRDA_WARNING("ERROR: could not configure SIR ioport.\n"); |
| 2458 | IRDA_WARNING("Try to supply ircc_cfg argument.\n"); | ||
| 2429 | return -ENXIO; | 2459 | return -ENXIO; |
| 2430 | } | 2460 | } |
| 2431 | 2461 | ||
| @@ -2461,7 +2491,8 @@ static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuratio | |||
| 2461 | 2491 | ||
| 2462 | outb(SMSCSIOFLAT_UARTMODE0C_REG, iobase); // CR0C - UART mode | 2492 | outb(SMSCSIOFLAT_UARTMODE0C_REG, iobase); // CR0C - UART mode |
| 2463 | tmpbyte = inb(iobase + 1); | 2493 | tmpbyte = inb(iobase + 1); |
| 2464 | tmpbyte &= ~SMSCSIOFLAT_UART2MODE_MASK | SMSCSIOFLAT_UART2MODE_VAL_IRDA; | 2494 | tmpbyte &= ~SMSCSIOFLAT_UART2MODE_MASK | |
| 2495 | SMSCSIOFLAT_UART2MODE_VAL_IRDA; | ||
| 2465 | outb(tmpbyte, iobase + 1); // enable IrDA (HPSIR) mode, high speed | 2496 | outb(tmpbyte, iobase + 1); // enable IrDA (HPSIR) mode, high speed |
| 2466 | 2497 | ||
| 2467 | outb(LPC47N227_APMBOOTDRIVE_REG, iobase); // CR07 - Auto Pwr Mgt/boot drive sel | 2498 | outb(LPC47N227_APMBOOTDRIVE_REG, iobase); // CR07 - Auto Pwr Mgt/boot drive sel |
| @@ -2486,53 +2517,226 @@ static int __init preconfigure_smsc_chip(struct smsc_ircc_subsystem_configuratio | |||
| 2486 | return 0; | 2517 | return 0; |
| 2487 | } | 2518 | } |
| 2488 | 2519 | ||
| 2489 | /* 82801CAM registers */ | 2520 | /* 82801CAM generic registers */ |
| 2490 | #define VID 0x00 | 2521 | #define VID 0x00 |
| 2491 | #define DID 0x02 | 2522 | #define DID 0x02 |
| 2492 | #define PIRQA_ROUT 0x60 | 2523 | #define PIRQ_A_D_ROUT 0x60 |
| 2524 | #define SIRQ_CNTL 0x64 | ||
| 2525 | #define PIRQ_E_H_ROUT 0x68 | ||
| 2493 | #define PCI_DMA_C 0x90 | 2526 | #define PCI_DMA_C 0x90 |
| 2527 | /* LPC-specific registers */ | ||
| 2494 | #define COM_DEC 0xe0 | 2528 | #define COM_DEC 0xe0 |
| 2529 | #define GEN1_DEC 0xe4 | ||
| 2495 | #define LPC_EN 0xe6 | 2530 | #define LPC_EN 0xe6 |
| 2496 | #define GEN2_DEC 0xec | 2531 | #define GEN2_DEC 0xec |
| 2497 | /* | 2532 | /* |
| 2498 | * Sets up the I/O range using the 82801CAM ISA bridge, 82801DBM LPC bridge or | 2533 | * Sets up the I/O range using the 82801CAM ISA bridge, 82801DBM LPC bridge |
| 2499 | * Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. They all work the same way! | 2534 | * or Intel 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge. |
| 2535 | * They all work the same way! | ||
| 2500 | */ | 2536 | */ |
| 2501 | static int __init preconfigure_through_82801(struct pci_dev *dev, | 2537 | static int __init preconfigure_through_82801(struct pci_dev *dev, |
| 2502 | struct smsc_ircc_subsystem_configuration *conf) | 2538 | struct |
| 2539 | smsc_ircc_subsystem_configuration | ||
| 2540 | *conf) | ||
| 2503 | { | 2541 | { |
| 2504 | unsigned short tmpword; | 2542 | unsigned short tmpword; |
| 2505 | int ret; | 2543 | unsigned char tmpbyte; |
| 2506 | 2544 | ||
| 2507 | IRDA_MESSAGE("Setting up the SMSC device via the 82801 controller.\n"); | 2545 | IRDA_MESSAGE("Setting up Intel 82801 controller and SMSC device\n"); |
| 2508 | pci_write_config_byte(dev, COM_DEC, 0x10); | 2546 | /* |
| 2547 | * Select the range for the COMA COM port (SIR) | ||
| 2548 | * Register COM_DEC: | ||
| 2549 | * Bit 7: reserved | ||
| 2550 | * Bit 6-4, COMB decode range | ||
| 2551 | * Bit 3: reserved | ||
| 2552 | * Bit 2-0, COMA decode range | ||
| 2553 | * | ||
| 2554 | * Decode ranges: | ||
| 2555 | * 000 = 0x3f8-0x3ff (COM1) | ||
| 2556 | * 001 = 0x2f8-0x2ff (COM2) | ||
| 2557 | * 010 = 0x220-0x227 | ||
| 2558 | * 011 = 0x228-0x22f | ||
| 2559 | * 100 = 0x238-0x23f | ||
| 2560 | * 101 = 0x2e8-0x2ef (COM4) | ||
| 2561 | * 110 = 0x338-0x33f | ||
| 2562 | * 111 = 0x3e8-0x3ef (COM3) | ||
| 2563 | */ | ||
| 2564 | pci_read_config_byte(dev, COM_DEC, &tmpbyte); | ||
| 2565 | tmpbyte &= 0xf8; /* mask COMA bits */ | ||
| 2566 | switch(conf->sir_io) { | ||
| 2567 | case 0x3f8: | ||
| 2568 | tmpbyte |= 0x00; | ||
| 2569 | break; | ||
| 2570 | case 0x2f8: | ||
| 2571 | tmpbyte |= 0x01; | ||
| 2572 | break; | ||
| 2573 | case 0x220: | ||
| 2574 | tmpbyte |= 0x02; | ||
| 2575 | break; | ||
| 2576 | case 0x228: | ||
| 2577 | tmpbyte |= 0x03; | ||
| 2578 | break; | ||
| 2579 | case 0x238: | ||
| 2580 | tmpbyte |= 0x04; | ||
| 2581 | break; | ||
| 2582 | case 0x2e8: | ||
| 2583 | tmpbyte |= 0x05; | ||
| 2584 | break; | ||
| 2585 | case 0x338: | ||
| 2586 | tmpbyte |= 0x06; | ||
| 2587 | break; | ||
| 2588 | case 0x3e8: | ||
| 2589 | tmpbyte |= 0x07; | ||
| 2590 | break; | ||
| 2591 | default: | ||
| 2592 | tmpbyte |= 0x01; /* COM2 default */ | ||
| 2593 | } | ||
| 2594 | IRDA_DEBUG(1, "COM_DEC (write): 0x%02x\n", tmpbyte); | ||
| 2595 | pci_write_config_byte(dev, COM_DEC, tmpbyte); | ||
| 2509 | 2596 | ||
| 2510 | /* Enable LPC */ | 2597 | /* Enable Low Pin Count interface */ |
| 2511 | pci_read_config_word(dev, LPC_EN, &tmpword); /* LPC_EN register */ | 2598 | pci_read_config_word(dev, LPC_EN, &tmpword); |
| 2512 | tmpword &= 0xfffd; /* mask bit 1 */ | 2599 | /* These seem to be set up at all times, |
| 2513 | tmpword |= 0x0001; /* set bit 0 : COMA addr range enable */ | 2600 | * just make sure it is properly set. |
| 2601 | */ | ||
| 2602 | switch(conf->cfg_base) { | ||
| 2603 | case 0x04e: | ||
| 2604 | tmpword |= 0x2000; | ||
| 2605 | break; | ||
| 2606 | case 0x02e: | ||
| 2607 | tmpword |= 0x1000; | ||
| 2608 | break; | ||
| 2609 | case 0x062: | ||
| 2610 | tmpword |= 0x0800; | ||
| 2611 | break; | ||
| 2612 | case 0x060: | ||
| 2613 | tmpword |= 0x0400; | ||
| 2614 | break; | ||
| 2615 | default: | ||
| 2616 | IRDA_WARNING("Uncommon I/O base address: 0x%04x\n", | ||
| 2617 | conf->cfg_base); | ||
| 2618 | break; | ||
| 2619 | } | ||
| 2620 | tmpword &= 0xfffd; /* disable LPC COMB */ | ||
| 2621 | tmpword |= 0x0001; /* set bit 0 : enable LPC COMA addr range (GEN2) */ | ||
| 2622 | IRDA_DEBUG(1, "LPC_EN (write): 0x%04x\n", tmpword); | ||
| 2514 | pci_write_config_word(dev, LPC_EN, tmpword); | 2623 | pci_write_config_word(dev, LPC_EN, tmpword); |
| 2515 | 2624 | ||
| 2516 | /* Setup DMA */ | 2625 | /* |
| 2517 | pci_write_config_word(dev, PCI_DMA_C, 0xc0c0); /* LPC I/F DMA on, channel 3 -- rtm (?? PCI DMA ?) */ | 2626 | * Configure LPC DMA channel |
| 2518 | pci_write_config_word(dev, GEN2_DEC, 0x131); /* LPC I/F 2nd decode range */ | 2627 | * PCI_DMA_C bits: |
| 2628 | * Bit 15-14: DMA channel 7 select | ||
| 2629 | * Bit 13-12: DMA channel 6 select | ||
| 2630 | * Bit 11-10: DMA channel 5 select | ||
| 2631 | * Bit 9-8: Reserved | ||
| 2632 | * Bit 7-6: DMA channel 3 select | ||
| 2633 | * Bit 5-4: DMA channel 2 select | ||
| 2634 | * Bit 3-2: DMA channel 1 select | ||
| 2635 | * Bit 1-0: DMA channel 0 select | ||
| 2636 | * 00 = Reserved value | ||
| 2637 | * 01 = PC/PCI DMA | ||
| 2638 | * 10 = Reserved value | ||
| 2639 | * 11 = LPC I/F DMA | ||
| 2640 | */ | ||
| 2641 | pci_read_config_word(dev, PCI_DMA_C, &tmpword); | ||
| 2642 | switch(conf->fir_dma) { | ||
| 2643 | case 0x07: | ||
| 2644 | tmpword |= 0xc000; | ||
| 2645 | break; | ||
| 2646 | case 0x06: | ||
| 2647 | tmpword |= 0x3000; | ||
| 2648 | break; | ||
| 2649 | case 0x05: | ||
| 2650 | tmpword |= 0x0c00; | ||
| 2651 | break; | ||
| 2652 | case 0x03: | ||
| 2653 | tmpword |= 0x00c0; | ||
| 2654 | break; | ||
| 2655 | case 0x02: | ||
| 2656 | tmpword |= 0x0030; | ||
| 2657 | break; | ||
| 2658 | case 0x01: | ||
| 2659 | tmpword |= 0x000c; | ||
| 2660 | break; | ||
| 2661 | case 0x00: | ||
| 2662 | tmpword |= 0x0003; | ||
| 2663 | break; | ||
| 2664 | default: | ||
| 2665 | break; /* do not change settings */ | ||
| 2666 | } | ||
| 2667 | IRDA_DEBUG(1, "PCI_DMA_C (write): 0x%04x\n", tmpword); | ||
| 2668 | pci_write_config_word(dev, PCI_DMA_C, tmpword); | ||
| 2669 | |||
| 2670 | /* | ||
| 2671 | * GEN2_DEC bits: | ||
| 2672 | * Bit 15-4: Generic I/O range | ||
| 2673 | * Bit 3-1: reserved (read as 0) | ||
| 2674 | * Bit 0: enable GEN2 range on LPC I/F | ||
| 2675 | */ | ||
| 2676 | tmpword = conf->fir_io & 0xfff8; | ||
| 2677 | tmpword |= 0x0001; | ||
| 2678 | IRDA_DEBUG(1, "GEN2_DEC (write): 0x%04x\n", tmpword); | ||
| 2679 | pci_write_config_word(dev, GEN2_DEC, tmpword); | ||
| 2519 | 2680 | ||
| 2520 | /* Pre-configure chip */ | 2681 | /* Pre-configure chip */ |
| 2521 | ret = preconfigure_smsc_chip(conf); | 2682 | return preconfigure_smsc_chip(conf); |
| 2683 | } | ||
| 2522 | 2684 | ||
| 2523 | /* Disable LPC */ | 2685 | /* |
| 2524 | pci_read_config_word(dev, LPC_EN, &tmpword); /* LPC_EN register */ | 2686 | * Pre-configure a certain port on the ALi 1533 bridge. |
| 2525 | tmpword &= 0xfffc; /* mask bit 1 and bit 0, COMA addr range disable */ | 2687 | * This is based on reverse-engineering since ALi does not |
| 2526 | pci_write_config_word(dev, LPC_EN, tmpword); | 2688 | * provide any data sheet for the 1533 chip. |
| 2527 | return ret; | 2689 | */ |
| 2690 | static void __init preconfigure_ali_port(struct pci_dev *dev, | ||
| 2691 | unsigned short port) | ||
| 2692 | { | ||
| 2693 | unsigned char reg; | ||
| 2694 | /* These bits obviously control the different ports */ | ||
| 2695 | unsigned char mask; | ||
| 2696 | unsigned char tmpbyte; | ||
| 2697 | |||
| 2698 | switch(port) { | ||
| 2699 | case 0x0130: | ||
| 2700 | case 0x0178: | ||
| 2701 | reg = 0xb0; | ||
| 2702 | mask = 0x80; | ||
| 2703 | break; | ||
| 2704 | case 0x03f8: | ||
| 2705 | reg = 0xb4; | ||
| 2706 | mask = 0x80; | ||
| 2707 | break; | ||
| 2708 | case 0x02f8: | ||
| 2709 | reg = 0xb4; | ||
| 2710 | mask = 0x30; | ||
| 2711 | break; | ||
| 2712 | case 0x02e8: | ||
| 2713 | reg = 0xb4; | ||
| 2714 | mask = 0x08; | ||
| 2715 | break; | ||
| 2716 | default: | ||
| 2717 | IRDA_ERROR("Failed to configure unsupported port on ALi 1533 bridge: 0x%04x\n", port); | ||
| 2718 | return; | ||
| 2719 | } | ||
| 2720 | |||
| 2721 | pci_read_config_byte(dev, reg, &tmpbyte); | ||
| 2722 | /* Turn on the right bits */ | ||
| 2723 | tmpbyte |= mask; | ||
| 2724 | pci_write_config_byte(dev, reg, tmpbyte); | ||
| 2725 | IRDA_MESSAGE("Activated ALi 1533 ISA bridge port 0x%04x.\n", port); | ||
| 2726 | return; | ||
| 2528 | } | 2727 | } |
| 2529 | 2728 | ||
| 2530 | static int __init preconfigure_through_ali(struct pci_dev *dev, | 2729 | static int __init preconfigure_through_ali(struct pci_dev *dev, |
| 2531 | struct smsc_ircc_subsystem_configuration *conf) | 2730 | struct |
| 2731 | smsc_ircc_subsystem_configuration | ||
| 2732 | *conf) | ||
| 2532 | { | 2733 | { |
| 2533 | /* TODO: put in ALi 1533 configuration here. */ | 2734 | /* Configure the two ports on the ALi 1533 */ |
| 2534 | IRDA_MESSAGE("SORRY: %s has an unsupported bridge controller (ALi): not pre-configured.\n", conf->name); | 2735 | preconfigure_ali_port(dev, conf->sir_io); |
| 2535 | return -ENODEV; | 2736 | preconfigure_ali_port(dev, conf->fir_io); |
| 2737 | |||
| 2738 | /* Pre-configure chip */ | ||
| 2739 | return preconfigure_smsc_chip(conf); | ||
| 2536 | } | 2740 | } |
| 2537 | 2741 | ||
| 2538 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | 2742 | static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, |
| @@ -2552,9 +2756,10 @@ static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | |||
| 2552 | struct smsc_ircc_subsystem_configuration *conf; | 2756 | struct smsc_ircc_subsystem_configuration *conf; |
| 2553 | 2757 | ||
| 2554 | /* | 2758 | /* |
| 2555 | * Cache the subsystem vendor/device: some manufacturers fail to set | 2759 | * Cache the subsystem vendor/device: |
| 2556 | * this for all components, so we save it in case there is just | 2760 | * some manufacturers fail to set this for all components, |
| 2557 | * 0x0000 0x0000 on the device we want to check. | 2761 | * so we save it in case there is just 0x0000 0x0000 on the |
| 2762 | * device we want to check. | ||
| 2558 | */ | 2763 | */ |
| 2559 | if (dev->subsystem_vendor != 0x0000U) { | 2764 | if (dev->subsystem_vendor != 0x0000U) { |
| 2560 | ss_vendor = dev->subsystem_vendor; | 2765 | ss_vendor = dev->subsystem_vendor; |
| @@ -2564,13 +2769,20 @@ static int __init smsc_ircc_preconfigure_subsystems(unsigned short ircc_cfg, | |||
| 2564 | for( ; conf->subvendor; conf++) { | 2769 | for( ; conf->subvendor; conf++) { |
| 2565 | if(conf->vendor == dev->vendor && | 2770 | if(conf->vendor == dev->vendor && |
| 2566 | conf->device == dev->device && | 2771 | conf->device == dev->device && |
| 2567 | conf->subvendor == ss_vendor && /* Sometimes these are cached values */ | 2772 | conf->subvendor == ss_vendor && |
| 2568 | (conf->subdevice == ss_device || conf->subdevice == 0xffff)) { | 2773 | /* Sometimes these are cached values */ |
| 2569 | struct smsc_ircc_subsystem_configuration tmpconf; | 2774 | (conf->subdevice == ss_device || |
| 2775 | conf->subdevice == 0xffff)) { | ||
| 2776 | struct smsc_ircc_subsystem_configuration | ||
| 2777 | tmpconf; | ||
| 2570 | 2778 | ||
| 2571 | memcpy(&tmpconf, conf, sizeof(struct smsc_ircc_subsystem_configuration)); | 2779 | memcpy(&tmpconf, conf, |
| 2780 | sizeof(struct smsc_ircc_subsystem_configuration)); | ||
| 2572 | 2781 | ||
| 2573 | /* Override the default values with anything passed in as parameter */ | 2782 | /* |
| 2783 | * Override the default values with anything | ||
| 2784 | * passed in as parameter | ||
| 2785 | */ | ||
| 2574 | if (ircc_cfg != 0) | 2786 | if (ircc_cfg != 0) |
| 2575 | tmpconf.cfg_base = ircc_cfg; | 2787 | tmpconf.cfg_base = ircc_cfg; |
| 2576 | if (ircc_fir != 0) | 2788 | if (ircc_fir != 0) |
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index f9f77e4f5965..cfd67d812f0d 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
| @@ -357,18 +357,20 @@ ixgb_probe(struct pci_dev *pdev, | |||
| 357 | if((err = pci_enable_device(pdev))) | 357 | if((err = pci_enable_device(pdev))) |
| 358 | return err; | 358 | return err; |
| 359 | 359 | ||
| 360 | if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { | 360 | if(!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK)) && |
| 361 | !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) { | ||
| 361 | pci_using_dac = 1; | 362 | pci_using_dac = 1; |
| 362 | } else { | 363 | } else { |
| 363 | if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK))) { | 364 | if((err = pci_set_dma_mask(pdev, DMA_32BIT_MASK)) || |
| 365 | (err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))) { | ||
| 364 | IXGB_ERR("No usable DMA configuration, aborting\n"); | 366 | IXGB_ERR("No usable DMA configuration, aborting\n"); |
| 365 | return err; | 367 | goto err_dma_mask; |
| 366 | } | 368 | } |
| 367 | pci_using_dac = 0; | 369 | pci_using_dac = 0; |
| 368 | } | 370 | } |
| 369 | 371 | ||
| 370 | if((err = pci_request_regions(pdev, ixgb_driver_name))) | 372 | if((err = pci_request_regions(pdev, ixgb_driver_name))) |
| 371 | return err; | 373 | goto err_request_regions; |
| 372 | 374 | ||
| 373 | pci_set_master(pdev); | 375 | pci_set_master(pdev); |
| 374 | 376 | ||
| @@ -502,6 +504,9 @@ err_ioremap: | |||
| 502 | free_netdev(netdev); | 504 | free_netdev(netdev); |
| 503 | err_alloc_etherdev: | 505 | err_alloc_etherdev: |
| 504 | pci_release_regions(pdev); | 506 | pci_release_regions(pdev); |
| 507 | err_request_regions: | ||
| 508 | err_dma_mask: | ||
| 509 | pci_disable_device(pdev); | ||
| 505 | return err; | 510 | return err; |
| 506 | } | 511 | } |
| 507 | 512 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index 9f2661355a4a..ea62a3e7d586 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
| @@ -281,10 +281,16 @@ static void mv643xx_eth_tx_timeout_task(struct net_device *dev) | |||
| 281 | { | 281 | { |
| 282 | struct mv643xx_private *mp = netdev_priv(dev); | 282 | struct mv643xx_private *mp = netdev_priv(dev); |
| 283 | 283 | ||
| 284 | netif_device_detach(dev); | 284 | if (!netif_running(dev)) |
| 285 | return; | ||
| 286 | |||
| 287 | netif_stop_queue(dev); | ||
| 288 | |||
| 285 | eth_port_reset(mp->port_num); | 289 | eth_port_reset(mp->port_num); |
| 286 | eth_port_start(dev); | 290 | eth_port_start(dev); |
| 287 | netif_device_attach(dev); | 291 | |
| 292 | if (mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB) | ||
| 293 | netif_wake_queue(dev); | ||
| 288 | } | 294 | } |
| 289 | 295 | ||
| 290 | /** | 296 | /** |
| @@ -552,9 +558,9 @@ static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id, | |||
| 552 | #else | 558 | #else |
| 553 | if (eth_int_cause & ETH_INT_CAUSE_RX) | 559 | if (eth_int_cause & ETH_INT_CAUSE_RX) |
| 554 | mv643xx_eth_receive_queue(dev, INT_MAX); | 560 | mv643xx_eth_receive_queue(dev, INT_MAX); |
| 561 | #endif | ||
| 555 | if (eth_int_cause_ext & ETH_INT_CAUSE_TX) | 562 | if (eth_int_cause_ext & ETH_INT_CAUSE_TX) |
| 556 | mv643xx_eth_free_completed_tx_descs(dev); | 563 | mv643xx_eth_free_completed_tx_descs(dev); |
| 557 | #endif | ||
| 558 | 564 | ||
| 559 | /* | 565 | /* |
| 560 | * If no real interrupt occured, exit. | 566 | * If no real interrupt occured, exit. |
| @@ -1186,7 +1192,12 @@ static int mv643xx_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1186 | 1192 | ||
| 1187 | BUG_ON(netif_queue_stopped(dev)); | 1193 | BUG_ON(netif_queue_stopped(dev)); |
| 1188 | BUG_ON(skb == NULL); | 1194 | BUG_ON(skb == NULL); |
| 1189 | BUG_ON(mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB); | 1195 | |
| 1196 | if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB) { | ||
| 1197 | printk(KERN_ERR "%s: transmit with queue full\n", dev->name); | ||
| 1198 | netif_stop_queue(dev); | ||
| 1199 | return 1; | ||
| 1200 | } | ||
| 1190 | 1201 | ||
| 1191 | if (has_tiny_unaligned_frags(skb)) { | 1202 | if (has_tiny_unaligned_frags(skb)) { |
| 1192 | if ((skb_linearize(skb, GFP_ATOMIC) != 0)) { | 1203 | if ((skb_linearize(skb, GFP_ATOMIC) != 0)) { |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index 7826afbb9db9..90627756d6fa 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
| @@ -238,7 +238,7 @@ static int full_duplex[MAX_UNITS]; | |||
| 238 | #define NATSEMI_RX_LIMIT 2046 /* maximum supported by hardware */ | 238 | #define NATSEMI_RX_LIMIT 2046 /* maximum supported by hardware */ |
| 239 | 239 | ||
| 240 | /* These identify the driver base version and may not be removed. */ | 240 | /* These identify the driver base version and may not be removed. */ |
| 241 | static char version[] __devinitdata = | 241 | static const char version[] __devinitdata = |
| 242 | KERN_INFO DRV_NAME " dp8381x driver, version " | 242 | KERN_INFO DRV_NAME " dp8381x driver, version " |
| 243 | DRV_VERSION ", " DRV_RELDATE "\n" | 243 | DRV_VERSION ", " DRV_RELDATE "\n" |
| 244 | KERN_INFO " originally by Donald Becker <becker@scyld.com>\n" | 244 | KERN_INFO " originally by Donald Becker <becker@scyld.com>\n" |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index 56233afcb2b3..448a09488529 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -1560,7 +1560,7 @@ static void ei_receive(struct net_device *dev) | |||
| 1560 | 1560 | ||
| 1561 | static void ei_rx_overrun(struct net_device *dev) | 1561 | static void ei_rx_overrun(struct net_device *dev) |
| 1562 | { | 1562 | { |
| 1563 | axnet_dev_t *info = (axnet_dev_t *)dev; | 1563 | axnet_dev_t *info = PRIV(dev); |
| 1564 | long e8390_base = dev->base_addr; | 1564 | long e8390_base = dev->base_addr; |
| 1565 | unsigned char was_txing, must_resend = 0; | 1565 | unsigned char was_txing, must_resend = 0; |
| 1566 | struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); | 1566 | struct ei_device *ei_local = (struct ei_device *) netdev_priv(dev); |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index 35dbf05c7f06..a70c2b0cc104 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -78,6 +78,8 @@ static const struct pci_device_id skge_id_table[] = { | |||
| 78 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE) }, | 78 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE) }, |
| 79 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU) }, | 79 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU) }, |
| 80 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T), }, | 80 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T), }, |
| 81 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, | ||
| 82 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) }, | ||
| 81 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4320) }, | 83 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4320) }, |
| 82 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5005) }, /* Belkin */ | 84 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5005) }, /* Belkin */ |
| 83 | { PCI_DEVICE(PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD) }, | 85 | { PCI_DEVICE(PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD) }, |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 68f9c206a620..67b0eab16589 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
| @@ -99,8 +99,6 @@ MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)"); | |||
| 99 | static const struct pci_device_id sky2_id_table[] = { | 99 | static const struct pci_device_id sky2_id_table[] = { |
| 100 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, | 100 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9000) }, |
| 101 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, | 101 | { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, 0x9E00) }, |
| 102 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b00) }, | ||
| 103 | { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) }, | ||
| 104 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, | 102 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4340) }, |
| 105 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, | 103 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4341) }, |
| 106 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) }, | 104 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4342) }, |
| @@ -579,8 +577,8 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) | |||
| 579 | reg = gma_read16(hw, port, GM_PHY_ADDR); | 577 | reg = gma_read16(hw, port, GM_PHY_ADDR); |
| 580 | gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR); | 578 | gma_write16(hw, port, GM_PHY_ADDR, reg | GM_PAR_MIB_CLR); |
| 581 | 579 | ||
| 582 | for (i = 0; i < GM_MIB_CNT_SIZE; i++) | 580 | for (i = GM_MIB_CNT_BASE; i <= GM_MIB_CNT_END; i += 4) |
| 583 | gma_read16(hw, port, GM_MIB_CNT_BASE + 8 * i); | 581 | gma_read16(hw, port, i); |
| 584 | gma_write16(hw, port, GM_PHY_ADDR, reg); | 582 | gma_write16(hw, port, GM_PHY_ADDR, reg); |
| 585 | 583 | ||
| 586 | /* transmit control */ | 584 | /* transmit control */ |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 62532b4e45c5..89dd18cd12f0 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
| @@ -1375,7 +1375,7 @@ enum { | |||
| 1375 | GM_PHY_ADDR = 0x0088, /* 16 bit r/w GPHY Address Register */ | 1375 | GM_PHY_ADDR = 0x0088, /* 16 bit r/w GPHY Address Register */ |
| 1376 | /* MIB Counters */ | 1376 | /* MIB Counters */ |
| 1377 | GM_MIB_CNT_BASE = 0x0100, /* Base Address of MIB Counters */ | 1377 | GM_MIB_CNT_BASE = 0x0100, /* Base Address of MIB Counters */ |
| 1378 | GM_MIB_CNT_SIZE = 256, | 1378 | GM_MIB_CNT_END = 0x025C, /* Last MIB counter */ |
| 1379 | }; | 1379 | }; |
| 1380 | 1380 | ||
| 1381 | 1381 | ||
diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c index 45ad036733e2..9b7805be21da 100644 --- a/drivers/net/starfire.c +++ b/drivers/net/starfire.c | |||
| @@ -335,7 +335,7 @@ do { \ | |||
| 335 | 335 | ||
| 336 | 336 | ||
| 337 | /* These identify the driver base version and may not be removed. */ | 337 | /* These identify the driver base version and may not be removed. */ |
| 338 | static char version[] __devinitdata = | 338 | static const char version[] __devinitdata = |
| 339 | KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" | 339 | KERN_INFO "starfire.c:v1.03 7/26/2000 Written by Donald Becker <becker@scyld.com>\n" |
| 340 | KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n"; | 340 | KERN_INFO " (unofficial 2.2/2.4 kernel port, version " DRV_VERSION ", " DRV_RELDATE ")\n"; |
| 341 | 341 | ||
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index c1ce87a5f8d3..d9258d42090c 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
| @@ -134,7 +134,7 @@ static const int multicast_filter_limit = 32; | |||
| 134 | #include "typhoon.h" | 134 | #include "typhoon.h" |
| 135 | #include "typhoon-firmware.h" | 135 | #include "typhoon-firmware.h" |
| 136 | 136 | ||
| 137 | static char version[] __devinitdata = | 137 | static const char version[] __devinitdata = |
| 138 | "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 138 | "typhoon.c: version " DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
| 139 | 139 | ||
| 140 | MODULE_AUTHOR("David Dillow <dave@thedillows.org>"); | 140 | MODULE_AUTHOR("David Dillow <dave@thedillows.org>"); |
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index a9b2150909d6..6a23964c1317 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
| @@ -469,7 +469,7 @@ struct rhine_private { | |||
| 469 | struct sk_buff *tx_skbuff[TX_RING_SIZE]; | 469 | struct sk_buff *tx_skbuff[TX_RING_SIZE]; |
| 470 | dma_addr_t tx_skbuff_dma[TX_RING_SIZE]; | 470 | dma_addr_t tx_skbuff_dma[TX_RING_SIZE]; |
| 471 | 471 | ||
| 472 | /* Tx bounce buffers */ | 472 | /* Tx bounce buffers (Rhine-I only) */ |
| 473 | unsigned char *tx_buf[TX_RING_SIZE]; | 473 | unsigned char *tx_buf[TX_RING_SIZE]; |
| 474 | unsigned char *tx_bufs; | 474 | unsigned char *tx_bufs; |
| 475 | dma_addr_t tx_bufs_dma; | 475 | dma_addr_t tx_bufs_dma; |
| @@ -1043,7 +1043,8 @@ static void alloc_tbufs(struct net_device* dev) | |||
| 1043 | rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); | 1043 | rp->tx_ring[i].desc_length = cpu_to_le32(TXDESC); |
| 1044 | next += sizeof(struct tx_desc); | 1044 | next += sizeof(struct tx_desc); |
| 1045 | rp->tx_ring[i].next_desc = cpu_to_le32(next); | 1045 | rp->tx_ring[i].next_desc = cpu_to_le32(next); |
| 1046 | rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; | 1046 | if (rp->quirks & rqRhineI) |
| 1047 | rp->tx_buf[i] = &rp->tx_bufs[i * PKT_BUF_SZ]; | ||
| 1047 | } | 1048 | } |
| 1048 | rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma); | 1049 | rp->tx_ring[i-1].next_desc = cpu_to_le32(rp->tx_ring_dma); |
| 1049 | 1050 | ||
| @@ -1091,7 +1092,7 @@ static void rhine_check_media(struct net_device *dev, unsigned int init_media) | |||
| 1091 | } | 1092 | } |
| 1092 | 1093 | ||
| 1093 | /* Called after status of force_media possibly changed */ | 1094 | /* Called after status of force_media possibly changed */ |
| 1094 | void rhine_set_carrier(struct mii_if_info *mii) | 1095 | static void rhine_set_carrier(struct mii_if_info *mii) |
| 1095 | { | 1096 | { |
| 1096 | if (mii->force_media) { | 1097 | if (mii->force_media) { |
| 1097 | /* autoneg is off: Link is always assumed to be up */ | 1098 | /* autoneg is off: Link is always assumed to be up */ |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 883cf7da10fc..b5328b0ff927 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
| @@ -410,103 +410,6 @@ config WAN_ROUTER_DRIVERS | |||
| 410 | 410 | ||
| 411 | If unsure, say N. | 411 | If unsure, say N. |
| 412 | 412 | ||
| 413 | config VENDOR_SANGOMA | ||
| 414 | tristate "Sangoma WANPIPE(tm) multiprotocol cards" | ||
| 415 | depends on WAN_ROUTER_DRIVERS && WAN_ROUTER && (PCI || ISA) && BROKEN | ||
| 416 | ---help--- | ||
| 417 | Driver for S514-PCI/ISA Synchronous Data Link Adapters (SDLA). | ||
| 418 | |||
| 419 | WANPIPE from Sangoma Technologies Inc. <http://www.sangoma.com/> | ||
| 420 | is a family of intelligent multiprotocol WAN adapters with data | ||
| 421 | transfer rates up to 4Mbps. Cards support: | ||
| 422 | |||
| 423 | - X.25, Frame Relay, PPP, Cisco HDLC protocols. | ||
| 424 | |||
| 425 | - API for protocols like HDLC (LAPB), HDLC Streaming, X.25, | ||
| 426 | Frame Relay and BiSync. | ||
| 427 | |||
| 428 | - Ethernet Bridging over Frame Relay protocol. | ||
| 429 | |||
| 430 | - MULTILINK PPP | ||
| 431 | |||
| 432 | - Async PPP (Modem Dialup) | ||
| 433 | |||
| 434 | The next questions will ask you about the protocols you want | ||
| 435 | the driver to support. | ||
| 436 | |||
| 437 | If you have one or more of these cards, say M to this option; | ||
| 438 | and read <file:Documentation/networking/wan-router.txt>. | ||
| 439 | |||
| 440 | To compile this driver as a module, choose M here: the | ||
| 441 | module will be called wanpipe. | ||
| 442 | |||
| 443 | config WANPIPE_CHDLC | ||
| 444 | bool "WANPIPE Cisco HDLC support" | ||
| 445 | depends on VENDOR_SANGOMA | ||
| 446 | ---help--- | ||
| 447 | Connect a WANPIPE card to a leased line using the Cisco HDLC. | ||
| 448 | |||
| 449 | - Supports Dual Port Cisco HDLC on the S514-PCI/S508-ISA cards | ||
| 450 | which allows user to build applications using the HDLC streaming API. | ||
| 451 | |||
| 452 | - CHDLC Streaming MULTILINK PPP that can bind multiple WANPIPE T1 | ||
| 453 | cards into a single logical channel. | ||
| 454 | |||
| 455 | Say Y and the Cisco HDLC support, HDLC streaming API and | ||
| 456 | MULTILINK PPP will be included in the driver. | ||
| 457 | |||
| 458 | config WANPIPE_FR | ||
| 459 | bool "WANPIPE Frame Relay support" | ||
| 460 | depends on VENDOR_SANGOMA | ||
| 461 | help | ||
| 462 | Connect a WANPIPE card to a Frame Relay network, or use Frame Relay | ||
| 463 | API to develop custom applications. | ||
| 464 | |||
| 465 | Contains the Ethernet Bridging over Frame Relay feature, where | ||
| 466 | a WANPIPE frame relay link can be directly connected to the Linux | ||
| 467 | kernel bridge. The Frame Relay option is supported on S514-PCI | ||
| 468 | and S508-ISA cards. | ||
| 469 | |||
| 470 | Say Y and the Frame Relay support will be included in the driver. | ||
| 471 | |||
| 472 | config WANPIPE_X25 | ||
| 473 | bool "WANPIPE X.25 support" | ||
| 474 | depends on VENDOR_SANGOMA | ||
| 475 | help | ||
| 476 | Connect a WANPIPE card to an X.25 network. | ||
| 477 | |||
| 478 | Includes the X.25 API support for custom applications over the | ||
| 479 | X.25 protocol. The X.25 option is supported on S514-PCI and | ||
| 480 | S508-ISA cards. | ||
| 481 | |||
| 482 | Say Y and the X.25 support will be included in the driver. | ||
| 483 | |||
| 484 | config WANPIPE_PPP | ||
| 485 | bool "WANPIPE PPP support" | ||
| 486 | depends on VENDOR_SANGOMA | ||
| 487 | help | ||
| 488 | Connect a WANPIPE card to a leased line using Point-to-Point | ||
| 489 | Protocol (PPP). | ||
| 490 | |||
| 491 | The PPP option is supported on S514-PCI/S508-ISA cards. | ||
| 492 | |||
| 493 | Say Y and the PPP support will be included in the driver. | ||
| 494 | |||
| 495 | config WANPIPE_MULTPPP | ||
| 496 | bool "WANPIPE Multi-Port PPP support" | ||
| 497 | depends on VENDOR_SANGOMA | ||
| 498 | help | ||
| 499 | Connect a WANPIPE card to a leased line using Point-to-Point | ||
| 500 | Protocol (PPP). | ||
| 501 | |||
| 502 | Uses in-kernel SyncPPP protocol over the Sangoma HDLC Streaming | ||
| 503 | adapter. In this case each Sangoma adapter port can support an | ||
| 504 | independent PPP connection. For example, a single Quad-Port PCI | ||
| 505 | adapter can support up to four independent PPP links. The PPP | ||
| 506 | option is supported on S514-PCI/S508-ISA cards. | ||
| 507 | |||
| 508 | Say Y and the Multi-Port PPP support will be included in the driver. | ||
| 509 | |||
| 510 | config CYCLADES_SYNC | 413 | config CYCLADES_SYNC |
| 511 | tristate "Cyclom 2X(tm) cards (EXPERIMENTAL)" | 414 | tristate "Cyclom 2X(tm) cards (EXPERIMENTAL)" |
| 512 | depends on WAN_ROUTER_DRIVERS && (PCI || ISA) | 415 | depends on WAN_ROUTER_DRIVERS && (PCI || ISA) |
diff --git a/drivers/net/wan/Makefile b/drivers/net/wan/Makefile index ce6c56b903e7..823c6d5ab90d 100644 --- a/drivers/net/wan/Makefile +++ b/drivers/net/wan/Makefile | |||
| @@ -5,14 +5,6 @@ | |||
| 5 | # Rewritten to use lists instead of if-statements. | 5 | # Rewritten to use lists instead of if-statements. |
| 6 | # | 6 | # |
| 7 | 7 | ||
| 8 | wanpipe-y := sdlamain.o sdla_ft1.o | ||
| 9 | wanpipe-$(CONFIG_WANPIPE_X25) += sdla_x25.o | ||
| 10 | wanpipe-$(CONFIG_WANPIPE_FR) += sdla_fr.o | ||
| 11 | wanpipe-$(CONFIG_WANPIPE_CHDLC) += sdla_chdlc.o | ||
| 12 | wanpipe-$(CONFIG_WANPIPE_PPP) += sdla_ppp.o | ||
| 13 | wanpipe-$(CONFIG_WANPIPE_MULTPPP) += wanpipe_multppp.o | ||
| 14 | wanpipe-objs := $(wanpipe-y) | ||
| 15 | |||
| 16 | cyclomx-y := cycx_main.o | 8 | cyclomx-y := cycx_main.o |
| 17 | cyclomx-$(CONFIG_CYCLOMX_X25) += cycx_x25.o | 9 | cyclomx-$(CONFIG_CYCLOMX_X25) += cycx_x25.o |
| 18 | cyclomx-objs := $(cyclomx-y) | 10 | cyclomx-objs := $(cyclomx-y) |
| @@ -43,11 +35,6 @@ obj-$(CONFIG_LANMEDIA) += lmc/ | |||
| 43 | 35 | ||
| 44 | obj-$(CONFIG_DLCI) += dlci.o | 36 | obj-$(CONFIG_DLCI) += dlci.o |
| 45 | obj-$(CONFIG_SDLA) += sdla.o | 37 | obj-$(CONFIG_SDLA) += sdla.o |
| 46 | ifeq ($(CONFIG_WANPIPE_MULTPPP),y) | ||
| 47 | obj-$(CONFIG_VENDOR_SANGOMA) += sdladrv.o wanpipe.o syncppp.o | ||
| 48 | else | ||
| 49 | obj-$(CONFIG_VENDOR_SANGOMA) += sdladrv.o wanpipe.o | ||
| 50 | endif | ||
| 51 | obj-$(CONFIG_CYCLADES_SYNC) += cycx_drv.o cyclomx.o | 38 | obj-$(CONFIG_CYCLADES_SYNC) += cycx_drv.o cyclomx.o |
| 52 | obj-$(CONFIG_LAPBETHER) += lapbether.o | 39 | obj-$(CONFIG_LAPBETHER) += lapbether.o |
| 53 | obj-$(CONFIG_SBNI) += sbni.o | 40 | obj-$(CONFIG_SBNI) += sbni.o |
diff --git a/drivers/net/wan/sdla_chdlc.c b/drivers/net/wan/sdla_chdlc.c deleted file mode 100644 index 496d29237e92..000000000000 --- a/drivers/net/wan/sdla_chdlc.c +++ /dev/null | |||
| @@ -1,4428 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdla_chdlc.c WANPIPE(tm) Multiprotocol WAN Link Driver. Cisco HDLC module. | ||
| 3 | * | ||
| 4 | * Authors: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * Gideon Hack | ||
| 6 | * | ||
| 7 | * Copyright: (c) 1995-2001 Sangoma Technologies Inc. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * as published by the Free Software Foundation; either version | ||
| 12 | * 2 of the License, or (at your option) any later version. | ||
| 13 | * ============================================================================ | ||
| 14 | * Feb 28, 2001 Nenad Corbic Updated if_tx_timeout() routine for | ||
| 15 | * 2.4.X kernels. | ||
| 16 | * Jan 25, 2001 Nenad Corbic Added a TTY Sync serial driver over the | ||
| 17 | * HDLC streaming protocol | ||
| 18 | * Added a TTY Async serial driver over the | ||
| 19 | * Async protocol. | ||
| 20 | * Dec 15, 2000 Nenad Corbic Updated for 2.4.X Kernel support | ||
| 21 | * Nov 13, 2000 Nenad Corbic Added true interface type encoding option. | ||
| 22 | * Tcpdump doesn't support CHDLC inteface | ||
| 23 | * types, to fix this "true type" option will set | ||
| 24 | * the interface type to RAW IP mode. | ||
| 25 | * Nov 07, 2000 Nenad Corbic Added security features for UDP debugging: | ||
| 26 | * Deny all and specify allowed requests. | ||
| 27 | * Jun 20, 2000 Nenad Corbic Fixed the API IP ERROR bug. Caused by the | ||
| 28 | * latest update. | ||
| 29 | * May 09, 2000 Nenad Corbic Option to bring down an interface | ||
| 30 | * upon disconnect. | ||
| 31 | * Mar 23, 2000 Nenad Corbic Improved task queue, bh handling. | ||
| 32 | * Mar 16, 2000 Nenad Corbic Fixed the SLARP Dynamic IP addressing. | ||
| 33 | * Mar 06, 2000 Nenad Corbic Bug Fix: corrupted mbox recovery. | ||
| 34 | * Feb 10, 2000 Gideon Hack Added ASYNC support. | ||
| 35 | * Feb 09, 2000 Nenad Corbic Fixed two shutdown bugs in update() and | ||
| 36 | * if_stats() functions. | ||
| 37 | * Jan 24, 2000 Nenad Corbic Fixed a startup wanpipe state racing, | ||
| 38 | * condition between if_open and isr. | ||
| 39 | * Jan 10, 2000 Nenad Corbic Added new socket API support. | ||
| 40 | * Dev 15, 1999 Nenad Corbic Fixed up header files for 2.0.X kernels | ||
| 41 | * Nov 20, 1999 Nenad Corbic Fixed zero length API bug. | ||
| 42 | * Sep 30, 1999 Nenad Corbic Fixed dynamic IP and route setup. | ||
| 43 | * Sep 23, 1999 Nenad Corbic Added SMP support, fixed tracing | ||
| 44 | * Sep 13, 1999 Nenad Corbic Split up Port 0 and 1 into separate devices. | ||
| 45 | * Jun 02, 1999 Gideon Hack Added support for the S514 adapter. | ||
| 46 | * Oct 30, 1998 Jaspreet Singh Added Support for CHDLC API (HDLC STREAMING). | ||
| 47 | * Oct 28, 1998 Jaspreet Singh Added Support for Dual Port CHDLC. | ||
| 48 | * Aug 07, 1998 David Fong Initial version. | ||
| 49 | *****************************************************************************/ | ||
| 50 | |||
| 51 | #include <linux/module.h> | ||
| 52 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 53 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 54 | #include <linux/errno.h> /* return codes */ | ||
| 55 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 56 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 57 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 58 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 59 | #include <linux/if_arp.h> /* ARPHRD_* defines */ | ||
| 60 | |||
| 61 | |||
| 62 | #include <asm/uaccess.h> | ||
| 63 | #include <linux/inetdevice.h> | ||
| 64 | #include <linux/netdevice.h> | ||
| 65 | |||
| 66 | #include <linux/in.h> /* sockaddr_in */ | ||
| 67 | #include <linux/inet.h> | ||
| 68 | #include <linux/if.h> | ||
| 69 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 70 | #include <linux/sdlapci.h> | ||
| 71 | #include <asm/io.h> | ||
| 72 | |||
| 73 | #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */ | ||
| 74 | #include <linux/sdla_asy.h> /* CHDLC (async) API definitions */ | ||
| 75 | |||
| 76 | #include <linux/if_wanpipe_common.h> /* Socket Driver common area */ | ||
| 77 | #include <linux/if_wanpipe.h> | ||
| 78 | |||
| 79 | /* TTY Includes */ | ||
| 80 | #include <linux/tty.h> | ||
| 81 | #include <linux/tty_flip.h> | ||
| 82 | #include <linux/serial.h> | ||
| 83 | |||
| 84 | |||
| 85 | /****** Defines & Macros ****************************************************/ | ||
| 86 | |||
| 87 | /* reasons for enabling the timer interrupt on the adapter */ | ||
| 88 | #define TMR_INT_ENABLED_UDP 0x01 | ||
| 89 | #define TMR_INT_ENABLED_UPDATE 0x02 | ||
| 90 | #define TMR_INT_ENABLED_CONFIG 0x10 | ||
| 91 | |||
| 92 | #define MAX_IP_ERRORS 10 | ||
| 93 | |||
| 94 | #define TTY_CHDLC_MAX_MTU 2000 | ||
| 95 | #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */ | ||
| 96 | #define CHDLC_HDR_LEN 1 | ||
| 97 | |||
| 98 | #define CHDLC_API 0x01 | ||
| 99 | |||
| 100 | #define PORT(x) (x == 0 ? "PRIMARY" : "SECONDARY" ) | ||
| 101 | #define MAX_BH_BUFF 10 | ||
| 102 | |||
| 103 | //#define PRINT_DEBUG | ||
| 104 | #ifdef PRINT_DEBUG | ||
| 105 | #define dbg_printk(format, a...) printk(format, ## a) | ||
| 106 | #else | ||
| 107 | #define dbg_printk(format, a...) | ||
| 108 | #endif | ||
| 109 | |||
| 110 | /******Data Structures*****************************************************/ | ||
| 111 | |||
| 112 | /* This structure is placed in the private data area of the device structure. | ||
| 113 | * The card structure used to occupy the private area but now the following | ||
| 114 | * structure will incorporate the card structure along with CHDLC specific data | ||
| 115 | */ | ||
| 116 | |||
| 117 | typedef struct chdlc_private_area | ||
| 118 | { | ||
| 119 | wanpipe_common_t common; | ||
| 120 | sdla_t *card; | ||
| 121 | int TracingEnabled; /* For enabling Tracing */ | ||
| 122 | unsigned long curr_trace_addr; /* Used for Tracing */ | ||
| 123 | unsigned long start_trace_addr; | ||
| 124 | unsigned long end_trace_addr; | ||
| 125 | unsigned long base_addr_trace_buffer; | ||
| 126 | unsigned long end_addr_trace_buffer; | ||
| 127 | unsigned short number_trace_elements; | ||
| 128 | unsigned available_buffer_space; | ||
| 129 | unsigned long router_start_time; | ||
| 130 | unsigned char route_status; | ||
| 131 | unsigned char route_removed; | ||
| 132 | unsigned long tick_counter; /* For 5s timeout counter */ | ||
| 133 | unsigned long router_up_time; | ||
| 134 | u32 IP_address; /* IP addressing */ | ||
| 135 | u32 IP_netmask; | ||
| 136 | u32 ip_local; | ||
| 137 | u32 ip_remote; | ||
| 138 | u32 ip_local_tmp; | ||
| 139 | u32 ip_remote_tmp; | ||
| 140 | u8 ip_error; | ||
| 141 | u8 config_chdlc; | ||
| 142 | u8 config_chdlc_timeout; | ||
| 143 | unsigned char mc; /* Mulitcast support on/off */ | ||
| 144 | unsigned short udp_pkt_lgth; /* udp packet processing */ | ||
| 145 | char udp_pkt_src; | ||
| 146 | char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; | ||
| 147 | unsigned short timer_int_enabled; | ||
| 148 | char update_comms_stats; /* updating comms stats */ | ||
| 149 | |||
| 150 | bh_data_t *bh_head; /* Circular buffer for chdlc_bh */ | ||
| 151 | unsigned long tq_working; | ||
| 152 | volatile int bh_write; | ||
| 153 | volatile int bh_read; | ||
| 154 | atomic_t bh_buff_used; | ||
| 155 | |||
| 156 | unsigned char interface_down; | ||
| 157 | |||
| 158 | /* Polling work queue entry. Each interface | ||
| 159 | * has its own work queue entry, which is used | ||
| 160 | * to defer events from the interrupt */ | ||
| 161 | struct work_struct poll_work; | ||
| 162 | struct timer_list poll_delay_timer; | ||
| 163 | |||
| 164 | u8 gateway; | ||
| 165 | u8 true_if_encoding; | ||
| 166 | //FIXME: add driver stats as per frame relay! | ||
| 167 | |||
| 168 | } chdlc_private_area_t; | ||
| 169 | |||
| 170 | /* Route Status options */ | ||
| 171 | #define NO_ROUTE 0x00 | ||
| 172 | #define ADD_ROUTE 0x01 | ||
| 173 | #define ROUTE_ADDED 0x02 | ||
| 174 | #define REMOVE_ROUTE 0x03 | ||
| 175 | |||
| 176 | |||
| 177 | /* variable for keeping track of enabling/disabling FT1 monitor status */ | ||
| 178 | static int rCount = 0; | ||
| 179 | |||
| 180 | /* variable for tracking how many interfaces to open for WANPIPE on the | ||
| 181 | two ports */ | ||
| 182 | |||
| 183 | extern void disable_irq(unsigned int); | ||
| 184 | extern void enable_irq(unsigned int); | ||
| 185 | |||
| 186 | /****** Function Prototypes *************************************************/ | ||
| 187 | /* WAN link driver entry points. These are called by the WAN router module. */ | ||
| 188 | static int update(struct wan_device* wandev); | ||
| 189 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 190 | wanif_conf_t* conf); | ||
| 191 | |||
| 192 | /* Network device interface */ | ||
| 193 | static int if_init(struct net_device* dev); | ||
| 194 | static int if_open(struct net_device* dev); | ||
| 195 | static int if_close(struct net_device* dev); | ||
| 196 | static int if_header(struct sk_buff* skb, struct net_device* dev, | ||
| 197 | unsigned short type, void* daddr, void* saddr, | ||
| 198 | unsigned len); | ||
| 199 | |||
| 200 | static int if_rebuild_hdr (struct sk_buff *skb); | ||
| 201 | static struct net_device_stats* if_stats(struct net_device* dev); | ||
| 202 | |||
| 203 | static int if_send(struct sk_buff* skb, struct net_device* dev); | ||
| 204 | |||
| 205 | /* CHDLC Firmware interface functions */ | ||
| 206 | static int chdlc_configure (sdla_t* card, void* data); | ||
| 207 | static int chdlc_comm_enable (sdla_t* card); | ||
| 208 | static int chdlc_read_version (sdla_t* card, char* str); | ||
| 209 | static int chdlc_set_intr_mode (sdla_t* card, unsigned mode); | ||
| 210 | static int chdlc_send (sdla_t* card, void* data, unsigned len); | ||
| 211 | static int chdlc_read_comm_err_stats (sdla_t* card); | ||
| 212 | static int chdlc_read_op_stats (sdla_t* card); | ||
| 213 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb); | ||
| 214 | |||
| 215 | |||
| 216 | static int chdlc_disable_comm_shutdown (sdla_t *card); | ||
| 217 | static void if_tx_timeout(struct net_device *dev); | ||
| 218 | |||
| 219 | /* Miscellaneous CHDLC Functions */ | ||
| 220 | static int set_chdlc_config (sdla_t* card); | ||
| 221 | static void init_chdlc_tx_rx_buff( sdla_t* card); | ||
| 222 | static int process_chdlc_exception(sdla_t *card); | ||
| 223 | static int process_global_exception(sdla_t *card); | ||
| 224 | static int update_comms_stats(sdla_t* card, | ||
| 225 | chdlc_private_area_t* chdlc_priv_area); | ||
| 226 | static int configure_ip (sdla_t* card); | ||
| 227 | static int unconfigure_ip (sdla_t* card); | ||
| 228 | static void process_route(sdla_t *card); | ||
| 229 | static void port_set_state (sdla_t *card, int); | ||
| 230 | static int config_chdlc (sdla_t *card); | ||
| 231 | static void disable_comm (sdla_t *card); | ||
| 232 | |||
| 233 | static void trigger_chdlc_poll(struct net_device *dev); | ||
| 234 | static void chdlc_poll(struct net_device *dev); | ||
| 235 | static void chdlc_poll_delay (unsigned long dev_ptr); | ||
| 236 | |||
| 237 | |||
| 238 | /* Miscellaneous asynchronous interface Functions */ | ||
| 239 | static int set_asy_config (sdla_t* card); | ||
| 240 | static int asy_comm_enable (sdla_t* card); | ||
| 241 | |||
| 242 | /* Interrupt handlers */ | ||
| 243 | static void wpc_isr (sdla_t* card); | ||
| 244 | static void rx_intr (sdla_t* card); | ||
| 245 | static void timer_intr(sdla_t *); | ||
| 246 | |||
| 247 | /* Bottom half handlers */ | ||
| 248 | static void chdlc_work(struct net_device *dev); | ||
| 249 | static int chdlc_work_cleanup(struct net_device *dev); | ||
| 250 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb); | ||
| 251 | |||
| 252 | /* Miscellaneous functions */ | ||
| 253 | static int chk_bcast_mcast_addr(sdla_t* card, struct net_device* dev, | ||
| 254 | struct sk_buff *skb); | ||
| 255 | static int reply_udp( unsigned char *data, unsigned int mbox_len ); | ||
| 256 | static int intr_test( sdla_t* card); | ||
| 257 | static int udp_pkt_type( struct sk_buff *skb , sdla_t* card); | ||
| 258 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 259 | struct sk_buff *skb, struct net_device* dev, | ||
| 260 | chdlc_private_area_t* chdlc_priv_area); | ||
| 261 | static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev, | ||
| 262 | chdlc_private_area_t* chdlc_priv_area); | ||
| 263 | static unsigned short calc_checksum (char *, int); | ||
| 264 | static void s508_lock (sdla_t *card, unsigned long *smp_flags); | ||
| 265 | static void s508_unlock (sdla_t *card, unsigned long *smp_flags); | ||
| 266 | |||
| 267 | |||
| 268 | static int Intr_test_counter; | ||
| 269 | |||
| 270 | /* TTY Global Definitions */ | ||
| 271 | |||
| 272 | #define NR_PORTS 4 | ||
| 273 | #define WAN_TTY_MAJOR 226 | ||
| 274 | #define WAN_TTY_MINOR 0 | ||
| 275 | |||
| 276 | #define WAN_CARD(port) (tty_card_map[port]) | ||
| 277 | #define MIN_PORT 0 | ||
| 278 | #define MAX_PORT NR_PORTS-1 | ||
| 279 | |||
| 280 | #define CRC_LENGTH 2 | ||
| 281 | |||
| 282 | static int wanpipe_tty_init(sdla_t *card); | ||
| 283 | static void wanpipe_tty_receive(sdla_t *, unsigned, unsigned int); | ||
| 284 | static void wanpipe_tty_trigger_poll(sdla_t *card); | ||
| 285 | |||
| 286 | static struct tty_driver serial_driver; | ||
| 287 | static int tty_init_cnt=0; | ||
| 288 | |||
| 289 | static struct serial_state rs_table[NR_PORTS]; | ||
| 290 | |||
| 291 | static char tty_driver_mode=WANOPT_TTY_SYNC; | ||
| 292 | |||
| 293 | static char *opt_decode[] = {"NONE","CRTSCTS","XONXOFF-RX", | ||
| 294 | "CRTSCTS XONXOFF-RX","XONXOFF-TX", | ||
| 295 | "CRTSCTS XONXOFF-TX","CRTSCTS XONXOFF"}; | ||
| 296 | static char *p_decode[] = {"NONE","ODD","EVEN"}; | ||
| 297 | |||
| 298 | static void* tty_card_map[NR_PORTS] = {NULL,NULL,NULL,NULL}; | ||
| 299 | |||
| 300 | |||
| 301 | /****** Public Functions ****************************************************/ | ||
| 302 | |||
| 303 | /*============================================================================ | ||
| 304 | * Cisco HDLC protocol initialization routine. | ||
| 305 | * | ||
| 306 | * This routine is called by the main WANPIPE module during setup. At this | ||
| 307 | * point adapter is completely initialized and firmware is running. | ||
| 308 | * o read firmware version (to make sure it's alive) | ||
| 309 | * o configure adapter | ||
| 310 | * o initialize protocol-specific fields of the adapter data space. | ||
| 311 | * | ||
| 312 | * Return: 0 o.k. | ||
| 313 | * < 0 failure. | ||
| 314 | */ | ||
| 315 | int wpc_init (sdla_t* card, wandev_conf_t* conf) | ||
| 316 | { | ||
| 317 | unsigned char port_num; | ||
| 318 | int err; | ||
| 319 | unsigned long max_permitted_baud = 0; | ||
| 320 | SHARED_MEMORY_INFO_STRUCT *flags; | ||
| 321 | |||
| 322 | union | ||
| 323 | { | ||
| 324 | char str[80]; | ||
| 325 | } u; | ||
| 326 | volatile CHDLC_MAILBOX_STRUCT* mb; | ||
| 327 | CHDLC_MAILBOX_STRUCT* mb1; | ||
| 328 | unsigned long timeout; | ||
| 329 | |||
| 330 | /* Verify configuration ID */ | ||
| 331 | if (conf->config_id != WANCONFIG_CHDLC) { | ||
| 332 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 333 | card->devname, conf->config_id); | ||
| 334 | return -EINVAL; | ||
| 335 | } | ||
| 336 | |||
| 337 | /* Find out which Port to use */ | ||
| 338 | if ((conf->comm_port == WANOPT_PRI) || (conf->comm_port == WANOPT_SEC)){ | ||
| 339 | if (card->next){ | ||
| 340 | |||
| 341 | if (conf->comm_port != card->next->u.c.comm_port){ | ||
| 342 | card->u.c.comm_port = conf->comm_port; | ||
| 343 | }else{ | ||
| 344 | printk(KERN_INFO "%s: ERROR - %s port used!\n", | ||
| 345 | card->wandev.name, PORT(conf->comm_port)); | ||
| 346 | return -EINVAL; | ||
| 347 | } | ||
| 348 | }else{ | ||
| 349 | card->u.c.comm_port = conf->comm_port; | ||
| 350 | } | ||
| 351 | }else{ | ||
| 352 | printk(KERN_INFO "%s: ERROR - Invalid Port Selected!\n", | ||
| 353 | card->wandev.name); | ||
| 354 | return -EINVAL; | ||
| 355 | } | ||
| 356 | |||
| 357 | |||
| 358 | /* Initialize protocol-specific fields */ | ||
| 359 | if(card->hw.type != SDLA_S514){ | ||
| 360 | |||
| 361 | if (card->u.c.comm_port == WANOPT_PRI){ | ||
| 362 | card->mbox = (void *) card->hw.dpmbase; | ||
| 363 | }else{ | ||
| 364 | card->mbox = (void *) card->hw.dpmbase + | ||
| 365 | SEC_BASE_ADDR_MB_STRUCT - PRI_BASE_ADDR_MB_STRUCT; | ||
| 366 | } | ||
| 367 | }else{ | ||
| 368 | /* for a S514 adapter, set a pointer to the actual mailbox in the */ | ||
| 369 | /* allocated virtual memory area */ | ||
| 370 | if (card->u.c.comm_port == WANOPT_PRI){ | ||
| 371 | card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT; | ||
| 372 | }else{ | ||
| 373 | card->mbox = (void *) card->hw.dpmbase + SEC_BASE_ADDR_MB_STRUCT; | ||
| 374 | } | ||
| 375 | } | ||
| 376 | |||
| 377 | mb = mb1 = card->mbox; | ||
| 378 | |||
| 379 | if (!card->configured){ | ||
| 380 | |||
| 381 | /* The board will place an 'I' in the return code to indicate that it is | ||
| 382 | ready to accept commands. We expect this to be completed in less | ||
| 383 | than 1 second. */ | ||
| 384 | |||
| 385 | timeout = jiffies; | ||
| 386 | while (mb->return_code != 'I') /* Wait 1s for board to initialize */ | ||
| 387 | if ((jiffies - timeout) > 1*HZ) break; | ||
| 388 | |||
| 389 | if (mb->return_code != 'I') { | ||
| 390 | printk(KERN_INFO | ||
| 391 | "%s: Initialization not completed by adapter\n", | ||
| 392 | card->devname); | ||
| 393 | printk(KERN_INFO "Please contact Sangoma representative.\n"); | ||
| 394 | return -EIO; | ||
| 395 | } | ||
| 396 | } | ||
| 397 | |||
| 398 | /* Read firmware version. Note that when adapter initializes, it | ||
| 399 | * clears the mailbox, so it may appear that the first command was | ||
| 400 | * executed successfully when in fact it was merely erased. To work | ||
| 401 | * around this, we execute the first command twice. | ||
| 402 | */ | ||
| 403 | |||
| 404 | if (chdlc_read_version(card, u.str)) | ||
| 405 | return -EIO; | ||
| 406 | |||
| 407 | printk(KERN_INFO "%s: Running Cisco HDLC firmware v%s\n", | ||
| 408 | card->devname, u.str); | ||
| 409 | |||
| 410 | card->isr = &wpc_isr; | ||
| 411 | card->poll = NULL; | ||
| 412 | card->exec = NULL; | ||
| 413 | card->wandev.update = &update; | ||
| 414 | card->wandev.new_if = &new_if; | ||
| 415 | card->wandev.del_if = NULL; | ||
| 416 | card->wandev.udp_port = conf->udp_port; | ||
| 417 | card->disable_comm = &disable_comm; | ||
| 418 | card->wandev.new_if_cnt = 0; | ||
| 419 | |||
| 420 | /* reset the number of times the 'update()' proc has been called */ | ||
| 421 | card->u.c.update_call_count = 0; | ||
| 422 | |||
| 423 | card->wandev.ttl = conf->ttl; | ||
| 424 | card->wandev.interface = conf->interface; | ||
| 425 | |||
| 426 | if ((card->u.c.comm_port == WANOPT_SEC && conf->interface == WANOPT_V35)&& | ||
| 427 | card->hw.type != SDLA_S514){ | ||
| 428 | printk(KERN_INFO "%s: ERROR - V35 Interface not supported on S508 %s port \n", | ||
| 429 | card->devname, PORT(card->u.c.comm_port)); | ||
| 430 | return -EIO; | ||
| 431 | } | ||
| 432 | |||
| 433 | card->wandev.clocking = conf->clocking; | ||
| 434 | |||
| 435 | port_num = card->u.c.comm_port; | ||
| 436 | |||
| 437 | /* in API mode, we can configure for "receive only" buffering */ | ||
| 438 | if(card->hw.type == SDLA_S514) { | ||
| 439 | card->u.c.receive_only = conf->receive_only; | ||
| 440 | if(conf->receive_only) { | ||
| 441 | printk(KERN_INFO | ||
| 442 | "%s: Configured for 'receive only' mode\n", | ||
| 443 | card->devname); | ||
| 444 | } | ||
| 445 | } | ||
| 446 | |||
| 447 | /* Setup Port Bps */ | ||
| 448 | |||
| 449 | if(card->wandev.clocking) { | ||
| 450 | if((port_num == WANOPT_PRI) || card->u.c.receive_only) { | ||
| 451 | /* For Primary Port 0 */ | ||
| 452 | max_permitted_baud = | ||
| 453 | (card->hw.type == SDLA_S514) ? | ||
| 454 | PRI_MAX_BAUD_RATE_S514 : | ||
| 455 | PRI_MAX_BAUD_RATE_S508; | ||
| 456 | |||
| 457 | }else if(port_num == WANOPT_SEC) { | ||
| 458 | /* For Secondary Port 1 */ | ||
| 459 | max_permitted_baud = | ||
| 460 | (card->hw.type == SDLA_S514) ? | ||
| 461 | SEC_MAX_BAUD_RATE_S514 : | ||
| 462 | SEC_MAX_BAUD_RATE_S508; | ||
| 463 | } | ||
| 464 | |||
| 465 | if(conf->bps > max_permitted_baud) { | ||
| 466 | conf->bps = max_permitted_baud; | ||
| 467 | printk(KERN_INFO "%s: Baud too high!\n", | ||
| 468 | card->wandev.name); | ||
| 469 | printk(KERN_INFO "%s: Baud rate set to %lu bps\n", | ||
| 470 | card->wandev.name, max_permitted_baud); | ||
| 471 | } | ||
| 472 | card->wandev.bps = conf->bps; | ||
| 473 | }else{ | ||
| 474 | card->wandev.bps = 0; | ||
| 475 | } | ||
| 476 | |||
| 477 | /* Setup the Port MTU */ | ||
| 478 | if((port_num == WANOPT_PRI) || card->u.c.receive_only) { | ||
| 479 | |||
| 480 | /* For Primary Port 0 */ | ||
| 481 | card->wandev.mtu = | ||
| 482 | (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ? | ||
| 483 | min_t(unsigned int, conf->mtu, PRI_MAX_NO_DATA_BYTES_IN_FRAME) : | ||
| 484 | CHDLC_DFLT_DATA_LEN; | ||
| 485 | } else if(port_num == WANOPT_SEC) { | ||
| 486 | /* For Secondary Port 1 */ | ||
| 487 | card->wandev.mtu = | ||
| 488 | (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ? | ||
| 489 | min_t(unsigned int, conf->mtu, SEC_MAX_NO_DATA_BYTES_IN_FRAME) : | ||
| 490 | CHDLC_DFLT_DATA_LEN; | ||
| 491 | } | ||
| 492 | |||
| 493 | /* Set up the interrupt status area */ | ||
| 494 | /* Read the CHDLC Configuration and obtain: | ||
| 495 | * Ptr to shared memory infor struct | ||
| 496 | * Use this pointer to calculate the value of card->u.c.flags ! | ||
| 497 | */ | ||
| 498 | mb1->buffer_length = 0; | ||
| 499 | mb1->command = READ_CHDLC_CONFIGURATION; | ||
| 500 | err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT; | ||
| 501 | if(err != COMMAND_OK) { | ||
| 502 | if(card->hw.type != SDLA_S514) | ||
| 503 | enable_irq(card->hw.irq); | ||
| 504 | |||
| 505 | chdlc_error(card, err, mb1); | ||
| 506 | return -EIO; | ||
| 507 | } | ||
| 508 | |||
| 509 | if(card->hw.type == SDLA_S514){ | ||
| 510 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 511 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 512 | ptr_shared_mem_info_struct)); | ||
| 513 | }else{ | ||
| 514 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 515 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 516 | ptr_shared_mem_info_struct % SDLA_WINDOWSIZE)); | ||
| 517 | } | ||
| 518 | |||
| 519 | flags = card->u.c.flags; | ||
| 520 | |||
| 521 | /* This is for the ports link state */ | ||
| 522 | card->wandev.state = WAN_DUALPORT; | ||
| 523 | card->u.c.state = WAN_DISCONNECTED; | ||
| 524 | |||
| 525 | |||
| 526 | if (!card->wandev.piggyback){ | ||
| 527 | int err; | ||
| 528 | |||
| 529 | /* Perform interrupt testing */ | ||
| 530 | err = intr_test(card); | ||
| 531 | |||
| 532 | if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) { | ||
| 533 | printk(KERN_INFO "%s: Interrupt test failed (%i)\n", | ||
| 534 | card->devname, Intr_test_counter); | ||
| 535 | printk(KERN_INFO "%s: Please choose another interrupt\n", | ||
| 536 | card->devname); | ||
| 537 | return -EIO; | ||
| 538 | } | ||
| 539 | |||
| 540 | printk(KERN_INFO "%s: Interrupt test passed (%i)\n", | ||
| 541 | card->devname, Intr_test_counter); | ||
| 542 | card->configured = 1; | ||
| 543 | } | ||
| 544 | |||
| 545 | if ((card->tty_opt=conf->tty) == WANOPT_YES){ | ||
| 546 | int err; | ||
| 547 | card->tty_minor = conf->tty_minor; | ||
| 548 | |||
| 549 | /* On ASYNC connections internal clocking | ||
| 550 | * is mandatory */ | ||
| 551 | if ((card->u.c.async_mode = conf->tty_mode)){ | ||
| 552 | card->wandev.clocking = 1; | ||
| 553 | } | ||
| 554 | err=wanpipe_tty_init(card); | ||
| 555 | if (err){ | ||
| 556 | return err; | ||
| 557 | } | ||
| 558 | }else{ | ||
| 559 | |||
| 560 | |||
| 561 | if (chdlc_set_intr_mode(card, APP_INT_ON_TIMER)){ | ||
| 562 | printk (KERN_INFO "%s: " | ||
| 563 | "Failed to set interrupt triggers!\n", | ||
| 564 | card->devname); | ||
| 565 | return -EIO; | ||
| 566 | } | ||
| 567 | |||
| 568 | /* Mask the Timer interrupt */ | ||
| 569 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 570 | ~APP_INT_ON_TIMER; | ||
| 571 | } | ||
| 572 | |||
| 573 | /* If we are using CHDLC in backup mode, this flag will | ||
| 574 | * indicate not to look for IP addresses in config_chdlc()*/ | ||
| 575 | card->u.c.backup = conf->backup; | ||
| 576 | |||
| 577 | printk(KERN_INFO "\n"); | ||
| 578 | |||
| 579 | return 0; | ||
| 580 | } | ||
| 581 | |||
| 582 | /******* WAN Device Driver Entry Points *************************************/ | ||
| 583 | |||
| 584 | /*============================================================================ | ||
| 585 | * Update device status & statistics | ||
| 586 | * This procedure is called when updating the PROC file system and returns | ||
| 587 | * various communications statistics. These statistics are accumulated from 3 | ||
| 588 | * different locations: | ||
| 589 | * 1) The 'if_stats' recorded for the device. | ||
| 590 | * 2) Communication error statistics on the adapter. | ||
| 591 | * 3) CHDLC operational statistics on the adapter. | ||
| 592 | * The board level statistics are read during a timer interrupt. Note that we | ||
| 593 | * read the error and operational statistics during consecitive timer ticks so | ||
| 594 | * as to minimize the time that we are inside the interrupt handler. | ||
| 595 | * | ||
| 596 | */ | ||
| 597 | static int update(struct wan_device* wandev) | ||
| 598 | { | ||
| 599 | sdla_t* card = wandev->private; | ||
| 600 | struct net_device* dev; | ||
| 601 | volatile chdlc_private_area_t* chdlc_priv_area; | ||
| 602 | SHARED_MEMORY_INFO_STRUCT *flags; | ||
| 603 | unsigned long timeout; | ||
| 604 | |||
| 605 | /* sanity checks */ | ||
| 606 | if((wandev == NULL) || (wandev->private == NULL)) | ||
| 607 | return -EFAULT; | ||
| 608 | |||
| 609 | if(wandev->state == WAN_UNCONFIGURED) | ||
| 610 | return -ENODEV; | ||
| 611 | |||
| 612 | /* more sanity checks */ | ||
| 613 | if(!card->u.c.flags) | ||
| 614 | return -ENODEV; | ||
| 615 | |||
| 616 | if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) | ||
| 617 | return -EAGAIN; | ||
| 618 | |||
| 619 | if((dev=card->wandev.dev) == NULL) | ||
| 620 | return -ENODEV; | ||
| 621 | |||
| 622 | if((chdlc_priv_area=dev->priv) == NULL) | ||
| 623 | return -ENODEV; | ||
| 624 | |||
| 625 | flags = card->u.c.flags; | ||
| 626 | if(chdlc_priv_area->update_comms_stats){ | ||
| 627 | return -EAGAIN; | ||
| 628 | } | ||
| 629 | |||
| 630 | /* we will need 2 timer interrupts to complete the */ | ||
| 631 | /* reading of the statistics */ | ||
| 632 | chdlc_priv_area->update_comms_stats = 2; | ||
| 633 | flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER; | ||
| 634 | chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE; | ||
| 635 | |||
| 636 | /* wait a maximum of 1 second for the statistics to be updated */ | ||
| 637 | timeout = jiffies; | ||
| 638 | for(;;) { | ||
| 639 | if(chdlc_priv_area->update_comms_stats == 0) | ||
| 640 | break; | ||
| 641 | if ((jiffies - timeout) > (1 * HZ)){ | ||
| 642 | chdlc_priv_area->update_comms_stats = 0; | ||
| 643 | chdlc_priv_area->timer_int_enabled &= | ||
| 644 | ~TMR_INT_ENABLED_UPDATE; | ||
| 645 | return -EAGAIN; | ||
| 646 | } | ||
| 647 | } | ||
| 648 | |||
| 649 | return 0; | ||
| 650 | } | ||
| 651 | |||
| 652 | |||
| 653 | /*============================================================================ | ||
| 654 | * Create new logical channel. | ||
| 655 | * This routine is called by the router when ROUTER_IFNEW IOCTL is being | ||
| 656 | * handled. | ||
| 657 | * o parse media- and hardware-specific configuration | ||
| 658 | * o make sure that a new channel can be created | ||
| 659 | * o allocate resources, if necessary | ||
| 660 | * o prepare network device structure for registaration. | ||
| 661 | * | ||
| 662 | * Return: 0 o.k. | ||
| 663 | * < 0 failure (channel will not be created) | ||
| 664 | */ | ||
| 665 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 666 | wanif_conf_t* conf) | ||
| 667 | { | ||
| 668 | sdla_t* card = wandev->private; | ||
| 669 | chdlc_private_area_t* chdlc_priv_area; | ||
| 670 | |||
| 671 | |||
| 672 | printk(KERN_INFO "%s: Configuring Interface: %s\n", | ||
| 673 | card->devname, conf->name); | ||
| 674 | |||
| 675 | if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) { | ||
| 676 | printk(KERN_INFO "%s: Invalid interface name!\n", | ||
| 677 | card->devname); | ||
| 678 | return -EINVAL; | ||
| 679 | } | ||
| 680 | |||
| 681 | /* allocate and initialize private data */ | ||
| 682 | chdlc_priv_area = kmalloc(sizeof(chdlc_private_area_t), GFP_KERNEL); | ||
| 683 | |||
| 684 | if(chdlc_priv_area == NULL) | ||
| 685 | return -ENOMEM; | ||
| 686 | |||
| 687 | memset(chdlc_priv_area, 0, sizeof(chdlc_private_area_t)); | ||
| 688 | |||
| 689 | chdlc_priv_area->card = card; | ||
| 690 | chdlc_priv_area->common.sk = NULL; | ||
| 691 | chdlc_priv_area->common.func = NULL; | ||
| 692 | |||
| 693 | /* initialize data */ | ||
| 694 | strcpy(card->u.c.if_name, conf->name); | ||
| 695 | |||
| 696 | if(card->wandev.new_if_cnt > 0) { | ||
| 697 | kfree(chdlc_priv_area); | ||
| 698 | return -EEXIST; | ||
| 699 | } | ||
| 700 | |||
| 701 | card->wandev.new_if_cnt++; | ||
| 702 | |||
| 703 | chdlc_priv_area->TracingEnabled = 0; | ||
| 704 | chdlc_priv_area->route_status = NO_ROUTE; | ||
| 705 | chdlc_priv_area->route_removed = 0; | ||
| 706 | |||
| 707 | card->u.c.async_mode = conf->async_mode; | ||
| 708 | |||
| 709 | /* setup for asynchronous mode */ | ||
| 710 | if(conf->async_mode) { | ||
| 711 | printk(KERN_INFO "%s: Configuring for asynchronous mode\n", | ||
| 712 | wandev->name); | ||
| 713 | |||
| 714 | if(card->u.c.comm_port == WANOPT_PRI) { | ||
| 715 | printk(KERN_INFO | ||
| 716 | "%s:Asynchronous mode on secondary port only\n", | ||
| 717 | wandev->name); | ||
| 718 | kfree(chdlc_priv_area); | ||
| 719 | return -EINVAL; | ||
| 720 | } | ||
| 721 | |||
| 722 | if(strcmp(conf->usedby, "WANPIPE") == 0) { | ||
| 723 | printk(KERN_INFO | ||
| 724 | "%s: Running in WANIPE Async Mode\n", wandev->name); | ||
| 725 | card->u.c.usedby = WANPIPE; | ||
| 726 | }else{ | ||
| 727 | card->u.c.usedby = API; | ||
| 728 | } | ||
| 729 | |||
| 730 | if(!card->wandev.clocking) { | ||
| 731 | printk(KERN_INFO | ||
| 732 | "%s: Asynch. clocking must be 'Internal'\n", | ||
| 733 | wandev->name); | ||
| 734 | kfree(chdlc_priv_area); | ||
| 735 | return -EINVAL; | ||
| 736 | } | ||
| 737 | |||
| 738 | if((card->wandev.bps < MIN_ASY_BAUD_RATE) || | ||
| 739 | (card->wandev.bps > MAX_ASY_BAUD_RATE)) { | ||
| 740 | printk(KERN_INFO "%s: Selected baud rate is invalid.\n", | ||
| 741 | wandev->name); | ||
| 742 | printk(KERN_INFO "Must be between %u and %u bps.\n", | ||
| 743 | MIN_ASY_BAUD_RATE, MAX_ASY_BAUD_RATE); | ||
| 744 | kfree(chdlc_priv_area); | ||
| 745 | return -EINVAL; | ||
| 746 | } | ||
| 747 | |||
| 748 | card->u.c.api_options = 0; | ||
| 749 | if (conf->asy_data_trans == WANOPT_YES) { | ||
| 750 | card->u.c.api_options |= ASY_RX_DATA_TRANSPARENT; | ||
| 751 | } | ||
| 752 | |||
| 753 | card->u.c.protocol_options = 0; | ||
| 754 | if (conf->rts_hs_for_receive == WANOPT_YES) { | ||
| 755 | card->u.c.protocol_options |= ASY_RTS_HS_FOR_RX; | ||
| 756 | } | ||
| 757 | if (conf->xon_xoff_hs_for_receive == WANOPT_YES) { | ||
| 758 | card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_RX; | ||
| 759 | } | ||
| 760 | if (conf->xon_xoff_hs_for_transmit == WANOPT_YES) { | ||
| 761 | card->u.c.protocol_options |= ASY_XON_XOFF_HS_FOR_TX; | ||
| 762 | } | ||
| 763 | if (conf->dcd_hs_for_transmit == WANOPT_YES) { | ||
| 764 | card->u.c.protocol_options |= ASY_DCD_HS_FOR_TX; | ||
| 765 | } | ||
| 766 | if (conf->cts_hs_for_transmit == WANOPT_YES) { | ||
| 767 | card->u.c.protocol_options |= ASY_CTS_HS_FOR_TX; | ||
| 768 | } | ||
| 769 | |||
| 770 | card->u.c.tx_bits_per_char = conf->tx_bits_per_char; | ||
| 771 | card->u.c.rx_bits_per_char = conf->rx_bits_per_char; | ||
| 772 | card->u.c.stop_bits = conf->stop_bits; | ||
| 773 | card->u.c.parity = conf->parity; | ||
| 774 | card->u.c.break_timer = conf->break_timer; | ||
| 775 | card->u.c.inter_char_timer = conf->inter_char_timer; | ||
| 776 | card->u.c.rx_complete_length = conf->rx_complete_length; | ||
| 777 | card->u.c.xon_char = conf->xon_char; | ||
| 778 | |||
| 779 | } else { /* setup for synchronous mode */ | ||
| 780 | |||
| 781 | card->u.c.protocol_options = 0; | ||
| 782 | if (conf->ignore_dcd == WANOPT_YES){ | ||
| 783 | card->u.c.protocol_options |= IGNORE_DCD_FOR_LINK_STAT; | ||
| 784 | } | ||
| 785 | if (conf->ignore_cts == WANOPT_YES){ | ||
| 786 | card->u.c.protocol_options |= IGNORE_CTS_FOR_LINK_STAT; | ||
| 787 | } | ||
| 788 | |||
| 789 | if (conf->ignore_keepalive == WANOPT_YES) { | ||
| 790 | card->u.c.protocol_options |= | ||
| 791 | IGNORE_KPALV_FOR_LINK_STAT; | ||
| 792 | card->u.c.kpalv_tx = MIN_Tx_KPALV_TIMER; | ||
| 793 | card->u.c.kpalv_rx = MIN_Rx_KPALV_TIMER; | ||
| 794 | card->u.c.kpalv_err = MIN_KPALV_ERR_TOL; | ||
| 795 | |||
| 796 | } else { /* Do not ignore keepalives */ | ||
| 797 | card->u.c.kpalv_tx = | ||
| 798 | ((conf->keepalive_tx_tmr - MIN_Tx_KPALV_TIMER) | ||
| 799 | >= 0) ? | ||
| 800 | min_t(unsigned int, conf->keepalive_tx_tmr,MAX_Tx_KPALV_TIMER) : | ||
| 801 | DEFAULT_Tx_KPALV_TIMER; | ||
| 802 | |||
| 803 | card->u.c.kpalv_rx = | ||
| 804 | ((conf->keepalive_rx_tmr - MIN_Rx_KPALV_TIMER) | ||
| 805 | >= 0) ? | ||
| 806 | min_t(unsigned int, conf->keepalive_rx_tmr,MAX_Rx_KPALV_TIMER) : | ||
| 807 | DEFAULT_Rx_KPALV_TIMER; | ||
| 808 | |||
| 809 | card->u.c.kpalv_err = | ||
| 810 | ((conf->keepalive_err_margin-MIN_KPALV_ERR_TOL) | ||
| 811 | >= 0) ? | ||
| 812 | min_t(unsigned int, conf->keepalive_err_margin, | ||
| 813 | MAX_KPALV_ERR_TOL) : | ||
| 814 | DEFAULT_KPALV_ERR_TOL; | ||
| 815 | } | ||
| 816 | |||
| 817 | /* Setup slarp timer to control delay between slarps */ | ||
| 818 | card->u.c.slarp_timer = | ||
| 819 | ((conf->slarp_timer - MIN_SLARP_REQ_TIMER) >= 0) ? | ||
| 820 | min_t(unsigned int, conf->slarp_timer, MAX_SLARP_REQ_TIMER) : | ||
| 821 | DEFAULT_SLARP_REQ_TIMER; | ||
| 822 | |||
| 823 | if (conf->hdlc_streaming == WANOPT_YES) { | ||
| 824 | printk(KERN_INFO "%s: Enabling HDLC STREAMING Mode\n", | ||
| 825 | wandev->name); | ||
| 826 | card->u.c.protocol_options = HDLC_STREAMING_MODE; | ||
| 827 | } | ||
| 828 | |||
| 829 | if ((chdlc_priv_area->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){ | ||
| 830 | printk(KERN_INFO | ||
| 831 | "%s: Enabling, true interface type encoding.\n", | ||
| 832 | card->devname); | ||
| 833 | } | ||
| 834 | |||
| 835 | /* Setup wanpipe as a router (WANPIPE) or as an API */ | ||
| 836 | if( strcmp(conf->usedby, "WANPIPE") == 0) { | ||
| 837 | |||
| 838 | printk(KERN_INFO "%s: Running in WANPIPE mode!\n", | ||
| 839 | wandev->name); | ||
| 840 | card->u.c.usedby = WANPIPE; | ||
| 841 | |||
| 842 | /* Option to bring down the interface when | ||
| 843 | * the link goes down */ | ||
| 844 | if (conf->if_down){ | ||
| 845 | set_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down); | ||
| 846 | printk(KERN_INFO | ||
| 847 | "%s: Dynamic interface configuration enabled\n", | ||
| 848 | card->devname); | ||
| 849 | } | ||
| 850 | |||
| 851 | } else if( strcmp(conf->usedby, "API") == 0) { | ||
| 852 | card->u.c.usedby = API; | ||
| 853 | printk(KERN_INFO "%s: Running in API mode !\n", | ||
| 854 | wandev->name); | ||
| 855 | } | ||
| 856 | } | ||
| 857 | |||
| 858 | /* Tells us that if this interface is a | ||
| 859 | * gateway or not */ | ||
| 860 | if ((chdlc_priv_area->gateway = conf->gateway) == WANOPT_YES){ | ||
| 861 | printk(KERN_INFO "%s: Interface %s is set as a gateway.\n", | ||
| 862 | card->devname,card->u.c.if_name); | ||
| 863 | } | ||
| 864 | |||
| 865 | /* Get Multicast Information */ | ||
| 866 | chdlc_priv_area->mc = conf->mc; | ||
| 867 | |||
| 868 | /* prepare network device data space for registration */ | ||
| 869 | strcpy(dev->name,card->u.c.if_name); | ||
| 870 | |||
| 871 | dev->init = &if_init; | ||
| 872 | dev->priv = chdlc_priv_area; | ||
| 873 | |||
| 874 | /* Initialize the polling work routine */ | ||
| 875 | INIT_WORK(&chdlc_priv_area->poll_work, (void*)(void*)chdlc_poll, dev); | ||
| 876 | |||
| 877 | /* Initialize the polling delay timer */ | ||
| 878 | init_timer(&chdlc_priv_area->poll_delay_timer); | ||
| 879 | chdlc_priv_area->poll_delay_timer.data = (unsigned long)dev; | ||
| 880 | chdlc_priv_area->poll_delay_timer.function = chdlc_poll_delay; | ||
| 881 | |||
| 882 | printk(KERN_INFO "\n"); | ||
| 883 | |||
| 884 | return 0; | ||
| 885 | } | ||
| 886 | |||
| 887 | |||
| 888 | /****** Network Device Interface ********************************************/ | ||
| 889 | |||
| 890 | /*============================================================================ | ||
| 891 | * Initialize Linux network interface. | ||
| 892 | * | ||
| 893 | * This routine is called only once for each interface, during Linux network | ||
| 894 | * interface registration. Returning anything but zero will fail interface | ||
| 895 | * registration. | ||
| 896 | */ | ||
| 897 | static int if_init(struct net_device* dev) | ||
| 898 | { | ||
| 899 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 900 | sdla_t* card = chdlc_priv_area->card; | ||
| 901 | struct wan_device* wandev = &card->wandev; | ||
| 902 | |||
| 903 | /* Initialize device driver entry points */ | ||
| 904 | dev->open = &if_open; | ||
| 905 | dev->stop = &if_close; | ||
| 906 | dev->hard_header = &if_header; | ||
| 907 | dev->rebuild_header = &if_rebuild_hdr; | ||
| 908 | dev->hard_start_xmit = &if_send; | ||
| 909 | dev->get_stats = &if_stats; | ||
| 910 | dev->tx_timeout = &if_tx_timeout; | ||
| 911 | dev->watchdog_timeo = TX_TIMEOUT; | ||
| 912 | |||
| 913 | /* Initialize media-specific parameters */ | ||
| 914 | dev->flags |= IFF_POINTOPOINT; | ||
| 915 | dev->flags |= IFF_NOARP; | ||
| 916 | |||
| 917 | /* Enable Mulitcasting if user selected */ | ||
| 918 | if (chdlc_priv_area->mc == WANOPT_YES){ | ||
| 919 | dev->flags |= IFF_MULTICAST; | ||
| 920 | } | ||
| 921 | |||
| 922 | if (chdlc_priv_area->true_if_encoding){ | ||
| 923 | dev->type = ARPHRD_HDLC; /* This breaks the tcpdump */ | ||
| 924 | }else{ | ||
| 925 | dev->type = ARPHRD_PPP; | ||
| 926 | } | ||
| 927 | |||
| 928 | dev->mtu = card->wandev.mtu; | ||
| 929 | /* for API usage, add the API header size to the requested MTU size */ | ||
| 930 | if(card->u.c.usedby == API) { | ||
| 931 | dev->mtu += sizeof(api_tx_hdr_t); | ||
| 932 | } | ||
| 933 | |||
| 934 | dev->hard_header_len = CHDLC_HDR_LEN; | ||
| 935 | |||
| 936 | /* Initialize hardware parameters */ | ||
| 937 | dev->irq = wandev->irq; | ||
| 938 | dev->dma = wandev->dma; | ||
| 939 | dev->base_addr = wandev->ioport; | ||
| 940 | dev->mem_start = wandev->maddr; | ||
| 941 | dev->mem_end = wandev->maddr + wandev->msize - 1; | ||
| 942 | |||
| 943 | /* Set transmit buffer queue length | ||
| 944 | * If too low packets will not be retransmitted | ||
| 945 | * by stack. | ||
| 946 | */ | ||
| 947 | dev->tx_queue_len = 100; | ||
| 948 | SET_MODULE_OWNER(dev); | ||
| 949 | |||
| 950 | return 0; | ||
| 951 | } | ||
| 952 | |||
| 953 | /*============================================================================ | ||
| 954 | * Open network interface. | ||
| 955 | * o enable communications and interrupts. | ||
| 956 | * o prevent module from unloading by incrementing use count | ||
| 957 | * | ||
| 958 | * Return 0 if O.k. or errno. | ||
| 959 | */ | ||
| 960 | static int if_open(struct net_device* dev) | ||
| 961 | { | ||
| 962 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 963 | sdla_t* card = chdlc_priv_area->card; | ||
| 964 | struct timeval tv; | ||
| 965 | int err = 0; | ||
| 966 | |||
| 967 | /* Only one open per interface is allowed */ | ||
| 968 | |||
| 969 | if (netif_running(dev)) | ||
| 970 | return -EBUSY; | ||
| 971 | |||
| 972 | /* Initialize the work queue entry */ | ||
| 973 | chdlc_priv_area->tq_working=0; | ||
| 974 | |||
| 975 | INIT_WORK(&chdlc_priv_area->common.wanpipe_work, | ||
| 976 | (void *)(void *)chdlc_work, dev); | ||
| 977 | |||
| 978 | /* Allocate and initialize BH circular buffer */ | ||
| 979 | /* Add 1 to MAX_BH_BUFF so we don't have test with (MAX_BH_BUFF-1) */ | ||
| 980 | chdlc_priv_area->bh_head = kmalloc((sizeof(bh_data_t)*(MAX_BH_BUFF+1)),GFP_ATOMIC); | ||
| 981 | memset(chdlc_priv_area->bh_head,0,(sizeof(bh_data_t)*(MAX_BH_BUFF+1))); | ||
| 982 | atomic_set(&chdlc_priv_area->bh_buff_used, 0); | ||
| 983 | |||
| 984 | do_gettimeofday(&tv); | ||
| 985 | chdlc_priv_area->router_start_time = tv.tv_sec; | ||
| 986 | |||
| 987 | netif_start_queue(dev); | ||
| 988 | |||
| 989 | wanpipe_open(card); | ||
| 990 | |||
| 991 | /* TTY is configured during wanpipe_set_termios | ||
| 992 | * call, not here */ | ||
| 993 | if (card->tty_opt) | ||
| 994 | return err; | ||
| 995 | |||
| 996 | set_bit(0,&chdlc_priv_area->config_chdlc); | ||
| 997 | chdlc_priv_area->config_chdlc_timeout=jiffies; | ||
| 998 | |||
| 999 | /* Start the CHDLC configuration after 1sec delay. | ||
| 1000 | * This will give the interface initilization time | ||
| 1001 | * to finish its configuration */ | ||
| 1002 | mod_timer(&chdlc_priv_area->poll_delay_timer, jiffies + HZ); | ||
| 1003 | return err; | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | /*============================================================================ | ||
| 1007 | * Close network interface. | ||
| 1008 | * o if this is the last close, then disable communications and interrupts. | ||
| 1009 | * o reset flags. | ||
| 1010 | */ | ||
| 1011 | static int if_close(struct net_device* dev) | ||
| 1012 | { | ||
| 1013 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 1014 | sdla_t* card = chdlc_priv_area->card; | ||
| 1015 | |||
| 1016 | if (chdlc_priv_area->bh_head){ | ||
| 1017 | int i; | ||
| 1018 | struct sk_buff *skb; | ||
| 1019 | |||
| 1020 | for (i=0; i<(MAX_BH_BUFF+1); i++){ | ||
| 1021 | skb = ((bh_data_t *)&chdlc_priv_area->bh_head[i])->skb; | ||
| 1022 | if (skb != NULL){ | ||
| 1023 | dev_kfree_skb_any(skb); | ||
| 1024 | } | ||
| 1025 | } | ||
| 1026 | kfree(chdlc_priv_area->bh_head); | ||
| 1027 | chdlc_priv_area->bh_head=NULL; | ||
| 1028 | } | ||
| 1029 | |||
| 1030 | netif_stop_queue(dev); | ||
| 1031 | wanpipe_close(card); | ||
| 1032 | del_timer(&chdlc_priv_area->poll_delay_timer); | ||
| 1033 | return 0; | ||
| 1034 | } | ||
| 1035 | |||
| 1036 | static void disable_comm (sdla_t *card) | ||
| 1037 | { | ||
| 1038 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 1039 | |||
| 1040 | if (card->u.c.comm_enabled){ | ||
| 1041 | chdlc_disable_comm_shutdown (card); | ||
| 1042 | }else{ | ||
| 1043 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | if (!tty_init_cnt) | ||
| 1047 | return; | ||
| 1048 | |||
| 1049 | if (card->tty_opt){ | ||
| 1050 | struct serial_state * state; | ||
| 1051 | if (!(--tty_init_cnt)){ | ||
| 1052 | int e1; | ||
| 1053 | serial_driver.refcount=0; | ||
| 1054 | |||
| 1055 | if ((e1 = tty_unregister_driver(&serial_driver))) | ||
| 1056 | printk("SERIAL: failed to unregister serial driver (%d)\n", | ||
| 1057 | e1); | ||
| 1058 | printk(KERN_INFO "%s: Unregistering TTY Driver, Major %i\n", | ||
| 1059 | card->devname,WAN_TTY_MAJOR); | ||
| 1060 | } | ||
| 1061 | card->tty=NULL; | ||
| 1062 | tty_card_map[card->tty_minor]=NULL; | ||
| 1063 | state = &rs_table[card->tty_minor]; | ||
| 1064 | memset(state, 0, sizeof(*state)); | ||
| 1065 | } | ||
| 1066 | return; | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | |||
| 1070 | /*============================================================================ | ||
| 1071 | * Build media header. | ||
| 1072 | * | ||
| 1073 | * The trick here is to put packet type (Ethertype) into 'protocol' field of | ||
| 1074 | * the socket buffer, so that we don't forget it. If packet type is not | ||
| 1075 | * supported, set skb->protocol to 0 and discard packet later. | ||
| 1076 | * | ||
| 1077 | * Return: media header length. | ||
| 1078 | */ | ||
| 1079 | static int if_header(struct sk_buff* skb, struct net_device* dev, | ||
| 1080 | unsigned short type, void* daddr, void* saddr, | ||
| 1081 | unsigned len) | ||
| 1082 | { | ||
| 1083 | skb->protocol = htons(type); | ||
| 1084 | |||
| 1085 | return CHDLC_HDR_LEN; | ||
| 1086 | } | ||
| 1087 | |||
| 1088 | |||
| 1089 | /*============================================================================ | ||
| 1090 | * Handle transmit timeout event from netif watchdog | ||
| 1091 | */ | ||
| 1092 | static void if_tx_timeout(struct net_device *dev) | ||
| 1093 | { | ||
| 1094 | chdlc_private_area_t* chan = dev->priv; | ||
| 1095 | sdla_t *card = chan->card; | ||
| 1096 | |||
| 1097 | /* If our device stays busy for at least 5 seconds then we will | ||
| 1098 | * kick start the device by making dev->tbusy = 0. We expect | ||
| 1099 | * that our device never stays busy more than 5 seconds. So this | ||
| 1100 | * is only used as a last resort. | ||
| 1101 | */ | ||
| 1102 | |||
| 1103 | ++card->wandev.stats.collisions; | ||
| 1104 | |||
| 1105 | printk (KERN_INFO "%s: Transmit timed out on %s\n", card->devname,dev->name); | ||
| 1106 | netif_wake_queue (dev); | ||
| 1107 | } | ||
| 1108 | |||
| 1109 | |||
| 1110 | |||
| 1111 | /*============================================================================ | ||
| 1112 | * Re-build media header. | ||
| 1113 | * | ||
| 1114 | * Return: 1 physical address resolved. | ||
| 1115 | * 0 physical address not resolved | ||
| 1116 | */ | ||
| 1117 | static int if_rebuild_hdr (struct sk_buff *skb) | ||
| 1118 | { | ||
| 1119 | return 1; | ||
| 1120 | } | ||
| 1121 | |||
| 1122 | |||
| 1123 | /*============================================================================ | ||
| 1124 | * Send a packet on a network interface. | ||
| 1125 | * o set tbusy flag (marks start of the transmission) to block a timer-based | ||
| 1126 | * transmit from overlapping. | ||
| 1127 | * o check link state. If link is not up, then drop the packet. | ||
| 1128 | * o execute adapter send command. | ||
| 1129 | * o free socket buffer | ||
| 1130 | * | ||
| 1131 | * Return: 0 complete (socket buffer must be freed) | ||
| 1132 | * non-0 packet may be re-transmitted (tbusy must be set) | ||
| 1133 | * | ||
| 1134 | * Notes: | ||
| 1135 | * 1. This routine is called either by the protocol stack or by the "net | ||
| 1136 | * bottom half" (with interrupts enabled). | ||
| 1137 | * 2. Setting tbusy flag will inhibit further transmit requests from the | ||
| 1138 | * protocol stack and can be used for flow control with protocol layer. | ||
| 1139 | */ | ||
| 1140 | static int if_send(struct sk_buff* skb, struct net_device* dev) | ||
| 1141 | { | ||
| 1142 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 1143 | sdla_t *card = chdlc_priv_area->card; | ||
| 1144 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 1145 | INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct; | ||
| 1146 | int udp_type = 0; | ||
| 1147 | unsigned long smp_flags; | ||
| 1148 | int err=0; | ||
| 1149 | |||
| 1150 | netif_stop_queue(dev); | ||
| 1151 | |||
| 1152 | if (skb == NULL){ | ||
| 1153 | /* If we get here, some higher layer thinks we've missed an | ||
| 1154 | * tx-done interrupt. | ||
| 1155 | */ | ||
| 1156 | printk(KERN_INFO "%s: interface %s got kicked!\n", | ||
| 1157 | card->devname, dev->name); | ||
| 1158 | |||
| 1159 | netif_wake_queue(dev); | ||
| 1160 | return 0; | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | if (ntohs(skb->protocol) != htons(PVC_PROT)){ | ||
| 1164 | |||
| 1165 | /* check the udp packet type */ | ||
| 1166 | |||
| 1167 | udp_type = udp_pkt_type(skb, card); | ||
| 1168 | |||
| 1169 | if (udp_type == UDP_CPIPE_TYPE){ | ||
| 1170 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev, | ||
| 1171 | chdlc_priv_area)){ | ||
| 1172 | chdlc_int->interrupt_permission |= | ||
| 1173 | APP_INT_ON_TIMER; | ||
| 1174 | } | ||
| 1175 | netif_start_queue(dev); | ||
| 1176 | return 0; | ||
| 1177 | } | ||
| 1178 | |||
| 1179 | /* check to see if the source IP address is a broadcast or */ | ||
| 1180 | /* multicast IP address */ | ||
| 1181 | if(chk_bcast_mcast_addr(card, dev, skb)){ | ||
| 1182 | ++card->wandev.stats.tx_dropped; | ||
| 1183 | dev_kfree_skb_any(skb); | ||
| 1184 | netif_start_queue(dev); | ||
| 1185 | return 0; | ||
| 1186 | } | ||
| 1187 | } | ||
| 1188 | |||
| 1189 | /* Lock the 508 Card: SMP is supported */ | ||
| 1190 | if(card->hw.type != SDLA_S514){ | ||
| 1191 | s508_lock(card,&smp_flags); | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | if(test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 1195 | |||
| 1196 | printk(KERN_INFO "%s: Critical in if_send: %lx\n", | ||
| 1197 | card->wandev.name,card->wandev.critical); | ||
| 1198 | ++card->wandev.stats.tx_dropped; | ||
| 1199 | netif_start_queue(dev); | ||
| 1200 | goto if_send_exit_crit; | ||
| 1201 | } | ||
| 1202 | |||
| 1203 | if(card->u.c.state != WAN_CONNECTED){ | ||
| 1204 | ++card->wandev.stats.tx_dropped; | ||
| 1205 | netif_start_queue(dev); | ||
| 1206 | |||
| 1207 | }else if(!skb->protocol){ | ||
| 1208 | ++card->wandev.stats.tx_errors; | ||
| 1209 | netif_start_queue(dev); | ||
| 1210 | |||
| 1211 | }else { | ||
| 1212 | void* data = skb->data; | ||
| 1213 | unsigned len = skb->len; | ||
| 1214 | unsigned char attr; | ||
| 1215 | |||
| 1216 | /* If it's an API packet pull off the API | ||
| 1217 | * header. Also check that the packet size | ||
| 1218 | * is larger than the API header | ||
| 1219 | */ | ||
| 1220 | if (card->u.c.usedby == API){ | ||
| 1221 | api_tx_hdr_t* api_tx_hdr; | ||
| 1222 | |||
| 1223 | /* discard the frame if we are configured for */ | ||
| 1224 | /* 'receive only' mode or if there is no data */ | ||
| 1225 | if (card->u.c.receive_only || | ||
| 1226 | (len <= sizeof(api_tx_hdr_t))) { | ||
| 1227 | |||
| 1228 | ++card->wandev.stats.tx_dropped; | ||
| 1229 | netif_start_queue(dev); | ||
| 1230 | goto if_send_exit_crit; | ||
| 1231 | } | ||
| 1232 | |||
| 1233 | api_tx_hdr = (api_tx_hdr_t *)data; | ||
| 1234 | attr = api_tx_hdr->attr; | ||
| 1235 | data += sizeof(api_tx_hdr_t); | ||
| 1236 | len -= sizeof(api_tx_hdr_t); | ||
| 1237 | } | ||
| 1238 | |||
| 1239 | if(chdlc_send(card, data, len)) { | ||
| 1240 | netif_stop_queue(dev); | ||
| 1241 | }else{ | ||
| 1242 | ++card->wandev.stats.tx_packets; | ||
| 1243 | card->wandev.stats.tx_bytes += len; | ||
| 1244 | |||
| 1245 | netif_start_queue(dev); | ||
| 1246 | |||
| 1247 | dev->trans_start = jiffies; | ||
| 1248 | } | ||
| 1249 | } | ||
| 1250 | |||
| 1251 | if_send_exit_crit: | ||
| 1252 | |||
| 1253 | if (!(err=netif_queue_stopped(dev))) { | ||
| 1254 | dev_kfree_skb_any(skb); | ||
| 1255 | }else{ | ||
| 1256 | chdlc_priv_area->tick_counter = jiffies; | ||
| 1257 | chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME; | ||
| 1258 | } | ||
| 1259 | |||
| 1260 | clear_bit(SEND_CRIT, (void*)&card->wandev.critical); | ||
| 1261 | if(card->hw.type != SDLA_S514){ | ||
| 1262 | s508_unlock(card,&smp_flags); | ||
| 1263 | } | ||
| 1264 | |||
| 1265 | return err; | ||
| 1266 | } | ||
| 1267 | |||
| 1268 | |||
| 1269 | /*============================================================================ | ||
| 1270 | * Check to see if the packet to be transmitted contains a broadcast or | ||
| 1271 | * multicast source IP address. | ||
| 1272 | */ | ||
| 1273 | |||
| 1274 | static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev, | ||
| 1275 | struct sk_buff *skb) | ||
| 1276 | { | ||
| 1277 | u32 src_ip_addr; | ||
| 1278 | u32 broadcast_ip_addr = 0; | ||
| 1279 | struct in_device *in_dev; | ||
| 1280 | |||
| 1281 | /* read the IP source address from the outgoing packet */ | ||
| 1282 | src_ip_addr = *(u32 *)(skb->data + 12); | ||
| 1283 | |||
| 1284 | /* read the IP broadcast address for the device */ | ||
| 1285 | in_dev = dev->ip_ptr; | ||
| 1286 | if(in_dev != NULL) { | ||
| 1287 | struct in_ifaddr *ifa= in_dev->ifa_list; | ||
| 1288 | if(ifa != NULL) | ||
| 1289 | broadcast_ip_addr = ifa->ifa_broadcast; | ||
| 1290 | else | ||
| 1291 | return 0; | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | /* check if the IP Source Address is a Broadcast address */ | ||
| 1295 | if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) { | ||
| 1296 | printk(KERN_INFO "%s: Broadcast Source Address silently discarded\n", | ||
| 1297 | card->devname); | ||
| 1298 | return 1; | ||
| 1299 | } | ||
| 1300 | |||
| 1301 | /* check if the IP Source Address is a Multicast address */ | ||
| 1302 | if((ntohl(src_ip_addr) >= 0xE0000001) && | ||
| 1303 | (ntohl(src_ip_addr) <= 0xFFFFFFFE)) { | ||
| 1304 | printk(KERN_INFO "%s: Multicast Source Address silently discarded\n", | ||
| 1305 | card->devname); | ||
| 1306 | return 1; | ||
| 1307 | } | ||
| 1308 | |||
| 1309 | return 0; | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | |||
| 1313 | /*============================================================================ | ||
| 1314 | * Reply to UDP Management system. | ||
| 1315 | * Return length of reply. | ||
| 1316 | */ | ||
| 1317 | static int reply_udp( unsigned char *data, unsigned int mbox_len ) | ||
| 1318 | { | ||
| 1319 | |||
| 1320 | unsigned short len, udp_length, temp, ip_length; | ||
| 1321 | unsigned long ip_temp; | ||
| 1322 | int even_bound = 0; | ||
| 1323 | chdlc_udp_pkt_t *c_udp_pkt = (chdlc_udp_pkt_t *)data; | ||
| 1324 | |||
| 1325 | /* Set length of packet */ | ||
| 1326 | len = sizeof(ip_pkt_t)+ | ||
| 1327 | sizeof(udp_pkt_t)+ | ||
| 1328 | sizeof(wp_mgmt_t)+ | ||
| 1329 | sizeof(cblock_t)+ | ||
| 1330 | sizeof(trace_info_t)+ | ||
| 1331 | mbox_len; | ||
| 1332 | |||
| 1333 | /* fill in UDP reply */ | ||
| 1334 | c_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; | ||
| 1335 | |||
| 1336 | /* fill in UDP length */ | ||
| 1337 | udp_length = sizeof(udp_pkt_t)+ | ||
| 1338 | sizeof(wp_mgmt_t)+ | ||
| 1339 | sizeof(cblock_t)+ | ||
| 1340 | sizeof(trace_info_t)+ | ||
| 1341 | mbox_len; | ||
| 1342 | |||
| 1343 | /* put it on an even boundary */ | ||
| 1344 | if ( udp_length & 0x0001 ) { | ||
| 1345 | udp_length += 1; | ||
| 1346 | len += 1; | ||
| 1347 | even_bound = 1; | ||
| 1348 | } | ||
| 1349 | |||
| 1350 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1351 | c_udp_pkt->udp_pkt.udp_length = temp; | ||
| 1352 | |||
| 1353 | /* swap UDP ports */ | ||
| 1354 | temp = c_udp_pkt->udp_pkt.udp_src_port; | ||
| 1355 | c_udp_pkt->udp_pkt.udp_src_port = | ||
| 1356 | c_udp_pkt->udp_pkt.udp_dst_port; | ||
| 1357 | c_udp_pkt->udp_pkt.udp_dst_port = temp; | ||
| 1358 | |||
| 1359 | /* add UDP pseudo header */ | ||
| 1360 | temp = 0x1100; | ||
| 1361 | *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound)) = temp; | ||
| 1362 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1363 | *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound+2)) = temp; | ||
| 1364 | |||
| 1365 | |||
| 1366 | /* calculate UDP checksum */ | ||
| 1367 | c_udp_pkt->udp_pkt.udp_checksum = 0; | ||
| 1368 | c_udp_pkt->udp_pkt.udp_checksum = calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET); | ||
| 1369 | |||
| 1370 | /* fill in IP length */ | ||
| 1371 | ip_length = len; | ||
| 1372 | temp = (ip_length<<8)|(ip_length>>8); | ||
| 1373 | c_udp_pkt->ip_pkt.total_length = temp; | ||
| 1374 | |||
| 1375 | /* swap IP addresses */ | ||
| 1376 | ip_temp = c_udp_pkt->ip_pkt.ip_src_address; | ||
| 1377 | c_udp_pkt->ip_pkt.ip_src_address = c_udp_pkt->ip_pkt.ip_dst_address; | ||
| 1378 | c_udp_pkt->ip_pkt.ip_dst_address = ip_temp; | ||
| 1379 | |||
| 1380 | /* fill in IP checksum */ | ||
| 1381 | c_udp_pkt->ip_pkt.hdr_checksum = 0; | ||
| 1382 | c_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t)); | ||
| 1383 | |||
| 1384 | return len; | ||
| 1385 | |||
| 1386 | } /* reply_udp */ | ||
| 1387 | |||
| 1388 | unsigned short calc_checksum (char *data, int len) | ||
| 1389 | { | ||
| 1390 | unsigned short temp; | ||
| 1391 | unsigned long sum=0; | ||
| 1392 | int i; | ||
| 1393 | |||
| 1394 | for( i = 0; i <len; i+=2 ) { | ||
| 1395 | memcpy(&temp,&data[i],2); | ||
| 1396 | sum += (unsigned long)temp; | ||
| 1397 | } | ||
| 1398 | |||
| 1399 | while (sum >> 16 ) { | ||
| 1400 | sum = (sum & 0xffffUL) + (sum >> 16); | ||
| 1401 | } | ||
| 1402 | |||
| 1403 | temp = (unsigned short)sum; | ||
| 1404 | temp = ~temp; | ||
| 1405 | |||
| 1406 | if( temp == 0 ) | ||
| 1407 | temp = 0xffff; | ||
| 1408 | |||
| 1409 | return temp; | ||
| 1410 | } | ||
| 1411 | |||
| 1412 | |||
| 1413 | /*============================================================================ | ||
| 1414 | * Get ethernet-style interface statistics. | ||
| 1415 | * Return a pointer to struct enet_statistics. | ||
| 1416 | */ | ||
| 1417 | static struct net_device_stats* if_stats(struct net_device* dev) | ||
| 1418 | { | ||
| 1419 | sdla_t *my_card; | ||
| 1420 | chdlc_private_area_t* chdlc_priv_area; | ||
| 1421 | |||
| 1422 | if ((chdlc_priv_area=dev->priv) == NULL) | ||
| 1423 | return NULL; | ||
| 1424 | |||
| 1425 | my_card = chdlc_priv_area->card; | ||
| 1426 | return &my_card->wandev.stats; | ||
| 1427 | } | ||
| 1428 | |||
| 1429 | |||
| 1430 | /****** Cisco HDLC Firmware Interface Functions *******************************/ | ||
| 1431 | |||
| 1432 | /*============================================================================ | ||
| 1433 | * Read firmware code version. | ||
| 1434 | * Put code version as ASCII string in str. | ||
| 1435 | */ | ||
| 1436 | static int chdlc_read_version (sdla_t* card, char* str) | ||
| 1437 | { | ||
| 1438 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1439 | int len; | ||
| 1440 | char err; | ||
| 1441 | mb->buffer_length = 0; | ||
| 1442 | mb->command = READ_CHDLC_CODE_VERSION; | ||
| 1443 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1444 | |||
| 1445 | if(err != COMMAND_OK) { | ||
| 1446 | chdlc_error(card,err,mb); | ||
| 1447 | } | ||
| 1448 | else if (str) { /* is not null */ | ||
| 1449 | len = mb->buffer_length; | ||
| 1450 | memcpy(str, mb->data, len); | ||
| 1451 | str[len] = '\0'; | ||
| 1452 | } | ||
| 1453 | return (err); | ||
| 1454 | } | ||
| 1455 | |||
| 1456 | /*----------------------------------------------------------------------------- | ||
| 1457 | * Configure CHDLC firmware. | ||
| 1458 | */ | ||
| 1459 | static int chdlc_configure (sdla_t* card, void* data) | ||
| 1460 | { | ||
| 1461 | int err; | ||
| 1462 | CHDLC_MAILBOX_STRUCT *mailbox = card->mbox; | ||
| 1463 | int data_length = sizeof(CHDLC_CONFIGURATION_STRUCT); | ||
| 1464 | |||
| 1465 | mailbox->buffer_length = data_length; | ||
| 1466 | memcpy(mailbox->data, data, data_length); | ||
| 1467 | mailbox->command = SET_CHDLC_CONFIGURATION; | ||
| 1468 | err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT; | ||
| 1469 | |||
| 1470 | if (err != COMMAND_OK) chdlc_error (card, err, mailbox); | ||
| 1471 | |||
| 1472 | return err; | ||
| 1473 | } | ||
| 1474 | |||
| 1475 | |||
| 1476 | /*============================================================================ | ||
| 1477 | * Set interrupt mode -- HDLC Version. | ||
| 1478 | */ | ||
| 1479 | |||
| 1480 | static int chdlc_set_intr_mode (sdla_t* card, unsigned mode) | ||
| 1481 | { | ||
| 1482 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1483 | CHDLC_INT_TRIGGERS_STRUCT* int_data = | ||
| 1484 | (CHDLC_INT_TRIGGERS_STRUCT *)mb->data; | ||
| 1485 | int err; | ||
| 1486 | |||
| 1487 | int_data->CHDLC_interrupt_triggers = mode; | ||
| 1488 | int_data->IRQ = card->hw.irq; | ||
| 1489 | int_data->interrupt_timer = 1; | ||
| 1490 | |||
| 1491 | mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT); | ||
| 1492 | mb->command = SET_CHDLC_INTERRUPT_TRIGGERS; | ||
| 1493 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1494 | if (err != COMMAND_OK) | ||
| 1495 | chdlc_error (card, err, mb); | ||
| 1496 | return err; | ||
| 1497 | } | ||
| 1498 | |||
| 1499 | |||
| 1500 | /*=========================================================== | ||
| 1501 | * chdlc_disable_comm_shutdown | ||
| 1502 | * | ||
| 1503 | * Shutdown() disables the communications. We must | ||
| 1504 | * have a sparate functions, because we must not | ||
| 1505 | * call chdlc_error() hander since the private | ||
| 1506 | * area has already been replaced */ | ||
| 1507 | |||
| 1508 | static int chdlc_disable_comm_shutdown (sdla_t *card) | ||
| 1509 | { | ||
| 1510 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1511 | CHDLC_INT_TRIGGERS_STRUCT* int_data = | ||
| 1512 | (CHDLC_INT_TRIGGERS_STRUCT *)mb->data; | ||
| 1513 | int err; | ||
| 1514 | |||
| 1515 | /* Disable Interrutps */ | ||
| 1516 | int_data->CHDLC_interrupt_triggers = 0; | ||
| 1517 | int_data->IRQ = card->hw.irq; | ||
| 1518 | int_data->interrupt_timer = 1; | ||
| 1519 | |||
| 1520 | mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT); | ||
| 1521 | mb->command = SET_CHDLC_INTERRUPT_TRIGGERS; | ||
| 1522 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1523 | |||
| 1524 | /* Disable Communications */ | ||
| 1525 | |||
| 1526 | if (card->u.c.async_mode) { | ||
| 1527 | mb->command = DISABLE_ASY_COMMUNICATIONS; | ||
| 1528 | }else{ | ||
| 1529 | mb->command = DISABLE_CHDLC_COMMUNICATIONS; | ||
| 1530 | } | ||
| 1531 | |||
| 1532 | mb->buffer_length = 0; | ||
| 1533 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1534 | |||
| 1535 | card->u.c.comm_enabled = 0; | ||
| 1536 | |||
| 1537 | return 0; | ||
| 1538 | } | ||
| 1539 | |||
| 1540 | /*============================================================================ | ||
| 1541 | * Enable communications. | ||
| 1542 | */ | ||
| 1543 | |||
| 1544 | static int chdlc_comm_enable (sdla_t* card) | ||
| 1545 | { | ||
| 1546 | int err; | ||
| 1547 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1548 | |||
| 1549 | mb->buffer_length = 0; | ||
| 1550 | mb->command = ENABLE_CHDLC_COMMUNICATIONS; | ||
| 1551 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1552 | if (err != COMMAND_OK) | ||
| 1553 | chdlc_error(card, err, mb); | ||
| 1554 | else | ||
| 1555 | card->u.c.comm_enabled = 1; | ||
| 1556 | |||
| 1557 | return err; | ||
| 1558 | } | ||
| 1559 | |||
| 1560 | /*============================================================================ | ||
| 1561 | * Read communication error statistics. | ||
| 1562 | */ | ||
| 1563 | static int chdlc_read_comm_err_stats (sdla_t* card) | ||
| 1564 | { | ||
| 1565 | int err; | ||
| 1566 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1567 | |||
| 1568 | mb->buffer_length = 0; | ||
| 1569 | mb->command = READ_COMMS_ERROR_STATS; | ||
| 1570 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1571 | if (err != COMMAND_OK) | ||
| 1572 | chdlc_error(card,err,mb); | ||
| 1573 | return err; | ||
| 1574 | } | ||
| 1575 | |||
| 1576 | |||
| 1577 | /*============================================================================ | ||
| 1578 | * Read CHDLC operational statistics. | ||
| 1579 | */ | ||
| 1580 | static int chdlc_read_op_stats (sdla_t* card) | ||
| 1581 | { | ||
| 1582 | int err; | ||
| 1583 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1584 | |||
| 1585 | mb->buffer_length = 0; | ||
| 1586 | mb->command = READ_CHDLC_OPERATIONAL_STATS; | ||
| 1587 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1588 | if (err != COMMAND_OK) | ||
| 1589 | chdlc_error(card,err,mb); | ||
| 1590 | return err; | ||
| 1591 | } | ||
| 1592 | |||
| 1593 | |||
| 1594 | /*============================================================================ | ||
| 1595 | * Update communications error and general packet statistics. | ||
| 1596 | */ | ||
| 1597 | static int update_comms_stats(sdla_t* card, | ||
| 1598 | chdlc_private_area_t* chdlc_priv_area) | ||
| 1599 | { | ||
| 1600 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1601 | COMMS_ERROR_STATS_STRUCT* err_stats; | ||
| 1602 | CHDLC_OPERATIONAL_STATS_STRUCT *op_stats; | ||
| 1603 | |||
| 1604 | /* on the first timer interrupt, read the comms error statistics */ | ||
| 1605 | if(chdlc_priv_area->update_comms_stats == 2) { | ||
| 1606 | if(chdlc_read_comm_err_stats(card)) | ||
| 1607 | return 1; | ||
| 1608 | err_stats = (COMMS_ERROR_STATS_STRUCT *)mb->data; | ||
| 1609 | card->wandev.stats.rx_over_errors = | ||
| 1610 | err_stats->Rx_overrun_err_count; | ||
| 1611 | card->wandev.stats.rx_crc_errors = | ||
| 1612 | err_stats->CRC_err_count; | ||
| 1613 | card->wandev.stats.rx_frame_errors = | ||
| 1614 | err_stats->Rx_abort_count; | ||
| 1615 | card->wandev.stats.rx_fifo_errors = | ||
| 1616 | err_stats->Rx_dis_pri_bfrs_full_count; | ||
| 1617 | card->wandev.stats.rx_missed_errors = | ||
| 1618 | card->wandev.stats.rx_fifo_errors; | ||
| 1619 | card->wandev.stats.tx_aborted_errors = | ||
| 1620 | err_stats->sec_Tx_abort_count; | ||
| 1621 | } | ||
| 1622 | |||
| 1623 | /* on the second timer interrupt, read the operational statistics */ | ||
| 1624 | else { | ||
| 1625 | if(chdlc_read_op_stats(card)) | ||
| 1626 | return 1; | ||
| 1627 | op_stats = (CHDLC_OPERATIONAL_STATS_STRUCT *)mb->data; | ||
| 1628 | card->wandev.stats.rx_length_errors = | ||
| 1629 | (op_stats->Rx_Data_discard_short_count + | ||
| 1630 | op_stats->Rx_Data_discard_long_count); | ||
| 1631 | } | ||
| 1632 | |||
| 1633 | return 0; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | /*============================================================================ | ||
| 1637 | * Send packet. | ||
| 1638 | * Return: 0 - o.k. | ||
| 1639 | * 1 - no transmit buffers available | ||
| 1640 | */ | ||
| 1641 | static int chdlc_send (sdla_t* card, void* data, unsigned len) | ||
| 1642 | { | ||
| 1643 | CHDLC_DATA_TX_STATUS_EL_STRUCT *txbuf = card->u.c.txbuf; | ||
| 1644 | |||
| 1645 | if (txbuf->opp_flag) | ||
| 1646 | return 1; | ||
| 1647 | |||
| 1648 | sdla_poke(&card->hw, txbuf->ptr_data_bfr, data, len); | ||
| 1649 | |||
| 1650 | txbuf->frame_length = len; | ||
| 1651 | txbuf->opp_flag = 1; /* start transmission */ | ||
| 1652 | |||
| 1653 | /* Update transmit buffer control fields */ | ||
| 1654 | card->u.c.txbuf = ++txbuf; | ||
| 1655 | |||
| 1656 | if ((void*)txbuf > card->u.c.txbuf_last) | ||
| 1657 | card->u.c.txbuf = card->u.c.txbuf_base; | ||
| 1658 | |||
| 1659 | return 0; | ||
| 1660 | } | ||
| 1661 | |||
| 1662 | /****** Firmware Error Handler **********************************************/ | ||
| 1663 | |||
| 1664 | /*============================================================================ | ||
| 1665 | * Firmware error handler. | ||
| 1666 | * This routine is called whenever firmware command returns non-zero | ||
| 1667 | * return code. | ||
| 1668 | * | ||
| 1669 | * Return zero if previous command has to be cancelled. | ||
| 1670 | */ | ||
| 1671 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb) | ||
| 1672 | { | ||
| 1673 | unsigned cmd = mb->command; | ||
| 1674 | |||
| 1675 | switch (err) { | ||
| 1676 | |||
| 1677 | case CMD_TIMEOUT: | ||
| 1678 | printk(KERN_INFO "%s: command 0x%02X timed out!\n", | ||
| 1679 | card->devname, cmd); | ||
| 1680 | break; | ||
| 1681 | |||
| 1682 | case S514_BOTH_PORTS_SAME_CLK_MODE: | ||
| 1683 | if(cmd == SET_CHDLC_CONFIGURATION) { | ||
| 1684 | printk(KERN_INFO | ||
| 1685 | "%s: Configure both ports for the same clock source\n", | ||
| 1686 | card->devname); | ||
| 1687 | break; | ||
| 1688 | } | ||
| 1689 | |||
| 1690 | default: | ||
| 1691 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n", | ||
| 1692 | card->devname, cmd, err); | ||
| 1693 | } | ||
| 1694 | |||
| 1695 | return 0; | ||
| 1696 | } | ||
| 1697 | |||
| 1698 | |||
| 1699 | /********** Bottom Half Handlers ********************************************/ | ||
| 1700 | |||
| 1701 | /* NOTE: There is no API, BH support for Kernels lower than 2.2.X. | ||
| 1702 | * DO NOT INSERT ANY CODE HERE, NOTICE THE | ||
| 1703 | * PREPROCESSOR STATEMENT ABOVE, UNLESS YOU KNOW WHAT YOU ARE | ||
| 1704 | * DOING */ | ||
| 1705 | |||
| 1706 | static void chdlc_work(struct net_device * dev) | ||
| 1707 | { | ||
| 1708 | chdlc_private_area_t* chan = dev->priv; | ||
| 1709 | sdla_t *card = chan->card; | ||
| 1710 | struct sk_buff *skb; | ||
| 1711 | |||
| 1712 | if (atomic_read(&chan->bh_buff_used) == 0){ | ||
| 1713 | clear_bit(0, &chan->tq_working); | ||
| 1714 | return; | ||
| 1715 | } | ||
| 1716 | |||
| 1717 | while (atomic_read(&chan->bh_buff_used)){ | ||
| 1718 | |||
| 1719 | skb = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb; | ||
| 1720 | |||
| 1721 | if (skb != NULL){ | ||
| 1722 | |||
| 1723 | if (chan->common.sk == NULL || chan->common.func == NULL){ | ||
| 1724 | ++card->wandev.stats.rx_dropped; | ||
| 1725 | dev_kfree_skb_any(skb); | ||
| 1726 | chdlc_work_cleanup(dev); | ||
| 1727 | continue; | ||
| 1728 | } | ||
| 1729 | |||
| 1730 | if (chan->common.func(skb,dev,chan->common.sk) != 0){ | ||
| 1731 | /* Sock full cannot send, queue us for another | ||
| 1732 | * try */ | ||
| 1733 | atomic_set(&chan->common.receive_block,1); | ||
| 1734 | return; | ||
| 1735 | }else{ | ||
| 1736 | chdlc_work_cleanup(dev); | ||
| 1737 | } | ||
| 1738 | }else{ | ||
| 1739 | chdlc_work_cleanup(dev); | ||
| 1740 | } | ||
| 1741 | } | ||
| 1742 | clear_bit(0, &chan->tq_working); | ||
| 1743 | |||
| 1744 | return; | ||
| 1745 | } | ||
| 1746 | |||
| 1747 | static int chdlc_work_cleanup(struct net_device *dev) | ||
| 1748 | { | ||
| 1749 | chdlc_private_area_t* chan = dev->priv; | ||
| 1750 | |||
| 1751 | ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL; | ||
| 1752 | |||
| 1753 | if (chan->bh_read == MAX_BH_BUFF){ | ||
| 1754 | chan->bh_read=0; | ||
| 1755 | }else{ | ||
| 1756 | ++chan->bh_read; | ||
| 1757 | } | ||
| 1758 | |||
| 1759 | atomic_dec(&chan->bh_buff_used); | ||
| 1760 | return 0; | ||
| 1761 | } | ||
| 1762 | |||
| 1763 | |||
| 1764 | |||
| 1765 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb) | ||
| 1766 | { | ||
| 1767 | /* Check for full */ | ||
| 1768 | chdlc_private_area_t* chan = dev->priv; | ||
| 1769 | sdla_t *card = chan->card; | ||
| 1770 | |||
| 1771 | if (atomic_read(&chan->bh_buff_used) == (MAX_BH_BUFF+1)){ | ||
| 1772 | ++card->wandev.stats.rx_dropped; | ||
| 1773 | dev_kfree_skb_any(skb); | ||
| 1774 | return 1; | ||
| 1775 | } | ||
| 1776 | |||
| 1777 | ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb; | ||
| 1778 | |||
| 1779 | if (chan->bh_write == MAX_BH_BUFF){ | ||
| 1780 | chan->bh_write=0; | ||
| 1781 | }else{ | ||
| 1782 | ++chan->bh_write; | ||
| 1783 | } | ||
| 1784 | |||
| 1785 | atomic_inc(&chan->bh_buff_used); | ||
| 1786 | |||
| 1787 | return 0; | ||
| 1788 | } | ||
| 1789 | |||
| 1790 | /* END OF API BH Support */ | ||
| 1791 | |||
| 1792 | |||
| 1793 | /****** Interrupt Handlers **************************************************/ | ||
| 1794 | |||
| 1795 | /*============================================================================ | ||
| 1796 | * Cisco HDLC interrupt service routine. | ||
| 1797 | */ | ||
| 1798 | static void wpc_isr (sdla_t* card) | ||
| 1799 | { | ||
| 1800 | struct net_device* dev; | ||
| 1801 | SHARED_MEMORY_INFO_STRUCT* flags = NULL; | ||
| 1802 | int i; | ||
| 1803 | sdla_t *my_card; | ||
| 1804 | |||
| 1805 | |||
| 1806 | /* Check for which port the interrupt has been generated | ||
| 1807 | * Since Secondary Port is piggybacking on the Primary | ||
| 1808 | * the check must be done here. | ||
| 1809 | */ | ||
| 1810 | |||
| 1811 | flags = card->u.c.flags; | ||
| 1812 | if (!flags->interrupt_info_struct.interrupt_type){ | ||
| 1813 | /* Check for a second port (piggybacking) */ | ||
| 1814 | if ((my_card = card->next)){ | ||
| 1815 | flags = my_card->u.c.flags; | ||
| 1816 | if (flags->interrupt_info_struct.interrupt_type){ | ||
| 1817 | card = my_card; | ||
| 1818 | card->isr(card); | ||
| 1819 | return; | ||
| 1820 | } | ||
| 1821 | } | ||
| 1822 | } | ||
| 1823 | |||
| 1824 | flags = card->u.c.flags; | ||
| 1825 | card->in_isr = 1; | ||
| 1826 | dev = card->wandev.dev; | ||
| 1827 | |||
| 1828 | /* If we get an interrupt with no network device, stop the interrupts | ||
| 1829 | * and issue an error */ | ||
| 1830 | if (!card->tty_opt && !dev && | ||
| 1831 | flags->interrupt_info_struct.interrupt_type != | ||
| 1832 | COMMAND_COMPLETE_APP_INT_PEND){ | ||
| 1833 | |||
| 1834 | goto isr_done; | ||
| 1835 | } | ||
| 1836 | |||
| 1837 | /* if critical due to peripheral operations | ||
| 1838 | * ie. update() or getstats() then reset the interrupt and | ||
| 1839 | * wait for the board to retrigger. | ||
| 1840 | */ | ||
| 1841 | if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) { | ||
| 1842 | printk(KERN_INFO "ISR CRIT TO PERI\n"); | ||
| 1843 | goto isr_done; | ||
| 1844 | } | ||
| 1845 | |||
| 1846 | /* On a 508 Card, if critical due to if_send | ||
| 1847 | * Major Error !!! */ | ||
| 1848 | if(card->hw.type != SDLA_S514) { | ||
| 1849 | if(test_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 1850 | printk(KERN_INFO "%s: Critical while in ISR: %lx\n", | ||
| 1851 | card->devname, card->wandev.critical); | ||
| 1852 | card->in_isr = 0; | ||
| 1853 | flags->interrupt_info_struct.interrupt_type = 0; | ||
| 1854 | return; | ||
| 1855 | } | ||
| 1856 | } | ||
| 1857 | |||
| 1858 | switch(flags->interrupt_info_struct.interrupt_type) { | ||
| 1859 | |||
| 1860 | case RX_APP_INT_PEND: /* 0x01: receive interrupt */ | ||
| 1861 | rx_intr(card); | ||
| 1862 | break; | ||
| 1863 | |||
| 1864 | case TX_APP_INT_PEND: /* 0x02: transmit interrupt */ | ||
| 1865 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 1866 | ~APP_INT_ON_TX_FRAME; | ||
| 1867 | |||
| 1868 | if (card->tty_opt){ | ||
| 1869 | wanpipe_tty_trigger_poll(card); | ||
| 1870 | break; | ||
| 1871 | } | ||
| 1872 | |||
| 1873 | if (dev && netif_queue_stopped(dev)){ | ||
| 1874 | if (card->u.c.usedby == API){ | ||
| 1875 | netif_start_queue(dev); | ||
| 1876 | wakeup_sk_bh(dev); | ||
| 1877 | }else{ | ||
| 1878 | netif_wake_queue(dev); | ||
| 1879 | } | ||
| 1880 | } | ||
| 1881 | break; | ||
| 1882 | |||
| 1883 | case COMMAND_COMPLETE_APP_INT_PEND:/* 0x04: cmd cplt */ | ||
| 1884 | ++ Intr_test_counter; | ||
| 1885 | break; | ||
| 1886 | |||
| 1887 | case CHDLC_EXCEP_COND_APP_INT_PEND: /* 0x20 */ | ||
| 1888 | process_chdlc_exception(card); | ||
| 1889 | break; | ||
| 1890 | |||
| 1891 | case GLOBAL_EXCEP_COND_APP_INT_PEND: | ||
| 1892 | process_global_exception(card); | ||
| 1893 | break; | ||
| 1894 | |||
| 1895 | case TIMER_APP_INT_PEND: | ||
| 1896 | timer_intr(card); | ||
| 1897 | break; | ||
| 1898 | |||
| 1899 | default: | ||
| 1900 | printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n", | ||
| 1901 | card->devname, | ||
| 1902 | flags->interrupt_info_struct.interrupt_type); | ||
| 1903 | printk(KERN_INFO "Code name: "); | ||
| 1904 | for(i = 0; i < 4; i ++) | ||
| 1905 | printk(KERN_INFO "%c", | ||
| 1906 | flags->global_info_struct.codename[i]); | ||
| 1907 | printk(KERN_INFO "\nCode version: "); | ||
| 1908 | for(i = 0; i < 4; i ++) | ||
| 1909 | printk(KERN_INFO "%c", | ||
| 1910 | flags->global_info_struct.codeversion[i]); | ||
| 1911 | printk(KERN_INFO "\n"); | ||
| 1912 | break; | ||
| 1913 | } | ||
| 1914 | |||
| 1915 | isr_done: | ||
| 1916 | |||
| 1917 | card->in_isr = 0; | ||
| 1918 | flags->interrupt_info_struct.interrupt_type = 0; | ||
| 1919 | return; | ||
| 1920 | } | ||
| 1921 | |||
| 1922 | /*============================================================================ | ||
| 1923 | * Receive interrupt handler. | ||
| 1924 | */ | ||
| 1925 | static void rx_intr (sdla_t* card) | ||
| 1926 | { | ||
| 1927 | struct net_device *dev; | ||
| 1928 | chdlc_private_area_t *chdlc_priv_area; | ||
| 1929 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 1930 | CHDLC_DATA_RX_STATUS_EL_STRUCT *rxbuf = card->u.c.rxmb; | ||
| 1931 | struct sk_buff *skb; | ||
| 1932 | unsigned len; | ||
| 1933 | unsigned addr = rxbuf->ptr_data_bfr; | ||
| 1934 | void *buf; | ||
| 1935 | int i,udp_type; | ||
| 1936 | |||
| 1937 | if (rxbuf->opp_flag != 0x01) { | ||
| 1938 | printk(KERN_INFO | ||
| 1939 | "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n", | ||
| 1940 | card->devname, (unsigned)rxbuf, rxbuf->opp_flag); | ||
| 1941 | printk(KERN_INFO "Code name: "); | ||
| 1942 | for(i = 0; i < 4; i ++) | ||
| 1943 | printk(KERN_INFO "%c", | ||
| 1944 | flags->global_info_struct.codename[i]); | ||
| 1945 | printk(KERN_INFO "\nCode version: "); | ||
| 1946 | for(i = 0; i < 4; i ++) | ||
| 1947 | printk(KERN_INFO "%c", | ||
| 1948 | flags->global_info_struct.codeversion[i]); | ||
| 1949 | printk(KERN_INFO "\n"); | ||
| 1950 | |||
| 1951 | |||
| 1952 | /* Bug Fix: Mar 6 2000 | ||
| 1953 | * If we get a corrupted mailbox, it measn that driver | ||
| 1954 | * is out of sync with the firmware. There is no recovery. | ||
| 1955 | * If we don't turn off all interrupts for this card | ||
| 1956 | * the machine will crash. | ||
| 1957 | */ | ||
| 1958 | printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname); | ||
| 1959 | printk(KERN_INFO "Please contact Sangoma Technologies !\n"); | ||
| 1960 | chdlc_set_intr_mode(card,0); | ||
| 1961 | return; | ||
| 1962 | } | ||
| 1963 | |||
| 1964 | len = rxbuf->frame_length; | ||
| 1965 | |||
| 1966 | if (card->tty_opt){ | ||
| 1967 | |||
| 1968 | if (rxbuf->error_flag){ | ||
| 1969 | goto rx_exit; | ||
| 1970 | } | ||
| 1971 | |||
| 1972 | if (len <= CRC_LENGTH){ | ||
| 1973 | goto rx_exit; | ||
| 1974 | } | ||
| 1975 | |||
| 1976 | if (!card->u.c.async_mode){ | ||
| 1977 | len -= CRC_LENGTH; | ||
| 1978 | } | ||
| 1979 | |||
| 1980 | wanpipe_tty_receive(card,addr,len); | ||
| 1981 | goto rx_exit; | ||
| 1982 | } | ||
| 1983 | |||
| 1984 | dev = card->wandev.dev; | ||
| 1985 | |||
| 1986 | if (!dev){ | ||
| 1987 | goto rx_exit; | ||
| 1988 | } | ||
| 1989 | |||
| 1990 | if (!netif_running(dev)) | ||
| 1991 | goto rx_exit; | ||
| 1992 | |||
| 1993 | chdlc_priv_area = dev->priv; | ||
| 1994 | |||
| 1995 | |||
| 1996 | /* Allocate socket buffer */ | ||
| 1997 | skb = dev_alloc_skb(len); | ||
| 1998 | |||
| 1999 | if (skb == NULL) { | ||
| 2000 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 2001 | card->devname); | ||
| 2002 | ++card->wandev.stats.rx_dropped; | ||
| 2003 | goto rx_exit; | ||
| 2004 | } | ||
| 2005 | |||
| 2006 | /* Copy data to the socket buffer */ | ||
| 2007 | if((addr + len) > card->u.c.rx_top + 1) { | ||
| 2008 | unsigned tmp = card->u.c.rx_top - addr + 1; | ||
| 2009 | buf = skb_put(skb, tmp); | ||
| 2010 | sdla_peek(&card->hw, addr, buf, tmp); | ||
| 2011 | addr = card->u.c.rx_base; | ||
| 2012 | len -= tmp; | ||
| 2013 | } | ||
| 2014 | |||
| 2015 | buf = skb_put(skb, len); | ||
| 2016 | sdla_peek(&card->hw, addr, buf, len); | ||
| 2017 | |||
| 2018 | skb->protocol = htons(ETH_P_IP); | ||
| 2019 | |||
| 2020 | card->wandev.stats.rx_packets ++; | ||
| 2021 | card->wandev.stats.rx_bytes += skb->len; | ||
| 2022 | udp_type = udp_pkt_type( skb, card ); | ||
| 2023 | |||
| 2024 | if(udp_type == UDP_CPIPE_TYPE) { | ||
| 2025 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK, | ||
| 2026 | card, skb, dev, chdlc_priv_area)) { | ||
| 2027 | flags->interrupt_info_struct. | ||
| 2028 | interrupt_permission |= | ||
| 2029 | APP_INT_ON_TIMER; | ||
| 2030 | } | ||
| 2031 | } else if(card->u.c.usedby == API) { | ||
| 2032 | |||
| 2033 | api_rx_hdr_t* api_rx_hdr; | ||
| 2034 | skb_push(skb, sizeof(api_rx_hdr_t)); | ||
| 2035 | api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00]; | ||
| 2036 | api_rx_hdr->error_flag = rxbuf->error_flag; | ||
| 2037 | api_rx_hdr->time_stamp = rxbuf->time_stamp; | ||
| 2038 | |||
| 2039 | skb->protocol = htons(PVC_PROT); | ||
| 2040 | skb->mac.raw = skb->data; | ||
| 2041 | skb->dev = dev; | ||
| 2042 | skb->pkt_type = WAN_PACKET_DATA; | ||
| 2043 | |||
| 2044 | bh_enqueue(dev, skb); | ||
| 2045 | |||
| 2046 | if (!test_and_set_bit(0,&chdlc_priv_area->tq_working)) | ||
| 2047 | wanpipe_queue_work(&chdlc_priv_area->common.wanpipe_work); | ||
| 2048 | }else{ | ||
| 2049 | /* FIXME: we should check to see if the received packet is a | ||
| 2050 | multicast packet so that we can increment the multicast | ||
| 2051 | statistic | ||
| 2052 | ++ chdlc_priv_area->if_stats.multicast; | ||
| 2053 | */ | ||
| 2054 | /* Pass it up the protocol stack */ | ||
| 2055 | |||
| 2056 | skb->dev = dev; | ||
| 2057 | skb->mac.raw = skb->data; | ||
| 2058 | netif_rx(skb); | ||
| 2059 | dev->last_rx = jiffies; | ||
| 2060 | } | ||
| 2061 | |||
| 2062 | rx_exit: | ||
| 2063 | /* Release buffer element and calculate a pointer to the next one */ | ||
| 2064 | rxbuf->opp_flag = 0x00; | ||
| 2065 | card->u.c.rxmb = ++ rxbuf; | ||
| 2066 | if((void*)rxbuf > card->u.c.rxbuf_last){ | ||
| 2067 | card->u.c.rxmb = card->u.c.rxbuf_base; | ||
| 2068 | } | ||
| 2069 | } | ||
| 2070 | |||
| 2071 | /*============================================================================ | ||
| 2072 | * Timer interrupt handler. | ||
| 2073 | * The timer interrupt is used for two purposes: | ||
| 2074 | * 1) Processing udp calls from 'cpipemon'. | ||
| 2075 | * 2) Reading board-level statistics for updating the proc file system. | ||
| 2076 | */ | ||
| 2077 | void timer_intr(sdla_t *card) | ||
| 2078 | { | ||
| 2079 | struct net_device* dev; | ||
| 2080 | chdlc_private_area_t* chdlc_priv_area = NULL; | ||
| 2081 | SHARED_MEMORY_INFO_STRUCT* flags = NULL; | ||
| 2082 | |||
| 2083 | if ((dev = card->wandev.dev)==NULL){ | ||
| 2084 | flags = card->u.c.flags; | ||
| 2085 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 2086 | ~APP_INT_ON_TIMER; | ||
| 2087 | return; | ||
| 2088 | } | ||
| 2089 | |||
| 2090 | chdlc_priv_area = dev->priv; | ||
| 2091 | |||
| 2092 | if (chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG) { | ||
| 2093 | if (!config_chdlc(card)){ | ||
| 2094 | chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG; | ||
| 2095 | } | ||
| 2096 | } | ||
| 2097 | |||
| 2098 | /* process a udp call if pending */ | ||
| 2099 | if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP) { | ||
| 2100 | process_udp_mgmt_pkt(card, dev, | ||
| 2101 | chdlc_priv_area); | ||
| 2102 | chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP; | ||
| 2103 | } | ||
| 2104 | |||
| 2105 | /* read the communications statistics if required */ | ||
| 2106 | if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE) { | ||
| 2107 | update_comms_stats(card, chdlc_priv_area); | ||
| 2108 | if(!(-- chdlc_priv_area->update_comms_stats)) { | ||
| 2109 | chdlc_priv_area->timer_int_enabled &= | ||
| 2110 | ~TMR_INT_ENABLED_UPDATE; | ||
| 2111 | } | ||
| 2112 | } | ||
| 2113 | |||
| 2114 | /* only disable the timer interrupt if there are no udp or statistic */ | ||
| 2115 | /* updates pending */ | ||
| 2116 | if(!chdlc_priv_area->timer_int_enabled) { | ||
| 2117 | flags = card->u.c.flags; | ||
| 2118 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 2119 | ~APP_INT_ON_TIMER; | ||
| 2120 | } | ||
| 2121 | } | ||
| 2122 | |||
| 2123 | /*------------------------------------------------------------------------------ | ||
| 2124 | Miscellaneous Functions | ||
| 2125 | - set_chdlc_config() used to set configuration options on the board | ||
| 2126 | ------------------------------------------------------------------------------*/ | ||
| 2127 | |||
| 2128 | static int set_chdlc_config(sdla_t* card) | ||
| 2129 | { | ||
| 2130 | CHDLC_CONFIGURATION_STRUCT cfg; | ||
| 2131 | |||
| 2132 | memset(&cfg, 0, sizeof(CHDLC_CONFIGURATION_STRUCT)); | ||
| 2133 | |||
| 2134 | if(card->wandev.clocking){ | ||
| 2135 | cfg.baud_rate = card->wandev.bps; | ||
| 2136 | } | ||
| 2137 | |||
| 2138 | cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ? | ||
| 2139 | INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35; | ||
| 2140 | |||
| 2141 | cfg.modem_config_options = 0; | ||
| 2142 | cfg.modem_status_timer = 100; | ||
| 2143 | |||
| 2144 | cfg.CHDLC_protocol_options = card->u.c.protocol_options; | ||
| 2145 | |||
| 2146 | if (card->tty_opt){ | ||
| 2147 | cfg.CHDLC_API_options = DISCARD_RX_ERROR_FRAMES; | ||
| 2148 | } | ||
| 2149 | |||
| 2150 | cfg.percent_data_buffer_for_Tx = (card->u.c.receive_only) ? 0 : 50; | ||
| 2151 | cfg.CHDLC_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT | | ||
| 2152 | CHDLC_RX_DATA_BYTE_COUNT_STAT); | ||
| 2153 | |||
| 2154 | if (card->tty_opt){ | ||
| 2155 | card->wandev.mtu = TTY_CHDLC_MAX_MTU; | ||
| 2156 | } | ||
| 2157 | cfg.max_CHDLC_data_field_length = card->wandev.mtu; | ||
| 2158 | cfg.transmit_keepalive_timer = card->u.c.kpalv_tx; | ||
| 2159 | cfg.receive_keepalive_timer = card->u.c.kpalv_rx; | ||
| 2160 | cfg.keepalive_error_tolerance = card->u.c.kpalv_err; | ||
| 2161 | cfg.SLARP_request_timer = card->u.c.slarp_timer; | ||
| 2162 | |||
| 2163 | if (cfg.SLARP_request_timer) { | ||
| 2164 | cfg.IP_address = 0; | ||
| 2165 | cfg.IP_netmask = 0; | ||
| 2166 | |||
| 2167 | }else if (card->wandev.dev){ | ||
| 2168 | struct net_device *dev = card->wandev.dev; | ||
| 2169 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 2170 | |||
| 2171 | struct in_device *in_dev = dev->ip_ptr; | ||
| 2172 | |||
| 2173 | if(in_dev != NULL) { | ||
| 2174 | struct in_ifaddr *ifa = in_dev->ifa_list; | ||
| 2175 | |||
| 2176 | if (ifa != NULL ) { | ||
| 2177 | cfg.IP_address = ntohl(ifa->ifa_local); | ||
| 2178 | cfg.IP_netmask = ntohl(ifa->ifa_mask); | ||
| 2179 | chdlc_priv_area->IP_address = ntohl(ifa->ifa_local); | ||
| 2180 | chdlc_priv_area->IP_netmask = ntohl(ifa->ifa_mask); | ||
| 2181 | } | ||
| 2182 | } | ||
| 2183 | |||
| 2184 | /* FIXME: We must re-think this message in next release | ||
| 2185 | if((cfg.IP_address & 0x000000FF) > 2) { | ||
| 2186 | printk(KERN_WARNING "\n"); | ||
| 2187 | printk(KERN_WARNING " WARNING:%s configured with an\n", | ||
| 2188 | card->devname); | ||
| 2189 | printk(KERN_WARNING " invalid local IP address.\n"); | ||
| 2190 | printk(KERN_WARNING " Slarp pragmatics will fail.\n"); | ||
| 2191 | printk(KERN_WARNING " IP address should be of the\n"); | ||
| 2192 | printk(KERN_WARNING " format A.B.C.1 or A.B.C.2.\n"); | ||
| 2193 | } | ||
| 2194 | */ | ||
| 2195 | } | ||
| 2196 | |||
| 2197 | return chdlc_configure(card, &cfg); | ||
| 2198 | } | ||
| 2199 | |||
| 2200 | |||
| 2201 | /*----------------------------------------------------------------------------- | ||
| 2202 | set_asy_config() used to set asynchronous configuration options on the board | ||
| 2203 | ------------------------------------------------------------------------------*/ | ||
| 2204 | |||
| 2205 | static int set_asy_config(sdla_t* card) | ||
| 2206 | { | ||
| 2207 | |||
| 2208 | ASY_CONFIGURATION_STRUCT cfg; | ||
| 2209 | CHDLC_MAILBOX_STRUCT *mailbox = card->mbox; | ||
| 2210 | int err; | ||
| 2211 | |||
| 2212 | memset(&cfg, 0, sizeof(ASY_CONFIGURATION_STRUCT)); | ||
| 2213 | |||
| 2214 | if(card->wandev.clocking) | ||
| 2215 | cfg.baud_rate = card->wandev.bps; | ||
| 2216 | |||
| 2217 | cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ? | ||
| 2218 | INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35; | ||
| 2219 | |||
| 2220 | cfg.modem_config_options = 0; | ||
| 2221 | cfg.asy_API_options = card->u.c.api_options; | ||
| 2222 | cfg.asy_protocol_options = card->u.c.protocol_options; | ||
| 2223 | cfg.Tx_bits_per_char = card->u.c.tx_bits_per_char; | ||
| 2224 | cfg.Rx_bits_per_char = card->u.c.rx_bits_per_char; | ||
| 2225 | cfg.stop_bits = card->u.c.stop_bits; | ||
| 2226 | cfg.parity = card->u.c.parity; | ||
| 2227 | cfg.break_timer = card->u.c.break_timer; | ||
| 2228 | cfg.asy_Rx_inter_char_timer = card->u.c.inter_char_timer; | ||
| 2229 | cfg.asy_Rx_complete_length = card->u.c.rx_complete_length; | ||
| 2230 | cfg.XON_char = card->u.c.xon_char; | ||
| 2231 | cfg.XOFF_char = card->u.c.xoff_char; | ||
| 2232 | cfg.asy_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT | | ||
| 2233 | CHDLC_RX_DATA_BYTE_COUNT_STAT); | ||
| 2234 | |||
| 2235 | mailbox->buffer_length = sizeof(ASY_CONFIGURATION_STRUCT); | ||
| 2236 | memcpy(mailbox->data, &cfg, mailbox->buffer_length); | ||
| 2237 | mailbox->command = SET_ASY_CONFIGURATION; | ||
| 2238 | err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT; | ||
| 2239 | if (err != COMMAND_OK) | ||
| 2240 | chdlc_error (card, err, mailbox); | ||
| 2241 | return err; | ||
| 2242 | } | ||
| 2243 | |||
| 2244 | /*============================================================================ | ||
| 2245 | * Enable asynchronous communications. | ||
| 2246 | */ | ||
| 2247 | |||
| 2248 | static int asy_comm_enable (sdla_t* card) | ||
| 2249 | { | ||
| 2250 | |||
| 2251 | int err; | ||
| 2252 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 2253 | |||
| 2254 | mb->buffer_length = 0; | ||
| 2255 | mb->command = ENABLE_ASY_COMMUNICATIONS; | ||
| 2256 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2257 | if (err != COMMAND_OK && card->wandev.dev) | ||
| 2258 | chdlc_error(card, err, mb); | ||
| 2259 | |||
| 2260 | if (!err) | ||
| 2261 | card->u.c.comm_enabled = 1; | ||
| 2262 | |||
| 2263 | return err; | ||
| 2264 | } | ||
| 2265 | |||
| 2266 | /*============================================================================ | ||
| 2267 | * Process global exception condition | ||
| 2268 | */ | ||
| 2269 | static int process_global_exception(sdla_t *card) | ||
| 2270 | { | ||
| 2271 | CHDLC_MAILBOX_STRUCT* mbox = card->mbox; | ||
| 2272 | int err; | ||
| 2273 | |||
| 2274 | mbox->buffer_length = 0; | ||
| 2275 | mbox->command = READ_GLOBAL_EXCEPTION_CONDITION; | ||
| 2276 | err = sdla_exec(mbox) ? mbox->return_code : CMD_TIMEOUT; | ||
| 2277 | |||
| 2278 | if(err != CMD_TIMEOUT ){ | ||
| 2279 | |||
| 2280 | switch(mbox->return_code) { | ||
| 2281 | |||
| 2282 | case EXCEP_MODEM_STATUS_CHANGE: | ||
| 2283 | |||
| 2284 | printk(KERN_INFO "%s: Modem status change\n", | ||
| 2285 | card->devname); | ||
| 2286 | |||
| 2287 | switch(mbox->data[0] & (DCD_HIGH | CTS_HIGH)) { | ||
| 2288 | case (DCD_HIGH): | ||
| 2289 | printk(KERN_INFO "%s: DCD high, CTS low\n",card->devname); | ||
| 2290 | break; | ||
| 2291 | case (CTS_HIGH): | ||
| 2292 | printk(KERN_INFO "%s: DCD low, CTS high\n",card->devname); | ||
| 2293 | break; | ||
| 2294 | case ((DCD_HIGH | CTS_HIGH)): | ||
| 2295 | printk(KERN_INFO "%s: DCD high, CTS high\n",card->devname); | ||
| 2296 | break; | ||
| 2297 | default: | ||
| 2298 | printk(KERN_INFO "%s: DCD low, CTS low\n",card->devname); | ||
| 2299 | break; | ||
| 2300 | } | ||
| 2301 | break; | ||
| 2302 | |||
| 2303 | case EXCEP_TRC_DISABLED: | ||
| 2304 | printk(KERN_INFO "%s: Line trace disabled\n", | ||
| 2305 | card->devname); | ||
| 2306 | break; | ||
| 2307 | |||
| 2308 | case EXCEP_IRQ_TIMEOUT: | ||
| 2309 | printk(KERN_INFO "%s: IRQ timeout occurred\n", | ||
| 2310 | card->devname); | ||
| 2311 | break; | ||
| 2312 | |||
| 2313 | case 0x17: | ||
| 2314 | if (card->tty_opt){ | ||
| 2315 | if (card->tty && card->tty_open){ | ||
| 2316 | printk(KERN_INFO | ||
| 2317 | "%s: Modem Hangup Exception: Hanging Up!\n", | ||
| 2318 | card->devname); | ||
| 2319 | tty_hangup(card->tty); | ||
| 2320 | } | ||
| 2321 | break; | ||
| 2322 | } | ||
| 2323 | |||
| 2324 | /* If TTY is not used just drop throught */ | ||
| 2325 | |||
| 2326 | default: | ||
| 2327 | printk(KERN_INFO "%s: Global exception %x\n", | ||
| 2328 | card->devname, mbox->return_code); | ||
| 2329 | break; | ||
| 2330 | } | ||
| 2331 | } | ||
| 2332 | return 0; | ||
| 2333 | } | ||
| 2334 | |||
| 2335 | |||
| 2336 | /*============================================================================ | ||
| 2337 | * Process chdlc exception condition | ||
| 2338 | */ | ||
| 2339 | static int process_chdlc_exception(sdla_t *card) | ||
| 2340 | { | ||
| 2341 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 2342 | int err; | ||
| 2343 | |||
| 2344 | mb->buffer_length = 0; | ||
| 2345 | mb->command = READ_CHDLC_EXCEPTION_CONDITION; | ||
| 2346 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2347 | if(err != CMD_TIMEOUT) { | ||
| 2348 | |||
| 2349 | switch (err) { | ||
| 2350 | |||
| 2351 | case EXCEP_LINK_ACTIVE: | ||
| 2352 | port_set_state(card, WAN_CONNECTED); | ||
| 2353 | trigger_chdlc_poll(card->wandev.dev); | ||
| 2354 | break; | ||
| 2355 | |||
| 2356 | case EXCEP_LINK_INACTIVE_MODEM: | ||
| 2357 | port_set_state(card, WAN_DISCONNECTED); | ||
| 2358 | unconfigure_ip(card); | ||
| 2359 | trigger_chdlc_poll(card->wandev.dev); | ||
| 2360 | break; | ||
| 2361 | |||
| 2362 | case EXCEP_LINK_INACTIVE_KPALV: | ||
| 2363 | port_set_state(card, WAN_DISCONNECTED); | ||
| 2364 | printk(KERN_INFO "%s: Keepalive timer expired.\n", | ||
| 2365 | card->devname); | ||
| 2366 | unconfigure_ip(card); | ||
| 2367 | trigger_chdlc_poll(card->wandev.dev); | ||
| 2368 | break; | ||
| 2369 | |||
| 2370 | case EXCEP_IP_ADDRESS_DISCOVERED: | ||
| 2371 | if (configure_ip(card)) | ||
| 2372 | return -1; | ||
| 2373 | break; | ||
| 2374 | |||
| 2375 | case EXCEP_LOOPBACK_CONDITION: | ||
| 2376 | printk(KERN_INFO "%s: Loopback Condition Detected.\n", | ||
| 2377 | card->devname); | ||
| 2378 | break; | ||
| 2379 | |||
| 2380 | case NO_CHDLC_EXCEP_COND_TO_REPORT: | ||
| 2381 | printk(KERN_INFO "%s: No exceptions reported.\n", | ||
| 2382 | card->devname); | ||
| 2383 | break; | ||
| 2384 | } | ||
| 2385 | |||
| 2386 | } | ||
| 2387 | return 0; | ||
| 2388 | } | ||
| 2389 | |||
| 2390 | |||
| 2391 | /*============================================================================ | ||
| 2392 | * Configure IP from SLARP negotiation | ||
| 2393 | * This adds dynamic routes when SLARP has provided valid addresses | ||
| 2394 | */ | ||
| 2395 | |||
| 2396 | static int configure_ip (sdla_t* card) | ||
| 2397 | { | ||
| 2398 | struct net_device *dev = card->wandev.dev; | ||
| 2399 | chdlc_private_area_t *chdlc_priv_area; | ||
| 2400 | char err; | ||
| 2401 | |||
| 2402 | if (!dev) | ||
| 2403 | return 0; | ||
| 2404 | |||
| 2405 | chdlc_priv_area = dev->priv; | ||
| 2406 | |||
| 2407 | |||
| 2408 | /* set to discover */ | ||
| 2409 | if(card->u.c.slarp_timer != 0x00) { | ||
| 2410 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 2411 | CHDLC_CONFIGURATION_STRUCT *cfg; | ||
| 2412 | |||
| 2413 | mb->buffer_length = 0; | ||
| 2414 | mb->command = READ_CHDLC_CONFIGURATION; | ||
| 2415 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2416 | |||
| 2417 | if(err != COMMAND_OK) { | ||
| 2418 | chdlc_error(card,err,mb); | ||
| 2419 | return -1; | ||
| 2420 | } | ||
| 2421 | |||
| 2422 | cfg = (CHDLC_CONFIGURATION_STRUCT *)mb->data; | ||
| 2423 | chdlc_priv_area->IP_address = cfg->IP_address; | ||
| 2424 | chdlc_priv_area->IP_netmask = cfg->IP_netmask; | ||
| 2425 | |||
| 2426 | /* Set flag to add route */ | ||
| 2427 | chdlc_priv_area->route_status = ADD_ROUTE; | ||
| 2428 | |||
| 2429 | /* The idea here is to add the route in the poll routine. | ||
| 2430 | This way, we aren't in interrupt context when adding routes */ | ||
| 2431 | trigger_chdlc_poll(dev); | ||
| 2432 | } | ||
| 2433 | |||
| 2434 | return 0; | ||
| 2435 | } | ||
| 2436 | |||
| 2437 | |||
| 2438 | /*============================================================================ | ||
| 2439 | * Un-Configure IP negotiated by SLARP | ||
| 2440 | * This removes dynamic routes when the link becomes inactive. | ||
| 2441 | */ | ||
| 2442 | |||
| 2443 | static int unconfigure_ip (sdla_t* card) | ||
| 2444 | { | ||
| 2445 | struct net_device *dev = card->wandev.dev; | ||
| 2446 | chdlc_private_area_t *chdlc_priv_area; | ||
| 2447 | |||
| 2448 | if (!dev) | ||
| 2449 | return 0; | ||
| 2450 | |||
| 2451 | chdlc_priv_area= dev->priv; | ||
| 2452 | |||
| 2453 | if (chdlc_priv_area->route_status == ROUTE_ADDED) { | ||
| 2454 | |||
| 2455 | /* Note: If this function is called, the | ||
| 2456 | * port state has been DISCONNECTED. This state | ||
| 2457 | * change will trigger a poll_disconnected | ||
| 2458 | * function, that will check for this condition. | ||
| 2459 | */ | ||
| 2460 | chdlc_priv_area->route_status = REMOVE_ROUTE; | ||
| 2461 | |||
| 2462 | } | ||
| 2463 | return 0; | ||
| 2464 | } | ||
| 2465 | |||
| 2466 | /*============================================================================ | ||
| 2467 | * Routine to add/remove routes | ||
| 2468 | * Called like a polling routine when Routes are flagged to be added/removed. | ||
| 2469 | */ | ||
| 2470 | |||
| 2471 | static void process_route (sdla_t *card) | ||
| 2472 | { | ||
| 2473 | struct net_device *dev = card->wandev.dev; | ||
| 2474 | unsigned char port_num; | ||
| 2475 | chdlc_private_area_t *chdlc_priv_area = NULL; | ||
| 2476 | u32 local_IP_addr = 0; | ||
| 2477 | u32 remote_IP_addr = 0; | ||
| 2478 | u32 IP_netmask, IP_addr; | ||
| 2479 | int err = 0; | ||
| 2480 | struct in_device *in_dev; | ||
| 2481 | mm_segment_t fs; | ||
| 2482 | struct ifreq if_info; | ||
| 2483 | struct sockaddr_in *if_data1, *if_data2; | ||
| 2484 | |||
| 2485 | chdlc_priv_area = dev->priv; | ||
| 2486 | port_num = card->u.c.comm_port; | ||
| 2487 | |||
| 2488 | /* Bug Fix Mar 16 2000 | ||
| 2489 | * AND the IP address to the Mask before checking | ||
| 2490 | * the last two bits. */ | ||
| 2491 | |||
| 2492 | if((chdlc_priv_area->route_status == ADD_ROUTE) && | ||
| 2493 | ((chdlc_priv_area->IP_address & ~chdlc_priv_area->IP_netmask) > 2)) { | ||
| 2494 | |||
| 2495 | printk(KERN_INFO "%s: Dynamic route failure.\n",card->devname); | ||
| 2496 | |||
| 2497 | if(card->u.c.slarp_timer) { | ||
| 2498 | u32 addr_net = htonl(chdlc_priv_area->IP_address); | ||
| 2499 | |||
| 2500 | printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u received\n", | ||
| 2501 | card->devname, | ||
| 2502 | NIPQUAD(addr_net)); | ||
| 2503 | printk(KERN_INFO "%s: from remote station.\n", | ||
| 2504 | card->devname); | ||
| 2505 | |||
| 2506 | }else{ | ||
| 2507 | u32 addr_net = htonl(chdlc_priv_area->IP_address); | ||
| 2508 | |||
| 2509 | printk(KERN_INFO "%s: Bad IP address %u.%u.%u.%u issued\n", | ||
| 2510 | card->devname, | ||
| 2511 | NIPQUAD(addr_net)); | ||
| 2512 | printk(KERN_INFO "%s: to remote station. Local\n", | ||
| 2513 | card->devname); | ||
| 2514 | printk(KERN_INFO "%s: IP address must be A.B.C.1\n", | ||
| 2515 | card->devname); | ||
| 2516 | printk(KERN_INFO "%s: or A.B.C.2.\n",card->devname); | ||
| 2517 | } | ||
| 2518 | |||
| 2519 | /* remove the route due to the IP address error condition */ | ||
| 2520 | chdlc_priv_area->route_status = REMOVE_ROUTE; | ||
| 2521 | err = 1; | ||
| 2522 | } | ||
| 2523 | |||
| 2524 | /* If we are removing a route with bad IP addressing, then use the */ | ||
| 2525 | /* locally configured IP addresses */ | ||
| 2526 | if((chdlc_priv_area->route_status == REMOVE_ROUTE) && err) { | ||
| 2527 | |||
| 2528 | /* do not remove a bad route that has already been removed */ | ||
| 2529 | if(chdlc_priv_area->route_removed) { | ||
| 2530 | return; | ||
| 2531 | } | ||
| 2532 | |||
| 2533 | in_dev = dev->ip_ptr; | ||
| 2534 | |||
| 2535 | if(in_dev != NULL) { | ||
| 2536 | struct in_ifaddr *ifa = in_dev->ifa_list; | ||
| 2537 | if (ifa != NULL ) { | ||
| 2538 | local_IP_addr = ifa->ifa_local; | ||
| 2539 | IP_netmask = ifa->ifa_mask; | ||
| 2540 | } | ||
| 2541 | } | ||
| 2542 | }else{ | ||
| 2543 | /* According to Cisco HDLC, if the point-to-point address is | ||
| 2544 | A.B.C.1, then we are the opposite (A.B.C.2), and vice-versa. | ||
| 2545 | */ | ||
| 2546 | IP_netmask = ntohl(chdlc_priv_area->IP_netmask); | ||
| 2547 | remote_IP_addr = ntohl(chdlc_priv_area->IP_address); | ||
| 2548 | |||
| 2549 | |||
| 2550 | /* If Netmask is 255.255.255.255 the local address | ||
| 2551 | * calculation will fail. Default it back to 255.255.255.0 */ | ||
| 2552 | if (IP_netmask == 0xffffffff) | ||
| 2553 | IP_netmask &= 0x00ffffff; | ||
| 2554 | |||
| 2555 | /* Bug Fix Mar 16 2000 | ||
| 2556 | * AND the Remote IP address with IP netmask, instead | ||
| 2557 | * of static netmask of 255.255.255.0 */ | ||
| 2558 | local_IP_addr = (remote_IP_addr & IP_netmask) + | ||
| 2559 | (~remote_IP_addr & ntohl(0x0003)); | ||
| 2560 | |||
| 2561 | if(!card->u.c.slarp_timer) { | ||
| 2562 | IP_addr = local_IP_addr; | ||
| 2563 | local_IP_addr = remote_IP_addr; | ||
| 2564 | remote_IP_addr = IP_addr; | ||
| 2565 | } | ||
| 2566 | } | ||
| 2567 | |||
| 2568 | fs = get_fs(); /* Save file system */ | ||
| 2569 | set_fs(get_ds()); /* Get user space block */ | ||
| 2570 | |||
| 2571 | /* Setup a structure for adding/removing routes */ | ||
| 2572 | memset(&if_info, 0, sizeof(if_info)); | ||
| 2573 | strcpy(if_info.ifr_name, dev->name); | ||
| 2574 | |||
| 2575 | switch (chdlc_priv_area->route_status) { | ||
| 2576 | |||
| 2577 | case ADD_ROUTE: | ||
| 2578 | |||
| 2579 | if(!card->u.c.slarp_timer) { | ||
| 2580 | if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2581 | if_data2->sin_addr.s_addr = remote_IP_addr; | ||
| 2582 | if_data2->sin_family = AF_INET; | ||
| 2583 | err = devinet_ioctl(SIOCSIFDSTADDR, &if_info); | ||
| 2584 | } else { | ||
| 2585 | if_data1 = (struct sockaddr_in *)&if_info.ifr_addr; | ||
| 2586 | if_data1->sin_addr.s_addr = local_IP_addr; | ||
| 2587 | if_data1->sin_family = AF_INET; | ||
| 2588 | if(!(err = devinet_ioctl(SIOCSIFADDR, &if_info))){ | ||
| 2589 | if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2590 | if_data2->sin_addr.s_addr = remote_IP_addr; | ||
| 2591 | if_data2->sin_family = AF_INET; | ||
| 2592 | err = devinet_ioctl(SIOCSIFDSTADDR, &if_info); | ||
| 2593 | } | ||
| 2594 | } | ||
| 2595 | |||
| 2596 | if(err) { | ||
| 2597 | printk(KERN_INFO "%s: Add route %u.%u.%u.%u failed (%d)\n", | ||
| 2598 | card->devname, NIPQUAD(remote_IP_addr), err); | ||
| 2599 | } else { | ||
| 2600 | ((chdlc_private_area_t *)dev->priv)->route_status = ROUTE_ADDED; | ||
| 2601 | printk(KERN_INFO "%s: Dynamic route added.\n", | ||
| 2602 | card->devname); | ||
| 2603 | printk(KERN_INFO "%s: Local IP addr : %u.%u.%u.%u\n", | ||
| 2604 | card->devname, NIPQUAD(local_IP_addr)); | ||
| 2605 | printk(KERN_INFO "%s: Remote IP addr: %u.%u.%u.%u\n", | ||
| 2606 | card->devname, NIPQUAD(remote_IP_addr)); | ||
| 2607 | chdlc_priv_area->route_removed = 0; | ||
| 2608 | } | ||
| 2609 | break; | ||
| 2610 | |||
| 2611 | |||
| 2612 | case REMOVE_ROUTE: | ||
| 2613 | |||
| 2614 | /* Change the local ip address of the interface to 0. | ||
| 2615 | * This will also delete the destination route. | ||
| 2616 | */ | ||
| 2617 | if(!card->u.c.slarp_timer) { | ||
| 2618 | if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2619 | if_data2->sin_addr.s_addr = 0; | ||
| 2620 | if_data2->sin_family = AF_INET; | ||
| 2621 | err = devinet_ioctl(SIOCSIFDSTADDR, &if_info); | ||
| 2622 | } else { | ||
| 2623 | if_data1 = (struct sockaddr_in *)&if_info.ifr_addr; | ||
| 2624 | if_data1->sin_addr.s_addr = 0; | ||
| 2625 | if_data1->sin_family = AF_INET; | ||
| 2626 | err = devinet_ioctl(SIOCSIFADDR,&if_info); | ||
| 2627 | |||
| 2628 | } | ||
| 2629 | if(err) { | ||
| 2630 | printk(KERN_INFO | ||
| 2631 | "%s: Remove route %u.%u.%u.%u failed, (err %d)\n", | ||
| 2632 | card->devname, NIPQUAD(remote_IP_addr), | ||
| 2633 | err); | ||
| 2634 | } else { | ||
| 2635 | ((chdlc_private_area_t *)dev->priv)->route_status = | ||
| 2636 | NO_ROUTE; | ||
| 2637 | printk(KERN_INFO "%s: Dynamic route removed: %u.%u.%u.%u\n", | ||
| 2638 | card->devname, NIPQUAD(local_IP_addr)); | ||
| 2639 | chdlc_priv_area->route_removed = 1; | ||
| 2640 | } | ||
| 2641 | break; | ||
| 2642 | } | ||
| 2643 | |||
| 2644 | set_fs(fs); /* Restore file system */ | ||
| 2645 | |||
| 2646 | } | ||
| 2647 | |||
| 2648 | |||
| 2649 | /*============================================================================= | ||
| 2650 | * Store a UDP management packet for later processing. | ||
| 2651 | */ | ||
| 2652 | |||
| 2653 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 2654 | struct sk_buff *skb, struct net_device* dev, | ||
| 2655 | chdlc_private_area_t* chdlc_priv_area) | ||
| 2656 | { | ||
| 2657 | int udp_pkt_stored = 0; | ||
| 2658 | |||
| 2659 | if(!chdlc_priv_area->udp_pkt_lgth && | ||
| 2660 | (skb->len <= MAX_LGTH_UDP_MGNT_PKT)) { | ||
| 2661 | chdlc_priv_area->udp_pkt_lgth = skb->len; | ||
| 2662 | chdlc_priv_area->udp_pkt_src = udp_pkt_src; | ||
| 2663 | memcpy(chdlc_priv_area->udp_pkt_data, skb->data, skb->len); | ||
| 2664 | chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UDP; | ||
| 2665 | udp_pkt_stored = 1; | ||
| 2666 | } | ||
| 2667 | |||
| 2668 | if(udp_pkt_src == UDP_PKT_FRM_STACK){ | ||
| 2669 | dev_kfree_skb_any(skb); | ||
| 2670 | }else{ | ||
| 2671 | dev_kfree_skb_any(skb); | ||
| 2672 | } | ||
| 2673 | |||
| 2674 | return(udp_pkt_stored); | ||
| 2675 | } | ||
| 2676 | |||
| 2677 | |||
| 2678 | /*============================================================================= | ||
| 2679 | * Process UDP management packet. | ||
| 2680 | */ | ||
| 2681 | |||
| 2682 | static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev, | ||
| 2683 | chdlc_private_area_t* chdlc_priv_area ) | ||
| 2684 | { | ||
| 2685 | unsigned char *buf; | ||
| 2686 | unsigned int frames, len; | ||
| 2687 | struct sk_buff *new_skb; | ||
| 2688 | unsigned short buffer_length, real_len; | ||
| 2689 | unsigned long data_ptr; | ||
| 2690 | unsigned data_length; | ||
| 2691 | int udp_mgmt_req_valid = 1; | ||
| 2692 | CHDLC_MAILBOX_STRUCT *mb = card->mbox; | ||
| 2693 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 2694 | chdlc_udp_pkt_t *chdlc_udp_pkt; | ||
| 2695 | struct timeval tv; | ||
| 2696 | int err; | ||
| 2697 | char ut_char; | ||
| 2698 | |||
| 2699 | chdlc_udp_pkt = (chdlc_udp_pkt_t *) chdlc_priv_area->udp_pkt_data; | ||
| 2700 | |||
| 2701 | if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK){ | ||
| 2702 | |||
| 2703 | /* Only these commands are support for remote debugging. | ||
| 2704 | * All others are not */ | ||
| 2705 | switch(chdlc_udp_pkt->cblock.command) { | ||
| 2706 | |||
| 2707 | case READ_GLOBAL_STATISTICS: | ||
| 2708 | case READ_MODEM_STATUS: | ||
| 2709 | case READ_CHDLC_LINK_STATUS: | ||
| 2710 | case CPIPE_ROUTER_UP_TIME: | ||
| 2711 | case READ_COMMS_ERROR_STATS: | ||
| 2712 | case READ_CHDLC_OPERATIONAL_STATS: | ||
| 2713 | |||
| 2714 | /* These two commands are executed for | ||
| 2715 | * each request */ | ||
| 2716 | case READ_CHDLC_CONFIGURATION: | ||
| 2717 | case READ_CHDLC_CODE_VERSION: | ||
| 2718 | udp_mgmt_req_valid = 1; | ||
| 2719 | break; | ||
| 2720 | default: | ||
| 2721 | udp_mgmt_req_valid = 0; | ||
| 2722 | break; | ||
| 2723 | } | ||
| 2724 | } | ||
| 2725 | |||
| 2726 | if(!udp_mgmt_req_valid) { | ||
| 2727 | |||
| 2728 | /* set length to 0 */ | ||
| 2729 | chdlc_udp_pkt->cblock.buffer_length = 0; | ||
| 2730 | |||
| 2731 | /* set return code */ | ||
| 2732 | chdlc_udp_pkt->cblock.return_code = 0xCD; | ||
| 2733 | |||
| 2734 | if (net_ratelimit()){ | ||
| 2735 | printk(KERN_INFO | ||
| 2736 | "%s: Warning, Illegal UDP command attempted from network: %x\n", | ||
| 2737 | card->devname,chdlc_udp_pkt->cblock.command); | ||
| 2738 | } | ||
| 2739 | |||
| 2740 | } else { | ||
| 2741 | unsigned long trace_status_cfg_addr = 0; | ||
| 2742 | TRACE_STATUS_EL_CFG_STRUCT trace_cfg_struct; | ||
| 2743 | TRACE_STATUS_ELEMENT_STRUCT trace_element_struct; | ||
| 2744 | |||
| 2745 | switch(chdlc_udp_pkt->cblock.command) { | ||
| 2746 | |||
| 2747 | case CPIPE_ENABLE_TRACING: | ||
| 2748 | if (!chdlc_priv_area->TracingEnabled) { | ||
| 2749 | |||
| 2750 | /* OPERATE_DATALINE_MONITOR */ | ||
| 2751 | |||
| 2752 | mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT); | ||
| 2753 | mb->command = SET_TRACE_CONFIGURATION; | ||
| 2754 | |||
| 2755 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 2756 | trace_config = TRACE_ACTIVE; | ||
| 2757 | /* Trace delay mode is not used because it slows | ||
| 2758 | down transfer and results in a standoff situation | ||
| 2759 | when there is a lot of data */ | ||
| 2760 | |||
| 2761 | /* Configure the Trace based on user inputs */ | ||
| 2762 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->trace_config |= | ||
| 2763 | chdlc_udp_pkt->data[0]; | ||
| 2764 | |||
| 2765 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 2766 | trace_deactivation_timer = 4000; | ||
| 2767 | |||
| 2768 | |||
| 2769 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2770 | if (err != COMMAND_OK) { | ||
| 2771 | chdlc_error(card,err,mb); | ||
| 2772 | card->TracingEnabled = 0; | ||
| 2773 | chdlc_udp_pkt->cblock.return_code = err; | ||
| 2774 | mb->buffer_length = 0; | ||
| 2775 | break; | ||
| 2776 | } | ||
| 2777 | |||
| 2778 | /* Get the base address of the trace element list */ | ||
| 2779 | mb->buffer_length = 0; | ||
| 2780 | mb->command = READ_TRACE_CONFIGURATION; | ||
| 2781 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2782 | |||
| 2783 | if (err != COMMAND_OK) { | ||
| 2784 | chdlc_error(card,err,mb); | ||
| 2785 | chdlc_priv_area->TracingEnabled = 0; | ||
| 2786 | chdlc_udp_pkt->cblock.return_code = err; | ||
| 2787 | mb->buffer_length = 0; | ||
| 2788 | break; | ||
| 2789 | } | ||
| 2790 | |||
| 2791 | trace_status_cfg_addr =((LINE_TRACE_CONFIG_STRUCT *) | ||
| 2792 | mb->data) -> ptr_trace_stat_el_cfg_struct; | ||
| 2793 | |||
| 2794 | sdla_peek(&card->hw, trace_status_cfg_addr, | ||
| 2795 | &trace_cfg_struct, sizeof(trace_cfg_struct)); | ||
| 2796 | |||
| 2797 | chdlc_priv_area->start_trace_addr = trace_cfg_struct. | ||
| 2798 | base_addr_trace_status_elements; | ||
| 2799 | |||
| 2800 | chdlc_priv_area->number_trace_elements = | ||
| 2801 | trace_cfg_struct.number_trace_status_elements; | ||
| 2802 | |||
| 2803 | chdlc_priv_area->end_trace_addr = (unsigned long) | ||
| 2804 | ((TRACE_STATUS_ELEMENT_STRUCT *) | ||
| 2805 | chdlc_priv_area->start_trace_addr + | ||
| 2806 | (chdlc_priv_area->number_trace_elements - 1)); | ||
| 2807 | |||
| 2808 | chdlc_priv_area->base_addr_trace_buffer = | ||
| 2809 | trace_cfg_struct.base_addr_trace_buffer; | ||
| 2810 | |||
| 2811 | chdlc_priv_area->end_addr_trace_buffer = | ||
| 2812 | trace_cfg_struct.end_addr_trace_buffer; | ||
| 2813 | |||
| 2814 | chdlc_priv_area->curr_trace_addr = | ||
| 2815 | trace_cfg_struct.next_trace_element_to_use; | ||
| 2816 | |||
| 2817 | chdlc_priv_area->available_buffer_space = 2000 - | ||
| 2818 | sizeof(ip_pkt_t) - | ||
| 2819 | sizeof(udp_pkt_t) - | ||
| 2820 | sizeof(wp_mgmt_t) - | ||
| 2821 | sizeof(cblock_t) - | ||
| 2822 | sizeof(trace_info_t); | ||
| 2823 | } | ||
| 2824 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 2825 | mb->buffer_length = 0; | ||
| 2826 | chdlc_priv_area->TracingEnabled = 1; | ||
| 2827 | break; | ||
| 2828 | |||
| 2829 | |||
| 2830 | case CPIPE_DISABLE_TRACING: | ||
| 2831 | if (chdlc_priv_area->TracingEnabled) { | ||
| 2832 | |||
| 2833 | /* OPERATE_DATALINE_MONITOR */ | ||
| 2834 | mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT); | ||
| 2835 | mb->command = SET_TRACE_CONFIGURATION; | ||
| 2836 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 2837 | trace_config = TRACE_INACTIVE; | ||
| 2838 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2839 | } | ||
| 2840 | |||
| 2841 | chdlc_priv_area->TracingEnabled = 0; | ||
| 2842 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 2843 | mb->buffer_length = 0; | ||
| 2844 | break; | ||
| 2845 | |||
| 2846 | |||
| 2847 | case CPIPE_GET_TRACE_INFO: | ||
| 2848 | |||
| 2849 | if (!chdlc_priv_area->TracingEnabled) { | ||
| 2850 | chdlc_udp_pkt->cblock.return_code = 1; | ||
| 2851 | mb->buffer_length = 0; | ||
| 2852 | break; | ||
| 2853 | } | ||
| 2854 | |||
| 2855 | chdlc_udp_pkt->trace_info.ismoredata = 0x00; | ||
| 2856 | buffer_length = 0; /* offset of packet already occupied */ | ||
| 2857 | |||
| 2858 | for (frames=0; frames < chdlc_priv_area->number_trace_elements; frames++){ | ||
| 2859 | |||
| 2860 | trace_pkt_t *trace_pkt = (trace_pkt_t *) | ||
| 2861 | &chdlc_udp_pkt->data[buffer_length]; | ||
| 2862 | |||
| 2863 | sdla_peek(&card->hw, chdlc_priv_area->curr_trace_addr, | ||
| 2864 | (unsigned char *)&trace_element_struct, | ||
| 2865 | sizeof(TRACE_STATUS_ELEMENT_STRUCT)); | ||
| 2866 | |||
| 2867 | if (trace_element_struct.opp_flag == 0x00) { | ||
| 2868 | break; | ||
| 2869 | } | ||
| 2870 | |||
| 2871 | /* get pointer to real data */ | ||
| 2872 | data_ptr = trace_element_struct.ptr_data_bfr; | ||
| 2873 | |||
| 2874 | /* See if there is actual data on the trace buffer */ | ||
| 2875 | if (data_ptr){ | ||
| 2876 | data_length = trace_element_struct.trace_length; | ||
| 2877 | }else{ | ||
| 2878 | data_length = 0; | ||
| 2879 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 2880 | } | ||
| 2881 | |||
| 2882 | if( (chdlc_priv_area->available_buffer_space - buffer_length) | ||
| 2883 | < ( sizeof(trace_pkt_t) + data_length) ) { | ||
| 2884 | |||
| 2885 | /* indicate there are more frames on board & exit */ | ||
| 2886 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 2887 | break; | ||
| 2888 | } | ||
| 2889 | |||
| 2890 | trace_pkt->status = trace_element_struct.trace_type; | ||
| 2891 | |||
| 2892 | trace_pkt->time_stamp = | ||
| 2893 | trace_element_struct.trace_time_stamp; | ||
| 2894 | |||
| 2895 | trace_pkt->real_length = | ||
| 2896 | trace_element_struct.trace_length; | ||
| 2897 | |||
| 2898 | /* see if we can fit the frame into the user buffer */ | ||
| 2899 | real_len = trace_pkt->real_length; | ||
| 2900 | |||
| 2901 | if (data_ptr == 0) { | ||
| 2902 | trace_pkt->data_avail = 0x00; | ||
| 2903 | } else { | ||
| 2904 | unsigned tmp = 0; | ||
| 2905 | |||
| 2906 | /* get the data from circular buffer | ||
| 2907 | must check for end of buffer */ | ||
| 2908 | trace_pkt->data_avail = 0x01; | ||
| 2909 | |||
| 2910 | if ((data_ptr + real_len) > | ||
| 2911 | chdlc_priv_area->end_addr_trace_buffer + 1){ | ||
| 2912 | |||
| 2913 | tmp = chdlc_priv_area->end_addr_trace_buffer - data_ptr + 1; | ||
| 2914 | sdla_peek(&card->hw, data_ptr, | ||
| 2915 | trace_pkt->data,tmp); | ||
| 2916 | data_ptr = chdlc_priv_area->base_addr_trace_buffer; | ||
| 2917 | } | ||
| 2918 | |||
| 2919 | sdla_peek(&card->hw, data_ptr, | ||
| 2920 | &trace_pkt->data[tmp], real_len - tmp); | ||
| 2921 | } | ||
| 2922 | |||
| 2923 | /* zero the opp flag to show we got the frame */ | ||
| 2924 | ut_char = 0x00; | ||
| 2925 | sdla_poke(&card->hw, chdlc_priv_area->curr_trace_addr, &ut_char, 1); | ||
| 2926 | |||
| 2927 | /* now move onto the next frame */ | ||
| 2928 | chdlc_priv_area->curr_trace_addr += sizeof(TRACE_STATUS_ELEMENT_STRUCT); | ||
| 2929 | |||
| 2930 | /* check if we went over the last address */ | ||
| 2931 | if ( chdlc_priv_area->curr_trace_addr > chdlc_priv_area->end_trace_addr ) { | ||
| 2932 | chdlc_priv_area->curr_trace_addr = chdlc_priv_area->start_trace_addr; | ||
| 2933 | } | ||
| 2934 | |||
| 2935 | if(trace_pkt->data_avail == 0x01) { | ||
| 2936 | buffer_length += real_len - 1; | ||
| 2937 | } | ||
| 2938 | |||
| 2939 | /* for the header */ | ||
| 2940 | buffer_length += sizeof(trace_pkt_t); | ||
| 2941 | |||
| 2942 | } /* For Loop */ | ||
| 2943 | |||
| 2944 | if (frames == chdlc_priv_area->number_trace_elements){ | ||
| 2945 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 2946 | } | ||
| 2947 | chdlc_udp_pkt->trace_info.num_frames = frames; | ||
| 2948 | |||
| 2949 | mb->buffer_length = buffer_length; | ||
| 2950 | chdlc_udp_pkt->cblock.buffer_length = buffer_length; | ||
| 2951 | |||
| 2952 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 2953 | |||
| 2954 | break; | ||
| 2955 | |||
| 2956 | |||
| 2957 | case CPIPE_FT1_READ_STATUS: | ||
| 2958 | ((unsigned char *)chdlc_udp_pkt->data )[0] = | ||
| 2959 | flags->FT1_info_struct.parallel_port_A_input; | ||
| 2960 | |||
| 2961 | ((unsigned char *)chdlc_udp_pkt->data )[1] = | ||
| 2962 | flags->FT1_info_struct.parallel_port_B_input; | ||
| 2963 | |||
| 2964 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 2965 | chdlc_udp_pkt->cblock.buffer_length = 2; | ||
| 2966 | mb->buffer_length = 2; | ||
| 2967 | break; | ||
| 2968 | |||
| 2969 | case CPIPE_ROUTER_UP_TIME: | ||
| 2970 | do_gettimeofday( &tv ); | ||
| 2971 | chdlc_priv_area->router_up_time = tv.tv_sec - | ||
| 2972 | chdlc_priv_area->router_start_time; | ||
| 2973 | *(unsigned long *)&chdlc_udp_pkt->data = | ||
| 2974 | chdlc_priv_area->router_up_time; | ||
| 2975 | mb->buffer_length = sizeof(unsigned long); | ||
| 2976 | chdlc_udp_pkt->cblock.buffer_length = sizeof(unsigned long); | ||
| 2977 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 2978 | break; | ||
| 2979 | |||
| 2980 | case FT1_MONITOR_STATUS_CTRL: | ||
| 2981 | /* Enable FT1 MONITOR STATUS */ | ||
| 2982 | if ((chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_STATUS) || | ||
| 2983 | (chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_OP_STATS)) { | ||
| 2984 | |||
| 2985 | if( rCount++ != 0 ) { | ||
| 2986 | chdlc_udp_pkt->cblock. | ||
| 2987 | return_code = COMMAND_OK; | ||
| 2988 | mb->buffer_length = 1; | ||
| 2989 | break; | ||
| 2990 | } | ||
| 2991 | } | ||
| 2992 | |||
| 2993 | /* Disable FT1 MONITOR STATUS */ | ||
| 2994 | if( chdlc_udp_pkt->data[0] == 0) { | ||
| 2995 | |||
| 2996 | if( --rCount != 0) { | ||
| 2997 | chdlc_udp_pkt->cblock. | ||
| 2998 | return_code = COMMAND_OK; | ||
| 2999 | mb->buffer_length = 1; | ||
| 3000 | break; | ||
| 3001 | } | ||
| 3002 | } | ||
| 3003 | goto dflt_1; | ||
| 3004 | |||
| 3005 | default: | ||
| 3006 | dflt_1: | ||
| 3007 | /* it's a board command */ | ||
| 3008 | mb->command = chdlc_udp_pkt->cblock.command; | ||
| 3009 | mb->buffer_length = chdlc_udp_pkt->cblock.buffer_length; | ||
| 3010 | if (mb->buffer_length) { | ||
| 3011 | memcpy(&mb->data, (unsigned char *) chdlc_udp_pkt-> | ||
| 3012 | data, mb->buffer_length); | ||
| 3013 | } | ||
| 3014 | /* run the command on the board */ | ||
| 3015 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 3016 | if (err != COMMAND_OK) { | ||
| 3017 | break; | ||
| 3018 | } | ||
| 3019 | |||
| 3020 | /* copy the result back to our buffer */ | ||
| 3021 | memcpy(&chdlc_udp_pkt->cblock, mb, sizeof(cblock_t)); | ||
| 3022 | |||
| 3023 | if (mb->buffer_length) { | ||
| 3024 | memcpy(&chdlc_udp_pkt->data, &mb->data, | ||
| 3025 | mb->buffer_length); | ||
| 3026 | } | ||
| 3027 | |||
| 3028 | } /* end of switch */ | ||
| 3029 | } /* end of else */ | ||
| 3030 | |||
| 3031 | /* Fill UDP TTL */ | ||
| 3032 | chdlc_udp_pkt->ip_pkt.ttl = card->wandev.ttl; | ||
| 3033 | |||
| 3034 | len = reply_udp(chdlc_priv_area->udp_pkt_data, mb->buffer_length); | ||
| 3035 | |||
| 3036 | |||
| 3037 | if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK){ | ||
| 3038 | |||
| 3039 | /* Must check if we interrupted if_send() routine. The | ||
| 3040 | * tx buffers might be used. If so drop the packet */ | ||
| 3041 | if (!test_bit(SEND_CRIT,&card->wandev.critical)) { | ||
| 3042 | |||
| 3043 | if(!chdlc_send(card, chdlc_priv_area->udp_pkt_data, len)) { | ||
| 3044 | ++ card->wandev.stats.tx_packets; | ||
| 3045 | card->wandev.stats.tx_bytes += len; | ||
| 3046 | } | ||
| 3047 | } | ||
| 3048 | } else { | ||
| 3049 | |||
| 3050 | /* Pass it up the stack | ||
| 3051 | Allocate socket buffer */ | ||
| 3052 | if ((new_skb = dev_alloc_skb(len)) != NULL) { | ||
| 3053 | /* copy data into new_skb */ | ||
| 3054 | |||
| 3055 | buf = skb_put(new_skb, len); | ||
| 3056 | memcpy(buf, chdlc_priv_area->udp_pkt_data, len); | ||
| 3057 | |||
| 3058 | /* Decapsulate pkt and pass it up the protocol stack */ | ||
| 3059 | new_skb->protocol = htons(ETH_P_IP); | ||
| 3060 | new_skb->dev = dev; | ||
| 3061 | new_skb->mac.raw = new_skb->data; | ||
| 3062 | |||
| 3063 | netif_rx(new_skb); | ||
| 3064 | dev->last_rx = jiffies; | ||
| 3065 | } else { | ||
| 3066 | |||
| 3067 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 3068 | card->devname); | ||
| 3069 | } | ||
| 3070 | } | ||
| 3071 | |||
| 3072 | chdlc_priv_area->udp_pkt_lgth = 0; | ||
| 3073 | |||
| 3074 | return 0; | ||
| 3075 | } | ||
| 3076 | |||
| 3077 | /*============================================================================ | ||
| 3078 | * Initialize Receive and Transmit Buffers. | ||
| 3079 | */ | ||
| 3080 | |||
| 3081 | static void init_chdlc_tx_rx_buff( sdla_t* card) | ||
| 3082 | { | ||
| 3083 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 3084 | CHDLC_TX_STATUS_EL_CFG_STRUCT *tx_config; | ||
| 3085 | CHDLC_RX_STATUS_EL_CFG_STRUCT *rx_config; | ||
| 3086 | char err; | ||
| 3087 | |||
| 3088 | mb->buffer_length = 0; | ||
| 3089 | mb->command = READ_CHDLC_CONFIGURATION; | ||
| 3090 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 3091 | |||
| 3092 | if(err != COMMAND_OK) { | ||
| 3093 | if (card->wandev.dev){ | ||
| 3094 | chdlc_error(card,err,mb); | ||
| 3095 | } | ||
| 3096 | return; | ||
| 3097 | } | ||
| 3098 | |||
| 3099 | if(card->hw.type == SDLA_S514) { | ||
| 3100 | tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 3101 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 3102 | ptr_CHDLC_Tx_stat_el_cfg_struct)); | ||
| 3103 | rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 3104 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 3105 | ptr_CHDLC_Rx_stat_el_cfg_struct)); | ||
| 3106 | |||
| 3107 | /* Setup Head and Tails for buffers */ | ||
| 3108 | card->u.c.txbuf_base = (void *)(card->hw.dpmbase + | ||
| 3109 | tx_config->base_addr_Tx_status_elements); | ||
| 3110 | card->u.c.txbuf_last = | ||
| 3111 | (CHDLC_DATA_TX_STATUS_EL_STRUCT *) | ||
| 3112 | card->u.c.txbuf_base + | ||
| 3113 | (tx_config->number_Tx_status_elements - 1); | ||
| 3114 | |||
| 3115 | card->u.c.rxbuf_base = (void *)(card->hw.dpmbase + | ||
| 3116 | rx_config->base_addr_Rx_status_elements); | ||
| 3117 | card->u.c.rxbuf_last = | ||
| 3118 | (CHDLC_DATA_RX_STATUS_EL_STRUCT *) | ||
| 3119 | card->u.c.rxbuf_base + | ||
| 3120 | (rx_config->number_Rx_status_elements - 1); | ||
| 3121 | |||
| 3122 | /* Set up next pointer to be used */ | ||
| 3123 | card->u.c.txbuf = (void *)(card->hw.dpmbase + | ||
| 3124 | tx_config->next_Tx_status_element_to_use); | ||
| 3125 | card->u.c.rxmb = (void *)(card->hw.dpmbase + | ||
| 3126 | rx_config->next_Rx_status_element_to_use); | ||
| 3127 | } | ||
| 3128 | else { | ||
| 3129 | tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 3130 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 3131 | ptr_CHDLC_Tx_stat_el_cfg_struct % SDLA_WINDOWSIZE)); | ||
| 3132 | |||
| 3133 | rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 3134 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 3135 | ptr_CHDLC_Rx_stat_el_cfg_struct % SDLA_WINDOWSIZE)); | ||
| 3136 | |||
| 3137 | /* Setup Head and Tails for buffers */ | ||
| 3138 | card->u.c.txbuf_base = (void *)(card->hw.dpmbase + | ||
| 3139 | (tx_config->base_addr_Tx_status_elements % SDLA_WINDOWSIZE)); | ||
| 3140 | card->u.c.txbuf_last = | ||
| 3141 | (CHDLC_DATA_TX_STATUS_EL_STRUCT *)card->u.c.txbuf_base | ||
| 3142 | + (tx_config->number_Tx_status_elements - 1); | ||
| 3143 | card->u.c.rxbuf_base = (void *)(card->hw.dpmbase + | ||
| 3144 | (rx_config->base_addr_Rx_status_elements % SDLA_WINDOWSIZE)); | ||
| 3145 | card->u.c.rxbuf_last = | ||
| 3146 | (CHDLC_DATA_RX_STATUS_EL_STRUCT *)card->u.c.rxbuf_base | ||
| 3147 | + (rx_config->number_Rx_status_elements - 1); | ||
| 3148 | |||
| 3149 | /* Set up next pointer to be used */ | ||
| 3150 | card->u.c.txbuf = (void *)(card->hw.dpmbase + | ||
| 3151 | (tx_config->next_Tx_status_element_to_use % SDLA_WINDOWSIZE)); | ||
| 3152 | card->u.c.rxmb = (void *)(card->hw.dpmbase + | ||
| 3153 | (rx_config->next_Rx_status_element_to_use % SDLA_WINDOWSIZE)); | ||
| 3154 | } | ||
| 3155 | |||
| 3156 | /* Setup Actual Buffer Start and end addresses */ | ||
| 3157 | card->u.c.rx_base = rx_config->base_addr_Rx_buffer; | ||
| 3158 | card->u.c.rx_top = rx_config->end_addr_Rx_buffer; | ||
| 3159 | |||
| 3160 | } | ||
| 3161 | |||
| 3162 | /*============================================================================= | ||
| 3163 | * Perform Interrupt Test by running READ_CHDLC_CODE_VERSION command MAX_INTR | ||
| 3164 | * _TEST_COUNTER times. | ||
| 3165 | */ | ||
| 3166 | static int intr_test( sdla_t* card) | ||
| 3167 | { | ||
| 3168 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 3169 | int err,i; | ||
| 3170 | |||
| 3171 | Intr_test_counter = 0; | ||
| 3172 | |||
| 3173 | err = chdlc_set_intr_mode(card, APP_INT_ON_COMMAND_COMPLETE); | ||
| 3174 | |||
| 3175 | if (err == CMD_OK) { | ||
| 3176 | for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) { | ||
| 3177 | mb->buffer_length = 0; | ||
| 3178 | mb->command = READ_CHDLC_CODE_VERSION; | ||
| 3179 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 3180 | if (err != CMD_OK) | ||
| 3181 | chdlc_error(card, err, mb); | ||
| 3182 | } | ||
| 3183 | } | ||
| 3184 | else { | ||
| 3185 | return err; | ||
| 3186 | } | ||
| 3187 | |||
| 3188 | err = chdlc_set_intr_mode(card, 0); | ||
| 3189 | |||
| 3190 | if (err != CMD_OK) | ||
| 3191 | return err; | ||
| 3192 | |||
| 3193 | return 0; | ||
| 3194 | } | ||
| 3195 | |||
| 3196 | /*============================================================================== | ||
| 3197 | * Determine what type of UDP call it is. CPIPEAB ? | ||
| 3198 | */ | ||
| 3199 | static int udp_pkt_type(struct sk_buff *skb, sdla_t* card) | ||
| 3200 | { | ||
| 3201 | chdlc_udp_pkt_t *chdlc_udp_pkt = (chdlc_udp_pkt_t *)skb->data; | ||
| 3202 | |||
| 3203 | #ifdef _WAN_UDP_DEBUG | ||
| 3204 | printk(KERN_INFO "SIG %s = %s\n\ | ||
| 3205 | UPP %x = %x\n\ | ||
| 3206 | PRT %x = %x\n\ | ||
| 3207 | REQ %i = %i\n\ | ||
| 3208 | 36 th = %x 37th = %x\n", | ||
| 3209 | chdlc_udp_pkt->wp_mgmt.signature, | ||
| 3210 | UDPMGMT_SIGNATURE, | ||
| 3211 | chdlc_udp_pkt->udp_pkt.udp_dst_port, | ||
| 3212 | ntohs(card->wandev.udp_port), | ||
| 3213 | chdlc_udp_pkt->ip_pkt.protocol, | ||
| 3214 | UDPMGMT_UDP_PROTOCOL, | ||
| 3215 | chdlc_udp_pkt->wp_mgmt.request_reply, | ||
| 3216 | UDPMGMT_REQUEST, | ||
| 3217 | skb->data[36], skb->data[37]); | ||
| 3218 | #endif | ||
| 3219 | |||
| 3220 | if (!strncmp(chdlc_udp_pkt->wp_mgmt.signature,UDPMGMT_SIGNATURE,8) && | ||
| 3221 | (chdlc_udp_pkt->udp_pkt.udp_dst_port == ntohs(card->wandev.udp_port)) && | ||
| 3222 | (chdlc_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) && | ||
| 3223 | (chdlc_udp_pkt->wp_mgmt.request_reply == UDPMGMT_REQUEST)) { | ||
| 3224 | |||
| 3225 | return UDP_CPIPE_TYPE; | ||
| 3226 | |||
| 3227 | }else{ | ||
| 3228 | return UDP_INVALID_TYPE; | ||
| 3229 | } | ||
| 3230 | } | ||
| 3231 | |||
| 3232 | /*============================================================================ | ||
| 3233 | * Set PORT state. | ||
| 3234 | */ | ||
| 3235 | static void port_set_state (sdla_t *card, int state) | ||
| 3236 | { | ||
| 3237 | if (card->u.c.state != state) | ||
| 3238 | { | ||
| 3239 | switch (state) | ||
| 3240 | { | ||
| 3241 | case WAN_CONNECTED: | ||
| 3242 | printk (KERN_INFO "%s: Link connected!\n", | ||
| 3243 | card->devname); | ||
| 3244 | break; | ||
| 3245 | |||
| 3246 | case WAN_CONNECTING: | ||
| 3247 | printk (KERN_INFO "%s: Link connecting...\n", | ||
| 3248 | card->devname); | ||
| 3249 | break; | ||
| 3250 | |||
| 3251 | case WAN_DISCONNECTED: | ||
| 3252 | printk (KERN_INFO "%s: Link disconnected!\n", | ||
| 3253 | card->devname); | ||
| 3254 | break; | ||
| 3255 | } | ||
| 3256 | |||
| 3257 | card->wandev.state = card->u.c.state = state; | ||
| 3258 | if (card->wandev.dev){ | ||
| 3259 | struct net_device *dev = card->wandev.dev; | ||
| 3260 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 3261 | chdlc_priv_area->common.state = state; | ||
| 3262 | } | ||
| 3263 | } | ||
| 3264 | } | ||
| 3265 | |||
| 3266 | /*=========================================================================== | ||
| 3267 | * config_chdlc | ||
| 3268 | * | ||
| 3269 | * Configure the chdlc protocol and enable communications. | ||
| 3270 | * | ||
| 3271 | * The if_open() function binds this function to the poll routine. | ||
| 3272 | * Therefore, this function will run every time the chdlc interface | ||
| 3273 | * is brought up. We cannot run this function from the if_open | ||
| 3274 | * because if_open does not have access to the remote IP address. | ||
| 3275 | * | ||
| 3276 | * If the communications are not enabled, proceed to configure | ||
| 3277 | * the card and enable communications. | ||
| 3278 | * | ||
| 3279 | * If the communications are enabled, it means that the interface | ||
| 3280 | * was shutdown by ether the user or driver. In this case, we | ||
| 3281 | * have to check that the IP addresses have not changed. If | ||
| 3282 | * the IP addresses have changed, we have to reconfigure the firmware | ||
| 3283 | * and update the changed IP addresses. Otherwise, just exit. | ||
| 3284 | * | ||
| 3285 | */ | ||
| 3286 | |||
| 3287 | static int config_chdlc (sdla_t *card) | ||
| 3288 | { | ||
| 3289 | struct net_device *dev = card->wandev.dev; | ||
| 3290 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 3291 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 3292 | |||
| 3293 | if (card->u.c.comm_enabled){ | ||
| 3294 | |||
| 3295 | /* Jun 20. 2000: NC | ||
| 3296 | * IP addresses are not used in the API mode */ | ||
| 3297 | |||
| 3298 | if ((chdlc_priv_area->ip_local_tmp != chdlc_priv_area->ip_local || | ||
| 3299 | chdlc_priv_area->ip_remote_tmp != chdlc_priv_area->ip_remote) && | ||
| 3300 | card->u.c.usedby == WANPIPE) { | ||
| 3301 | |||
| 3302 | /* The IP addersses have changed, we must | ||
| 3303 | * stop the communications and reconfigure | ||
| 3304 | * the card. Reason: the firmware must know | ||
| 3305 | * the local and remote IP addresses. */ | ||
| 3306 | disable_comm(card); | ||
| 3307 | port_set_state(card, WAN_DISCONNECTED); | ||
| 3308 | printk(KERN_INFO | ||
| 3309 | "%s: IP addresses changed!\n", | ||
| 3310 | card->devname); | ||
| 3311 | printk(KERN_INFO | ||
| 3312 | "%s: Restarting communications ...\n", | ||
| 3313 | card->devname); | ||
| 3314 | }else{ | ||
| 3315 | /* IP addresses are the same and the link is up, | ||
| 3316 | * we don't have to do anything here. Therefore, exit */ | ||
| 3317 | return 0; | ||
| 3318 | } | ||
| 3319 | } | ||
| 3320 | |||
| 3321 | chdlc_priv_area->ip_local = chdlc_priv_area->ip_local_tmp; | ||
| 3322 | chdlc_priv_area->ip_remote = chdlc_priv_area->ip_remote_tmp; | ||
| 3323 | |||
| 3324 | |||
| 3325 | /* Setup the Board for asynchronous mode */ | ||
| 3326 | if (card->u.c.async_mode){ | ||
| 3327 | |||
| 3328 | if (set_asy_config(card)) { | ||
| 3329 | printk (KERN_INFO "%s: Failed CHDLC Async configuration!\n", | ||
| 3330 | card->devname); | ||
| 3331 | return 0; | ||
| 3332 | } | ||
| 3333 | }else{ | ||
| 3334 | /* Setup the Board for CHDLC */ | ||
| 3335 | if (set_chdlc_config(card)) { | ||
| 3336 | printk (KERN_INFO "%s: Failed CHDLC configuration!\n", | ||
| 3337 | card->devname); | ||
| 3338 | return 0; | ||
| 3339 | } | ||
| 3340 | } | ||
| 3341 | |||
| 3342 | /* Set interrupt mode and mask */ | ||
| 3343 | if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME | | ||
| 3344 | APP_INT_ON_GLOBAL_EXCEP_COND | | ||
| 3345 | APP_INT_ON_TX_FRAME | | ||
| 3346 | APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){ | ||
| 3347 | printk (KERN_INFO "%s: Failed to set interrupt triggers!\n", | ||
| 3348 | card->devname); | ||
| 3349 | return 0; | ||
| 3350 | } | ||
| 3351 | |||
| 3352 | |||
| 3353 | /* Mask the Transmit and Timer interrupt */ | ||
| 3354 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 3355 | ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER); | ||
| 3356 | |||
| 3357 | /* In TTY mode, receive interrupt will be enabled during | ||
| 3358 | * wanpipe_tty_open() operation */ | ||
| 3359 | if (card->tty_opt){ | ||
| 3360 | flags->interrupt_info_struct.interrupt_permission &= ~APP_INT_ON_RX_FRAME; | ||
| 3361 | } | ||
| 3362 | |||
| 3363 | /* Enable communications */ | ||
| 3364 | if (card->u.c.async_mode){ | ||
| 3365 | if (asy_comm_enable(card) != 0) { | ||
| 3366 | printk(KERN_INFO "%s: Failed to enable async commnunication!\n", | ||
| 3367 | card->devname); | ||
| 3368 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 3369 | card->u.c.comm_enabled=0; | ||
| 3370 | chdlc_set_intr_mode(card,0); | ||
| 3371 | return 0; | ||
| 3372 | } | ||
| 3373 | }else{ | ||
| 3374 | if (chdlc_comm_enable(card) != 0) { | ||
| 3375 | printk(KERN_INFO "%s: Failed to enable chdlc communications!\n", | ||
| 3376 | card->devname); | ||
| 3377 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 3378 | card->u.c.comm_enabled=0; | ||
| 3379 | chdlc_set_intr_mode(card,0); | ||
| 3380 | return 0; | ||
| 3381 | } | ||
| 3382 | } | ||
| 3383 | |||
| 3384 | /* Initialize Rx/Tx buffer control fields */ | ||
| 3385 | init_chdlc_tx_rx_buff(card); | ||
| 3386 | port_set_state(card, WAN_CONNECTING); | ||
| 3387 | return 0; | ||
| 3388 | } | ||
| 3389 | |||
| 3390 | |||
| 3391 | /*============================================================ | ||
| 3392 | * chdlc_poll | ||
| 3393 | * | ||
| 3394 | * Rationale: | ||
| 3395 | * We cannot manipulate the routing tables, or | ||
| 3396 | * ip addresses withing the interrupt. Therefore | ||
| 3397 | * we must perform such actons outside an interrupt | ||
| 3398 | * at a later time. | ||
| 3399 | * | ||
| 3400 | * Description: | ||
| 3401 | * CHDLC polling routine, responsible for | ||
| 3402 | * shutting down interfaces upon disconnect | ||
| 3403 | * and adding/removing routes. | ||
| 3404 | * | ||
| 3405 | * Usage: | ||
| 3406 | * This function is executed for each CHDLC | ||
| 3407 | * interface through a tq_schedule bottom half. | ||
| 3408 | * | ||
| 3409 | * trigger_chdlc_poll() function is used to kick | ||
| 3410 | * the chldc_poll routine. | ||
| 3411 | */ | ||
| 3412 | |||
| 3413 | static void chdlc_poll(struct net_device *dev) | ||
| 3414 | { | ||
| 3415 | chdlc_private_area_t *chdlc_priv_area; | ||
| 3416 | sdla_t *card; | ||
| 3417 | u8 check_gateway=0; | ||
| 3418 | SHARED_MEMORY_INFO_STRUCT* flags; | ||
| 3419 | |||
| 3420 | |||
| 3421 | if (!dev || (chdlc_priv_area=dev->priv) == NULL) | ||
| 3422 | return; | ||
| 3423 | |||
| 3424 | card = chdlc_priv_area->card; | ||
| 3425 | flags = card->u.c.flags; | ||
| 3426 | |||
| 3427 | /* (Re)Configuraiton is in progress, stop what you are | ||
| 3428 | * doing and get out */ | ||
| 3429 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 3430 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3431 | return; | ||
| 3432 | } | ||
| 3433 | |||
| 3434 | /* if_open() function has triggered the polling routine | ||
| 3435 | * to determine the configured IP addresses. Once the | ||
| 3436 | * addresses are found, trigger the chdlc configuration */ | ||
| 3437 | if (test_bit(0,&chdlc_priv_area->config_chdlc)){ | ||
| 3438 | |||
| 3439 | chdlc_priv_area->ip_local_tmp = get_ip_address(dev,WAN_LOCAL_IP); | ||
| 3440 | chdlc_priv_area->ip_remote_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP); | ||
| 3441 | |||
| 3442 | /* Jun 20. 2000 Bug Fix | ||
| 3443 | * Only perform this check in WANPIPE mode, since | ||
| 3444 | * IP addresses are not used in the API mode. */ | ||
| 3445 | |||
| 3446 | if (chdlc_priv_area->ip_local_tmp == chdlc_priv_area->ip_remote_tmp && | ||
| 3447 | card->u.c.slarp_timer == 0x00 && | ||
| 3448 | !card->u.c.backup && | ||
| 3449 | card->u.c.usedby == WANPIPE){ | ||
| 3450 | |||
| 3451 | if (++chdlc_priv_area->ip_error > MAX_IP_ERRORS){ | ||
| 3452 | printk(KERN_INFO "\n%s: --- WARNING ---\n", | ||
| 3453 | card->devname); | ||
| 3454 | printk(KERN_INFO | ||
| 3455 | "%s: The local IP address is the same as the\n", | ||
| 3456 | card->devname); | ||
| 3457 | printk(KERN_INFO | ||
| 3458 | "%s: Point-to-Point IP address.\n", | ||
| 3459 | card->devname); | ||
| 3460 | printk(KERN_INFO "%s: --- WARNING ---\n\n", | ||
| 3461 | card->devname); | ||
| 3462 | }else{ | ||
| 3463 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3464 | chdlc_priv_area->poll_delay_timer.expires = jiffies+HZ; | ||
| 3465 | add_timer(&chdlc_priv_area->poll_delay_timer); | ||
| 3466 | return; | ||
| 3467 | } | ||
| 3468 | } | ||
| 3469 | |||
| 3470 | clear_bit(0,&chdlc_priv_area->config_chdlc); | ||
| 3471 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3472 | |||
| 3473 | chdlc_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG; | ||
| 3474 | flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER; | ||
| 3475 | return; | ||
| 3476 | } | ||
| 3477 | /* Dynamic interface implementation, as well as dynamic | ||
| 3478 | * routing. */ | ||
| 3479 | |||
| 3480 | switch (card->u.c.state){ | ||
| 3481 | |||
| 3482 | case WAN_DISCONNECTED: | ||
| 3483 | |||
| 3484 | /* If the dynamic interface configuration is on, and interface | ||
| 3485 | * is up, then bring down the netowrk interface */ | ||
| 3486 | |||
| 3487 | if (test_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down) && | ||
| 3488 | !test_bit(DEV_DOWN, &chdlc_priv_area->interface_down) && | ||
| 3489 | card->wandev.dev->flags & IFF_UP){ | ||
| 3490 | |||
| 3491 | printk(KERN_INFO "%s: Interface %s down.\n", | ||
| 3492 | card->devname,card->wandev.dev->name); | ||
| 3493 | change_dev_flags(card->wandev.dev,(card->wandev.dev->flags&~IFF_UP)); | ||
| 3494 | set_bit(DEV_DOWN,&chdlc_priv_area->interface_down); | ||
| 3495 | chdlc_priv_area->route_status = NO_ROUTE; | ||
| 3496 | |||
| 3497 | }else{ | ||
| 3498 | /* We need to check if the local IP address is | ||
| 3499 | * zero. If it is, we shouldn't try to remove it. | ||
| 3500 | */ | ||
| 3501 | |||
| 3502 | if (card->wandev.dev->flags & IFF_UP && | ||
| 3503 | get_ip_address(card->wandev.dev,WAN_LOCAL_IP) && | ||
| 3504 | chdlc_priv_area->route_status != NO_ROUTE && | ||
| 3505 | card->u.c.slarp_timer){ | ||
| 3506 | |||
| 3507 | process_route(card); | ||
| 3508 | } | ||
| 3509 | } | ||
| 3510 | break; | ||
| 3511 | |||
| 3512 | case WAN_CONNECTED: | ||
| 3513 | |||
| 3514 | /* In SMP machine this code can execute before the interface | ||
| 3515 | * comes up. In this case, we must make sure that we do not | ||
| 3516 | * try to bring up the interface before dev_open() is finished */ | ||
| 3517 | |||
| 3518 | |||
| 3519 | /* DEV_DOWN will be set only when we bring down the interface | ||
| 3520 | * for the very first time. This way we know that it was us | ||
| 3521 | * that brought the interface down */ | ||
| 3522 | |||
| 3523 | if (test_bit(DYN_OPT_ON,&chdlc_priv_area->interface_down) && | ||
| 3524 | test_bit(DEV_DOWN, &chdlc_priv_area->interface_down) && | ||
| 3525 | !(card->wandev.dev->flags & IFF_UP)){ | ||
| 3526 | |||
| 3527 | printk(KERN_INFO "%s: Interface %s up.\n", | ||
| 3528 | card->devname,card->wandev.dev->name); | ||
| 3529 | change_dev_flags(card->wandev.dev,(card->wandev.dev->flags|IFF_UP)); | ||
| 3530 | clear_bit(DEV_DOWN,&chdlc_priv_area->interface_down); | ||
| 3531 | check_gateway=1; | ||
| 3532 | } | ||
| 3533 | |||
| 3534 | if (chdlc_priv_area->route_status == ADD_ROUTE && | ||
| 3535 | card->u.c.slarp_timer){ | ||
| 3536 | |||
| 3537 | process_route(card); | ||
| 3538 | check_gateway=1; | ||
| 3539 | } | ||
| 3540 | |||
| 3541 | if (chdlc_priv_area->gateway && check_gateway) | ||
| 3542 | add_gateway(card,dev); | ||
| 3543 | |||
| 3544 | break; | ||
| 3545 | } | ||
| 3546 | |||
| 3547 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3548 | } | ||
| 3549 | |||
| 3550 | /*============================================================ | ||
| 3551 | * trigger_chdlc_poll | ||
| 3552 | * | ||
| 3553 | * Description: | ||
| 3554 | * Add a chdlc_poll() work entry into the keventd work queue | ||
| 3555 | * for a specific dlci/interface. This will kick | ||
| 3556 | * the fr_poll() routine at a later time. | ||
| 3557 | * | ||
| 3558 | * Usage: | ||
| 3559 | * Interrupts use this to defer a taks to | ||
| 3560 | * a polling routine. | ||
| 3561 | * | ||
| 3562 | */ | ||
| 3563 | static void trigger_chdlc_poll(struct net_device *dev) | ||
| 3564 | { | ||
| 3565 | chdlc_private_area_t *chdlc_priv_area; | ||
| 3566 | sdla_t *card; | ||
| 3567 | |||
| 3568 | if (!dev) | ||
| 3569 | return; | ||
| 3570 | |||
| 3571 | if ((chdlc_priv_area = dev->priv)==NULL) | ||
| 3572 | return; | ||
| 3573 | |||
| 3574 | card = chdlc_priv_area->card; | ||
| 3575 | |||
| 3576 | if (test_and_set_bit(POLL_CRIT,&card->wandev.critical)){ | ||
| 3577 | return; | ||
| 3578 | } | ||
| 3579 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 3580 | return; | ||
| 3581 | } | ||
| 3582 | schedule_work(&chdlc_priv_area->poll_work); | ||
| 3583 | } | ||
| 3584 | |||
| 3585 | |||
| 3586 | static void chdlc_poll_delay (unsigned long dev_ptr) | ||
| 3587 | { | ||
| 3588 | struct net_device *dev = (struct net_device *)dev_ptr; | ||
| 3589 | trigger_chdlc_poll(dev); | ||
| 3590 | } | ||
| 3591 | |||
| 3592 | |||
| 3593 | void s508_lock (sdla_t *card, unsigned long *smp_flags) | ||
| 3594 | { | ||
| 3595 | spin_lock_irqsave(&card->wandev.lock, *smp_flags); | ||
| 3596 | if (card->next){ | ||
| 3597 | spin_lock(&card->next->wandev.lock); | ||
| 3598 | } | ||
| 3599 | } | ||
| 3600 | |||
| 3601 | void s508_unlock (sdla_t *card, unsigned long *smp_flags) | ||
| 3602 | { | ||
| 3603 | if (card->next){ | ||
| 3604 | spin_unlock(&card->next->wandev.lock); | ||
| 3605 | } | ||
| 3606 | spin_unlock_irqrestore(&card->wandev.lock, *smp_flags); | ||
| 3607 | } | ||
| 3608 | |||
| 3609 | //*********** TTY SECTION **************** | ||
| 3610 | |||
| 3611 | static void wanpipe_tty_trigger_tx_irq(sdla_t *card) | ||
| 3612 | { | ||
| 3613 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 3614 | INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct; | ||
| 3615 | chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME; | ||
| 3616 | } | ||
| 3617 | |||
| 3618 | static void wanpipe_tty_trigger_poll(sdla_t *card) | ||
| 3619 | { | ||
| 3620 | schedule_work(&card->tty_work); | ||
| 3621 | } | ||
| 3622 | |||
| 3623 | static void tty_poll_work (void* data) | ||
| 3624 | { | ||
| 3625 | sdla_t *card = (sdla_t*)data; | ||
| 3626 | struct tty_struct *tty; | ||
| 3627 | |||
| 3628 | if ((tty=card->tty)==NULL) | ||
| 3629 | return; | ||
| 3630 | |||
| 3631 | tty_wakeup(tty); | ||
| 3632 | #if defined(SERIAL_HAVE_POLL_WAIT) | ||
| 3633 | wake_up_interruptible(&tty->poll_wait); | ||
| 3634 | #endif | ||
| 3635 | return; | ||
| 3636 | } | ||
| 3637 | |||
| 3638 | static void wanpipe_tty_close(struct tty_struct *tty, struct file * filp) | ||
| 3639 | { | ||
| 3640 | sdla_t *card; | ||
| 3641 | unsigned long smp_flags; | ||
| 3642 | |||
| 3643 | if (!tty || !tty->driver_data){ | ||
| 3644 | return; | ||
| 3645 | } | ||
| 3646 | |||
| 3647 | card = (sdla_t*)tty->driver_data; | ||
| 3648 | |||
| 3649 | if (!card) | ||
| 3650 | return; | ||
| 3651 | |||
| 3652 | printk(KERN_INFO "%s: Closing TTY Driver!\n", | ||
| 3653 | card->devname); | ||
| 3654 | |||
| 3655 | /* Sanity Check */ | ||
| 3656 | if (!card->tty_open) | ||
| 3657 | return; | ||
| 3658 | |||
| 3659 | wanpipe_close(card); | ||
| 3660 | if (--card->tty_open == 0){ | ||
| 3661 | |||
| 3662 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3663 | card->tty=NULL; | ||
| 3664 | chdlc_disable_comm_shutdown(card); | ||
| 3665 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3666 | |||
| 3667 | kfree(card->tty_buf); | ||
| 3668 | card->tty_buf = NULL; | ||
| 3669 | kfree(card->tty_rx); | ||
| 3670 | card->tty_rx = NULL; | ||
| 3671 | } | ||
| 3672 | return; | ||
| 3673 | } | ||
| 3674 | static int wanpipe_tty_open(struct tty_struct *tty, struct file * filp) | ||
| 3675 | { | ||
| 3676 | unsigned long smp_flags; | ||
| 3677 | sdla_t *card; | ||
| 3678 | |||
| 3679 | if (!tty){ | ||
| 3680 | return -ENODEV; | ||
| 3681 | } | ||
| 3682 | |||
| 3683 | if (!tty->driver_data){ | ||
| 3684 | int port; | ||
| 3685 | port = tty->index; | ||
| 3686 | if ((port < 0) || (port >= NR_PORTS)) | ||
| 3687 | return -ENODEV; | ||
| 3688 | |||
| 3689 | tty->driver_data = WAN_CARD(port); | ||
| 3690 | if (!tty->driver_data) | ||
| 3691 | return -ENODEV; | ||
| 3692 | } | ||
| 3693 | |||
| 3694 | card = (sdla_t*)tty->driver_data; | ||
| 3695 | |||
| 3696 | if (!card){ | ||
| 3697 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3698 | card->tty=NULL; | ||
| 3699 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3700 | return -ENODEV; | ||
| 3701 | } | ||
| 3702 | |||
| 3703 | printk(KERN_INFO "%s: Opening TTY Driver!\n", | ||
| 3704 | card->devname); | ||
| 3705 | |||
| 3706 | if (card->tty_open == 0){ | ||
| 3707 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3708 | card->tty=tty; | ||
| 3709 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 3710 | |||
| 3711 | if (!card->tty_buf){ | ||
| 3712 | card->tty_buf = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL); | ||
| 3713 | if (!card->tty_buf){ | ||
| 3714 | card->tty_buf=NULL; | ||
| 3715 | card->tty=NULL; | ||
| 3716 | return -ENOMEM; | ||
| 3717 | } | ||
| 3718 | } | ||
| 3719 | |||
| 3720 | if (!card->tty_rx){ | ||
| 3721 | card->tty_rx = kmalloc(TTY_CHDLC_MAX_MTU, GFP_KERNEL); | ||
| 3722 | if (!card->tty_rx){ | ||
| 3723 | /* Free the buffer above */ | ||
| 3724 | kfree(card->tty_buf); | ||
| 3725 | card->tty_buf=NULL; | ||
| 3726 | card->tty=NULL; | ||
| 3727 | return -ENOMEM; | ||
| 3728 | } | ||
| 3729 | } | ||
| 3730 | } | ||
| 3731 | |||
| 3732 | ++card->tty_open; | ||
| 3733 | wanpipe_open(card); | ||
| 3734 | return 0; | ||
| 3735 | } | ||
| 3736 | |||
| 3737 | static int wanpipe_tty_write(struct tty_struct * tty, const unsigned char *buf, int count) | ||
| 3738 | { | ||
| 3739 | unsigned long smp_flags=0; | ||
| 3740 | sdla_t *card=NULL; | ||
| 3741 | |||
| 3742 | if (!tty){ | ||
| 3743 | dbg_printk(KERN_INFO "NO TTY in Write\n"); | ||
| 3744 | return -ENODEV; | ||
| 3745 | } | ||
| 3746 | |||
| 3747 | card = (sdla_t *)tty->driver_data; | ||
| 3748 | |||
| 3749 | if (!card){ | ||
| 3750 | dbg_printk(KERN_INFO "No Card in TTY Write\n"); | ||
| 3751 | return -ENODEV; | ||
| 3752 | } | ||
| 3753 | |||
| 3754 | if (count > card->wandev.mtu){ | ||
| 3755 | dbg_printk(KERN_INFO "Frame too big in Write %i Max: %i\n", | ||
| 3756 | count,card->wandev.mtu); | ||
| 3757 | return -EINVAL; | ||
| 3758 | } | ||
| 3759 | |||
| 3760 | if (card->wandev.state != WAN_CONNECTED){ | ||
| 3761 | dbg_printk(KERN_INFO "Card not connected in TTY Write\n"); | ||
| 3762 | return -EINVAL; | ||
| 3763 | } | ||
| 3764 | |||
| 3765 | /* Lock the 508 Card: SMP is supported */ | ||
| 3766 | if(card->hw.type != SDLA_S514){ | ||
| 3767 | s508_lock(card,&smp_flags); | ||
| 3768 | } | ||
| 3769 | |||
| 3770 | if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){ | ||
| 3771 | printk(KERN_INFO "%s: Critical in TTY Write\n", | ||
| 3772 | card->devname); | ||
| 3773 | |||
| 3774 | /* Lock the 508 Card: SMP is supported */ | ||
| 3775 | if(card->hw.type != SDLA_S514) | ||
| 3776 | s508_unlock(card,&smp_flags); | ||
| 3777 | |||
| 3778 | return -EINVAL; | ||
| 3779 | } | ||
| 3780 | |||
| 3781 | if (chdlc_send(card,(void*)buf,count)){ | ||
| 3782 | dbg_printk(KERN_INFO "%s: Failed to send, retry later: kernel!\n", | ||
| 3783 | card->devname); | ||
| 3784 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 3785 | |||
| 3786 | wanpipe_tty_trigger_tx_irq(card); | ||
| 3787 | |||
| 3788 | if(card->hw.type != SDLA_S514) | ||
| 3789 | s508_unlock(card,&smp_flags); | ||
| 3790 | return 0; | ||
| 3791 | } | ||
| 3792 | dbg_printk(KERN_INFO "%s: Packet sent OK: %i\n",card->devname,count); | ||
| 3793 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 3794 | |||
| 3795 | if(card->hw.type != SDLA_S514) | ||
| 3796 | s508_unlock(card,&smp_flags); | ||
| 3797 | |||
| 3798 | return count; | ||
| 3799 | } | ||
| 3800 | |||
| 3801 | static void wanpipe_tty_receive(sdla_t *card, unsigned addr, unsigned int len) | ||
| 3802 | { | ||
| 3803 | unsigned offset=0; | ||
| 3804 | unsigned olen=len; | ||
| 3805 | char fp=0; | ||
| 3806 | struct tty_struct *tty; | ||
| 3807 | int i; | ||
| 3808 | struct tty_ldisc *ld; | ||
| 3809 | |||
| 3810 | if (!card->tty_open){ | ||
| 3811 | dbg_printk(KERN_INFO "%s: TTY not open during receive\n", | ||
| 3812 | card->devname); | ||
| 3813 | return; | ||
| 3814 | } | ||
| 3815 | |||
| 3816 | if ((tty=card->tty) == NULL){ | ||
| 3817 | dbg_printk(KERN_INFO "%s: No TTY on receive\n", | ||
| 3818 | card->devname); | ||
| 3819 | return; | ||
| 3820 | } | ||
| 3821 | |||
| 3822 | if (!tty->driver_data){ | ||
| 3823 | dbg_printk(KERN_INFO "%s: No Driver Data, or Flip on receive\n", | ||
| 3824 | card->devname); | ||
| 3825 | return; | ||
| 3826 | } | ||
| 3827 | |||
| 3828 | |||
| 3829 | if (card->u.c.async_mode){ | ||
| 3830 | if ((tty->flip.count+len) >= TTY_FLIPBUF_SIZE){ | ||
| 3831 | if (net_ratelimit()){ | ||
| 3832 | printk(KERN_INFO | ||
| 3833 | "%s: Received packet size too big: %i bytes, Max: %i!\n", | ||
| 3834 | card->devname,len,TTY_FLIPBUF_SIZE); | ||
| 3835 | } | ||
| 3836 | return; | ||
| 3837 | } | ||
| 3838 | |||
| 3839 | |||
| 3840 | if((addr + len) > card->u.c.rx_top + 1) { | ||
| 3841 | offset = card->u.c.rx_top - addr + 1; | ||
| 3842 | |||
| 3843 | sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, offset); | ||
| 3844 | |||
| 3845 | addr = card->u.c.rx_base; | ||
| 3846 | len -= offset; | ||
| 3847 | |||
| 3848 | tty->flip.char_buf_ptr+=offset; | ||
| 3849 | tty->flip.count+=offset; | ||
| 3850 | for (i=0;i<offset;i++){ | ||
| 3851 | *tty->flip.flag_buf_ptr = 0; | ||
| 3852 | tty->flip.flag_buf_ptr++; | ||
| 3853 | } | ||
| 3854 | } | ||
| 3855 | |||
| 3856 | sdla_peek(&card->hw, addr, tty->flip.char_buf_ptr, len); | ||
| 3857 | |||
| 3858 | tty->flip.char_buf_ptr+=len; | ||
| 3859 | card->tty->flip.count+=len; | ||
| 3860 | for (i=0;i<len;i++){ | ||
| 3861 | *tty->flip.flag_buf_ptr = 0; | ||
| 3862 | tty->flip.flag_buf_ptr++; | ||
| 3863 | } | ||
| 3864 | |||
| 3865 | tty->low_latency=1; | ||
| 3866 | tty_flip_buffer_push(tty); | ||
| 3867 | }else{ | ||
| 3868 | if (!card->tty_rx){ | ||
| 3869 | if (net_ratelimit()){ | ||
| 3870 | printk(KERN_INFO | ||
| 3871 | "%s: Receive sync buffer not available!\n", | ||
| 3872 | card->devname); | ||
| 3873 | } | ||
| 3874 | return; | ||
| 3875 | } | ||
| 3876 | |||
| 3877 | if (len > TTY_CHDLC_MAX_MTU){ | ||
| 3878 | if (net_ratelimit()){ | ||
| 3879 | printk(KERN_INFO | ||
| 3880 | "%s: Received packet size too big: %i bytes, Max: %i!\n", | ||
| 3881 | card->devname,len,TTY_FLIPBUF_SIZE); | ||
| 3882 | } | ||
| 3883 | return; | ||
| 3884 | } | ||
| 3885 | |||
| 3886 | |||
| 3887 | if((addr + len) > card->u.c.rx_top + 1) { | ||
| 3888 | offset = card->u.c.rx_top - addr + 1; | ||
| 3889 | |||
| 3890 | sdla_peek(&card->hw, addr, card->tty_rx, offset); | ||
| 3891 | |||
| 3892 | addr = card->u.c.rx_base; | ||
| 3893 | len -= offset; | ||
| 3894 | } | ||
| 3895 | sdla_peek(&card->hw, addr, card->tty_rx+offset, len); | ||
| 3896 | ld = tty_ldisc_ref(tty); | ||
| 3897 | if (ld) { | ||
| 3898 | if (ld->receive_buf) | ||
| 3899 | ld->receive_buf(tty,card->tty_rx,&fp,olen); | ||
| 3900 | tty_ldisc_deref(ld); | ||
| 3901 | }else{ | ||
| 3902 | if (net_ratelimit()){ | ||
| 3903 | printk(KERN_INFO | ||
| 3904 | "%s: NO TTY Sync line discipline!\n", | ||
| 3905 | card->devname); | ||
| 3906 | } | ||
| 3907 | } | ||
| 3908 | } | ||
| 3909 | |||
| 3910 | dbg_printk(KERN_INFO "%s: Received Data %i\n",card->devname,olen); | ||
| 3911 | return; | ||
| 3912 | } | ||
| 3913 | |||
| 3914 | #if 0 | ||
| 3915 | static int wanpipe_tty_ioctl(struct tty_struct *tty, struct file * file, | ||
| 3916 | unsigned int cmd, unsigned long arg) | ||
| 3917 | { | ||
| 3918 | return -ENOIOCTLCMD; | ||
| 3919 | } | ||
| 3920 | #endif | ||
| 3921 | |||
| 3922 | static void wanpipe_tty_stop(struct tty_struct *tty) | ||
| 3923 | { | ||
| 3924 | return; | ||
| 3925 | } | ||
| 3926 | |||
| 3927 | static void wanpipe_tty_start(struct tty_struct *tty) | ||
| 3928 | { | ||
| 3929 | return; | ||
| 3930 | } | ||
| 3931 | |||
| 3932 | static int config_tty (sdla_t *card) | ||
| 3933 | { | ||
| 3934 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 3935 | |||
| 3936 | /* Setup the Board for asynchronous mode */ | ||
| 3937 | if (card->u.c.async_mode){ | ||
| 3938 | |||
| 3939 | if (set_asy_config(card)) { | ||
| 3940 | printk (KERN_INFO "%s: Failed CHDLC Async configuration!\n", | ||
| 3941 | card->devname); | ||
| 3942 | return -EINVAL; | ||
| 3943 | } | ||
| 3944 | }else{ | ||
| 3945 | /* Setup the Board for CHDLC */ | ||
| 3946 | if (set_chdlc_config(card)) { | ||
| 3947 | printk (KERN_INFO "%s: Failed CHDLC configuration!\n", | ||
| 3948 | card->devname); | ||
| 3949 | return -EINVAL; | ||
| 3950 | } | ||
| 3951 | } | ||
| 3952 | |||
| 3953 | /* Set interrupt mode and mask */ | ||
| 3954 | if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME | | ||
| 3955 | APP_INT_ON_GLOBAL_EXCEP_COND | | ||
| 3956 | APP_INT_ON_TX_FRAME | | ||
| 3957 | APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){ | ||
| 3958 | printk (KERN_INFO "%s: Failed to set interrupt triggers!\n", | ||
| 3959 | card->devname); | ||
| 3960 | return -EINVAL; | ||
| 3961 | } | ||
| 3962 | |||
| 3963 | |||
| 3964 | /* Mask the Transmit and Timer interrupt */ | ||
| 3965 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 3966 | ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER); | ||
| 3967 | |||
| 3968 | |||
| 3969 | /* Enable communications */ | ||
| 3970 | if (card->u.c.async_mode){ | ||
| 3971 | if (asy_comm_enable(card) != 0) { | ||
| 3972 | printk(KERN_INFO "%s: Failed to enable async commnunication!\n", | ||
| 3973 | card->devname); | ||
| 3974 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 3975 | card->u.c.comm_enabled=0; | ||
| 3976 | chdlc_set_intr_mode(card,0); | ||
| 3977 | return -EINVAL; | ||
| 3978 | } | ||
| 3979 | }else{ | ||
| 3980 | if (chdlc_comm_enable(card) != 0) { | ||
| 3981 | printk(KERN_INFO "%s: Failed to enable chdlc communications!\n", | ||
| 3982 | card->devname); | ||
| 3983 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 3984 | card->u.c.comm_enabled=0; | ||
| 3985 | chdlc_set_intr_mode(card,0); | ||
| 3986 | return -EINVAL; | ||
| 3987 | } | ||
| 3988 | } | ||
| 3989 | |||
| 3990 | /* Initialize Rx/Tx buffer control fields */ | ||
| 3991 | init_chdlc_tx_rx_buff(card); | ||
| 3992 | port_set_state(card, WAN_CONNECTING); | ||
| 3993 | return 0; | ||
| 3994 | } | ||
| 3995 | |||
| 3996 | |||
| 3997 | static int change_speed(sdla_t *card, struct tty_struct *tty, | ||
| 3998 | struct termios *old_termios) | ||
| 3999 | { | ||
| 4000 | int baud, ret=0; | ||
| 4001 | unsigned cflag; | ||
| 4002 | int dbits,sbits,parity,handshaking; | ||
| 4003 | |||
| 4004 | cflag = tty->termios->c_cflag; | ||
| 4005 | |||
| 4006 | /* There is always one stop bit */ | ||
| 4007 | sbits=WANOPT_ONE; | ||
| 4008 | |||
| 4009 | /* Parity is defaulted to NONE */ | ||
| 4010 | parity = WANOPT_NONE; | ||
| 4011 | |||
| 4012 | handshaking=0; | ||
| 4013 | |||
| 4014 | /* byte size and parity */ | ||
| 4015 | switch (cflag & CSIZE) { | ||
| 4016 | case CS5: dbits = 5; break; | ||
| 4017 | case CS6: dbits = 6; break; | ||
| 4018 | case CS7: dbits = 7; break; | ||
| 4019 | case CS8: dbits = 8; break; | ||
| 4020 | /* Never happens, but GCC is too dumb to figure it out */ | ||
| 4021 | default: dbits = 8; break; | ||
| 4022 | } | ||
| 4023 | |||
| 4024 | /* One more stop bit should be supported, thus increment | ||
| 4025 | * the number of stop bits Max=2 */ | ||
| 4026 | if (cflag & CSTOPB) { | ||
| 4027 | sbits = WANOPT_TWO; | ||
| 4028 | } | ||
| 4029 | if (cflag & PARENB) { | ||
| 4030 | parity = WANOPT_EVEN; | ||
| 4031 | } | ||
| 4032 | if (cflag & PARODD){ | ||
| 4033 | parity = WANOPT_ODD; | ||
| 4034 | } | ||
| 4035 | |||
| 4036 | /* Determine divisor based on baud rate */ | ||
| 4037 | baud = tty_get_baud_rate(tty); | ||
| 4038 | |||
| 4039 | if (!baud) | ||
| 4040 | baud = 9600; /* B0 transition handled in rs_set_termios */ | ||
| 4041 | |||
| 4042 | if (cflag & CRTSCTS) { | ||
| 4043 | handshaking|=ASY_RTS_HS_FOR_RX; | ||
| 4044 | } | ||
| 4045 | |||
| 4046 | if (I_IGNPAR(tty)) | ||
| 4047 | parity = WANOPT_NONE; | ||
| 4048 | |||
| 4049 | if (I_IXOFF(tty)){ | ||
| 4050 | handshaking|=ASY_XON_XOFF_HS_FOR_RX; | ||
| 4051 | handshaking|=ASY_XON_XOFF_HS_FOR_TX; | ||
| 4052 | } | ||
| 4053 | |||
| 4054 | if (I_IXON(tty)){ | ||
| 4055 | handshaking|=ASY_XON_XOFF_HS_FOR_RX; | ||
| 4056 | handshaking|=ASY_XON_XOFF_HS_FOR_TX; | ||
| 4057 | } | ||
| 4058 | |||
| 4059 | if (card->u.c.async_mode){ | ||
| 4060 | if (card->wandev.bps != baud) | ||
| 4061 | ret=1; | ||
| 4062 | card->wandev.bps = baud; | ||
| 4063 | } | ||
| 4064 | |||
| 4065 | if (card->u.c.async_mode){ | ||
| 4066 | if (card->u.c.protocol_options != handshaking) | ||
| 4067 | ret=1; | ||
| 4068 | card->u.c.protocol_options = handshaking; | ||
| 4069 | |||
| 4070 | if (card->u.c.tx_bits_per_char != dbits) | ||
| 4071 | ret=1; | ||
| 4072 | card->u.c.tx_bits_per_char = dbits; | ||
| 4073 | |||
| 4074 | if (card->u.c.rx_bits_per_char != dbits) | ||
| 4075 | ret=1; | ||
| 4076 | card->u.c.rx_bits_per_char = dbits; | ||
| 4077 | |||
| 4078 | if (card->u.c.stop_bits != sbits) | ||
| 4079 | ret=1; | ||
| 4080 | card->u.c.stop_bits = sbits; | ||
| 4081 | |||
| 4082 | if (card->u.c.parity != parity) | ||
| 4083 | ret=1; | ||
| 4084 | card->u.c.parity = parity; | ||
| 4085 | |||
| 4086 | card->u.c.break_timer = 50; | ||
| 4087 | card->u.c.inter_char_timer = 10; | ||
| 4088 | card->u.c.rx_complete_length = 100; | ||
| 4089 | card->u.c.xon_char = 0xFE; | ||
| 4090 | }else{ | ||
| 4091 | card->u.c.protocol_options = HDLC_STREAMING_MODE; | ||
| 4092 | } | ||
| 4093 | |||
| 4094 | return ret; | ||
| 4095 | } | ||
| 4096 | |||
| 4097 | |||
| 4098 | static void wanpipe_tty_set_termios(struct tty_struct *tty, struct termios *old_termios) | ||
| 4099 | { | ||
| 4100 | sdla_t *card; | ||
| 4101 | int err=1; | ||
| 4102 | |||
| 4103 | if (!tty){ | ||
| 4104 | return; | ||
| 4105 | } | ||
| 4106 | |||
| 4107 | card = (sdla_t *)tty->driver_data; | ||
| 4108 | |||
| 4109 | if (!card) | ||
| 4110 | return; | ||
| 4111 | |||
| 4112 | if (change_speed(card, tty, old_termios) || !card->u.c.comm_enabled){ | ||
| 4113 | unsigned long smp_flags; | ||
| 4114 | |||
| 4115 | if (card->u.c.comm_enabled){ | ||
| 4116 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4117 | chdlc_disable_comm_shutdown(card); | ||
| 4118 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4119 | } | ||
| 4120 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4121 | err = config_tty(card); | ||
| 4122 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4123 | if (card->u.c.async_mode){ | ||
| 4124 | printk(KERN_INFO "%s: TTY Async Configuration:\n" | ||
| 4125 | " Baud =%i\n" | ||
| 4126 | " Handshaking =%s\n" | ||
| 4127 | " Tx Dbits =%i\n" | ||
| 4128 | " Rx Dbits =%i\n" | ||
| 4129 | " Parity =%s\n" | ||
| 4130 | " Stop Bits =%i\n", | ||
| 4131 | card->devname, | ||
| 4132 | card->wandev.bps, | ||
| 4133 | opt_decode[card->u.c.protocol_options], | ||
| 4134 | card->u.c.tx_bits_per_char, | ||
| 4135 | card->u.c.rx_bits_per_char, | ||
| 4136 | p_decode[card->u.c.parity] , | ||
| 4137 | card->u.c.stop_bits); | ||
| 4138 | }else{ | ||
| 4139 | printk(KERN_INFO "%s: TTY Sync Configuration:\n" | ||
| 4140 | " Baud =%i\n" | ||
| 4141 | " Protocol =HDLC_STREAMING\n", | ||
| 4142 | card->devname,card->wandev.bps); | ||
| 4143 | } | ||
| 4144 | if (!err){ | ||
| 4145 | port_set_state(card,WAN_CONNECTED); | ||
| 4146 | }else{ | ||
| 4147 | port_set_state(card,WAN_DISCONNECTED); | ||
| 4148 | } | ||
| 4149 | } | ||
| 4150 | return; | ||
| 4151 | } | ||
| 4152 | |||
| 4153 | static void wanpipe_tty_put_char(struct tty_struct *tty, unsigned char ch) | ||
| 4154 | { | ||
| 4155 | sdla_t *card; | ||
| 4156 | unsigned long smp_flags=0; | ||
| 4157 | |||
| 4158 | if (!tty){ | ||
| 4159 | return; | ||
| 4160 | } | ||
| 4161 | |||
| 4162 | card = (sdla_t *)tty->driver_data; | ||
| 4163 | |||
| 4164 | if (!card) | ||
| 4165 | return; | ||
| 4166 | |||
| 4167 | if (card->wandev.state != WAN_CONNECTED) | ||
| 4168 | return; | ||
| 4169 | |||
| 4170 | if(card->hw.type != SDLA_S514) | ||
| 4171 | s508_lock(card,&smp_flags); | ||
| 4172 | |||
| 4173 | if (test_and_set_bit(SEND_CRIT,(void*)&card->wandev.critical)){ | ||
| 4174 | |||
| 4175 | wanpipe_tty_trigger_tx_irq(card); | ||
| 4176 | |||
| 4177 | if(card->hw.type != SDLA_S514) | ||
| 4178 | s508_unlock(card,&smp_flags); | ||
| 4179 | return; | ||
| 4180 | } | ||
| 4181 | |||
| 4182 | if (chdlc_send(card,(void*)&ch,1)){ | ||
| 4183 | wanpipe_tty_trigger_tx_irq(card); | ||
| 4184 | dbg_printk("%s: Failed to TX char!\n",card->devname); | ||
| 4185 | } | ||
| 4186 | |||
| 4187 | dbg_printk("%s: Char TX OK\n",card->devname); | ||
| 4188 | |||
| 4189 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 4190 | |||
| 4191 | if(card->hw.type != SDLA_S514) | ||
| 4192 | s508_unlock(card,&smp_flags); | ||
| 4193 | |||
| 4194 | return; | ||
| 4195 | } | ||
| 4196 | |||
| 4197 | static void wanpipe_tty_flush_chars(struct tty_struct *tty) | ||
| 4198 | { | ||
| 4199 | return; | ||
| 4200 | } | ||
| 4201 | |||
| 4202 | static void wanpipe_tty_flush_buffer(struct tty_struct *tty) | ||
| 4203 | { | ||
| 4204 | if (!tty) | ||
| 4205 | return; | ||
| 4206 | |||
| 4207 | #if defined(SERIAL_HAVE_POLL_WAIT) | ||
| 4208 | wake_up_interruptible(&tty->poll_wait); | ||
| 4209 | #endif | ||
| 4210 | tty_wakeup(tty); | ||
| 4211 | return; | ||
| 4212 | } | ||
| 4213 | |||
| 4214 | /* | ||
| 4215 | * This function is used to send a high-priority XON/XOFF character to | ||
| 4216 | * the device | ||
| 4217 | */ | ||
| 4218 | static void wanpipe_tty_send_xchar(struct tty_struct *tty, char ch) | ||
| 4219 | { | ||
| 4220 | return; | ||
| 4221 | } | ||
| 4222 | |||
| 4223 | |||
| 4224 | static int wanpipe_tty_chars_in_buffer(struct tty_struct *tty) | ||
| 4225 | { | ||
| 4226 | return 0; | ||
| 4227 | } | ||
| 4228 | |||
| 4229 | |||
| 4230 | static int wanpipe_tty_write_room(struct tty_struct *tty) | ||
| 4231 | { | ||
| 4232 | sdla_t *card; | ||
| 4233 | |||
| 4234 | printk(KERN_INFO "TTY Write Room\n"); | ||
| 4235 | |||
| 4236 | if (!tty){ | ||
| 4237 | return 0; | ||
| 4238 | } | ||
| 4239 | |||
| 4240 | card = (sdla_t *)tty->driver_data; | ||
| 4241 | if (!card) | ||
| 4242 | return 0; | ||
| 4243 | |||
| 4244 | if (card->wandev.state != WAN_CONNECTED) | ||
| 4245 | return 0; | ||
| 4246 | |||
| 4247 | return SEC_MAX_NO_DATA_BYTES_IN_FRAME; | ||
| 4248 | } | ||
| 4249 | |||
| 4250 | |||
| 4251 | static int set_modem_status(sdla_t *card, unsigned char data) | ||
| 4252 | { | ||
| 4253 | CHDLC_MAILBOX_STRUCT *mb = card->mbox; | ||
| 4254 | int err; | ||
| 4255 | |||
| 4256 | mb->buffer_length=1; | ||
| 4257 | mb->command=SET_MODEM_STATUS; | ||
| 4258 | mb->data[0]=data; | ||
| 4259 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 4260 | if (err != COMMAND_OK) | ||
| 4261 | chdlc_error (card, err, mb); | ||
| 4262 | |||
| 4263 | return err; | ||
| 4264 | } | ||
| 4265 | |||
| 4266 | static void wanpipe_tty_hangup(struct tty_struct *tty) | ||
| 4267 | { | ||
| 4268 | sdla_t *card; | ||
| 4269 | unsigned long smp_flags; | ||
| 4270 | |||
| 4271 | printk(KERN_INFO "TTY Hangup!\n"); | ||
| 4272 | |||
| 4273 | if (!tty){ | ||
| 4274 | return; | ||
| 4275 | } | ||
| 4276 | |||
| 4277 | card = (sdla_t *)tty->driver_data; | ||
| 4278 | if (!card) | ||
| 4279 | return; | ||
| 4280 | |||
| 4281 | lock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4282 | set_modem_status(card,0); | ||
| 4283 | unlock_adapter_irq(&card->wandev.lock,&smp_flags); | ||
| 4284 | return; | ||
| 4285 | } | ||
| 4286 | |||
| 4287 | static void wanpipe_tty_break(struct tty_struct *tty, int break_state) | ||
| 4288 | { | ||
| 4289 | return; | ||
| 4290 | } | ||
| 4291 | |||
| 4292 | static void wanpipe_tty_wait_until_sent(struct tty_struct *tty, int timeout) | ||
| 4293 | { | ||
| 4294 | return; | ||
| 4295 | } | ||
| 4296 | |||
| 4297 | static void wanpipe_tty_throttle(struct tty_struct * tty) | ||
| 4298 | { | ||
| 4299 | return; | ||
| 4300 | } | ||
| 4301 | |||
| 4302 | static void wanpipe_tty_unthrottle(struct tty_struct * tty) | ||
| 4303 | { | ||
| 4304 | return; | ||
| 4305 | } | ||
| 4306 | |||
| 4307 | int wanpipe_tty_read_proc(char *page, char **start, off_t off, int count, | ||
| 4308 | int *eof, void *data) | ||
| 4309 | { | ||
| 4310 | return 0; | ||
| 4311 | } | ||
| 4312 | |||
| 4313 | /* | ||
| 4314 | * The serial driver boot-time initialization code! | ||
| 4315 | */ | ||
| 4316 | int wanpipe_tty_init(sdla_t *card) | ||
| 4317 | { | ||
| 4318 | struct serial_state * state; | ||
| 4319 | |||
| 4320 | /* Initialize the tty_driver structure */ | ||
| 4321 | |||
| 4322 | if (card->tty_minor < 0 || card->tty_minor > NR_PORTS){ | ||
| 4323 | printk(KERN_INFO "%s: Illegal Minor TTY number (0-4): %i\n", | ||
| 4324 | card->devname,card->tty_minor); | ||
| 4325 | return -EINVAL; | ||
| 4326 | } | ||
| 4327 | |||
| 4328 | if (WAN_CARD(card->tty_minor)){ | ||
| 4329 | printk(KERN_INFO "%s: TTY Minor %i, already in use\n", | ||
| 4330 | card->devname,card->tty_minor); | ||
| 4331 | return -EBUSY; | ||
| 4332 | } | ||
| 4333 | |||
| 4334 | if (tty_init_cnt==0){ | ||
| 4335 | |||
| 4336 | printk(KERN_INFO "%s: TTY %s Driver Init: Major %i, Minor Range %i-%i\n", | ||
| 4337 | card->devname, | ||
| 4338 | card->u.c.async_mode ? "ASYNC" : "SYNC", | ||
| 4339 | WAN_TTY_MAJOR,MIN_PORT,MAX_PORT); | ||
| 4340 | |||
| 4341 | tty_driver_mode = card->u.c.async_mode; | ||
| 4342 | |||
| 4343 | memset(&serial_driver, 0, sizeof(struct tty_driver)); | ||
| 4344 | serial_driver.magic = TTY_DRIVER_MAGIC; | ||
| 4345 | serial_driver.owner = THIS_MODULE; | ||
| 4346 | serial_driver.driver_name = "wanpipe_tty"; | ||
| 4347 | serial_driver.name = "ttyW"; | ||
| 4348 | serial_driver.major = WAN_TTY_MAJOR; | ||
| 4349 | serial_driver.minor_start = WAN_TTY_MINOR; | ||
| 4350 | serial_driver.num = NR_PORTS; | ||
| 4351 | serial_driver.type = TTY_DRIVER_TYPE_SERIAL; | ||
| 4352 | serial_driver.subtype = SERIAL_TYPE_NORMAL; | ||
| 4353 | |||
| 4354 | serial_driver.init_termios = tty_std_termios; | ||
| 4355 | serial_driver.init_termios.c_cflag = | ||
| 4356 | B9600 | CS8 | CREAD | HUPCL | CLOCAL; | ||
| 4357 | serial_driver.flags = TTY_DRIVER_REAL_RAW; | ||
| 4358 | |||
| 4359 | serial_driver.refcount = 1; /* !@!@^#^&!! */ | ||
| 4360 | |||
| 4361 | serial_driver.open = wanpipe_tty_open; | ||
| 4362 | serial_driver.close = wanpipe_tty_close; | ||
| 4363 | serial_driver.write = wanpipe_tty_write; | ||
| 4364 | |||
| 4365 | serial_driver.put_char = wanpipe_tty_put_char; | ||
| 4366 | serial_driver.flush_chars = wanpipe_tty_flush_chars; | ||
| 4367 | serial_driver.write_room = wanpipe_tty_write_room; | ||
| 4368 | serial_driver.chars_in_buffer = wanpipe_tty_chars_in_buffer; | ||
| 4369 | serial_driver.flush_buffer = wanpipe_tty_flush_buffer; | ||
| 4370 | //serial_driver.ioctl = wanpipe_tty_ioctl; | ||
| 4371 | serial_driver.throttle = wanpipe_tty_throttle; | ||
| 4372 | serial_driver.unthrottle = wanpipe_tty_unthrottle; | ||
| 4373 | serial_driver.send_xchar = wanpipe_tty_send_xchar; | ||
| 4374 | serial_driver.set_termios = wanpipe_tty_set_termios; | ||
| 4375 | serial_driver.stop = wanpipe_tty_stop; | ||
| 4376 | serial_driver.start = wanpipe_tty_start; | ||
| 4377 | serial_driver.hangup = wanpipe_tty_hangup; | ||
| 4378 | serial_driver.break_ctl = wanpipe_tty_break; | ||
| 4379 | serial_driver.wait_until_sent = wanpipe_tty_wait_until_sent; | ||
| 4380 | serial_driver.read_proc = wanpipe_tty_read_proc; | ||
| 4381 | |||
| 4382 | if (tty_register_driver(&serial_driver)){ | ||
| 4383 | printk(KERN_INFO "%s: Failed to register serial driver!\n", | ||
| 4384 | card->devname); | ||
| 4385 | } | ||
| 4386 | } | ||
| 4387 | |||
| 4388 | |||
| 4389 | /* The subsequent ports must comply to the initial configuration */ | ||
| 4390 | if (tty_driver_mode != card->u.c.async_mode){ | ||
| 4391 | printk(KERN_INFO "%s: Error: TTY Driver operation mode mismatch!\n", | ||
| 4392 | card->devname); | ||
| 4393 | printk(KERN_INFO "%s: The TTY driver is configured for %s!\n", | ||
| 4394 | card->devname, tty_driver_mode ? "ASYNC" : "SYNC"); | ||
| 4395 | return -EINVAL; | ||
| 4396 | } | ||
| 4397 | |||
| 4398 | tty_init_cnt++; | ||
| 4399 | |||
| 4400 | printk(KERN_INFO "%s: Initializing TTY %s Driver Minor %i\n", | ||
| 4401 | card->devname, | ||
| 4402 | tty_driver_mode ? "ASYNC" : "SYNC", | ||
| 4403 | card->tty_minor); | ||
| 4404 | |||
| 4405 | tty_card_map[card->tty_minor] = card; | ||
| 4406 | state = &rs_table[card->tty_minor]; | ||
| 4407 | |||
| 4408 | state->magic = SSTATE_MAGIC; | ||
| 4409 | state->line = 0; | ||
| 4410 | state->type = PORT_UNKNOWN; | ||
| 4411 | state->custom_divisor = 0; | ||
| 4412 | state->close_delay = 5*HZ/10; | ||
| 4413 | state->closing_wait = 30*HZ; | ||
| 4414 | state->icount.cts = state->icount.dsr = | ||
| 4415 | state->icount.rng = state->icount.dcd = 0; | ||
| 4416 | state->icount.rx = state->icount.tx = 0; | ||
| 4417 | state->icount.frame = state->icount.parity = 0; | ||
| 4418 | state->icount.overrun = state->icount.brk = 0; | ||
| 4419 | state->irq = card->wandev.irq; | ||
| 4420 | |||
| 4421 | INIT_WORK(&card->tty_work, tty_poll_work, (void*)card); | ||
| 4422 | return 0; | ||
| 4423 | } | ||
| 4424 | |||
| 4425 | |||
| 4426 | MODULE_LICENSE("GPL"); | ||
| 4427 | |||
| 4428 | /****** End ****************************************************************/ | ||
diff --git a/drivers/net/wan/sdla_fr.c b/drivers/net/wan/sdla_fr.c deleted file mode 100644 index 7f1ce9d4333e..000000000000 --- a/drivers/net/wan/sdla_fr.c +++ /dev/null | |||
| @@ -1,5061 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdla_fr.c WANPIPE(tm) Multiprotocol WAN Link Driver. Frame relay module. | ||
| 3 | * | ||
| 4 | * Author(s): Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * Gideon Hack | ||
| 6 | * | ||
| 7 | * Copyright: (c) 1995-2001 Sangoma Technologies Inc. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * as published by the Free Software Foundation; either version | ||
| 12 | * 2 of the License, or (at your option) any later version. | ||
| 13 | * ============================================================================ | ||
| 14 | * Nov 23, 2000 Nenad Corbic o Added support for 2.4.X kernels | ||
| 15 | * Nov 15, 2000 David Rokavarg | ||
| 16 | * Nenad Corbic o Added frame relay bridging support. | ||
| 17 | * Original code from Mark Wells and Kristian Hoffmann has | ||
| 18 | * been integrated into the frame relay driver. | ||
| 19 | * Nov 13, 2000 Nenad Corbic o Added true interface type encoding option. | ||
| 20 | * Tcpdump doesn't support Frame Relay inteface | ||
| 21 | * types, to fix this true type option will set | ||
| 22 | * the interface type to RAW IP mode. | ||
| 23 | * Nov 07, 2000 Nenad Corbic o Added security features for UDP debugging: | ||
| 24 | * Deny all and specify allowed requests. | ||
| 25 | * Nov 06, 2000 Nenad Corbic o Wanpipe interfaces conform to raw packet interfaces. | ||
| 26 | * Moved the if_header into the if_send() routine. | ||
| 27 | * The if_header() was breaking the libpcap | ||
| 28 | * support. i.e. support for tcpdump, ethereal ... | ||
| 29 | * Oct 12. 2000 Nenad Corbic o Added error message in fr_configure | ||
| 30 | * Jul 31, 2000 Nenad Corbic o Fixed the Router UP Time. | ||
| 31 | * Apr 28, 2000 Nenad Corbic o Added the option to shutdown an interface | ||
| 32 | * when the channel gets disconnected. | ||
| 33 | * Apr 28, 2000 Nenad Corbic o Added M.Grants patch: disallow duplicate | ||
| 34 | * interface setups. | ||
| 35 | * Apr 25, 2000 Nenad Corbic o Added M.Grants patch: dynamically add/remove | ||
| 36 | * new dlcis/interfaces. | ||
| 37 | * Mar 23, 2000 Nenad Corbic o Improved task queue, bh handling. | ||
| 38 | * Mar 16, 2000 Nenad Corbic o Added Inverse ARP support | ||
| 39 | * Mar 13, 2000 Nenad Corbic o Added new socket API support. | ||
| 40 | * Mar 06, 2000 Nenad Corbic o Bug Fix: corrupted mbox recovery. | ||
| 41 | * Feb 24, 2000 Nenad Corbic o Fixed up FT1 UDP debugging problem. | ||
| 42 | * Dev 15, 1999 Nenad Corbic o Fixed up header files for 2.0.X kernels | ||
| 43 | * | ||
| 44 | * Nov 08, 1999 Nenad Corbic o Combined all debug UDP calls into one function | ||
| 45 | * o Removed the ARP support. This has to be done | ||
| 46 | * in the next version. | ||
| 47 | * o Only a Node can implement NO signalling. | ||
| 48 | * Initialize DLCI during if_open() if NO | ||
| 49 | * signalling. | ||
| 50 | * o Took out IPX support, implement in next | ||
| 51 | * version | ||
| 52 | * Sep 29, 1999 Nenad Corbic o Added SMP support and changed the update | ||
| 53 | * function to use timer interrupt. | ||
| 54 | * o Fixed the CIR bug: Set the value of BC | ||
| 55 | * to CIR when the CIR is enabled. | ||
| 56 | * o Updated comments, statistics and tracing. | ||
| 57 | * Jun 02, 1999 Gideon Hack o Updated for S514 support. | ||
| 58 | * Sep 18, 1998 Jaspreet Singh o Updated for 2.2.X kernels. | ||
| 59 | * Jul 31, 1998 Jaspreet Singh o Removed wpf_poll routine. The channel/DLCI | ||
| 60 | * status is received through an event interrupt. | ||
| 61 | * Jul 08, 1998 David Fong o Added inverse ARP support. | ||
| 62 | * Mar 26, 1997 Jaspreet Singh o Returning return codes for failed UDP cmds. | ||
| 63 | * Jan 28, 1997 Jaspreet Singh o Improved handling of inactive DLCIs. | ||
| 64 | * Dec 30, 1997 Jaspreet Singh o Replaced dev_tint() with mark_bh(NET_BH) | ||
| 65 | * Dec 16, 1997 Jaspreet Singh o Implemented Multiple IPX support. | ||
| 66 | * Nov 26, 1997 Jaspreet Singh o Improved load sharing with multiple boards | ||
| 67 | * o Added Cli() to protect enabling of interrupts | ||
| 68 | * while polling is called. | ||
| 69 | * Nov 24, 1997 Jaspreet Singh o Added counters to avoid enabling of interrupts | ||
| 70 | * when they have been disabled by another | ||
| 71 | * interface or routine (eg. wpf_poll). | ||
| 72 | * Nov 06, 1997 Jaspreet Singh o Added INTR_TEST_MODE to avoid polling | ||
| 73 | * routine disable interrupts during interrupt | ||
| 74 | * testing. | ||
| 75 | * Oct 20, 1997 Jaspreet Singh o Added hooks in for Router UP time. | ||
| 76 | * Oct 16, 1997 Jaspreet Singh o The critical flag is used to maintain flow | ||
| 77 | * control by avoiding RACE conditions. The | ||
| 78 | * cli() and restore_flags() are taken out. | ||
| 79 | * The fr_channel structure is appended for | ||
| 80 | * Driver Statistics. | ||
| 81 | * Oct 15, 1997 Farhan Thawar o updated if_send() and receive for IPX | ||
| 82 | * Aug 29, 1997 Farhan Thawar o Removed most of the cli() and sti() | ||
| 83 | * o Abstracted the UDP management stuff | ||
| 84 | * o Now use tbusy and critical more intelligently | ||
| 85 | * Jul 21, 1997 Jaspreet Singh o Can configure T391, T392, N391, N392 & N393 | ||
| 86 | * through router.conf. | ||
| 87 | * o Protected calls to sdla_peek() by adDing | ||
| 88 | * save_flags(), cli() and restore_flags(). | ||
| 89 | * o Added error message for Inactive DLCIs in | ||
| 90 | * fr_event() and update_chan_state(). | ||
| 91 | * o Fixed freeing up of buffers using kfree() | ||
| 92 | * when packets are received. | ||
| 93 | * Jul 07, 1997 Jaspreet Singh o Added configurable TTL for UDP packets | ||
| 94 | * o Added ability to discard multicast and | ||
| 95 | * broadcast source addressed packets | ||
| 96 | * Jun 27, 1997 Jaspreet Singh o Added FT1 monitor capabilities | ||
| 97 | * New case (0x44) statement in if_send routine | ||
| 98 | * Added a global variable rCount to keep track | ||
| 99 | * of FT1 status enabled on the board. | ||
| 100 | * May 29, 1997 Jaspreet Singh o Fixed major Flow Control Problem | ||
| 101 | * With multiple boards a problem was seen where | ||
| 102 | * the second board always stopped transmitting | ||
| 103 | * packet after running for a while. The code | ||
| 104 | * got into a stage where the interrupts were | ||
| 105 | * disabled and dev->tbusy was set to 1. | ||
| 106 | * This caused the If_send() routine to get into | ||
| 107 | * the if clause for it(0,dev->tbusy) | ||
| 108 | * forever. | ||
| 109 | * The code got into this stage due to an | ||
| 110 | * interrupt occurring within the if clause for | ||
| 111 | * set_bit(0,dev->tbusy). Since an interrupt | ||
| 112 | * disables furhter transmit interrupt and | ||
| 113 | * makes dev->tbusy = 0, this effect was undone | ||
| 114 | * by making dev->tbusy = 1 in the if clause. | ||
| 115 | * The Fix checks to see if Transmit interrupts | ||
| 116 | * are disabled then do not make dev->tbusy = 1 | ||
| 117 | * Introduced a global variable: int_occur and | ||
| 118 | * added tx_int_enabled in the wan_device | ||
| 119 | * structure. | ||
| 120 | * May 21, 1997 Jaspreet Singh o Fixed UDP Management for multiple | ||
| 121 | * boards. | ||
| 122 | * | ||
| 123 | * Apr 25, 1997 Farhan Thawar o added UDP Management stuff | ||
| 124 | * o fixed bug in if_send() and tx_intr() to | ||
| 125 | * sleep and wakeup all devices | ||
| 126 | * Mar 11, 1997 Farhan Thawar Version 3.1.1 | ||
| 127 | * o fixed (+1) bug in fr508_rx_intr() | ||
| 128 | * o changed if_send() to return 0 if | ||
| 129 | * wandev.critical() is true | ||
| 130 | * o free socket buffer in if_send() if | ||
| 131 | * returning 0 | ||
| 132 | * o added tx_intr() routine | ||
| 133 | * Jan 30, 1997 Gene Kozin Version 3.1.0 | ||
| 134 | * o implemented exec() entry point | ||
| 135 | * o fixed a bug causing driver configured as | ||
| 136 | * a FR switch to be stuck in WAN_ | ||
| 137 | * mode | ||
| 138 | * Jan 02, 1997 Gene Kozin Initial version. | ||
| 139 | *****************************************************************************/ | ||
| 140 | |||
| 141 | #include <linux/module.h> | ||
| 142 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 143 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 144 | #include <linux/errno.h> /* return codes */ | ||
| 145 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 146 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 147 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 148 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 149 | #include <linux/workqueue.h> | ||
| 150 | #include <linux/if_arp.h> /* ARPHRD_* defines */ | ||
| 151 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 152 | #include <asm/io.h> /* for inb(), outb(), etc. */ | ||
| 153 | #include <linux/time.h> /* for do_gettimeofday */ | ||
| 154 | #include <linux/in.h> /* sockaddr_in */ | ||
| 155 | #include <linux/jiffies.h> /* time_after() macro */ | ||
| 156 | #include <asm/errno.h> | ||
| 157 | |||
| 158 | #include <linux/ip.h> | ||
| 159 | #include <linux/if.h> | ||
| 160 | |||
| 161 | #include <linux/if_wanpipe_common.h> /* Wanpipe Socket */ | ||
| 162 | #include <linux/if_wanpipe.h> | ||
| 163 | |||
| 164 | #include <linux/sdla_fr.h> /* frame relay firmware API definitions */ | ||
| 165 | |||
| 166 | #include <asm/uaccess.h> | ||
| 167 | #include <linux/inetdevice.h> | ||
| 168 | #include <linux/netdevice.h> | ||
| 169 | |||
| 170 | #include <net/route.h> /* Dynamic Route Creation */ | ||
| 171 | #include <linux/etherdevice.h> /* eth_type_trans() used for bridging */ | ||
| 172 | #include <linux/random.h> | ||
| 173 | |||
| 174 | /****** Defines & Macros ****************************************************/ | ||
| 175 | |||
| 176 | #define MAX_CMD_RETRY 10 /* max number of firmware retries */ | ||
| 177 | |||
| 178 | #define FR_HEADER_LEN 8 /* max encapsulation header size */ | ||
| 179 | #define FR_CHANNEL_MTU 1500 /* unfragmented logical channel MTU */ | ||
| 180 | |||
| 181 | /* Q.922 frame types */ | ||
| 182 | #define Q922_UI 0x03 /* Unnumbered Info frame */ | ||
| 183 | #define Q922_XID 0xAF | ||
| 184 | |||
| 185 | /* DLCI configured or not */ | ||
| 186 | #define DLCI_NOT_CONFIGURED 0x00 | ||
| 187 | #define DLCI_CONFIG_PENDING 0x01 | ||
| 188 | #define DLCI_CONFIGURED 0x02 | ||
| 189 | |||
| 190 | /* CIR enabled or not */ | ||
| 191 | #define CIR_ENABLED 0x00 | ||
| 192 | #define CIR_DISABLED 0x01 | ||
| 193 | |||
| 194 | #define FRAME_RELAY_API 1 | ||
| 195 | #define MAX_BH_BUFF 10 | ||
| 196 | |||
| 197 | /* For handle_IPXWAN() */ | ||
| 198 | #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b))) | ||
| 199 | |||
| 200 | /****** Data Structures *****************************************************/ | ||
| 201 | |||
| 202 | /* This is an extention of the 'struct device' we create for each network | ||
| 203 | * interface to keep the rest of channel-specific data. | ||
| 204 | */ | ||
| 205 | typedef struct fr_channel | ||
| 206 | { | ||
| 207 | wanpipe_common_t common; | ||
| 208 | char name[WAN_IFNAME_SZ+1]; /* interface name, ASCIIZ */ | ||
| 209 | unsigned dlci_configured ; /* check whether configured or not */ | ||
| 210 | unsigned cir_status; /* check whether CIR enabled or not */ | ||
| 211 | unsigned dlci; /* logical channel number */ | ||
| 212 | unsigned cir; /* committed information rate */ | ||
| 213 | unsigned bc; /* committed burst size */ | ||
| 214 | unsigned be; /* excess burst size */ | ||
| 215 | unsigned mc; /* multicast support on or off */ | ||
| 216 | unsigned tx_int_status; /* Transmit Interrupt Status */ | ||
| 217 | unsigned short pkt_length; /* Packet Length */ | ||
| 218 | unsigned long router_start_time;/* Router start time in seconds */ | ||
| 219 | unsigned long tick_counter; /* counter for transmit time out */ | ||
| 220 | char dev_pending_devtint; /* interface pending dev_tint() */ | ||
| 221 | void *dlci_int_interface; /* pointer to the DLCI Interface */ | ||
| 222 | unsigned long IB_addr; /* physical address of Interface Byte */ | ||
| 223 | unsigned long state_tick; /* time of the last state change */ | ||
| 224 | unsigned char enable_IPX; /* Enable/Disable the use of IPX */ | ||
| 225 | unsigned long network_number; /* Internal Network Number for IPX*/ | ||
| 226 | sdla_t *card; /* -> owner */ | ||
| 227 | unsigned route_flag; /* Add/Rem dest addr in route tables */ | ||
| 228 | unsigned inarp; /* Inverse Arp Request status */ | ||
| 229 | long inarp_ready; /* Ready to send requests */ | ||
| 230 | int inarp_interval; /* Time between InArp Requests */ | ||
| 231 | unsigned long inarp_tick; /* InArp jiffies tick counter */ | ||
| 232 | long interface_down; /* Bring interface down on disconnect */ | ||
| 233 | struct net_device_stats ifstats; /* interface statistics */ | ||
| 234 | if_send_stat_t drvstats_if_send; | ||
| 235 | rx_intr_stat_t drvstats_rx_intr; | ||
| 236 | pipe_mgmt_stat_t drvstats_gen; | ||
| 237 | unsigned long router_up_time; | ||
| 238 | |||
| 239 | unsigned short transmit_length; | ||
| 240 | struct sk_buff *delay_skb; | ||
| 241 | |||
| 242 | bh_data_t *bh_head; /* Circular buffer for chdlc_bh */ | ||
| 243 | unsigned long tq_working; | ||
| 244 | volatile int bh_write; | ||
| 245 | volatile int bh_read; | ||
| 246 | atomic_t bh_buff_used; | ||
| 247 | |||
| 248 | /* Polling task queue. Each interface | ||
| 249 | * has its own task queue, which is used | ||
| 250 | * to defer events from the interrupt */ | ||
| 251 | struct work_struct fr_poll_work; | ||
| 252 | struct timer_list fr_arp_timer; | ||
| 253 | |||
| 254 | u32 ip_local; | ||
| 255 | u32 ip_remote; | ||
| 256 | long config_dlci; | ||
| 257 | long unconfig_dlci; | ||
| 258 | |||
| 259 | /* Whether this interface should be setup as a gateway. | ||
| 260 | * Used by dynamic route setup code */ | ||
| 261 | u8 gateway; | ||
| 262 | |||
| 263 | /* True interface type */ | ||
| 264 | u8 true_if_encoding; | ||
| 265 | u8 fr_header[FR_HEADER_LEN]; | ||
| 266 | char fr_header_len; | ||
| 267 | |||
| 268 | } fr_channel_t; | ||
| 269 | |||
| 270 | /* Route Flag options */ | ||
| 271 | #define NO_ROUTE 0x00 | ||
| 272 | #define ADD_ROUTE 0x01 | ||
| 273 | #define ROUTE_ADDED 0x02 | ||
| 274 | #define REMOVE_ROUTE 0x03 | ||
| 275 | #define ARP_REQ 0x04 | ||
| 276 | |||
| 277 | /* inarp options */ | ||
| 278 | #define INARP_NONE 0x00 | ||
| 279 | #define INARP_REQUEST 0x01 | ||
| 280 | #define INARP_CONFIGURED 0x02 | ||
| 281 | |||
| 282 | /* reasons for enabling the timer interrupt on the adapter */ | ||
| 283 | #define TMR_INT_ENABLED_UDP 0x01 | ||
| 284 | #define TMR_INT_ENABLED_UPDATE 0x02 | ||
| 285 | #define TMR_INT_ENABLED_ARP 0x04 | ||
| 286 | #define TMR_INT_ENABLED_UPDATE_STATE 0x08 | ||
| 287 | #define TMR_INT_ENABLED_CONFIG 0x10 | ||
| 288 | #define TMR_INT_ENABLED_UNCONFIG 0x20 | ||
| 289 | |||
| 290 | |||
| 291 | typedef struct dlci_status | ||
| 292 | { | ||
| 293 | unsigned short dlci PACKED; | ||
| 294 | unsigned char state PACKED; | ||
| 295 | } dlci_status_t; | ||
| 296 | |||
| 297 | typedef struct dlci_IB_mapping | ||
| 298 | { | ||
| 299 | unsigned short dlci PACKED; | ||
| 300 | unsigned long addr_value PACKED; | ||
| 301 | } dlci_IB_mapping_t; | ||
| 302 | |||
| 303 | /* This structure is used for DLCI list Tx interrupt mode. It is used to | ||
| 304 | enable interrupt bit and set the packet length for transmission | ||
| 305 | */ | ||
| 306 | typedef struct fr_dlci_interface | ||
| 307 | { | ||
| 308 | unsigned char gen_interrupt PACKED; | ||
| 309 | unsigned short packet_length PACKED; | ||
| 310 | unsigned char reserved PACKED; | ||
| 311 | } fr_dlci_interface_t; | ||
| 312 | |||
| 313 | /* variable for keeping track of enabling/disabling FT1 monitor status */ | ||
| 314 | static int rCount = 0; | ||
| 315 | |||
| 316 | extern void disable_irq(unsigned int); | ||
| 317 | extern void enable_irq(unsigned int); | ||
| 318 | |||
| 319 | /* variable for keeping track of number of interrupts generated during | ||
| 320 | * interrupt test routine | ||
| 321 | */ | ||
| 322 | static int Intr_test_counter; | ||
| 323 | |||
| 324 | /****** Function Prototypes *************************************************/ | ||
| 325 | |||
| 326 | /* WAN link driver entry points. These are called by the WAN router module. */ | ||
| 327 | static int update(struct wan_device *wandev); | ||
| 328 | static int new_if(struct wan_device *wandev, struct net_device *dev, | ||
| 329 | wanif_conf_t *conf); | ||
| 330 | static int del_if(struct wan_device *wandev, struct net_device *dev); | ||
| 331 | static void disable_comm (sdla_t *card); | ||
| 332 | |||
| 333 | /* WANPIPE-specific entry points */ | ||
| 334 | static int wpf_exec(struct sdla *card, void *u_cmd, void *u_data); | ||
| 335 | |||
| 336 | /* Network device interface */ | ||
| 337 | static int if_init(struct net_device *dev); | ||
| 338 | static int if_open(struct net_device *dev); | ||
| 339 | static int if_close(struct net_device *dev); | ||
| 340 | |||
| 341 | static void if_tx_timeout(struct net_device *dev); | ||
| 342 | |||
| 343 | static int if_rebuild_hdr (struct sk_buff *skb); | ||
| 344 | |||
| 345 | static int if_send(struct sk_buff *skb, struct net_device *dev); | ||
| 346 | static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev, | ||
| 347 | struct sk_buff *skb); | ||
| 348 | static struct net_device_stats *if_stats(struct net_device *dev); | ||
| 349 | |||
| 350 | /* Interrupt handlers */ | ||
| 351 | static void fr_isr(sdla_t *card); | ||
| 352 | static void rx_intr(sdla_t *card); | ||
| 353 | static void tx_intr(sdla_t *card); | ||
| 354 | static void timer_intr(sdla_t *card); | ||
| 355 | static void spur_intr(sdla_t *card); | ||
| 356 | |||
| 357 | /* Frame relay firmware interface functions */ | ||
| 358 | static int fr_read_version(sdla_t *card, char *str); | ||
| 359 | static int fr_configure(sdla_t *card, fr_conf_t *conf); | ||
| 360 | static int fr_dlci_configure(sdla_t *card, fr_dlc_conf_t *conf, unsigned dlci); | ||
| 361 | static int fr_init_dlci (sdla_t *card, fr_channel_t *chan); | ||
| 362 | static int fr_set_intr_mode (sdla_t *card, unsigned mode, unsigned mtu, unsigned short timeout); | ||
| 363 | static int fr_comm_enable(sdla_t *card); | ||
| 364 | static void fr_comm_disable(sdla_t *card); | ||
| 365 | static int fr_get_err_stats(sdla_t *card); | ||
| 366 | static int fr_get_stats(sdla_t *card); | ||
| 367 | static int fr_add_dlci(sdla_t *card, int dlci); | ||
| 368 | static int fr_activate_dlci(sdla_t *card, int dlci); | ||
| 369 | static int fr_delete_dlci (sdla_t* card, int dlci); | ||
| 370 | static int fr_issue_isf(sdla_t *card, int isf); | ||
| 371 | static int fr_send(sdla_t *card, int dlci, unsigned char attr, int len, | ||
| 372 | void *buf); | ||
| 373 | static int fr_send_data_header(sdla_t *card, int dlci, unsigned char attr, int len, | ||
| 374 | void *buf,unsigned char hdr_len); | ||
| 375 | static unsigned int fr_send_hdr(sdla_t *card, int dlci, unsigned int offset); | ||
| 376 | |||
| 377 | static int check_dlci_config (sdla_t *card, fr_channel_t *chan); | ||
| 378 | static void initialize_rx_tx_buffers (sdla_t *card); | ||
| 379 | |||
| 380 | |||
| 381 | /* Firmware asynchronous event handlers */ | ||
| 382 | static int fr_event(sdla_t *card, int event, fr_mbox_t *mbox); | ||
| 383 | static int fr_modem_failure(sdla_t *card, fr_mbox_t *mbox); | ||
| 384 | static int fr_dlci_change(sdla_t *card, fr_mbox_t *mbox); | ||
| 385 | |||
| 386 | /* Miscellaneous functions */ | ||
| 387 | static int update_chan_state(struct net_device *dev); | ||
| 388 | static void set_chan_state(struct net_device *dev, int state); | ||
| 389 | static struct net_device *find_channel(sdla_t *card, unsigned dlci); | ||
| 390 | static int is_tx_ready(sdla_t *card, fr_channel_t *chan); | ||
| 391 | static unsigned int dec_to_uint(unsigned char *str, int len); | ||
| 392 | static int reply_udp( unsigned char *data, unsigned int mbox_len ); | ||
| 393 | |||
| 394 | static int intr_test( sdla_t* card ); | ||
| 395 | static void init_chan_statistics( fr_channel_t* chan ); | ||
| 396 | static void init_global_statistics( sdla_t* card ); | ||
| 397 | static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan ); | ||
| 398 | static int setup_for_delayed_transmit(struct net_device* dev, | ||
| 399 | struct sk_buff *skb); | ||
| 400 | |||
| 401 | struct net_device *move_dev_to_next(sdla_t *card, struct net_device *dev); | ||
| 402 | static int check_tx_status(sdla_t *card, struct net_device *dev); | ||
| 403 | |||
| 404 | /* Frame Relay Socket API */ | ||
| 405 | static void trigger_fr_bh (fr_channel_t *); | ||
| 406 | static void fr_bh(struct net_device *dev); | ||
| 407 | static int fr_bh_cleanup(struct net_device *dev); | ||
| 408 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb); | ||
| 409 | |||
| 410 | static void trigger_fr_poll(struct net_device *dev); | ||
| 411 | static void fr_poll(struct net_device *dev); | ||
| 412 | //static void add_gateway(struct net_device *dev); | ||
| 413 | |||
| 414 | static void trigger_unconfig_fr(struct net_device *dev); | ||
| 415 | static void unconfig_fr (sdla_t *); | ||
| 416 | |||
| 417 | static void trigger_config_fr (sdla_t *); | ||
| 418 | static void config_fr (sdla_t *); | ||
| 419 | |||
| 420 | |||
| 421 | /* Inverse ARP and Dynamic routing functions */ | ||
| 422 | int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, struct net_device *dev); | ||
| 423 | int is_arp(void *buf); | ||
| 424 | int send_inarp_request(sdla_t *card, struct net_device *dev); | ||
| 425 | |||
| 426 | static void trigger_fr_arp(struct net_device *dev); | ||
| 427 | static void fr_arp (unsigned long data); | ||
| 428 | |||
| 429 | |||
| 430 | /* Udp management functions */ | ||
| 431 | static int process_udp_mgmt_pkt(sdla_t *card); | ||
| 432 | static int udp_pkt_type( struct sk_buff *skb, sdla_t *card ); | ||
| 433 | static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card, | ||
| 434 | struct sk_buff *skb, int dlci); | ||
| 435 | |||
| 436 | /* IPX functions */ | ||
| 437 | static void switch_net_numbers(unsigned char *sendpacket, | ||
| 438 | unsigned long network_number, unsigned char incoming); | ||
| 439 | |||
| 440 | static int handle_IPXWAN(unsigned char *sendpacket, char *devname, | ||
| 441 | unsigned char enable_IPX, unsigned long network_number); | ||
| 442 | |||
| 443 | /* Lock Functions: SMP supported */ | ||
| 444 | void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags); | ||
| 445 | void s508_s514_lock(sdla_t *card, unsigned long *smp_flags); | ||
| 446 | |||
| 447 | unsigned short calc_checksum (char *, int); | ||
| 448 | static int setup_fr_header(struct sk_buff *skb, | ||
| 449 | struct net_device* dev, char op_mode); | ||
| 450 | |||
| 451 | |||
| 452 | /****** Public Functions ****************************************************/ | ||
| 453 | |||
| 454 | /*============================================================================ | ||
| 455 | * Frame relay protocol initialization routine. | ||
| 456 | * | ||
| 457 | * This routine is called by the main WANPIPE module during setup. At this | ||
| 458 | * point adapter is completely initialized and firmware is running. | ||
| 459 | * o read firmware version (to make sure it's alive) | ||
| 460 | * o configure adapter | ||
| 461 | * o initialize protocol-specific fields of the adapter data space. | ||
| 462 | * | ||
| 463 | * Return: 0 o.k. | ||
| 464 | * < 0 failure. | ||
| 465 | */ | ||
| 466 | int wpf_init(sdla_t *card, wandev_conf_t *conf) | ||
| 467 | { | ||
| 468 | |||
| 469 | int err; | ||
| 470 | fr508_flags_t* flags; | ||
| 471 | |||
| 472 | union | ||
| 473 | { | ||
| 474 | char str[80]; | ||
| 475 | fr_conf_t cfg; | ||
| 476 | } u; | ||
| 477 | |||
| 478 | fr_buf_info_t* buf_info; | ||
| 479 | int i; | ||
| 480 | |||
| 481 | |||
| 482 | printk(KERN_INFO "\n"); | ||
| 483 | |||
| 484 | /* Verify configuration ID */ | ||
| 485 | if (conf->config_id != WANCONFIG_FR) { | ||
| 486 | |||
| 487 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 488 | card->devname, conf->config_id); | ||
| 489 | return -EINVAL; | ||
| 490 | |||
| 491 | } | ||
| 492 | |||
| 493 | /* Initialize protocol-specific fields of adapter data space */ | ||
| 494 | switch (card->hw.fwid) { | ||
| 495 | |||
| 496 | case SFID_FR508: | ||
| 497 | card->mbox = (void*)(card->hw.dpmbase + | ||
| 498 | FR508_MBOX_OFFS); | ||
| 499 | card->flags = (void*)(card->hw.dpmbase + | ||
| 500 | FR508_FLAG_OFFS); | ||
| 501 | if(card->hw.type == SDLA_S514) { | ||
| 502 | card->mbox += FR_MB_VECTOR; | ||
| 503 | card->flags += FR_MB_VECTOR; | ||
| 504 | } | ||
| 505 | card->isr = &fr_isr; | ||
| 506 | break; | ||
| 507 | |||
| 508 | default: | ||
| 509 | return -EINVAL; | ||
| 510 | } | ||
| 511 | |||
| 512 | flags = card->flags; | ||
| 513 | |||
| 514 | /* Read firmware version. Note that when adapter initializes, it | ||
| 515 | * clears the mailbox, so it may appear that the first command was | ||
| 516 | * executed successfully when in fact it was merely erased. To work | ||
| 517 | * around this, we execute the first command twice. | ||
| 518 | */ | ||
| 519 | |||
| 520 | if (fr_read_version(card, NULL) || fr_read_version(card, u.str)) | ||
| 521 | return -EIO; | ||
| 522 | |||
| 523 | printk(KERN_INFO "%s: running frame relay firmware v%s\n", | ||
| 524 | card->devname, u.str); | ||
| 525 | |||
| 526 | /* Adjust configuration */ | ||
| 527 | conf->mtu += FR_HEADER_LEN; | ||
| 528 | conf->mtu = (conf->mtu >= MIN_LGTH_FR_DATA_CFG) ? | ||
| 529 | min_t(unsigned int, conf->mtu, FR_MAX_NO_DATA_BYTES_IN_FRAME) : | ||
| 530 | FR_CHANNEL_MTU + FR_HEADER_LEN; | ||
| 531 | |||
| 532 | conf->bps = min_t(unsigned int, conf->bps, 2048000); | ||
| 533 | |||
| 534 | /* Initialze the configuration structure sent to the board to zero */ | ||
| 535 | memset(&u.cfg, 0, sizeof(u.cfg)); | ||
| 536 | |||
| 537 | memset(card->u.f.dlci_to_dev_map, 0, sizeof(card->u.f.dlci_to_dev_map)); | ||
| 538 | |||
| 539 | /* Configure adapter firmware */ | ||
| 540 | |||
| 541 | u.cfg.mtu = conf->mtu; | ||
| 542 | u.cfg.kbps = conf->bps / 1000; | ||
| 543 | |||
| 544 | u.cfg.cir_fwd = u.cfg.cir_bwd = 16; | ||
| 545 | u.cfg.bc_fwd = u.cfg.bc_bwd = 16; | ||
| 546 | |||
| 547 | u.cfg.options = 0x0000; | ||
| 548 | printk(KERN_INFO "%s: Global CIR enabled by Default\n", card->devname); | ||
| 549 | |||
| 550 | switch (conf->u.fr.signalling) { | ||
| 551 | |||
| 552 | case WANOPT_FR_ANSI: | ||
| 553 | u.cfg.options = 0x0000; | ||
| 554 | break; | ||
| 555 | |||
| 556 | case WANOPT_FR_Q933: | ||
| 557 | u.cfg.options |= 0x0200; | ||
| 558 | break; | ||
| 559 | |||
| 560 | case WANOPT_FR_LMI: | ||
| 561 | u.cfg.options |= 0x0400; | ||
| 562 | break; | ||
| 563 | |||
| 564 | case WANOPT_NO: | ||
| 565 | u.cfg.options |= 0x0800; | ||
| 566 | break; | ||
| 567 | default: | ||
| 568 | printk(KERN_INFO "%s: Illegal Signalling option\n", | ||
| 569 | card->wandev.name); | ||
| 570 | return -EINVAL; | ||
| 571 | } | ||
| 572 | |||
| 573 | |||
| 574 | card->wandev.signalling = conf->u.fr.signalling; | ||
| 575 | |||
| 576 | if (conf->station == WANOPT_CPE) { | ||
| 577 | |||
| 578 | |||
| 579 | if (conf->u.fr.signalling == WANOPT_NO){ | ||
| 580 | printk(KERN_INFO | ||
| 581 | "%s: ERROR - For NO signalling, station must be set to Node!", | ||
| 582 | card->devname); | ||
| 583 | return -EINVAL; | ||
| 584 | } | ||
| 585 | |||
| 586 | u.cfg.station = 0; | ||
| 587 | u.cfg.options |= 0x8000; /* auto config DLCI */ | ||
| 588 | card->u.f.dlci_num = 0; | ||
| 589 | |||
| 590 | } else { | ||
| 591 | |||
| 592 | u.cfg.station = 1; /* switch emulation mode */ | ||
| 593 | |||
| 594 | /* For switch emulation we have to create a list of dlci(s) | ||
| 595 | * that will be sent to be global SET_DLCI_CONFIGURATION | ||
| 596 | * command in fr_configure() routine. | ||
| 597 | */ | ||
| 598 | |||
| 599 | card->u.f.dlci_num = min_t(unsigned int, max_t(unsigned int, conf->u.fr.dlci_num, 1), 100); | ||
| 600 | |||
| 601 | for ( i = 0; i < card->u.f.dlci_num; i++) { | ||
| 602 | |||
| 603 | card->u.f.node_dlci[i] = (unsigned short) | ||
| 604 | conf->u.fr.dlci[i] ? conf->u.fr.dlci[i] : 16; | ||
| 605 | |||
| 606 | } | ||
| 607 | } | ||
| 608 | |||
| 609 | if (conf->clocking == WANOPT_INTERNAL) | ||
| 610 | u.cfg.port |= 0x0001; | ||
| 611 | |||
| 612 | if (conf->interface == WANOPT_RS232) | ||
| 613 | u.cfg.port |= 0x0002; | ||
| 614 | |||
| 615 | if (conf->u.fr.t391) | ||
| 616 | u.cfg.t391 = min_t(unsigned int, conf->u.fr.t391, 30); | ||
| 617 | else | ||
| 618 | u.cfg.t391 = 5; | ||
| 619 | |||
| 620 | if (conf->u.fr.t392) | ||
| 621 | u.cfg.t392 = min_t(unsigned int, conf->u.fr.t392, 30); | ||
| 622 | else | ||
| 623 | u.cfg.t392 = 15; | ||
| 624 | |||
| 625 | if (conf->u.fr.n391) | ||
| 626 | u.cfg.n391 = min_t(unsigned int, conf->u.fr.n391, 255); | ||
| 627 | else | ||
| 628 | u.cfg.n391 = 2; | ||
| 629 | |||
| 630 | if (conf->u.fr.n392) | ||
| 631 | u.cfg.n392 = min_t(unsigned int, conf->u.fr.n392, 10); | ||
| 632 | else | ||
| 633 | u.cfg.n392 = 3; | ||
| 634 | |||
| 635 | if (conf->u.fr.n393) | ||
| 636 | u.cfg.n393 = min_t(unsigned int, conf->u.fr.n393, 10); | ||
| 637 | else | ||
| 638 | u.cfg.n393 = 4; | ||
| 639 | |||
| 640 | if (fr_configure(card, &u.cfg)) | ||
| 641 | return -EIO; | ||
| 642 | |||
| 643 | if (card->hw.type == SDLA_S514) { | ||
| 644 | |||
| 645 | buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR + | ||
| 646 | FR508_RXBC_OFFS); | ||
| 647 | |||
| 648 | card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase); | ||
| 649 | |||
| 650 | card->u.f.rxmb_base = | ||
| 651 | (void*)(buf_info->rse_base + card->hw.dpmbase); | ||
| 652 | |||
| 653 | card->u.f.rxmb_last = | ||
| 654 | (void*)(buf_info->rse_base + | ||
| 655 | (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) + | ||
| 656 | card->hw.dpmbase); | ||
| 657 | }else{ | ||
| 658 | buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS); | ||
| 659 | |||
| 660 | card->rxmb = (void*)(buf_info->rse_next - | ||
| 661 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 662 | |||
| 663 | card->u.f.rxmb_base = | ||
| 664 | (void*)(buf_info->rse_base - | ||
| 665 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 666 | |||
| 667 | card->u.f.rxmb_last = | ||
| 668 | (void*)(buf_info->rse_base + | ||
| 669 | (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) - | ||
| 670 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 671 | } | ||
| 672 | |||
| 673 | card->u.f.rx_base = buf_info->buf_base; | ||
| 674 | card->u.f.rx_top = buf_info->buf_top; | ||
| 675 | |||
| 676 | card->u.f.tx_interrupts_pending = 0; | ||
| 677 | |||
| 678 | card->wandev.mtu = conf->mtu; | ||
| 679 | card->wandev.bps = conf->bps; | ||
| 680 | card->wandev.interface = conf->interface; | ||
| 681 | card->wandev.clocking = conf->clocking; | ||
| 682 | card->wandev.station = conf->station; | ||
| 683 | card->poll = NULL; | ||
| 684 | card->exec = &wpf_exec; | ||
| 685 | card->wandev.update = &update; | ||
| 686 | card->wandev.new_if = &new_if; | ||
| 687 | card->wandev.del_if = &del_if; | ||
| 688 | card->wandev.state = WAN_DISCONNECTED; | ||
| 689 | card->wandev.ttl = conf->ttl; | ||
| 690 | card->wandev.udp_port = conf->udp_port; | ||
| 691 | card->disable_comm = &disable_comm; | ||
| 692 | card->u.f.arp_dev = NULL; | ||
| 693 | |||
| 694 | /* Intialize global statistics for a card */ | ||
| 695 | init_global_statistics( card ); | ||
| 696 | |||
| 697 | card->TracingEnabled = 0; | ||
| 698 | |||
| 699 | /* Interrupt Test */ | ||
| 700 | Intr_test_counter = 0; | ||
| 701 | card->intr_mode = INTR_TEST_MODE; | ||
| 702 | err = intr_test( card ); | ||
| 703 | |||
| 704 | printk(KERN_INFO "%s: End of Interrupt Test rc=0x%x count=%i\n", | ||
| 705 | card->devname,err,Intr_test_counter); | ||
| 706 | |||
| 707 | if (err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) { | ||
| 708 | printk(KERN_ERR "%s: Interrupt Test Failed, Counter: %i\n", | ||
| 709 | card->devname, Intr_test_counter); | ||
| 710 | printk(KERN_ERR "Please choose another interrupt\n"); | ||
| 711 | err = -EIO; | ||
| 712 | return err; | ||
| 713 | } | ||
| 714 | |||
| 715 | printk(KERN_INFO "%s: Interrupt Test Passed, Counter: %i\n", | ||
| 716 | card->devname, Intr_test_counter); | ||
| 717 | |||
| 718 | |||
| 719 | /* Apr 28 2000. Nenad Corbic | ||
| 720 | * Enable commnunications here, not in if_open or new_if, since | ||
| 721 | * interfaces come down when the link is disconnected. | ||
| 722 | */ | ||
| 723 | |||
| 724 | /* If you enable comms and then set ints, you get a Tx int as you | ||
| 725 | * perform the SET_INT_TRIGGERS command. So, we only set int | ||
| 726 | * triggers and then adjust the interrupt mask (to disable Tx ints) | ||
| 727 | * before enabling comms. | ||
| 728 | */ | ||
| 729 | if (fr_set_intr_mode(card, (FR_INTR_RXRDY | FR_INTR_TXRDY | | ||
| 730 | FR_INTR_DLC | FR_INTR_TIMER | FR_INTR_TX_MULT_DLCIs) , | ||
| 731 | card->wandev.mtu, 0)) { | ||
| 732 | return -EIO; | ||
| 733 | } | ||
| 734 | |||
| 735 | flags->imask &= ~(FR_INTR_TXRDY | FR_INTR_TIMER); | ||
| 736 | |||
| 737 | if (fr_comm_enable(card)) { | ||
| 738 | return -EIO; | ||
| 739 | } | ||
| 740 | wanpipe_set_state(card, WAN_CONNECTED); | ||
| 741 | spin_lock_init(&card->u.f.if_send_lock); | ||
| 742 | |||
| 743 | printk(KERN_INFO "\n"); | ||
| 744 | |||
| 745 | return 0; | ||
| 746 | } | ||
| 747 | |||
| 748 | /******* WAN Device Driver Entry Points *************************************/ | ||
| 749 | |||
| 750 | /*============================================================================ | ||
| 751 | * Update device status & statistics. | ||
| 752 | */ | ||
| 753 | static int update(struct wan_device* wandev) | ||
| 754 | { | ||
| 755 | volatile sdla_t* card; | ||
| 756 | unsigned long timeout; | ||
| 757 | fr508_flags_t* flags; | ||
| 758 | |||
| 759 | /* sanity checks */ | ||
| 760 | if ((wandev == NULL) || (wandev->private == NULL)) | ||
| 761 | return -EFAULT; | ||
| 762 | |||
| 763 | if (wandev->state == WAN_UNCONFIGURED) | ||
| 764 | return -ENODEV; | ||
| 765 | |||
| 766 | card = wandev->private; | ||
| 767 | flags = card->flags; | ||
| 768 | |||
| 769 | |||
| 770 | card->u.f.update_comms_stats = 1; | ||
| 771 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE; | ||
| 772 | flags->imask |= FR_INTR_TIMER; | ||
| 773 | timeout = jiffies; | ||
| 774 | for(;;) { | ||
| 775 | if(card->u.f.update_comms_stats == 0) | ||
| 776 | break; | ||
| 777 | if (time_after(jiffies, timeout + 1 * HZ)){ | ||
| 778 | card->u.f.update_comms_stats = 0; | ||
| 779 | return -EAGAIN; | ||
| 780 | } | ||
| 781 | } | ||
| 782 | |||
| 783 | return 0; | ||
| 784 | } | ||
| 785 | |||
| 786 | /*============================================================================ | ||
| 787 | * Create new logical channel. | ||
| 788 | * This routine is called by the router when ROUTER_IFNEW IOCTL is being | ||
| 789 | * handled. | ||
| 790 | * o parse media- and hardware-specific configuration | ||
| 791 | * o make sure that a new channel can be created | ||
| 792 | * o allocate resources, if necessary | ||
| 793 | * o prepare network device structure for registaration. | ||
| 794 | * | ||
| 795 | * Return: 0 o.k. | ||
| 796 | * < 0 failure (channel will not be created) | ||
| 797 | */ | ||
| 798 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 799 | wanif_conf_t* conf) | ||
| 800 | { | ||
| 801 | sdla_t* card = wandev->private; | ||
| 802 | fr_channel_t* chan; | ||
| 803 | int dlci = 0; | ||
| 804 | int err = 0; | ||
| 805 | |||
| 806 | |||
| 807 | if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) { | ||
| 808 | |||
| 809 | printk(KERN_INFO "%s: Invalid interface name!\n", | ||
| 810 | card->devname); | ||
| 811 | return -EINVAL; | ||
| 812 | } | ||
| 813 | |||
| 814 | /* allocate and initialize private data */ | ||
| 815 | chan = kmalloc(sizeof(fr_channel_t), GFP_KERNEL); | ||
| 816 | |||
| 817 | if (chan == NULL) | ||
| 818 | return -ENOMEM; | ||
| 819 | |||
| 820 | memset(chan, 0, sizeof(fr_channel_t)); | ||
| 821 | strcpy(chan->name, conf->name); | ||
| 822 | chan->card = card; | ||
| 823 | |||
| 824 | /* verify media address */ | ||
| 825 | if (isdigit(conf->addr[0])) { | ||
| 826 | |||
| 827 | dlci = dec_to_uint(conf->addr, 0); | ||
| 828 | |||
| 829 | if (dlci && (dlci <= HIGHEST_VALID_DLCI)) { | ||
| 830 | |||
| 831 | chan->dlci = dlci; | ||
| 832 | |||
| 833 | } else { | ||
| 834 | |||
| 835 | printk(KERN_ERR | ||
| 836 | "%s: Invalid DLCI %u on interface %s!\n", | ||
| 837 | wandev->name, dlci, chan->name); | ||
| 838 | err = -EINVAL; | ||
| 839 | } | ||
| 840 | |||
| 841 | } else { | ||
| 842 | printk(KERN_ERR | ||
| 843 | "%s: Invalid media address on interface %s!\n", | ||
| 844 | wandev->name, chan->name); | ||
| 845 | err = -EINVAL; | ||
| 846 | } | ||
| 847 | |||
| 848 | if ((chan->true_if_encoding = conf->true_if_encoding) == WANOPT_YES){ | ||
| 849 | printk(KERN_INFO | ||
| 850 | "%s: Enabling, true interface type encoding.\n", | ||
| 851 | card->devname); | ||
| 852 | } | ||
| 853 | |||
| 854 | |||
| 855 | |||
| 856 | /* Setup wanpipe as a router (WANPIPE) even if it is | ||
| 857 | * a bridged DLCI, or as an API | ||
| 858 | */ | ||
| 859 | if (strcmp(conf->usedby, "WANPIPE") == 0 || | ||
| 860 | strcmp(conf->usedby, "BRIDGE") == 0 || | ||
| 861 | strcmp(conf->usedby, "BRIDGE_N") == 0){ | ||
| 862 | |||
| 863 | if(strcmp(conf->usedby, "WANPIPE") == 0){ | ||
| 864 | chan->common.usedby = WANPIPE; | ||
| 865 | |||
| 866 | printk(KERN_INFO "%s: Running in WANPIPE mode.\n", | ||
| 867 | card->devname); | ||
| 868 | |||
| 869 | }else if(strcmp(conf->usedby, "BRIDGE") == 0){ | ||
| 870 | |||
| 871 | chan->common.usedby = BRIDGE; | ||
| 872 | |||
| 873 | printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE) mode.\n", | ||
| 874 | card->devname); | ||
| 875 | }else if( strcmp(conf->usedby, "BRIDGE_N") == 0 ){ | ||
| 876 | |||
| 877 | chan->common.usedby = BRIDGE_NODE; | ||
| 878 | |||
| 879 | printk(KERN_INFO "%s: Running in WANPIPE (BRIDGE_NODE) mode.\n", | ||
| 880 | card->devname); | ||
| 881 | } | ||
| 882 | |||
| 883 | if (!err){ | ||
| 884 | /* Dynamic interface configuration option. | ||
| 885 | * On disconnect, if the options is selected, | ||
| 886 | * the interface will be brought down */ | ||
| 887 | if (conf->if_down == WANOPT_YES){ | ||
| 888 | set_bit(DYN_OPT_ON,&chan->interface_down); | ||
| 889 | printk(KERN_INFO | ||
| 890 | "%s: Dynamic interface configuration enabled.\n", | ||
| 891 | card->devname); | ||
| 892 | } | ||
| 893 | } | ||
| 894 | |||
| 895 | } else if(strcmp(conf->usedby, "API") == 0){ | ||
| 896 | |||
| 897 | chan->common.usedby = API; | ||
| 898 | printk(KERN_INFO "%s: Running in API mode.\n", | ||
| 899 | wandev->name); | ||
| 900 | } | ||
| 901 | |||
| 902 | if (err) { | ||
| 903 | |||
| 904 | kfree(chan); | ||
| 905 | return err; | ||
| 906 | } | ||
| 907 | |||
| 908 | /* place cir,be,bc and other channel specific information into the | ||
| 909 | * chan structure | ||
| 910 | */ | ||
| 911 | if (conf->cir) { | ||
| 912 | |||
| 913 | chan->cir = max_t(unsigned int, 1, | ||
| 914 | min_t(unsigned int, conf->cir, 512)); | ||
| 915 | chan->cir_status = CIR_ENABLED; | ||
| 916 | |||
| 917 | |||
| 918 | /* If CIR is enabled, force BC to equal CIR | ||
| 919 | * this solves number of potential problems if CIR is | ||
| 920 | * set and BC is not | ||
| 921 | */ | ||
| 922 | chan->bc = chan->cir; | ||
| 923 | |||
| 924 | if (conf->be){ | ||
| 925 | chan->be = max_t(unsigned int, | ||
| 926 | 0, min_t(unsigned int, conf->be, 511)); | ||
| 927 | }else{ | ||
| 928 | conf->be = 0; | ||
| 929 | } | ||
| 930 | |||
| 931 | printk (KERN_INFO "%s: CIR enabled for DLCI %i \n", | ||
| 932 | wandev->name,chan->dlci); | ||
| 933 | printk (KERN_INFO "%s: CIR = %i ; BC = %i ; BE = %i\n", | ||
| 934 | wandev->name,chan->cir,chan->bc,chan->be); | ||
| 935 | |||
| 936 | |||
| 937 | }else{ | ||
| 938 | chan->cir_status = CIR_DISABLED; | ||
| 939 | printk (KERN_INFO "%s: CIR disabled for DLCI %i\n", | ||
| 940 | wandev->name,chan->dlci); | ||
| 941 | } | ||
| 942 | |||
| 943 | chan->mc = conf->mc; | ||
| 944 | |||
| 945 | if (conf->inarp == WANOPT_YES){ | ||
| 946 | printk(KERN_INFO "%s: Inverse ARP Support Enabled\n",card->devname); | ||
| 947 | chan->inarp = conf->inarp ? INARP_REQUEST : INARP_NONE; | ||
| 948 | chan->inarp_interval = conf->inarp_interval ? conf->inarp_interval : 10; | ||
| 949 | }else{ | ||
| 950 | printk(KERN_INFO "%s: Inverse ARP Support Disabled\n",card->devname); | ||
| 951 | chan->inarp = INARP_NONE; | ||
| 952 | chan->inarp_interval = 10; | ||
| 953 | } | ||
| 954 | |||
| 955 | |||
| 956 | chan->dlci_configured = DLCI_NOT_CONFIGURED; | ||
| 957 | |||
| 958 | |||
| 959 | /*FIXME: IPX disabled in this WANPIPE version */ | ||
| 960 | if (conf->enable_IPX == WANOPT_YES){ | ||
| 961 | printk(KERN_INFO "%s: ERROR - This version of WANPIPE doesn't support IPX\n", | ||
| 962 | card->devname); | ||
| 963 | kfree(chan); | ||
| 964 | return -EINVAL; | ||
| 965 | }else{ | ||
| 966 | chan->enable_IPX = WANOPT_NO; | ||
| 967 | } | ||
| 968 | |||
| 969 | if (conf->network_number){ | ||
| 970 | chan->network_number = conf->network_number; | ||
| 971 | }else{ | ||
| 972 | chan->network_number = 0xDEADBEEF; | ||
| 973 | } | ||
| 974 | |||
| 975 | chan->route_flag = NO_ROUTE; | ||
| 976 | |||
| 977 | init_chan_statistics(chan); | ||
| 978 | |||
| 979 | chan->transmit_length = 0; | ||
| 980 | |||
| 981 | /* prepare network device data space for registration */ | ||
| 982 | strcpy(dev->name,chan->name); | ||
| 983 | |||
| 984 | dev->init = &if_init; | ||
| 985 | dev->priv = chan; | ||
| 986 | |||
| 987 | /* Initialize FR Polling Task Queue | ||
| 988 | * We need a poll routine for each network | ||
| 989 | * interface. | ||
| 990 | */ | ||
| 991 | INIT_WORK(&chan->fr_poll_work, (void *)fr_poll, dev); | ||
| 992 | |||
| 993 | init_timer(&chan->fr_arp_timer); | ||
| 994 | chan->fr_arp_timer.data=(unsigned long)dev; | ||
| 995 | chan->fr_arp_timer.function = fr_arp; | ||
| 996 | |||
| 997 | wandev->new_if_cnt++; | ||
| 998 | |||
| 999 | /* Tells us that if this interface is a | ||
| 1000 | * gateway or not */ | ||
| 1001 | if ((chan->gateway = conf->gateway) == WANOPT_YES){ | ||
| 1002 | printk(KERN_INFO "%s: Interface %s is set as a gateway.\n", | ||
| 1003 | card->devname,dev->name); | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | /* M. Grant Patch Apr 28 2000 | ||
| 1007 | * Disallow duplicate dlci configurations. */ | ||
| 1008 | if (card->u.f.dlci_to_dev_map[chan->dlci] != NULL) { | ||
| 1009 | kfree(chan); | ||
| 1010 | return -EBUSY; | ||
| 1011 | } | ||
| 1012 | |||
| 1013 | /* Configure this dlci at a later date, when | ||
| 1014 | * the interface comes up. i.e. when if_open() | ||
| 1015 | * executes */ | ||
| 1016 | set_bit(0,&chan->config_dlci); | ||
| 1017 | |||
| 1018 | printk(KERN_INFO "\n"); | ||
| 1019 | |||
| 1020 | return 0; | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | /*============================================================================ | ||
| 1024 | * Delete logical channel. | ||
| 1025 | */ | ||
| 1026 | static int del_if(struct wan_device* wandev, struct net_device* dev) | ||
| 1027 | { | ||
| 1028 | fr_channel_t* chan = dev->priv; | ||
| 1029 | unsigned long smp_flags=0; | ||
| 1030 | |||
| 1031 | /* This interface is dead, make sure the | ||
| 1032 | * ARP timer is stopped */ | ||
| 1033 | del_timer(&chan->fr_arp_timer); | ||
| 1034 | |||
| 1035 | /* If we are a NODE, we must unconfigure this DLCI | ||
| 1036 | * Trigger an unconfigure command that will | ||
| 1037 | * be executed in timer interrupt. We must wait | ||
| 1038 | * for the command to complete. */ | ||
| 1039 | trigger_unconfig_fr(dev); | ||
| 1040 | |||
| 1041 | lock_adapter_irq(&wandev->lock, &smp_flags); | ||
| 1042 | wandev->new_if_cnt--; | ||
| 1043 | unlock_adapter_irq(&wandev->lock, &smp_flags); | ||
| 1044 | |||
| 1045 | return 0; | ||
| 1046 | } | ||
| 1047 | |||
| 1048 | |||
| 1049 | /*===================================================================== | ||
| 1050 | * disable_comm | ||
| 1051 | * | ||
| 1052 | * Description: | ||
| 1053 | * Disable communications. | ||
| 1054 | * This code runs in shutdown (sdlamain.c) | ||
| 1055 | * under critical flag. Therefore it is not | ||
| 1056 | * necessary to set a critical flag here | ||
| 1057 | * | ||
| 1058 | * Usage: | ||
| 1059 | * Commnunications are disabled only on a card | ||
| 1060 | * shutdown. | ||
| 1061 | */ | ||
| 1062 | |||
| 1063 | static void disable_comm (sdla_t *card) | ||
| 1064 | { | ||
| 1065 | printk(KERN_INFO "%s: Disabling Communications!\n", | ||
| 1066 | card->devname); | ||
| 1067 | fr_comm_disable(card); | ||
| 1068 | } | ||
| 1069 | |||
| 1070 | /****** WANPIPE-specific entry points ***************************************/ | ||
| 1071 | |||
| 1072 | /*============================================================================ | ||
| 1073 | * Execute adapter interface command. | ||
| 1074 | */ | ||
| 1075 | static int wpf_exec (struct sdla* card, void* u_cmd, void* u_data) | ||
| 1076 | { | ||
| 1077 | fr_mbox_t* mbox = card->mbox; | ||
| 1078 | int retry = MAX_CMD_RETRY; | ||
| 1079 | int err, len; | ||
| 1080 | fr_cmd_t cmd; | ||
| 1081 | |||
| 1082 | if(copy_from_user((void*)&cmd, u_cmd, sizeof(cmd))) | ||
| 1083 | return -EFAULT; | ||
| 1084 | |||
| 1085 | /* execute command */ | ||
| 1086 | do | ||
| 1087 | { | ||
| 1088 | memcpy(&mbox->cmd, &cmd, sizeof(cmd)); | ||
| 1089 | |||
| 1090 | if (cmd.length){ | ||
| 1091 | if( copy_from_user((void*)&mbox->data, u_data, cmd.length)) | ||
| 1092 | return -EFAULT; | ||
| 1093 | } | ||
| 1094 | |||
| 1095 | if (sdla_exec(mbox)) | ||
| 1096 | err = mbox->cmd.result; | ||
| 1097 | |||
| 1098 | else return -EIO; | ||
| 1099 | |||
| 1100 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 1101 | |||
| 1102 | /* return result */ | ||
| 1103 | if (copy_to_user(u_cmd, (void*)&mbox->cmd, sizeof(fr_cmd_t))) | ||
| 1104 | return -EFAULT; | ||
| 1105 | |||
| 1106 | len = mbox->cmd.length; | ||
| 1107 | |||
| 1108 | if (len && u_data && !copy_to_user(u_data, (void*)&mbox->data, len)) | ||
| 1109 | return -EFAULT; | ||
| 1110 | return 0; | ||
| 1111 | } | ||
| 1112 | |||
| 1113 | /****** Network Device Interface ********************************************/ | ||
| 1114 | |||
| 1115 | /*============================================================================ | ||
| 1116 | * Initialize Linux network interface. | ||
| 1117 | * | ||
| 1118 | * This routine is called only once for each interface, during Linux network | ||
| 1119 | * interface registration. Returning anything but zero will fail interface | ||
| 1120 | * registration. | ||
| 1121 | */ | ||
| 1122 | static int if_init(struct net_device* dev) | ||
| 1123 | { | ||
| 1124 | fr_channel_t* chan = dev->priv; | ||
| 1125 | sdla_t* card = chan->card; | ||
| 1126 | struct wan_device* wandev = &card->wandev; | ||
| 1127 | |||
| 1128 | /* Initialize device driver entry points */ | ||
| 1129 | dev->open = &if_open; | ||
| 1130 | dev->stop = &if_close; | ||
| 1131 | dev->hard_header = NULL; | ||
| 1132 | dev->rebuild_header = &if_rebuild_hdr; | ||
| 1133 | dev->hard_start_xmit = &if_send; | ||
| 1134 | dev->get_stats = &if_stats; | ||
| 1135 | dev->tx_timeout = &if_tx_timeout; | ||
| 1136 | dev->watchdog_timeo = TX_TIMEOUT; | ||
| 1137 | |||
| 1138 | if (chan->common.usedby == WANPIPE || chan->common.usedby == API){ | ||
| 1139 | |||
| 1140 | /* Initialize media-specific parameters */ | ||
| 1141 | if (chan->true_if_encoding){ | ||
| 1142 | dev->type = ARPHRD_DLCI; /* This breaks tcpdump */ | ||
| 1143 | }else{ | ||
| 1144 | dev->type = ARPHRD_PPP; /* ARP h/w type */ | ||
| 1145 | } | ||
| 1146 | |||
| 1147 | dev->flags |= IFF_POINTOPOINT; | ||
| 1148 | dev->flags |= IFF_NOARP; | ||
| 1149 | |||
| 1150 | /* Enable Multicast addressing */ | ||
| 1151 | if (chan->mc == WANOPT_YES){ | ||
| 1152 | dev->flags |= IFF_MULTICAST; | ||
| 1153 | } | ||
| 1154 | |||
| 1155 | dev->mtu = wandev->mtu - FR_HEADER_LEN; | ||
| 1156 | /* For an API, the maximum number of bytes that the stack will pass | ||
| 1157 | to the driver is (dev->mtu + dev->hard_header_len). So, adjust the | ||
| 1158 | mtu so that a frame of maximum size can be transmitted by the API. | ||
| 1159 | */ | ||
| 1160 | if(chan->common.usedby == API) { | ||
| 1161 | dev->mtu += (sizeof(api_tx_hdr_t) - FR_HEADER_LEN); | ||
| 1162 | } | ||
| 1163 | |||
| 1164 | dev->hard_header_len = FR_HEADER_LEN;/* media header length */ | ||
| 1165 | dev->addr_len = 2; /* hardware address length */ | ||
| 1166 | *(unsigned short*)dev->dev_addr = htons(chan->dlci); | ||
| 1167 | |||
| 1168 | /* Set transmit buffer queue length */ | ||
| 1169 | dev->tx_queue_len = 100; | ||
| 1170 | |||
| 1171 | }else{ | ||
| 1172 | |||
| 1173 | /* Setup the interface for Bridging */ | ||
| 1174 | int hw_addr=0; | ||
| 1175 | ether_setup(dev); | ||
| 1176 | |||
| 1177 | /* Use a random number to generate the MAC address */ | ||
| 1178 | memcpy(dev->dev_addr, "\xFE\xFC\x00\x00\x00\x00", 6); | ||
| 1179 | get_random_bytes(&hw_addr, sizeof(hw_addr)); | ||
| 1180 | *(int *)(dev->dev_addr + 2) += hw_addr; | ||
| 1181 | } | ||
| 1182 | |||
| 1183 | /* Initialize hardware parameters (just for reference) */ | ||
| 1184 | dev->irq = wandev->irq; | ||
| 1185 | dev->dma = wandev->dma; | ||
| 1186 | dev->base_addr = wandev->ioport; | ||
| 1187 | dev->mem_start = wandev->maddr; | ||
| 1188 | dev->mem_end = wandev->maddr + wandev->msize - 1; | ||
| 1189 | SET_MODULE_OWNER(dev); | ||
| 1190 | |||
| 1191 | return 0; | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | /*============================================================================ | ||
| 1195 | * Open network interface. | ||
| 1196 | * o if this is the first open, then enable communications and interrupts. | ||
| 1197 | * o prevent module from unloading by incrementing use count | ||
| 1198 | * | ||
| 1199 | * Return 0 if O.k. or errno. | ||
| 1200 | */ | ||
| 1201 | static int if_open(struct net_device* dev) | ||
| 1202 | { | ||
| 1203 | fr_channel_t* chan = dev->priv; | ||
| 1204 | sdla_t* card = chan->card; | ||
| 1205 | int err = 0; | ||
| 1206 | struct timeval tv; | ||
| 1207 | |||
| 1208 | if (netif_running(dev)) | ||
| 1209 | return -EBUSY; | ||
| 1210 | |||
| 1211 | /* Initialize the task queue */ | ||
| 1212 | chan->tq_working=0; | ||
| 1213 | |||
| 1214 | INIT_WORK(&chan->common.wanpipe_work, (void *)fr_bh, dev); | ||
| 1215 | |||
| 1216 | /* Allocate and initialize BH circular buffer */ | ||
| 1217 | chan->bh_head = kmalloc((sizeof(bh_data_t)*MAX_BH_BUFF),GFP_ATOMIC); | ||
| 1218 | memset(chan->bh_head,0,(sizeof(bh_data_t)*MAX_BH_BUFF)); | ||
| 1219 | atomic_set(&chan->bh_buff_used, 0); | ||
| 1220 | |||
| 1221 | netif_start_queue(dev); | ||
| 1222 | |||
| 1223 | wanpipe_open(card); | ||
| 1224 | do_gettimeofday( &tv ); | ||
| 1225 | chan->router_start_time = tv.tv_sec; | ||
| 1226 | |||
| 1227 | if (test_bit(0,&chan->config_dlci)){ | ||
| 1228 | trigger_config_fr (card); | ||
| 1229 | }else if (chan->inarp == INARP_REQUEST){ | ||
| 1230 | trigger_fr_arp(dev); | ||
| 1231 | } | ||
| 1232 | |||
| 1233 | return err; | ||
| 1234 | } | ||
| 1235 | |||
| 1236 | /*============================================================================ | ||
| 1237 | * Close network interface. | ||
| 1238 | * o if this is the last open, then disable communications and interrupts. | ||
| 1239 | * o reset flags. | ||
| 1240 | */ | ||
| 1241 | static int if_close(struct net_device* dev) | ||
| 1242 | { | ||
| 1243 | fr_channel_t* chan = dev->priv; | ||
| 1244 | sdla_t* card = chan->card; | ||
| 1245 | |||
| 1246 | if (chan->inarp == INARP_CONFIGURED) { | ||
| 1247 | chan->inarp = INARP_REQUEST; | ||
| 1248 | } | ||
| 1249 | |||
| 1250 | netif_stop_queue(dev); | ||
| 1251 | wanpipe_close(card); | ||
| 1252 | |||
| 1253 | return 0; | ||
| 1254 | } | ||
| 1255 | |||
| 1256 | /*============================================================================ | ||
| 1257 | * Re-build media header. | ||
| 1258 | * | ||
| 1259 | * Return: 1 physical address resolved. | ||
| 1260 | * 0 physical address not resolved | ||
| 1261 | */ | ||
| 1262 | static int if_rebuild_hdr (struct sk_buff* skb) | ||
| 1263 | { | ||
| 1264 | struct net_device *dev = skb->dev; | ||
| 1265 | fr_channel_t* chan = dev->priv; | ||
| 1266 | sdla_t* card = chan->card; | ||
| 1267 | |||
| 1268 | printk(KERN_INFO "%s: rebuild_header() called for interface %s!\n", | ||
| 1269 | card->devname, dev->name); | ||
| 1270 | return 1; | ||
| 1271 | } | ||
| 1272 | |||
| 1273 | /*============================================================================ | ||
| 1274 | * Handle transmit timeout event from netif watchdog | ||
| 1275 | */ | ||
| 1276 | static void if_tx_timeout(struct net_device *dev) | ||
| 1277 | { | ||
| 1278 | fr_channel_t* chan = dev->priv; | ||
| 1279 | sdla_t *card = chan->card; | ||
| 1280 | |||
| 1281 | /* If our device stays busy for at least 5 seconds then we will | ||
| 1282 | * kick start the device by making dev->tbusy = 0. We expect | ||
| 1283 | * that our device never stays busy more than 5 seconds. So this | ||
| 1284 | * is only used as a last resort. | ||
| 1285 | */ | ||
| 1286 | |||
| 1287 | chan->drvstats_if_send.if_send_tbusy++; | ||
| 1288 | ++chan->ifstats.collisions; | ||
| 1289 | |||
| 1290 | printk (KERN_INFO "%s: Transmit timed out on %s\n", | ||
| 1291 | card->devname, dev->name); | ||
| 1292 | chan->drvstats_if_send.if_send_tbusy_timeout++; | ||
| 1293 | netif_wake_queue (dev); | ||
| 1294 | |||
| 1295 | } | ||
| 1296 | |||
| 1297 | |||
| 1298 | /*============================================================================ | ||
| 1299 | * Send a packet on a network interface. | ||
| 1300 | * o set tbusy flag (marks start of the transmission) to block a timer-based | ||
| 1301 | * transmit from overlapping. | ||
| 1302 | * o set critical flag when accessing board. | ||
| 1303 | * o check link state. If link is not up, then drop the packet. | ||
| 1304 | * o check channel status. If it's down then initiate a call. | ||
| 1305 | * o pass a packet to corresponding WAN device. | ||
| 1306 | * o free socket buffer | ||
| 1307 | * | ||
| 1308 | * Return: 0 complete (socket buffer must be freed) | ||
| 1309 | * non-0 packet may be re-transmitted (tbusy must be set) | ||
| 1310 | * | ||
| 1311 | * Notes: | ||
| 1312 | * 1. This routine is called either by the protocol stack or by the "net | ||
| 1313 | * bottom half" (with interrupts enabled). | ||
| 1314 | * | ||
| 1315 | * 2. Using netif_start_queue() and netif_stop_queue() | ||
| 1316 | * will inhibit further transmit requests from the protocol stack | ||
| 1317 | * and can be used for flow control with protocol layer. | ||
| 1318 | */ | ||
| 1319 | static int if_send(struct sk_buff* skb, struct net_device* dev) | ||
| 1320 | { | ||
| 1321 | fr_channel_t* chan = dev->priv; | ||
| 1322 | sdla_t* card = chan->card; | ||
| 1323 | int err; | ||
| 1324 | unsigned char *sendpacket; | ||
| 1325 | fr508_flags_t* adptr_flags = card->flags; | ||
| 1326 | int udp_type; | ||
| 1327 | long delay_tx_queued = 0; | ||
| 1328 | unsigned long smp_flags=0; | ||
| 1329 | unsigned char attr = 0; | ||
| 1330 | |||
| 1331 | chan->drvstats_if_send.if_send_entry++; | ||
| 1332 | |||
| 1333 | netif_stop_queue(dev); | ||
| 1334 | |||
| 1335 | if (skb == NULL) { | ||
| 1336 | /* if we get here, some higher layer thinks we've missed an | ||
| 1337 | * tx-done interrupt. | ||
| 1338 | */ | ||
| 1339 | printk(KERN_INFO "%s: interface %s got kicked!\n", | ||
| 1340 | card->devname, dev->name); | ||
| 1341 | chan->drvstats_if_send.if_send_skb_null ++; | ||
| 1342 | |||
| 1343 | netif_wake_queue(dev); | ||
| 1344 | return 0; | ||
| 1345 | } | ||
| 1346 | |||
| 1347 | /* If a peripheral task is running just drop packets */ | ||
| 1348 | if (test_bit(PERI_CRIT, &card->wandev.critical)){ | ||
| 1349 | |||
| 1350 | printk(KERN_INFO "%s: Critical in if_send(): Peripheral running!\n", | ||
| 1351 | card->devname); | ||
| 1352 | |||
| 1353 | dev_kfree_skb_any(skb); | ||
| 1354 | netif_start_queue(dev); | ||
| 1355 | return 0; | ||
| 1356 | } | ||
| 1357 | |||
| 1358 | /* We must set the 'tbusy' flag if we already have a packet queued for | ||
| 1359 | transmission in the transmit interrupt handler. However, we must | ||
| 1360 | ensure that the transmit interrupt does not reset the 'tbusy' flag | ||
| 1361 | just before we set it, as this will result in a "transmit timeout". | ||
| 1362 | */ | ||
| 1363 | set_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical); | ||
| 1364 | if(chan->transmit_length) { | ||
| 1365 | netif_stop_queue(dev); | ||
| 1366 | chan->tick_counter = jiffies; | ||
| 1367 | clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical); | ||
| 1368 | return 1; | ||
| 1369 | } | ||
| 1370 | clear_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical); | ||
| 1371 | |||
| 1372 | /* Move the if_header() code to here. By inserting frame | ||
| 1373 | * relay header in if_header() we would break the | ||
| 1374 | * tcpdump and other packet sniffers */ | ||
| 1375 | chan->fr_header_len = setup_fr_header(skb,dev,chan->common.usedby); | ||
| 1376 | if (chan->fr_header_len < 0 ){ | ||
| 1377 | ++chan->ifstats.tx_dropped; | ||
| 1378 | ++card->wandev.stats.tx_dropped; | ||
| 1379 | |||
| 1380 | dev_kfree_skb_any(skb); | ||
| 1381 | netif_start_queue(dev); | ||
| 1382 | return 0; | ||
| 1383 | } | ||
| 1384 | |||
| 1385 | sendpacket = skb->data; | ||
| 1386 | |||
| 1387 | udp_type = udp_pkt_type(skb, card); | ||
| 1388 | |||
| 1389 | if(udp_type != UDP_INVALID_TYPE) { | ||
| 1390 | if(store_udp_mgmt_pkt(udp_type, UDP_PKT_FRM_STACK, card, skb, | ||
| 1391 | chan->dlci)) { | ||
| 1392 | adptr_flags->imask |= FR_INTR_TIMER; | ||
| 1393 | if (udp_type == UDP_FPIPE_TYPE){ | ||
| 1394 | chan->drvstats_if_send. | ||
| 1395 | if_send_PIPE_request ++; | ||
| 1396 | } | ||
| 1397 | } | ||
| 1398 | netif_start_queue(dev); | ||
| 1399 | return 0; | ||
| 1400 | } | ||
| 1401 | |||
| 1402 | //FIXME: can we do better than sendpacket[2]? | ||
| 1403 | if ((chan->common.usedby == WANPIPE) && (sendpacket[2] == 0x45)) { | ||
| 1404 | |||
| 1405 | /* check to see if the source IP address is a broadcast or */ | ||
| 1406 | /* multicast IP address */ | ||
| 1407 | if(chk_bcast_mcast_addr(card, dev, skb)){ | ||
| 1408 | ++chan->ifstats.tx_dropped; | ||
| 1409 | ++card->wandev.stats.tx_dropped; | ||
| 1410 | dev_kfree_skb_any(skb); | ||
| 1411 | netif_start_queue(dev); | ||
| 1412 | return 0; | ||
| 1413 | } | ||
| 1414 | } | ||
| 1415 | |||
| 1416 | |||
| 1417 | /* Lock the S514/S508 card: SMP Supported */ | ||
| 1418 | s508_s514_lock(card,&smp_flags); | ||
| 1419 | |||
| 1420 | if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 1421 | |||
| 1422 | chan->drvstats_if_send.if_send_critical_non_ISR ++; | ||
| 1423 | chan->ifstats.tx_dropped ++; | ||
| 1424 | printk(KERN_INFO "%s Critical in IF_SEND: if_send() already running!\n", | ||
| 1425 | card->devname); | ||
| 1426 | goto if_send_start_and_exit; | ||
| 1427 | } | ||
| 1428 | |||
| 1429 | /* API packet check: minimum packet size must be greater than | ||
| 1430 | * 16 byte API header */ | ||
| 1431 | if((chan->common.usedby == API) && (skb->len <= sizeof(api_tx_hdr_t))) { | ||
| 1432 | ++chan->ifstats.tx_dropped; | ||
| 1433 | ++card->wandev.stats.tx_dropped; | ||
| 1434 | |||
| 1435 | |||
| 1436 | goto if_send_start_and_exit; | ||
| 1437 | |||
| 1438 | }else{ | ||
| 1439 | /* During API transmission, get rid of the API header */ | ||
| 1440 | if (chan->common.usedby == API) { | ||
| 1441 | api_tx_hdr_t* api_tx_hdr; | ||
| 1442 | api_tx_hdr = (api_tx_hdr_t*)&skb->data[0x00]; | ||
| 1443 | attr = api_tx_hdr->attr; | ||
| 1444 | skb_pull(skb,sizeof(api_tx_hdr_t)); | ||
| 1445 | } | ||
| 1446 | } | ||
| 1447 | |||
| 1448 | if (card->wandev.state != WAN_CONNECTED) { | ||
| 1449 | chan->drvstats_if_send.if_send_wan_disconnected ++; | ||
| 1450 | ++chan->ifstats.tx_dropped; | ||
| 1451 | ++card->wandev.stats.tx_dropped; | ||
| 1452 | |||
| 1453 | } else if (chan->common.state != WAN_CONNECTED) { | ||
| 1454 | chan->drvstats_if_send.if_send_dlci_disconnected ++; | ||
| 1455 | |||
| 1456 | /* Update the DLCI state in timer interrupt */ | ||
| 1457 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UPDATE_STATE; | ||
| 1458 | adptr_flags->imask |= FR_INTR_TIMER; | ||
| 1459 | |||
| 1460 | ++chan->ifstats.tx_dropped; | ||
| 1461 | ++card->wandev.stats.tx_dropped; | ||
| 1462 | |||
| 1463 | } else if (!is_tx_ready(card, chan)) { | ||
| 1464 | /* No tx buffers available, store for delayed transmit */ | ||
| 1465 | if (!setup_for_delayed_transmit(dev, skb)){ | ||
| 1466 | set_bit(1,&delay_tx_queued); | ||
| 1467 | } | ||
| 1468 | chan->drvstats_if_send.if_send_no_bfrs++; | ||
| 1469 | |||
| 1470 | } else if (!skb->protocol) { | ||
| 1471 | /* No protocols drop packet */ | ||
| 1472 | chan->drvstats_if_send.if_send_protocol_error ++; | ||
| 1473 | ++card->wandev.stats.tx_errors; | ||
| 1474 | |||
| 1475 | } else if (test_bit(ARP_CRIT,&card->wandev.critical)){ | ||
| 1476 | /* We are trying to send an ARP Packet, block IP data until | ||
| 1477 | * ARP is sent */ | ||
| 1478 | ++chan->ifstats.tx_dropped; | ||
| 1479 | ++card->wandev.stats.tx_dropped; | ||
| 1480 | |||
| 1481 | } else { | ||
| 1482 | //FIXME: IPX is not implemented in this version of Frame Relay ? | ||
| 1483 | if((chan->common.usedby == WANPIPE) && | ||
| 1484 | sendpacket[1] == 0x00 && | ||
| 1485 | sendpacket[2] == 0x80 && | ||
| 1486 | sendpacket[6] == 0x81 && | ||
| 1487 | sendpacket[7] == 0x37) { | ||
| 1488 | |||
| 1489 | if( chan->enable_IPX ) { | ||
| 1490 | switch_net_numbers(sendpacket, | ||
| 1491 | chan->network_number, 0); | ||
| 1492 | } else { | ||
| 1493 | //FIXME: Take this out when IPX is fixed | ||
| 1494 | printk(KERN_INFO | ||
| 1495 | "%s: WARNING: Unsupported IPX data in send, packet dropped\n", | ||
| 1496 | card->devname); | ||
| 1497 | } | ||
| 1498 | |||
| 1499 | }else{ | ||
| 1500 | err = fr_send_data_header(card, chan->dlci, attr, skb->len, skb->data, chan->fr_header_len); | ||
| 1501 | if (err) { | ||
| 1502 | switch(err) { | ||
| 1503 | case FRRES_CIR_OVERFLOW: | ||
| 1504 | case FRRES_BUFFER_OVERFLOW: | ||
| 1505 | if (!setup_for_delayed_transmit(dev, skb)){ | ||
| 1506 | set_bit(1,&delay_tx_queued); | ||
| 1507 | } | ||
| 1508 | chan->drvstats_if_send. | ||
| 1509 | if_send_adptr_bfrs_full ++; | ||
| 1510 | break; | ||
| 1511 | |||
| 1512 | case FRRES_TOO_LONG: | ||
| 1513 | if (net_ratelimit()){ | ||
| 1514 | printk(KERN_INFO | ||
| 1515 | "%s: Error: Frame too long, transmission failed %i\n", | ||
| 1516 | card->devname, (unsigned int)skb->len); | ||
| 1517 | } | ||
| 1518 | /* Drop down to default */ | ||
| 1519 | default: | ||
| 1520 | chan->drvstats_if_send. | ||
| 1521 | if_send_dlci_disconnected ++; | ||
| 1522 | ++chan->ifstats.tx_dropped; | ||
| 1523 | ++card->wandev.stats.tx_dropped; | ||
| 1524 | break; | ||
| 1525 | } | ||
| 1526 | } else { | ||
| 1527 | chan->drvstats_if_send. | ||
| 1528 | if_send_bfr_passed_to_adptr++; | ||
| 1529 | ++chan->ifstats.tx_packets; | ||
| 1530 | ++card->wandev.stats.tx_packets; | ||
| 1531 | |||
| 1532 | chan->ifstats.tx_bytes += skb->len; | ||
| 1533 | card->wandev.stats.tx_bytes += skb->len; | ||
| 1534 | dev->trans_start = jiffies; | ||
| 1535 | } | ||
| 1536 | } | ||
| 1537 | } | ||
| 1538 | |||
| 1539 | if_send_start_and_exit: | ||
| 1540 | |||
| 1541 | netif_start_queue(dev); | ||
| 1542 | |||
| 1543 | /* If we queued the packet for transmission, we must not | ||
| 1544 | * deallocate it. The packet is unlinked from the IP stack | ||
| 1545 | * not copied. Therefore, we must keep the original packet */ | ||
| 1546 | if (!test_bit(1,&delay_tx_queued)) { | ||
| 1547 | dev_kfree_skb_any(skb); | ||
| 1548 | }else{ | ||
| 1549 | adptr_flags->imask |= FR_INTR_TXRDY; | ||
| 1550 | card->u.f.tx_interrupts_pending ++; | ||
| 1551 | } | ||
| 1552 | |||
| 1553 | clear_bit(SEND_CRIT, (void*)&card->wandev.critical); | ||
| 1554 | |||
| 1555 | s508_s514_unlock(card,&smp_flags); | ||
| 1556 | |||
| 1557 | return 0; | ||
| 1558 | } | ||
| 1559 | |||
| 1560 | |||
| 1561 | |||
| 1562 | /*============================================================================ | ||
| 1563 | * Setup so that a frame can be transmitted on the occurrence of a transmit | ||
| 1564 | * interrupt. | ||
| 1565 | */ | ||
| 1566 | static int setup_for_delayed_transmit(struct net_device* dev, | ||
| 1567 | struct sk_buff *skb) | ||
| 1568 | { | ||
| 1569 | fr_channel_t* chan = dev->priv; | ||
| 1570 | sdla_t* card = chan->card; | ||
| 1571 | fr_dlci_interface_t* dlci_interface; | ||
| 1572 | int len = skb->len; | ||
| 1573 | |||
| 1574 | /* Check that the dlci is properly configured, | ||
| 1575 | * before using tx interrupt */ | ||
| 1576 | if (!chan->dlci_int_interface){ | ||
| 1577 | if (net_ratelimit()){ | ||
| 1578 | printk(KERN_INFO | ||
| 1579 | "%s: ERROR on DLCI %i: Not configured properly !\n", | ||
| 1580 | card->devname, chan->dlci); | ||
| 1581 | printk(KERN_INFO "%s: Please contact Sangoma Technologies\n", | ||
| 1582 | card->devname); | ||
| 1583 | } | ||
| 1584 | return 1; | ||
| 1585 | } | ||
| 1586 | |||
| 1587 | dlci_interface = chan->dlci_int_interface; | ||
| 1588 | |||
| 1589 | if(chan->transmit_length) { | ||
| 1590 | printk(KERN_INFO "%s: Big mess in setup_for_del...\n", | ||
| 1591 | card->devname); | ||
| 1592 | return 1; | ||
| 1593 | } | ||
| 1594 | |||
| 1595 | if(len > FR_MAX_NO_DATA_BYTES_IN_FRAME) { | ||
| 1596 | //FIXME: increment some statistic */ | ||
| 1597 | return 1; | ||
| 1598 | } | ||
| 1599 | |||
| 1600 | chan->transmit_length = len; | ||
| 1601 | chan->delay_skb = skb; | ||
| 1602 | |||
| 1603 | dlci_interface->gen_interrupt |= FR_INTR_TXRDY; | ||
| 1604 | dlci_interface->packet_length = len; | ||
| 1605 | |||
| 1606 | /* Turn on TX interrupt at the end of if_send */ | ||
| 1607 | return 0; | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | |||
| 1611 | /*============================================================================ | ||
| 1612 | * Check to see if the packet to be transmitted contains a broadcast or | ||
| 1613 | * multicast source IP address. | ||
| 1614 | * Return 0 if not broadcast/multicast address, otherwise return 1. | ||
| 1615 | */ | ||
| 1616 | |||
| 1617 | static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev, | ||
| 1618 | struct sk_buff *skb) | ||
| 1619 | { | ||
| 1620 | u32 src_ip_addr; | ||
| 1621 | u32 broadcast_ip_addr = 0; | ||
| 1622 | struct in_device *in_dev; | ||
| 1623 | fr_channel_t* chan = dev->priv; | ||
| 1624 | |||
| 1625 | /* read the IP source address from the outgoing packet */ | ||
| 1626 | src_ip_addr = *(u32 *)(skb->data + 14); | ||
| 1627 | |||
| 1628 | /* read the IP broadcast address for the device */ | ||
| 1629 | in_dev = dev->ip_ptr; | ||
| 1630 | if(in_dev != NULL) { | ||
| 1631 | struct in_ifaddr *ifa= in_dev->ifa_list; | ||
| 1632 | if(ifa != NULL) | ||
| 1633 | broadcast_ip_addr = ifa->ifa_broadcast; | ||
| 1634 | else | ||
| 1635 | return 0; | ||
| 1636 | } | ||
| 1637 | |||
| 1638 | /* check if the IP Source Address is a Broadcast address */ | ||
| 1639 | if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) { | ||
| 1640 | printk(KERN_INFO | ||
| 1641 | "%s: Broadcast Source Address silently discarded\n", | ||
| 1642 | card->devname); | ||
| 1643 | return 1; | ||
| 1644 | } | ||
| 1645 | |||
| 1646 | /* check if the IP Source Address is a Multicast address */ | ||
| 1647 | if((chan->mc == WANOPT_NO) && (ntohl(src_ip_addr) >= 0xE0000001) && | ||
| 1648 | (ntohl(src_ip_addr) <= 0xFFFFFFFE)) { | ||
| 1649 | printk(KERN_INFO | ||
| 1650 | "%s: Multicast Source Address silently discarded\n", | ||
| 1651 | card->devname); | ||
| 1652 | return 1; | ||
| 1653 | } | ||
| 1654 | |||
| 1655 | return 0; | ||
| 1656 | } | ||
| 1657 | |||
| 1658 | /*============================================================================ | ||
| 1659 | * Reply to UDP Management system. | ||
| 1660 | * Return nothing. | ||
| 1661 | */ | ||
| 1662 | static int reply_udp( unsigned char *data, unsigned int mbox_len ) | ||
| 1663 | { | ||
| 1664 | unsigned short len, udp_length, temp, ip_length; | ||
| 1665 | unsigned long ip_temp; | ||
| 1666 | int even_bound = 0; | ||
| 1667 | |||
| 1668 | |||
| 1669 | fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)data; | ||
| 1670 | |||
| 1671 | /* Set length of packet */ | ||
| 1672 | len = //sizeof(fr_encap_hdr_t)+ | ||
| 1673 | sizeof(ip_pkt_t)+ | ||
| 1674 | sizeof(udp_pkt_t)+ | ||
| 1675 | sizeof(wp_mgmt_t)+ | ||
| 1676 | sizeof(cblock_t)+ | ||
| 1677 | mbox_len; | ||
| 1678 | |||
| 1679 | |||
| 1680 | /* fill in UDP reply */ | ||
| 1681 | fr_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; | ||
| 1682 | |||
| 1683 | /* fill in UDP length */ | ||
| 1684 | udp_length = sizeof(udp_pkt_t)+ | ||
| 1685 | sizeof(wp_mgmt_t)+ | ||
| 1686 | sizeof(cblock_t)+ | ||
| 1687 | mbox_len; | ||
| 1688 | |||
| 1689 | |||
| 1690 | /* put it on an even boundary */ | ||
| 1691 | if ( udp_length & 0x0001 ) { | ||
| 1692 | udp_length += 1; | ||
| 1693 | len += 1; | ||
| 1694 | even_bound = 1; | ||
| 1695 | } | ||
| 1696 | |||
| 1697 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1698 | fr_udp_pkt->udp_pkt.udp_length = temp; | ||
| 1699 | |||
| 1700 | /* swap UDP ports */ | ||
| 1701 | temp = fr_udp_pkt->udp_pkt.udp_src_port; | ||
| 1702 | fr_udp_pkt->udp_pkt.udp_src_port = | ||
| 1703 | fr_udp_pkt->udp_pkt.udp_dst_port; | ||
| 1704 | fr_udp_pkt->udp_pkt.udp_dst_port = temp; | ||
| 1705 | |||
| 1706 | |||
| 1707 | |||
| 1708 | /* add UDP pseudo header */ | ||
| 1709 | temp = 0x1100; | ||
| 1710 | *((unsigned short *) | ||
| 1711 | (fr_udp_pkt->data+mbox_len+even_bound)) = temp; | ||
| 1712 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1713 | *((unsigned short *) | ||
| 1714 | (fr_udp_pkt->data+mbox_len+even_bound+2)) = temp; | ||
| 1715 | |||
| 1716 | /* calculate UDP checksum */ | ||
| 1717 | fr_udp_pkt->udp_pkt.udp_checksum = 0; | ||
| 1718 | |||
| 1719 | fr_udp_pkt->udp_pkt.udp_checksum = | ||
| 1720 | calc_checksum(&data[UDP_OFFSET/*+sizeof(fr_encap_hdr_t)*/], | ||
| 1721 | udp_length+UDP_OFFSET); | ||
| 1722 | |||
| 1723 | /* fill in IP length */ | ||
| 1724 | ip_length = udp_length + sizeof(ip_pkt_t); | ||
| 1725 | temp = (ip_length<<8)|(ip_length>>8); | ||
| 1726 | fr_udp_pkt->ip_pkt.total_length = temp; | ||
| 1727 | |||
| 1728 | /* swap IP addresses */ | ||
| 1729 | ip_temp = fr_udp_pkt->ip_pkt.ip_src_address; | ||
| 1730 | fr_udp_pkt->ip_pkt.ip_src_address = | ||
| 1731 | fr_udp_pkt->ip_pkt.ip_dst_address; | ||
| 1732 | fr_udp_pkt->ip_pkt.ip_dst_address = ip_temp; | ||
| 1733 | |||
| 1734 | |||
| 1735 | /* fill in IP checksum */ | ||
| 1736 | fr_udp_pkt->ip_pkt.hdr_checksum = 0; | ||
| 1737 | fr_udp_pkt->ip_pkt.hdr_checksum = | ||
| 1738 | calc_checksum(&data[/*sizeof(fr_encap_hdr_t)*/0], | ||
| 1739 | sizeof(ip_pkt_t)); | ||
| 1740 | |||
| 1741 | return len; | ||
| 1742 | } /* reply_udp */ | ||
| 1743 | |||
| 1744 | unsigned short calc_checksum (char *data, int len) | ||
| 1745 | { | ||
| 1746 | unsigned short temp; | ||
| 1747 | unsigned long sum=0; | ||
| 1748 | int i; | ||
| 1749 | |||
| 1750 | for( i = 0; i <len; i+=2 ) { | ||
| 1751 | memcpy(&temp,&data[i],2); | ||
| 1752 | sum += (unsigned long)temp; | ||
| 1753 | } | ||
| 1754 | |||
| 1755 | while (sum >> 16 ) { | ||
| 1756 | sum = (sum & 0xffffUL) + (sum >> 16); | ||
| 1757 | } | ||
| 1758 | |||
| 1759 | temp = (unsigned short)sum; | ||
| 1760 | temp = ~temp; | ||
| 1761 | |||
| 1762 | if( temp == 0 ) | ||
| 1763 | temp = 0xffff; | ||
| 1764 | |||
| 1765 | return temp; | ||
| 1766 | } | ||
| 1767 | |||
| 1768 | /* | ||
| 1769 | If incoming is 0 (outgoing)- if the net numbers is ours make it 0 | ||
| 1770 | if incoming is 1 - if the net number is 0 make it ours | ||
| 1771 | |||
| 1772 | */ | ||
| 1773 | static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming) | ||
| 1774 | { | ||
| 1775 | unsigned long pnetwork_number; | ||
| 1776 | |||
| 1777 | pnetwork_number = (unsigned long)((sendpacket[14] << 24) + | ||
| 1778 | (sendpacket[15] << 16) + (sendpacket[16] << 8) + | ||
| 1779 | sendpacket[17]); | ||
| 1780 | |||
| 1781 | if (!incoming) { | ||
| 1782 | /* If the destination network number is ours, make it 0 */ | ||
| 1783 | if( pnetwork_number == network_number) { | ||
| 1784 | sendpacket[14] = sendpacket[15] = sendpacket[16] = | ||
| 1785 | sendpacket[17] = 0x00; | ||
| 1786 | } | ||
| 1787 | } else { | ||
| 1788 | /* If the incoming network is 0, make it ours */ | ||
| 1789 | if( pnetwork_number == 0) { | ||
| 1790 | sendpacket[14] = (unsigned char)(network_number >> 24); | ||
| 1791 | sendpacket[15] = (unsigned char)((network_number & | ||
| 1792 | 0x00FF0000) >> 16); | ||
| 1793 | sendpacket[16] = (unsigned char)((network_number & | ||
| 1794 | 0x0000FF00) >> 8); | ||
| 1795 | sendpacket[17] = (unsigned char)(network_number & | ||
| 1796 | 0x000000FF); | ||
| 1797 | } | ||
| 1798 | } | ||
| 1799 | |||
| 1800 | |||
| 1801 | pnetwork_number = (unsigned long)((sendpacket[26] << 24) + | ||
| 1802 | (sendpacket[27] << 16) + (sendpacket[28] << 8) + | ||
| 1803 | sendpacket[29]); | ||
| 1804 | |||
| 1805 | if( !incoming ) { | ||
| 1806 | /* If the source network is ours, make it 0 */ | ||
| 1807 | if( pnetwork_number == network_number) { | ||
| 1808 | sendpacket[26] = sendpacket[27] = sendpacket[28] = | ||
| 1809 | sendpacket[29] = 0x00; | ||
| 1810 | } | ||
| 1811 | } else { | ||
| 1812 | /* If the source network is 0, make it ours */ | ||
| 1813 | if( pnetwork_number == 0 ) { | ||
| 1814 | sendpacket[26] = (unsigned char)(network_number >> 24); | ||
| 1815 | sendpacket[27] = (unsigned char)((network_number & | ||
| 1816 | 0x00FF0000) >> 16); | ||
| 1817 | sendpacket[28] = (unsigned char)((network_number & | ||
| 1818 | 0x0000FF00) >> 8); | ||
| 1819 | sendpacket[29] = (unsigned char)(network_number & | ||
| 1820 | 0x000000FF); | ||
| 1821 | } | ||
| 1822 | } | ||
| 1823 | } /* switch_net_numbers */ | ||
| 1824 | |||
| 1825 | /*============================================================================ | ||
| 1826 | * Get ethernet-style interface statistics. | ||
| 1827 | * Return a pointer to struct enet_statistics. | ||
| 1828 | */ | ||
| 1829 | static struct net_device_stats *if_stats(struct net_device *dev) | ||
| 1830 | { | ||
| 1831 | fr_channel_t* chan = dev->priv; | ||
| 1832 | |||
| 1833 | if(chan == NULL) | ||
| 1834 | return NULL; | ||
| 1835 | |||
| 1836 | return &chan->ifstats; | ||
| 1837 | } | ||
| 1838 | |||
| 1839 | /****** Interrupt Handlers **************************************************/ | ||
| 1840 | |||
| 1841 | /*============================================================================ | ||
| 1842 | * fr_isr: S508 frame relay interrupt service routine. | ||
| 1843 | * | ||
| 1844 | * Description: | ||
| 1845 | * Frame relay main interrupt service route. This | ||
| 1846 | * function check the interrupt type and takes | ||
| 1847 | * the appropriate action. | ||
| 1848 | */ | ||
| 1849 | static void fr_isr (sdla_t* card) | ||
| 1850 | { | ||
| 1851 | fr508_flags_t* flags = card->flags; | ||
| 1852 | char *ptr = &flags->iflag; | ||
| 1853 | int i,err; | ||
| 1854 | fr_mbox_t* mbox = card->mbox; | ||
| 1855 | |||
| 1856 | /* This flag prevents nesting of interrupts. See sdla_isr() routine | ||
| 1857 | * in sdlamain.c. */ | ||
| 1858 | card->in_isr = 1; | ||
| 1859 | |||
| 1860 | ++card->statistics.isr_entry; | ||
| 1861 | |||
| 1862 | |||
| 1863 | /* All peripheral (configuraiton, re-configuration) events | ||
| 1864 | * take presidence over the ISR. Thus, retrigger */ | ||
| 1865 | if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) { | ||
| 1866 | ++card->statistics.isr_already_critical; | ||
| 1867 | goto fr_isr_exit; | ||
| 1868 | } | ||
| 1869 | |||
| 1870 | if(card->hw.type != SDLA_S514) { | ||
| 1871 | if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 1872 | printk(KERN_INFO "%s: Critical while in ISR: If Send Running!\n", | ||
| 1873 | card->devname); | ||
| 1874 | ++card->statistics.isr_already_critical; | ||
| 1875 | goto fr_isr_exit; | ||
| 1876 | } | ||
| 1877 | } | ||
| 1878 | |||
| 1879 | switch (flags->iflag) { | ||
| 1880 | |||
| 1881 | case FR_INTR_RXRDY: /* receive interrupt */ | ||
| 1882 | ++card->statistics.isr_rx; | ||
| 1883 | rx_intr(card); | ||
| 1884 | break; | ||
| 1885 | |||
| 1886 | |||
| 1887 | case FR_INTR_TXRDY: /* transmit interrupt */ | ||
| 1888 | ++ card->statistics.isr_tx; | ||
| 1889 | tx_intr(card); | ||
| 1890 | break; | ||
| 1891 | |||
| 1892 | case FR_INTR_READY: | ||
| 1893 | Intr_test_counter++; | ||
| 1894 | ++card->statistics.isr_intr_test; | ||
| 1895 | break; | ||
| 1896 | |||
| 1897 | case FR_INTR_DLC: /* Event interrupt occurred */ | ||
| 1898 | mbox->cmd.command = FR_READ_STATUS; | ||
| 1899 | mbox->cmd.length = 0; | ||
| 1900 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 1901 | if (err) | ||
| 1902 | fr_event(card, err, mbox); | ||
| 1903 | break; | ||
| 1904 | |||
| 1905 | case FR_INTR_TIMER: /* Timer interrupt */ | ||
| 1906 | timer_intr(card); | ||
| 1907 | break; | ||
| 1908 | |||
| 1909 | default: | ||
| 1910 | ++card->statistics.isr_spurious; | ||
| 1911 | spur_intr(card); | ||
| 1912 | printk(KERN_INFO "%s: Interrupt Type 0x%02X!\n", | ||
| 1913 | card->devname, flags->iflag); | ||
| 1914 | |||
| 1915 | printk(KERN_INFO "%s: ID Bytes = ",card->devname); | ||
| 1916 | for(i = 0; i < 8; i ++) | ||
| 1917 | printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i)); | ||
| 1918 | printk(KERN_INFO "\n"); | ||
| 1919 | |||
| 1920 | break; | ||
| 1921 | } | ||
| 1922 | |||
| 1923 | fr_isr_exit: | ||
| 1924 | |||
| 1925 | card->in_isr = 0; | ||
| 1926 | flags->iflag = 0; | ||
| 1927 | return; | ||
| 1928 | } | ||
| 1929 | |||
| 1930 | |||
| 1931 | |||
| 1932 | /*=========================================================== | ||
| 1933 | * rx_intr Receive interrupt handler. | ||
| 1934 | * | ||
| 1935 | * Description | ||
| 1936 | * Upon receiveing an interrupt: | ||
| 1937 | * 1. Check that the firmware is in sync with | ||
| 1938 | * the driver. | ||
| 1939 | * 2. Find an appropriate network interface | ||
| 1940 | * based on the received dlci number. | ||
| 1941 | * 3. Check that the netowrk interface exists | ||
| 1942 | * and that it's setup properly. | ||
| 1943 | * 4. Copy the data into an skb buffer. | ||
| 1944 | * 5. Check the packet type and take | ||
| 1945 | * appropriate acton: UPD, API, ARP or Data. | ||
| 1946 | */ | ||
| 1947 | |||
| 1948 | static void rx_intr (sdla_t* card) | ||
| 1949 | { | ||
| 1950 | fr_rx_buf_ctl_t* frbuf = card->rxmb; | ||
| 1951 | fr508_flags_t* flags = card->flags; | ||
| 1952 | fr_channel_t* chan; | ||
| 1953 | char *ptr = &flags->iflag; | ||
| 1954 | struct sk_buff* skb; | ||
| 1955 | struct net_device* dev; | ||
| 1956 | void* buf; | ||
| 1957 | unsigned dlci, len, offs, len_incl_hdr; | ||
| 1958 | int i, udp_type; | ||
| 1959 | |||
| 1960 | |||
| 1961 | /* Check that firmware buffers are in sync */ | ||
| 1962 | if (frbuf->flag != 0x01) { | ||
| 1963 | |||
| 1964 | printk(KERN_INFO | ||
| 1965 | "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n", | ||
| 1966 | card->devname, (unsigned)frbuf, frbuf->flag); | ||
| 1967 | |||
| 1968 | printk(KERN_INFO "%s: ID Bytes = ",card->devname); | ||
| 1969 | for(i = 0; i < 8; i ++) | ||
| 1970 | printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i)); | ||
| 1971 | printk(KERN_INFO "\n"); | ||
| 1972 | |||
| 1973 | ++card->statistics.rx_intr_corrupt_rx_bfr; | ||
| 1974 | |||
| 1975 | /* Bug Fix: Mar 6 2000 | ||
| 1976 | * If we get a corrupted mailbox, it means that driver | ||
| 1977 | * is out of sync with the firmware. There is no recovery. | ||
| 1978 | * If we don't turn off all interrupts for this card | ||
| 1979 | * the machine will crash. | ||
| 1980 | */ | ||
| 1981 | printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname); | ||
| 1982 | printk(KERN_INFO "Please contact Sangoma Technologies !\n"); | ||
| 1983 | fr_set_intr_mode(card, 0, 0, 0); | ||
| 1984 | return; | ||
| 1985 | } | ||
| 1986 | |||
| 1987 | len = frbuf->length; | ||
| 1988 | dlci = frbuf->dlci; | ||
| 1989 | offs = frbuf->offset; | ||
| 1990 | |||
| 1991 | /* Find the network interface for this packet */ | ||
| 1992 | dev = find_channel(card, dlci); | ||
| 1993 | |||
| 1994 | |||
| 1995 | /* Check that the network interface is active and | ||
| 1996 | * properly setup */ | ||
| 1997 | if (dev == NULL) { | ||
| 1998 | if( net_ratelimit()) { | ||
| 1999 | printk(KERN_INFO "%s: received data on unconfigured DLCI %d!\n", | ||
| 2000 | card->devname, dlci); | ||
| 2001 | } | ||
| 2002 | ++card->statistics.rx_intr_on_orphaned_DLCI; | ||
| 2003 | ++card->wandev.stats.rx_dropped; | ||
| 2004 | goto rx_done; | ||
| 2005 | } | ||
| 2006 | |||
| 2007 | if ((chan = dev->priv) == NULL){ | ||
| 2008 | if( net_ratelimit()) { | ||
| 2009 | printk(KERN_INFO "%s: received data on unconfigured DLCI %d!\n", | ||
| 2010 | card->devname, dlci); | ||
| 2011 | } | ||
| 2012 | ++card->statistics.rx_intr_on_orphaned_DLCI; | ||
| 2013 | ++card->wandev.stats.rx_dropped; | ||
| 2014 | goto rx_done; | ||
| 2015 | } | ||
| 2016 | |||
| 2017 | skb = dev_alloc_skb(len); | ||
| 2018 | |||
| 2019 | if (!netif_running(dev) || (skb == NULL)){ | ||
| 2020 | |||
| 2021 | ++chan->ifstats.rx_dropped; | ||
| 2022 | |||
| 2023 | if(skb == NULL) { | ||
| 2024 | if (net_ratelimit()) { | ||
| 2025 | printk(KERN_INFO | ||
| 2026 | "%s: no socket buffers available!\n", | ||
| 2027 | card->devname); | ||
| 2028 | } | ||
| 2029 | chan->drvstats_rx_intr.rx_intr_no_socket ++; | ||
| 2030 | } | ||
| 2031 | |||
| 2032 | if (!netif_running(dev)){ | ||
| 2033 | chan->drvstats_rx_intr. | ||
| 2034 | rx_intr_dev_not_started ++; | ||
| 2035 | if (skb){ | ||
| 2036 | dev_kfree_skb_any(skb); | ||
| 2037 | } | ||
| 2038 | } | ||
| 2039 | goto rx_done; | ||
| 2040 | } | ||
| 2041 | |||
| 2042 | /* Copy data from the board into the socket buffer */ | ||
| 2043 | if ((offs + len) > card->u.f.rx_top + 1) { | ||
| 2044 | unsigned tmp = card->u.f.rx_top - offs + 1; | ||
| 2045 | |||
| 2046 | buf = skb_put(skb, tmp); | ||
| 2047 | sdla_peek(&card->hw, offs, buf, tmp); | ||
| 2048 | offs = card->u.f.rx_base; | ||
| 2049 | len -= tmp; | ||
| 2050 | } | ||
| 2051 | |||
| 2052 | buf = skb_put(skb, len); | ||
| 2053 | sdla_peek(&card->hw, offs, buf, len); | ||
| 2054 | |||
| 2055 | |||
| 2056 | /* We got the packet from the bard. | ||
| 2057 | * Check the packet type and take appropriate action */ | ||
| 2058 | |||
| 2059 | udp_type = udp_pkt_type( skb, card ); | ||
| 2060 | |||
| 2061 | if(udp_type != UDP_INVALID_TYPE) { | ||
| 2062 | |||
| 2063 | /* UDP Debug packet received, store the | ||
| 2064 | * packet and handle it in timer interrupt */ | ||
| 2065 | |||
| 2066 | skb_pull(skb, 1); | ||
| 2067 | if (wanrouter_type_trans(skb, dev)){ | ||
| 2068 | if(store_udp_mgmt_pkt(udp_type,UDP_PKT_FRM_NETWORK,card,skb,dlci)){ | ||
| 2069 | |||
| 2070 | flags->imask |= FR_INTR_TIMER; | ||
| 2071 | |||
| 2072 | if (udp_type == UDP_FPIPE_TYPE){ | ||
| 2073 | ++chan->drvstats_rx_intr.rx_intr_PIPE_request; | ||
| 2074 | } | ||
| 2075 | } | ||
| 2076 | } | ||
| 2077 | |||
| 2078 | }else if (chan->common.usedby == API) { | ||
| 2079 | |||
| 2080 | /* We are in API mode. | ||
| 2081 | * Add an API header to the RAW packet | ||
| 2082 | * and queue it into a circular buffer. | ||
| 2083 | * Then kick the fr_bh() bottom half handler */ | ||
| 2084 | |||
| 2085 | api_rx_hdr_t* api_rx_hdr; | ||
| 2086 | chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack ++; | ||
| 2087 | chan->ifstats.rx_packets ++; | ||
| 2088 | card->wandev.stats.rx_packets ++; | ||
| 2089 | |||
| 2090 | chan->ifstats.rx_bytes += skb->len; | ||
| 2091 | card->wandev.stats.rx_bytes += skb->len; | ||
| 2092 | |||
| 2093 | skb_push(skb, sizeof(api_rx_hdr_t)); | ||
| 2094 | api_rx_hdr = (api_rx_hdr_t*)&skb->data[0x00]; | ||
| 2095 | api_rx_hdr->attr = frbuf->attr; | ||
| 2096 | api_rx_hdr->time_stamp = frbuf->tmstamp; | ||
| 2097 | |||
| 2098 | skb->protocol = htons(ETH_P_IP); | ||
| 2099 | skb->mac.raw = skb->data; | ||
| 2100 | skb->dev = dev; | ||
| 2101 | skb->pkt_type = WAN_PACKET_DATA; | ||
| 2102 | |||
| 2103 | bh_enqueue(dev, skb); | ||
| 2104 | |||
| 2105 | trigger_fr_bh(chan); | ||
| 2106 | |||
| 2107 | }else if (handle_IPXWAN(skb->data,chan->name,chan->enable_IPX, chan->network_number)){ | ||
| 2108 | |||
| 2109 | //FIXME: Frame Relay IPX is not supported, Yet ! | ||
| 2110 | //if (chan->enable_IPX) { | ||
| 2111 | // fr_send(card, dlci, 0, skb->len,skb->data); | ||
| 2112 | //} | ||
| 2113 | dev_kfree_skb_any(skb); | ||
| 2114 | |||
| 2115 | } else if (is_arp(skb->data)) { | ||
| 2116 | |||
| 2117 | /* ARP support enabled Mar 16 2000 | ||
| 2118 | * Process incoming ARP reply/request, setup | ||
| 2119 | * dynamic routes. */ | ||
| 2120 | |||
| 2121 | if (process_ARP((arphdr_1490_t *)skb->data, card, dev)) { | ||
| 2122 | if (net_ratelimit()){ | ||
| 2123 | printk (KERN_INFO | ||
| 2124 | "%s: Error processing ARP Packet.\n", | ||
| 2125 | card->devname); | ||
| 2126 | } | ||
| 2127 | } | ||
| 2128 | dev_kfree_skb_any(skb); | ||
| 2129 | |||
| 2130 | } else if (skb->data[0] != 0x03) { | ||
| 2131 | |||
| 2132 | if (net_ratelimit()) { | ||
| 2133 | printk(KERN_INFO "%s: Non IETF packet discarded.\n", | ||
| 2134 | card->devname); | ||
| 2135 | } | ||
| 2136 | dev_kfree_skb_any(skb); | ||
| 2137 | |||
| 2138 | } else { | ||
| 2139 | |||
| 2140 | len_incl_hdr = skb->len; | ||
| 2141 | /* Decapsulate packet and pass it up the | ||
| 2142 | protocol stack */ | ||
| 2143 | skb->dev = dev; | ||
| 2144 | |||
| 2145 | if (chan->common.usedby == BRIDGE || chan->common.usedby == BRIDGE_NODE){ | ||
| 2146 | |||
| 2147 | /* Make sure it's an Ethernet frame, otherwise drop it */ | ||
| 2148 | if (!memcmp(skb->data, "\x03\x00\x80\x00\x80\xC2\x00\x07", 8)) { | ||
| 2149 | skb_pull(skb, 8); | ||
| 2150 | skb->protocol=eth_type_trans(skb,dev); | ||
| 2151 | }else{ | ||
| 2152 | ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack; | ||
| 2153 | ++chan->ifstats.rx_errors; | ||
| 2154 | ++card->wandev.stats.rx_errors; | ||
| 2155 | goto rx_done; | ||
| 2156 | } | ||
| 2157 | }else{ | ||
| 2158 | |||
| 2159 | /* remove hardware header */ | ||
| 2160 | buf = skb_pull(skb, 1); | ||
| 2161 | |||
| 2162 | if (!wanrouter_type_trans(skb, dev)) { | ||
| 2163 | |||
| 2164 | /* can't decapsulate packet */ | ||
| 2165 | dev_kfree_skb_any(skb); | ||
| 2166 | |||
| 2167 | ++chan->drvstats_rx_intr.rx_intr_bfr_not_passed_to_stack; | ||
| 2168 | ++chan->ifstats.rx_errors; | ||
| 2169 | ++card->wandev.stats.rx_errors; | ||
| 2170 | goto rx_done; | ||
| 2171 | } | ||
| 2172 | skb->mac.raw = skb->data; | ||
| 2173 | } | ||
| 2174 | |||
| 2175 | |||
| 2176 | /* Send a packet up the IP stack */ | ||
| 2177 | skb->dev->last_rx = jiffies; | ||
| 2178 | netif_rx(skb); | ||
| 2179 | ++chan->drvstats_rx_intr.rx_intr_bfr_passed_to_stack; | ||
| 2180 | ++chan->ifstats.rx_packets; | ||
| 2181 | ++card->wandev.stats.rx_packets; | ||
| 2182 | |||
| 2183 | chan->ifstats.rx_bytes += len_incl_hdr; | ||
| 2184 | card->wandev.stats.rx_bytes += len_incl_hdr; | ||
| 2185 | } | ||
| 2186 | |||
| 2187 | rx_done: | ||
| 2188 | |||
| 2189 | /* Release buffer element and calculate a pointer to the next one */ | ||
| 2190 | frbuf->flag = 0; | ||
| 2191 | card->rxmb = ++frbuf; | ||
| 2192 | if ((void*)frbuf > card->u.f.rxmb_last) | ||
| 2193 | card->rxmb = card->u.f.rxmb_base; | ||
| 2194 | |||
| 2195 | } | ||
| 2196 | |||
| 2197 | /*================================================================== | ||
| 2198 | * tx_intr: Transmit interrupt handler. | ||
| 2199 | * | ||
| 2200 | * Rationale: | ||
| 2201 | * If the board is busy transmitting, if_send() will | ||
| 2202 | * buffers a single packet and turn on | ||
| 2203 | * the tx interrupt. Tx interrupt will be called | ||
| 2204 | * by the board, once the firmware can send more | ||
| 2205 | * data. Thus, no polling is required. | ||
| 2206 | * | ||
| 2207 | * Description: | ||
| 2208 | * Tx interrupt is called for each | ||
| 2209 | * configured dlci channel. Thus: | ||
| 2210 | * 1. Obtain the netowrk interface based on the | ||
| 2211 | * dlci number. | ||
| 2212 | * 2. Check that network interface is up and | ||
| 2213 | * properly setup. | ||
| 2214 | * 3. Check for a buffered packet. | ||
| 2215 | * 4. Transmit the packet. | ||
| 2216 | * 5. If we are in WANPIPE mode, mark the | ||
| 2217 | * NET_BH handler. | ||
| 2218 | * 6. If we are in API mode, kick | ||
| 2219 | * the AF_WANPIPE socket for more data. | ||
| 2220 | * | ||
| 2221 | */ | ||
| 2222 | static void tx_intr(sdla_t *card) | ||
| 2223 | { | ||
| 2224 | fr508_flags_t* flags = card->flags; | ||
| 2225 | fr_tx_buf_ctl_t* bctl; | ||
| 2226 | struct net_device* dev; | ||
| 2227 | fr_channel_t* chan; | ||
| 2228 | |||
| 2229 | if(card->hw.type == SDLA_S514){ | ||
| 2230 | bctl = (void*)(flags->tse_offs + card->hw.dpmbase); | ||
| 2231 | }else{ | ||
| 2232 | bctl = (void*)(flags->tse_offs - FR_MB_VECTOR + | ||
| 2233 | card->hw.dpmbase); | ||
| 2234 | } | ||
| 2235 | |||
| 2236 | /* Find the structure and make it unbusy */ | ||
| 2237 | dev = find_channel(card, flags->dlci); | ||
| 2238 | if (dev == NULL){ | ||
| 2239 | printk(KERN_INFO "NO DEV IN TX Interrupt\n"); | ||
| 2240 | goto end_of_tx_intr; | ||
| 2241 | } | ||
| 2242 | |||
| 2243 | if ((chan = dev->priv) == NULL){ | ||
| 2244 | printk(KERN_INFO "NO CHAN IN TX Interrupt\n"); | ||
| 2245 | goto end_of_tx_intr; | ||
| 2246 | } | ||
| 2247 | |||
| 2248 | if(!chan->transmit_length || !chan->delay_skb) { | ||
| 2249 | printk(KERN_INFO "%s: tx int error - transmit length zero\n", | ||
| 2250 | card->wandev.name); | ||
| 2251 | goto end_of_tx_intr; | ||
| 2252 | } | ||
| 2253 | |||
| 2254 | /* If the 'if_send()' procedure is currently checking the 'tbusy' | ||
| 2255 | status, then we cannot transmit. Instead, we configure the microcode | ||
| 2256 | so as to re-issue this transmit interrupt at a later stage. | ||
| 2257 | */ | ||
| 2258 | if (test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) { | ||
| 2259 | |||
| 2260 | fr_dlci_interface_t* dlci_interface = chan->dlci_int_interface; | ||
| 2261 | bctl->flag = 0xA0; | ||
| 2262 | dlci_interface->gen_interrupt |= FR_INTR_TXRDY; | ||
| 2263 | return; | ||
| 2264 | |||
| 2265 | }else{ | ||
| 2266 | bctl->dlci = flags->dlci; | ||
| 2267 | bctl->length = chan->transmit_length+chan->fr_header_len; | ||
| 2268 | sdla_poke(&card->hw, | ||
| 2269 | fr_send_hdr(card,bctl->dlci,bctl->offset), | ||
| 2270 | chan->delay_skb->data, | ||
| 2271 | chan->delay_skb->len); | ||
| 2272 | bctl->flag = 0xC0; | ||
| 2273 | |||
| 2274 | ++chan->ifstats.tx_packets; | ||
| 2275 | ++card->wandev.stats.tx_packets; | ||
| 2276 | chan->ifstats.tx_bytes += chan->transmit_length; | ||
| 2277 | card->wandev.stats.tx_bytes += chan->transmit_length; | ||
| 2278 | |||
| 2279 | /* We must free an sk buffer, which we used | ||
| 2280 | * for delayed transmission; Otherwise, the sock | ||
| 2281 | * will run out of memory */ | ||
| 2282 | dev_kfree_skb_any(chan->delay_skb); | ||
| 2283 | |||
| 2284 | chan->delay_skb = NULL; | ||
| 2285 | chan->transmit_length = 0; | ||
| 2286 | |||
| 2287 | dev->trans_start = jiffies; | ||
| 2288 | |||
| 2289 | if (netif_queue_stopped(dev)){ | ||
| 2290 | /* If using API, than wakeup socket BH handler */ | ||
| 2291 | if (chan->common.usedby == API){ | ||
| 2292 | netif_start_queue(dev); | ||
| 2293 | wakeup_sk_bh(dev); | ||
| 2294 | }else{ | ||
| 2295 | netif_wake_queue(dev); | ||
| 2296 | } | ||
| 2297 | } | ||
| 2298 | } | ||
| 2299 | |||
| 2300 | end_of_tx_intr: | ||
| 2301 | |||
| 2302 | /* if any other interfaces have transmit interrupts pending, | ||
| 2303 | * do not disable the global transmit interrupt */ | ||
| 2304 | if(!(-- card->u.f.tx_interrupts_pending)) | ||
| 2305 | flags->imask &= ~FR_INTR_TXRDY; | ||
| 2306 | |||
| 2307 | |||
| 2308 | } | ||
| 2309 | |||
| 2310 | |||
| 2311 | /*============================================================================ | ||
| 2312 | * timer_intr: Timer interrupt handler. | ||
| 2313 | * | ||
| 2314 | * Rationale: | ||
| 2315 | * All commans must be executed within the timer | ||
| 2316 | * interrupt since no two commands should execute | ||
| 2317 | * at the same time. | ||
| 2318 | * | ||
| 2319 | * Description: | ||
| 2320 | * The timer interrupt is used to: | ||
| 2321 | * 1. Processing udp calls from 'fpipemon'. | ||
| 2322 | * 2. Processing update calls from /proc file system | ||
| 2323 | * 3. Reading board-level statistics for | ||
| 2324 | * updating the proc file system. | ||
| 2325 | * 4. Sending inverse ARP request packets. | ||
| 2326 | * 5. Configure a dlci/channel. | ||
| 2327 | * 6. Unconfigure a dlci/channel. (Node only) | ||
| 2328 | */ | ||
| 2329 | |||
| 2330 | static void timer_intr(sdla_t *card) | ||
| 2331 | { | ||
| 2332 | fr508_flags_t* flags = card->flags; | ||
| 2333 | |||
| 2334 | /* UDP Debuging: fpipemon call */ | ||
| 2335 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UDP) { | ||
| 2336 | if(card->u.f.udp_type == UDP_FPIPE_TYPE) { | ||
| 2337 | if(process_udp_mgmt_pkt(card)) { | ||
| 2338 | card->u.f.timer_int_enabled &= | ||
| 2339 | ~TMR_INT_ENABLED_UDP; | ||
| 2340 | } | ||
| 2341 | } | ||
| 2342 | } | ||
| 2343 | |||
| 2344 | /* /proc update call : triggered from update() */ | ||
| 2345 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE) { | ||
| 2346 | fr_get_err_stats(card); | ||
| 2347 | fr_get_stats(card); | ||
| 2348 | card->u.f.update_comms_stats = 0; | ||
| 2349 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; | ||
| 2350 | } | ||
| 2351 | |||
| 2352 | /* Update the channel state call. This is call is | ||
| 2353 | * triggered by if_send() function */ | ||
| 2354 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UPDATE_STATE){ | ||
| 2355 | struct net_device *dev; | ||
| 2356 | if (card->wandev.state == WAN_CONNECTED){ | ||
| 2357 | for (dev = card->wandev.dev; dev; | ||
| 2358 | dev = *((struct net_device **)dev->priv)){ | ||
| 2359 | fr_channel_t *chan = dev->priv; | ||
| 2360 | if (chan->common.state != WAN_CONNECTED){ | ||
| 2361 | update_chan_state(dev); | ||
| 2362 | } | ||
| 2363 | } | ||
| 2364 | } | ||
| 2365 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE_STATE; | ||
| 2366 | } | ||
| 2367 | |||
| 2368 | /* configure a dlci/channel */ | ||
| 2369 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_CONFIG){ | ||
| 2370 | config_fr(card); | ||
| 2371 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG; | ||
| 2372 | } | ||
| 2373 | |||
| 2374 | /* unconfigure a dlci/channel */ | ||
| 2375 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG){ | ||
| 2376 | unconfig_fr(card); | ||
| 2377 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG; | ||
| 2378 | } | ||
| 2379 | |||
| 2380 | |||
| 2381 | /* Transmit ARP packets */ | ||
| 2382 | if (card->u.f.timer_int_enabled & TMR_INT_ENABLED_ARP){ | ||
| 2383 | int i=0; | ||
| 2384 | struct net_device *dev; | ||
| 2385 | |||
| 2386 | if (card->u.f.arp_dev == NULL) | ||
| 2387 | card->u.f.arp_dev = card->wandev.dev; | ||
| 2388 | |||
| 2389 | dev = card->u.f.arp_dev; | ||
| 2390 | |||
| 2391 | for (;;){ | ||
| 2392 | |||
| 2393 | fr_channel_t *chan = dev->priv; | ||
| 2394 | |||
| 2395 | /* If the interface is brought down cancel sending In-ARPs */ | ||
| 2396 | if (!(dev->flags&IFF_UP)){ | ||
| 2397 | clear_bit(0,&chan->inarp_ready); | ||
| 2398 | } | ||
| 2399 | |||
| 2400 | if (test_bit(0,&chan->inarp_ready)){ | ||
| 2401 | |||
| 2402 | if (check_tx_status(card,dev)){ | ||
| 2403 | set_bit(ARP_CRIT,&card->wandev.critical); | ||
| 2404 | break; | ||
| 2405 | } | ||
| 2406 | |||
| 2407 | if (!send_inarp_request(card,dev)){ | ||
| 2408 | trigger_fr_arp(dev); | ||
| 2409 | chan->inarp_tick = jiffies; | ||
| 2410 | } | ||
| 2411 | |||
| 2412 | clear_bit(0,&chan->inarp_ready); | ||
| 2413 | dev = move_dev_to_next(card,dev); | ||
| 2414 | break; | ||
| 2415 | } | ||
| 2416 | dev = move_dev_to_next(card,dev); | ||
| 2417 | |||
| 2418 | if (++i == card->wandev.new_if_cnt){ | ||
| 2419 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_ARP; | ||
| 2420 | break; | ||
| 2421 | } | ||
| 2422 | } | ||
| 2423 | card->u.f.arp_dev = dev; | ||
| 2424 | } | ||
| 2425 | |||
| 2426 | if(!card->u.f.timer_int_enabled) | ||
| 2427 | flags->imask &= ~FR_INTR_TIMER; | ||
| 2428 | } | ||
| 2429 | |||
| 2430 | |||
| 2431 | /*============================================================================ | ||
| 2432 | * spur_intr: Spurious interrupt handler. | ||
| 2433 | * | ||
| 2434 | * Description: | ||
| 2435 | * We don't know this interrupt. | ||
| 2436 | * Print a warning. | ||
| 2437 | */ | ||
| 2438 | |||
| 2439 | static void spur_intr (sdla_t* card) | ||
| 2440 | { | ||
| 2441 | if (net_ratelimit()){ | ||
| 2442 | printk(KERN_INFO "%s: spurious interrupt!\n", card->devname); | ||
| 2443 | } | ||
| 2444 | } | ||
| 2445 | |||
| 2446 | |||
| 2447 | //FIXME: Fix the IPX in next version | ||
| 2448 | /*=========================================================================== | ||
| 2449 | * Return 0 for non-IPXWAN packet | ||
| 2450 | * 1 for IPXWAN packet or IPX is not enabled! | ||
| 2451 | * FIXME: Use a IPX structure here not offsets | ||
| 2452 | */ | ||
| 2453 | static int handle_IPXWAN(unsigned char *sendpacket, | ||
| 2454 | char *devname, unsigned char enable_IPX, | ||
| 2455 | unsigned long network_number) | ||
| 2456 | { | ||
| 2457 | int i; | ||
| 2458 | |||
| 2459 | if( sendpacket[1] == 0x00 && sendpacket[2] == 0x80 && | ||
| 2460 | sendpacket[6] == 0x81 && sendpacket[7] == 0x37) { | ||
| 2461 | |||
| 2462 | /* It's an IPX packet */ | ||
| 2463 | if (!enable_IPX){ | ||
| 2464 | /* Return 1 so we don't pass it up the stack. */ | ||
| 2465 | //FIXME: Take this out when IPX is fixed | ||
| 2466 | if (net_ratelimit()){ | ||
| 2467 | printk (KERN_INFO | ||
| 2468 | "%s: WARNING: Unsupported IPX packet received and dropped\n", | ||
| 2469 | devname); | ||
| 2470 | } | ||
| 2471 | return 1; | ||
| 2472 | } | ||
| 2473 | } else { | ||
| 2474 | /* It's not IPX so return and pass it up the stack. */ | ||
| 2475 | return 0; | ||
| 2476 | } | ||
| 2477 | |||
| 2478 | if( sendpacket[24] == 0x90 && sendpacket[25] == 0x04){ | ||
| 2479 | /* It's IPXWAN */ | ||
| 2480 | |||
| 2481 | if( sendpacket[10] == 0x02 && sendpacket[42] == 0x00){ | ||
| 2482 | |||
| 2483 | /* It's a timer request packet */ | ||
| 2484 | printk(KERN_INFO "%s: Received IPXWAN Timer Request packet\n", | ||
| 2485 | devname); | ||
| 2486 | |||
| 2487 | /* Go through the routing options and answer no to every | ||
| 2488 | * option except Unnumbered RIP/SAP | ||
| 2489 | */ | ||
| 2490 | for(i = 49; sendpacket[i] == 0x00; i += 5){ | ||
| 2491 | /* 0x02 is the option for Unnumbered RIP/SAP */ | ||
| 2492 | if( sendpacket[i + 4] != 0x02){ | ||
| 2493 | sendpacket[i + 1] = 0; | ||
| 2494 | } | ||
| 2495 | } | ||
| 2496 | |||
| 2497 | /* Skip over the extended Node ID option */ | ||
| 2498 | if( sendpacket[i] == 0x04 ){ | ||
| 2499 | i += 8; | ||
| 2500 | } | ||
| 2501 | |||
| 2502 | /* We also want to turn off all header compression opt. | ||
| 2503 | */ | ||
| 2504 | for(; sendpacket[i] == 0x80 ;){ | ||
| 2505 | sendpacket[i + 1] = 0; | ||
| 2506 | i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4; | ||
| 2507 | } | ||
| 2508 | |||
| 2509 | /* Set the packet type to timer response */ | ||
| 2510 | sendpacket[42] = 0x01; | ||
| 2511 | |||
| 2512 | printk(KERN_INFO "%s: Sending IPXWAN Timer Response\n", | ||
| 2513 | devname); | ||
| 2514 | |||
| 2515 | } else if( sendpacket[42] == 0x02 ){ | ||
| 2516 | |||
| 2517 | /* This is an information request packet */ | ||
| 2518 | printk(KERN_INFO | ||
| 2519 | "%s: Received IPXWAN Information Request packet\n", | ||
| 2520 | devname); | ||
| 2521 | |||
| 2522 | /* Set the packet type to information response */ | ||
| 2523 | sendpacket[42] = 0x03; | ||
| 2524 | |||
| 2525 | /* Set the router name */ | ||
| 2526 | sendpacket[59] = 'F'; | ||
| 2527 | sendpacket[60] = 'P'; | ||
| 2528 | sendpacket[61] = 'I'; | ||
| 2529 | sendpacket[62] = 'P'; | ||
| 2530 | sendpacket[63] = 'E'; | ||
| 2531 | sendpacket[64] = '-'; | ||
| 2532 | sendpacket[65] = CVHexToAscii(network_number >> 28); | ||
| 2533 | sendpacket[66] = CVHexToAscii((network_number & 0x0F000000)>> 24); | ||
| 2534 | sendpacket[67] = CVHexToAscii((network_number & 0x00F00000)>> 20); | ||
| 2535 | sendpacket[68] = CVHexToAscii((network_number & 0x000F0000)>> 16); | ||
| 2536 | sendpacket[69] = CVHexToAscii((network_number & 0x0000F000)>> 12); | ||
| 2537 | sendpacket[70] = CVHexToAscii((network_number & 0x00000F00)>> 8); | ||
| 2538 | sendpacket[71] = CVHexToAscii((network_number & 0x000000F0)>> 4); | ||
| 2539 | sendpacket[72] = CVHexToAscii(network_number & 0x0000000F); | ||
| 2540 | for(i = 73; i < 107; i+= 1) | ||
| 2541 | { | ||
| 2542 | sendpacket[i] = 0; | ||
| 2543 | } | ||
| 2544 | |||
| 2545 | printk(KERN_INFO "%s: Sending IPXWAN Information Response packet\n", | ||
| 2546 | devname); | ||
| 2547 | } else { | ||
| 2548 | |||
| 2549 | printk(KERN_INFO "%s: Unknown IPXWAN packet!\n",devname); | ||
| 2550 | return 0; | ||
| 2551 | } | ||
| 2552 | |||
| 2553 | /* Set the WNodeID to our network address */ | ||
| 2554 | sendpacket[43] = (unsigned char)(network_number >> 24); | ||
| 2555 | sendpacket[44] = (unsigned char)((network_number & 0x00FF0000) >> 16); | ||
| 2556 | sendpacket[45] = (unsigned char)((network_number & 0x0000FF00) >> 8); | ||
| 2557 | sendpacket[46] = (unsigned char)(network_number & 0x000000FF); | ||
| 2558 | |||
| 2559 | return 1; | ||
| 2560 | } | ||
| 2561 | |||
| 2562 | /* If we get here, it's an IPX-data packet so it'll get passed up the | ||
| 2563 | * stack. | ||
| 2564 | * switch the network numbers | ||
| 2565 | */ | ||
| 2566 | switch_net_numbers(sendpacket, network_number ,1); | ||
| 2567 | return 0; | ||
| 2568 | } | ||
| 2569 | /*============================================================================ | ||
| 2570 | * process_route | ||
| 2571 | * | ||
| 2572 | * Rationale: | ||
| 2573 | * If the interface goes down, or we receive an ARP request, | ||
| 2574 | * we have to change the network interface ip addresses. | ||
| 2575 | * This cannot be done within the interrupt. | ||
| 2576 | * | ||
| 2577 | * Description: | ||
| 2578 | * | ||
| 2579 | * This routine is called as a polling routine to dynamically | ||
| 2580 | * add/delete routes negotiated by inverse ARP. It is in this | ||
| 2581 | * "task" because we don't want routes to be added while in | ||
| 2582 | * interrupt context. | ||
| 2583 | * | ||
| 2584 | * Usage: | ||
| 2585 | * This function is called by fr_poll() polling funtion. | ||
| 2586 | */ | ||
| 2587 | |||
| 2588 | static void process_route(struct net_device *dev) | ||
| 2589 | { | ||
| 2590 | fr_channel_t *chan = dev->priv; | ||
| 2591 | sdla_t *card = chan->card; | ||
| 2592 | |||
| 2593 | struct ifreq if_info; | ||
| 2594 | struct sockaddr_in *if_data; | ||
| 2595 | mm_segment_t fs = get_fs(); | ||
| 2596 | u32 ip_tmp; | ||
| 2597 | int err; | ||
| 2598 | |||
| 2599 | |||
| 2600 | switch(chan->route_flag){ | ||
| 2601 | |||
| 2602 | case ADD_ROUTE: | ||
| 2603 | |||
| 2604 | /* Set remote addresses */ | ||
| 2605 | memset(&if_info, 0, sizeof(if_info)); | ||
| 2606 | strcpy(if_info.ifr_name, dev->name); | ||
| 2607 | |||
| 2608 | set_fs(get_ds()); /* get user space block */ | ||
| 2609 | |||
| 2610 | if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2611 | if_data->sin_addr.s_addr = chan->ip_remote; | ||
| 2612 | if_data->sin_family = AF_INET; | ||
| 2613 | err = devinet_ioctl( SIOCSIFDSTADDR, &if_info ); | ||
| 2614 | |||
| 2615 | set_fs(fs); /* restore old block */ | ||
| 2616 | |||
| 2617 | if (err) { | ||
| 2618 | printk(KERN_INFO | ||
| 2619 | "%s: Route Add failed. Error: %d\n", | ||
| 2620 | card->devname,err); | ||
| 2621 | printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n", | ||
| 2622 | chan->name, NIPQUAD(chan->ip_remote)); | ||
| 2623 | |||
| 2624 | }else { | ||
| 2625 | printk(KERN_INFO "%s: Route Added Successfully: %u.%u.%u.%u\n", | ||
| 2626 | card->devname,NIPQUAD(chan->ip_remote)); | ||
| 2627 | chan->route_flag = ROUTE_ADDED; | ||
| 2628 | } | ||
| 2629 | break; | ||
| 2630 | |||
| 2631 | case REMOVE_ROUTE: | ||
| 2632 | |||
| 2633 | /* Set remote addresses */ | ||
| 2634 | memset(&if_info, 0, sizeof(if_info)); | ||
| 2635 | strcpy(if_info.ifr_name, dev->name); | ||
| 2636 | |||
| 2637 | ip_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP); | ||
| 2638 | |||
| 2639 | set_fs(get_ds()); /* get user space block */ | ||
| 2640 | |||
| 2641 | if_data = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2642 | if_data->sin_addr.s_addr = 0; | ||
| 2643 | if_data->sin_family = AF_INET; | ||
| 2644 | err = devinet_ioctl( SIOCSIFDSTADDR, &if_info ); | ||
| 2645 | |||
| 2646 | set_fs(fs); | ||
| 2647 | |||
| 2648 | if (err) { | ||
| 2649 | printk(KERN_INFO | ||
| 2650 | "%s: Deleting of route failed. Error: %d\n", | ||
| 2651 | card->devname,err); | ||
| 2652 | printk(KERN_INFO "%s: Address: %u.%u.%u.%u\n", | ||
| 2653 | dev->name,NIPQUAD(chan->ip_remote) ); | ||
| 2654 | |||
| 2655 | } else { | ||
| 2656 | printk(KERN_INFO "%s: Route Removed Sucessfuly: %u.%u.%u.%u\n", | ||
| 2657 | card->devname,NIPQUAD(ip_tmp)); | ||
| 2658 | chan->route_flag = NO_ROUTE; | ||
| 2659 | } | ||
| 2660 | break; | ||
| 2661 | |||
| 2662 | } /* Case Statement */ | ||
| 2663 | |||
| 2664 | } | ||
| 2665 | |||
| 2666 | |||
| 2667 | |||
| 2668 | /****** Frame Relay Firmware-Specific Functions *****************************/ | ||
| 2669 | |||
| 2670 | /*============================================================================ | ||
| 2671 | * Read firmware code version. | ||
| 2672 | * o fill string str with firmware version info. | ||
| 2673 | */ | ||
| 2674 | static int fr_read_version (sdla_t* card, char* str) | ||
| 2675 | { | ||
| 2676 | fr_mbox_t* mbox = card->mbox; | ||
| 2677 | int retry = MAX_CMD_RETRY; | ||
| 2678 | int err; | ||
| 2679 | |||
| 2680 | do | ||
| 2681 | { | ||
| 2682 | mbox->cmd.command = FR_READ_CODE_VERSION; | ||
| 2683 | mbox->cmd.length = 0; | ||
| 2684 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2685 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2686 | |||
| 2687 | if (!err && str) { | ||
| 2688 | int len = mbox->cmd.length; | ||
| 2689 | memcpy(str, mbox->data, len); | ||
| 2690 | str[len] = '\0'; | ||
| 2691 | } | ||
| 2692 | return err; | ||
| 2693 | } | ||
| 2694 | |||
| 2695 | /*============================================================================ | ||
| 2696 | * Set global configuration. | ||
| 2697 | */ | ||
| 2698 | static int fr_configure (sdla_t* card, fr_conf_t *conf) | ||
| 2699 | { | ||
| 2700 | fr_mbox_t* mbox = card->mbox; | ||
| 2701 | int retry = MAX_CMD_RETRY; | ||
| 2702 | int dlci_num = card->u.f.dlci_num; | ||
| 2703 | int err, i; | ||
| 2704 | |||
| 2705 | do | ||
| 2706 | { | ||
| 2707 | memcpy(mbox->data, conf, sizeof(fr_conf_t)); | ||
| 2708 | |||
| 2709 | if (dlci_num) for (i = 0; i < dlci_num; ++i) | ||
| 2710 | ((fr_conf_t*)mbox->data)->dlci[i] = | ||
| 2711 | card->u.f.node_dlci[i]; | ||
| 2712 | |||
| 2713 | mbox->cmd.command = FR_SET_CONFIG; | ||
| 2714 | mbox->cmd.length = | ||
| 2715 | sizeof(fr_conf_t) + dlci_num * sizeof(short); | ||
| 2716 | |||
| 2717 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2718 | |||
| 2719 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2720 | |||
| 2721 | /*NC Oct 12 2000 */ | ||
| 2722 | if (err != CMD_OK){ | ||
| 2723 | printk(KERN_ERR "%s: Frame Relay Configuration Failed: rc=0x%x\n", | ||
| 2724 | card->devname,err); | ||
| 2725 | } | ||
| 2726 | |||
| 2727 | return err; | ||
| 2728 | } | ||
| 2729 | |||
| 2730 | /*============================================================================ | ||
| 2731 | * Set DLCI configuration. | ||
| 2732 | */ | ||
| 2733 | static int fr_dlci_configure (sdla_t* card, fr_dlc_conf_t *conf, unsigned dlci) | ||
| 2734 | { | ||
| 2735 | fr_mbox_t* mbox = card->mbox; | ||
| 2736 | int retry = MAX_CMD_RETRY; | ||
| 2737 | int err; | ||
| 2738 | |||
| 2739 | do | ||
| 2740 | { | ||
| 2741 | memcpy(mbox->data, conf, sizeof(fr_dlc_conf_t)); | ||
| 2742 | mbox->cmd.dlci = (unsigned short) dlci; | ||
| 2743 | mbox->cmd.command = FR_SET_CONFIG; | ||
| 2744 | mbox->cmd.length = sizeof(fr_dlc_conf_t); | ||
| 2745 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2746 | } while (err && retry--); | ||
| 2747 | |||
| 2748 | return err; | ||
| 2749 | } | ||
| 2750 | /*============================================================================ | ||
| 2751 | * Set interrupt mode. | ||
| 2752 | */ | ||
| 2753 | static int fr_set_intr_mode (sdla_t* card, unsigned mode, unsigned mtu, | ||
| 2754 | unsigned short timeout) | ||
| 2755 | { | ||
| 2756 | fr_mbox_t* mbox = card->mbox; | ||
| 2757 | fr508_intr_ctl_t* ictl = (void*)mbox->data; | ||
| 2758 | int retry = MAX_CMD_RETRY; | ||
| 2759 | int err; | ||
| 2760 | |||
| 2761 | do | ||
| 2762 | { | ||
| 2763 | memset(ictl, 0, sizeof(fr508_intr_ctl_t)); | ||
| 2764 | ictl->mode = mode; | ||
| 2765 | ictl->tx_len = mtu; | ||
| 2766 | ictl->irq = card->hw.irq; | ||
| 2767 | |||
| 2768 | /* indicate timeout on timer */ | ||
| 2769 | if (mode & 0x20) ictl->timeout = timeout; | ||
| 2770 | |||
| 2771 | mbox->cmd.length = sizeof(fr508_intr_ctl_t); | ||
| 2772 | mbox->cmd.command = FR_SET_INTR_MODE; | ||
| 2773 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2774 | |||
| 2775 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2776 | |||
| 2777 | return err; | ||
| 2778 | } | ||
| 2779 | |||
| 2780 | /*============================================================================ | ||
| 2781 | * Enable communications. | ||
| 2782 | */ | ||
| 2783 | static int fr_comm_enable (sdla_t* card) | ||
| 2784 | { | ||
| 2785 | fr_mbox_t* mbox = card->mbox; | ||
| 2786 | int retry = MAX_CMD_RETRY; | ||
| 2787 | int err; | ||
| 2788 | |||
| 2789 | do | ||
| 2790 | { | ||
| 2791 | mbox->cmd.command = FR_COMM_ENABLE; | ||
| 2792 | mbox->cmd.length = 0; | ||
| 2793 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2794 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2795 | |||
| 2796 | return err; | ||
| 2797 | } | ||
| 2798 | |||
| 2799 | /*============================================================================ | ||
| 2800 | * fr_comm_disable | ||
| 2801 | * | ||
| 2802 | * Warning: This functin is called by the shutdown() procedure. It is void | ||
| 2803 | * since dev->priv are has already been deallocated and no | ||
| 2804 | * error checking is possible using fr_event() function. | ||
| 2805 | */ | ||
| 2806 | static void fr_comm_disable (sdla_t* card) | ||
| 2807 | { | ||
| 2808 | fr_mbox_t* mbox = card->mbox; | ||
| 2809 | int retry = MAX_CMD_RETRY; | ||
| 2810 | int err; | ||
| 2811 | |||
| 2812 | do { | ||
| 2813 | mbox->cmd.command = FR_SET_MODEM_STATUS; | ||
| 2814 | mbox->cmd.length = 1; | ||
| 2815 | mbox->data[0] = 0; | ||
| 2816 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2817 | } while (err && retry--); | ||
| 2818 | |||
| 2819 | retry = MAX_CMD_RETRY; | ||
| 2820 | |||
| 2821 | do | ||
| 2822 | { | ||
| 2823 | mbox->cmd.command = FR_COMM_DISABLE; | ||
| 2824 | mbox->cmd.length = 0; | ||
| 2825 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2826 | } while (err && retry--); | ||
| 2827 | |||
| 2828 | return; | ||
| 2829 | } | ||
| 2830 | |||
| 2831 | |||
| 2832 | |||
| 2833 | /*============================================================================ | ||
| 2834 | * Get communications error statistics. | ||
| 2835 | */ | ||
| 2836 | static int fr_get_err_stats (sdla_t* card) | ||
| 2837 | { | ||
| 2838 | fr_mbox_t* mbox = card->mbox; | ||
| 2839 | int retry = MAX_CMD_RETRY; | ||
| 2840 | int err; | ||
| 2841 | |||
| 2842 | |||
| 2843 | do | ||
| 2844 | { | ||
| 2845 | mbox->cmd.command = FR_READ_ERROR_STATS; | ||
| 2846 | mbox->cmd.length = 0; | ||
| 2847 | mbox->cmd.dlci = 0; | ||
| 2848 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2849 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2850 | |||
| 2851 | if (!err) { | ||
| 2852 | fr_comm_stat_t* stats = (void*)mbox->data; | ||
| 2853 | card->wandev.stats.rx_over_errors = stats->rx_overruns; | ||
| 2854 | card->wandev.stats.rx_crc_errors = stats->rx_bad_crc; | ||
| 2855 | card->wandev.stats.rx_missed_errors = stats->rx_aborts; | ||
| 2856 | card->wandev.stats.rx_length_errors = stats->rx_too_long; | ||
| 2857 | card->wandev.stats.tx_aborted_errors = stats->tx_aborts; | ||
| 2858 | |||
| 2859 | } | ||
| 2860 | |||
| 2861 | return err; | ||
| 2862 | } | ||
| 2863 | |||
| 2864 | /*============================================================================ | ||
| 2865 | * Get statistics. | ||
| 2866 | */ | ||
| 2867 | static int fr_get_stats (sdla_t* card) | ||
| 2868 | { | ||
| 2869 | fr_mbox_t* mbox = card->mbox; | ||
| 2870 | int retry = MAX_CMD_RETRY; | ||
| 2871 | int err; | ||
| 2872 | |||
| 2873 | |||
| 2874 | do | ||
| 2875 | { | ||
| 2876 | mbox->cmd.command = FR_READ_STATISTICS; | ||
| 2877 | mbox->cmd.length = 0; | ||
| 2878 | mbox->cmd.dlci = 0; | ||
| 2879 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2880 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2881 | |||
| 2882 | if (!err) { | ||
| 2883 | fr_link_stat_t* stats = (void*)mbox->data; | ||
| 2884 | card->wandev.stats.rx_frame_errors = stats->rx_bad_format; | ||
| 2885 | card->wandev.stats.rx_dropped = | ||
| 2886 | stats->rx_dropped + stats->rx_dropped2; | ||
| 2887 | } | ||
| 2888 | |||
| 2889 | return err; | ||
| 2890 | } | ||
| 2891 | |||
| 2892 | /*============================================================================ | ||
| 2893 | * Add DLCI(s) (Access Node only!). | ||
| 2894 | * This routine will perform the ADD_DLCIs command for the specified DLCI. | ||
| 2895 | */ | ||
| 2896 | static int fr_add_dlci (sdla_t* card, int dlci) | ||
| 2897 | { | ||
| 2898 | fr_mbox_t* mbox = card->mbox; | ||
| 2899 | int retry = MAX_CMD_RETRY; | ||
| 2900 | int err; | ||
| 2901 | |||
| 2902 | do | ||
| 2903 | { | ||
| 2904 | unsigned short* dlci_list = (void*)mbox->data; | ||
| 2905 | |||
| 2906 | mbox->cmd.length = sizeof(short); | ||
| 2907 | dlci_list[0] = dlci; | ||
| 2908 | mbox->cmd.command = FR_ADD_DLCI; | ||
| 2909 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2910 | |||
| 2911 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2912 | |||
| 2913 | return err; | ||
| 2914 | } | ||
| 2915 | |||
| 2916 | /*============================================================================ | ||
| 2917 | * Activate DLCI(s) (Access Node only!). | ||
| 2918 | * This routine will perform the ACTIVATE_DLCIs command with a DLCI number. | ||
| 2919 | */ | ||
| 2920 | static int fr_activate_dlci (sdla_t* card, int dlci) | ||
| 2921 | { | ||
| 2922 | fr_mbox_t* mbox = card->mbox; | ||
| 2923 | int retry = MAX_CMD_RETRY; | ||
| 2924 | int err; | ||
| 2925 | |||
| 2926 | do | ||
| 2927 | { | ||
| 2928 | unsigned short* dlci_list = (void*)mbox->data; | ||
| 2929 | |||
| 2930 | mbox->cmd.length = sizeof(short); | ||
| 2931 | dlci_list[0] = dlci; | ||
| 2932 | mbox->cmd.command = FR_ACTIVATE_DLCI; | ||
| 2933 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2934 | |||
| 2935 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2936 | |||
| 2937 | return err; | ||
| 2938 | } | ||
| 2939 | |||
| 2940 | /*============================================================================ | ||
| 2941 | * Delete DLCI(s) (Access Node only!). | ||
| 2942 | * This routine will perform the DELETE_DLCIs command with a DLCI number. | ||
| 2943 | */ | ||
| 2944 | static int fr_delete_dlci (sdla_t* card, int dlci) | ||
| 2945 | { | ||
| 2946 | fr_mbox_t* mbox = card->mbox; | ||
| 2947 | int retry = MAX_CMD_RETRY; | ||
| 2948 | int err; | ||
| 2949 | |||
| 2950 | do | ||
| 2951 | { | ||
| 2952 | unsigned short* dlci_list = (void*)mbox->data; | ||
| 2953 | |||
| 2954 | mbox->cmd.length = sizeof(short); | ||
| 2955 | dlci_list[0] = dlci; | ||
| 2956 | mbox->cmd.command = FR_DELETE_DLCI; | ||
| 2957 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2958 | |||
| 2959 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2960 | |||
| 2961 | return err; | ||
| 2962 | } | ||
| 2963 | |||
| 2964 | |||
| 2965 | |||
| 2966 | /*============================================================================ | ||
| 2967 | * Issue in-channel signalling frame. | ||
| 2968 | */ | ||
| 2969 | static int fr_issue_isf (sdla_t* card, int isf) | ||
| 2970 | { | ||
| 2971 | fr_mbox_t* mbox = card->mbox; | ||
| 2972 | int retry = MAX_CMD_RETRY; | ||
| 2973 | int err; | ||
| 2974 | |||
| 2975 | do | ||
| 2976 | { | ||
| 2977 | mbox->data[0] = isf; | ||
| 2978 | mbox->cmd.length = 1; | ||
| 2979 | mbox->cmd.command = FR_ISSUE_IS_FRAME; | ||
| 2980 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2981 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 2982 | |||
| 2983 | return err; | ||
| 2984 | } | ||
| 2985 | |||
| 2986 | |||
| 2987 | static unsigned int fr_send_hdr (sdla_t*card, int dlci, unsigned int offset) | ||
| 2988 | { | ||
| 2989 | struct net_device *dev = find_channel(card,dlci); | ||
| 2990 | fr_channel_t *chan; | ||
| 2991 | |||
| 2992 | if (!dev || !(chan=dev->priv)) | ||
| 2993 | return offset; | ||
| 2994 | |||
| 2995 | if (chan->fr_header_len){ | ||
| 2996 | sdla_poke(&card->hw, offset, chan->fr_header, chan->fr_header_len); | ||
| 2997 | } | ||
| 2998 | |||
| 2999 | return offset+chan->fr_header_len; | ||
| 3000 | } | ||
| 3001 | |||
| 3002 | /*============================================================================ | ||
| 3003 | * Send a frame on a selected DLCI. | ||
| 3004 | */ | ||
| 3005 | static int fr_send_data_header (sdla_t* card, int dlci, unsigned char attr, int len, | ||
| 3006 | void *buf, unsigned char hdr_len) | ||
| 3007 | { | ||
| 3008 | fr_mbox_t* mbox = card->mbox + 0x800; | ||
| 3009 | int retry = MAX_CMD_RETRY; | ||
| 3010 | int err; | ||
| 3011 | |||
| 3012 | do | ||
| 3013 | { | ||
| 3014 | mbox->cmd.dlci = dlci; | ||
| 3015 | mbox->cmd.attr = attr; | ||
| 3016 | mbox->cmd.length = len+hdr_len; | ||
| 3017 | mbox->cmd.command = FR_WRITE; | ||
| 3018 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 3019 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 3020 | |||
| 3021 | if (!err) { | ||
| 3022 | fr_tx_buf_ctl_t* frbuf; | ||
| 3023 | |||
| 3024 | if(card->hw.type == SDLA_S514) | ||
| 3025 | frbuf = (void*)(*(unsigned long*)mbox->data + | ||
| 3026 | card->hw.dpmbase); | ||
| 3027 | else | ||
| 3028 | frbuf = (void*)(*(unsigned long*)mbox->data - | ||
| 3029 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 3030 | |||
| 3031 | sdla_poke(&card->hw, fr_send_hdr(card,dlci,frbuf->offset), buf, len); | ||
| 3032 | frbuf->flag = 0x01; | ||
| 3033 | } | ||
| 3034 | |||
| 3035 | return err; | ||
| 3036 | } | ||
| 3037 | |||
| 3038 | static int fr_send (sdla_t* card, int dlci, unsigned char attr, int len, | ||
| 3039 | void *buf) | ||
| 3040 | { | ||
| 3041 | fr_mbox_t* mbox = card->mbox + 0x800; | ||
| 3042 | int retry = MAX_CMD_RETRY; | ||
| 3043 | int err; | ||
| 3044 | |||
| 3045 | do | ||
| 3046 | { | ||
| 3047 | mbox->cmd.dlci = dlci; | ||
| 3048 | mbox->cmd.attr = attr; | ||
| 3049 | mbox->cmd.length = len; | ||
| 3050 | mbox->cmd.command = FR_WRITE; | ||
| 3051 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 3052 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 3053 | |||
| 3054 | if (!err) { | ||
| 3055 | fr_tx_buf_ctl_t* frbuf; | ||
| 3056 | |||
| 3057 | if(card->hw.type == SDLA_S514) | ||
| 3058 | frbuf = (void*)(*(unsigned long*)mbox->data + | ||
| 3059 | card->hw.dpmbase); | ||
| 3060 | else | ||
| 3061 | frbuf = (void*)(*(unsigned long*)mbox->data - | ||
| 3062 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 3063 | |||
| 3064 | sdla_poke(&card->hw, frbuf->offset, buf, len); | ||
| 3065 | frbuf->flag = 0x01; | ||
| 3066 | } | ||
| 3067 | |||
| 3068 | return err; | ||
| 3069 | } | ||
| 3070 | |||
| 3071 | |||
| 3072 | /****** Firmware Asynchronous Event Handlers ********************************/ | ||
| 3073 | |||
| 3074 | /*============================================================================ | ||
| 3075 | * Main asyncronous event/error handler. | ||
| 3076 | * This routine is called whenever firmware command returns non-zero | ||
| 3077 | * return code. | ||
| 3078 | * | ||
| 3079 | * Return zero if previous command has to be cancelled. | ||
| 3080 | */ | ||
| 3081 | static int fr_event (sdla_t *card, int event, fr_mbox_t* mbox) | ||
| 3082 | { | ||
| 3083 | fr508_flags_t* flags = card->flags; | ||
| 3084 | char *ptr = &flags->iflag; | ||
| 3085 | int i; | ||
| 3086 | |||
| 3087 | switch (event) { | ||
| 3088 | |||
| 3089 | case FRRES_MODEM_FAILURE: | ||
| 3090 | return fr_modem_failure(card, mbox); | ||
| 3091 | |||
| 3092 | case FRRES_CHANNEL_DOWN: { | ||
| 3093 | struct net_device *dev; | ||
| 3094 | |||
| 3095 | /* Remove all routes from associated DLCI's */ | ||
| 3096 | for (dev = card->wandev.dev; dev; | ||
| 3097 | dev = *((struct net_device **)dev->priv)) { | ||
| 3098 | fr_channel_t *chan = dev->priv; | ||
| 3099 | if (chan->route_flag == ROUTE_ADDED) { | ||
| 3100 | chan->route_flag = REMOVE_ROUTE; | ||
| 3101 | } | ||
| 3102 | |||
| 3103 | if (chan->inarp == INARP_CONFIGURED) { | ||
| 3104 | chan->inarp = INARP_REQUEST; | ||
| 3105 | } | ||
| 3106 | |||
| 3107 | /* If the link becomes disconnected then, | ||
| 3108 | * all channels will be disconnected | ||
| 3109 | * as well. | ||
| 3110 | */ | ||
| 3111 | set_chan_state(dev,WAN_DISCONNECTED); | ||
| 3112 | } | ||
| 3113 | |||
| 3114 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 3115 | return 1; | ||
| 3116 | } | ||
| 3117 | |||
| 3118 | case FRRES_CHANNEL_UP: { | ||
| 3119 | struct net_device *dev; | ||
| 3120 | |||
| 3121 | /* FIXME: Only startup devices that are on the list */ | ||
| 3122 | |||
| 3123 | for (dev = card->wandev.dev; dev; | ||
| 3124 | dev = *((struct net_device **)dev->priv)) { | ||
| 3125 | |||
| 3126 | set_chan_state(dev,WAN_CONNECTED); | ||
| 3127 | } | ||
| 3128 | |||
| 3129 | wanpipe_set_state(card, WAN_CONNECTED); | ||
| 3130 | return 1; | ||
| 3131 | } | ||
| 3132 | |||
| 3133 | case FRRES_DLCI_CHANGE: | ||
| 3134 | return fr_dlci_change(card, mbox); | ||
| 3135 | |||
| 3136 | case FRRES_DLCI_MISMATCH: | ||
| 3137 | printk(KERN_INFO "%s: DLCI list mismatch!\n", | ||
| 3138 | card->devname); | ||
| 3139 | return 1; | ||
| 3140 | |||
| 3141 | case CMD_TIMEOUT: | ||
| 3142 | printk(KERN_ERR "%s: command 0x%02X timed out!\n", | ||
| 3143 | card->devname, mbox->cmd.command); | ||
| 3144 | printk(KERN_INFO "%s: ID Bytes = ",card->devname); | ||
| 3145 | for(i = 0; i < 8; i ++) | ||
| 3146 | printk(KERN_INFO "0x%02X ", *(ptr + 0x18 + i)); | ||
| 3147 | printk(KERN_INFO "\n"); | ||
| 3148 | |||
| 3149 | break; | ||
| 3150 | |||
| 3151 | case FRRES_DLCI_INACTIVE: | ||
| 3152 | break; | ||
| 3153 | |||
| 3154 | case FRRES_CIR_OVERFLOW: | ||
| 3155 | break; | ||
| 3156 | |||
| 3157 | case FRRES_BUFFER_OVERFLOW: | ||
| 3158 | break; | ||
| 3159 | |||
| 3160 | default: | ||
| 3161 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n" | ||
| 3162 | , card->devname, mbox->cmd.command, event); | ||
| 3163 | } | ||
| 3164 | |||
| 3165 | return 0; | ||
| 3166 | } | ||
| 3167 | |||
| 3168 | /*============================================================================ | ||
| 3169 | * Handle modem error. | ||
| 3170 | * | ||
| 3171 | * Return zero if previous command has to be cancelled. | ||
| 3172 | */ | ||
| 3173 | static int fr_modem_failure (sdla_t *card, fr_mbox_t* mbox) | ||
| 3174 | { | ||
| 3175 | printk(KERN_INFO "%s: physical link down! (modem error 0x%02X)\n", | ||
| 3176 | card->devname, mbox->data[0]); | ||
| 3177 | |||
| 3178 | switch (mbox->cmd.command){ | ||
| 3179 | case FR_WRITE: | ||
| 3180 | |||
| 3181 | case FR_READ: | ||
| 3182 | return 0; | ||
| 3183 | } | ||
| 3184 | |||
| 3185 | return 1; | ||
| 3186 | } | ||
| 3187 | |||
| 3188 | /*============================================================================ | ||
| 3189 | * Handle DLCI status change. | ||
| 3190 | * | ||
| 3191 | * Return zero if previous command has to be cancelled. | ||
| 3192 | */ | ||
| 3193 | static int fr_dlci_change (sdla_t *card, fr_mbox_t* mbox) | ||
| 3194 | { | ||
| 3195 | dlci_status_t* status = (void*)mbox->data; | ||
| 3196 | int cnt = mbox->cmd.length / sizeof(dlci_status_t); | ||
| 3197 | fr_channel_t *chan; | ||
| 3198 | struct net_device* dev2; | ||
| 3199 | |||
| 3200 | |||
| 3201 | for (; cnt; --cnt, ++status) { | ||
| 3202 | |||
| 3203 | unsigned short dlci= status->dlci; | ||
| 3204 | struct net_device* dev = find_channel(card, dlci); | ||
| 3205 | |||
| 3206 | if (dev == NULL){ | ||
| 3207 | printk(KERN_INFO | ||
| 3208 | "%s: CPE contains unconfigured DLCI= %d\n", | ||
| 3209 | card->devname, dlci); | ||
| 3210 | |||
| 3211 | printk(KERN_INFO | ||
| 3212 | "%s: unconfigured DLCI %d reported by network\n" | ||
| 3213 | , card->devname, dlci); | ||
| 3214 | |||
| 3215 | }else{ | ||
| 3216 | if (status->state == FR_LINK_INOPER) { | ||
| 3217 | printk(KERN_INFO | ||
| 3218 | "%s: DLCI %u is inactive!\n", | ||
| 3219 | card->devname, dlci); | ||
| 3220 | |||
| 3221 | if (dev && netif_running(dev)) | ||
| 3222 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3223 | } | ||
| 3224 | |||
| 3225 | if (status->state & FR_DLCI_DELETED) { | ||
| 3226 | |||
| 3227 | printk(KERN_INFO | ||
| 3228 | "%s: DLCI %u has been deleted!\n", | ||
| 3229 | card->devname, dlci); | ||
| 3230 | |||
| 3231 | if (dev && netif_running(dev)){ | ||
| 3232 | |||
| 3233 | fr_channel_t *chan = dev->priv; | ||
| 3234 | |||
| 3235 | if (chan->route_flag == ROUTE_ADDED) { | ||
| 3236 | chan->route_flag = REMOVE_ROUTE; | ||
| 3237 | /* The state change will trigger | ||
| 3238 | * the fr polling routine */ | ||
| 3239 | } | ||
| 3240 | |||
| 3241 | if (chan->inarp == INARP_CONFIGURED) { | ||
| 3242 | chan->inarp = INARP_REQUEST; | ||
| 3243 | } | ||
| 3244 | |||
| 3245 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3246 | } | ||
| 3247 | |||
| 3248 | } else if (status->state & FR_DLCI_ACTIVE) { | ||
| 3249 | |||
| 3250 | chan = dev->priv; | ||
| 3251 | |||
| 3252 | /* This flag is used for configuring specific | ||
| 3253 | DLCI(s) when they become active. | ||
| 3254 | */ | ||
| 3255 | chan->dlci_configured = DLCI_CONFIG_PENDING; | ||
| 3256 | |||
| 3257 | set_chan_state(dev, WAN_CONNECTED); | ||
| 3258 | |||
| 3259 | } | ||
| 3260 | } | ||
| 3261 | } | ||
| 3262 | |||
| 3263 | for (dev2 = card->wandev.dev; dev2; | ||
| 3264 | dev2 = *((struct net_device **)dev2->priv)){ | ||
| 3265 | |||
| 3266 | chan = dev2->priv; | ||
| 3267 | |||
| 3268 | if (chan->dlci_configured == DLCI_CONFIG_PENDING) { | ||
| 3269 | if (fr_init_dlci(card, chan)){ | ||
| 3270 | return 1; | ||
| 3271 | } | ||
| 3272 | } | ||
| 3273 | |||
| 3274 | } | ||
| 3275 | return 1; | ||
| 3276 | } | ||
| 3277 | |||
| 3278 | |||
| 3279 | static int fr_init_dlci (sdla_t *card, fr_channel_t *chan) | ||
| 3280 | { | ||
| 3281 | fr_dlc_conf_t cfg; | ||
| 3282 | |||
| 3283 | memset(&cfg, 0, sizeof(cfg)); | ||
| 3284 | |||
| 3285 | if ( chan->cir_status == CIR_DISABLED) { | ||
| 3286 | |||
| 3287 | cfg.cir_fwd = cfg.cir_bwd = 16; | ||
| 3288 | cfg.bc_fwd = cfg.bc_bwd = 16; | ||
| 3289 | cfg.conf_flags = 0x0001; | ||
| 3290 | |||
| 3291 | }else if (chan->cir_status == CIR_ENABLED) { | ||
| 3292 | |||
| 3293 | cfg.cir_fwd = cfg.cir_bwd = chan->cir; | ||
| 3294 | cfg.bc_fwd = cfg.bc_bwd = chan->bc; | ||
| 3295 | cfg.be_fwd = cfg.be_bwd = chan->be; | ||
| 3296 | cfg.conf_flags = 0x0000; | ||
| 3297 | } | ||
| 3298 | |||
| 3299 | if (fr_dlci_configure( card, &cfg , chan->dlci)){ | ||
| 3300 | printk(KERN_INFO | ||
| 3301 | "%s: DLCI Configure failed for %d\n", | ||
| 3302 | card->devname, chan->dlci); | ||
| 3303 | return 1; | ||
| 3304 | } | ||
| 3305 | |||
| 3306 | chan->dlci_configured = DLCI_CONFIGURED; | ||
| 3307 | |||
| 3308 | /* Read the interface byte mapping into the channel | ||
| 3309 | * structure. | ||
| 3310 | */ | ||
| 3311 | read_DLCI_IB_mapping( card, chan ); | ||
| 3312 | |||
| 3313 | return 0; | ||
| 3314 | } | ||
| 3315 | /******* Miscellaneous ******************************************************/ | ||
| 3316 | |||
| 3317 | /*============================================================================ | ||
| 3318 | * Update channel state. | ||
| 3319 | */ | ||
| 3320 | static int update_chan_state(struct net_device* dev) | ||
| 3321 | { | ||
| 3322 | fr_channel_t* chan = dev->priv; | ||
| 3323 | sdla_t* card = chan->card; | ||
| 3324 | fr_mbox_t* mbox = card->mbox; | ||
| 3325 | int retry = MAX_CMD_RETRY; | ||
| 3326 | int err; | ||
| 3327 | |||
| 3328 | do | ||
| 3329 | { | ||
| 3330 | mbox->cmd.command = FR_LIST_ACTIVE_DLCI; | ||
| 3331 | mbox->cmd.length = 0; | ||
| 3332 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 3333 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 3334 | |||
| 3335 | if (!err) { | ||
| 3336 | |||
| 3337 | unsigned short* list = (void*)mbox->data; | ||
| 3338 | int cnt = mbox->cmd.length / sizeof(short); | ||
| 3339 | |||
| 3340 | err=1; | ||
| 3341 | |||
| 3342 | for (; cnt; --cnt, ++list) { | ||
| 3343 | |||
| 3344 | if (*list == chan->dlci) { | ||
| 3345 | set_chan_state(dev, WAN_CONNECTED); | ||
| 3346 | |||
| 3347 | |||
| 3348 | /* May 23 2000. NC | ||
| 3349 | * When a dlci is added or restarted, | ||
| 3350 | * the dlci_int_interface pointer must | ||
| 3351 | * be reinitialized. */ | ||
| 3352 | if (!chan->dlci_int_interface){ | ||
| 3353 | err=fr_init_dlci (card,chan); | ||
| 3354 | } | ||
| 3355 | break; | ||
| 3356 | } | ||
| 3357 | } | ||
| 3358 | } | ||
| 3359 | |||
| 3360 | return err; | ||
| 3361 | } | ||
| 3362 | |||
| 3363 | /*============================================================================ | ||
| 3364 | * Set channel state. | ||
| 3365 | */ | ||
| 3366 | static void set_chan_state(struct net_device* dev, int state) | ||
| 3367 | { | ||
| 3368 | fr_channel_t* chan = dev->priv; | ||
| 3369 | sdla_t* card = chan->card; | ||
| 3370 | |||
| 3371 | if (chan->common.state != state) { | ||
| 3372 | |||
| 3373 | switch (state) { | ||
| 3374 | |||
| 3375 | case WAN_CONNECTED: | ||
| 3376 | printk(KERN_INFO | ||
| 3377 | "%s: Interface %s: DLCI %d connected\n", | ||
| 3378 | card->devname, dev->name, chan->dlci); | ||
| 3379 | |||
| 3380 | /* If the interface was previoulsy down, | ||
| 3381 | * bring it up, since the channel is active */ | ||
| 3382 | |||
| 3383 | trigger_fr_poll (dev); | ||
| 3384 | trigger_fr_arp (dev); | ||
| 3385 | break; | ||
| 3386 | |||
| 3387 | case WAN_CONNECTING: | ||
| 3388 | printk(KERN_INFO | ||
| 3389 | "%s: Interface %s: DLCI %d connecting\n", | ||
| 3390 | card->devname, dev->name, chan->dlci); | ||
| 3391 | break; | ||
| 3392 | |||
| 3393 | case WAN_DISCONNECTED: | ||
| 3394 | printk (KERN_INFO | ||
| 3395 | "%s: Interface %s: DLCI %d disconnected!\n", | ||
| 3396 | card->devname, dev->name, chan->dlci); | ||
| 3397 | |||
| 3398 | /* If the interface is up, bring it down, | ||
| 3399 | * since the channel is now disconnected */ | ||
| 3400 | trigger_fr_poll (dev); | ||
| 3401 | break; | ||
| 3402 | } | ||
| 3403 | |||
| 3404 | chan->common.state = state; | ||
| 3405 | } | ||
| 3406 | |||
| 3407 | chan->state_tick = jiffies; | ||
| 3408 | } | ||
| 3409 | |||
| 3410 | /*============================================================================ | ||
| 3411 | * Find network device by its channel number. | ||
| 3412 | * | ||
| 3413 | * We need this critical flag because we change | ||
| 3414 | * the dlci_to_dev_map outside the interrupt. | ||
| 3415 | * | ||
| 3416 | * NOTE: del_if() functions updates this array, it uses | ||
| 3417 | * the spin locks to avoid corruption. | ||
| 3418 | */ | ||
| 3419 | static struct net_device* find_channel(sdla_t* card, unsigned dlci) | ||
| 3420 | { | ||
| 3421 | if(dlci > HIGHEST_VALID_DLCI) | ||
| 3422 | return NULL; | ||
| 3423 | |||
| 3424 | return(card->u.f.dlci_to_dev_map[dlci]); | ||
| 3425 | } | ||
| 3426 | |||
| 3427 | /*============================================================================ | ||
| 3428 | * Check to see if a frame can be sent. If no transmit buffers available, | ||
| 3429 | * enable transmit interrupts. | ||
| 3430 | * | ||
| 3431 | * Return: 1 - Tx buffer(s) available | ||
| 3432 | * 0 - no buffers available | ||
| 3433 | */ | ||
| 3434 | static int is_tx_ready (sdla_t* card, fr_channel_t* chan) | ||
| 3435 | { | ||
| 3436 | unsigned char sb; | ||
| 3437 | |||
| 3438 | if(card->hw.type == SDLA_S514) | ||
| 3439 | return 1; | ||
| 3440 | |||
| 3441 | sb = inb(card->hw.port); | ||
| 3442 | if (sb & 0x02) | ||
| 3443 | return 1; | ||
| 3444 | |||
| 3445 | return 0; | ||
| 3446 | } | ||
| 3447 | |||
| 3448 | /*============================================================================ | ||
| 3449 | * Convert decimal string to unsigned integer. | ||
| 3450 | * If len != 0 then only 'len' characters of the string are converted. | ||
| 3451 | */ | ||
| 3452 | static unsigned int dec_to_uint (unsigned char* str, int len) | ||
| 3453 | { | ||
| 3454 | unsigned val; | ||
| 3455 | |||
| 3456 | if (!len) | ||
| 3457 | len = strlen(str); | ||
| 3458 | |||
| 3459 | for (val = 0; len && isdigit(*str); ++str, --len) | ||
| 3460 | val = (val * 10) + (*str - (unsigned)'0'); | ||
| 3461 | |||
| 3462 | return val; | ||
| 3463 | } | ||
| 3464 | |||
| 3465 | |||
| 3466 | |||
| 3467 | /*============================================================================= | ||
| 3468 | * Store a UDP management packet for later processing. | ||
| 3469 | */ | ||
| 3470 | |||
| 3471 | static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card, | ||
| 3472 | struct sk_buff *skb, int dlci) | ||
| 3473 | { | ||
| 3474 | int udp_pkt_stored = 0; | ||
| 3475 | |||
| 3476 | struct net_device *dev = find_channel(card, dlci); | ||
| 3477 | fr_channel_t *chan; | ||
| 3478 | |||
| 3479 | if (!dev || !(chan=dev->priv)) | ||
| 3480 | return 1; | ||
| 3481 | |||
| 3482 | if(!card->u.f.udp_pkt_lgth && (skb->len <= MAX_LGTH_UDP_MGNT_PKT)){ | ||
| 3483 | card->u.f.udp_pkt_lgth = skb->len + chan->fr_header_len; | ||
| 3484 | card->u.f.udp_type = udp_type; | ||
| 3485 | card->u.f.udp_pkt_src = udp_pkt_src; | ||
| 3486 | card->u.f.udp_dlci = dlci; | ||
| 3487 | memcpy(card->u.f.udp_pkt_data, skb->data, skb->len); | ||
| 3488 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UDP; | ||
| 3489 | udp_pkt_stored = 1; | ||
| 3490 | |||
| 3491 | }else{ | ||
| 3492 | printk(KERN_INFO "ERROR: UDP packet not stored for DLCI %d\n", | ||
| 3493 | dlci); | ||
| 3494 | } | ||
| 3495 | |||
| 3496 | if(udp_pkt_src == UDP_PKT_FRM_STACK){ | ||
| 3497 | dev_kfree_skb_any(skb); | ||
| 3498 | }else{ | ||
| 3499 | dev_kfree_skb_any(skb); | ||
| 3500 | } | ||
| 3501 | |||
| 3502 | return(udp_pkt_stored); | ||
| 3503 | } | ||
| 3504 | |||
| 3505 | |||
| 3506 | /*============================================================================== | ||
| 3507 | * Process UDP call of type FPIPE8ND | ||
| 3508 | */ | ||
| 3509 | static int process_udp_mgmt_pkt(sdla_t* card) | ||
| 3510 | { | ||
| 3511 | |||
| 3512 | int c_retry = MAX_CMD_RETRY; | ||
| 3513 | unsigned char *buf; | ||
| 3514 | unsigned char frames; | ||
| 3515 | unsigned int len; | ||
| 3516 | unsigned short buffer_length; | ||
| 3517 | struct sk_buff *new_skb; | ||
| 3518 | fr_mbox_t* mbox = card->mbox; | ||
| 3519 | int err; | ||
| 3520 | struct timeval tv; | ||
| 3521 | int udp_mgmt_req_valid = 1; | ||
| 3522 | struct net_device* dev; | ||
| 3523 | fr_channel_t* chan; | ||
| 3524 | fr_udp_pkt_t *fr_udp_pkt; | ||
| 3525 | unsigned short num_trc_els; | ||
| 3526 | fr_trc_el_t* ptr_trc_el; | ||
| 3527 | fr_trc_el_t trc_el; | ||
| 3528 | fpipemon_trc_t* fpipemon_trc; | ||
| 3529 | |||
| 3530 | char udp_pkt_src = card->u.f.udp_pkt_src; | ||
| 3531 | int dlci = card->u.f.udp_dlci; | ||
| 3532 | |||
| 3533 | /* Find network interface for this packet */ | ||
| 3534 | dev = find_channel(card, dlci); | ||
| 3535 | if (!dev){ | ||
| 3536 | card->u.f.udp_pkt_lgth = 0; | ||
| 3537 | return 1; | ||
| 3538 | } | ||
| 3539 | if ((chan = dev->priv) == NULL){ | ||
| 3540 | card->u.f.udp_pkt_lgth = 0; | ||
| 3541 | return 1; | ||
| 3542 | } | ||
| 3543 | |||
| 3544 | /* If the UDP packet is from the network, we are going to have to | ||
| 3545 | transmit a response. Before doing so, we must check to see that | ||
| 3546 | we are not currently transmitting a frame (in 'if_send()') and | ||
| 3547 | that we are not already in a 'delayed transmit' state. | ||
| 3548 | */ | ||
| 3549 | if(udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 3550 | if (check_tx_status(card,dev)){ | ||
| 3551 | card->u.f.udp_pkt_lgth = 0; | ||
| 3552 | return 1; | ||
| 3553 | } | ||
| 3554 | } | ||
| 3555 | |||
| 3556 | fr_udp_pkt = (fr_udp_pkt_t *)card->u.f.udp_pkt_data; | ||
| 3557 | |||
| 3558 | if(udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 3559 | |||
| 3560 | switch(fr_udp_pkt->cblock.command) { | ||
| 3561 | |||
| 3562 | case FR_READ_MODEM_STATUS: | ||
| 3563 | case FR_READ_STATUS: | ||
| 3564 | case FPIPE_ROUTER_UP_TIME: | ||
| 3565 | case FR_READ_ERROR_STATS: | ||
| 3566 | case FPIPE_DRIVER_STAT_GEN: | ||
| 3567 | case FR_READ_STATISTICS: | ||
| 3568 | case FR_READ_ADD_DLC_STATS: | ||
| 3569 | case FR_READ_CONFIG: | ||
| 3570 | case FR_READ_CODE_VERSION: | ||
| 3571 | udp_mgmt_req_valid = 1; | ||
| 3572 | break; | ||
| 3573 | default: | ||
| 3574 | udp_mgmt_req_valid = 0; | ||
| 3575 | break; | ||
| 3576 | } | ||
| 3577 | } | ||
| 3578 | |||
| 3579 | if(!udp_mgmt_req_valid) { | ||
| 3580 | /* set length to 0 */ | ||
| 3581 | fr_udp_pkt->cblock.length = 0; | ||
| 3582 | /* set return code */ | ||
| 3583 | fr_udp_pkt->cblock.result = 0xCD; | ||
| 3584 | |||
| 3585 | chan->drvstats_gen.UDP_PIPE_mgmt_direction_err ++; | ||
| 3586 | |||
| 3587 | if (net_ratelimit()){ | ||
| 3588 | printk(KERN_INFO | ||
| 3589 | "%s: Warning, Illegal UDP command attempted from network: %x\n", | ||
| 3590 | card->devname,fr_udp_pkt->cblock.command); | ||
| 3591 | } | ||
| 3592 | |||
| 3593 | } else { | ||
| 3594 | |||
| 3595 | switch(fr_udp_pkt->cblock.command) { | ||
| 3596 | |||
| 3597 | case FPIPE_ENABLE_TRACING: | ||
| 3598 | if(!card->TracingEnabled) { | ||
| 3599 | do { | ||
| 3600 | mbox->cmd.command = FR_SET_TRACE_CONFIG; | ||
| 3601 | mbox->cmd.length = 1; | ||
| 3602 | mbox->cmd.dlci = 0x00; | ||
| 3603 | mbox->data[0] = fr_udp_pkt->data[0] | | ||
| 3604 | RESET_TRC; | ||
| 3605 | err = sdla_exec(mbox) ? | ||
| 3606 | mbox->cmd.result : CMD_TIMEOUT; | ||
| 3607 | } while (err && c_retry-- && fr_event(card, err, | ||
| 3608 | mbox)); | ||
| 3609 | |||
| 3610 | if(err) { | ||
| 3611 | card->TracingEnabled = 0; | ||
| 3612 | /* set the return code */ | ||
| 3613 | fr_udp_pkt->cblock.result = | ||
| 3614 | mbox->cmd.result; | ||
| 3615 | mbox->cmd.length = 0; | ||
| 3616 | break; | ||
| 3617 | } | ||
| 3618 | |||
| 3619 | sdla_peek(&card->hw, NO_TRC_ELEMENTS_OFF, | ||
| 3620 | &num_trc_els, 2); | ||
| 3621 | sdla_peek(&card->hw, BASE_TRC_ELEMENTS_OFF, | ||
| 3622 | &card->u.f.trc_el_base, 4); | ||
| 3623 | card->u.f.curr_trc_el = card->u.f.trc_el_base; | ||
| 3624 | card->u.f.trc_el_last = card->u.f.curr_trc_el + | ||
| 3625 | ((num_trc_els - 1) * | ||
| 3626 | sizeof(fr_trc_el_t)); | ||
| 3627 | |||
| 3628 | /* Calculate the maximum trace data area in */ | ||
| 3629 | /* the UDP packet */ | ||
| 3630 | card->u.f.trc_bfr_space=(MAX_LGTH_UDP_MGNT_PKT - | ||
| 3631 | //sizeof(fr_encap_hdr_t) - | ||
| 3632 | sizeof(ip_pkt_t) - | ||
| 3633 | sizeof(udp_pkt_t) - | ||
| 3634 | sizeof(wp_mgmt_t) - | ||
| 3635 | sizeof(cblock_t)); | ||
| 3636 | |||
| 3637 | /* set return code */ | ||
| 3638 | fr_udp_pkt->cblock.result = 0; | ||
| 3639 | |||
| 3640 | } else { | ||
| 3641 | /* set return code to line trace already | ||
| 3642 | enabled */ | ||
| 3643 | fr_udp_pkt->cblock.result = 1; | ||
| 3644 | } | ||
| 3645 | |||
| 3646 | mbox->cmd.length = 0; | ||
| 3647 | card->TracingEnabled = 1; | ||
| 3648 | break; | ||
| 3649 | |||
| 3650 | |||
| 3651 | case FPIPE_DISABLE_TRACING: | ||
| 3652 | if(card->TracingEnabled) { | ||
| 3653 | |||
| 3654 | do { | ||
| 3655 | mbox->cmd.command = FR_SET_TRACE_CONFIG; | ||
| 3656 | mbox->cmd.length = 1; | ||
| 3657 | mbox->cmd.dlci = 0x00; | ||
| 3658 | mbox->data[0] = ~ACTIVATE_TRC; | ||
| 3659 | err = sdla_exec(mbox) ? | ||
| 3660 | mbox->cmd.result : CMD_TIMEOUT; | ||
| 3661 | } while (err && c_retry-- && fr_event(card, err, mbox)); | ||
| 3662 | } | ||
| 3663 | |||
| 3664 | /* set return code */ | ||
| 3665 | fr_udp_pkt->cblock.result = 0; | ||
| 3666 | mbox->cmd.length = 0; | ||
| 3667 | card->TracingEnabled = 0; | ||
| 3668 | break; | ||
| 3669 | |||
| 3670 | case FPIPE_GET_TRACE_INFO: | ||
| 3671 | |||
| 3672 | /* Line trace cannot be performed on the 502 */ | ||
| 3673 | if(!card->TracingEnabled) { | ||
| 3674 | /* set return code */ | ||
| 3675 | fr_udp_pkt->cblock.result = 1; | ||
| 3676 | mbox->cmd.length = 0; | ||
| 3677 | break; | ||
| 3678 | } | ||
| 3679 | |||
| 3680 | ptr_trc_el = (void *)card->u.f.curr_trc_el; | ||
| 3681 | |||
| 3682 | buffer_length = 0; | ||
| 3683 | fr_udp_pkt->data[0x00] = 0x00; | ||
| 3684 | |||
| 3685 | for(frames = 0; frames < MAX_FRMS_TRACED; frames ++) { | ||
| 3686 | |||
| 3687 | sdla_peek(&card->hw, (unsigned long)ptr_trc_el, | ||
| 3688 | (void *)&trc_el.flag, | ||
| 3689 | sizeof(fr_trc_el_t)); | ||
| 3690 | if(trc_el.flag == 0x00) { | ||
| 3691 | break; | ||
| 3692 | } | ||
| 3693 | if((card->u.f.trc_bfr_space - buffer_length) | ||
| 3694 | < sizeof(fpipemon_trc_hdr_t)) { | ||
| 3695 | fr_udp_pkt->data[0x00] |= MORE_TRC_DATA; | ||
| 3696 | break; | ||
| 3697 | } | ||
| 3698 | |||
| 3699 | fpipemon_trc = | ||
| 3700 | (fpipemon_trc_t *)&fr_udp_pkt->data[buffer_length]; | ||
| 3701 | fpipemon_trc->fpipemon_trc_hdr.status = | ||
| 3702 | trc_el.attr; | ||
| 3703 | fpipemon_trc->fpipemon_trc_hdr.tmstamp = | ||
| 3704 | trc_el.tmstamp; | ||
| 3705 | fpipemon_trc->fpipemon_trc_hdr.length = | ||
| 3706 | trc_el.length; | ||
| 3707 | |||
| 3708 | if(!trc_el.offset || !trc_el.length) { | ||
| 3709 | |||
| 3710 | fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00; | ||
| 3711 | |||
| 3712 | }else if((trc_el.length + sizeof(fpipemon_trc_hdr_t) + 1) > | ||
| 3713 | (card->u.f.trc_bfr_space - buffer_length)){ | ||
| 3714 | |||
| 3715 | fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x00; | ||
| 3716 | fr_udp_pkt->data[0x00] |= MORE_TRC_DATA; | ||
| 3717 | |||
| 3718 | }else { | ||
| 3719 | fpipemon_trc->fpipemon_trc_hdr.data_passed = 0x01; | ||
| 3720 | sdla_peek(&card->hw, trc_el.offset, | ||
| 3721 | fpipemon_trc->data, | ||
| 3722 | trc_el.length); | ||
| 3723 | } | ||
| 3724 | |||
| 3725 | trc_el.flag = 0x00; | ||
| 3726 | sdla_poke(&card->hw, (unsigned long)ptr_trc_el, | ||
| 3727 | &trc_el.flag, 1); | ||
| 3728 | |||
| 3729 | ptr_trc_el ++; | ||
| 3730 | if((void *)ptr_trc_el > card->u.f.trc_el_last) | ||
| 3731 | ptr_trc_el = (void*)card->u.f.trc_el_base; | ||
| 3732 | |||
| 3733 | buffer_length += sizeof(fpipemon_trc_hdr_t); | ||
| 3734 | if(fpipemon_trc->fpipemon_trc_hdr.data_passed) { | ||
| 3735 | buffer_length += trc_el.length; | ||
| 3736 | } | ||
| 3737 | |||
| 3738 | if(fr_udp_pkt->data[0x00] & MORE_TRC_DATA) { | ||
| 3739 | break; | ||
| 3740 | } | ||
| 3741 | } | ||
| 3742 | |||
| 3743 | if(frames == MAX_FRMS_TRACED) { | ||
| 3744 | fr_udp_pkt->data[0x00] |= MORE_TRC_DATA; | ||
| 3745 | } | ||
| 3746 | |||
| 3747 | card->u.f.curr_trc_el = (void *)ptr_trc_el; | ||
| 3748 | |||
| 3749 | /* set the total number of frames passed */ | ||
| 3750 | fr_udp_pkt->data[0x00] |= | ||
| 3751 | ((frames << 1) & (MAX_FRMS_TRACED << 1)); | ||
| 3752 | |||
| 3753 | /* set the data length and return code */ | ||
| 3754 | fr_udp_pkt->cblock.length = mbox->cmd.length = buffer_length; | ||
| 3755 | fr_udp_pkt->cblock.result = 0; | ||
| 3756 | break; | ||
| 3757 | |||
| 3758 | case FPIPE_FT1_READ_STATUS: | ||
| 3759 | sdla_peek(&card->hw, 0xF020, | ||
| 3760 | &fr_udp_pkt->data[0x00] , 2); | ||
| 3761 | fr_udp_pkt->cblock.length = mbox->cmd.length = 2; | ||
| 3762 | fr_udp_pkt->cblock.result = 0; | ||
| 3763 | break; | ||
| 3764 | |||
| 3765 | case FPIPE_FLUSH_DRIVER_STATS: | ||
| 3766 | init_chan_statistics(chan); | ||
| 3767 | init_global_statistics(card); | ||
| 3768 | mbox->cmd.length = 0; | ||
| 3769 | break; | ||
| 3770 | |||
| 3771 | case FPIPE_ROUTER_UP_TIME: | ||
| 3772 | do_gettimeofday(&tv); | ||
| 3773 | chan->router_up_time = tv.tv_sec - | ||
| 3774 | chan->router_start_time; | ||
| 3775 | *(unsigned long *)&fr_udp_pkt->data = | ||
| 3776 | chan->router_up_time; | ||
| 3777 | mbox->cmd.length = fr_udp_pkt->cblock.length = 4; | ||
| 3778 | fr_udp_pkt->cblock.result = 0; | ||
| 3779 | break; | ||
| 3780 | |||
| 3781 | case FPIPE_DRIVER_STAT_IFSEND: | ||
| 3782 | memcpy(fr_udp_pkt->data, | ||
| 3783 | &chan->drvstats_if_send.if_send_entry, | ||
| 3784 | sizeof(if_send_stat_t)); | ||
| 3785 | mbox->cmd.length = fr_udp_pkt->cblock.length =sizeof(if_send_stat_t); | ||
| 3786 | fr_udp_pkt->cblock.result = 0; | ||
| 3787 | break; | ||
| 3788 | |||
| 3789 | case FPIPE_DRIVER_STAT_INTR: | ||
| 3790 | |||
| 3791 | memcpy(fr_udp_pkt->data, | ||
| 3792 | &card->statistics.isr_entry, | ||
| 3793 | sizeof(global_stats_t)); | ||
| 3794 | |||
| 3795 | memcpy(&fr_udp_pkt->data[sizeof(global_stats_t)], | ||
| 3796 | &chan->drvstats_rx_intr.rx_intr_no_socket, | ||
| 3797 | sizeof(rx_intr_stat_t)); | ||
| 3798 | |||
| 3799 | mbox->cmd.length = fr_udp_pkt->cblock.length = | ||
| 3800 | sizeof(global_stats_t) + | ||
| 3801 | sizeof(rx_intr_stat_t); | ||
| 3802 | fr_udp_pkt->cblock.result = 0; | ||
| 3803 | break; | ||
| 3804 | |||
| 3805 | case FPIPE_DRIVER_STAT_GEN: | ||
| 3806 | memcpy(fr_udp_pkt->data, | ||
| 3807 | &chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err, | ||
| 3808 | sizeof(pipe_mgmt_stat_t)); | ||
| 3809 | |||
| 3810 | memcpy(&fr_udp_pkt->data[sizeof(pipe_mgmt_stat_t)], | ||
| 3811 | &card->statistics, sizeof(global_stats_t)); | ||
| 3812 | |||
| 3813 | mbox->cmd.length = fr_udp_pkt->cblock.length = sizeof(global_stats_t)+ | ||
| 3814 | sizeof(rx_intr_stat_t); | ||
| 3815 | fr_udp_pkt->cblock.result = 0; | ||
| 3816 | break; | ||
| 3817 | |||
| 3818 | |||
| 3819 | case FR_FT1_STATUS_CTRL: | ||
| 3820 | if(fr_udp_pkt->data[0] == 1) { | ||
| 3821 | if(rCount++ != 0 ){ | ||
| 3822 | fr_udp_pkt->cblock.result = 0; | ||
| 3823 | mbox->cmd.length = 1; | ||
| 3824 | break; | ||
| 3825 | } | ||
| 3826 | } | ||
| 3827 | |||
| 3828 | /* Disable FT1 MONITOR STATUS */ | ||
| 3829 | if(fr_udp_pkt->data[0] == 0) { | ||
| 3830 | if( --rCount != 0) { | ||
| 3831 | fr_udp_pkt->cblock.result = 0; | ||
| 3832 | mbox->cmd.length = 1; | ||
| 3833 | break; | ||
| 3834 | } | ||
| 3835 | } | ||
| 3836 | goto udp_mgmt_dflt; | ||
| 3837 | |||
| 3838 | |||
| 3839 | default: | ||
| 3840 | udp_mgmt_dflt: | ||
| 3841 | do { | ||
| 3842 | memcpy(&mbox->cmd, | ||
| 3843 | &fr_udp_pkt->cblock.command, | ||
| 3844 | sizeof(fr_cmd_t)); | ||
| 3845 | if(mbox->cmd.length) { | ||
| 3846 | memcpy(&mbox->data, | ||
| 3847 | (char *)fr_udp_pkt->data, | ||
| 3848 | mbox->cmd.length); | ||
| 3849 | } | ||
| 3850 | |||
| 3851 | err = sdla_exec(mbox) ? mbox->cmd.result : | ||
| 3852 | CMD_TIMEOUT; | ||
| 3853 | } while (err && c_retry-- && fr_event(card, err, mbox)); | ||
| 3854 | |||
| 3855 | if(!err) | ||
| 3856 | chan->drvstats_gen. | ||
| 3857 | UDP_PIPE_mgmt_adptr_cmnd_OK ++; | ||
| 3858 | else | ||
| 3859 | chan->drvstats_gen. | ||
| 3860 | UDP_PIPE_mgmt_adptr_cmnd_timeout ++; | ||
| 3861 | |||
| 3862 | /* copy the result back to our buffer */ | ||
| 3863 | memcpy(&fr_udp_pkt->cblock.command, | ||
| 3864 | &mbox->cmd, sizeof(fr_cmd_t)); | ||
| 3865 | |||
| 3866 | if(mbox->cmd.length) { | ||
| 3867 | memcpy(&fr_udp_pkt->data, | ||
| 3868 | &mbox->data, mbox->cmd.length); | ||
| 3869 | } | ||
| 3870 | } | ||
| 3871 | } | ||
| 3872 | |||
| 3873 | /* Fill UDP TTL */ | ||
| 3874 | fr_udp_pkt->ip_pkt.ttl = card->wandev.ttl; | ||
| 3875 | len = reply_udp(card->u.f.udp_pkt_data, mbox->cmd.length); | ||
| 3876 | |||
| 3877 | if(udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 3878 | |||
| 3879 | chan->fr_header_len=2; | ||
| 3880 | chan->fr_header[0]=Q922_UI; | ||
| 3881 | chan->fr_header[1]=NLPID_IP; | ||
| 3882 | |||
| 3883 | err = fr_send_data_header(card, dlci, 0, len, | ||
| 3884 | card->u.f.udp_pkt_data,chan->fr_header_len); | ||
| 3885 | if (err){ | ||
| 3886 | chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_passed ++; | ||
| 3887 | }else{ | ||
| 3888 | chan->drvstats_gen.UDP_PIPE_mgmt_adptr_send_failed ++; | ||
| 3889 | } | ||
| 3890 | |||
| 3891 | } else { | ||
| 3892 | /* Allocate socket buffer */ | ||
| 3893 | if((new_skb = dev_alloc_skb(len)) != NULL) { | ||
| 3894 | |||
| 3895 | /* copy data into new_skb */ | ||
| 3896 | buf = skb_put(new_skb, len); | ||
| 3897 | memcpy(buf, card->u.f.udp_pkt_data, len); | ||
| 3898 | |||
| 3899 | chan->drvstats_gen. | ||
| 3900 | UDP_PIPE_mgmt_passed_to_stack ++; | ||
| 3901 | new_skb->dev = dev; | ||
| 3902 | new_skb->protocol = htons(ETH_P_IP); | ||
| 3903 | new_skb->mac.raw = new_skb->data; | ||
| 3904 | netif_rx(new_skb); | ||
| 3905 | |||
| 3906 | } else { | ||
| 3907 | chan->drvstats_gen.UDP_PIPE_mgmt_no_socket ++; | ||
| 3908 | printk(KERN_INFO | ||
| 3909 | "%s: UDP mgmt cmnd, no socket buffers available!\n", | ||
| 3910 | card->devname); | ||
| 3911 | } | ||
| 3912 | } | ||
| 3913 | |||
| 3914 | card->u.f.udp_pkt_lgth = 0; | ||
| 3915 | |||
| 3916 | return 1; | ||
| 3917 | } | ||
| 3918 | |||
| 3919 | /*============================================================================== | ||
| 3920 | * Send Inverse ARP Request | ||
| 3921 | */ | ||
| 3922 | |||
| 3923 | int send_inarp_request(sdla_t *card, struct net_device *dev) | ||
| 3924 | { | ||
| 3925 | int err=0; | ||
| 3926 | |||
| 3927 | arphdr_1490_t *ArpPacket; | ||
| 3928 | arphdr_fr_t *arphdr; | ||
| 3929 | fr_channel_t *chan = dev->priv; | ||
| 3930 | struct in_device *in_dev; | ||
| 3931 | |||
| 3932 | in_dev = dev->ip_ptr; | ||
| 3933 | |||
| 3934 | if(in_dev != NULL ) { | ||
| 3935 | |||
| 3936 | ArpPacket = kmalloc(sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t), GFP_ATOMIC); | ||
| 3937 | /* SNAP Header indicating ARP */ | ||
| 3938 | ArpPacket->control = 0x03; | ||
| 3939 | ArpPacket->pad = 0x00; | ||
| 3940 | ArpPacket->NLPID = 0x80; | ||
| 3941 | ArpPacket->OUI[0] = 0; | ||
| 3942 | ArpPacket->OUI[1] = 0; | ||
| 3943 | ArpPacket->OUI[2] = 0; | ||
| 3944 | ArpPacket->PID = 0x0608; | ||
| 3945 | |||
| 3946 | arphdr = (arphdr_fr_t *)(ArpPacket + 1); // Go to ARP Packet | ||
| 3947 | |||
| 3948 | /* InARP request */ | ||
| 3949 | arphdr->ar_hrd = 0x0F00; /* Frame Relay HW type */ | ||
| 3950 | arphdr->ar_pro = 0x0008; /* IP Protocol */ | ||
| 3951 | arphdr->ar_hln = 2; /* HW addr length */ | ||
| 3952 | arphdr->ar_pln = 4; /* IP addr length */ | ||
| 3953 | arphdr->ar_op = htons(0x08); /* InARP Request */ | ||
| 3954 | arphdr->ar_sha = 0; /* src HW DLCI - Doesn't matter */ | ||
| 3955 | if(in_dev->ifa_list != NULL) | ||
| 3956 | arphdr->ar_sip = in_dev->ifa_list->ifa_local; /* Local Address */else | ||
| 3957 | arphdr->ar_sip = 0; | ||
| 3958 | arphdr->ar_tha = 0; /* dst HW DLCI - Doesn't matter */ | ||
| 3959 | arphdr->ar_tip = 0; /* Remote Address -- what we want */ | ||
| 3960 | |||
| 3961 | err = fr_send(card, chan->dlci, 0, sizeof(arphdr_1490_t) + sizeof(arphdr_fr_t), | ||
| 3962 | (void *)ArpPacket); | ||
| 3963 | |||
| 3964 | if (!err){ | ||
| 3965 | printk(KERN_INFO "\n%s: Sending InARP request on DLCI %d.\n", | ||
| 3966 | card->devname, chan->dlci); | ||
| 3967 | clear_bit(ARP_CRIT,&card->wandev.critical); | ||
| 3968 | } | ||
| 3969 | |||
| 3970 | kfree(ArpPacket); | ||
| 3971 | }else{ | ||
| 3972 | printk(KERN_INFO "%s: INARP ERROR: %s doesn't have a local IP address!\n", | ||
| 3973 | card->devname,dev->name); | ||
| 3974 | return 1; | ||
| 3975 | } | ||
| 3976 | |||
| 3977 | return 0; | ||
| 3978 | } | ||
| 3979 | |||
| 3980 | |||
| 3981 | /*============================================================================== | ||
| 3982 | * Check packet for ARP Type | ||
| 3983 | */ | ||
| 3984 | |||
| 3985 | int is_arp(void *buf) | ||
| 3986 | { | ||
| 3987 | arphdr_1490_t *arphdr = (arphdr_1490_t *)buf; | ||
| 3988 | |||
| 3989 | if (arphdr->pad == 0x00 && | ||
| 3990 | arphdr->NLPID == 0x80 && | ||
| 3991 | arphdr->PID == 0x0608) | ||
| 3992 | return 1; | ||
| 3993 | else return 0; | ||
| 3994 | } | ||
| 3995 | |||
| 3996 | /*============================================================================== | ||
| 3997 | * Process ARP Packet Type | ||
| 3998 | */ | ||
| 3999 | |||
| 4000 | int process_ARP(arphdr_1490_t *ArpPacket, sdla_t *card, struct net_device* dev) | ||
| 4001 | { | ||
| 4002 | |||
| 4003 | |||
| 4004 | arphdr_fr_t *arphdr = (arphdr_fr_t *)(ArpPacket + 1); /* Skip header */ | ||
| 4005 | fr_rx_buf_ctl_t* frbuf = card->rxmb; | ||
| 4006 | struct in_device *in_dev; | ||
| 4007 | fr_channel_t *chan = dev->priv; | ||
| 4008 | |||
| 4009 | /* Before we transmit ARP packet, we must check | ||
| 4010 | * to see that we are not currently transmitting a | ||
| 4011 | * frame (in 'if_send()') and that we are not | ||
| 4012 | * already in a 'delayed transmit' state. */ | ||
| 4013 | if (check_tx_status(card,dev)){ | ||
| 4014 | if (net_ratelimit()){ | ||
| 4015 | printk(KERN_INFO "%s: Disabling comminication to process ARP\n", | ||
| 4016 | card->devname); | ||
| 4017 | } | ||
| 4018 | set_bit(ARP_CRIT,&card->wandev.critical); | ||
| 4019 | return 0; | ||
| 4020 | } | ||
| 4021 | |||
| 4022 | in_dev = dev->ip_ptr; | ||
| 4023 | |||
| 4024 | /* Check that IP addresses exist for our network address */ | ||
| 4025 | if (in_dev == NULL || in_dev->ifa_list == NULL) | ||
| 4026 | return -1; | ||
| 4027 | |||
| 4028 | switch (ntohs(arphdr->ar_op)) { | ||
| 4029 | |||
| 4030 | case 0x08: // Inverse ARP request -- Send Reply, add route. | ||
| 4031 | |||
| 4032 | /* Check for valid Address */ | ||
| 4033 | printk(KERN_INFO "%s: Recvd PtP addr -InArp Req: %u.%u.%u.%u\n", | ||
| 4034 | card->devname, NIPQUAD(arphdr->ar_sip)); | ||
| 4035 | |||
| 4036 | |||
| 4037 | /* Check that the network address is the same as ours, only | ||
| 4038 | * if the netowrk mask is not 255.255.255.255. Otherwise | ||
| 4039 | * this check would not make sense */ | ||
| 4040 | |||
| 4041 | if (in_dev->ifa_list->ifa_mask != 0xFFFFFFFF && | ||
| 4042 | (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) != | ||
| 4043 | (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)){ | ||
| 4044 | printk(KERN_INFO | ||
| 4045 | "%s: Invalid PtP address. %u.%u.%u.%u InARP ignored.\n", | ||
| 4046 | card->devname,NIPQUAD(arphdr->ar_sip)); | ||
| 4047 | |||
| 4048 | printk(KERN_INFO "%s: mask %u.%u.%u.%u\n", | ||
| 4049 | card->devname, NIPQUAD(in_dev->ifa_list->ifa_mask)); | ||
| 4050 | printk(KERN_INFO "%s: local %u.%u.%u.%u\n", | ||
| 4051 | card->devname,NIPQUAD(in_dev->ifa_list->ifa_local)); | ||
| 4052 | return -1; | ||
| 4053 | } | ||
| 4054 | |||
| 4055 | if (in_dev->ifa_list->ifa_local == arphdr->ar_sip){ | ||
| 4056 | printk(KERN_INFO | ||
| 4057 | "%s: Local addr = PtP addr. InARP ignored.\n", | ||
| 4058 | card->devname); | ||
| 4059 | return -1; | ||
| 4060 | } | ||
| 4061 | |||
| 4062 | arphdr->ar_op = htons(0x09); /* InARP Reply */ | ||
| 4063 | |||
| 4064 | /* Set addresses */ | ||
| 4065 | arphdr->ar_tip = arphdr->ar_sip; | ||
| 4066 | arphdr->ar_sip = in_dev->ifa_list->ifa_local; | ||
| 4067 | |||
| 4068 | chan->ip_local = in_dev->ifa_list->ifa_local; | ||
| 4069 | chan->ip_remote = arphdr->ar_sip; | ||
| 4070 | |||
| 4071 | fr_send(card, frbuf->dlci, 0, frbuf->length, (void *)ArpPacket); | ||
| 4072 | |||
| 4073 | if (test_bit(ARP_CRIT,&card->wandev.critical)){ | ||
| 4074 | if (net_ratelimit()){ | ||
| 4075 | printk(KERN_INFO "%s: ARP Processed Enabling Communication!\n", | ||
| 4076 | card->devname); | ||
| 4077 | } | ||
| 4078 | } | ||
| 4079 | clear_bit(ARP_CRIT,&card->wandev.critical); | ||
| 4080 | |||
| 4081 | chan->ip_local = in_dev->ifa_list->ifa_local; | ||
| 4082 | chan->ip_remote = arphdr->ar_sip; | ||
| 4083 | |||
| 4084 | /* Add Route Flag */ | ||
| 4085 | /* The route will be added in the polling routine so | ||
| 4086 | that it is not interrupt context. */ | ||
| 4087 | |||
| 4088 | chan->route_flag = ADD_ROUTE; | ||
| 4089 | trigger_fr_poll (dev); | ||
| 4090 | |||
| 4091 | break; | ||
| 4092 | |||
| 4093 | case 0x09: // Inverse ARP reply | ||
| 4094 | |||
| 4095 | /* Check for valid Address */ | ||
| 4096 | printk(KERN_INFO "%s: Recvd PtP addr %u.%u.%u.%u -InArp Reply\n", | ||
| 4097 | card->devname, NIPQUAD(arphdr->ar_sip)); | ||
| 4098 | |||
| 4099 | |||
| 4100 | /* Compare network addresses, only if network mask | ||
| 4101 | * is not 255.255.255.255 It would not make sense | ||
| 4102 | * to perform this test if the mask was all 1's */ | ||
| 4103 | |||
| 4104 | if (in_dev->ifa_list->ifa_mask != 0xffffffff && | ||
| 4105 | (in_dev->ifa_list->ifa_mask & arphdr->ar_sip) != | ||
| 4106 | (in_dev->ifa_list->ifa_mask & in_dev->ifa_list->ifa_local)) { | ||
| 4107 | |||
| 4108 | printk(KERN_INFO "%s: Invalid PtP address. InARP ignored.\n", | ||
| 4109 | card->devname); | ||
| 4110 | return -1; | ||
| 4111 | } | ||
| 4112 | |||
| 4113 | /* Make sure that the received IP address is not | ||
| 4114 | * the same as our own local address */ | ||
| 4115 | if (in_dev->ifa_list->ifa_local == arphdr->ar_sip) { | ||
| 4116 | printk(KERN_INFO "%s: Local addr = PtP addr. InARP ignored.\n", | ||
| 4117 | card->devname); | ||
| 4118 | return -1; | ||
| 4119 | } | ||
| 4120 | |||
| 4121 | chan->ip_local = in_dev->ifa_list->ifa_local; | ||
| 4122 | chan->ip_remote = arphdr->ar_sip; | ||
| 4123 | |||
| 4124 | /* Add Route Flag */ | ||
| 4125 | /* The route will be added in the polling routine so | ||
| 4126 | that it is not interrupt context. */ | ||
| 4127 | |||
| 4128 | chan->route_flag = ADD_ROUTE; | ||
| 4129 | chan->inarp = INARP_CONFIGURED; | ||
| 4130 | trigger_fr_poll(dev); | ||
| 4131 | |||
| 4132 | break; | ||
| 4133 | default: | ||
| 4134 | break; // ARP's and RARP's -- Shouldn't happen. | ||
| 4135 | } | ||
| 4136 | |||
| 4137 | return 0; | ||
| 4138 | } | ||
| 4139 | |||
| 4140 | |||
| 4141 | /*============================================================ | ||
| 4142 | * trigger_fr_arp | ||
| 4143 | * | ||
| 4144 | * Description: | ||
| 4145 | * Add an fr_arp() task into a arp | ||
| 4146 | * timer handler for a specific dlci/interface. | ||
| 4147 | * This will kick the fr_arp() routine | ||
| 4148 | * within the specified time interval. | ||
| 4149 | * | ||
| 4150 | * Usage: | ||
| 4151 | * This timer is used to send ARP requests at | ||
| 4152 | * certain time intervals. | ||
| 4153 | * Called by an interrupt to request an action | ||
| 4154 | * at a later date. | ||
| 4155 | */ | ||
| 4156 | |||
| 4157 | static void trigger_fr_arp(struct net_device *dev) | ||
| 4158 | { | ||
| 4159 | fr_channel_t* chan = dev->priv; | ||
| 4160 | |||
| 4161 | mod_timer(&chan->fr_arp_timer, jiffies + chan->inarp_interval * HZ); | ||
| 4162 | return; | ||
| 4163 | } | ||
| 4164 | |||
| 4165 | |||
| 4166 | |||
| 4167 | /*============================================================================== | ||
| 4168 | * ARP Request Action | ||
| 4169 | * | ||
| 4170 | * This funciton is called by timer interrupt to send an arp request | ||
| 4171 | * to the remote end. | ||
| 4172 | */ | ||
| 4173 | |||
| 4174 | static void fr_arp (unsigned long data) | ||
| 4175 | { | ||
| 4176 | struct net_device *dev = (struct net_device *)data; | ||
| 4177 | fr_channel_t *chan = dev->priv; | ||
| 4178 | volatile sdla_t *card = chan->card; | ||
| 4179 | fr508_flags_t* flags = card->flags; | ||
| 4180 | |||
| 4181 | /* Send ARP packets for all devs' until | ||
| 4182 | * ARP state changes to CONFIGURED */ | ||
| 4183 | |||
| 4184 | if (chan->inarp == INARP_REQUEST && | ||
| 4185 | chan->common.state == WAN_CONNECTED && | ||
| 4186 | card->wandev.state == WAN_CONNECTED){ | ||
| 4187 | set_bit(0,&chan->inarp_ready); | ||
| 4188 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_ARP; | ||
| 4189 | flags->imask |= FR_INTR_TIMER; | ||
| 4190 | } | ||
| 4191 | |||
| 4192 | return; | ||
| 4193 | } | ||
| 4194 | |||
| 4195 | |||
| 4196 | /*============================================================================== | ||
| 4197 | * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR_ | ||
| 4198 | * TEST_COUNTER times. | ||
| 4199 | */ | ||
| 4200 | static int intr_test( sdla_t* card ) | ||
| 4201 | { | ||
| 4202 | fr_mbox_t* mb = card->mbox; | ||
| 4203 | int err,i; | ||
| 4204 | |||
| 4205 | err = fr_set_intr_mode(card, FR_INTR_READY, card->wandev.mtu, 0 ); | ||
| 4206 | |||
| 4207 | if (err == CMD_OK) { | ||
| 4208 | |||
| 4209 | for ( i = 0; i < MAX_INTR_TEST_COUNTER; i++ ) { | ||
| 4210 | /* Run command READ_CODE_VERSION */ | ||
| 4211 | mb->cmd.length = 0; | ||
| 4212 | mb->cmd.command = FR_READ_CODE_VERSION; | ||
| 4213 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 4214 | if (err != CMD_OK) | ||
| 4215 | fr_event(card, err, mb); | ||
| 4216 | } | ||
| 4217 | |||
| 4218 | } else { | ||
| 4219 | return err; | ||
| 4220 | } | ||
| 4221 | |||
| 4222 | err = fr_set_intr_mode( card, 0, card->wandev.mtu, 0 ); | ||
| 4223 | |||
| 4224 | if( err != CMD_OK ) | ||
| 4225 | return err; | ||
| 4226 | |||
| 4227 | return 0; | ||
| 4228 | } | ||
| 4229 | |||
| 4230 | /*============================================================================== | ||
| 4231 | * Determine what type of UDP call it is. FPIPE8ND ? | ||
| 4232 | */ | ||
| 4233 | static int udp_pkt_type( struct sk_buff *skb, sdla_t* card ) | ||
| 4234 | { | ||
| 4235 | fr_udp_pkt_t *fr_udp_pkt = (fr_udp_pkt_t *)skb->data; | ||
| 4236 | |||
| 4237 | /* Quick HACK */ | ||
| 4238 | |||
| 4239 | |||
| 4240 | if((fr_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) && | ||
| 4241 | (fr_udp_pkt->ip_pkt.ver_inet_hdr_length == 0x45) && | ||
| 4242 | (fr_udp_pkt->udp_pkt.udp_dst_port == | ||
| 4243 | ntohs(card->wandev.udp_port)) && | ||
| 4244 | (fr_udp_pkt->wp_mgmt.request_reply == | ||
| 4245 | UDPMGMT_REQUEST)) { | ||
| 4246 | if(!strncmp(fr_udp_pkt->wp_mgmt.signature, | ||
| 4247 | UDPMGMT_FPIPE_SIGNATURE, 8)){ | ||
| 4248 | return UDP_FPIPE_TYPE; | ||
| 4249 | } | ||
| 4250 | } | ||
| 4251 | return UDP_INVALID_TYPE; | ||
| 4252 | } | ||
| 4253 | |||
| 4254 | |||
| 4255 | /*============================================================================== | ||
| 4256 | * Initializes the Statistics values in the fr_channel structure. | ||
| 4257 | */ | ||
| 4258 | void init_chan_statistics( fr_channel_t* chan) | ||
| 4259 | { | ||
| 4260 | memset(&chan->drvstats_if_send.if_send_entry, 0, | ||
| 4261 | sizeof(if_send_stat_t)); | ||
| 4262 | memset(&chan->drvstats_rx_intr.rx_intr_no_socket, 0, | ||
| 4263 | sizeof(rx_intr_stat_t)); | ||
| 4264 | memset(&chan->drvstats_gen.UDP_PIPE_mgmt_kmalloc_err, 0, | ||
| 4265 | sizeof(pipe_mgmt_stat_t)); | ||
| 4266 | } | ||
| 4267 | |||
| 4268 | /*============================================================================== | ||
| 4269 | * Initializes the Statistics values in the Sdla_t structure. | ||
| 4270 | */ | ||
| 4271 | void init_global_statistics( sdla_t* card ) | ||
| 4272 | { | ||
| 4273 | /* Intialize global statistics for a card */ | ||
| 4274 | memset(&card->statistics.isr_entry, 0, sizeof(global_stats_t)); | ||
| 4275 | } | ||
| 4276 | |||
| 4277 | static void read_DLCI_IB_mapping( sdla_t* card, fr_channel_t* chan ) | ||
| 4278 | { | ||
| 4279 | fr_mbox_t* mbox = card->mbox; | ||
| 4280 | int retry = MAX_CMD_RETRY; | ||
| 4281 | dlci_IB_mapping_t* result; | ||
| 4282 | int err, counter, found; | ||
| 4283 | |||
| 4284 | do { | ||
| 4285 | mbox->cmd.command = FR_READ_DLCI_IB_MAPPING; | ||
| 4286 | mbox->cmd.length = 0; | ||
| 4287 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4288 | } while (err && retry-- && fr_event(card, err, mbox)); | ||
| 4289 | |||
| 4290 | if( mbox->cmd.result != 0){ | ||
| 4291 | printk(KERN_INFO "%s: Read DLCI IB Mapping failed\n", | ||
| 4292 | chan->name); | ||
| 4293 | } | ||
| 4294 | |||
| 4295 | counter = mbox->cmd.length / sizeof(dlci_IB_mapping_t); | ||
| 4296 | result = (void *)mbox->data; | ||
| 4297 | |||
| 4298 | found = 0; | ||
| 4299 | for (; counter; --counter, ++result) { | ||
| 4300 | if ( result->dlci == chan->dlci ) { | ||
| 4301 | chan->IB_addr = result->addr_value; | ||
| 4302 | if(card->hw.type == SDLA_S514){ | ||
| 4303 | chan->dlci_int_interface = | ||
| 4304 | (void*)(card->hw.dpmbase + | ||
| 4305 | chan->IB_addr); | ||
| 4306 | }else{ | ||
| 4307 | chan->dlci_int_interface = | ||
| 4308 | (void*)(card->hw.dpmbase + | ||
| 4309 | (chan->IB_addr & 0x00001FFF)); | ||
| 4310 | |||
| 4311 | } | ||
| 4312 | found = 1; | ||
| 4313 | break; | ||
| 4314 | } | ||
| 4315 | } | ||
| 4316 | if (!found) | ||
| 4317 | printk( KERN_INFO "%s: DLCI %d not found by IB MAPPING cmd\n", | ||
| 4318 | card->devname, chan->dlci); | ||
| 4319 | } | ||
| 4320 | |||
| 4321 | |||
| 4322 | |||
| 4323 | void s508_s514_lock(sdla_t *card, unsigned long *smp_flags) | ||
| 4324 | { | ||
| 4325 | if (card->hw.type != SDLA_S514){ | ||
| 4326 | |||
| 4327 | spin_lock_irqsave(&card->wandev.lock, *smp_flags); | ||
| 4328 | }else{ | ||
| 4329 | spin_lock(&card->u.f.if_send_lock); | ||
| 4330 | } | ||
| 4331 | return; | ||
| 4332 | } | ||
| 4333 | |||
| 4334 | |||
| 4335 | void s508_s514_unlock(sdla_t *card, unsigned long *smp_flags) | ||
| 4336 | { | ||
| 4337 | if (card->hw.type != SDLA_S514){ | ||
| 4338 | |||
| 4339 | spin_unlock_irqrestore (&card->wandev.lock, *smp_flags); | ||
| 4340 | }else{ | ||
| 4341 | spin_unlock(&card->u.f.if_send_lock); | ||
| 4342 | } | ||
| 4343 | return; | ||
| 4344 | } | ||
| 4345 | |||
| 4346 | |||
| 4347 | |||
| 4348 | /*---------------------------------------------------------------------- | ||
| 4349 | RECEIVE INTERRUPT: BOTTOM HALF HANDLERS | ||
| 4350 | ----------------------------------------------------------------------*/ | ||
| 4351 | |||
| 4352 | |||
| 4353 | /*======================================================== | ||
| 4354 | * bh_enqueue | ||
| 4355 | * | ||
| 4356 | * Description: | ||
| 4357 | * Insert a received packet into a circular | ||
| 4358 | * rx queue. This packet will be picked up | ||
| 4359 | * by fr_bh() and sent up the stack to the | ||
| 4360 | * user. | ||
| 4361 | * | ||
| 4362 | * Usage: | ||
| 4363 | * This function is called by rx interrupt, | ||
| 4364 | * in API mode. | ||
| 4365 | * | ||
| 4366 | */ | ||
| 4367 | |||
| 4368 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb) | ||
| 4369 | { | ||
| 4370 | /* Check for full */ | ||
| 4371 | fr_channel_t* chan = dev->priv; | ||
| 4372 | sdla_t *card = chan->card; | ||
| 4373 | |||
| 4374 | |||
| 4375 | if (atomic_read(&chan->bh_buff_used) == MAX_BH_BUFF){ | ||
| 4376 | ++card->wandev.stats.rx_dropped; | ||
| 4377 | dev_kfree_skb_any(skb); | ||
| 4378 | return 1; | ||
| 4379 | } | ||
| 4380 | |||
| 4381 | ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb; | ||
| 4382 | |||
| 4383 | if (chan->bh_write == (MAX_BH_BUFF-1)){ | ||
| 4384 | chan->bh_write=0; | ||
| 4385 | }else{ | ||
| 4386 | ++chan->bh_write; | ||
| 4387 | } | ||
| 4388 | |||
| 4389 | atomic_inc(&chan->bh_buff_used); | ||
| 4390 | |||
| 4391 | return 0; | ||
| 4392 | } | ||
| 4393 | |||
| 4394 | |||
| 4395 | /*======================================================== | ||
| 4396 | * trigger_fr_bh | ||
| 4397 | * | ||
| 4398 | * Description: | ||
| 4399 | * Kick the fr_bh() handler | ||
| 4400 | * | ||
| 4401 | * Usage: | ||
| 4402 | * rx interrupt calls this function during | ||
| 4403 | * the API mode. | ||
| 4404 | */ | ||
| 4405 | |||
| 4406 | static void trigger_fr_bh (fr_channel_t *chan) | ||
| 4407 | { | ||
| 4408 | if (!test_and_set_bit(0,&chan->tq_working)){ | ||
| 4409 | wanpipe_queue_work(&chan->common.wanpipe_work); | ||
| 4410 | } | ||
| 4411 | } | ||
| 4412 | |||
| 4413 | |||
| 4414 | /*======================================================== | ||
| 4415 | * fr_bh | ||
| 4416 | * | ||
| 4417 | * Description: | ||
| 4418 | * Frame relay receive BH handler. | ||
| 4419 | * Dequeue data from the BH circular | ||
| 4420 | * buffer and pass it up the API sock. | ||
| 4421 | * | ||
| 4422 | * Rationale: | ||
| 4423 | * This fuction is used to offload the | ||
| 4424 | * rx_interrupt during API operation mode. | ||
| 4425 | * The fr_bh() function executes for each | ||
| 4426 | * dlci/interface. | ||
| 4427 | * | ||
| 4428 | * Once receive interrupt copies data from the | ||
| 4429 | * card into an skb buffer, the skb buffer | ||
| 4430 | * is appended to a circular BH buffer. | ||
| 4431 | * Then the interrupt kicks fr_bh() to finish the | ||
| 4432 | * job at a later time (not within the interrupt). | ||
| 4433 | * | ||
| 4434 | * Usage: | ||
| 4435 | * Interrupts use this to defer a task to | ||
| 4436 | * a polling routine. | ||
| 4437 | * | ||
| 4438 | */ | ||
| 4439 | |||
| 4440 | static void fr_bh(struct net_device * dev) | ||
| 4441 | { | ||
| 4442 | fr_channel_t* chan = dev->priv; | ||
| 4443 | sdla_t *card = chan->card; | ||
| 4444 | struct sk_buff *skb; | ||
| 4445 | |||
| 4446 | if (atomic_read(&chan->bh_buff_used) == 0){ | ||
| 4447 | clear_bit(0, &chan->tq_working); | ||
| 4448 | return; | ||
| 4449 | } | ||
| 4450 | |||
| 4451 | while (atomic_read(&chan->bh_buff_used)){ | ||
| 4452 | |||
| 4453 | if (chan->common.sk == NULL || chan->common.func == NULL){ | ||
| 4454 | clear_bit(0, &chan->tq_working); | ||
| 4455 | return; | ||
| 4456 | } | ||
| 4457 | |||
| 4458 | skb = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb; | ||
| 4459 | |||
| 4460 | if (skb != NULL){ | ||
| 4461 | |||
| 4462 | if (chan->common.sk == NULL || chan->common.func == NULL){ | ||
| 4463 | ++card->wandev.stats.rx_dropped; | ||
| 4464 | ++chan->ifstats.rx_dropped; | ||
| 4465 | dev_kfree_skb_any(skb); | ||
| 4466 | fr_bh_cleanup(dev); | ||
| 4467 | continue; | ||
| 4468 | } | ||
| 4469 | |||
| 4470 | if (chan->common.func(skb,dev,chan->common.sk) != 0){ | ||
| 4471 | /* Sock full cannot send, queue us for | ||
| 4472 | * another try */ | ||
| 4473 | atomic_set(&chan->common.receive_block,1); | ||
| 4474 | return; | ||
| 4475 | }else{ | ||
| 4476 | fr_bh_cleanup(dev); | ||
| 4477 | } | ||
| 4478 | }else{ | ||
| 4479 | fr_bh_cleanup(dev); | ||
| 4480 | } | ||
| 4481 | } | ||
| 4482 | clear_bit(0, &chan->tq_working); | ||
| 4483 | |||
| 4484 | return; | ||
| 4485 | } | ||
| 4486 | |||
| 4487 | static int fr_bh_cleanup(struct net_device *dev) | ||
| 4488 | { | ||
| 4489 | fr_channel_t* chan = dev->priv; | ||
| 4490 | |||
| 4491 | ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL; | ||
| 4492 | |||
| 4493 | if (chan->bh_read == (MAX_BH_BUFF-1)){ | ||
| 4494 | chan->bh_read=0; | ||
| 4495 | }else{ | ||
| 4496 | ++chan->bh_read; | ||
| 4497 | } | ||
| 4498 | |||
| 4499 | atomic_dec(&chan->bh_buff_used); | ||
| 4500 | return 0; | ||
| 4501 | } | ||
| 4502 | |||
| 4503 | |||
| 4504 | /*---------------------------------------------------------------------- | ||
| 4505 | POLL BH HANDLERS AND KICK ROUTINES | ||
| 4506 | ----------------------------------------------------------------------*/ | ||
| 4507 | |||
| 4508 | /*============================================================ | ||
| 4509 | * trigger_fr_poll | ||
| 4510 | * | ||
| 4511 | * Description: | ||
| 4512 | * Add a fr_poll() task into a tq_scheduler bh handler | ||
| 4513 | * for a specific dlci/interface. This will kick | ||
| 4514 | * the fr_poll() routine at a later time. | ||
| 4515 | * | ||
| 4516 | * Usage: | ||
| 4517 | * Interrupts use this to defer a taks to | ||
| 4518 | * a polling routine. | ||
| 4519 | * | ||
| 4520 | */ | ||
| 4521 | static void trigger_fr_poll(struct net_device *dev) | ||
| 4522 | { | ||
| 4523 | fr_channel_t* chan = dev->priv; | ||
| 4524 | schedule_work(&chan->fr_poll_work); | ||
| 4525 | return; | ||
| 4526 | } | ||
| 4527 | |||
| 4528 | |||
| 4529 | /*============================================================ | ||
| 4530 | * fr_poll | ||
| 4531 | * | ||
| 4532 | * Rationale: | ||
| 4533 | * We cannot manipulate the routing tables, or | ||
| 4534 | * ip addresses withing the interrupt. Therefore | ||
| 4535 | * we must perform such actons outside an interrupt | ||
| 4536 | * at a later time. | ||
| 4537 | * | ||
| 4538 | * Description: | ||
| 4539 | * Frame relay polling routine, responsible for | ||
| 4540 | * shutting down interfaces upon disconnect | ||
| 4541 | * and adding/removing routes. | ||
| 4542 | * | ||
| 4543 | * Usage: | ||
| 4544 | * This function is executed for each frame relay | ||
| 4545 | * dlci/interface through a tq_schedule bottom half. | ||
| 4546 | * | ||
| 4547 | * trigger_fr_poll() function is used to kick | ||
| 4548 | * the fr_poll routine. | ||
| 4549 | */ | ||
| 4550 | |||
| 4551 | static void fr_poll(struct net_device *dev) | ||
| 4552 | { | ||
| 4553 | |||
| 4554 | fr_channel_t* chan; | ||
| 4555 | sdla_t *card; | ||
| 4556 | u8 check_gateway=0; | ||
| 4557 | |||
| 4558 | if (!dev || (chan = dev->priv) == NULL) | ||
| 4559 | return; | ||
| 4560 | |||
| 4561 | card = chan->card; | ||
| 4562 | |||
| 4563 | /* (Re)Configuraiton is in progress, stop what you are | ||
| 4564 | * doing and get out */ | ||
| 4565 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 4566 | return; | ||
| 4567 | } | ||
| 4568 | |||
| 4569 | switch (chan->common.state){ | ||
| 4570 | |||
| 4571 | case WAN_DISCONNECTED: | ||
| 4572 | |||
| 4573 | if (test_bit(DYN_OPT_ON,&chan->interface_down) && | ||
| 4574 | !test_bit(DEV_DOWN, &chan->interface_down) && | ||
| 4575 | dev->flags&IFF_UP){ | ||
| 4576 | |||
| 4577 | printk(KERN_INFO "%s: Interface %s is Down.\n", | ||
| 4578 | card->devname,dev->name); | ||
| 4579 | change_dev_flags(dev,dev->flags&~IFF_UP); | ||
| 4580 | set_bit(DEV_DOWN, &chan->interface_down); | ||
| 4581 | chan->route_flag = NO_ROUTE; | ||
| 4582 | |||
| 4583 | }else{ | ||
| 4584 | if (chan->inarp != INARP_NONE) | ||
| 4585 | process_route(dev); | ||
| 4586 | } | ||
| 4587 | break; | ||
| 4588 | |||
| 4589 | case WAN_CONNECTED: | ||
| 4590 | |||
| 4591 | if (test_bit(DYN_OPT_ON,&chan->interface_down) && | ||
| 4592 | test_bit(DEV_DOWN, &chan->interface_down) && | ||
| 4593 | !(dev->flags&IFF_UP)){ | ||
| 4594 | |||
| 4595 | printk(KERN_INFO "%s: Interface %s is Up.\n", | ||
| 4596 | card->devname,dev->name); | ||
| 4597 | |||
| 4598 | change_dev_flags(dev,dev->flags|IFF_UP); | ||
| 4599 | clear_bit(DEV_DOWN, &chan->interface_down); | ||
| 4600 | check_gateway=1; | ||
| 4601 | } | ||
| 4602 | |||
| 4603 | if (chan->inarp != INARP_NONE){ | ||
| 4604 | process_route(dev); | ||
| 4605 | check_gateway=1; | ||
| 4606 | } | ||
| 4607 | |||
| 4608 | if (chan->gateway && check_gateway) | ||
| 4609 | add_gateway(card,dev); | ||
| 4610 | |||
| 4611 | break; | ||
| 4612 | |||
| 4613 | } | ||
| 4614 | |||
| 4615 | return; | ||
| 4616 | } | ||
| 4617 | |||
| 4618 | /*============================================================== | ||
| 4619 | * check_tx_status | ||
| 4620 | * | ||
| 4621 | * Rationale: | ||
| 4622 | * We cannot transmit from an interrupt while | ||
| 4623 | * the if_send is transmitting data. Therefore, | ||
| 4624 | * we must check whether the tx buffers are | ||
| 4625 | * begin used, before we transmit from an | ||
| 4626 | * interrupt. | ||
| 4627 | * | ||
| 4628 | * Description: | ||
| 4629 | * Checks whether it's safe to use the transmit | ||
| 4630 | * buffers. | ||
| 4631 | * | ||
| 4632 | * Usage: | ||
| 4633 | * ARP and UDP handling routines use this function | ||
| 4634 | * because, they need to transmit data during | ||
| 4635 | * an interrupt. | ||
| 4636 | */ | ||
| 4637 | |||
| 4638 | static int check_tx_status(sdla_t *card, struct net_device *dev) | ||
| 4639 | { | ||
| 4640 | |||
| 4641 | if (card->hw.type == SDLA_S514){ | ||
| 4642 | if (test_bit(SEND_CRIT, (void*)&card->wandev.critical) || | ||
| 4643 | test_bit(SEND_TXIRQ_CRIT, (void*)&card->wandev.critical)) { | ||
| 4644 | return 1; | ||
| 4645 | } | ||
| 4646 | } | ||
| 4647 | |||
| 4648 | if (netif_queue_stopped(dev) || (card->u.f.tx_interrupts_pending)) | ||
| 4649 | return 1; | ||
| 4650 | |||
| 4651 | return 0; | ||
| 4652 | } | ||
| 4653 | |||
| 4654 | /*=============================================================== | ||
| 4655 | * move_dev_to_next | ||
| 4656 | * | ||
| 4657 | * Description: | ||
| 4658 | * Move the dev pointer to the next location in the | ||
| 4659 | * link list. Check if we are at the end of the | ||
| 4660 | * list, if so start from the begining. | ||
| 4661 | * | ||
| 4662 | * Usage: | ||
| 4663 | * Timer interrupt uses this function to efficiently | ||
| 4664 | * step through the devices that need to send ARP data. | ||
| 4665 | * | ||
| 4666 | */ | ||
| 4667 | |||
| 4668 | struct net_device *move_dev_to_next(sdla_t *card, struct net_device *dev) | ||
| 4669 | { | ||
| 4670 | if (card->wandev.new_if_cnt != 1){ | ||
| 4671 | if (!*((struct net_device **)dev->priv)) | ||
| 4672 | return card->wandev.dev; | ||
| 4673 | else | ||
| 4674 | return *((struct net_device **)dev->priv); | ||
| 4675 | } | ||
| 4676 | return dev; | ||
| 4677 | } | ||
| 4678 | |||
| 4679 | /*============================================================== | ||
| 4680 | * trigger_config_fr | ||
| 4681 | * | ||
| 4682 | * Rationale: | ||
| 4683 | * All commands must be performed inside of a | ||
| 4684 | * interrupt. | ||
| 4685 | * | ||
| 4686 | * Description: | ||
| 4687 | * Kick the config_fr() routine throught the | ||
| 4688 | * timer interrupt. | ||
| 4689 | */ | ||
| 4690 | |||
| 4691 | |||
| 4692 | static void trigger_config_fr (sdla_t *card) | ||
| 4693 | { | ||
| 4694 | fr508_flags_t* flags = card->flags; | ||
| 4695 | |||
| 4696 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_CONFIG; | ||
| 4697 | flags->imask |= FR_INTR_TIMER; | ||
| 4698 | } | ||
| 4699 | |||
| 4700 | |||
| 4701 | /*============================================================== | ||
| 4702 | * config_fr | ||
| 4703 | * | ||
| 4704 | * Rationale: | ||
| 4705 | * All commands must be performed inside of a | ||
| 4706 | * interrupt. | ||
| 4707 | & | ||
| 4708 | * Description: | ||
| 4709 | * Configure a DLCI. This function is executed | ||
| 4710 | * by a timer_interrupt. The if_open() function | ||
| 4711 | * triggers it. | ||
| 4712 | * | ||
| 4713 | * Usage: | ||
| 4714 | * new_if() collects all data necessary to | ||
| 4715 | * configure the DLCI. It sets the chan->dlci_ready | ||
| 4716 | * bit. When the if_open() function is executed | ||
| 4717 | * it checks this bit, and if its set it triggers | ||
| 4718 | * the timer interrupt to execute the config_fr() | ||
| 4719 | * function. | ||
| 4720 | */ | ||
| 4721 | |||
| 4722 | static void config_fr (sdla_t *card) | ||
| 4723 | { | ||
| 4724 | struct net_device *dev; | ||
| 4725 | fr_channel_t *chan; | ||
| 4726 | |||
| 4727 | for (dev = card->wandev.dev; dev; | ||
| 4728 | dev = *((struct net_device **)dev->priv)) { | ||
| 4729 | |||
| 4730 | if ((chan=dev->priv) == NULL) | ||
| 4731 | continue; | ||
| 4732 | |||
| 4733 | if (!test_bit(0,&chan->config_dlci)) | ||
| 4734 | continue; | ||
| 4735 | |||
| 4736 | clear_bit(0,&chan->config_dlci); | ||
| 4737 | |||
| 4738 | /* If signalling is set to NO, then setup | ||
| 4739 | * DLCI addresses right away. Don't have to wait for | ||
| 4740 | * link to connect. | ||
| 4741 | */ | ||
| 4742 | if (card->wandev.signalling == WANOPT_NO){ | ||
| 4743 | printk(KERN_INFO "%s: Signalling set to NO: Mapping DLCI's\n", | ||
| 4744 | card->wandev.name); | ||
| 4745 | if (fr_init_dlci(card,chan)){ | ||
| 4746 | printk(KERN_INFO "%s: ERROR: Failed to configure DLCI %i !\n", | ||
| 4747 | card->devname, chan->dlci); | ||
| 4748 | return; | ||
| 4749 | } | ||
| 4750 | } | ||
| 4751 | |||
| 4752 | if (card->wandev.station == WANOPT_CPE) { | ||
| 4753 | |||
| 4754 | update_chan_state(dev); | ||
| 4755 | |||
| 4756 | /* CPE: issue full status enquiry */ | ||
| 4757 | fr_issue_isf(card, FR_ISF_FSE); | ||
| 4758 | |||
| 4759 | } else { | ||
| 4760 | /* FR switch: activate DLCI(s) */ | ||
| 4761 | |||
| 4762 | /* For Switch emulation we have to ADD and ACTIVATE | ||
| 4763 | * the DLCI(s) that were configured with the SET_DLCI_ | ||
| 4764 | * CONFIGURATION command. Add and Activate will fail if | ||
| 4765 | * DLCI specified is not included in the list. | ||
| 4766 | * | ||
| 4767 | * Also If_open is called once for each interface. But | ||
| 4768 | * it does not get in here for all the interface. So | ||
| 4769 | * we have to pass the entire list of DLCI(s) to add | ||
| 4770 | * activate routines. | ||
| 4771 | */ | ||
| 4772 | |||
| 4773 | if (!check_dlci_config (card, chan)){ | ||
| 4774 | fr_add_dlci(card, chan->dlci); | ||
| 4775 | fr_activate_dlci(card, chan->dlci); | ||
| 4776 | } | ||
| 4777 | } | ||
| 4778 | |||
| 4779 | card->u.f.dlci_to_dev_map[chan->dlci] = dev; | ||
| 4780 | } | ||
| 4781 | return; | ||
| 4782 | } | ||
| 4783 | |||
| 4784 | |||
| 4785 | /*============================================================== | ||
| 4786 | * config_fr | ||
| 4787 | * | ||
| 4788 | * Rationale: | ||
| 4789 | * All commands must be executed during an interrupt. | ||
| 4790 | * | ||
| 4791 | * Description: | ||
| 4792 | * Trigger uncofig_fr() function through | ||
| 4793 | * the timer interrupt. | ||
| 4794 | * | ||
| 4795 | */ | ||
| 4796 | |||
| 4797 | static void trigger_unconfig_fr(struct net_device *dev) | ||
| 4798 | { | ||
| 4799 | fr_channel_t *chan = dev->priv; | ||
| 4800 | volatile sdla_t *card = chan->card; | ||
| 4801 | unsigned long timeout; | ||
| 4802 | fr508_flags_t* flags = card->flags; | ||
| 4803 | int reset_critical=0; | ||
| 4804 | |||
| 4805 | if (test_bit(PERI_CRIT,(void*)&card->wandev.critical)){ | ||
| 4806 | clear_bit(PERI_CRIT,(void*)&card->wandev.critical); | ||
| 4807 | reset_critical=1; | ||
| 4808 | } | ||
| 4809 | |||
| 4810 | /* run unconfig_dlci() function | ||
| 4811 | * throught the timer interrupt */ | ||
| 4812 | set_bit(0,(void*)&chan->unconfig_dlci); | ||
| 4813 | card->u.f.timer_int_enabled |= TMR_INT_ENABLED_UNCONFIG; | ||
| 4814 | flags->imask |= FR_INTR_TIMER; | ||
| 4815 | |||
| 4816 | /* Wait for the command to complete */ | ||
| 4817 | timeout = jiffies; | ||
| 4818 | for(;;) { | ||
| 4819 | |||
| 4820 | if(!(card->u.f.timer_int_enabled & TMR_INT_ENABLED_UNCONFIG)) | ||
| 4821 | break; | ||
| 4822 | |||
| 4823 | if (time_after(jiffies, timeout + 1 * HZ)){ | ||
| 4824 | card->u.f.timer_int_enabled &= ~TMR_INT_ENABLED_UNCONFIG; | ||
| 4825 | printk(KERN_INFO "%s: Failed to delete DLCI %i\n", | ||
| 4826 | card->devname,chan->dlci); | ||
| 4827 | break; | ||
| 4828 | } | ||
| 4829 | } | ||
| 4830 | |||
| 4831 | if (reset_critical){ | ||
| 4832 | set_bit(PERI_CRIT,(void*)&card->wandev.critical); | ||
| 4833 | } | ||
| 4834 | } | ||
| 4835 | |||
| 4836 | /*============================================================== | ||
| 4837 | * unconfig_fr | ||
| 4838 | * | ||
| 4839 | * Rationale: | ||
| 4840 | * All commands must be executed during an interrupt. | ||
| 4841 | * | ||
| 4842 | * Description: | ||
| 4843 | * Remove the dlci from firmware. | ||
| 4844 | * This funciton is used in NODE shutdown. | ||
| 4845 | */ | ||
| 4846 | |||
| 4847 | static void unconfig_fr (sdla_t *card) | ||
| 4848 | { | ||
| 4849 | struct net_device *dev; | ||
| 4850 | fr_channel_t *chan; | ||
| 4851 | |||
| 4852 | for (dev = card->wandev.dev; dev; | ||
| 4853 | dev = *((struct net_device **)dev->priv)){ | ||
| 4854 | |||
| 4855 | if ((chan=dev->priv) == NULL) | ||
| 4856 | continue; | ||
| 4857 | |||
| 4858 | if (!test_bit(0,&chan->unconfig_dlci)) | ||
| 4859 | continue; | ||
| 4860 | |||
| 4861 | clear_bit(0,&chan->unconfig_dlci); | ||
| 4862 | |||
| 4863 | if (card->wandev.station == WANOPT_NODE){ | ||
| 4864 | printk(KERN_INFO "%s: Unconfiguring DLCI %i\n", | ||
| 4865 | card->devname,chan->dlci); | ||
| 4866 | fr_delete_dlci(card,chan->dlci); | ||
| 4867 | } | ||
| 4868 | card->u.f.dlci_to_dev_map[chan->dlci] = NULL; | ||
| 4869 | } | ||
| 4870 | } | ||
| 4871 | |||
| 4872 | static int setup_fr_header(struct sk_buff *skb, struct net_device* dev, | ||
| 4873 | char op_mode) | ||
| 4874 | { | ||
| 4875 | fr_channel_t *chan=dev->priv; | ||
| 4876 | |||
| 4877 | if (op_mode == WANPIPE) { | ||
| 4878 | chan->fr_header[0]=Q922_UI; | ||
| 4879 | |||
| 4880 | switch (htons(skb->protocol)){ | ||
| 4881 | case ETH_P_IP: | ||
| 4882 | chan->fr_header[1]=NLPID_IP; | ||
| 4883 | break; | ||
| 4884 | default: | ||
| 4885 | return -EINVAL; | ||
| 4886 | } | ||
| 4887 | |||
| 4888 | return 2; | ||
| 4889 | } | ||
| 4890 | |||
| 4891 | /* If we are in bridging mode, we must apply | ||
| 4892 | * an Ethernet header | ||
| 4893 | */ | ||
| 4894 | if (op_mode == BRIDGE || op_mode == BRIDGE_NODE) { | ||
| 4895 | /* Encapsulate the packet as a bridged Ethernet frame. */ | ||
| 4896 | #ifdef DEBUG | ||
| 4897 | printk(KERN_INFO "%s: encapsulating skb for frame relay\n", | ||
| 4898 | dev->name); | ||
| 4899 | #endif | ||
| 4900 | chan->fr_header[0] = 0x03; | ||
| 4901 | chan->fr_header[1] = 0x00; | ||
| 4902 | chan->fr_header[2] = 0x80; | ||
| 4903 | chan->fr_header[3] = 0x00; | ||
| 4904 | chan->fr_header[4] = 0x80; | ||
| 4905 | chan->fr_header[5] = 0xC2; | ||
| 4906 | chan->fr_header[6] = 0x00; | ||
| 4907 | chan->fr_header[7] = 0x07; | ||
| 4908 | |||
| 4909 | /* Yuck. */ | ||
| 4910 | skb->protocol = ETH_P_802_3; | ||
| 4911 | return 8; | ||
| 4912 | } | ||
| 4913 | |||
| 4914 | return 0; | ||
| 4915 | } | ||
| 4916 | |||
| 4917 | |||
| 4918 | static int check_dlci_config (sdla_t *card, fr_channel_t *chan) | ||
| 4919 | { | ||
| 4920 | fr_mbox_t* mbox = card->mbox; | ||
| 4921 | int err=0; | ||
| 4922 | fr_conf_t *conf=NULL; | ||
| 4923 | unsigned short dlci_num = chan->dlci; | ||
| 4924 | int dlci_offset=0; | ||
| 4925 | struct net_device *dev = NULL; | ||
| 4926 | |||
| 4927 | mbox->cmd.command = FR_READ_CONFIG; | ||
| 4928 | mbox->cmd.length = 0; | ||
| 4929 | mbox->cmd.dlci = dlci_num; | ||
| 4930 | |||
| 4931 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4932 | |||
| 4933 | if (err == CMD_OK){ | ||
| 4934 | return 0; | ||
| 4935 | } | ||
| 4936 | |||
| 4937 | for (dev = card->wandev.dev; dev; | ||
| 4938 | dev=*((struct net_device **)dev->priv)) | ||
| 4939 | set_chan_state(dev,WAN_DISCONNECTED); | ||
| 4940 | |||
| 4941 | printk(KERN_INFO "DLCI %i Not configured, configuring\n",dlci_num); | ||
| 4942 | |||
| 4943 | mbox->cmd.command = FR_COMM_DISABLE; | ||
| 4944 | mbox->cmd.length = 0; | ||
| 4945 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4946 | if (err != CMD_OK){ | ||
| 4947 | fr_event(card, err, mbox); | ||
| 4948 | return 2; | ||
| 4949 | } | ||
| 4950 | |||
| 4951 | printk(KERN_INFO "Disabled Communications \n"); | ||
| 4952 | |||
| 4953 | mbox->cmd.command = FR_READ_CONFIG; | ||
| 4954 | mbox->cmd.length = 0; | ||
| 4955 | mbox->cmd.dlci = 0; | ||
| 4956 | |||
| 4957 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4958 | |||
| 4959 | if (err != CMD_OK){ | ||
| 4960 | fr_event(card, err, mbox); | ||
| 4961 | return 2; | ||
| 4962 | } | ||
| 4963 | |||
| 4964 | conf = (fr_conf_t *)mbox->data; | ||
| 4965 | |||
| 4966 | dlci_offset=0; | ||
| 4967 | for (dev = card->wandev.dev; dev; | ||
| 4968 | dev = *((struct net_device **)dev->priv)) { | ||
| 4969 | fr_channel_t *chan_tmp = dev->priv; | ||
| 4970 | conf->dlci[dlci_offset] = chan_tmp->dlci; | ||
| 4971 | dlci_offset++; | ||
| 4972 | } | ||
| 4973 | |||
| 4974 | printk(KERN_INFO "Got Fr configuration Buffer Length is %x Dlci %i Dlci Off %i\n", | ||
| 4975 | mbox->cmd.length, | ||
| 4976 | mbox->cmd.length > 0x20 ? conf->dlci[0] : -1, | ||
| 4977 | dlci_offset ); | ||
| 4978 | |||
| 4979 | mbox->cmd.length = 0x20 + dlci_offset*2; | ||
| 4980 | |||
| 4981 | mbox->cmd.command = FR_SET_CONFIG; | ||
| 4982 | mbox->cmd.dlci = 0; | ||
| 4983 | |||
| 4984 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4985 | |||
| 4986 | if (err != CMD_OK){ | ||
| 4987 | fr_event(card, err, mbox); | ||
| 4988 | return 2; | ||
| 4989 | } | ||
| 4990 | |||
| 4991 | initialize_rx_tx_buffers (card); | ||
| 4992 | |||
| 4993 | |||
| 4994 | printk(KERN_INFO "Configuraiton Succeded for new DLCI %i\n",dlci_num); | ||
| 4995 | |||
| 4996 | if (fr_comm_enable (card)){ | ||
| 4997 | return 2; | ||
| 4998 | } | ||
| 4999 | |||
| 5000 | printk(KERN_INFO "Enabling Communications \n"); | ||
| 5001 | |||
| 5002 | for (dev = card->wandev.dev; dev; | ||
| 5003 | dev = *((struct net_device **)dev->priv)) { | ||
| 5004 | fr_channel_t *chan_tmp = dev->priv; | ||
| 5005 | fr_init_dlci(card,chan_tmp); | ||
| 5006 | fr_add_dlci(card, chan_tmp->dlci); | ||
| 5007 | fr_activate_dlci(card, chan_tmp->dlci); | ||
| 5008 | } | ||
| 5009 | |||
| 5010 | printk(KERN_INFO "END OF CONFIGURAITON %i\n",dlci_num); | ||
| 5011 | |||
| 5012 | return 1; | ||
| 5013 | } | ||
| 5014 | |||
| 5015 | static void initialize_rx_tx_buffers (sdla_t *card) | ||
| 5016 | { | ||
| 5017 | fr_buf_info_t* buf_info; | ||
| 5018 | |||
| 5019 | if (card->hw.type == SDLA_S514) { | ||
| 5020 | |||
| 5021 | buf_info = (void*)(card->hw.dpmbase + FR_MB_VECTOR + | ||
| 5022 | FR508_RXBC_OFFS); | ||
| 5023 | |||
| 5024 | card->rxmb = (void*)(buf_info->rse_next + card->hw.dpmbase); | ||
| 5025 | |||
| 5026 | card->u.f.rxmb_base = | ||
| 5027 | (void*)(buf_info->rse_base + card->hw.dpmbase); | ||
| 5028 | |||
| 5029 | card->u.f.rxmb_last = | ||
| 5030 | (void*)(buf_info->rse_base + | ||
| 5031 | (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) + | ||
| 5032 | card->hw.dpmbase); | ||
| 5033 | }else{ | ||
| 5034 | buf_info = (void*)(card->hw.dpmbase + FR508_RXBC_OFFS); | ||
| 5035 | |||
| 5036 | card->rxmb = (void*)(buf_info->rse_next - | ||
| 5037 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 5038 | |||
| 5039 | card->u.f.rxmb_base = | ||
| 5040 | (void*)(buf_info->rse_base - | ||
| 5041 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 5042 | |||
| 5043 | card->u.f.rxmb_last = | ||
| 5044 | (void*)(buf_info->rse_base + | ||
| 5045 | (buf_info->rse_num - 1) * sizeof(fr_rx_buf_ctl_t) - | ||
| 5046 | FR_MB_VECTOR + card->hw.dpmbase); | ||
| 5047 | } | ||
| 5048 | |||
| 5049 | card->u.f.rx_base = buf_info->buf_base; | ||
| 5050 | card->u.f.rx_top = buf_info->buf_top; | ||
| 5051 | |||
| 5052 | card->u.f.tx_interrupts_pending = 0; | ||
| 5053 | |||
| 5054 | return; | ||
| 5055 | } | ||
| 5056 | |||
| 5057 | |||
| 5058 | |||
| 5059 | MODULE_LICENSE("GPL"); | ||
| 5060 | |||
| 5061 | /****** End *****************************************************************/ | ||
diff --git a/drivers/net/wan/sdla_ft1.c b/drivers/net/wan/sdla_ft1.c deleted file mode 100644 index 9d6528a50f7b..000000000000 --- a/drivers/net/wan/sdla_ft1.c +++ /dev/null | |||
| @@ -1,345 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdla_chdlc.c WANPIPE(tm) Multiprotocol WAN Link Driver. Cisco HDLC module. | ||
| 3 | * | ||
| 4 | * Authors: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * Gideon Hack | ||
| 6 | * | ||
| 7 | * Copyright: (c) 1995-1999 Sangoma Technologies Inc. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * as published by the Free Software Foundation; either version | ||
| 12 | * 2 of the License, or (at your option) any later version. | ||
| 13 | * ============================================================================ | ||
| 14 | * Sep 30, 1999 Nenad Corbic Fixed dynamic IP and route setup. | ||
| 15 | * Sep 23, 1999 Nenad Corbic Added SMP support, fixed tracing | ||
| 16 | * Sep 13, 1999 Nenad Corbic Split up Port 0 and 1 into separate devices. | ||
| 17 | * Jun 02, 1999 Gideon Hack Added support for the S514 adapter. | ||
| 18 | * Oct 30, 1998 Jaspreet Singh Added Support for CHDLC API (HDLC STREAMING). | ||
| 19 | * Oct 28, 1998 Jaspreet Singh Added Support for Dual Port CHDLC. | ||
| 20 | * Aug 07, 1998 David Fong Initial version. | ||
| 21 | *****************************************************************************/ | ||
| 22 | |||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 25 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 26 | #include <linux/errno.h> /* return codes */ | ||
| 27 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 28 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 29 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 30 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 31 | #include <linux/if_arp.h> /* ARPHRD_* defines */ | ||
| 32 | #include <linux/jiffies.h> /* time_after() macro */ | ||
| 33 | |||
| 34 | #include <linux/inetdevice.h> | ||
| 35 | #include <asm/uaccess.h> | ||
| 36 | |||
| 37 | #include <linux/in.h> /* sockaddr_in */ | ||
| 38 | #include <linux/inet.h> | ||
| 39 | #include <linux/if.h> | ||
| 40 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 41 | #include <linux/sdlapci.h> | ||
| 42 | #include <asm/io.h> | ||
| 43 | |||
| 44 | #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */ | ||
| 45 | |||
| 46 | /****** Defines & Macros ****************************************************/ | ||
| 47 | |||
| 48 | /* reasons for enabling the timer interrupt on the adapter */ | ||
| 49 | #define TMR_INT_ENABLED_UDP 0x0001 | ||
| 50 | #define TMR_INT_ENABLED_UPDATE 0x0002 | ||
| 51 | |||
| 52 | #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */ | ||
| 53 | #define CHDLC_HDR_LEN 1 | ||
| 54 | |||
| 55 | #define IFF_POINTTOPOINT 0x10 | ||
| 56 | |||
| 57 | #define WANPIPE 0x00 | ||
| 58 | #define API 0x01 | ||
| 59 | #define CHDLC_API 0x01 | ||
| 60 | |||
| 61 | #define PORT(x) (x == 0 ? "PRIMARY" : "SECONDARY" ) | ||
| 62 | |||
| 63 | |||
| 64 | /******Data Structures*****************************************************/ | ||
| 65 | |||
| 66 | /* This structure is placed in the private data area of the device structure. | ||
| 67 | * The card structure used to occupy the private area but now the following | ||
| 68 | * structure will incorporate the card structure along with CHDLC specific data | ||
| 69 | */ | ||
| 70 | |||
| 71 | typedef struct chdlc_private_area | ||
| 72 | { | ||
| 73 | struct net_device *slave; | ||
| 74 | sdla_t *card; | ||
| 75 | int TracingEnabled; /* For enabling Tracing */ | ||
| 76 | unsigned long curr_trace_addr; /* Used for Tracing */ | ||
| 77 | unsigned long start_trace_addr; | ||
| 78 | unsigned long end_trace_addr; | ||
| 79 | unsigned long base_addr_trace_buffer; | ||
| 80 | unsigned long end_addr_trace_buffer; | ||
| 81 | unsigned short number_trace_elements; | ||
| 82 | unsigned available_buffer_space; | ||
| 83 | unsigned long router_start_time; | ||
| 84 | unsigned char route_status; | ||
| 85 | unsigned char route_removed; | ||
| 86 | unsigned long tick_counter; /* For 5s timeout counter */ | ||
| 87 | unsigned long router_up_time; | ||
| 88 | u32 IP_address; /* IP addressing */ | ||
| 89 | u32 IP_netmask; | ||
| 90 | unsigned char mc; /* Mulitcast support on/off */ | ||
| 91 | unsigned short udp_pkt_lgth; /* udp packet processing */ | ||
| 92 | char udp_pkt_src; | ||
| 93 | char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; | ||
| 94 | unsigned short timer_int_enabled; | ||
| 95 | char update_comms_stats; /* updating comms stats */ | ||
| 96 | //FIXME: add driver stats as per frame relay! | ||
| 97 | |||
| 98 | } chdlc_private_area_t; | ||
| 99 | |||
| 100 | /* Route Status options */ | ||
| 101 | #define NO_ROUTE 0x00 | ||
| 102 | #define ADD_ROUTE 0x01 | ||
| 103 | #define ROUTE_ADDED 0x02 | ||
| 104 | #define REMOVE_ROUTE 0x03 | ||
| 105 | |||
| 106 | |||
| 107 | /****** Function Prototypes *************************************************/ | ||
| 108 | /* WAN link driver entry points. These are called by the WAN router module. */ | ||
| 109 | static int wpft1_exec (struct sdla *card, void *u_cmd, void *u_data); | ||
| 110 | static int chdlc_read_version (sdla_t* card, char* str); | ||
| 111 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb); | ||
| 112 | |||
| 113 | /****** Public Functions ****************************************************/ | ||
| 114 | |||
| 115 | /*============================================================================ | ||
| 116 | * Cisco HDLC protocol initialization routine. | ||
| 117 | * | ||
| 118 | * This routine is called by the main WANPIPE module during setup. At this | ||
| 119 | * point adapter is completely initialized and firmware is running. | ||
| 120 | * o read firmware version (to make sure it's alive) | ||
| 121 | * o configure adapter | ||
| 122 | * o initialize protocol-specific fields of the adapter data space. | ||
| 123 | * | ||
| 124 | * Return: 0 o.k. | ||
| 125 | * < 0 failure. | ||
| 126 | */ | ||
| 127 | int wpft1_init (sdla_t* card, wandev_conf_t* conf) | ||
| 128 | { | ||
| 129 | unsigned char port_num; | ||
| 130 | int err; | ||
| 131 | |||
| 132 | union | ||
| 133 | { | ||
| 134 | char str[80]; | ||
| 135 | } u; | ||
| 136 | volatile CHDLC_MAILBOX_STRUCT* mb; | ||
| 137 | CHDLC_MAILBOX_STRUCT* mb1; | ||
| 138 | unsigned long timeout; | ||
| 139 | |||
| 140 | /* Verify configuration ID */ | ||
| 141 | if (conf->config_id != WANCONFIG_CHDLC) { | ||
| 142 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 143 | card->devname, conf->config_id); | ||
| 144 | return -EINVAL; | ||
| 145 | } | ||
| 146 | |||
| 147 | /* Use primary port */ | ||
| 148 | card->u.c.comm_port = 0; | ||
| 149 | |||
| 150 | |||
| 151 | /* Initialize protocol-specific fields */ | ||
| 152 | if(card->hw.type != SDLA_S514){ | ||
| 153 | card->mbox = (void *) card->hw.dpmbase; | ||
| 154 | }else{ | ||
| 155 | card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT; | ||
| 156 | } | ||
| 157 | |||
| 158 | mb = mb1 = card->mbox; | ||
| 159 | |||
| 160 | if (!card->configured){ | ||
| 161 | |||
| 162 | /* The board will place an 'I' in the return code to indicate that it is | ||
| 163 | ready to accept commands. We expect this to be completed in less | ||
| 164 | than 1 second. */ | ||
| 165 | |||
| 166 | timeout = jiffies; | ||
| 167 | while (mb->return_code != 'I') /* Wait 1s for board to initialize */ | ||
| 168 | if (time_after(jiffies, timeout + 1*HZ)) break; | ||
| 169 | |||
| 170 | if (mb->return_code != 'I') { | ||
| 171 | printk(KERN_INFO | ||
| 172 | "%s: Initialization not completed by adapter\n", | ||
| 173 | card->devname); | ||
| 174 | printk(KERN_INFO "Please contact Sangoma representative.\n"); | ||
| 175 | return -EIO; | ||
| 176 | } | ||
| 177 | } | ||
| 178 | |||
| 179 | /* Read firmware version. Note that when adapter initializes, it | ||
| 180 | * clears the mailbox, so it may appear that the first command was | ||
| 181 | * executed successfully when in fact it was merely erased. To work | ||
| 182 | * around this, we execute the first command twice. | ||
| 183 | */ | ||
| 184 | |||
| 185 | if (chdlc_read_version(card, u.str)) | ||
| 186 | return -EIO; | ||
| 187 | |||
| 188 | printk(KERN_INFO "%s: Running FT1 Configuration firmware v%s\n", | ||
| 189 | card->devname, u.str); | ||
| 190 | |||
| 191 | card->isr = NULL; | ||
| 192 | card->poll = NULL; | ||
| 193 | card->exec = &wpft1_exec; | ||
| 194 | card->wandev.update = NULL; | ||
| 195 | card->wandev.new_if = NULL; | ||
| 196 | card->wandev.del_if = NULL; | ||
| 197 | card->wandev.state = WAN_DUALPORT; | ||
| 198 | card->wandev.udp_port = conf->udp_port; | ||
| 199 | |||
| 200 | card->wandev.new_if_cnt = 0; | ||
| 201 | |||
| 202 | /* This is for the ports link state */ | ||
| 203 | card->u.c.state = WAN_DISCONNECTED; | ||
| 204 | |||
| 205 | /* reset the number of times the 'update()' proc has been called */ | ||
| 206 | card->u.c.update_call_count = 0; | ||
| 207 | |||
| 208 | card->wandev.ttl = 0x7F; | ||
| 209 | card->wandev.interface = 0; | ||
| 210 | |||
| 211 | card->wandev.clocking = 0; | ||
| 212 | |||
| 213 | port_num = card->u.c.comm_port; | ||
| 214 | |||
| 215 | /* Setup Port Bps */ | ||
| 216 | |||
| 217 | card->wandev.bps = 0; | ||
| 218 | |||
| 219 | card->wandev.mtu = MIN_LGTH_CHDLC_DATA_CFG; | ||
| 220 | |||
| 221 | /* Set up the interrupt status area */ | ||
| 222 | /* Read the CHDLC Configuration and obtain: | ||
| 223 | * Ptr to shared memory infor struct | ||
| 224 | * Use this pointer to calculate the value of card->u.c.flags ! | ||
| 225 | */ | ||
| 226 | mb1->buffer_length = 0; | ||
| 227 | mb1->command = READ_CHDLC_CONFIGURATION; | ||
| 228 | err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT; | ||
| 229 | if(err != COMMAND_OK) { | ||
| 230 | chdlc_error(card, err, mb1); | ||
| 231 | return -EIO; | ||
| 232 | } | ||
| 233 | |||
| 234 | if(card->hw.type == SDLA_S514){ | ||
| 235 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 236 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 237 | ptr_shared_mem_info_struct)); | ||
| 238 | }else{ | ||
| 239 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 240 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 241 | ptr_shared_mem_info_struct % SDLA_WINDOWSIZE)); | ||
| 242 | } | ||
| 243 | |||
| 244 | card->wandev.state = WAN_FT1_READY; | ||
| 245 | printk(KERN_INFO "%s: FT1 Config Ready !\n",card->devname); | ||
| 246 | |||
| 247 | return 0; | ||
| 248 | } | ||
| 249 | |||
| 250 | static int wpft1_exec(sdla_t *card, void *u_cmd, void *u_data) | ||
| 251 | { | ||
| 252 | CHDLC_MAILBOX_STRUCT* mbox = card->mbox; | ||
| 253 | int len; | ||
| 254 | |||
| 255 | if (copy_from_user((void*)&mbox->command, u_cmd, sizeof(ft1_exec_cmd_t))){ | ||
| 256 | return -EFAULT; | ||
| 257 | } | ||
| 258 | |||
| 259 | len = mbox->buffer_length; | ||
| 260 | |||
| 261 | if (len) { | ||
| 262 | if( copy_from_user((void*)&mbox->data, u_data, len)){ | ||
| 263 | return -EFAULT; | ||
| 264 | } | ||
| 265 | } | ||
| 266 | |||
| 267 | /* execute command */ | ||
| 268 | if (!sdla_exec(mbox)){ | ||
| 269 | return -EIO; | ||
| 270 | } | ||
| 271 | |||
| 272 | /* return result */ | ||
| 273 | if( copy_to_user(u_cmd, (void*)&mbox->command, sizeof(ft1_exec_cmd_t))){ | ||
| 274 | return -EFAULT; | ||
| 275 | } | ||
| 276 | |||
| 277 | len = mbox->buffer_length; | ||
| 278 | |||
| 279 | if (len && u_data && copy_to_user(u_data, (void*)&mbox->data, len)){ | ||
| 280 | return -EFAULT; | ||
| 281 | } | ||
| 282 | |||
| 283 | return 0; | ||
| 284 | |||
| 285 | } | ||
| 286 | |||
| 287 | /*============================================================================ | ||
| 288 | * Read firmware code version. | ||
| 289 | * Put code version as ASCII string in str. | ||
| 290 | */ | ||
| 291 | static int chdlc_read_version (sdla_t* card, char* str) | ||
| 292 | { | ||
| 293 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 294 | int len; | ||
| 295 | char err; | ||
| 296 | mb->buffer_length = 0; | ||
| 297 | mb->command = READ_CHDLC_CODE_VERSION; | ||
| 298 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 299 | |||
| 300 | if(err != COMMAND_OK) { | ||
| 301 | chdlc_error(card,err,mb); | ||
| 302 | } | ||
| 303 | else if (str) { /* is not null */ | ||
| 304 | len = mb->buffer_length; | ||
| 305 | memcpy(str, mb->data, len); | ||
| 306 | str[len] = '\0'; | ||
| 307 | } | ||
| 308 | return (err); | ||
| 309 | } | ||
| 310 | |||
| 311 | /*============================================================================ | ||
| 312 | * Firmware error handler. | ||
| 313 | * This routine is called whenever firmware command returns non-zero | ||
| 314 | * return code. | ||
| 315 | * | ||
| 316 | * Return zero if previous command has to be cancelled. | ||
| 317 | */ | ||
| 318 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb) | ||
| 319 | { | ||
| 320 | unsigned cmd = mb->command; | ||
| 321 | |||
| 322 | switch (err) { | ||
| 323 | |||
| 324 | case CMD_TIMEOUT: | ||
| 325 | printk(KERN_ERR "%s: command 0x%02X timed out!\n", | ||
| 326 | card->devname, cmd); | ||
| 327 | break; | ||
| 328 | |||
| 329 | case S514_BOTH_PORTS_SAME_CLK_MODE: | ||
| 330 | if(cmd == SET_CHDLC_CONFIGURATION) { | ||
| 331 | printk(KERN_INFO | ||
| 332 | "%s: Configure both ports for the same clock source\n", | ||
| 333 | card->devname); | ||
| 334 | break; | ||
| 335 | } | ||
| 336 | |||
| 337 | default: | ||
| 338 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n", | ||
| 339 | card->devname, cmd, err); | ||
| 340 | } | ||
| 341 | |||
| 342 | return 0; | ||
| 343 | } | ||
| 344 | |||
| 345 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/net/wan/sdla_ppp.c b/drivers/net/wan/sdla_ppp.c deleted file mode 100644 index a4b489cccbbf..000000000000 --- a/drivers/net/wan/sdla_ppp.c +++ /dev/null | |||
| @@ -1,3430 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdla_ppp.c WANPIPE(tm) Multiprotocol WAN Link Driver. PPP module. | ||
| 3 | * | ||
| 4 | * Author: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * | ||
| 6 | * Copyright: (c) 1995-2001 Sangoma Technologies Inc. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License | ||
| 10 | * as published by the Free Software Foundation; either version | ||
| 11 | * 2 of the License, or (at your option) any later version. | ||
| 12 | * ============================================================================ | ||
| 13 | * Feb 28, 2001 Nenad Corbic o Updated if_tx_timeout() routine for | ||
| 14 | * 2.4.X kernels. | ||
| 15 | * Nov 29, 2000 Nenad Corbic o Added the 2.4.x kernel support: | ||
| 16 | * get_ip_address() function has moved | ||
| 17 | * into the ppp_poll() routine. It cannot | ||
| 18 | * be called from an interrupt. | ||
| 19 | * Nov 07, 2000 Nenad Corbic o Added security features for UDP debugging: | ||
| 20 | * Deny all and specify allowed requests. | ||
| 21 | * May 02, 2000 Nenad Corbic o Added the dynamic interface shutdown | ||
| 22 | * option. When the link goes down, the | ||
| 23 | * network interface IFF_UP flag is reset. | ||
| 24 | * Mar 06, 2000 Nenad Corbic o Bug Fix: corrupted mbox recovery. | ||
| 25 | * Feb 25, 2000 Nenad Corbic o Fixed the FT1 UDP debugger problem. | ||
| 26 | * Feb 09, 2000 Nenad Coribc o Shutdown bug fix. update() was called | ||
| 27 | * with NULL dev pointer: no check. | ||
| 28 | * Jan 24, 2000 Nenad Corbic o Disabled use of CMD complete inter. | ||
| 29 | * Dev 15, 1999 Nenad Corbic o Fixed up header files for 2.0.X kernels | ||
| 30 | * Oct 25, 1999 Nenad Corbic o Support for 2.0.X kernels | ||
| 31 | * Moved dynamic route processing into | ||
| 32 | * a polling routine. | ||
| 33 | * Oct 07, 1999 Nenad Corbic o Support for S514 PCI card. | ||
| 34 | * Gideon Hack o UPD and Updates executed using timer interrupt | ||
| 35 | * Sep 10, 1999 Nenad Corbic o Fixed up the /proc statistics | ||
| 36 | * Jul 20, 1999 Nenad Corbic o Remove the polling routines and use | ||
| 37 | * interrupts instead. | ||
| 38 | * Sep 17, 1998 Jaspreet Singh o Updates for 2.2.X Kernels. | ||
| 39 | * Aug 13, 1998 Jaspreet Singh o Improved Line Tracing. | ||
| 40 | * Jun 22, 1998 David Fong o Added remote IP address assignment | ||
| 41 | * Mar 15, 1998 Alan Cox o 2.1.8x basic port. | ||
| 42 | * Apr 16, 1998 Jaspreet Singh o using htons() for the IPX protocol. | ||
| 43 | * Dec 09, 1997 Jaspreet Singh o Added PAP and CHAP. | ||
| 44 | * o Implemented new routines like | ||
| 45 | * ppp_set_inbnd_auth(), ppp_set_outbnd_auth(), | ||
| 46 | * tokenize() and strstrip(). | ||
| 47 | * Nov 27, 1997 Jaspreet Singh o Added protection against enabling of irqs | ||
| 48 | * while they have been disabled. | ||
| 49 | * Nov 24, 1997 Jaspreet Singh o Fixed another RACE condition caused by | ||
| 50 | * disabling and enabling of irqs. | ||
| 51 | * o Added new counters for stats on disable/enable | ||
| 52 | * IRQs. | ||
| 53 | * Nov 10, 1997 Jaspreet Singh o Initialized 'skb->mac.raw' to 'skb->data' | ||
| 54 | * before every netif_rx(). | ||
| 55 | * o Free up the device structure in del_if(). | ||
| 56 | * Nov 07, 1997 Jaspreet Singh o Changed the delay to zero for Line tracing | ||
| 57 | * command. | ||
| 58 | * Oct 20, 1997 Jaspreet Singh o Added hooks in for Router UP time. | ||
| 59 | * Oct 16, 1997 Jaspreet Singh o The critical flag is used to maintain flow | ||
| 60 | * control by avoiding RACE conditions. The | ||
| 61 | * cli() and restore_flags() are taken out. | ||
| 62 | * A new structure, "ppp_private_area", is added | ||
| 63 | * to provide Driver Statistics. | ||
| 64 | * Jul 21, 1997 Jaspreet Singh o Protected calls to sdla_peek() by adding | ||
| 65 | * save_flags(), cli() and restore_flags(). | ||
| 66 | * Jul 07, 1997 Jaspreet Singh o Added configurable TTL for UDP packets | ||
| 67 | * o Added ability to discard mulitcast and | ||
| 68 | * broacast source addressed packets. | ||
| 69 | * Jun 27, 1997 Jaspreet Singh o Added FT1 monitor capabilities | ||
| 70 | * New case (0x25) statement in if_send routine. | ||
| 71 | * Added a global variable rCount to keep track | ||
| 72 | * of FT1 status enabled on the board. | ||
| 73 | * May 22, 1997 Jaspreet Singh o Added change in the PPP_SET_CONFIG command for | ||
| 74 | * 508 card to reflect changes in the new | ||
| 75 | * ppp508.sfm for supporting:continous transmission | ||
| 76 | * of Configure-Request packets without receiving a | ||
| 77 | * reply | ||
| 78 | * OR-ed 0x300 to conf_flags | ||
| 79 | * o Changed connect_tmout from 900 to 0 | ||
| 80 | * May 21, 1997 Jaspreet Singh o Fixed UDP Management for multiple boards | ||
| 81 | * Apr 25, 1997 Farhan Thawar o added UDP Management stuff | ||
| 82 | * Mar 11, 1997 Farhan Thawar Version 3.1.1 | ||
| 83 | * o fixed (+1) bug in rx_intr() | ||
| 84 | * o changed if_send() to return 0 if | ||
| 85 | * wandev.critical() is true | ||
| 86 | * o free socket buffer in if_send() if | ||
| 87 | * returning 0 | ||
| 88 | * Jan 15, 1997 Gene Kozin Version 3.1.0 | ||
| 89 | * o implemented exec() entry point | ||
| 90 | * Jan 06, 1997 Gene Kozin Initial version. | ||
| 91 | *****************************************************************************/ | ||
| 92 | |||
| 93 | #include <linux/module.h> | ||
| 94 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 95 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 96 | #include <linux/errno.h> /* return codes */ | ||
| 97 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 98 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 99 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 100 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 101 | #include <linux/if_arp.h> /* ARPHRD_* defines */ | ||
| 102 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 103 | #include <linux/in.h> /* sockaddr_in */ | ||
| 104 | #include <linux/jiffies.h> /* time_after() macro */ | ||
| 105 | |||
| 106 | |||
| 107 | #include <asm/uaccess.h> | ||
| 108 | #include <linux/inetdevice.h> | ||
| 109 | #include <linux/netdevice.h> | ||
| 110 | |||
| 111 | #include <linux/if.h> | ||
| 112 | #include <linux/sdla_ppp.h> /* PPP firmware API definitions */ | ||
| 113 | #include <linux/sdlasfm.h> /* S514 Type Definition */ | ||
| 114 | /****** Defines & Macros ****************************************************/ | ||
| 115 | |||
| 116 | #define PPP_DFLT_MTU 1500 /* default MTU */ | ||
| 117 | #define PPP_MAX_MTU 4000 /* maximum MTU */ | ||
| 118 | #define PPP_HDR_LEN 1 | ||
| 119 | |||
| 120 | #define MAX_IP_ERRORS 100 | ||
| 121 | |||
| 122 | #define CONNECT_TIMEOUT (90*HZ) /* link connection timeout */ | ||
| 123 | #define HOLD_DOWN_TIME (5*HZ) /* link hold down time : Changed from 30 to 5 */ | ||
| 124 | |||
| 125 | /* For handle_IPXWAN() */ | ||
| 126 | #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b))) | ||
| 127 | |||
| 128 | /* Macro for enabling/disabling debugging comments */ | ||
| 129 | //#define NEX_DEBUG | ||
| 130 | #ifdef NEX_DEBUG | ||
| 131 | #define NEX_PRINTK(format, a...) printk(format, ## a) | ||
| 132 | #else | ||
| 133 | #define NEX_PRINTK(format, a...) | ||
| 134 | #endif /* NEX_DEBUG */ | ||
| 135 | |||
| 136 | #define DCD(a) ( a & 0x08 ? "HIGH" : "LOW" ) | ||
| 137 | #define CTS(a) ( a & 0x20 ? "HIGH" : "LOW" ) | ||
| 138 | #define LCP(a) ( a == 0x09 ? "OPEN" : "CLOSED" ) | ||
| 139 | #define IP(a) ( a == 0x09 ? "ENABLED" : "DISABLED" ) | ||
| 140 | |||
| 141 | #define TMR_INT_ENABLED_UPDATE 0x01 | ||
| 142 | #define TMR_INT_ENABLED_PPP_EVENT 0x02 | ||
| 143 | #define TMR_INT_ENABLED_UDP 0x04 | ||
| 144 | #define TMR_INT_ENABLED_CONFIG 0x20 | ||
| 145 | |||
| 146 | /* Set Configuraton Command Definitions */ | ||
| 147 | #define PERCENT_TX_BUFF 60 | ||
| 148 | #define TIME_BETWEEN_CONF_REQ 30 | ||
| 149 | #define TIME_BETWEEN_PAP_CHAP_REQ 30 | ||
| 150 | #define WAIT_PAP_CHAP_WITHOUT_REPLY 300 | ||
| 151 | #define WAIT_AFTER_DCD_CTS_LOW 5 | ||
| 152 | #define TIME_DCD_CTS_LOW_AFTER_LNK_DOWN 10 | ||
| 153 | #define WAIT_DCD_HIGH_AFTER_ENABLE_COMM 900 | ||
| 154 | #define MAX_CONF_REQ_WITHOUT_REPLY 10 | ||
| 155 | #define MAX_TERM_REQ_WITHOUT_REPLY 2 | ||
| 156 | #define NUM_CONF_NAK_WITHOUT_REPLY 5 | ||
| 157 | #define NUM_AUTH_REQ_WITHOUT_REPLY 10 | ||
| 158 | |||
| 159 | #define END_OFFSET 0x1F0 | ||
| 160 | |||
| 161 | |||
| 162 | /******Data Structures*****************************************************/ | ||
| 163 | |||
| 164 | /* This structure is placed in the private data area of the device structure. | ||
| 165 | * The card structure used to occupy the private area but now the following | ||
| 166 | * structure will incorporate the card structure along with PPP specific data | ||
| 167 | */ | ||
| 168 | |||
| 169 | typedef struct ppp_private_area | ||
| 170 | { | ||
| 171 | struct net_device *slave; | ||
| 172 | sdla_t* card; | ||
| 173 | unsigned long router_start_time; /*router start time in sec */ | ||
| 174 | unsigned long tick_counter; /*used for 5 second counter*/ | ||
| 175 | unsigned mc; /*multicast support on or off*/ | ||
| 176 | unsigned char enable_IPX; | ||
| 177 | unsigned long network_number; | ||
| 178 | unsigned char pap; | ||
| 179 | unsigned char chap; | ||
| 180 | unsigned char sysname[31]; /* system name for in-bnd auth*/ | ||
| 181 | unsigned char userid[511]; /* list of user ids */ | ||
| 182 | unsigned char passwd[511]; /* list of passwords */ | ||
| 183 | unsigned protocol; /* SKB Protocol */ | ||
| 184 | u32 ip_local; /* Local IP Address */ | ||
| 185 | u32 ip_remote; /* remote IP Address */ | ||
| 186 | |||
| 187 | u32 ip_local_tmp; | ||
| 188 | u32 ip_remote_tmp; | ||
| 189 | |||
| 190 | unsigned char timer_int_enabled; /* Who enabled the timer inter*/ | ||
| 191 | unsigned char update_comms_stats; /* Used by update function */ | ||
| 192 | unsigned long curr_trace_addr; /* Trace information */ | ||
| 193 | unsigned long start_trace_addr; | ||
| 194 | unsigned long end_trace_addr; | ||
| 195 | |||
| 196 | unsigned char interface_down; /* Brind down interface when channel | ||
| 197 | goes down */ | ||
| 198 | unsigned long config_wait_timeout; /* After if_open() if in dynamic if mode, | ||
| 199 | wait a few seconds before configuring */ | ||
| 200 | |||
| 201 | unsigned short udp_pkt_lgth; | ||
| 202 | char udp_pkt_src; | ||
| 203 | char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; | ||
| 204 | |||
| 205 | /* PPP specific statistics */ | ||
| 206 | |||
| 207 | if_send_stat_t if_send_stat; | ||
| 208 | rx_intr_stat_t rx_intr_stat; | ||
| 209 | pipe_mgmt_stat_t pipe_mgmt_stat; | ||
| 210 | |||
| 211 | unsigned long router_up_time; | ||
| 212 | |||
| 213 | /* Polling work queue entry. Each interface | ||
| 214 | * has its own work queue entry, which is used | ||
| 215 | * to defer events from the interrupt */ | ||
| 216 | struct work_struct poll_work; | ||
| 217 | struct timer_list poll_delay_timer; | ||
| 218 | |||
| 219 | u8 gateway; | ||
| 220 | u8 config_ppp; | ||
| 221 | u8 ip_error; | ||
| 222 | |||
| 223 | }ppp_private_area_t; | ||
| 224 | |||
| 225 | /* variable for keeping track of enabling/disabling FT1 monitor status */ | ||
| 226 | static int rCount = 0; | ||
| 227 | |||
| 228 | extern void disable_irq(unsigned int); | ||
| 229 | extern void enable_irq(unsigned int); | ||
| 230 | |||
| 231 | /****** Function Prototypes *************************************************/ | ||
| 232 | |||
| 233 | /* WAN link driver entry points. These are called by the WAN router module. */ | ||
| 234 | static int update(struct wan_device *wandev); | ||
| 235 | static int new_if(struct wan_device *wandev, struct net_device *dev, | ||
| 236 | wanif_conf_t *conf); | ||
| 237 | static int del_if(struct wan_device *wandev, struct net_device *dev); | ||
| 238 | |||
| 239 | /* WANPIPE-specific entry points */ | ||
| 240 | static int wpp_exec (struct sdla *card, void *u_cmd, void *u_data); | ||
| 241 | |||
| 242 | /* Network device interface */ | ||
| 243 | static int if_init(struct net_device *dev); | ||
| 244 | static int if_open(struct net_device *dev); | ||
| 245 | static int if_close(struct net_device *dev); | ||
| 246 | static int if_header(struct sk_buff *skb, struct net_device *dev, | ||
| 247 | unsigned short type, | ||
| 248 | void *daddr, void *saddr, unsigned len); | ||
| 249 | |||
| 250 | static void if_tx_timeout(struct net_device *dev); | ||
| 251 | |||
| 252 | static int if_rebuild_hdr(struct sk_buff *skb); | ||
| 253 | static struct net_device_stats *if_stats(struct net_device *dev); | ||
| 254 | static int if_send(struct sk_buff *skb, struct net_device *dev); | ||
| 255 | |||
| 256 | |||
| 257 | /* PPP firmware interface functions */ | ||
| 258 | static int ppp_read_version(sdla_t *card, char *str); | ||
| 259 | static int ppp_set_outbnd_auth(sdla_t *card, ppp_private_area_t *ppp_priv_area); | ||
| 260 | static int ppp_set_inbnd_auth(sdla_t *card, ppp_private_area_t *ppp_priv_area); | ||
| 261 | static int ppp_configure(sdla_t *card, void *data); | ||
| 262 | static int ppp_set_intr_mode(sdla_t *card, unsigned char mode); | ||
| 263 | static int ppp_comm_enable(sdla_t *card); | ||
| 264 | static int ppp_comm_disable(sdla_t *card); | ||
| 265 | static int ppp_comm_disable_shutdown(sdla_t *card); | ||
| 266 | static int ppp_get_err_stats(sdla_t *card); | ||
| 267 | static int ppp_send(sdla_t *card, void *data, unsigned len, unsigned proto); | ||
| 268 | static int ppp_error(sdla_t *card, int err, ppp_mbox_t *mb); | ||
| 269 | |||
| 270 | static void wpp_isr(sdla_t *card); | ||
| 271 | static void rx_intr(sdla_t *card); | ||
| 272 | static void event_intr(sdla_t *card); | ||
| 273 | static void timer_intr(sdla_t *card); | ||
| 274 | |||
| 275 | /* Background polling routines */ | ||
| 276 | static void process_route(sdla_t *card); | ||
| 277 | static void retrigger_comm(sdla_t *card); | ||
| 278 | |||
| 279 | /* Miscellaneous functions */ | ||
| 280 | static int read_info( sdla_t *card ); | ||
| 281 | static int read_connection_info (sdla_t *card); | ||
| 282 | static void remove_route( sdla_t *card ); | ||
| 283 | static int config508(struct net_device *dev, sdla_t *card); | ||
| 284 | static void show_disc_cause(sdla_t * card, unsigned cause); | ||
| 285 | static int reply_udp( unsigned char *data, unsigned int mbox_len ); | ||
| 286 | static void process_udp_mgmt_pkt(sdla_t *card, struct net_device *dev, | ||
| 287 | ppp_private_area_t *ppp_priv_area); | ||
| 288 | static void init_ppp_tx_rx_buff( sdla_t *card ); | ||
| 289 | static int intr_test( sdla_t *card ); | ||
| 290 | static int udp_pkt_type( struct sk_buff *skb , sdla_t *card); | ||
| 291 | static void init_ppp_priv_struct( ppp_private_area_t *ppp_priv_area); | ||
| 292 | static void init_global_statistics( sdla_t *card ); | ||
| 293 | static int tokenize(char *str, char **tokens); | ||
| 294 | static char* strstrip(char *str, char *s); | ||
| 295 | static int chk_bcast_mcast_addr(sdla_t* card, struct net_device* dev, | ||
| 296 | struct sk_buff *skb); | ||
| 297 | |||
| 298 | static int config_ppp (sdla_t *); | ||
| 299 | static void ppp_poll(struct net_device *dev); | ||
| 300 | static void trigger_ppp_poll(struct net_device *dev); | ||
| 301 | static void ppp_poll_delay (unsigned long dev_ptr); | ||
| 302 | |||
| 303 | |||
| 304 | static int Read_connection_info; | ||
| 305 | static int Intr_test_counter; | ||
| 306 | static unsigned short available_buffer_space; | ||
| 307 | |||
| 308 | |||
| 309 | /* IPX functions */ | ||
| 310 | static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, | ||
| 311 | unsigned char incoming); | ||
| 312 | static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_PX, | ||
| 313 | unsigned long network_number, unsigned short proto); | ||
| 314 | |||
| 315 | /* Lock Functions */ | ||
| 316 | static void s508_lock (sdla_t *card, unsigned long *smp_flags); | ||
| 317 | static void s508_unlock (sdla_t *card, unsigned long *smp_flags); | ||
| 318 | |||
| 319 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 320 | struct sk_buff *skb, struct net_device* dev, | ||
| 321 | ppp_private_area_t* ppp_priv_area ); | ||
| 322 | static unsigned short calc_checksum (char *data, int len); | ||
| 323 | static void disable_comm (sdla_t *card); | ||
| 324 | static int detect_and_fix_tx_bug (sdla_t *card); | ||
| 325 | |||
| 326 | /****** Public Functions ****************************************************/ | ||
| 327 | |||
| 328 | /*============================================================================ | ||
| 329 | * PPP protocol initialization routine. | ||
| 330 | * | ||
| 331 | * This routine is called by the main WANPIPE module during setup. At this | ||
| 332 | * point adapter is completely initialized and firmware is running. | ||
| 333 | * o read firmware version (to make sure it's alive) | ||
| 334 | * o configure adapter | ||
| 335 | * o initialize protocol-specific fields of the adapter data space. | ||
| 336 | * | ||
| 337 | * Return: 0 o.k. | ||
| 338 | * < 0 failure. | ||
| 339 | */ | ||
| 340 | int wpp_init(sdla_t *card, wandev_conf_t *conf) | ||
| 341 | { | ||
| 342 | ppp_flags_t *flags; | ||
| 343 | union | ||
| 344 | { | ||
| 345 | char str[80]; | ||
| 346 | } u; | ||
| 347 | |||
| 348 | /* Verify configuration ID */ | ||
| 349 | if (conf->config_id != WANCONFIG_PPP) { | ||
| 350 | |||
| 351 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 352 | card->devname, conf->config_id); | ||
| 353 | return -EINVAL; | ||
| 354 | |||
| 355 | } | ||
| 356 | |||
| 357 | /* Initialize miscellaneous pointers to structures on the adapter */ | ||
| 358 | switch (card->hw.type) { | ||
| 359 | |||
| 360 | case SDLA_S508: | ||
| 361 | card->mbox =(void*)(card->hw.dpmbase + PPP508_MB_OFFS); | ||
| 362 | card->flags=(void*)(card->hw.dpmbase + PPP508_FLG_OFFS); | ||
| 363 | break; | ||
| 364 | |||
| 365 | case SDLA_S514: | ||
| 366 | card->mbox =(void*)(card->hw.dpmbase + PPP514_MB_OFFS); | ||
| 367 | card->flags=(void*)(card->hw.dpmbase + PPP514_FLG_OFFS); | ||
| 368 | break; | ||
| 369 | |||
| 370 | default: | ||
| 371 | return -EINVAL; | ||
| 372 | |||
| 373 | } | ||
| 374 | flags = card->flags; | ||
| 375 | |||
| 376 | /* Read firmware version. Note that when adapter initializes, it | ||
| 377 | * clears the mailbox, so it may appear that the first command was | ||
| 378 | * executed successfully when in fact it was merely erased. To work | ||
| 379 | * around this, we execute the first command twice. | ||
| 380 | */ | ||
| 381 | if (ppp_read_version(card, NULL) || ppp_read_version(card, u.str)) | ||
| 382 | return -EIO; | ||
| 383 | |||
| 384 | printk(KERN_INFO "%s: running PPP firmware v%s\n",card->devname, u.str); | ||
| 385 | /* Adjust configuration and set defaults */ | ||
| 386 | card->wandev.mtu = (conf->mtu) ? | ||
| 387 | min_t(unsigned int, conf->mtu, PPP_MAX_MTU) : PPP_DFLT_MTU; | ||
| 388 | |||
| 389 | card->wandev.bps = conf->bps; | ||
| 390 | card->wandev.interface = conf->interface; | ||
| 391 | card->wandev.clocking = conf->clocking; | ||
| 392 | card->wandev.station = conf->station; | ||
| 393 | card->isr = &wpp_isr; | ||
| 394 | card->poll = NULL; | ||
| 395 | card->exec = &wpp_exec; | ||
| 396 | card->wandev.update = &update; | ||
| 397 | card->wandev.new_if = &new_if; | ||
| 398 | card->wandev.del_if = &del_if; | ||
| 399 | card->wandev.udp_port = conf->udp_port; | ||
| 400 | card->wandev.ttl = conf->ttl; | ||
| 401 | card->wandev.state = WAN_DISCONNECTED; | ||
| 402 | card->disable_comm = &disable_comm; | ||
| 403 | card->irq_dis_if_send_count = 0; | ||
| 404 | card->irq_dis_poll_count = 0; | ||
| 405 | card->u.p.authenticator = conf->u.ppp.authenticator; | ||
| 406 | card->u.p.ip_mode = conf->u.ppp.ip_mode ? | ||
| 407 | conf->u.ppp.ip_mode : WANOPT_PPP_STATIC; | ||
| 408 | card->TracingEnabled = 0; | ||
| 409 | Read_connection_info = 1; | ||
| 410 | |||
| 411 | /* initialize global statistics */ | ||
| 412 | init_global_statistics( card ); | ||
| 413 | |||
| 414 | |||
| 415 | |||
| 416 | if (!card->configured){ | ||
| 417 | int err; | ||
| 418 | |||
| 419 | Intr_test_counter = 0; | ||
| 420 | err = intr_test(card); | ||
| 421 | |||
| 422 | if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) { | ||
| 423 | printk("%s: Interrupt Test Failed, Counter: %i\n", | ||
| 424 | card->devname, Intr_test_counter); | ||
| 425 | printk( "%s: Please choose another interrupt\n",card->devname); | ||
| 426 | return -EIO; | ||
| 427 | } | ||
| 428 | |||
| 429 | printk(KERN_INFO "%s: Interrupt Test Passed, Counter: %i\n", | ||
| 430 | card->devname, Intr_test_counter); | ||
| 431 | card->configured = 1; | ||
| 432 | } | ||
| 433 | |||
| 434 | ppp_set_intr_mode(card, PPP_INTR_TIMER); | ||
| 435 | |||
| 436 | /* Turn off the transmit and timer interrupt */ | ||
| 437 | flags->imask &= ~PPP_INTR_TIMER; | ||
| 438 | |||
| 439 | printk(KERN_INFO "\n"); | ||
| 440 | |||
| 441 | return 0; | ||
| 442 | } | ||
| 443 | |||
| 444 | /******* WAN Device Driver Entry Points *************************************/ | ||
| 445 | |||
| 446 | /*============================================================================ | ||
| 447 | * Update device status & statistics. | ||
| 448 | */ | ||
| 449 | static int update(struct wan_device *wandev) | ||
| 450 | { | ||
| 451 | sdla_t* card = wandev->private; | ||
| 452 | struct net_device* dev; | ||
| 453 | volatile ppp_private_area_t *ppp_priv_area; | ||
| 454 | ppp_flags_t *flags = card->flags; | ||
| 455 | unsigned long timeout; | ||
| 456 | |||
| 457 | /* sanity checks */ | ||
| 458 | if ((wandev == NULL) || (wandev->private == NULL)) | ||
| 459 | return -EFAULT; | ||
| 460 | |||
| 461 | if (wandev->state == WAN_UNCONFIGURED) | ||
| 462 | return -ENODEV; | ||
| 463 | |||
| 464 | /* Shutdown bug fix. This function can be | ||
| 465 | * called with NULL dev pointer during | ||
| 466 | * shutdown | ||
| 467 | */ | ||
| 468 | if ((dev=card->wandev.dev) == NULL){ | ||
| 469 | return -ENODEV; | ||
| 470 | } | ||
| 471 | |||
| 472 | if ((ppp_priv_area=dev->priv) == NULL){ | ||
| 473 | return -ENODEV; | ||
| 474 | } | ||
| 475 | |||
| 476 | ppp_priv_area->update_comms_stats = 2; | ||
| 477 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_UPDATE; | ||
| 478 | flags->imask |= PPP_INTR_TIMER; | ||
| 479 | |||
| 480 | /* wait a maximum of 1 second for the statistics to be updated */ | ||
| 481 | timeout = jiffies; | ||
| 482 | for(;;) { | ||
| 483 | if(ppp_priv_area->update_comms_stats == 0){ | ||
| 484 | break; | ||
| 485 | } | ||
| 486 | if (time_after(jiffies, timeout + 1 * HZ)){ | ||
| 487 | ppp_priv_area->update_comms_stats = 0; | ||
| 488 | ppp_priv_area->timer_int_enabled &= | ||
| 489 | ~TMR_INT_ENABLED_UPDATE; | ||
| 490 | return -EAGAIN; | ||
| 491 | } | ||
| 492 | } | ||
| 493 | |||
| 494 | return 0; | ||
| 495 | } | ||
| 496 | |||
| 497 | /*============================================================================ | ||
| 498 | * Create new logical channel. | ||
| 499 | * This routine is called by the router when ROUTER_IFNEW IOCTL is being | ||
| 500 | * handled. | ||
| 501 | * o parse media- and hardware-specific configuration | ||
| 502 | * o make sure that a new channel can be created | ||
| 503 | * o allocate resources, if necessary | ||
| 504 | * o prepare network device structure for registaration. | ||
| 505 | * | ||
| 506 | * Return: 0 o.k. | ||
| 507 | * < 0 failure (channel will not be created) | ||
| 508 | */ | ||
| 509 | static int new_if(struct wan_device *wandev, struct net_device *dev, | ||
| 510 | wanif_conf_t *conf) | ||
| 511 | { | ||
| 512 | sdla_t *card = wandev->private; | ||
| 513 | ppp_private_area_t *ppp_priv_area; | ||
| 514 | |||
| 515 | if (wandev->ndev) | ||
| 516 | return -EEXIST; | ||
| 517 | |||
| 518 | |||
| 519 | printk(KERN_INFO "%s: Configuring Interface: %s\n", | ||
| 520 | card->devname, conf->name); | ||
| 521 | |||
| 522 | if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) { | ||
| 523 | |||
| 524 | printk(KERN_INFO "%s: Invalid interface name!\n", | ||
| 525 | card->devname); | ||
| 526 | return -EINVAL; | ||
| 527 | |||
| 528 | } | ||
| 529 | |||
| 530 | /* allocate and initialize private data */ | ||
| 531 | ppp_priv_area = kmalloc(sizeof(ppp_private_area_t), GFP_KERNEL); | ||
| 532 | |||
| 533 | if( ppp_priv_area == NULL ) | ||
| 534 | return -ENOMEM; | ||
| 535 | |||
| 536 | memset(ppp_priv_area, 0, sizeof(ppp_private_area_t)); | ||
| 537 | |||
| 538 | ppp_priv_area->card = card; | ||
| 539 | |||
| 540 | /* initialize data */ | ||
| 541 | strcpy(card->u.p.if_name, conf->name); | ||
| 542 | |||
| 543 | /* initialize data in ppp_private_area structure */ | ||
| 544 | |||
| 545 | init_ppp_priv_struct( ppp_priv_area ); | ||
| 546 | |||
| 547 | ppp_priv_area->mc = conf->mc; | ||
| 548 | ppp_priv_area->pap = conf->pap; | ||
| 549 | ppp_priv_area->chap = conf->chap; | ||
| 550 | |||
| 551 | /* Option to bring down the interface when | ||
| 552 | * the link goes down */ | ||
| 553 | if (conf->if_down){ | ||
| 554 | set_bit(DYN_OPT_ON,&ppp_priv_area->interface_down); | ||
| 555 | printk("%s: Dynamic interface configuration enabled\n", | ||
| 556 | card->devname); | ||
| 557 | } | ||
| 558 | |||
| 559 | /* If no user ids are specified */ | ||
| 560 | if(!strlen(conf->userid) && (ppp_priv_area->pap||ppp_priv_area->chap)){ | ||
| 561 | kfree(ppp_priv_area); | ||
| 562 | return -EINVAL; | ||
| 563 | } | ||
| 564 | |||
| 565 | /* If no passwords are specified */ | ||
| 566 | if(!strlen(conf->passwd) && (ppp_priv_area->pap||ppp_priv_area->chap)){ | ||
| 567 | kfree(ppp_priv_area); | ||
| 568 | return -EINVAL; | ||
| 569 | } | ||
| 570 | |||
| 571 | if(strlen(conf->sysname) > 31){ | ||
| 572 | kfree(ppp_priv_area); | ||
| 573 | return -EINVAL; | ||
| 574 | } | ||
| 575 | |||
| 576 | /* If no system name is specified */ | ||
| 577 | if(!strlen(conf->sysname) && (card->u.p.authenticator)){ | ||
| 578 | kfree(ppp_priv_area); | ||
| 579 | return -EINVAL; | ||
| 580 | } | ||
| 581 | |||
| 582 | /* copy the data into the ppp private structure */ | ||
| 583 | memcpy(ppp_priv_area->userid, conf->userid, strlen(conf->userid)); | ||
| 584 | memcpy(ppp_priv_area->passwd, conf->passwd, strlen(conf->passwd)); | ||
| 585 | memcpy(ppp_priv_area->sysname, conf->sysname, strlen(conf->sysname)); | ||
| 586 | |||
| 587 | |||
| 588 | ppp_priv_area->enable_IPX = conf->enable_IPX; | ||
| 589 | if (conf->network_number){ | ||
| 590 | ppp_priv_area->network_number = conf->network_number; | ||
| 591 | }else{ | ||
| 592 | ppp_priv_area->network_number = 0xDEADBEEF; | ||
| 593 | } | ||
| 594 | |||
| 595 | /* Tells us that if this interface is a | ||
| 596 | * gateway or not */ | ||
| 597 | if ((ppp_priv_area->gateway = conf->gateway) == WANOPT_YES){ | ||
| 598 | printk(KERN_INFO "%s: Interface %s is set as a gateway.\n", | ||
| 599 | card->devname,card->u.p.if_name); | ||
| 600 | } | ||
| 601 | |||
| 602 | /* prepare network device data space for registration */ | ||
| 603 | strcpy(dev->name,card->u.p.if_name); | ||
| 604 | |||
| 605 | dev->init = &if_init; | ||
| 606 | dev->priv = ppp_priv_area; | ||
| 607 | dev->mtu = min_t(unsigned int, dev->mtu, card->wandev.mtu); | ||
| 608 | |||
| 609 | /* Initialize the polling work routine */ | ||
| 610 | INIT_WORK(&ppp_priv_area->poll_work, (void*)(void*)ppp_poll, dev); | ||
| 611 | |||
| 612 | /* Initialize the polling delay timer */ | ||
| 613 | init_timer(&ppp_priv_area->poll_delay_timer); | ||
| 614 | ppp_priv_area->poll_delay_timer.data = (unsigned long)dev; | ||
| 615 | ppp_priv_area->poll_delay_timer.function = ppp_poll_delay; | ||
| 616 | |||
| 617 | |||
| 618 | /* Since we start with dummy IP addresses we can say | ||
| 619 | * that route exists */ | ||
| 620 | printk(KERN_INFO "\n"); | ||
| 621 | |||
| 622 | return 0; | ||
| 623 | } | ||
| 624 | |||
| 625 | /*============================================================================ | ||
| 626 | * Delete logical channel. | ||
| 627 | */ | ||
| 628 | static int del_if(struct wan_device *wandev, struct net_device *dev) | ||
| 629 | { | ||
| 630 | return 0; | ||
| 631 | } | ||
| 632 | |||
| 633 | static void disable_comm (sdla_t *card) | ||
| 634 | { | ||
| 635 | ppp_comm_disable_shutdown(card); | ||
| 636 | return; | ||
| 637 | } | ||
| 638 | |||
| 639 | /****** WANPIPE-specific entry points ***************************************/ | ||
| 640 | |||
| 641 | /*============================================================================ | ||
| 642 | * Execute adapter interface command. | ||
| 643 | */ | ||
| 644 | |||
| 645 | //FIXME: Why do we need this ???? | ||
| 646 | static int wpp_exec(struct sdla *card, void *u_cmd, void *u_data) | ||
| 647 | { | ||
| 648 | ppp_mbox_t *mbox = card->mbox; | ||
| 649 | int len; | ||
| 650 | |||
| 651 | if (copy_from_user((void*)&mbox->cmd, u_cmd, sizeof(ppp_cmd_t))) | ||
| 652 | return -EFAULT; | ||
| 653 | |||
| 654 | len = mbox->cmd.length; | ||
| 655 | |||
| 656 | if (len) { | ||
| 657 | |||
| 658 | if( copy_from_user((void*)&mbox->data, u_data, len)) | ||
| 659 | return -EFAULT; | ||
| 660 | |||
| 661 | } | ||
| 662 | |||
| 663 | /* execute command */ | ||
| 664 | if (!sdla_exec(mbox)) | ||
| 665 | return -EIO; | ||
| 666 | |||
| 667 | /* return result */ | ||
| 668 | if( copy_to_user(u_cmd, (void*)&mbox->cmd, sizeof(ppp_cmd_t))) | ||
| 669 | return -EFAULT; | ||
| 670 | len = mbox->cmd.length; | ||
| 671 | |||
| 672 | if (len && u_data && copy_to_user(u_data, (void*)&mbox->data, len)) | ||
| 673 | return -EFAULT; | ||
| 674 | |||
| 675 | return 0; | ||
| 676 | } | ||
| 677 | |||
| 678 | /****** Network Device Interface ********************************************/ | ||
| 679 | |||
| 680 | /*============================================================================ | ||
| 681 | * Initialize Linux network interface. | ||
| 682 | * | ||
| 683 | * This routine is called only once for each interface, during Linux network | ||
| 684 | * interface registration. Returning anything but zero will fail interface | ||
| 685 | * registration. | ||
| 686 | */ | ||
| 687 | static int if_init(struct net_device *dev) | ||
| 688 | { | ||
| 689 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 690 | sdla_t *card = ppp_priv_area->card; | ||
| 691 | struct wan_device *wandev = &card->wandev; | ||
| 692 | |||
| 693 | /* Initialize device driver entry points */ | ||
| 694 | dev->open = &if_open; | ||
| 695 | dev->stop = &if_close; | ||
| 696 | dev->hard_header = &if_header; | ||
| 697 | dev->rebuild_header = &if_rebuild_hdr; | ||
| 698 | dev->hard_start_xmit = &if_send; | ||
| 699 | dev->get_stats = &if_stats; | ||
| 700 | dev->tx_timeout = &if_tx_timeout; | ||
| 701 | dev->watchdog_timeo = TX_TIMEOUT; | ||
| 702 | |||
| 703 | /* Initialize media-specific parameters */ | ||
| 704 | dev->type = ARPHRD_PPP; /* ARP h/w type */ | ||
| 705 | dev->flags |= IFF_POINTOPOINT; | ||
| 706 | dev->flags |= IFF_NOARP; | ||
| 707 | |||
| 708 | /* Enable Mulitcasting if specified by user*/ | ||
| 709 | if (ppp_priv_area->mc == WANOPT_YES){ | ||
| 710 | dev->flags |= IFF_MULTICAST; | ||
| 711 | } | ||
| 712 | |||
| 713 | dev->mtu = wandev->mtu; | ||
| 714 | dev->hard_header_len = PPP_HDR_LEN; /* media header length */ | ||
| 715 | |||
| 716 | /* Initialize hardware parameters (just for reference) */ | ||
| 717 | dev->irq = wandev->irq; | ||
| 718 | dev->dma = wandev->dma; | ||
| 719 | dev->base_addr = wandev->ioport; | ||
| 720 | dev->mem_start = wandev->maddr; | ||
| 721 | dev->mem_end = wandev->maddr + wandev->msize - 1; | ||
| 722 | |||
| 723 | /* Set transmit buffer queue length */ | ||
| 724 | dev->tx_queue_len = 100; | ||
| 725 | SET_MODULE_OWNER(dev); | ||
| 726 | |||
| 727 | return 0; | ||
| 728 | } | ||
| 729 | |||
| 730 | /*============================================================================ | ||
| 731 | * Open network interface. | ||
| 732 | * o enable communications and interrupts. | ||
| 733 | * o prevent module from unloading by incrementing use count | ||
| 734 | * | ||
| 735 | * Return 0 if O.k. or errno. | ||
| 736 | */ | ||
| 737 | static int if_open(struct net_device *dev) | ||
| 738 | { | ||
| 739 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 740 | sdla_t *card = ppp_priv_area->card; | ||
| 741 | struct timeval tv; | ||
| 742 | //unsigned long smp_flags; | ||
| 743 | |||
| 744 | if (netif_running(dev)) | ||
| 745 | return -EBUSY; | ||
| 746 | |||
| 747 | wanpipe_open(card); | ||
| 748 | |||
| 749 | netif_start_queue(dev); | ||
| 750 | |||
| 751 | do_gettimeofday( &tv ); | ||
| 752 | ppp_priv_area->router_start_time = tv.tv_sec; | ||
| 753 | |||
| 754 | /* We cannot configure the card here because we don't | ||
| 755 | * have access to the interface IP addresses. | ||
| 756 | * Once the interface initilization is complete, we will be | ||
| 757 | * able to access the IP addresses. Therefore, | ||
| 758 | * configure the ppp link in the poll routine */ | ||
| 759 | set_bit(0,&ppp_priv_area->config_ppp); | ||
| 760 | ppp_priv_area->config_wait_timeout=jiffies; | ||
| 761 | |||
| 762 | /* Start the PPP configuration after 1sec delay. | ||
| 763 | * This will give the interface initilization time | ||
| 764 | * to finish its configuration */ | ||
| 765 | mod_timer(&ppp_priv_area->poll_delay_timer, jiffies + HZ); | ||
| 766 | return 0; | ||
| 767 | } | ||
| 768 | |||
| 769 | /*============================================================================ | ||
| 770 | * Close network interface. | ||
| 771 | * o if this is the last open, then disable communications and interrupts. | ||
| 772 | * o reset flags. | ||
| 773 | */ | ||
| 774 | static int if_close(struct net_device *dev) | ||
| 775 | { | ||
| 776 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 777 | sdla_t *card = ppp_priv_area->card; | ||
| 778 | |||
| 779 | netif_stop_queue(dev); | ||
| 780 | wanpipe_close(card); | ||
| 781 | |||
| 782 | del_timer (&ppp_priv_area->poll_delay_timer); | ||
| 783 | return 0; | ||
| 784 | } | ||
| 785 | |||
| 786 | /*============================================================================ | ||
| 787 | * Build media header. | ||
| 788 | * | ||
| 789 | * The trick here is to put packet type (Ethertype) into 'protocol' field of | ||
| 790 | * the socket buffer, so that we don't forget it. If packet type is not | ||
| 791 | * supported, set skb->protocol to 0 and discard packet later. | ||
| 792 | * | ||
| 793 | * Return: media header length. | ||
| 794 | */ | ||
| 795 | static int if_header(struct sk_buff *skb, struct net_device *dev, | ||
| 796 | unsigned short type, void *daddr, void *saddr, unsigned len) | ||
| 797 | { | ||
| 798 | switch (type) | ||
| 799 | { | ||
| 800 | case ETH_P_IP: | ||
| 801 | case ETH_P_IPX: | ||
| 802 | skb->protocol = htons(type); | ||
| 803 | break; | ||
| 804 | |||
| 805 | default: | ||
| 806 | skb->protocol = 0; | ||
| 807 | } | ||
| 808 | |||
| 809 | return PPP_HDR_LEN; | ||
| 810 | } | ||
| 811 | |||
| 812 | /*============================================================================ | ||
| 813 | * Re-build media header. | ||
| 814 | * | ||
| 815 | * Return: 1 physical address resolved. | ||
| 816 | * 0 physical address not resolved | ||
| 817 | */ | ||
| 818 | static int if_rebuild_hdr (struct sk_buff *skb) | ||
| 819 | { | ||
| 820 | struct net_device *dev = skb->dev; | ||
| 821 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 822 | sdla_t *card = ppp_priv_area->card; | ||
| 823 | |||
| 824 | printk(KERN_INFO "%s: rebuild_header() called for interface %s!\n", | ||
| 825 | card->devname, dev->name); | ||
| 826 | return 1; | ||
| 827 | } | ||
| 828 | |||
| 829 | /*============================================================================ | ||
| 830 | * Handle transmit timeout event from netif watchdog | ||
| 831 | */ | ||
| 832 | static void if_tx_timeout(struct net_device *dev) | ||
| 833 | { | ||
| 834 | ppp_private_area_t* chan = dev->priv; | ||
| 835 | sdla_t *card = chan->card; | ||
| 836 | |||
| 837 | /* If our device stays busy for at least 5 seconds then we will | ||
| 838 | * kick start the device by making dev->tbusy = 0. We expect | ||
| 839 | * that our device never stays busy more than 5 seconds. So this | ||
| 840 | * is only used as a last resort. | ||
| 841 | */ | ||
| 842 | |||
| 843 | ++ chan->if_send_stat.if_send_tbusy; | ||
| 844 | ++card->wandev.stats.collisions; | ||
| 845 | |||
| 846 | printk (KERN_INFO "%s: Transmit timed out on %s\n", card->devname,dev->name); | ||
| 847 | ++chan->if_send_stat.if_send_tbusy_timeout; | ||
| 848 | netif_wake_queue (dev); | ||
| 849 | } | ||
| 850 | |||
| 851 | |||
| 852 | |||
| 853 | /*============================================================================ | ||
| 854 | * Send a packet on a network interface. | ||
| 855 | * o set tbusy flag (marks start of the transmission) to block a timer-based | ||
| 856 | * transmit from overlapping. | ||
| 857 | * o check link state. If link is not up, then drop the packet. | ||
| 858 | * o execute adapter send command. | ||
| 859 | * o free socket buffer | ||
| 860 | * | ||
| 861 | * Return: 0 complete (socket buffer must be freed) | ||
| 862 | * non-0 packet may be re-transmitted (tbusy must be set) | ||
| 863 | * | ||
| 864 | * Notes: | ||
| 865 | * 1. This routine is called either by the protocol stack or by the "net | ||
| 866 | * bottom half" (with interrupts enabled). | ||
| 867 | * 2. Setting tbusy flag will inhibit further transmit requests from the | ||
| 868 | * protocol stack and can be used for flow control with protocol layer. | ||
| 869 | */ | ||
| 870 | static int if_send (struct sk_buff *skb, struct net_device *dev) | ||
| 871 | { | ||
| 872 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 873 | sdla_t *card = ppp_priv_area->card; | ||
| 874 | unsigned char *sendpacket; | ||
| 875 | unsigned long smp_flags; | ||
| 876 | ppp_flags_t *flags = card->flags; | ||
| 877 | int udp_type; | ||
| 878 | int err=0; | ||
| 879 | |||
| 880 | ++ppp_priv_area->if_send_stat.if_send_entry; | ||
| 881 | |||
| 882 | netif_stop_queue(dev); | ||
| 883 | |||
| 884 | if (skb == NULL) { | ||
| 885 | |||
| 886 | /* If we get here, some higher layer thinks we've missed an | ||
| 887 | * tx-done interrupt. | ||
| 888 | */ | ||
| 889 | printk(KERN_INFO "%s: interface %s got kicked!\n", | ||
| 890 | card->devname, dev->name); | ||
| 891 | |||
| 892 | ++ppp_priv_area->if_send_stat.if_send_skb_null; | ||
| 893 | |||
| 894 | netif_wake_queue(dev); | ||
| 895 | return 0; | ||
| 896 | } | ||
| 897 | |||
| 898 | sendpacket = skb->data; | ||
| 899 | |||
| 900 | udp_type = udp_pkt_type( skb, card ); | ||
| 901 | |||
| 902 | |||
| 903 | if (udp_type == UDP_PTPIPE_TYPE){ | ||
| 904 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev, | ||
| 905 | ppp_priv_area)){ | ||
| 906 | flags->imask |= PPP_INTR_TIMER; | ||
| 907 | } | ||
| 908 | ++ppp_priv_area->if_send_stat.if_send_PIPE_request; | ||
| 909 | netif_start_queue(dev); | ||
| 910 | return 0; | ||
| 911 | } | ||
| 912 | |||
| 913 | /* Check for broadcast and multicast addresses | ||
| 914 | * If found, drop (deallocate) a packet and return. | ||
| 915 | */ | ||
| 916 | if(chk_bcast_mcast_addr(card, dev, skb)){ | ||
| 917 | ++card->wandev.stats.tx_dropped; | ||
| 918 | dev_kfree_skb_any(skb); | ||
| 919 | netif_start_queue(dev); | ||
| 920 | return 0; | ||
| 921 | } | ||
| 922 | |||
| 923 | |||
| 924 | if(card->hw.type != SDLA_S514){ | ||
| 925 | s508_lock(card,&smp_flags); | ||
| 926 | } | ||
| 927 | |||
| 928 | if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 929 | |||
| 930 | printk(KERN_INFO "%s: Critical in if_send: %lx\n", | ||
| 931 | card->wandev.name,card->wandev.critical); | ||
| 932 | |||
| 933 | ++card->wandev.stats.tx_dropped; | ||
| 934 | ++ppp_priv_area->if_send_stat.if_send_critical_non_ISR; | ||
| 935 | netif_start_queue(dev); | ||
| 936 | goto if_send_exit_crit; | ||
| 937 | } | ||
| 938 | |||
| 939 | if (card->wandev.state != WAN_CONNECTED) { | ||
| 940 | |||
| 941 | ++ppp_priv_area->if_send_stat.if_send_wan_disconnected; | ||
| 942 | ++card->wandev.stats.tx_dropped; | ||
| 943 | netif_start_queue(dev); | ||
| 944 | |||
| 945 | } else if (!skb->protocol) { | ||
| 946 | ++ppp_priv_area->if_send_stat.if_send_protocol_error; | ||
| 947 | ++card->wandev.stats.tx_errors; | ||
| 948 | netif_start_queue(dev); | ||
| 949 | |||
| 950 | } else { | ||
| 951 | |||
| 952 | /*If it's IPX change the network numbers to 0 if they're ours.*/ | ||
| 953 | if( skb->protocol == htons(ETH_P_IPX) ) { | ||
| 954 | if(ppp_priv_area->enable_IPX) { | ||
| 955 | switch_net_numbers( skb->data, | ||
| 956 | ppp_priv_area->network_number, 0); | ||
| 957 | } else { | ||
| 958 | ++card->wandev.stats.tx_dropped; | ||
| 959 | netif_start_queue(dev); | ||
| 960 | goto if_send_exit_crit; | ||
| 961 | } | ||
| 962 | } | ||
| 963 | |||
| 964 | if (ppp_send(card, skb->data, skb->len, skb->protocol)) { | ||
| 965 | netif_stop_queue(dev); | ||
| 966 | ++ppp_priv_area->if_send_stat.if_send_adptr_bfrs_full; | ||
| 967 | ++ppp_priv_area->if_send_stat.if_send_tx_int_enabled; | ||
| 968 | } else { | ||
| 969 | ++ppp_priv_area->if_send_stat.if_send_bfr_passed_to_adptr; | ||
| 970 | ++card->wandev.stats.tx_packets; | ||
| 971 | card->wandev.stats.tx_bytes += skb->len; | ||
| 972 | netif_start_queue(dev); | ||
| 973 | dev->trans_start = jiffies; | ||
| 974 | } | ||
| 975 | } | ||
| 976 | |||
| 977 | if_send_exit_crit: | ||
| 978 | |||
| 979 | if (!(err=netif_queue_stopped(dev))){ | ||
| 980 | dev_kfree_skb_any(skb); | ||
| 981 | }else{ | ||
| 982 | ppp_priv_area->tick_counter = jiffies; | ||
| 983 | flags->imask |= PPP_INTR_TXRDY; /* unmask Tx interrupts */ | ||
| 984 | } | ||
| 985 | |||
| 986 | clear_bit(SEND_CRIT,&card->wandev.critical); | ||
| 987 | if(card->hw.type != SDLA_S514){ | ||
| 988 | s508_unlock(card,&smp_flags); | ||
| 989 | } | ||
| 990 | |||
| 991 | return err; | ||
| 992 | } | ||
| 993 | |||
| 994 | |||
| 995 | /*============================================================================= | ||
| 996 | * Store a UDP management packet for later processing. | ||
| 997 | */ | ||
| 998 | |||
| 999 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 1000 | struct sk_buff *skb, struct net_device* dev, | ||
| 1001 | ppp_private_area_t* ppp_priv_area ) | ||
| 1002 | { | ||
| 1003 | int udp_pkt_stored = 0; | ||
| 1004 | |||
| 1005 | if(!ppp_priv_area->udp_pkt_lgth && (skb->len<=MAX_LGTH_UDP_MGNT_PKT)){ | ||
| 1006 | ppp_priv_area->udp_pkt_lgth = skb->len; | ||
| 1007 | ppp_priv_area->udp_pkt_src = udp_pkt_src; | ||
| 1008 | memcpy(ppp_priv_area->udp_pkt_data, skb->data, skb->len); | ||
| 1009 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_UDP; | ||
| 1010 | ppp_priv_area->protocol = skb->protocol; | ||
| 1011 | udp_pkt_stored = 1; | ||
| 1012 | }else{ | ||
| 1013 | if (skb->len > MAX_LGTH_UDP_MGNT_PKT){ | ||
| 1014 | printk(KERN_INFO "%s: PIPEMON UDP request too long : %i\n", | ||
| 1015 | card->devname, skb->len); | ||
| 1016 | }else{ | ||
| 1017 | printk(KERN_INFO "%s: PIPEMON UPD request already pending\n", | ||
| 1018 | card->devname); | ||
| 1019 | } | ||
| 1020 | ppp_priv_area->udp_pkt_lgth = 0; | ||
| 1021 | } | ||
| 1022 | |||
| 1023 | if(udp_pkt_src == UDP_PKT_FRM_STACK){ | ||
| 1024 | dev_kfree_skb_any(skb); | ||
| 1025 | }else{ | ||
| 1026 | dev_kfree_skb_any(skb); | ||
| 1027 | } | ||
| 1028 | |||
| 1029 | return(udp_pkt_stored); | ||
| 1030 | } | ||
| 1031 | |||
| 1032 | |||
| 1033 | |||
| 1034 | /*============================================================================ | ||
| 1035 | * Reply to UDP Management system. | ||
| 1036 | * Return length of reply. | ||
| 1037 | */ | ||
| 1038 | static int reply_udp( unsigned char *data, unsigned int mbox_len ) | ||
| 1039 | { | ||
| 1040 | unsigned short len, udp_length, temp, ip_length; | ||
| 1041 | unsigned long ip_temp; | ||
| 1042 | int even_bound = 0; | ||
| 1043 | ppp_udp_pkt_t *p_udp_pkt = (ppp_udp_pkt_t *)data; | ||
| 1044 | |||
| 1045 | /* Set length of packet */ | ||
| 1046 | len = sizeof(ip_pkt_t)+ | ||
| 1047 | sizeof(udp_pkt_t)+ | ||
| 1048 | sizeof(wp_mgmt_t)+ | ||
| 1049 | sizeof(cblock_t)+ | ||
| 1050 | mbox_len; | ||
| 1051 | |||
| 1052 | /* fill in UDP reply */ | ||
| 1053 | p_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; | ||
| 1054 | |||
| 1055 | /* fill in UDP length */ | ||
| 1056 | udp_length = sizeof(udp_pkt_t)+ | ||
| 1057 | sizeof(wp_mgmt_t)+ | ||
| 1058 | sizeof(cblock_t)+ | ||
| 1059 | mbox_len; | ||
| 1060 | |||
| 1061 | |||
| 1062 | /* put it on an even boundary */ | ||
| 1063 | if ( udp_length & 0x0001 ) { | ||
| 1064 | udp_length += 1; | ||
| 1065 | len += 1; | ||
| 1066 | even_bound=1; | ||
| 1067 | } | ||
| 1068 | |||
| 1069 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1070 | p_udp_pkt->udp_pkt.udp_length = temp; | ||
| 1071 | |||
| 1072 | |||
| 1073 | /* swap UDP ports */ | ||
| 1074 | temp = p_udp_pkt->udp_pkt.udp_src_port; | ||
| 1075 | p_udp_pkt->udp_pkt.udp_src_port = | ||
| 1076 | p_udp_pkt->udp_pkt.udp_dst_port; | ||
| 1077 | p_udp_pkt->udp_pkt.udp_dst_port = temp; | ||
| 1078 | |||
| 1079 | |||
| 1080 | /* add UDP pseudo header */ | ||
| 1081 | temp = 0x1100; | ||
| 1082 | *((unsigned short *)(p_udp_pkt->data+mbox_len+even_bound)) = temp; | ||
| 1083 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 1084 | *((unsigned short *)(p_udp_pkt->data+mbox_len+even_bound+2)) = temp; | ||
| 1085 | |||
| 1086 | /* calculate UDP checksum */ | ||
| 1087 | p_udp_pkt->udp_pkt.udp_checksum = 0; | ||
| 1088 | p_udp_pkt->udp_pkt.udp_checksum = | ||
| 1089 | calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET); | ||
| 1090 | |||
| 1091 | /* fill in IP length */ | ||
| 1092 | ip_length = udp_length + sizeof(ip_pkt_t); | ||
| 1093 | temp = (ip_length<<8)|(ip_length>>8); | ||
| 1094 | p_udp_pkt->ip_pkt.total_length = temp; | ||
| 1095 | |||
| 1096 | /* swap IP addresses */ | ||
| 1097 | ip_temp = p_udp_pkt->ip_pkt.ip_src_address; | ||
| 1098 | p_udp_pkt->ip_pkt.ip_src_address = p_udp_pkt->ip_pkt.ip_dst_address; | ||
| 1099 | p_udp_pkt->ip_pkt.ip_dst_address = ip_temp; | ||
| 1100 | |||
| 1101 | /* fill in IP checksum */ | ||
| 1102 | p_udp_pkt->ip_pkt.hdr_checksum = 0; | ||
| 1103 | p_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t)); | ||
| 1104 | |||
| 1105 | return len; | ||
| 1106 | |||
| 1107 | } /* reply_udp */ | ||
| 1108 | |||
| 1109 | unsigned short calc_checksum (char *data, int len) | ||
| 1110 | { | ||
| 1111 | unsigned short temp; | ||
| 1112 | unsigned long sum=0; | ||
| 1113 | int i; | ||
| 1114 | |||
| 1115 | for( i = 0; i <len; i+=2 ) { | ||
| 1116 | memcpy(&temp,&data[i],2); | ||
| 1117 | sum += (unsigned long)temp; | ||
| 1118 | } | ||
| 1119 | |||
| 1120 | while (sum >> 16 ) { | ||
| 1121 | sum = (sum & 0xffffUL) + (sum >> 16); | ||
| 1122 | } | ||
| 1123 | |||
| 1124 | temp = (unsigned short)sum; | ||
| 1125 | temp = ~temp; | ||
| 1126 | |||
| 1127 | if( temp == 0 ) | ||
| 1128 | temp = 0xffff; | ||
| 1129 | |||
| 1130 | return temp; | ||
| 1131 | } | ||
| 1132 | |||
| 1133 | /* | ||
| 1134 | If incoming is 0 (outgoing)- if the net numbers is ours make it 0 | ||
| 1135 | if incoming is 1 - if the net number is 0 make it ours | ||
| 1136 | |||
| 1137 | */ | ||
| 1138 | static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming) | ||
| 1139 | { | ||
| 1140 | unsigned long pnetwork_number; | ||
| 1141 | |||
| 1142 | pnetwork_number = (unsigned long)((sendpacket[6] << 24) + | ||
| 1143 | (sendpacket[7] << 16) + (sendpacket[8] << 8) + | ||
| 1144 | sendpacket[9]); | ||
| 1145 | |||
| 1146 | if (!incoming) { | ||
| 1147 | //If the destination network number is ours, make it 0 | ||
| 1148 | if( pnetwork_number == network_number) { | ||
| 1149 | sendpacket[6] = sendpacket[7] = sendpacket[8] = | ||
| 1150 | sendpacket[9] = 0x00; | ||
| 1151 | } | ||
| 1152 | } else { | ||
| 1153 | //If the incoming network is 0, make it ours | ||
| 1154 | if( pnetwork_number == 0) { | ||
| 1155 | sendpacket[6] = (unsigned char)(network_number >> 24); | ||
| 1156 | sendpacket[7] = (unsigned char)((network_number & | ||
| 1157 | 0x00FF0000) >> 16); | ||
| 1158 | sendpacket[8] = (unsigned char)((network_number & | ||
| 1159 | 0x0000FF00) >> 8); | ||
| 1160 | sendpacket[9] = (unsigned char)(network_number & | ||
| 1161 | 0x000000FF); | ||
| 1162 | } | ||
| 1163 | } | ||
| 1164 | |||
| 1165 | |||
| 1166 | pnetwork_number = (unsigned long)((sendpacket[18] << 24) + | ||
| 1167 | (sendpacket[19] << 16) + (sendpacket[20] << 8) + | ||
| 1168 | sendpacket[21]); | ||
| 1169 | |||
| 1170 | if( !incoming ) { | ||
| 1171 | //If the source network is ours, make it 0 | ||
| 1172 | if( pnetwork_number == network_number) { | ||
| 1173 | sendpacket[18] = sendpacket[19] = sendpacket[20] = | ||
| 1174 | sendpacket[21] = 0x00; | ||
| 1175 | } | ||
| 1176 | } else { | ||
| 1177 | //If the source network is 0, make it ours | ||
| 1178 | if( pnetwork_number == 0 ) { | ||
| 1179 | sendpacket[18] = (unsigned char)(network_number >> 24); | ||
| 1180 | sendpacket[19] = (unsigned char)((network_number & | ||
| 1181 | 0x00FF0000) >> 16); | ||
| 1182 | sendpacket[20] = (unsigned char)((network_number & | ||
| 1183 | 0x0000FF00) >> 8); | ||
| 1184 | sendpacket[21] = (unsigned char)(network_number & | ||
| 1185 | 0x000000FF); | ||
| 1186 | } | ||
| 1187 | } | ||
| 1188 | } /* switch_net_numbers */ | ||
| 1189 | |||
| 1190 | /*============================================================================ | ||
| 1191 | * Get ethernet-style interface statistics. | ||
| 1192 | * Return a pointer to struct net_device_stats. | ||
| 1193 | */ | ||
| 1194 | static struct net_device_stats *if_stats(struct net_device *dev) | ||
| 1195 | { | ||
| 1196 | |||
| 1197 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 1198 | sdla_t* card; | ||
| 1199 | |||
| 1200 | if( ppp_priv_area == NULL ) | ||
| 1201 | return NULL; | ||
| 1202 | |||
| 1203 | card = ppp_priv_area->card; | ||
| 1204 | return &card->wandev.stats; | ||
| 1205 | } | ||
| 1206 | |||
| 1207 | /****** PPP Firmware Interface Functions ************************************/ | ||
| 1208 | |||
| 1209 | /*============================================================================ | ||
| 1210 | * Read firmware code version. | ||
| 1211 | * Put code version as ASCII string in str. | ||
| 1212 | */ | ||
| 1213 | static int ppp_read_version(sdla_t *card, char *str) | ||
| 1214 | { | ||
| 1215 | ppp_mbox_t *mb = card->mbox; | ||
| 1216 | int err; | ||
| 1217 | |||
| 1218 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1219 | mb->cmd.command = PPP_READ_CODE_VERSION; | ||
| 1220 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1221 | |||
| 1222 | if (err != CMD_OK) | ||
| 1223 | |||
| 1224 | ppp_error(card, err, mb); | ||
| 1225 | |||
| 1226 | else if (str) { | ||
| 1227 | |||
| 1228 | int len = mb->cmd.length; | ||
| 1229 | |||
| 1230 | memcpy(str, mb->data, len); | ||
| 1231 | str[len] = '\0'; | ||
| 1232 | |||
| 1233 | } | ||
| 1234 | |||
| 1235 | return err; | ||
| 1236 | } | ||
| 1237 | /*=========================================================================== | ||
| 1238 | * Set Out-Bound Authentication. | ||
| 1239 | */ | ||
| 1240 | static int ppp_set_outbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area) | ||
| 1241 | { | ||
| 1242 | ppp_mbox_t *mb = card->mbox; | ||
| 1243 | int err; | ||
| 1244 | |||
| 1245 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1246 | memset(&mb->data, 0, (strlen(ppp_priv_area->userid) + | ||
| 1247 | strlen(ppp_priv_area->passwd) + 2 ) ); | ||
| 1248 | memcpy(mb->data, ppp_priv_area->userid, strlen(ppp_priv_area->userid)); | ||
| 1249 | memcpy((mb->data + strlen(ppp_priv_area->userid) + 1), | ||
| 1250 | ppp_priv_area->passwd, strlen(ppp_priv_area->passwd)); | ||
| 1251 | |||
| 1252 | mb->cmd.length = strlen(ppp_priv_area->userid) + | ||
| 1253 | strlen(ppp_priv_area->passwd) + 2 ; | ||
| 1254 | |||
| 1255 | mb->cmd.command = PPP_SET_OUTBOUND_AUTH; | ||
| 1256 | |||
| 1257 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1258 | |||
| 1259 | if (err != CMD_OK) | ||
| 1260 | ppp_error(card, err, mb); | ||
| 1261 | |||
| 1262 | return err; | ||
| 1263 | } | ||
| 1264 | |||
| 1265 | /*=========================================================================== | ||
| 1266 | * Set In-Bound Authentication. | ||
| 1267 | */ | ||
| 1268 | static int ppp_set_inbnd_auth (sdla_t *card, ppp_private_area_t *ppp_priv_area) | ||
| 1269 | { | ||
| 1270 | ppp_mbox_t *mb = card->mbox; | ||
| 1271 | int err, i; | ||
| 1272 | char* user_tokens[32]; | ||
| 1273 | char* pass_tokens[32]; | ||
| 1274 | int userids, passwds; | ||
| 1275 | int add_ptr; | ||
| 1276 | |||
| 1277 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1278 | memset(&mb->data, 0, 1008); | ||
| 1279 | memcpy(mb->data, ppp_priv_area->sysname, | ||
| 1280 | strlen(ppp_priv_area->sysname)); | ||
| 1281 | |||
| 1282 | /* Parse the userid string and the password string and build a string | ||
| 1283 | to copy it to the data area of the command structure. The string | ||
| 1284 | will look like "SYS_NAME<NULL>USER1<NULL>PASS1<NULL>USER2<NULL>PASS2 | ||
| 1285 | ....<NULL> " | ||
| 1286 | */ | ||
| 1287 | userids = tokenize( ppp_priv_area->userid, user_tokens); | ||
| 1288 | passwds = tokenize( ppp_priv_area->passwd, pass_tokens); | ||
| 1289 | |||
| 1290 | if (userids != passwds){ | ||
| 1291 | printk(KERN_INFO "%s: Number of passwords does not equal the number of user ids\n", card->devname); | ||
| 1292 | return 1; | ||
| 1293 | } | ||
| 1294 | |||
| 1295 | add_ptr = strlen(ppp_priv_area->sysname) + 1; | ||
| 1296 | for (i=0; i<userids; i++){ | ||
| 1297 | memcpy((mb->data + add_ptr), user_tokens[i], | ||
| 1298 | strlen(user_tokens[i])); | ||
| 1299 | memcpy((mb->data + add_ptr + strlen(user_tokens[i]) + 1), | ||
| 1300 | pass_tokens[i], strlen(pass_tokens[i])); | ||
| 1301 | add_ptr = add_ptr + strlen(user_tokens[i]) + 1 + | ||
| 1302 | strlen(pass_tokens[i]) + 1; | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | mb->cmd.length = add_ptr + 1; | ||
| 1306 | mb->cmd.command = PPP_SET_INBOUND_AUTH; | ||
| 1307 | |||
| 1308 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1309 | |||
| 1310 | if (err != CMD_OK) | ||
| 1311 | ppp_error(card, err, mb); | ||
| 1312 | |||
| 1313 | return err; | ||
| 1314 | } | ||
| 1315 | |||
| 1316 | |||
| 1317 | /*============================================================================ | ||
| 1318 | * Tokenize string. | ||
| 1319 | * Parse a string of the following syntax: | ||
| 1320 | * <arg1>,<arg2>,... | ||
| 1321 | * and fill array of tokens with pointers to string elements. | ||
| 1322 | * | ||
| 1323 | */ | ||
| 1324 | static int tokenize (char *str, char **tokens) | ||
| 1325 | { | ||
| 1326 | int cnt = 0; | ||
| 1327 | |||
| 1328 | tokens[0] = strsep(&str, "/"); | ||
| 1329 | while (tokens[cnt] && (cnt < 32 - 1)) | ||
| 1330 | { | ||
| 1331 | tokens[cnt] = strstrip(tokens[cnt], " \t"); | ||
| 1332 | tokens[++cnt] = strsep(&str, "/"); | ||
| 1333 | } | ||
| 1334 | return cnt; | ||
| 1335 | } | ||
| 1336 | |||
| 1337 | /*============================================================================ | ||
| 1338 | * Strip leading and trailing spaces off the string str. | ||
| 1339 | */ | ||
| 1340 | static char* strstrip (char *str, char* s) | ||
| 1341 | { | ||
| 1342 | char *eos = str + strlen(str); /* -> end of string */ | ||
| 1343 | |||
| 1344 | while (*str && strchr(s, *str)) | ||
| 1345 | ++str /* strip leading spaces */ | ||
| 1346 | ; | ||
| 1347 | while ((eos > str) && strchr(s, *(eos - 1))) | ||
| 1348 | --eos /* strip trailing spaces */ | ||
| 1349 | ; | ||
| 1350 | *eos = '\0'; | ||
| 1351 | return str; | ||
| 1352 | } | ||
| 1353 | /*============================================================================ | ||
| 1354 | * Configure PPP firmware. | ||
| 1355 | */ | ||
| 1356 | static int ppp_configure(sdla_t *card, void *data) | ||
| 1357 | { | ||
| 1358 | ppp_mbox_t *mb = card->mbox; | ||
| 1359 | int data_len = sizeof(ppp508_conf_t); | ||
| 1360 | int err; | ||
| 1361 | |||
| 1362 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1363 | memcpy(mb->data, data, data_len); | ||
| 1364 | mb->cmd.length = data_len; | ||
| 1365 | mb->cmd.command = PPP_SET_CONFIG; | ||
| 1366 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1367 | |||
| 1368 | if (err != CMD_OK) | ||
| 1369 | ppp_error(card, err, mb); | ||
| 1370 | |||
| 1371 | return err; | ||
| 1372 | } | ||
| 1373 | |||
| 1374 | /*============================================================================ | ||
| 1375 | * Set interrupt mode. | ||
| 1376 | */ | ||
| 1377 | static int ppp_set_intr_mode(sdla_t *card, unsigned char mode) | ||
| 1378 | { | ||
| 1379 | ppp_mbox_t *mb = card->mbox; | ||
| 1380 | ppp_intr_info_t *ppp_intr_data = (ppp_intr_info_t *) &mb->data[0]; | ||
| 1381 | int err; | ||
| 1382 | |||
| 1383 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1384 | ppp_intr_data->i_enable = mode; | ||
| 1385 | |||
| 1386 | ppp_intr_data->irq = card->hw.irq; | ||
| 1387 | mb->cmd.length = 2; | ||
| 1388 | |||
| 1389 | /* If timer has been enabled, set the timer delay to 1sec */ | ||
| 1390 | if (mode & 0x80){ | ||
| 1391 | ppp_intr_data->timer_len = 250; //5;//100; //250; | ||
| 1392 | mb->cmd.length = 4; | ||
| 1393 | } | ||
| 1394 | |||
| 1395 | mb->cmd.command = PPP_SET_INTR_FLAGS; | ||
| 1396 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1397 | |||
| 1398 | if (err != CMD_OK) | ||
| 1399 | ppp_error(card, err, mb); | ||
| 1400 | |||
| 1401 | |||
| 1402 | return err; | ||
| 1403 | } | ||
| 1404 | |||
| 1405 | /*============================================================================ | ||
| 1406 | * Enable communications. | ||
| 1407 | */ | ||
| 1408 | static int ppp_comm_enable(sdla_t *card) | ||
| 1409 | { | ||
| 1410 | ppp_mbox_t *mb = card->mbox; | ||
| 1411 | int err; | ||
| 1412 | |||
| 1413 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1414 | mb->cmd.command = PPP_COMM_ENABLE; | ||
| 1415 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1416 | |||
| 1417 | if (err != CMD_OK) | ||
| 1418 | ppp_error(card, err, mb); | ||
| 1419 | else | ||
| 1420 | card->u.p.comm_enabled = 1; | ||
| 1421 | |||
| 1422 | return err; | ||
| 1423 | } | ||
| 1424 | |||
| 1425 | /*============================================================================ | ||
| 1426 | * Disable communications. | ||
| 1427 | */ | ||
| 1428 | static int ppp_comm_disable(sdla_t *card) | ||
| 1429 | { | ||
| 1430 | ppp_mbox_t *mb = card->mbox; | ||
| 1431 | int err; | ||
| 1432 | |||
| 1433 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1434 | mb->cmd.command = PPP_COMM_DISABLE; | ||
| 1435 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1436 | if (err != CMD_OK) | ||
| 1437 | ppp_error(card, err, mb); | ||
| 1438 | else | ||
| 1439 | card->u.p.comm_enabled = 0; | ||
| 1440 | |||
| 1441 | return err; | ||
| 1442 | } | ||
| 1443 | |||
| 1444 | static int ppp_comm_disable_shutdown(sdla_t *card) | ||
| 1445 | { | ||
| 1446 | ppp_mbox_t *mb = card->mbox; | ||
| 1447 | ppp_intr_info_t *ppp_intr_data; | ||
| 1448 | int err; | ||
| 1449 | |||
| 1450 | if (!mb){ | ||
| 1451 | return 1; | ||
| 1452 | } | ||
| 1453 | |||
| 1454 | ppp_intr_data = (ppp_intr_info_t *) &mb->data[0]; | ||
| 1455 | |||
| 1456 | /* Disable all interrupts */ | ||
| 1457 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1458 | ppp_intr_data->i_enable = 0; | ||
| 1459 | |||
| 1460 | ppp_intr_data->irq = card->hw.irq; | ||
| 1461 | mb->cmd.length = 2; | ||
| 1462 | |||
| 1463 | mb->cmd.command = PPP_SET_INTR_FLAGS; | ||
| 1464 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1465 | |||
| 1466 | /* Disable communicatinons */ | ||
| 1467 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1468 | mb->cmd.command = PPP_COMM_DISABLE; | ||
| 1469 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1470 | |||
| 1471 | card->u.p.comm_enabled = 0; | ||
| 1472 | |||
| 1473 | return 0; | ||
| 1474 | } | ||
| 1475 | |||
| 1476 | |||
| 1477 | |||
| 1478 | /*============================================================================ | ||
| 1479 | * Get communications error statistics. | ||
| 1480 | */ | ||
| 1481 | static int ppp_get_err_stats(sdla_t *card) | ||
| 1482 | { | ||
| 1483 | ppp_mbox_t *mb = card->mbox; | ||
| 1484 | int err; | ||
| 1485 | |||
| 1486 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 1487 | mb->cmd.command = PPP_READ_ERROR_STATS; | ||
| 1488 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 1489 | |||
| 1490 | if (err == CMD_OK) { | ||
| 1491 | |||
| 1492 | ppp_err_stats_t* stats = (void*)mb->data; | ||
| 1493 | card->wandev.stats.rx_over_errors = stats->rx_overrun; | ||
| 1494 | card->wandev.stats.rx_crc_errors = stats->rx_bad_crc; | ||
| 1495 | card->wandev.stats.rx_missed_errors = stats->rx_abort; | ||
| 1496 | card->wandev.stats.rx_length_errors = stats->rx_lost; | ||
| 1497 | card->wandev.stats.tx_aborted_errors = stats->tx_abort; | ||
| 1498 | |||
| 1499 | } else | ||
| 1500 | ppp_error(card, err, mb); | ||
| 1501 | |||
| 1502 | return err; | ||
| 1503 | } | ||
| 1504 | |||
| 1505 | /*============================================================================ | ||
| 1506 | * Send packet. | ||
| 1507 | * Return: 0 - o.k. | ||
| 1508 | * 1 - no transmit buffers available | ||
| 1509 | */ | ||
| 1510 | static int ppp_send (sdla_t *card, void *data, unsigned len, unsigned proto) | ||
| 1511 | { | ||
| 1512 | ppp_buf_ctl_t *txbuf = card->u.p.txbuf; | ||
| 1513 | |||
| 1514 | if (txbuf->flag) | ||
| 1515 | return 1; | ||
| 1516 | |||
| 1517 | sdla_poke(&card->hw, txbuf->buf.ptr, data, len); | ||
| 1518 | |||
| 1519 | txbuf->length = len; /* frame length */ | ||
| 1520 | |||
| 1521 | if (proto == htons(ETH_P_IPX)) | ||
| 1522 | txbuf->proto = 0x01; /* protocol ID */ | ||
| 1523 | else | ||
| 1524 | txbuf->proto = 0x00; /* protocol ID */ | ||
| 1525 | |||
| 1526 | txbuf->flag = 1; /* start transmission */ | ||
| 1527 | |||
| 1528 | /* Update transmit buffer control fields */ | ||
| 1529 | card->u.p.txbuf = ++txbuf; | ||
| 1530 | |||
| 1531 | if ((void*)txbuf > card->u.p.txbuf_last) | ||
| 1532 | card->u.p.txbuf = card->u.p.txbuf_base; | ||
| 1533 | |||
| 1534 | return 0; | ||
| 1535 | } | ||
| 1536 | |||
| 1537 | /****** Firmware Error Handler **********************************************/ | ||
| 1538 | |||
| 1539 | /*============================================================================ | ||
| 1540 | * Firmware error handler. | ||
| 1541 | * This routine is called whenever firmware command returns non-zero | ||
| 1542 | * return code. | ||
| 1543 | * | ||
| 1544 | * Return zero if previous command has to be cancelled. | ||
| 1545 | */ | ||
| 1546 | static int ppp_error(sdla_t *card, int err, ppp_mbox_t *mb) | ||
| 1547 | { | ||
| 1548 | unsigned cmd = mb->cmd.command; | ||
| 1549 | |||
| 1550 | switch (err) { | ||
| 1551 | |||
| 1552 | case CMD_TIMEOUT: | ||
| 1553 | printk(KERN_ERR "%s: command 0x%02X timed out!\n", | ||
| 1554 | card->devname, cmd); | ||
| 1555 | break; | ||
| 1556 | |||
| 1557 | default: | ||
| 1558 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n" | ||
| 1559 | , card->devname, cmd, err); | ||
| 1560 | } | ||
| 1561 | |||
| 1562 | return 0; | ||
| 1563 | } | ||
| 1564 | |||
| 1565 | /****** Interrupt Handlers **************************************************/ | ||
| 1566 | |||
| 1567 | /*============================================================================ | ||
| 1568 | * PPP interrupt service routine. | ||
| 1569 | */ | ||
| 1570 | static void wpp_isr (sdla_t *card) | ||
| 1571 | { | ||
| 1572 | ppp_flags_t *flags = card->flags; | ||
| 1573 | char *ptr = &flags->iflag; | ||
| 1574 | struct net_device *dev = card->wandev.dev; | ||
| 1575 | int i; | ||
| 1576 | |||
| 1577 | card->in_isr = 1; | ||
| 1578 | ++card->statistics.isr_entry; | ||
| 1579 | |||
| 1580 | if (!dev && flags->iflag != PPP_INTR_CMD){ | ||
| 1581 | card->in_isr = 0; | ||
| 1582 | flags->iflag = 0; | ||
| 1583 | return; | ||
| 1584 | } | ||
| 1585 | |||
| 1586 | if (test_bit(PERI_CRIT, (void*)&card->wandev.critical)) { | ||
| 1587 | card->in_isr = 0; | ||
| 1588 | flags->iflag = 0; | ||
| 1589 | return; | ||
| 1590 | } | ||
| 1591 | |||
| 1592 | |||
| 1593 | if(card->hw.type != SDLA_S514){ | ||
| 1594 | if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)) { | ||
| 1595 | ++card->statistics.isr_already_critical; | ||
| 1596 | printk (KERN_INFO "%s: Critical while in ISR!\n", | ||
| 1597 | card->devname); | ||
| 1598 | card->in_isr = 0; | ||
| 1599 | flags->iflag = 0; | ||
| 1600 | return; | ||
| 1601 | } | ||
| 1602 | } | ||
| 1603 | |||
| 1604 | switch (flags->iflag) { | ||
| 1605 | |||
| 1606 | case PPP_INTR_RXRDY: /* receive interrupt 0x01 (bit 0)*/ | ||
| 1607 | ++card->statistics.isr_rx; | ||
| 1608 | rx_intr(card); | ||
| 1609 | break; | ||
| 1610 | |||
| 1611 | case PPP_INTR_TXRDY: /* transmit interrupt 0x02 (bit 1)*/ | ||
| 1612 | ++card->statistics.isr_tx; | ||
| 1613 | flags->imask &= ~PPP_INTR_TXRDY; | ||
| 1614 | netif_wake_queue(dev); | ||
| 1615 | break; | ||
| 1616 | |||
| 1617 | case PPP_INTR_CMD: /* interface command completed */ | ||
| 1618 | ++Intr_test_counter; | ||
| 1619 | ++card->statistics.isr_intr_test; | ||
| 1620 | break; | ||
| 1621 | |||
| 1622 | case PPP_INTR_MODEM: /* modem status change (DCD, CTS) 0x04 (bit 2)*/ | ||
| 1623 | case PPP_INTR_DISC: /* Data link disconnected 0x10 (bit 4)*/ | ||
| 1624 | case PPP_INTR_OPEN: /* Data link open 0x20 (bit 5)*/ | ||
| 1625 | case PPP_INTR_DROP_DTR: /* DTR drop timeout expired 0x40 bit 6 */ | ||
| 1626 | event_intr(card); | ||
| 1627 | break; | ||
| 1628 | |||
| 1629 | case PPP_INTR_TIMER: | ||
| 1630 | timer_intr(card); | ||
| 1631 | break; | ||
| 1632 | |||
| 1633 | default: /* unexpected interrupt */ | ||
| 1634 | ++card->statistics.isr_spurious; | ||
| 1635 | printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n", | ||
| 1636 | card->devname, flags->iflag); | ||
| 1637 | printk(KERN_INFO "%s: ID Bytes = ",card->devname); | ||
| 1638 | for(i = 0; i < 8; i ++) | ||
| 1639 | printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i)); | ||
| 1640 | printk(KERN_INFO "\n"); | ||
| 1641 | } | ||
| 1642 | |||
| 1643 | card->in_isr = 0; | ||
| 1644 | flags->iflag = 0; | ||
| 1645 | return; | ||
| 1646 | } | ||
| 1647 | |||
| 1648 | /*============================================================================ | ||
| 1649 | * Receive interrupt handler. | ||
| 1650 | */ | ||
| 1651 | static void rx_intr(sdla_t *card) | ||
| 1652 | { | ||
| 1653 | ppp_buf_ctl_t *rxbuf = card->rxmb; | ||
| 1654 | struct net_device *dev = card->wandev.dev; | ||
| 1655 | ppp_private_area_t *ppp_priv_area; | ||
| 1656 | struct sk_buff *skb; | ||
| 1657 | unsigned len; | ||
| 1658 | void *buf; | ||
| 1659 | int i; | ||
| 1660 | ppp_flags_t *flags = card->flags; | ||
| 1661 | char *ptr = &flags->iflag; | ||
| 1662 | int udp_type; | ||
| 1663 | |||
| 1664 | |||
| 1665 | if (rxbuf->flag != 0x01) { | ||
| 1666 | |||
| 1667 | printk(KERN_INFO | ||
| 1668 | "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n", | ||
| 1669 | card->devname, (unsigned)rxbuf, rxbuf->flag); | ||
| 1670 | |||
| 1671 | printk(KERN_INFO "%s: ID Bytes = ",card->devname); | ||
| 1672 | |||
| 1673 | for(i = 0; i < 8; i ++) | ||
| 1674 | printk(KERN_INFO "0x%02X ", *(ptr + 0x28 + i)); | ||
| 1675 | printk(KERN_INFO "\n"); | ||
| 1676 | |||
| 1677 | ++card->statistics.rx_intr_corrupt_rx_bfr; | ||
| 1678 | |||
| 1679 | |||
| 1680 | /* Bug Fix: Mar 6 2000 | ||
| 1681 | * If we get a corrupted mailbox, it means that driver | ||
| 1682 | * is out of sync with the firmware. There is no recovery. | ||
| 1683 | * If we don't turn off all interrupts for this card | ||
| 1684 | * the machine will crash. | ||
| 1685 | */ | ||
| 1686 | printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname); | ||
| 1687 | printk(KERN_INFO "Please contact Sangoma Technologies !\n"); | ||
| 1688 | ppp_set_intr_mode(card,0); | ||
| 1689 | return; | ||
| 1690 | } | ||
| 1691 | |||
| 1692 | if (dev && netif_running(dev) && dev->priv){ | ||
| 1693 | |||
| 1694 | len = rxbuf->length; | ||
| 1695 | ppp_priv_area = dev->priv; | ||
| 1696 | |||
| 1697 | /* Allocate socket buffer */ | ||
| 1698 | skb = dev_alloc_skb(len); | ||
| 1699 | |||
| 1700 | if (skb != NULL) { | ||
| 1701 | |||
| 1702 | /* Copy data to the socket buffer */ | ||
| 1703 | unsigned addr = rxbuf->buf.ptr; | ||
| 1704 | |||
| 1705 | if ((addr + len) > card->u.p.rx_top + 1) { | ||
| 1706 | |||
| 1707 | unsigned tmp = card->u.p.rx_top - addr + 1; | ||
| 1708 | buf = skb_put(skb, tmp); | ||
| 1709 | sdla_peek(&card->hw, addr, buf, tmp); | ||
| 1710 | addr = card->u.p.rx_base; | ||
| 1711 | len -= tmp; | ||
| 1712 | } | ||
| 1713 | buf = skb_put(skb, len); | ||
| 1714 | sdla_peek(&card->hw, addr, buf, len); | ||
| 1715 | |||
| 1716 | /* Decapsulate packet */ | ||
| 1717 | switch (rxbuf->proto) { | ||
| 1718 | |||
| 1719 | case 0x00: | ||
| 1720 | skb->protocol = htons(ETH_P_IP); | ||
| 1721 | break; | ||
| 1722 | |||
| 1723 | case 0x01: | ||
| 1724 | skb->protocol = htons(ETH_P_IPX); | ||
| 1725 | break; | ||
| 1726 | } | ||
| 1727 | |||
| 1728 | udp_type = udp_pkt_type( skb, card ); | ||
| 1729 | |||
| 1730 | if (udp_type == UDP_PTPIPE_TYPE){ | ||
| 1731 | |||
| 1732 | /* Handle a UDP Request in Timer Interrupt */ | ||
| 1733 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK, card, skb, dev, | ||
| 1734 | ppp_priv_area)){ | ||
| 1735 | flags->imask |= PPP_INTR_TIMER; | ||
| 1736 | } | ||
| 1737 | ++ppp_priv_area->rx_intr_stat.rx_intr_PIPE_request; | ||
| 1738 | |||
| 1739 | |||
| 1740 | } else if (handle_IPXWAN(skb->data,card->devname, | ||
| 1741 | ppp_priv_area->enable_IPX, | ||
| 1742 | ppp_priv_area->network_number, | ||
| 1743 | skb->protocol)) { | ||
| 1744 | |||
| 1745 | /* Handle an IPXWAN packet */ | ||
| 1746 | if( ppp_priv_area->enable_IPX) { | ||
| 1747 | |||
| 1748 | /* Make sure we are not already sending */ | ||
| 1749 | if (!test_bit(SEND_CRIT, &card->wandev.critical)){ | ||
| 1750 | ppp_send(card, skb->data, skb->len, htons(ETH_P_IPX)); | ||
| 1751 | } | ||
| 1752 | dev_kfree_skb_any(skb); | ||
| 1753 | |||
| 1754 | } else { | ||
| 1755 | ++card->wandev.stats.rx_dropped; | ||
| 1756 | } | ||
| 1757 | } else { | ||
| 1758 | /* Pass data up the protocol stack */ | ||
| 1759 | skb->dev = dev; | ||
| 1760 | skb->mac.raw = skb->data; | ||
| 1761 | |||
| 1762 | ++card->wandev.stats.rx_packets; | ||
| 1763 | card->wandev.stats.rx_bytes += skb->len; | ||
| 1764 | ++ppp_priv_area->rx_intr_stat.rx_intr_bfr_passed_to_stack; | ||
| 1765 | netif_rx(skb); | ||
| 1766 | dev->last_rx = jiffies; | ||
| 1767 | } | ||
| 1768 | |||
| 1769 | } else { | ||
| 1770 | |||
| 1771 | if (net_ratelimit()){ | ||
| 1772 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 1773 | card->devname); | ||
| 1774 | } | ||
| 1775 | ++card->wandev.stats.rx_dropped; | ||
| 1776 | ++ppp_priv_area->rx_intr_stat.rx_intr_no_socket; | ||
| 1777 | } | ||
| 1778 | |||
| 1779 | } else { | ||
| 1780 | ++card->statistics.rx_intr_dev_not_started; | ||
| 1781 | } | ||
| 1782 | |||
| 1783 | /* Release buffer element and calculate a pointer to the next one */ | ||
| 1784 | rxbuf->flag = 0x00; | ||
| 1785 | card->rxmb = ++rxbuf; | ||
| 1786 | if ((void*)rxbuf > card->u.p.rxbuf_last) | ||
| 1787 | card->rxmb = card->u.p.rxbuf_base; | ||
| 1788 | } | ||
| 1789 | |||
| 1790 | |||
| 1791 | void event_intr (sdla_t *card) | ||
| 1792 | { | ||
| 1793 | |||
| 1794 | struct net_device* dev = card->wandev.dev; | ||
| 1795 | ppp_private_area_t* ppp_priv_area = dev->priv; | ||
| 1796 | volatile ppp_flags_t *flags = card->flags; | ||
| 1797 | |||
| 1798 | switch (flags->iflag){ | ||
| 1799 | |||
| 1800 | case PPP_INTR_MODEM: /* modem status change (DCD, CTS) 0x04 (bit 2)*/ | ||
| 1801 | |||
| 1802 | if (net_ratelimit()){ | ||
| 1803 | printk (KERN_INFO "%s: Modem status: DCD=%s CTS=%s\n", | ||
| 1804 | card->devname, DCD(flags->mstatus), CTS(flags->mstatus)); | ||
| 1805 | } | ||
| 1806 | break; | ||
| 1807 | |||
| 1808 | case PPP_INTR_DISC: /* Data link disconnected 0x10 (bit 4)*/ | ||
| 1809 | |||
| 1810 | NEX_PRINTK (KERN_INFO "Data link disconnected intr Cause %X\n", | ||
| 1811 | flags->disc_cause); | ||
| 1812 | |||
| 1813 | if (flags->disc_cause & | ||
| 1814 | (PPP_LOCAL_TERMINATION | PPP_DCD_CTS_DROP | | ||
| 1815 | PPP_REMOTE_TERMINATION)) { | ||
| 1816 | |||
| 1817 | if (card->u.p.ip_mode == WANOPT_PPP_PEER) { | ||
| 1818 | set_bit(0,&Read_connection_info); | ||
| 1819 | } | ||
| 1820 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 1821 | |||
| 1822 | show_disc_cause(card, flags->disc_cause); | ||
| 1823 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT; | ||
| 1824 | flags->imask |= PPP_INTR_TIMER; | ||
| 1825 | trigger_ppp_poll(dev); | ||
| 1826 | } | ||
| 1827 | break; | ||
| 1828 | |||
| 1829 | case PPP_INTR_OPEN: /* Data link open 0x20 (bit 5)*/ | ||
| 1830 | |||
| 1831 | NEX_PRINTK (KERN_INFO "%s: PPP Link Open, LCP=%s IP=%s\n", | ||
| 1832 | card->devname,LCP(flags->lcp_state), | ||
| 1833 | IP(flags->ip_state)); | ||
| 1834 | |||
| 1835 | if (flags->lcp_state == 0x09 && | ||
| 1836 | (flags->ip_state == 0x09 || flags->ipx_state == 0x09)){ | ||
| 1837 | |||
| 1838 | /* Initialize the polling timer and set the state | ||
| 1839 | * to WAN_CONNNECTED */ | ||
| 1840 | |||
| 1841 | |||
| 1842 | /* BUG FIX: When the protocol restarts, during heavy | ||
| 1843 | * traffic, board tx buffers and driver tx buffers | ||
| 1844 | * can go out of sync. This checks the condition | ||
| 1845 | * and if the tx buffers are out of sync, the | ||
| 1846 | * protocols are restarted. | ||
| 1847 | * I don't know why the board tx buffer is out | ||
| 1848 | * of sync. It could be that a packets is tx | ||
| 1849 | * while the link is down, but that is not | ||
| 1850 | * possible. The other possiblility is that the | ||
| 1851 | * firmware doesn't reinitialize properly. | ||
| 1852 | * FIXME: A better fix should be found. | ||
| 1853 | */ | ||
| 1854 | if (detect_and_fix_tx_bug(card)){ | ||
| 1855 | |||
| 1856 | ppp_comm_disable(card); | ||
| 1857 | |||
| 1858 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 1859 | |||
| 1860 | ppp_priv_area->timer_int_enabled |= | ||
| 1861 | TMR_INT_ENABLED_PPP_EVENT; | ||
| 1862 | flags->imask |= PPP_INTR_TIMER; | ||
| 1863 | break; | ||
| 1864 | } | ||
| 1865 | |||
| 1866 | card->state_tick = jiffies; | ||
| 1867 | wanpipe_set_state(card, WAN_CONNECTED); | ||
| 1868 | |||
| 1869 | NEX_PRINTK(KERN_INFO "CON: L Tx: %lx B Tx: %lx || L Rx %lx B Rx %lx\n", | ||
| 1870 | (unsigned long)card->u.p.txbuf, *card->u.p.txbuf_next, | ||
| 1871 | (unsigned long)card->rxmb, *card->u.p.rxbuf_next); | ||
| 1872 | |||
| 1873 | /* Tell timer interrupt that PPP event occurred */ | ||
| 1874 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT; | ||
| 1875 | flags->imask |= PPP_INTR_TIMER; | ||
| 1876 | |||
| 1877 | /* If we are in PEER mode, we must first obtain the | ||
| 1878 | * IP information and then go into the poll routine */ | ||
| 1879 | if (card->u.p.ip_mode != WANOPT_PPP_PEER){ | ||
| 1880 | trigger_ppp_poll(dev); | ||
| 1881 | } | ||
| 1882 | } | ||
| 1883 | break; | ||
| 1884 | |||
| 1885 | case PPP_INTR_DROP_DTR: /* DTR drop timeout expired 0x40 bit 6 */ | ||
| 1886 | |||
| 1887 | NEX_PRINTK(KERN_INFO "DTR Drop Timeout Interrrupt \n"); | ||
| 1888 | |||
| 1889 | if (card->u.p.ip_mode == WANOPT_PPP_PEER) { | ||
| 1890 | set_bit(0,&Read_connection_info); | ||
| 1891 | } | ||
| 1892 | |||
| 1893 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 1894 | |||
| 1895 | show_disc_cause(card, flags->disc_cause); | ||
| 1896 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_PPP_EVENT; | ||
| 1897 | flags->imask |= PPP_INTR_TIMER; | ||
| 1898 | trigger_ppp_poll(dev); | ||
| 1899 | break; | ||
| 1900 | |||
| 1901 | default: | ||
| 1902 | printk(KERN_INFO "%s: Error, Invalid PPP Event\n",card->devname); | ||
| 1903 | } | ||
| 1904 | } | ||
| 1905 | |||
| 1906 | |||
| 1907 | |||
| 1908 | /* TIMER INTERRUPT */ | ||
| 1909 | |||
| 1910 | void timer_intr (sdla_t *card) | ||
| 1911 | { | ||
| 1912 | |||
| 1913 | struct net_device* dev = card->wandev.dev; | ||
| 1914 | ppp_private_area_t* ppp_priv_area = dev->priv; | ||
| 1915 | ppp_flags_t *flags = card->flags; | ||
| 1916 | |||
| 1917 | |||
| 1918 | if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG){ | ||
| 1919 | if (!config_ppp(card)){ | ||
| 1920 | ppp_priv_area->timer_int_enabled &= | ||
| 1921 | ~TMR_INT_ENABLED_CONFIG; | ||
| 1922 | } | ||
| 1923 | } | ||
| 1924 | |||
| 1925 | /* Update statistics */ | ||
| 1926 | if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE){ | ||
| 1927 | ppp_get_err_stats(card); | ||
| 1928 | if(!(--ppp_priv_area->update_comms_stats)){ | ||
| 1929 | ppp_priv_area->timer_int_enabled &= | ||
| 1930 | ~TMR_INT_ENABLED_UPDATE; | ||
| 1931 | } | ||
| 1932 | } | ||
| 1933 | |||
| 1934 | /* PPIPEMON UDP request */ | ||
| 1935 | |||
| 1936 | if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP){ | ||
| 1937 | process_udp_mgmt_pkt(card,dev, ppp_priv_area); | ||
| 1938 | ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP; | ||
| 1939 | } | ||
| 1940 | |||
| 1941 | /* PPP Event */ | ||
| 1942 | if (ppp_priv_area->timer_int_enabled & TMR_INT_ENABLED_PPP_EVENT){ | ||
| 1943 | |||
| 1944 | if (card->wandev.state == WAN_DISCONNECTED){ | ||
| 1945 | retrigger_comm(card); | ||
| 1946 | } | ||
| 1947 | |||
| 1948 | /* If the state is CONNECTING, it means that communicatins were | ||
| 1949 | * enabled. When the remote side enables its comminication we | ||
| 1950 | * should get an interrupt PPP_INTR_OPEN, thus turn off polling | ||
| 1951 | */ | ||
| 1952 | |||
| 1953 | else if (card->wandev.state == WAN_CONNECTING){ | ||
| 1954 | /* Turn off the timer interrupt */ | ||
| 1955 | ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_PPP_EVENT; | ||
| 1956 | } | ||
| 1957 | |||
| 1958 | /* If state is connected and we are in PEER mode | ||
| 1959 | * poll for an IP address which will be provided by remote end. | ||
| 1960 | */ | ||
| 1961 | else if ((card->wandev.state == WAN_CONNECTED && | ||
| 1962 | card->u.p.ip_mode == WANOPT_PPP_PEER) && | ||
| 1963 | test_bit(0,&Read_connection_info)){ | ||
| 1964 | |||
| 1965 | card->state_tick = jiffies; | ||
| 1966 | if (read_connection_info (card)){ | ||
| 1967 | printk(KERN_INFO "%s: Failed to read PEER IP Addresses\n", | ||
| 1968 | card->devname); | ||
| 1969 | }else{ | ||
| 1970 | clear_bit(0,&Read_connection_info); | ||
| 1971 | set_bit(1,&Read_connection_info); | ||
| 1972 | trigger_ppp_poll(dev); | ||
| 1973 | } | ||
| 1974 | }else{ | ||
| 1975 | //FIXME Put the comment back int | ||
| 1976 | ppp_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_PPP_EVENT; | ||
| 1977 | } | ||
| 1978 | |||
| 1979 | }/* End of PPP_EVENT */ | ||
| 1980 | |||
| 1981 | |||
| 1982 | /* Only disable the timer interrupt if there are no udp, statistic */ | ||
| 1983 | /* updates or events pending */ | ||
| 1984 | if(!ppp_priv_area->timer_int_enabled) { | ||
| 1985 | flags->imask &= ~PPP_INTR_TIMER; | ||
| 1986 | } | ||
| 1987 | } | ||
| 1988 | |||
| 1989 | |||
| 1990 | static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_IPX, unsigned long network_number, unsigned short proto) | ||
| 1991 | { | ||
| 1992 | int i; | ||
| 1993 | |||
| 1994 | if( proto == htons(ETH_P_IPX) ) { | ||
| 1995 | //It's an IPX packet | ||
| 1996 | if(!enable_IPX) { | ||
| 1997 | //Return 1 so we don't pass it up the stack. | ||
| 1998 | return 1; | ||
| 1999 | } | ||
| 2000 | } else { | ||
| 2001 | //It's not IPX so pass it up the stack. | ||
| 2002 | return 0; | ||
| 2003 | } | ||
| 2004 | |||
| 2005 | if( sendpacket[16] == 0x90 && | ||
| 2006 | sendpacket[17] == 0x04) | ||
| 2007 | { | ||
| 2008 | //It's IPXWAN | ||
| 2009 | |||
| 2010 | if( sendpacket[2] == 0x02 && | ||
| 2011 | sendpacket[34] == 0x00) | ||
| 2012 | { | ||
| 2013 | //It's a timer request packet | ||
| 2014 | printk(KERN_INFO "%s: Received IPXWAN Timer Request packet\n",devname); | ||
| 2015 | |||
| 2016 | //Go through the routing options and answer no to every | ||
| 2017 | //option except Unnumbered RIP/SAP | ||
| 2018 | for(i = 41; sendpacket[i] == 0x00; i += 5) | ||
| 2019 | { | ||
| 2020 | //0x02 is the option for Unnumbered RIP/SAP | ||
| 2021 | if( sendpacket[i + 4] != 0x02) | ||
| 2022 | { | ||
| 2023 | sendpacket[i + 1] = 0; | ||
| 2024 | } | ||
| 2025 | } | ||
| 2026 | |||
| 2027 | //Skip over the extended Node ID option | ||
| 2028 | if( sendpacket[i] == 0x04 ) | ||
| 2029 | { | ||
| 2030 | i += 8; | ||
| 2031 | } | ||
| 2032 | |||
| 2033 | //We also want to turn off all header compression opt. | ||
| 2034 | for(; sendpacket[i] == 0x80 ;) | ||
| 2035 | { | ||
| 2036 | sendpacket[i + 1] = 0; | ||
| 2037 | i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4; | ||
| 2038 | } | ||
| 2039 | |||
| 2040 | //Set the packet type to timer response | ||
| 2041 | sendpacket[34] = 0x01; | ||
| 2042 | |||
| 2043 | printk(KERN_INFO "%s: Sending IPXWAN Timer Response\n",devname); | ||
| 2044 | } | ||
| 2045 | else if( sendpacket[34] == 0x02 ) | ||
| 2046 | { | ||
| 2047 | //This is an information request packet | ||
| 2048 | printk(KERN_INFO "%s: Received IPXWAN Information Request packet\n",devname); | ||
| 2049 | |||
| 2050 | //Set the packet type to information response | ||
| 2051 | sendpacket[34] = 0x03; | ||
| 2052 | |||
| 2053 | //Set the router name | ||
| 2054 | sendpacket[51] = 'P'; | ||
| 2055 | sendpacket[52] = 'T'; | ||
| 2056 | sendpacket[53] = 'P'; | ||
| 2057 | sendpacket[54] = 'I'; | ||
| 2058 | sendpacket[55] = 'P'; | ||
| 2059 | sendpacket[56] = 'E'; | ||
| 2060 | sendpacket[57] = '-'; | ||
| 2061 | sendpacket[58] = CVHexToAscii(network_number >> 28); | ||
| 2062 | sendpacket[59] = CVHexToAscii((network_number & 0x0F000000)>> 24); | ||
| 2063 | sendpacket[60] = CVHexToAscii((network_number & 0x00F00000)>> 20); | ||
| 2064 | sendpacket[61] = CVHexToAscii((network_number & 0x000F0000)>> 16); | ||
| 2065 | sendpacket[62] = CVHexToAscii((network_number & 0x0000F000)>> 12); | ||
| 2066 | sendpacket[63] = CVHexToAscii((network_number & 0x00000F00)>> 8); | ||
| 2067 | sendpacket[64] = CVHexToAscii((network_number & 0x000000F0)>> 4); | ||
| 2068 | sendpacket[65] = CVHexToAscii(network_number & 0x0000000F); | ||
| 2069 | for(i = 66; i < 99; i+= 1) | ||
| 2070 | { | ||
| 2071 | sendpacket[i] = 0; | ||
| 2072 | } | ||
| 2073 | |||
| 2074 | printk(KERN_INFO "%s: Sending IPXWAN Information Response packet\n",devname); | ||
| 2075 | } | ||
| 2076 | else | ||
| 2077 | { | ||
| 2078 | printk(KERN_INFO "%s: Unknown IPXWAN packet!\n",devname); | ||
| 2079 | return 0; | ||
| 2080 | } | ||
| 2081 | |||
| 2082 | //Set the WNodeID to our network address | ||
| 2083 | sendpacket[35] = (unsigned char)(network_number >> 24); | ||
| 2084 | sendpacket[36] = (unsigned char)((network_number & 0x00FF0000) >> 16); | ||
| 2085 | sendpacket[37] = (unsigned char)((network_number & 0x0000FF00) >> 8); | ||
| 2086 | sendpacket[38] = (unsigned char)(network_number & 0x000000FF); | ||
| 2087 | |||
| 2088 | return 1; | ||
| 2089 | } else { | ||
| 2090 | //If we get here it's an IPX-data packet, so it'll get passed up the stack. | ||
| 2091 | |||
| 2092 | //switch the network numbers | ||
| 2093 | switch_net_numbers(sendpacket, network_number, 1); | ||
| 2094 | return 0; | ||
| 2095 | } | ||
| 2096 | } | ||
| 2097 | |||
| 2098 | /****** Background Polling Routines ****************************************/ | ||
| 2099 | |||
| 2100 | /* All polling functions are invoked by the TIMER interrupt in the wpp_isr | ||
| 2101 | * routine. | ||
| 2102 | */ | ||
| 2103 | |||
| 2104 | /*============================================================================ | ||
| 2105 | * Monitor active link phase. | ||
| 2106 | */ | ||
| 2107 | static void process_route (sdla_t *card) | ||
| 2108 | { | ||
| 2109 | ppp_flags_t *flags = card->flags; | ||
| 2110 | struct net_device *dev = card->wandev.dev; | ||
| 2111 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 2112 | |||
| 2113 | if ((card->u.p.ip_mode == WANOPT_PPP_PEER) && | ||
| 2114 | (flags->ip_state == 0x09)){ | ||
| 2115 | |||
| 2116 | /* We get ip_local from the firmware in PEER mode. | ||
| 2117 | * Therefore, if ip_local is 0, we failed to obtain | ||
| 2118 | * the remote IP address. */ | ||
| 2119 | if (ppp_priv_area->ip_local == 0) | ||
| 2120 | return; | ||
| 2121 | |||
| 2122 | printk(KERN_INFO "%s: IPCP State Opened.\n", card->devname); | ||
| 2123 | if (read_info( card )) { | ||
| 2124 | printk(KERN_INFO | ||
| 2125 | "%s: An error occurred in IP assignment.\n", | ||
| 2126 | card->devname); | ||
| 2127 | } else { | ||
| 2128 | struct in_device *in_dev = dev->ip_ptr; | ||
| 2129 | if (in_dev != NULL ) { | ||
| 2130 | struct in_ifaddr *ifa = in_dev->ifa_list; | ||
| 2131 | |||
| 2132 | printk(KERN_INFO "%s: Assigned Lcl. Addr: %u.%u.%u.%u\n", | ||
| 2133 | card->devname, NIPQUAD(ifa->ifa_local)); | ||
| 2134 | printk(KERN_INFO "%s: Assigned Rmt. Addr: %u.%u.%u.%u\n", | ||
| 2135 | card->devname, NIPQUAD(ifa->ifa_address)); | ||
| 2136 | }else{ | ||
| 2137 | printk(KERN_INFO | ||
| 2138 | "%s: Error: Failed to add a route for PPP interface %s\n", | ||
| 2139 | card->devname,dev->name); | ||
| 2140 | } | ||
| 2141 | } | ||
| 2142 | } | ||
| 2143 | } | ||
| 2144 | |||
| 2145 | /*============================================================================ | ||
| 2146 | * Monitor physical link disconnected phase. | ||
| 2147 | * o if interface is up and the hold-down timeout has expired, then retry | ||
| 2148 | * connection. | ||
| 2149 | */ | ||
| 2150 | static void retrigger_comm(sdla_t *card) | ||
| 2151 | { | ||
| 2152 | struct net_device *dev = card->wandev.dev; | ||
| 2153 | |||
| 2154 | if (dev && ((jiffies - card->state_tick) > HOLD_DOWN_TIME)) { | ||
| 2155 | |||
| 2156 | wanpipe_set_state(card, WAN_CONNECTING); | ||
| 2157 | |||
| 2158 | if(ppp_comm_enable(card) == CMD_OK){ | ||
| 2159 | init_ppp_tx_rx_buff( card ); | ||
| 2160 | } | ||
| 2161 | } | ||
| 2162 | } | ||
| 2163 | |||
| 2164 | /****** Miscellaneous Functions *********************************************/ | ||
| 2165 | |||
| 2166 | /*============================================================================ | ||
| 2167 | * Configure S508 adapter. | ||
| 2168 | */ | ||
| 2169 | static int config508(struct net_device *dev, sdla_t *card) | ||
| 2170 | { | ||
| 2171 | ppp508_conf_t cfg; | ||
| 2172 | struct in_device *in_dev = dev->ip_ptr; | ||
| 2173 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 2174 | |||
| 2175 | /* Prepare PPP configuration structure */ | ||
| 2176 | memset(&cfg, 0, sizeof(ppp508_conf_t)); | ||
| 2177 | |||
| 2178 | if (card->wandev.clocking) | ||
| 2179 | cfg.line_speed = card->wandev.bps; | ||
| 2180 | |||
| 2181 | if (card->wandev.interface == WANOPT_RS232) | ||
| 2182 | cfg.conf_flags |= INTERFACE_LEVEL_RS232; | ||
| 2183 | |||
| 2184 | |||
| 2185 | cfg.conf_flags |= DONT_TERMINATE_LNK_MAX_CONFIG; /*send Configure-Request packets forever*/ | ||
| 2186 | cfg.txbuf_percent = PERCENT_TX_BUFF; /* % of Tx bufs */ | ||
| 2187 | cfg.mtu_local = card->wandev.mtu; | ||
| 2188 | cfg.mtu_remote = card->wandev.mtu; /* Default */ | ||
| 2189 | cfg.restart_tmr = TIME_BETWEEN_CONF_REQ; /* 30 = 3sec */ | ||
| 2190 | cfg.auth_rsrt_tmr = TIME_BETWEEN_PAP_CHAP_REQ; /* 30 = 3sec */ | ||
| 2191 | cfg.auth_wait_tmr = WAIT_PAP_CHAP_WITHOUT_REPLY; /* 300 = 30s */ | ||
| 2192 | cfg.mdm_fail_tmr = WAIT_AFTER_DCD_CTS_LOW; /* 5 = 0.5s */ | ||
| 2193 | cfg.dtr_drop_tmr = TIME_DCD_CTS_LOW_AFTER_LNK_DOWN; /* 10 = 1s */ | ||
| 2194 | cfg.connect_tmout = WAIT_DCD_HIGH_AFTER_ENABLE_COMM; /* 900 = 90s */ | ||
| 2195 | cfg.conf_retry = MAX_CONF_REQ_WITHOUT_REPLY; /* 10 = 1s */ | ||
| 2196 | cfg.term_retry = MAX_TERM_REQ_WITHOUT_REPLY; /* 2 times */ | ||
| 2197 | cfg.fail_retry = NUM_CONF_NAK_WITHOUT_REPLY; /* 5 times */ | ||
| 2198 | cfg.auth_retry = NUM_AUTH_REQ_WITHOUT_REPLY; /* 10 times */ | ||
| 2199 | |||
| 2200 | |||
| 2201 | if( !card->u.p.authenticator ) { | ||
| 2202 | printk(KERN_INFO "%s: Device is not configured as an authenticator\n", | ||
| 2203 | card->devname); | ||
| 2204 | cfg.auth_options = NO_AUTHENTICATION; | ||
| 2205 | }else{ | ||
| 2206 | printk(KERN_INFO "%s: Device is configured as an authenticator\n", | ||
| 2207 | card->devname); | ||
| 2208 | cfg.auth_options = INBOUND_AUTH; | ||
| 2209 | } | ||
| 2210 | |||
| 2211 | if( ppp_priv_area->pap == WANOPT_YES){ | ||
| 2212 | cfg.auth_options |=PAP_AUTH; | ||
| 2213 | printk(KERN_INFO "%s: Pap enabled\n", card->devname); | ||
| 2214 | } | ||
| 2215 | if( ppp_priv_area->chap == WANOPT_YES){ | ||
| 2216 | cfg.auth_options |= CHAP_AUTH; | ||
| 2217 | printk(KERN_INFO "%s: Chap enabled\n", card->devname); | ||
| 2218 | } | ||
| 2219 | |||
| 2220 | |||
| 2221 | if (ppp_priv_area->enable_IPX == WANOPT_YES){ | ||
| 2222 | printk(KERN_INFO "%s: Enabling IPX Protocol\n",card->devname); | ||
| 2223 | cfg.ipx_options = ENABLE_IPX | ROUTING_PROT_DEFAULT; | ||
| 2224 | }else{ | ||
| 2225 | cfg.ipx_options = DISABLE_IPX; | ||
| 2226 | } | ||
| 2227 | |||
| 2228 | switch (card->u.p.ip_mode) { | ||
| 2229 | |||
| 2230 | case WANOPT_PPP_STATIC: | ||
| 2231 | |||
| 2232 | printk(KERN_INFO "%s: PPP IP Mode: STATIC\n",card->devname); | ||
| 2233 | cfg.ip_options = L_AND_R_IP_NO_ASSIG | | ||
| 2234 | ENABLE_IP; | ||
| 2235 | cfg.ip_local = in_dev->ifa_list->ifa_local; | ||
| 2236 | cfg.ip_remote = in_dev->ifa_list->ifa_address; | ||
| 2237 | /* Debugging code used to check that IP addresses | ||
| 2238 | * obtained from the kernel are correct */ | ||
| 2239 | |||
| 2240 | NEX_PRINTK(KERN_INFO "Local %u.%u.%u.%u Remote %u.%u.%u.%u Name %s\n", | ||
| 2241 | NIPQUAD(ip_local),NIPQUAD(ip_remote), dev->name); | ||
| 2242 | break; | ||
| 2243 | |||
| 2244 | case WANOPT_PPP_HOST: | ||
| 2245 | |||
| 2246 | printk(KERN_INFO "%s: PPP IP Mode: HOST\n",card->devname); | ||
| 2247 | cfg.ip_options = L_IP_LOCAL_ASSIG | | ||
| 2248 | R_IP_LOCAL_ASSIG | | ||
| 2249 | ENABLE_IP; | ||
| 2250 | cfg.ip_local = in_dev->ifa_list->ifa_local; | ||
| 2251 | cfg.ip_remote = in_dev->ifa_list->ifa_address; | ||
| 2252 | /* Debugging code used to check that IP addresses | ||
| 2253 | * obtained from the kernel are correct */ | ||
| 2254 | NEX_PRINTK (KERN_INFO "Local %u.%u.%u.%u Remote %u.%u.%u.%u Name %s\n", | ||
| 2255 | NIPQUAD(ip_local),NIPQUAD(ip_remote), dev->name); | ||
| 2256 | |||
| 2257 | break; | ||
| 2258 | |||
| 2259 | case WANOPT_PPP_PEER: | ||
| 2260 | |||
| 2261 | printk(KERN_INFO "%s: PPP IP Mode: PEER\n",card->devname); | ||
| 2262 | cfg.ip_options = L_IP_REMOTE_ASSIG | | ||
| 2263 | R_IP_REMOTE_ASSIG | | ||
| 2264 | ENABLE_IP; | ||
| 2265 | cfg.ip_local = 0x00; | ||
| 2266 | cfg.ip_remote = 0x00; | ||
| 2267 | break; | ||
| 2268 | |||
| 2269 | default: | ||
| 2270 | printk(KERN_INFO "%s: ERROR: Unsupported PPP Mode Selected\n", | ||
| 2271 | card->devname); | ||
| 2272 | printk(KERN_INFO "%s: PPP IP Modes: STATIC, PEER or HOST\n", | ||
| 2273 | card->devname); | ||
| 2274 | return 1; | ||
| 2275 | } | ||
| 2276 | |||
| 2277 | return ppp_configure(card, &cfg); | ||
| 2278 | } | ||
| 2279 | |||
| 2280 | /*============================================================================ | ||
| 2281 | * Show disconnection cause. | ||
| 2282 | */ | ||
| 2283 | static void show_disc_cause(sdla_t *card, unsigned cause) | ||
| 2284 | { | ||
| 2285 | if (cause & 0x0802) | ||
| 2286 | |||
| 2287 | printk(KERN_INFO "%s: link terminated by peer\n", | ||
| 2288 | card->devname); | ||
| 2289 | |||
| 2290 | else if (cause & 0x0004) | ||
| 2291 | |||
| 2292 | printk(KERN_INFO "%s: link terminated by user\n", | ||
| 2293 | card->devname); | ||
| 2294 | |||
| 2295 | else if (cause & 0x0008) | ||
| 2296 | |||
| 2297 | printk(KERN_INFO "%s: authentication failed\n", card->devname); | ||
| 2298 | |||
| 2299 | else if (cause & 0x0010) | ||
| 2300 | |||
| 2301 | printk(KERN_INFO | ||
| 2302 | "%s: authentication protocol negotiation failed\n", | ||
| 2303 | card->devname); | ||
| 2304 | |||
| 2305 | else if (cause & 0x0020) | ||
| 2306 | |||
| 2307 | printk(KERN_INFO | ||
| 2308 | "%s: peer's request for authentication rejected\n", | ||
| 2309 | card->devname); | ||
| 2310 | |||
| 2311 | else if (cause & 0x0040) | ||
| 2312 | |||
| 2313 | printk(KERN_INFO "%s: MRU option rejected by peer\n", | ||
| 2314 | card->devname); | ||
| 2315 | |||
| 2316 | else if (cause & 0x0080) | ||
| 2317 | |||
| 2318 | printk(KERN_INFO "%s: peer's MRU was too small\n", | ||
| 2319 | card->devname); | ||
| 2320 | |||
| 2321 | else if (cause & 0x0100) | ||
| 2322 | |||
| 2323 | printk(KERN_INFO "%s: failed to negotiate peer's LCP options\n", | ||
| 2324 | card->devname); | ||
| 2325 | |||
| 2326 | else if (cause & 0x0200) | ||
| 2327 | |||
| 2328 | printk(KERN_INFO "%s: failed to negotiate peer's IPCP options\n" | ||
| 2329 | , card->devname); | ||
| 2330 | |||
| 2331 | else if (cause & 0x0400) | ||
| 2332 | |||
| 2333 | printk(KERN_INFO | ||
| 2334 | "%s: failed to negotiate peer's IPXCP options\n", | ||
| 2335 | card->devname); | ||
| 2336 | } | ||
| 2337 | |||
| 2338 | /*============================================================================= | ||
| 2339 | * Process UDP call of type PTPIPEAB. | ||
| 2340 | */ | ||
| 2341 | static void process_udp_mgmt_pkt(sdla_t *card, struct net_device *dev, | ||
| 2342 | ppp_private_area_t *ppp_priv_area ) | ||
| 2343 | { | ||
| 2344 | unsigned char buf2[5]; | ||
| 2345 | unsigned char *buf; | ||
| 2346 | unsigned int frames, len; | ||
| 2347 | struct sk_buff *new_skb; | ||
| 2348 | unsigned short data_length, buffer_length, real_len; | ||
| 2349 | unsigned long data_ptr; | ||
| 2350 | int udp_mgmt_req_valid = 1; | ||
| 2351 | ppp_mbox_t *mbox = card->mbox; | ||
| 2352 | struct timeval tv; | ||
| 2353 | int err; | ||
| 2354 | ppp_udp_pkt_t *ppp_udp_pkt = (ppp_udp_pkt_t*)&ppp_priv_area->udp_pkt_data; | ||
| 2355 | |||
| 2356 | memcpy(&buf2, &card->wandev.udp_port, 2 ); | ||
| 2357 | |||
| 2358 | |||
| 2359 | if(ppp_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 2360 | |||
| 2361 | switch(ppp_udp_pkt->cblock.command) { | ||
| 2362 | |||
| 2363 | case PPIPE_GET_IBA_DATA: | ||
| 2364 | case PPP_READ_CONFIG: | ||
| 2365 | case PPP_GET_CONNECTION_INFO: | ||
| 2366 | case PPIPE_ROUTER_UP_TIME: | ||
| 2367 | case PPP_READ_STATISTICS: | ||
| 2368 | case PPP_READ_ERROR_STATS: | ||
| 2369 | case PPP_READ_PACKET_STATS: | ||
| 2370 | case PPP_READ_LCP_STATS: | ||
| 2371 | case PPP_READ_IPCP_STATS: | ||
| 2372 | case PPP_READ_IPXCP_STATS: | ||
| 2373 | case PPP_READ_PAP_STATS: | ||
| 2374 | case PPP_READ_CHAP_STATS: | ||
| 2375 | case PPP_READ_CODE_VERSION: | ||
| 2376 | udp_mgmt_req_valid = 1; | ||
| 2377 | break; | ||
| 2378 | |||
| 2379 | default: | ||
| 2380 | udp_mgmt_req_valid = 0; | ||
| 2381 | break; | ||
| 2382 | } | ||
| 2383 | } | ||
| 2384 | |||
| 2385 | if(!udp_mgmt_req_valid) { | ||
| 2386 | |||
| 2387 | /* set length to 0 */ | ||
| 2388 | ppp_udp_pkt->cblock.length = 0x00; | ||
| 2389 | |||
| 2390 | /* set return code */ | ||
| 2391 | ppp_udp_pkt->cblock.result = 0xCD; | ||
| 2392 | ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_direction_err; | ||
| 2393 | |||
| 2394 | if (net_ratelimit()){ | ||
| 2395 | printk(KERN_INFO | ||
| 2396 | "%s: Warning, Illegal UDP command attempted from network: %x\n", | ||
| 2397 | card->devname,ppp_udp_pkt->cblock.command); | ||
| 2398 | } | ||
| 2399 | } else { | ||
| 2400 | /* Initialize the trace element */ | ||
| 2401 | trace_element_t trace_element; | ||
| 2402 | |||
| 2403 | switch (ppp_udp_pkt->cblock.command){ | ||
| 2404 | |||
| 2405 | /* PPIPE_ENABLE_TRACING */ | ||
| 2406 | case PPIPE_ENABLE_TRACING: | ||
| 2407 | if (!card->TracingEnabled) { | ||
| 2408 | |||
| 2409 | /* OPERATE_DATALINE_MONITOR */ | ||
| 2410 | mbox->cmd.command = PPP_DATALINE_MONITOR; | ||
| 2411 | mbox->cmd.length = 0x01; | ||
| 2412 | mbox->data[0] = ppp_udp_pkt->data[0]; | ||
| 2413 | err = sdla_exec(mbox) ? | ||
| 2414 | mbox->cmd.result : CMD_TIMEOUT; | ||
| 2415 | |||
| 2416 | if (err != CMD_OK) { | ||
| 2417 | |||
| 2418 | ppp_error(card, err, mbox); | ||
| 2419 | card->TracingEnabled = 0; | ||
| 2420 | |||
| 2421 | /* set the return code */ | ||
| 2422 | |||
| 2423 | ppp_udp_pkt->cblock.result = mbox->cmd.result; | ||
| 2424 | mbox->cmd.length = 0; | ||
| 2425 | break; | ||
| 2426 | } | ||
| 2427 | |||
| 2428 | sdla_peek(&card->hw, 0xC000, &buf2, 2); | ||
| 2429 | |||
| 2430 | ppp_priv_area->curr_trace_addr = 0; | ||
| 2431 | memcpy(&ppp_priv_area->curr_trace_addr, &buf2, 2); | ||
| 2432 | ppp_priv_area->start_trace_addr = | ||
| 2433 | ppp_priv_area->curr_trace_addr; | ||
| 2434 | ppp_priv_area->end_trace_addr = | ||
| 2435 | ppp_priv_area->start_trace_addr + END_OFFSET; | ||
| 2436 | |||
| 2437 | /* MAX_SEND_BUFFER_SIZE - 28 (IP header) | ||
| 2438 | - 32 (ppipemon CBLOCK) */ | ||
| 2439 | available_buffer_space = MAX_LGTH_UDP_MGNT_PKT - | ||
| 2440 | sizeof(ip_pkt_t)- | ||
| 2441 | sizeof(udp_pkt_t)- | ||
| 2442 | sizeof(wp_mgmt_t)- | ||
| 2443 | sizeof(cblock_t); | ||
| 2444 | } | ||
| 2445 | ppp_udp_pkt->cblock.result = 0; | ||
| 2446 | mbox->cmd.length = 0; | ||
| 2447 | card->TracingEnabled = 1; | ||
| 2448 | break; | ||
| 2449 | |||
| 2450 | /* PPIPE_DISABLE_TRACING */ | ||
| 2451 | case PPIPE_DISABLE_TRACING: | ||
| 2452 | |||
| 2453 | if(card->TracingEnabled) { | ||
| 2454 | |||
| 2455 | /* OPERATE_DATALINE_MONITOR */ | ||
| 2456 | mbox->cmd.command = 0x33; | ||
| 2457 | mbox->cmd.length = 1; | ||
| 2458 | mbox->data[0] = 0x00; | ||
| 2459 | err = sdla_exec(mbox) ? | ||
| 2460 | mbox->cmd.result : CMD_TIMEOUT; | ||
| 2461 | |||
| 2462 | } | ||
| 2463 | |||
| 2464 | /*set return code*/ | ||
| 2465 | ppp_udp_pkt->cblock.result = 0; | ||
| 2466 | mbox->cmd.length = 0; | ||
| 2467 | card->TracingEnabled = 0; | ||
| 2468 | break; | ||
| 2469 | |||
| 2470 | /* PPIPE_GET_TRACE_INFO */ | ||
| 2471 | case PPIPE_GET_TRACE_INFO: | ||
| 2472 | |||
| 2473 | if(!card->TracingEnabled) { | ||
| 2474 | /* set return code */ | ||
| 2475 | ppp_udp_pkt->cblock.result = 1; | ||
| 2476 | mbox->cmd.length = 0; | ||
| 2477 | } | ||
| 2478 | |||
| 2479 | buffer_length = 0; | ||
| 2480 | |||
| 2481 | /* frames < 62, where 62 is the number of trace | ||
| 2482 | information elements. There is in total 496 | ||
| 2483 | bytes of space and each trace information | ||
| 2484 | element is 8 bytes. | ||
| 2485 | */ | ||
| 2486 | for ( frames=0; frames<62; frames++) { | ||
| 2487 | |||
| 2488 | trace_pkt_t *trace_pkt = (trace_pkt_t *) | ||
| 2489 | &ppp_udp_pkt->data[buffer_length]; | ||
| 2490 | |||
| 2491 | /* Read the whole trace packet */ | ||
| 2492 | sdla_peek(&card->hw, ppp_priv_area->curr_trace_addr, | ||
| 2493 | &trace_element, sizeof(trace_element_t)); | ||
| 2494 | |||
| 2495 | /* no data on board so exit */ | ||
| 2496 | if( trace_element.opp_flag == 0x00 ) | ||
| 2497 | break; | ||
| 2498 | |||
| 2499 | data_ptr = trace_element.trace_data_ptr; | ||
| 2500 | |||
| 2501 | /* See if there is actual data on the trace buffer */ | ||
| 2502 | if (data_ptr){ | ||
| 2503 | data_length = trace_element.trace_length; | ||
| 2504 | }else{ | ||
| 2505 | data_length = 0; | ||
| 2506 | ppp_udp_pkt->data[0] |= 0x02; | ||
| 2507 | } | ||
| 2508 | |||
| 2509 | //FIXME: Do we need this check | ||
| 2510 | if ((available_buffer_space - buffer_length) | ||
| 2511 | < (sizeof(trace_element_t)+1)){ | ||
| 2512 | |||
| 2513 | /*indicate we have more frames | ||
| 2514 | * on board and exit | ||
| 2515 | */ | ||
| 2516 | ppp_udp_pkt->data[0] |= 0x02; | ||
| 2517 | break; | ||
| 2518 | } | ||
| 2519 | |||
| 2520 | trace_pkt->status = trace_element.trace_type; | ||
| 2521 | trace_pkt->time_stamp = trace_element.trace_time_stamp; | ||
| 2522 | trace_pkt->real_length = trace_element.trace_length; | ||
| 2523 | |||
| 2524 | real_len = trace_element.trace_length; | ||
| 2525 | |||
| 2526 | if(data_ptr == 0){ | ||
| 2527 | trace_pkt->data_avail = 0x00; | ||
| 2528 | }else{ | ||
| 2529 | /* we can take it next time */ | ||
| 2530 | if ((available_buffer_space - buffer_length)< | ||
| 2531 | (real_len + sizeof(trace_pkt_t))){ | ||
| 2532 | |||
| 2533 | ppp_udp_pkt->data[0] |= 0x02; | ||
| 2534 | break; | ||
| 2535 | } | ||
| 2536 | trace_pkt->data_avail = 0x01; | ||
| 2537 | |||
| 2538 | /* get the data */ | ||
| 2539 | sdla_peek(&card->hw, data_ptr, | ||
| 2540 | &trace_pkt->data, | ||
| 2541 | real_len); | ||
| 2542 | } | ||
| 2543 | /* zero the opp flag to | ||
| 2544 | show we got the frame */ | ||
| 2545 | buf2[0] = 0x00; | ||
| 2546 | sdla_poke(&card->hw, ppp_priv_area->curr_trace_addr, | ||
| 2547 | &buf2, 1); | ||
| 2548 | |||
| 2549 | /* now move onto the next | ||
| 2550 | frame */ | ||
| 2551 | ppp_priv_area->curr_trace_addr += 8; | ||
| 2552 | |||
| 2553 | /* check if we passed the last address */ | ||
| 2554 | if ( ppp_priv_area->curr_trace_addr >= | ||
| 2555 | ppp_priv_area->end_trace_addr){ | ||
| 2556 | |||
| 2557 | ppp_priv_area->curr_trace_addr = | ||
| 2558 | ppp_priv_area->start_trace_addr; | ||
| 2559 | } | ||
| 2560 | |||
| 2561 | /* update buffer length and make sure its even */ | ||
| 2562 | |||
| 2563 | if ( trace_pkt->data_avail == 0x01 ) { | ||
| 2564 | buffer_length += real_len - 1; | ||
| 2565 | } | ||
| 2566 | |||
| 2567 | /* for the header */ | ||
| 2568 | buffer_length += 8; | ||
| 2569 | |||
| 2570 | if( buffer_length & 0x0001 ) | ||
| 2571 | buffer_length += 1; | ||
| 2572 | } | ||
| 2573 | |||
| 2574 | /* ok now set the total number of frames passed | ||
| 2575 | in the high 5 bits */ | ||
| 2576 | ppp_udp_pkt->data[0] |= (frames << 2); | ||
| 2577 | |||
| 2578 | /* set the data length */ | ||
| 2579 | mbox->cmd.length = buffer_length; | ||
| 2580 | ppp_udp_pkt->cblock.length = buffer_length; | ||
| 2581 | |||
| 2582 | /* set return code */ | ||
| 2583 | ppp_udp_pkt->cblock.result = 0; | ||
| 2584 | break; | ||
| 2585 | |||
| 2586 | /* PPIPE_GET_IBA_DATA */ | ||
| 2587 | case PPIPE_GET_IBA_DATA: | ||
| 2588 | |||
| 2589 | mbox->cmd.length = 0x09; | ||
| 2590 | |||
| 2591 | sdla_peek(&card->hw, 0xF003, &ppp_udp_pkt->data, | ||
| 2592 | mbox->cmd.length); | ||
| 2593 | |||
| 2594 | /* set the length of the data */ | ||
| 2595 | ppp_udp_pkt->cblock.length = 0x09; | ||
| 2596 | |||
| 2597 | /* set return code */ | ||
| 2598 | ppp_udp_pkt->cblock.result = 0x00; | ||
| 2599 | ppp_udp_pkt->cblock.result = 0; | ||
| 2600 | break; | ||
| 2601 | |||
| 2602 | /* PPIPE_FT1_READ_STATUS */ | ||
| 2603 | case PPIPE_FT1_READ_STATUS: | ||
| 2604 | sdla_peek(&card->hw, 0xF020, &ppp_udp_pkt->data[0], 2); | ||
| 2605 | ppp_udp_pkt->cblock.length = mbox->cmd.length = 2; | ||
| 2606 | ppp_udp_pkt->cblock.result = 0; | ||
| 2607 | break; | ||
| 2608 | |||
| 2609 | case PPIPE_FLUSH_DRIVER_STATS: | ||
| 2610 | init_ppp_priv_struct( ppp_priv_area ); | ||
| 2611 | init_global_statistics( card ); | ||
| 2612 | mbox->cmd.length = 0; | ||
| 2613 | ppp_udp_pkt->cblock.result = 0; | ||
| 2614 | break; | ||
| 2615 | |||
| 2616 | |||
| 2617 | case PPIPE_ROUTER_UP_TIME: | ||
| 2618 | |||
| 2619 | do_gettimeofday( &tv ); | ||
| 2620 | ppp_priv_area->router_up_time = tv.tv_sec - | ||
| 2621 | ppp_priv_area->router_start_time; | ||
| 2622 | *(unsigned long *)&ppp_udp_pkt->data = ppp_priv_area->router_up_time; | ||
| 2623 | mbox->cmd.length = 4; | ||
| 2624 | ppp_udp_pkt->cblock.result = 0; | ||
| 2625 | break; | ||
| 2626 | |||
| 2627 | /* PPIPE_DRIVER_STATISTICS */ | ||
| 2628 | case PPIPE_DRIVER_STAT_IFSEND: | ||
| 2629 | memcpy(&ppp_udp_pkt->data, &ppp_priv_area->if_send_stat, | ||
| 2630 | sizeof(if_send_stat_t)); | ||
| 2631 | |||
| 2632 | |||
| 2633 | ppp_udp_pkt->cblock.result = 0; | ||
| 2634 | ppp_udp_pkt->cblock.length = sizeof(if_send_stat_t); | ||
| 2635 | mbox->cmd.length = sizeof(if_send_stat_t); | ||
| 2636 | break; | ||
| 2637 | |||
| 2638 | case PPIPE_DRIVER_STAT_INTR: | ||
| 2639 | memcpy(&ppp_udp_pkt->data, &card->statistics, | ||
| 2640 | sizeof(global_stats_t)); | ||
| 2641 | |||
| 2642 | memcpy(&ppp_udp_pkt->data+sizeof(global_stats_t), | ||
| 2643 | &ppp_priv_area->rx_intr_stat, | ||
| 2644 | sizeof(rx_intr_stat_t)); | ||
| 2645 | |||
| 2646 | ppp_udp_pkt->cblock.result = 0; | ||
| 2647 | ppp_udp_pkt->cblock.length = sizeof(global_stats_t)+ | ||
| 2648 | sizeof(rx_intr_stat_t); | ||
| 2649 | mbox->cmd.length = ppp_udp_pkt->cblock.length; | ||
| 2650 | break; | ||
| 2651 | |||
| 2652 | case PPIPE_DRIVER_STAT_GEN: | ||
| 2653 | memcpy( &ppp_udp_pkt->data, | ||
| 2654 | &ppp_priv_area->pipe_mgmt_stat, | ||
| 2655 | sizeof(pipe_mgmt_stat_t)); | ||
| 2656 | |||
| 2657 | memcpy(&ppp_udp_pkt->data+sizeof(pipe_mgmt_stat_t), | ||
| 2658 | &card->statistics, sizeof(global_stats_t)); | ||
| 2659 | |||
| 2660 | ppp_udp_pkt->cblock.result = 0; | ||
| 2661 | ppp_udp_pkt->cblock.length = sizeof(global_stats_t)+ | ||
| 2662 | sizeof(rx_intr_stat_t); | ||
| 2663 | mbox->cmd.length = ppp_udp_pkt->cblock.length; | ||
| 2664 | break; | ||
| 2665 | |||
| 2666 | |||
| 2667 | /* FT1 MONITOR STATUS */ | ||
| 2668 | case FT1_MONITOR_STATUS_CTRL: | ||
| 2669 | |||
| 2670 | /* Enable FT1 MONITOR STATUS */ | ||
| 2671 | if( ppp_udp_pkt->data[0] == 1) { | ||
| 2672 | |||
| 2673 | if( rCount++ != 0 ) { | ||
| 2674 | ppp_udp_pkt->cblock.result = 0; | ||
| 2675 | mbox->cmd.length = 1; | ||
| 2676 | break; | ||
| 2677 | } | ||
| 2678 | } | ||
| 2679 | |||
| 2680 | /* Disable FT1 MONITOR STATUS */ | ||
| 2681 | if( ppp_udp_pkt->data[0] == 0) { | ||
| 2682 | |||
| 2683 | if( --rCount != 0) { | ||
| 2684 | ppp_udp_pkt->cblock.result = 0; | ||
| 2685 | mbox->cmd.length = 1; | ||
| 2686 | break; | ||
| 2687 | } | ||
| 2688 | } | ||
| 2689 | goto udp_dflt_cmd; | ||
| 2690 | |||
| 2691 | /* WARNING: FIXME: This should be fixed. | ||
| 2692 | * The FT1 Status Ctrl doesn't have a break | ||
| 2693 | * statment. Thus, no code must be inserted | ||
| 2694 | * HERE: between default and above case statement */ | ||
| 2695 | |||
| 2696 | default: | ||
| 2697 | udp_dflt_cmd: | ||
| 2698 | |||
| 2699 | /* it's a board command */ | ||
| 2700 | mbox->cmd.command = ppp_udp_pkt->cblock.command; | ||
| 2701 | mbox->cmd.length = ppp_udp_pkt->cblock.length; | ||
| 2702 | |||
| 2703 | if(mbox->cmd.length) { | ||
| 2704 | memcpy(&mbox->data,(unsigned char *)ppp_udp_pkt->data, | ||
| 2705 | mbox->cmd.length); | ||
| 2706 | } | ||
| 2707 | |||
| 2708 | /* run the command on the board */ | ||
| 2709 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2710 | |||
| 2711 | if (err != CMD_OK) { | ||
| 2712 | |||
| 2713 | ppp_error(card, err, mbox); | ||
| 2714 | ++ppp_priv_area->pipe_mgmt_stat. | ||
| 2715 | UDP_PIPE_mgmt_adptr_cmnd_timeout; | ||
| 2716 | break; | ||
| 2717 | } | ||
| 2718 | |||
| 2719 | ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_cmnd_OK; | ||
| 2720 | |||
| 2721 | /* copy the result back to our buffer */ | ||
| 2722 | memcpy(&ppp_udp_pkt->cblock,mbox, sizeof(cblock_t)); | ||
| 2723 | |||
| 2724 | if(mbox->cmd.length) { | ||
| 2725 | memcpy(&ppp_udp_pkt->data,&mbox->data,mbox->cmd.length); | ||
| 2726 | } | ||
| 2727 | |||
| 2728 | } /* end of switch */ | ||
| 2729 | } /* end of else */ | ||
| 2730 | |||
| 2731 | /* Fill UDP TTL */ | ||
| 2732 | ppp_udp_pkt->ip_pkt.ttl = card->wandev.ttl; | ||
| 2733 | len = reply_udp(ppp_priv_area->udp_pkt_data, mbox->cmd.length); | ||
| 2734 | |||
| 2735 | if (ppp_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 2736 | |||
| 2737 | /* Make sure we are not already sending */ | ||
| 2738 | if (!test_bit(SEND_CRIT,&card->wandev.critical)){ | ||
| 2739 | ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_passed_to_adptr; | ||
| 2740 | ppp_send(card,ppp_priv_area->udp_pkt_data,len,ppp_priv_area->protocol); | ||
| 2741 | } | ||
| 2742 | |||
| 2743 | } else { | ||
| 2744 | |||
| 2745 | /* Pass it up the stack | ||
| 2746 | Allocate socket buffer */ | ||
| 2747 | if ((new_skb = dev_alloc_skb(len)) != NULL) { | ||
| 2748 | |||
| 2749 | /* copy data into new_skb */ | ||
| 2750 | |||
| 2751 | buf = skb_put(new_skb, len); | ||
| 2752 | memcpy(buf,ppp_priv_area->udp_pkt_data, len); | ||
| 2753 | |||
| 2754 | ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_passed_to_stack; | ||
| 2755 | |||
| 2756 | /* Decapsulate packet and pass it up the protocol | ||
| 2757 | stack */ | ||
| 2758 | new_skb->protocol = htons(ETH_P_IP); | ||
| 2759 | new_skb->dev = dev; | ||
| 2760 | new_skb->mac.raw = new_skb->data; | ||
| 2761 | netif_rx(new_skb); | ||
| 2762 | dev->last_rx = jiffies; | ||
| 2763 | |||
| 2764 | } else { | ||
| 2765 | |||
| 2766 | ++ppp_priv_area->pipe_mgmt_stat.UDP_PIPE_mgmt_no_socket; | ||
| 2767 | printk(KERN_INFO "no socket buffers available!\n"); | ||
| 2768 | } | ||
| 2769 | } | ||
| 2770 | |||
| 2771 | ppp_priv_area->udp_pkt_lgth = 0; | ||
| 2772 | |||
| 2773 | return; | ||
| 2774 | } | ||
| 2775 | |||
| 2776 | /*============================================================================= | ||
| 2777 | * Initial the ppp_private_area structure. | ||
| 2778 | */ | ||
| 2779 | static void init_ppp_priv_struct( ppp_private_area_t *ppp_priv_area ) | ||
| 2780 | { | ||
| 2781 | |||
| 2782 | memset(&ppp_priv_area->if_send_stat, 0, sizeof(if_send_stat_t)); | ||
| 2783 | memset(&ppp_priv_area->rx_intr_stat, 0, sizeof(rx_intr_stat_t)); | ||
| 2784 | memset(&ppp_priv_area->pipe_mgmt_stat, 0, sizeof(pipe_mgmt_stat_t)); | ||
| 2785 | } | ||
| 2786 | |||
| 2787 | /*============================================================================ | ||
| 2788 | * Initialize Global Statistics | ||
| 2789 | */ | ||
| 2790 | static void init_global_statistics( sdla_t *card ) | ||
| 2791 | { | ||
| 2792 | memset(&card->statistics, 0, sizeof(global_stats_t)); | ||
| 2793 | } | ||
| 2794 | |||
| 2795 | /*============================================================================ | ||
| 2796 | * Initialize Receive and Transmit Buffers. | ||
| 2797 | */ | ||
| 2798 | static void init_ppp_tx_rx_buff( sdla_t *card ) | ||
| 2799 | { | ||
| 2800 | ppp508_buf_info_t* info; | ||
| 2801 | |||
| 2802 | if (card->hw.type == SDLA_S514) { | ||
| 2803 | |||
| 2804 | info = (void*)(card->hw.dpmbase + PPP514_BUF_OFFS); | ||
| 2805 | |||
| 2806 | card->u.p.txbuf_base = (void*)(card->hw.dpmbase + | ||
| 2807 | info->txb_ptr); | ||
| 2808 | |||
| 2809 | card->u.p.txbuf_last = (ppp_buf_ctl_t*)card->u.p.txbuf_base + | ||
| 2810 | (info->txb_num - 1); | ||
| 2811 | |||
| 2812 | card->u.p.rxbuf_base = (void*)(card->hw.dpmbase + | ||
| 2813 | info->rxb_ptr); | ||
| 2814 | |||
| 2815 | card->u.p.rxbuf_last = (ppp_buf_ctl_t*)card->u.p.rxbuf_base + | ||
| 2816 | (info->rxb_num - 1); | ||
| 2817 | |||
| 2818 | } else { | ||
| 2819 | |||
| 2820 | info = (void*)(card->hw.dpmbase + PPP508_BUF_OFFS); | ||
| 2821 | |||
| 2822 | card->u.p.txbuf_base = (void*)(card->hw.dpmbase + | ||
| 2823 | (info->txb_ptr - PPP508_MB_VECT)); | ||
| 2824 | |||
| 2825 | card->u.p.txbuf_last = (ppp_buf_ctl_t*)card->u.p.txbuf_base + | ||
| 2826 | (info->txb_num - 1); | ||
| 2827 | |||
| 2828 | card->u.p.rxbuf_base = (void*)(card->hw.dpmbase + | ||
| 2829 | (info->rxb_ptr - PPP508_MB_VECT)); | ||
| 2830 | |||
| 2831 | card->u.p.rxbuf_last = (ppp_buf_ctl_t*)card->u.p.rxbuf_base + | ||
| 2832 | (info->rxb_num - 1); | ||
| 2833 | } | ||
| 2834 | |||
| 2835 | card->u.p.txbuf_next = (unsigned long*)&info->txb_nxt; | ||
| 2836 | card->u.p.rxbuf_next = (unsigned long*)&info->rxb1_ptr; | ||
| 2837 | |||
| 2838 | card->u.p.rx_base = info->rxb_base; | ||
| 2839 | card->u.p.rx_top = info->rxb_end; | ||
| 2840 | |||
| 2841 | card->u.p.txbuf = card->u.p.txbuf_base; | ||
| 2842 | card->rxmb = card->u.p.rxbuf_base; | ||
| 2843 | |||
| 2844 | } | ||
| 2845 | |||
| 2846 | /*============================================================================= | ||
| 2847 | * Read Connection Information (ie for Remote IP address assginment). | ||
| 2848 | * Called when ppp interface connected. | ||
| 2849 | */ | ||
| 2850 | static int read_info( sdla_t *card ) | ||
| 2851 | { | ||
| 2852 | struct net_device *dev = card->wandev.dev; | ||
| 2853 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 2854 | int err; | ||
| 2855 | |||
| 2856 | struct ifreq if_info; | ||
| 2857 | struct sockaddr_in *if_data1, *if_data2; | ||
| 2858 | mm_segment_t fs; | ||
| 2859 | |||
| 2860 | /* Set Local and remote addresses */ | ||
| 2861 | memset(&if_info, 0, sizeof(if_info)); | ||
| 2862 | strcpy(if_info.ifr_name, dev->name); | ||
| 2863 | |||
| 2864 | |||
| 2865 | fs = get_fs(); | ||
| 2866 | set_fs(get_ds()); /* get user space block */ | ||
| 2867 | |||
| 2868 | /* Change the local and remote ip address of the interface. | ||
| 2869 | * This will also add in the destination route. | ||
| 2870 | */ | ||
| 2871 | if_data1 = (struct sockaddr_in *)&if_info.ifr_addr; | ||
| 2872 | if_data1->sin_addr.s_addr = ppp_priv_area->ip_local; | ||
| 2873 | if_data1->sin_family = AF_INET; | ||
| 2874 | err = devinet_ioctl( SIOCSIFADDR, &if_info ); | ||
| 2875 | if_data2 = (struct sockaddr_in *)&if_info.ifr_dstaddr; | ||
| 2876 | if_data2->sin_addr.s_addr = ppp_priv_area->ip_remote; | ||
| 2877 | if_data2->sin_family = AF_INET; | ||
| 2878 | err = devinet_ioctl( SIOCSIFDSTADDR, &if_info ); | ||
| 2879 | |||
| 2880 | set_fs(fs); /* restore old block */ | ||
| 2881 | |||
| 2882 | if (err) { | ||
| 2883 | printk (KERN_INFO "%s: Adding of route failed: %i\n", | ||
| 2884 | card->devname,err); | ||
| 2885 | printk (KERN_INFO "%s: Local : %u.%u.%u.%u\n", | ||
| 2886 | card->devname,NIPQUAD(ppp_priv_area->ip_local)); | ||
| 2887 | printk (KERN_INFO "%s: Remote: %u.%u.%u.%u\n", | ||
| 2888 | card->devname,NIPQUAD(ppp_priv_area->ip_remote)); | ||
| 2889 | } | ||
| 2890 | return err; | ||
| 2891 | } | ||
| 2892 | |||
| 2893 | /*============================================================================= | ||
| 2894 | * Remove Dynamic Route. | ||
| 2895 | * Called when ppp interface disconnected. | ||
| 2896 | */ | ||
| 2897 | |||
| 2898 | static void remove_route( sdla_t *card ) | ||
| 2899 | { | ||
| 2900 | |||
| 2901 | struct net_device *dev = card->wandev.dev; | ||
| 2902 | long ip_addr; | ||
| 2903 | int err; | ||
| 2904 | |||
| 2905 | mm_segment_t fs; | ||
| 2906 | struct ifreq if_info; | ||
| 2907 | struct sockaddr_in *if_data1; | ||
| 2908 | struct in_device *in_dev = dev->ip_ptr; | ||
| 2909 | struct in_ifaddr *ifa = in_dev->ifa_list; | ||
| 2910 | |||
| 2911 | ip_addr = ifa->ifa_local; | ||
| 2912 | |||
| 2913 | /* Set Local and remote addresses */ | ||
| 2914 | memset(&if_info, 0, sizeof(if_info)); | ||
| 2915 | strcpy(if_info.ifr_name, dev->name); | ||
| 2916 | |||
| 2917 | fs = get_fs(); | ||
| 2918 | set_fs(get_ds()); /* get user space block */ | ||
| 2919 | |||
| 2920 | /* Change the local ip address of the interface to 0. | ||
| 2921 | * This will also delete the destination route. | ||
| 2922 | */ | ||
| 2923 | if_data1 = (struct sockaddr_in *)&if_info.ifr_addr; | ||
| 2924 | if_data1->sin_addr.s_addr = 0; | ||
| 2925 | if_data1->sin_family = AF_INET; | ||
| 2926 | err = devinet_ioctl( SIOCSIFADDR, &if_info ); | ||
| 2927 | |||
| 2928 | set_fs(fs); /* restore old block */ | ||
| 2929 | |||
| 2930 | |||
| 2931 | if (err) { | ||
| 2932 | printk (KERN_INFO "%s: Deleting dynamic route failed %d!\n", | ||
| 2933 | card->devname, err); | ||
| 2934 | return; | ||
| 2935 | }else{ | ||
| 2936 | printk (KERN_INFO "%s: PPP Deleting dynamic route %u.%u.%u.%u successfuly\n", | ||
| 2937 | card->devname, NIPQUAD(ip_addr)); | ||
| 2938 | } | ||
| 2939 | return; | ||
| 2940 | } | ||
| 2941 | |||
| 2942 | /*============================================================================= | ||
| 2943 | * Perform the Interrupt Test by running the READ_CODE_VERSION command MAX_INTR | ||
| 2944 | * _TEST_COUNTER times. | ||
| 2945 | */ | ||
| 2946 | static int intr_test( sdla_t *card ) | ||
| 2947 | { | ||
| 2948 | ppp_mbox_t *mb = card->mbox; | ||
| 2949 | int err,i; | ||
| 2950 | |||
| 2951 | err = ppp_set_intr_mode( card, 0x08 ); | ||
| 2952 | |||
| 2953 | if (err == CMD_OK) { | ||
| 2954 | |||
| 2955 | for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) { | ||
| 2956 | /* Run command READ_CODE_VERSION */ | ||
| 2957 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 2958 | mb->cmd.length = 0; | ||
| 2959 | mb->cmd.command = PPP_READ_CODE_VERSION; | ||
| 2960 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 2961 | if (err != CMD_OK) | ||
| 2962 | ppp_error(card, err, mb); | ||
| 2963 | } | ||
| 2964 | } | ||
| 2965 | else return err; | ||
| 2966 | |||
| 2967 | err = ppp_set_intr_mode( card, 0 ); | ||
| 2968 | if (err != CMD_OK) | ||
| 2969 | return err; | ||
| 2970 | |||
| 2971 | return 0; | ||
| 2972 | } | ||
| 2973 | |||
| 2974 | /*============================================================================== | ||
| 2975 | * Determine what type of UDP call it is. DRVSTATS or PTPIPEAB ? | ||
| 2976 | */ | ||
| 2977 | static int udp_pkt_type( struct sk_buff *skb, sdla_t *card ) | ||
| 2978 | { | ||
| 2979 | unsigned char *sendpacket; | ||
| 2980 | unsigned char buf2[5]; | ||
| 2981 | ppp_udp_pkt_t *ppp_udp_pkt = (ppp_udp_pkt_t *)skb->data; | ||
| 2982 | |||
| 2983 | sendpacket = skb->data; | ||
| 2984 | memcpy(&buf2, &card->wandev.udp_port, 2); | ||
| 2985 | |||
| 2986 | if( ppp_udp_pkt->ip_pkt.ver_inet_hdr_length == 0x45 && /* IP packet */ | ||
| 2987 | sendpacket[9] == 0x11 && /* UDP packet */ | ||
| 2988 | sendpacket[22] == buf2[1] && /* UDP Port */ | ||
| 2989 | sendpacket[23] == buf2[0] && | ||
| 2990 | sendpacket[36] == 0x01 ) { | ||
| 2991 | |||
| 2992 | if ( sendpacket[28] == 0x50 && /* PTPIPEAB: Signature */ | ||
| 2993 | sendpacket[29] == 0x54 && | ||
| 2994 | sendpacket[30] == 0x50 && | ||
| 2995 | sendpacket[31] == 0x49 && | ||
| 2996 | sendpacket[32] == 0x50 && | ||
| 2997 | sendpacket[33] == 0x45 && | ||
| 2998 | sendpacket[34] == 0x41 && | ||
| 2999 | sendpacket[35] == 0x42 ){ | ||
| 3000 | |||
| 3001 | return UDP_PTPIPE_TYPE; | ||
| 3002 | |||
| 3003 | } else if(sendpacket[28] == 0x44 && /* DRVSTATS: Signature */ | ||
| 3004 | sendpacket[29] == 0x52 && | ||
| 3005 | sendpacket[30] == 0x56 && | ||
| 3006 | sendpacket[31] == 0x53 && | ||
| 3007 | sendpacket[32] == 0x54 && | ||
| 3008 | sendpacket[33] == 0x41 && | ||
| 3009 | sendpacket[34] == 0x54 && | ||
| 3010 | sendpacket[35] == 0x53 ){ | ||
| 3011 | |||
| 3012 | return UDP_DRVSTATS_TYPE; | ||
| 3013 | |||
| 3014 | } else | ||
| 3015 | return UDP_INVALID_TYPE; | ||
| 3016 | |||
| 3017 | } else | ||
| 3018 | return UDP_INVALID_TYPE; | ||
| 3019 | |||
| 3020 | } | ||
| 3021 | |||
| 3022 | /*============================================================================ | ||
| 3023 | * Check to see if the packet to be transmitted contains a broadcast or | ||
| 3024 | * multicast source IP address. | ||
| 3025 | */ | ||
| 3026 | |||
| 3027 | static int chk_bcast_mcast_addr(sdla_t *card, struct net_device* dev, | ||
| 3028 | struct sk_buff *skb) | ||
| 3029 | { | ||
| 3030 | u32 src_ip_addr; | ||
| 3031 | u32 broadcast_ip_addr = 0; | ||
| 3032 | struct in_device *in_dev; | ||
| 3033 | |||
| 3034 | /* read the IP source address from the outgoing packet */ | ||
| 3035 | src_ip_addr = *(u32 *)(skb->data + 12); | ||
| 3036 | |||
| 3037 | /* read the IP broadcast address for the device */ | ||
| 3038 | in_dev = dev->ip_ptr; | ||
| 3039 | if(in_dev != NULL) { | ||
| 3040 | struct in_ifaddr *ifa= in_dev->ifa_list; | ||
| 3041 | if(ifa != NULL) | ||
| 3042 | broadcast_ip_addr = ifa->ifa_broadcast; | ||
| 3043 | else | ||
| 3044 | return 0; | ||
| 3045 | } | ||
| 3046 | |||
| 3047 | /* check if the IP Source Address is a Broadcast address */ | ||
| 3048 | if((dev->flags & IFF_BROADCAST) && (src_ip_addr == broadcast_ip_addr)) { | ||
| 3049 | printk(KERN_INFO "%s: Broadcast Source Address silently discarded\n", | ||
| 3050 | card->devname); | ||
| 3051 | return 1; | ||
| 3052 | } | ||
| 3053 | |||
| 3054 | /* check if the IP Source Address is a Multicast address */ | ||
| 3055 | if((ntohl(src_ip_addr) >= 0xE0000001) && | ||
| 3056 | (ntohl(src_ip_addr) <= 0xFFFFFFFE)) { | ||
| 3057 | printk(KERN_INFO "%s: Multicast Source Address silently discarded\n", | ||
| 3058 | card->devname); | ||
| 3059 | return 1; | ||
| 3060 | } | ||
| 3061 | |||
| 3062 | return 0; | ||
| 3063 | } | ||
| 3064 | |||
| 3065 | void s508_lock (sdla_t *card, unsigned long *smp_flags) | ||
| 3066 | { | ||
| 3067 | spin_lock_irqsave(&card->wandev.lock, *smp_flags); | ||
| 3068 | } | ||
| 3069 | |||
| 3070 | void s508_unlock (sdla_t *card, unsigned long *smp_flags) | ||
| 3071 | { | ||
| 3072 | spin_unlock_irqrestore(&card->wandev.lock, *smp_flags); | ||
| 3073 | } | ||
| 3074 | |||
| 3075 | static int read_connection_info (sdla_t *card) | ||
| 3076 | { | ||
| 3077 | ppp_mbox_t *mb = card->mbox; | ||
| 3078 | struct net_device *dev = card->wandev.dev; | ||
| 3079 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 3080 | ppp508_connect_info_t *ppp508_connect_info; | ||
| 3081 | int err; | ||
| 3082 | |||
| 3083 | memset(&mb->cmd, 0, sizeof(ppp_cmd_t)); | ||
| 3084 | mb->cmd.length = 0; | ||
| 3085 | mb->cmd.command = PPP_GET_CONNECTION_INFO; | ||
| 3086 | err = sdla_exec(mb) ? mb->cmd.result : CMD_TIMEOUT; | ||
| 3087 | |||
| 3088 | if (err != CMD_OK) { | ||
| 3089 | ppp_error(card, err, mb); | ||
| 3090 | ppp_priv_area->ip_remote = 0; | ||
| 3091 | ppp_priv_area->ip_local = 0; | ||
| 3092 | } | ||
| 3093 | else { | ||
| 3094 | ppp508_connect_info = (ppp508_connect_info_t *)mb->data; | ||
| 3095 | ppp_priv_area->ip_remote = ppp508_connect_info->ip_remote; | ||
| 3096 | ppp_priv_area->ip_local = ppp508_connect_info->ip_local; | ||
| 3097 | |||
| 3098 | NEX_PRINTK(KERN_INFO "READ CONNECTION GOT IP ADDRESS %x, %x\n", | ||
| 3099 | ppp_priv_area->ip_remote, | ||
| 3100 | ppp_priv_area->ip_local); | ||
| 3101 | } | ||
| 3102 | |||
| 3103 | return err; | ||
| 3104 | } | ||
| 3105 | |||
| 3106 | /*=============================================================================== | ||
| 3107 | * config_ppp | ||
| 3108 | * | ||
| 3109 | * Configure the ppp protocol and enable communications. | ||
| 3110 | * | ||
| 3111 | * The if_open function binds this function to the poll routine. | ||
| 3112 | * Therefore, this function will run every time the ppp interface | ||
| 3113 | * is brought up. | ||
| 3114 | * | ||
| 3115 | * If the communications are not enabled, proceed to configure | ||
| 3116 | * the card and enable communications. | ||
| 3117 | * | ||
| 3118 | * If the communications are enabled, it means that the interface | ||
| 3119 | * was shutdown by ether the user or driver. In this case, we | ||
| 3120 | * have to check that the IP addresses have not changed. If | ||
| 3121 | * the IP addresses changed, we have to reconfigure the firmware | ||
| 3122 | * and update the changed IP addresses. Otherwise, just exit. | ||
| 3123 | */ | ||
| 3124 | static int config_ppp (sdla_t *card) | ||
| 3125 | { | ||
| 3126 | |||
| 3127 | struct net_device *dev = card->wandev.dev; | ||
| 3128 | ppp_flags_t *flags = card->flags; | ||
| 3129 | ppp_private_area_t *ppp_priv_area = dev->priv; | ||
| 3130 | |||
| 3131 | if (card->u.p.comm_enabled){ | ||
| 3132 | |||
| 3133 | if (ppp_priv_area->ip_local_tmp != ppp_priv_area->ip_local || | ||
| 3134 | ppp_priv_area->ip_remote_tmp != ppp_priv_area->ip_remote){ | ||
| 3135 | |||
| 3136 | /* The IP addersses have changed, we must | ||
| 3137 | * stop the communications and reconfigure | ||
| 3138 | * the card. Reason: the firmware must know | ||
| 3139 | * the local and remote IP addresses. */ | ||
| 3140 | disable_comm(card); | ||
| 3141 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 3142 | printk(KERN_INFO | ||
| 3143 | "%s: IP addresses changed!\n", | ||
| 3144 | card->devname); | ||
| 3145 | printk(KERN_INFO "%s: Restarting communications ...\n", | ||
| 3146 | card->devname); | ||
| 3147 | }else{ | ||
| 3148 | /* IP addresses are the same and the link is up, | ||
| 3149 | * we don't have to do anything here. Therefore, exit */ | ||
| 3150 | return 0; | ||
| 3151 | } | ||
| 3152 | } | ||
| 3153 | |||
| 3154 | /* Record the new IP addreses */ | ||
| 3155 | ppp_priv_area->ip_local = ppp_priv_area->ip_local_tmp; | ||
| 3156 | ppp_priv_area->ip_remote = ppp_priv_area->ip_remote_tmp; | ||
| 3157 | |||
| 3158 | if (config508(dev, card)){ | ||
| 3159 | printk(KERN_INFO "%s: Failed to configure PPP device\n", | ||
| 3160 | card->devname); | ||
| 3161 | return 0; | ||
| 3162 | } | ||
| 3163 | |||
| 3164 | if (ppp_set_intr_mode(card, PPP_INTR_RXRDY| | ||
| 3165 | PPP_INTR_TXRDY| | ||
| 3166 | PPP_INTR_MODEM| | ||
| 3167 | PPP_INTR_DISC | | ||
| 3168 | PPP_INTR_OPEN | | ||
| 3169 | PPP_INTR_DROP_DTR | | ||
| 3170 | PPP_INTR_TIMER)) { | ||
| 3171 | |||
| 3172 | printk(KERN_INFO "%s: Failed to configure board interrupts !\n", | ||
| 3173 | card->devname); | ||
| 3174 | return 0; | ||
| 3175 | } | ||
| 3176 | |||
| 3177 | /* Turn off the transmit and timer interrupt */ | ||
| 3178 | flags->imask &= ~(PPP_INTR_TXRDY | PPP_INTR_TIMER) ; | ||
| 3179 | |||
| 3180 | |||
| 3181 | /* If you are not the authenticator and any one of the protocol is | ||
| 3182 | * enabled then we call the set_out_bound_authentication. | ||
| 3183 | */ | ||
| 3184 | if ( !card->u.p.authenticator && (ppp_priv_area->pap || ppp_priv_area->chap)) { | ||
| 3185 | if ( ppp_set_outbnd_auth(card, ppp_priv_area) ){ | ||
| 3186 | printk(KERN_INFO "%s: Outbound authentication failed !\n", | ||
| 3187 | card->devname); | ||
| 3188 | return 0; | ||
| 3189 | } | ||
| 3190 | } | ||
| 3191 | |||
| 3192 | /* If you are the authenticator and any one of the protocol is enabled | ||
| 3193 | * then we call the set_in_bound_authentication. | ||
| 3194 | */ | ||
| 3195 | if (card->u.p.authenticator && (ppp_priv_area->pap || ppp_priv_area->chap)){ | ||
| 3196 | if (ppp_set_inbnd_auth(card, ppp_priv_area)){ | ||
| 3197 | printk(KERN_INFO "%s: Inbound authentication failed !\n", | ||
| 3198 | card->devname); | ||
| 3199 | return 0; | ||
| 3200 | } | ||
| 3201 | } | ||
| 3202 | |||
| 3203 | /* If we fail to enable communications here it's OK, | ||
| 3204 | * since the DTR timer will cause a disconnected, which | ||
| 3205 | * will retrigger communication in timer_intr() */ | ||
| 3206 | if (ppp_comm_enable(card) == CMD_OK) { | ||
| 3207 | wanpipe_set_state(card, WAN_CONNECTING); | ||
| 3208 | init_ppp_tx_rx_buff(card); | ||
| 3209 | } | ||
| 3210 | |||
| 3211 | return 0; | ||
| 3212 | } | ||
| 3213 | |||
| 3214 | /*============================================================ | ||
| 3215 | * ppp_poll | ||
| 3216 | * | ||
| 3217 | * Rationale: | ||
| 3218 | * We cannot manipulate the routing tables, or | ||
| 3219 | * ip addresses withing the interrupt. Therefore | ||
| 3220 | * we must perform such actons outside an interrupt | ||
| 3221 | * at a later time. | ||
| 3222 | * | ||
| 3223 | * Description: | ||
| 3224 | * PPP polling routine, responsible for | ||
| 3225 | * shutting down interfaces upon disconnect | ||
| 3226 | * and adding/removing routes. | ||
| 3227 | * | ||
| 3228 | * Usage: | ||
| 3229 | * This function is executed for each ppp | ||
| 3230 | * interface through a tq_schedule bottom half. | ||
| 3231 | * | ||
| 3232 | * trigger_ppp_poll() function is used to kick | ||
| 3233 | * the ppp_poll routine. | ||
| 3234 | */ | ||
| 3235 | static void ppp_poll(struct net_device *dev) | ||
| 3236 | { | ||
| 3237 | ppp_private_area_t *ppp_priv_area; | ||
| 3238 | sdla_t *card; | ||
| 3239 | u8 check_gateway=0; | ||
| 3240 | ppp_flags_t *flags; | ||
| 3241 | |||
| 3242 | if (!dev || (ppp_priv_area = dev->priv) == NULL) | ||
| 3243 | return; | ||
| 3244 | |||
| 3245 | card = ppp_priv_area->card; | ||
| 3246 | flags = card->flags; | ||
| 3247 | |||
| 3248 | /* Shutdown is in progress, stop what you are | ||
| 3249 | * doing and get out */ | ||
| 3250 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 3251 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3252 | return; | ||
| 3253 | } | ||
| 3254 | |||
| 3255 | /* if_open() function has triggered the polling routine | ||
| 3256 | * to determine the configured IP addresses. Once the | ||
| 3257 | * addresses are found, trigger the chdlc configuration */ | ||
| 3258 | if (test_bit(0,&ppp_priv_area->config_ppp)){ | ||
| 3259 | |||
| 3260 | ppp_priv_area->ip_local_tmp = get_ip_address(dev,WAN_LOCAL_IP); | ||
| 3261 | ppp_priv_area->ip_remote_tmp = get_ip_address(dev,WAN_POINTOPOINT_IP); | ||
| 3262 | |||
| 3263 | if (ppp_priv_area->ip_local_tmp == ppp_priv_area->ip_remote_tmp && | ||
| 3264 | card->u.p.ip_mode == WANOPT_PPP_HOST){ | ||
| 3265 | |||
| 3266 | if (++ppp_priv_area->ip_error > MAX_IP_ERRORS){ | ||
| 3267 | printk(KERN_INFO "\n%s: --- WARNING ---\n", | ||
| 3268 | card->devname); | ||
| 3269 | printk(KERN_INFO "%s: The local IP address is the same as the\n", | ||
| 3270 | card->devname); | ||
| 3271 | printk(KERN_INFO "%s: Point-to-Point IP address.\n", | ||
| 3272 | card->devname); | ||
| 3273 | printk(KERN_INFO "%s: --- WARNING ---\n\n", | ||
| 3274 | card->devname); | ||
| 3275 | }else{ | ||
| 3276 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3277 | ppp_priv_area->poll_delay_timer.expires = jiffies+HZ; | ||
| 3278 | add_timer(&ppp_priv_area->poll_delay_timer); | ||
| 3279 | return; | ||
| 3280 | } | ||
| 3281 | } | ||
| 3282 | |||
| 3283 | ppp_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG; | ||
| 3284 | flags->imask |= PPP_INTR_TIMER; | ||
| 3285 | ppp_priv_area->ip_error=0; | ||
| 3286 | |||
| 3287 | clear_bit(0,&ppp_priv_area->config_ppp); | ||
| 3288 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3289 | return; | ||
| 3290 | } | ||
| 3291 | |||
| 3292 | /* Dynamic interface implementation, as well as dynamic | ||
| 3293 | * routing. */ | ||
| 3294 | |||
| 3295 | switch (card->wandev.state) { | ||
| 3296 | |||
| 3297 | case WAN_DISCONNECTED: | ||
| 3298 | |||
| 3299 | /* If the dynamic interface configuration is on, and interface | ||
| 3300 | * is up, then bring down the netowrk interface */ | ||
| 3301 | |||
| 3302 | if (test_bit(DYN_OPT_ON,&ppp_priv_area->interface_down) && | ||
| 3303 | !test_bit(DEV_DOWN,&ppp_priv_area->interface_down) && | ||
| 3304 | card->wandev.dev->flags & IFF_UP){ | ||
| 3305 | |||
| 3306 | printk(KERN_INFO "%s: Interface %s down.\n", | ||
| 3307 | card->devname,card->wandev.dev->name); | ||
| 3308 | change_dev_flags(card->wandev.dev, | ||
| 3309 | (card->wandev.dev->flags&~IFF_UP)); | ||
| 3310 | set_bit(DEV_DOWN,&ppp_priv_area->interface_down); | ||
| 3311 | }else{ | ||
| 3312 | /* We need to check if the local IP address is | ||
| 3313 | * zero. If it is, we shouldn't try to remove it. | ||
| 3314 | * For some reason the kernel crashes badly if | ||
| 3315 | * we try to remove the route twice */ | ||
| 3316 | |||
| 3317 | if (card->wandev.dev->flags & IFF_UP && | ||
| 3318 | get_ip_address(card->wandev.dev,WAN_LOCAL_IP) && | ||
| 3319 | card->u.p.ip_mode == WANOPT_PPP_PEER){ | ||
| 3320 | |||
| 3321 | remove_route(card); | ||
| 3322 | } | ||
| 3323 | } | ||
| 3324 | break; | ||
| 3325 | |||
| 3326 | case WAN_CONNECTED: | ||
| 3327 | |||
| 3328 | /* In SMP machine this code can execute before the interface | ||
| 3329 | * comes up. In this case, we must make sure that we do not | ||
| 3330 | * try to bring up the interface before dev_open() is finished */ | ||
| 3331 | |||
| 3332 | |||
| 3333 | /* DEV_DOWN will be set only when we bring down the interface | ||
| 3334 | * for the very first time. This way we know that it was us | ||
| 3335 | * that brought the interface down */ | ||
| 3336 | |||
| 3337 | if (test_bit(DYN_OPT_ON,&ppp_priv_area->interface_down) && | ||
| 3338 | test_bit(DEV_DOWN, &ppp_priv_area->interface_down) && | ||
| 3339 | !(card->wandev.dev->flags & IFF_UP)){ | ||
| 3340 | |||
| 3341 | printk(KERN_INFO "%s: Interface %s up.\n", | ||
| 3342 | card->devname,card->wandev.dev->name); | ||
| 3343 | |||
| 3344 | change_dev_flags(card->wandev.dev,(card->wandev.dev->flags|IFF_UP)); | ||
| 3345 | clear_bit(DEV_DOWN,&ppp_priv_area->interface_down); | ||
| 3346 | check_gateway=1; | ||
| 3347 | } | ||
| 3348 | |||
| 3349 | if ((card->u.p.ip_mode == WANOPT_PPP_PEER) && | ||
| 3350 | test_bit(1,&Read_connection_info)) { | ||
| 3351 | |||
| 3352 | process_route(card); | ||
| 3353 | clear_bit(1,&Read_connection_info); | ||
| 3354 | check_gateway=1; | ||
| 3355 | } | ||
| 3356 | |||
| 3357 | if (ppp_priv_area->gateway && check_gateway) | ||
| 3358 | add_gateway(card,dev); | ||
| 3359 | |||
| 3360 | break; | ||
| 3361 | } | ||
| 3362 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 3363 | return; | ||
| 3364 | } | ||
| 3365 | |||
| 3366 | /*============================================================ | ||
| 3367 | * trigger_ppp_poll | ||
| 3368 | * | ||
| 3369 | * Description: | ||
| 3370 | * Add a ppp_poll() task into a tq_scheduler bh handler | ||
| 3371 | * for a specific interface. This will kick | ||
| 3372 | * the ppp_poll() routine at a later time. | ||
| 3373 | * | ||
| 3374 | * Usage: | ||
| 3375 | * Interrupts use this to defer a taks to | ||
| 3376 | * a polling routine. | ||
| 3377 | * | ||
| 3378 | */ | ||
| 3379 | |||
| 3380 | static void trigger_ppp_poll(struct net_device *dev) | ||
| 3381 | { | ||
| 3382 | ppp_private_area_t *ppp_priv_area; | ||
| 3383 | if ((ppp_priv_area=dev->priv) != NULL){ | ||
| 3384 | |||
| 3385 | sdla_t *card = ppp_priv_area->card; | ||
| 3386 | |||
| 3387 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 3388 | return; | ||
| 3389 | } | ||
| 3390 | |||
| 3391 | if (test_and_set_bit(POLL_CRIT,&card->wandev.critical)){ | ||
| 3392 | return; | ||
| 3393 | } | ||
| 3394 | |||
| 3395 | schedule_work(&ppp_priv_area->poll_work); | ||
| 3396 | } | ||
| 3397 | return; | ||
| 3398 | } | ||
| 3399 | |||
| 3400 | static void ppp_poll_delay (unsigned long dev_ptr) | ||
| 3401 | { | ||
| 3402 | struct net_device *dev = (struct net_device *)dev_ptr; | ||
| 3403 | trigger_ppp_poll(dev); | ||
| 3404 | } | ||
| 3405 | |||
| 3406 | /*============================================================ | ||
| 3407 | * detect_and_fix_tx_bug | ||
| 3408 | * | ||
| 3409 | * Description: | ||
| 3410 | * On connect, if the board tx buffer ptr is not the same | ||
| 3411 | * as the driver tx buffer ptr, we found a firmware bug. | ||
| 3412 | * Report the bug to the above layer. To fix the | ||
| 3413 | * error restart communications again. | ||
| 3414 | * | ||
| 3415 | * Usage: | ||
| 3416 | * | ||
| 3417 | */ | ||
| 3418 | |||
| 3419 | static int detect_and_fix_tx_bug (sdla_t *card) | ||
| 3420 | { | ||
| 3421 | if (((unsigned long)card->u.p.txbuf_base&0xFFF) != ((*card->u.p.txbuf_next)&0xFFF)){ | ||
| 3422 | NEX_PRINTK(KERN_INFO "Major Error, Fix the bug\n"); | ||
| 3423 | return 1; | ||
| 3424 | } | ||
| 3425 | return 0; | ||
| 3426 | } | ||
| 3427 | |||
| 3428 | MODULE_LICENSE("GPL"); | ||
| 3429 | |||
| 3430 | /****** End *****************************************************************/ | ||
diff --git a/drivers/net/wan/sdla_x25.c b/drivers/net/wan/sdla_x25.c deleted file mode 100644 index 63f846d6f3a6..000000000000 --- a/drivers/net/wan/sdla_x25.c +++ /dev/null | |||
| @@ -1,5497 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdla_x25.c WANPIPE(tm) Multiprotocol WAN Link Driver. X.25 module. | ||
| 3 | * | ||
| 4 | * Author: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * | ||
| 6 | * Copyright: (c) 1995-2001 Sangoma Technologies Inc. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License | ||
| 10 | * as published by the Free Software Foundation; either version | ||
| 11 | * 2 of the License, or (at your option) any later version. | ||
| 12 | * ============================================================================ | ||
| 13 | * Apr 03, 2001 Nenad Corbic o Fixed the rx_skb=NULL bug in x25 in rx_intr(). | ||
| 14 | * Dec 26, 2000 Nenad Corbic o Added a new polling routine, that uses | ||
| 15 | * a kernel timer (more efficient). | ||
| 16 | * Dec 25, 2000 Nenad Corbic o Updated for 2.4.X kernel | ||
| 17 | * Jul 26, 2000 Nenad Corbic o Increased the local packet buffering | ||
| 18 | * for API to 4096+header_size. | ||
| 19 | * Jul 17, 2000 Nenad Corbic o Fixed the x25 startup bug. Enable | ||
| 20 | * communications only after all interfaces | ||
| 21 | * come up. HIGH SVC/PVC is used to calculate | ||
| 22 | * the number of channels. | ||
| 23 | * Enable protocol only after all interfaces | ||
| 24 | * are enabled. | ||
| 25 | * Jul 10, 2000 Nenad Corbic o Fixed the M_BIT bug. | ||
| 26 | * Apr 25, 2000 Nenad Corbic o Pass Modem messages to the API. | ||
| 27 | * Disable idle timeout in X25 API. | ||
| 28 | * Apr 14, 2000 Nenad Corbic o Fixed: Large LCN number support. | ||
| 29 | * Maximum LCN number is 4095. | ||
| 30 | * Maximum number of X25 channels is 255. | ||
| 31 | * Apr 06, 2000 Nenad Corbic o Added SMP Support. | ||
| 32 | * Mar 29, 2000 Nenad Corbic o Added support for S514 PCI Card | ||
| 33 | * Mar 23, 2000 Nenad Corbic o Improved task queue, BH handling. | ||
| 34 | * Mar 14, 2000 Nenad Corbic o Updated Protocol Violation handling | ||
| 35 | * routines. Bug Fix. | ||
| 36 | * Mar 10, 2000 Nenad Corbic o Bug Fix: corrupted mbox recovery. | ||
| 37 | * Mar 09, 2000 Nenad Corbic o Fixed the auto HDLC bug. | ||
| 38 | * Mar 08, 2000 Nenad Corbic o Fixed LAPB HDLC startup problems. | ||
| 39 | * Application must bring the link up | ||
| 40 | * before tx/rx, and bring the | ||
| 41 | * link down on close(). | ||
| 42 | * Mar 06, 2000 Nenad Corbic o Added an option for logging call setup | ||
| 43 | * information. | ||
| 44 | * Feb 29, 2000 Nenad Corbic o Added support for LAPB HDLC API | ||
| 45 | * Feb 25, 2000 Nenad Corbic o Fixed the modem failure handling. | ||
| 46 | * No Modem OOB message will be passed | ||
| 47 | * to the user. | ||
| 48 | * Feb 21, 2000 Nenad Corbic o Added Xpipemon Debug Support | ||
| 49 | * Dec 30, 1999 Nenad Corbic o Socket based X25API | ||
| 50 | * Sep 17, 1998 Jaspreet Singh o Updates for 2.2.X kernel | ||
| 51 | * Mar 15, 1998 Alan Cox o 2.1.x porting | ||
| 52 | * Dec 19, 1997 Jaspreet Singh o Added multi-channel IPX support | ||
| 53 | * Nov 27, 1997 Jaspreet Singh o Added protection against enabling of irqs | ||
| 54 | * when they are disabled. | ||
| 55 | * Nov 17, 1997 Farhan Thawar o Added IPX support | ||
| 56 | * o Changed if_send() to now buffer packets when | ||
| 57 | * the board is busy | ||
| 58 | * o Removed queueing of packets via the polling | ||
| 59 | * routing | ||
| 60 | * o Changed if_send() critical flags to properly | ||
| 61 | * handle race conditions | ||
| 62 | * Nov 06, 1997 Farhan Thawar o Added support for SVC timeouts | ||
| 63 | * o Changed PVC encapsulation to ETH_P_IP | ||
| 64 | * Jul 21, 1997 Jaspreet Singh o Fixed freeing up of buffers using kfree() | ||
| 65 | * when packets are received. | ||
| 66 | * Mar 11, 1997 Farhan Thawar Version 3.1.1 | ||
| 67 | * o added support for V35 | ||
| 68 | * o changed if_send() to return 0 if | ||
| 69 | * wandev.critical() is true | ||
| 70 | * o free socket buffer in if_send() if | ||
| 71 | * returning 0 | ||
| 72 | * o added support for single '@' address to | ||
| 73 | * accept all incoming calls | ||
| 74 | * o fixed bug in set_chan_state() to disconnect | ||
| 75 | * Jan 15, 1997 Gene Kozin Version 3.1.0 | ||
| 76 | * o implemented exec() entry point | ||
| 77 | * Jan 07, 1997 Gene Kozin Initial version. | ||
| 78 | *****************************************************************************/ | ||
| 79 | |||
| 80 | /*====================================================== | ||
| 81 | * Includes | ||
| 82 | *=====================================================*/ | ||
| 83 | |||
| 84 | #include <linux/module.h> | ||
| 85 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 86 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 87 | #include <linux/errno.h> /* return codes */ | ||
| 88 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 89 | #include <linux/ctype.h> | ||
| 90 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 91 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 92 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 93 | #include <linux/workqueue.h> | ||
| 94 | #include <linux/jiffies.h> /* time_after() macro */ | ||
| 95 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 96 | #include <asm/atomic.h> | ||
| 97 | #include <linux/delay.h> /* Experimental delay */ | ||
| 98 | |||
| 99 | #include <asm/uaccess.h> | ||
| 100 | |||
| 101 | #include <linux/if.h> | ||
| 102 | #include <linux/if_arp.h> | ||
| 103 | #include <linux/sdla_x25.h> /* X.25 firmware API definitions */ | ||
| 104 | #include <linux/if_wanpipe_common.h> | ||
| 105 | #include <linux/if_wanpipe.h> | ||
| 106 | |||
| 107 | |||
| 108 | /*====================================================== | ||
| 109 | * Defines & Macros | ||
| 110 | *=====================================================*/ | ||
| 111 | |||
| 112 | |||
| 113 | #define CMD_OK 0 /* normal firmware return code */ | ||
| 114 | #define CMD_TIMEOUT 0xFF /* firmware command timed out */ | ||
| 115 | #define MAX_CMD_RETRY 10 /* max number of firmware retries */ | ||
| 116 | |||
| 117 | #define X25_CHAN_MTU 4096 /* unfragmented logical channel MTU */ | ||
| 118 | #define X25_HRDHDR_SZ 7 /* max encapsulation header size */ | ||
| 119 | #define X25_CONCT_TMOUT (90*HZ) /* link connection timeout */ | ||
| 120 | #define X25_RECON_TMOUT (10*HZ) /* link connection timeout */ | ||
| 121 | #define CONNECT_TIMEOUT (90*HZ) /* link connection timeout */ | ||
| 122 | #define HOLD_DOWN_TIME (30*HZ) /* link hold down time */ | ||
| 123 | #define MAX_BH_BUFF 10 | ||
| 124 | #define M_BIT 0x01 | ||
| 125 | |||
| 126 | //#define PRINT_DEBUG 1 | ||
| 127 | #ifdef PRINT_DEBUG | ||
| 128 | #define DBG_PRINTK(format, a...) printk(format, ## a) | ||
| 129 | #else | ||
| 130 | #define DBG_PRINTK(format, a...) | ||
| 131 | #endif | ||
| 132 | |||
| 133 | #define TMR_INT_ENABLED_POLL_ACTIVE 0x01 | ||
| 134 | #define TMR_INT_ENABLED_POLL_CONNECT_ON 0x02 | ||
| 135 | #define TMR_INT_ENABLED_POLL_CONNECT_OFF 0x04 | ||
| 136 | #define TMR_INT_ENABLED_POLL_DISCONNECT 0x08 | ||
| 137 | #define TMR_INT_ENABLED_CMD_EXEC 0x10 | ||
| 138 | #define TMR_INT_ENABLED_UPDATE 0x20 | ||
| 139 | #define TMR_INT_ENABLED_UDP_PKT 0x40 | ||
| 140 | |||
| 141 | #define MAX_X25_ADDR_SIZE 16 | ||
| 142 | #define MAX_X25_DATA_SIZE 129 | ||
| 143 | #define MAX_X25_FACL_SIZE 110 | ||
| 144 | |||
| 145 | #define TRY_CMD_AGAIN 2 | ||
| 146 | #define DELAY_RESULT 1 | ||
| 147 | #define RETURN_RESULT 0 | ||
| 148 | |||
| 149 | #define DCD(x) (x & 0x03 ? "HIGH" : "LOW") | ||
| 150 | #define CTS(x) (x & 0x05 ? "HIGH" : "LOW") | ||
| 151 | |||
| 152 | |||
| 153 | /* Driver will not write log messages about | ||
| 154 | * modem status if defined.*/ | ||
| 155 | #define MODEM_NOT_LOG 1 | ||
| 156 | |||
| 157 | /*==================================================== | ||
| 158 | * For IPXWAN | ||
| 159 | *===================================================*/ | ||
| 160 | |||
| 161 | #define CVHexToAscii(b) (((unsigned char)(b) > (unsigned char)9) ? ((unsigned char)'A' + ((unsigned char)(b) - (unsigned char)10)) : ((unsigned char)'0' + (unsigned char)(b))) | ||
| 162 | |||
| 163 | |||
| 164 | /*==================================================== | ||
| 165 | * MEMORY DEBUGGING FUNCTION | ||
| 166 | *==================================================== | ||
| 167 | |||
| 168 | #define KMEM_SAFETYZONE 8 | ||
| 169 | |||
| 170 | static void * dbg_kmalloc(unsigned int size, int prio, int line) { | ||
| 171 | int i = 0; | ||
| 172 | void * v = kmalloc(size+sizeof(unsigned int)+2*KMEM_SAFETYZONE*8,prio); | ||
| 173 | char * c1 = v; | ||
| 174 | c1 += sizeof(unsigned int); | ||
| 175 | *((unsigned int *)v) = size; | ||
| 176 | |||
| 177 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 178 | c1[0] = 'D'; c1[1] = 'E'; c1[2] = 'A'; c1[3] = 'D'; | ||
| 179 | c1[4] = 'B'; c1[5] = 'E'; c1[6] = 'E'; c1[7] = 'F'; | ||
| 180 | c1 += 8; | ||
| 181 | } | ||
| 182 | c1 += size; | ||
| 183 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 184 | c1[0] = 'M'; c1[1] = 'U'; c1[2] = 'N'; c1[3] = 'G'; | ||
| 185 | c1[4] = 'W'; c1[5] = 'A'; c1[6] = 'L'; c1[7] = 'L'; | ||
| 186 | c1 += 8; | ||
| 187 | } | ||
| 188 | v = ((char *)v) + sizeof(unsigned int) + KMEM_SAFETYZONE*8; | ||
| 189 | printk(KERN_INFO "line %d kmalloc(%d,%d) = %p\n",line,size,prio,v); | ||
| 190 | return v; | ||
| 191 | } | ||
| 192 | static void dbg_kfree(void * v, int line) { | ||
| 193 | unsigned int * sp = (unsigned int *)(((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8)); | ||
| 194 | unsigned int size = *sp; | ||
| 195 | char * c1 = ((char *)v) - KMEM_SAFETYZONE*8; | ||
| 196 | int i = 0; | ||
| 197 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 198 | if ( c1[0] != 'D' || c1[1] != 'E' || c1[2] != 'A' || c1[3] != 'D' | ||
| 199 | || c1[4] != 'B' || c1[5] != 'E' || c1[6] != 'E' || c1[7] != 'F') { | ||
| 200 | printk(KERN_INFO "kmalloced block at %p has been corrupted (underrun)!\n",v); | ||
| 201 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
| 202 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
| 203 | } | ||
| 204 | c1 += 8; | ||
| 205 | } | ||
| 206 | c1 += size; | ||
| 207 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 208 | if ( c1[0] != 'M' || c1[1] != 'U' || c1[2] != 'N' || c1[3] != 'G' | ||
| 209 | || c1[4] != 'W' || c1[5] != 'A' || c1[6] != 'L' || c1[7] != 'L' | ||
| 210 | ) { | ||
| 211 | printk(KERN_INFO "kmalloced block at %p has been corrupted (overrun):\n",v); | ||
| 212 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
| 213 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
| 214 | } | ||
| 215 | c1 += 8; | ||
| 216 | } | ||
| 217 | printk(KERN_INFO "line %d kfree(%p)\n",line,v); | ||
| 218 | v = ((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8); | ||
| 219 | kfree(v); | ||
| 220 | } | ||
| 221 | |||
| 222 | #define kmalloc(x,y) dbg_kmalloc(x,y,__LINE__) | ||
| 223 | #define kfree(x) dbg_kfree(x,__LINE__) | ||
| 224 | |||
| 225 | ==============================================================*/ | ||
| 226 | |||
| 227 | |||
| 228 | |||
| 229 | /*=============================================== | ||
| 230 | * Data Structures | ||
| 231 | *===============================================*/ | ||
| 232 | |||
| 233 | |||
| 234 | /*======================================================== | ||
| 235 | * Name: x25_channel | ||
| 236 | * | ||
| 237 | * Purpose: To hold private informaton for each | ||
| 238 | * logical channel. | ||
| 239 | * | ||
| 240 | * Rationale: Per-channel debugging is possible if each | ||
| 241 | * channel has its own private area. | ||
| 242 | * | ||
| 243 | * Assumptions: | ||
| 244 | * | ||
| 245 | * Description: This is an extention of the struct net_device | ||
| 246 | * we create for each network interface to keep | ||
| 247 | * the rest of X.25 channel-specific data. | ||
| 248 | * | ||
| 249 | * Construct: Typedef | ||
| 250 | */ | ||
| 251 | typedef struct x25_channel | ||
| 252 | { | ||
| 253 | wanpipe_common_t common; /* common area for x25api and socket */ | ||
| 254 | char name[WAN_IFNAME_SZ+1]; /* interface name, ASCIIZ */ | ||
| 255 | char addr[WAN_ADDRESS_SZ+1]; /* media address, ASCIIZ */ | ||
| 256 | unsigned tx_pkt_size; | ||
| 257 | unsigned short protocol; /* ethertype, 0 - multiplexed */ | ||
| 258 | char drop_sequence; /* mark sequence for dropping */ | ||
| 259 | unsigned long state_tick; /* time of the last state change */ | ||
| 260 | unsigned idle_timeout; /* sec, before disconnecting */ | ||
| 261 | unsigned long i_timeout_sofar; /* # of sec's we've been idle */ | ||
| 262 | unsigned hold_timeout; /* sec, before re-connecting */ | ||
| 263 | unsigned long tick_counter; /* counter for transmit time out */ | ||
| 264 | char devtint; /* Weather we should dev_tint() */ | ||
| 265 | struct sk_buff* rx_skb; /* receive socket buffer */ | ||
| 266 | struct sk_buff* tx_skb; /* transmit socket buffer */ | ||
| 267 | |||
| 268 | bh_data_t *bh_head; /* Circular buffer for x25api_bh */ | ||
| 269 | unsigned long tq_working; | ||
| 270 | volatile int bh_write; | ||
| 271 | volatile int bh_read; | ||
| 272 | atomic_t bh_buff_used; | ||
| 273 | |||
| 274 | sdla_t* card; /* -> owner */ | ||
| 275 | struct net_device *dev; /* -> bound devce */ | ||
| 276 | |||
| 277 | int ch_idx; | ||
| 278 | unsigned char enable_IPX; | ||
| 279 | unsigned long network_number; | ||
| 280 | struct net_device_stats ifstats; /* interface statistics */ | ||
| 281 | unsigned short transmit_length; | ||
| 282 | unsigned short tx_offset; | ||
| 283 | char transmit_buffer[X25_CHAN_MTU+sizeof(x25api_hdr_t)]; | ||
| 284 | |||
| 285 | if_send_stat_t if_send_stat; | ||
| 286 | rx_intr_stat_t rx_intr_stat; | ||
| 287 | pipe_mgmt_stat_t pipe_mgmt_stat; | ||
| 288 | |||
| 289 | unsigned long router_start_time; /* Router start time in seconds */ | ||
| 290 | unsigned long router_up_time; | ||
| 291 | |||
| 292 | } x25_channel_t; | ||
| 293 | |||
| 294 | /* FIXME Take this out */ | ||
| 295 | |||
| 296 | #ifdef NEX_OLD_CALL_INFO | ||
| 297 | typedef struct x25_call_info | ||
| 298 | { | ||
| 299 | char dest[17]; PACKED;/* ASCIIZ destination address */ | ||
| 300 | char src[17]; PACKED;/* ASCIIZ source address */ | ||
| 301 | char nuser; PACKED;/* number of user data bytes */ | ||
| 302 | unsigned char user[127]; PACKED;/* user data */ | ||
| 303 | char nfacil; PACKED;/* number of facilities */ | ||
| 304 | struct | ||
| 305 | { | ||
| 306 | unsigned char code; PACKED; | ||
| 307 | unsigned char parm; PACKED; | ||
| 308 | } facil[64]; /* facilities */ | ||
| 309 | } x25_call_info_t; | ||
| 310 | #else | ||
| 311 | typedef struct x25_call_info | ||
| 312 | { | ||
| 313 | char dest[MAX_X25_ADDR_SIZE] PACKED;/* ASCIIZ destination address */ | ||
| 314 | char src[MAX_X25_ADDR_SIZE] PACKED;/* ASCIIZ source address */ | ||
| 315 | unsigned char nuser PACKED; | ||
| 316 | unsigned char user[MAX_X25_DATA_SIZE] PACKED;/* user data */ | ||
| 317 | unsigned char nfacil PACKED; | ||
| 318 | unsigned char facil[MAX_X25_FACL_SIZE] PACKED; | ||
| 319 | unsigned short lcn PACKED; | ||
| 320 | } x25_call_info_t; | ||
| 321 | #endif | ||
| 322 | |||
| 323 | |||
| 324 | |||
| 325 | /*=============================================== | ||
| 326 | * Private Function Prototypes | ||
| 327 | *==============================================*/ | ||
| 328 | |||
| 329 | |||
| 330 | /*================================================= | ||
| 331 | * WAN link driver entry points. These are | ||
| 332 | * called by the WAN router module. | ||
| 333 | */ | ||
| 334 | static int update(struct wan_device* wandev); | ||
| 335 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 336 | wanif_conf_t* conf); | ||
| 337 | static int del_if(struct wan_device* wandev, struct net_device* dev); | ||
| 338 | static void disable_comm (sdla_t* card); | ||
| 339 | static void disable_comm_shutdown(sdla_t *card); | ||
| 340 | |||
| 341 | |||
| 342 | |||
| 343 | /*================================================= | ||
| 344 | * WANPIPE-specific entry points | ||
| 345 | */ | ||
| 346 | static int wpx_exec (struct sdla* card, void* u_cmd, void* u_data); | ||
| 347 | static void x25api_bh(struct net_device *dev); | ||
| 348 | static int x25api_bh_cleanup(struct net_device *dev); | ||
| 349 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb); | ||
| 350 | |||
| 351 | |||
| 352 | /*================================================= | ||
| 353 | * Network device interface | ||
| 354 | */ | ||
| 355 | static int if_init(struct net_device* dev); | ||
| 356 | static int if_open(struct net_device* dev); | ||
| 357 | static int if_close(struct net_device* dev); | ||
| 358 | static int if_header(struct sk_buff* skb, struct net_device* dev, | ||
| 359 | unsigned short type, void* daddr, void* saddr, unsigned len); | ||
| 360 | static int if_rebuild_hdr (struct sk_buff* skb); | ||
| 361 | static int if_send(struct sk_buff* skb, struct net_device* dev); | ||
| 362 | static struct net_device_stats *if_stats(struct net_device* dev); | ||
| 363 | |||
| 364 | static void if_tx_timeout(struct net_device *dev); | ||
| 365 | |||
| 366 | /*================================================= | ||
| 367 | * Interrupt handlers | ||
| 368 | */ | ||
| 369 | static void wpx_isr (sdla_t *); | ||
| 370 | static void rx_intr (sdla_t *); | ||
| 371 | static void tx_intr (sdla_t *); | ||
| 372 | static void status_intr (sdla_t *); | ||
| 373 | static void event_intr (sdla_t *); | ||
| 374 | static void spur_intr (sdla_t *); | ||
| 375 | static void timer_intr (sdla_t *); | ||
| 376 | |||
| 377 | static int tx_intr_send(sdla_t *card, struct net_device *dev); | ||
| 378 | static struct net_device *move_dev_to_next(sdla_t *card, | ||
| 379 | struct net_device *dev); | ||
| 380 | |||
| 381 | /*================================================= | ||
| 382 | * Background polling routines | ||
| 383 | */ | ||
| 384 | static void wpx_poll (sdla_t* card); | ||
| 385 | static void poll_disconnected (sdla_t* card); | ||
| 386 | static void poll_connecting (sdla_t* card); | ||
| 387 | static void poll_active (sdla_t* card); | ||
| 388 | static void trigger_x25_poll(sdla_t *card); | ||
| 389 | static void x25_timer_routine(unsigned long data); | ||
| 390 | |||
| 391 | |||
| 392 | |||
| 393 | /*================================================= | ||
| 394 | * X.25 firmware interface functions | ||
| 395 | */ | ||
| 396 | static int x25_get_version (sdla_t* card, char* str); | ||
| 397 | static int x25_configure (sdla_t* card, TX25Config* conf); | ||
| 398 | static int hdlc_configure (sdla_t* card, TX25Config* conf); | ||
| 399 | static int set_hdlc_level (sdla_t* card); | ||
| 400 | static int x25_get_err_stats (sdla_t* card); | ||
| 401 | static int x25_get_stats (sdla_t* card); | ||
| 402 | static int x25_set_intr_mode (sdla_t* card, int mode); | ||
| 403 | static int x25_close_hdlc (sdla_t* card); | ||
| 404 | static int x25_open_hdlc (sdla_t* card); | ||
| 405 | static int x25_setup_hdlc (sdla_t* card); | ||
| 406 | static int x25_set_dtr (sdla_t* card, int dtr); | ||
| 407 | static int x25_get_chan_conf (sdla_t* card, x25_channel_t* chan); | ||
| 408 | static int x25_place_call (sdla_t* card, x25_channel_t* chan); | ||
| 409 | static int x25_accept_call (sdla_t* card, int lcn, int qdm); | ||
| 410 | static int x25_clear_call (sdla_t* card, int lcn, int cause, int diagn); | ||
| 411 | static int x25_send (sdla_t* card, int lcn, int qdm, int len, void* buf); | ||
| 412 | static int x25_fetch_events (sdla_t* card); | ||
| 413 | static int x25_error (sdla_t* card, int err, int cmd, int lcn); | ||
| 414 | |||
| 415 | /*================================================= | ||
| 416 | * X.25 asynchronous event handlers | ||
| 417 | */ | ||
| 418 | static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); | ||
| 419 | static int call_accepted (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); | ||
| 420 | static int call_cleared (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); | ||
| 421 | static int timeout_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); | ||
| 422 | static int restart_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb); | ||
| 423 | |||
| 424 | |||
| 425 | /*================================================= | ||
| 426 | * Miscellaneous functions | ||
| 427 | */ | ||
| 428 | static int connect (sdla_t* card); | ||
| 429 | static int disconnect (sdla_t* card); | ||
| 430 | static struct net_device* get_dev_by_lcn(struct wan_device* wandev, | ||
| 431 | unsigned lcn); | ||
| 432 | static int chan_connect(struct net_device* dev); | ||
| 433 | static int chan_disc(struct net_device* dev); | ||
| 434 | static void set_chan_state(struct net_device* dev, int state); | ||
| 435 | static int chan_send(struct net_device *dev, void* buff, unsigned data_len, | ||
| 436 | unsigned char tx_intr); | ||
| 437 | static unsigned char bps_to_speed_code (unsigned long bps); | ||
| 438 | static unsigned int dec_to_uint (unsigned char* str, int len); | ||
| 439 | static unsigned int hex_to_uint (unsigned char*, int); | ||
| 440 | static void parse_call_info (unsigned char*, x25_call_info_t*); | ||
| 441 | static struct net_device *find_channel(sdla_t *card, unsigned lcn); | ||
| 442 | static void bind_lcn_to_dev(sdla_t *card, struct net_device *dev, unsigned lcn); | ||
| 443 | static void setup_for_delayed_transmit(struct net_device *dev, | ||
| 444 | void *buf, unsigned len); | ||
| 445 | |||
| 446 | |||
| 447 | /*================================================= | ||
| 448 | * X25 API Functions | ||
| 449 | */ | ||
| 450 | static int wanpipe_pull_data_in_skb(sdla_t *card, struct net_device *dev, | ||
| 451 | struct sk_buff **); | ||
| 452 | static void timer_intr_exec(sdla_t *, unsigned char); | ||
| 453 | static int execute_delayed_cmd(sdla_t *card, struct net_device *dev, | ||
| 454 | mbox_cmd_t *usr_cmd, char bad_cmd); | ||
| 455 | static int api_incoming_call (sdla_t*, TX25Mbox *, int); | ||
| 456 | static int alloc_and_init_skb_buf (sdla_t *,struct sk_buff **, int); | ||
| 457 | static void send_delayed_cmd_result(sdla_t *card, struct net_device *dev, | ||
| 458 | TX25Mbox* mbox); | ||
| 459 | static int clear_confirm_event (sdla_t *, TX25Mbox*); | ||
| 460 | static void send_oob_msg (sdla_t *card, struct net_device *dev, TX25Mbox *mbox); | ||
| 461 | static int timer_intr_cmd_exec(sdla_t *card); | ||
| 462 | static void api_oob_event (sdla_t *card,TX25Mbox *mbox); | ||
| 463 | static int check_bad_command(sdla_t *card, struct net_device *dev); | ||
| 464 | static int channel_disconnect(sdla_t* card, struct net_device *dev); | ||
| 465 | static void hdlc_link_down (sdla_t*); | ||
| 466 | |||
| 467 | /*================================================= | ||
| 468 | * XPIPEMON Functions | ||
| 469 | */ | ||
| 470 | static int process_udp_mgmt_pkt(sdla_t *); | ||
| 471 | static int udp_pkt_type( struct sk_buff *, sdla_t*); | ||
| 472 | static int reply_udp( unsigned char *, unsigned int); | ||
| 473 | static void init_x25_channel_struct( x25_channel_t *); | ||
| 474 | static void init_global_statistics( sdla_t *); | ||
| 475 | static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t *card, | ||
| 476 | struct net_device *dev, | ||
| 477 | struct sk_buff *skb, int lcn); | ||
| 478 | static unsigned short calc_checksum (char *, int); | ||
| 479 | |||
| 480 | |||
| 481 | |||
| 482 | /*================================================= | ||
| 483 | * IPX functions | ||
| 484 | */ | ||
| 485 | static void switch_net_numbers(unsigned char *, unsigned long, unsigned char); | ||
| 486 | static int handle_IPXWAN(unsigned char *, char *, unsigned char , | ||
| 487 | unsigned long , unsigned short ); | ||
| 488 | |||
| 489 | extern void disable_irq(unsigned int); | ||
| 490 | extern void enable_irq(unsigned int); | ||
| 491 | |||
| 492 | static void S508_S514_lock(sdla_t *, unsigned long *); | ||
| 493 | static void S508_S514_unlock(sdla_t *, unsigned long *); | ||
| 494 | |||
| 495 | |||
| 496 | /*================================================= | ||
| 497 | * Global Variables | ||
| 498 | *=================================================*/ | ||
| 499 | |||
| 500 | |||
| 501 | |||
| 502 | /*================================================= | ||
| 503 | * Public Functions | ||
| 504 | *=================================================*/ | ||
| 505 | |||
| 506 | |||
| 507 | |||
| 508 | |||
| 509 | /*=================================================================== | ||
| 510 | * wpx_init: X.25 Protocol Initialization routine. | ||
| 511 | * | ||
| 512 | * Purpose: To initialize the protocol/firmware. | ||
| 513 | * | ||
| 514 | * Rationale: This function is called by setup() function, in | ||
| 515 | * sdlamain.c, to dynamically setup the x25 protocol. | ||
| 516 | * This is the first protocol specific function, which | ||
| 517 | * executes once on startup. | ||
| 518 | * | ||
| 519 | * Description: This procedure initializes the x25 firmware and | ||
| 520 | * sets up the mailbox, transmit and receive buffer | ||
| 521 | * pointers. It also initializes all debugging structures | ||
| 522 | * and sets up the X25 environment. | ||
| 523 | * | ||
| 524 | * Sets up hardware options defined by user in [wanpipe#] | ||
| 525 | * section of wanpipe#.conf configuration file. | ||
| 526 | * | ||
| 527 | * At this point adapter is completely initialized | ||
| 528 | * and X.25 firmware is running. | ||
| 529 | * o read firmware version (to make sure it's alive) | ||
| 530 | * o configure adapter | ||
| 531 | * o initialize protocol-specific fields of the | ||
| 532 | * adapter data space. | ||
| 533 | * | ||
| 534 | * Called by: setup() function in sdlamain.c | ||
| 535 | * | ||
| 536 | * Assumptions: None | ||
| 537 | * | ||
| 538 | * Warnings: None | ||
| 539 | * | ||
| 540 | * Return: 0 o.k. | ||
| 541 | * < 0 failure. | ||
| 542 | */ | ||
| 543 | |||
| 544 | int wpx_init (sdla_t* card, wandev_conf_t* conf) | ||
| 545 | { | ||
| 546 | union{ | ||
| 547 | char str[80]; | ||
| 548 | TX25Config cfg; | ||
| 549 | } u; | ||
| 550 | |||
| 551 | /* Verify configuration ID */ | ||
| 552 | if (conf->config_id != WANCONFIG_X25){ | ||
| 553 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 554 | card->devname, conf->config_id) | ||
| 555 | ; | ||
| 556 | return -EINVAL; | ||
| 557 | } | ||
| 558 | |||
| 559 | /* Initialize protocol-specific fields */ | ||
| 560 | card->mbox = (void*)(card->hw.dpmbase + X25_MBOX_OFFS); | ||
| 561 | card->rxmb = (void*)(card->hw.dpmbase + X25_RXMBOX_OFFS); | ||
| 562 | card->flags = (void*)(card->hw.dpmbase + X25_STATUS_OFFS); | ||
| 563 | |||
| 564 | /* Initialize for S514 Card */ | ||
| 565 | if(card->hw.type == SDLA_S514) { | ||
| 566 | card->mbox += X25_MB_VECTOR; | ||
| 567 | card->flags += X25_MB_VECTOR; | ||
| 568 | card->rxmb += X25_MB_VECTOR; | ||
| 569 | } | ||
| 570 | |||
| 571 | |||
| 572 | /* Read firmware version. Note that when adapter initializes, it | ||
| 573 | * clears the mailbox, so it may appear that the first command was | ||
| 574 | * executed successfully when in fact it was merely erased. To work | ||
| 575 | * around this, we execute the first command twice. | ||
| 576 | */ | ||
| 577 | if (x25_get_version(card, NULL) || x25_get_version(card, u.str)) | ||
| 578 | return -EIO; | ||
| 579 | |||
| 580 | |||
| 581 | /* X25 firmware can run ether in X25 or LAPB HDLC mode. | ||
| 582 | * Check the user defined option and configure accordingly */ | ||
| 583 | if (conf->u.x25.LAPB_hdlc_only == WANOPT_YES){ | ||
| 584 | if (set_hdlc_level(card) != CMD_OK){ | ||
| 585 | return -EIO; | ||
| 586 | }else{ | ||
| 587 | printk(KERN_INFO "%s: running LAP_B HDLC firmware v%s\n", | ||
| 588 | card->devname, u.str); | ||
| 589 | } | ||
| 590 | card->u.x.LAPB_hdlc = 1; | ||
| 591 | }else{ | ||
| 592 | printk(KERN_INFO "%s: running X.25 firmware v%s\n", | ||
| 593 | card->devname, u.str); | ||
| 594 | card->u.x.LAPB_hdlc = 0; | ||
| 595 | } | ||
| 596 | |||
| 597 | /* Configure adapter. Here we set resonable defaults, then parse | ||
| 598 | * device configuration structure and set configuration options. | ||
| 599 | * Most configuration options are verified and corrected (if | ||
| 600 | * necessary) since we can't rely on the adapter to do so. | ||
| 601 | */ | ||
| 602 | memset(&u.cfg, 0, sizeof(u.cfg)); | ||
| 603 | u.cfg.t1 = 3; | ||
| 604 | u.cfg.n2 = 10; | ||
| 605 | u.cfg.autoHdlc = 1; /* automatic HDLC connection */ | ||
| 606 | u.cfg.hdlcWindow = 7; | ||
| 607 | u.cfg.pktWindow = 2; | ||
| 608 | u.cfg.station = 1; /* DTE */ | ||
| 609 | u.cfg.options = 0x0090; /* disable D-bit pragmatics */ | ||
| 610 | u.cfg.ccittCompat = 1988; | ||
| 611 | u.cfg.t10t20 = 30; | ||
| 612 | u.cfg.t11t21 = 30; | ||
| 613 | u.cfg.t12t22 = 30; | ||
| 614 | u.cfg.t13t23 = 30; | ||
| 615 | u.cfg.t16t26 = 30; | ||
| 616 | u.cfg.t28 = 30; | ||
| 617 | u.cfg.r10r20 = 5; | ||
| 618 | u.cfg.r12r22 = 5; | ||
| 619 | u.cfg.r13r23 = 5; | ||
| 620 | u.cfg.responseOpt = 1; /* RR's after every packet */ | ||
| 621 | |||
| 622 | if (card->u.x.LAPB_hdlc){ | ||
| 623 | u.cfg.hdlcMTU = 1027; | ||
| 624 | } | ||
| 625 | |||
| 626 | if (conf->u.x25.x25_conf_opt){ | ||
| 627 | u.cfg.options = conf->u.x25.x25_conf_opt; | ||
| 628 | } | ||
| 629 | |||
| 630 | if (conf->clocking != WANOPT_EXTERNAL) | ||
| 631 | u.cfg.baudRate = bps_to_speed_code(conf->bps); | ||
| 632 | |||
| 633 | if (conf->station != WANOPT_DTE){ | ||
| 634 | u.cfg.station = 0; /* DCE mode */ | ||
| 635 | } | ||
| 636 | |||
| 637 | if (conf->interface != WANOPT_RS232 ){ | ||
| 638 | u.cfg.hdlcOptions |= 0x80; /* V35 mode */ | ||
| 639 | } | ||
| 640 | |||
| 641 | /* adjust MTU */ | ||
| 642 | if (!conf->mtu || (conf->mtu >= 1024)) | ||
| 643 | card->wandev.mtu = 1024; | ||
| 644 | else if (conf->mtu >= 512) | ||
| 645 | card->wandev.mtu = 512; | ||
| 646 | else if (conf->mtu >= 256) | ||
| 647 | card->wandev.mtu = 256; | ||
| 648 | else if (conf->mtu >= 128) | ||
| 649 | card->wandev.mtu = 128; | ||
| 650 | else | ||
| 651 | card->wandev.mtu = 64; | ||
| 652 | |||
| 653 | u.cfg.defPktSize = u.cfg.pktMTU = card->wandev.mtu; | ||
| 654 | |||
| 655 | if (conf->u.x25.hi_pvc){ | ||
| 656 | card->u.x.hi_pvc = min_t(unsigned int, conf->u.x25.hi_pvc, MAX_LCN_NUM); | ||
| 657 | card->u.x.lo_pvc = min_t(unsigned int, conf->u.x25.lo_pvc, card->u.x.hi_pvc); | ||
| 658 | } | ||
| 659 | |||
| 660 | if (conf->u.x25.hi_svc){ | ||
| 661 | card->u.x.hi_svc = min_t(unsigned int, conf->u.x25.hi_svc, MAX_LCN_NUM); | ||
| 662 | card->u.x.lo_svc = min_t(unsigned int, conf->u.x25.lo_svc, card->u.x.hi_svc); | ||
| 663 | } | ||
| 664 | |||
| 665 | /* Figure out the total number of channels to configure */ | ||
| 666 | card->u.x.num_of_ch = 0; | ||
| 667 | if (card->u.x.hi_svc != 0){ | ||
| 668 | card->u.x.num_of_ch = (card->u.x.hi_svc - card->u.x.lo_svc) + 1; | ||
| 669 | } | ||
| 670 | if (card->u.x.hi_pvc != 0){ | ||
| 671 | card->u.x.num_of_ch += (card->u.x.hi_pvc - card->u.x.lo_pvc) + 1; | ||
| 672 | } | ||
| 673 | |||
| 674 | if (card->u.x.num_of_ch == 0){ | ||
| 675 | printk(KERN_INFO "%s: ERROR, Minimum number of PVC/SVC channels is 1 !\n" | ||
| 676 | "%s: Please set the Lowest/Highest PVC/SVC values !\n", | ||
| 677 | card->devname,card->devname); | ||
| 678 | return -ECHRNG; | ||
| 679 | } | ||
| 680 | |||
| 681 | u.cfg.loPVC = card->u.x.lo_pvc; | ||
| 682 | u.cfg.hiPVC = card->u.x.hi_pvc; | ||
| 683 | u.cfg.loTwoWaySVC = card->u.x.lo_svc; | ||
| 684 | u.cfg.hiTwoWaySVC = card->u.x.hi_svc; | ||
| 685 | |||
| 686 | if (conf->u.x25.hdlc_window) | ||
| 687 | u.cfg.hdlcWindow = min_t(unsigned int, conf->u.x25.hdlc_window, 7); | ||
| 688 | if (conf->u.x25.pkt_window) | ||
| 689 | u.cfg.pktWindow = min_t(unsigned int, conf->u.x25.pkt_window, 7); | ||
| 690 | |||
| 691 | if (conf->u.x25.t1) | ||
| 692 | u.cfg.t1 = min_t(unsigned int, conf->u.x25.t1, 30); | ||
| 693 | if (conf->u.x25.t2) | ||
| 694 | u.cfg.t2 = min_t(unsigned int, conf->u.x25.t2, 29); | ||
| 695 | if (conf->u.x25.t4) | ||
| 696 | u.cfg.t4 = min_t(unsigned int, conf->u.x25.t4, 240); | ||
| 697 | if (conf->u.x25.n2) | ||
| 698 | u.cfg.n2 = min_t(unsigned int, conf->u.x25.n2, 30); | ||
| 699 | |||
| 700 | if (conf->u.x25.t10_t20) | ||
| 701 | u.cfg.t10t20 = min_t(unsigned int, conf->u.x25.t10_t20,255); | ||
| 702 | if (conf->u.x25.t11_t21) | ||
| 703 | u.cfg.t11t21 = min_t(unsigned int, conf->u.x25.t11_t21,255); | ||
| 704 | if (conf->u.x25.t12_t22) | ||
| 705 | u.cfg.t12t22 = min_t(unsigned int, conf->u.x25.t12_t22,255); | ||
| 706 | if (conf->u.x25.t13_t23) | ||
| 707 | u.cfg.t13t23 = min_t(unsigned int, conf->u.x25.t13_t23,255); | ||
| 708 | if (conf->u.x25.t16_t26) | ||
| 709 | u.cfg.t16t26 = min_t(unsigned int, conf->u.x25.t16_t26, 255); | ||
| 710 | if (conf->u.x25.t28) | ||
| 711 | u.cfg.t28 = min_t(unsigned int, conf->u.x25.t28, 255); | ||
| 712 | |||
| 713 | if (conf->u.x25.r10_r20) | ||
| 714 | u.cfg.r10r20 = min_t(unsigned int, conf->u.x25.r10_r20,250); | ||
| 715 | if (conf->u.x25.r12_r22) | ||
| 716 | u.cfg.r12r22 = min_t(unsigned int, conf->u.x25.r12_r22,250); | ||
| 717 | if (conf->u.x25.r13_r23) | ||
| 718 | u.cfg.r13r23 = min_t(unsigned int, conf->u.x25.r13_r23,250); | ||
| 719 | |||
| 720 | |||
| 721 | if (conf->u.x25.ccitt_compat) | ||
| 722 | u.cfg.ccittCompat = conf->u.x25.ccitt_compat; | ||
| 723 | |||
| 724 | /* initialize adapter */ | ||
| 725 | if (card->u.x.LAPB_hdlc){ | ||
| 726 | if (hdlc_configure(card, &u.cfg) != CMD_OK) | ||
| 727 | return -EIO; | ||
| 728 | }else{ | ||
| 729 | if (x25_configure(card, &u.cfg) != CMD_OK) | ||
| 730 | return -EIO; | ||
| 731 | } | ||
| 732 | |||
| 733 | if ((x25_close_hdlc(card) != CMD_OK) || /* close HDLC link */ | ||
| 734 | (x25_set_dtr(card, 0) != CMD_OK)) /* drop DTR */ | ||
| 735 | return -EIO; | ||
| 736 | |||
| 737 | /* Initialize protocol-specific fields of adapter data space */ | ||
| 738 | card->wandev.bps = conf->bps; | ||
| 739 | card->wandev.interface = conf->interface; | ||
| 740 | card->wandev.clocking = conf->clocking; | ||
| 741 | card->wandev.station = conf->station; | ||
| 742 | card->isr = &wpx_isr; | ||
| 743 | card->poll = NULL; //&wpx_poll; | ||
| 744 | card->disable_comm = &disable_comm; | ||
| 745 | card->exec = &wpx_exec; | ||
| 746 | card->wandev.update = &update; | ||
| 747 | card->wandev.new_if = &new_if; | ||
| 748 | card->wandev.del_if = &del_if; | ||
| 749 | |||
| 750 | /* WARNING: This function cannot exit with an error | ||
| 751 | * after the change of state */ | ||
| 752 | card->wandev.state = WAN_DISCONNECTED; | ||
| 753 | |||
| 754 | card->wandev.enable_tx_int = 0; | ||
| 755 | card->irq_dis_if_send_count = 0; | ||
| 756 | card->irq_dis_poll_count = 0; | ||
| 757 | card->u.x.tx_dev = NULL; | ||
| 758 | card->u.x.no_dev = 0; | ||
| 759 | |||
| 760 | |||
| 761 | /* Configure for S514 PCI Card */ | ||
| 762 | if (card->hw.type == SDLA_S514) { | ||
| 763 | card->u.x.hdlc_buf_status = | ||
| 764 | (volatile unsigned char *) | ||
| 765 | (card->hw.dpmbase + X25_MB_VECTOR+ X25_MISC_HDLC_BITS); | ||
| 766 | }else{ | ||
| 767 | card->u.x.hdlc_buf_status = | ||
| 768 | (volatile unsigned char *)(card->hw.dpmbase + X25_MISC_HDLC_BITS); | ||
| 769 | } | ||
| 770 | |||
| 771 | card->u.x.poll_device=NULL; | ||
| 772 | card->wandev.udp_port = conf->udp_port; | ||
| 773 | |||
| 774 | /* Enable or disable call setup logging */ | ||
| 775 | if (conf->u.x25.logging == WANOPT_YES){ | ||
| 776 | printk(KERN_INFO "%s: Enabling Call Logging.\n", | ||
| 777 | card->devname); | ||
| 778 | card->u.x.logging = 1; | ||
| 779 | }else{ | ||
| 780 | card->u.x.logging = 0; | ||
| 781 | } | ||
| 782 | |||
| 783 | /* Enable or disable modem status reporting */ | ||
| 784 | if (conf->u.x25.oob_on_modem == WANOPT_YES){ | ||
| 785 | printk(KERN_INFO "%s: Enabling OOB on Modem change.\n", | ||
| 786 | card->devname); | ||
| 787 | card->u.x.oob_on_modem = 1; | ||
| 788 | }else{ | ||
| 789 | card->u.x.oob_on_modem = 0; | ||
| 790 | } | ||
| 791 | |||
| 792 | init_global_statistics(card); | ||
| 793 | |||
| 794 | INIT_WORK(&card->u.x.x25_poll_work, (void *)wpx_poll, card); | ||
| 795 | |||
| 796 | init_timer(&card->u.x.x25_timer); | ||
| 797 | card->u.x.x25_timer.data = (unsigned long)card; | ||
| 798 | card->u.x.x25_timer.function = x25_timer_routine; | ||
| 799 | |||
| 800 | return 0; | ||
| 801 | } | ||
| 802 | |||
| 803 | /*========================================================= | ||
| 804 | * WAN Device Driver Entry Points | ||
| 805 | *========================================================*/ | ||
| 806 | |||
| 807 | /*============================================================ | ||
| 808 | * Name: update(), Update device status & statistics. | ||
| 809 | * | ||
| 810 | * Purpose: To provide debugging and statitical | ||
| 811 | * information to the /proc file system. | ||
| 812 | * /proc/net/wanrouter/wanpipe# | ||
| 813 | * | ||
| 814 | * Rationale: The /proc file system is used to collect | ||
| 815 | * information about the kernel and drivers. | ||
| 816 | * Using the /proc file system the user | ||
| 817 | * can see exactly what the sangoma drivers are | ||
| 818 | * doing. And in what state they are in. | ||
| 819 | * | ||
| 820 | * Description: Collect all driver statistical information | ||
| 821 | * and pass it to the top laywer. | ||
| 822 | * | ||
| 823 | * Since we have to execute a debugging command, | ||
| 824 | * to obtain firmware statitics, we trigger a | ||
| 825 | * UPDATE function within the timer interrtup. | ||
| 826 | * We wait until the timer update is complete. | ||
| 827 | * Once complete return the appropriate return | ||
| 828 | * code to indicate that the update was successful. | ||
| 829 | * | ||
| 830 | * Called by: device_stat() in wanmain.c | ||
| 831 | * | ||
| 832 | * Assumptions: | ||
| 833 | * | ||
| 834 | * Warnings: This function will degrade the performance | ||
| 835 | * of the router, since it uses the mailbox. | ||
| 836 | * | ||
| 837 | * Return: 0 OK | ||
| 838 | * <0 Failed (or busy). | ||
| 839 | */ | ||
| 840 | |||
| 841 | static int update(struct wan_device* wandev) | ||
| 842 | { | ||
| 843 | volatile sdla_t* card; | ||
| 844 | TX25Status* status; | ||
| 845 | unsigned long timeout; | ||
| 846 | |||
| 847 | /* sanity checks */ | ||
| 848 | if ((wandev == NULL) || (wandev->private == NULL)) | ||
| 849 | return -EFAULT; | ||
| 850 | |||
| 851 | if (wandev->state == WAN_UNCONFIGURED) | ||
| 852 | return -ENODEV; | ||
| 853 | |||
| 854 | if (test_bit(SEND_CRIT, (void*)&wandev->critical)) | ||
| 855 | return -EAGAIN; | ||
| 856 | |||
| 857 | if (!wandev->dev) | ||
| 858 | return -ENODEV; | ||
| 859 | |||
| 860 | card = wandev->private; | ||
| 861 | status = card->flags; | ||
| 862 | |||
| 863 | card->u.x.timer_int_enabled |= TMR_INT_ENABLED_UPDATE; | ||
| 864 | status->imask |= INTR_ON_TIMER; | ||
| 865 | timeout = jiffies; | ||
| 866 | |||
| 867 | for (;;){ | ||
| 868 | if (!(card->u.x.timer_int_enabled & TMR_INT_ENABLED_UPDATE)){ | ||
| 869 | break; | ||
| 870 | } | ||
| 871 | if (time_after(jiffies, timeout + 1*HZ)){ | ||
| 872 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; | ||
| 873 | return -EAGAIN; | ||
| 874 | } | ||
| 875 | } | ||
| 876 | return 0; | ||
| 877 | } | ||
| 878 | |||
| 879 | |||
| 880 | /*=================================================================== | ||
| 881 | * Name: new_if | ||
| 882 | * | ||
| 883 | * Purpose: To allocate and initialize resources for a | ||
| 884 | * new logical channel. | ||
| 885 | * | ||
| 886 | * Rationale: A new channel can be added dynamically via | ||
| 887 | * ioctl call. | ||
| 888 | * | ||
| 889 | * Description: Allocate a private channel structure, x25_channel_t. | ||
| 890 | * Parse the user interface options from wanpipe#.conf | ||
| 891 | * configuration file. | ||
| 892 | * Bind the private are into the network device private | ||
| 893 | * area pointer (dev->priv). | ||
| 894 | * Prepare the network device structure for registration. | ||
| 895 | * | ||
| 896 | * Called by: ROUTER_IFNEW Ioctl call, from wanrouter_ioctl() | ||
| 897 | * (wanmain.c) | ||
| 898 | * | ||
| 899 | * Assumptions: None | ||
| 900 | * | ||
| 901 | * Warnings: None | ||
| 902 | * | ||
| 903 | * Return: 0 Ok | ||
| 904 | * <0 Failed (channel will not be created) | ||
| 905 | */ | ||
| 906 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 907 | wanif_conf_t* conf) | ||
| 908 | { | ||
| 909 | sdla_t* card = wandev->private; | ||
| 910 | x25_channel_t* chan; | ||
| 911 | int err = 0; | ||
| 912 | |||
| 913 | if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)){ | ||
| 914 | printk(KERN_INFO "%s: invalid interface name!\n", | ||
| 915 | card->devname); | ||
| 916 | return -EINVAL; | ||
| 917 | } | ||
| 918 | |||
| 919 | if(card->wandev.new_if_cnt++ > 0 && card->u.x.LAPB_hdlc) { | ||
| 920 | printk(KERN_INFO "%s: Error: Running LAPB HDLC Mode !\n", | ||
| 921 | card->devname); | ||
| 922 | printk(KERN_INFO | ||
| 923 | "%s: Maximum number of network interfaces must be one !\n", | ||
| 924 | card->devname); | ||
| 925 | return -EEXIST; | ||
| 926 | } | ||
| 927 | |||
| 928 | /* allocate and initialize private data */ | ||
| 929 | chan = kmalloc(sizeof(x25_channel_t), GFP_ATOMIC); | ||
| 930 | if (chan == NULL){ | ||
| 931 | return -ENOMEM; | ||
| 932 | } | ||
| 933 | |||
| 934 | memset(chan, 0, sizeof(x25_channel_t)); | ||
| 935 | |||
| 936 | /* Bug Fix: Seg Err on PVC startup | ||
| 937 | * It must be here since bind_lcn_to_dev expects | ||
| 938 | * it bellow */ | ||
| 939 | dev->priv = chan; | ||
| 940 | |||
| 941 | strcpy(chan->name, conf->name); | ||
| 942 | chan->card = card; | ||
| 943 | chan->dev = dev; | ||
| 944 | chan->common.sk = NULL; | ||
| 945 | chan->common.func = NULL; | ||
| 946 | chan->common.rw_bind = 0; | ||
| 947 | chan->tx_skb = chan->rx_skb = NULL; | ||
| 948 | |||
| 949 | /* verify media address */ | ||
| 950 | if (conf->addr[0] == '@'){ /* SVC */ | ||
| 951 | chan->common.svc = 1; | ||
| 952 | strncpy(chan->addr, &conf->addr[1], WAN_ADDRESS_SZ); | ||
| 953 | |||
| 954 | /* Set channel timeouts (default if not specified) */ | ||
| 955 | chan->idle_timeout = (conf->idle_timeout) ? | ||
| 956 | conf->idle_timeout : 90; | ||
| 957 | chan->hold_timeout = (conf->hold_timeout) ? | ||
| 958 | conf->hold_timeout : 10; | ||
| 959 | |||
| 960 | }else if (isdigit(conf->addr[0])){ /* PVC */ | ||
| 961 | int lcn = dec_to_uint(conf->addr, 0); | ||
| 962 | |||
| 963 | if ((lcn >= card->u.x.lo_pvc) && (lcn <= card->u.x.hi_pvc)){ | ||
| 964 | bind_lcn_to_dev (card, dev, lcn); | ||
| 965 | }else{ | ||
| 966 | printk(KERN_ERR | ||
| 967 | "%s: PVC %u is out of range on interface %s!\n", | ||
| 968 | wandev->name, lcn, chan->name); | ||
| 969 | err = -EINVAL; | ||
| 970 | } | ||
| 971 | }else{ | ||
| 972 | printk(KERN_ERR | ||
| 973 | "%s: invalid media address on interface %s!\n", | ||
| 974 | wandev->name, chan->name); | ||
| 975 | err = -EINVAL; | ||
| 976 | } | ||
| 977 | |||
| 978 | if(strcmp(conf->usedby, "WANPIPE") == 0){ | ||
| 979 | printk(KERN_INFO "%s: Running in WANPIPE mode %s\n", | ||
| 980 | wandev->name, chan->name); | ||
| 981 | chan->common.usedby = WANPIPE; | ||
| 982 | chan->protocol = htons(ETH_P_IP); | ||
| 983 | |||
| 984 | }else if(strcmp(conf->usedby, "API") == 0){ | ||
| 985 | chan->common.usedby = API; | ||
| 986 | printk(KERN_INFO "%s: Running in API mode %s\n", | ||
| 987 | wandev->name, chan->name); | ||
| 988 | chan->protocol = htons(X25_PROT); | ||
| 989 | } | ||
| 990 | |||
| 991 | |||
| 992 | if (err){ | ||
| 993 | kfree(chan); | ||
| 994 | dev->priv = NULL; | ||
| 995 | return err; | ||
| 996 | } | ||
| 997 | |||
| 998 | chan->enable_IPX = conf->enable_IPX; | ||
| 999 | |||
| 1000 | if (chan->enable_IPX) | ||
| 1001 | chan->protocol = htons(ETH_P_IPX); | ||
| 1002 | |||
| 1003 | if (conf->network_number) | ||
| 1004 | chan->network_number = conf->network_number; | ||
| 1005 | else | ||
| 1006 | chan->network_number = 0xDEADBEEF; | ||
| 1007 | |||
| 1008 | /* prepare network device data space for registration */ | ||
| 1009 | strcpy(dev->name,chan->name); | ||
| 1010 | |||
| 1011 | dev->init = &if_init; | ||
| 1012 | |||
| 1013 | init_x25_channel_struct(chan); | ||
| 1014 | |||
| 1015 | return 0; | ||
| 1016 | } | ||
| 1017 | |||
| 1018 | /*=================================================================== | ||
| 1019 | * Name: del_if(), Remove a logical channel. | ||
| 1020 | * | ||
| 1021 | * Purpose: To dynamically remove a logical channel. | ||
| 1022 | * | ||
| 1023 | * Rationale: Each logical channel should be dynamically | ||
| 1024 | * removable. This functin is called by an | ||
| 1025 | * IOCTL_IFDEL ioctl call or shutdown(). | ||
| 1026 | * | ||
| 1027 | * Description: Do nothing. | ||
| 1028 | * | ||
| 1029 | * Called by: IOCTL_IFDEL : wanrouter_ioctl() from wanmain.c | ||
| 1030 | * shutdown() from sdlamain.c | ||
| 1031 | * | ||
| 1032 | * Assumptions: | ||
| 1033 | * | ||
| 1034 | * Warnings: | ||
| 1035 | * | ||
| 1036 | * Return: 0 Ok. Void function. | ||
| 1037 | */ | ||
| 1038 | |||
| 1039 | //FIXME Del IF Should be taken out now. | ||
| 1040 | |||
| 1041 | static int del_if(struct wan_device* wandev, struct net_device* dev) | ||
| 1042 | { | ||
| 1043 | return 0; | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | |||
| 1047 | /*============================================================ | ||
| 1048 | * Name: wpx_exec | ||
| 1049 | * | ||
| 1050 | * Description: Execute adapter interface command. | ||
| 1051 | * This option is currently dissabled. | ||
| 1052 | *===========================================================*/ | ||
| 1053 | |||
| 1054 | static int wpx_exec (struct sdla* card, void* u_cmd, void* u_data) | ||
| 1055 | { | ||
| 1056 | return 0; | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | /*============================================================ | ||
| 1060 | * Name: disable_comm | ||
| 1061 | * | ||
| 1062 | * Description: Disable communications during shutdown. | ||
| 1063 | * Dont check return code because there is | ||
| 1064 | * nothing we can do about it. | ||
| 1065 | * | ||
| 1066 | * Warning: Dev and private areas are gone at this point. | ||
| 1067 | *===========================================================*/ | ||
| 1068 | |||
| 1069 | static void disable_comm(sdla_t* card) | ||
| 1070 | { | ||
| 1071 | disable_comm_shutdown(card); | ||
| 1072 | del_timer(&card->u.x.x25_timer); | ||
| 1073 | return; | ||
| 1074 | } | ||
| 1075 | |||
| 1076 | |||
| 1077 | /*============================================================ | ||
| 1078 | * Network Device Interface | ||
| 1079 | *===========================================================*/ | ||
| 1080 | |||
| 1081 | /*=================================================================== | ||
| 1082 | * Name: if_init(), Netowrk Interface Initialization | ||
| 1083 | * | ||
| 1084 | * Purpose: To initialize a network interface device structure. | ||
| 1085 | * | ||
| 1086 | * Rationale: During network interface startup, the if_init | ||
| 1087 | * is called by the kernel to initialize the | ||
| 1088 | * netowrk device structure. Thus a driver | ||
| 1089 | * can customze a network device. | ||
| 1090 | * | ||
| 1091 | * Description: Initialize the netowrk device call back | ||
| 1092 | * routines. This is where we tell the kernel | ||
| 1093 | * which function to use when it wants to send | ||
| 1094 | * via our interface. | ||
| 1095 | * Furthermore, we initialize the device flags, | ||
| 1096 | * MTU and physical address of the board. | ||
| 1097 | * | ||
| 1098 | * Called by: Kernel (/usr/src/linux/net/core/dev.c) | ||
| 1099 | * (dev->init()) | ||
| 1100 | * | ||
| 1101 | * Assumptions: None | ||
| 1102 | * | ||
| 1103 | * Warnings: None | ||
| 1104 | * | ||
| 1105 | * Return: 0 Ok : Void function. | ||
| 1106 | */ | ||
| 1107 | static int if_init(struct net_device* dev) | ||
| 1108 | { | ||
| 1109 | x25_channel_t* chan = dev->priv; | ||
| 1110 | sdla_t* card = chan->card; | ||
| 1111 | struct wan_device* wandev = &card->wandev; | ||
| 1112 | |||
| 1113 | /* Initialize device driver entry points */ | ||
| 1114 | dev->open = &if_open; | ||
| 1115 | dev->stop = &if_close; | ||
| 1116 | dev->hard_header = &if_header; | ||
| 1117 | dev->rebuild_header = &if_rebuild_hdr; | ||
| 1118 | dev->hard_start_xmit = &if_send; | ||
| 1119 | dev->get_stats = &if_stats; | ||
| 1120 | dev->tx_timeout = &if_tx_timeout; | ||
| 1121 | dev->watchdog_timeo = TX_TIMEOUT; | ||
| 1122 | |||
| 1123 | /* Initialize media-specific parameters */ | ||
| 1124 | dev->type = ARPHRD_PPP; /* ARP h/w type */ | ||
| 1125 | dev->flags |= IFF_POINTOPOINT; | ||
| 1126 | dev->flags |= IFF_NOARP; | ||
| 1127 | |||
| 1128 | if (chan->common.usedby == API){ | ||
| 1129 | dev->mtu = X25_CHAN_MTU+sizeof(x25api_hdr_t); | ||
| 1130 | }else{ | ||
| 1131 | dev->mtu = card->wandev.mtu; | ||
| 1132 | } | ||
| 1133 | |||
| 1134 | dev->hard_header_len = X25_HRDHDR_SZ; /* media header length */ | ||
| 1135 | dev->addr_len = 2; /* hardware address length */ | ||
| 1136 | |||
| 1137 | if (!chan->common.svc){ | ||
| 1138 | *(unsigned short*)dev->dev_addr = htons(chan->common.lcn); | ||
| 1139 | } | ||
| 1140 | |||
| 1141 | /* Initialize hardware parameters (just for reference) */ | ||
| 1142 | dev->irq = wandev->irq; | ||
| 1143 | dev->dma = wandev->dma; | ||
| 1144 | dev->base_addr = wandev->ioport; | ||
| 1145 | dev->mem_start = (unsigned long)wandev->maddr; | ||
| 1146 | dev->mem_end = wandev->maddr + wandev->msize - 1; | ||
| 1147 | |||
| 1148 | /* Set transmit buffer queue length */ | ||
| 1149 | dev->tx_queue_len = 100; | ||
| 1150 | SET_MODULE_OWNER(dev); | ||
| 1151 | |||
| 1152 | /* FIXME Why are we doing this */ | ||
| 1153 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 1154 | return 0; | ||
| 1155 | } | ||
| 1156 | |||
| 1157 | |||
| 1158 | /*=================================================================== | ||
| 1159 | * Name: if_open(), Open/Bring up the Netowrk Interface | ||
| 1160 | * | ||
| 1161 | * Purpose: To bring up a network interface. | ||
| 1162 | * | ||
| 1163 | * Rationale: | ||
| 1164 | * | ||
| 1165 | * Description: Open network interface. | ||
| 1166 | * o prevent module from unloading by incrementing use count | ||
| 1167 | * o if link is disconnected then initiate connection | ||
| 1168 | * | ||
| 1169 | * Called by: Kernel (/usr/src/linux/net/core/dev.c) | ||
| 1170 | * (dev->open()) | ||
| 1171 | * | ||
| 1172 | * Assumptions: None | ||
| 1173 | * | ||
| 1174 | * Warnings: None | ||
| 1175 | * | ||
| 1176 | * Return: 0 Ok | ||
| 1177 | * <0 Failure: Interface will not come up. | ||
| 1178 | */ | ||
| 1179 | |||
| 1180 | static int if_open(struct net_device* dev) | ||
| 1181 | { | ||
| 1182 | x25_channel_t* chan = dev->priv; | ||
| 1183 | sdla_t* card = chan->card; | ||
| 1184 | struct timeval tv; | ||
| 1185 | unsigned long smp_flags; | ||
| 1186 | |||
| 1187 | if (netif_running(dev)) | ||
| 1188 | return -EBUSY; | ||
| 1189 | |||
| 1190 | chan->tq_working = 0; | ||
| 1191 | |||
| 1192 | /* Initialize the workqueue */ | ||
| 1193 | INIT_WORK(&chan->common.wanpipe_work, (void *)x25api_bh, dev); | ||
| 1194 | |||
| 1195 | /* Allocate and initialize BH circular buffer */ | ||
| 1196 | /* Add 1 to MAX_BH_BUFF so we don't have test with (MAX_BH_BUFF-1) */ | ||
| 1197 | chan->bh_head = kmalloc((sizeof(bh_data_t)*(MAX_BH_BUFF+1)),GFP_ATOMIC); | ||
| 1198 | |||
| 1199 | if (chan->bh_head == NULL){ | ||
| 1200 | printk(KERN_INFO "%s: ERROR, failed to allocate memory ! BH_BUFFERS !\n", | ||
| 1201 | card->devname); | ||
| 1202 | |||
| 1203 | return -ENOBUFS; | ||
| 1204 | } | ||
| 1205 | memset(chan->bh_head,0,(sizeof(bh_data_t)*(MAX_BH_BUFF+1))); | ||
| 1206 | atomic_set(&chan->bh_buff_used, 0); | ||
| 1207 | |||
| 1208 | /* Increment the number of interfaces */ | ||
| 1209 | ++card->u.x.no_dev; | ||
| 1210 | |||
| 1211 | wanpipe_open(card); | ||
| 1212 | |||
| 1213 | /* LAPB protocol only uses one interface, thus | ||
| 1214 | * start the protocol after it comes up. */ | ||
| 1215 | if (card->u.x.LAPB_hdlc){ | ||
| 1216 | if (card->open_cnt == 1){ | ||
| 1217 | TX25Status* status = card->flags; | ||
| 1218 | S508_S514_lock(card, &smp_flags); | ||
| 1219 | x25_set_intr_mode(card, INTR_ON_TIMER); | ||
| 1220 | status->imask &= ~INTR_ON_TIMER; | ||
| 1221 | S508_S514_unlock(card, &smp_flags); | ||
| 1222 | } | ||
| 1223 | }else{ | ||
| 1224 | /* X25 can have multiple interfaces thus, start the | ||
| 1225 | * protocol once all interfaces are up */ | ||
| 1226 | |||
| 1227 | //FIXME: There is a bug here. If interface is | ||
| 1228 | //brought down and up, it will try to enable comm. | ||
| 1229 | if (card->open_cnt == card->u.x.num_of_ch){ | ||
| 1230 | |||
| 1231 | S508_S514_lock(card, &smp_flags); | ||
| 1232 | connect(card); | ||
| 1233 | S508_S514_unlock(card, &smp_flags); | ||
| 1234 | |||
| 1235 | mod_timer(&card->u.x.x25_timer, jiffies + HZ); | ||
| 1236 | } | ||
| 1237 | } | ||
| 1238 | /* Device is not up until the we are in connected state */ | ||
| 1239 | do_gettimeofday( &tv ); | ||
| 1240 | chan->router_start_time = tv.tv_sec; | ||
| 1241 | |||
| 1242 | netif_start_queue(dev); | ||
| 1243 | |||
| 1244 | return 0; | ||
| 1245 | } | ||
| 1246 | |||
| 1247 | /*=================================================================== | ||
| 1248 | * Name: if_close(), Close/Bring down the Netowrk Interface | ||
| 1249 | * | ||
| 1250 | * Purpose: To bring down a network interface. | ||
| 1251 | * | ||
| 1252 | * Rationale: | ||
| 1253 | * | ||
| 1254 | * Description: Close network interface. | ||
| 1255 | * o decrement use module use count | ||
| 1256 | * | ||
| 1257 | * Called by: Kernel (/usr/src/linux/net/core/dev.c) | ||
| 1258 | * (dev->close()) | ||
| 1259 | * ifconfig <name> down: will trigger the kernel | ||
| 1260 | * which will call this function. | ||
| 1261 | * | ||
| 1262 | * Assumptions: None | ||
| 1263 | * | ||
| 1264 | * Warnings: None | ||
| 1265 | * | ||
| 1266 | * Return: 0 Ok | ||
| 1267 | * <0 Failure: Interface will not exit properly. | ||
| 1268 | */ | ||
| 1269 | static int if_close(struct net_device* dev) | ||
| 1270 | { | ||
| 1271 | x25_channel_t* chan = dev->priv; | ||
| 1272 | sdla_t* card = chan->card; | ||
| 1273 | unsigned long smp_flags; | ||
| 1274 | |||
| 1275 | netif_stop_queue(dev); | ||
| 1276 | |||
| 1277 | if ((chan->common.state == WAN_CONNECTED) || | ||
| 1278 | (chan->common.state == WAN_CONNECTING)){ | ||
| 1279 | S508_S514_lock(card, &smp_flags); | ||
| 1280 | chan_disc(dev); | ||
| 1281 | S508_S514_unlock(card, &smp_flags); | ||
| 1282 | } | ||
| 1283 | |||
| 1284 | wanpipe_close(card); | ||
| 1285 | |||
| 1286 | S508_S514_lock(card, &smp_flags); | ||
| 1287 | if (chan->bh_head){ | ||
| 1288 | int i; | ||
| 1289 | struct sk_buff *skb; | ||
| 1290 | |||
| 1291 | for (i=0; i<(MAX_BH_BUFF+1); i++){ | ||
| 1292 | skb = ((bh_data_t *)&chan->bh_head[i])->skb; | ||
| 1293 | if (skb != NULL){ | ||
| 1294 | dev_kfree_skb_any(skb); | ||
| 1295 | } | ||
| 1296 | } | ||
| 1297 | kfree(chan->bh_head); | ||
| 1298 | chan->bh_head=NULL; | ||
| 1299 | } | ||
| 1300 | S508_S514_unlock(card, &smp_flags); | ||
| 1301 | |||
| 1302 | /* If this is the last close, disconnect physical link */ | ||
| 1303 | if (!card->open_cnt){ | ||
| 1304 | S508_S514_lock(card, &smp_flags); | ||
| 1305 | disconnect(card); | ||
| 1306 | x25_set_intr_mode(card, 0); | ||
| 1307 | S508_S514_unlock(card, &smp_flags); | ||
| 1308 | } | ||
| 1309 | |||
| 1310 | /* Decrement the number of interfaces */ | ||
| 1311 | --card->u.x.no_dev; | ||
| 1312 | return 0; | ||
| 1313 | } | ||
| 1314 | |||
| 1315 | /*====================================================================== | ||
| 1316 | * Build media header. | ||
| 1317 | * o encapsulate packet according to encapsulation type. | ||
| 1318 | * | ||
| 1319 | * The trick here is to put packet type (Ethertype) into 'protocol' | ||
| 1320 | * field of the socket buffer, so that we don't forget it. | ||
| 1321 | * If encapsulation fails, set skb->protocol to 0 and discard | ||
| 1322 | * packet later. | ||
| 1323 | * | ||
| 1324 | * Return: media header length. | ||
| 1325 | *======================================================================*/ | ||
| 1326 | |||
| 1327 | static int if_header(struct sk_buff* skb, struct net_device* dev, | ||
| 1328 | unsigned short type, void* daddr, void* saddr, | ||
| 1329 | unsigned len) | ||
| 1330 | { | ||
| 1331 | x25_channel_t* chan = dev->priv; | ||
| 1332 | int hdr_len = dev->hard_header_len; | ||
| 1333 | |||
| 1334 | skb->protocol = htons(type); | ||
| 1335 | if (!chan->protocol){ | ||
| 1336 | hdr_len = wanrouter_encapsulate(skb, dev, type); | ||
| 1337 | if (hdr_len < 0){ | ||
| 1338 | hdr_len = 0; | ||
| 1339 | skb->protocol = htons(0); | ||
| 1340 | } | ||
| 1341 | } | ||
| 1342 | return hdr_len; | ||
| 1343 | } | ||
| 1344 | |||
| 1345 | /*=============================================================== | ||
| 1346 | * Re-build media header. | ||
| 1347 | * | ||
| 1348 | * Return: 1 physical address resolved. | ||
| 1349 | * 0 physical address not resolved | ||
| 1350 | *==============================================================*/ | ||
| 1351 | |||
| 1352 | static int if_rebuild_hdr (struct sk_buff* skb) | ||
| 1353 | { | ||
| 1354 | struct net_device *dev = skb->dev; | ||
| 1355 | x25_channel_t* chan = dev->priv; | ||
| 1356 | sdla_t* card = chan->card; | ||
| 1357 | |||
| 1358 | printk(KERN_INFO "%s: rebuild_header() called for interface %s!\n", | ||
| 1359 | card->devname, dev->name); | ||
| 1360 | return 1; | ||
| 1361 | } | ||
| 1362 | |||
| 1363 | |||
| 1364 | /*============================================================================ | ||
| 1365 | * Handle transmit timeout event from netif watchdog | ||
| 1366 | */ | ||
| 1367 | static void if_tx_timeout(struct net_device *dev) | ||
| 1368 | { | ||
| 1369 | x25_channel_t* chan = dev->priv; | ||
| 1370 | sdla_t *card = chan->card; | ||
| 1371 | |||
| 1372 | /* If our device stays busy for at least 5 seconds then we will | ||
| 1373 | * kick start the device by making dev->tbusy = 0. We expect | ||
| 1374 | * that our device never stays busy more than 5 seconds. So this | ||
| 1375 | * is only used as a last resort. | ||
| 1376 | */ | ||
| 1377 | |||
| 1378 | ++chan->if_send_stat.if_send_tbusy_timeout; | ||
| 1379 | printk (KERN_INFO "%s: Transmit timed out on %s\n", | ||
| 1380 | card->devname, dev->name); | ||
| 1381 | netif_wake_queue (dev); | ||
| 1382 | } | ||
| 1383 | |||
| 1384 | |||
| 1385 | /*========================================================================= | ||
| 1386 | * Send a packet on a network interface. | ||
| 1387 | * o set tbusy flag (marks start of the transmission). | ||
| 1388 | * o check link state. If link is not up, then drop the packet. | ||
| 1389 | * o check channel status. If it's down then initiate a call. | ||
| 1390 | * o pass a packet to corresponding WAN device. | ||
| 1391 | * o free socket buffer | ||
| 1392 | * | ||
| 1393 | * Return: 0 complete (socket buffer must be freed) | ||
| 1394 | * non-0 packet may be re-transmitted (tbusy must be set) | ||
| 1395 | * | ||
| 1396 | * Notes: | ||
| 1397 | * 1. This routine is called either by the protocol stack or by the "net | ||
| 1398 | * bottom half" (with interrupts enabled). | ||
| 1399 | * 2. Setting tbusy flag will inhibit further transmit requests from the | ||
| 1400 | * protocol stack and can be used for flow control with protocol layer. | ||
| 1401 | * | ||
| 1402 | *========================================================================*/ | ||
| 1403 | |||
| 1404 | static int if_send(struct sk_buff* skb, struct net_device* dev) | ||
| 1405 | { | ||
| 1406 | x25_channel_t* chan = dev->priv; | ||
| 1407 | sdla_t* card = chan->card; | ||
| 1408 | TX25Status* status = card->flags; | ||
| 1409 | int udp_type; | ||
| 1410 | unsigned long smp_flags=0; | ||
| 1411 | |||
| 1412 | ++chan->if_send_stat.if_send_entry; | ||
| 1413 | |||
| 1414 | netif_stop_queue(dev); | ||
| 1415 | |||
| 1416 | /* No need to check frame length, since socket code | ||
| 1417 | * will perform the check for us */ | ||
| 1418 | |||
| 1419 | chan->tick_counter = jiffies; | ||
| 1420 | |||
| 1421 | /* Critical region starts here */ | ||
| 1422 | S508_S514_lock(card, &smp_flags); | ||
| 1423 | |||
| 1424 | if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)){ | ||
| 1425 | printk(KERN_INFO "Hit critical in if_send()! %lx\n",card->wandev.critical); | ||
| 1426 | goto if_send_crit_exit; | ||
| 1427 | } | ||
| 1428 | |||
| 1429 | udp_type = udp_pkt_type(skb, card); | ||
| 1430 | |||
| 1431 | if(udp_type != UDP_INVALID_TYPE) { | ||
| 1432 | |||
| 1433 | if(store_udp_mgmt_pkt(udp_type, UDP_PKT_FRM_STACK, card, dev, skb, | ||
| 1434 | chan->common.lcn)) { | ||
| 1435 | |||
| 1436 | status->imask |= INTR_ON_TIMER; | ||
| 1437 | if (udp_type == UDP_XPIPE_TYPE){ | ||
| 1438 | chan->if_send_stat.if_send_PIPE_request++; | ||
| 1439 | } | ||
| 1440 | } | ||
| 1441 | netif_start_queue(dev); | ||
| 1442 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 1443 | S508_S514_unlock(card, &smp_flags); | ||
| 1444 | return 0; | ||
| 1445 | } | ||
| 1446 | |||
| 1447 | if (chan->transmit_length){ | ||
| 1448 | //FIXME: This check doesn't make sense any more | ||
| 1449 | if (chan->common.state != WAN_CONNECTED){ | ||
| 1450 | chan->transmit_length=0; | ||
| 1451 | atomic_set(&chan->common.driver_busy,0); | ||
| 1452 | }else{ | ||
| 1453 | netif_stop_queue(dev); | ||
| 1454 | ++card->u.x.tx_interrupts_pending; | ||
| 1455 | status->imask |= INTR_ON_TX_FRAME; | ||
| 1456 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 1457 | S508_S514_unlock(card, &smp_flags); | ||
| 1458 | return 1; | ||
| 1459 | } | ||
| 1460 | } | ||
| 1461 | |||
| 1462 | if (card->wandev.state != WAN_CONNECTED){ | ||
| 1463 | ++chan->ifstats.tx_dropped; | ||
| 1464 | ++card->wandev.stats.tx_dropped; | ||
| 1465 | ++chan->if_send_stat.if_send_wan_disconnected; | ||
| 1466 | |||
| 1467 | }else if ( chan->protocol && (chan->protocol != skb->protocol)){ | ||
| 1468 | printk(KERN_INFO | ||
| 1469 | "%s: unsupported Ethertype 0x%04X on interface %s!\n", | ||
| 1470 | chan->name, htons(skb->protocol), dev->name); | ||
| 1471 | |||
| 1472 | printk(KERN_INFO "PROTO %Xn", htons(chan->protocol)); | ||
| 1473 | ++chan->ifstats.tx_errors; | ||
| 1474 | ++chan->ifstats.tx_dropped; | ||
| 1475 | ++card->wandev.stats.tx_dropped; | ||
| 1476 | ++chan->if_send_stat.if_send_protocol_error; | ||
| 1477 | |||
| 1478 | }else switch (chan->common.state){ | ||
| 1479 | |||
| 1480 | case WAN_DISCONNECTED: | ||
| 1481 | /* Try to establish connection. If succeded, then start | ||
| 1482 | * transmission, else drop a packet. | ||
| 1483 | */ | ||
| 1484 | if (chan->common.usedby == API){ | ||
| 1485 | ++chan->ifstats.tx_dropped; | ||
| 1486 | ++card->wandev.stats.tx_dropped; | ||
| 1487 | break; | ||
| 1488 | }else{ | ||
| 1489 | if (chan_connect(dev) != 0){ | ||
| 1490 | ++chan->ifstats.tx_dropped; | ||
| 1491 | ++card->wandev.stats.tx_dropped; | ||
| 1492 | break; | ||
| 1493 | } | ||
| 1494 | } | ||
| 1495 | /* fall through */ | ||
| 1496 | |||
| 1497 | case WAN_CONNECTED: | ||
| 1498 | if( skb->protocol == htons(ETH_P_IPX)) { | ||
| 1499 | if(chan->enable_IPX) { | ||
| 1500 | switch_net_numbers( skb->data, | ||
| 1501 | chan->network_number, 0); | ||
| 1502 | } else { | ||
| 1503 | ++card->wandev.stats.tx_dropped; | ||
| 1504 | ++chan->ifstats.tx_dropped; | ||
| 1505 | ++chan->if_send_stat.if_send_protocol_error; | ||
| 1506 | goto if_send_crit_exit; | ||
| 1507 | } | ||
| 1508 | } | ||
| 1509 | /* We never drop here, if cannot send than, copy | ||
| 1510 | * a packet into a transmit buffer | ||
| 1511 | */ | ||
| 1512 | chan_send(dev, skb->data, skb->len, 0); | ||
| 1513 | break; | ||
| 1514 | |||
| 1515 | default: | ||
| 1516 | ++chan->ifstats.tx_dropped; | ||
| 1517 | ++card->wandev.stats.tx_dropped; | ||
| 1518 | break; | ||
| 1519 | } | ||
| 1520 | |||
| 1521 | |||
| 1522 | if_send_crit_exit: | ||
| 1523 | |||
| 1524 | dev_kfree_skb_any(skb); | ||
| 1525 | |||
| 1526 | netif_start_queue(dev); | ||
| 1527 | clear_bit(SEND_CRIT,(void*)&card->wandev.critical); | ||
| 1528 | S508_S514_unlock(card, &smp_flags); | ||
| 1529 | return 0; | ||
| 1530 | } | ||
| 1531 | |||
| 1532 | /*============================================================================ | ||
| 1533 | * Setup so that a frame can be transmitted on the occurrence of a transmit | ||
| 1534 | * interrupt. | ||
| 1535 | *===========================================================================*/ | ||
| 1536 | |||
| 1537 | static void setup_for_delayed_transmit(struct net_device* dev, void* buf, | ||
| 1538 | unsigned len) | ||
| 1539 | { | ||
| 1540 | x25_channel_t* chan = dev->priv; | ||
| 1541 | sdla_t* card = chan->card; | ||
| 1542 | TX25Status* status = card->flags; | ||
| 1543 | |||
| 1544 | ++chan->if_send_stat.if_send_adptr_bfrs_full; | ||
| 1545 | |||
| 1546 | if(chan->transmit_length) { | ||
| 1547 | printk(KERN_INFO "%s: Error, transmit length set in delayed transmit!\n", | ||
| 1548 | card->devname); | ||
| 1549 | return; | ||
| 1550 | } | ||
| 1551 | |||
| 1552 | if (chan->common.usedby == API){ | ||
| 1553 | if (len > X25_CHAN_MTU+sizeof(x25api_hdr_t)) { | ||
| 1554 | ++chan->ifstats.tx_dropped; | ||
| 1555 | ++card->wandev.stats.tx_dropped; | ||
| 1556 | printk(KERN_INFO "%s: Length is too big for delayed transmit\n", | ||
| 1557 | card->devname); | ||
| 1558 | return; | ||
| 1559 | } | ||
| 1560 | }else{ | ||
| 1561 | if (len > X25_MAX_DATA) { | ||
| 1562 | ++chan->ifstats.tx_dropped; | ||
| 1563 | ++card->wandev.stats.tx_dropped; | ||
| 1564 | printk(KERN_INFO "%s: Length is too big for delayed transmit\n", | ||
| 1565 | card->devname); | ||
| 1566 | return; | ||
| 1567 | } | ||
| 1568 | } | ||
| 1569 | |||
| 1570 | chan->transmit_length = len; | ||
| 1571 | atomic_set(&chan->common.driver_busy,1); | ||
| 1572 | memcpy(chan->transmit_buffer, buf, len); | ||
| 1573 | |||
| 1574 | ++chan->if_send_stat.if_send_tx_int_enabled; | ||
| 1575 | |||
| 1576 | /* Enable Transmit Interrupt */ | ||
| 1577 | ++card->u.x.tx_interrupts_pending; | ||
| 1578 | status->imask |= INTR_ON_TX_FRAME; | ||
| 1579 | } | ||
| 1580 | |||
| 1581 | |||
| 1582 | /*=============================================================== | ||
| 1583 | * net_device_stats | ||
| 1584 | * | ||
| 1585 | * Get ethernet-style interface statistics. | ||
| 1586 | * Return a pointer to struct enet_statistics. | ||
| 1587 | * | ||
| 1588 | *==============================================================*/ | ||
| 1589 | static struct net_device_stats *if_stats(struct net_device* dev) | ||
| 1590 | { | ||
| 1591 | x25_channel_t *chan = dev->priv; | ||
| 1592 | |||
| 1593 | if(chan == NULL) | ||
| 1594 | return NULL; | ||
| 1595 | |||
| 1596 | return &chan->ifstats; | ||
| 1597 | } | ||
| 1598 | |||
| 1599 | |||
| 1600 | /* | ||
| 1601 | * Interrupt Handlers | ||
| 1602 | */ | ||
| 1603 | |||
| 1604 | /* | ||
| 1605 | * X.25 Interrupt Service Routine. | ||
| 1606 | */ | ||
| 1607 | |||
| 1608 | static void wpx_isr (sdla_t* card) | ||
| 1609 | { | ||
| 1610 | TX25Status* status = card->flags; | ||
| 1611 | |||
| 1612 | card->in_isr = 1; | ||
| 1613 | ++card->statistics.isr_entry; | ||
| 1614 | |||
| 1615 | if (test_bit(PERI_CRIT,(void*)&card->wandev.critical)){ | ||
| 1616 | card->in_isr=0; | ||
| 1617 | status->iflags = 0; | ||
| 1618 | return; | ||
| 1619 | } | ||
| 1620 | |||
| 1621 | if (test_bit(SEND_CRIT, (void*)&card->wandev.critical)){ | ||
| 1622 | |||
| 1623 | printk(KERN_INFO "%s: wpx_isr: wandev.critical set to 0x%02lx, int type = 0x%02x\n", | ||
| 1624 | card->devname, card->wandev.critical, status->iflags); | ||
| 1625 | card->in_isr = 0; | ||
| 1626 | status->iflags = 0; | ||
| 1627 | return; | ||
| 1628 | } | ||
| 1629 | |||
| 1630 | /* For all interrupts set the critical flag to CRITICAL_RX_INTR. | ||
| 1631 | * If the if_send routine is called with this flag set it will set | ||
| 1632 | * the enable transmit flag to 1. (for a delayed interrupt) | ||
| 1633 | */ | ||
| 1634 | switch (status->iflags){ | ||
| 1635 | |||
| 1636 | case RX_INTR_PENDING: /* receive interrupt */ | ||
| 1637 | rx_intr(card); | ||
| 1638 | break; | ||
| 1639 | |||
| 1640 | case TX_INTR_PENDING: /* transmit interrupt */ | ||
| 1641 | tx_intr(card); | ||
| 1642 | break; | ||
| 1643 | |||
| 1644 | case MODEM_INTR_PENDING: /* modem status interrupt */ | ||
| 1645 | status_intr(card); | ||
| 1646 | break; | ||
| 1647 | |||
| 1648 | case X25_ASY_TRANS_INTR_PENDING: /* network event interrupt */ | ||
| 1649 | event_intr(card); | ||
| 1650 | break; | ||
| 1651 | |||
| 1652 | case TIMER_INTR_PENDING: | ||
| 1653 | timer_intr(card); | ||
| 1654 | break; | ||
| 1655 | |||
| 1656 | default: /* unwanted interrupt */ | ||
| 1657 | spur_intr(card); | ||
| 1658 | } | ||
| 1659 | |||
| 1660 | card->in_isr = 0; | ||
| 1661 | status->iflags = 0; /* clear interrupt condition */ | ||
| 1662 | } | ||
| 1663 | |||
| 1664 | /* | ||
| 1665 | * Receive interrupt handler. | ||
| 1666 | * This routine handles fragmented IP packets using M-bit according to the | ||
| 1667 | * RFC1356. | ||
| 1668 | * o map ligical channel number to network interface. | ||
| 1669 | * o allocate socket buffer or append received packet to the existing one. | ||
| 1670 | * o if M-bit is reset (i.e. it's the last packet in a sequence) then | ||
| 1671 | * decapsulate packet and pass socket buffer to the protocol stack. | ||
| 1672 | * | ||
| 1673 | * Notes: | ||
| 1674 | * 1. When allocating a socket buffer, if M-bit is set then more data is | ||
| 1675 | * coming and we have to allocate buffer for the maximum IP packet size | ||
| 1676 | * expected on this channel. | ||
| 1677 | * 2. If something goes wrong and X.25 packet has to be dropped (e.g. no | ||
| 1678 | * socket buffers available) the whole packet sequence must be discarded. | ||
| 1679 | */ | ||
| 1680 | |||
| 1681 | static void rx_intr (sdla_t* card) | ||
| 1682 | { | ||
| 1683 | TX25Mbox* rxmb = card->rxmb; | ||
| 1684 | unsigned lcn = rxmb->cmd.lcn; | ||
| 1685 | struct net_device* dev = find_channel(card,lcn); | ||
| 1686 | x25_channel_t* chan; | ||
| 1687 | struct sk_buff* skb=NULL; | ||
| 1688 | |||
| 1689 | if (dev == NULL){ | ||
| 1690 | /* Invalid channel, discard packet */ | ||
| 1691 | printk(KERN_INFO "%s: receiving on orphaned LCN %d!\n", | ||
| 1692 | card->devname, lcn); | ||
| 1693 | return; | ||
| 1694 | } | ||
| 1695 | |||
| 1696 | chan = dev->priv; | ||
| 1697 | chan->i_timeout_sofar = jiffies; | ||
| 1698 | |||
| 1699 | |||
| 1700 | /* Copy the data from the board, into an | ||
| 1701 | * skb buffer | ||
| 1702 | */ | ||
| 1703 | if (wanpipe_pull_data_in_skb(card,dev,&skb)){ | ||
| 1704 | ++chan->ifstats.rx_dropped; | ||
| 1705 | ++card->wandev.stats.rx_dropped; | ||
| 1706 | ++chan->rx_intr_stat.rx_intr_no_socket; | ||
| 1707 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 1708 | return; | ||
| 1709 | } | ||
| 1710 | |||
| 1711 | dev->last_rx = jiffies; /* timestamp */ | ||
| 1712 | |||
| 1713 | |||
| 1714 | /* ------------ API ----------------*/ | ||
| 1715 | |||
| 1716 | if (chan->common.usedby == API){ | ||
| 1717 | |||
| 1718 | if (bh_enqueue(dev, skb)){ | ||
| 1719 | ++chan->ifstats.rx_dropped; | ||
| 1720 | ++card->wandev.stats.rx_dropped; | ||
| 1721 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 1722 | dev_kfree_skb_any(skb); | ||
| 1723 | return; | ||
| 1724 | } | ||
| 1725 | |||
| 1726 | ++chan->ifstats.rx_packets; | ||
| 1727 | chan->ifstats.rx_bytes += skb->len; | ||
| 1728 | |||
| 1729 | |||
| 1730 | chan->rx_skb = NULL; | ||
| 1731 | if (!test_and_set_bit(0, &chan->tq_working)){ | ||
| 1732 | wanpipe_queue_work(&chan->common.wanpipe_work); | ||
| 1733 | } | ||
| 1734 | return; | ||
| 1735 | } | ||
| 1736 | |||
| 1737 | |||
| 1738 | /* ------------- WANPIPE -------------------*/ | ||
| 1739 | |||
| 1740 | /* set rx_skb to NULL so we won't access it later when kernel already owns it */ | ||
| 1741 | chan->rx_skb=NULL; | ||
| 1742 | |||
| 1743 | /* Decapsulate packet, if necessary */ | ||
| 1744 | if (!skb->protocol && !wanrouter_type_trans(skb, dev)){ | ||
| 1745 | /* can't decapsulate packet */ | ||
| 1746 | dev_kfree_skb_any(skb); | ||
| 1747 | ++chan->ifstats.rx_errors; | ||
| 1748 | ++chan->ifstats.rx_dropped; | ||
| 1749 | ++card->wandev.stats.rx_dropped; | ||
| 1750 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 1751 | |||
| 1752 | }else{ | ||
| 1753 | if( handle_IPXWAN(skb->data, chan->name, | ||
| 1754 | chan->enable_IPX, chan->network_number, | ||
| 1755 | skb->protocol)){ | ||
| 1756 | |||
| 1757 | if( chan->enable_IPX ){ | ||
| 1758 | if(chan_send(dev, skb->data, skb->len,0)){ | ||
| 1759 | chan->tx_skb = skb; | ||
| 1760 | }else{ | ||
| 1761 | dev_kfree_skb_any(skb); | ||
| 1762 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 1763 | } | ||
| 1764 | }else{ | ||
| 1765 | /* increment IPX packet dropped statistic */ | ||
| 1766 | ++chan->ifstats.rx_dropped; | ||
| 1767 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 1768 | } | ||
| 1769 | }else{ | ||
| 1770 | skb->mac.raw = skb->data; | ||
| 1771 | chan->ifstats.rx_bytes += skb->len; | ||
| 1772 | ++chan->ifstats.rx_packets; | ||
| 1773 | ++chan->rx_intr_stat.rx_intr_bfr_passed_to_stack; | ||
| 1774 | netif_rx(skb); | ||
| 1775 | } | ||
| 1776 | } | ||
| 1777 | |||
| 1778 | return; | ||
| 1779 | } | ||
| 1780 | |||
| 1781 | |||
| 1782 | static int wanpipe_pull_data_in_skb(sdla_t *card, struct net_device *dev, | ||
| 1783 | struct sk_buff **skb) | ||
| 1784 | { | ||
| 1785 | void *bufptr; | ||
| 1786 | TX25Mbox* rxmb = card->rxmb; | ||
| 1787 | unsigned len = rxmb->cmd.length; /* packet length */ | ||
| 1788 | unsigned qdm = rxmb->cmd.qdm; /* Q,D and M bits */ | ||
| 1789 | x25_channel_t *chan = dev->priv; | ||
| 1790 | struct sk_buff *new_skb = *skb; | ||
| 1791 | |||
| 1792 | if (chan->common.usedby == WANPIPE){ | ||
| 1793 | if (chan->drop_sequence){ | ||
| 1794 | if (!(qdm & 0x01)){ | ||
| 1795 | chan->drop_sequence = 0; | ||
| 1796 | } | ||
| 1797 | return 1; | ||
| 1798 | } | ||
| 1799 | new_skb = chan->rx_skb; | ||
| 1800 | }else{ | ||
| 1801 | /* Add on the API header to the received | ||
| 1802 | * data | ||
| 1803 | */ | ||
| 1804 | len += sizeof(x25api_hdr_t); | ||
| 1805 | } | ||
| 1806 | |||
| 1807 | if (new_skb == NULL){ | ||
| 1808 | int bufsize; | ||
| 1809 | |||
| 1810 | if (chan->common.usedby == WANPIPE){ | ||
| 1811 | bufsize = (qdm & 0x01) ? dev->mtu : len; | ||
| 1812 | }else{ | ||
| 1813 | bufsize = len; | ||
| 1814 | } | ||
| 1815 | |||
| 1816 | /* Allocate new socket buffer */ | ||
| 1817 | new_skb = dev_alloc_skb(bufsize + dev->hard_header_len); | ||
| 1818 | if (new_skb == NULL){ | ||
| 1819 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 1820 | card->devname); | ||
| 1821 | chan->drop_sequence = 1; /* set flag */ | ||
| 1822 | ++chan->ifstats.rx_dropped; | ||
| 1823 | return 1; | ||
| 1824 | } | ||
| 1825 | } | ||
| 1826 | |||
| 1827 | if (skb_tailroom(new_skb) < len){ | ||
| 1828 | /* No room for the packet. Call off the whole thing! */ | ||
| 1829 | dev_kfree_skb_any(new_skb); | ||
| 1830 | if (chan->common.usedby == WANPIPE){ | ||
| 1831 | chan->rx_skb = NULL; | ||
| 1832 | if (qdm & 0x01){ | ||
| 1833 | chan->drop_sequence = 1; | ||
| 1834 | } | ||
| 1835 | } | ||
| 1836 | |||
| 1837 | printk(KERN_INFO "%s: unexpectedly long packet sequence " | ||
| 1838 | "on interface %s!\n", card->devname, dev->name); | ||
| 1839 | ++chan->ifstats.rx_length_errors; | ||
| 1840 | return 1; | ||
| 1841 | } | ||
| 1842 | |||
| 1843 | bufptr = skb_put(new_skb,len); | ||
| 1844 | |||
| 1845 | |||
| 1846 | if (chan->common.usedby == API){ | ||
| 1847 | /* Fill in the x25api header | ||
| 1848 | */ | ||
| 1849 | x25api_t * api_data = (x25api_t*)bufptr; | ||
| 1850 | api_data->hdr.qdm = rxmb->cmd.qdm; | ||
| 1851 | api_data->hdr.cause = rxmb->cmd.cause; | ||
| 1852 | api_data->hdr.diagn = rxmb->cmd.diagn; | ||
| 1853 | api_data->hdr.length = rxmb->cmd.length; | ||
| 1854 | memcpy(api_data->data, rxmb->data, rxmb->cmd.length); | ||
| 1855 | }else{ | ||
| 1856 | memcpy(bufptr, rxmb->data, len); | ||
| 1857 | } | ||
| 1858 | |||
| 1859 | new_skb->dev = dev; | ||
| 1860 | |||
| 1861 | if (chan->common.usedby == API){ | ||
| 1862 | new_skb->mac.raw = new_skb->data; | ||
| 1863 | new_skb->protocol = htons(X25_PROT); | ||
| 1864 | new_skb->pkt_type = WAN_PACKET_DATA; | ||
| 1865 | }else{ | ||
| 1866 | new_skb->protocol = chan->protocol; | ||
| 1867 | chan->rx_skb = new_skb; | ||
| 1868 | } | ||
| 1869 | |||
| 1870 | /* If qdm bit is set, more data is coming | ||
| 1871 | * thus, exit and wait for more data before | ||
| 1872 | * sending the packet up. (Used by router only) | ||
| 1873 | */ | ||
| 1874 | if ((qdm & 0x01) && (chan->common.usedby == WANPIPE)) | ||
| 1875 | return 1; | ||
| 1876 | |||
| 1877 | *skb = new_skb; | ||
| 1878 | |||
| 1879 | return 0; | ||
| 1880 | } | ||
| 1881 | |||
| 1882 | /*=============================================================== | ||
| 1883 | * tx_intr | ||
| 1884 | * | ||
| 1885 | * Transmit interrupt handler. | ||
| 1886 | * For each dev, check that there is something to send. | ||
| 1887 | * If data available, transmit. | ||
| 1888 | * | ||
| 1889 | *===============================================================*/ | ||
| 1890 | |||
| 1891 | static void tx_intr (sdla_t* card) | ||
| 1892 | { | ||
| 1893 | struct net_device *dev; | ||
| 1894 | TX25Status* status = card->flags; | ||
| 1895 | unsigned char more_to_tx=0; | ||
| 1896 | x25_channel_t *chan=NULL; | ||
| 1897 | int i=0; | ||
| 1898 | |||
| 1899 | if (card->u.x.tx_dev == NULL){ | ||
| 1900 | card->u.x.tx_dev = card->wandev.dev; | ||
| 1901 | } | ||
| 1902 | |||
| 1903 | dev = card->u.x.tx_dev; | ||
| 1904 | |||
| 1905 | for (;;){ | ||
| 1906 | |||
| 1907 | chan = dev->priv; | ||
| 1908 | if (chan->transmit_length){ | ||
| 1909 | /* Device was set to transmit, check if the TX | ||
| 1910 | * buffers are available | ||
| 1911 | */ | ||
| 1912 | if (chan->common.state != WAN_CONNECTED){ | ||
| 1913 | chan->transmit_length = 0; | ||
| 1914 | atomic_set(&chan->common.driver_busy,0); | ||
| 1915 | chan->tx_offset=0; | ||
| 1916 | if (netif_queue_stopped(dev)){ | ||
| 1917 | if (chan->common.usedby == API){ | ||
| 1918 | netif_start_queue(dev); | ||
| 1919 | wakeup_sk_bh(dev); | ||
| 1920 | }else{ | ||
| 1921 | netif_wake_queue(dev); | ||
| 1922 | } | ||
| 1923 | } | ||
| 1924 | dev = move_dev_to_next(card,dev); | ||
| 1925 | break; | ||
| 1926 | } | ||
| 1927 | |||
| 1928 | if ((status->cflags[chan->ch_idx] & 0x40 || card->u.x.LAPB_hdlc) && | ||
| 1929 | (*card->u.x.hdlc_buf_status & 0x40) ){ | ||
| 1930 | /* Tx buffer available, we can send */ | ||
| 1931 | |||
| 1932 | if (tx_intr_send(card, dev)){ | ||
| 1933 | more_to_tx=1; | ||
| 1934 | } | ||
| 1935 | |||
| 1936 | /* If more than one interface present, move the | ||
| 1937 | * device pointer to the next interface, so on the | ||
| 1938 | * next TX interrupt we will try sending from it. | ||
| 1939 | */ | ||
| 1940 | dev = move_dev_to_next(card,dev); | ||
| 1941 | break; | ||
| 1942 | }else{ | ||
| 1943 | /* Tx buffers not available, but device set | ||
| 1944 | * the TX interrupt. Set more_to_tx and try | ||
| 1945 | * to transmit for other devices. | ||
| 1946 | */ | ||
| 1947 | more_to_tx=1; | ||
| 1948 | dev = move_dev_to_next(card,dev); | ||
| 1949 | } | ||
| 1950 | |||
| 1951 | }else{ | ||
| 1952 | /* This device was not set to transmit, | ||
| 1953 | * go to next | ||
| 1954 | */ | ||
| 1955 | dev = move_dev_to_next(card,dev); | ||
| 1956 | } | ||
| 1957 | |||
| 1958 | if (++i == card->u.x.no_dev){ | ||
| 1959 | if (!more_to_tx){ | ||
| 1960 | DBG_PRINTK(KERN_INFO "%s: Nothing to Send in TX INTR\n", | ||
| 1961 | card->devname); | ||
| 1962 | } | ||
| 1963 | break; | ||
| 1964 | } | ||
| 1965 | |||
| 1966 | } //End of FOR | ||
| 1967 | |||
| 1968 | card->u.x.tx_dev = dev; | ||
| 1969 | |||
| 1970 | if (!more_to_tx){ | ||
| 1971 | /* if any other interfaces have transmit interrupts pending, */ | ||
| 1972 | /* do not disable the global transmit interrupt */ | ||
| 1973 | if (!(--card->u.x.tx_interrupts_pending)){ | ||
| 1974 | status->imask &= ~INTR_ON_TX_FRAME; | ||
| 1975 | } | ||
| 1976 | } | ||
| 1977 | return; | ||
| 1978 | } | ||
| 1979 | |||
| 1980 | /*=============================================================== | ||
| 1981 | * move_dev_to_next | ||
| 1982 | * | ||
| 1983 | * | ||
| 1984 | *===============================================================*/ | ||
| 1985 | |||
| 1986 | |||
| 1987 | struct net_device *move_dev_to_next(sdla_t *card, struct net_device *dev) | ||
| 1988 | { | ||
| 1989 | if (card->u.x.no_dev != 1){ | ||
| 1990 | if (!*((struct net_device **)dev->priv)) | ||
| 1991 | return card->wandev.dev; | ||
| 1992 | else | ||
| 1993 | return *((struct net_device **)dev->priv); | ||
| 1994 | } | ||
| 1995 | return dev; | ||
| 1996 | } | ||
| 1997 | |||
| 1998 | /*=============================================================== | ||
| 1999 | * tx_intr_send | ||
| 2000 | * | ||
| 2001 | * | ||
| 2002 | *===============================================================*/ | ||
| 2003 | |||
| 2004 | static int tx_intr_send(sdla_t *card, struct net_device *dev) | ||
| 2005 | { | ||
| 2006 | x25_channel_t* chan = dev->priv; | ||
| 2007 | |||
| 2008 | if (chan_send (dev,chan->transmit_buffer,chan->transmit_length,1)){ | ||
| 2009 | |||
| 2010 | /* Packet was split up due to its size, do not disable | ||
| 2011 | * tx_intr | ||
| 2012 | */ | ||
| 2013 | return 1; | ||
| 2014 | } | ||
| 2015 | |||
| 2016 | chan->transmit_length=0; | ||
| 2017 | atomic_set(&chan->common.driver_busy,0); | ||
| 2018 | chan->tx_offset=0; | ||
| 2019 | |||
| 2020 | /* If we are in API mode, wakeup the | ||
| 2021 | * sock BH handler, not the NET_BH */ | ||
| 2022 | if (netif_queue_stopped(dev)){ | ||
| 2023 | if (chan->common.usedby == API){ | ||
| 2024 | netif_start_queue(dev); | ||
| 2025 | wakeup_sk_bh(dev); | ||
| 2026 | }else{ | ||
| 2027 | netif_wake_queue(dev); | ||
| 2028 | } | ||
| 2029 | } | ||
| 2030 | return 0; | ||
| 2031 | } | ||
| 2032 | |||
| 2033 | |||
| 2034 | /*=============================================================== | ||
| 2035 | * timer_intr | ||
| 2036 | * | ||
| 2037 | * Timer interrupt handler. | ||
| 2038 | * Check who called the timer interrupt and perform | ||
| 2039 | * action accordingly. | ||
| 2040 | * | ||
| 2041 | *===============================================================*/ | ||
| 2042 | |||
| 2043 | static void timer_intr (sdla_t *card) | ||
| 2044 | { | ||
| 2045 | TX25Status* status = card->flags; | ||
| 2046 | |||
| 2047 | if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_CMD_EXEC){ | ||
| 2048 | |||
| 2049 | if (timer_intr_cmd_exec(card) == 0){ | ||
| 2050 | card->u.x.timer_int_enabled &= | ||
| 2051 | ~TMR_INT_ENABLED_CMD_EXEC; | ||
| 2052 | } | ||
| 2053 | |||
| 2054 | }else if(card->u.x.timer_int_enabled & TMR_INT_ENABLED_UDP_PKT) { | ||
| 2055 | |||
| 2056 | if ((*card->u.x.hdlc_buf_status & 0x40) && | ||
| 2057 | card->u.x.udp_type == UDP_XPIPE_TYPE){ | ||
| 2058 | |||
| 2059 | if(process_udp_mgmt_pkt(card)) { | ||
| 2060 | card->u.x.timer_int_enabled &= | ||
| 2061 | ~TMR_INT_ENABLED_UDP_PKT; | ||
| 2062 | } | ||
| 2063 | } | ||
| 2064 | |||
| 2065 | }else if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_POLL_ACTIVE) { | ||
| 2066 | |||
| 2067 | struct net_device *dev = card->u.x.poll_device; | ||
| 2068 | x25_channel_t *chan = NULL; | ||
| 2069 | |||
| 2070 | if (!dev){ | ||
| 2071 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_POLL_ACTIVE; | ||
| 2072 | return; | ||
| 2073 | } | ||
| 2074 | chan = dev->priv; | ||
| 2075 | |||
| 2076 | printk(KERN_INFO | ||
| 2077 | "%s: Closing down Idle link %s on LCN %d\n", | ||
| 2078 | card->devname,chan->name,chan->common.lcn); | ||
| 2079 | chan->i_timeout_sofar = jiffies; | ||
| 2080 | chan_disc(dev); | ||
| 2081 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_POLL_ACTIVE; | ||
| 2082 | card->u.x.poll_device=NULL; | ||
| 2083 | |||
| 2084 | }else if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_POLL_CONNECT_ON) { | ||
| 2085 | |||
| 2086 | wanpipe_set_state(card, WAN_CONNECTED); | ||
| 2087 | if (card->u.x.LAPB_hdlc){ | ||
| 2088 | struct net_device *dev = card->wandev.dev; | ||
| 2089 | set_chan_state(dev,WAN_CONNECTED); | ||
| 2090 | send_delayed_cmd_result(card,dev,card->mbox); | ||
| 2091 | } | ||
| 2092 | |||
| 2093 | /* 0x8F enable all interrupts */ | ||
| 2094 | x25_set_intr_mode(card, INTR_ON_RX_FRAME| | ||
| 2095 | INTR_ON_TX_FRAME| | ||
| 2096 | INTR_ON_MODEM_STATUS_CHANGE| | ||
| 2097 | //INTR_ON_COMMAND_COMPLETE| | ||
| 2098 | X25_ASY_TRANS_INTR_PENDING | | ||
| 2099 | INTR_ON_TIMER | | ||
| 2100 | DIRECT_RX_INTR_USAGE | ||
| 2101 | ); | ||
| 2102 | |||
| 2103 | status->imask &= ~INTR_ON_TX_FRAME; /* mask Tx interrupts */ | ||
| 2104 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_POLL_CONNECT_ON; | ||
| 2105 | |||
| 2106 | }else if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_POLL_CONNECT_OFF) { | ||
| 2107 | |||
| 2108 | //printk(KERN_INFO "Poll connect, Turning OFF\n"); | ||
| 2109 | disconnect(card); | ||
| 2110 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_POLL_CONNECT_OFF; | ||
| 2111 | |||
| 2112 | }else if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_POLL_DISCONNECT) { | ||
| 2113 | |||
| 2114 | //printk(KERN_INFO "POll disconnect, trying to connect\n"); | ||
| 2115 | connect(card); | ||
| 2116 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_POLL_DISCONNECT; | ||
| 2117 | |||
| 2118 | }else if (card->u.x.timer_int_enabled & TMR_INT_ENABLED_UPDATE){ | ||
| 2119 | |||
| 2120 | if (*card->u.x.hdlc_buf_status & 0x40){ | ||
| 2121 | x25_get_err_stats(card); | ||
| 2122 | x25_get_stats(card); | ||
| 2123 | card->u.x.timer_int_enabled &= ~TMR_INT_ENABLED_UPDATE; | ||
| 2124 | } | ||
| 2125 | } | ||
| 2126 | |||
| 2127 | if(!card->u.x.timer_int_enabled){ | ||
| 2128 | //printk(KERN_INFO "Turning Timer Off \n"); | ||
| 2129 | status->imask &= ~INTR_ON_TIMER; | ||
| 2130 | } | ||
| 2131 | } | ||
| 2132 | |||
| 2133 | /*==================================================================== | ||
| 2134 | * Modem status interrupt handler. | ||
| 2135 | *===================================================================*/ | ||
| 2136 | static void status_intr (sdla_t* card) | ||
| 2137 | { | ||
| 2138 | |||
| 2139 | /* Added to avoid Modem status message flooding */ | ||
| 2140 | static TX25ModemStatus last_stat; | ||
| 2141 | |||
| 2142 | TX25Mbox* mbox = card->mbox; | ||
| 2143 | TX25ModemStatus *modem_status; | ||
| 2144 | struct net_device *dev; | ||
| 2145 | x25_channel_t *chan; | ||
| 2146 | int err; | ||
| 2147 | |||
| 2148 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2149 | mbox->cmd.command = X25_READ_MODEM_STATUS; | ||
| 2150 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2151 | if (err){ | ||
| 2152 | x25_error(card, err, X25_READ_MODEM_STATUS, 0); | ||
| 2153 | }else{ | ||
| 2154 | |||
| 2155 | modem_status = (TX25ModemStatus*)mbox->data; | ||
| 2156 | |||
| 2157 | /* Check if the last status was the same | ||
| 2158 | * if it was, do NOT print message again */ | ||
| 2159 | |||
| 2160 | if (last_stat.status != modem_status->status){ | ||
| 2161 | |||
| 2162 | printk(KERN_INFO "%s: Modem Status Change: DCD=%s, CTS=%s\n", | ||
| 2163 | card->devname,DCD(modem_status->status),CTS(modem_status->status)); | ||
| 2164 | |||
| 2165 | last_stat.status = modem_status->status; | ||
| 2166 | |||
| 2167 | if (card->u.x.oob_on_modem){ | ||
| 2168 | |||
| 2169 | mbox->cmd.pktType = mbox->cmd.command; | ||
| 2170 | mbox->cmd.result = 0x08; | ||
| 2171 | |||
| 2172 | /* Send a OOB to all connected sockets */ | ||
| 2173 | for (dev = card->wandev.dev; dev; | ||
| 2174 | dev = *((struct net_device**)dev->priv)) { | ||
| 2175 | chan=dev->priv; | ||
| 2176 | if (chan->common.usedby == API){ | ||
| 2177 | send_oob_msg(card,dev,mbox); | ||
| 2178 | } | ||
| 2179 | } | ||
| 2180 | |||
| 2181 | /* The modem OOB message will probably kill the | ||
| 2182 | * the link. If we don't clear the flag here, | ||
| 2183 | * a deadlock could occur */ | ||
| 2184 | if (atomic_read(&card->u.x.command_busy)){ | ||
| 2185 | atomic_set(&card->u.x.command_busy,0); | ||
| 2186 | } | ||
| 2187 | } | ||
| 2188 | } | ||
| 2189 | } | ||
| 2190 | |||
| 2191 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2192 | mbox->cmd.command = X25_HDLC_LINK_STATUS; | ||
| 2193 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2194 | if (err){ | ||
| 2195 | x25_error(card, err, X25_HDLC_LINK_STATUS, 0); | ||
| 2196 | } | ||
| 2197 | |||
| 2198 | } | ||
| 2199 | |||
| 2200 | /*==================================================================== | ||
| 2201 | * Network event interrupt handler. | ||
| 2202 | *===================================================================*/ | ||
| 2203 | static void event_intr (sdla_t* card) | ||
| 2204 | { | ||
| 2205 | x25_fetch_events(card); | ||
| 2206 | } | ||
| 2207 | |||
| 2208 | /*==================================================================== | ||
| 2209 | * Spurious interrupt handler. | ||
| 2210 | * o print a warning | ||
| 2211 | * o | ||
| 2212 | *====================================================================*/ | ||
| 2213 | |||
| 2214 | static void spur_intr (sdla_t* card) | ||
| 2215 | { | ||
| 2216 | printk(KERN_INFO "%s: spurious interrupt!\n", card->devname); | ||
| 2217 | } | ||
| 2218 | |||
| 2219 | |||
| 2220 | /* | ||
| 2221 | * Background Polling Routines | ||
| 2222 | */ | ||
| 2223 | |||
| 2224 | /*==================================================================== | ||
| 2225 | * Main polling routine. | ||
| 2226 | * This routine is repeatedly called by the WANPIPE 'thread' to allow for | ||
| 2227 | * time-dependent housekeeping work. | ||
| 2228 | * | ||
| 2229 | * Notes: | ||
| 2230 | * 1. This routine may be called on interrupt context with all interrupts | ||
| 2231 | * enabled. Beware! | ||
| 2232 | *====================================================================*/ | ||
| 2233 | |||
| 2234 | static void wpx_poll (sdla_t *card) | ||
| 2235 | { | ||
| 2236 | if (!card->wandev.dev){ | ||
| 2237 | goto wpx_poll_exit; | ||
| 2238 | } | ||
| 2239 | |||
| 2240 | if (card->open_cnt != card->u.x.num_of_ch){ | ||
| 2241 | goto wpx_poll_exit; | ||
| 2242 | } | ||
| 2243 | |||
| 2244 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 2245 | goto wpx_poll_exit; | ||
| 2246 | } | ||
| 2247 | |||
| 2248 | if (test_bit(SEND_CRIT,&card->wandev.critical)){ | ||
| 2249 | goto wpx_poll_exit; | ||
| 2250 | } | ||
| 2251 | |||
| 2252 | switch(card->wandev.state){ | ||
| 2253 | case WAN_CONNECTED: | ||
| 2254 | poll_active(card); | ||
| 2255 | break; | ||
| 2256 | |||
| 2257 | case WAN_CONNECTING: | ||
| 2258 | poll_connecting(card); | ||
| 2259 | break; | ||
| 2260 | |||
| 2261 | case WAN_DISCONNECTED: | ||
| 2262 | poll_disconnected(card); | ||
| 2263 | break; | ||
| 2264 | } | ||
| 2265 | |||
| 2266 | wpx_poll_exit: | ||
| 2267 | clear_bit(POLL_CRIT,&card->wandev.critical); | ||
| 2268 | return; | ||
| 2269 | } | ||
| 2270 | |||
| 2271 | static void trigger_x25_poll(sdla_t *card) | ||
| 2272 | { | ||
| 2273 | schedule_work(&card->u.x.x25_poll_work); | ||
| 2274 | } | ||
| 2275 | |||
| 2276 | /*==================================================================== | ||
| 2277 | * Handle physical link establishment phase. | ||
| 2278 | * o if connection timed out, disconnect the link. | ||
| 2279 | *===================================================================*/ | ||
| 2280 | |||
| 2281 | static void poll_connecting (sdla_t* card) | ||
| 2282 | { | ||
| 2283 | volatile TX25Status* status = card->flags; | ||
| 2284 | |||
| 2285 | if (status->gflags & X25_HDLC_ABM){ | ||
| 2286 | |||
| 2287 | timer_intr_exec (card, TMR_INT_ENABLED_POLL_CONNECT_ON); | ||
| 2288 | |||
| 2289 | }else if ((jiffies - card->state_tick) > CONNECT_TIMEOUT){ | ||
| 2290 | |||
| 2291 | timer_intr_exec (card, TMR_INT_ENABLED_POLL_CONNECT_OFF); | ||
| 2292 | |||
| 2293 | } | ||
| 2294 | } | ||
| 2295 | |||
| 2296 | /*==================================================================== | ||
| 2297 | * Handle physical link disconnected phase. | ||
| 2298 | * o if hold-down timeout has expired and there are open interfaces, | ||
| 2299 | * connect link. | ||
| 2300 | *===================================================================*/ | ||
| 2301 | |||
| 2302 | static void poll_disconnected (sdla_t* card) | ||
| 2303 | { | ||
| 2304 | struct net_device *dev; | ||
| 2305 | x25_channel_t *chan; | ||
| 2306 | TX25Status* status = card->flags; | ||
| 2307 | |||
| 2308 | if (!card->u.x.LAPB_hdlc && card->open_cnt && | ||
| 2309 | ((jiffies - card->state_tick) > HOLD_DOWN_TIME)){ | ||
| 2310 | timer_intr_exec(card, TMR_INT_ENABLED_POLL_DISCONNECT); | ||
| 2311 | } | ||
| 2312 | |||
| 2313 | |||
| 2314 | if ((dev=card->wandev.dev) == NULL) | ||
| 2315 | return; | ||
| 2316 | |||
| 2317 | if ((chan=dev->priv) == NULL) | ||
| 2318 | return; | ||
| 2319 | |||
| 2320 | if (chan->common.usedby == API && | ||
| 2321 | atomic_read(&chan->common.command) && | ||
| 2322 | card->u.x.LAPB_hdlc){ | ||
| 2323 | |||
| 2324 | if (!(card->u.x.timer_int_enabled & TMR_INT_ENABLED_CMD_EXEC)) | ||
| 2325 | card->u.x.timer_int_enabled |= TMR_INT_ENABLED_CMD_EXEC; | ||
| 2326 | |||
| 2327 | if (!(status->imask & INTR_ON_TIMER)) | ||
| 2328 | status->imask |= INTR_ON_TIMER; | ||
| 2329 | } | ||
| 2330 | |||
| 2331 | } | ||
| 2332 | |||
| 2333 | /*==================================================================== | ||
| 2334 | * Handle active link phase. | ||
| 2335 | * o fetch X.25 asynchronous events. | ||
| 2336 | * o kick off transmission on all interfaces. | ||
| 2337 | *===================================================================*/ | ||
| 2338 | |||
| 2339 | static void poll_active (sdla_t* card) | ||
| 2340 | { | ||
| 2341 | struct net_device* dev; | ||
| 2342 | TX25Status* status = card->flags; | ||
| 2343 | |||
| 2344 | for (dev = card->wandev.dev; dev; | ||
| 2345 | dev = *((struct net_device **)dev->priv)){ | ||
| 2346 | x25_channel_t* chan = dev->priv; | ||
| 2347 | |||
| 2348 | /* If SVC has been idle long enough, close virtual circuit */ | ||
| 2349 | if ( chan->common.svc && | ||
| 2350 | chan->common.state == WAN_CONNECTED && | ||
| 2351 | chan->common.usedby == WANPIPE ){ | ||
| 2352 | |||
| 2353 | if( (jiffies - chan->i_timeout_sofar) / HZ > chan->idle_timeout ){ | ||
| 2354 | /* Close svc */ | ||
| 2355 | card->u.x.poll_device=dev; | ||
| 2356 | timer_intr_exec (card, TMR_INT_ENABLED_POLL_ACTIVE); | ||
| 2357 | } | ||
| 2358 | } | ||
| 2359 | |||
| 2360 | #ifdef PRINT_DEBUG | ||
| 2361 | chan->ifstats.tx_compressed = atomic_read(&chan->common.command); | ||
| 2362 | chan->ifstats.tx_errors = chan->common.state; | ||
| 2363 | chan->ifstats.rx_fifo_errors = atomic_read(&card->u.x.command_busy); | ||
| 2364 | ++chan->ifstats.tx_bytes; | ||
| 2365 | |||
| 2366 | chan->ifstats.rx_fifo_errors=atomic_read(&chan->common.disconnect); | ||
| 2367 | chan->ifstats.multicast=atomic_read(&chan->bh_buff_used); | ||
| 2368 | chan->ifstats.rx_length_errors=*card->u.x.hdlc_buf_status; | ||
| 2369 | #endif | ||
| 2370 | |||
| 2371 | if (chan->common.usedby == API && | ||
| 2372 | atomic_read(&chan->common.command) && | ||
| 2373 | !card->u.x.LAPB_hdlc){ | ||
| 2374 | |||
| 2375 | if (!(card->u.x.timer_int_enabled & TMR_INT_ENABLED_CMD_EXEC)) | ||
| 2376 | card->u.x.timer_int_enabled |= TMR_INT_ENABLED_CMD_EXEC; | ||
| 2377 | |||
| 2378 | if (!(status->imask & INTR_ON_TIMER)) | ||
| 2379 | status->imask |= INTR_ON_TIMER; | ||
| 2380 | } | ||
| 2381 | |||
| 2382 | if ((chan->common.usedby == API) && | ||
| 2383 | atomic_read(&chan->common.disconnect)){ | ||
| 2384 | |||
| 2385 | if (chan->common.state == WAN_DISCONNECTED){ | ||
| 2386 | atomic_set(&chan->common.disconnect,0); | ||
| 2387 | return; | ||
| 2388 | } | ||
| 2389 | |||
| 2390 | atomic_set(&chan->common.command,X25_CLEAR_CALL); | ||
| 2391 | if (!(card->u.x.timer_int_enabled & TMR_INT_ENABLED_CMD_EXEC)) | ||
| 2392 | card->u.x.timer_int_enabled |= TMR_INT_ENABLED_CMD_EXEC; | ||
| 2393 | |||
| 2394 | if (!(status->imask & INTR_ON_TIMER)) | ||
| 2395 | status->imask |= INTR_ON_TIMER; | ||
| 2396 | } | ||
| 2397 | } | ||
| 2398 | } | ||
| 2399 | |||
| 2400 | static void timer_intr_exec(sdla_t *card, unsigned char TYPE) | ||
| 2401 | { | ||
| 2402 | TX25Status* status = card->flags; | ||
| 2403 | card->u.x.timer_int_enabled |= TYPE; | ||
| 2404 | if (!(status->imask & INTR_ON_TIMER)) | ||
| 2405 | status->imask |= INTR_ON_TIMER; | ||
| 2406 | } | ||
| 2407 | |||
| 2408 | |||
| 2409 | /*==================================================================== | ||
| 2410 | * SDLA Firmware-Specific Functions | ||
| 2411 | * | ||
| 2412 | * Almost all X.25 commands can unexpetedly fail due to so called 'X.25 | ||
| 2413 | * asynchronous events' such as restart, interrupt, incoming call request, | ||
| 2414 | * call clear request, etc. They can't be ignored and have to be delt with | ||
| 2415 | * immediately. To tackle with this problem we execute each interface | ||
| 2416 | * command in a loop until good return code is received or maximum number | ||
| 2417 | * of retries is reached. Each interface command returns non-zero return | ||
| 2418 | * code, an asynchronous event/error handler x25_error() is called. | ||
| 2419 | *====================================================================*/ | ||
| 2420 | |||
| 2421 | /*==================================================================== | ||
| 2422 | * Read X.25 firmware version. | ||
| 2423 | * Put code version as ASCII string in str. | ||
| 2424 | *===================================================================*/ | ||
| 2425 | |||
| 2426 | static int x25_get_version (sdla_t* card, char* str) | ||
| 2427 | { | ||
| 2428 | TX25Mbox* mbox = card->mbox; | ||
| 2429 | int retry = MAX_CMD_RETRY; | ||
| 2430 | int err; | ||
| 2431 | |||
| 2432 | do | ||
| 2433 | { | ||
| 2434 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2435 | mbox->cmd.command = X25_READ_CODE_VERSION; | ||
| 2436 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2437 | } while (err && retry-- && | ||
| 2438 | x25_error(card, err, X25_READ_CODE_VERSION, 0)); | ||
| 2439 | |||
| 2440 | if (!err && str) | ||
| 2441 | { | ||
| 2442 | int len = mbox->cmd.length; | ||
| 2443 | |||
| 2444 | memcpy(str, mbox->data, len); | ||
| 2445 | str[len] = '\0'; | ||
| 2446 | } | ||
| 2447 | return err; | ||
| 2448 | } | ||
| 2449 | |||
| 2450 | /*==================================================================== | ||
| 2451 | * Configure adapter. | ||
| 2452 | *===================================================================*/ | ||
| 2453 | |||
| 2454 | static int x25_configure (sdla_t* card, TX25Config* conf) | ||
| 2455 | { | ||
| 2456 | TX25Mbox* mbox = card->mbox; | ||
| 2457 | int retry = MAX_CMD_RETRY; | ||
| 2458 | int err; | ||
| 2459 | |||
| 2460 | do{ | ||
| 2461 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2462 | memcpy(mbox->data, (void*)conf, sizeof(TX25Config)); | ||
| 2463 | mbox->cmd.length = sizeof(TX25Config); | ||
| 2464 | mbox->cmd.command = X25_SET_CONFIGURATION; | ||
| 2465 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2466 | } while (err && retry-- && x25_error(card, err, X25_SET_CONFIGURATION, 0)); | ||
| 2467 | return err; | ||
| 2468 | } | ||
| 2469 | |||
| 2470 | /*==================================================================== | ||
| 2471 | * Configure adapter for HDLC only. | ||
| 2472 | *===================================================================*/ | ||
| 2473 | |||
| 2474 | static int hdlc_configure (sdla_t* card, TX25Config* conf) | ||
| 2475 | { | ||
| 2476 | TX25Mbox* mbox = card->mbox; | ||
| 2477 | int retry = MAX_CMD_RETRY; | ||
| 2478 | int err; | ||
| 2479 | |||
| 2480 | do{ | ||
| 2481 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2482 | memcpy(mbox->data, (void*)conf, sizeof(TX25Config)); | ||
| 2483 | mbox->cmd.length = sizeof(TX25Config); | ||
| 2484 | mbox->cmd.command = X25_HDLC_SET_CONFIG; | ||
| 2485 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2486 | } while (err && retry-- && x25_error(card, err, X25_SET_CONFIGURATION, 0)); | ||
| 2487 | |||
| 2488 | return err; | ||
| 2489 | } | ||
| 2490 | |||
| 2491 | static int set_hdlc_level (sdla_t* card) | ||
| 2492 | { | ||
| 2493 | |||
| 2494 | TX25Mbox* mbox = card->mbox; | ||
| 2495 | int retry = MAX_CMD_RETRY; | ||
| 2496 | int err; | ||
| 2497 | |||
| 2498 | do{ | ||
| 2499 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2500 | mbox->cmd.command = SET_PROTOCOL_LEVEL; | ||
| 2501 | mbox->cmd.length = 1; | ||
| 2502 | mbox->data[0] = HDLC_LEVEL; //| DO_HDLC_LEVEL_ERROR_CHECKING; | ||
| 2503 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2504 | } while (err && retry-- && x25_error(card, err, SET_PROTOCOL_LEVEL, 0)); | ||
| 2505 | |||
| 2506 | return err; | ||
| 2507 | } | ||
| 2508 | |||
| 2509 | |||
| 2510 | |||
| 2511 | /*==================================================================== | ||
| 2512 | * Get communications error statistics. | ||
| 2513 | *====================================================================*/ | ||
| 2514 | |||
| 2515 | static int x25_get_err_stats (sdla_t* card) | ||
| 2516 | { | ||
| 2517 | TX25Mbox* mbox = card->mbox; | ||
| 2518 | int retry = MAX_CMD_RETRY; | ||
| 2519 | int err; | ||
| 2520 | |||
| 2521 | do | ||
| 2522 | { | ||
| 2523 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2524 | mbox->cmd.command = X25_HDLC_READ_COMM_ERR; | ||
| 2525 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2526 | } while (err && retry-- && x25_error(card, err, X25_HDLC_READ_COMM_ERR, 0)); | ||
| 2527 | |||
| 2528 | if (!err) | ||
| 2529 | { | ||
| 2530 | THdlcCommErr* stats = (void*)mbox->data; | ||
| 2531 | |||
| 2532 | card->wandev.stats.rx_over_errors = stats->rxOverrun; | ||
| 2533 | card->wandev.stats.rx_crc_errors = stats->rxBadCrc; | ||
| 2534 | card->wandev.stats.rx_missed_errors = stats->rxAborted; | ||
| 2535 | card->wandev.stats.tx_aborted_errors = stats->txAborted; | ||
| 2536 | } | ||
| 2537 | return err; | ||
| 2538 | } | ||
| 2539 | |||
| 2540 | /*==================================================================== | ||
| 2541 | * Get protocol statistics. | ||
| 2542 | *===================================================================*/ | ||
| 2543 | |||
| 2544 | static int x25_get_stats (sdla_t* card) | ||
| 2545 | { | ||
| 2546 | TX25Mbox* mbox = card->mbox; | ||
| 2547 | int retry = MAX_CMD_RETRY; | ||
| 2548 | int err; | ||
| 2549 | |||
| 2550 | do | ||
| 2551 | { | ||
| 2552 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2553 | mbox->cmd.command = X25_READ_STATISTICS; | ||
| 2554 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2555 | } while (err && retry-- && x25_error(card, err, X25_READ_STATISTICS, 0)) ; | ||
| 2556 | |||
| 2557 | if (!err) | ||
| 2558 | { | ||
| 2559 | TX25Stats* stats = (void*)mbox->data; | ||
| 2560 | |||
| 2561 | card->wandev.stats.rx_packets = stats->rxData; | ||
| 2562 | card->wandev.stats.tx_packets = stats->txData; | ||
| 2563 | } | ||
| 2564 | return err; | ||
| 2565 | } | ||
| 2566 | |||
| 2567 | /*==================================================================== | ||
| 2568 | * Close HDLC link. | ||
| 2569 | *===================================================================*/ | ||
| 2570 | |||
| 2571 | static int x25_close_hdlc (sdla_t* card) | ||
| 2572 | { | ||
| 2573 | TX25Mbox* mbox = card->mbox; | ||
| 2574 | int retry = MAX_CMD_RETRY; | ||
| 2575 | int err; | ||
| 2576 | |||
| 2577 | do | ||
| 2578 | { | ||
| 2579 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2580 | mbox->cmd.command = X25_HDLC_LINK_CLOSE; | ||
| 2581 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2582 | } while (err && retry-- && x25_error(card, err, X25_HDLC_LINK_CLOSE, 0)); | ||
| 2583 | |||
| 2584 | return err; | ||
| 2585 | } | ||
| 2586 | |||
| 2587 | |||
| 2588 | /*==================================================================== | ||
| 2589 | * Open HDLC link. | ||
| 2590 | *===================================================================*/ | ||
| 2591 | |||
| 2592 | static int x25_open_hdlc (sdla_t* card) | ||
| 2593 | { | ||
| 2594 | TX25Mbox* mbox = card->mbox; | ||
| 2595 | int retry = MAX_CMD_RETRY; | ||
| 2596 | int err; | ||
| 2597 | |||
| 2598 | do | ||
| 2599 | { | ||
| 2600 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2601 | mbox->cmd.command = X25_HDLC_LINK_OPEN; | ||
| 2602 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2603 | } while (err && retry-- && x25_error(card, err, X25_HDLC_LINK_OPEN, 0)); | ||
| 2604 | |||
| 2605 | return err; | ||
| 2606 | } | ||
| 2607 | |||
| 2608 | /*===================================================================== | ||
| 2609 | * Setup HDLC link. | ||
| 2610 | *====================================================================*/ | ||
| 2611 | static int x25_setup_hdlc (sdla_t* card) | ||
| 2612 | { | ||
| 2613 | TX25Mbox* mbox = card->mbox; | ||
| 2614 | int retry = MAX_CMD_RETRY; | ||
| 2615 | int err; | ||
| 2616 | |||
| 2617 | do | ||
| 2618 | { | ||
| 2619 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2620 | mbox->cmd.command = X25_HDLC_LINK_SETUP; | ||
| 2621 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2622 | } while (err && retry-- && x25_error(card, err, X25_HDLC_LINK_SETUP, 0)); | ||
| 2623 | |||
| 2624 | return err; | ||
| 2625 | } | ||
| 2626 | |||
| 2627 | /*==================================================================== | ||
| 2628 | * Set (raise/drop) DTR. | ||
| 2629 | *===================================================================*/ | ||
| 2630 | |||
| 2631 | static int x25_set_dtr (sdla_t* card, int dtr) | ||
| 2632 | { | ||
| 2633 | TX25Mbox* mbox = card->mbox; | ||
| 2634 | int retry = MAX_CMD_RETRY; | ||
| 2635 | int err; | ||
| 2636 | |||
| 2637 | do | ||
| 2638 | { | ||
| 2639 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2640 | mbox->data[0] = 0; | ||
| 2641 | mbox->data[2] = 0; | ||
| 2642 | mbox->data[1] = dtr ? 0x02 : 0x01; | ||
| 2643 | mbox->cmd.length = 3; | ||
| 2644 | mbox->cmd.command = X25_SET_GLOBAL_VARS; | ||
| 2645 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2646 | } while (err && retry-- && x25_error(card, err, X25_SET_GLOBAL_VARS, 0)); | ||
| 2647 | |||
| 2648 | return err; | ||
| 2649 | } | ||
| 2650 | |||
| 2651 | /*==================================================================== | ||
| 2652 | * Set interrupt mode. | ||
| 2653 | *===================================================================*/ | ||
| 2654 | |||
| 2655 | static int x25_set_intr_mode (sdla_t* card, int mode) | ||
| 2656 | { | ||
| 2657 | TX25Mbox* mbox = card->mbox; | ||
| 2658 | int retry = MAX_CMD_RETRY; | ||
| 2659 | int err; | ||
| 2660 | |||
| 2661 | do | ||
| 2662 | { | ||
| 2663 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2664 | mbox->data[0] = mode; | ||
| 2665 | if (card->hw.fwid == SFID_X25_508){ | ||
| 2666 | mbox->data[1] = card->hw.irq; | ||
| 2667 | mbox->data[2] = 2; | ||
| 2668 | mbox->cmd.length = 3; | ||
| 2669 | }else { | ||
| 2670 | mbox->cmd.length = 1; | ||
| 2671 | } | ||
| 2672 | mbox->cmd.command = X25_SET_INTERRUPT_MODE; | ||
| 2673 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2674 | } while (err && retry-- && x25_error(card, err, X25_SET_INTERRUPT_MODE, 0)); | ||
| 2675 | |||
| 2676 | return err; | ||
| 2677 | } | ||
| 2678 | |||
| 2679 | /*==================================================================== | ||
| 2680 | * Read X.25 channel configuration. | ||
| 2681 | *===================================================================*/ | ||
| 2682 | |||
| 2683 | static int x25_get_chan_conf (sdla_t* card, x25_channel_t* chan) | ||
| 2684 | { | ||
| 2685 | TX25Mbox* mbox = card->mbox; | ||
| 2686 | int retry = MAX_CMD_RETRY; | ||
| 2687 | int lcn = chan->common.lcn; | ||
| 2688 | int err; | ||
| 2689 | |||
| 2690 | do{ | ||
| 2691 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2692 | mbox->cmd.lcn = lcn; | ||
| 2693 | mbox->cmd.command = X25_READ_CHANNEL_CONFIG; | ||
| 2694 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2695 | } while (err && retry-- && x25_error(card, err, X25_READ_CHANNEL_CONFIG, lcn)); | ||
| 2696 | |||
| 2697 | if (!err) | ||
| 2698 | { | ||
| 2699 | TX25Status* status = card->flags; | ||
| 2700 | |||
| 2701 | /* calculate an offset into the array of status bytes */ | ||
| 2702 | if (card->u.x.hi_svc <= X25_MAX_CHAN){ | ||
| 2703 | |||
| 2704 | chan->ch_idx = lcn - 1; | ||
| 2705 | |||
| 2706 | }else{ | ||
| 2707 | int offset; | ||
| 2708 | |||
| 2709 | /* FIX: Apr 14 2000 : Nenad Corbic | ||
| 2710 | * The data field was being compared to 0x1F using | ||
| 2711 | * '&&' instead of '&'. | ||
| 2712 | * This caused X25API to fail for LCNs greater than 255. | ||
| 2713 | */ | ||
| 2714 | switch (mbox->data[0] & 0x1F) | ||
| 2715 | { | ||
| 2716 | case 0x01: | ||
| 2717 | offset = status->pvc_map; break; | ||
| 2718 | case 0x03: | ||
| 2719 | offset = status->icc_map; break; | ||
| 2720 | case 0x07: | ||
| 2721 | offset = status->twc_map; break; | ||
| 2722 | case 0x0B: | ||
| 2723 | offset = status->ogc_map; break; | ||
| 2724 | default: | ||
| 2725 | offset = 0; | ||
| 2726 | } | ||
| 2727 | chan->ch_idx = lcn - 1 - offset; | ||
| 2728 | } | ||
| 2729 | |||
| 2730 | /* get actual transmit packet size on this channel */ | ||
| 2731 | switch(mbox->data[1] & 0x38) | ||
| 2732 | { | ||
| 2733 | case 0x00: | ||
| 2734 | chan->tx_pkt_size = 16; | ||
| 2735 | break; | ||
| 2736 | case 0x08: | ||
| 2737 | chan->tx_pkt_size = 32; | ||
| 2738 | break; | ||
| 2739 | case 0x10: | ||
| 2740 | chan->tx_pkt_size = 64; | ||
| 2741 | break; | ||
| 2742 | case 0x18: | ||
| 2743 | chan->tx_pkt_size = 128; | ||
| 2744 | break; | ||
| 2745 | case 0x20: | ||
| 2746 | chan->tx_pkt_size = 256; | ||
| 2747 | break; | ||
| 2748 | case 0x28: | ||
| 2749 | chan->tx_pkt_size = 512; | ||
| 2750 | break; | ||
| 2751 | case 0x30: | ||
| 2752 | chan->tx_pkt_size = 1024; | ||
| 2753 | break; | ||
| 2754 | } | ||
| 2755 | if (card->u.x.logging) | ||
| 2756 | printk(KERN_INFO "%s: X.25 packet size on LCN %d is %d.\n", | ||
| 2757 | card->devname, lcn, chan->tx_pkt_size); | ||
| 2758 | } | ||
| 2759 | return err; | ||
| 2760 | } | ||
| 2761 | |||
| 2762 | /*==================================================================== | ||
| 2763 | * Place X.25 call. | ||
| 2764 | *====================================================================*/ | ||
| 2765 | |||
| 2766 | static int x25_place_call (sdla_t* card, x25_channel_t* chan) | ||
| 2767 | { | ||
| 2768 | TX25Mbox* mbox = card->mbox; | ||
| 2769 | int retry = MAX_CMD_RETRY; | ||
| 2770 | int err; | ||
| 2771 | char str[64]; | ||
| 2772 | |||
| 2773 | |||
| 2774 | if (chan->protocol == htons(ETH_P_IP)){ | ||
| 2775 | sprintf(str, "-d%s -uCC", chan->addr); | ||
| 2776 | |||
| 2777 | }else if (chan->protocol == htons(ETH_P_IPX)){ | ||
| 2778 | sprintf(str, "-d%s -u800000008137", chan->addr); | ||
| 2779 | |||
| 2780 | } | ||
| 2781 | |||
| 2782 | do | ||
| 2783 | { | ||
| 2784 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2785 | strcpy(mbox->data, str); | ||
| 2786 | mbox->cmd.length = strlen(str); | ||
| 2787 | mbox->cmd.command = X25_PLACE_CALL; | ||
| 2788 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2789 | } while (err && retry-- && x25_error(card, err, X25_PLACE_CALL, 0)); | ||
| 2790 | |||
| 2791 | if (!err){ | ||
| 2792 | bind_lcn_to_dev (card, chan->dev, mbox->cmd.lcn); | ||
| 2793 | } | ||
| 2794 | return err; | ||
| 2795 | } | ||
| 2796 | |||
| 2797 | /*==================================================================== | ||
| 2798 | * Accept X.25 call. | ||
| 2799 | *====================================================================*/ | ||
| 2800 | |||
| 2801 | static int x25_accept_call (sdla_t* card, int lcn, int qdm) | ||
| 2802 | { | ||
| 2803 | TX25Mbox* mbox = card->mbox; | ||
| 2804 | int retry = MAX_CMD_RETRY; | ||
| 2805 | int err; | ||
| 2806 | |||
| 2807 | do | ||
| 2808 | { | ||
| 2809 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2810 | mbox->cmd.lcn = lcn; | ||
| 2811 | mbox->cmd.qdm = qdm; | ||
| 2812 | mbox->cmd.command = X25_ACCEPT_CALL; | ||
| 2813 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2814 | } while (err && retry-- && x25_error(card, err, X25_ACCEPT_CALL, lcn)); | ||
| 2815 | |||
| 2816 | return err; | ||
| 2817 | } | ||
| 2818 | |||
| 2819 | /*==================================================================== | ||
| 2820 | * Clear X.25 call. | ||
| 2821 | *====================================================================*/ | ||
| 2822 | |||
| 2823 | static int x25_clear_call (sdla_t* card, int lcn, int cause, int diagn) | ||
| 2824 | { | ||
| 2825 | TX25Mbox* mbox = card->mbox; | ||
| 2826 | int retry = MAX_CMD_RETRY; | ||
| 2827 | int err; | ||
| 2828 | |||
| 2829 | do | ||
| 2830 | { | ||
| 2831 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2832 | mbox->cmd.lcn = lcn; | ||
| 2833 | mbox->cmd.cause = cause; | ||
| 2834 | mbox->cmd.diagn = diagn; | ||
| 2835 | mbox->cmd.command = X25_CLEAR_CALL; | ||
| 2836 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2837 | } while (err && retry-- && x25_error(card, err, X25_CLEAR_CALL, lcn)); | ||
| 2838 | |||
| 2839 | return err; | ||
| 2840 | } | ||
| 2841 | |||
| 2842 | /*==================================================================== | ||
| 2843 | * Send X.25 data packet. | ||
| 2844 | *====================================================================*/ | ||
| 2845 | |||
| 2846 | static int x25_send (sdla_t* card, int lcn, int qdm, int len, void* buf) | ||
| 2847 | { | ||
| 2848 | TX25Mbox* mbox = card->mbox; | ||
| 2849 | int retry = MAX_CMD_RETRY; | ||
| 2850 | int err; | ||
| 2851 | unsigned char cmd; | ||
| 2852 | |||
| 2853 | if (card->u.x.LAPB_hdlc) | ||
| 2854 | cmd = X25_HDLC_WRITE; | ||
| 2855 | else | ||
| 2856 | cmd = X25_WRITE; | ||
| 2857 | |||
| 2858 | do | ||
| 2859 | { | ||
| 2860 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2861 | memcpy(mbox->data, buf, len); | ||
| 2862 | mbox->cmd.length = len; | ||
| 2863 | mbox->cmd.lcn = lcn; | ||
| 2864 | |||
| 2865 | if (card->u.x.LAPB_hdlc){ | ||
| 2866 | mbox->cmd.pf = qdm; | ||
| 2867 | }else{ | ||
| 2868 | mbox->cmd.qdm = qdm; | ||
| 2869 | } | ||
| 2870 | |||
| 2871 | mbox->cmd.command = cmd; | ||
| 2872 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2873 | } while (err && retry-- && x25_error(card, err, cmd , lcn)); | ||
| 2874 | |||
| 2875 | |||
| 2876 | /* If buffers are busy the return code for LAPB HDLC is | ||
| 2877 | * 1. The above functions are looking for return code | ||
| 2878 | * of X25RES_NOT_READY if busy. */ | ||
| 2879 | |||
| 2880 | if (card->u.x.LAPB_hdlc && err == 1){ | ||
| 2881 | err = X25RES_NOT_READY; | ||
| 2882 | } | ||
| 2883 | |||
| 2884 | return err; | ||
| 2885 | } | ||
| 2886 | |||
| 2887 | /*==================================================================== | ||
| 2888 | * Fetch X.25 asynchronous events. | ||
| 2889 | *===================================================================*/ | ||
| 2890 | |||
| 2891 | static int x25_fetch_events (sdla_t* card) | ||
| 2892 | { | ||
| 2893 | TX25Status* status = card->flags; | ||
| 2894 | TX25Mbox* mbox = card->mbox; | ||
| 2895 | int err = 0; | ||
| 2896 | |||
| 2897 | if (status->gflags & 0x20) | ||
| 2898 | { | ||
| 2899 | memset(&mbox->cmd, 0, sizeof(TX25Cmd)); | ||
| 2900 | mbox->cmd.command = X25_IS_DATA_AVAILABLE; | ||
| 2901 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 2902 | if (err) x25_error(card, err, X25_IS_DATA_AVAILABLE, 0); | ||
| 2903 | } | ||
| 2904 | return err; | ||
| 2905 | } | ||
| 2906 | |||
| 2907 | /*==================================================================== | ||
| 2908 | * X.25 asynchronous event/error handler. | ||
| 2909 | * This routine is called each time interface command returns | ||
| 2910 | * non-zero return code to handle X.25 asynchronous events and | ||
| 2911 | * common errors. Return non-zero to repeat command or zero to | ||
| 2912 | * cancel it. | ||
| 2913 | * | ||
| 2914 | * Notes: | ||
| 2915 | * 1. This function may be called recursively, as handling some of the | ||
| 2916 | * asynchronous events (e.g. call request) requires execution of the | ||
| 2917 | * interface command(s) that, in turn, may also return asynchronous | ||
| 2918 | * events. To avoid re-entrancy problems we copy mailbox to dynamically | ||
| 2919 | * allocated memory before processing events. | ||
| 2920 | *====================================================================*/ | ||
| 2921 | |||
| 2922 | static int x25_error (sdla_t* card, int err, int cmd, int lcn) | ||
| 2923 | { | ||
| 2924 | int retry = 1; | ||
| 2925 | unsigned dlen = ((TX25Mbox*)card->mbox)->cmd.length; | ||
| 2926 | TX25Mbox* mb; | ||
| 2927 | |||
| 2928 | mb = kmalloc(sizeof(TX25Mbox) + dlen, GFP_ATOMIC); | ||
| 2929 | if (mb == NULL) | ||
| 2930 | { | ||
| 2931 | printk(KERN_ERR "%s: x25_error() out of memory!\n", | ||
| 2932 | card->devname); | ||
| 2933 | return 0; | ||
| 2934 | } | ||
| 2935 | memcpy(mb, card->mbox, sizeof(TX25Mbox) + dlen); | ||
| 2936 | switch (err){ | ||
| 2937 | |||
| 2938 | case X25RES_ASYNC_PACKET: /* X.25 asynchronous packet was received */ | ||
| 2939 | |||
| 2940 | mb->data[dlen] = '\0'; | ||
| 2941 | |||
| 2942 | switch (mb->cmd.pktType & 0x7F){ | ||
| 2943 | |||
| 2944 | case ASE_CALL_RQST: /* incoming call */ | ||
| 2945 | retry = incoming_call(card, cmd, lcn, mb); | ||
| 2946 | break; | ||
| 2947 | |||
| 2948 | case ASE_CALL_ACCEPTED: /* connected */ | ||
| 2949 | retry = call_accepted(card, cmd, lcn, mb); | ||
| 2950 | break; | ||
| 2951 | |||
| 2952 | case ASE_CLEAR_RQST: /* call clear request */ | ||
| 2953 | retry = call_cleared(card, cmd, lcn, mb); | ||
| 2954 | break; | ||
| 2955 | |||
| 2956 | case ASE_RESET_RQST: /* reset request */ | ||
| 2957 | printk(KERN_INFO "%s: X.25 reset request on LCN %d! " | ||
| 2958 | "Cause:0x%02X Diagn:0x%02X\n", | ||
| 2959 | card->devname, mb->cmd.lcn, mb->cmd.cause, | ||
| 2960 | mb->cmd.diagn); | ||
| 2961 | api_oob_event (card,mb); | ||
| 2962 | break; | ||
| 2963 | |||
| 2964 | case ASE_RESTART_RQST: /* restart request */ | ||
| 2965 | retry = restart_event(card, cmd, lcn, mb); | ||
| 2966 | break; | ||
| 2967 | |||
| 2968 | case ASE_CLEAR_CONFRM: | ||
| 2969 | if (clear_confirm_event (card,mb)) | ||
| 2970 | break; | ||
| 2971 | |||
| 2972 | /* I use the goto statement here so if | ||
| 2973 | * somebody inserts code between the | ||
| 2974 | * case and default, we will not have | ||
| 2975 | * ghost problems */ | ||
| 2976 | |||
| 2977 | goto dflt_1; | ||
| 2978 | |||
| 2979 | default: | ||
| 2980 | dflt_1: | ||
| 2981 | printk(KERN_INFO "%s: X.25 event 0x%02X on LCN %d! " | ||
| 2982 | "Cause:0x%02X Diagn:0x%02X\n", | ||
| 2983 | card->devname, mb->cmd.pktType, | ||
| 2984 | mb->cmd.lcn, mb->cmd.cause, mb->cmd.diagn); | ||
| 2985 | } | ||
| 2986 | break; | ||
| 2987 | |||
| 2988 | case X25RES_PROTO_VIOLATION: /* X.25 protocol violation indication */ | ||
| 2989 | |||
| 2990 | /* Bug Fix: Mar 14 2000 | ||
| 2991 | * The Protocol violation error conditions were | ||
| 2992 | * not handled previously */ | ||
| 2993 | |||
| 2994 | switch (mb->cmd.pktType & 0x7F){ | ||
| 2995 | |||
| 2996 | case PVE_CLEAR_RQST: /* Clear request */ | ||
| 2997 | retry = call_cleared(card, cmd, lcn, mb); | ||
| 2998 | break; | ||
| 2999 | |||
| 3000 | case PVE_RESET_RQST: /* Reset request */ | ||
| 3001 | printk(KERN_INFO "%s: X.25 reset request on LCN %d! " | ||
| 3002 | "Cause:0x%02X Diagn:0x%02X\n", | ||
| 3003 | card->devname, mb->cmd.lcn, mb->cmd.cause, | ||
| 3004 | mb->cmd.diagn); | ||
| 3005 | api_oob_event (card,mb); | ||
| 3006 | break; | ||
| 3007 | |||
| 3008 | case PVE_RESTART_RQST: /* Restart request */ | ||
| 3009 | retry = restart_event(card, cmd, lcn, mb); | ||
| 3010 | break; | ||
| 3011 | |||
| 3012 | default : | ||
| 3013 | printk(KERN_INFO | ||
| 3014 | "%s: X.25 protocol violation on LCN %d! " | ||
| 3015 | "Packet:0x%02X Cause:0x%02X Diagn:0x%02X\n", | ||
| 3016 | card->devname, mb->cmd.lcn, | ||
| 3017 | mb->cmd.pktType & 0x7F, mb->cmd.cause, mb->cmd.diagn); | ||
| 3018 | api_oob_event(card,mb); | ||
| 3019 | } | ||
| 3020 | break; | ||
| 3021 | |||
| 3022 | case 0x42: /* X.25 timeout */ | ||
| 3023 | retry = timeout_event(card, cmd, lcn, mb); | ||
| 3024 | break; | ||
| 3025 | |||
| 3026 | case 0x43: /* X.25 retry limit exceeded */ | ||
| 3027 | printk(KERN_INFO | ||
| 3028 | "%s: exceeded X.25 retry limit on LCN %d! " | ||
| 3029 | "Packet:0x%02X Diagn:0x%02X\n", card->devname, | ||
| 3030 | mb->cmd.lcn, mb->cmd.pktType, mb->cmd.diagn) | ||
| 3031 | ; | ||
| 3032 | break; | ||
| 3033 | |||
| 3034 | case 0x08: /* modem failure */ | ||
| 3035 | #ifndef MODEM_NOT_LOG | ||
| 3036 | printk(KERN_INFO "%s: modem failure!\n", card->devname); | ||
| 3037 | #endif /* MODEM_NOT_LOG */ | ||
| 3038 | api_oob_event(card,mb); | ||
| 3039 | break; | ||
| 3040 | |||
| 3041 | case 0x09: /* N2 retry limit */ | ||
| 3042 | printk(KERN_INFO "%s: exceeded HDLC retry limit!\n", | ||
| 3043 | card->devname); | ||
| 3044 | api_oob_event(card,mb); | ||
| 3045 | break; | ||
| 3046 | |||
| 3047 | case 0x06: /* unnumbered frame was received while in ABM */ | ||
| 3048 | printk(KERN_INFO "%s: received Unnumbered frame 0x%02X!\n", | ||
| 3049 | card->devname, mb->data[0]); | ||
| 3050 | api_oob_event(card,mb); | ||
| 3051 | break; | ||
| 3052 | |||
| 3053 | case CMD_TIMEOUT: | ||
| 3054 | printk(KERN_ERR "%s: command 0x%02X timed out!\n", | ||
| 3055 | card->devname, cmd) | ||
| 3056 | ; | ||
| 3057 | retry = 0; /* abort command */ | ||
| 3058 | break; | ||
| 3059 | |||
| 3060 | case X25RES_NOT_READY: | ||
| 3061 | retry = 1; | ||
| 3062 | break; | ||
| 3063 | |||
| 3064 | case 0x01: | ||
| 3065 | if (card->u.x.LAPB_hdlc) | ||
| 3066 | break; | ||
| 3067 | |||
| 3068 | if (mb->cmd.command == 0x16) | ||
| 3069 | break; | ||
| 3070 | /* I use the goto statement here so if | ||
| 3071 | * somebody inserts code between the | ||
| 3072 | * case and default, we will not have | ||
| 3073 | * ghost problems */ | ||
| 3074 | goto dflt_2; | ||
| 3075 | |||
| 3076 | default: | ||
| 3077 | dflt_2: | ||
| 3078 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X! Lcn %i\n", | ||
| 3079 | card->devname, cmd, err, mb->cmd.lcn) | ||
| 3080 | ; | ||
| 3081 | retry = 0; /* abort command */ | ||
| 3082 | } | ||
| 3083 | kfree(mb); | ||
| 3084 | return retry; | ||
| 3085 | } | ||
| 3086 | |||
| 3087 | /*==================================================================== | ||
| 3088 | * X.25 Asynchronous Event Handlers | ||
| 3089 | * These functions are called by the x25_error() and should return 0, if | ||
| 3090 | * the command resulting in the asynchronous event must be aborted. | ||
| 3091 | *====================================================================*/ | ||
| 3092 | |||
| 3093 | |||
| 3094 | |||
| 3095 | /*==================================================================== | ||
| 3096 | *Handle X.25 incoming call request. | ||
| 3097 | * RFC 1356 establishes the following rules: | ||
| 3098 | * 1. The first octet in the Call User Data (CUD) field of the call | ||
| 3099 | * request packet contains NLPID identifying protocol encapsulation | ||
| 3100 | * 2. Calls MUST NOT be accepted unless router supports requested | ||
| 3101 | * protocol encapsulation. | ||
| 3102 | * 3. A diagnostic code 249 defined by ISO/IEC 8208 may be used | ||
| 3103 | * when clearing a call because protocol encapsulation is not | ||
| 3104 | * supported. | ||
| 3105 | * 4. If an incoming call is received while a call request is | ||
| 3106 | * pending (i.e. call collision has occurred), the incoming call | ||
| 3107 | * shall be rejected and call request shall be retried. | ||
| 3108 | *====================================================================*/ | ||
| 3109 | |||
| 3110 | static int incoming_call (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) | ||
| 3111 | { | ||
| 3112 | struct wan_device* wandev = &card->wandev; | ||
| 3113 | int new_lcn = mb->cmd.lcn; | ||
| 3114 | struct net_device* dev = get_dev_by_lcn(wandev, new_lcn); | ||
| 3115 | x25_channel_t* chan = NULL; | ||
| 3116 | int accept = 0; /* set to '1' if o.k. to accept call */ | ||
| 3117 | unsigned int user_data; | ||
| 3118 | x25_call_info_t* info; | ||
| 3119 | |||
| 3120 | /* Make sure there is no call collision */ | ||
| 3121 | if (dev != NULL) | ||
| 3122 | { | ||
| 3123 | printk(KERN_INFO | ||
| 3124 | "%s: X.25 incoming call collision on LCN %d!\n", | ||
| 3125 | card->devname, new_lcn); | ||
| 3126 | |||
| 3127 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3128 | return 1; | ||
| 3129 | } | ||
| 3130 | |||
| 3131 | /* Make sure D bit is not set in call request */ | ||
| 3132 | //FIXME: THIS IS NOT TURE !!!! TAKE IT OUT | ||
| 3133 | // if (mb->cmd.qdm & 0x02) | ||
| 3134 | // { | ||
| 3135 | // printk(KERN_INFO | ||
| 3136 | // "%s: X.25 incoming call on LCN %d with D-bit set!\n", | ||
| 3137 | // card->devname, new_lcn); | ||
| 3138 | // | ||
| 3139 | // x25_clear_call(card, new_lcn, 0, 0); | ||
| 3140 | // return 1; | ||
| 3141 | // } | ||
| 3142 | |||
| 3143 | /* Parse call request data */ | ||
| 3144 | info = kmalloc(sizeof(x25_call_info_t), GFP_ATOMIC); | ||
| 3145 | if (info == NULL) | ||
| 3146 | { | ||
| 3147 | printk(KERN_ERR | ||
| 3148 | "%s: not enough memory to parse X.25 incoming call " | ||
| 3149 | "on LCN %d!\n", card->devname, new_lcn); | ||
| 3150 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3151 | return 1; | ||
| 3152 | } | ||
| 3153 | |||
| 3154 | parse_call_info(mb->data, info); | ||
| 3155 | |||
| 3156 | if (card->u.x.logging) | ||
| 3157 | printk(KERN_INFO "\n%s: X.25 incoming call on LCN %d!\n", | ||
| 3158 | card->devname, new_lcn); | ||
| 3159 | |||
| 3160 | /* Conver the first two ASCII characters into an | ||
| 3161 | * interger. Used to check the incoming protocol | ||
| 3162 | */ | ||
| 3163 | user_data = hex_to_uint(info->user,2); | ||
| 3164 | |||
| 3165 | /* Find available channel */ | ||
| 3166 | for (dev = wandev->dev; dev; dev = *((struct net_device **)dev->priv)) { | ||
| 3167 | chan = dev->priv; | ||
| 3168 | |||
| 3169 | if (chan->common.usedby == API) | ||
| 3170 | continue; | ||
| 3171 | |||
| 3172 | if (!chan->common.svc || (chan->common.state != WAN_DISCONNECTED)) | ||
| 3173 | continue; | ||
| 3174 | |||
| 3175 | if (user_data == NLPID_IP && chan->protocol != htons(ETH_P_IP)){ | ||
| 3176 | printk(KERN_INFO "IP packet but configured for IPX : %x, %x\n", | ||
| 3177 | htons(chan->protocol), info->user[0]); | ||
| 3178 | continue; | ||
| 3179 | } | ||
| 3180 | |||
| 3181 | if (user_data == NLPID_SNAP && chan->protocol != htons(ETH_P_IPX)){ | ||
| 3182 | printk(KERN_INFO "IPX packet but configured for IP: %x\n", | ||
| 3183 | htons(chan->protocol)); | ||
| 3184 | continue; | ||
| 3185 | } | ||
| 3186 | if (strcmp(info->src, chan->addr) == 0) | ||
| 3187 | break; | ||
| 3188 | |||
| 3189 | /* If just an '@' is specified, accept all incoming calls */ | ||
| 3190 | if (strcmp(chan->addr, "") == 0) | ||
| 3191 | break; | ||
| 3192 | } | ||
| 3193 | |||
| 3194 | if (dev == NULL){ | ||
| 3195 | |||
| 3196 | /* If the call is not for any WANPIPE interfaces | ||
| 3197 | * check to see if there is an API listening queue | ||
| 3198 | * waiting for data. If there is send the packet | ||
| 3199 | * up the stack. | ||
| 3200 | */ | ||
| 3201 | if (card->sk != NULL && card->func != NULL){ | ||
| 3202 | if (api_incoming_call(card,mb,new_lcn)){ | ||
| 3203 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3204 | } | ||
| 3205 | accept = 0; | ||
| 3206 | }else{ | ||
| 3207 | printk(KERN_INFO "%s: no channels available!\n", | ||
| 3208 | card->devname); | ||
| 3209 | |||
| 3210 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3211 | } | ||
| 3212 | |||
| 3213 | }else if (info->nuser == 0){ | ||
| 3214 | |||
| 3215 | printk(KERN_INFO | ||
| 3216 | "%s: no user data in incoming call on LCN %d!\n", | ||
| 3217 | card->devname, new_lcn) | ||
| 3218 | ; | ||
| 3219 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3220 | |||
| 3221 | }else switch (info->user[0]){ | ||
| 3222 | |||
| 3223 | case 0: /* multiplexed */ | ||
| 3224 | chan->protocol = htons(0); | ||
| 3225 | accept = 1; | ||
| 3226 | break; | ||
| 3227 | |||
| 3228 | case NLPID_IP: /* IP datagrams */ | ||
| 3229 | accept = 1; | ||
| 3230 | break; | ||
| 3231 | |||
| 3232 | case NLPID_SNAP: /* IPX datagrams */ | ||
| 3233 | accept = 1; | ||
| 3234 | break; | ||
| 3235 | |||
| 3236 | default: | ||
| 3237 | printk(KERN_INFO | ||
| 3238 | "%s: unsupported NLPID 0x%02X in incoming call " | ||
| 3239 | "on LCN %d!\n", card->devname, info->user[0], new_lcn); | ||
| 3240 | x25_clear_call(card, new_lcn, 0, 249); | ||
| 3241 | } | ||
| 3242 | |||
| 3243 | if (accept && (x25_accept_call(card, new_lcn, 0) == CMD_OK)){ | ||
| 3244 | |||
| 3245 | bind_lcn_to_dev (card, chan->dev, new_lcn); | ||
| 3246 | |||
| 3247 | if (x25_get_chan_conf(card, chan) == CMD_OK) | ||
| 3248 | set_chan_state(dev, WAN_CONNECTED); | ||
| 3249 | else | ||
| 3250 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3251 | } | ||
| 3252 | kfree(info); | ||
| 3253 | return 1; | ||
| 3254 | } | ||
| 3255 | |||
| 3256 | /*==================================================================== | ||
| 3257 | * Handle accepted call. | ||
| 3258 | *====================================================================*/ | ||
| 3259 | |||
| 3260 | static int call_accepted (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) | ||
| 3261 | { | ||
| 3262 | unsigned new_lcn = mb->cmd.lcn; | ||
| 3263 | struct net_device* dev = find_channel(card, new_lcn); | ||
| 3264 | x25_channel_t* chan; | ||
| 3265 | |||
| 3266 | if (dev == NULL){ | ||
| 3267 | printk(KERN_INFO | ||
| 3268 | "%s: clearing orphaned connection on LCN %d!\n", | ||
| 3269 | card->devname, new_lcn); | ||
| 3270 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3271 | return 1; | ||
| 3272 | } | ||
| 3273 | |||
| 3274 | if (card->u.x.logging) | ||
| 3275 | printk(KERN_INFO "%s: X.25 call accepted on Dev %s and LCN %d!\n", | ||
| 3276 | card->devname, dev->name, new_lcn); | ||
| 3277 | |||
| 3278 | /* Get channel configuration and notify router */ | ||
| 3279 | chan = dev->priv; | ||
| 3280 | if (x25_get_chan_conf(card, chan) != CMD_OK) | ||
| 3281 | { | ||
| 3282 | x25_clear_call(card, new_lcn, 0, 0); | ||
| 3283 | return 1; | ||
| 3284 | } | ||
| 3285 | |||
| 3286 | set_chan_state(dev, WAN_CONNECTED); | ||
| 3287 | |||
| 3288 | if (chan->common.usedby == API){ | ||
| 3289 | send_delayed_cmd_result(card,dev,mb); | ||
| 3290 | bind_lcn_to_dev (card, dev, new_lcn); | ||
| 3291 | } | ||
| 3292 | |||
| 3293 | return 1; | ||
| 3294 | } | ||
| 3295 | |||
| 3296 | /*==================================================================== | ||
| 3297 | * Handle cleared call. | ||
| 3298 | *====================================================================*/ | ||
| 3299 | |||
| 3300 | static int call_cleared (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) | ||
| 3301 | { | ||
| 3302 | unsigned new_lcn = mb->cmd.lcn; | ||
| 3303 | struct net_device* dev = find_channel(card, new_lcn); | ||
| 3304 | x25_channel_t *chan; | ||
| 3305 | unsigned char old_state; | ||
| 3306 | |||
| 3307 | if (card->u.x.logging){ | ||
| 3308 | printk(KERN_INFO "%s: X.25 clear request on LCN %d! Cause:0x%02X " | ||
| 3309 | "Diagn:0x%02X\n", | ||
| 3310 | card->devname, new_lcn, mb->cmd.cause, mb->cmd.diagn); | ||
| 3311 | } | ||
| 3312 | |||
| 3313 | if (dev == NULL){ | ||
| 3314 | printk(KERN_INFO "%s: X.25 clear request : No device for clear\n", | ||
| 3315 | card->devname); | ||
| 3316 | return 1; | ||
| 3317 | } | ||
| 3318 | |||
| 3319 | chan=dev->priv; | ||
| 3320 | |||
| 3321 | old_state = chan->common.state; | ||
| 3322 | |||
| 3323 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3324 | |||
| 3325 | if (chan->common.usedby == API){ | ||
| 3326 | |||
| 3327 | switch (old_state){ | ||
| 3328 | |||
| 3329 | case WAN_CONNECTING: | ||
| 3330 | send_delayed_cmd_result(card,dev,mb); | ||
| 3331 | break; | ||
| 3332 | case WAN_CONNECTED: | ||
| 3333 | send_oob_msg(card,dev,mb); | ||
| 3334 | break; | ||
| 3335 | } | ||
| 3336 | } | ||
| 3337 | |||
| 3338 | return ((cmd == X25_WRITE) && (lcn == new_lcn)) ? 0 : 1; | ||
| 3339 | } | ||
| 3340 | |||
| 3341 | /*==================================================================== | ||
| 3342 | * Handle X.25 restart event. | ||
| 3343 | *====================================================================*/ | ||
| 3344 | |||
| 3345 | static int restart_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) | ||
| 3346 | { | ||
| 3347 | struct wan_device* wandev = &card->wandev; | ||
| 3348 | struct net_device* dev; | ||
| 3349 | x25_channel_t *chan; | ||
| 3350 | unsigned char old_state; | ||
| 3351 | |||
| 3352 | printk(KERN_INFO | ||
| 3353 | "%s: X.25 restart request! Cause:0x%02X Diagn:0x%02X\n", | ||
| 3354 | card->devname, mb->cmd.cause, mb->cmd.diagn); | ||
| 3355 | |||
| 3356 | /* down all logical channels */ | ||
| 3357 | for (dev = wandev->dev; dev; dev = *((struct net_device **)dev->priv)) { | ||
| 3358 | chan=dev->priv; | ||
| 3359 | old_state = chan->common.state; | ||
| 3360 | |||
| 3361 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3362 | |||
| 3363 | if (chan->common.usedby == API){ | ||
| 3364 | switch (old_state){ | ||
| 3365 | |||
| 3366 | case WAN_CONNECTING: | ||
| 3367 | send_delayed_cmd_result(card,dev,mb); | ||
| 3368 | break; | ||
| 3369 | case WAN_CONNECTED: | ||
| 3370 | send_oob_msg(card,dev,mb); | ||
| 3371 | break; | ||
| 3372 | } | ||
| 3373 | } | ||
| 3374 | } | ||
| 3375 | return (cmd == X25_WRITE) ? 0 : 1; | ||
| 3376 | } | ||
| 3377 | |||
| 3378 | /*==================================================================== | ||
| 3379 | * Handle timeout event. | ||
| 3380 | *====================================================================*/ | ||
| 3381 | |||
| 3382 | static int timeout_event (sdla_t* card, int cmd, int lcn, TX25Mbox* mb) | ||
| 3383 | { | ||
| 3384 | unsigned new_lcn = mb->cmd.lcn; | ||
| 3385 | |||
| 3386 | if (mb->cmd.pktType == 0x05) /* call request time out */ | ||
| 3387 | { | ||
| 3388 | struct net_device* dev = find_channel(card,new_lcn); | ||
| 3389 | |||
| 3390 | printk(KERN_INFO "%s: X.25 call timed timeout on LCN %d!\n", | ||
| 3391 | card->devname, new_lcn); | ||
| 3392 | |||
| 3393 | if (dev){ | ||
| 3394 | x25_channel_t *chan = dev->priv; | ||
| 3395 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3396 | |||
| 3397 | if (chan->common.usedby == API){ | ||
| 3398 | send_delayed_cmd_result(card,dev,card->mbox); | ||
| 3399 | } | ||
| 3400 | } | ||
| 3401 | }else{ | ||
| 3402 | printk(KERN_INFO "%s: X.25 packet 0x%02X timeout on LCN %d!\n", | ||
| 3403 | card->devname, mb->cmd.pktType, new_lcn); | ||
| 3404 | } | ||
| 3405 | return 1; | ||
| 3406 | } | ||
| 3407 | |||
| 3408 | /* | ||
| 3409 | * Miscellaneous | ||
| 3410 | */ | ||
| 3411 | |||
| 3412 | /*==================================================================== | ||
| 3413 | * Establish physical connection. | ||
| 3414 | * o open HDLC and raise DTR | ||
| 3415 | * | ||
| 3416 | * Return: 0 connection established | ||
| 3417 | * 1 connection is in progress | ||
| 3418 | * <0 error | ||
| 3419 | *===================================================================*/ | ||
| 3420 | |||
| 3421 | static int connect (sdla_t* card) | ||
| 3422 | { | ||
| 3423 | TX25Status* status = card->flags; | ||
| 3424 | |||
| 3425 | if (x25_open_hdlc(card) || x25_setup_hdlc(card)) | ||
| 3426 | return -EIO; | ||
| 3427 | |||
| 3428 | wanpipe_set_state(card, WAN_CONNECTING); | ||
| 3429 | |||
| 3430 | x25_set_intr_mode(card, INTR_ON_TIMER); | ||
| 3431 | status->imask &= ~INTR_ON_TIMER; | ||
| 3432 | |||
| 3433 | return 1; | ||
| 3434 | } | ||
| 3435 | |||
| 3436 | /* | ||
| 3437 | * Tear down physical connection. | ||
| 3438 | * o close HDLC link | ||
| 3439 | * o drop DTR | ||
| 3440 | * | ||
| 3441 | * Return: 0 | ||
| 3442 | * <0 error | ||
| 3443 | */ | ||
| 3444 | |||
| 3445 | static int disconnect (sdla_t* card) | ||
| 3446 | { | ||
| 3447 | wanpipe_set_state(card, WAN_DISCONNECTED); | ||
| 3448 | x25_set_intr_mode(card, INTR_ON_TIMER); /* disable all interrupt except timer */ | ||
| 3449 | x25_close_hdlc(card); /* close HDLC link */ | ||
| 3450 | x25_set_dtr(card, 0); /* drop DTR */ | ||
| 3451 | return 0; | ||
| 3452 | } | ||
| 3453 | |||
| 3454 | /* | ||
| 3455 | * Find network device by its channel number. | ||
| 3456 | */ | ||
| 3457 | |||
| 3458 | static struct net_device* get_dev_by_lcn(struct wan_device* wandev, | ||
| 3459 | unsigned lcn) | ||
| 3460 | { | ||
| 3461 | struct net_device* dev; | ||
| 3462 | |||
| 3463 | for (dev = wandev->dev; dev; dev = *((struct net_device **)dev->priv)) | ||
| 3464 | if (((x25_channel_t*)dev->priv)->common.lcn == lcn) | ||
| 3465 | break; | ||
| 3466 | return dev; | ||
| 3467 | } | ||
| 3468 | |||
| 3469 | /* | ||
| 3470 | * Initiate connection on the logical channel. | ||
| 3471 | * o for PVC we just get channel configuration | ||
| 3472 | * o for SVCs place an X.25 call | ||
| 3473 | * | ||
| 3474 | * Return: 0 connected | ||
| 3475 | * >0 connection in progress | ||
| 3476 | * <0 failure | ||
| 3477 | */ | ||
| 3478 | |||
| 3479 | static int chan_connect(struct net_device* dev) | ||
| 3480 | { | ||
| 3481 | x25_channel_t* chan = dev->priv; | ||
| 3482 | sdla_t* card = chan->card; | ||
| 3483 | |||
| 3484 | if (chan->common.svc && chan->common.usedby == WANPIPE){ | ||
| 3485 | if (!chan->addr[0]){ | ||
| 3486 | printk(KERN_INFO "%s: No Destination Address\n", | ||
| 3487 | card->devname); | ||
| 3488 | return -EINVAL; /* no destination address */ | ||
| 3489 | } | ||
| 3490 | printk(KERN_INFO "%s: placing X.25 call to %s ...\n", | ||
| 3491 | card->devname, chan->addr); | ||
| 3492 | |||
| 3493 | if (x25_place_call(card, chan) != CMD_OK) | ||
| 3494 | return -EIO; | ||
| 3495 | |||
| 3496 | set_chan_state(dev, WAN_CONNECTING); | ||
| 3497 | return 1; | ||
| 3498 | }else{ | ||
| 3499 | if (x25_get_chan_conf(card, chan) != CMD_OK) | ||
| 3500 | return -EIO; | ||
| 3501 | |||
| 3502 | set_chan_state(dev, WAN_CONNECTED); | ||
| 3503 | } | ||
| 3504 | return 0; | ||
| 3505 | } | ||
| 3506 | |||
| 3507 | /* | ||
| 3508 | * Disconnect logical channel. | ||
| 3509 | * o if SVC then clear X.25 call | ||
| 3510 | */ | ||
| 3511 | |||
| 3512 | static int chan_disc(struct net_device* dev) | ||
| 3513 | { | ||
| 3514 | x25_channel_t* chan = dev->priv; | ||
| 3515 | |||
| 3516 | if (chan->common.svc){ | ||
| 3517 | x25_clear_call(chan->card, chan->common.lcn, 0, 0); | ||
| 3518 | |||
| 3519 | /* For API we disconnect on clear | ||
| 3520 | * confirmation. | ||
| 3521 | */ | ||
| 3522 | if (chan->common.usedby == API) | ||
| 3523 | return 0; | ||
| 3524 | } | ||
| 3525 | |||
| 3526 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 3527 | |||
| 3528 | return 0; | ||
| 3529 | } | ||
| 3530 | |||
| 3531 | /* | ||
| 3532 | * Set logical channel state. | ||
| 3533 | */ | ||
| 3534 | |||
| 3535 | static void set_chan_state(struct net_device* dev, int state) | ||
| 3536 | { | ||
| 3537 | x25_channel_t* chan = dev->priv; | ||
| 3538 | sdla_t* card = chan->card; | ||
| 3539 | unsigned long flags; | ||
| 3540 | |||
| 3541 | save_flags(flags); | ||
| 3542 | cli(); | ||
| 3543 | if (chan->common.state != state) | ||
| 3544 | { | ||
| 3545 | switch (state) | ||
| 3546 | { | ||
| 3547 | case WAN_CONNECTED: | ||
| 3548 | if (card->u.x.logging){ | ||
| 3549 | printk (KERN_INFO | ||
| 3550 | "%s: interface %s connected, lcn %i !\n", | ||
| 3551 | card->devname, dev->name,chan->common.lcn); | ||
| 3552 | } | ||
| 3553 | *(unsigned short*)dev->dev_addr = htons(chan->common.lcn); | ||
| 3554 | chan->i_timeout_sofar = jiffies; | ||
| 3555 | |||
| 3556 | /* LAPB is PVC Based */ | ||
| 3557 | if (card->u.x.LAPB_hdlc) | ||
| 3558 | chan->common.svc=0; | ||
| 3559 | break; | ||
| 3560 | |||
| 3561 | case WAN_CONNECTING: | ||
| 3562 | if (card->u.x.logging){ | ||
| 3563 | printk (KERN_INFO | ||
| 3564 | "%s: interface %s connecting, lcn %i ...\n", | ||
| 3565 | card->devname, dev->name, chan->common.lcn); | ||
| 3566 | } | ||
| 3567 | break; | ||
| 3568 | |||
| 3569 | case WAN_DISCONNECTED: | ||
| 3570 | if (card->u.x.logging){ | ||
| 3571 | printk (KERN_INFO | ||
| 3572 | "%s: interface %s disconnected, lcn %i !\n", | ||
| 3573 | card->devname, dev->name,chan->common.lcn); | ||
| 3574 | } | ||
| 3575 | atomic_set(&chan->common.disconnect,0); | ||
| 3576 | |||
| 3577 | if (chan->common.svc) { | ||
| 3578 | *(unsigned short*)dev->dev_addr = 0; | ||
| 3579 | card->u.x.svc_to_dev_map[(chan->common.lcn%X25_MAX_CHAN)]=NULL; | ||
| 3580 | chan->common.lcn = 0; | ||
| 3581 | } | ||
| 3582 | |||
| 3583 | if (chan->transmit_length){ | ||
| 3584 | chan->transmit_length=0; | ||
| 3585 | atomic_set(&chan->common.driver_busy,0); | ||
| 3586 | chan->tx_offset=0; | ||
| 3587 | if (netif_queue_stopped(dev)){ | ||
| 3588 | netif_wake_queue(dev); | ||
| 3589 | } | ||
| 3590 | } | ||
| 3591 | atomic_set(&chan->common.command,0); | ||
| 3592 | break; | ||
| 3593 | |||
| 3594 | case WAN_DISCONNECTING: | ||
| 3595 | if (card->u.x.logging){ | ||
| 3596 | printk (KERN_INFO | ||
| 3597 | "\n%s: interface %s disconnecting, lcn %i ...\n", | ||
| 3598 | card->devname, dev->name,chan->common.lcn); | ||
| 3599 | } | ||
| 3600 | atomic_set(&chan->common.disconnect,0); | ||
| 3601 | break; | ||
| 3602 | } | ||
| 3603 | chan->common.state = state; | ||
| 3604 | } | ||
| 3605 | chan->state_tick = jiffies; | ||
| 3606 | restore_flags(flags); | ||
| 3607 | } | ||
| 3608 | |||
| 3609 | /* | ||
| 3610 | * Send packet on a logical channel. | ||
| 3611 | * When this function is called, tx_skb field of the channel data | ||
| 3612 | * space points to the transmit socket buffer. When transmission | ||
| 3613 | * is complete, release socket buffer and reset 'tbusy' flag. | ||
| 3614 | * | ||
| 3615 | * Return: 0 - transmission complete | ||
| 3616 | * 1 - busy | ||
| 3617 | * | ||
| 3618 | * Notes: | ||
| 3619 | * 1. If packet length is greater than MTU for this channel, we'll fragment | ||
| 3620 | * the packet into 'complete sequence' using M-bit. | ||
| 3621 | * 2. When transmission is complete, an event notification should be issued | ||
| 3622 | * to the router. | ||
| 3623 | */ | ||
| 3624 | |||
| 3625 | static int chan_send(struct net_device* dev, void* buff, unsigned data_len, | ||
| 3626 | unsigned char tx_intr) | ||
| 3627 | { | ||
| 3628 | x25_channel_t* chan = dev->priv; | ||
| 3629 | sdla_t* card = chan->card; | ||
| 3630 | TX25Status* status = card->flags; | ||
| 3631 | unsigned len=0, qdm=0, res=0, orig_len = 0; | ||
| 3632 | void *data; | ||
| 3633 | |||
| 3634 | /* Check to see if channel is ready */ | ||
| 3635 | if ((!(status->cflags[chan->ch_idx] & 0x40) && !card->u.x.LAPB_hdlc) || | ||
| 3636 | !(*card->u.x.hdlc_buf_status & 0x40)){ | ||
| 3637 | |||
| 3638 | if (!tx_intr){ | ||
| 3639 | setup_for_delayed_transmit (dev, buff, data_len); | ||
| 3640 | return 0; | ||
| 3641 | }else{ | ||
| 3642 | /* By returning 0 to tx_intr the packet will be dropped */ | ||
| 3643 | ++card->wandev.stats.tx_dropped; | ||
| 3644 | ++chan->ifstats.tx_dropped; | ||
| 3645 | printk(KERN_INFO "%s: ERROR, Tx intr could not send, dropping %s:\n", | ||
| 3646 | card->devname,dev->name); | ||
| 3647 | ++chan->if_send_stat.if_send_bfr_not_passed_to_adptr; | ||
| 3648 | return 0; | ||
| 3649 | } | ||
| 3650 | } | ||
| 3651 | |||
| 3652 | if (chan->common.usedby == API){ | ||
| 3653 | /* Remove the API Header */ | ||
| 3654 | x25api_hdr_t *api_data = (x25api_hdr_t *)buff; | ||
| 3655 | |||
| 3656 | /* Set the qdm bits from the packet header | ||
| 3657 | * User has the option to set the qdm bits | ||
| 3658 | */ | ||
| 3659 | qdm = api_data->qdm; | ||
| 3660 | |||
| 3661 | orig_len = len = data_len - sizeof(x25api_hdr_t); | ||
| 3662 | data = (unsigned char*)buff + sizeof(x25api_hdr_t); | ||
| 3663 | }else{ | ||
| 3664 | data = buff; | ||
| 3665 | orig_len = len = data_len; | ||
| 3666 | } | ||
| 3667 | |||
| 3668 | if (tx_intr){ | ||
| 3669 | /* We are in tx_intr, minus the tx_offset from | ||
| 3670 | * the total length. The tx_offset part of the | ||
| 3671 | * data has already been sent. Also, move the | ||
| 3672 | * data pointer to proper offset location. | ||
| 3673 | */ | ||
| 3674 | len -= chan->tx_offset; | ||
| 3675 | data = (unsigned char*)data + chan->tx_offset; | ||
| 3676 | } | ||
| 3677 | |||
| 3678 | /* Check if the packet length is greater than MTU | ||
| 3679 | * If YES: Cut the len to MTU and set the M bit | ||
| 3680 | */ | ||
| 3681 | if (len > chan->tx_pkt_size && !card->u.x.LAPB_hdlc){ | ||
| 3682 | len = chan->tx_pkt_size; | ||
| 3683 | qdm |= M_BIT; | ||
| 3684 | } | ||
| 3685 | |||
| 3686 | |||
| 3687 | /* Pass only first three bits of the qdm byte to the send | ||
| 3688 | * routine. In case user sets any other bit which might | ||
| 3689 | * cause errors. | ||
| 3690 | */ | ||
| 3691 | |||
| 3692 | switch(x25_send(card, chan->common.lcn, (qdm&0x07), len, data)){ | ||
| 3693 | case 0x00: /* success */ | ||
| 3694 | chan->i_timeout_sofar = jiffies; | ||
| 3695 | |||
| 3696 | dev->trans_start=jiffies; | ||
| 3697 | |||
| 3698 | if ((qdm & M_BIT) && !card->u.x.LAPB_hdlc){ | ||
| 3699 | if (!tx_intr){ | ||
| 3700 | /* The M bit was set, which means that part of the | ||
| 3701 | * packet has been sent. Copy the packet into a buffer | ||
| 3702 | * and set the offset to len, so on next tx_inter | ||
| 3703 | * the packet will be sent using the below offset. | ||
| 3704 | */ | ||
| 3705 | chan->tx_offset += len; | ||
| 3706 | |||
| 3707 | ++chan->ifstats.tx_packets; | ||
| 3708 | chan->ifstats.tx_bytes += len; | ||
| 3709 | |||
| 3710 | if (chan->tx_offset < orig_len){ | ||
| 3711 | setup_for_delayed_transmit (dev, buff, data_len); | ||
| 3712 | } | ||
| 3713 | res=0; | ||
| 3714 | }else{ | ||
| 3715 | /* We are already in tx_inter, thus data is already | ||
| 3716 | * in the buffer. Update the offset and wait for | ||
| 3717 | * next tx_intr. We add on to the offset, since data can | ||
| 3718 | * be X number of times larger than max data size. | ||
| 3719 | */ | ||
| 3720 | ++chan->ifstats.tx_packets; | ||
| 3721 | chan->ifstats.tx_bytes += len; | ||
| 3722 | |||
| 3723 | ++chan->if_send_stat.if_send_bfr_passed_to_adptr; | ||
| 3724 | chan->tx_offset += len; | ||
| 3725 | |||
| 3726 | /* The user can set the qdm bit as well. | ||
| 3727 | * If the entire packet was sent and qdm is still | ||
| 3728 | * set, than it's the user who has set the M bit. In that, | ||
| 3729 | * case indicate that the packet was send by returning | ||
| 3730 | * 0 and wait for a new packet. Otherwise, wait for next | ||
| 3731 | * tx interrupt to send the rest of the packet */ | ||
| 3732 | |||
| 3733 | if (chan->tx_offset < orig_len){ | ||
| 3734 | res=1; | ||
| 3735 | }else{ | ||
| 3736 | res=0; | ||
| 3737 | } | ||
| 3738 | } | ||
| 3739 | }else{ | ||
| 3740 | ++chan->ifstats.tx_packets; | ||
| 3741 | chan->ifstats.tx_bytes += len; | ||
| 3742 | ++chan->if_send_stat.if_send_bfr_passed_to_adptr; | ||
| 3743 | res=0; | ||
| 3744 | } | ||
| 3745 | break; | ||
| 3746 | |||
| 3747 | case 0x33: /* Tx busy */ | ||
| 3748 | if (tx_intr){ | ||
| 3749 | printk(KERN_INFO "%s: Tx_intr: Big Error dropping packet %s\n", | ||
| 3750 | card->devname,dev->name); | ||
| 3751 | ++chan->ifstats.tx_dropped; | ||
| 3752 | ++card->wandev.stats.tx_dropped; | ||
| 3753 | ++chan->if_send_stat.if_send_bfr_not_passed_to_adptr; | ||
| 3754 | res=0; | ||
| 3755 | }else{ | ||
| 3756 | DBG_PRINTK(KERN_INFO | ||
| 3757 | "%s: Send: Big Error should have tx: storring %s\n", | ||
| 3758 | card->devname,dev->name); | ||
| 3759 | setup_for_delayed_transmit (dev, buff, data_len); | ||
| 3760 | res=1; | ||
| 3761 | } | ||
| 3762 | break; | ||
| 3763 | |||
| 3764 | default: /* failure */ | ||
| 3765 | ++chan->ifstats.tx_errors; | ||
| 3766 | if (tx_intr){ | ||
| 3767 | printk(KERN_INFO "%s: Tx_intr: Failure to send, dropping %s\n", | ||
| 3768 | card->devname,dev->name); | ||
| 3769 | ++chan->ifstats.tx_dropped; | ||
| 3770 | ++card->wandev.stats.tx_dropped; | ||
| 3771 | ++chan->if_send_stat.if_send_bfr_not_passed_to_adptr; | ||
| 3772 | res=0; | ||
| 3773 | }else{ | ||
| 3774 | DBG_PRINTK(KERN_INFO "%s: Send: Failure to send !!!, storing %s\n", | ||
| 3775 | card->devname,dev->name); | ||
| 3776 | setup_for_delayed_transmit (dev, buff, data_len); | ||
| 3777 | res=1; | ||
| 3778 | } | ||
| 3779 | break; | ||
| 3780 | } | ||
| 3781 | return res; | ||
| 3782 | } | ||
| 3783 | |||
| 3784 | |||
| 3785 | /* | ||
| 3786 | * Parse X.25 call request data and fill x25_call_info_t structure. | ||
| 3787 | */ | ||
| 3788 | |||
| 3789 | static void parse_call_info (unsigned char* str, x25_call_info_t* info) | ||
| 3790 | { | ||
| 3791 | memset(info, 0, sizeof(x25_call_info_t)); | ||
| 3792 | for (; *str; ++str) | ||
| 3793 | { | ||
| 3794 | int i; | ||
| 3795 | unsigned char ch; | ||
| 3796 | |||
| 3797 | if (*str == '-') switch (str[1]) { | ||
| 3798 | |||
| 3799 | /* Take minus 2 off the maximum size so that | ||
| 3800 | * last byte is 0. This way we can use string | ||
| 3801 | * manipulaton functions on call information. | ||
| 3802 | */ | ||
| 3803 | |||
| 3804 | case 'd': /* destination address */ | ||
| 3805 | for (i = 0; i < (MAX_X25_ADDR_SIZE-2); ++i){ | ||
| 3806 | ch = str[2+i]; | ||
| 3807 | if (isspace(ch)) break; | ||
| 3808 | info->dest[i] = ch; | ||
| 3809 | } | ||
| 3810 | break; | ||
| 3811 | |||
| 3812 | case 's': /* source address */ | ||
| 3813 | for (i = 0; i < (MAX_X25_ADDR_SIZE-2); ++i){ | ||
| 3814 | ch = str[2+i]; | ||
| 3815 | if (isspace(ch)) break; | ||
| 3816 | info->src[i] = ch; | ||
| 3817 | } | ||
| 3818 | break; | ||
| 3819 | |||
| 3820 | case 'u': /* user data */ | ||
| 3821 | for (i = 0; i < (MAX_X25_DATA_SIZE-2); ++i){ | ||
| 3822 | ch = str[2+i]; | ||
| 3823 | if (isspace(ch)) break; | ||
| 3824 | info->user[i] = ch; | ||
| 3825 | } | ||
| 3826 | info->nuser = i; | ||
| 3827 | break; | ||
| 3828 | |||
| 3829 | case 'f': /* facilities */ | ||
| 3830 | for (i = 0; i < (MAX_X25_FACL_SIZE-2); ++i){ | ||
| 3831 | ch = str[2+i]; | ||
| 3832 | if (isspace(ch)) break; | ||
| 3833 | info->facil[i] = ch; | ||
| 3834 | } | ||
| 3835 | info->nfacil = i; | ||
| 3836 | break; | ||
| 3837 | } | ||
| 3838 | } | ||
| 3839 | } | ||
| 3840 | |||
| 3841 | /* | ||
| 3842 | * Convert line speed in bps to a number used by S502 code. | ||
| 3843 | */ | ||
| 3844 | |||
| 3845 | static unsigned char bps_to_speed_code (unsigned long bps) | ||
| 3846 | { | ||
| 3847 | unsigned char number; | ||
| 3848 | |||
| 3849 | if (bps <= 1200) number = 0x01; | ||
| 3850 | else if (bps <= 2400) number = 0x02; | ||
| 3851 | else if (bps <= 4800) number = 0x03; | ||
| 3852 | else if (bps <= 9600) number = 0x04; | ||
| 3853 | else if (bps <= 19200) number = 0x05; | ||
| 3854 | else if (bps <= 38400) number = 0x06; | ||
| 3855 | else if (bps <= 45000) number = 0x07; | ||
| 3856 | else if (bps <= 56000) number = 0x08; | ||
| 3857 | else if (bps <= 64000) number = 0x09; | ||
| 3858 | else if (bps <= 74000) number = 0x0A; | ||
| 3859 | else if (bps <= 112000) number = 0x0B; | ||
| 3860 | else if (bps <= 128000) number = 0x0C; | ||
| 3861 | else number = 0x0D; | ||
| 3862 | |||
| 3863 | return number; | ||
| 3864 | } | ||
| 3865 | |||
| 3866 | /* | ||
| 3867 | * Convert decimal string to unsigned integer. | ||
| 3868 | * If len != 0 then only 'len' characters of the string are converted. | ||
| 3869 | */ | ||
| 3870 | |||
| 3871 | static unsigned int dec_to_uint (unsigned char* str, int len) | ||
| 3872 | { | ||
| 3873 | unsigned val; | ||
| 3874 | |||
| 3875 | if (!len) | ||
| 3876 | len = strlen(str); | ||
| 3877 | |||
| 3878 | for (val = 0; len && isdigit(*str); ++str, --len) | ||
| 3879 | val = (val * 10) + (*str - (unsigned)'0'); | ||
| 3880 | |||
| 3881 | return val; | ||
| 3882 | } | ||
| 3883 | |||
| 3884 | /* | ||
| 3885 | * Convert hex string to unsigned integer. | ||
| 3886 | * If len != 0 then only 'len' characters of the string are conferted. | ||
| 3887 | */ | ||
| 3888 | |||
| 3889 | static unsigned int hex_to_uint (unsigned char* str, int len) | ||
| 3890 | { | ||
| 3891 | unsigned val, ch; | ||
| 3892 | |||
| 3893 | if (!len) | ||
| 3894 | len = strlen(str); | ||
| 3895 | |||
| 3896 | for (val = 0; len; ++str, --len) | ||
| 3897 | { | ||
| 3898 | ch = *str; | ||
| 3899 | if (isdigit(ch)) | ||
| 3900 | val = (val << 4) + (ch - (unsigned)'0'); | ||
| 3901 | else if (isxdigit(ch)) | ||
| 3902 | val = (val << 4) + ((ch & 0xDF) - (unsigned)'A' + 10); | ||
| 3903 | else break; | ||
| 3904 | } | ||
| 3905 | return val; | ||
| 3906 | } | ||
| 3907 | |||
| 3908 | |||
| 3909 | static int handle_IPXWAN(unsigned char *sendpacket, char *devname, unsigned char enable_IPX, unsigned long network_number, unsigned short proto) | ||
| 3910 | { | ||
| 3911 | int i; | ||
| 3912 | |||
| 3913 | if( proto == ETH_P_IPX) { | ||
| 3914 | /* It's an IPX packet */ | ||
| 3915 | if(!enable_IPX) { | ||
| 3916 | /* Return 1 so we don't pass it up the stack. */ | ||
| 3917 | return 1; | ||
| 3918 | } | ||
| 3919 | } else { | ||
| 3920 | /* It's not IPX so pass it up the stack.*/ | ||
| 3921 | return 0; | ||
| 3922 | } | ||
| 3923 | |||
| 3924 | if( sendpacket[16] == 0x90 && | ||
| 3925 | sendpacket[17] == 0x04) | ||
| 3926 | { | ||
| 3927 | /* It's IPXWAN */ | ||
| 3928 | |||
| 3929 | if( sendpacket[2] == 0x02 && | ||
| 3930 | sendpacket[34] == 0x00) | ||
| 3931 | { | ||
| 3932 | /* It's a timer request packet */ | ||
| 3933 | printk(KERN_INFO "%s: Received IPXWAN Timer Request packet\n",devname); | ||
| 3934 | |||
| 3935 | /* Go through the routing options and answer no to every | ||
| 3936 | * option except Unnumbered RIP/SAP | ||
| 3937 | */ | ||
| 3938 | for(i = 41; sendpacket[i] == 0x00; i += 5) | ||
| 3939 | { | ||
| 3940 | /* 0x02 is the option for Unnumbered RIP/SAP */ | ||
| 3941 | if( sendpacket[i + 4] != 0x02) | ||
| 3942 | { | ||
| 3943 | sendpacket[i + 1] = 0; | ||
| 3944 | } | ||
| 3945 | } | ||
| 3946 | |||
| 3947 | /* Skip over the extended Node ID option */ | ||
| 3948 | if( sendpacket[i] == 0x04 ) | ||
| 3949 | { | ||
| 3950 | i += 8; | ||
| 3951 | } | ||
| 3952 | |||
| 3953 | /* We also want to turn off all header compression opt. */ | ||
| 3954 | for(; sendpacket[i] == 0x80 ;) | ||
| 3955 | { | ||
| 3956 | sendpacket[i + 1] = 0; | ||
| 3957 | i += (sendpacket[i + 2] << 8) + (sendpacket[i + 3]) + 4; | ||
| 3958 | } | ||
| 3959 | |||
| 3960 | /* Set the packet type to timer response */ | ||
| 3961 | sendpacket[34] = 0x01; | ||
| 3962 | |||
| 3963 | printk(KERN_INFO "%s: Sending IPXWAN Timer Response\n",devname); | ||
| 3964 | } | ||
| 3965 | else if( sendpacket[34] == 0x02 ) | ||
| 3966 | { | ||
| 3967 | /* This is an information request packet */ | ||
| 3968 | printk(KERN_INFO "%s: Received IPXWAN Information Request packet\n",devname); | ||
| 3969 | |||
| 3970 | /* Set the packet type to information response */ | ||
| 3971 | sendpacket[34] = 0x03; | ||
| 3972 | |||
| 3973 | /* Set the router name */ | ||
| 3974 | sendpacket[51] = 'X'; | ||
| 3975 | sendpacket[52] = 'T'; | ||
| 3976 | sendpacket[53] = 'P'; | ||
| 3977 | sendpacket[54] = 'I'; | ||
| 3978 | sendpacket[55] = 'P'; | ||
| 3979 | sendpacket[56] = 'E'; | ||
| 3980 | sendpacket[57] = '-'; | ||
| 3981 | sendpacket[58] = CVHexToAscii(network_number >> 28); | ||
| 3982 | sendpacket[59] = CVHexToAscii((network_number & 0x0F000000)>> 24); | ||
| 3983 | sendpacket[60] = CVHexToAscii((network_number & 0x00F00000)>> 20); | ||
| 3984 | sendpacket[61] = CVHexToAscii((network_number & 0x000F0000)>> 16); | ||
| 3985 | sendpacket[62] = CVHexToAscii((network_number & 0x0000F000)>> 12); | ||
| 3986 | sendpacket[63] = CVHexToAscii((network_number & 0x00000F00)>> 8); | ||
| 3987 | sendpacket[64] = CVHexToAscii((network_number & 0x000000F0)>> 4); | ||
| 3988 | sendpacket[65] = CVHexToAscii(network_number & 0x0000000F); | ||
| 3989 | for(i = 66; i < 99; i+= 1) | ||
| 3990 | { | ||
| 3991 | sendpacket[i] = 0; | ||
| 3992 | } | ||
| 3993 | |||
| 3994 | printk(KERN_INFO "%s: Sending IPXWAN Information Response packet\n",devname); | ||
| 3995 | } | ||
| 3996 | else | ||
| 3997 | { | ||
| 3998 | printk(KERN_INFO "%s: Unknown IPXWAN packet!\n",devname); | ||
| 3999 | return 0; | ||
| 4000 | } | ||
| 4001 | |||
| 4002 | /* Set the WNodeID to our network address */ | ||
| 4003 | sendpacket[35] = (unsigned char)(network_number >> 24); | ||
| 4004 | sendpacket[36] = (unsigned char)((network_number & 0x00FF0000) >> 16); | ||
| 4005 | sendpacket[37] = (unsigned char)((network_number & 0x0000FF00) >> 8); | ||
| 4006 | sendpacket[38] = (unsigned char)(network_number & 0x000000FF); | ||
| 4007 | |||
| 4008 | return 1; | ||
| 4009 | } else { | ||
| 4010 | /*If we get here it's an IPX-data packet, so it'll get passed up the stack. | ||
| 4011 | */ | ||
| 4012 | /* switch the network numbers */ | ||
| 4013 | switch_net_numbers(sendpacket, network_number, 1); | ||
| 4014 | return 0; | ||
| 4015 | } | ||
| 4016 | } | ||
| 4017 | |||
| 4018 | /* | ||
| 4019 | * If incoming is 0 (outgoing)- if the net numbers is ours make it 0 | ||
| 4020 | * if incoming is 1 - if the net number is 0 make it ours | ||
| 4021 | */ | ||
| 4022 | |||
| 4023 | static void switch_net_numbers(unsigned char *sendpacket, unsigned long network_number, unsigned char incoming) | ||
| 4024 | { | ||
| 4025 | unsigned long pnetwork_number; | ||
| 4026 | |||
| 4027 | pnetwork_number = (unsigned long)((sendpacket[6] << 24) + | ||
| 4028 | (sendpacket[7] << 16) + (sendpacket[8] << 8) + | ||
| 4029 | sendpacket[9]); | ||
| 4030 | |||
| 4031 | |||
| 4032 | if (!incoming) { | ||
| 4033 | /*If the destination network number is ours, make it 0 */ | ||
| 4034 | if( pnetwork_number == network_number) { | ||
| 4035 | sendpacket[6] = sendpacket[7] = sendpacket[8] = | ||
| 4036 | sendpacket[9] = 0x00; | ||
| 4037 | } | ||
| 4038 | } else { | ||
| 4039 | /* If the incoming network is 0, make it ours */ | ||
| 4040 | if( pnetwork_number == 0) { | ||
| 4041 | sendpacket[6] = (unsigned char)(network_number >> 24); | ||
| 4042 | sendpacket[7] = (unsigned char)((network_number & | ||
| 4043 | 0x00FF0000) >> 16); | ||
| 4044 | sendpacket[8] = (unsigned char)((network_number & | ||
| 4045 | 0x0000FF00) >> 8); | ||
| 4046 | sendpacket[9] = (unsigned char)(network_number & | ||
| 4047 | 0x000000FF); | ||
| 4048 | } | ||
| 4049 | } | ||
| 4050 | |||
| 4051 | |||
| 4052 | pnetwork_number = (unsigned long)((sendpacket[18] << 24) + | ||
| 4053 | (sendpacket[19] << 16) + (sendpacket[20] << 8) + | ||
| 4054 | sendpacket[21]); | ||
| 4055 | |||
| 4056 | |||
| 4057 | if( !incoming ) { | ||
| 4058 | /* If the source network is ours, make it 0 */ | ||
| 4059 | if( pnetwork_number == network_number) { | ||
| 4060 | sendpacket[18] = sendpacket[19] = sendpacket[20] = | ||
| 4061 | sendpacket[21] = 0x00; | ||
| 4062 | } | ||
| 4063 | } else { | ||
| 4064 | /* If the source network is 0, make it ours */ | ||
| 4065 | if( pnetwork_number == 0 ) { | ||
| 4066 | sendpacket[18] = (unsigned char)(network_number >> 24); | ||
| 4067 | sendpacket[19] = (unsigned char)((network_number & | ||
| 4068 | 0x00FF0000) >> 16); | ||
| 4069 | sendpacket[20] = (unsigned char)((network_number & | ||
| 4070 | 0x0000FF00) >> 8); | ||
| 4071 | sendpacket[21] = (unsigned char)(network_number & | ||
| 4072 | 0x000000FF); | ||
| 4073 | } | ||
| 4074 | } | ||
| 4075 | } /* switch_net_numbers */ | ||
| 4076 | |||
| 4077 | |||
| 4078 | |||
| 4079 | |||
| 4080 | /********************* X25API SPECIFIC FUNCTIONS ****************/ | ||
| 4081 | |||
| 4082 | |||
| 4083 | /*=============================================================== | ||
| 4084 | * find_channel | ||
| 4085 | * | ||
| 4086 | * Manages the lcn to device map. It increases performance | ||
| 4087 | * because it eliminates the need to search through the link | ||
| 4088 | * list for a device which is bounded to a specific lcn. | ||
| 4089 | * | ||
| 4090 | *===============================================================*/ | ||
| 4091 | |||
| 4092 | |||
| 4093 | struct net_device *find_channel(sdla_t *card, unsigned lcn) | ||
| 4094 | { | ||
| 4095 | if (card->u.x.LAPB_hdlc){ | ||
| 4096 | |||
| 4097 | return card->wandev.dev; | ||
| 4098 | |||
| 4099 | }else{ | ||
| 4100 | /* We don't know whether the incoming lcn | ||
| 4101 | * is a PVC or an SVC channel. But we do know that | ||
| 4102 | * the lcn cannot be for both the PVC and the SVC | ||
| 4103 | * channel. | ||
| 4104 | |||
| 4105 | * If the lcn number is greater or equal to 255, | ||
| 4106 | * take the modulo 255 of that number. We only have | ||
| 4107 | * 255 locations, thus higher numbers must be mapped | ||
| 4108 | * to a number between 0 and 245. | ||
| 4109 | |||
| 4110 | * We must separate pvc's and svc's since two don't | ||
| 4111 | * have to be contiguous. Meaning pvc's can start | ||
| 4112 | * from 1 to 10 and svc's can start from 256 to 266. | ||
| 4113 | * But 256%255 is 1, i.e. CONFLICT. | ||
| 4114 | */ | ||
| 4115 | |||
| 4116 | |||
| 4117 | /* Highest LCN number must be less or equal to 4096 */ | ||
| 4118 | if ((lcn <= MAX_LCN_NUM) && (lcn > 0)){ | ||
| 4119 | |||
| 4120 | if (lcn < X25_MAX_CHAN){ | ||
| 4121 | if (card->u.x.svc_to_dev_map[lcn]) | ||
| 4122 | return card->u.x.svc_to_dev_map[lcn]; | ||
| 4123 | |||
| 4124 | if (card->u.x.pvc_to_dev_map[lcn]) | ||
| 4125 | return card->u.x.pvc_to_dev_map[lcn]; | ||
| 4126 | |||
| 4127 | }else{ | ||
| 4128 | int new_lcn = lcn%X25_MAX_CHAN; | ||
| 4129 | if (card->u.x.svc_to_dev_map[new_lcn]) | ||
| 4130 | return card->u.x.svc_to_dev_map[new_lcn]; | ||
| 4131 | |||
| 4132 | if (card->u.x.pvc_to_dev_map[new_lcn]) | ||
| 4133 | return card->u.x.pvc_to_dev_map[new_lcn]; | ||
| 4134 | } | ||
| 4135 | } | ||
| 4136 | return NULL; | ||
| 4137 | } | ||
| 4138 | } | ||
| 4139 | |||
| 4140 | void bind_lcn_to_dev(sdla_t *card, struct net_device *dev, unsigned lcn) | ||
| 4141 | { | ||
| 4142 | x25_channel_t *chan = dev->priv; | ||
| 4143 | |||
| 4144 | /* Modulo the lcn number by X25_MAX_CHAN (255) | ||
| 4145 | * because the lcn number can be greater than 255 | ||
| 4146 | * | ||
| 4147 | * We need to split svc and pvc since they don't have | ||
| 4148 | * to be contigous. | ||
| 4149 | */ | ||
| 4150 | |||
| 4151 | if (chan->common.svc){ | ||
| 4152 | card->u.x.svc_to_dev_map[(lcn % X25_MAX_CHAN)] = dev; | ||
| 4153 | }else{ | ||
| 4154 | card->u.x.pvc_to_dev_map[(lcn % X25_MAX_CHAN)] = dev; | ||
| 4155 | } | ||
| 4156 | chan->common.lcn = lcn; | ||
| 4157 | } | ||
| 4158 | |||
| 4159 | |||
| 4160 | |||
| 4161 | /*=============================================================== | ||
| 4162 | * x25api_bh | ||
| 4163 | * | ||
| 4164 | * | ||
| 4165 | *==============================================================*/ | ||
| 4166 | |||
| 4167 | static void x25api_bh(struct net_device* dev) | ||
| 4168 | { | ||
| 4169 | x25_channel_t* chan = dev->priv; | ||
| 4170 | sdla_t* card = chan->card; | ||
| 4171 | struct sk_buff *skb; | ||
| 4172 | |||
| 4173 | if (atomic_read(&chan->bh_buff_used) == 0){ | ||
| 4174 | printk(KERN_INFO "%s: BH Buffer Empty in BH\n", | ||
| 4175 | card->devname); | ||
| 4176 | clear_bit(0, &chan->tq_working); | ||
| 4177 | return; | ||
| 4178 | } | ||
| 4179 | |||
| 4180 | while (atomic_read(&chan->bh_buff_used)){ | ||
| 4181 | |||
| 4182 | /* If the sock is in the process of unlinking the | ||
| 4183 | * driver from the socket, we must get out. | ||
| 4184 | * This never happends but is a sanity check. */ | ||
| 4185 | if (test_bit(0,&chan->common.common_critical)){ | ||
| 4186 | clear_bit(0, &chan->tq_working); | ||
| 4187 | return; | ||
| 4188 | } | ||
| 4189 | |||
| 4190 | /* If LAPB HDLC, do not drop packets if socket is | ||
| 4191 | * not connected. Let the buffer fill up and | ||
| 4192 | * turn off rx interrupt */ | ||
| 4193 | if (card->u.x.LAPB_hdlc){ | ||
| 4194 | if (chan->common.sk == NULL || chan->common.func == NULL){ | ||
| 4195 | clear_bit(0, &chan->tq_working); | ||
| 4196 | return; | ||
| 4197 | } | ||
| 4198 | } | ||
| 4199 | |||
| 4200 | skb = ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb; | ||
| 4201 | |||
| 4202 | if (skb == NULL){ | ||
| 4203 | printk(KERN_INFO "%s: BH Skb empty for read %i\n", | ||
| 4204 | card->devname,chan->bh_read); | ||
| 4205 | }else{ | ||
| 4206 | |||
| 4207 | if (chan->common.sk == NULL || chan->common.func == NULL){ | ||
| 4208 | printk(KERN_INFO "%s: BH: Socket disconnected, dropping\n", | ||
| 4209 | card->devname); | ||
| 4210 | dev_kfree_skb_any(skb); | ||
| 4211 | x25api_bh_cleanup(dev); | ||
| 4212 | ++chan->ifstats.rx_dropped; | ||
| 4213 | ++chan->rx_intr_stat.rx_intr_bfr_not_passed_to_stack; | ||
| 4214 | continue; | ||
| 4215 | } | ||
| 4216 | |||
| 4217 | |||
| 4218 | if (chan->common.func(skb,dev,chan->common.sk) != 0){ | ||
| 4219 | /* Sock full cannot send, queue us for another | ||
| 4220 | * try | ||
| 4221 | */ | ||
| 4222 | printk(KERN_INFO "%s: BH: !!! Packet failed to send !!!!! \n", | ||
| 4223 | card->devname); | ||
| 4224 | atomic_set(&chan->common.receive_block,1); | ||
| 4225 | return; | ||
| 4226 | }else{ | ||
| 4227 | x25api_bh_cleanup(dev); | ||
| 4228 | ++chan->rx_intr_stat.rx_intr_bfr_passed_to_stack; | ||
| 4229 | } | ||
| 4230 | } | ||
| 4231 | } | ||
| 4232 | clear_bit(0, &chan->tq_working); | ||
| 4233 | |||
| 4234 | return; | ||
| 4235 | } | ||
| 4236 | |||
| 4237 | /*=============================================================== | ||
| 4238 | * x25api_bh_cleanup | ||
| 4239 | * | ||
| 4240 | * | ||
| 4241 | *==============================================================*/ | ||
| 4242 | |||
| 4243 | static int x25api_bh_cleanup(struct net_device *dev) | ||
| 4244 | { | ||
| 4245 | x25_channel_t* chan = dev->priv; | ||
| 4246 | sdla_t *card = chan->card; | ||
| 4247 | TX25Status* status = card->flags; | ||
| 4248 | |||
| 4249 | |||
| 4250 | ((bh_data_t *)&chan->bh_head[chan->bh_read])->skb = NULL; | ||
| 4251 | |||
| 4252 | if (chan->bh_read == MAX_BH_BUFF){ | ||
| 4253 | chan->bh_read=0; | ||
| 4254 | }else{ | ||
| 4255 | ++chan->bh_read; | ||
| 4256 | } | ||
| 4257 | |||
| 4258 | /* If the Receive interrupt was off, it means | ||
| 4259 | * that we filled up our circular buffer. Check | ||
| 4260 | * that we have space in the buffer. If so | ||
| 4261 | * turn the RX interrupt back on. | ||
| 4262 | */ | ||
| 4263 | if (!(status->imask & INTR_ON_RX_FRAME)){ | ||
| 4264 | if (atomic_read(&chan->bh_buff_used) < (MAX_BH_BUFF+1)){ | ||
| 4265 | printk(KERN_INFO "%s: BH: Turning on the interrupt\n", | ||
| 4266 | card->devname); | ||
| 4267 | status->imask |= INTR_ON_RX_FRAME; | ||
| 4268 | } | ||
| 4269 | } | ||
| 4270 | |||
| 4271 | atomic_dec(&chan->bh_buff_used); | ||
| 4272 | return 0; | ||
| 4273 | } | ||
| 4274 | |||
| 4275 | |||
| 4276 | /*=============================================================== | ||
| 4277 | * bh_enqueue | ||
| 4278 | * | ||
| 4279 | * | ||
| 4280 | *==============================================================*/ | ||
| 4281 | |||
| 4282 | static int bh_enqueue(struct net_device *dev, struct sk_buff *skb) | ||
| 4283 | { | ||
| 4284 | x25_channel_t* chan = dev->priv; | ||
| 4285 | sdla_t *card = chan->card; | ||
| 4286 | TX25Status* status = card->flags; | ||
| 4287 | |||
| 4288 | if (atomic_read(&chan->bh_buff_used) == (MAX_BH_BUFF+1)){ | ||
| 4289 | printk(KERN_INFO "%s: Bottom half buffer FULL\n", | ||
| 4290 | card->devname); | ||
| 4291 | return 1; | ||
| 4292 | } | ||
| 4293 | |||
| 4294 | ((bh_data_t *)&chan->bh_head[chan->bh_write])->skb = skb; | ||
| 4295 | |||
| 4296 | if (chan->bh_write == MAX_BH_BUFF){ | ||
| 4297 | chan->bh_write=0; | ||
| 4298 | }else{ | ||
| 4299 | ++chan->bh_write; | ||
| 4300 | } | ||
| 4301 | |||
| 4302 | atomic_inc(&chan->bh_buff_used); | ||
| 4303 | |||
| 4304 | if (atomic_read(&chan->bh_buff_used) == (MAX_BH_BUFF+1)){ | ||
| 4305 | printk(KERN_INFO "%s: Buffer is now full, Turning off RX Intr\n", | ||
| 4306 | card->devname); | ||
| 4307 | status->imask &= ~INTR_ON_RX_FRAME; | ||
| 4308 | } | ||
| 4309 | |||
| 4310 | return 0; | ||
| 4311 | } | ||
| 4312 | |||
| 4313 | |||
| 4314 | /*=============================================================== | ||
| 4315 | * timer_intr_cmd_exec | ||
| 4316 | * | ||
| 4317 | * Called by timer interrupt to execute a command | ||
| 4318 | *===============================================================*/ | ||
| 4319 | |||
| 4320 | static int timer_intr_cmd_exec (sdla_t* card) | ||
| 4321 | { | ||
| 4322 | struct net_device *dev; | ||
| 4323 | unsigned char more_to_exec=0; | ||
| 4324 | volatile x25_channel_t *chan=NULL; | ||
| 4325 | int i=0,bad_cmd=0,err=0; | ||
| 4326 | |||
| 4327 | if (card->u.x.cmd_dev == NULL){ | ||
| 4328 | card->u.x.cmd_dev = card->wandev.dev; | ||
| 4329 | } | ||
| 4330 | |||
| 4331 | dev = card->u.x.cmd_dev; | ||
| 4332 | |||
| 4333 | for (;;){ | ||
| 4334 | |||
| 4335 | chan = dev->priv; | ||
| 4336 | |||
| 4337 | if (atomic_read(&chan->common.command)){ | ||
| 4338 | |||
| 4339 | bad_cmd = check_bad_command(card,dev); | ||
| 4340 | |||
| 4341 | if ((!chan->common.mbox || atomic_read(&chan->common.disconnect)) && | ||
| 4342 | !bad_cmd){ | ||
| 4343 | |||
| 4344 | /* Socket has died or exited, We must bring the | ||
| 4345 | * channel down before anybody else tries to | ||
| 4346 | * use it */ | ||
| 4347 | err = channel_disconnect(card,dev); | ||
| 4348 | }else{ | ||
| 4349 | err = execute_delayed_cmd(card, dev, | ||
| 4350 | (mbox_cmd_t*)chan->common.mbox, | ||
| 4351 | bad_cmd); | ||
| 4352 | } | ||
| 4353 | |||
| 4354 | switch (err){ | ||
| 4355 | |||
| 4356 | case RETURN_RESULT: | ||
| 4357 | |||
| 4358 | /* Return the result to the socket without | ||
| 4359 | * delay. NO_WAIT Command */ | ||
| 4360 | atomic_set(&chan->common.command,0); | ||
| 4361 | if (atomic_read(&card->u.x.command_busy)) | ||
| 4362 | atomic_set(&card->u.x.command_busy,0); | ||
| 4363 | |||
| 4364 | send_delayed_cmd_result(card,dev,card->mbox); | ||
| 4365 | |||
| 4366 | more_to_exec=0; | ||
| 4367 | break; | ||
| 4368 | case DELAY_RESULT: | ||
| 4369 | |||
| 4370 | /* Wait for the remote to respond, before | ||
| 4371 | * sending the result up to the socket. | ||
| 4372 | * WAIT command */ | ||
| 4373 | if (atomic_read(&card->u.x.command_busy)) | ||
| 4374 | atomic_set(&card->u.x.command_busy,0); | ||
| 4375 | |||
| 4376 | atomic_set(&chan->common.command,0); | ||
| 4377 | more_to_exec=0; | ||
| 4378 | break; | ||
| 4379 | default: | ||
| 4380 | |||
| 4381 | /* If command could not be executed for | ||
| 4382 | * some reason (i.e return code 0x33 busy) | ||
| 4383 | * set the more_to_exec bit which will | ||
| 4384 | * indicate that this command must be exectued | ||
| 4385 | * again during next timer interrupt | ||
| 4386 | */ | ||
| 4387 | more_to_exec=1; | ||
| 4388 | if (atomic_read(&card->u.x.command_busy) == 0) | ||
| 4389 | atomic_set(&card->u.x.command_busy,1); | ||
| 4390 | break; | ||
| 4391 | } | ||
| 4392 | |||
| 4393 | bad_cmd=0; | ||
| 4394 | |||
| 4395 | /* If flags is set, there are no hdlc buffers, | ||
| 4396 | * thus, wait for the next pass and try the | ||
| 4397 | * same command again. Otherwise, start searching | ||
| 4398 | * from next device on the next pass. | ||
| 4399 | */ | ||
| 4400 | if (!more_to_exec){ | ||
| 4401 | dev = move_dev_to_next(card,dev); | ||
| 4402 | } | ||
| 4403 | break; | ||
| 4404 | }else{ | ||
| 4405 | /* This device has nothing to execute, | ||
| 4406 | * go to next. | ||
| 4407 | */ | ||
| 4408 | if (atomic_read(&card->u.x.command_busy)) | ||
| 4409 | atomic_set(&card->u.x.command_busy,0); | ||
| 4410 | dev = move_dev_to_next(card,dev); | ||
| 4411 | } | ||
| 4412 | |||
| 4413 | if (++i == card->u.x.no_dev){ | ||
| 4414 | if (!more_to_exec){ | ||
| 4415 | DBG_PRINTK(KERN_INFO "%s: Nothing to execute in Timer\n", | ||
| 4416 | card->devname); | ||
| 4417 | if (atomic_read(&card->u.x.command_busy)){ | ||
| 4418 | atomic_set(&card->u.x.command_busy,0); | ||
| 4419 | } | ||
| 4420 | } | ||
| 4421 | break; | ||
| 4422 | } | ||
| 4423 | |||
| 4424 | } //End of FOR | ||
| 4425 | |||
| 4426 | card->u.x.cmd_dev = dev; | ||
| 4427 | |||
| 4428 | if (more_to_exec){ | ||
| 4429 | /* If more commands are pending, do not turn off timer | ||
| 4430 | * interrupt */ | ||
| 4431 | return 1; | ||
| 4432 | }else{ | ||
| 4433 | /* No more commands, turn off timer interrupt */ | ||
| 4434 | return 0; | ||
| 4435 | } | ||
| 4436 | } | ||
| 4437 | |||
| 4438 | /*=============================================================== | ||
| 4439 | * execute_delayed_cmd | ||
| 4440 | * | ||
| 4441 | * Execute an API command which was passed down from the | ||
| 4442 | * sock. Sock is very limited in which commands it can | ||
| 4443 | * execute. Wait and No Wait commands are supported. | ||
| 4444 | * Place Call, Clear Call and Reset wait commands, where | ||
| 4445 | * Accept Call is a no_wait command. | ||
| 4446 | * | ||
| 4447 | *===============================================================*/ | ||
| 4448 | |||
| 4449 | static int execute_delayed_cmd(sdla_t* card, struct net_device *dev, | ||
| 4450 | mbox_cmd_t *usr_cmd, char bad_cmd) | ||
| 4451 | { | ||
| 4452 | TX25Mbox* mbox = card->mbox; | ||
| 4453 | int err; | ||
| 4454 | x25_channel_t *chan = dev->priv; | ||
| 4455 | int delay=RETURN_RESULT; | ||
| 4456 | |||
| 4457 | if (!(*card->u.x.hdlc_buf_status & 0x40) && !bad_cmd){ | ||
| 4458 | return TRY_CMD_AGAIN; | ||
| 4459 | } | ||
| 4460 | |||
| 4461 | /* This way a command is guaranteed to be executed for | ||
| 4462 | * a specific lcn, the network interface is bound to. */ | ||
| 4463 | usr_cmd->cmd.lcn = chan->common.lcn; | ||
| 4464 | |||
| 4465 | |||
| 4466 | /* If channel is pvc, instead of place call | ||
| 4467 | * run x25_channel configuration. If running LAPB HDLC | ||
| 4468 | * enable communications. | ||
| 4469 | */ | ||
| 4470 | if ((!chan->common.svc) && (usr_cmd->cmd.command == X25_PLACE_CALL)){ | ||
| 4471 | |||
| 4472 | if (card->u.x.LAPB_hdlc){ | ||
| 4473 | DBG_PRINTK(KERN_INFO "LAPB: Connecting\n"); | ||
| 4474 | connect(card); | ||
| 4475 | set_chan_state(dev,WAN_CONNECTING); | ||
| 4476 | return DELAY_RESULT; | ||
| 4477 | }else{ | ||
| 4478 | DBG_PRINTK(KERN_INFO "%s: PVC is CONNECTING\n",card->devname); | ||
| 4479 | if (x25_get_chan_conf(card, chan) == CMD_OK){ | ||
| 4480 | set_chan_state(dev, WAN_CONNECTED); | ||
| 4481 | }else{ | ||
| 4482 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 4483 | } | ||
| 4484 | return RETURN_RESULT; | ||
| 4485 | } | ||
| 4486 | } | ||
| 4487 | |||
| 4488 | /* Copy the socket mbox command onto the board */ | ||
| 4489 | |||
| 4490 | memcpy(&mbox->cmd, &usr_cmd->cmd, sizeof(TX25Cmd)); | ||
| 4491 | if (usr_cmd->cmd.length){ | ||
| 4492 | memcpy(mbox->data, usr_cmd->data, usr_cmd->cmd.length); | ||
| 4493 | } | ||
| 4494 | |||
| 4495 | /* Check if command is bad. We need to copy the cmd into | ||
| 4496 | * the buffer regardless since we return the, mbox to | ||
| 4497 | * the user */ | ||
| 4498 | if (bad_cmd){ | ||
| 4499 | mbox->cmd.result=0x01; | ||
| 4500 | return RETURN_RESULT; | ||
| 4501 | } | ||
| 4502 | |||
| 4503 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4504 | |||
| 4505 | if (err != CMD_OK && err != X25RES_NOT_READY) | ||
| 4506 | x25_error(card, err, usr_cmd->cmd.command, usr_cmd->cmd.lcn); | ||
| 4507 | |||
| 4508 | if (mbox->cmd.result == X25RES_NOT_READY){ | ||
| 4509 | return TRY_CMD_AGAIN; | ||
| 4510 | } | ||
| 4511 | |||
| 4512 | switch (mbox->cmd.command){ | ||
| 4513 | |||
| 4514 | case X25_PLACE_CALL: | ||
| 4515 | |||
| 4516 | switch (mbox->cmd.result){ | ||
| 4517 | |||
| 4518 | case CMD_OK: | ||
| 4519 | |||
| 4520 | /* Check if Place call is a wait command or a | ||
| 4521 | * no wait command */ | ||
| 4522 | if (atomic_read(&chan->common.command) & 0x80) | ||
| 4523 | delay=RETURN_RESULT; | ||
| 4524 | else | ||
| 4525 | delay=DELAY_RESULT; | ||
| 4526 | |||
| 4527 | |||
| 4528 | DBG_PRINTK(KERN_INFO "\n%s: PLACE CALL Binding dev %s to lcn %i\n", | ||
| 4529 | card->devname,dev->name, mbox->cmd.lcn); | ||
| 4530 | |||
| 4531 | bind_lcn_to_dev (card, dev, mbox->cmd.lcn); | ||
| 4532 | set_chan_state(dev, WAN_CONNECTING); | ||
| 4533 | break; | ||
| 4534 | |||
| 4535 | |||
| 4536 | default: | ||
| 4537 | delay=RETURN_RESULT; | ||
| 4538 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 4539 | break; | ||
| 4540 | } | ||
| 4541 | break; | ||
| 4542 | |||
| 4543 | case X25_ACCEPT_CALL: | ||
| 4544 | |||
| 4545 | switch (mbox->cmd.result){ | ||
| 4546 | |||
| 4547 | case CMD_OK: | ||
| 4548 | |||
| 4549 | DBG_PRINTK(KERN_INFO "\n%s: ACCEPT Binding dev %s to lcn %i\n", | ||
| 4550 | card->devname,dev->name,mbox->cmd.lcn); | ||
| 4551 | |||
| 4552 | bind_lcn_to_dev (card, dev, mbox->cmd.lcn); | ||
| 4553 | |||
| 4554 | if (x25_get_chan_conf(card, chan) == CMD_OK){ | ||
| 4555 | |||
| 4556 | set_chan_state(dev, WAN_CONNECTED); | ||
| 4557 | delay=RETURN_RESULT; | ||
| 4558 | |||
| 4559 | }else{ | ||
| 4560 | if (x25_clear_call(card, usr_cmd->cmd.lcn, 0, 0) == CMD_OK){ | ||
| 4561 | /* if clear is successful, wait for clear confirm | ||
| 4562 | */ | ||
| 4563 | delay=DELAY_RESULT; | ||
| 4564 | }else{ | ||
| 4565 | /* Do not change the state here. If we fail | ||
| 4566 | * the accept the return code is send up | ||
| 4567 | *the stack, which will ether retry | ||
| 4568 | * or clear the call | ||
| 4569 | */ | ||
| 4570 | DBG_PRINTK(KERN_INFO | ||
| 4571 | "%s: ACCEPT: STATE MAY BE CURRUPTED 2 !!!!!\n", | ||
| 4572 | card->devname); | ||
| 4573 | delay=RETURN_RESULT; | ||
| 4574 | } | ||
| 4575 | } | ||
| 4576 | break; | ||
| 4577 | |||
| 4578 | |||
| 4579 | case X25RES_ASYNC_PACKET: | ||
| 4580 | delay=TRY_CMD_AGAIN; | ||
| 4581 | break; | ||
| 4582 | |||
| 4583 | default: | ||
| 4584 | DBG_PRINTK(KERN_INFO "%s: ACCEPT FAILED\n",card->devname); | ||
| 4585 | if (x25_clear_call(card, usr_cmd->cmd.lcn, 0, 0) == CMD_OK){ | ||
| 4586 | delay=DELAY_RESULT; | ||
| 4587 | }else{ | ||
| 4588 | /* Do not change the state here. If we fail the accept. The | ||
| 4589 | * return code is send up the stack, which will ether retry | ||
| 4590 | * or clear the call */ | ||
| 4591 | DBG_PRINTK(KERN_INFO | ||
| 4592 | "%s: ACCEPT: STATE MAY BE CORRUPTED 1 !!!!!\n", | ||
| 4593 | card->devname); | ||
| 4594 | delay=RETURN_RESULT; | ||
| 4595 | } | ||
| 4596 | } | ||
| 4597 | break; | ||
| 4598 | |||
| 4599 | case X25_CLEAR_CALL: | ||
| 4600 | |||
| 4601 | switch (mbox->cmd.result){ | ||
| 4602 | |||
| 4603 | case CMD_OK: | ||
| 4604 | DBG_PRINTK(KERN_INFO | ||
| 4605 | "CALL CLEAR OK: Dev %s Mbox Lcn %i Chan Lcn %i\n", | ||
| 4606 | dev->name,mbox->cmd.lcn,chan->common.lcn); | ||
| 4607 | set_chan_state(dev, WAN_DISCONNECTING); | ||
| 4608 | delay = DELAY_RESULT; | ||
| 4609 | break; | ||
| 4610 | |||
| 4611 | case X25RES_CHANNEL_IN_USE: | ||
| 4612 | case X25RES_ASYNC_PACKET: | ||
| 4613 | delay = TRY_CMD_AGAIN; | ||
| 4614 | break; | ||
| 4615 | |||
| 4616 | case X25RES_LINK_NOT_IN_ABM: | ||
| 4617 | case X25RES_INVAL_LCN: | ||
| 4618 | case X25RES_INVAL_STATE: | ||
| 4619 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 4620 | delay = RETURN_RESULT; | ||
| 4621 | break; | ||
| 4622 | |||
| 4623 | default: | ||
| 4624 | /* If command did not execute because of user | ||
| 4625 | * fault, do not change the state. This will | ||
| 4626 | * signal the socket that clear command failed. | ||
| 4627 | * User can retry or close the socket. | ||
| 4628 | * When socket gets killed, it will set the | ||
| 4629 | * chan->disconnect which will signal | ||
| 4630 | * driver to clear the call */ | ||
| 4631 | printk(KERN_INFO "%s: Clear Command Failed, Rc %x\n", | ||
| 4632 | card->devname,mbox->cmd.command); | ||
| 4633 | delay = RETURN_RESULT; | ||
| 4634 | } | ||
| 4635 | break; | ||
| 4636 | } | ||
| 4637 | |||
| 4638 | return delay; | ||
| 4639 | } | ||
| 4640 | |||
| 4641 | /*=============================================================== | ||
| 4642 | * api_incoming_call | ||
| 4643 | * | ||
| 4644 | * Pass an incoming call request up the listening | ||
| 4645 | * sock. If the API sock is not listening reject the | ||
| 4646 | * call. | ||
| 4647 | * | ||
| 4648 | *===============================================================*/ | ||
| 4649 | |||
| 4650 | static int api_incoming_call (sdla_t* card, TX25Mbox *mbox, int lcn) | ||
| 4651 | { | ||
| 4652 | struct sk_buff *skb; | ||
| 4653 | int len = sizeof(TX25Cmd)+mbox->cmd.length; | ||
| 4654 | |||
| 4655 | if (alloc_and_init_skb_buf(card, &skb, len)){ | ||
| 4656 | printk(KERN_INFO "%s: API incoming call, no memory\n",card->devname); | ||
| 4657 | return 1; | ||
| 4658 | } | ||
| 4659 | |||
| 4660 | memcpy(skb_put(skb,len),&mbox->cmd,len); | ||
| 4661 | |||
| 4662 | skb->mac.raw = skb->data; | ||
| 4663 | skb->protocol = htons(X25_PROT); | ||
| 4664 | skb->pkt_type = WAN_PACKET_ASYNC; | ||
| 4665 | |||
| 4666 | if (card->func(skb,card->sk) < 0){ | ||
| 4667 | printk(KERN_INFO "%s: MAJOR ERROR: Failed to send up place call \n",card->devname); | ||
| 4668 | dev_kfree_skb_any(skb); | ||
| 4669 | return 1; | ||
| 4670 | } | ||
| 4671 | |||
| 4672 | return 0; | ||
| 4673 | } | ||
| 4674 | |||
| 4675 | /*=============================================================== | ||
| 4676 | * send_delayed_cmd_result | ||
| 4677 | * | ||
| 4678 | * Wait commands like PLEACE CALL or CLEAR CALL must wait | ||
| 4679 | * until the result arrives. This function passes | ||
| 4680 | * the result to a waiting sock. | ||
| 4681 | * | ||
| 4682 | *===============================================================*/ | ||
| 4683 | static void send_delayed_cmd_result(sdla_t *card, struct net_device *dev, | ||
| 4684 | TX25Mbox* mbox) | ||
| 4685 | { | ||
| 4686 | x25_channel_t *chan = dev->priv; | ||
| 4687 | mbox_cmd_t *usr_cmd = (mbox_cmd_t *)chan->common.mbox; | ||
| 4688 | struct sk_buff *skb; | ||
| 4689 | int len=sizeof(unsigned char); | ||
| 4690 | |||
| 4691 | atomic_set(&chan->common.command,0); | ||
| 4692 | |||
| 4693 | /* If the sock is in the process of unlinking the | ||
| 4694 | * driver from the socket, we must get out. | ||
| 4695 | * This never happends but is a sanity check. */ | ||
| 4696 | if (test_bit(0,&chan->common.common_critical)){ | ||
| 4697 | return; | ||
| 4698 | } | ||
| 4699 | |||
| 4700 | if (!usr_cmd || !chan->common.sk || !chan->common.func){ | ||
| 4701 | DBG_PRINTK(KERN_INFO "Delay result: Sock not bounded sk: %u, func: %u, mbox: %u\n", | ||
| 4702 | (unsigned int)chan->common.sk, | ||
| 4703 | (unsigned int)chan->common.func, | ||
| 4704 | (unsigned int)usr_cmd); | ||
| 4705 | return; | ||
| 4706 | } | ||
| 4707 | |||
| 4708 | memcpy(&usr_cmd->cmd, &mbox->cmd, sizeof(TX25Cmd)); | ||
| 4709 | if (mbox->cmd.length > 0){ | ||
| 4710 | memcpy(usr_cmd->data, mbox->data, mbox->cmd.length); | ||
| 4711 | } | ||
| 4712 | |||
| 4713 | if (alloc_and_init_skb_buf(card,&skb,len)){ | ||
| 4714 | printk(KERN_INFO "Delay result: No sock buffers\n"); | ||
| 4715 | return; | ||
| 4716 | } | ||
| 4717 | |||
| 4718 | memcpy(skb_put(skb,len),&mbox->cmd.command,len); | ||
| 4719 | |||
| 4720 | skb->mac.raw = skb->data; | ||
| 4721 | skb->pkt_type = WAN_PACKET_CMD; | ||
| 4722 | |||
| 4723 | chan->common.func(skb,dev,chan->common.sk); | ||
| 4724 | } | ||
| 4725 | |||
| 4726 | /*=============================================================== | ||
| 4727 | * clear_confirm_event | ||
| 4728 | * | ||
| 4729 | * Pass the clear confirmation event up the sock. The | ||
| 4730 | * API will disconnect only after the clear confirmation | ||
| 4731 | * has been received. | ||
| 4732 | * | ||
| 4733 | * Depending on the state, clear confirmation could | ||
| 4734 | * be an OOB event, or a result of an API command. | ||
| 4735 | *===============================================================*/ | ||
| 4736 | |||
| 4737 | static int clear_confirm_event (sdla_t *card, TX25Mbox* mb) | ||
| 4738 | { | ||
| 4739 | struct net_device *dev; | ||
| 4740 | x25_channel_t *chan; | ||
| 4741 | unsigned char old_state; | ||
| 4742 | |||
| 4743 | dev = find_channel(card,mb->cmd.lcn); | ||
| 4744 | if (!dev){ | ||
| 4745 | DBG_PRINTK(KERN_INFO "%s: *** GOT CLEAR BUT NO DEV %i\n", | ||
| 4746 | card->devname,mb->cmd.lcn); | ||
| 4747 | return 0; | ||
| 4748 | } | ||
| 4749 | |||
| 4750 | chan=dev->priv; | ||
| 4751 | DBG_PRINTK(KERN_INFO "%s: GOT CLEAR CONFIRM %s: Mbox lcn %i Chan lcn %i\n", | ||
| 4752 | card->devname, dev->name, mb->cmd.lcn, chan->common.lcn); | ||
| 4753 | |||
| 4754 | /* If not API fall through to default. | ||
| 4755 | * If API, send the result to a waiting | ||
| 4756 | * socket. | ||
| 4757 | */ | ||
| 4758 | |||
| 4759 | old_state = chan->common.state; | ||
| 4760 | set_chan_state(dev, WAN_DISCONNECTED); | ||
| 4761 | |||
| 4762 | if (chan->common.usedby == API){ | ||
| 4763 | switch (old_state) { | ||
| 4764 | |||
| 4765 | case WAN_DISCONNECTING: | ||
| 4766 | case WAN_CONNECTING: | ||
| 4767 | send_delayed_cmd_result(card,dev,mb); | ||
| 4768 | break; | ||
| 4769 | case WAN_CONNECTED: | ||
| 4770 | send_oob_msg(card,dev,mb); | ||
| 4771 | break; | ||
| 4772 | } | ||
| 4773 | return 1; | ||
| 4774 | } | ||
| 4775 | |||
| 4776 | return 0; | ||
| 4777 | } | ||
| 4778 | |||
| 4779 | /*=============================================================== | ||
| 4780 | * send_oob_msg | ||
| 4781 | * | ||
| 4782 | * Construct an NEM Message and pass it up the connected | ||
| 4783 | * sock. If the sock is not bounded discard the NEM. | ||
| 4784 | * | ||
| 4785 | *===============================================================*/ | ||
| 4786 | |||
| 4787 | static void send_oob_msg(sdla_t *card, struct net_device *dev, TX25Mbox *mbox) | ||
| 4788 | { | ||
| 4789 | x25_channel_t *chan = dev->priv; | ||
| 4790 | mbox_cmd_t *usr_cmd = (mbox_cmd_t *)chan->common.mbox; | ||
| 4791 | struct sk_buff *skb; | ||
| 4792 | int len=sizeof(x25api_hdr_t)+mbox->cmd.length; | ||
| 4793 | x25api_t *api_hdr; | ||
| 4794 | |||
| 4795 | /* If the sock is in the process of unlinking the | ||
| 4796 | * driver from the socket, we must get out. | ||
| 4797 | * This never happends but is a sanity check. */ | ||
| 4798 | if (test_bit(0,&chan->common.common_critical)){ | ||
| 4799 | return; | ||
| 4800 | } | ||
| 4801 | |||
| 4802 | if (!usr_cmd || !chan->common.sk || !chan->common.func){ | ||
| 4803 | DBG_PRINTK(KERN_INFO "OOB MSG: Sock not bounded\n"); | ||
| 4804 | return; | ||
| 4805 | } | ||
| 4806 | |||
| 4807 | memcpy(&usr_cmd->cmd, &mbox->cmd, sizeof(TX25Cmd)); | ||
| 4808 | if (mbox->cmd.length > 0){ | ||
| 4809 | memcpy(usr_cmd->data, mbox->data, mbox->cmd.length); | ||
| 4810 | } | ||
| 4811 | |||
| 4812 | if (alloc_and_init_skb_buf(card,&skb,len)){ | ||
| 4813 | printk(KERN_INFO "%s: OOB MSG: No sock buffers\n",card->devname); | ||
| 4814 | return; | ||
| 4815 | } | ||
| 4816 | |||
| 4817 | api_hdr = (x25api_t*)skb_put(skb,len); | ||
| 4818 | api_hdr->hdr.pktType = mbox->cmd.pktType & 0x7F; | ||
| 4819 | api_hdr->hdr.qdm = mbox->cmd.qdm; | ||
| 4820 | api_hdr->hdr.cause = mbox->cmd.cause; | ||
| 4821 | api_hdr->hdr.diagn = mbox->cmd.diagn; | ||
| 4822 | api_hdr->hdr.length = mbox->cmd.length; | ||
| 4823 | api_hdr->hdr.result = mbox->cmd.result; | ||
| 4824 | api_hdr->hdr.lcn = mbox->cmd.lcn; | ||
| 4825 | |||
| 4826 | if (mbox->cmd.length > 0){ | ||
| 4827 | memcpy(api_hdr->data,mbox->data,mbox->cmd.length); | ||
| 4828 | } | ||
| 4829 | |||
| 4830 | skb->mac.raw = skb->data; | ||
| 4831 | skb->pkt_type = WAN_PACKET_ERR; | ||
| 4832 | |||
| 4833 | if (chan->common.func(skb,dev,chan->common.sk) < 0){ | ||
| 4834 | if (bh_enqueue(dev,skb)){ | ||
| 4835 | printk(KERN_INFO "%s: Dropping OOB MSG\n",card->devname); | ||
| 4836 | dev_kfree_skb_any(skb); | ||
| 4837 | } | ||
| 4838 | } | ||
| 4839 | |||
| 4840 | DBG_PRINTK(KERN_INFO "%s: OOB MSG OK, %s, lcn %i\n", | ||
| 4841 | card->devname, dev->name, mbox->cmd.lcn); | ||
| 4842 | } | ||
| 4843 | |||
| 4844 | /*=============================================================== | ||
| 4845 | * alloc_and_init_skb_buf | ||
| 4846 | * | ||
| 4847 | * Allocate and initialize an skb buffer. | ||
| 4848 | * | ||
| 4849 | *===============================================================*/ | ||
| 4850 | |||
| 4851 | static int alloc_and_init_skb_buf (sdla_t *card, struct sk_buff **skb, int len) | ||
| 4852 | { | ||
| 4853 | struct sk_buff *new_skb = *skb; | ||
| 4854 | |||
| 4855 | new_skb = dev_alloc_skb(len + X25_HRDHDR_SZ); | ||
| 4856 | if (new_skb == NULL){ | ||
| 4857 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 4858 | card->devname); | ||
| 4859 | return 1; | ||
| 4860 | } | ||
| 4861 | |||
| 4862 | if (skb_tailroom(new_skb) < len){ | ||
| 4863 | /* No room for the packet. Call off the whole thing! */ | ||
| 4864 | dev_kfree_skb_any(new_skb); | ||
| 4865 | printk(KERN_INFO "%s: Listen: unexpectedly long packet sequence\n" | ||
| 4866 | ,card->devname); | ||
| 4867 | *skb = NULL; | ||
| 4868 | return 1; | ||
| 4869 | } | ||
| 4870 | |||
| 4871 | *skb = new_skb; | ||
| 4872 | return 0; | ||
| 4873 | |||
| 4874 | } | ||
| 4875 | |||
| 4876 | /*=============================================================== | ||
| 4877 | * api_oob_event | ||
| 4878 | * | ||
| 4879 | * Send an OOB event up to the sock | ||
| 4880 | * | ||
| 4881 | *===============================================================*/ | ||
| 4882 | |||
| 4883 | static void api_oob_event (sdla_t *card,TX25Mbox *mbox) | ||
| 4884 | { | ||
| 4885 | struct net_device *dev = find_channel(card, mbox->cmd.lcn); | ||
| 4886 | x25_channel_t *chan; | ||
| 4887 | |||
| 4888 | if (!dev) | ||
| 4889 | return; | ||
| 4890 | |||
| 4891 | chan=dev->priv; | ||
| 4892 | |||
| 4893 | if (chan->common.usedby == API) | ||
| 4894 | send_oob_msg(card,dev,mbox); | ||
| 4895 | |||
| 4896 | } | ||
| 4897 | |||
| 4898 | |||
| 4899 | |||
| 4900 | |||
| 4901 | static int channel_disconnect(sdla_t* card, struct net_device *dev) | ||
| 4902 | { | ||
| 4903 | |||
| 4904 | int err; | ||
| 4905 | x25_channel_t *chan = dev->priv; | ||
| 4906 | |||
| 4907 | DBG_PRINTK(KERN_INFO "%s: TIMER: %s, Device down disconnecting\n", | ||
| 4908 | card->devname,dev->name); | ||
| 4909 | |||
| 4910 | if (chan->common.svc){ | ||
| 4911 | err = x25_clear_call(card,chan->common.lcn,0,0); | ||
| 4912 | }else{ | ||
| 4913 | /* If channel is PVC or LAPB HDLC, there is no call | ||
| 4914 | * to be cleared, thus drop down to the default | ||
| 4915 | * area | ||
| 4916 | */ | ||
| 4917 | err = 1; | ||
| 4918 | } | ||
| 4919 | |||
| 4920 | switch (err){ | ||
| 4921 | |||
| 4922 | case X25RES_CHANNEL_IN_USE: | ||
| 4923 | case X25RES_NOT_READY: | ||
| 4924 | err = TRY_CMD_AGAIN; | ||
| 4925 | break; | ||
| 4926 | case CMD_OK: | ||
| 4927 | DBG_PRINTK(KERN_INFO "CALL CLEAR OK: Dev %s Chan Lcn %i\n", | ||
| 4928 | dev->name,chan->common.lcn); | ||
| 4929 | |||
| 4930 | set_chan_state(dev,WAN_DISCONNECTING); | ||
| 4931 | atomic_set(&chan->common.command,0); | ||
| 4932 | err = DELAY_RESULT; | ||
| 4933 | break; | ||
| 4934 | default: | ||
| 4935 | /* If LAPB HDLC protocol, bring the whole link down | ||
| 4936 | * once the application terminates | ||
| 4937 | */ | ||
| 4938 | |||
| 4939 | set_chan_state(dev,WAN_DISCONNECTED); | ||
| 4940 | |||
| 4941 | if (card->u.x.LAPB_hdlc){ | ||
| 4942 | DBG_PRINTK(KERN_INFO "LAPB: Disconnecting Link\n"); | ||
| 4943 | hdlc_link_down (card); | ||
| 4944 | } | ||
| 4945 | atomic_set(&chan->common.command,0); | ||
| 4946 | err = RETURN_RESULT; | ||
| 4947 | break; | ||
| 4948 | } | ||
| 4949 | |||
| 4950 | return err; | ||
| 4951 | } | ||
| 4952 | |||
| 4953 | static void hdlc_link_down (sdla_t *card) | ||
| 4954 | { | ||
| 4955 | TX25Mbox* mbox = card->mbox; | ||
| 4956 | int retry = 5; | ||
| 4957 | int err=0; | ||
| 4958 | |||
| 4959 | do { | ||
| 4960 | memset(mbox,0,sizeof(TX25Mbox)); | ||
| 4961 | mbox->cmd.command = X25_HDLC_LINK_DISC; | ||
| 4962 | mbox->cmd.length = 1; | ||
| 4963 | mbox->data[0]=0; | ||
| 4964 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 4965 | |||
| 4966 | } while (err && retry-- && x25_error(card, err, X25_HDLC_LINK_DISC, 0)); | ||
| 4967 | |||
| 4968 | if (err) | ||
| 4969 | printk(KERN_INFO "%s: Hdlc Link Down Failed %x\n",card->devname,err); | ||
| 4970 | |||
| 4971 | disconnect (card); | ||
| 4972 | |||
| 4973 | } | ||
| 4974 | |||
| 4975 | static int check_bad_command(sdla_t* card, struct net_device *dev) | ||
| 4976 | { | ||
| 4977 | x25_channel_t *chan = dev->priv; | ||
| 4978 | int bad_cmd = 0; | ||
| 4979 | |||
| 4980 | switch (atomic_read(&chan->common.command)&0x7F){ | ||
| 4981 | |||
| 4982 | case X25_PLACE_CALL: | ||
| 4983 | if (chan->common.state != WAN_DISCONNECTED) | ||
| 4984 | bad_cmd=1; | ||
| 4985 | break; | ||
| 4986 | case X25_CLEAR_CALL: | ||
| 4987 | if (chan->common.state == WAN_DISCONNECTED) | ||
| 4988 | bad_cmd=1; | ||
| 4989 | break; | ||
| 4990 | case X25_ACCEPT_CALL: | ||
| 4991 | if (chan->common.state != WAN_CONNECTING) | ||
| 4992 | bad_cmd=1; | ||
| 4993 | break; | ||
| 4994 | case X25_RESET: | ||
| 4995 | if (chan->common.state != WAN_CONNECTED) | ||
| 4996 | bad_cmd=1; | ||
| 4997 | break; | ||
| 4998 | default: | ||
| 4999 | bad_cmd=1; | ||
| 5000 | break; | ||
| 5001 | } | ||
| 5002 | |||
| 5003 | if (bad_cmd){ | ||
| 5004 | printk(KERN_INFO "%s: Invalid State, BAD Command %x, dev %s, lcn %i, st %i\n", | ||
| 5005 | card->devname,atomic_read(&chan->common.command),dev->name, | ||
| 5006 | chan->common.lcn, chan->common.state); | ||
| 5007 | } | ||
| 5008 | |||
| 5009 | return bad_cmd; | ||
| 5010 | } | ||
| 5011 | |||
| 5012 | |||
| 5013 | |||
| 5014 | /*************************** XPIPEMON FUNCTIONS **************************/ | ||
| 5015 | |||
| 5016 | /*============================================================================== | ||
| 5017 | * Process UDP call of type XPIPE | ||
| 5018 | */ | ||
| 5019 | |||
| 5020 | static int process_udp_mgmt_pkt(sdla_t *card) | ||
| 5021 | { | ||
| 5022 | int c_retry = MAX_CMD_RETRY; | ||
| 5023 | unsigned int len; | ||
| 5024 | struct sk_buff *new_skb; | ||
| 5025 | TX25Mbox *mbox = card->mbox; | ||
| 5026 | int err; | ||
| 5027 | int udp_mgmt_req_valid = 1; | ||
| 5028 | struct net_device *dev; | ||
| 5029 | x25_channel_t *chan; | ||
| 5030 | unsigned short lcn; | ||
| 5031 | struct timeval tv; | ||
| 5032 | |||
| 5033 | |||
| 5034 | x25_udp_pkt_t *x25_udp_pkt; | ||
| 5035 | x25_udp_pkt = (x25_udp_pkt_t *)card->u.x.udp_pkt_data; | ||
| 5036 | |||
| 5037 | dev = card->u.x.udp_dev; | ||
| 5038 | chan = dev->priv; | ||
| 5039 | lcn = chan->common.lcn; | ||
| 5040 | |||
| 5041 | switch(x25_udp_pkt->cblock.command) { | ||
| 5042 | |||
| 5043 | /* XPIPE_ENABLE_TRACE */ | ||
| 5044 | case XPIPE_ENABLE_TRACING: | ||
| 5045 | |||
| 5046 | /* XPIPE_GET_TRACE_INFO */ | ||
| 5047 | case XPIPE_GET_TRACE_INFO: | ||
| 5048 | |||
| 5049 | /* SET FT1 MODE */ | ||
| 5050 | case XPIPE_SET_FT1_MODE: | ||
| 5051 | |||
| 5052 | if(card->u.x.udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 5053 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_direction_err; | ||
| 5054 | udp_mgmt_req_valid = 0; | ||
| 5055 | break; | ||
| 5056 | } | ||
| 5057 | |||
| 5058 | /* XPIPE_FT1_READ_STATUS */ | ||
| 5059 | case XPIPE_FT1_READ_STATUS: | ||
| 5060 | |||
| 5061 | /* FT1 MONITOR STATUS */ | ||
| 5062 | case XPIPE_FT1_STATUS_CTRL: | ||
| 5063 | if(card->hw.fwid != SFID_X25_508) { | ||
| 5064 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_type_err; | ||
| 5065 | udp_mgmt_req_valid = 0; | ||
| 5066 | break; | ||
| 5067 | } | ||
| 5068 | default: | ||
| 5069 | break; | ||
| 5070 | } | ||
| 5071 | |||
| 5072 | if(!udp_mgmt_req_valid) { | ||
| 5073 | /* set length to 0 */ | ||
| 5074 | x25_udp_pkt->cblock.length = 0; | ||
| 5075 | /* set return code */ | ||
| 5076 | x25_udp_pkt->cblock.result = (card->hw.fwid != SFID_X25_508) ? 0x1F : 0xCD; | ||
| 5077 | |||
| 5078 | } else { | ||
| 5079 | |||
| 5080 | switch (x25_udp_pkt->cblock.command) { | ||
| 5081 | |||
| 5082 | |||
| 5083 | case XPIPE_FLUSH_DRIVER_STATS: | ||
| 5084 | init_x25_channel_struct(chan); | ||
| 5085 | init_global_statistics(card); | ||
| 5086 | mbox->cmd.length = 0; | ||
| 5087 | break; | ||
| 5088 | |||
| 5089 | |||
| 5090 | case XPIPE_DRIVER_STAT_IFSEND: | ||
| 5091 | memcpy(x25_udp_pkt->data, &chan->if_send_stat, sizeof(if_send_stat_t)); | ||
| 5092 | mbox->cmd.length = sizeof(if_send_stat_t); | ||
| 5093 | x25_udp_pkt->cblock.length = mbox->cmd.length; | ||
| 5094 | break; | ||
| 5095 | |||
| 5096 | case XPIPE_DRIVER_STAT_INTR: | ||
| 5097 | memcpy(&x25_udp_pkt->data[0], &card->statistics, sizeof(global_stats_t)); | ||
| 5098 | memcpy(&x25_udp_pkt->data[sizeof(global_stats_t)], | ||
| 5099 | &chan->rx_intr_stat, sizeof(rx_intr_stat_t)); | ||
| 5100 | |||
| 5101 | mbox->cmd.length = sizeof(global_stats_t) + | ||
| 5102 | sizeof(rx_intr_stat_t); | ||
| 5103 | x25_udp_pkt->cblock.length = mbox->cmd.length; | ||
| 5104 | break; | ||
| 5105 | |||
| 5106 | case XPIPE_DRIVER_STAT_GEN: | ||
| 5107 | memcpy(x25_udp_pkt->data, | ||
| 5108 | &chan->pipe_mgmt_stat.UDP_PIPE_mgmt_kmalloc_err, | ||
| 5109 | sizeof(pipe_mgmt_stat_t)); | ||
| 5110 | |||
| 5111 | memcpy(&x25_udp_pkt->data[sizeof(pipe_mgmt_stat_t)], | ||
| 5112 | &card->statistics, sizeof(global_stats_t)); | ||
| 5113 | |||
| 5114 | x25_udp_pkt->cblock.result = 0; | ||
| 5115 | x25_udp_pkt->cblock.length = sizeof(global_stats_t)+ | ||
| 5116 | sizeof(rx_intr_stat_t); | ||
| 5117 | mbox->cmd.length = x25_udp_pkt->cblock.length; | ||
| 5118 | break; | ||
| 5119 | |||
| 5120 | case XPIPE_ROUTER_UP_TIME: | ||
| 5121 | do_gettimeofday(&tv); | ||
| 5122 | chan->router_up_time = tv.tv_sec - chan->router_start_time; | ||
| 5123 | *(unsigned long *)&x25_udp_pkt->data = chan->router_up_time; | ||
| 5124 | x25_udp_pkt->cblock.length = mbox->cmd.length = 4; | ||
| 5125 | x25_udp_pkt->cblock.result = 0; | ||
| 5126 | break; | ||
| 5127 | |||
| 5128 | default : | ||
| 5129 | |||
| 5130 | do { | ||
| 5131 | memcpy(&mbox->cmd, &x25_udp_pkt->cblock.command, sizeof(TX25Cmd)); | ||
| 5132 | if(mbox->cmd.length){ | ||
| 5133 | memcpy(&mbox->data, | ||
| 5134 | (char *)x25_udp_pkt->data, | ||
| 5135 | mbox->cmd.length); | ||
| 5136 | } | ||
| 5137 | |||
| 5138 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 5139 | } while (err && c_retry-- && x25_error(card, err, mbox->cmd.command, 0)); | ||
| 5140 | |||
| 5141 | |||
| 5142 | if ( err == CMD_OK || | ||
| 5143 | (err == 1 && | ||
| 5144 | (mbox->cmd.command == 0x06 || | ||
| 5145 | mbox->cmd.command == 0x16) ) ){ | ||
| 5146 | |||
| 5147 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_cmnd_OK; | ||
| 5148 | } else { | ||
| 5149 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_cmnd_timeout; | ||
| 5150 | } | ||
| 5151 | |||
| 5152 | /* copy the result back to our buffer */ | ||
| 5153 | memcpy(&x25_udp_pkt->cblock.command, &mbox->cmd, sizeof(TX25Cmd)); | ||
| 5154 | |||
| 5155 | if(mbox->cmd.length) { | ||
| 5156 | memcpy(&x25_udp_pkt->data, &mbox->data, mbox->cmd.length); | ||
| 5157 | } | ||
| 5158 | break; | ||
| 5159 | |||
| 5160 | } //switch | ||
| 5161 | |||
| 5162 | } | ||
| 5163 | |||
| 5164 | /* Fill UDP TTL */ | ||
| 5165 | |||
| 5166 | x25_udp_pkt->ip_pkt.ttl = card->wandev.ttl; | ||
| 5167 | len = reply_udp(card->u.x.udp_pkt_data, mbox->cmd.length); | ||
| 5168 | |||
| 5169 | |||
| 5170 | if(card->u.x.udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 5171 | |||
| 5172 | err = x25_send(card, lcn, 0, len, card->u.x.udp_pkt_data); | ||
| 5173 | if (!err) | ||
| 5174 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_send_passed; | ||
| 5175 | else | ||
| 5176 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_adptr_send_failed; | ||
| 5177 | |||
| 5178 | } else { | ||
| 5179 | |||
| 5180 | /* Allocate socket buffer */ | ||
| 5181 | if((new_skb = dev_alloc_skb(len)) != NULL) { | ||
| 5182 | void *buf; | ||
| 5183 | |||
| 5184 | /* copy data into new_skb */ | ||
| 5185 | buf = skb_put(new_skb, len); | ||
| 5186 | memcpy(buf, card->u.x.udp_pkt_data, len); | ||
| 5187 | |||
| 5188 | /* Decapsulate packet and pass it up the protocol | ||
| 5189 | stack */ | ||
| 5190 | new_skb->dev = dev; | ||
| 5191 | |||
| 5192 | if (chan->common.usedby == API) | ||
| 5193 | new_skb->protocol = htons(X25_PROT); | ||
| 5194 | else | ||
| 5195 | new_skb->protocol = htons(ETH_P_IP); | ||
| 5196 | |||
| 5197 | new_skb->mac.raw = new_skb->data; | ||
| 5198 | |||
| 5199 | netif_rx(new_skb); | ||
| 5200 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_passed_to_stack; | ||
| 5201 | |||
| 5202 | } else { | ||
| 5203 | ++chan->pipe_mgmt_stat.UDP_PIPE_mgmt_no_socket; | ||
| 5204 | printk(KERN_INFO | ||
| 5205 | "%s: UDP mgmt cmnd, no socket buffers available!\n", | ||
| 5206 | card->devname); | ||
| 5207 | } | ||
| 5208 | } | ||
| 5209 | |||
| 5210 | card->u.x.udp_pkt_lgth = 0; | ||
| 5211 | |||
| 5212 | return 1; | ||
| 5213 | } | ||
| 5214 | |||
| 5215 | |||
| 5216 | /*============================================================================== | ||
| 5217 | * Determine what type of UDP call it is. DRVSTATS or XPIPE8ND ? | ||
| 5218 | */ | ||
| 5219 | static int udp_pkt_type( struct sk_buff *skb, sdla_t* card ) | ||
| 5220 | { | ||
| 5221 | x25_udp_pkt_t *x25_udp_pkt = (x25_udp_pkt_t *)skb->data; | ||
| 5222 | |||
| 5223 | if((x25_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) && | ||
| 5224 | (x25_udp_pkt->ip_pkt.ver_inet_hdr_length == 0x45) && | ||
| 5225 | (x25_udp_pkt->udp_pkt.udp_dst_port == ntohs(card->wandev.udp_port)) && | ||
| 5226 | (x25_udp_pkt->wp_mgmt.request_reply == UDPMGMT_REQUEST)) { | ||
| 5227 | |||
| 5228 | if(!strncmp(x25_udp_pkt->wp_mgmt.signature, | ||
| 5229 | UDPMGMT_XPIPE_SIGNATURE, 8)){ | ||
| 5230 | return UDP_XPIPE_TYPE; | ||
| 5231 | }else{ | ||
| 5232 | printk(KERN_INFO "%s: UDP Packet, Failed Signature !\n", | ||
| 5233 | card->devname); | ||
| 5234 | } | ||
| 5235 | } | ||
| 5236 | |||
| 5237 | return UDP_INVALID_TYPE; | ||
| 5238 | } | ||
| 5239 | |||
| 5240 | |||
| 5241 | /*============================================================================ | ||
| 5242 | * Reply to UDP Management system. | ||
| 5243 | * Return nothing. | ||
| 5244 | */ | ||
| 5245 | static int reply_udp( unsigned char *data, unsigned int mbox_len ) | ||
| 5246 | { | ||
| 5247 | unsigned short len, udp_length, temp, ip_length; | ||
| 5248 | unsigned long ip_temp; | ||
| 5249 | int even_bound = 0; | ||
| 5250 | |||
| 5251 | |||
| 5252 | x25_udp_pkt_t *x25_udp_pkt = (x25_udp_pkt_t *)data; | ||
| 5253 | |||
| 5254 | /* Set length of packet */ | ||
| 5255 | len = sizeof(ip_pkt_t)+ | ||
| 5256 | sizeof(udp_pkt_t)+ | ||
| 5257 | sizeof(wp_mgmt_t)+ | ||
| 5258 | sizeof(cblock_t)+ | ||
| 5259 | mbox_len; | ||
| 5260 | |||
| 5261 | |||
| 5262 | /* fill in UDP reply */ | ||
| 5263 | x25_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; | ||
| 5264 | |||
| 5265 | /* fill in UDP length */ | ||
| 5266 | udp_length = sizeof(udp_pkt_t)+ | ||
| 5267 | sizeof(wp_mgmt_t)+ | ||
| 5268 | sizeof(cblock_t)+ | ||
| 5269 | mbox_len; | ||
| 5270 | |||
| 5271 | |||
| 5272 | /* put it on an even boundary */ | ||
| 5273 | if ( udp_length & 0x0001 ) { | ||
| 5274 | udp_length += 1; | ||
| 5275 | len += 1; | ||
| 5276 | even_bound = 1; | ||
| 5277 | } | ||
| 5278 | |||
| 5279 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 5280 | x25_udp_pkt->udp_pkt.udp_length = temp; | ||
| 5281 | |||
| 5282 | /* swap UDP ports */ | ||
| 5283 | temp = x25_udp_pkt->udp_pkt.udp_src_port; | ||
| 5284 | x25_udp_pkt->udp_pkt.udp_src_port = | ||
| 5285 | x25_udp_pkt->udp_pkt.udp_dst_port; | ||
| 5286 | x25_udp_pkt->udp_pkt.udp_dst_port = temp; | ||
| 5287 | |||
| 5288 | |||
| 5289 | |||
| 5290 | /* add UDP pseudo header */ | ||
| 5291 | temp = 0x1100; | ||
| 5292 | *((unsigned short *) | ||
| 5293 | (x25_udp_pkt->data+mbox_len+even_bound)) = temp; | ||
| 5294 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 5295 | *((unsigned short *) | ||
| 5296 | (x25_udp_pkt->data+mbox_len+even_bound+2)) = temp; | ||
| 5297 | |||
| 5298 | /* calculate UDP checksum */ | ||
| 5299 | x25_udp_pkt->udp_pkt.udp_checksum = 0; | ||
| 5300 | |||
| 5301 | x25_udp_pkt->udp_pkt.udp_checksum = | ||
| 5302 | calc_checksum(&data[UDP_OFFSET], udp_length+UDP_OFFSET); | ||
| 5303 | |||
| 5304 | /* fill in IP length */ | ||
| 5305 | ip_length = len; | ||
| 5306 | temp = (ip_length<<8)|(ip_length>>8); | ||
| 5307 | x25_udp_pkt->ip_pkt.total_length = temp; | ||
| 5308 | |||
| 5309 | /* swap IP addresses */ | ||
| 5310 | ip_temp = x25_udp_pkt->ip_pkt.ip_src_address; | ||
| 5311 | x25_udp_pkt->ip_pkt.ip_src_address = | ||
| 5312 | x25_udp_pkt->ip_pkt.ip_dst_address; | ||
| 5313 | x25_udp_pkt->ip_pkt.ip_dst_address = ip_temp; | ||
| 5314 | |||
| 5315 | |||
| 5316 | /* fill in IP checksum */ | ||
| 5317 | x25_udp_pkt->ip_pkt.hdr_checksum = 0; | ||
| 5318 | x25_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data, sizeof(ip_pkt_t)); | ||
| 5319 | |||
| 5320 | return len; | ||
| 5321 | } /* reply_udp */ | ||
| 5322 | |||
| 5323 | unsigned short calc_checksum (char *data, int len) | ||
| 5324 | { | ||
| 5325 | unsigned short temp; | ||
| 5326 | unsigned long sum=0; | ||
| 5327 | int i; | ||
| 5328 | |||
| 5329 | for( i = 0; i <len; i+=2 ) { | ||
| 5330 | memcpy(&temp,&data[i],2); | ||
| 5331 | sum += (unsigned long)temp; | ||
| 5332 | } | ||
| 5333 | |||
| 5334 | while (sum >> 16 ) { | ||
| 5335 | sum = (sum & 0xffffUL) + (sum >> 16); | ||
| 5336 | } | ||
| 5337 | |||
| 5338 | temp = (unsigned short)sum; | ||
| 5339 | temp = ~temp; | ||
| 5340 | |||
| 5341 | if( temp == 0 ) | ||
| 5342 | temp = 0xffff; | ||
| 5343 | |||
| 5344 | return temp; | ||
| 5345 | } | ||
| 5346 | |||
| 5347 | /*============================================================================= | ||
| 5348 | * Store a UDP management packet for later processing. | ||
| 5349 | */ | ||
| 5350 | |||
| 5351 | static int store_udp_mgmt_pkt(int udp_type, char udp_pkt_src, sdla_t* card, | ||
| 5352 | struct net_device *dev, struct sk_buff *skb, | ||
| 5353 | int lcn) | ||
| 5354 | { | ||
| 5355 | int udp_pkt_stored = 0; | ||
| 5356 | |||
| 5357 | if(!card->u.x.udp_pkt_lgth && (skb->len <= MAX_LGTH_UDP_MGNT_PKT)){ | ||
| 5358 | card->u.x.udp_pkt_lgth = skb->len; | ||
| 5359 | card->u.x.udp_type = udp_type; | ||
| 5360 | card->u.x.udp_pkt_src = udp_pkt_src; | ||
| 5361 | card->u.x.udp_lcn = lcn; | ||
| 5362 | card->u.x.udp_dev = dev; | ||
| 5363 | memcpy(card->u.x.udp_pkt_data, skb->data, skb->len); | ||
| 5364 | card->u.x.timer_int_enabled |= TMR_INT_ENABLED_UDP_PKT; | ||
| 5365 | udp_pkt_stored = 1; | ||
| 5366 | |||
| 5367 | }else{ | ||
| 5368 | printk(KERN_INFO "%s: ERROR: UDP packet not stored for LCN %d\n", | ||
| 5369 | card->devname,lcn); | ||
| 5370 | } | ||
| 5371 | |||
| 5372 | if(udp_pkt_src == UDP_PKT_FRM_STACK){ | ||
| 5373 | dev_kfree_skb_any(skb); | ||
| 5374 | }else{ | ||
| 5375 | dev_kfree_skb_any(skb); | ||
| 5376 | } | ||
| 5377 | |||
| 5378 | return(udp_pkt_stored); | ||
| 5379 | } | ||
| 5380 | |||
| 5381 | |||
| 5382 | |||
| 5383 | /*============================================================================= | ||
| 5384 | * Initial the ppp_private_area structure. | ||
| 5385 | */ | ||
| 5386 | static void init_x25_channel_struct( x25_channel_t *chan ) | ||
| 5387 | { | ||
| 5388 | memset(&chan->if_send_stat.if_send_entry,0,sizeof(if_send_stat_t)); | ||
| 5389 | memset(&chan->rx_intr_stat.rx_intr_no_socket,0,sizeof(rx_intr_stat_t)); | ||
| 5390 | memset(&chan->pipe_mgmt_stat.UDP_PIPE_mgmt_kmalloc_err,0,sizeof(pipe_mgmt_stat_t)); | ||
| 5391 | } | ||
| 5392 | |||
| 5393 | /*============================================================================ | ||
| 5394 | * Initialize Global Statistics | ||
| 5395 | */ | ||
| 5396 | static void init_global_statistics( sdla_t *card ) | ||
| 5397 | { | ||
| 5398 | memset(&card->statistics.isr_entry,0,sizeof(global_stats_t)); | ||
| 5399 | } | ||
| 5400 | |||
| 5401 | |||
| 5402 | /*=============================================================== | ||
| 5403 | * SMP Support | ||
| 5404 | * ==============================================================*/ | ||
| 5405 | |||
| 5406 | static void S508_S514_lock(sdla_t *card, unsigned long *smp_flags) | ||
| 5407 | { | ||
| 5408 | spin_lock_irqsave(&card->wandev.lock, *smp_flags); | ||
| 5409 | } | ||
| 5410 | static void S508_S514_unlock(sdla_t *card, unsigned long *smp_flags) | ||
| 5411 | { | ||
| 5412 | spin_unlock_irqrestore(&card->wandev.lock, *smp_flags); | ||
| 5413 | } | ||
| 5414 | |||
| 5415 | /*=============================================================== | ||
| 5416 | * x25_timer_routine | ||
| 5417 | * | ||
| 5418 | * A more efficient polling routine. Each half a second | ||
| 5419 | * queue a polling task. We want to do the polling in a | ||
| 5420 | * task not timer, because timer runs in interrupt time. | ||
| 5421 | * | ||
| 5422 | * FIXME Polling should be rethinked. | ||
| 5423 | *==============================================================*/ | ||
| 5424 | |||
| 5425 | static void x25_timer_routine(unsigned long data) | ||
| 5426 | { | ||
| 5427 | sdla_t *card = (sdla_t*)data; | ||
| 5428 | |||
| 5429 | if (!card->wandev.dev){ | ||
| 5430 | printk(KERN_INFO "%s: Stopping the X25 Poll Timer: No Dev.\n", | ||
| 5431 | card->devname); | ||
| 5432 | return; | ||
| 5433 | } | ||
| 5434 | |||
| 5435 | if (card->open_cnt != card->u.x.num_of_ch){ | ||
| 5436 | printk(KERN_INFO "%s: Stopping the X25 Poll Timer: Interface down.\n", | ||
| 5437 | card->devname); | ||
| 5438 | return; | ||
| 5439 | } | ||
| 5440 | |||
| 5441 | if (test_bit(PERI_CRIT,&card->wandev.critical)){ | ||
| 5442 | printk(KERN_INFO "%s: Stopping the X25 Poll Timer: Shutting down.\n", | ||
| 5443 | card->devname); | ||
| 5444 | return; | ||
| 5445 | } | ||
| 5446 | |||
| 5447 | if (!test_and_set_bit(POLL_CRIT,&card->wandev.critical)){ | ||
| 5448 | trigger_x25_poll(card); | ||
| 5449 | } | ||
| 5450 | |||
| 5451 | card->u.x.x25_timer.expires=jiffies+(HZ>>1); | ||
| 5452 | add_timer(&card->u.x.x25_timer); | ||
| 5453 | return; | ||
| 5454 | } | ||
| 5455 | |||
| 5456 | void disable_comm_shutdown(sdla_t *card) | ||
| 5457 | { | ||
| 5458 | TX25Mbox* mbox = card->mbox; | ||
| 5459 | int err; | ||
| 5460 | |||
| 5461 | /* Turn of interrutps */ | ||
| 5462 | mbox->data[0] = 0; | ||
| 5463 | if (card->hw.fwid == SFID_X25_508){ | ||
| 5464 | mbox->data[1] = card->hw.irq; | ||
| 5465 | mbox->data[2] = 2; | ||
| 5466 | mbox->cmd.length = 3; | ||
| 5467 | }else { | ||
| 5468 | mbox->cmd.length = 1; | ||
| 5469 | } | ||
| 5470 | mbox->cmd.command = X25_SET_INTERRUPT_MODE; | ||
| 5471 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 5472 | if (err) | ||
| 5473 | printk(KERN_INFO "INTERRUPT OFF FAIED %x\n",err); | ||
| 5474 | |||
| 5475 | /* Bring down HDLC */ | ||
| 5476 | mbox->cmd.command = X25_HDLC_LINK_CLOSE; | ||
| 5477 | mbox->cmd.length = 0; | ||
| 5478 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 5479 | if (err) | ||
| 5480 | printk(KERN_INFO "LINK CLOSED FAILED %x\n",err); | ||
| 5481 | |||
| 5482 | |||
| 5483 | /* Brind down DTR */ | ||
| 5484 | mbox->data[0] = 0; | ||
| 5485 | mbox->data[2] = 0; | ||
| 5486 | mbox->data[1] = 0x01; | ||
| 5487 | mbox->cmd.length = 3; | ||
| 5488 | mbox->cmd.command = X25_SET_GLOBAL_VARS; | ||
| 5489 | err = sdla_exec(mbox) ? mbox->cmd.result : CMD_TIMEOUT; | ||
| 5490 | if (err) | ||
| 5491 | printk(KERN_INFO "DTR DOWN FAILED %x\n",err); | ||
| 5492 | |||
| 5493 | } | ||
| 5494 | |||
| 5495 | MODULE_LICENSE("GPL"); | ||
| 5496 | |||
| 5497 | /****** End *****************************************************************/ | ||
diff --git a/drivers/net/wan/sdladrv.c b/drivers/net/wan/sdladrv.c deleted file mode 100644 index 032c0f81928e..000000000000 --- a/drivers/net/wan/sdladrv.c +++ /dev/null | |||
| @@ -1,2314 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * sdladrv.c SDLA Support Module. Main module. | ||
| 3 | * | ||
| 4 | * This module is a library of common hardware-specific functions | ||
| 5 | * used by all Sangoma drivers. | ||
| 6 | * | ||
| 7 | * Author: Gideon Hack | ||
| 8 | * | ||
| 9 | * Copyright: (c) 1995-2000 Sangoma Technologies Inc. | ||
| 10 | * | ||
| 11 | * This program is free software; you can redistribute it and/or | ||
| 12 | * modify it under the terms of the GNU General Public License | ||
| 13 | * as published by the Free Software Foundation; either version | ||
| 14 | * 2 of the License, or (at your option) any later version. | ||
| 15 | * ============================================================================ | ||
| 16 | * Mar 20, 2001 Nenad Corbic Added the auto_pci_cfg filed, to support | ||
| 17 | * the PCISLOT #0. | ||
| 18 | * Apr 04, 2000 Nenad Corbic Fixed the auto memory detection code. | ||
| 19 | * The memory test at address 0xC8000. | ||
| 20 | * Mar 09, 2000 Nenad Corbic Added Gideon's Bug Fix: clear pci | ||
| 21 | * interrupt flags on initial load. | ||
| 22 | * Jun 02, 1999 Gideon Hack Added support for the S514 adapter. | ||
| 23 | * Updates for Linux 2.2.X kernels. | ||
| 24 | * Sep 17, 1998 Jaspreet Singh Updates for linux 2.2.X kernels | ||
| 25 | * Dec 20, 1996 Gene Kozin Version 3.0.0. Complete overhaul. | ||
| 26 | * Jul 12, 1996 Gene Kozin Changes for Linux 2.0 compatibility. | ||
| 27 | * Jun 12, 1996 Gene Kozin Added support for S503 card. | ||
| 28 | * Apr 30, 1996 Gene Kozin SDLA hardware interrupt is acknowledged before | ||
| 29 | * calling protocolspecific ISR. | ||
| 30 | * Register I/O ports with Linux kernel. | ||
| 31 | * Miscellaneous bug fixes. | ||
| 32 | * Dec 20, 1995 Gene Kozin Fixed a bug in interrupt routine. | ||
| 33 | * Oct 14, 1995 Gene Kozin Initial version. | ||
| 34 | *****************************************************************************/ | ||
| 35 | |||
| 36 | /***************************************************************************** | ||
| 37 | * Notes: | ||
| 38 | * ------ | ||
| 39 | * 1. This code is ment to be system-independent (as much as possible). To | ||
| 40 | * achive this, various macros are used to hide system-specific interfaces. | ||
| 41 | * To compile this code, one of the following constants must be defined: | ||
| 42 | * | ||
| 43 | * Platform Define | ||
| 44 | * -------- ------ | ||
| 45 | * Linux _LINUX_ | ||
| 46 | * SCO Unix _SCO_UNIX_ | ||
| 47 | * | ||
| 48 | * 2. Supported adapter types: | ||
| 49 | * | ||
| 50 | * S502A | ||
| 51 | * ES502A (S502E) | ||
| 52 | * S503 | ||
| 53 | * S507 | ||
| 54 | * S508 (S509) | ||
| 55 | * | ||
| 56 | * 3. S502A Notes: | ||
| 57 | * | ||
| 58 | * There is no separate DPM window enable/disable control in S502A. It | ||
| 59 | * opens immediately after a window number it written to the HMCR | ||
| 60 | * register. To close the window, HMCR has to be written a value | ||
| 61 | * ????1111b (e.g. 0x0F or 0xFF). | ||
| 62 | * | ||
| 63 | * S502A DPM window cannot be located at offset E000 (e.g. 0xAE000). | ||
| 64 | * | ||
| 65 | * There should be a delay of ??? before reading back S502A status | ||
| 66 | * register. | ||
| 67 | * | ||
| 68 | * 4. S502E Notes: | ||
| 69 | * | ||
| 70 | * S502E has a h/w bug: although default IRQ line state is HIGH, enabling | ||
| 71 | * interrupts by setting bit 1 of the control register (BASE) to '1' | ||
| 72 | * causes it to go LOW! Therefore, disabling interrupts by setting that | ||
| 73 | * bit to '0' causes low-to-high transition on IRQ line (ghosty | ||
| 74 | * interrupt). The same occurs when disabling CPU by resetting bit 0 of | ||
| 75 | * CPU control register (BASE+3) - see the next note. | ||
| 76 | * | ||
| 77 | * S502E CPU and DPM control is limited: | ||
| 78 | * | ||
| 79 | * o CPU cannot be stopped independently. Resetting bit 0 of the CPUi | ||
| 80 | * control register (BASE+3) shuts the board down entirely, including | ||
| 81 | * DPM; | ||
| 82 | * | ||
| 83 | * o DPM access cannot be controlled dynamically. Ones CPU is started, | ||
| 84 | * bit 1 of the control register (BASE) is used to enable/disable IRQ, | ||
| 85 | * so that access to shared memory cannot be disabled while CPU is | ||
| 86 | * running. | ||
| 87 | ****************************************************************************/ | ||
| 88 | |||
| 89 | #define _LINUX_ | ||
| 90 | |||
| 91 | #if defined(_LINUX_) /****** Linux *******************************/ | ||
| 92 | |||
| 93 | #include <linux/config.h> | ||
| 94 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 95 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 96 | #include <linux/errno.h> /* return codes */ | ||
| 97 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 98 | #include <linux/module.h> /* support for loadable modules */ | ||
| 99 | #include <linux/jiffies.h> /* for jiffies, HZ, etc. */ | ||
| 100 | #include <linux/sdladrv.h> /* API definitions */ | ||
| 101 | #include <linux/sdlasfm.h> /* SDLA firmware module definitions */ | ||
| 102 | #include <linux/sdlapci.h> /* SDLA PCI hardware definitions */ | ||
| 103 | #include <linux/pci.h> /* PCI defines and function prototypes */ | ||
| 104 | #include <asm/io.h> /* for inb(), outb(), etc. */ | ||
| 105 | |||
| 106 | #define _INB(port) (inb(port)) | ||
| 107 | #define _OUTB(port, byte) (outb((byte),(port))) | ||
| 108 | #define SYSTEM_TICK jiffies | ||
| 109 | |||
| 110 | #include <linux/init.h> | ||
| 111 | |||
| 112 | |||
| 113 | #elif defined(_SCO_UNIX_) /****** SCO Unix ****************************/ | ||
| 114 | |||
| 115 | #if !defined(INKERNEL) | ||
| 116 | #error This code MUST be compiled in kernel mode! | ||
| 117 | #endif | ||
| 118 | #include <sys/sdladrv.h> /* API definitions */ | ||
| 119 | #include <sys/sdlasfm.h> /* SDLA firmware module definitions */ | ||
| 120 | #include <sys/inline.h> /* for inb(), outb(), etc. */ | ||
| 121 | #define _INB(port) (inb(port)) | ||
| 122 | #define _OUTB(port, byte) (outb((port),(byte))) | ||
| 123 | #define SYSTEM_TICK lbolt | ||
| 124 | |||
| 125 | #else | ||
| 126 | #error Unknown system type! | ||
| 127 | #endif | ||
| 128 | |||
| 129 | #define MOD_VERSION 3 | ||
| 130 | #define MOD_RELEASE 0 | ||
| 131 | |||
| 132 | #define SDLA_IODELAY 100 /* I/O Rd/Wr delay, 10 works for 486DX2-66 */ | ||
| 133 | #define EXEC_DELAY 20 /* shared memory access delay, mks */ | ||
| 134 | #define EXEC_TIMEOUT (HZ*2) /* command timeout, in ticks */ | ||
| 135 | |||
| 136 | /* I/O port address range */ | ||
| 137 | #define S502A_IORANGE 3 | ||
| 138 | #define S502E_IORANGE 4 | ||
| 139 | #define S503_IORANGE 3 | ||
| 140 | #define S507_IORANGE 4 | ||
| 141 | #define S508_IORANGE 4 | ||
| 142 | |||
| 143 | /* Maximum amount of memory */ | ||
| 144 | #define S502_MAXMEM 0x10000L | ||
| 145 | #define S503_MAXMEM 0x10000L | ||
| 146 | #define S507_MAXMEM 0x40000L | ||
| 147 | #define S508_MAXMEM 0x40000L | ||
| 148 | |||
| 149 | /* Minimum amount of memory */ | ||
| 150 | #define S502_MINMEM 0x8000L | ||
| 151 | #define S503_MINMEM 0x8000L | ||
| 152 | #define S507_MINMEM 0x20000L | ||
| 153 | #define S508_MINMEM 0x20000L | ||
| 154 | #define NO_PORT -1 | ||
| 155 | |||
| 156 | |||
| 157 | |||
| 158 | |||
| 159 | |||
| 160 | /****** Function Prototypes *************************************************/ | ||
| 161 | |||
| 162 | /* Hardware-specific functions */ | ||
| 163 | static int sdla_detect (sdlahw_t* hw); | ||
| 164 | static int sdla_autodpm (sdlahw_t* hw); | ||
| 165 | static int sdla_setdpm (sdlahw_t* hw); | ||
| 166 | static int sdla_load (sdlahw_t* hw, sfm_t* sfm, unsigned len); | ||
| 167 | static int sdla_init (sdlahw_t* hw); | ||
| 168 | static unsigned long sdla_memtest (sdlahw_t* hw); | ||
| 169 | static int sdla_bootcfg (sdlahw_t* hw, sfm_info_t* sfminfo); | ||
| 170 | static unsigned char make_config_byte (sdlahw_t* hw); | ||
| 171 | static int sdla_start (sdlahw_t* hw, unsigned addr); | ||
| 172 | |||
| 173 | static int init_s502a (sdlahw_t* hw); | ||
| 174 | static int init_s502e (sdlahw_t* hw); | ||
| 175 | static int init_s503 (sdlahw_t* hw); | ||
| 176 | static int init_s507 (sdlahw_t* hw); | ||
| 177 | static int init_s508 (sdlahw_t* hw); | ||
| 178 | |||
| 179 | static int detect_s502a (int port); | ||
| 180 | static int detect_s502e (int port); | ||
| 181 | static int detect_s503 (int port); | ||
| 182 | static int detect_s507 (int port); | ||
| 183 | static int detect_s508 (int port); | ||
| 184 | static int detect_s514 (sdlahw_t* hw); | ||
| 185 | static int find_s514_adapter(sdlahw_t* hw, char find_first_S514_card); | ||
| 186 | |||
| 187 | /* Miscellaneous functions */ | ||
| 188 | static void peek_by_4 (unsigned long src, void* buf, unsigned len); | ||
| 189 | static void poke_by_4 (unsigned long dest, void* buf, unsigned len); | ||
| 190 | static int calibrate_delay (int mks); | ||
| 191 | static int get_option_index (unsigned* optlist, unsigned optval); | ||
| 192 | static unsigned check_memregion (void* ptr, unsigned len); | ||
| 193 | static unsigned test_memregion (void* ptr, unsigned len); | ||
| 194 | static unsigned short checksum (unsigned char* buf, unsigned len); | ||
| 195 | static int init_pci_slot(sdlahw_t *); | ||
| 196 | |||
| 197 | static int pci_probe(sdlahw_t *hw); | ||
| 198 | |||
| 199 | /****** Global Data ********************************************************** | ||
| 200 | * Note: All data must be explicitly initialized!!! | ||
| 201 | */ | ||
| 202 | |||
| 203 | static struct pci_device_id sdladrv_pci_tbl[] = { | ||
| 204 | { V3_VENDOR_ID, V3_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, }, | ||
| 205 | { } /* Terminating entry */ | ||
| 206 | }; | ||
| 207 | MODULE_DEVICE_TABLE(pci, sdladrv_pci_tbl); | ||
| 208 | |||
| 209 | MODULE_LICENSE("GPL"); | ||
| 210 | |||
| 211 | /* private data */ | ||
| 212 | static char modname[] = "sdladrv"; | ||
| 213 | static char fullname[] = "SDLA Support Module"; | ||
| 214 | static char copyright[] = "(c) 1995-1999 Sangoma Technologies Inc."; | ||
| 215 | static unsigned exec_idle; | ||
| 216 | |||
| 217 | /* Hardware configuration options. | ||
| 218 | * These are arrays of configuration options used by verification routines. | ||
| 219 | * The first element of each array is its size (i.e. number of options). | ||
| 220 | */ | ||
| 221 | static unsigned s502_port_options[] = | ||
| 222 | { 4, 0x250, 0x300, 0x350, 0x360 } | ||
| 223 | ; | ||
| 224 | static unsigned s503_port_options[] = | ||
| 225 | { 8, 0x250, 0x254, 0x300, 0x304, 0x350, 0x354, 0x360, 0x364 } | ||
| 226 | ; | ||
| 227 | static unsigned s508_port_options[] = | ||
| 228 | { 8, 0x250, 0x270, 0x280, 0x300, 0x350, 0x360, 0x380, 0x390 } | ||
| 229 | ; | ||
| 230 | |||
| 231 | static unsigned s502a_irq_options[] = { 0 }; | ||
| 232 | static unsigned s502e_irq_options[] = { 4, 2, 3, 5, 7 }; | ||
| 233 | static unsigned s503_irq_options[] = { 5, 2, 3, 4, 5, 7 }; | ||
| 234 | static unsigned s508_irq_options[] = { 8, 3, 4, 5, 7, 10, 11, 12, 15 }; | ||
| 235 | |||
| 236 | static unsigned s502a_dpmbase_options[] = | ||
| 237 | { | ||
| 238 | 28, | ||
| 239 | 0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, | ||
| 240 | 0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, | ||
| 241 | 0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, | ||
| 242 | 0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, | ||
| 243 | }; | ||
| 244 | static unsigned s507_dpmbase_options[] = | ||
| 245 | { | ||
| 246 | 32, | ||
| 247 | 0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, | ||
| 248 | 0xB0000, 0xB2000, 0xB4000, 0xB6000, 0xB8000, 0xBA000, 0xBC000, 0xBE000, | ||
| 249 | 0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000, | ||
| 250 | 0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000, | ||
| 251 | }; | ||
| 252 | static unsigned s508_dpmbase_options[] = /* incl. S502E and S503 */ | ||
| 253 | { | ||
| 254 | 32, | ||
| 255 | 0xA0000, 0xA2000, 0xA4000, 0xA6000, 0xA8000, 0xAA000, 0xAC000, 0xAE000, | ||
| 256 | 0xC0000, 0xC2000, 0xC4000, 0xC6000, 0xC8000, 0xCA000, 0xCC000, 0xCE000, | ||
| 257 | 0xD0000, 0xD2000, 0xD4000, 0xD6000, 0xD8000, 0xDA000, 0xDC000, 0xDE000, | ||
| 258 | 0xE0000, 0xE2000, 0xE4000, 0xE6000, 0xE8000, 0xEA000, 0xEC000, 0xEE000, | ||
| 259 | }; | ||
| 260 | |||
| 261 | /* | ||
| 262 | static unsigned s502_dpmsize_options[] = { 2, 0x2000, 0x10000 }; | ||
| 263 | static unsigned s507_dpmsize_options[] = { 2, 0x2000, 0x4000 }; | ||
| 264 | static unsigned s508_dpmsize_options[] = { 1, 0x2000 }; | ||
| 265 | */ | ||
| 266 | |||
| 267 | static unsigned s502a_pclk_options[] = { 2, 3600, 7200 }; | ||
| 268 | static unsigned s502e_pclk_options[] = { 5, 3600, 5000, 7200, 8000, 10000 }; | ||
| 269 | static unsigned s503_pclk_options[] = { 3, 7200, 8000, 10000 }; | ||
| 270 | static unsigned s507_pclk_options[] = { 1, 12288 }; | ||
| 271 | static unsigned s508_pclk_options[] = { 1, 16000 }; | ||
| 272 | |||
| 273 | /* Host memory control register masks */ | ||
| 274 | static unsigned char s502a_hmcr[] = | ||
| 275 | { | ||
| 276 | 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1C, /* A0000 - AC000 */ | ||
| 277 | 0x20, 0x22, 0x24, 0x26, 0x28, 0x2A, 0x2C, /* C0000 - CC000 */ | ||
| 278 | 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, /* D0000 - DC000 */ | ||
| 279 | 0x30, 0x32, 0x34, 0x36, 0x38, 0x3A, 0x3C, /* E0000 - EC000 */ | ||
| 280 | }; | ||
| 281 | static unsigned char s502e_hmcr[] = | ||
| 282 | { | ||
| 283 | 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x1E, /* A0000 - AE000 */ | ||
| 284 | 0x20, 0x22, 0x24, 0x26, 0x28, 0x2A, 0x2C, 0x2E, /* C0000 - CE000 */ | ||
| 285 | 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, /* D0000 - DE000 */ | ||
| 286 | 0x30, 0x32, 0x34, 0x36, 0x38, 0x3A, 0x3C, 0x3E, /* E0000 - EE000 */ | ||
| 287 | }; | ||
| 288 | static unsigned char s507_hmcr[] = | ||
| 289 | { | ||
| 290 | 0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, /* A0000 - AE000 */ | ||
| 291 | 0x40, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E, /* B0000 - BE000 */ | ||
| 292 | 0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8E, /* C0000 - CE000 */ | ||
| 293 | 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, /* E0000 - EE000 */ | ||
| 294 | }; | ||
| 295 | static unsigned char s508_hmcr[] = | ||
| 296 | { | ||
| 297 | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, /* A0000 - AE000 */ | ||
| 298 | 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* C0000 - CE000 */ | ||
| 299 | 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, /* D0000 - DE000 */ | ||
| 300 | 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, /* E0000 - EE000 */ | ||
| 301 | }; | ||
| 302 | |||
| 303 | static unsigned char s507_irqmask[] = | ||
| 304 | { | ||
| 305 | 0x00, 0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xE0 | ||
| 306 | }; | ||
| 307 | |||
| 308 | static int pci_slot_ar[MAX_S514_CARDS]; | ||
| 309 | |||
| 310 | /******* Kernel Loadable Module Entry Points ********************************/ | ||
| 311 | |||
| 312 | /*============================================================================ | ||
| 313 | * Module 'insert' entry point. | ||
| 314 | * o print announcement | ||
| 315 | * o initialize static data | ||
| 316 | * o calibrate SDLA shared memory access delay. | ||
| 317 | * | ||
| 318 | * Return: 0 Ok | ||
| 319 | * < 0 error. | ||
| 320 | * Context: process | ||
| 321 | */ | ||
| 322 | |||
| 323 | static int __init sdladrv_init(void) | ||
| 324 | { | ||
| 325 | int i=0; | ||
| 326 | |||
| 327 | printk(KERN_INFO "%s v%u.%u %s\n", | ||
| 328 | fullname, MOD_VERSION, MOD_RELEASE, copyright); | ||
| 329 | exec_idle = calibrate_delay(EXEC_DELAY); | ||
| 330 | #ifdef WANDEBUG | ||
| 331 | printk(KERN_DEBUG "%s: exec_idle = %d\n", modname, exec_idle); | ||
| 332 | #endif | ||
| 333 | |||
| 334 | /* Initialize the PCI Card array, which | ||
| 335 | * will store flags, used to mark | ||
| 336 | * card initialization state */ | ||
| 337 | for (i=0; i<MAX_S514_CARDS; i++) | ||
| 338 | pci_slot_ar[i] = 0xFF; | ||
| 339 | |||
| 340 | return 0; | ||
| 341 | } | ||
| 342 | |||
| 343 | /*============================================================================ | ||
| 344 | * Module 'remove' entry point. | ||
| 345 | * o release all remaining system resources | ||
| 346 | */ | ||
| 347 | static void __exit sdladrv_cleanup(void) | ||
| 348 | { | ||
| 349 | } | ||
| 350 | |||
| 351 | module_init(sdladrv_init); | ||
| 352 | module_exit(sdladrv_cleanup); | ||
| 353 | |||
| 354 | /******* Kernel APIs ********************************************************/ | ||
| 355 | |||
| 356 | /*============================================================================ | ||
| 357 | * Set up adapter. | ||
| 358 | * o detect adapter type | ||
| 359 | * o verify hardware configuration options | ||
| 360 | * o check for hardware conflicts | ||
| 361 | * o set up adapter shared memory | ||
| 362 | * o test adapter memory | ||
| 363 | * o load firmware | ||
| 364 | * Return: 0 ok. | ||
| 365 | * < 0 error | ||
| 366 | */ | ||
| 367 | |||
| 368 | EXPORT_SYMBOL(sdla_setup); | ||
| 369 | |||
| 370 | int sdla_setup (sdlahw_t* hw, void* sfm, unsigned len) | ||
| 371 | { | ||
| 372 | unsigned* irq_opt = NULL; /* IRQ options */ | ||
| 373 | unsigned* dpmbase_opt = NULL; /* DPM window base options */ | ||
| 374 | unsigned* pclk_opt = NULL; /* CPU clock rate options */ | ||
| 375 | int err=0; | ||
| 376 | |||
| 377 | if (sdla_detect(hw)) { | ||
| 378 | if(hw->type != SDLA_S514) | ||
| 379 | printk(KERN_INFO "%s: no SDLA card found at port 0x%X\n", | ||
| 380 | modname, hw->port); | ||
| 381 | return -EINVAL; | ||
| 382 | } | ||
| 383 | |||
| 384 | if(hw->type != SDLA_S514) { | ||
| 385 | printk(KERN_INFO "%s: found S%04u card at port 0x%X.\n", | ||
| 386 | modname, hw->type, hw->port); | ||
| 387 | |||
| 388 | hw->dpmsize = SDLA_WINDOWSIZE; | ||
| 389 | switch (hw->type) { | ||
| 390 | case SDLA_S502A: | ||
| 391 | hw->io_range = S502A_IORANGE; | ||
| 392 | irq_opt = s502a_irq_options; | ||
| 393 | dpmbase_opt = s502a_dpmbase_options; | ||
| 394 | pclk_opt = s502a_pclk_options; | ||
| 395 | break; | ||
| 396 | |||
| 397 | case SDLA_S502E: | ||
| 398 | hw->io_range = S502E_IORANGE; | ||
| 399 | irq_opt = s502e_irq_options; | ||
| 400 | dpmbase_opt = s508_dpmbase_options; | ||
| 401 | pclk_opt = s502e_pclk_options; | ||
| 402 | break; | ||
| 403 | |||
| 404 | case SDLA_S503: | ||
| 405 | hw->io_range = S503_IORANGE; | ||
| 406 | irq_opt = s503_irq_options; | ||
| 407 | dpmbase_opt = s508_dpmbase_options; | ||
| 408 | pclk_opt = s503_pclk_options; | ||
| 409 | break; | ||
| 410 | |||
| 411 | case SDLA_S507: | ||
| 412 | hw->io_range = S507_IORANGE; | ||
| 413 | irq_opt = s508_irq_options; | ||
| 414 | dpmbase_opt = s507_dpmbase_options; | ||
| 415 | pclk_opt = s507_pclk_options; | ||
| 416 | break; | ||
| 417 | |||
| 418 | case SDLA_S508: | ||
| 419 | hw->io_range = S508_IORANGE; | ||
| 420 | irq_opt = s508_irq_options; | ||
| 421 | dpmbase_opt = s508_dpmbase_options; | ||
| 422 | pclk_opt = s508_pclk_options; | ||
| 423 | break; | ||
| 424 | } | ||
| 425 | |||
| 426 | /* Verify IRQ configuration options */ | ||
| 427 | if (!get_option_index(irq_opt, hw->irq)) { | ||
| 428 | printk(KERN_INFO "%s: IRQ %d is invalid!\n", | ||
| 429 | modname, hw->irq); | ||
| 430 | return -EINVAL; | ||
| 431 | } | ||
| 432 | |||
| 433 | /* Verify CPU clock rate configuration options */ | ||
| 434 | if (hw->pclk == 0) | ||
| 435 | hw->pclk = pclk_opt[1]; /* use default */ | ||
| 436 | |||
| 437 | else if (!get_option_index(pclk_opt, hw->pclk)) { | ||
| 438 | printk(KERN_INFO "%s: CPU clock %u is invalid!\n", | ||
| 439 | modname, hw->pclk); | ||
| 440 | return -EINVAL; | ||
| 441 | } | ||
| 442 | printk(KERN_INFO "%s: assuming CPU clock rate of %u kHz.\n", | ||
| 443 | modname, hw->pclk); | ||
| 444 | |||
| 445 | /* Setup adapter dual-port memory window and test memory */ | ||
| 446 | if (hw->dpmbase == 0) { | ||
| 447 | err = sdla_autodpm(hw); | ||
| 448 | if (err) { | ||
| 449 | printk(KERN_INFO | ||
| 450 | "%s: can't find available memory region!\n", | ||
| 451 | modname); | ||
| 452 | return err; | ||
| 453 | } | ||
| 454 | } | ||
| 455 | else if (!get_option_index(dpmbase_opt, | ||
| 456 | virt_to_phys(hw->dpmbase))) { | ||
| 457 | printk(KERN_INFO | ||
| 458 | "%s: memory address 0x%lX is invalid!\n", | ||
| 459 | modname, virt_to_phys(hw->dpmbase)); | ||
| 460 | return -EINVAL; | ||
| 461 | } | ||
| 462 | else if (sdla_setdpm(hw)) { | ||
| 463 | printk(KERN_INFO | ||
| 464 | "%s: 8K memory region at 0x%lX is not available!\n", | ||
| 465 | modname, virt_to_phys(hw->dpmbase)); | ||
| 466 | return -EINVAL; | ||
| 467 | } | ||
| 468 | printk(KERN_INFO | ||
| 469 | "%s: dual-port memory window is set at 0x%lX.\n", | ||
| 470 | modname, virt_to_phys(hw->dpmbase)); | ||
| 471 | |||
| 472 | |||
| 473 | /* If we find memory in 0xE**** Memory region, | ||
| 474 | * warn the user to disable the SHADOW RAM. | ||
| 475 | * Since memory corruption can occur if SHADOW is | ||
| 476 | * enabled. This can causes random crashes ! */ | ||
| 477 | if (virt_to_phys(hw->dpmbase) >= 0xE0000){ | ||
| 478 | printk(KERN_WARNING "\n%s: !!!!!!!! WARNING !!!!!!!!\n",modname); | ||
| 479 | printk(KERN_WARNING "%s: WANPIPE is using 0x%lX memory region !!!\n", | ||
| 480 | modname, virt_to_phys(hw->dpmbase)); | ||
| 481 | printk(KERN_WARNING " Please disable the SHADOW RAM, otherwise\n"); | ||
| 482 | printk(KERN_WARNING " your system might crash randomly from time to time !\n"); | ||
| 483 | printk(KERN_WARNING "%s: !!!!!!!! WARNING !!!!!!!!\n\n",modname); | ||
| 484 | } | ||
| 485 | } | ||
| 486 | |||
| 487 | else { | ||
| 488 | hw->memory = test_memregion((void*)hw->dpmbase, | ||
| 489 | MAX_SIZEOF_S514_MEMORY); | ||
| 490 | if(hw->memory < (256 * 1024)) { | ||
| 491 | printk(KERN_INFO | ||
| 492 | "%s: error in testing S514 memory (0x%lX)\n", | ||
| 493 | modname, hw->memory); | ||
| 494 | sdla_down(hw); | ||
| 495 | return -EINVAL; | ||
| 496 | } | ||
| 497 | } | ||
| 498 | |||
| 499 | printk(KERN_INFO "%s: found %luK bytes of on-board memory\n", | ||
| 500 | modname, hw->memory / 1024); | ||
| 501 | |||
| 502 | /* Load firmware. If loader fails then shut down adapter */ | ||
| 503 | err = sdla_load(hw, sfm, len); | ||
| 504 | if (err) sdla_down(hw); /* shutdown adapter */ | ||
| 505 | |||
| 506 | return err; | ||
| 507 | } | ||
| 508 | |||
| 509 | /*============================================================================ | ||
| 510 | * Shut down SDLA: disable shared memory access and interrupts, stop CPU, etc. | ||
| 511 | */ | ||
| 512 | |||
| 513 | EXPORT_SYMBOL(sdla_down); | ||
| 514 | |||
| 515 | int sdla_down (sdlahw_t* hw) | ||
| 516 | { | ||
| 517 | unsigned port = hw->port; | ||
| 518 | int i; | ||
| 519 | unsigned char CPU_no; | ||
| 520 | u32 int_config, int_status; | ||
| 521 | |||
| 522 | if(!port && (hw->type != SDLA_S514)) | ||
| 523 | return -EFAULT; | ||
| 524 | |||
| 525 | switch (hw->type) { | ||
| 526 | case SDLA_S502A: | ||
| 527 | _OUTB(port, 0x08); /* halt CPU */ | ||
| 528 | _OUTB(port, 0x08); | ||
| 529 | _OUTB(port, 0x08); | ||
| 530 | hw->regs[0] = 0x08; | ||
| 531 | _OUTB(port + 1, 0xFF); /* close memory window */ | ||
| 532 | hw->regs[1] = 0xFF; | ||
| 533 | break; | ||
| 534 | |||
| 535 | case SDLA_S502E: | ||
| 536 | _OUTB(port + 3, 0); /* stop CPU */ | ||
| 537 | _OUTB(port, 0); /* reset board */ | ||
| 538 | for (i = 0; i < S502E_IORANGE; ++i) | ||
| 539 | hw->regs[i] = 0 | ||
| 540 | ; | ||
| 541 | break; | ||
| 542 | |||
| 543 | case SDLA_S503: | ||
| 544 | case SDLA_S507: | ||
| 545 | case SDLA_S508: | ||
| 546 | _OUTB(port, 0); /* reset board logic */ | ||
| 547 | hw->regs[0] = 0; | ||
| 548 | break; | ||
| 549 | |||
| 550 | case SDLA_S514: | ||
| 551 | /* halt the adapter */ | ||
| 552 | *(char *)hw->vector = S514_CPU_HALT; | ||
| 553 | CPU_no = hw->S514_cpu_no[0]; | ||
| 554 | |||
| 555 | /* disable the PCI IRQ and disable memory access */ | ||
| 556 | pci_read_config_dword(hw->pci_dev, PCI_INT_CONFIG, &int_config); | ||
| 557 | int_config &= (CPU_no == S514_CPU_A) ? ~PCI_DISABLE_IRQ_CPU_A : ~PCI_DISABLE_IRQ_CPU_B; | ||
| 558 | pci_write_config_dword(hw->pci_dev, PCI_INT_CONFIG, int_config); | ||
| 559 | read_S514_int_stat(hw, &int_status); | ||
| 560 | S514_intack(hw, int_status); | ||
| 561 | if(CPU_no == S514_CPU_A) | ||
| 562 | pci_write_config_dword(hw->pci_dev, PCI_MAP0_DWORD, | ||
| 563 | PCI_CPU_A_MEM_DISABLE); | ||
| 564 | else | ||
| 565 | pci_write_config_dword(hw->pci_dev, PCI_MAP1_DWORD, | ||
| 566 | PCI_CPU_B_MEM_DISABLE); | ||
| 567 | |||
| 568 | /* free up the allocated virtual memory */ | ||
| 569 | iounmap((void *)hw->dpmbase); | ||
| 570 | iounmap((void *)hw->vector); | ||
| 571 | break; | ||
| 572 | |||
| 573 | |||
| 574 | default: | ||
| 575 | return -EINVAL; | ||
| 576 | } | ||
| 577 | return 0; | ||
| 578 | } | ||
| 579 | |||
| 580 | /*============================================================================ | ||
| 581 | * Map shared memory window into SDLA address space. | ||
| 582 | */ | ||
| 583 | |||
| 584 | EXPORT_SYMBOL(sdla_mapmem); | ||
| 585 | |||
| 586 | int sdla_mapmem (sdlahw_t* hw, unsigned long addr) | ||
| 587 | { | ||
| 588 | unsigned port = hw->port; | ||
| 589 | register int tmp; | ||
| 590 | |||
| 591 | switch (hw->type) { | ||
| 592 | case SDLA_S502A: | ||
| 593 | case SDLA_S502E: | ||
| 594 | if (addr < S502_MAXMEM) { /* verify parameter */ | ||
| 595 | tmp = addr >> 13; /* convert to register mask */ | ||
| 596 | _OUTB(port + 2, tmp); | ||
| 597 | hw->regs[2] = tmp; | ||
| 598 | } | ||
| 599 | else return -EINVAL; | ||
| 600 | break; | ||
| 601 | |||
| 602 | case SDLA_S503: | ||
| 603 | if (addr < S503_MAXMEM) { /* verify parameter */ | ||
| 604 | tmp = (hw->regs[0] & 0x8F) | ((addr >> 9) & 0x70); | ||
| 605 | _OUTB(port, tmp); | ||
| 606 | hw->regs[0] = tmp; | ||
| 607 | } | ||
| 608 | else return -EINVAL; | ||
| 609 | break; | ||
| 610 | |||
| 611 | case SDLA_S507: | ||
| 612 | if (addr < S507_MAXMEM) { | ||
| 613 | if (!(_INB(port) & 0x02)) | ||
| 614 | return -EIO; | ||
| 615 | tmp = addr >> 13; /* convert to register mask */ | ||
| 616 | _OUTB(port + 2, tmp); | ||
| 617 | hw->regs[2] = tmp; | ||
| 618 | } | ||
| 619 | else return -EINVAL; | ||
| 620 | break; | ||
| 621 | |||
| 622 | case SDLA_S508: | ||
| 623 | if (addr < S508_MAXMEM) { | ||
| 624 | tmp = addr >> 13; /* convert to register mask */ | ||
| 625 | _OUTB(port + 2, tmp); | ||
| 626 | hw->regs[2] = tmp; | ||
| 627 | } | ||
| 628 | else return -EINVAL; | ||
| 629 | break; | ||
| 630 | |||
| 631 | case SDLA_S514: | ||
| 632 | return 0; | ||
| 633 | |||
| 634 | default: | ||
| 635 | return -EINVAL; | ||
| 636 | } | ||
| 637 | hw->vector = addr & 0xFFFFE000L; | ||
| 638 | return 0; | ||
| 639 | } | ||
| 640 | |||
| 641 | /*============================================================================ | ||
| 642 | * Enable interrupt generation. | ||
| 643 | */ | ||
| 644 | |||
| 645 | static int sdla_inten (sdlahw_t* hw) | ||
| 646 | { | ||
| 647 | unsigned port = hw->port; | ||
| 648 | int tmp, i; | ||
| 649 | |||
| 650 | switch (hw->type) { | ||
| 651 | case SDLA_S502E: | ||
| 652 | /* Note thar interrupt control operations on S502E are allowed | ||
| 653 | * only if CPU is enabled (bit 0 of status register is set). | ||
| 654 | */ | ||
| 655 | if (_INB(port) & 0x01) { | ||
| 656 | _OUTB(port, 0x02); /* bit1 = 1, bit2 = 0 */ | ||
| 657 | _OUTB(port, 0x06); /* bit1 = 1, bit2 = 1 */ | ||
| 658 | hw->regs[0] = 0x06; | ||
| 659 | } | ||
| 660 | else return -EIO; | ||
| 661 | break; | ||
| 662 | |||
| 663 | case SDLA_S503: | ||
| 664 | tmp = hw->regs[0] | 0x04; | ||
| 665 | _OUTB(port, tmp); | ||
| 666 | hw->regs[0] = tmp; /* update mirror */ | ||
| 667 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 668 | if (!(_INB(port) & 0x02)) /* verify */ | ||
| 669 | return -EIO; | ||
| 670 | break; | ||
| 671 | |||
| 672 | case SDLA_S508: | ||
| 673 | tmp = hw->regs[0] | 0x10; | ||
| 674 | _OUTB(port, tmp); | ||
| 675 | hw->regs[0] = tmp; /* update mirror */ | ||
| 676 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 677 | if (!(_INB(port + 1) & 0x10)) /* verify */ | ||
| 678 | return -EIO; | ||
| 679 | break; | ||
| 680 | |||
| 681 | case SDLA_S502A: | ||
| 682 | case SDLA_S507: | ||
| 683 | break; | ||
| 684 | |||
| 685 | case SDLA_S514: | ||
| 686 | break; | ||
| 687 | |||
| 688 | default: | ||
| 689 | return -EINVAL; | ||
| 690 | |||
| 691 | } | ||
| 692 | return 0; | ||
| 693 | } | ||
| 694 | |||
| 695 | /*============================================================================ | ||
| 696 | * Disable interrupt generation. | ||
| 697 | */ | ||
| 698 | |||
| 699 | #if 0 | ||
| 700 | int sdla_intde (sdlahw_t* hw) | ||
| 701 | { | ||
| 702 | unsigned port = hw->port; | ||
| 703 | int tmp, i; | ||
| 704 | |||
| 705 | switch (hw->type) { | ||
| 706 | case SDLA_S502E: | ||
| 707 | /* Notes: | ||
| 708 | * 1) interrupt control operations are allowed only if CPU is | ||
| 709 | * enabled (bit 0 of status register is set). | ||
| 710 | * 2) disabling interrupts using bit 1 of control register | ||
| 711 | * causes IRQ line go high, therefore we are going to use | ||
| 712 | * 0x04 instead: lower it to inhibit interrupts to PC. | ||
| 713 | */ | ||
| 714 | if (_INB(port) & 0x01) { | ||
| 715 | _OUTB(port, hw->regs[0] & ~0x04); | ||
| 716 | hw->regs[0] &= ~0x04; | ||
| 717 | } | ||
| 718 | else return -EIO; | ||
| 719 | break; | ||
| 720 | |||
| 721 | case SDLA_S503: | ||
| 722 | tmp = hw->regs[0] & ~0x04; | ||
| 723 | _OUTB(port, tmp); | ||
| 724 | hw->regs[0] = tmp; /* update mirror */ | ||
| 725 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 726 | if (_INB(port) & 0x02) /* verify */ | ||
| 727 | return -EIO; | ||
| 728 | break; | ||
| 729 | |||
| 730 | case SDLA_S508: | ||
| 731 | tmp = hw->regs[0] & ~0x10; | ||
| 732 | _OUTB(port, tmp); | ||
| 733 | hw->regs[0] = tmp; /* update mirror */ | ||
| 734 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 735 | if (_INB(port) & 0x10) /* verify */ | ||
| 736 | return -EIO; | ||
| 737 | break; | ||
| 738 | |||
| 739 | case SDLA_S502A: | ||
| 740 | case SDLA_S507: | ||
| 741 | break; | ||
| 742 | |||
| 743 | default: | ||
| 744 | return -EINVAL; | ||
| 745 | } | ||
| 746 | return 0; | ||
| 747 | } | ||
| 748 | #endif /* 0 */ | ||
| 749 | |||
| 750 | /*============================================================================ | ||
| 751 | * Acknowledge SDLA hardware interrupt. | ||
| 752 | */ | ||
| 753 | |||
| 754 | static int sdla_intack (sdlahw_t* hw) | ||
| 755 | { | ||
| 756 | unsigned port = hw->port; | ||
| 757 | int tmp; | ||
| 758 | |||
| 759 | switch (hw->type) { | ||
| 760 | case SDLA_S502E: | ||
| 761 | /* To acknoledge hardware interrupt we have to toggle bit 3 of | ||
| 762 | * control register: \_/ | ||
| 763 | * Note that interrupt control operations on S502E are allowed | ||
| 764 | * only if CPU is enabled (bit 1 of status register is set). | ||
| 765 | */ | ||
| 766 | if (_INB(port) & 0x01) { | ||
| 767 | tmp = hw->regs[0] & ~0x04; | ||
| 768 | _OUTB(port, tmp); | ||
| 769 | tmp |= 0x04; | ||
| 770 | _OUTB(port, tmp); | ||
| 771 | hw->regs[0] = tmp; | ||
| 772 | } | ||
| 773 | else return -EIO; | ||
| 774 | break; | ||
| 775 | |||
| 776 | case SDLA_S503: | ||
| 777 | if (_INB(port) & 0x04) { | ||
| 778 | tmp = hw->regs[0] & ~0x08; | ||
| 779 | _OUTB(port, tmp); | ||
| 780 | tmp |= 0x08; | ||
| 781 | _OUTB(port, tmp); | ||
| 782 | hw->regs[0] = tmp; | ||
| 783 | } | ||
| 784 | break; | ||
| 785 | |||
| 786 | case SDLA_S502A: | ||
| 787 | case SDLA_S507: | ||
| 788 | case SDLA_S508: | ||
| 789 | break; | ||
| 790 | |||
| 791 | default: | ||
| 792 | return -EINVAL; | ||
| 793 | } | ||
| 794 | return 0; | ||
| 795 | } | ||
| 796 | |||
| 797 | |||
| 798 | /*============================================================================ | ||
| 799 | * Acknowledge S514 hardware interrupt. | ||
| 800 | */ | ||
| 801 | |||
| 802 | EXPORT_SYMBOL(S514_intack); | ||
| 803 | |||
| 804 | void S514_intack (sdlahw_t* hw, u32 int_status) | ||
| 805 | { | ||
| 806 | pci_write_config_dword(hw->pci_dev, PCI_INT_STATUS, int_status); | ||
| 807 | } | ||
| 808 | |||
| 809 | |||
| 810 | /*============================================================================ | ||
| 811 | * Read the S514 hardware interrupt status. | ||
| 812 | */ | ||
| 813 | |||
| 814 | EXPORT_SYMBOL(read_S514_int_stat); | ||
| 815 | |||
| 816 | void read_S514_int_stat (sdlahw_t* hw, u32* int_status) | ||
| 817 | { | ||
| 818 | pci_read_config_dword(hw->pci_dev, PCI_INT_STATUS, int_status); | ||
| 819 | } | ||
| 820 | |||
| 821 | |||
| 822 | /*============================================================================ | ||
| 823 | * Generate an interrupt to adapter's CPU. | ||
| 824 | */ | ||
| 825 | |||
| 826 | #if 0 | ||
| 827 | int sdla_intr (sdlahw_t* hw) | ||
| 828 | { | ||
| 829 | unsigned port = hw->port; | ||
| 830 | |||
| 831 | switch (hw->type) { | ||
| 832 | case SDLA_S502A: | ||
| 833 | if (!(_INB(port) & 0x40)) { | ||
| 834 | _OUTB(port, 0x10); /* issue NMI to CPU */ | ||
| 835 | hw->regs[0] = 0x10; | ||
| 836 | } | ||
| 837 | else return -EIO; | ||
| 838 | break; | ||
| 839 | |||
| 840 | case SDLA_S507: | ||
| 841 | if ((_INB(port) & 0x06) == 0x06) { | ||
| 842 | _OUTB(port + 3, 0); | ||
| 843 | } | ||
| 844 | else return -EIO; | ||
| 845 | break; | ||
| 846 | |||
| 847 | case SDLA_S508: | ||
| 848 | if (_INB(port + 1) & 0x02) { | ||
| 849 | _OUTB(port, 0x08); | ||
| 850 | } | ||
| 851 | else return -EIO; | ||
| 852 | break; | ||
| 853 | |||
| 854 | case SDLA_S502E: | ||
| 855 | case SDLA_S503: | ||
| 856 | default: | ||
| 857 | return -EINVAL; | ||
| 858 | } | ||
| 859 | return 0; | ||
| 860 | } | ||
| 861 | #endif /* 0 */ | ||
| 862 | |||
| 863 | /*============================================================================ | ||
| 864 | * Execute Adapter Command. | ||
| 865 | * o Set exec flag. | ||
| 866 | * o Busy-wait until flag is reset. | ||
| 867 | * o Return number of loops made, or 0 if command timed out. | ||
| 868 | */ | ||
| 869 | |||
| 870 | EXPORT_SYMBOL(sdla_exec); | ||
| 871 | |||
| 872 | int sdla_exec (void* opflag) | ||
| 873 | { | ||
| 874 | volatile unsigned char* flag = opflag; | ||
| 875 | unsigned long tstop; | ||
| 876 | int nloops; | ||
| 877 | |||
| 878 | if(readb(flag) != 0x00) { | ||
| 879 | printk(KERN_INFO | ||
| 880 | "WANPIPE: opp flag set on entry to sdla_exec\n"); | ||
| 881 | return 0; | ||
| 882 | } | ||
| 883 | |||
| 884 | writeb(0x01, flag); | ||
| 885 | |||
| 886 | tstop = SYSTEM_TICK + EXEC_TIMEOUT; | ||
| 887 | |||
| 888 | for (nloops = 1; (readb(flag) == 0x01); ++ nloops) { | ||
| 889 | unsigned delay = exec_idle; | ||
| 890 | while (-- delay); /* delay */ | ||
| 891 | if (SYSTEM_TICK > tstop) return 0; /* time is up! */ | ||
| 892 | } | ||
| 893 | return nloops; | ||
| 894 | } | ||
| 895 | |||
| 896 | /*============================================================================ | ||
| 897 | * Read absolute adapter memory. | ||
| 898 | * Transfer data from adapter's memory to data buffer. | ||
| 899 | * | ||
| 900 | * Note: | ||
| 901 | * Care should be taken when crossing dual-port memory window boundary. | ||
| 902 | * This function is not atomic, so caller must disable interrupt if | ||
| 903 | * interrupt routines are accessing adapter shared memory. | ||
| 904 | */ | ||
| 905 | |||
| 906 | EXPORT_SYMBOL(sdla_peek); | ||
| 907 | |||
| 908 | int sdla_peek (sdlahw_t* hw, unsigned long addr, void* buf, unsigned len) | ||
| 909 | { | ||
| 910 | |||
| 911 | if (addr + len > hw->memory) /* verify arguments */ | ||
| 912 | return -EINVAL; | ||
| 913 | |||
| 914 | if(hw->type == SDLA_S514) { /* copy data for the S514 adapter */ | ||
| 915 | peek_by_4 ((unsigned long)hw->dpmbase + addr, buf, len); | ||
| 916 | return 0; | ||
| 917 | } | ||
| 918 | |||
| 919 | else { /* copy data for the S508 adapter */ | ||
| 920 | unsigned long oldvec = hw->vector; | ||
| 921 | unsigned winsize = hw->dpmsize; | ||
| 922 | unsigned curpos, curlen; /* current offset and block size */ | ||
| 923 | unsigned long curvec; /* current DPM window vector */ | ||
| 924 | int err = 0; | ||
| 925 | |||
| 926 | while (len && !err) { | ||
| 927 | curpos = addr % winsize; /* current window offset */ | ||
| 928 | curvec = addr - curpos; /* current window vector */ | ||
| 929 | curlen = (len > (winsize - curpos)) ? | ||
| 930 | (winsize - curpos) : len; | ||
| 931 | /* Relocate window and copy block of data */ | ||
| 932 | err = sdla_mapmem(hw, curvec); | ||
| 933 | peek_by_4 ((unsigned long)hw->dpmbase + curpos, buf, | ||
| 934 | curlen); | ||
| 935 | addr += curlen; | ||
| 936 | buf = (char*)buf + curlen; | ||
| 937 | len -= curlen; | ||
| 938 | } | ||
| 939 | |||
| 940 | /* Restore DPM window position */ | ||
| 941 | sdla_mapmem(hw, oldvec); | ||
| 942 | return err; | ||
| 943 | } | ||
| 944 | } | ||
| 945 | |||
| 946 | |||
| 947 | /*============================================================================ | ||
| 948 | * Read data from adapter's memory to a data buffer in 4-byte chunks. | ||
| 949 | * Note that we ensure that the SDLA memory address is on a 4-byte boundary | ||
| 950 | * before we begin moving the data in 4-byte chunks. | ||
| 951 | */ | ||
| 952 | |||
| 953 | static void peek_by_4 (unsigned long src, void* buf, unsigned len) | ||
| 954 | { | ||
| 955 | |||
| 956 | /* byte copy data until we get to a 4-byte boundary */ | ||
| 957 | while (len && (src & 0x03)) { | ||
| 958 | *(char *)buf ++ = readb(src ++); | ||
| 959 | len --; | ||
| 960 | } | ||
| 961 | |||
| 962 | /* copy data in 4-byte chunks */ | ||
| 963 | while (len >= 4) { | ||
| 964 | *(unsigned long *)buf = readl(src); | ||
| 965 | buf += 4; | ||
| 966 | src += 4; | ||
| 967 | len -= 4; | ||
| 968 | } | ||
| 969 | |||
| 970 | /* byte copy any remaining data */ | ||
| 971 | while (len) { | ||
| 972 | *(char *)buf ++ = readb(src ++); | ||
| 973 | len --; | ||
| 974 | } | ||
| 975 | } | ||
| 976 | |||
| 977 | |||
| 978 | /*============================================================================ | ||
| 979 | * Write Absolute Adapter Memory. | ||
| 980 | * Transfer data from data buffer to adapter's memory. | ||
| 981 | * | ||
| 982 | * Note: | ||
| 983 | * Care should be taken when crossing dual-port memory window boundary. | ||
| 984 | * This function is not atomic, so caller must disable interrupt if | ||
| 985 | * interrupt routines are accessing adapter shared memory. | ||
| 986 | */ | ||
| 987 | |||
| 988 | EXPORT_SYMBOL(sdla_poke); | ||
| 989 | |||
| 990 | int sdla_poke (sdlahw_t* hw, unsigned long addr, void* buf, unsigned len) | ||
| 991 | { | ||
| 992 | |||
| 993 | if (addr + len > hw->memory) /* verify arguments */ | ||
| 994 | return -EINVAL; | ||
| 995 | |||
| 996 | if(hw->type == SDLA_S514) { /* copy data for the S514 adapter */ | ||
| 997 | poke_by_4 ((unsigned long)hw->dpmbase + addr, buf, len); | ||
| 998 | return 0; | ||
| 999 | } | ||
| 1000 | |||
| 1001 | else { /* copy data for the S508 adapter */ | ||
| 1002 | unsigned long oldvec = hw->vector; | ||
| 1003 | unsigned winsize = hw->dpmsize; | ||
| 1004 | unsigned curpos, curlen; /* current offset and block size */ | ||
| 1005 | unsigned long curvec; /* current DPM window vector */ | ||
| 1006 | int err = 0; | ||
| 1007 | |||
| 1008 | while (len && !err) { | ||
| 1009 | curpos = addr % winsize; /* current window offset */ | ||
| 1010 | curvec = addr - curpos; /* current window vector */ | ||
| 1011 | curlen = (len > (winsize - curpos)) ? | ||
| 1012 | (winsize - curpos) : len; | ||
| 1013 | /* Relocate window and copy block of data */ | ||
| 1014 | sdla_mapmem(hw, curvec); | ||
| 1015 | poke_by_4 ((unsigned long)hw->dpmbase + curpos, buf, | ||
| 1016 | curlen); | ||
| 1017 | addr += curlen; | ||
| 1018 | buf = (char*)buf + curlen; | ||
| 1019 | len -= curlen; | ||
| 1020 | } | ||
| 1021 | |||
| 1022 | /* Restore DPM window position */ | ||
| 1023 | sdla_mapmem(hw, oldvec); | ||
| 1024 | return err; | ||
| 1025 | } | ||
| 1026 | } | ||
| 1027 | |||
| 1028 | |||
| 1029 | /*============================================================================ | ||
| 1030 | * Write from a data buffer to adapter's memory in 4-byte chunks. | ||
| 1031 | * Note that we ensure that the SDLA memory address is on a 4-byte boundary | ||
| 1032 | * before we begin moving the data in 4-byte chunks. | ||
| 1033 | */ | ||
| 1034 | |||
| 1035 | static void poke_by_4 (unsigned long dest, void* buf, unsigned len) | ||
| 1036 | { | ||
| 1037 | |||
| 1038 | /* byte copy data until we get to a 4-byte boundary */ | ||
| 1039 | while (len && (dest & 0x03)) { | ||
| 1040 | writeb (*(char *)buf ++, dest ++); | ||
| 1041 | len --; | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | /* copy data in 4-byte chunks */ | ||
| 1045 | while (len >= 4) { | ||
| 1046 | writel (*(unsigned long *)buf, dest); | ||
| 1047 | dest += 4; | ||
| 1048 | buf += 4; | ||
| 1049 | len -= 4; | ||
| 1050 | } | ||
| 1051 | |||
| 1052 | /* byte copy any remaining data */ | ||
| 1053 | while (len) { | ||
| 1054 | writeb (*(char *)buf ++ , dest ++); | ||
| 1055 | len --; | ||
| 1056 | } | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | |||
| 1060 | #ifdef DONT_COMPIPLE_THIS | ||
| 1061 | #endif /* DONT_COMPIPLE_THIS */ | ||
| 1062 | |||
| 1063 | /****** Hardware-Specific Functions *****************************************/ | ||
| 1064 | |||
| 1065 | /*============================================================================ | ||
| 1066 | * Detect adapter type. | ||
| 1067 | * o if adapter type is specified then call detection routine for that adapter | ||
| 1068 | * type. Otherwise call detection routines for every adapter types until | ||
| 1069 | * adapter is detected. | ||
| 1070 | * | ||
| 1071 | * Notes: | ||
| 1072 | * 1) Detection tests are destructive! Adapter will be left in shutdown state | ||
| 1073 | * after the test. | ||
| 1074 | */ | ||
| 1075 | static int sdla_detect (sdlahw_t* hw) | ||
| 1076 | { | ||
| 1077 | unsigned port = hw->port; | ||
| 1078 | int err = 0; | ||
| 1079 | |||
| 1080 | if (!port && (hw->type != SDLA_S514)) | ||
| 1081 | return -EFAULT; | ||
| 1082 | |||
| 1083 | switch (hw->type) { | ||
| 1084 | case SDLA_S502A: | ||
| 1085 | if (!detect_s502a(port)) err = -ENODEV; | ||
| 1086 | break; | ||
| 1087 | |||
| 1088 | case SDLA_S502E: | ||
| 1089 | if (!detect_s502e(port)) err = -ENODEV; | ||
| 1090 | break; | ||
| 1091 | |||
| 1092 | case SDLA_S503: | ||
| 1093 | if (!detect_s503(port)) err = -ENODEV; | ||
| 1094 | break; | ||
| 1095 | |||
| 1096 | case SDLA_S507: | ||
| 1097 | if (!detect_s507(port)) err = -ENODEV; | ||
| 1098 | break; | ||
| 1099 | |||
| 1100 | case SDLA_S508: | ||
| 1101 | if (!detect_s508(port)) err = -ENODEV; | ||
| 1102 | break; | ||
| 1103 | |||
| 1104 | case SDLA_S514: | ||
| 1105 | if (!detect_s514(hw)) err = -ENODEV; | ||
| 1106 | break; | ||
| 1107 | |||
| 1108 | default: | ||
| 1109 | if (detect_s502a(port)) | ||
| 1110 | hw->type = SDLA_S502A; | ||
| 1111 | else if (detect_s502e(port)) | ||
| 1112 | hw->type = SDLA_S502E; | ||
| 1113 | else if (detect_s503(port)) | ||
| 1114 | hw->type = SDLA_S503; | ||
| 1115 | else if (detect_s507(port)) | ||
| 1116 | hw->type = SDLA_S507; | ||
| 1117 | else if (detect_s508(port)) | ||
| 1118 | hw->type = SDLA_S508; | ||
| 1119 | else err = -ENODEV; | ||
| 1120 | } | ||
| 1121 | return err; | ||
| 1122 | } | ||
| 1123 | |||
| 1124 | /*============================================================================ | ||
| 1125 | * Autoselect memory region. | ||
| 1126 | * o try all available DMP address options from the top down until success. | ||
| 1127 | */ | ||
| 1128 | static int sdla_autodpm (sdlahw_t* hw) | ||
| 1129 | { | ||
| 1130 | int i, err = -EINVAL; | ||
| 1131 | unsigned* opt; | ||
| 1132 | |||
| 1133 | switch (hw->type) { | ||
| 1134 | case SDLA_S502A: | ||
| 1135 | opt = s502a_dpmbase_options; | ||
| 1136 | break; | ||
| 1137 | |||
| 1138 | case SDLA_S502E: | ||
| 1139 | case SDLA_S503: | ||
| 1140 | case SDLA_S508: | ||
| 1141 | opt = s508_dpmbase_options; | ||
| 1142 | break; | ||
| 1143 | |||
| 1144 | case SDLA_S507: | ||
| 1145 | opt = s507_dpmbase_options; | ||
| 1146 | break; | ||
| 1147 | |||
| 1148 | default: | ||
| 1149 | return -EINVAL; | ||
| 1150 | } | ||
| 1151 | |||
| 1152 | /* Start testing from 8th position, address | ||
| 1153 | * 0xC8000 from the 508 address table. | ||
| 1154 | * We don't want to test A**** addresses, since | ||
| 1155 | * they are usually used for Video */ | ||
| 1156 | for (i = 8; i <= opt[0] && err; i++) { | ||
| 1157 | hw->dpmbase = phys_to_virt(opt[i]); | ||
| 1158 | err = sdla_setdpm(hw); | ||
| 1159 | } | ||
| 1160 | return err; | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | /*============================================================================ | ||
| 1164 | * Set up adapter dual-port memory window. | ||
| 1165 | * o shut down adapter | ||
| 1166 | * o make sure that no physical memory exists in this region, i.e entire | ||
| 1167 | * region reads 0xFF and is not writable when adapter is shut down. | ||
| 1168 | * o initialize adapter hardware | ||
| 1169 | * o make sure that region is usable with SDLA card, i.e. we can write to it | ||
| 1170 | * when adapter is configured. | ||
| 1171 | */ | ||
| 1172 | static int sdla_setdpm (sdlahw_t* hw) | ||
| 1173 | { | ||
| 1174 | int err; | ||
| 1175 | |||
| 1176 | /* Shut down card and verify memory region */ | ||
| 1177 | sdla_down(hw); | ||
| 1178 | if (check_memregion(hw->dpmbase, hw->dpmsize)) | ||
| 1179 | return -EINVAL; | ||
| 1180 | |||
| 1181 | /* Initialize adapter and test on-board memory segment by segment. | ||
| 1182 | * If memory size appears to be less than shared memory window size, | ||
| 1183 | * assume that memory region is unusable. | ||
| 1184 | */ | ||
| 1185 | err = sdla_init(hw); | ||
| 1186 | if (err) return err; | ||
| 1187 | |||
| 1188 | if (sdla_memtest(hw) < hw->dpmsize) { /* less than window size */ | ||
| 1189 | sdla_down(hw); | ||
| 1190 | return -EIO; | ||
| 1191 | } | ||
| 1192 | sdla_mapmem(hw, 0L); /* set window vector at bottom */ | ||
| 1193 | return 0; | ||
| 1194 | } | ||
| 1195 | |||
| 1196 | /*============================================================================ | ||
| 1197 | * Load adapter from the memory image of the SDLA firmware module. | ||
| 1198 | * o verify firmware integrity and compatibility | ||
| 1199 | * o start adapter up | ||
| 1200 | */ | ||
| 1201 | static int sdla_load (sdlahw_t* hw, sfm_t* sfm, unsigned len) | ||
| 1202 | { | ||
| 1203 | |||
| 1204 | int i; | ||
| 1205 | |||
| 1206 | /* Verify firmware signature */ | ||
| 1207 | if (strcmp(sfm->signature, SFM_SIGNATURE)) { | ||
| 1208 | printk(KERN_INFO "%s: not SDLA firmware!\n", | ||
| 1209 | modname); | ||
| 1210 | return -EINVAL; | ||
| 1211 | } | ||
| 1212 | |||
| 1213 | /* Verify firmware module format version */ | ||
| 1214 | if (sfm->version != SFM_VERSION) { | ||
| 1215 | printk(KERN_INFO | ||
| 1216 | "%s: firmware format %u rejected! Expecting %u.\n", | ||
| 1217 | modname, sfm->version, SFM_VERSION); | ||
| 1218 | return -EINVAL; | ||
| 1219 | } | ||
| 1220 | |||
| 1221 | /* Verify firmware module length and checksum */ | ||
| 1222 | if ((len - offsetof(sfm_t, image) != sfm->info.codesize) || | ||
| 1223 | (checksum((void*)&sfm->info, | ||
| 1224 | sizeof(sfm_info_t) + sfm->info.codesize) != sfm->checksum)) { | ||
| 1225 | printk(KERN_INFO "%s: firmware corrupted!\n", modname); | ||
| 1226 | return -EINVAL; | ||
| 1227 | } | ||
| 1228 | |||
| 1229 | /* Announce */ | ||
| 1230 | printk(KERN_INFO "%s: loading %s (ID=%u)...\n", modname, | ||
| 1231 | (sfm->descr[0] != '\0') ? sfm->descr : "unknown firmware", | ||
| 1232 | sfm->info.codeid); | ||
| 1233 | |||
| 1234 | if(hw->type == SDLA_S514) | ||
| 1235 | printk(KERN_INFO "%s: loading S514 adapter, CPU %c\n", | ||
| 1236 | modname, hw->S514_cpu_no[0]); | ||
| 1237 | |||
| 1238 | /* Scan through the list of compatible adapters and make sure our | ||
| 1239 | * adapter type is listed. | ||
| 1240 | */ | ||
| 1241 | for (i = 0; | ||
| 1242 | (i < SFM_MAX_SDLA) && (sfm->info.adapter[i] != hw->type); | ||
| 1243 | ++i); | ||
| 1244 | |||
| 1245 | if (i == SFM_MAX_SDLA) { | ||
| 1246 | printk(KERN_INFO "%s: firmware is not compatible with S%u!\n", | ||
| 1247 | modname, hw->type); | ||
| 1248 | return -EINVAL; | ||
| 1249 | } | ||
| 1250 | |||
| 1251 | |||
| 1252 | /* Make sure there is enough on-board memory */ | ||
| 1253 | if (hw->memory < sfm->info.memsize) { | ||
| 1254 | printk(KERN_INFO | ||
| 1255 | "%s: firmware needs %lu bytes of on-board memory!\n", | ||
| 1256 | modname, sfm->info.memsize); | ||
| 1257 | return -EINVAL; | ||
| 1258 | } | ||
| 1259 | |||
| 1260 | /* Move code onto adapter */ | ||
| 1261 | if (sdla_poke(hw, sfm->info.codeoffs, sfm->image, sfm->info.codesize)) { | ||
| 1262 | printk(KERN_INFO "%s: failed to load code segment!\n", | ||
| 1263 | modname); | ||
| 1264 | return -EIO; | ||
| 1265 | } | ||
| 1266 | |||
| 1267 | /* Prepare boot-time configuration data and kick-off CPU */ | ||
| 1268 | sdla_bootcfg(hw, &sfm->info); | ||
| 1269 | if (sdla_start(hw, sfm->info.startoffs)) { | ||
| 1270 | printk(KERN_INFO "%s: Damn... Adapter won't start!\n", | ||
| 1271 | modname); | ||
| 1272 | return -EIO; | ||
| 1273 | } | ||
| 1274 | |||
| 1275 | /* position DPM window over the mailbox and enable interrupts */ | ||
| 1276 | if (sdla_mapmem(hw, sfm->info.winoffs) || sdla_inten(hw)) { | ||
| 1277 | printk(KERN_INFO "%s: adapter hardware failure!\n", | ||
| 1278 | modname); | ||
| 1279 | return -EIO; | ||
| 1280 | } | ||
| 1281 | hw->fwid = sfm->info.codeid; /* set firmware ID */ | ||
| 1282 | return 0; | ||
| 1283 | } | ||
| 1284 | |||
| 1285 | /*============================================================================ | ||
| 1286 | * Initialize SDLA hardware: setup memory window, IRQ, etc. | ||
| 1287 | */ | ||
| 1288 | static int sdla_init (sdlahw_t* hw) | ||
| 1289 | { | ||
| 1290 | int i; | ||
| 1291 | |||
| 1292 | for (i = 0; i < SDLA_MAXIORANGE; ++i) | ||
| 1293 | hw->regs[i] = 0; | ||
| 1294 | |||
| 1295 | switch (hw->type) { | ||
| 1296 | case SDLA_S502A: return init_s502a(hw); | ||
| 1297 | case SDLA_S502E: return init_s502e(hw); | ||
| 1298 | case SDLA_S503: return init_s503(hw); | ||
| 1299 | case SDLA_S507: return init_s507(hw); | ||
| 1300 | case SDLA_S508: return init_s508(hw); | ||
| 1301 | } | ||
| 1302 | return -EINVAL; | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | /*============================================================================ | ||
| 1306 | * Test adapter on-board memory. | ||
| 1307 | * o slide DPM window from the bottom up and test adapter memory segment by | ||
| 1308 | * segment. | ||
| 1309 | * Return adapter memory size. | ||
| 1310 | */ | ||
| 1311 | static unsigned long sdla_memtest (sdlahw_t* hw) | ||
| 1312 | { | ||
| 1313 | unsigned long memsize; | ||
| 1314 | unsigned winsize; | ||
| 1315 | |||
| 1316 | for (memsize = 0, winsize = hw->dpmsize; | ||
| 1317 | !sdla_mapmem(hw, memsize) && | ||
| 1318 | (test_memregion(hw->dpmbase, winsize) == winsize) | ||
| 1319 | ; | ||
| 1320 | memsize += winsize) | ||
| 1321 | ; | ||
| 1322 | hw->memory = memsize; | ||
| 1323 | return memsize; | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | /*============================================================================ | ||
| 1327 | * Prepare boot-time firmware configuration data. | ||
| 1328 | * o position DPM window | ||
| 1329 | * o initialize configuration data area | ||
| 1330 | */ | ||
| 1331 | static int sdla_bootcfg (sdlahw_t* hw, sfm_info_t* sfminfo) | ||
| 1332 | { | ||
| 1333 | unsigned char* data; | ||
| 1334 | |||
| 1335 | if (!sfminfo->datasize) return 0; /* nothing to do */ | ||
| 1336 | |||
| 1337 | if (sdla_mapmem(hw, sfminfo->dataoffs) != 0) | ||
| 1338 | return -EIO; | ||
| 1339 | |||
| 1340 | if(hw->type == SDLA_S514) | ||
| 1341 | data = (void*)(hw->dpmbase + sfminfo->dataoffs); | ||
| 1342 | else | ||
| 1343 | data = (void*)((u8 *)hw->dpmbase + | ||
| 1344 | (sfminfo->dataoffs - hw->vector)); | ||
| 1345 | |||
| 1346 | memset_io (data, 0, sfminfo->datasize); | ||
| 1347 | |||
| 1348 | writeb (make_config_byte(hw), &data[0x00]); | ||
| 1349 | |||
| 1350 | switch (sfminfo->codeid) { | ||
| 1351 | case SFID_X25_502: | ||
| 1352 | case SFID_X25_508: | ||
| 1353 | writeb (3, &data[0x01]); /* T1 timer */ | ||
| 1354 | writeb (10, &data[0x03]); /* N2 */ | ||
| 1355 | writeb (7, &data[0x06]); /* HDLC window size */ | ||
| 1356 | writeb (1, &data[0x0B]); /* DTE */ | ||
| 1357 | writeb (2, &data[0x0C]); /* X.25 packet window size */ | ||
| 1358 | writew (128, &data[0x0D]); /* default X.25 data size */ | ||
| 1359 | writew (128, &data[0x0F]); /* maximum X.25 data size */ | ||
| 1360 | break; | ||
| 1361 | } | ||
| 1362 | return 0; | ||
| 1363 | } | ||
| 1364 | |||
| 1365 | /*============================================================================ | ||
| 1366 | * Prepare configuration byte identifying adapter type and CPU clock rate. | ||
| 1367 | */ | ||
| 1368 | static unsigned char make_config_byte (sdlahw_t* hw) | ||
| 1369 | { | ||
| 1370 | unsigned char byte = 0; | ||
| 1371 | |||
| 1372 | switch (hw->pclk) { | ||
| 1373 | case 5000: byte = 0x01; break; | ||
| 1374 | case 7200: byte = 0x02; break; | ||
| 1375 | case 8000: byte = 0x03; break; | ||
| 1376 | case 10000: byte = 0x04; break; | ||
| 1377 | case 16000: byte = 0x05; break; | ||
| 1378 | } | ||
| 1379 | |||
| 1380 | switch (hw->type) { | ||
| 1381 | case SDLA_S502E: byte |= 0x80; break; | ||
| 1382 | case SDLA_S503: byte |= 0x40; break; | ||
| 1383 | } | ||
| 1384 | return byte; | ||
| 1385 | } | ||
| 1386 | |||
| 1387 | /*============================================================================ | ||
| 1388 | * Start adapter's CPU. | ||
| 1389 | * o calculate a pointer to adapter's cold boot entry point | ||
| 1390 | * o position DPM window | ||
| 1391 | * o place boot instruction (jp addr) at cold boot entry point | ||
| 1392 | * o start CPU | ||
| 1393 | */ | ||
| 1394 | static int sdla_start (sdlahw_t* hw, unsigned addr) | ||
| 1395 | { | ||
| 1396 | unsigned port = hw->port; | ||
| 1397 | unsigned char *bootp; | ||
| 1398 | int err, tmp, i; | ||
| 1399 | |||
| 1400 | if (!port && (hw->type != SDLA_S514)) return -EFAULT; | ||
| 1401 | |||
| 1402 | switch (hw->type) { | ||
| 1403 | case SDLA_S502A: | ||
| 1404 | bootp = hw->dpmbase; | ||
| 1405 | bootp += 0x66; | ||
| 1406 | break; | ||
| 1407 | |||
| 1408 | case SDLA_S502E: | ||
| 1409 | case SDLA_S503: | ||
| 1410 | case SDLA_S507: | ||
| 1411 | case SDLA_S508: | ||
| 1412 | case SDLA_S514: | ||
| 1413 | bootp = hw->dpmbase; | ||
| 1414 | break; | ||
| 1415 | |||
| 1416 | default: | ||
| 1417 | return -EINVAL; | ||
| 1418 | } | ||
| 1419 | |||
| 1420 | err = sdla_mapmem(hw, 0); | ||
| 1421 | if (err) return err; | ||
| 1422 | |||
| 1423 | writeb (0xC3, bootp); /* Z80: 'jp' opcode */ | ||
| 1424 | bootp ++; | ||
| 1425 | writew (addr, bootp); | ||
| 1426 | |||
| 1427 | switch (hw->type) { | ||
| 1428 | case SDLA_S502A: | ||
| 1429 | _OUTB(port, 0x10); /* issue NMI to CPU */ | ||
| 1430 | hw->regs[0] = 0x10; | ||
| 1431 | break; | ||
| 1432 | |||
| 1433 | case SDLA_S502E: | ||
| 1434 | _OUTB(port + 3, 0x01); /* start CPU */ | ||
| 1435 | hw->regs[3] = 0x01; | ||
| 1436 | for (i = 0; i < SDLA_IODELAY; ++i); | ||
| 1437 | if (_INB(port) & 0x01) { /* verify */ | ||
| 1438 | /* | ||
| 1439 | * Enabling CPU changes functionality of the | ||
| 1440 | * control register, so we have to reset its | ||
| 1441 | * mirror. | ||
| 1442 | */ | ||
| 1443 | _OUTB(port, 0); /* disable interrupts */ | ||
| 1444 | hw->regs[0] = 0; | ||
| 1445 | } | ||
| 1446 | else return -EIO; | ||
| 1447 | break; | ||
| 1448 | |||
| 1449 | case SDLA_S503: | ||
| 1450 | tmp = hw->regs[0] | 0x09; /* set bits 0 and 3 */ | ||
| 1451 | _OUTB(port, tmp); | ||
| 1452 | hw->regs[0] = tmp; /* update mirror */ | ||
| 1453 | for (i = 0; i < SDLA_IODELAY; ++i); | ||
| 1454 | if (!(_INB(port) & 0x01)) /* verify */ | ||
| 1455 | return -EIO; | ||
| 1456 | break; | ||
| 1457 | |||
| 1458 | case SDLA_S507: | ||
| 1459 | tmp = hw->regs[0] | 0x02; | ||
| 1460 | _OUTB(port, tmp); | ||
| 1461 | hw->regs[0] = tmp; /* update mirror */ | ||
| 1462 | for (i = 0; i < SDLA_IODELAY; ++i); | ||
| 1463 | if (!(_INB(port) & 0x04)) /* verify */ | ||
| 1464 | return -EIO; | ||
| 1465 | break; | ||
| 1466 | |||
| 1467 | case SDLA_S508: | ||
| 1468 | tmp = hw->regs[0] | 0x02; | ||
| 1469 | _OUTB(port, tmp); | ||
| 1470 | hw->regs[0] = tmp; /* update mirror */ | ||
| 1471 | for (i = 0; i < SDLA_IODELAY; ++i); | ||
| 1472 | if (!(_INB(port + 1) & 0x02)) /* verify */ | ||
| 1473 | return -EIO; | ||
| 1474 | break; | ||
| 1475 | |||
| 1476 | case SDLA_S514: | ||
| 1477 | writeb (S514_CPU_START, hw->vector); | ||
| 1478 | break; | ||
| 1479 | |||
| 1480 | default: | ||
| 1481 | return -EINVAL; | ||
| 1482 | } | ||
| 1483 | return 0; | ||
| 1484 | } | ||
| 1485 | |||
| 1486 | /*============================================================================ | ||
| 1487 | * Initialize S502A adapter. | ||
| 1488 | */ | ||
| 1489 | static int init_s502a (sdlahw_t* hw) | ||
| 1490 | { | ||
| 1491 | unsigned port = hw->port; | ||
| 1492 | int tmp, i; | ||
| 1493 | |||
| 1494 | if (!detect_s502a(port)) | ||
| 1495 | return -ENODEV; | ||
| 1496 | |||
| 1497 | hw->regs[0] = 0x08; | ||
| 1498 | hw->regs[1] = 0xFF; | ||
| 1499 | |||
| 1500 | /* Verify configuration options */ | ||
| 1501 | i = get_option_index(s502a_dpmbase_options, virt_to_phys(hw->dpmbase)); | ||
| 1502 | if (i == 0) | ||
| 1503 | return -EINVAL; | ||
| 1504 | |||
| 1505 | tmp = s502a_hmcr[i - 1]; | ||
| 1506 | switch (hw->dpmsize) { | ||
| 1507 | case 0x2000: | ||
| 1508 | tmp |= 0x01; | ||
| 1509 | break; | ||
| 1510 | |||
| 1511 | case 0x10000L: | ||
| 1512 | break; | ||
| 1513 | |||
| 1514 | default: | ||
| 1515 | return -EINVAL; | ||
| 1516 | } | ||
| 1517 | |||
| 1518 | /* Setup dual-port memory window (this also enables memory access) */ | ||
| 1519 | _OUTB(port + 1, tmp); | ||
| 1520 | hw->regs[1] = tmp; | ||
| 1521 | hw->regs[0] = 0x08; | ||
| 1522 | return 0; | ||
| 1523 | } | ||
| 1524 | |||
| 1525 | /*============================================================================ | ||
| 1526 | * Initialize S502E adapter. | ||
| 1527 | */ | ||
| 1528 | static int init_s502e (sdlahw_t* hw) | ||
| 1529 | { | ||
| 1530 | unsigned port = hw->port; | ||
| 1531 | int tmp, i; | ||
| 1532 | |||
| 1533 | if (!detect_s502e(port)) | ||
| 1534 | return -ENODEV; | ||
| 1535 | |||
| 1536 | /* Verify configuration options */ | ||
| 1537 | i = get_option_index(s508_dpmbase_options, virt_to_phys(hw->dpmbase)); | ||
| 1538 | if (i == 0) | ||
| 1539 | return -EINVAL; | ||
| 1540 | |||
| 1541 | tmp = s502e_hmcr[i - 1]; | ||
| 1542 | switch (hw->dpmsize) { | ||
| 1543 | case 0x2000: | ||
| 1544 | tmp |= 0x01; | ||
| 1545 | break; | ||
| 1546 | |||
| 1547 | case 0x10000L: | ||
| 1548 | break; | ||
| 1549 | |||
| 1550 | default: | ||
| 1551 | return -EINVAL; | ||
| 1552 | } | ||
| 1553 | |||
| 1554 | /* Setup dual-port memory window */ | ||
| 1555 | _OUTB(port + 1, tmp); | ||
| 1556 | hw->regs[1] = tmp; | ||
| 1557 | |||
| 1558 | /* Enable memory access */ | ||
| 1559 | _OUTB(port, 0x02); | ||
| 1560 | hw->regs[0] = 0x02; | ||
| 1561 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1562 | return (_INB(port) & 0x02) ? 0 : -EIO; | ||
| 1563 | } | ||
| 1564 | |||
| 1565 | /*============================================================================ | ||
| 1566 | * Initialize S503 adapter. | ||
| 1567 | * --------------------------------------------------------------------------- | ||
| 1568 | */ | ||
| 1569 | static int init_s503 (sdlahw_t* hw) | ||
| 1570 | { | ||
| 1571 | unsigned port = hw->port; | ||
| 1572 | int tmp, i; | ||
| 1573 | |||
| 1574 | if (!detect_s503(port)) | ||
| 1575 | return -ENODEV; | ||
| 1576 | |||
| 1577 | /* Verify configuration options */ | ||
| 1578 | i = get_option_index(s508_dpmbase_options, virt_to_phys(hw->dpmbase)); | ||
| 1579 | if (i == 0) | ||
| 1580 | return -EINVAL; | ||
| 1581 | |||
| 1582 | tmp = s502e_hmcr[i - 1]; | ||
| 1583 | switch (hw->dpmsize) { | ||
| 1584 | case 0x2000: | ||
| 1585 | tmp |= 0x01; | ||
| 1586 | break; | ||
| 1587 | |||
| 1588 | case 0x10000L: | ||
| 1589 | break; | ||
| 1590 | |||
| 1591 | default: | ||
| 1592 | return -EINVAL; | ||
| 1593 | } | ||
| 1594 | |||
| 1595 | /* Setup dual-port memory window */ | ||
| 1596 | _OUTB(port + 1, tmp); | ||
| 1597 | hw->regs[1] = tmp; | ||
| 1598 | |||
| 1599 | /* Enable memory access */ | ||
| 1600 | _OUTB(port, 0x02); | ||
| 1601 | hw->regs[0] = 0x02; /* update mirror */ | ||
| 1602 | return 0; | ||
| 1603 | } | ||
| 1604 | |||
| 1605 | /*============================================================================ | ||
| 1606 | * Initialize S507 adapter. | ||
| 1607 | */ | ||
| 1608 | static int init_s507 (sdlahw_t* hw) | ||
| 1609 | { | ||
| 1610 | unsigned port = hw->port; | ||
| 1611 | int tmp, i; | ||
| 1612 | |||
| 1613 | if (!detect_s507(port)) | ||
| 1614 | return -ENODEV; | ||
| 1615 | |||
| 1616 | /* Verify configuration options */ | ||
| 1617 | i = get_option_index(s507_dpmbase_options, virt_to_phys(hw->dpmbase)); | ||
| 1618 | if (i == 0) | ||
| 1619 | return -EINVAL; | ||
| 1620 | |||
| 1621 | tmp = s507_hmcr[i - 1]; | ||
| 1622 | switch (hw->dpmsize) { | ||
| 1623 | case 0x2000: | ||
| 1624 | tmp |= 0x01; | ||
| 1625 | break; | ||
| 1626 | |||
| 1627 | case 0x10000L: | ||
| 1628 | break; | ||
| 1629 | |||
| 1630 | default: | ||
| 1631 | return -EINVAL; | ||
| 1632 | } | ||
| 1633 | |||
| 1634 | /* Enable adapter's logic */ | ||
| 1635 | _OUTB(port, 0x01); | ||
| 1636 | hw->regs[0] = 0x01; | ||
| 1637 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1638 | if (!(_INB(port) & 0x20)) | ||
| 1639 | return -EIO; | ||
| 1640 | |||
| 1641 | /* Setup dual-port memory window */ | ||
| 1642 | _OUTB(port + 1, tmp); | ||
| 1643 | hw->regs[1] = tmp; | ||
| 1644 | |||
| 1645 | /* Enable memory access */ | ||
| 1646 | tmp = hw->regs[0] | 0x04; | ||
| 1647 | if (hw->irq) { | ||
| 1648 | i = get_option_index(s508_irq_options, hw->irq); | ||
| 1649 | if (i) tmp |= s507_irqmask[i - 1]; | ||
| 1650 | } | ||
| 1651 | _OUTB(port, tmp); | ||
| 1652 | hw->regs[0] = tmp; /* update mirror */ | ||
| 1653 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1654 | return (_INB(port) & 0x08) ? 0 : -EIO; | ||
| 1655 | } | ||
| 1656 | |||
| 1657 | /*============================================================================ | ||
| 1658 | * Initialize S508 adapter. | ||
| 1659 | */ | ||
| 1660 | static int init_s508 (sdlahw_t* hw) | ||
| 1661 | { | ||
| 1662 | unsigned port = hw->port; | ||
| 1663 | int tmp, i; | ||
| 1664 | |||
| 1665 | if (!detect_s508(port)) | ||
| 1666 | return -ENODEV; | ||
| 1667 | |||
| 1668 | /* Verify configuration options */ | ||
| 1669 | i = get_option_index(s508_dpmbase_options, virt_to_phys(hw->dpmbase)); | ||
| 1670 | if (i == 0) | ||
| 1671 | return -EINVAL; | ||
| 1672 | |||
| 1673 | /* Setup memory configuration */ | ||
| 1674 | tmp = s508_hmcr[i - 1]; | ||
| 1675 | _OUTB(port + 1, tmp); | ||
| 1676 | hw->regs[1] = tmp; | ||
| 1677 | |||
| 1678 | /* Enable memory access */ | ||
| 1679 | _OUTB(port, 0x04); | ||
| 1680 | hw->regs[0] = 0x04; /* update mirror */ | ||
| 1681 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1682 | return (_INB(port + 1) & 0x04) ? 0 : -EIO; | ||
| 1683 | } | ||
| 1684 | |||
| 1685 | /*============================================================================ | ||
| 1686 | * Detect S502A adapter. | ||
| 1687 | * Following tests are used to detect S502A adapter: | ||
| 1688 | * 1. All registers other than status (BASE) should read 0xFF | ||
| 1689 | * 2. After writing 00001000b to control register, status register should | ||
| 1690 | * read 01000000b. | ||
| 1691 | * 3. After writing 0 to control register, status register should still | ||
| 1692 | * read 01000000b. | ||
| 1693 | * 4. After writing 00000100b to control register, status register should | ||
| 1694 | * read 01000100b. | ||
| 1695 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1696 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1697 | * state after the test. | ||
| 1698 | */ | ||
| 1699 | static int detect_s502a (int port) | ||
| 1700 | { | ||
| 1701 | int i, j; | ||
| 1702 | |||
| 1703 | if (!get_option_index(s502_port_options, port)) | ||
| 1704 | return 0; | ||
| 1705 | |||
| 1706 | for (j = 1; j < SDLA_MAXIORANGE; ++j) { | ||
| 1707 | if (_INB(port + j) != 0xFF) | ||
| 1708 | return 0; | ||
| 1709 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1710 | } | ||
| 1711 | |||
| 1712 | _OUTB(port, 0x08); /* halt CPU */ | ||
| 1713 | _OUTB(port, 0x08); | ||
| 1714 | _OUTB(port, 0x08); | ||
| 1715 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1716 | if (_INB(port) != 0x40) | ||
| 1717 | return 0; | ||
| 1718 | _OUTB(port, 0x00); | ||
| 1719 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1720 | if (_INB(port) != 0x40) | ||
| 1721 | return 0; | ||
| 1722 | _OUTB(port, 0x04); | ||
| 1723 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1724 | if (_INB(port) != 0x44) | ||
| 1725 | return 0; | ||
| 1726 | |||
| 1727 | /* Reset adapter */ | ||
| 1728 | _OUTB(port, 0x08); | ||
| 1729 | _OUTB(port, 0x08); | ||
| 1730 | _OUTB(port, 0x08); | ||
| 1731 | _OUTB(port + 1, 0xFF); | ||
| 1732 | return 1; | ||
| 1733 | } | ||
| 1734 | |||
| 1735 | /*============================================================================ | ||
| 1736 | * Detect S502E adapter. | ||
| 1737 | * Following tests are used to verify adapter presence: | ||
| 1738 | * 1. All registers other than status (BASE) should read 0xFF. | ||
| 1739 | * 2. After writing 0 to CPU control register (BASE+3), status register | ||
| 1740 | * (BASE) should read 11111000b. | ||
| 1741 | * 3. After writing 00000100b to port BASE (set bit 2), status register | ||
| 1742 | * (BASE) should read 11111100b. | ||
| 1743 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1744 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1745 | * state after the test. | ||
| 1746 | */ | ||
| 1747 | static int detect_s502e (int port) | ||
| 1748 | { | ||
| 1749 | int i, j; | ||
| 1750 | |||
| 1751 | if (!get_option_index(s502_port_options, port)) | ||
| 1752 | return 0; | ||
| 1753 | for (j = 1; j < SDLA_MAXIORANGE; ++j) { | ||
| 1754 | if (_INB(port + j) != 0xFF) | ||
| 1755 | return 0; | ||
| 1756 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1757 | } | ||
| 1758 | |||
| 1759 | _OUTB(port + 3, 0); /* CPU control reg. */ | ||
| 1760 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1761 | if (_INB(port) != 0xF8) /* read status */ | ||
| 1762 | return 0; | ||
| 1763 | _OUTB(port, 0x04); /* set bit 2 */ | ||
| 1764 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1765 | if (_INB(port) != 0xFC) /* verify */ | ||
| 1766 | return 0; | ||
| 1767 | |||
| 1768 | /* Reset adapter */ | ||
| 1769 | _OUTB(port, 0); | ||
| 1770 | return 1; | ||
| 1771 | } | ||
| 1772 | |||
| 1773 | /*============================================================================ | ||
| 1774 | * Detect s503 adapter. | ||
| 1775 | * Following tests are used to verify adapter presence: | ||
| 1776 | * 1. All registers other than status (BASE) should read 0xFF. | ||
| 1777 | * 2. After writing 0 to control register (BASE), status register (BASE) | ||
| 1778 | * should read 11110000b. | ||
| 1779 | * 3. After writing 00000100b (set bit 2) to control register (BASE), | ||
| 1780 | * status register should read 11110010b. | ||
| 1781 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1782 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1783 | * state after the test. | ||
| 1784 | */ | ||
| 1785 | static int detect_s503 (int port) | ||
| 1786 | { | ||
| 1787 | int i, j; | ||
| 1788 | |||
| 1789 | if (!get_option_index(s503_port_options, port)) | ||
| 1790 | return 0; | ||
| 1791 | for (j = 1; j < SDLA_MAXIORANGE; ++j) { | ||
| 1792 | if (_INB(port + j) != 0xFF) | ||
| 1793 | return 0; | ||
| 1794 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1795 | } | ||
| 1796 | |||
| 1797 | _OUTB(port, 0); /* reset control reg.*/ | ||
| 1798 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1799 | if (_INB(port) != 0xF0) /* read status */ | ||
| 1800 | return 0; | ||
| 1801 | _OUTB(port, 0x04); /* set bit 2 */ | ||
| 1802 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1803 | if (_INB(port) != 0xF2) /* verify */ | ||
| 1804 | return 0; | ||
| 1805 | |||
| 1806 | /* Reset adapter */ | ||
| 1807 | _OUTB(port, 0); | ||
| 1808 | return 1; | ||
| 1809 | } | ||
| 1810 | |||
| 1811 | /*============================================================================ | ||
| 1812 | * Detect s507 adapter. | ||
| 1813 | * Following tests are used to detect s507 adapter: | ||
| 1814 | * 1. All ports should read the same value. | ||
| 1815 | * 2. After writing 0x00 to control register, status register should read | ||
| 1816 | * ?011000?b. | ||
| 1817 | * 3. After writing 0x01 to control register, status register should read | ||
| 1818 | * ?011001?b. | ||
| 1819 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1820 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1821 | * state after the test. | ||
| 1822 | */ | ||
| 1823 | static int detect_s507 (int port) | ||
| 1824 | { | ||
| 1825 | int tmp, i, j; | ||
| 1826 | |||
| 1827 | if (!get_option_index(s508_port_options, port)) | ||
| 1828 | return 0; | ||
| 1829 | tmp = _INB(port); | ||
| 1830 | for (j = 1; j < S507_IORANGE; ++j) { | ||
| 1831 | if (_INB(port + j) != tmp) | ||
| 1832 | return 0; | ||
| 1833 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1834 | } | ||
| 1835 | |||
| 1836 | _OUTB(port, 0x00); | ||
| 1837 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1838 | if ((_INB(port) & 0x7E) != 0x30) | ||
| 1839 | return 0; | ||
| 1840 | _OUTB(port, 0x01); | ||
| 1841 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1842 | if ((_INB(port) & 0x7E) != 0x32) | ||
| 1843 | return 0; | ||
| 1844 | |||
| 1845 | /* Reset adapter */ | ||
| 1846 | _OUTB(port, 0x00); | ||
| 1847 | return 1; | ||
| 1848 | } | ||
| 1849 | |||
| 1850 | /*============================================================================ | ||
| 1851 | * Detect s508 adapter. | ||
| 1852 | * Following tests are used to detect s508 adapter: | ||
| 1853 | * 1. After writing 0x00 to control register, status register should read | ||
| 1854 | * ??000000b. | ||
| 1855 | * 2. After writing 0x10 to control register, status register should read | ||
| 1856 | * ??010000b | ||
| 1857 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1858 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1859 | * state after the test. | ||
| 1860 | */ | ||
| 1861 | static int detect_s508 (int port) | ||
| 1862 | { | ||
| 1863 | int i; | ||
| 1864 | |||
| 1865 | if (!get_option_index(s508_port_options, port)) | ||
| 1866 | return 0; | ||
| 1867 | _OUTB(port, 0x00); | ||
| 1868 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1869 | if ((_INB(port + 1) & 0x3F) != 0x00) | ||
| 1870 | return 0; | ||
| 1871 | _OUTB(port, 0x10); | ||
| 1872 | for (i = 0; i < SDLA_IODELAY; ++i); /* delay */ | ||
| 1873 | if ((_INB(port + 1) & 0x3F) != 0x10) | ||
| 1874 | return 0; | ||
| 1875 | |||
| 1876 | /* Reset adapter */ | ||
| 1877 | _OUTB(port, 0x00); | ||
| 1878 | return 1; | ||
| 1879 | } | ||
| 1880 | |||
| 1881 | /*============================================================================ | ||
| 1882 | * Detect s514 PCI adapter. | ||
| 1883 | * Return 1 if detected o.k. or 0 if failed. | ||
| 1884 | * Note: This test is destructive! Adapter will be left in shutdown | ||
| 1885 | * state after the test. | ||
| 1886 | */ | ||
| 1887 | static int detect_s514 (sdlahw_t* hw) | ||
| 1888 | { | ||
| 1889 | unsigned char CPU_no, slot_no, auto_slot_cfg; | ||
| 1890 | int number_S514_cards = 0; | ||
| 1891 | u32 S514_mem_base_addr = 0; | ||
| 1892 | u32 ut_u32; | ||
| 1893 | struct pci_dev *pci_dev; | ||
| 1894 | |||
| 1895 | |||
| 1896 | #ifndef CONFIG_PCI | ||
| 1897 | printk(KERN_INFO "%s: Linux not compiled for PCI usage!\n", modname); | ||
| 1898 | return 0; | ||
| 1899 | #endif | ||
| 1900 | |||
| 1901 | /* | ||
| 1902 | The 'setup()' procedure in 'sdlamain.c' passes the CPU number and the | ||
| 1903 | slot number defined in 'router.conf' via the 'port' definition. | ||
| 1904 | */ | ||
| 1905 | CPU_no = hw->S514_cpu_no[0]; | ||
| 1906 | slot_no = hw->S514_slot_no; | ||
| 1907 | auto_slot_cfg = hw->auto_pci_cfg; | ||
| 1908 | |||
| 1909 | if (auto_slot_cfg){ | ||
| 1910 | printk(KERN_INFO "%s: srch... S514 card, CPU %c, Slot=Auto\n", | ||
| 1911 | modname, CPU_no); | ||
| 1912 | |||
| 1913 | }else{ | ||
| 1914 | printk(KERN_INFO "%s: srch... S514 card, CPU %c, Slot #%d\n", | ||
| 1915 | modname, CPU_no, slot_no); | ||
| 1916 | } | ||
| 1917 | |||
| 1918 | /* check to see that CPU A or B has been selected in 'router.conf' */ | ||
| 1919 | switch(CPU_no) { | ||
| 1920 | case S514_CPU_A: | ||
| 1921 | case S514_CPU_B: | ||
| 1922 | break; | ||
| 1923 | |||
| 1924 | default: | ||
| 1925 | printk(KERN_INFO "%s: S514 CPU definition invalid.\n", | ||
| 1926 | modname); | ||
| 1927 | printk(KERN_INFO "Must be 'A' or 'B'\n"); | ||
| 1928 | return 0; | ||
| 1929 | } | ||
| 1930 | |||
| 1931 | number_S514_cards = find_s514_adapter(hw, 0); | ||
| 1932 | if(!number_S514_cards) | ||
| 1933 | return 0; | ||
| 1934 | |||
| 1935 | /* we are using a single S514 adapter with a slot of 0 so re-read the */ | ||
| 1936 | /* location of this adapter */ | ||
| 1937 | if((number_S514_cards == 1) && auto_slot_cfg) { | ||
| 1938 | number_S514_cards = find_s514_adapter(hw, 1); | ||
| 1939 | if(!number_S514_cards) { | ||
| 1940 | printk(KERN_INFO "%s: Error finding PCI card\n", | ||
| 1941 | modname); | ||
| 1942 | return 0; | ||
| 1943 | } | ||
| 1944 | } | ||
| 1945 | |||
| 1946 | pci_dev = hw->pci_dev; | ||
| 1947 | /* read the physical memory base address */ | ||
| 1948 | S514_mem_base_addr = (CPU_no == S514_CPU_A) ? | ||
| 1949 | (pci_dev->resource[1].start) : | ||
| 1950 | (pci_dev->resource[2].start); | ||
| 1951 | |||
| 1952 | printk(KERN_INFO "%s: S514 PCI memory at 0x%X\n", | ||
| 1953 | modname, S514_mem_base_addr); | ||
| 1954 | if(!S514_mem_base_addr) { | ||
| 1955 | if(CPU_no == S514_CPU_B) | ||
| 1956 | printk(KERN_INFO "%s: CPU #B not present on the card\n", modname); | ||
| 1957 | else | ||
| 1958 | printk(KERN_INFO "%s: No PCI memory allocated to card\n", modname); | ||
| 1959 | return 0; | ||
| 1960 | } | ||
| 1961 | |||
| 1962 | /* enable the PCI memory */ | ||
| 1963 | pci_read_config_dword(pci_dev, | ||
| 1964 | (CPU_no == S514_CPU_A) ? PCI_MAP0_DWORD : PCI_MAP1_DWORD, | ||
| 1965 | &ut_u32); | ||
| 1966 | pci_write_config_dword(pci_dev, | ||
| 1967 | (CPU_no == S514_CPU_A) ? PCI_MAP0_DWORD : PCI_MAP1_DWORD, | ||
| 1968 | (ut_u32 | PCI_MEMORY_ENABLE)); | ||
| 1969 | |||
| 1970 | /* check the IRQ allocated and enable IRQ usage */ | ||
| 1971 | if(!(hw->irq = pci_dev->irq)) { | ||
| 1972 | printk(KERN_INFO "%s: IRQ not allocated to S514 adapter\n", | ||
| 1973 | modname); | ||
| 1974 | return 0; | ||
| 1975 | } | ||
| 1976 | |||
| 1977 | /* BUG FIX : Mar 6 2000 | ||
| 1978 | * On a initial loading of the card, we must check | ||
| 1979 | * and clear PCI interrupt bits, due to a reset | ||
| 1980 | * problem on some other boards. i.e. An interrupt | ||
| 1981 | * might be pending, even after system bootup, | ||
| 1982 | * in which case, when starting wanrouter the machine | ||
| 1983 | * would crash. | ||
| 1984 | */ | ||
| 1985 | if (init_pci_slot(hw)) | ||
| 1986 | return 0; | ||
| 1987 | |||
| 1988 | pci_read_config_dword(pci_dev, PCI_INT_CONFIG, &ut_u32); | ||
| 1989 | ut_u32 |= (CPU_no == S514_CPU_A) ? | ||
| 1990 | PCI_ENABLE_IRQ_CPU_A : PCI_ENABLE_IRQ_CPU_B; | ||
| 1991 | pci_write_config_dword(pci_dev, PCI_INT_CONFIG, ut_u32); | ||
| 1992 | |||
| 1993 | printk(KERN_INFO "%s: IRQ %d allocated to the S514 card\n", | ||
| 1994 | modname, hw->irq); | ||
| 1995 | |||
| 1996 | /* map the physical PCI memory to virtual memory */ | ||
| 1997 | hw->dpmbase = ioremap((unsigned long)S514_mem_base_addr, | ||
| 1998 | (unsigned long)MAX_SIZEOF_S514_MEMORY); | ||
| 1999 | /* map the physical control register memory to virtual memory */ | ||
| 2000 | hw->vector = (unsigned long)ioremap( | ||
| 2001 | (unsigned long)(S514_mem_base_addr + S514_CTRL_REG_BYTE), | ||
| 2002 | (unsigned long)16); | ||
| 2003 | |||
| 2004 | if(!hw->dpmbase || !hw->vector) { | ||
| 2005 | printk(KERN_INFO "%s: PCI virtual memory allocation failed\n", | ||
| 2006 | modname); | ||
| 2007 | return 0; | ||
| 2008 | } | ||
| 2009 | |||
| 2010 | /* halt the adapter */ | ||
| 2011 | writeb (S514_CPU_HALT, hw->vector); | ||
| 2012 | |||
| 2013 | return 1; | ||
| 2014 | } | ||
| 2015 | |||
| 2016 | /*============================================================================ | ||
| 2017 | * Find the S514 PCI adapter in the PCI bus. | ||
| 2018 | * Return the number of S514 adapters found (0 if no adapter found). | ||
| 2019 | */ | ||
| 2020 | static int find_s514_adapter(sdlahw_t* hw, char find_first_S514_card) | ||
| 2021 | { | ||
| 2022 | unsigned char slot_no; | ||
| 2023 | int number_S514_cards = 0; | ||
| 2024 | char S514_found_in_slot = 0; | ||
| 2025 | u16 PCI_subsys_vendor; | ||
| 2026 | |||
| 2027 | struct pci_dev *pci_dev = NULL; | ||
| 2028 | |||
| 2029 | slot_no = hw->S514_slot_no; | ||
| 2030 | |||
| 2031 | while ((pci_dev = pci_find_device(V3_VENDOR_ID, V3_DEVICE_ID, pci_dev)) | ||
| 2032 | != NULL) { | ||
| 2033 | |||
| 2034 | pci_read_config_word(pci_dev, PCI_SUBSYS_VENDOR_WORD, | ||
| 2035 | &PCI_subsys_vendor); | ||
| 2036 | |||
| 2037 | if(PCI_subsys_vendor != SANGOMA_SUBSYS_VENDOR) | ||
| 2038 | continue; | ||
| 2039 | |||
| 2040 | hw->pci_dev = pci_dev; | ||
| 2041 | |||
| 2042 | if(find_first_S514_card) | ||
| 2043 | return(1); | ||
| 2044 | |||
| 2045 | number_S514_cards ++; | ||
| 2046 | |||
| 2047 | printk(KERN_INFO | ||
| 2048 | "%s: S514 card found, slot #%d (devfn 0x%X)\n", | ||
| 2049 | modname, ((pci_dev->devfn >> 3) & PCI_DEV_SLOT_MASK), | ||
| 2050 | pci_dev->devfn); | ||
| 2051 | |||
| 2052 | if (hw->auto_pci_cfg){ | ||
| 2053 | hw->S514_slot_no = ((pci_dev->devfn >> 3) & PCI_DEV_SLOT_MASK); | ||
| 2054 | slot_no = hw->S514_slot_no; | ||
| 2055 | |||
| 2056 | }else if (((pci_dev->devfn >> 3) & PCI_DEV_SLOT_MASK) == slot_no){ | ||
| 2057 | S514_found_in_slot = 1; | ||
| 2058 | break; | ||
| 2059 | } | ||
| 2060 | } | ||
| 2061 | |||
| 2062 | /* if no S514 adapter has been found, then exit */ | ||
| 2063 | if (!number_S514_cards) { | ||
| 2064 | printk(KERN_INFO "%s: Error, no S514 adapters found\n", modname); | ||
| 2065 | return 0; | ||
| 2066 | } | ||
| 2067 | /* if more than one S514 card has been found, then the user must have */ /* defined a slot number so that the correct adapter is used */ | ||
| 2068 | else if ((number_S514_cards > 1) && hw->auto_pci_cfg) { | ||
| 2069 | printk(KERN_INFO "%s: Error, PCI Slot autodetect Failed! \n" | ||
| 2070 | "%s: More than one S514 adapter found.\n" | ||
| 2071 | "%s: Disable the Autodetect feature and supply\n" | ||
| 2072 | "%s: the PCISLOT numbers for each card.\n", | ||
| 2073 | modname,modname,modname,modname); | ||
| 2074 | return 0; | ||
| 2075 | } | ||
| 2076 | /* if the user has specified a slot number and the S514 adapter has */ | ||
| 2077 | /* not been found in that slot, then exit */ | ||
| 2078 | else if (!hw->auto_pci_cfg && !S514_found_in_slot) { | ||
| 2079 | printk(KERN_INFO | ||
| 2080 | "%s: Error, S514 card not found in specified slot #%d\n", | ||
| 2081 | modname, slot_no); | ||
| 2082 | return 0; | ||
| 2083 | } | ||
| 2084 | |||
| 2085 | return (number_S514_cards); | ||
| 2086 | } | ||
| 2087 | |||
| 2088 | |||
| 2089 | |||
| 2090 | /******* Miscellaneous ******************************************************/ | ||
| 2091 | |||
| 2092 | /*============================================================================ | ||
| 2093 | * Calibrate SDLA memory access delay. | ||
| 2094 | * Count number of idle loops made within 1 second and then calculate the | ||
| 2095 | * number of loops that should be made to achive desired delay. | ||
| 2096 | */ | ||
| 2097 | static int calibrate_delay (int mks) | ||
| 2098 | { | ||
| 2099 | unsigned int delay; | ||
| 2100 | unsigned long stop; | ||
| 2101 | |||
| 2102 | for (delay = 0, stop = SYSTEM_TICK + HZ; SYSTEM_TICK < stop; ++delay); | ||
| 2103 | return (delay/(1000000L/mks) + 1); | ||
| 2104 | } | ||
| 2105 | |||
| 2106 | /*============================================================================ | ||
| 2107 | * Get option's index into the options list. | ||
| 2108 | * Return option's index (1 .. N) or zero if option is invalid. | ||
| 2109 | */ | ||
| 2110 | static int get_option_index (unsigned* optlist, unsigned optval) | ||
| 2111 | { | ||
| 2112 | int i; | ||
| 2113 | |||
| 2114 | for (i = 1; i <= optlist[0]; ++i) | ||
| 2115 | if ( optlist[i] == optval) | ||
| 2116 | return i; | ||
| 2117 | return 0; | ||
| 2118 | } | ||
| 2119 | |||
| 2120 | /*============================================================================ | ||
| 2121 | * Check memory region to see if it's available. | ||
| 2122 | * Return: 0 ok. | ||
| 2123 | */ | ||
| 2124 | static unsigned check_memregion (void* ptr, unsigned len) | ||
| 2125 | { | ||
| 2126 | volatile unsigned char* p = ptr; | ||
| 2127 | |||
| 2128 | for (; len && (readb (p) == 0xFF); --len, ++p) { | ||
| 2129 | writeb (0, p); /* attempt to write 0 */ | ||
| 2130 | if (readb(p) != 0xFF) { /* still has to read 0xFF */ | ||
| 2131 | writeb (0xFF, p);/* restore original value */ | ||
| 2132 | break; /* not good */ | ||
| 2133 | } | ||
| 2134 | } | ||
| 2135 | |||
| 2136 | return len; | ||
| 2137 | } | ||
| 2138 | |||
| 2139 | /*============================================================================ | ||
| 2140 | * Test memory region. | ||
| 2141 | * Return: size of the region that passed the test. | ||
| 2142 | * Note: Region size must be multiple of 2 ! | ||
| 2143 | */ | ||
| 2144 | static unsigned test_memregion (void* ptr, unsigned len) | ||
| 2145 | { | ||
| 2146 | volatile unsigned short* w_ptr; | ||
| 2147 | unsigned len_w = len >> 1; /* region len in words */ | ||
| 2148 | unsigned i; | ||
| 2149 | |||
| 2150 | for (i = 0, w_ptr = ptr; i < len_w; ++i, ++w_ptr) | ||
| 2151 | writew (0xAA55, w_ptr); | ||
| 2152 | |||
| 2153 | for (i = 0, w_ptr = ptr; i < len_w; ++i, ++w_ptr) | ||
| 2154 | if (readw (w_ptr) != 0xAA55) { | ||
| 2155 | len_w = i; | ||
| 2156 | break; | ||
| 2157 | } | ||
| 2158 | |||
| 2159 | for (i = 0, w_ptr = ptr; i < len_w; ++i, ++w_ptr) | ||
| 2160 | writew (0x55AA, w_ptr); | ||
| 2161 | |||
| 2162 | for (i = 0, w_ptr = ptr; i < len_w; ++i, ++w_ptr) | ||
| 2163 | if (readw(w_ptr) != 0x55AA) { | ||
| 2164 | len_w = i; | ||
| 2165 | break; | ||
| 2166 | } | ||
| 2167 | |||
| 2168 | for (i = 0, w_ptr = ptr; i < len_w; ++i, ++w_ptr) | ||
| 2169 | writew (0, w_ptr); | ||
| 2170 | |||
| 2171 | return len_w << 1; | ||
| 2172 | } | ||
| 2173 | |||
| 2174 | /*============================================================================ | ||
| 2175 | * Calculate 16-bit CRC using CCITT polynomial. | ||
| 2176 | */ | ||
| 2177 | static unsigned short checksum (unsigned char* buf, unsigned len) | ||
| 2178 | { | ||
| 2179 | unsigned short crc = 0; | ||
| 2180 | unsigned mask, flag; | ||
| 2181 | |||
| 2182 | for (; len; --len, ++buf) { | ||
| 2183 | for (mask = 0x80; mask; mask >>= 1) { | ||
| 2184 | flag = (crc & 0x8000); | ||
| 2185 | crc <<= 1; | ||
| 2186 | crc |= ((*buf & mask) ? 1 : 0); | ||
| 2187 | if (flag) crc ^= 0x1021; | ||
| 2188 | } | ||
| 2189 | } | ||
| 2190 | return crc; | ||
| 2191 | } | ||
| 2192 | |||
| 2193 | static int init_pci_slot(sdlahw_t *hw) | ||
| 2194 | { | ||
| 2195 | |||
| 2196 | u32 int_status; | ||
| 2197 | int volatile found=0; | ||
| 2198 | int i=0; | ||
| 2199 | |||
| 2200 | /* Check if this is a very first load for a specific | ||
| 2201 | * pci card. If it is, clear the interrput bits, and | ||
| 2202 | * set the flag indicating that this card was initialized. | ||
| 2203 | */ | ||
| 2204 | |||
| 2205 | for (i=0; (i<MAX_S514_CARDS) && !found; i++){ | ||
| 2206 | if (pci_slot_ar[i] == hw->S514_slot_no){ | ||
| 2207 | found=1; | ||
| 2208 | break; | ||
| 2209 | } | ||
| 2210 | if (pci_slot_ar[i] == 0xFF){ | ||
| 2211 | break; | ||
| 2212 | } | ||
| 2213 | } | ||
| 2214 | |||
| 2215 | if (!found){ | ||
| 2216 | read_S514_int_stat(hw,&int_status); | ||
| 2217 | S514_intack(hw,int_status); | ||
| 2218 | if (i == MAX_S514_CARDS){ | ||
| 2219 | printk(KERN_INFO "%s: Critical Error !!!\n",modname); | ||
| 2220 | printk(KERN_INFO | ||
| 2221 | "%s: Number of Sangoma PCI cards exceeded maximum limit.\n", | ||
| 2222 | modname); | ||
| 2223 | printk(KERN_INFO "Please contact Sangoma Technologies\n"); | ||
| 2224 | return 1; | ||
| 2225 | } | ||
| 2226 | pci_slot_ar[i] = hw->S514_slot_no; | ||
| 2227 | } | ||
| 2228 | return 0; | ||
| 2229 | } | ||
| 2230 | |||
| 2231 | static int pci_probe(sdlahw_t *hw) | ||
| 2232 | { | ||
| 2233 | |||
| 2234 | unsigned char slot_no; | ||
| 2235 | int number_S514_cards = 0; | ||
| 2236 | u16 PCI_subsys_vendor; | ||
| 2237 | u16 PCI_card_type; | ||
| 2238 | |||
| 2239 | struct pci_dev *pci_dev = NULL; | ||
| 2240 | struct pci_bus *bus = NULL; | ||
| 2241 | |||
| 2242 | slot_no = 0; | ||
| 2243 | |||
| 2244 | while ((pci_dev = pci_find_device(V3_VENDOR_ID, V3_DEVICE_ID, pci_dev)) | ||
| 2245 | != NULL) { | ||
| 2246 | |||
| 2247 | pci_read_config_word(pci_dev, PCI_SUBSYS_VENDOR_WORD, | ||
| 2248 | &PCI_subsys_vendor); | ||
| 2249 | |||
| 2250 | if(PCI_subsys_vendor != SANGOMA_SUBSYS_VENDOR) | ||
| 2251 | continue; | ||
| 2252 | |||
| 2253 | pci_read_config_word(pci_dev, PCI_CARD_TYPE, | ||
| 2254 | &PCI_card_type); | ||
| 2255 | |||
| 2256 | bus = pci_dev->bus; | ||
| 2257 | |||
| 2258 | /* A dual cpu card can support up to 4 physical connections, | ||
| 2259 | * where a single cpu card can support up to 2 physical | ||
| 2260 | * connections. The FT1 card can only support a single | ||
| 2261 | * connection, however we cannot distinguish between a Single | ||
| 2262 | * CPU card and an FT1 card. */ | ||
| 2263 | if (PCI_card_type == S514_DUAL_CPU){ | ||
| 2264 | number_S514_cards += 4; | ||
| 2265 | printk(KERN_INFO | ||
| 2266 | "wanpipe: S514-PCI card found, cpu(s) 2, bus #%d, slot #%d, irq #%d\n", | ||
| 2267 | bus->number,((pci_dev->devfn >> 3) & PCI_DEV_SLOT_MASK), | ||
| 2268 | pci_dev->irq); | ||
| 2269 | }else{ | ||
| 2270 | number_S514_cards += 2; | ||
| 2271 | printk(KERN_INFO | ||
| 2272 | "wanpipe: S514-PCI card found, cpu(s) 1, bus #%d, slot #%d, irq #%d\n", | ||
| 2273 | bus->number,((pci_dev->devfn >> 3) & PCI_DEV_SLOT_MASK), | ||
| 2274 | pci_dev->irq); | ||
| 2275 | } | ||
| 2276 | } | ||
| 2277 | |||
| 2278 | return number_S514_cards; | ||
| 2279 | |||
| 2280 | } | ||
| 2281 | |||
| 2282 | |||
| 2283 | |||
| 2284 | EXPORT_SYMBOL(wanpipe_hw_probe); | ||
| 2285 | |||
| 2286 | unsigned wanpipe_hw_probe(void) | ||
| 2287 | { | ||
| 2288 | sdlahw_t hw; | ||
| 2289 | unsigned* opt = s508_port_options; | ||
| 2290 | unsigned cardno=0; | ||
| 2291 | int i; | ||
| 2292 | |||
| 2293 | memset(&hw, 0, sizeof(hw)); | ||
| 2294 | |||
| 2295 | for (i = 1; i <= opt[0]; i++) { | ||
| 2296 | if (detect_s508(opt[i])){ | ||
| 2297 | /* S508 card can support up to two physical links */ | ||
| 2298 | cardno+=2; | ||
| 2299 | printk(KERN_INFO "wanpipe: S508-ISA card found, port 0x%x\n",opt[i]); | ||
| 2300 | } | ||
| 2301 | } | ||
| 2302 | |||
| 2303 | #ifdef CONFIG_PCI | ||
| 2304 | hw.S514_slot_no = 0; | ||
| 2305 | cardno += pci_probe(&hw); | ||
| 2306 | #else | ||
| 2307 | printk(KERN_INFO "wanpipe: Warning, Kernel not compiled for PCI support!\n"); | ||
| 2308 | printk(KERN_INFO "wanpipe: PCI Hardware Probe Failed!\n"); | ||
| 2309 | #endif | ||
| 2310 | |||
| 2311 | return cardno; | ||
| 2312 | } | ||
| 2313 | |||
| 2314 | /****** End *****************************************************************/ | ||
diff --git a/drivers/net/wan/sdlamain.c b/drivers/net/wan/sdlamain.c deleted file mode 100644 index 7a8b22a7ea31..000000000000 --- a/drivers/net/wan/sdlamain.c +++ /dev/null | |||
| @@ -1,1346 +0,0 @@ | |||
| 1 | /**************************************************************************** | ||
| 2 | * sdlamain.c WANPIPE(tm) Multiprotocol WAN Link Driver. Main module. | ||
| 3 | * | ||
| 4 | * Author: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * Gideon Hack | ||
| 6 | * | ||
| 7 | * Copyright: (c) 1995-2000 Sangoma Technologies Inc. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or | ||
| 10 | * modify it under the terms of the GNU General Public License | ||
| 11 | * as published by the Free Software Foundation; either version | ||
| 12 | * 2 of the License, or (at your option) any later version. | ||
| 13 | * ============================================================================ | ||
| 14 | * Dec 22, 2000 Nenad Corbic Updated for 2.4.X kernels. | ||
| 15 | * Removed the polling routine. | ||
| 16 | * Nov 13, 2000 Nenad Corbic Added hw probing on module load and dynamic | ||
| 17 | * device allocation. | ||
| 18 | * Nov 7, 2000 Nenad Corbic Fixed the Multi-Port PPP for kernels | ||
| 19 | * 2.2.16 and above. | ||
| 20 | * Aug 2, 2000 Nenad Corbic Block the Multi-Port PPP from running on | ||
| 21 | * kernels 2.2.16 or greater. The SyncPPP | ||
| 22 | * has changed. | ||
| 23 | * Jul 25, 2000 Nenad Corbic Updated the Piggiback support for MultPPPP. | ||
| 24 | * Jul 13, 2000 Nenad Corbic Added Multi-PPP support. | ||
| 25 | * Feb 02, 2000 Nenad Corbic Fixed up piggyback probing and selection. | ||
| 26 | * Sep 23, 1999 Nenad Corbic Added support for SMP | ||
| 27 | * Sep 13, 1999 Nenad Corbic Each port is treated as a separate device. | ||
| 28 | * Jun 02, 1999 Gideon Hack Added support for the S514 adapter. | ||
| 29 | * Updates for Linux 2.2.X kernels. | ||
| 30 | * Sep 17, 1998 Jaspreet Singh Updated for 2.1.121+ kernel | ||
| 31 | * Nov 28, 1997 Jaspreet Singh Changed DRV_RELEASE to 1 | ||
| 32 | * Nov 10, 1997 Jaspreet Singh Changed sti() to restore_flags(); | ||
| 33 | * Nov 06, 1997 Jaspreet Singh Changed DRV_VERSION to 4 and DRV_RELEASE to 0 | ||
| 34 | * Oct 20, 1997 Jaspreet Singh Modified sdla_isr routine so that card->in_isr | ||
| 35 | * assignments are taken out and placed in the | ||
| 36 | * sdla_ppp.c, sdla_fr.c and sdla_x25.c isr | ||
| 37 | * routines. Took out 'wandev->tx_int_enabled' and | ||
| 38 | * replaced it with 'wandev->enable_tx_int'. | ||
| 39 | * May 29, 1997 Jaspreet Singh Flow Control Problem | ||
| 40 | * added "wandev->tx_int_enabled=1" line in the | ||
| 41 | * init module. This line initializes the flag for | ||
| 42 | * preventing Interrupt disabled with device set to | ||
| 43 | * busy | ||
| 44 | * Jan 15, 1997 Gene Kozin Version 3.1.0 | ||
| 45 | * o added UDP management stuff | ||
| 46 | * Jan 02, 1997 Gene Kozin Initial version. | ||
| 47 | *****************************************************************************/ | ||
| 48 | |||
| 49 | #include <linux/config.h> /* OS configuration options */ | ||
| 50 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 51 | #include <linux/errno.h> /* return codes */ | ||
| 52 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 53 | #include <linux/init.h> | ||
| 54 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 55 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 56 | #include <linux/module.h> /* support for loadable modules */ | ||
| 57 | #include <linux/ioport.h> /* request_region(), release_region() */ | ||
| 58 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 59 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 60 | #include <linux/rcupdate.h> | ||
| 61 | |||
| 62 | #include <linux/in.h> | ||
| 63 | #include <asm/io.h> /* phys_to_virt() */ | ||
| 64 | #include <linux/pci.h> | ||
| 65 | #include <linux/sdlapci.h> | ||
| 66 | #include <linux/if_wanpipe_common.h> | ||
| 67 | |||
| 68 | #include <asm/uaccess.h> /* kernel <-> user copy */ | ||
| 69 | #include <linux/inetdevice.h> | ||
| 70 | |||
| 71 | #include <linux/ip.h> | ||
| 72 | #include <net/route.h> | ||
| 73 | |||
| 74 | #define KMEM_SAFETYZONE 8 | ||
| 75 | |||
| 76 | |||
| 77 | #ifndef CONFIG_WANPIPE_FR | ||
| 78 | #define wpf_init(a,b) (-EPROTONOSUPPORT) | ||
| 79 | #endif | ||
| 80 | |||
| 81 | #ifndef CONFIG_WANPIPE_CHDLC | ||
| 82 | #define wpc_init(a,b) (-EPROTONOSUPPORT) | ||
| 83 | #endif | ||
| 84 | |||
| 85 | #ifndef CONFIG_WANPIPE_X25 | ||
| 86 | #define wpx_init(a,b) (-EPROTONOSUPPORT) | ||
| 87 | #endif | ||
| 88 | |||
| 89 | #ifndef CONFIG_WANPIPE_PPP | ||
| 90 | #define wpp_init(a,b) (-EPROTONOSUPPORT) | ||
| 91 | #endif | ||
| 92 | |||
| 93 | #ifndef CONFIG_WANPIPE_MULTPPP | ||
| 94 | #define wsppp_init(a,b) (-EPROTONOSUPPORT) | ||
| 95 | #endif | ||
| 96 | |||
| 97 | |||
| 98 | /***********FOR DEBUGGING PURPOSES********************************************* | ||
| 99 | static void * dbg_kmalloc(unsigned int size, int prio, int line) { | ||
| 100 | int i = 0; | ||
| 101 | void * v = kmalloc(size+sizeof(unsigned int)+2*KMEM_SAFETYZONE*8,prio); | ||
| 102 | char * c1 = v; | ||
| 103 | c1 += sizeof(unsigned int); | ||
| 104 | *((unsigned int *)v) = size; | ||
| 105 | |||
| 106 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 107 | c1[0] = 'D'; c1[1] = 'E'; c1[2] = 'A'; c1[3] = 'D'; | ||
| 108 | c1[4] = 'B'; c1[5] = 'E'; c1[6] = 'E'; c1[7] = 'F'; | ||
| 109 | c1 += 8; | ||
| 110 | } | ||
| 111 | c1 += size; | ||
| 112 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 113 | c1[0] = 'M'; c1[1] = 'U'; c1[2] = 'N'; c1[3] = 'G'; | ||
| 114 | c1[4] = 'W'; c1[5] = 'A'; c1[6] = 'L'; c1[7] = 'L'; | ||
| 115 | c1 += 8; | ||
| 116 | } | ||
| 117 | v = ((char *)v) + sizeof(unsigned int) + KMEM_SAFETYZONE*8; | ||
| 118 | printk(KERN_INFO "line %d kmalloc(%d,%d) = %p\n",line,size,prio,v); | ||
| 119 | return v; | ||
| 120 | } | ||
| 121 | static void dbg_kfree(void * v, int line) { | ||
| 122 | unsigned int * sp = (unsigned int *)(((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8)); | ||
| 123 | unsigned int size = *sp; | ||
| 124 | char * c1 = ((char *)v) - KMEM_SAFETYZONE*8; | ||
| 125 | int i = 0; | ||
| 126 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 127 | if ( c1[0] != 'D' || c1[1] != 'E' || c1[2] != 'A' || c1[3] != 'D' | ||
| 128 | || c1[4] != 'B' || c1[5] != 'E' || c1[6] != 'E' || c1[7] != 'F') { | ||
| 129 | printk(KERN_INFO "kmalloced block at %p has been corrupted (underrun)!\n",v); | ||
| 130 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
| 131 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
| 132 | } | ||
| 133 | c1 += 8; | ||
| 134 | } | ||
| 135 | c1 += size; | ||
| 136 | for (i = 0; i < KMEM_SAFETYZONE; i++) { | ||
| 137 | if ( c1[0] != 'M' || c1[1] != 'U' || c1[2] != 'N' || c1[3] != 'G' | ||
| 138 | || c1[4] != 'W' || c1[5] != 'A' || c1[6] != 'L' || c1[7] != 'L' | ||
| 139 | ) { | ||
| 140 | printk(KERN_INFO "kmalloced block at %p has been corrupted (overrun):\n",v); | ||
| 141 | printk(KERN_INFO " %4x: %2x %2x %2x %2x %2x %2x %2x %2x\n", i*8, | ||
| 142 | c1[0],c1[1],c1[2],c1[3],c1[4],c1[5],c1[6],c1[7] ); | ||
| 143 | } | ||
| 144 | c1 += 8; | ||
| 145 | } | ||
| 146 | printk(KERN_INFO "line %d kfree(%p)\n",line,v); | ||
| 147 | v = ((char *)v) - (sizeof(unsigned int) + KMEM_SAFETYZONE*8); | ||
| 148 | kfree(v); | ||
| 149 | } | ||
| 150 | |||
| 151 | #define kmalloc(x,y) dbg_kmalloc(x,y,__LINE__) | ||
| 152 | #define kfree(x) dbg_kfree(x,__LINE__) | ||
| 153 | ******************************************************************************/ | ||
| 154 | |||
| 155 | |||
| 156 | |||
| 157 | /****** Defines & Macros ****************************************************/ | ||
| 158 | |||
| 159 | #ifdef _DEBUG_ | ||
| 160 | #define STATIC | ||
| 161 | #else | ||
| 162 | #define STATIC static | ||
| 163 | #endif | ||
| 164 | |||
| 165 | #define DRV_VERSION 5 /* version number */ | ||
| 166 | #define DRV_RELEASE 0 /* release (minor version) number */ | ||
| 167 | #define MAX_CARDS 16 /* max number of adapters */ | ||
| 168 | |||
| 169 | #ifndef CONFIG_WANPIPE_CARDS /* configurable option */ | ||
| 170 | #define CONFIG_WANPIPE_CARDS 1 | ||
| 171 | #endif | ||
| 172 | |||
| 173 | #define CMD_OK 0 /* normal firmware return code */ | ||
| 174 | #define CMD_TIMEOUT 0xFF /* firmware command timed out */ | ||
| 175 | #define MAX_CMD_RETRY 10 /* max number of firmware retries */ | ||
| 176 | /****** Function Prototypes *************************************************/ | ||
| 177 | |||
| 178 | extern void disable_irq(unsigned int); | ||
| 179 | extern void enable_irq(unsigned int); | ||
| 180 | |||
| 181 | /* WAN link driver entry points */ | ||
| 182 | static int setup(struct wan_device* wandev, wandev_conf_t* conf); | ||
| 183 | static int shutdown(struct wan_device* wandev); | ||
| 184 | static int ioctl(struct wan_device* wandev, unsigned cmd, unsigned long arg); | ||
| 185 | |||
| 186 | /* IOCTL handlers */ | ||
| 187 | static int ioctl_dump (sdla_t* card, sdla_dump_t* u_dump); | ||
| 188 | static int ioctl_exec (sdla_t* card, sdla_exec_t* u_exec, int); | ||
| 189 | |||
| 190 | /* Miscellaneous functions */ | ||
| 191 | STATIC irqreturn_t sdla_isr (int irq, void* dev_id, struct pt_regs *regs); | ||
| 192 | static void release_hw (sdla_t *card); | ||
| 193 | |||
| 194 | static int check_s508_conflicts (sdla_t* card,wandev_conf_t* conf, int*); | ||
| 195 | static int check_s514_conflicts (sdla_t* card,wandev_conf_t* conf, int*); | ||
| 196 | |||
| 197 | |||
| 198 | /****** Global Data ********************************************************** | ||
| 199 | * Note: All data must be explicitly initialized!!! | ||
| 200 | */ | ||
| 201 | |||
| 202 | /* private data */ | ||
| 203 | static char drvname[] = "wanpipe"; | ||
| 204 | static char fullname[] = "WANPIPE(tm) Multiprotocol Driver"; | ||
| 205 | static char copyright[] = "(c) 1995-2000 Sangoma Technologies Inc."; | ||
| 206 | static int ncards; | ||
| 207 | static sdla_t* card_array; /* adapter data space */ | ||
| 208 | |||
| 209 | /* Wanpipe's own workqueue, used for all API's. | ||
| 210 | * All protocol specific tasks will be inserted | ||
| 211 | * into the "wanpipe_wq" workqueue. | ||
| 212 | |||
| 213 | * The kernel workqueue mechanism will execute | ||
| 214 | * all pending tasks in the "wanpipe_wq" workqueue. | ||
| 215 | */ | ||
| 216 | |||
| 217 | struct workqueue_struct *wanpipe_wq; | ||
| 218 | DECLARE_WORK(wanpipe_work, NULL, NULL); | ||
| 219 | |||
| 220 | static int wanpipe_bh_critical; | ||
| 221 | |||
| 222 | /******* Kernel Loadable Module Entry Points ********************************/ | ||
| 223 | |||
| 224 | /*============================================================================ | ||
| 225 | * Module 'insert' entry point. | ||
| 226 | * o print announcement | ||
| 227 | * o allocate adapter data space | ||
| 228 | * o initialize static data | ||
| 229 | * o register all cards with WAN router | ||
| 230 | * o calibrate SDLA shared memory access delay. | ||
| 231 | * | ||
| 232 | * Return: 0 Ok | ||
| 233 | * < 0 error. | ||
| 234 | * Context: process | ||
| 235 | */ | ||
| 236 | |||
| 237 | static int __init wanpipe_init(void) | ||
| 238 | { | ||
| 239 | int cnt, err = 0; | ||
| 240 | |||
| 241 | printk(KERN_INFO "%s v%u.%u %s\n", | ||
| 242 | fullname, DRV_VERSION, DRV_RELEASE, copyright); | ||
| 243 | |||
| 244 | wanpipe_wq = create_workqueue("wanpipe_wq"); | ||
| 245 | if (!wanpipe_wq) | ||
| 246 | return -ENOMEM; | ||
| 247 | |||
| 248 | /* Probe for wanpipe cards and return the number found */ | ||
| 249 | printk(KERN_INFO "wanpipe: Probing for WANPIPE hardware.\n"); | ||
| 250 | ncards = wanpipe_hw_probe(); | ||
| 251 | if (ncards){ | ||
| 252 | printk(KERN_INFO "wanpipe: Allocating maximum %i devices: wanpipe%i - wanpipe%i.\n",ncards,1,ncards); | ||
| 253 | }else{ | ||
| 254 | printk(KERN_INFO "wanpipe: No S514/S508 cards found, unloading modules!\n"); | ||
| 255 | destroy_workqueue(wanpipe_wq); | ||
| 256 | return -ENODEV; | ||
| 257 | } | ||
| 258 | |||
| 259 | /* Verify number of cards and allocate adapter data space */ | ||
| 260 | card_array = kmalloc(sizeof(sdla_t) * ncards, GFP_KERNEL); | ||
| 261 | if (card_array == NULL) { | ||
| 262 | destroy_workqueue(wanpipe_wq); | ||
| 263 | return -ENOMEM; | ||
| 264 | } | ||
| 265 | |||
| 266 | memset(card_array, 0, sizeof(sdla_t) * ncards); | ||
| 267 | |||
| 268 | /* Register adapters with WAN router */ | ||
| 269 | for (cnt = 0; cnt < ncards; ++ cnt) { | ||
| 270 | sdla_t* card = &card_array[cnt]; | ||
| 271 | struct wan_device* wandev = &card->wandev; | ||
| 272 | |||
| 273 | card->next = NULL; | ||
| 274 | sprintf(card->devname, "%s%d", drvname, cnt + 1); | ||
| 275 | wandev->magic = ROUTER_MAGIC; | ||
| 276 | wandev->name = card->devname; | ||
| 277 | wandev->private = card; | ||
| 278 | wandev->enable_tx_int = 0; | ||
| 279 | wandev->setup = &setup; | ||
| 280 | wandev->shutdown = &shutdown; | ||
| 281 | wandev->ioctl = &ioctl; | ||
| 282 | err = register_wan_device(wandev); | ||
| 283 | if (err) { | ||
| 284 | printk(KERN_INFO | ||
| 285 | "%s: %s registration failed with error %d!\n", | ||
| 286 | drvname, card->devname, err); | ||
| 287 | break; | ||
| 288 | } | ||
| 289 | } | ||
| 290 | if (cnt){ | ||
| 291 | ncards = cnt; /* adjust actual number of cards */ | ||
| 292 | }else { | ||
| 293 | kfree(card_array); | ||
| 294 | destroy_workqueue(wanpipe_wq); | ||
| 295 | printk(KERN_INFO "IN Init Module: NO Cards registered\n"); | ||
| 296 | err = -ENODEV; | ||
| 297 | } | ||
| 298 | |||
| 299 | return err; | ||
| 300 | } | ||
| 301 | |||
| 302 | /*============================================================================ | ||
| 303 | * Module 'remove' entry point. | ||
| 304 | * o unregister all adapters from the WAN router | ||
| 305 | * o release all remaining system resources | ||
| 306 | */ | ||
| 307 | static void __exit wanpipe_cleanup(void) | ||
| 308 | { | ||
| 309 | int i; | ||
| 310 | |||
| 311 | if (!ncards) | ||
| 312 | return; | ||
| 313 | |||
| 314 | for (i = 0; i < ncards; ++i) { | ||
| 315 | sdla_t* card = &card_array[i]; | ||
| 316 | unregister_wan_device(card->devname); | ||
| 317 | } | ||
| 318 | destroy_workqueue(wanpipe_wq); | ||
| 319 | kfree(card_array); | ||
| 320 | |||
| 321 | printk(KERN_INFO "\nwanpipe: WANPIPE Modules Unloaded.\n"); | ||
| 322 | } | ||
| 323 | |||
| 324 | module_init(wanpipe_init); | ||
| 325 | module_exit(wanpipe_cleanup); | ||
| 326 | |||
| 327 | /******* WAN Device Driver Entry Points *************************************/ | ||
| 328 | |||
| 329 | /*============================================================================ | ||
| 330 | * Setup/configure WAN link driver. | ||
| 331 | * o check adapter state | ||
| 332 | * o make sure firmware is present in configuration | ||
| 333 | * o make sure I/O port and IRQ are specified | ||
| 334 | * o make sure I/O region is available | ||
| 335 | * o allocate interrupt vector | ||
| 336 | * o setup SDLA hardware | ||
| 337 | * o call appropriate routine to perform protocol-specific initialization | ||
| 338 | * o mark I/O region as used | ||
| 339 | * o if this is the first active card, then schedule background task | ||
| 340 | * | ||
| 341 | * This function is called when router handles ROUTER_SETUP IOCTL. The | ||
| 342 | * configuration structure is in kernel memory (including extended data, if | ||
| 343 | * any). | ||
| 344 | */ | ||
| 345 | |||
| 346 | static int setup(struct wan_device* wandev, wandev_conf_t* conf) | ||
| 347 | { | ||
| 348 | sdla_t* card; | ||
| 349 | int err = 0; | ||
| 350 | int irq=0; | ||
| 351 | |||
| 352 | /* Sanity checks */ | ||
| 353 | if ((wandev == NULL) || (wandev->private == NULL) || (conf == NULL)){ | ||
| 354 | printk(KERN_INFO | ||
| 355 | "%s: Failed Sdlamain Setup wandev %u, card %u, conf %u !\n", | ||
| 356 | wandev->name, | ||
| 357 | (unsigned int)wandev,(unsigned int)wandev->private, | ||
| 358 | (unsigned int)conf); | ||
| 359 | return -EFAULT; | ||
| 360 | } | ||
| 361 | |||
| 362 | printk(KERN_INFO "%s: Starting WAN Setup\n", wandev->name); | ||
| 363 | |||
| 364 | card = wandev->private; | ||
| 365 | if (wandev->state != WAN_UNCONFIGURED){ | ||
| 366 | printk(KERN_INFO "%s: failed sdlamain setup, busy!\n", | ||
| 367 | wandev->name); | ||
| 368 | return -EBUSY; /* already configured */ | ||
| 369 | } | ||
| 370 | |||
| 371 | printk(KERN_INFO "\nProcessing WAN device %s...\n", wandev->name); | ||
| 372 | |||
| 373 | /* Initialize the counters for each wandev | ||
| 374 | * Used for counting number of times new_if and | ||
| 375 | * del_if get called. | ||
| 376 | */ | ||
| 377 | wandev->del_if_cnt = 0; | ||
| 378 | wandev->new_if_cnt = 0; | ||
| 379 | wandev->config_id = conf->config_id; | ||
| 380 | |||
| 381 | if (!conf->data_size || (conf->data == NULL)) { | ||
| 382 | printk(KERN_INFO | ||
| 383 | "%s: firmware not found in configuration data!\n", | ||
| 384 | wandev->name); | ||
| 385 | return -EINVAL; | ||
| 386 | } | ||
| 387 | |||
| 388 | /* Check for resource conflicts and setup the | ||
| 389 | * card for piggibacking if necessary */ | ||
| 390 | if(!conf->S514_CPU_no[0]) { | ||
| 391 | if ((err=check_s508_conflicts(card,conf,&irq)) != 0){ | ||
| 392 | return err; | ||
| 393 | } | ||
| 394 | }else { | ||
| 395 | if ((err=check_s514_conflicts(card,conf,&irq)) != 0){ | ||
| 396 | return err; | ||
| 397 | } | ||
| 398 | } | ||
| 399 | |||
| 400 | /* If the current card has already been configured | ||
| 401 | * or it's a piggyback card, do not try to allocate | ||
| 402 | * resources. | ||
| 403 | */ | ||
| 404 | if (!card->wandev.piggyback && !card->configured){ | ||
| 405 | |||
| 406 | /* Configure hardware, load firmware, etc. */ | ||
| 407 | memset(&card->hw, 0, sizeof(sdlahw_t)); | ||
| 408 | |||
| 409 | /* for an S514 adapter, pass the CPU number and the slot number read */ | ||
| 410 | /* from 'router.conf' to the 'sdla_setup()' function via the 'port' */ | ||
| 411 | /* parameter */ | ||
| 412 | if (conf->S514_CPU_no[0]){ | ||
| 413 | |||
| 414 | card->hw.S514_cpu_no[0] = conf->S514_CPU_no[0]; | ||
| 415 | card->hw.S514_slot_no = conf->PCI_slot_no; | ||
| 416 | card->hw.auto_pci_cfg = conf->auto_pci_cfg; | ||
| 417 | |||
| 418 | if (card->hw.auto_pci_cfg == WANOPT_YES){ | ||
| 419 | printk(KERN_INFO "%s: Setting CPU to %c and Slot to Auto\n", | ||
| 420 | card->devname, card->hw.S514_cpu_no[0]); | ||
| 421 | }else{ | ||
| 422 | printk(KERN_INFO "%s: Setting CPU to %c and Slot to %i\n", | ||
| 423 | card->devname, card->hw.S514_cpu_no[0], card->hw.S514_slot_no); | ||
| 424 | } | ||
| 425 | |||
| 426 | }else{ | ||
| 427 | /* 508 Card io port and irq initialization */ | ||
| 428 | card->hw.port = conf->ioport; | ||
| 429 | card->hw.irq = (conf->irq == 9) ? 2 : conf->irq; | ||
| 430 | } | ||
| 431 | |||
| 432 | |||
| 433 | /* Compute the virtual address of the card in kernel space */ | ||
| 434 | if(conf->maddr){ | ||
| 435 | card->hw.dpmbase = phys_to_virt(conf->maddr); | ||
| 436 | }else{ | ||
| 437 | card->hw.dpmbase = (void *)conf->maddr; | ||
| 438 | } | ||
| 439 | |||
| 440 | card->hw.dpmsize = SDLA_WINDOWSIZE; | ||
| 441 | |||
| 442 | /* set the adapter type if using an S514 adapter */ | ||
| 443 | card->hw.type = (conf->S514_CPU_no[0]) ? SDLA_S514 : conf->hw_opt[0]; | ||
| 444 | card->hw.pclk = conf->hw_opt[1]; | ||
| 445 | |||
| 446 | err = sdla_setup(&card->hw, conf->data, conf->data_size); | ||
| 447 | if (err){ | ||
| 448 | printk(KERN_INFO "%s: Hardware setup Failed %i\n", | ||
| 449 | card->devname,err); | ||
| 450 | return err; | ||
| 451 | } | ||
| 452 | |||
| 453 | if(card->hw.type != SDLA_S514) | ||
| 454 | irq = (conf->irq == 2) ? 9 : conf->irq; /* IRQ2 -> IRQ9 */ | ||
| 455 | else | ||
| 456 | irq = card->hw.irq; | ||
| 457 | |||
| 458 | /* request an interrupt vector - note that interrupts may be shared */ | ||
| 459 | /* when using the S514 PCI adapter */ | ||
| 460 | |||
| 461 | if(request_irq(irq, sdla_isr, | ||
| 462 | (card->hw.type == SDLA_S514) ? SA_SHIRQ : 0, | ||
| 463 | wandev->name, card)){ | ||
| 464 | |||
| 465 | printk(KERN_INFO "%s: Can't reserve IRQ %d!\n", wandev->name, irq); | ||
| 466 | return -EINVAL; | ||
| 467 | } | ||
| 468 | |||
| 469 | }else{ | ||
| 470 | printk(KERN_INFO "%s: Card Configured %lu or Piggybacking %i!\n", | ||
| 471 | wandev->name,card->configured,card->wandev.piggyback); | ||
| 472 | } | ||
| 473 | |||
| 474 | |||
| 475 | if (!card->configured){ | ||
| 476 | |||
| 477 | /* Initialize the Spin lock */ | ||
| 478 | printk(KERN_INFO "%s: Initializing for SMP\n",wandev->name); | ||
| 479 | |||
| 480 | /* Piggyback spin lock has already been initialized, | ||
| 481 | * in check_s514/s508_conflicts() */ | ||
| 482 | if (!card->wandev.piggyback){ | ||
| 483 | spin_lock_init(&card->wandev.lock); | ||
| 484 | } | ||
| 485 | |||
| 486 | /* Intialize WAN device data space */ | ||
| 487 | wandev->irq = irq; | ||
| 488 | wandev->dma = 0; | ||
| 489 | if(card->hw.type != SDLA_S514){ | ||
| 490 | wandev->ioport = card->hw.port; | ||
| 491 | }else{ | ||
| 492 | wandev->S514_cpu_no[0] = card->hw.S514_cpu_no[0]; | ||
| 493 | wandev->S514_slot_no = card->hw.S514_slot_no; | ||
| 494 | } | ||
| 495 | wandev->maddr = (unsigned long)card->hw.dpmbase; | ||
| 496 | wandev->msize = card->hw.dpmsize; | ||
| 497 | wandev->hw_opt[0] = card->hw.type; | ||
| 498 | wandev->hw_opt[1] = card->hw.pclk; | ||
| 499 | wandev->hw_opt[2] = card->hw.memory; | ||
| 500 | wandev->hw_opt[3] = card->hw.fwid; | ||
| 501 | } | ||
| 502 | |||
| 503 | /* Protocol-specific initialization */ | ||
| 504 | switch (card->hw.fwid) { | ||
| 505 | |||
| 506 | case SFID_X25_502: | ||
| 507 | case SFID_X25_508: | ||
| 508 | printk(KERN_INFO "%s: Starting X.25 Protocol Init.\n", | ||
| 509 | card->devname); | ||
| 510 | err = wpx_init(card, conf); | ||
| 511 | break; | ||
| 512 | case SFID_FR502: | ||
| 513 | case SFID_FR508: | ||
| 514 | printk(KERN_INFO "%s: Starting Frame Relay Protocol Init.\n", | ||
| 515 | card->devname); | ||
| 516 | err = wpf_init(card, conf); | ||
| 517 | break; | ||
| 518 | case SFID_PPP502: | ||
| 519 | case SFID_PPP508: | ||
| 520 | printk(KERN_INFO "%s: Starting PPP Protocol Init.\n", | ||
| 521 | card->devname); | ||
| 522 | err = wpp_init(card, conf); | ||
| 523 | break; | ||
| 524 | |||
| 525 | case SFID_CHDLC508: | ||
| 526 | case SFID_CHDLC514: | ||
| 527 | if (conf->ft1){ | ||
| 528 | printk(KERN_INFO "%s: Starting FT1 CSU/DSU Config Driver.\n", | ||
| 529 | card->devname); | ||
| 530 | err = wpft1_init(card, conf); | ||
| 531 | break; | ||
| 532 | |||
| 533 | }else if (conf->config_id == WANCONFIG_MPPP){ | ||
| 534 | printk(KERN_INFO "%s: Starting Multi-Port PPP Protocol Init.\n", | ||
| 535 | card->devname); | ||
| 536 | err = wsppp_init(card,conf); | ||
| 537 | break; | ||
| 538 | |||
| 539 | }else{ | ||
| 540 | printk(KERN_INFO "%s: Starting CHDLC Protocol Init.\n", | ||
| 541 | card->devname); | ||
| 542 | err = wpc_init(card, conf); | ||
| 543 | break; | ||
| 544 | } | ||
| 545 | default: | ||
| 546 | printk(KERN_INFO "%s: Error, Firmware is not supported %X %X!\n", | ||
| 547 | wandev->name,card->hw.fwid,SFID_CHDLC508); | ||
| 548 | err = -EPROTONOSUPPORT; | ||
| 549 | } | ||
| 550 | |||
| 551 | if (err != 0){ | ||
| 552 | if (err == -EPROTONOSUPPORT){ | ||
| 553 | printk(KERN_INFO | ||
| 554 | "%s: Error, Protocol selected has not been compiled!\n", | ||
| 555 | card->devname); | ||
| 556 | printk(KERN_INFO | ||
| 557 | "%s: Re-configure the kernel and re-build the modules!\n", | ||
| 558 | card->devname); | ||
| 559 | } | ||
| 560 | |||
| 561 | release_hw(card); | ||
| 562 | wandev->state = WAN_UNCONFIGURED; | ||
| 563 | return err; | ||
| 564 | } | ||
| 565 | |||
| 566 | |||
| 567 | /* Reserve I/O region and schedule background task */ | ||
| 568 | if(card->hw.type != SDLA_S514 && !card->wandev.piggyback) | ||
| 569 | if (!request_region(card->hw.port, card->hw.io_range, | ||
| 570 | wandev->name)) { | ||
| 571 | printk(KERN_WARNING "port 0x%04x busy\n", card->hw.port); | ||
| 572 | release_hw(card); | ||
| 573 | wandev->state = WAN_UNCONFIGURED; | ||
| 574 | return -EBUSY; | ||
| 575 | } | ||
| 576 | |||
| 577 | /* Only use the polling routine for the X25 protocol */ | ||
| 578 | |||
| 579 | card->wandev.critical=0; | ||
| 580 | return 0; | ||
| 581 | } | ||
| 582 | |||
| 583 | /*================================================================== | ||
| 584 | * configure_s508_card | ||
| 585 | * | ||
| 586 | * For a S508 adapter, check for a possible configuration error in that | ||
| 587 | * we are loading an adapter in the same IO port as a previously loaded S508 | ||
| 588 | * card. | ||
| 589 | */ | ||
| 590 | |||
| 591 | static int check_s508_conflicts (sdla_t* card,wandev_conf_t* conf, int *irq) | ||
| 592 | { | ||
| 593 | unsigned long smp_flags; | ||
| 594 | int i; | ||
| 595 | |||
| 596 | if (conf->ioport <= 0) { | ||
| 597 | printk(KERN_INFO | ||
| 598 | "%s: can't configure without I/O port address!\n", | ||
| 599 | card->wandev.name); | ||
| 600 | return -EINVAL; | ||
| 601 | } | ||
| 602 | |||
| 603 | if (conf->irq <= 0) { | ||
| 604 | printk(KERN_INFO "%s: can't configure without IRQ!\n", | ||
| 605 | card->wandev.name); | ||
| 606 | return -EINVAL; | ||
| 607 | } | ||
| 608 | |||
| 609 | if (test_bit(0,&card->configured)) | ||
| 610 | return 0; | ||
| 611 | |||
| 612 | |||
| 613 | /* Check for already loaded card with the same IO port and IRQ | ||
| 614 | * If found, copy its hardware configuration and use its | ||
| 615 | * resources (i.e. piggybacking) | ||
| 616 | */ | ||
| 617 | |||
| 618 | for (i = 0; i < ncards; i++) { | ||
| 619 | sdla_t *nxt_card = &card_array[i]; | ||
| 620 | |||
| 621 | /* Skip the current card ptr */ | ||
| 622 | if (nxt_card == card) | ||
| 623 | continue; | ||
| 624 | |||
| 625 | |||
| 626 | /* Find a card that is already configured with the | ||
| 627 | * same IO Port */ | ||
| 628 | if ((nxt_card->hw.type == SDLA_S508) && | ||
| 629 | (nxt_card->hw.port == conf->ioport) && | ||
| 630 | (nxt_card->next == NULL)){ | ||
| 631 | |||
| 632 | /* We found a card the card that has same configuration | ||
| 633 | * as us. This means, that we must setup this card in | ||
| 634 | * piggibacking mode. However, only CHDLC and MPPP protocol | ||
| 635 | * support this setup */ | ||
| 636 | |||
| 637 | if ((conf->config_id == WANCONFIG_CHDLC || | ||
| 638 | conf->config_id == WANCONFIG_MPPP) && | ||
| 639 | (nxt_card->wandev.config_id == WANCONFIG_CHDLC || | ||
| 640 | nxt_card->wandev.config_id == WANCONFIG_MPPP)){ | ||
| 641 | |||
| 642 | *irq = nxt_card->hw.irq; | ||
| 643 | memcpy(&card->hw, &nxt_card->hw, sizeof(sdlahw_t)); | ||
| 644 | |||
| 645 | /* The master could already be running, we must | ||
| 646 | * set this as a critical area */ | ||
| 647 | lock_adapter_irq(&nxt_card->wandev.lock, &smp_flags); | ||
| 648 | |||
| 649 | nxt_card->next = card; | ||
| 650 | card->next = nxt_card; | ||
| 651 | |||
| 652 | card->wandev.piggyback = WANOPT_YES; | ||
| 653 | |||
| 654 | /* We must initialise the piggiback spin lock here | ||
| 655 | * since isr will try to lock card->next if it | ||
| 656 | * exists */ | ||
| 657 | spin_lock_init(&card->wandev.lock); | ||
| 658 | |||
| 659 | unlock_adapter_irq(&nxt_card->wandev.lock, &smp_flags); | ||
| 660 | break; | ||
| 661 | }else{ | ||
| 662 | /* Trying to run piggibacking with a wrong protocol */ | ||
| 663 | printk(KERN_INFO "%s: ERROR: Resource busy, ioport: 0x%x\n" | ||
| 664 | "%s: This protocol doesn't support\n" | ||
| 665 | "%s: multi-port operation!\n", | ||
| 666 | card->devname,nxt_card->hw.port, | ||
| 667 | card->devname,card->devname); | ||
| 668 | return -EEXIST; | ||
| 669 | } | ||
| 670 | } | ||
| 671 | } | ||
| 672 | |||
| 673 | |||
| 674 | /* Make sure I/O port region is available only if we are the | ||
| 675 | * master device. If we are running in piggybacking mode, | ||
| 676 | * we will use the resources of the master card. */ | ||
| 677 | if (!card->wandev.piggyback) { | ||
| 678 | struct resource *rr = | ||
| 679 | request_region(conf->ioport, SDLA_MAXIORANGE, "sdlamain"); | ||
| 680 | release_region(conf->ioport, SDLA_MAXIORANGE); | ||
| 681 | |||
| 682 | if (!rr) { | ||
| 683 | printk(KERN_INFO | ||
| 684 | "%s: I/O region 0x%X - 0x%X is in use!\n", | ||
| 685 | card->wandev.name, conf->ioport, | ||
| 686 | conf->ioport + SDLA_MAXIORANGE - 1); | ||
| 687 | return -EINVAL; | ||
| 688 | } | ||
| 689 | } | ||
| 690 | |||
| 691 | return 0; | ||
| 692 | } | ||
| 693 | |||
| 694 | /*================================================================== | ||
| 695 | * configure_s514_card | ||
| 696 | * | ||
| 697 | * For a S514 adapter, check for a possible configuration error in that | ||
| 698 | * we are loading an adapter in the same slot as a previously loaded S514 | ||
| 699 | * card. | ||
| 700 | */ | ||
| 701 | |||
| 702 | |||
| 703 | static int check_s514_conflicts(sdla_t* card,wandev_conf_t* conf, int *irq) | ||
| 704 | { | ||
| 705 | unsigned long smp_flags; | ||
| 706 | int i; | ||
| 707 | |||
| 708 | if (test_bit(0,&card->configured)) | ||
| 709 | return 0; | ||
| 710 | |||
| 711 | |||
| 712 | /* Check for already loaded card with the same IO port and IRQ | ||
| 713 | * If found, copy its hardware configuration and use its | ||
| 714 | * resources (i.e. piggybacking) | ||
| 715 | */ | ||
| 716 | |||
| 717 | for (i = 0; i < ncards; i ++) { | ||
| 718 | |||
| 719 | sdla_t* nxt_card = &card_array[i]; | ||
| 720 | if(nxt_card == card) | ||
| 721 | continue; | ||
| 722 | |||
| 723 | if((nxt_card->hw.type == SDLA_S514) && | ||
| 724 | (nxt_card->hw.S514_slot_no == conf->PCI_slot_no) && | ||
| 725 | (nxt_card->hw.S514_cpu_no[0] == conf->S514_CPU_no[0])&& | ||
| 726 | (nxt_card->next == NULL)){ | ||
| 727 | |||
| 728 | |||
| 729 | if ((conf->config_id == WANCONFIG_CHDLC || | ||
| 730 | conf->config_id == WANCONFIG_MPPP) && | ||
| 731 | (nxt_card->wandev.config_id == WANCONFIG_CHDLC || | ||
| 732 | nxt_card->wandev.config_id == WANCONFIG_MPPP)){ | ||
| 733 | |||
| 734 | *irq = nxt_card->hw.irq; | ||
| 735 | memcpy(&card->hw, &nxt_card->hw, sizeof(sdlahw_t)); | ||
| 736 | |||
| 737 | /* The master could already be running, we must | ||
| 738 | * set this as a critical area */ | ||
| 739 | lock_adapter_irq(&nxt_card->wandev.lock,&smp_flags); | ||
| 740 | nxt_card->next = card; | ||
| 741 | card->next = nxt_card; | ||
| 742 | |||
| 743 | card->wandev.piggyback = WANOPT_YES; | ||
| 744 | |||
| 745 | /* We must initialise the piggiback spin lock here | ||
| 746 | * since isr will try to lock card->next if it | ||
| 747 | * exists */ | ||
| 748 | spin_lock_init(&card->wandev.lock); | ||
| 749 | |||
| 750 | unlock_adapter_irq(&nxt_card->wandev.lock,&smp_flags); | ||
| 751 | |||
| 752 | }else{ | ||
| 753 | /* Trying to run piggibacking with a wrong protocol */ | ||
| 754 | printk(KERN_INFO "%s: ERROR: Resource busy: CPU %c PCISLOT %i\n" | ||
| 755 | "%s: This protocol doesn't support\n" | ||
| 756 | "%s: multi-port operation!\n", | ||
| 757 | card->devname, | ||
| 758 | conf->S514_CPU_no[0],conf->PCI_slot_no, | ||
| 759 | card->devname,card->devname); | ||
| 760 | return -EEXIST; | ||
| 761 | } | ||
| 762 | } | ||
| 763 | } | ||
| 764 | |||
| 765 | return 0; | ||
| 766 | } | ||
| 767 | |||
| 768 | |||
| 769 | |||
| 770 | /*============================================================================ | ||
| 771 | * Shut down WAN link driver. | ||
| 772 | * o shut down adapter hardware | ||
| 773 | * o release system resources. | ||
| 774 | * | ||
| 775 | * This function is called by the router when device is being unregistered or | ||
| 776 | * when it handles ROUTER_DOWN IOCTL. | ||
| 777 | */ | ||
| 778 | static int shutdown(struct wan_device* wandev) | ||
| 779 | { | ||
| 780 | sdla_t *card; | ||
| 781 | int err=0; | ||
| 782 | |||
| 783 | /* sanity checks */ | ||
| 784 | if ((wandev == NULL) || (wandev->private == NULL)){ | ||
| 785 | return -EFAULT; | ||
| 786 | } | ||
| 787 | |||
| 788 | if (wandev->state == WAN_UNCONFIGURED){ | ||
| 789 | return 0; | ||
| 790 | } | ||
| 791 | |||
| 792 | card = wandev->private; | ||
| 793 | |||
| 794 | if (card->tty_opt){ | ||
| 795 | if (card->tty_open){ | ||
| 796 | printk(KERN_INFO | ||
| 797 | "%s: Shutdown Failed: TTY is still open\n", | ||
| 798 | card->devname); | ||
| 799 | return -EBUSY; | ||
| 800 | } | ||
| 801 | } | ||
| 802 | |||
| 803 | wandev->state = WAN_UNCONFIGURED; | ||
| 804 | |||
| 805 | set_bit(PERI_CRIT,(void*)&wandev->critical); | ||
| 806 | |||
| 807 | /* In case of piggibacking, make sure that | ||
| 808 | * we never try to shutdown both devices at the same | ||
| 809 | * time, because they depend on one another */ | ||
| 810 | |||
| 811 | if (card->disable_comm){ | ||
| 812 | card->disable_comm(card); | ||
| 813 | } | ||
| 814 | |||
| 815 | /* Release Resources */ | ||
| 816 | release_hw(card); | ||
| 817 | |||
| 818 | /* only free the allocated I/O range if not an S514 adapter */ | ||
| 819 | if (wandev->hw_opt[0] != SDLA_S514 && !card->configured){ | ||
| 820 | release_region(card->hw.port, card->hw.io_range); | ||
| 821 | } | ||
| 822 | |||
| 823 | if (!card->configured){ | ||
| 824 | memset(&card->hw, 0, sizeof(sdlahw_t)); | ||
| 825 | if (card->next){ | ||
| 826 | memset(&card->next->hw, 0, sizeof(sdlahw_t)); | ||
| 827 | } | ||
| 828 | } | ||
| 829 | |||
| 830 | |||
| 831 | clear_bit(PERI_CRIT,(void*)&wandev->critical); | ||
| 832 | return err; | ||
| 833 | } | ||
| 834 | |||
| 835 | static void release_hw (sdla_t *card) | ||
| 836 | { | ||
| 837 | sdla_t *nxt_card; | ||
| 838 | |||
| 839 | |||
| 840 | /* Check if next device exists */ | ||
| 841 | if (card->next){ | ||
| 842 | nxt_card = card->next; | ||
| 843 | /* If next device is down then release resources */ | ||
| 844 | if (nxt_card->wandev.state == WAN_UNCONFIGURED){ | ||
| 845 | if (card->wandev.piggyback){ | ||
| 846 | /* If this device is piggyback then use | ||
| 847 | * information of the master device | ||
| 848 | */ | ||
| 849 | printk(KERN_INFO "%s: Piggyback shutting down\n",card->devname); | ||
| 850 | sdla_down(&card->next->hw); | ||
| 851 | free_irq(card->wandev.irq, card->next); | ||
| 852 | card->configured = 0; | ||
| 853 | card->next->configured = 0; | ||
| 854 | card->wandev.piggyback = 0; | ||
| 855 | }else{ | ||
| 856 | /* Master device shutting down */ | ||
| 857 | printk(KERN_INFO "%s: Master shutting down\n",card->devname); | ||
| 858 | sdla_down(&card->hw); | ||
| 859 | free_irq(card->wandev.irq, card); | ||
| 860 | card->configured = 0; | ||
| 861 | card->next->configured = 0; | ||
| 862 | } | ||
| 863 | }else{ | ||
| 864 | printk(KERN_INFO "%s: Device still running %i\n", | ||
| 865 | nxt_card->devname,nxt_card->wandev.state); | ||
| 866 | |||
| 867 | card->configured = 1; | ||
| 868 | } | ||
| 869 | }else{ | ||
| 870 | printk(KERN_INFO "%s: Master shutting down\n",card->devname); | ||
| 871 | sdla_down(&card->hw); | ||
| 872 | free_irq(card->wandev.irq, card); | ||
| 873 | card->configured = 0; | ||
| 874 | } | ||
| 875 | return; | ||
| 876 | } | ||
| 877 | |||
| 878 | |||
| 879 | /*============================================================================ | ||
| 880 | * Driver I/O control. | ||
| 881 | * o verify arguments | ||
| 882 | * o perform requested action | ||
| 883 | * | ||
| 884 | * This function is called when router handles one of the reserved user | ||
| 885 | * IOCTLs. Note that 'arg' stil points to user address space. | ||
| 886 | */ | ||
| 887 | static int ioctl(struct wan_device* wandev, unsigned cmd, unsigned long arg) | ||
| 888 | { | ||
| 889 | sdla_t* card; | ||
| 890 | int err; | ||
| 891 | |||
| 892 | /* sanity checks */ | ||
| 893 | if ((wandev == NULL) || (wandev->private == NULL)) | ||
| 894 | return -EFAULT; | ||
| 895 | if (wandev->state == WAN_UNCONFIGURED) | ||
| 896 | return -ENODEV; | ||
| 897 | |||
| 898 | card = wandev->private; | ||
| 899 | |||
| 900 | if(card->hw.type != SDLA_S514){ | ||
| 901 | disable_irq(card->hw.irq); | ||
| 902 | } | ||
| 903 | |||
| 904 | if (test_bit(SEND_CRIT, (void*)&wandev->critical)) { | ||
| 905 | return -EAGAIN; | ||
| 906 | } | ||
| 907 | |||
| 908 | switch (cmd) { | ||
| 909 | case WANPIPE_DUMP: | ||
| 910 | err = ioctl_dump(wandev->private, (void*)arg); | ||
| 911 | break; | ||
| 912 | |||
| 913 | case WANPIPE_EXEC: | ||
| 914 | err = ioctl_exec(wandev->private, (void*)arg, cmd); | ||
| 915 | break; | ||
| 916 | default: | ||
| 917 | err = -EINVAL; | ||
| 918 | } | ||
| 919 | |||
| 920 | return err; | ||
| 921 | } | ||
| 922 | |||
| 923 | /****** Driver IOCTL Handlers ***********************************************/ | ||
| 924 | |||
| 925 | /*============================================================================ | ||
| 926 | * Dump adapter memory to user buffer. | ||
| 927 | * o verify request structure | ||
| 928 | * o copy request structure to kernel data space | ||
| 929 | * o verify length/offset | ||
| 930 | * o verify user buffer | ||
| 931 | * o copy adapter memory image to user buffer | ||
| 932 | * | ||
| 933 | * Note: when dumping memory, this routine switches curent dual-port memory | ||
| 934 | * vector, so care must be taken to avoid racing conditions. | ||
| 935 | */ | ||
| 936 | static int ioctl_dump (sdla_t* card, sdla_dump_t* u_dump) | ||
| 937 | { | ||
| 938 | sdla_dump_t dump; | ||
| 939 | unsigned winsize; | ||
| 940 | unsigned long oldvec; /* DPM window vector */ | ||
| 941 | unsigned long smp_flags; | ||
| 942 | int err = 0; | ||
| 943 | |||
| 944 | if(copy_from_user((void*)&dump, (void*)u_dump, sizeof(sdla_dump_t))) | ||
| 945 | return -EFAULT; | ||
| 946 | |||
| 947 | if ((dump.magic != WANPIPE_MAGIC) || | ||
| 948 | (dump.offset + dump.length > card->hw.memory)) | ||
| 949 | return -EINVAL; | ||
| 950 | |||
| 951 | winsize = card->hw.dpmsize; | ||
| 952 | |||
| 953 | if(card->hw.type != SDLA_S514) { | ||
| 954 | |||
| 955 | lock_adapter_irq(&card->wandev.lock, &smp_flags); | ||
| 956 | |||
| 957 | oldvec = card->hw.vector; | ||
| 958 | while (dump.length) { | ||
| 959 | /* current offset */ | ||
| 960 | unsigned pos = dump.offset % winsize; | ||
| 961 | /* current vector */ | ||
| 962 | unsigned long vec = dump.offset - pos; | ||
| 963 | unsigned len = (dump.length > (winsize - pos)) ? | ||
| 964 | (winsize - pos) : dump.length; | ||
| 965 | /* relocate window */ | ||
| 966 | if (sdla_mapmem(&card->hw, vec) != 0) { | ||
| 967 | err = -EIO; | ||
| 968 | break; | ||
| 969 | } | ||
| 970 | |||
| 971 | if(copy_to_user((void *)dump.ptr, | ||
| 972 | (u8 *)card->hw.dpmbase + pos, len)){ | ||
| 973 | |||
| 974 | unlock_adapter_irq(&card->wandev.lock, &smp_flags); | ||
| 975 | return -EFAULT; | ||
| 976 | } | ||
| 977 | |||
| 978 | dump.length -= len; | ||
| 979 | dump.offset += len; | ||
| 980 | dump.ptr = (char*)dump.ptr + len; | ||
| 981 | } | ||
| 982 | |||
| 983 | sdla_mapmem(&card->hw, oldvec);/* restore DPM window position */ | ||
| 984 | unlock_adapter_irq(&card->wandev.lock, &smp_flags); | ||
| 985 | |||
| 986 | }else { | ||
| 987 | |||
| 988 | if(copy_to_user((void *)dump.ptr, | ||
| 989 | (u8 *)card->hw.dpmbase + dump.offset, dump.length)){ | ||
| 990 | return -EFAULT; | ||
| 991 | } | ||
| 992 | } | ||
| 993 | |||
| 994 | return err; | ||
| 995 | } | ||
| 996 | |||
| 997 | /*============================================================================ | ||
| 998 | * Execute adapter firmware command. | ||
| 999 | * o verify request structure | ||
| 1000 | * o copy request structure to kernel data space | ||
| 1001 | * o call protocol-specific 'exec' function | ||
| 1002 | */ | ||
| 1003 | static int ioctl_exec (sdla_t* card, sdla_exec_t* u_exec, int cmd) | ||
| 1004 | { | ||
| 1005 | sdla_exec_t exec; | ||
| 1006 | int err=0; | ||
| 1007 | |||
| 1008 | if (card->exec == NULL && cmd == WANPIPE_EXEC){ | ||
| 1009 | return -ENODEV; | ||
| 1010 | } | ||
| 1011 | |||
| 1012 | if(copy_from_user((void*)&exec, (void*)u_exec, sizeof(sdla_exec_t))) | ||
| 1013 | return -EFAULT; | ||
| 1014 | |||
| 1015 | if ((exec.magic != WANPIPE_MAGIC) || (exec.cmd == NULL)) | ||
| 1016 | return -EINVAL; | ||
| 1017 | |||
| 1018 | switch (cmd) { | ||
| 1019 | case WANPIPE_EXEC: | ||
| 1020 | err = card->exec(card, exec.cmd, exec.data); | ||
| 1021 | break; | ||
| 1022 | } | ||
| 1023 | return err; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | /******* Miscellaneous ******************************************************/ | ||
| 1027 | |||
| 1028 | /*============================================================================ | ||
| 1029 | * SDLA Interrupt Service Routine. | ||
| 1030 | * o acknowledge SDLA hardware interrupt. | ||
| 1031 | * o call protocol-specific interrupt service routine, if any. | ||
| 1032 | */ | ||
| 1033 | STATIC irqreturn_t sdla_isr (int irq, void* dev_id, struct pt_regs *regs) | ||
| 1034 | { | ||
| 1035 | #define card ((sdla_t*)dev_id) | ||
| 1036 | |||
| 1037 | if(card->hw.type == SDLA_S514) { /* handle interrrupt on S514 */ | ||
| 1038 | u32 int_status; | ||
| 1039 | unsigned char CPU_no = card->hw.S514_cpu_no[0]; | ||
| 1040 | unsigned char card_found_for_IRQ; | ||
| 1041 | u8 IRQ_count = 0; | ||
| 1042 | |||
| 1043 | for(;;) { | ||
| 1044 | |||
| 1045 | read_S514_int_stat(&card->hw, &int_status); | ||
| 1046 | |||
| 1047 | /* check if the interrupt is for this device */ | ||
| 1048 | if(!((unsigned char)int_status & | ||
| 1049 | (IRQ_CPU_A | IRQ_CPU_B))) | ||
| 1050 | return IRQ_HANDLED; | ||
| 1051 | |||
| 1052 | /* if the IRQ is for both CPUs on the same adapter, */ | ||
| 1053 | /* then alter the interrupt status so as to handle */ | ||
| 1054 | /* one CPU at a time */ | ||
| 1055 | if(((unsigned char)int_status & (IRQ_CPU_A | IRQ_CPU_B)) | ||
| 1056 | == (IRQ_CPU_A | IRQ_CPU_B)) { | ||
| 1057 | int_status &= (CPU_no == S514_CPU_A) ? | ||
| 1058 | ~IRQ_CPU_B : ~IRQ_CPU_A; | ||
| 1059 | } | ||
| 1060 | |||
| 1061 | card_found_for_IRQ = 0; | ||
| 1062 | |||
| 1063 | /* check to see that the CPU number for this device */ | ||
| 1064 | /* corresponds to the interrupt status read */ | ||
| 1065 | switch (CPU_no) { | ||
| 1066 | case S514_CPU_A: | ||
| 1067 | if((unsigned char)int_status & | ||
| 1068 | IRQ_CPU_A) | ||
| 1069 | card_found_for_IRQ = 1; | ||
| 1070 | break; | ||
| 1071 | |||
| 1072 | case S514_CPU_B: | ||
| 1073 | if((unsigned char)int_status & | ||
| 1074 | IRQ_CPU_B) | ||
| 1075 | card_found_for_IRQ = 1; | ||
| 1076 | break; | ||
| 1077 | } | ||
| 1078 | |||
| 1079 | /* exit if the interrupt is for another CPU on the */ | ||
| 1080 | /* same IRQ */ | ||
| 1081 | if(!card_found_for_IRQ) | ||
| 1082 | return IRQ_HANDLED; | ||
| 1083 | |||
| 1084 | if (!card || | ||
| 1085 | (card->wandev.state == WAN_UNCONFIGURED && !card->configured)){ | ||
| 1086 | printk(KERN_INFO | ||
| 1087 | "Received IRQ %d for CPU #%c\n", | ||
| 1088 | irq, CPU_no); | ||
| 1089 | printk(KERN_INFO | ||
| 1090 | "IRQ for unconfigured adapter\n"); | ||
| 1091 | S514_intack(&card->hw, int_status); | ||
| 1092 | return IRQ_HANDLED; | ||
| 1093 | } | ||
| 1094 | |||
| 1095 | if (card->in_isr) { | ||
| 1096 | printk(KERN_INFO | ||
| 1097 | "%s: interrupt re-entrancy on IRQ %d\n", | ||
| 1098 | card->devname, card->wandev.irq); | ||
| 1099 | S514_intack(&card->hw, int_status); | ||
| 1100 | return IRQ_HANDLED; | ||
| 1101 | } | ||
| 1102 | |||
| 1103 | spin_lock(&card->wandev.lock); | ||
| 1104 | if (card->next){ | ||
| 1105 | spin_lock(&card->next->wandev.lock); | ||
| 1106 | } | ||
| 1107 | |||
| 1108 | S514_intack(&card->hw, int_status); | ||
| 1109 | if (card->isr) | ||
| 1110 | card->isr(card); | ||
| 1111 | |||
| 1112 | if (card->next){ | ||
| 1113 | spin_unlock(&card->next->wandev.lock); | ||
| 1114 | } | ||
| 1115 | spin_unlock(&card->wandev.lock); | ||
| 1116 | |||
| 1117 | /* handle a maximum of two interrupts (one for each */ | ||
| 1118 | /* CPU on the adapter) before returning */ | ||
| 1119 | if((++ IRQ_count) == 2) | ||
| 1120 | return IRQ_HANDLED; | ||
| 1121 | } | ||
| 1122 | } | ||
| 1123 | |||
| 1124 | else { /* handle interrupt on S508 adapter */ | ||
| 1125 | |||
| 1126 | if (!card || ((card->wandev.state == WAN_UNCONFIGURED) && !card->configured)) | ||
| 1127 | return IRQ_HANDLED; | ||
| 1128 | |||
| 1129 | if (card->in_isr) { | ||
| 1130 | printk(KERN_INFO | ||
| 1131 | "%s: interrupt re-entrancy on IRQ %d!\n", | ||
| 1132 | card->devname, card->wandev.irq); | ||
| 1133 | return IRQ_HANDLED; | ||
| 1134 | } | ||
| 1135 | |||
| 1136 | spin_lock(&card->wandev.lock); | ||
| 1137 | if (card->next){ | ||
| 1138 | spin_lock(&card->next->wandev.lock); | ||
| 1139 | } | ||
| 1140 | |||
| 1141 | sdla_intack(&card->hw); | ||
| 1142 | if (card->isr) | ||
| 1143 | card->isr(card); | ||
| 1144 | |||
| 1145 | if (card->next){ | ||
| 1146 | spin_unlock(&card->next->wandev.lock); | ||
| 1147 | } | ||
| 1148 | spin_unlock(&card->wandev.lock); | ||
| 1149 | |||
| 1150 | } | ||
| 1151 | return IRQ_HANDLED; | ||
| 1152 | #undef card | ||
| 1153 | } | ||
| 1154 | |||
| 1155 | /*============================================================================ | ||
| 1156 | * This routine is called by the protocol-specific modules when network | ||
| 1157 | * interface is being open. The only reason we need this, is because we | ||
| 1158 | * have to call MOD_INC_USE_COUNT, but cannot include 'module.h' where it's | ||
| 1159 | * defined more than once into the same kernel module. | ||
| 1160 | */ | ||
| 1161 | void wanpipe_open (sdla_t* card) | ||
| 1162 | { | ||
| 1163 | ++card->open_cnt; | ||
| 1164 | } | ||
| 1165 | |||
| 1166 | /*============================================================================ | ||
| 1167 | * This routine is called by the protocol-specific modules when network | ||
| 1168 | * interface is being closed. The only reason we need this, is because we | ||
| 1169 | * have to call MOD_DEC_USE_COUNT, but cannot include 'module.h' where it's | ||
| 1170 | * defined more than once into the same kernel module. | ||
| 1171 | */ | ||
| 1172 | void wanpipe_close (sdla_t* card) | ||
| 1173 | { | ||
| 1174 | --card->open_cnt; | ||
| 1175 | } | ||
| 1176 | |||
| 1177 | /*============================================================================ | ||
| 1178 | * Set WAN device state. | ||
| 1179 | */ | ||
| 1180 | void wanpipe_set_state (sdla_t* card, int state) | ||
| 1181 | { | ||
| 1182 | if (card->wandev.state != state) { | ||
| 1183 | switch (state) { | ||
| 1184 | case WAN_CONNECTED: | ||
| 1185 | printk (KERN_INFO "%s: link connected!\n", | ||
| 1186 | card->devname); | ||
| 1187 | break; | ||
| 1188 | |||
| 1189 | case WAN_CONNECTING: | ||
| 1190 | printk (KERN_INFO "%s: link connecting...\n", | ||
| 1191 | card->devname); | ||
| 1192 | break; | ||
| 1193 | |||
| 1194 | case WAN_DISCONNECTED: | ||
| 1195 | printk (KERN_INFO "%s: link disconnected!\n", | ||
| 1196 | card->devname); | ||
| 1197 | break; | ||
| 1198 | } | ||
| 1199 | card->wandev.state = state; | ||
| 1200 | } | ||
| 1201 | card->state_tick = jiffies; | ||
| 1202 | } | ||
| 1203 | |||
| 1204 | sdla_t * wanpipe_find_card (char *name) | ||
| 1205 | { | ||
| 1206 | int cnt; | ||
| 1207 | for (cnt = 0; cnt < ncards; ++ cnt) { | ||
| 1208 | sdla_t* card = &card_array[cnt]; | ||
| 1209 | if (!strcmp(card->devname,name)) | ||
| 1210 | return card; | ||
| 1211 | } | ||
| 1212 | return NULL; | ||
| 1213 | } | ||
| 1214 | |||
| 1215 | sdla_t * wanpipe_find_card_num (int num) | ||
| 1216 | { | ||
| 1217 | if (num < 1 || num > ncards) | ||
| 1218 | return NULL; | ||
| 1219 | num--; | ||
| 1220 | return &card_array[num]; | ||
| 1221 | } | ||
| 1222 | |||
| 1223 | /* | ||
| 1224 | * @work_pointer: work_struct to be done; | ||
| 1225 | * should already have PREPARE_WORK() or | ||
| 1226 | * INIT_WORK() done on it by caller; | ||
| 1227 | */ | ||
| 1228 | void wanpipe_queue_work (struct work_struct *work_pointer) | ||
| 1229 | { | ||
| 1230 | if (test_and_set_bit(1, (void*)&wanpipe_bh_critical)) | ||
| 1231 | printk(KERN_INFO "CRITICAL IN QUEUING WORK\n"); | ||
| 1232 | |||
| 1233 | queue_work(wanpipe_wq, work_pointer); | ||
| 1234 | clear_bit(1,(void*)&wanpipe_bh_critical); | ||
| 1235 | } | ||
| 1236 | |||
| 1237 | void wakeup_sk_bh(struct net_device *dev) | ||
| 1238 | { | ||
| 1239 | wanpipe_common_t *chan = dev->priv; | ||
| 1240 | |||
| 1241 | if (test_bit(0,&chan->common_critical)) | ||
| 1242 | return; | ||
| 1243 | |||
| 1244 | if (chan->sk && chan->tx_timer){ | ||
| 1245 | chan->tx_timer->expires=jiffies+1; | ||
| 1246 | add_timer(chan->tx_timer); | ||
| 1247 | } | ||
| 1248 | } | ||
| 1249 | |||
| 1250 | int change_dev_flags(struct net_device *dev, unsigned flags) | ||
| 1251 | { | ||
| 1252 | struct ifreq if_info; | ||
| 1253 | mm_segment_t fs = get_fs(); | ||
| 1254 | int err; | ||
| 1255 | |||
| 1256 | memset(&if_info, 0, sizeof(if_info)); | ||
| 1257 | strcpy(if_info.ifr_name, dev->name); | ||
| 1258 | if_info.ifr_flags = flags; | ||
| 1259 | |||
| 1260 | set_fs(get_ds()); /* get user space block */ | ||
| 1261 | err = devinet_ioctl(SIOCSIFFLAGS, &if_info); | ||
| 1262 | set_fs(fs); | ||
| 1263 | |||
| 1264 | return err; | ||
| 1265 | } | ||
| 1266 | |||
| 1267 | unsigned long get_ip_address(struct net_device *dev, int option) | ||
| 1268 | { | ||
| 1269 | |||
| 1270 | struct in_ifaddr *ifaddr; | ||
| 1271 | struct in_device *in_dev; | ||
| 1272 | unsigned long addr = 0; | ||
| 1273 | |||
| 1274 | rcu_read_lock(); | ||
| 1275 | if ((in_dev = __in_dev_get_rcu(dev)) == NULL){ | ||
| 1276 | goto out; | ||
| 1277 | } | ||
| 1278 | |||
| 1279 | if ((ifaddr = in_dev->ifa_list)== NULL ){ | ||
| 1280 | goto out; | ||
| 1281 | } | ||
| 1282 | |||
| 1283 | switch (option){ | ||
| 1284 | |||
| 1285 | case WAN_LOCAL_IP: | ||
| 1286 | addr = ifaddr->ifa_local; | ||
| 1287 | break; | ||
| 1288 | |||
| 1289 | case WAN_POINTOPOINT_IP: | ||
| 1290 | addr = ifaddr->ifa_address; | ||
| 1291 | break; | ||
| 1292 | |||
| 1293 | case WAN_NETMASK_IP: | ||
| 1294 | addr = ifaddr->ifa_mask; | ||
| 1295 | break; | ||
| 1296 | |||
| 1297 | case WAN_BROADCAST_IP: | ||
| 1298 | addr = ifaddr->ifa_broadcast; | ||
| 1299 | break; | ||
| 1300 | default: | ||
| 1301 | break; | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | out: | ||
| 1305 | rcu_read_unlock(); | ||
| 1306 | return addr; | ||
| 1307 | } | ||
| 1308 | |||
| 1309 | void add_gateway(sdla_t *card, struct net_device *dev) | ||
| 1310 | { | ||
| 1311 | mm_segment_t oldfs; | ||
| 1312 | struct rtentry route; | ||
| 1313 | int res; | ||
| 1314 | |||
| 1315 | memset((char*)&route,0,sizeof(struct rtentry)); | ||
| 1316 | |||
| 1317 | ((struct sockaddr_in *) | ||
| 1318 | &(route.rt_dst))->sin_addr.s_addr = 0; | ||
| 1319 | ((struct sockaddr_in *) | ||
| 1320 | &(route.rt_dst))->sin_family = AF_INET; | ||
| 1321 | |||
| 1322 | ((struct sockaddr_in *) | ||
| 1323 | &(route.rt_genmask))->sin_addr.s_addr = 0; | ||
| 1324 | ((struct sockaddr_in *) | ||
| 1325 | &(route.rt_genmask)) ->sin_family = AF_INET; | ||
| 1326 | |||
| 1327 | |||
| 1328 | route.rt_flags = 0; | ||
| 1329 | route.rt_dev = dev->name; | ||
| 1330 | |||
| 1331 | oldfs = get_fs(); | ||
| 1332 | set_fs(get_ds()); | ||
| 1333 | res = ip_rt_ioctl(SIOCADDRT,&route); | ||
| 1334 | set_fs(oldfs); | ||
| 1335 | |||
| 1336 | if (res == 0){ | ||
| 1337 | printk(KERN_INFO "%s: Gateway added for %s\n", | ||
| 1338 | card->devname,dev->name); | ||
| 1339 | } | ||
| 1340 | |||
| 1341 | return; | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | MODULE_LICENSE("GPL"); | ||
| 1345 | |||
| 1346 | /****** End *********************************************************/ | ||
diff --git a/drivers/net/wan/wanpipe_multppp.c b/drivers/net/wan/wanpipe_multppp.c deleted file mode 100644 index 812a1183c502..000000000000 --- a/drivers/net/wan/wanpipe_multppp.c +++ /dev/null | |||
| @@ -1,2358 +0,0 @@ | |||
| 1 | /***************************************************************************** | ||
| 2 | * wanpipe_multppp.c Multi-Port PPP driver module. | ||
| 3 | * | ||
| 4 | * Authors: Nenad Corbic <ncorbic@sangoma.com> | ||
| 5 | * | ||
| 6 | * Copyright: (c) 1995-2001 Sangoma Technologies Inc. | ||
| 7 | * | ||
| 8 | * This program is free software; you can redistribute it and/or | ||
| 9 | * modify it under the terms of the GNU General Public License | ||
| 10 | * as published by the Free Software Foundation; either version | ||
| 11 | * 2 of the License, or (at your option) any later version. | ||
| 12 | * ============================================================================ | ||
| 13 | * Dec 15 2000 Updated for 2.4.X kernel | ||
| 14 | * Nov 15 2000 Fixed the SyncPPP support for kernels 2.2.16 and higher. | ||
| 15 | * The pppstruct has changed. | ||
| 16 | * Jul 13 2000 Using the kernel Syncppp module on top of RAW Wanpipe CHDLC | ||
| 17 | * module. | ||
| 18 | *****************************************************************************/ | ||
| 19 | |||
| 20 | #include <linux/module.h> | ||
| 21 | #include <linux/kernel.h> /* printk(), and other useful stuff */ | ||
| 22 | #include <linux/stddef.h> /* offsetof(), etc. */ | ||
| 23 | #include <linux/errno.h> /* return codes */ | ||
| 24 | #include <linux/string.h> /* inline memset(), etc. */ | ||
| 25 | #include <linux/slab.h> /* kmalloc(), kfree() */ | ||
| 26 | #include <linux/wanrouter.h> /* WAN router definitions */ | ||
| 27 | #include <linux/wanpipe.h> /* WANPIPE common user API definitions */ | ||
| 28 | #include <linux/if_arp.h> /* ARPHRD_* defines */ | ||
| 29 | #include <linux/jiffies.h> /* time_after() macro */ | ||
| 30 | |||
| 31 | #include <linux/in.h> /* sockaddr_in */ | ||
| 32 | #include <linux/inet.h> | ||
| 33 | #include <linux/if.h> | ||
| 34 | #include <asm/byteorder.h> /* htons(), etc. */ | ||
| 35 | #include <linux/sdlapci.h> | ||
| 36 | #include <asm/io.h> | ||
| 37 | |||
| 38 | #include <linux/sdla_chdlc.h> /* CHDLC firmware API definitions */ | ||
| 39 | #include <linux/sdla_asy.h> /* CHDLC (async) API definitions */ | ||
| 40 | |||
| 41 | #include <linux/if_wanpipe_common.h> /* Socket Driver common area */ | ||
| 42 | #include <linux/if_wanpipe.h> | ||
| 43 | |||
| 44 | |||
| 45 | #include <linux/inetdevice.h> | ||
| 46 | #include <asm/uaccess.h> | ||
| 47 | |||
| 48 | #include <net/syncppp.h> | ||
| 49 | |||
| 50 | |||
| 51 | /****** Defines & Macros ****************************************************/ | ||
| 52 | |||
| 53 | #ifdef _DEBUG_ | ||
| 54 | #define STATIC | ||
| 55 | #else | ||
| 56 | #define STATIC static | ||
| 57 | #endif | ||
| 58 | |||
| 59 | /* reasons for enabling the timer interrupt on the adapter */ | ||
| 60 | #define TMR_INT_ENABLED_UDP 0x01 | ||
| 61 | #define TMR_INT_ENABLED_UPDATE 0x02 | ||
| 62 | #define TMR_INT_ENABLED_CONFIG 0x04 | ||
| 63 | |||
| 64 | #define CHDLC_DFLT_DATA_LEN 1500 /* default MTU */ | ||
| 65 | #define CHDLC_HDR_LEN 1 | ||
| 66 | |||
| 67 | #define IFF_POINTTOPOINT 0x10 | ||
| 68 | |||
| 69 | #define CHDLC_API 0x01 | ||
| 70 | |||
| 71 | #define PORT(x) (x == 0 ? "PRIMARY" : "SECONDARY" ) | ||
| 72 | #define MAX_BH_BUFF 10 | ||
| 73 | |||
| 74 | #define CRC_LENGTH 2 | ||
| 75 | #define PPP_HEADER_LEN 4 | ||
| 76 | |||
| 77 | /******Data Structures*****************************************************/ | ||
| 78 | |||
| 79 | /* This structure is placed in the private data area of the device structure. | ||
| 80 | * The card structure used to occupy the private area but now the following | ||
| 81 | * structure will incorporate the card structure along with CHDLC specific data | ||
| 82 | */ | ||
| 83 | |||
| 84 | typedef struct chdlc_private_area | ||
| 85 | { | ||
| 86 | void *if_ptr; /* General Pointer used by SPPP */ | ||
| 87 | wanpipe_common_t common; | ||
| 88 | sdla_t *card; | ||
| 89 | int TracingEnabled; /* For enabling Tracing */ | ||
| 90 | unsigned long curr_trace_addr; /* Used for Tracing */ | ||
| 91 | unsigned long start_trace_addr; | ||
| 92 | unsigned long end_trace_addr; | ||
| 93 | unsigned long base_addr_trace_buffer; | ||
| 94 | unsigned long end_addr_trace_buffer; | ||
| 95 | unsigned short number_trace_elements; | ||
| 96 | unsigned available_buffer_space; | ||
| 97 | unsigned long router_start_time; | ||
| 98 | unsigned char route_status; | ||
| 99 | unsigned char route_removed; | ||
| 100 | unsigned long tick_counter; /* For 5s timeout counter */ | ||
| 101 | unsigned long router_up_time; | ||
| 102 | u32 IP_address; /* IP addressing */ | ||
| 103 | u32 IP_netmask; | ||
| 104 | unsigned char mc; /* Mulitcast support on/off */ | ||
| 105 | unsigned short udp_pkt_lgth; /* udp packet processing */ | ||
| 106 | char udp_pkt_src; | ||
| 107 | char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; | ||
| 108 | unsigned short timer_int_enabled; | ||
| 109 | char update_comms_stats; /* updating comms stats */ | ||
| 110 | |||
| 111 | //FIXME: add driver stats as per frame relay! | ||
| 112 | |||
| 113 | } chdlc_private_area_t; | ||
| 114 | |||
| 115 | /* Route Status options */ | ||
| 116 | #define NO_ROUTE 0x00 | ||
| 117 | #define ADD_ROUTE 0x01 | ||
| 118 | #define ROUTE_ADDED 0x02 | ||
| 119 | #define REMOVE_ROUTE 0x03 | ||
| 120 | |||
| 121 | |||
| 122 | /* variable for keeping track of enabling/disabling FT1 monitor status */ | ||
| 123 | static int rCount = 0; | ||
| 124 | |||
| 125 | /* variable for tracking how many interfaces to open for WANPIPE on the | ||
| 126 | two ports */ | ||
| 127 | |||
| 128 | extern void disable_irq(unsigned int); | ||
| 129 | extern void enable_irq(unsigned int); | ||
| 130 | |||
| 131 | /****** Function Prototypes *************************************************/ | ||
| 132 | /* WAN link driver entry points. These are called by the WAN router module. */ | ||
| 133 | static int update(struct wan_device* wandev); | ||
| 134 | static int new_if(struct wan_device* wandev, struct net_device* dev, | ||
| 135 | wanif_conf_t* conf); | ||
| 136 | static int del_if(struct wan_device* wandev, struct net_device* dev); | ||
| 137 | |||
| 138 | /* Network device interface */ | ||
| 139 | static int if_init(struct net_device* dev); | ||
| 140 | static int if_open(struct net_device* dev); | ||
| 141 | static int if_close(struct net_device* dev); | ||
| 142 | static int if_send(struct sk_buff* skb, struct net_device* dev); | ||
| 143 | static struct net_device_stats* if_stats(struct net_device* dev); | ||
| 144 | |||
| 145 | static void if_tx_timeout(struct net_device *dev); | ||
| 146 | |||
| 147 | /* CHDLC Firmware interface functions */ | ||
| 148 | static int chdlc_configure (sdla_t* card, void* data); | ||
| 149 | static int chdlc_comm_enable (sdla_t* card); | ||
| 150 | static int chdlc_comm_disable (sdla_t* card); | ||
| 151 | static int chdlc_read_version (sdla_t* card, char* str); | ||
| 152 | static int chdlc_set_intr_mode (sdla_t* card, unsigned mode); | ||
| 153 | static int chdlc_send (sdla_t* card, void* data, unsigned len); | ||
| 154 | static int chdlc_read_comm_err_stats (sdla_t* card); | ||
| 155 | static int chdlc_read_op_stats (sdla_t* card); | ||
| 156 | static int config_chdlc (sdla_t *card); | ||
| 157 | |||
| 158 | |||
| 159 | /* Miscellaneous CHDLC Functions */ | ||
| 160 | static int set_chdlc_config (sdla_t* card); | ||
| 161 | static void init_chdlc_tx_rx_buff(sdla_t* card, struct net_device *dev); | ||
| 162 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb); | ||
| 163 | static int process_chdlc_exception(sdla_t *card); | ||
| 164 | static int process_global_exception(sdla_t *card); | ||
| 165 | static int update_comms_stats(sdla_t* card, | ||
| 166 | chdlc_private_area_t* chdlc_priv_area); | ||
| 167 | static void port_set_state (sdla_t *card, int); | ||
| 168 | |||
| 169 | /* Interrupt handlers */ | ||
| 170 | static void wsppp_isr (sdla_t* card); | ||
| 171 | static void rx_intr (sdla_t* card); | ||
| 172 | static void timer_intr(sdla_t *); | ||
| 173 | |||
| 174 | /* Miscellaneous functions */ | ||
| 175 | static int reply_udp( unsigned char *data, unsigned int mbox_len ); | ||
| 176 | static int intr_test( sdla_t* card); | ||
| 177 | static int udp_pkt_type( struct sk_buff *skb , sdla_t* card); | ||
| 178 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 179 | struct sk_buff *skb, struct net_device* dev, | ||
| 180 | chdlc_private_area_t* chdlc_priv_area); | ||
| 181 | static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev, | ||
| 182 | chdlc_private_area_t* chdlc_priv_area); | ||
| 183 | static unsigned short calc_checksum (char *, int); | ||
| 184 | static void s508_lock (sdla_t *card, unsigned long *smp_flags); | ||
| 185 | static void s508_unlock (sdla_t *card, unsigned long *smp_flags); | ||
| 186 | static void send_ppp_term_request(struct net_device *dev); | ||
| 187 | |||
| 188 | |||
| 189 | static int Intr_test_counter; | ||
| 190 | /****** Public Functions ****************************************************/ | ||
| 191 | |||
| 192 | /*============================================================================ | ||
| 193 | * Cisco HDLC protocol initialization routine. | ||
| 194 | * | ||
| 195 | * This routine is called by the main WANPIPE module during setup. At this | ||
| 196 | * point adapter is completely initialized and firmware is running. | ||
| 197 | * o read firmware version (to make sure it's alive) | ||
| 198 | * o configure adapter | ||
| 199 | * o initialize protocol-specific fields of the adapter data space. | ||
| 200 | * | ||
| 201 | * Return: 0 o.k. | ||
| 202 | * < 0 failure. | ||
| 203 | */ | ||
| 204 | int wsppp_init (sdla_t* card, wandev_conf_t* conf) | ||
| 205 | { | ||
| 206 | unsigned char port_num; | ||
| 207 | int err; | ||
| 208 | unsigned long max_permitted_baud = 0; | ||
| 209 | SHARED_MEMORY_INFO_STRUCT *flags; | ||
| 210 | |||
| 211 | union | ||
| 212 | { | ||
| 213 | char str[80]; | ||
| 214 | } u; | ||
| 215 | volatile CHDLC_MAILBOX_STRUCT* mb; | ||
| 216 | CHDLC_MAILBOX_STRUCT* mb1; | ||
| 217 | unsigned long timeout; | ||
| 218 | |||
| 219 | /* Verify configuration ID */ | ||
| 220 | if (conf->config_id != WANCONFIG_MPPP) { | ||
| 221 | printk(KERN_INFO "%s: invalid configuration ID %u!\n", | ||
| 222 | card->devname, conf->config_id); | ||
| 223 | return -EINVAL; | ||
| 224 | } | ||
| 225 | |||
| 226 | /* Find out which Port to use */ | ||
| 227 | if ((conf->comm_port == WANOPT_PRI) || (conf->comm_port == WANOPT_SEC)){ | ||
| 228 | if (card->next){ | ||
| 229 | |||
| 230 | if (conf->comm_port != card->next->u.c.comm_port){ | ||
| 231 | card->u.c.comm_port = conf->comm_port; | ||
| 232 | }else{ | ||
| 233 | printk(KERN_ERR "%s: ERROR - %s port used!\n", | ||
| 234 | card->wandev.name, PORT(conf->comm_port)); | ||
| 235 | return -EINVAL; | ||
| 236 | } | ||
| 237 | }else{ | ||
| 238 | card->u.c.comm_port = conf->comm_port; | ||
| 239 | } | ||
| 240 | }else{ | ||
| 241 | printk(KERN_ERR "%s: ERROR - Invalid Port Selected!\n", | ||
| 242 | card->wandev.name); | ||
| 243 | return -EINVAL; | ||
| 244 | } | ||
| 245 | |||
| 246 | |||
| 247 | /* Initialize protocol-specific fields */ | ||
| 248 | if(card->hw.type != SDLA_S514){ | ||
| 249 | |||
| 250 | if (card->u.c.comm_port == WANOPT_PRI){ | ||
| 251 | card->mbox = (void *) card->hw.dpmbase; | ||
| 252 | }else{ | ||
| 253 | card->mbox = (void *) card->hw.dpmbase + | ||
| 254 | SEC_BASE_ADDR_MB_STRUCT - PRI_BASE_ADDR_MB_STRUCT; | ||
| 255 | } | ||
| 256 | }else{ | ||
| 257 | /* for a S514 adapter, set a pointer to the actual mailbox in the */ | ||
| 258 | /* allocated virtual memory area */ | ||
| 259 | if (card->u.c.comm_port == WANOPT_PRI){ | ||
| 260 | card->mbox = (void *) card->hw.dpmbase + PRI_BASE_ADDR_MB_STRUCT; | ||
| 261 | }else{ | ||
| 262 | card->mbox = (void *) card->hw.dpmbase + SEC_BASE_ADDR_MB_STRUCT; | ||
| 263 | } | ||
| 264 | } | ||
| 265 | |||
| 266 | mb = mb1 = card->mbox; | ||
| 267 | |||
| 268 | if (!card->configured){ | ||
| 269 | |||
| 270 | /* The board will place an 'I' in the return code to indicate that it is | ||
| 271 | ready to accept commands. We expect this to be completed in less | ||
| 272 | than 1 second. */ | ||
| 273 | |||
| 274 | timeout = jiffies + 1 * HZ; | ||
| 275 | while (mb->return_code != 'I') /* Wait 1s for board to initialize */ | ||
| 276 | if (time_after(jiffies, timeout)) break; | ||
| 277 | |||
| 278 | if (mb->return_code != 'I') { | ||
| 279 | printk(KERN_INFO | ||
| 280 | "%s: Initialization not completed by adapter\n", | ||
| 281 | card->devname); | ||
| 282 | printk(KERN_INFO "Please contact Sangoma representative.\n"); | ||
| 283 | return -EIO; | ||
| 284 | } | ||
| 285 | } | ||
| 286 | |||
| 287 | /* Read firmware version. Note that when adapter initializes, it | ||
| 288 | * clears the mailbox, so it may appear that the first command was | ||
| 289 | * executed successfully when in fact it was merely erased. To work | ||
| 290 | * around this, we execute the first command twice. | ||
| 291 | */ | ||
| 292 | |||
| 293 | if (chdlc_read_version(card, u.str)) | ||
| 294 | return -EIO; | ||
| 295 | |||
| 296 | printk(KERN_INFO "%s: Running Raw CHDLC firmware v%s\n" | ||
| 297 | "%s: for Multi-Port PPP protocol.\n", | ||
| 298 | card->devname,u.str,card->devname); | ||
| 299 | |||
| 300 | card->isr = &wsppp_isr; | ||
| 301 | card->poll = NULL; | ||
| 302 | card->exec = NULL; | ||
| 303 | card->wandev.update = &update; | ||
| 304 | card->wandev.new_if = &new_if; | ||
| 305 | card->wandev.del_if = &del_if; | ||
| 306 | card->wandev.udp_port = conf->udp_port; | ||
| 307 | |||
| 308 | card->wandev.new_if_cnt = 0; | ||
| 309 | |||
| 310 | /* reset the number of times the 'update()' proc has been called */ | ||
| 311 | card->u.c.update_call_count = 0; | ||
| 312 | |||
| 313 | card->wandev.ttl = conf->ttl; | ||
| 314 | card->wandev.interface = conf->interface; | ||
| 315 | |||
| 316 | if ((card->u.c.comm_port == WANOPT_SEC && conf->interface == WANOPT_V35)&& | ||
| 317 | card->hw.type != SDLA_S514){ | ||
| 318 | printk(KERN_INFO "%s: ERROR - V35 Interface not supported on S508 %s port \n", | ||
| 319 | card->devname, PORT(card->u.c.comm_port)); | ||
| 320 | return -EIO; | ||
| 321 | } | ||
| 322 | |||
| 323 | |||
| 324 | card->wandev.clocking = conf->clocking; | ||
| 325 | |||
| 326 | port_num = card->u.c.comm_port; | ||
| 327 | |||
| 328 | /* Setup Port Bps */ | ||
| 329 | |||
| 330 | if(card->wandev.clocking) { | ||
| 331 | if((port_num == WANOPT_PRI) || card->u.c.receive_only) { | ||
| 332 | /* For Primary Port 0 */ | ||
| 333 | max_permitted_baud = | ||
| 334 | (card->hw.type == SDLA_S514) ? | ||
| 335 | PRI_MAX_BAUD_RATE_S514 : | ||
| 336 | PRI_MAX_BAUD_RATE_S508; | ||
| 337 | } | ||
| 338 | else if(port_num == WANOPT_SEC) { | ||
| 339 | /* For Secondary Port 1 */ | ||
| 340 | max_permitted_baud = | ||
| 341 | (card->hw.type == SDLA_S514) ? | ||
| 342 | SEC_MAX_BAUD_RATE_S514 : | ||
| 343 | SEC_MAX_BAUD_RATE_S508; | ||
| 344 | } | ||
| 345 | |||
| 346 | if(conf->bps > max_permitted_baud) { | ||
| 347 | conf->bps = max_permitted_baud; | ||
| 348 | printk(KERN_INFO "%s: Baud too high!\n", | ||
| 349 | card->wandev.name); | ||
| 350 | printk(KERN_INFO "%s: Baud rate set to %lu bps\n", | ||
| 351 | card->wandev.name, max_permitted_baud); | ||
| 352 | } | ||
| 353 | |||
| 354 | card->wandev.bps = conf->bps; | ||
| 355 | }else{ | ||
| 356 | card->wandev.bps = 0; | ||
| 357 | } | ||
| 358 | |||
| 359 | /* Setup the Port MTU */ | ||
| 360 | if((port_num == WANOPT_PRI) || card->u.c.receive_only) { | ||
| 361 | |||
| 362 | /* For Primary Port 0 */ | ||
| 363 | card->wandev.mtu = | ||
| 364 | (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ? | ||
| 365 | min_t(unsigned int, conf->mtu, PRI_MAX_NO_DATA_BYTES_IN_FRAME) : | ||
| 366 | CHDLC_DFLT_DATA_LEN; | ||
| 367 | } else if(port_num == WANOPT_SEC) { | ||
| 368 | /* For Secondary Port 1 */ | ||
| 369 | card->wandev.mtu = | ||
| 370 | (conf->mtu >= MIN_LGTH_CHDLC_DATA_CFG) ? | ||
| 371 | min_t(unsigned int, conf->mtu, SEC_MAX_NO_DATA_BYTES_IN_FRAME) : | ||
| 372 | CHDLC_DFLT_DATA_LEN; | ||
| 373 | } | ||
| 374 | |||
| 375 | /* Add on a PPP Header */ | ||
| 376 | card->wandev.mtu += PPP_HEADER_LEN; | ||
| 377 | |||
| 378 | /* Set up the interrupt status area */ | ||
| 379 | /* Read the CHDLC Configuration and obtain: | ||
| 380 | * Ptr to shared memory infor struct | ||
| 381 | * Use this pointer to calculate the value of card->u.c.flags ! | ||
| 382 | */ | ||
| 383 | mb1->buffer_length = 0; | ||
| 384 | mb1->command = READ_CHDLC_CONFIGURATION; | ||
| 385 | err = sdla_exec(mb1) ? mb1->return_code : CMD_TIMEOUT; | ||
| 386 | if(err != COMMAND_OK) { | ||
| 387 | clear_bit(1, (void*)&card->wandev.critical); | ||
| 388 | |||
| 389 | if(card->hw.type != SDLA_S514) | ||
| 390 | enable_irq(card->hw.irq); | ||
| 391 | |||
| 392 | chdlc_error(card, err, mb1); | ||
| 393 | return -EIO; | ||
| 394 | } | ||
| 395 | |||
| 396 | if(card->hw.type == SDLA_S514){ | ||
| 397 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 398 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 399 | ptr_shared_mem_info_struct)); | ||
| 400 | }else{ | ||
| 401 | card->u.c.flags = (void *)(card->hw.dpmbase + | ||
| 402 | (((CHDLC_CONFIGURATION_STRUCT *)mb1->data)-> | ||
| 403 | ptr_shared_mem_info_struct % SDLA_WINDOWSIZE)); | ||
| 404 | } | ||
| 405 | |||
| 406 | flags = card->u.c.flags; | ||
| 407 | |||
| 408 | /* This is for the ports link state */ | ||
| 409 | card->wandev.state = WAN_DUALPORT; | ||
| 410 | card->u.c.state = WAN_DISCONNECTED; | ||
| 411 | |||
| 412 | |||
| 413 | if (!card->wandev.piggyback){ | ||
| 414 | err = intr_test(card); | ||
| 415 | |||
| 416 | if(err || (Intr_test_counter < MAX_INTR_TEST_COUNTER)) { | ||
| 417 | printk(KERN_ERR "%s: Interrupt test failed (%i)\n", | ||
| 418 | card->devname, Intr_test_counter); | ||
| 419 | printk(KERN_ERR "%s: Please choose another interrupt\n", | ||
| 420 | card->devname); | ||
| 421 | return -EIO; | ||
| 422 | } | ||
| 423 | |||
| 424 | printk(KERN_INFO "%s: Interrupt test passed (%i)\n", | ||
| 425 | card->devname, Intr_test_counter); | ||
| 426 | } | ||
| 427 | |||
| 428 | |||
| 429 | if (chdlc_set_intr_mode(card, APP_INT_ON_TIMER)){ | ||
| 430 | printk (KERN_INFO "%s: Failed to set interrupt triggers!\n", | ||
| 431 | card->devname); | ||
| 432 | return -EIO; | ||
| 433 | } | ||
| 434 | |||
| 435 | /* Mask the Timer interrupt */ | ||
| 436 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 437 | ~APP_INT_ON_TIMER; | ||
| 438 | |||
| 439 | printk(KERN_INFO "\n"); | ||
| 440 | |||
| 441 | return 0; | ||
| 442 | } | ||
| 443 | |||
| 444 | /******* WAN Device Driver Entry Points *************************************/ | ||
| 445 | |||
| 446 | /*============================================================================ | ||
| 447 | * Update device status & statistics | ||
| 448 | * This procedure is called when updating the PROC file system and returns | ||
| 449 | * various communications statistics. These statistics are accumulated from 3 | ||
| 450 | * different locations: | ||
| 451 | * 1) The 'if_stats' recorded for the device. | ||
| 452 | * 2) Communication error statistics on the adapter. | ||
| 453 | * 3) CHDLC operational statistics on the adapter. | ||
| 454 | * The board level statistics are read during a timer interrupt. Note that we | ||
| 455 | * read the error and operational statistics during consecitive timer ticks so | ||
| 456 | * as to minimize the time that we are inside the interrupt handler. | ||
| 457 | * | ||
| 458 | */ | ||
| 459 | static int update(struct wan_device* wandev) | ||
| 460 | { | ||
| 461 | sdla_t* card = wandev->private; | ||
| 462 | struct net_device* dev; | ||
| 463 | volatile chdlc_private_area_t* chdlc_priv_area; | ||
| 464 | SHARED_MEMORY_INFO_STRUCT *flags; | ||
| 465 | unsigned long timeout; | ||
| 466 | |||
| 467 | /* sanity checks */ | ||
| 468 | if((wandev == NULL) || (wandev->private == NULL)) | ||
| 469 | return -EFAULT; | ||
| 470 | |||
| 471 | if(wandev->state == WAN_UNCONFIGURED) | ||
| 472 | return -ENODEV; | ||
| 473 | |||
| 474 | /* more sanity checks */ | ||
| 475 | if(!card->u.c.flags) | ||
| 476 | return -ENODEV; | ||
| 477 | |||
| 478 | if((dev=card->wandev.dev) == NULL) | ||
| 479 | return -ENODEV; | ||
| 480 | |||
| 481 | if((chdlc_priv_area=dev->priv) == NULL) | ||
| 482 | return -ENODEV; | ||
| 483 | |||
| 484 | flags = card->u.c.flags; | ||
| 485 | |||
| 486 | if(chdlc_priv_area->update_comms_stats){ | ||
| 487 | return -EAGAIN; | ||
| 488 | } | ||
| 489 | |||
| 490 | /* we will need 2 timer interrupts to complete the */ | ||
| 491 | /* reading of the statistics */ | ||
| 492 | chdlc_priv_area->update_comms_stats = 2; | ||
| 493 | flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER; | ||
| 494 | chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UPDATE; | ||
| 495 | |||
| 496 | /* wait a maximum of 1 second for the statistics to be updated */ | ||
| 497 | timeout = jiffies + 1 * HZ; | ||
| 498 | for(;;) { | ||
| 499 | if(chdlc_priv_area->update_comms_stats == 0) | ||
| 500 | break; | ||
| 501 | if (time_after(jiffies, timeout)){ | ||
| 502 | chdlc_priv_area->update_comms_stats = 0; | ||
| 503 | chdlc_priv_area->timer_int_enabled &= | ||
| 504 | ~TMR_INT_ENABLED_UPDATE; | ||
| 505 | return -EAGAIN; | ||
| 506 | } | ||
| 507 | } | ||
| 508 | |||
| 509 | return 0; | ||
| 510 | } | ||
| 511 | |||
| 512 | |||
| 513 | /*============================================================================ | ||
| 514 | * Create new logical channel. | ||
| 515 | * This routine is called by the router when ROUTER_IFNEW IOCTL is being | ||
| 516 | * handled. | ||
| 517 | * o parse media- and hardware-specific configuration | ||
| 518 | * o make sure that a new channel can be created | ||
| 519 | * o allocate resources, if necessary | ||
| 520 | * o prepare network device structure for registaration. | ||
| 521 | * | ||
| 522 | * Return: 0 o.k. | ||
| 523 | * < 0 failure (channel will not be created) | ||
| 524 | */ | ||
| 525 | static int new_if(struct wan_device* wandev, struct net_device* pdev, | ||
| 526 | wanif_conf_t* conf) | ||
| 527 | { | ||
| 528 | |||
| 529 | struct ppp_device *pppdev = (struct ppp_device *)pdev; | ||
| 530 | struct net_device *dev = NULL; | ||
| 531 | struct sppp *sp; | ||
| 532 | sdla_t* card = wandev->private; | ||
| 533 | chdlc_private_area_t* chdlc_priv_area; | ||
| 534 | |||
| 535 | if ((conf->name[0] == '\0') || (strlen(conf->name) > WAN_IFNAME_SZ)) { | ||
| 536 | printk(KERN_INFO "%s: invalid interface name!\n", | ||
| 537 | card->devname); | ||
| 538 | return -EINVAL; | ||
| 539 | } | ||
| 540 | |||
| 541 | /* allocate and initialize private data */ | ||
| 542 | chdlc_priv_area = kmalloc(sizeof(chdlc_private_area_t), GFP_KERNEL); | ||
| 543 | |||
| 544 | if(chdlc_priv_area == NULL) | ||
| 545 | return -ENOMEM; | ||
| 546 | |||
| 547 | memset(chdlc_priv_area, 0, sizeof(chdlc_private_area_t)); | ||
| 548 | |||
| 549 | chdlc_priv_area->card = card; | ||
| 550 | |||
| 551 | /* initialize data */ | ||
| 552 | strcpy(card->u.c.if_name, conf->name); | ||
| 553 | |||
| 554 | if(card->wandev.new_if_cnt > 0) { | ||
| 555 | kfree(chdlc_priv_area); | ||
| 556 | return -EEXIST; | ||
| 557 | } | ||
| 558 | |||
| 559 | card->wandev.new_if_cnt++; | ||
| 560 | |||
| 561 | chdlc_priv_area->TracingEnabled = 0; | ||
| 562 | |||
| 563 | //We don't need this any more | ||
| 564 | chdlc_priv_area->route_status = NO_ROUTE; | ||
| 565 | chdlc_priv_area->route_removed = 0; | ||
| 566 | |||
| 567 | printk(KERN_INFO "%s: Firmware running in HDLC STREAMING Mode\n", | ||
| 568 | wandev->name); | ||
| 569 | |||
| 570 | /* Setup wanpipe as a router (WANPIPE) or as an API */ | ||
| 571 | if( strcmp(conf->usedby, "WANPIPE") == 0) { | ||
| 572 | printk(KERN_INFO "%s: Driver running in WANPIPE mode!\n", | ||
| 573 | wandev->name); | ||
| 574 | card->u.c.usedby = WANPIPE; | ||
| 575 | } else { | ||
| 576 | printk(KERN_INFO | ||
| 577 | "%s: API Mode is not supported for SyncPPP!\n", | ||
| 578 | wandev->name); | ||
| 579 | kfree(chdlc_priv_area); | ||
| 580 | return -EINVAL; | ||
| 581 | } | ||
| 582 | |||
| 583 | /* Get Multicast Information */ | ||
| 584 | chdlc_priv_area->mc = conf->mc; | ||
| 585 | |||
| 586 | |||
| 587 | chdlc_priv_area->if_ptr = pppdev; | ||
| 588 | |||
| 589 | /* prepare network device data space for registration */ | ||
| 590 | |||
| 591 | strcpy(dev->name,card->u.c.if_name); | ||
| 592 | |||
| 593 | /* Attach PPP protocol layer to pppdev | ||
| 594 | * The sppp_attach() will initilize the dev structure | ||
| 595 | * and setup ppp layer protocols. | ||
| 596 | * All we have to do is to bind in: | ||
| 597 | * if_open(), if_close(), if_send() and get_stats() functions. | ||
| 598 | */ | ||
| 599 | sppp_attach(pppdev); | ||
| 600 | dev = pppdev->dev; | ||
| 601 | sp = &pppdev->sppp; | ||
| 602 | |||
| 603 | /* Enable PPP Debugging */ | ||
| 604 | // FIXME Fix this up somehow | ||
| 605 | //sp->pp_flags |= PP_DEBUG; | ||
| 606 | sp->pp_flags &= ~PP_CISCO; | ||
| 607 | |||
| 608 | dev->init = &if_init; | ||
| 609 | dev->priv = chdlc_priv_area; | ||
| 610 | |||
| 611 | return 0; | ||
| 612 | } | ||
| 613 | |||
| 614 | |||
| 615 | |||
| 616 | |||
| 617 | /*============================================================================ | ||
| 618 | * Delete logical channel. | ||
| 619 | */ | ||
| 620 | static int del_if(struct wan_device* wandev, struct net_device* dev) | ||
| 621 | { | ||
| 622 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 623 | sdla_t *card = chdlc_priv_area->card; | ||
| 624 | unsigned long smp_lock; | ||
| 625 | |||
| 626 | /* Detach the PPP layer */ | ||
| 627 | printk(KERN_INFO "%s: Detaching SyncPPP Module from %s\n", | ||
| 628 | wandev->name,dev->name); | ||
| 629 | |||
| 630 | lock_adapter_irq(&wandev->lock,&smp_lock); | ||
| 631 | |||
| 632 | sppp_detach(dev); | ||
| 633 | chdlc_priv_area->if_ptr=NULL; | ||
| 634 | |||
| 635 | chdlc_set_intr_mode(card, 0); | ||
| 636 | if (card->u.c.comm_enabled) | ||
| 637 | chdlc_comm_disable(card); | ||
| 638 | unlock_adapter_irq(&wandev->lock,&smp_lock); | ||
| 639 | |||
| 640 | port_set_state(card, WAN_DISCONNECTED); | ||
| 641 | |||
| 642 | return 0; | ||
| 643 | } | ||
| 644 | |||
| 645 | |||
| 646 | /****** Network Device Interface ********************************************/ | ||
| 647 | |||
| 648 | /*============================================================================ | ||
| 649 | * Initialize Linux network interface. | ||
| 650 | * | ||
| 651 | * This routine is called only once for each interface, during Linux network | ||
| 652 | * interface registration. Returning anything but zero will fail interface | ||
| 653 | * registration. | ||
| 654 | */ | ||
| 655 | static int if_init(struct net_device* dev) | ||
| 656 | { | ||
| 657 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 658 | sdla_t* card = chdlc_priv_area->card; | ||
| 659 | struct wan_device* wandev = &card->wandev; | ||
| 660 | |||
| 661 | /* NOTE: Most of the dev initialization was | ||
| 662 | * done in sppp_attach(), called by new_if() | ||
| 663 | * function. All we have to do here is | ||
| 664 | * to link four major routines below. | ||
| 665 | */ | ||
| 666 | |||
| 667 | /* Initialize device driver entry points */ | ||
| 668 | dev->open = &if_open; | ||
| 669 | dev->stop = &if_close; | ||
| 670 | dev->hard_start_xmit = &if_send; | ||
| 671 | dev->get_stats = &if_stats; | ||
| 672 | dev->tx_timeout = &if_tx_timeout; | ||
| 673 | dev->watchdog_timeo = TX_TIMEOUT; | ||
| 674 | |||
| 675 | |||
| 676 | /* Initialize hardware parameters */ | ||
| 677 | dev->irq = wandev->irq; | ||
| 678 | dev->dma = wandev->dma; | ||
| 679 | dev->base_addr = wandev->ioport; | ||
| 680 | dev->mem_start = wandev->maddr; | ||
| 681 | dev->mem_end = wandev->maddr + wandev->msize - 1; | ||
| 682 | |||
| 683 | /* Set transmit buffer queue length | ||
| 684 | * If we over fill this queue the packets will | ||
| 685 | * be droped by the kernel. | ||
| 686 | * sppp_attach() sets this to 10, but | ||
| 687 | * 100 will give us more room at low speeds. | ||
| 688 | */ | ||
| 689 | dev->tx_queue_len = 100; | ||
| 690 | |||
| 691 | return 0; | ||
| 692 | } | ||
| 693 | |||
| 694 | |||
| 695 | /*============================================================================ | ||
| 696 | * Handle transmit timeout event from netif watchdog | ||
| 697 | */ | ||
| 698 | static void if_tx_timeout(struct net_device *dev) | ||
| 699 | { | ||
| 700 | chdlc_private_area_t* chan = dev->priv; | ||
| 701 | sdla_t *card = chan->card; | ||
| 702 | |||
| 703 | /* If our device stays busy for at least 5 seconds then we will | ||
| 704 | * kick start the device by making dev->tbusy = 0. We expect | ||
| 705 | * that our device never stays busy more than 5 seconds. So this | ||
| 706 | * is only used as a last resort. | ||
| 707 | */ | ||
| 708 | |||
| 709 | ++card->wandev.stats.collisions; | ||
| 710 | |||
| 711 | printk (KERN_INFO "%s: Transmit timed out on %s\n", card->devname,dev->name); | ||
| 712 | netif_wake_queue (dev); | ||
| 713 | } | ||
| 714 | |||
| 715 | |||
| 716 | /*============================================================================ | ||
| 717 | * Open network interface. | ||
| 718 | * o enable communications and interrupts. | ||
| 719 | * o prevent module from unloading by incrementing use count | ||
| 720 | * | ||
| 721 | * Return 0 if O.k. or errno. | ||
| 722 | */ | ||
| 723 | static int if_open(struct net_device* dev) | ||
| 724 | { | ||
| 725 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 726 | sdla_t* card = chdlc_priv_area->card; | ||
| 727 | struct timeval tv; | ||
| 728 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 729 | |||
| 730 | /* Only one open per interface is allowed */ | ||
| 731 | if (netif_running(dev)) | ||
| 732 | return -EBUSY; | ||
| 733 | |||
| 734 | /* Start PPP Layer */ | ||
| 735 | if (sppp_open(dev)){ | ||
| 736 | return -EIO; | ||
| 737 | } | ||
| 738 | |||
| 739 | do_gettimeofday(&tv); | ||
| 740 | chdlc_priv_area->router_start_time = tv.tv_sec; | ||
| 741 | |||
| 742 | netif_start_queue(dev); | ||
| 743 | |||
| 744 | wanpipe_open(card); | ||
| 745 | |||
| 746 | chdlc_priv_area->timer_int_enabled |= TMR_INT_ENABLED_CONFIG; | ||
| 747 | flags->interrupt_info_struct.interrupt_permission |= APP_INT_ON_TIMER; | ||
| 748 | return 0; | ||
| 749 | } | ||
| 750 | |||
| 751 | /*============================================================================ | ||
| 752 | * Close network interface. | ||
| 753 | * o if this is the last close, then disable communications and interrupts. | ||
| 754 | * o reset flags. | ||
| 755 | */ | ||
| 756 | static int if_close(struct net_device* dev) | ||
| 757 | { | ||
| 758 | chdlc_private_area_t* chdlc_priv_area = dev->priv; | ||
| 759 | sdla_t* card = chdlc_priv_area->card; | ||
| 760 | |||
| 761 | /* Stop the PPP Layer */ | ||
| 762 | sppp_close(dev); | ||
| 763 | netif_stop_queue(dev); | ||
| 764 | |||
| 765 | wanpipe_close(card); | ||
| 766 | |||
| 767 | return 0; | ||
| 768 | } | ||
| 769 | |||
| 770 | /*============================================================================ | ||
| 771 | * Send a packet on a network interface. | ||
| 772 | * o set tbusy flag (marks start of the transmission) to block a timer-based | ||
| 773 | * transmit from overlapping. | ||
| 774 | * o check link state. If link is not up, then drop the packet. | ||
| 775 | * o execute adapter send command. | ||
| 776 | * o free socket buffer | ||
| 777 | * | ||
| 778 | * Return: 0 complete (socket buffer must be freed) | ||
| 779 | * non-0 packet may be re-transmitted (tbusy must be set) | ||
| 780 | * | ||
| 781 | * Notes: | ||
| 782 | * 1. This routine is called either by the protocol stack or by the "net | ||
| 783 | * bottom half" (with interrupts enabled). | ||
| 784 | * 2. Setting tbusy flag will inhibit further transmit requests from the | ||
| 785 | * protocol stack and can be used for flow control with protocol layer. | ||
| 786 | */ | ||
| 787 | static int if_send(struct sk_buff* skb, struct net_device* dev) | ||
| 788 | { | ||
| 789 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 790 | sdla_t *card = chdlc_priv_area->card; | ||
| 791 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 792 | INTERRUPT_INFORMATION_STRUCT *chdlc_int = &flags->interrupt_info_struct; | ||
| 793 | int udp_type = 0; | ||
| 794 | unsigned long smp_flags; | ||
| 795 | int err=0; | ||
| 796 | |||
| 797 | netif_stop_queue(dev); | ||
| 798 | |||
| 799 | |||
| 800 | if (skb == NULL){ | ||
| 801 | /* If we get here, some higher layer thinks we've missed an | ||
| 802 | * tx-done interrupt. | ||
| 803 | */ | ||
| 804 | printk(KERN_INFO "%s: Received NULL skb buffer! interface %s got kicked!\n", | ||
| 805 | card->devname, dev->name); | ||
| 806 | |||
| 807 | netif_wake_queue(dev); | ||
| 808 | return 0; | ||
| 809 | } | ||
| 810 | |||
| 811 | if (ntohs(skb->protocol) != htons(PVC_PROT)){ | ||
| 812 | /* check the udp packet type */ | ||
| 813 | |||
| 814 | udp_type = udp_pkt_type(skb, card); | ||
| 815 | if (udp_type == UDP_CPIPE_TYPE){ | ||
| 816 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_STACK, card, skb, dev, | ||
| 817 | chdlc_priv_area)){ | ||
| 818 | chdlc_int->interrupt_permission |= | ||
| 819 | APP_INT_ON_TIMER; | ||
| 820 | } | ||
| 821 | netif_start_queue(dev); | ||
| 822 | return 0; | ||
| 823 | } | ||
| 824 | } | ||
| 825 | |||
| 826 | /* Lock the 508 Card: SMP is supported */ | ||
| 827 | if(card->hw.type != SDLA_S514){ | ||
| 828 | s508_lock(card,&smp_flags); | ||
| 829 | } | ||
| 830 | |||
| 831 | if (test_and_set_bit(SEND_CRIT, (void*)&card->wandev.critical)){ | ||
| 832 | |||
| 833 | printk(KERN_INFO "%s: Critical in if_send: %lx\n", | ||
| 834 | card->wandev.name,card->wandev.critical); | ||
| 835 | ++card->wandev.stats.tx_dropped; | ||
| 836 | netif_start_queue(dev); | ||
| 837 | goto if_send_crit_exit; | ||
| 838 | } | ||
| 839 | |||
| 840 | if (card->wandev.state != WAN_CONNECTED){ | ||
| 841 | ++card->wandev.stats.tx_dropped; | ||
| 842 | netif_start_queue(dev); | ||
| 843 | goto if_send_crit_exit; | ||
| 844 | } | ||
| 845 | |||
| 846 | if (chdlc_send(card, skb->data, skb->len)){ | ||
| 847 | netif_stop_queue(dev); | ||
| 848 | |||
| 849 | }else{ | ||
| 850 | ++card->wandev.stats.tx_packets; | ||
| 851 | card->wandev.stats.tx_bytes += skb->len; | ||
| 852 | dev->trans_start = jiffies; | ||
| 853 | netif_start_queue(dev); | ||
| 854 | } | ||
| 855 | |||
| 856 | if_send_crit_exit: | ||
| 857 | if (!(err=netif_queue_stopped(dev))){ | ||
| 858 | dev_kfree_skb_any(skb); | ||
| 859 | }else{ | ||
| 860 | chdlc_priv_area->tick_counter = jiffies; | ||
| 861 | chdlc_int->interrupt_permission |= APP_INT_ON_TX_FRAME; | ||
| 862 | } | ||
| 863 | |||
| 864 | clear_bit(SEND_CRIT, (void*)&card->wandev.critical); | ||
| 865 | if(card->hw.type != SDLA_S514){ | ||
| 866 | s508_unlock(card,&smp_flags); | ||
| 867 | } | ||
| 868 | |||
| 869 | return err; | ||
| 870 | } | ||
| 871 | |||
| 872 | |||
| 873 | /*============================================================================ | ||
| 874 | * Reply to UDP Management system. | ||
| 875 | * Return length of reply. | ||
| 876 | */ | ||
| 877 | static int reply_udp( unsigned char *data, unsigned int mbox_len ) | ||
| 878 | { | ||
| 879 | |||
| 880 | unsigned short len, udp_length, temp, ip_length; | ||
| 881 | unsigned long ip_temp; | ||
| 882 | int even_bound = 0; | ||
| 883 | chdlc_udp_pkt_t *c_udp_pkt = (chdlc_udp_pkt_t *)data; | ||
| 884 | |||
| 885 | /* Set length of packet */ | ||
| 886 | len = sizeof(ip_pkt_t)+ | ||
| 887 | sizeof(udp_pkt_t)+ | ||
| 888 | sizeof(wp_mgmt_t)+ | ||
| 889 | sizeof(cblock_t)+ | ||
| 890 | sizeof(trace_info_t)+ | ||
| 891 | mbox_len; | ||
| 892 | |||
| 893 | /* fill in UDP reply */ | ||
| 894 | c_udp_pkt->wp_mgmt.request_reply = UDPMGMT_REPLY; | ||
| 895 | |||
| 896 | /* fill in UDP length */ | ||
| 897 | udp_length = sizeof(udp_pkt_t)+ | ||
| 898 | sizeof(wp_mgmt_t)+ | ||
| 899 | sizeof(cblock_t)+ | ||
| 900 | sizeof(trace_info_t)+ | ||
| 901 | mbox_len; | ||
| 902 | |||
| 903 | /* put it on an even boundary */ | ||
| 904 | if ( udp_length & 0x0001 ) { | ||
| 905 | udp_length += 1; | ||
| 906 | len += 1; | ||
| 907 | even_bound = 1; | ||
| 908 | } | ||
| 909 | |||
| 910 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 911 | c_udp_pkt->udp_pkt.udp_length = temp; | ||
| 912 | |||
| 913 | /* swap UDP ports */ | ||
| 914 | temp = c_udp_pkt->udp_pkt.udp_src_port; | ||
| 915 | c_udp_pkt->udp_pkt.udp_src_port = | ||
| 916 | c_udp_pkt->udp_pkt.udp_dst_port; | ||
| 917 | c_udp_pkt->udp_pkt.udp_dst_port = temp; | ||
| 918 | |||
| 919 | /* add UDP pseudo header */ | ||
| 920 | temp = 0x1100; | ||
| 921 | *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound)) = temp; | ||
| 922 | temp = (udp_length<<8)|(udp_length>>8); | ||
| 923 | *((unsigned short *)(c_udp_pkt->data+mbox_len+even_bound+2)) = temp; | ||
| 924 | |||
| 925 | |||
| 926 | /* calculate UDP checksum */ | ||
| 927 | c_udp_pkt->udp_pkt.udp_checksum = 0; | ||
| 928 | c_udp_pkt->udp_pkt.udp_checksum = calc_checksum(&data[UDP_OFFSET],udp_length+UDP_OFFSET); | ||
| 929 | |||
| 930 | /* fill in IP length */ | ||
| 931 | ip_length = len; | ||
| 932 | temp = (ip_length<<8)|(ip_length>>8); | ||
| 933 | c_udp_pkt->ip_pkt.total_length = temp; | ||
| 934 | |||
| 935 | /* swap IP addresses */ | ||
| 936 | ip_temp = c_udp_pkt->ip_pkt.ip_src_address; | ||
| 937 | c_udp_pkt->ip_pkt.ip_src_address = c_udp_pkt->ip_pkt.ip_dst_address; | ||
| 938 | c_udp_pkt->ip_pkt.ip_dst_address = ip_temp; | ||
| 939 | |||
| 940 | /* fill in IP checksum */ | ||
| 941 | c_udp_pkt->ip_pkt.hdr_checksum = 0; | ||
| 942 | c_udp_pkt->ip_pkt.hdr_checksum = calc_checksum(data,sizeof(ip_pkt_t)); | ||
| 943 | |||
| 944 | return len; | ||
| 945 | |||
| 946 | } /* reply_udp */ | ||
| 947 | |||
| 948 | unsigned short calc_checksum (char *data, int len) | ||
| 949 | { | ||
| 950 | unsigned short temp; | ||
| 951 | unsigned long sum=0; | ||
| 952 | int i; | ||
| 953 | |||
| 954 | for( i = 0; i <len; i+=2 ) { | ||
| 955 | memcpy(&temp,&data[i],2); | ||
| 956 | sum += (unsigned long)temp; | ||
| 957 | } | ||
| 958 | |||
| 959 | while (sum >> 16 ) { | ||
| 960 | sum = (sum & 0xffffUL) + (sum >> 16); | ||
| 961 | } | ||
| 962 | |||
| 963 | temp = (unsigned short)sum; | ||
| 964 | temp = ~temp; | ||
| 965 | |||
| 966 | if( temp == 0 ) | ||
| 967 | temp = 0xffff; | ||
| 968 | |||
| 969 | return temp; | ||
| 970 | } | ||
| 971 | |||
| 972 | |||
| 973 | /*============================================================================ | ||
| 974 | * Get ethernet-style interface statistics. | ||
| 975 | * Return a pointer to struct enet_statistics. | ||
| 976 | */ | ||
| 977 | static struct net_device_stats* if_stats(struct net_device* dev) | ||
| 978 | { | ||
| 979 | sdla_t *my_card; | ||
| 980 | chdlc_private_area_t* chdlc_priv_area; | ||
| 981 | |||
| 982 | /* Shutdown bug fix. In del_if() we kill | ||
| 983 | * dev->priv pointer. This function, gets | ||
| 984 | * called after del_if(), thus check | ||
| 985 | * if pointer has been deleted */ | ||
| 986 | if ((chdlc_priv_area=dev->priv) == NULL) | ||
| 987 | return NULL; | ||
| 988 | |||
| 989 | my_card = chdlc_priv_area->card; | ||
| 990 | return &my_card->wandev.stats; | ||
| 991 | } | ||
| 992 | |||
| 993 | |||
| 994 | /****** Cisco HDLC Firmware Interface Functions *******************************/ | ||
| 995 | |||
| 996 | /*============================================================================ | ||
| 997 | * Read firmware code version. | ||
| 998 | * Put code version as ASCII string in str. | ||
| 999 | */ | ||
| 1000 | static int chdlc_read_version (sdla_t* card, char* str) | ||
| 1001 | { | ||
| 1002 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1003 | int len; | ||
| 1004 | char err; | ||
| 1005 | mb->buffer_length = 0; | ||
| 1006 | mb->command = READ_CHDLC_CODE_VERSION; | ||
| 1007 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1008 | |||
| 1009 | if(err != COMMAND_OK) { | ||
| 1010 | chdlc_error(card,err,mb); | ||
| 1011 | } | ||
| 1012 | else if (str) { /* is not null */ | ||
| 1013 | len = mb->buffer_length; | ||
| 1014 | memcpy(str, mb->data, len); | ||
| 1015 | str[len] = '\0'; | ||
| 1016 | } | ||
| 1017 | return (err); | ||
| 1018 | } | ||
| 1019 | |||
| 1020 | /*----------------------------------------------------------------------------- | ||
| 1021 | * Configure CHDLC firmware. | ||
| 1022 | */ | ||
| 1023 | static int chdlc_configure (sdla_t* card, void* data) | ||
| 1024 | { | ||
| 1025 | int err; | ||
| 1026 | CHDLC_MAILBOX_STRUCT *mailbox = card->mbox; | ||
| 1027 | int data_length = sizeof(CHDLC_CONFIGURATION_STRUCT); | ||
| 1028 | |||
| 1029 | mailbox->buffer_length = data_length; | ||
| 1030 | memcpy(mailbox->data, data, data_length); | ||
| 1031 | mailbox->command = SET_CHDLC_CONFIGURATION; | ||
| 1032 | err = sdla_exec(mailbox) ? mailbox->return_code : CMD_TIMEOUT; | ||
| 1033 | |||
| 1034 | if (err != COMMAND_OK) chdlc_error (card, err, mailbox); | ||
| 1035 | |||
| 1036 | return err; | ||
| 1037 | } | ||
| 1038 | |||
| 1039 | |||
| 1040 | /*============================================================================ | ||
| 1041 | * Set interrupt mode -- HDLC Version. | ||
| 1042 | */ | ||
| 1043 | |||
| 1044 | static int chdlc_set_intr_mode (sdla_t* card, unsigned mode) | ||
| 1045 | { | ||
| 1046 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1047 | CHDLC_INT_TRIGGERS_STRUCT* int_data = | ||
| 1048 | (CHDLC_INT_TRIGGERS_STRUCT *)mb->data; | ||
| 1049 | int err; | ||
| 1050 | |||
| 1051 | int_data->CHDLC_interrupt_triggers = mode; | ||
| 1052 | int_data->IRQ = card->hw.irq; | ||
| 1053 | int_data->interrupt_timer = 1; | ||
| 1054 | |||
| 1055 | mb->buffer_length = sizeof(CHDLC_INT_TRIGGERS_STRUCT); | ||
| 1056 | mb->command = SET_CHDLC_INTERRUPT_TRIGGERS; | ||
| 1057 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1058 | if (err != COMMAND_OK) | ||
| 1059 | chdlc_error (card, err, mb); | ||
| 1060 | return err; | ||
| 1061 | } | ||
| 1062 | |||
| 1063 | |||
| 1064 | /*============================================================================ | ||
| 1065 | * Enable communications. | ||
| 1066 | */ | ||
| 1067 | |||
| 1068 | static int chdlc_comm_enable (sdla_t* card) | ||
| 1069 | { | ||
| 1070 | int err; | ||
| 1071 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1072 | |||
| 1073 | mb->buffer_length = 0; | ||
| 1074 | mb->command = ENABLE_CHDLC_COMMUNICATIONS; | ||
| 1075 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1076 | if (err != COMMAND_OK) | ||
| 1077 | chdlc_error(card, err, mb); | ||
| 1078 | else | ||
| 1079 | card->u.c.comm_enabled=1; | ||
| 1080 | |||
| 1081 | return err; | ||
| 1082 | } | ||
| 1083 | |||
| 1084 | /*============================================================================ | ||
| 1085 | * Disable communications and Drop the Modem lines (DCD and RTS). | ||
| 1086 | */ | ||
| 1087 | static int chdlc_comm_disable (sdla_t* card) | ||
| 1088 | { | ||
| 1089 | int err; | ||
| 1090 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1091 | |||
| 1092 | mb->buffer_length = 0; | ||
| 1093 | mb->command = DISABLE_CHDLC_COMMUNICATIONS; | ||
| 1094 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1095 | if (err != COMMAND_OK) | ||
| 1096 | chdlc_error(card,err,mb); | ||
| 1097 | |||
| 1098 | return err; | ||
| 1099 | } | ||
| 1100 | |||
| 1101 | /*============================================================================ | ||
| 1102 | * Read communication error statistics. | ||
| 1103 | */ | ||
| 1104 | static int chdlc_read_comm_err_stats (sdla_t* card) | ||
| 1105 | { | ||
| 1106 | int err; | ||
| 1107 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1108 | |||
| 1109 | mb->buffer_length = 0; | ||
| 1110 | mb->command = READ_COMMS_ERROR_STATS; | ||
| 1111 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1112 | if (err != COMMAND_OK) | ||
| 1113 | chdlc_error(card,err,mb); | ||
| 1114 | return err; | ||
| 1115 | } | ||
| 1116 | |||
| 1117 | |||
| 1118 | /*============================================================================ | ||
| 1119 | * Read CHDLC operational statistics. | ||
| 1120 | */ | ||
| 1121 | static int chdlc_read_op_stats (sdla_t* card) | ||
| 1122 | { | ||
| 1123 | int err; | ||
| 1124 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1125 | |||
| 1126 | mb->buffer_length = 0; | ||
| 1127 | mb->command = READ_CHDLC_OPERATIONAL_STATS; | ||
| 1128 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1129 | if (err != COMMAND_OK) | ||
| 1130 | chdlc_error(card,err,mb); | ||
| 1131 | return err; | ||
| 1132 | } | ||
| 1133 | |||
| 1134 | |||
| 1135 | /*============================================================================ | ||
| 1136 | * Update communications error and general packet statistics. | ||
| 1137 | */ | ||
| 1138 | static int update_comms_stats(sdla_t* card, | ||
| 1139 | chdlc_private_area_t* chdlc_priv_area) | ||
| 1140 | { | ||
| 1141 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1142 | COMMS_ERROR_STATS_STRUCT* err_stats; | ||
| 1143 | CHDLC_OPERATIONAL_STATS_STRUCT *op_stats; | ||
| 1144 | |||
| 1145 | /* on the first timer interrupt, read the comms error statistics */ | ||
| 1146 | if(chdlc_priv_area->update_comms_stats == 2) { | ||
| 1147 | if(chdlc_read_comm_err_stats(card)) | ||
| 1148 | return 1; | ||
| 1149 | err_stats = (COMMS_ERROR_STATS_STRUCT *)mb->data; | ||
| 1150 | card->wandev.stats.rx_over_errors = | ||
| 1151 | err_stats->Rx_overrun_err_count; | ||
| 1152 | card->wandev.stats.rx_crc_errors = | ||
| 1153 | err_stats->CRC_err_count; | ||
| 1154 | card->wandev.stats.rx_frame_errors = | ||
| 1155 | err_stats->Rx_abort_count; | ||
| 1156 | card->wandev.stats.rx_fifo_errors = | ||
| 1157 | err_stats->Rx_dis_pri_bfrs_full_count; | ||
| 1158 | card->wandev.stats.rx_missed_errors = | ||
| 1159 | card->wandev.stats.rx_fifo_errors; | ||
| 1160 | card->wandev.stats.tx_aborted_errors = | ||
| 1161 | err_stats->sec_Tx_abort_count; | ||
| 1162 | } | ||
| 1163 | |||
| 1164 | /* on the second timer interrupt, read the operational statistics */ | ||
| 1165 | else { | ||
| 1166 | if(chdlc_read_op_stats(card)) | ||
| 1167 | return 1; | ||
| 1168 | op_stats = (CHDLC_OPERATIONAL_STATS_STRUCT *)mb->data; | ||
| 1169 | card->wandev.stats.rx_length_errors = | ||
| 1170 | (op_stats->Rx_Data_discard_short_count + | ||
| 1171 | op_stats->Rx_Data_discard_long_count); | ||
| 1172 | } | ||
| 1173 | |||
| 1174 | return 0; | ||
| 1175 | } | ||
| 1176 | |||
| 1177 | /*============================================================================ | ||
| 1178 | * Send packet. | ||
| 1179 | * Return: 0 - o.k. | ||
| 1180 | * 1 - no transmit buffers available | ||
| 1181 | */ | ||
| 1182 | static int chdlc_send (sdla_t* card, void* data, unsigned len) | ||
| 1183 | { | ||
| 1184 | CHDLC_DATA_TX_STATUS_EL_STRUCT *txbuf = card->u.c.txbuf; | ||
| 1185 | |||
| 1186 | if (txbuf->opp_flag) | ||
| 1187 | return 1; | ||
| 1188 | |||
| 1189 | sdla_poke(&card->hw, txbuf->ptr_data_bfr, data, len); | ||
| 1190 | |||
| 1191 | txbuf->frame_length = len; | ||
| 1192 | txbuf->opp_flag = 1; /* start transmission */ | ||
| 1193 | |||
| 1194 | /* Update transmit buffer control fields */ | ||
| 1195 | card->u.c.txbuf = ++txbuf; | ||
| 1196 | |||
| 1197 | if ((void*)txbuf > card->u.c.txbuf_last) | ||
| 1198 | card->u.c.txbuf = card->u.c.txbuf_base; | ||
| 1199 | |||
| 1200 | return 0; | ||
| 1201 | } | ||
| 1202 | |||
| 1203 | /****** Firmware Error Handler **********************************************/ | ||
| 1204 | |||
| 1205 | /*============================================================================ | ||
| 1206 | * Firmware error handler. | ||
| 1207 | * This routine is called whenever firmware command returns non-zero | ||
| 1208 | * return code. | ||
| 1209 | * | ||
| 1210 | * Return zero if previous command has to be cancelled. | ||
| 1211 | */ | ||
| 1212 | static int chdlc_error (sdla_t *card, int err, CHDLC_MAILBOX_STRUCT *mb) | ||
| 1213 | { | ||
| 1214 | unsigned cmd = mb->command; | ||
| 1215 | |||
| 1216 | switch (err) { | ||
| 1217 | |||
| 1218 | case CMD_TIMEOUT: | ||
| 1219 | printk(KERN_ERR "%s: command 0x%02X timed out!\n", | ||
| 1220 | card->devname, cmd); | ||
| 1221 | break; | ||
| 1222 | |||
| 1223 | case S514_BOTH_PORTS_SAME_CLK_MODE: | ||
| 1224 | if(cmd == SET_CHDLC_CONFIGURATION) { | ||
| 1225 | printk(KERN_INFO | ||
| 1226 | "%s: Configure both ports for the same clock source\n", | ||
| 1227 | card->devname); | ||
| 1228 | break; | ||
| 1229 | } | ||
| 1230 | |||
| 1231 | default: | ||
| 1232 | printk(KERN_INFO "%s: command 0x%02X returned 0x%02X!\n", | ||
| 1233 | card->devname, cmd, err); | ||
| 1234 | } | ||
| 1235 | |||
| 1236 | return 0; | ||
| 1237 | } | ||
| 1238 | |||
| 1239 | /****** Interrupt Handlers **************************************************/ | ||
| 1240 | |||
| 1241 | /*============================================================================ | ||
| 1242 | * Cisco HDLC interrupt service routine. | ||
| 1243 | */ | ||
| 1244 | STATIC void wsppp_isr (sdla_t* card) | ||
| 1245 | { | ||
| 1246 | struct net_device* dev; | ||
| 1247 | SHARED_MEMORY_INFO_STRUCT* flags = NULL; | ||
| 1248 | int i; | ||
| 1249 | sdla_t *my_card; | ||
| 1250 | |||
| 1251 | |||
| 1252 | /* Check for which port the interrupt has been generated | ||
| 1253 | * Since Secondary Port is piggybacking on the Primary | ||
| 1254 | * the check must be done here. | ||
| 1255 | */ | ||
| 1256 | |||
| 1257 | flags = card->u.c.flags; | ||
| 1258 | if (!flags->interrupt_info_struct.interrupt_type){ | ||
| 1259 | /* Check for a second port (piggybacking) */ | ||
| 1260 | if((my_card = card->next)){ | ||
| 1261 | flags = my_card->u.c.flags; | ||
| 1262 | if (flags->interrupt_info_struct.interrupt_type){ | ||
| 1263 | card = my_card; | ||
| 1264 | card->isr(card); | ||
| 1265 | return; | ||
| 1266 | } | ||
| 1267 | } | ||
| 1268 | } | ||
| 1269 | |||
| 1270 | dev = card->wandev.dev; | ||
| 1271 | card->in_isr = 1; | ||
| 1272 | flags = card->u.c.flags; | ||
| 1273 | |||
| 1274 | /* If we get an interrupt with no network device, stop the interrupts | ||
| 1275 | * and issue an error */ | ||
| 1276 | if ((!dev || !dev->priv) && flags->interrupt_info_struct.interrupt_type != | ||
| 1277 | COMMAND_COMPLETE_APP_INT_PEND){ | ||
| 1278 | goto isr_done; | ||
| 1279 | } | ||
| 1280 | |||
| 1281 | |||
| 1282 | /* if critical due to peripheral operations | ||
| 1283 | * ie. update() or getstats() then reset the interrupt and | ||
| 1284 | * wait for the board to retrigger. | ||
| 1285 | */ | ||
| 1286 | if(test_bit(PERI_CRIT, (void*)&card->wandev.critical)) { | ||
| 1287 | flags->interrupt_info_struct. | ||
| 1288 | interrupt_type = 0; | ||
| 1289 | goto isr_done; | ||
| 1290 | } | ||
| 1291 | |||
| 1292 | |||
| 1293 | /* On a 508 Card, if critical due to if_send | ||
| 1294 | * Major Error !!! | ||
| 1295 | */ | ||
| 1296 | if(card->hw.type != SDLA_S514) { | ||
| 1297 | if(test_bit(0, (void*)&card->wandev.critical)) { | ||
| 1298 | printk(KERN_INFO "%s: Critical while in ISR: %lx\n", | ||
| 1299 | card->devname, card->wandev.critical); | ||
| 1300 | goto isr_done; | ||
| 1301 | } | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | switch(flags->interrupt_info_struct.interrupt_type) { | ||
| 1305 | |||
| 1306 | case RX_APP_INT_PEND: /* 0x01: receive interrupt */ | ||
| 1307 | rx_intr(card); | ||
| 1308 | break; | ||
| 1309 | |||
| 1310 | case TX_APP_INT_PEND: /* 0x02: transmit interrupt */ | ||
| 1311 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 1312 | ~APP_INT_ON_TX_FRAME; | ||
| 1313 | |||
| 1314 | netif_wake_queue(dev); | ||
| 1315 | break; | ||
| 1316 | |||
| 1317 | case COMMAND_COMPLETE_APP_INT_PEND:/* 0x04: cmd cplt */ | ||
| 1318 | ++ Intr_test_counter; | ||
| 1319 | break; | ||
| 1320 | |||
| 1321 | case CHDLC_EXCEP_COND_APP_INT_PEND: /* 0x20 */ | ||
| 1322 | process_chdlc_exception(card); | ||
| 1323 | break; | ||
| 1324 | |||
| 1325 | case GLOBAL_EXCEP_COND_APP_INT_PEND: | ||
| 1326 | process_global_exception(card); | ||
| 1327 | break; | ||
| 1328 | |||
| 1329 | case TIMER_APP_INT_PEND: | ||
| 1330 | timer_intr(card); | ||
| 1331 | break; | ||
| 1332 | |||
| 1333 | default: | ||
| 1334 | printk(KERN_INFO "%s: spurious interrupt 0x%02X!\n", | ||
| 1335 | card->devname, | ||
| 1336 | flags->interrupt_info_struct.interrupt_type); | ||
| 1337 | printk(KERN_INFO "Code name: "); | ||
| 1338 | for(i = 0; i < 4; i ++) | ||
| 1339 | printk(KERN_INFO "%c", | ||
| 1340 | flags->global_info_struct.codename[i]); | ||
| 1341 | printk(KERN_INFO "\nCode version: "); | ||
| 1342 | for(i = 0; i < 4; i ++) | ||
| 1343 | printk(KERN_INFO "%c", | ||
| 1344 | flags->global_info_struct.codeversion[i]); | ||
| 1345 | printk(KERN_INFO "\n"); | ||
| 1346 | break; | ||
| 1347 | } | ||
| 1348 | |||
| 1349 | isr_done: | ||
| 1350 | card->in_isr = 0; | ||
| 1351 | flags->interrupt_info_struct.interrupt_type = 0; | ||
| 1352 | } | ||
| 1353 | |||
| 1354 | /*============================================================================ | ||
| 1355 | * Receive interrupt handler. | ||
| 1356 | */ | ||
| 1357 | static void rx_intr (sdla_t* card) | ||
| 1358 | { | ||
| 1359 | struct net_device *dev; | ||
| 1360 | chdlc_private_area_t *chdlc_priv_area; | ||
| 1361 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 1362 | CHDLC_DATA_RX_STATUS_EL_STRUCT *rxbuf = card->u.c.rxmb; | ||
| 1363 | struct sk_buff *skb; | ||
| 1364 | unsigned len; | ||
| 1365 | unsigned addr = rxbuf->ptr_data_bfr; | ||
| 1366 | void *buf; | ||
| 1367 | int i,udp_type; | ||
| 1368 | |||
| 1369 | if (rxbuf->opp_flag != 0x01) { | ||
| 1370 | printk(KERN_INFO | ||
| 1371 | "%s: corrupted Rx buffer @ 0x%X, flag = 0x%02X!\n", | ||
| 1372 | card->devname, (unsigned)rxbuf, rxbuf->opp_flag); | ||
| 1373 | printk(KERN_INFO "Code name: "); | ||
| 1374 | for(i = 0; i < 4; i ++) | ||
| 1375 | printk(KERN_INFO "%c", | ||
| 1376 | flags->global_info_struct.codename[i]); | ||
| 1377 | printk(KERN_INFO "\nCode version: "); | ||
| 1378 | for(i = 0; i < 4; i ++) | ||
| 1379 | printk(KERN_INFO "%c", | ||
| 1380 | flags->global_info_struct.codeversion[i]); | ||
| 1381 | printk(KERN_INFO "\n"); | ||
| 1382 | |||
| 1383 | |||
| 1384 | /* Bug Fix: Mar 6 2000 | ||
| 1385 | * If we get a corrupted mailbox, it measn that driver | ||
| 1386 | * is out of sync with the firmware. There is no recovery. | ||
| 1387 | * If we don't turn off all interrupts for this card | ||
| 1388 | * the machine will crash. | ||
| 1389 | */ | ||
| 1390 | printk(KERN_INFO "%s: Critical router failure ...!!!\n", card->devname); | ||
| 1391 | printk(KERN_INFO "Please contact Sangoma Technologies !\n"); | ||
| 1392 | chdlc_set_intr_mode(card,0); | ||
| 1393 | return; | ||
| 1394 | } | ||
| 1395 | |||
| 1396 | dev = card->wandev.dev; | ||
| 1397 | |||
| 1398 | if (!dev){ | ||
| 1399 | goto rx_exit; | ||
| 1400 | } | ||
| 1401 | |||
| 1402 | if (!netif_running(dev)){ | ||
| 1403 | goto rx_exit; | ||
| 1404 | } | ||
| 1405 | |||
| 1406 | chdlc_priv_area = dev->priv; | ||
| 1407 | |||
| 1408 | if (rxbuf->error_flag){ | ||
| 1409 | goto rx_exit; | ||
| 1410 | } | ||
| 1411 | /* Take off two CRC bytes */ | ||
| 1412 | |||
| 1413 | if (rxbuf->frame_length < 7 || rxbuf->frame_length > 1506 ){ | ||
| 1414 | goto rx_exit; | ||
| 1415 | } | ||
| 1416 | |||
| 1417 | len = rxbuf->frame_length - CRC_LENGTH; | ||
| 1418 | |||
| 1419 | /* Allocate socket buffer */ | ||
| 1420 | skb = dev_alloc_skb(len); | ||
| 1421 | |||
| 1422 | if (skb == NULL) { | ||
| 1423 | if (net_ratelimit()){ | ||
| 1424 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 1425 | card->devname); | ||
| 1426 | } | ||
| 1427 | ++card->wandev.stats.rx_dropped; | ||
| 1428 | goto rx_exit; | ||
| 1429 | } | ||
| 1430 | |||
| 1431 | /* Copy data to the socket buffer */ | ||
| 1432 | if((addr + len) > card->u.c.rx_top + 1) { | ||
| 1433 | unsigned tmp = card->u.c.rx_top - addr + 1; | ||
| 1434 | buf = skb_put(skb, tmp); | ||
| 1435 | sdla_peek(&card->hw, addr, buf, tmp); | ||
| 1436 | addr = card->u.c.rx_base; | ||
| 1437 | len -= tmp; | ||
| 1438 | } | ||
| 1439 | |||
| 1440 | buf = skb_put(skb, len); | ||
| 1441 | sdla_peek(&card->hw, addr, buf, len); | ||
| 1442 | |||
| 1443 | skb->protocol = htons(ETH_P_WAN_PPP); | ||
| 1444 | |||
| 1445 | card->wandev.stats.rx_packets ++; | ||
| 1446 | card->wandev.stats.rx_bytes += skb->len; | ||
| 1447 | udp_type = udp_pkt_type( skb, card ); | ||
| 1448 | |||
| 1449 | if(udp_type == UDP_CPIPE_TYPE) { | ||
| 1450 | if(store_udp_mgmt_pkt(UDP_PKT_FRM_NETWORK, | ||
| 1451 | card, skb, dev, chdlc_priv_area)) { | ||
| 1452 | flags->interrupt_info_struct. | ||
| 1453 | interrupt_permission |= | ||
| 1454 | APP_INT_ON_TIMER; | ||
| 1455 | } | ||
| 1456 | }else{ | ||
| 1457 | /* Pass it up the protocol stack */ | ||
| 1458 | skb->dev = dev; | ||
| 1459 | skb->mac.raw = skb->data; | ||
| 1460 | netif_rx(skb); | ||
| 1461 | dev->last_rx = jiffies; | ||
| 1462 | } | ||
| 1463 | |||
| 1464 | rx_exit: | ||
| 1465 | /* Release buffer element and calculate a pointer to the next one */ | ||
| 1466 | rxbuf->opp_flag = 0x00; | ||
| 1467 | card->u.c.rxmb = ++ rxbuf; | ||
| 1468 | if((void*)rxbuf > card->u.c.rxbuf_last){ | ||
| 1469 | card->u.c.rxmb = card->u.c.rxbuf_base; | ||
| 1470 | } | ||
| 1471 | } | ||
| 1472 | |||
| 1473 | /*============================================================================ | ||
| 1474 | * Timer interrupt handler. | ||
| 1475 | * The timer interrupt is used for two purposes: | ||
| 1476 | * 1) Processing udp calls from 'cpipemon'. | ||
| 1477 | * 2) Reading board-level statistics for updating the proc file system. | ||
| 1478 | */ | ||
| 1479 | void timer_intr(sdla_t *card) | ||
| 1480 | { | ||
| 1481 | struct net_device* dev; | ||
| 1482 | chdlc_private_area_t* chdlc_priv_area = NULL; | ||
| 1483 | SHARED_MEMORY_INFO_STRUCT* flags = NULL; | ||
| 1484 | |||
| 1485 | dev = card->wandev.dev; | ||
| 1486 | chdlc_priv_area = dev->priv; | ||
| 1487 | |||
| 1488 | if (chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_CONFIG) { | ||
| 1489 | if (!config_chdlc(card)){ | ||
| 1490 | chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_CONFIG; | ||
| 1491 | } | ||
| 1492 | } | ||
| 1493 | |||
| 1494 | /* process a udp call if pending */ | ||
| 1495 | if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UDP) { | ||
| 1496 | process_udp_mgmt_pkt(card, dev, | ||
| 1497 | chdlc_priv_area); | ||
| 1498 | chdlc_priv_area->timer_int_enabled &= ~TMR_INT_ENABLED_UDP; | ||
| 1499 | } | ||
| 1500 | |||
| 1501 | |||
| 1502 | /* read the communications statistics if required */ | ||
| 1503 | if(chdlc_priv_area->timer_int_enabled & TMR_INT_ENABLED_UPDATE) { | ||
| 1504 | update_comms_stats(card, chdlc_priv_area); | ||
| 1505 | if(!(-- chdlc_priv_area->update_comms_stats)) { | ||
| 1506 | chdlc_priv_area->timer_int_enabled &= | ||
| 1507 | ~TMR_INT_ENABLED_UPDATE; | ||
| 1508 | } | ||
| 1509 | } | ||
| 1510 | |||
| 1511 | /* only disable the timer interrupt if there are no udp or statistic */ | ||
| 1512 | /* updates pending */ | ||
| 1513 | if(!chdlc_priv_area->timer_int_enabled) { | ||
| 1514 | flags = card->u.c.flags; | ||
| 1515 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 1516 | ~APP_INT_ON_TIMER; | ||
| 1517 | } | ||
| 1518 | } | ||
| 1519 | |||
| 1520 | /*------------------------------------------------------------------------------ | ||
| 1521 | Miscellaneous Functions | ||
| 1522 | - set_chdlc_config() used to set configuration options on the board | ||
| 1523 | ------------------------------------------------------------------------------*/ | ||
| 1524 | |||
| 1525 | static int set_chdlc_config(sdla_t* card) | ||
| 1526 | { | ||
| 1527 | |||
| 1528 | CHDLC_CONFIGURATION_STRUCT cfg; | ||
| 1529 | |||
| 1530 | memset(&cfg, 0, sizeof(CHDLC_CONFIGURATION_STRUCT)); | ||
| 1531 | |||
| 1532 | if(card->wandev.clocking) | ||
| 1533 | cfg.baud_rate = card->wandev.bps; | ||
| 1534 | |||
| 1535 | cfg.line_config_options = (card->wandev.interface == WANOPT_RS232) ? | ||
| 1536 | INTERFACE_LEVEL_RS232 : INTERFACE_LEVEL_V35; | ||
| 1537 | |||
| 1538 | cfg.modem_config_options = 0; | ||
| 1539 | //API OPTIONS | ||
| 1540 | cfg.CHDLC_API_options = DISCARD_RX_ERROR_FRAMES; | ||
| 1541 | cfg.modem_status_timer = 100; | ||
| 1542 | cfg.CHDLC_protocol_options = HDLC_STREAMING_MODE; | ||
| 1543 | cfg.percent_data_buffer_for_Tx = 50; | ||
| 1544 | cfg.CHDLC_statistics_options = (CHDLC_TX_DATA_BYTE_COUNT_STAT | | ||
| 1545 | CHDLC_RX_DATA_BYTE_COUNT_STAT); | ||
| 1546 | cfg.max_CHDLC_data_field_length = card->wandev.mtu; | ||
| 1547 | |||
| 1548 | cfg.transmit_keepalive_timer = 0; | ||
| 1549 | cfg.receive_keepalive_timer = 0; | ||
| 1550 | cfg.keepalive_error_tolerance = 0; | ||
| 1551 | cfg.SLARP_request_timer = 0; | ||
| 1552 | |||
| 1553 | cfg.IP_address = 0; | ||
| 1554 | cfg.IP_netmask = 0; | ||
| 1555 | |||
| 1556 | return chdlc_configure(card, &cfg); | ||
| 1557 | } | ||
| 1558 | |||
| 1559 | /*============================================================================ | ||
| 1560 | * Process global exception condition | ||
| 1561 | */ | ||
| 1562 | static int process_global_exception(sdla_t *card) | ||
| 1563 | { | ||
| 1564 | CHDLC_MAILBOX_STRUCT* mbox = card->mbox; | ||
| 1565 | int err; | ||
| 1566 | |||
| 1567 | mbox->buffer_length = 0; | ||
| 1568 | mbox->command = READ_GLOBAL_EXCEPTION_CONDITION; | ||
| 1569 | err = sdla_exec(mbox) ? mbox->return_code : CMD_TIMEOUT; | ||
| 1570 | |||
| 1571 | if(err != CMD_TIMEOUT ){ | ||
| 1572 | |||
| 1573 | switch(mbox->return_code) { | ||
| 1574 | |||
| 1575 | case EXCEP_MODEM_STATUS_CHANGE: | ||
| 1576 | |||
| 1577 | printk(KERN_INFO "%s: Modem status change\n", | ||
| 1578 | card->devname); | ||
| 1579 | |||
| 1580 | switch(mbox->data[0] & (DCD_HIGH | CTS_HIGH)) { | ||
| 1581 | case (DCD_HIGH): | ||
| 1582 | printk(KERN_INFO "%s: DCD high, CTS low\n",card->devname); | ||
| 1583 | break; | ||
| 1584 | case (CTS_HIGH): | ||
| 1585 | printk(KERN_INFO "%s: DCD low, CTS high\n",card->devname); | ||
| 1586 | break; | ||
| 1587 | case ((DCD_HIGH | CTS_HIGH)): | ||
| 1588 | printk(KERN_INFO "%s: DCD high, CTS high\n",card->devname); | ||
| 1589 | break; | ||
| 1590 | default: | ||
| 1591 | printk(KERN_INFO "%s: DCD low, CTS low\n",card->devname); | ||
| 1592 | break; | ||
| 1593 | } | ||
| 1594 | |||
| 1595 | if (!(mbox->data[0] & DCD_HIGH) || !(mbox->data[0] & DCD_HIGH)){ | ||
| 1596 | //printk(KERN_INFO "Sending TERM Request Manually !\n"); | ||
| 1597 | send_ppp_term_request(card->wandev.dev); | ||
| 1598 | } | ||
| 1599 | break; | ||
| 1600 | |||
| 1601 | case EXCEP_TRC_DISABLED: | ||
| 1602 | printk(KERN_INFO "%s: Line trace disabled\n", | ||
| 1603 | card->devname); | ||
| 1604 | break; | ||
| 1605 | |||
| 1606 | case EXCEP_IRQ_TIMEOUT: | ||
| 1607 | printk(KERN_INFO "%s: IRQ timeout occurred\n", | ||
| 1608 | card->devname); | ||
| 1609 | break; | ||
| 1610 | |||
| 1611 | default: | ||
| 1612 | printk(KERN_INFO "%s: Global exception %x\n", | ||
| 1613 | card->devname, mbox->return_code); | ||
| 1614 | break; | ||
| 1615 | } | ||
| 1616 | } | ||
| 1617 | return 0; | ||
| 1618 | } | ||
| 1619 | |||
| 1620 | |||
| 1621 | /*============================================================================ | ||
| 1622 | * Process chdlc exception condition | ||
| 1623 | */ | ||
| 1624 | static int process_chdlc_exception(sdla_t *card) | ||
| 1625 | { | ||
| 1626 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 1627 | int err; | ||
| 1628 | |||
| 1629 | mb->buffer_length = 0; | ||
| 1630 | mb->command = READ_CHDLC_EXCEPTION_CONDITION; | ||
| 1631 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1632 | if(err != CMD_TIMEOUT) { | ||
| 1633 | |||
| 1634 | switch (err) { | ||
| 1635 | |||
| 1636 | case EXCEP_LINK_ACTIVE: | ||
| 1637 | port_set_state(card, WAN_CONNECTED); | ||
| 1638 | break; | ||
| 1639 | |||
| 1640 | case EXCEP_LINK_INACTIVE_MODEM: | ||
| 1641 | port_set_state(card, WAN_DISCONNECTED); | ||
| 1642 | break; | ||
| 1643 | |||
| 1644 | case EXCEP_LOOPBACK_CONDITION: | ||
| 1645 | printk(KERN_INFO "%s: Loopback Condition Detected.\n", | ||
| 1646 | card->devname); | ||
| 1647 | break; | ||
| 1648 | |||
| 1649 | case NO_CHDLC_EXCEP_COND_TO_REPORT: | ||
| 1650 | printk(KERN_INFO "%s: No exceptions reported.\n", | ||
| 1651 | card->devname); | ||
| 1652 | break; | ||
| 1653 | default: | ||
| 1654 | printk(KERN_INFO "%s: Exception Condition %x!\n", | ||
| 1655 | card->devname,err); | ||
| 1656 | break; | ||
| 1657 | } | ||
| 1658 | |||
| 1659 | } | ||
| 1660 | return 0; | ||
| 1661 | } | ||
| 1662 | |||
| 1663 | |||
| 1664 | /*============================================================================= | ||
| 1665 | * Store a UDP management packet for later processing. | ||
| 1666 | */ | ||
| 1667 | |||
| 1668 | static int store_udp_mgmt_pkt(char udp_pkt_src, sdla_t* card, | ||
| 1669 | struct sk_buff *skb, struct net_device* dev, | ||
| 1670 | chdlc_private_area_t* chdlc_priv_area ) | ||
| 1671 | { | ||
| 1672 | int udp_pkt_stored = 0; | ||
| 1673 | |||
| 1674 | if(!chdlc_priv_area->udp_pkt_lgth && | ||
| 1675 | (skb->len <= MAX_LGTH_UDP_MGNT_PKT)) { | ||
| 1676 | chdlc_priv_area->udp_pkt_lgth = skb->len; | ||
| 1677 | chdlc_priv_area->udp_pkt_src = udp_pkt_src; | ||
| 1678 | memcpy(chdlc_priv_area->udp_pkt_data, skb->data, skb->len); | ||
| 1679 | chdlc_priv_area->timer_int_enabled = TMR_INT_ENABLED_UDP; | ||
| 1680 | udp_pkt_stored = 1; | ||
| 1681 | } | ||
| 1682 | |||
| 1683 | if(udp_pkt_src == UDP_PKT_FRM_STACK) | ||
| 1684 | dev_kfree_skb_any(skb); | ||
| 1685 | else | ||
| 1686 | dev_kfree_skb_any(skb); | ||
| 1687 | |||
| 1688 | return(udp_pkt_stored); | ||
| 1689 | } | ||
| 1690 | |||
| 1691 | |||
| 1692 | /*============================================================================= | ||
| 1693 | * Process UDP management packet. | ||
| 1694 | */ | ||
| 1695 | |||
| 1696 | static int process_udp_mgmt_pkt(sdla_t* card, struct net_device* dev, | ||
| 1697 | chdlc_private_area_t* chdlc_priv_area ) | ||
| 1698 | { | ||
| 1699 | unsigned char *buf; | ||
| 1700 | unsigned int frames, len; | ||
| 1701 | struct sk_buff *new_skb; | ||
| 1702 | unsigned short buffer_length, real_len; | ||
| 1703 | unsigned long data_ptr; | ||
| 1704 | unsigned data_length; | ||
| 1705 | int udp_mgmt_req_valid = 1; | ||
| 1706 | CHDLC_MAILBOX_STRUCT *mb = card->mbox; | ||
| 1707 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 1708 | chdlc_udp_pkt_t *chdlc_udp_pkt; | ||
| 1709 | struct timeval tv; | ||
| 1710 | int err; | ||
| 1711 | char ut_char; | ||
| 1712 | |||
| 1713 | chdlc_udp_pkt = (chdlc_udp_pkt_t *) chdlc_priv_area->udp_pkt_data; | ||
| 1714 | |||
| 1715 | if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 1716 | |||
| 1717 | switch(chdlc_udp_pkt->cblock.command) { | ||
| 1718 | case READ_GLOBAL_STATISTICS: | ||
| 1719 | case READ_MODEM_STATUS: | ||
| 1720 | case READ_CHDLC_LINK_STATUS: | ||
| 1721 | case CPIPE_ROUTER_UP_TIME: | ||
| 1722 | case READ_COMMS_ERROR_STATS: | ||
| 1723 | case READ_CHDLC_OPERATIONAL_STATS: | ||
| 1724 | |||
| 1725 | /* These two commands are executed for | ||
| 1726 | * each request */ | ||
| 1727 | case READ_CHDLC_CONFIGURATION: | ||
| 1728 | case READ_CHDLC_CODE_VERSION: | ||
| 1729 | udp_mgmt_req_valid = 1; | ||
| 1730 | break; | ||
| 1731 | default: | ||
| 1732 | udp_mgmt_req_valid = 0; | ||
| 1733 | break; | ||
| 1734 | } | ||
| 1735 | } | ||
| 1736 | |||
| 1737 | if(!udp_mgmt_req_valid) { | ||
| 1738 | |||
| 1739 | /* set length to 0 */ | ||
| 1740 | chdlc_udp_pkt->cblock.buffer_length = 0; | ||
| 1741 | |||
| 1742 | /* set return code */ | ||
| 1743 | chdlc_udp_pkt->cblock.return_code = 0xCD; | ||
| 1744 | |||
| 1745 | if (net_ratelimit()){ | ||
| 1746 | printk(KERN_INFO | ||
| 1747 | "%s: Warning, Illegal UDP command attempted from network: %x\n", | ||
| 1748 | card->devname,chdlc_udp_pkt->cblock.command); | ||
| 1749 | } | ||
| 1750 | |||
| 1751 | } else { | ||
| 1752 | unsigned long trace_status_cfg_addr = 0; | ||
| 1753 | TRACE_STATUS_EL_CFG_STRUCT trace_cfg_struct; | ||
| 1754 | TRACE_STATUS_ELEMENT_STRUCT trace_element_struct; | ||
| 1755 | |||
| 1756 | switch(chdlc_udp_pkt->cblock.command) { | ||
| 1757 | |||
| 1758 | case CPIPE_ENABLE_TRACING: | ||
| 1759 | if (!chdlc_priv_area->TracingEnabled) { | ||
| 1760 | |||
| 1761 | /* OPERATE_DATALINE_MONITOR */ | ||
| 1762 | |||
| 1763 | mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT); | ||
| 1764 | mb->command = SET_TRACE_CONFIGURATION; | ||
| 1765 | |||
| 1766 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 1767 | trace_config = TRACE_ACTIVE; | ||
| 1768 | /* Trace delay mode is not used because it slows | ||
| 1769 | down transfer and results in a standoff situation | ||
| 1770 | when there is a lot of data */ | ||
| 1771 | |||
| 1772 | /* Configure the Trace based on user inputs */ | ||
| 1773 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)->trace_config |= | ||
| 1774 | chdlc_udp_pkt->data[0]; | ||
| 1775 | |||
| 1776 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 1777 | trace_deactivation_timer = 4000; | ||
| 1778 | |||
| 1779 | |||
| 1780 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1781 | if (err != COMMAND_OK) { | ||
| 1782 | chdlc_error(card,err,mb); | ||
| 1783 | card->TracingEnabled = 0; | ||
| 1784 | chdlc_udp_pkt->cblock.return_code = err; | ||
| 1785 | mb->buffer_length = 0; | ||
| 1786 | break; | ||
| 1787 | } | ||
| 1788 | |||
| 1789 | /* Get the base address of the trace element list */ | ||
| 1790 | mb->buffer_length = 0; | ||
| 1791 | mb->command = READ_TRACE_CONFIGURATION; | ||
| 1792 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1793 | |||
| 1794 | if (err != COMMAND_OK) { | ||
| 1795 | chdlc_error(card,err,mb); | ||
| 1796 | chdlc_priv_area->TracingEnabled = 0; | ||
| 1797 | chdlc_udp_pkt->cblock.return_code = err; | ||
| 1798 | mb->buffer_length = 0; | ||
| 1799 | break; | ||
| 1800 | } | ||
| 1801 | |||
| 1802 | trace_status_cfg_addr =((LINE_TRACE_CONFIG_STRUCT *) | ||
| 1803 | mb->data) -> ptr_trace_stat_el_cfg_struct; | ||
| 1804 | |||
| 1805 | sdla_peek(&card->hw, trace_status_cfg_addr, | ||
| 1806 | &trace_cfg_struct, sizeof(trace_cfg_struct)); | ||
| 1807 | |||
| 1808 | chdlc_priv_area->start_trace_addr = trace_cfg_struct. | ||
| 1809 | base_addr_trace_status_elements; | ||
| 1810 | |||
| 1811 | chdlc_priv_area->number_trace_elements = | ||
| 1812 | trace_cfg_struct.number_trace_status_elements; | ||
| 1813 | |||
| 1814 | chdlc_priv_area->end_trace_addr = (unsigned long) | ||
| 1815 | ((TRACE_STATUS_ELEMENT_STRUCT *) | ||
| 1816 | chdlc_priv_area->start_trace_addr + | ||
| 1817 | (chdlc_priv_area->number_trace_elements - 1)); | ||
| 1818 | |||
| 1819 | chdlc_priv_area->base_addr_trace_buffer = | ||
| 1820 | trace_cfg_struct.base_addr_trace_buffer; | ||
| 1821 | |||
| 1822 | chdlc_priv_area->end_addr_trace_buffer = | ||
| 1823 | trace_cfg_struct.end_addr_trace_buffer; | ||
| 1824 | |||
| 1825 | chdlc_priv_area->curr_trace_addr = | ||
| 1826 | trace_cfg_struct.next_trace_element_to_use; | ||
| 1827 | |||
| 1828 | chdlc_priv_area->available_buffer_space = 2000 - | ||
| 1829 | sizeof(ip_pkt_t) - | ||
| 1830 | sizeof(udp_pkt_t) - | ||
| 1831 | sizeof(wp_mgmt_t) - | ||
| 1832 | sizeof(cblock_t) - | ||
| 1833 | sizeof(trace_info_t); | ||
| 1834 | } | ||
| 1835 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 1836 | mb->buffer_length = 0; | ||
| 1837 | chdlc_priv_area->TracingEnabled = 1; | ||
| 1838 | break; | ||
| 1839 | |||
| 1840 | |||
| 1841 | case CPIPE_DISABLE_TRACING: | ||
| 1842 | if (chdlc_priv_area->TracingEnabled) { | ||
| 1843 | |||
| 1844 | /* OPERATE_DATALINE_MONITOR */ | ||
| 1845 | mb->buffer_length = sizeof(LINE_TRACE_CONFIG_STRUCT); | ||
| 1846 | mb->command = SET_TRACE_CONFIGURATION; | ||
| 1847 | ((LINE_TRACE_CONFIG_STRUCT *)mb->data)-> | ||
| 1848 | trace_config = TRACE_INACTIVE; | ||
| 1849 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 1850 | } | ||
| 1851 | |||
| 1852 | chdlc_priv_area->TracingEnabled = 0; | ||
| 1853 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 1854 | mb->buffer_length = 0; | ||
| 1855 | break; | ||
| 1856 | |||
| 1857 | |||
| 1858 | case CPIPE_GET_TRACE_INFO: | ||
| 1859 | |||
| 1860 | if (!chdlc_priv_area->TracingEnabled) { | ||
| 1861 | chdlc_udp_pkt->cblock.return_code = 1; | ||
| 1862 | mb->buffer_length = 0; | ||
| 1863 | break; | ||
| 1864 | } | ||
| 1865 | |||
| 1866 | chdlc_udp_pkt->trace_info.ismoredata = 0x00; | ||
| 1867 | buffer_length = 0; /* offset of packet already occupied */ | ||
| 1868 | |||
| 1869 | for (frames=0; frames < chdlc_priv_area->number_trace_elements; frames++){ | ||
| 1870 | |||
| 1871 | trace_pkt_t *trace_pkt = (trace_pkt_t *) | ||
| 1872 | &chdlc_udp_pkt->data[buffer_length]; | ||
| 1873 | |||
| 1874 | sdla_peek(&card->hw, chdlc_priv_area->curr_trace_addr, | ||
| 1875 | (unsigned char *)&trace_element_struct, | ||
| 1876 | sizeof(TRACE_STATUS_ELEMENT_STRUCT)); | ||
| 1877 | |||
| 1878 | if (trace_element_struct.opp_flag == 0x00) { | ||
| 1879 | break; | ||
| 1880 | } | ||
| 1881 | |||
| 1882 | /* get pointer to real data */ | ||
| 1883 | data_ptr = trace_element_struct.ptr_data_bfr; | ||
| 1884 | |||
| 1885 | /* See if there is actual data on the trace buffer */ | ||
| 1886 | if (data_ptr){ | ||
| 1887 | data_length = trace_element_struct.trace_length; | ||
| 1888 | }else{ | ||
| 1889 | data_length = 0; | ||
| 1890 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 1891 | } | ||
| 1892 | |||
| 1893 | if( (chdlc_priv_area->available_buffer_space - buffer_length) | ||
| 1894 | < ( sizeof(trace_pkt_t) + data_length) ) { | ||
| 1895 | |||
| 1896 | /* indicate there are more frames on board & exit */ | ||
| 1897 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 1898 | break; | ||
| 1899 | } | ||
| 1900 | |||
| 1901 | trace_pkt->status = trace_element_struct.trace_type; | ||
| 1902 | |||
| 1903 | trace_pkt->time_stamp = | ||
| 1904 | trace_element_struct.trace_time_stamp; | ||
| 1905 | |||
| 1906 | trace_pkt->real_length = | ||
| 1907 | trace_element_struct.trace_length; | ||
| 1908 | |||
| 1909 | /* see if we can fit the frame into the user buffer */ | ||
| 1910 | real_len = trace_pkt->real_length; | ||
| 1911 | |||
| 1912 | if (data_ptr == 0) { | ||
| 1913 | trace_pkt->data_avail = 0x00; | ||
| 1914 | } else { | ||
| 1915 | unsigned tmp = 0; | ||
| 1916 | |||
| 1917 | /* get the data from circular buffer | ||
| 1918 | must check for end of buffer */ | ||
| 1919 | trace_pkt->data_avail = 0x01; | ||
| 1920 | |||
| 1921 | if ((data_ptr + real_len) > | ||
| 1922 | chdlc_priv_area->end_addr_trace_buffer + 1){ | ||
| 1923 | |||
| 1924 | tmp = chdlc_priv_area->end_addr_trace_buffer - data_ptr + 1; | ||
| 1925 | sdla_peek(&card->hw, data_ptr, | ||
| 1926 | trace_pkt->data,tmp); | ||
| 1927 | data_ptr = chdlc_priv_area->base_addr_trace_buffer; | ||
| 1928 | } | ||
| 1929 | |||
| 1930 | sdla_peek(&card->hw, data_ptr, | ||
| 1931 | &trace_pkt->data[tmp], real_len - tmp); | ||
| 1932 | } | ||
| 1933 | |||
| 1934 | /* zero the opp flag to show we got the frame */ | ||
| 1935 | ut_char = 0x00; | ||
| 1936 | sdla_poke(&card->hw, chdlc_priv_area->curr_trace_addr, &ut_char, 1); | ||
| 1937 | |||
| 1938 | /* now move onto the next frame */ | ||
| 1939 | chdlc_priv_area->curr_trace_addr += sizeof(TRACE_STATUS_ELEMENT_STRUCT); | ||
| 1940 | |||
| 1941 | /* check if we went over the last address */ | ||
| 1942 | if ( chdlc_priv_area->curr_trace_addr > chdlc_priv_area->end_trace_addr ) { | ||
| 1943 | chdlc_priv_area->curr_trace_addr = chdlc_priv_area->start_trace_addr; | ||
| 1944 | } | ||
| 1945 | |||
| 1946 | if(trace_pkt->data_avail == 0x01) { | ||
| 1947 | buffer_length += real_len - 1; | ||
| 1948 | } | ||
| 1949 | |||
| 1950 | /* for the header */ | ||
| 1951 | buffer_length += sizeof(trace_pkt_t); | ||
| 1952 | |||
| 1953 | } /* For Loop */ | ||
| 1954 | |||
| 1955 | if (frames == chdlc_priv_area->number_trace_elements){ | ||
| 1956 | chdlc_udp_pkt->trace_info.ismoredata = 0x01; | ||
| 1957 | } | ||
| 1958 | chdlc_udp_pkt->trace_info.num_frames = frames; | ||
| 1959 | |||
| 1960 | mb->buffer_length = buffer_length; | ||
| 1961 | chdlc_udp_pkt->cblock.buffer_length = buffer_length; | ||
| 1962 | |||
| 1963 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 1964 | |||
| 1965 | break; | ||
| 1966 | |||
| 1967 | |||
| 1968 | case CPIPE_FT1_READ_STATUS: | ||
| 1969 | ((unsigned char *)chdlc_udp_pkt->data )[0] = | ||
| 1970 | flags->FT1_info_struct.parallel_port_A_input; | ||
| 1971 | |||
| 1972 | ((unsigned char *)chdlc_udp_pkt->data )[1] = | ||
| 1973 | flags->FT1_info_struct.parallel_port_B_input; | ||
| 1974 | |||
| 1975 | chdlc_udp_pkt->cblock.return_code = COMMAND_OK; | ||
| 1976 | mb->buffer_length = 2; | ||
| 1977 | break; | ||
| 1978 | |||
| 1979 | case CPIPE_ROUTER_UP_TIME: | ||
| 1980 | do_gettimeofday( &tv ); | ||
| 1981 | chdlc_priv_area->router_up_time = tv.tv_sec - | ||
| 1982 | chdlc_priv_area->router_start_time; | ||
| 1983 | *(unsigned long *)&chdlc_udp_pkt->data = | ||
| 1984 | chdlc_priv_area->router_up_time; | ||
| 1985 | mb->buffer_length = sizeof(unsigned long); | ||
| 1986 | break; | ||
| 1987 | |||
| 1988 | case FT1_MONITOR_STATUS_CTRL: | ||
| 1989 | /* Enable FT1 MONITOR STATUS */ | ||
| 1990 | if ((chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_STATUS) || | ||
| 1991 | (chdlc_udp_pkt->data[0] & ENABLE_READ_FT1_OP_STATS)) { | ||
| 1992 | |||
| 1993 | if( rCount++ != 0 ) { | ||
| 1994 | chdlc_udp_pkt->cblock. | ||
| 1995 | return_code = COMMAND_OK; | ||
| 1996 | mb->buffer_length = 1; | ||
| 1997 | break; | ||
| 1998 | } | ||
| 1999 | } | ||
| 2000 | |||
| 2001 | /* Disable FT1 MONITOR STATUS */ | ||
| 2002 | if( chdlc_udp_pkt->data[0] == 0) { | ||
| 2003 | |||
| 2004 | if( --rCount != 0) { | ||
| 2005 | chdlc_udp_pkt->cblock. | ||
| 2006 | return_code = COMMAND_OK; | ||
| 2007 | mb->buffer_length = 1; | ||
| 2008 | break; | ||
| 2009 | } | ||
| 2010 | } | ||
| 2011 | |||
| 2012 | default: | ||
| 2013 | /* it's a board command */ | ||
| 2014 | mb->command = chdlc_udp_pkt->cblock.command; | ||
| 2015 | mb->buffer_length = chdlc_udp_pkt->cblock.buffer_length; | ||
| 2016 | if (mb->buffer_length) { | ||
| 2017 | memcpy(&mb->data, (unsigned char *) chdlc_udp_pkt-> | ||
| 2018 | data, mb->buffer_length); | ||
| 2019 | } | ||
| 2020 | /* run the command on the board */ | ||
| 2021 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2022 | if (err != COMMAND_OK) { | ||
| 2023 | break; | ||
| 2024 | } | ||
| 2025 | |||
| 2026 | /* copy the result back to our buffer */ | ||
| 2027 | memcpy(&chdlc_udp_pkt->cblock, mb, sizeof(cblock_t)); | ||
| 2028 | |||
| 2029 | if (mb->buffer_length) { | ||
| 2030 | memcpy(&chdlc_udp_pkt->data, &mb->data, | ||
| 2031 | mb->buffer_length); | ||
| 2032 | } | ||
| 2033 | |||
| 2034 | } /* end of switch */ | ||
| 2035 | } /* end of else */ | ||
| 2036 | |||
| 2037 | /* Fill UDP TTL */ | ||
| 2038 | chdlc_udp_pkt->ip_pkt.ttl = card->wandev.ttl; | ||
| 2039 | |||
| 2040 | len = reply_udp(chdlc_priv_area->udp_pkt_data, mb->buffer_length); | ||
| 2041 | |||
| 2042 | if(chdlc_priv_area->udp_pkt_src == UDP_PKT_FRM_NETWORK) { | ||
| 2043 | if(!chdlc_send(card, chdlc_priv_area->udp_pkt_data, len)) { | ||
| 2044 | ++ card->wandev.stats.tx_packets; | ||
| 2045 | card->wandev.stats.tx_bytes += len; | ||
| 2046 | } | ||
| 2047 | } else { | ||
| 2048 | |||
| 2049 | /* Pass it up the stack | ||
| 2050 | Allocate socket buffer */ | ||
| 2051 | if ((new_skb = dev_alloc_skb(len)) != NULL) { | ||
| 2052 | /* copy data into new_skb */ | ||
| 2053 | |||
| 2054 | buf = skb_put(new_skb, len); | ||
| 2055 | memcpy(buf, chdlc_priv_area->udp_pkt_data, len); | ||
| 2056 | |||
| 2057 | /* Decapsulate pkt and pass it up the protocol stack */ | ||
| 2058 | new_skb->protocol = htons(ETH_P_IP); | ||
| 2059 | new_skb->dev = dev; | ||
| 2060 | new_skb->mac.raw = new_skb->data; | ||
| 2061 | |||
| 2062 | netif_rx(new_skb); | ||
| 2063 | dev->last_rx = jiffies; | ||
| 2064 | } else { | ||
| 2065 | |||
| 2066 | printk(KERN_INFO "%s: no socket buffers available!\n", | ||
| 2067 | card->devname); | ||
| 2068 | } | ||
| 2069 | } | ||
| 2070 | |||
| 2071 | chdlc_priv_area->udp_pkt_lgth = 0; | ||
| 2072 | |||
| 2073 | return 0; | ||
| 2074 | } | ||
| 2075 | |||
| 2076 | /*============================================================================ | ||
| 2077 | * Initialize Receive and Transmit Buffers. | ||
| 2078 | */ | ||
| 2079 | |||
| 2080 | static void init_chdlc_tx_rx_buff(sdla_t* card, struct net_device *dev) | ||
| 2081 | { | ||
| 2082 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 2083 | CHDLC_TX_STATUS_EL_CFG_STRUCT *tx_config; | ||
| 2084 | CHDLC_RX_STATUS_EL_CFG_STRUCT *rx_config; | ||
| 2085 | char err; | ||
| 2086 | |||
| 2087 | mb->buffer_length = 0; | ||
| 2088 | mb->command = READ_CHDLC_CONFIGURATION; | ||
| 2089 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2090 | |||
| 2091 | if(err != COMMAND_OK) { | ||
| 2092 | chdlc_error(card,err,mb); | ||
| 2093 | return; | ||
| 2094 | } | ||
| 2095 | |||
| 2096 | if(card->hw.type == SDLA_S514) { | ||
| 2097 | tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 2098 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 2099 | ptr_CHDLC_Tx_stat_el_cfg_struct)); | ||
| 2100 | rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 2101 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 2102 | ptr_CHDLC_Rx_stat_el_cfg_struct)); | ||
| 2103 | |||
| 2104 | /* Setup Head and Tails for buffers */ | ||
| 2105 | card->u.c.txbuf_base = (void *)(card->hw.dpmbase + | ||
| 2106 | tx_config->base_addr_Tx_status_elements); | ||
| 2107 | card->u.c.txbuf_last = | ||
| 2108 | (CHDLC_DATA_TX_STATUS_EL_STRUCT *) | ||
| 2109 | card->u.c.txbuf_base + | ||
| 2110 | (tx_config->number_Tx_status_elements - 1); | ||
| 2111 | |||
| 2112 | card->u.c.rxbuf_base = (void *)(card->hw.dpmbase + | ||
| 2113 | rx_config->base_addr_Rx_status_elements); | ||
| 2114 | card->u.c.rxbuf_last = | ||
| 2115 | (CHDLC_DATA_RX_STATUS_EL_STRUCT *) | ||
| 2116 | card->u.c.rxbuf_base + | ||
| 2117 | (rx_config->number_Rx_status_elements - 1); | ||
| 2118 | |||
| 2119 | /* Set up next pointer to be used */ | ||
| 2120 | card->u.c.txbuf = (void *)(card->hw.dpmbase + | ||
| 2121 | tx_config->next_Tx_status_element_to_use); | ||
| 2122 | card->u.c.rxmb = (void *)(card->hw.dpmbase + | ||
| 2123 | rx_config->next_Rx_status_element_to_use); | ||
| 2124 | } | ||
| 2125 | else { | ||
| 2126 | tx_config = (CHDLC_TX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 2127 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 2128 | ptr_CHDLC_Tx_stat_el_cfg_struct % SDLA_WINDOWSIZE)); | ||
| 2129 | |||
| 2130 | rx_config = (CHDLC_RX_STATUS_EL_CFG_STRUCT *)(card->hw.dpmbase + | ||
| 2131 | (((CHDLC_CONFIGURATION_STRUCT *)mb->data)-> | ||
| 2132 | ptr_CHDLC_Rx_stat_el_cfg_struct % SDLA_WINDOWSIZE)); | ||
| 2133 | |||
| 2134 | /* Setup Head and Tails for buffers */ | ||
| 2135 | card->u.c.txbuf_base = (void *)(card->hw.dpmbase + | ||
| 2136 | (tx_config->base_addr_Tx_status_elements % SDLA_WINDOWSIZE)); | ||
| 2137 | card->u.c.txbuf_last = | ||
| 2138 | (CHDLC_DATA_TX_STATUS_EL_STRUCT *)card->u.c.txbuf_base | ||
| 2139 | + (tx_config->number_Tx_status_elements - 1); | ||
| 2140 | card->u.c.rxbuf_base = (void *)(card->hw.dpmbase + | ||
| 2141 | (rx_config->base_addr_Rx_status_elements % SDLA_WINDOWSIZE)); | ||
| 2142 | card->u.c.rxbuf_last = | ||
| 2143 | (CHDLC_DATA_RX_STATUS_EL_STRUCT *)card->u.c.rxbuf_base | ||
| 2144 | + (rx_config->number_Rx_status_elements - 1); | ||
| 2145 | |||
| 2146 | /* Set up next pointer to be used */ | ||
| 2147 | card->u.c.txbuf = (void *)(card->hw.dpmbase + | ||
| 2148 | (tx_config->next_Tx_status_element_to_use % SDLA_WINDOWSIZE)); | ||
| 2149 | card->u.c.rxmb = (void *)(card->hw.dpmbase + | ||
| 2150 | (rx_config->next_Rx_status_element_to_use % SDLA_WINDOWSIZE)); | ||
| 2151 | } | ||
| 2152 | |||
| 2153 | /* Setup Actual Buffer Start and end addresses */ | ||
| 2154 | card->u.c.rx_base = rx_config->base_addr_Rx_buffer; | ||
| 2155 | card->u.c.rx_top = rx_config->end_addr_Rx_buffer; | ||
| 2156 | |||
| 2157 | } | ||
| 2158 | |||
| 2159 | /*============================================================================= | ||
| 2160 | * Perform Interrupt Test by running READ_CHDLC_CODE_VERSION command MAX_INTR | ||
| 2161 | * _TEST_COUNTER times. | ||
| 2162 | */ | ||
| 2163 | static int intr_test( sdla_t* card) | ||
| 2164 | { | ||
| 2165 | CHDLC_MAILBOX_STRUCT* mb = card->mbox; | ||
| 2166 | int err,i; | ||
| 2167 | |||
| 2168 | Intr_test_counter = 0; | ||
| 2169 | |||
| 2170 | /* The critical flag is unset because during initialization (if_open) | ||
| 2171 | * we want the interrupts to be enabled so that when the wpc_isr is | ||
| 2172 | * called it does not exit due to critical flag set. | ||
| 2173 | */ | ||
| 2174 | |||
| 2175 | err = chdlc_set_intr_mode(card, APP_INT_ON_COMMAND_COMPLETE); | ||
| 2176 | |||
| 2177 | if (err == CMD_OK) { | ||
| 2178 | for (i = 0; i < MAX_INTR_TEST_COUNTER; i ++) { | ||
| 2179 | mb->buffer_length = 0; | ||
| 2180 | mb->command = READ_CHDLC_CODE_VERSION; | ||
| 2181 | err = sdla_exec(mb) ? mb->return_code : CMD_TIMEOUT; | ||
| 2182 | } | ||
| 2183 | } | ||
| 2184 | else { | ||
| 2185 | return err; | ||
| 2186 | } | ||
| 2187 | |||
| 2188 | err = chdlc_set_intr_mode(card, 0); | ||
| 2189 | |||
| 2190 | if (err != CMD_OK) | ||
| 2191 | return err; | ||
| 2192 | |||
| 2193 | return 0; | ||
| 2194 | } | ||
| 2195 | |||
| 2196 | /*============================================================================== | ||
| 2197 | * Determine what type of UDP call it is. CPIPEAB ? | ||
| 2198 | */ | ||
| 2199 | static int udp_pkt_type(struct sk_buff *skb, sdla_t* card) | ||
| 2200 | { | ||
| 2201 | chdlc_udp_pkt_t *chdlc_udp_pkt = (chdlc_udp_pkt_t *)skb->data; | ||
| 2202 | |||
| 2203 | if (!strncmp(chdlc_udp_pkt->wp_mgmt.signature,UDPMGMT_SIGNATURE,8) && | ||
| 2204 | (chdlc_udp_pkt->udp_pkt.udp_dst_port == ntohs(card->wandev.udp_port)) && | ||
| 2205 | (chdlc_udp_pkt->ip_pkt.protocol == UDPMGMT_UDP_PROTOCOL) && | ||
| 2206 | (chdlc_udp_pkt->wp_mgmt.request_reply == UDPMGMT_REQUEST)) { | ||
| 2207 | return UDP_CPIPE_TYPE; | ||
| 2208 | } | ||
| 2209 | else return UDP_INVALID_TYPE; | ||
| 2210 | } | ||
| 2211 | |||
| 2212 | /*============================================================================ | ||
| 2213 | * Set PORT state. | ||
| 2214 | */ | ||
| 2215 | static void port_set_state (sdla_t *card, int state) | ||
| 2216 | { | ||
| 2217 | struct net_device *dev = card->wandev.dev; | ||
| 2218 | chdlc_private_area_t *chdlc_priv_area = dev->priv; | ||
| 2219 | |||
| 2220 | if (card->u.c.state != state) | ||
| 2221 | { | ||
| 2222 | switch (state) | ||
| 2223 | { | ||
| 2224 | case WAN_CONNECTED: | ||
| 2225 | printk (KERN_INFO "%s: HDLC link connected!\n", | ||
| 2226 | card->devname); | ||
| 2227 | break; | ||
| 2228 | |||
| 2229 | case WAN_CONNECTING: | ||
| 2230 | printk (KERN_INFO "%s: HDLC link connecting...\n", | ||
| 2231 | card->devname); | ||
| 2232 | break; | ||
| 2233 | |||
| 2234 | case WAN_DISCONNECTED: | ||
| 2235 | printk (KERN_INFO "%s: HDLC link disconnected!\n", | ||
| 2236 | card->devname); | ||
| 2237 | break; | ||
| 2238 | } | ||
| 2239 | |||
| 2240 | card->wandev.state = card->u.c.state = state; | ||
| 2241 | chdlc_priv_area->common.state = state; | ||
| 2242 | } | ||
| 2243 | } | ||
| 2244 | |||
| 2245 | void s508_lock (sdla_t *card, unsigned long *smp_flags) | ||
| 2246 | { | ||
| 2247 | spin_lock_irqsave(&card->wandev.lock, *smp_flags); | ||
| 2248 | if (card->next){ | ||
| 2249 | /* It is ok to use spin_lock here, since we | ||
| 2250 | * already turned off interrupts */ | ||
| 2251 | spin_lock(&card->next->wandev.lock); | ||
| 2252 | } | ||
| 2253 | } | ||
| 2254 | |||
| 2255 | void s508_unlock (sdla_t *card, unsigned long *smp_flags) | ||
| 2256 | { | ||
| 2257 | if (card->next){ | ||
| 2258 | spin_unlock(&card->next->wandev.lock); | ||
| 2259 | } | ||
| 2260 | spin_unlock_irqrestore(&card->wandev.lock, *smp_flags); | ||
| 2261 | } | ||
| 2262 | |||
| 2263 | |||
| 2264 | |||
| 2265 | /*=========================================================================== | ||
| 2266 | * config_chdlc | ||
| 2267 | * | ||
| 2268 | * Configure the chdlc protocol and enable communications. | ||
| 2269 | * | ||
| 2270 | * The if_open() function binds this function to the poll routine. | ||
| 2271 | * Therefore, this function will run every time the chdlc interface | ||
| 2272 | * is brought up. We cannot run this function from the if_open | ||
| 2273 | * because if_open does not have access to the remote IP address. | ||
| 2274 | * | ||
| 2275 | * If the communications are not enabled, proceed to configure | ||
| 2276 | * the card and enable communications. | ||
| 2277 | * | ||
| 2278 | * If the communications are enabled, it means that the interface | ||
| 2279 | * was shutdown by ether the user or driver. In this case, we | ||
| 2280 | * have to check that the IP addresses have not changed. If | ||
| 2281 | * the IP addresses have changed, we have to reconfigure the firmware | ||
| 2282 | * and update the changed IP addresses. Otherwise, just exit. | ||
| 2283 | * | ||
| 2284 | */ | ||
| 2285 | |||
| 2286 | static int config_chdlc (sdla_t *card) | ||
| 2287 | { | ||
| 2288 | struct net_device *dev = card->wandev.dev; | ||
| 2289 | SHARED_MEMORY_INFO_STRUCT *flags = card->u.c.flags; | ||
| 2290 | |||
| 2291 | if (card->u.c.comm_enabled){ | ||
| 2292 | chdlc_comm_disable(card); | ||
| 2293 | port_set_state(card, WAN_DISCONNECTED); | ||
| 2294 | } | ||
| 2295 | |||
| 2296 | if (set_chdlc_config(card)) { | ||
| 2297 | printk(KERN_INFO "%s: CHDLC Configuration Failed!\n", | ||
| 2298 | card->devname); | ||
| 2299 | return 0; | ||
| 2300 | } | ||
| 2301 | init_chdlc_tx_rx_buff(card, dev); | ||
| 2302 | |||
| 2303 | /* Set interrupt mode and mask */ | ||
| 2304 | if (chdlc_set_intr_mode(card, APP_INT_ON_RX_FRAME | | ||
| 2305 | APP_INT_ON_GLOBAL_EXCEP_COND | | ||
| 2306 | APP_INT_ON_TX_FRAME | | ||
| 2307 | APP_INT_ON_CHDLC_EXCEP_COND | APP_INT_ON_TIMER)){ | ||
| 2308 | printk (KERN_INFO "%s: Failed to set interrupt triggers!\n", | ||
| 2309 | card->devname); | ||
| 2310 | return 0; | ||
| 2311 | } | ||
| 2312 | |||
| 2313 | |||
| 2314 | /* Mask the Transmit and Timer interrupt */ | ||
| 2315 | flags->interrupt_info_struct.interrupt_permission &= | ||
| 2316 | ~(APP_INT_ON_TX_FRAME | APP_INT_ON_TIMER); | ||
| 2317 | |||
| 2318 | |||
| 2319 | if (chdlc_comm_enable(card) != 0) { | ||
| 2320 | printk(KERN_INFO "%s: Failed to enable chdlc communications!\n", | ||
| 2321 | card->devname); | ||
| 2322 | flags->interrupt_info_struct.interrupt_permission = 0; | ||
| 2323 | card->u.c.comm_enabled=0; | ||
| 2324 | chdlc_set_intr_mode(card,0); | ||
| 2325 | return 0; | ||
| 2326 | } | ||
| 2327 | |||
| 2328 | /* Initialize Rx/Tx buffer control fields */ | ||
| 2329 | port_set_state(card, WAN_CONNECTING); | ||
| 2330 | return 0; | ||
| 2331 | } | ||
| 2332 | |||
| 2333 | |||
| 2334 | static void send_ppp_term_request(struct net_device *dev) | ||
| 2335 | { | ||
| 2336 | struct sk_buff *new_skb; | ||
| 2337 | unsigned char *buf; | ||
| 2338 | |||
| 2339 | if ((new_skb = dev_alloc_skb(8)) != NULL) { | ||
| 2340 | /* copy data into new_skb */ | ||
| 2341 | |||
| 2342 | buf = skb_put(new_skb, 8); | ||
| 2343 | sprintf(buf,"%c%c%c%c%c%c%c%c", 0xFF,0x03,0xC0,0x21,0x05,0x98,0x00,0x07); | ||
| 2344 | |||
| 2345 | /* Decapsulate pkt and pass it up the protocol stack */ | ||
| 2346 | new_skb->protocol = htons(ETH_P_WAN_PPP); | ||
| 2347 | new_skb->dev = dev; | ||
| 2348 | new_skb->mac.raw = new_skb->data; | ||
| 2349 | |||
| 2350 | netif_rx(new_skb); | ||
| 2351 | dev->last_rx = jiffies; | ||
| 2352 | } | ||
| 2353 | } | ||
| 2354 | |||
| 2355 | |||
| 2356 | MODULE_LICENSE("GPL"); | ||
| 2357 | |||
| 2358 | /****** End ****************************************************************/ | ||
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 6e79f5675b0d..638004546700 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c | |||
| @@ -360,9 +360,6 @@ static int __init rpaphp_init(void) | |||
| 360 | while ((dn = of_find_node_by_type(dn, "pci"))) | 360 | while ((dn = of_find_node_by_type(dn, "pci"))) |
| 361 | rpaphp_add_slot(dn); | 361 | rpaphp_add_slot(dn); |
| 362 | 362 | ||
| 363 | if (!num_slots) | ||
| 364 | return -ENODEV; | ||
| 365 | |||
| 366 | return 0; | 363 | return 0; |
| 367 | } | 364 | } |
| 368 | 365 | ||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index a77e79c8c82e..2087a397ef16 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -504,6 +504,201 @@ void pci_scan_msi_device(struct pci_dev *dev) | |||
| 504 | nr_reserved_vectors++; | 504 | nr_reserved_vectors++; |
| 505 | } | 505 | } |
| 506 | 506 | ||
| 507 | #ifdef CONFIG_PM | ||
| 508 | int pci_save_msi_state(struct pci_dev *dev) | ||
| 509 | { | ||
| 510 | int pos, i = 0; | ||
| 511 | u16 control; | ||
| 512 | struct pci_cap_saved_state *save_state; | ||
| 513 | u32 *cap; | ||
| 514 | |||
| 515 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
| 516 | if (pos <= 0 || dev->no_msi) | ||
| 517 | return 0; | ||
| 518 | |||
| 519 | pci_read_config_word(dev, msi_control_reg(pos), &control); | ||
| 520 | if (!(control & PCI_MSI_FLAGS_ENABLE)) | ||
| 521 | return 0; | ||
| 522 | |||
| 523 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u32) * 5, | ||
| 524 | GFP_KERNEL); | ||
| 525 | if (!save_state) { | ||
| 526 | printk(KERN_ERR "Out of memory in pci_save_msi_state\n"); | ||
| 527 | return -ENOMEM; | ||
| 528 | } | ||
| 529 | cap = &save_state->data[0]; | ||
| 530 | |||
| 531 | pci_read_config_dword(dev, pos, &cap[i++]); | ||
| 532 | control = cap[0] >> 16; | ||
| 533 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, &cap[i++]); | ||
| 534 | if (control & PCI_MSI_FLAGS_64BIT) { | ||
| 535 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, &cap[i++]); | ||
| 536 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_64, &cap[i++]); | ||
| 537 | } else | ||
| 538 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_32, &cap[i++]); | ||
| 539 | if (control & PCI_MSI_FLAGS_MASKBIT) | ||
| 540 | pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT, &cap[i++]); | ||
| 541 | disable_msi_mode(dev, pos, PCI_CAP_ID_MSI); | ||
| 542 | save_state->cap_nr = PCI_CAP_ID_MSI; | ||
| 543 | pci_add_saved_cap(dev, save_state); | ||
| 544 | return 0; | ||
| 545 | } | ||
| 546 | |||
| 547 | void pci_restore_msi_state(struct pci_dev *dev) | ||
| 548 | { | ||
| 549 | int i = 0, pos; | ||
| 550 | u16 control; | ||
| 551 | struct pci_cap_saved_state *save_state; | ||
| 552 | u32 *cap; | ||
| 553 | |||
| 554 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSI); | ||
| 555 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
| 556 | if (!save_state || pos <= 0) | ||
| 557 | return; | ||
| 558 | cap = &save_state->data[0]; | ||
| 559 | |||
| 560 | control = cap[i++] >> 16; | ||
| 561 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, cap[i++]); | ||
| 562 | if (control & PCI_MSI_FLAGS_64BIT) { | ||
| 563 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, cap[i++]); | ||
| 564 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_64, cap[i++]); | ||
| 565 | } else | ||
| 566 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_32, cap[i++]); | ||
| 567 | if (control & PCI_MSI_FLAGS_MASKBIT) | ||
| 568 | pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT, cap[i++]); | ||
| 569 | pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); | ||
| 570 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); | ||
| 571 | pci_remove_saved_cap(save_state); | ||
| 572 | kfree(save_state); | ||
| 573 | } | ||
| 574 | |||
| 575 | int pci_save_msix_state(struct pci_dev *dev) | ||
| 576 | { | ||
| 577 | int pos; | ||
| 578 | u16 control; | ||
| 579 | struct pci_cap_saved_state *save_state; | ||
| 580 | |||
| 581 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
| 582 | if (pos <= 0 || dev->no_msi) | ||
| 583 | return 0; | ||
| 584 | |||
| 585 | pci_read_config_word(dev, msi_control_reg(pos), &control); | ||
| 586 | if (!(control & PCI_MSIX_FLAGS_ENABLE)) | ||
| 587 | return 0; | ||
| 588 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u16), | ||
| 589 | GFP_KERNEL); | ||
| 590 | if (!save_state) { | ||
| 591 | printk(KERN_ERR "Out of memory in pci_save_msix_state\n"); | ||
| 592 | return -ENOMEM; | ||
| 593 | } | ||
| 594 | *((u16 *)&save_state->data[0]) = control; | ||
| 595 | |||
| 596 | disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX); | ||
| 597 | save_state->cap_nr = PCI_CAP_ID_MSIX; | ||
| 598 | pci_add_saved_cap(dev, save_state); | ||
| 599 | return 0; | ||
| 600 | } | ||
| 601 | |||
| 602 | void pci_restore_msix_state(struct pci_dev *dev) | ||
| 603 | { | ||
| 604 | u16 save; | ||
| 605 | int pos; | ||
| 606 | int vector, head, tail = 0; | ||
| 607 | void __iomem *base; | ||
| 608 | int j; | ||
| 609 | struct msg_address address; | ||
| 610 | struct msg_data data; | ||
| 611 | struct msi_desc *entry; | ||
| 612 | int temp; | ||
| 613 | struct pci_cap_saved_state *save_state; | ||
| 614 | |||
| 615 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSIX); | ||
| 616 | if (!save_state) | ||
| 617 | return; | ||
| 618 | save = *((u16 *)&save_state->data[0]); | ||
| 619 | pci_remove_saved_cap(save_state); | ||
| 620 | kfree(save_state); | ||
| 621 | |||
| 622 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
| 623 | if (pos <= 0) | ||
| 624 | return; | ||
| 625 | |||
| 626 | /* route the table */ | ||
| 627 | temp = dev->irq; | ||
| 628 | if (msi_lookup_vector(dev, PCI_CAP_ID_MSIX)) | ||
| 629 | return; | ||
| 630 | vector = head = dev->irq; | ||
| 631 | while (head != tail) { | ||
| 632 | entry = msi_desc[vector]; | ||
| 633 | base = entry->mask_base; | ||
| 634 | j = entry->msi_attrib.entry_nr; | ||
| 635 | |||
| 636 | msi_address_init(&address); | ||
| 637 | msi_data_init(&data, vector); | ||
| 638 | |||
| 639 | address.lo_address.value &= MSI_ADDRESS_DEST_ID_MASK; | ||
| 640 | address.lo_address.value |= entry->msi_attrib.current_cpu << | ||
| 641 | MSI_TARGET_CPU_SHIFT; | ||
| 642 | |||
| 643 | writel(address.lo_address.value, | ||
| 644 | base + j * PCI_MSIX_ENTRY_SIZE + | ||
| 645 | PCI_MSIX_ENTRY_LOWER_ADDR_OFFSET); | ||
| 646 | writel(address.hi_address, | ||
| 647 | base + j * PCI_MSIX_ENTRY_SIZE + | ||
| 648 | PCI_MSIX_ENTRY_UPPER_ADDR_OFFSET); | ||
| 649 | writel(*(u32*)&data, | ||
| 650 | base + j * PCI_MSIX_ENTRY_SIZE + | ||
| 651 | PCI_MSIX_ENTRY_DATA_OFFSET); | ||
| 652 | |||
| 653 | tail = msi_desc[vector]->link.tail; | ||
| 654 | vector = tail; | ||
| 655 | } | ||
| 656 | dev->irq = temp; | ||
| 657 | |||
| 658 | pci_write_config_word(dev, msi_control_reg(pos), save); | ||
| 659 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX); | ||
| 660 | } | ||
| 661 | #endif | ||
| 662 | |||
| 663 | static void msi_register_init(struct pci_dev *dev, struct msi_desc *entry) | ||
| 664 | { | ||
| 665 | struct msg_address address; | ||
| 666 | struct msg_data data; | ||
| 667 | int pos, vector = dev->irq; | ||
| 668 | u16 control; | ||
| 669 | |||
| 670 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
| 671 | pci_read_config_word(dev, msi_control_reg(pos), &control); | ||
| 672 | /* Configure MSI capability structure */ | ||
| 673 | msi_address_init(&address); | ||
| 674 | msi_data_init(&data, vector); | ||
| 675 | entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >> | ||
| 676 | MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK); | ||
| 677 | pci_write_config_dword(dev, msi_lower_address_reg(pos), | ||
| 678 | address.lo_address.value); | ||
| 679 | if (is_64bit_address(control)) { | ||
| 680 | pci_write_config_dword(dev, | ||
| 681 | msi_upper_address_reg(pos), address.hi_address); | ||
| 682 | pci_write_config_word(dev, | ||
| 683 | msi_data_reg(pos, 1), *((u32*)&data)); | ||
| 684 | } else | ||
| 685 | pci_write_config_word(dev, | ||
| 686 | msi_data_reg(pos, 0), *((u32*)&data)); | ||
| 687 | if (entry->msi_attrib.maskbit) { | ||
| 688 | unsigned int maskbits, temp; | ||
| 689 | /* All MSIs are unmasked by default, Mask them all */ | ||
| 690 | pci_read_config_dword(dev, | ||
| 691 | msi_mask_bits_reg(pos, is_64bit_address(control)), | ||
| 692 | &maskbits); | ||
| 693 | temp = (1 << multi_msi_capable(control)); | ||
| 694 | temp = ((temp - 1) & ~temp); | ||
| 695 | maskbits |= temp; | ||
| 696 | pci_write_config_dword(dev, | ||
| 697 | msi_mask_bits_reg(pos, is_64bit_address(control)), | ||
| 698 | maskbits); | ||
| 699 | } | ||
| 700 | } | ||
| 701 | |||
| 507 | /** | 702 | /** |
| 508 | * msi_capability_init - configure device's MSI capability structure | 703 | * msi_capability_init - configure device's MSI capability structure |
| 509 | * @dev: pointer to the pci_dev data structure of MSI device function | 704 | * @dev: pointer to the pci_dev data structure of MSI device function |
| @@ -516,8 +711,6 @@ void pci_scan_msi_device(struct pci_dev *dev) | |||
| 516 | static int msi_capability_init(struct pci_dev *dev) | 711 | static int msi_capability_init(struct pci_dev *dev) |
| 517 | { | 712 | { |
| 518 | struct msi_desc *entry; | 713 | struct msi_desc *entry; |
| 519 | struct msg_address address; | ||
| 520 | struct msg_data data; | ||
| 521 | int pos, vector; | 714 | int pos, vector; |
| 522 | u16 control; | 715 | u16 control; |
| 523 | 716 | ||
| @@ -549,33 +742,8 @@ static int msi_capability_init(struct pci_dev *dev) | |||
| 549 | /* Replace with MSI handler */ | 742 | /* Replace with MSI handler */ |
| 550 | irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit); | 743 | irq_handler_init(PCI_CAP_ID_MSI, vector, entry->msi_attrib.maskbit); |
| 551 | /* Configure MSI capability structure */ | 744 | /* Configure MSI capability structure */ |
| 552 | msi_address_init(&address); | 745 | msi_register_init(dev, entry); |
| 553 | msi_data_init(&data, vector); | 746 | |
| 554 | entry->msi_attrib.current_cpu = ((address.lo_address.u.dest_id >> | ||
| 555 | MSI_TARGET_CPU_SHIFT) & MSI_TARGET_CPU_MASK); | ||
| 556 | pci_write_config_dword(dev, msi_lower_address_reg(pos), | ||
| 557 | address.lo_address.value); | ||
| 558 | if (is_64bit_address(control)) { | ||
| 559 | pci_write_config_dword(dev, | ||
| 560 | msi_upper_address_reg(pos), address.hi_address); | ||
| 561 | pci_write_config_word(dev, | ||
| 562 | msi_data_reg(pos, 1), *((u32*)&data)); | ||
| 563 | } else | ||
| 564 | pci_write_config_word(dev, | ||
| 565 | msi_data_reg(pos, 0), *((u32*)&data)); | ||
| 566 | if (entry->msi_attrib.maskbit) { | ||
| 567 | unsigned int maskbits, temp; | ||
| 568 | /* All MSIs are unmasked by default, Mask them all */ | ||
| 569 | pci_read_config_dword(dev, | ||
| 570 | msi_mask_bits_reg(pos, is_64bit_address(control)), | ||
| 571 | &maskbits); | ||
| 572 | temp = (1 << multi_msi_capable(control)); | ||
| 573 | temp = ((temp - 1) & ~temp); | ||
| 574 | maskbits |= temp; | ||
| 575 | pci_write_config_dword(dev, | ||
| 576 | msi_mask_bits_reg(pos, is_64bit_address(control)), | ||
| 577 | maskbits); | ||
| 578 | } | ||
| 579 | attach_msi_entry(entry, vector); | 747 | attach_msi_entry(entry, vector); |
| 580 | /* Set MSI enabled bits */ | 748 | /* Set MSI enabled bits */ |
| 581 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); | 749 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); |
| @@ -731,6 +899,7 @@ int pci_enable_msi(struct pci_dev* dev) | |||
| 731 | vector_irq[dev->irq] = -1; | 899 | vector_irq[dev->irq] = -1; |
| 732 | nr_released_vectors--; | 900 | nr_released_vectors--; |
| 733 | spin_unlock_irqrestore(&msi_lock, flags); | 901 | spin_unlock_irqrestore(&msi_lock, flags); |
| 902 | msi_register_init(dev, msi_desc[dev->irq]); | ||
| 734 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); | 903 | enable_msi_mode(dev, pos, PCI_CAP_ID_MSI); |
| 735 | return 0; | 904 | return 0; |
| 736 | } | 905 | } |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index f22f69ac6445..1456759936c5 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -271,10 +271,12 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) | |||
| 271 | struct pci_driver * drv = pci_dev->driver; | 271 | struct pci_driver * drv = pci_dev->driver; |
| 272 | int i = 0; | 272 | int i = 0; |
| 273 | 273 | ||
| 274 | if (drv && drv->suspend) | 274 | if (drv && drv->suspend) { |
| 275 | i = drv->suspend(pci_dev, state); | 275 | i = drv->suspend(pci_dev, state); |
| 276 | else | 276 | suspend_report_result(drv->suspend, i); |
| 277 | } else { | ||
| 277 | pci_save_state(pci_dev); | 278 | pci_save_state(pci_dev); |
| 279 | } | ||
| 278 | return i; | 280 | return i; |
| 279 | } | 281 | } |
| 280 | 282 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index bea1ad1ad5ba..2329f941a0dc 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -307,9 +307,11 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 307 | * Can enter D0 from any state, but if we can only go deeper | 307 | * Can enter D0 from any state, but if we can only go deeper |
| 308 | * to sleep if we're already in a low power state | 308 | * to sleep if we're already in a low power state |
| 309 | */ | 309 | */ |
| 310 | if (state != PCI_D0 && dev->current_state > state) | 310 | if (state != PCI_D0 && dev->current_state > state) { |
| 311 | printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n", | ||
| 312 | __FUNCTION__, pci_name(dev), state, dev->current_state); | ||
| 311 | return -EINVAL; | 313 | return -EINVAL; |
| 312 | else if (dev->current_state == state) | 314 | } else if (dev->current_state == state) |
| 313 | return 0; /* we're already there */ | 315 | return 0; /* we're already there */ |
| 314 | 316 | ||
| 315 | /* find PCI PM capability in list */ | 317 | /* find PCI PM capability in list */ |
| @@ -444,6 +446,10 @@ pci_save_state(struct pci_dev *dev) | |||
| 444 | /* XXX: 100% dword access ok here? */ | 446 | /* XXX: 100% dword access ok here? */ |
| 445 | for (i = 0; i < 16; i++) | 447 | for (i = 0; i < 16; i++) |
| 446 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); | 448 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); |
| 449 | if ((i = pci_save_msi_state(dev)) != 0) | ||
| 450 | return i; | ||
| 451 | if ((i = pci_save_msix_state(dev)) != 0) | ||
| 452 | return i; | ||
| 447 | return 0; | 453 | return 0; |
| 448 | } | 454 | } |
| 449 | 455 | ||
| @@ -458,6 +464,8 @@ pci_restore_state(struct pci_dev *dev) | |||
| 458 | 464 | ||
| 459 | for (i = 0; i < 16; i++) | 465 | for (i = 0; i < 16; i++) |
| 460 | pci_write_config_dword(dev,i * 4, dev->saved_config_space[i]); | 466 | pci_write_config_dword(dev,i * 4, dev->saved_config_space[i]); |
| 467 | pci_restore_msi_state(dev); | ||
| 468 | pci_restore_msix_state(dev); | ||
| 461 | return 0; | 469 | return 0; |
| 462 | } | 470 | } |
| 463 | 471 | ||
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 8f3fb47ea671..30630cbe2fe3 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -55,6 +55,17 @@ void pci_no_msi(void); | |||
| 55 | static inline void disable_msi_mode(struct pci_dev *dev, int pos, int type) { } | 55 | static inline void disable_msi_mode(struct pci_dev *dev, int pos, int type) { } |
| 56 | static inline void pci_no_msi(void) { } | 56 | static inline void pci_no_msi(void) { } |
| 57 | #endif | 57 | #endif |
| 58 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) | ||
| 59 | int pci_save_msi_state(struct pci_dev *dev); | ||
| 60 | int pci_save_msix_state(struct pci_dev *dev); | ||
| 61 | void pci_restore_msi_state(struct pci_dev *dev); | ||
| 62 | void pci_restore_msix_state(struct pci_dev *dev); | ||
| 63 | #else | ||
| 64 | static inline int pci_save_msi_state(struct pci_dev *dev) { return 0; } | ||
| 65 | static inline int pci_save_msix_state(struct pci_dev *dev) { return 0; } | ||
| 66 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} | ||
| 67 | static inline void pci_restore_msix_state(struct pci_dev *dev) {} | ||
| 68 | #endif | ||
| 58 | 69 | ||
| 59 | extern int pcie_mch_quirk; | 70 | extern int pcie_mch_quirk; |
| 60 | extern struct device_attribute pci_dev_attrs[]; | 71 | extern struct device_attribute pci_dev_attrs[]; |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 4970f47be72c..827550d25c9e 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -592,7 +592,7 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) | |||
| 592 | pci_write_config_byte( dev, AMD8131_MISC, tmp); | 592 | pci_write_config_byte( dev, AMD8131_MISC, tmp); |
| 593 | } | 593 | } |
| 594 | } | 594 | } |
| 595 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, quirk_amd_8131_ioapic ); | 595 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); |
| 596 | 596 | ||
| 597 | static void __init quirk_svw_msi(struct pci_dev *dev) | 597 | static void __init quirk_svw_msi(struct pci_dev *dev) |
| 598 | { | 598 | { |
| @@ -921,6 +921,7 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
| 921 | if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB) { | 921 | if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB) { |
| 922 | switch (dev->subsystem_device) { | 922 | switch (dev->subsystem_device) { |
| 923 | case 0x1882: /* M6V notebook */ | 923 | case 0x1882: /* M6V notebook */ |
| 924 | case 0x1977: /* A6VA notebook */ | ||
| 924 | asus_hides_smbus = 1; | 925 | asus_hides_smbus = 1; |
| 925 | } | 926 | } |
| 926 | } | 927 | } |
| @@ -999,6 +1000,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asu | |||
| 999 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1000 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
| 1000 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1001 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
| 1001 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1002 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
| 1003 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc ); | ||
| 1002 | 1004 | ||
| 1003 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) | 1005 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) |
| 1004 | { | 1006 | { |
diff --git a/drivers/pcmcia/at91_cf.c b/drivers/pcmcia/at91_cf.c index 67cc5f7d0c90..a4d50940ebeb 100644 --- a/drivers/pcmcia/at91_cf.c +++ b/drivers/pcmcia/at91_cf.c | |||
| @@ -28,8 +28,6 @@ | |||
| 28 | #include <asm/arch/gpio.h> | 28 | #include <asm/arch/gpio.h> |
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | #define CF_SIZE 0x30000000 /* CS5+CS6: unavailable */ | ||
| 32 | |||
| 33 | /* | 31 | /* |
| 34 | * A0..A10 work in each range; A23 indicates I/O space; A25 is CFRNW; | 32 | * A0..A10 work in each range; A23 indicates I/O space; A25 is CFRNW; |
| 35 | * some other bit in {A24,A22..A11} is nREG to flag memory access | 33 | * some other bit in {A24,A22..A11} is nREG to flag memory access |
| @@ -76,7 +74,8 @@ static irqreturn_t at91_cf_irq(int irq, void *_cf, struct pt_regs *r) | |||
| 76 | /* kick pccard as needed */ | 74 | /* kick pccard as needed */ |
| 77 | if (present != cf->present) { | 75 | if (present != cf->present) { |
| 78 | cf->present = present; | 76 | cf->present = present; |
| 79 | pr_debug("%s: card %s\n", driver_name, present ? "present" : "gone"); | 77 | pr_debug("%s: card %s\n", driver_name, |
| 78 | present ? "present" : "gone"); | ||
| 80 | pcmcia_parse_events(&cf->socket, SS_DETECT); | 79 | pcmcia_parse_events(&cf->socket, SS_DETECT); |
| 81 | } | 80 | } |
| 82 | } | 81 | } |
| @@ -93,7 +92,7 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp) | |||
| 93 | 92 | ||
| 94 | cf = container_of(s, struct at91_cf_socket, socket); | 93 | cf = container_of(s, struct at91_cf_socket, socket); |
| 95 | 94 | ||
| 96 | /* NOTE: we assume 3VCARD, not XVCARD... */ | 95 | /* NOTE: CF is always 3VCARD */ |
| 97 | if (at91_cf_present(cf)) { | 96 | if (at91_cf_present(cf)) { |
| 98 | int rdy = cf->board->irq_pin; /* RDY/nIRQ */ | 97 | int rdy = cf->board->irq_pin; /* RDY/nIRQ */ |
| 99 | int vcc = cf->board->vcc_pin; | 98 | int vcc = cf->board->vcc_pin; |
| @@ -109,7 +108,8 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp) | |||
| 109 | return 0; | 108 | return 0; |
| 110 | } | 109 | } |
| 111 | 110 | ||
| 112 | static int at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) | 111 | static int |
| 112 | at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) | ||
| 113 | { | 113 | { |
| 114 | struct at91_cf_socket *cf; | 114 | struct at91_cf_socket *cf; |
| 115 | 115 | ||
| @@ -184,7 +184,8 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io) | |||
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | /* pcmcia layer maps/unmaps mem regions */ | 186 | /* pcmcia layer maps/unmaps mem regions */ |
| 187 | static int at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) | 187 | static int |
| 188 | at91_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) | ||
| 188 | { | 189 | { |
| 189 | struct at91_cf_socket *cf; | 190 | struct at91_cf_socket *cf; |
| 190 | 191 | ||
| @@ -218,12 +219,17 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 218 | struct at91_cf_socket *cf; | 219 | struct at91_cf_socket *cf; |
| 219 | struct at91_cf_data *board = dev->platform_data; | 220 | struct at91_cf_data *board = dev->platform_data; |
| 220 | struct platform_device *pdev = to_platform_device(dev); | 221 | struct platform_device *pdev = to_platform_device(dev); |
| 222 | struct resource *io; | ||
| 221 | unsigned int csa; | 223 | unsigned int csa; |
| 222 | int status; | 224 | int status; |
| 223 | 225 | ||
| 224 | if (!board || !board->det_pin || !board->rst_pin) | 226 | if (!board || !board->det_pin || !board->rst_pin) |
| 225 | return -ENODEV; | 227 | return -ENODEV; |
| 226 | 228 | ||
| 229 | io = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 230 | if (!io) | ||
| 231 | return -ENODEV; | ||
| 232 | |||
| 227 | cf = kcalloc(1, sizeof *cf, GFP_KERNEL); | 233 | cf = kcalloc(1, sizeof *cf, GFP_KERNEL); |
| 228 | if (!cf) | 234 | if (!cf) |
| 229 | return -ENOMEM; | 235 | return -ENOMEM; |
| @@ -250,10 +256,14 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 250 | * REVISIT: these timings are in terms of MCK cycles, so | 256 | * REVISIT: these timings are in terms of MCK cycles, so |
| 251 | * when MCK changes (cpufreq etc) so must these values... | 257 | * when MCK changes (cpufreq etc) so must these values... |
| 252 | */ | 258 | */ |
| 253 | at91_sys_write(AT91_SMC_CSR(4), AT91_SMC_ACSS_STD | AT91_SMC_DBW_16 | AT91_SMC_BAT | AT91_SMC_WSEN | 259 | at91_sys_write(AT91_SMC_CSR(4), |
| 254 | | AT91_SMC_NWS_(32) /* wait states */ | 260 | AT91_SMC_ACSS_STD |
| 255 | | AT91_SMC_RWSETUP_(6) /* setup time */ | 261 | | AT91_SMC_DBW_16 |
| 256 | | AT91_SMC_RWHOLD_(4) /* hold time */ | 262 | | AT91_SMC_BAT |
| 263 | | AT91_SMC_WSEN | ||
| 264 | | AT91_SMC_NWS_(32) /* wait states */ | ||
| 265 | | AT91_SMC_RWSETUP_(6) /* setup time */ | ||
| 266 | | AT91_SMC_RWHOLD_(4) /* hold time */ | ||
| 257 | ); | 267 | ); |
| 258 | 268 | ||
| 259 | /* must be a GPIO; ergo must trigger on both edges */ | 269 | /* must be a GPIO; ergo must trigger on both edges */ |
| @@ -274,8 +284,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 274 | if (status < 0) | 284 | if (status < 0) |
| 275 | goto fail0a; | 285 | goto fail0a; |
| 276 | cf->socket.pci_irq = board->irq_pin; | 286 | cf->socket.pci_irq = board->irq_pin; |
| 277 | } | 287 | } else |
| 278 | else | ||
| 279 | cf->socket.pci_irq = NR_IRQS + 1; | 288 | cf->socket.pci_irq = NR_IRQS + 1; |
| 280 | 289 | ||
| 281 | /* pcmcia layer only remaps "real" memory not iospace */ | 290 | /* pcmcia layer only remaps "real" memory not iospace */ |
| @@ -284,7 +293,8 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 284 | goto fail1; | 293 | goto fail1; |
| 285 | 294 | ||
| 286 | /* reserve CS4, CS5, and CS6 regions; but use just CS4 */ | 295 | /* reserve CS4, CS5, and CS6 regions; but use just CS4 */ |
| 287 | if (!request_mem_region(AT91_CF_BASE, CF_SIZE, driver_name)) | 296 | if (!request_mem_region(io->start, io->end + 1 - io->start, |
| 297 | driver_name)) | ||
| 288 | goto fail1; | 298 | goto fail1; |
| 289 | 299 | ||
| 290 | pr_info("%s: irqs det #%d, io #%d\n", driver_name, | 300 | pr_info("%s: irqs det #%d, io #%d\n", driver_name, |
| @@ -297,7 +307,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 297 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP | 307 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP |
| 298 | | SS_CAP_MEM_ALIGN; | 308 | | SS_CAP_MEM_ALIGN; |
| 299 | cf->socket.map_size = SZ_2K; | 309 | cf->socket.map_size = SZ_2K; |
| 300 | cf->socket.io[0].NumPorts = SZ_2K; | 310 | cf->socket.io[0].res = io; |
| 301 | 311 | ||
| 302 | status = pcmcia_register_socket(&cf->socket); | 312 | status = pcmcia_register_socket(&cf->socket); |
| 303 | if (status < 0) | 313 | if (status < 0) |
| @@ -307,7 +317,7 @@ static int __init at91_cf_probe(struct device *dev) | |||
| 307 | 317 | ||
| 308 | fail2: | 318 | fail2: |
| 309 | iounmap((void __iomem *) cf->socket.io_offset); | 319 | iounmap((void __iomem *) cf->socket.io_offset); |
| 310 | release_mem_region(AT91_CF_BASE, CF_SIZE); | 320 | release_mem_region(io->start, io->end + 1 - io->start); |
| 311 | fail1: | 321 | fail1: |
| 312 | if (board->irq_pin) | 322 | if (board->irq_pin) |
| 313 | free_irq(board->irq_pin, cf); | 323 | free_irq(board->irq_pin, cf); |
| @@ -321,14 +331,15 @@ fail0: | |||
| 321 | 331 | ||
| 322 | static int __exit at91_cf_remove(struct device *dev) | 332 | static int __exit at91_cf_remove(struct device *dev) |
| 323 | { | 333 | { |
| 324 | struct at91_cf_socket *cf = dev_get_drvdata(dev); | 334 | struct at91_cf_socket *cf = dev_get_drvdata(dev); |
| 325 | unsigned int csa; | 335 | struct resource *io = cf->socket.io[0].res; |
| 336 | unsigned int csa; | ||
| 326 | 337 | ||
| 327 | pcmcia_unregister_socket(&cf->socket); | 338 | pcmcia_unregister_socket(&cf->socket); |
| 328 | free_irq(cf->board->irq_pin, cf); | 339 | free_irq(cf->board->irq_pin, cf); |
| 329 | free_irq(cf->board->det_pin, cf); | 340 | free_irq(cf->board->det_pin, cf); |
| 330 | iounmap((void __iomem *) cf->socket.io_offset); | 341 | iounmap((void __iomem *) cf->socket.io_offset); |
| 331 | release_mem_region(AT91_CF_BASE, CF_SIZE); | 342 | release_mem_region(io->start, io->end + 1 - io->start); |
| 332 | 343 | ||
| 333 | csa = at91_sys_read(AT91_EBI_CSA); | 344 | csa = at91_sys_read(AT91_EBI_CSA); |
| 334 | at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A); | 345 | at91_sys_write(AT91_EBI_CSA, csa & ~AT91_EBI_CS4A); |
| @@ -342,8 +353,8 @@ static struct device_driver at91_cf_driver = { | |||
| 342 | .bus = &platform_bus_type, | 353 | .bus = &platform_bus_type, |
| 343 | .probe = at91_cf_probe, | 354 | .probe = at91_cf_probe, |
| 344 | .remove = __exit_p(at91_cf_remove), | 355 | .remove = __exit_p(at91_cf_remove), |
| 345 | .suspend = pcmcia_socket_dev_suspend, | 356 | .suspend = pcmcia_socket_dev_suspend, |
| 346 | .resume = pcmcia_socket_dev_resume, | 357 | .resume = pcmcia_socket_dev_resume, |
| 347 | }; | 358 | }; |
| 348 | 359 | ||
| 349 | /*--------------------------------------------------------------------------*/ | 360 | /*--------------------------------------------------------------------------*/ |
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c index 0d2b447c50ed..caeb6d246e57 100644 --- a/drivers/scsi/3w-9xxx.c +++ b/drivers/scsi/3w-9xxx.c | |||
| @@ -65,6 +65,7 @@ | |||
| 65 | 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. | 65 | 2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher. |
| 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. | 66 | 2.26.02.006 - Fix 9550SX pchip reset timeout. |
| 67 | Add big endian support. | 67 | Add big endian support. |
| 68 | 2.26.02.007 - Disable local interrupts during kmap/unmap_atomic(). | ||
| 68 | */ | 69 | */ |
| 69 | 70 | ||
| 70 | #include <linux/module.h> | 71 | #include <linux/module.h> |
| @@ -88,7 +89,7 @@ | |||
| 88 | #include "3w-9xxx.h" | 89 | #include "3w-9xxx.h" |
| 89 | 90 | ||
| 90 | /* Globals */ | 91 | /* Globals */ |
| 91 | #define TW_DRIVER_VERSION "2.26.02.006" | 92 | #define TW_DRIVER_VERSION "2.26.02.007" |
| 92 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; | 93 | static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT]; |
| 93 | static unsigned int twa_device_extension_count; | 94 | static unsigned int twa_device_extension_count; |
| 94 | static int twa_major = -1; | 95 | static int twa_major = -1; |
| @@ -1942,9 +1943,13 @@ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re | |||
| 1942 | } | 1943 | } |
| 1943 | if (tw_dev->srb[request_id]->use_sg == 1) { | 1944 | if (tw_dev->srb[request_id]->use_sg == 1) { |
| 1944 | struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; | 1945 | struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer; |
| 1945 | char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | 1946 | char *buf; |
| 1947 | unsigned long flags = 0; | ||
| 1948 | local_irq_save(flags); | ||
| 1949 | buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset; | ||
| 1946 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); | 1950 | memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length); |
| 1947 | kunmap_atomic(buf - sg->offset, KM_IRQ0); | 1951 | kunmap_atomic(buf - sg->offset, KM_IRQ0); |
| 1952 | local_irq_restore(flags); | ||
| 1948 | } | 1953 | } |
| 1949 | } | 1954 | } |
| 1950 | } /* End twa_scsiop_execute_scsi_complete() */ | 1955 | } /* End twa_scsiop_execute_scsi_complete() */ |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 4035920ce3d8..3e7302692dbe 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
| @@ -1079,7 +1079,7 @@ config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE | |||
| 1079 | memory using PCI DAC cycles. | 1079 | memory using PCI DAC cycles. |
| 1080 | 1080 | ||
| 1081 | config SCSI_SYM53C8XX_DEFAULT_TAGS | 1081 | config SCSI_SYM53C8XX_DEFAULT_TAGS |
| 1082 | int "default tagged command queue depth" | 1082 | int "Default tagged command queue depth" |
| 1083 | depends on SCSI_SYM53C8XX_2 | 1083 | depends on SCSI_SYM53C8XX_2 |
| 1084 | default "16" | 1084 | default "16" |
| 1085 | help | 1085 | help |
| @@ -1090,7 +1090,7 @@ config SCSI_SYM53C8XX_DEFAULT_TAGS | |||
| 1090 | exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS. | 1090 | exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS. |
| 1091 | 1091 | ||
| 1092 | config SCSI_SYM53C8XX_MAX_TAGS | 1092 | config SCSI_SYM53C8XX_MAX_TAGS |
| 1093 | int "maximum number of queued commands" | 1093 | int "Maximum number of queued commands" |
| 1094 | depends on SCSI_SYM53C8XX_2 | 1094 | depends on SCSI_SYM53C8XX_2 |
| 1095 | default "64" | 1095 | default "64" |
| 1096 | help | 1096 | help |
| @@ -1099,13 +1099,14 @@ config SCSI_SYM53C8XX_MAX_TAGS | |||
| 1099 | possible. The driver supports up to 256 queued commands per device. | 1099 | possible. The driver supports up to 256 queued commands per device. |
| 1100 | This value is used as a compiled-in hard limit. | 1100 | This value is used as a compiled-in hard limit. |
| 1101 | 1101 | ||
| 1102 | config SCSI_SYM53C8XX_IOMAPPED | 1102 | config SCSI_SYM53C8XX_MMIO |
| 1103 | bool "use port IO" | 1103 | bool "Use memory mapped IO" |
| 1104 | depends on SCSI_SYM53C8XX_2 | 1104 | depends on SCSI_SYM53C8XX_2 |
| 1105 | default y | ||
| 1105 | help | 1106 | help |
| 1106 | If you say Y here, the driver will use port IO to access | 1107 | Memory mapped IO is faster than Port IO. Most people should |
| 1107 | the card. This is significantly slower then using memory | 1108 | answer Y here, but some machines may have problems. If you have |
| 1108 | mapped IO. Most people should answer N. | 1109 | to answer N here, please report the problem to the maintainer. |
| 1109 | 1110 | ||
| 1110 | config SCSI_IPR | 1111 | config SCSI_IPR |
| 1111 | tristate "IBM Power Linux RAID adapter support" | 1112 | tristate "IBM Power Linux RAID adapter support" |
| @@ -1309,15 +1310,6 @@ config SCSI_QLOGIC_FAS | |||
| 1309 | To compile this driver as a module, choose M here: the | 1310 | To compile this driver as a module, choose M here: the |
| 1310 | module will be called qlogicfas. | 1311 | module will be called qlogicfas. |
| 1311 | 1312 | ||
| 1312 | config SCSI_QLOGIC_FC | ||
| 1313 | tristate "Qlogic ISP FC SCSI support" | ||
| 1314 | depends on PCI && SCSI | ||
| 1315 | help | ||
| 1316 | This is a driver for the QLogic ISP2100 SCSI-FCP host adapter. | ||
| 1317 | |||
| 1318 | To compile this driver as a module, choose M here: the | ||
| 1319 | module will be called qlogicfc. | ||
| 1320 | |||
| 1321 | config SCSI_QLOGIC_FC_FIRMWARE | 1313 | config SCSI_QLOGIC_FC_FIRMWARE |
| 1322 | bool "Include loadable firmware in driver" | 1314 | bool "Include loadable firmware in driver" |
| 1323 | depends on SCSI_QLOGIC_FC | 1315 | depends on SCSI_QLOGIC_FC |
diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile index 503f189dab3b..669ff6b99c4f 100644 --- a/drivers/scsi/Makefile +++ b/drivers/scsi/Makefile | |||
| @@ -78,7 +78,6 @@ obj-$(CONFIG_SCSI_NCR_Q720) += NCR_Q720_mod.o | |||
| 78 | obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o | 78 | obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o |
| 79 | obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas408.o qlogicfas.o | 79 | obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas408.o qlogicfas.o |
| 80 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogicfas408.o | 80 | obj-$(CONFIG_PCMCIA_QLOGIC) += qlogicfas408.o |
| 81 | obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o | ||
| 82 | obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o | 81 | obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o |
| 83 | obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx/ | 82 | obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx/ |
| 84 | obj-$(CONFIG_SCSI_LPFC) += lpfc/ | 83 | obj-$(CONFIG_SCSI_LPFC) += lpfc/ |
diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c index 8df4a0ea3761..642a3b4e5937 100644 --- a/drivers/scsi/aacraid/aachba.c +++ b/drivers/scsi/aacraid/aachba.c | |||
| @@ -149,20 +149,20 @@ static int dacmode = -1; | |||
| 149 | 149 | ||
| 150 | static int commit = -1; | 150 | static int commit = -1; |
| 151 | 151 | ||
| 152 | module_param(nondasd, int, 0); | 152 | module_param(nondasd, int, S_IRUGO|S_IWUSR); |
| 153 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); | 153 | MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on"); |
| 154 | module_param(dacmode, int, 0); | 154 | module_param(dacmode, int, S_IRUGO|S_IWUSR); |
| 155 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); | 155 | MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on"); |
| 156 | module_param(commit, int, 0); | 156 | module_param(commit, int, S_IRUGO|S_IWUSR); |
| 157 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); | 157 | MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on"); |
| 158 | 158 | ||
| 159 | int numacb = -1; | 159 | int numacb = -1; |
| 160 | module_param(numacb, int, S_IRUGO|S_IWUSR); | 160 | module_param(numacb, int, S_IRUGO|S_IWUSR); |
| 161 | MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid\nvalues are 512 and down. Default is to use suggestion from Firmware."); | 161 | MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid values are 512 and down. Default is to use suggestion from Firmware."); |
| 162 | 162 | ||
| 163 | int acbsize = -1; | 163 | int acbsize = -1; |
| 164 | module_param(acbsize, int, S_IRUGO|S_IWUSR); | 164 | module_param(acbsize, int, S_IRUGO|S_IWUSR); |
| 165 | MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512,\n2048, 4096 and 8192. Default is to use suggestion from Firmware."); | 165 | MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware."); |
| 166 | /** | 166 | /** |
| 167 | * aac_get_config_status - check the adapter configuration | 167 | * aac_get_config_status - check the adapter configuration |
| 168 | * @common: adapter to query | 168 | * @common: adapter to query |
| @@ -387,6 +387,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr) | |||
| 387 | struct scsi_cmnd * scsicmd; | 387 | struct scsi_cmnd * scsicmd; |
| 388 | 388 | ||
| 389 | scsicmd = (struct scsi_cmnd *) context; | 389 | scsicmd = (struct scsi_cmnd *) context; |
| 390 | scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; | ||
| 390 | 391 | ||
| 391 | dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); | 392 | dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies)); |
| 392 | if (fibptr == NULL) | 393 | if (fibptr == NULL) |
| @@ -453,8 +454,10 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid) | |||
| 453 | /* | 454 | /* |
| 454 | * Check that the command queued to the controller | 455 | * Check that the command queued to the controller |
| 455 | */ | 456 | */ |
| 456 | if (status == -EINPROGRESS) | 457 | if (status == -EINPROGRESS) { |
| 458 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; | ||
| 457 | return 0; | 459 | return 0; |
| 460 | } | ||
| 458 | 461 | ||
| 459 | printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); | 462 | printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status); |
| 460 | aac_fib_complete(cmd_fibcontext); | 463 | aac_fib_complete(cmd_fibcontext); |
| @@ -907,9 +910,10 @@ static void io_callback(void *context, struct fib * fibptr) | |||
| 907 | u32 cid; | 910 | u32 cid; |
| 908 | 911 | ||
| 909 | scsicmd = (struct scsi_cmnd *) context; | 912 | scsicmd = (struct scsi_cmnd *) context; |
| 913 | scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; | ||
| 910 | 914 | ||
| 911 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 915 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
| 912 | cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun); | 916 | cid = scmd_id(scsicmd); |
| 913 | 917 | ||
| 914 | if (nblank(dprintk(x))) { | 918 | if (nblank(dprintk(x))) { |
| 915 | u64 lba; | 919 | u64 lba; |
| @@ -1151,8 +1155,10 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid) | |||
| 1151 | /* | 1155 | /* |
| 1152 | * Check that the command queued to the controller | 1156 | * Check that the command queued to the controller |
| 1153 | */ | 1157 | */ |
| 1154 | if (status == -EINPROGRESS) | 1158 | if (status == -EINPROGRESS) { |
| 1159 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; | ||
| 1155 | return 0; | 1160 | return 0; |
| 1161 | } | ||
| 1156 | 1162 | ||
| 1157 | printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status); | 1163 | printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status); |
| 1158 | /* | 1164 | /* |
| @@ -1318,8 +1324,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid) | |||
| 1318 | /* | 1324 | /* |
| 1319 | * Check that the command queued to the controller | 1325 | * Check that the command queued to the controller |
| 1320 | */ | 1326 | */ |
| 1321 | if (status == -EINPROGRESS) | 1327 | if (status == -EINPROGRESS) { |
| 1322 | { | 1328 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; |
| 1323 | return 0; | 1329 | return 0; |
| 1324 | } | 1330 | } |
| 1325 | 1331 | ||
| @@ -1341,6 +1347,7 @@ static void synchronize_callback(void *context, struct fib *fibptr) | |||
| 1341 | struct scsi_cmnd *cmd; | 1347 | struct scsi_cmnd *cmd; |
| 1342 | 1348 | ||
| 1343 | cmd = context; | 1349 | cmd = context; |
| 1350 | cmd->SCp.phase = AAC_OWNER_MIDLEVEL; | ||
| 1344 | 1351 | ||
| 1345 | dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", | 1352 | dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", |
| 1346 | smp_processor_id(), jiffies)); | 1353 | smp_processor_id(), jiffies)); |
| @@ -1354,7 +1361,7 @@ static void synchronize_callback(void *context, struct fib *fibptr) | |||
| 1354 | else { | 1361 | else { |
| 1355 | struct scsi_device *sdev = cmd->device; | 1362 | struct scsi_device *sdev = cmd->device; |
| 1356 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; | 1363 | struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata; |
| 1357 | u32 cid = ID_LUN_TO_CONTAINER(sdev->id, sdev->lun); | 1364 | u32 cid = sdev_id(sdev); |
| 1358 | printk(KERN_WARNING | 1365 | printk(KERN_WARNING |
| 1359 | "synchronize_callback: synchronize failed, status = %d\n", | 1366 | "synchronize_callback: synchronize failed, status = %d\n", |
| 1360 | le32_to_cpu(synchronizereply->status)); | 1367 | le32_to_cpu(synchronizereply->status)); |
| @@ -1386,12 +1393,12 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) | |||
| 1386 | unsigned long flags; | 1393 | unsigned long flags; |
| 1387 | 1394 | ||
| 1388 | /* | 1395 | /* |
| 1389 | * Wait for all commands to complete to this specific | 1396 | * Wait for all outstanding queued commands to complete to this |
| 1390 | * target (block). | 1397 | * specific target (block). |
| 1391 | */ | 1398 | */ |
| 1392 | spin_lock_irqsave(&sdev->list_lock, flags); | 1399 | spin_lock_irqsave(&sdev->list_lock, flags); |
| 1393 | list_for_each_entry(cmd, &sdev->cmd_list, list) | 1400 | list_for_each_entry(cmd, &sdev->cmd_list, list) |
| 1394 | if (cmd != scsicmd && cmd->serial_number != 0) { | 1401 | if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) { |
| 1395 | ++active; | 1402 | ++active; |
| 1396 | break; | 1403 | break; |
| 1397 | } | 1404 | } |
| @@ -1434,8 +1441,10 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid) | |||
| 1434 | /* | 1441 | /* |
| 1435 | * Check that the command queued to the controller | 1442 | * Check that the command queued to the controller |
| 1436 | */ | 1443 | */ |
| 1437 | if (status == -EINPROGRESS) | 1444 | if (status == -EINPROGRESS) { |
| 1445 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; | ||
| 1438 | return 0; | 1446 | return 0; |
| 1447 | } | ||
| 1439 | 1448 | ||
| 1440 | printk(KERN_WARNING | 1449 | printk(KERN_WARNING |
| 1441 | "aac_synchronize: aac_fib_send failed with status: %d.\n", status); | 1450 | "aac_synchronize: aac_fib_send failed with status: %d.\n", status); |
| @@ -1458,7 +1467,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1458 | struct Scsi_Host *host = scsicmd->device->host; | 1467 | struct Scsi_Host *host = scsicmd->device->host; |
| 1459 | struct aac_dev *dev = (struct aac_dev *)host->hostdata; | 1468 | struct aac_dev *dev = (struct aac_dev *)host->hostdata; |
| 1460 | struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; | 1469 | struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev; |
| 1461 | int ret; | ||
| 1462 | 1470 | ||
| 1463 | /* | 1471 | /* |
| 1464 | * If the bus, id or lun is out of range, return fail | 1472 | * If the bus, id or lun is out of range, return fail |
| @@ -1466,13 +1474,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1466 | * itself. | 1474 | * itself. |
| 1467 | */ | 1475 | */ |
| 1468 | if (scmd_id(scsicmd) != host->this_id) { | 1476 | if (scmd_id(scsicmd) != host->this_id) { |
| 1469 | if ((scsicmd->device->channel == CONTAINER_CHANNEL)) { | 1477 | if ((scmd_channel(scsicmd) == CONTAINER_CHANNEL)) { |
| 1470 | if( (scsicmd->device->id >= dev->maximum_num_containers) || (scsicmd->device->lun != 0)){ | 1478 | if((scmd_id(scsicmd) >= dev->maximum_num_containers) || |
| 1479 | (scsicmd->device->lun != 0)) { | ||
| 1471 | scsicmd->result = DID_NO_CONNECT << 16; | 1480 | scsicmd->result = DID_NO_CONNECT << 16; |
| 1472 | scsicmd->scsi_done(scsicmd); | 1481 | scsicmd->scsi_done(scsicmd); |
| 1473 | return 0; | 1482 | return 0; |
| 1474 | } | 1483 | } |
| 1475 | cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun); | 1484 | cid = scmd_id(scsicmd); |
| 1476 | 1485 | ||
| 1477 | /* | 1486 | /* |
| 1478 | * If the target container doesn't exist, it may have | 1487 | * If the target container doesn't exist, it may have |
| @@ -1548,7 +1557,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1548 | { | 1557 | { |
| 1549 | struct inquiry_data inq_data; | 1558 | struct inquiry_data inq_data; |
| 1550 | 1559 | ||
| 1551 | dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scsicmd->device->id)); | 1560 | dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scmd_id(scsicmd))); |
| 1552 | memset(&inq_data, 0, sizeof (struct inquiry_data)); | 1561 | memset(&inq_data, 0, sizeof (struct inquiry_data)); |
| 1553 | 1562 | ||
| 1554 | inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ | 1563 | inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */ |
| @@ -1598,13 +1607,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1598 | cp[11] = 0; | 1607 | cp[11] = 0; |
| 1599 | cp[12] = 0; | 1608 | cp[12] = 0; |
| 1600 | aac_internal_transfer(scsicmd, cp, 0, | 1609 | aac_internal_transfer(scsicmd, cp, 0, |
| 1601 | min((unsigned int)scsicmd->cmnd[13], sizeof(cp))); | 1610 | min_t(size_t, scsicmd->cmnd[13], sizeof(cp))); |
| 1602 | if (sizeof(cp) < scsicmd->cmnd[13]) { | 1611 | if (sizeof(cp) < scsicmd->cmnd[13]) { |
| 1603 | unsigned int len, offset = sizeof(cp); | 1612 | unsigned int len, offset = sizeof(cp); |
| 1604 | 1613 | ||
| 1605 | memset(cp, 0, offset); | 1614 | memset(cp, 0, offset); |
| 1606 | do { | 1615 | do { |
| 1607 | len = min(scsicmd->cmnd[13]-offset, sizeof(cp)); | 1616 | len = min_t(size_t, scsicmd->cmnd[13] - offset, |
| 1617 | sizeof(cp)); | ||
| 1608 | aac_internal_transfer(scsicmd, cp, offset, len); | 1618 | aac_internal_transfer(scsicmd, cp, offset, len); |
| 1609 | } while ((offset += len) < scsicmd->cmnd[13]); | 1619 | } while ((offset += len) < scsicmd->cmnd[13]); |
| 1610 | } | 1620 | } |
| @@ -1728,24 +1738,19 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd) | |||
| 1728 | * containers to /dev/sd device names | 1738 | * containers to /dev/sd device names |
| 1729 | */ | 1739 | */ |
| 1730 | 1740 | ||
| 1731 | spin_unlock_irq(host->host_lock); | ||
| 1732 | if (scsicmd->request->rq_disk) | 1741 | if (scsicmd->request->rq_disk) |
| 1733 | strlcpy(fsa_dev_ptr[cid].devname, | 1742 | strlcpy(fsa_dev_ptr[cid].devname, |
| 1734 | scsicmd->request->rq_disk->disk_name, | 1743 | scsicmd->request->rq_disk->disk_name, |
| 1735 | min(sizeof(fsa_dev_ptr[cid].devname), | 1744 | min(sizeof(fsa_dev_ptr[cid].devname), |
| 1736 | sizeof(scsicmd->request->rq_disk->disk_name) + 1)); | 1745 | sizeof(scsicmd->request->rq_disk->disk_name) + 1)); |
| 1737 | ret = aac_read(scsicmd, cid); | 1746 | |
| 1738 | spin_lock_irq(host->host_lock); | 1747 | return aac_read(scsicmd, cid); |
| 1739 | return ret; | ||
| 1740 | 1748 | ||
| 1741 | case WRITE_6: | 1749 | case WRITE_6: |
| 1742 | case WRITE_10: | 1750 | case WRITE_10: |
| 1743 | case WRITE_12: | 1751 | case WRITE_12: |
| 1744 | case WRITE_16: | 1752 | case WRITE_16: |
| 1745 | spin_unlock_irq(host->host_lock); | 1753 | return aac_write(scsicmd, cid); |
| 1746 | ret = aac_write(scsicmd, cid); | ||
| 1747 | spin_lock_irq(host->host_lock); | ||
| 1748 | return ret; | ||
| 1749 | 1754 | ||
| 1750 | case SYNCHRONIZE_CACHE: | 1755 | case SYNCHRONIZE_CACHE: |
| 1751 | /* Issue FIB to tell Firmware to flush it's cache */ | 1756 | /* Issue FIB to tell Firmware to flush it's cache */ |
| @@ -1778,7 +1783,7 @@ static int query_disk(struct aac_dev *dev, void __user *arg) | |||
| 1778 | if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk))) | 1783 | if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk))) |
| 1779 | return -EFAULT; | 1784 | return -EFAULT; |
| 1780 | if (qd.cnum == -1) | 1785 | if (qd.cnum == -1) |
| 1781 | qd.cnum = ID_LUN_TO_CONTAINER(qd.id, qd.lun); | 1786 | qd.cnum = qd.id; |
| 1782 | else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) | 1787 | else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1)) |
| 1783 | { | 1788 | { |
| 1784 | if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers) | 1789 | if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers) |
| @@ -1890,6 +1895,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr) | |||
| 1890 | struct scsi_cmnd *scsicmd; | 1895 | struct scsi_cmnd *scsicmd; |
| 1891 | 1896 | ||
| 1892 | scsicmd = (struct scsi_cmnd *) context; | 1897 | scsicmd = (struct scsi_cmnd *) context; |
| 1898 | scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL; | ||
| 1893 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 1899 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
| 1894 | 1900 | ||
| 1895 | if (fibptr == NULL) | 1901 | if (fibptr == NULL) |
| @@ -2068,14 +2074,13 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) | |||
| 2068 | u32 timeout; | 2074 | u32 timeout; |
| 2069 | 2075 | ||
| 2070 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | 2076 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; |
| 2071 | if (scsicmd->device->id >= dev->maximum_num_physicals || | 2077 | if (scmd_id(scsicmd) >= dev->maximum_num_physicals || |
| 2072 | scsicmd->device->lun > 7) { | 2078 | scsicmd->device->lun > 7) { |
| 2073 | scsicmd->result = DID_NO_CONNECT << 16; | 2079 | scsicmd->result = DID_NO_CONNECT << 16; |
| 2074 | scsicmd->scsi_done(scsicmd); | 2080 | scsicmd->scsi_done(scsicmd); |
| 2075 | return 0; | 2081 | return 0; |
| 2076 | } | 2082 | } |
| 2077 | 2083 | ||
| 2078 | dev = (struct aac_dev *)scsicmd->device->host->hostdata; | ||
| 2079 | switch(scsicmd->sc_data_direction){ | 2084 | switch(scsicmd->sc_data_direction){ |
| 2080 | case DMA_TO_DEVICE: | 2085 | case DMA_TO_DEVICE: |
| 2081 | flag = SRB_DataOut; | 2086 | flag = SRB_DataOut; |
| @@ -2103,8 +2108,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) | |||
| 2103 | 2108 | ||
| 2104 | srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext); | 2109 | srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext); |
| 2105 | srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); | 2110 | srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); |
| 2106 | srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scsicmd->device->channel)); | 2111 | srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scmd_channel(scsicmd))); |
| 2107 | srbcmd->id = cpu_to_le32(scsicmd->device->id); | 2112 | srbcmd->id = cpu_to_le32(scmd_id(scsicmd)); |
| 2108 | srbcmd->lun = cpu_to_le32(scsicmd->device->lun); | 2113 | srbcmd->lun = cpu_to_le32(scsicmd->device->lun); |
| 2109 | srbcmd->flags = cpu_to_le32(flag); | 2114 | srbcmd->flags = cpu_to_le32(flag); |
| 2110 | timeout = scsicmd->timeout_per_command/HZ; | 2115 | timeout = scsicmd->timeout_per_command/HZ; |
| @@ -2161,7 +2166,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd) | |||
| 2161 | /* | 2166 | /* |
| 2162 | * Check that the command queued to the controller | 2167 | * Check that the command queued to the controller |
| 2163 | */ | 2168 | */ |
| 2164 | if (status == -EINPROGRESS){ | 2169 | if (status == -EINPROGRESS) { |
| 2170 | scsicmd->SCp.phase = AAC_OWNER_FIRMWARE; | ||
| 2165 | return 0; | 2171 | return 0; |
| 2166 | } | 2172 | } |
| 2167 | 2173 | ||
| @@ -2192,8 +2198,6 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg) | |||
| 2192 | scsicmd->sc_data_direction); | 2198 | scsicmd->sc_data_direction); |
| 2193 | psg->count = cpu_to_le32(sg_count); | 2199 | psg->count = cpu_to_le32(sg_count); |
| 2194 | 2200 | ||
| 2195 | byte_count = 0; | ||
| 2196 | |||
| 2197 | for (i = 0; i < sg_count; i++) { | 2201 | for (i = 0; i < sg_count; i++) { |
| 2198 | psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); | 2202 | psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg)); |
| 2199 | psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); | 2203 | psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); |
| @@ -2249,18 +2253,17 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p | |||
| 2249 | 2253 | ||
| 2250 | sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, | 2254 | sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg, |
| 2251 | scsicmd->sc_data_direction); | 2255 | scsicmd->sc_data_direction); |
| 2252 | psg->count = cpu_to_le32(sg_count); | ||
| 2253 | |||
| 2254 | byte_count = 0; | ||
| 2255 | 2256 | ||
| 2256 | for (i = 0; i < sg_count; i++) { | 2257 | for (i = 0; i < sg_count; i++) { |
| 2258 | int count = sg_dma_len(sg); | ||
| 2257 | addr = sg_dma_address(sg); | 2259 | addr = sg_dma_address(sg); |
| 2258 | psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); | 2260 | psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff); |
| 2259 | psg->sg[i].addr[1] = cpu_to_le32(addr>>32); | 2261 | psg->sg[i].addr[1] = cpu_to_le32(addr>>32); |
| 2260 | psg->sg[i].count = cpu_to_le32(sg_dma_len(sg)); | 2262 | psg->sg[i].count = cpu_to_le32(count); |
| 2261 | byte_count += sg_dma_len(sg); | 2263 | byte_count += count; |
| 2262 | sg++; | 2264 | sg++; |
| 2263 | } | 2265 | } |
| 2266 | psg->count = cpu_to_le32(sg_count); | ||
| 2264 | /* hba wants the size to be exact */ | 2267 | /* hba wants the size to be exact */ |
| 2265 | if(byte_count > scsicmd->request_bufflen){ | 2268 | if(byte_count > scsicmd->request_bufflen){ |
| 2266 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - | 2269 | u32 temp = le32_to_cpu(psg->sg[i-1].count) - |
| @@ -2275,16 +2278,15 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p | |||
| 2275 | } | 2278 | } |
| 2276 | } | 2279 | } |
| 2277 | else if(scsicmd->request_bufflen) { | 2280 | else if(scsicmd->request_bufflen) { |
| 2278 | u64 addr; | 2281 | scsicmd->SCp.dma_handle = pci_map_single(dev->pdev, |
| 2279 | addr = pci_map_single(dev->pdev, | ||
| 2280 | scsicmd->request_buffer, | 2282 | scsicmd->request_buffer, |
| 2281 | scsicmd->request_bufflen, | 2283 | scsicmd->request_bufflen, |
| 2282 | scsicmd->sc_data_direction); | 2284 | scsicmd->sc_data_direction); |
| 2285 | addr = scsicmd->SCp.dma_handle; | ||
| 2283 | psg->count = cpu_to_le32(1); | 2286 | psg->count = cpu_to_le32(1); |
| 2284 | psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff); | 2287 | psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff); |
| 2285 | psg->sg[0].addr[1] = cpu_to_le32(addr >> 32); | 2288 | psg->sg[0].addr[1] = cpu_to_le32(addr >> 32); |
| 2286 | psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); | 2289 | psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen); |
| 2287 | scsicmd->SCp.dma_handle = addr; | ||
| 2288 | byte_count = scsicmd->request_bufflen; | 2290 | byte_count = scsicmd->request_bufflen; |
| 2289 | } | 2291 | } |
| 2290 | return byte_count; | 2292 | return byte_count; |
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h index 9ce7002bd070..f773b0dcfc95 100644 --- a/drivers/scsi/aacraid/aacraid.h +++ b/drivers/scsi/aacraid/aacraid.h | |||
| @@ -10,6 +10,10 @@ | |||
| 10 | * D E F I N E S | 10 | * D E F I N E S |
| 11 | *----------------------------------------------------------------------------*/ | 11 | *----------------------------------------------------------------------------*/ |
| 12 | 12 | ||
| 13 | #ifndef AAC_DRIVER_BUILD | ||
| 14 | # define AAC_DRIVER_BUILD 2409 | ||
| 15 | # define AAC_DRIVER_BRANCH "-mh1" | ||
| 16 | #endif | ||
| 13 | #define MAXIMUM_NUM_CONTAINERS 32 | 17 | #define MAXIMUM_NUM_CONTAINERS 32 |
| 14 | 18 | ||
| 15 | #define AAC_NUM_MGT_FIB 8 | 19 | #define AAC_NUM_MGT_FIB 8 |
| @@ -25,7 +29,6 @@ | |||
| 25 | * These macros convert from physical channels to virtual channels | 29 | * These macros convert from physical channels to virtual channels |
| 26 | */ | 30 | */ |
| 27 | #define CONTAINER_CHANNEL (0) | 31 | #define CONTAINER_CHANNEL (0) |
| 28 | #define ID_LUN_TO_CONTAINER(id, lun) (id) | ||
| 29 | #define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL) | 32 | #define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL) |
| 30 | #define CONTAINER_TO_ID(cont) (cont) | 33 | #define CONTAINER_TO_ID(cont) (cont) |
| 31 | #define CONTAINER_TO_LUN(cont) (0) | 34 | #define CONTAINER_TO_LUN(cont) (0) |
| @@ -789,6 +792,7 @@ struct fsa_dev_info { | |||
| 789 | u64 size; | 792 | u64 size; |
| 790 | u32 type; | 793 | u32 type; |
| 791 | u32 config_waiting_on; | 794 | u32 config_waiting_on; |
| 795 | unsigned long config_waiting_stamp; | ||
| 792 | u16 queue_depth; | 796 | u16 queue_depth; |
| 793 | u8 config_needed; | 797 | u8 config_needed; |
| 794 | u8 valid; | 798 | u8 valid; |
| @@ -1771,6 +1775,11 @@ static inline u32 cap_to_cyls(sector_t capacity, u32 divisor) | |||
| 1771 | } | 1775 | } |
| 1772 | 1776 | ||
| 1773 | struct scsi_cmnd; | 1777 | struct scsi_cmnd; |
| 1778 | /* SCp.phase values */ | ||
| 1779 | #define AAC_OWNER_MIDLEVEL 0x101 | ||
| 1780 | #define AAC_OWNER_LOWLEVEL 0x102 | ||
| 1781 | #define AAC_OWNER_ERROR_HANDLER 0x103 | ||
| 1782 | #define AAC_OWNER_FIRMWARE 0x106 | ||
| 1774 | 1783 | ||
| 1775 | const char *aac_driverinfo(struct Scsi_Host *); | 1784 | const char *aac_driverinfo(struct Scsi_Host *); |
| 1776 | struct fib *aac_fib_alloc(struct aac_dev *dev); | 1785 | struct fib *aac_fib_alloc(struct aac_dev *dev); |
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 47fefca72695..9f75144e5247 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | #include <linux/completion.h> | 38 | #include <linux/completion.h> |
| 39 | #include <linux/dma-mapping.h> | 39 | #include <linux/dma-mapping.h> |
| 40 | #include <linux/blkdev.h> | 40 | #include <linux/blkdev.h> |
| 41 | #include <linux/delay.h> | ||
| 42 | #include <linux/kthread.h> | ||
| 41 | #include <asm/semaphore.h> | 43 | #include <asm/semaphore.h> |
| 42 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
| 43 | 45 | ||
| @@ -293,6 +295,16 @@ return_fib: | |||
| 293 | status = 0; | 295 | status = 0; |
| 294 | } else { | 296 | } else { |
| 295 | spin_unlock_irqrestore(&dev->fib_lock, flags); | 297 | spin_unlock_irqrestore(&dev->fib_lock, flags); |
| 298 | /* If someone killed the AIF aacraid thread, restart it */ | ||
| 299 | status = !dev->aif_thread; | ||
| 300 | if (status && dev->queues && dev->fsa_dev) { | ||
| 301 | /* Be paranoid, be very paranoid! */ | ||
| 302 | kthread_stop(dev->thread); | ||
| 303 | ssleep(1); | ||
| 304 | dev->aif_thread = 0; | ||
| 305 | dev->thread = kthread_run(aac_command_thread, dev, dev->name); | ||
| 306 | ssleep(1); | ||
| 307 | } | ||
| 296 | if (f.wait) { | 308 | if (f.wait) { |
| 297 | if(down_interruptible(&fibctx->wait_sem) < 0) { | 309 | if(down_interruptible(&fibctx->wait_sem) < 0) { |
| 298 | status = -EINTR; | 310 | status = -EINTR; |
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index c7f80ec7abde..9f9f4aae23c0 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c | |||
| @@ -767,9 +767,9 @@ void aac_printf(struct aac_dev *dev, u32 val) | |||
| 767 | if (cp[length] != 0) | 767 | if (cp[length] != 0) |
| 768 | cp[length] = 0; | 768 | cp[length] = 0; |
| 769 | if (level == LOG_AAC_HIGH_ERROR) | 769 | if (level == LOG_AAC_HIGH_ERROR) |
| 770 | printk(KERN_WARNING "aacraid:%s", cp); | 770 | printk(KERN_WARNING "%s:%s", dev->name, cp); |
| 771 | else | 771 | else |
| 772 | printk(KERN_INFO "aacraid:%s", cp); | 772 | printk(KERN_INFO "%s:%s", dev->name, cp); |
| 773 | } | 773 | } |
| 774 | memset(cp, 0, 256); | 774 | memset(cp, 0, 256); |
| 775 | } | 775 | } |
| @@ -784,6 +784,7 @@ void aac_printf(struct aac_dev *dev, u32 val) | |||
| 784 | * dispatches it to the appropriate routine for handling. | 784 | * dispatches it to the appropriate routine for handling. |
| 785 | */ | 785 | */ |
| 786 | 786 | ||
| 787 | #define AIF_SNIFF_TIMEOUT (30*HZ) | ||
| 787 | static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | 788 | static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) |
| 788 | { | 789 | { |
| 789 | struct hw_fib * hw_fib = fibptr->hw_fib; | 790 | struct hw_fib * hw_fib = fibptr->hw_fib; |
| @@ -837,6 +838,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 837 | if (device) { | 838 | if (device) { |
| 838 | dev->fsa_dev[container].config_needed = CHANGE; | 839 | dev->fsa_dev[container].config_needed = CHANGE; |
| 839 | dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; | 840 | dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; |
| 841 | dev->fsa_dev[container].config_waiting_stamp = jiffies; | ||
| 840 | scsi_device_put(device); | 842 | scsi_device_put(device); |
| 841 | } | 843 | } |
| 842 | } | 844 | } |
| @@ -849,13 +851,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 849 | if (container != (u32)-1) { | 851 | if (container != (u32)-1) { |
| 850 | if (container >= dev->maximum_num_containers) | 852 | if (container >= dev->maximum_num_containers) |
| 851 | break; | 853 | break; |
| 852 | if (dev->fsa_dev[container].config_waiting_on == | 854 | if ((dev->fsa_dev[container].config_waiting_on == |
| 853 | le32_to_cpu(*(u32 *)aifcmd->data)) | 855 | le32_to_cpu(*(u32 *)aifcmd->data)) && |
| 856 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) | ||
| 854 | dev->fsa_dev[container].config_waiting_on = 0; | 857 | dev->fsa_dev[container].config_waiting_on = 0; |
| 855 | } else for (container = 0; | 858 | } else for (container = 0; |
| 856 | container < dev->maximum_num_containers; ++container) { | 859 | container < dev->maximum_num_containers; ++container) { |
| 857 | if (dev->fsa_dev[container].config_waiting_on == | 860 | if ((dev->fsa_dev[container].config_waiting_on == |
| 858 | le32_to_cpu(*(u32 *)aifcmd->data)) | 861 | le32_to_cpu(*(u32 *)aifcmd->data)) && |
| 862 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) | ||
| 859 | dev->fsa_dev[container].config_waiting_on = 0; | 863 | dev->fsa_dev[container].config_waiting_on = 0; |
| 860 | } | 864 | } |
| 861 | break; | 865 | break; |
| @@ -872,6 +876,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 872 | dev->fsa_dev[container].config_needed = ADD; | 876 | dev->fsa_dev[container].config_needed = ADD; |
| 873 | dev->fsa_dev[container].config_waiting_on = | 877 | dev->fsa_dev[container].config_waiting_on = |
| 874 | AifEnConfigChange; | 878 | AifEnConfigChange; |
| 879 | dev->fsa_dev[container].config_waiting_stamp = jiffies; | ||
| 875 | break; | 880 | break; |
| 876 | 881 | ||
| 877 | /* | 882 | /* |
| @@ -884,6 +889,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 884 | dev->fsa_dev[container].config_needed = DELETE; | 889 | dev->fsa_dev[container].config_needed = DELETE; |
| 885 | dev->fsa_dev[container].config_waiting_on = | 890 | dev->fsa_dev[container].config_waiting_on = |
| 886 | AifEnConfigChange; | 891 | AifEnConfigChange; |
| 892 | dev->fsa_dev[container].config_waiting_stamp = jiffies; | ||
| 887 | break; | 893 | break; |
| 888 | 894 | ||
| 889 | /* | 895 | /* |
| @@ -894,11 +900,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 894 | container = le32_to_cpu(((u32 *)aifcmd->data)[1]); | 900 | container = le32_to_cpu(((u32 *)aifcmd->data)[1]); |
| 895 | if (container >= dev->maximum_num_containers) | 901 | if (container >= dev->maximum_num_containers) |
| 896 | break; | 902 | break; |
| 897 | if (dev->fsa_dev[container].config_waiting_on) | 903 | if (dev->fsa_dev[container].config_waiting_on && |
| 904 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) | ||
| 898 | break; | 905 | break; |
| 899 | dev->fsa_dev[container].config_needed = CHANGE; | 906 | dev->fsa_dev[container].config_needed = CHANGE; |
| 900 | dev->fsa_dev[container].config_waiting_on = | 907 | dev->fsa_dev[container].config_waiting_on = |
| 901 | AifEnConfigChange; | 908 | AifEnConfigChange; |
| 909 | dev->fsa_dev[container].config_waiting_stamp = jiffies; | ||
| 902 | break; | 910 | break; |
| 903 | 911 | ||
| 904 | case AifEnConfigChange: | 912 | case AifEnConfigChange: |
| @@ -913,13 +921,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 913 | if (container != (u32)-1) { | 921 | if (container != (u32)-1) { |
| 914 | if (container >= dev->maximum_num_containers) | 922 | if (container >= dev->maximum_num_containers) |
| 915 | break; | 923 | break; |
| 916 | if (dev->fsa_dev[container].config_waiting_on == | 924 | if ((dev->fsa_dev[container].config_waiting_on == |
| 917 | le32_to_cpu(*(u32 *)aifcmd->data)) | 925 | le32_to_cpu(*(u32 *)aifcmd->data)) && |
| 926 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) | ||
| 918 | dev->fsa_dev[container].config_waiting_on = 0; | 927 | dev->fsa_dev[container].config_waiting_on = 0; |
| 919 | } else for (container = 0; | 928 | } else for (container = 0; |
| 920 | container < dev->maximum_num_containers; ++container) { | 929 | container < dev->maximum_num_containers; ++container) { |
| 921 | if (dev->fsa_dev[container].config_waiting_on == | 930 | if ((dev->fsa_dev[container].config_waiting_on == |
| 922 | le32_to_cpu(*(u32 *)aifcmd->data)) | 931 | le32_to_cpu(*(u32 *)aifcmd->data)) && |
| 932 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) | ||
| 923 | dev->fsa_dev[container].config_waiting_on = 0; | 933 | dev->fsa_dev[container].config_waiting_on = 0; |
| 924 | } | 934 | } |
| 925 | break; | 935 | break; |
| @@ -946,6 +956,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 946 | dev->fsa_dev[container].config_waiting_on = | 956 | dev->fsa_dev[container].config_waiting_on = |
| 947 | AifEnContainerChange; | 957 | AifEnContainerChange; |
| 948 | dev->fsa_dev[container].config_needed = ADD; | 958 | dev->fsa_dev[container].config_needed = ADD; |
| 959 | dev->fsa_dev[container].config_waiting_stamp = | ||
| 960 | jiffies; | ||
| 949 | } | 961 | } |
| 950 | } | 962 | } |
| 951 | if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero)) | 963 | if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero)) |
| @@ -961,6 +973,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 961 | dev->fsa_dev[container].config_waiting_on = | 973 | dev->fsa_dev[container].config_waiting_on = |
| 962 | AifEnContainerChange; | 974 | AifEnContainerChange; |
| 963 | dev->fsa_dev[container].config_needed = DELETE; | 975 | dev->fsa_dev[container].config_needed = DELETE; |
| 976 | dev->fsa_dev[container].config_waiting_stamp = | ||
| 977 | jiffies; | ||
| 964 | } | 978 | } |
| 965 | } | 979 | } |
| 966 | break; | 980 | break; |
| @@ -969,8 +983,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) | |||
| 969 | device_config_needed = NOTHING; | 983 | device_config_needed = NOTHING; |
| 970 | for (container = 0; container < dev->maximum_num_containers; | 984 | for (container = 0; container < dev->maximum_num_containers; |
| 971 | ++container) { | 985 | ++container) { |
| 972 | if ((dev->fsa_dev[container].config_waiting_on == 0) | 986 | if ((dev->fsa_dev[container].config_waiting_on == 0) && |
| 973 | && (dev->fsa_dev[container].config_needed != NOTHING)) { | 987 | (dev->fsa_dev[container].config_needed != NOTHING) && |
| 988 | time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) { | ||
| 974 | device_config_needed = | 989 | device_config_needed = |
| 975 | dev->fsa_dev[container].config_needed; | 990 | dev->fsa_dev[container].config_needed; |
| 976 | dev->fsa_dev[container].config_needed = NOTHING; | 991 | dev->fsa_dev[container].config_needed = NOTHING; |
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index 720330778648..6ef89c99dd12 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c | |||
| @@ -27,12 +27,6 @@ | |||
| 27 | * Abstract: Linux Driver entry module for Adaptec RAID Array Controller | 27 | * Abstract: Linux Driver entry module for Adaptec RAID Array Controller |
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #define AAC_DRIVER_VERSION "1.1-4" | ||
| 31 | #ifndef AAC_DRIVER_BRANCH | ||
| 32 | #define AAC_DRIVER_BRANCH "" | ||
| 33 | #endif | ||
| 34 | #define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ | ||
| 35 | #define AAC_DRIVERNAME "aacraid" | ||
| 36 | 30 | ||
| 37 | #include <linux/compat.h> | 31 | #include <linux/compat.h> |
| 38 | #include <linux/blkdev.h> | 32 | #include <linux/blkdev.h> |
| @@ -62,6 +56,13 @@ | |||
| 62 | 56 | ||
| 63 | #include "aacraid.h" | 57 | #include "aacraid.h" |
| 64 | 58 | ||
| 59 | #define AAC_DRIVER_VERSION "1.1-5" | ||
| 60 | #ifndef AAC_DRIVER_BRANCH | ||
| 61 | #define AAC_DRIVER_BRANCH "" | ||
| 62 | #endif | ||
| 63 | #define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__ | ||
| 64 | #define AAC_DRIVERNAME "aacraid" | ||
| 65 | |||
| 65 | #ifdef AAC_DRIVER_BUILD | 66 | #ifdef AAC_DRIVER_BUILD |
| 66 | #define _str(x) #x | 67 | #define _str(x) #x |
| 67 | #define str(x) _str(x) | 68 | #define str(x) _str(x) |
| @@ -73,7 +74,7 @@ | |||
| 73 | MODULE_AUTHOR("Red Hat Inc and Adaptec"); | 74 | MODULE_AUTHOR("Red Hat Inc and Adaptec"); |
| 74 | MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, " | 75 | MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, " |
| 75 | "Adaptec Advanced Raid Products, " | 76 | "Adaptec Advanced Raid Products, " |
| 76 | "and HP NetRAID-4M SCSI driver"); | 77 | "HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver"); |
| 77 | MODULE_LICENSE("GPL"); | 78 | MODULE_LICENSE("GPL"); |
| 78 | MODULE_VERSION(AAC_DRIVER_FULL_VERSION); | 79 | MODULE_VERSION(AAC_DRIVER_FULL_VERSION); |
| 79 | 80 | ||
| @@ -243,6 +244,7 @@ static struct aac_driver_ident aac_drivers[] = { | |||
| 243 | static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) | 244 | static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) |
| 244 | { | 245 | { |
| 245 | cmd->scsi_done = done; | 246 | cmd->scsi_done = done; |
| 247 | cmd->SCp.phase = AAC_OWNER_LOWLEVEL; | ||
| 246 | return (aac_scsi_cmd(cmd) ? FAILED : 0); | 248 | return (aac_scsi_cmd(cmd) ? FAILED : 0); |
| 247 | } | 249 | } |
| 248 | 250 | ||
| @@ -471,7 +473,8 @@ static int aac_eh_reset(struct scsi_cmnd* cmd) | |||
| 471 | __shost_for_each_device(dev, host) { | 473 | __shost_for_each_device(dev, host) { |
| 472 | spin_lock_irqsave(&dev->list_lock, flags); | 474 | spin_lock_irqsave(&dev->list_lock, flags); |
| 473 | list_for_each_entry(command, &dev->cmd_list, list) { | 475 | list_for_each_entry(command, &dev->cmd_list, list) { |
| 474 | if (command->serial_number) { | 476 | if ((command != cmd) && |
| 477 | (command->SCp.phase == AAC_OWNER_FIRMWARE)) { | ||
| 475 | active++; | 478 | active++; |
| 476 | break; | 479 | break; |
| 477 | } | 480 | } |
| @@ -569,12 +572,12 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long | |||
| 569 | 572 | ||
| 570 | f = compat_alloc_user_space(sizeof(*f)); | 573 | f = compat_alloc_user_space(sizeof(*f)); |
| 571 | ret = 0; | 574 | ret = 0; |
| 572 | if (clear_user(f, sizeof(*f) != sizeof(*f))) | 575 | if (clear_user(f, sizeof(*f)) != sizeof(*f)) |
| 573 | ret = -EFAULT; | 576 | ret = -EFAULT; |
| 574 | if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32))) | 577 | if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32))) |
| 575 | ret = -EFAULT; | 578 | ret = -EFAULT; |
| 576 | if (!ret) | 579 | if (!ret) |
| 577 | ret = aac_do_ioctl(dev, cmd, (void __user *)arg); | 580 | ret = aac_do_ioctl(dev, cmd, f); |
| 578 | break; | 581 | break; |
| 579 | } | 582 | } |
| 580 | 583 | ||
| @@ -687,6 +690,18 @@ static ssize_t aac_show_serial_number(struct class_device *class_dev, | |||
| 687 | return len; | 690 | return len; |
| 688 | } | 691 | } |
| 689 | 692 | ||
| 693 | static ssize_t aac_show_max_channel(struct class_device *class_dev, char *buf) | ||
| 694 | { | ||
| 695 | return snprintf(buf, PAGE_SIZE, "%d\n", | ||
| 696 | class_to_shost(class_dev)->max_channel); | ||
| 697 | } | ||
| 698 | |||
| 699 | static ssize_t aac_show_max_id(struct class_device *class_dev, char *buf) | ||
| 700 | { | ||
| 701 | return snprintf(buf, PAGE_SIZE, "%d\n", | ||
| 702 | class_to_shost(class_dev)->max_id); | ||
| 703 | } | ||
| 704 | |||
| 690 | 705 | ||
| 691 | static struct class_device_attribute aac_model = { | 706 | static struct class_device_attribute aac_model = { |
| 692 | .attr = { | 707 | .attr = { |
| @@ -730,6 +745,20 @@ static struct class_device_attribute aac_serial_number = { | |||
| 730 | }, | 745 | }, |
| 731 | .show = aac_show_serial_number, | 746 | .show = aac_show_serial_number, |
| 732 | }; | 747 | }; |
| 748 | static struct class_device_attribute aac_max_channel = { | ||
| 749 | .attr = { | ||
| 750 | .name = "max_channel", | ||
| 751 | .mode = S_IRUGO, | ||
| 752 | }, | ||
| 753 | .show = aac_show_max_channel, | ||
| 754 | }; | ||
| 755 | static struct class_device_attribute aac_max_id = { | ||
| 756 | .attr = { | ||
| 757 | .name = "max_id", | ||
| 758 | .mode = S_IRUGO, | ||
| 759 | }, | ||
| 760 | .show = aac_show_max_id, | ||
| 761 | }; | ||
| 733 | 762 | ||
| 734 | static struct class_device_attribute *aac_attrs[] = { | 763 | static struct class_device_attribute *aac_attrs[] = { |
| 735 | &aac_model, | 764 | &aac_model, |
| @@ -738,6 +767,8 @@ static struct class_device_attribute *aac_attrs[] = { | |||
| 738 | &aac_monitor_version, | 767 | &aac_monitor_version, |
| 739 | &aac_bios_version, | 768 | &aac_bios_version, |
| 740 | &aac_serial_number, | 769 | &aac_serial_number, |
| 770 | &aac_max_channel, | ||
| 771 | &aac_max_id, | ||
| 741 | NULL | 772 | NULL |
| 742 | }; | 773 | }; |
| 743 | 774 | ||
| @@ -775,6 +806,7 @@ static struct scsi_host_template aac_driver_template = { | |||
| 775 | .cmd_per_lun = AAC_NUM_IO_FIB, | 806 | .cmd_per_lun = AAC_NUM_IO_FIB, |
| 776 | #endif | 807 | #endif |
| 777 | .use_clustering = ENABLE_CLUSTERING, | 808 | .use_clustering = ENABLE_CLUSTERING, |
| 809 | .emulated = 1, | ||
| 778 | }; | 810 | }; |
| 779 | 811 | ||
| 780 | 812 | ||
| @@ -798,10 +830,11 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
| 798 | error = pci_enable_device(pdev); | 830 | error = pci_enable_device(pdev); |
| 799 | if (error) | 831 | if (error) |
| 800 | goto out; | 832 | goto out; |
| 833 | error = -ENODEV; | ||
| 801 | 834 | ||
| 802 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) || | 835 | if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) || |
| 803 | pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) | 836 | pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) |
| 804 | goto out; | 837 | goto out_disable_pdev; |
| 805 | /* | 838 | /* |
| 806 | * If the quirk31 bit is set, the adapter needs adapter | 839 | * If the quirk31 bit is set, the adapter needs adapter |
| 807 | * to driver communication memory to be allocated below 2gig | 840 | * to driver communication memory to be allocated below 2gig |
| @@ -809,7 +842,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
| 809 | if (aac_drivers[index].quirks & AAC_QUIRK_31BIT) | 842 | if (aac_drivers[index].quirks & AAC_QUIRK_31BIT) |
| 810 | if (pci_set_dma_mask(pdev, DMA_31BIT_MASK) || | 843 | if (pci_set_dma_mask(pdev, DMA_31BIT_MASK) || |
| 811 | pci_set_consistent_dma_mask(pdev, DMA_31BIT_MASK)) | 844 | pci_set_consistent_dma_mask(pdev, DMA_31BIT_MASK)) |
| 812 | goto out; | 845 | goto out_disable_pdev; |
| 813 | 846 | ||
| 814 | pci_set_master(pdev); | 847 | pci_set_master(pdev); |
| 815 | 848 | ||
| @@ -904,9 +937,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev, | |||
| 904 | * physical channels are address by their actual physical number+1 | 937 | * physical channels are address by their actual physical number+1 |
| 905 | */ | 938 | */ |
| 906 | if (aac->nondasd_support == 1) | 939 | if (aac->nondasd_support == 1) |
| 907 | shost->max_channel = aac->maximum_num_channels + 1; | 940 | shost->max_channel = aac->maximum_num_channels; |
| 908 | else | 941 | else |
| 909 | shost->max_channel = 1; | 942 | shost->max_channel = 0; |
| 910 | 943 | ||
| 911 | aac_get_config_status(aac); | 944 | aac_get_config_status(aac); |
| 912 | aac_get_containers(aac); | 945 | aac_get_containers(aac); |
| @@ -1020,7 +1053,8 @@ static int __init aac_init(void) | |||
| 1020 | 1053 | ||
| 1021 | static void __exit aac_exit(void) | 1054 | static void __exit aac_exit(void) |
| 1022 | { | 1055 | { |
| 1023 | unregister_chrdev(aac_cfg_major, "aac"); | 1056 | if (aac_cfg_major > -1) |
| 1057 | unregister_chrdev(aac_cfg_major, "aac"); | ||
| 1024 | pci_unregister_driver(&aac_pci_driver); | 1058 | pci_unregister_driver(&aac_pci_driver); |
| 1025 | } | 1059 | } |
| 1026 | 1060 | ||
diff --git a/drivers/scsi/aacraid/rkt.c b/drivers/scsi/aacraid/rkt.c index e9b775d6bec9..7a23e027eb78 100644 --- a/drivers/scsi/aacraid/rkt.c +++ b/drivers/scsi/aacraid/rkt.c | |||
| @@ -183,7 +183,7 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, | |||
| 183 | /* | 183 | /* |
| 184 | * Yield the processor in case we are slow | 184 | * Yield the processor in case we are slow |
| 185 | */ | 185 | */ |
| 186 | schedule_timeout_uninterruptible(1); | 186 | msleep(1); |
| 187 | } | 187 | } |
| 188 | if (ok != 1) { | 188 | if (ok != 1) { |
| 189 | /* | 189 | /* |
| @@ -343,7 +343,7 @@ static int aac_rkt_check_health(struct aac_dev *dev) | |||
| 343 | NULL, NULL, NULL, NULL, NULL); | 343 | NULL, NULL, NULL, NULL, NULL); |
| 344 | pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), | 344 | pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), |
| 345 | post, paddr); | 345 | post, paddr); |
| 346 | if ((buffer[0] == '0') && (buffer[1] == 'x')) { | 346 | if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) { |
| 347 | ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); | 347 | ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); |
| 348 | ret <<= 4; | 348 | ret <<= 4; |
| 349 | ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); | 349 | ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); |
diff --git a/drivers/scsi/aacraid/rx.c b/drivers/scsi/aacraid/rx.c index 6998bc877dd6..729b9eb268c2 100644 --- a/drivers/scsi/aacraid/rx.c +++ b/drivers/scsi/aacraid/rx.c | |||
| @@ -183,7 +183,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, | |||
| 183 | /* | 183 | /* |
| 184 | * Yield the processor in case we are slow | 184 | * Yield the processor in case we are slow |
| 185 | */ | 185 | */ |
| 186 | schedule_timeout_uninterruptible(1); | 186 | msleep(1); |
| 187 | } | 187 | } |
| 188 | if (ok != 1) { | 188 | if (ok != 1) { |
| 189 | /* | 189 | /* |
| @@ -342,7 +342,7 @@ static int aac_rx_check_health(struct aac_dev *dev) | |||
| 342 | NULL, NULL, NULL, NULL, NULL); | 342 | NULL, NULL, NULL, NULL, NULL); |
| 343 | pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), | 343 | pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS), |
| 344 | post, paddr); | 344 | post, paddr); |
| 345 | if ((buffer[0] == '0') && (buffer[1] == 'x')) { | 345 | if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) { |
| 346 | ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); | 346 | ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10); |
| 347 | ret <<= 4; | 347 | ret <<= 4; |
| 348 | ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); | 348 | ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10); |
diff --git a/drivers/scsi/aacraid/sa.c b/drivers/scsi/aacraid/sa.c index 466f05cfbf0c..a53454908205 100644 --- a/drivers/scsi/aacraid/sa.c +++ b/drivers/scsi/aacraid/sa.c | |||
| @@ -189,7 +189,7 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, | |||
| 189 | ok = 1; | 189 | ok = 1; |
| 190 | break; | 190 | break; |
| 191 | } | 191 | } |
| 192 | schedule_timeout_uninterruptible(1); | 192 | msleep(1); |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | if (ok != 1) | 195 | if (ok != 1) |
diff --git a/drivers/scsi/aic7xxx/aic79xx.h b/drivers/scsi/aic7xxx/aic79xx.h index 1d11f7e77564..bb5166da4358 100644 --- a/drivers/scsi/aic7xxx/aic79xx.h +++ b/drivers/scsi/aic7xxx/aic79xx.h | |||
| @@ -372,7 +372,7 @@ typedef enum { | |||
| 372 | AHD_CURRENT_SENSING = 0x40000, | 372 | AHD_CURRENT_SENSING = 0x40000, |
| 373 | AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */ | 373 | AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */ |
| 374 | AHD_HP_BOARD = 0x100000, | 374 | AHD_HP_BOARD = 0x100000, |
| 375 | AHD_RESET_POLL_ACTIVE = 0x200000, | 375 | AHD_BUS_RESET_ACTIVE = 0x200000, |
| 376 | AHD_UPDATE_PEND_CMDS = 0x400000, | 376 | AHD_UPDATE_PEND_CMDS = 0x400000, |
| 377 | AHD_RUNNING_QOUTFIFO = 0x800000, | 377 | AHD_RUNNING_QOUTFIFO = 0x800000, |
| 378 | AHD_HAD_FIRST_SEL = 0x1000000 | 378 | AHD_HAD_FIRST_SEL = 0x1000000 |
| @@ -589,7 +589,7 @@ typedef enum { | |||
| 589 | SCB_PACKETIZED = 0x00800, | 589 | SCB_PACKETIZED = 0x00800, |
| 590 | SCB_EXPECT_PPR_BUSFREE = 0x01000, | 590 | SCB_EXPECT_PPR_BUSFREE = 0x01000, |
| 591 | SCB_PKT_SENSE = 0x02000, | 591 | SCB_PKT_SENSE = 0x02000, |
| 592 | SCB_CMDPHASE_ABORT = 0x04000, | 592 | SCB_EXTERNAL_RESET = 0x04000,/* Device was reset externally */ |
| 593 | SCB_ON_COL_LIST = 0x08000, | 593 | SCB_ON_COL_LIST = 0x08000, |
| 594 | SCB_SILENT = 0x10000 /* | 594 | SCB_SILENT = 0x10000 /* |
| 595 | * Be quiet about transmission type | 595 | * Be quiet about transmission type |
diff --git a/drivers/scsi/aic7xxx/aic79xx_core.c b/drivers/scsi/aic7xxx/aic79xx_core.c index 326a62226235..08771f6f6859 100644 --- a/drivers/scsi/aic7xxx/aic79xx_core.c +++ b/drivers/scsi/aic7xxx/aic79xx_core.c | |||
| @@ -207,7 +207,6 @@ static void ahd_add_scb_to_free_list(struct ahd_softc *ahd, | |||
| 207 | static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid, | 207 | static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid, |
| 208 | u_int prev, u_int next, u_int tid); | 208 | u_int prev, u_int next, u_int tid); |
| 209 | static void ahd_reset_current_bus(struct ahd_softc *ahd); | 209 | static void ahd_reset_current_bus(struct ahd_softc *ahd); |
| 210 | static ahd_callback_t ahd_reset_poll; | ||
| 211 | static ahd_callback_t ahd_stat_timer; | 210 | static ahd_callback_t ahd_stat_timer; |
| 212 | #ifdef AHD_DUMP_SEQ | 211 | #ifdef AHD_DUMP_SEQ |
| 213 | static void ahd_dumpseq(struct ahd_softc *ahd); | 212 | static void ahd_dumpseq(struct ahd_softc *ahd); |
| @@ -1054,12 +1053,10 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
| 1054 | * If a target takes us into the command phase | 1053 | * If a target takes us into the command phase |
| 1055 | * assume that it has been externally reset and | 1054 | * assume that it has been externally reset and |
| 1056 | * has thus lost our previous packetized negotiation | 1055 | * has thus lost our previous packetized negotiation |
| 1057 | * agreement. Since we have not sent an identify | 1056 | * agreement. |
| 1058 | * message and may not have fully qualified the | 1057 | * Revert to async/narrow transfers until we |
| 1059 | * connection, we change our command to TUR, assert | 1058 | * can renegotiate with the device and notify |
| 1060 | * ATN and ABORT the task when we go to message in | 1059 | * the OSM about the reset. |
| 1061 | * phase. The OSM will see the REQUEUE_REQUEST | ||
| 1062 | * status and retry the command. | ||
| 1063 | */ | 1060 | */ |
| 1064 | scbid = ahd_get_scbptr(ahd); | 1061 | scbid = ahd_get_scbptr(ahd); |
| 1065 | scb = ahd_lookup_scb(ahd, scbid); | 1062 | scb = ahd_lookup_scb(ahd, scbid); |
| @@ -1086,31 +1083,15 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat) | |||
| 1086 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, | 1083 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, |
| 1087 | /*offset*/0, /*ppr_options*/0, | 1084 | /*offset*/0, /*ppr_options*/0, |
| 1088 | AHD_TRANS_ACTIVE, /*paused*/TRUE); | 1085 | AHD_TRANS_ACTIVE, /*paused*/TRUE); |
| 1089 | ahd_outb(ahd, SCB_CDB_STORE, 0); | 1086 | scb->flags |= SCB_EXTERNAL_RESET; |
| 1090 | ahd_outb(ahd, SCB_CDB_STORE+1, 0); | ||
| 1091 | ahd_outb(ahd, SCB_CDB_STORE+2, 0); | ||
| 1092 | ahd_outb(ahd, SCB_CDB_STORE+3, 0); | ||
| 1093 | ahd_outb(ahd, SCB_CDB_STORE+4, 0); | ||
| 1094 | ahd_outb(ahd, SCB_CDB_STORE+5, 0); | ||
| 1095 | ahd_outb(ahd, SCB_CDB_LEN, 6); | ||
| 1096 | scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE); | ||
| 1097 | scb->hscb->control |= MK_MESSAGE; | ||
| 1098 | ahd_outb(ahd, SCB_CONTROL, scb->hscb->control); | ||
| 1099 | ahd_outb(ahd, MSG_OUT, HOST_MSG); | ||
| 1100 | ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid); | ||
| 1101 | /* | ||
| 1102 | * The lun is 0, regardless of the SCB's lun | ||
| 1103 | * as we have not sent an identify message. | ||
| 1104 | */ | ||
| 1105 | ahd_outb(ahd, SAVED_LUN, 0); | ||
| 1106 | ahd_outb(ahd, SEQ_FLAGS, 0); | ||
| 1107 | ahd_assert_atn(ahd); | ||
| 1108 | scb->flags &= ~SCB_PACKETIZED; | ||
| 1109 | scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT; | ||
| 1110 | ahd_freeze_devq(ahd, scb); | 1087 | ahd_freeze_devq(ahd, scb); |
| 1111 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); | 1088 | ahd_set_transaction_status(scb, CAM_REQUEUE_REQ); |
| 1112 | ahd_freeze_scb(scb); | 1089 | ahd_freeze_scb(scb); |
| 1113 | 1090 | ||
| 1091 | /* Notify XPT */ | ||
| 1092 | ahd_send_async(ahd, devinfo.channel, devinfo.target, | ||
| 1093 | CAM_LUN_WILDCARD, AC_SENT_BDR, NULL); | ||
| 1094 | |||
| 1114 | /* | 1095 | /* |
| 1115 | * Allow the sequencer to continue with | 1096 | * Allow the sequencer to continue with |
| 1116 | * non-pack processing. | 1097 | * non-pack processing. |
| @@ -1534,6 +1515,18 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat) | |||
| 1534 | lqistat1 = ahd_inb(ahd, LQISTAT1); | 1515 | lqistat1 = ahd_inb(ahd, LQISTAT1); |
| 1535 | lqostat0 = ahd_inb(ahd, LQOSTAT0); | 1516 | lqostat0 = ahd_inb(ahd, LQOSTAT0); |
| 1536 | busfreetime = ahd_inb(ahd, SSTAT2) & BUSFREETIME; | 1517 | busfreetime = ahd_inb(ahd, SSTAT2) & BUSFREETIME; |
| 1518 | |||
| 1519 | /* | ||
| 1520 | * Ignore external resets after a bus reset. | ||
| 1521 | */ | ||
| 1522 | if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE)) | ||
| 1523 | return; | ||
| 1524 | |||
| 1525 | /* | ||
| 1526 | * Clear bus reset flag | ||
| 1527 | */ | ||
| 1528 | ahd->flags &= ~AHD_BUS_RESET_ACTIVE; | ||
| 1529 | |||
| 1537 | if ((status0 & (SELDI|SELDO)) != 0) { | 1530 | if ((status0 & (SELDI|SELDO)) != 0) { |
| 1538 | u_int simode0; | 1531 | u_int simode0; |
| 1539 | 1532 | ||
| @@ -2207,22 +2200,6 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd) | |||
| 2207 | if (sent_msg == MSG_ABORT_TAG) | 2200 | if (sent_msg == MSG_ABORT_TAG) |
| 2208 | tag = SCB_GET_TAG(scb); | 2201 | tag = SCB_GET_TAG(scb); |
| 2209 | 2202 | ||
| 2210 | if ((scb->flags & SCB_CMDPHASE_ABORT) != 0) { | ||
| 2211 | /* | ||
| 2212 | * This abort is in response to an | ||
| 2213 | * unexpected switch to command phase | ||
| 2214 | * for a packetized connection. Since | ||
| 2215 | * the identify message was never sent, | ||
| 2216 | * "saved lun" is 0. We really want to | ||
| 2217 | * abort only the SCB that encountered | ||
| 2218 | * this error, which could have a different | ||
| 2219 | * lun. The SCB will be retried so the OS | ||
| 2220 | * will see the UA after renegotiating to | ||
| 2221 | * packetized. | ||
| 2222 | */ | ||
| 2223 | tag = SCB_GET_TAG(scb); | ||
| 2224 | saved_lun = scb->hscb->lun; | ||
| 2225 | } | ||
| 2226 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, | 2203 | found = ahd_abort_scbs(ahd, target, 'A', saved_lun, |
| 2227 | tag, ROLE_INITIATOR, | 2204 | tag, ROLE_INITIATOR, |
| 2228 | CAM_REQ_ABORTED); | 2205 | CAM_REQ_ABORTED); |
| @@ -7847,6 +7824,17 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
| 7847 | int found; | 7824 | int found; |
| 7848 | u_int fifo; | 7825 | u_int fifo; |
| 7849 | u_int next_fifo; | 7826 | u_int next_fifo; |
| 7827 | uint8_t scsiseq; | ||
| 7828 | |||
| 7829 | /* | ||
| 7830 | * Check if the last bus reset is cleared | ||
| 7831 | */ | ||
| 7832 | if (ahd->flags & AHD_BUS_RESET_ACTIVE) { | ||
| 7833 | printf("%s: bus reset still active\n", | ||
| 7834 | ahd_name(ahd)); | ||
| 7835 | return 0; | ||
| 7836 | } | ||
| 7837 | ahd->flags |= AHD_BUS_RESET_ACTIVE; | ||
| 7850 | 7838 | ||
| 7851 | ahd->pending_device = NULL; | 7839 | ahd->pending_device = NULL; |
| 7852 | 7840 | ||
| @@ -7860,6 +7848,12 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
| 7860 | /* Make sure the sequencer is in a safe location. */ | 7848 | /* Make sure the sequencer is in a safe location. */ |
| 7861 | ahd_clear_critical_section(ahd); | 7849 | ahd_clear_critical_section(ahd); |
| 7862 | 7850 | ||
| 7851 | /* | ||
| 7852 | * Run our command complete fifos to ensure that we perform | ||
| 7853 | * completion processing on any commands that 'completed' | ||
| 7854 | * before the reset occurred. | ||
| 7855 | */ | ||
| 7856 | ahd_run_qoutfifo(ahd); | ||
| 7863 | #ifdef AHD_TARGET_MODE | 7857 | #ifdef AHD_TARGET_MODE |
| 7864 | if ((ahd->flags & AHD_TARGETROLE) != 0) { | 7858 | if ((ahd->flags & AHD_TARGETROLE) != 0) { |
| 7865 | ahd_run_tqinfifo(ahd, /*paused*/TRUE); | 7859 | ahd_run_tqinfifo(ahd, /*paused*/TRUE); |
| @@ -7924,30 +7918,14 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
| 7924 | ahd_clear_fifo(ahd, 1); | 7918 | ahd_clear_fifo(ahd, 1); |
| 7925 | 7919 | ||
| 7926 | /* | 7920 | /* |
| 7927 | * Revert to async/narrow transfers until we renegotiate. | 7921 | * Reenable selections |
| 7928 | */ | 7922 | */ |
| 7929 | max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7; | 7923 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); |
| 7930 | for (target = 0; target <= max_scsiid; target++) { | 7924 | scsiseq = ahd_inb(ahd, SCSISEQ_TEMPLATE); |
| 7931 | 7925 | ahd_outb(ahd, SCSISEQ1, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP)); | |
| 7932 | if (ahd->enabled_targets[target] == NULL) | ||
| 7933 | continue; | ||
| 7934 | for (initiator = 0; initiator <= max_scsiid; initiator++) { | ||
| 7935 | struct ahd_devinfo devinfo; | ||
| 7936 | |||
| 7937 | ahd_compile_devinfo(&devinfo, target, initiator, | ||
| 7938 | CAM_LUN_WILDCARD, | ||
| 7939 | 'A', ROLE_UNKNOWN); | ||
| 7940 | ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT, | ||
| 7941 | AHD_TRANS_CUR, /*paused*/TRUE); | ||
| 7942 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, | ||
| 7943 | /*offset*/0, /*ppr_options*/0, | ||
| 7944 | AHD_TRANS_CUR, /*paused*/TRUE); | ||
| 7945 | } | ||
| 7946 | } | ||
| 7947 | 7926 | ||
| 7948 | #ifdef AHD_TARGET_MODE | ||
| 7949 | max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7; | 7927 | max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7; |
| 7950 | 7928 | #ifdef AHD_TARGET_MODE | |
| 7951 | /* | 7929 | /* |
| 7952 | * Send an immediate notify ccb to all target more peripheral | 7930 | * Send an immediate notify ccb to all target more peripheral |
| 7953 | * drivers affected by this action. | 7931 | * drivers affected by this action. |
| @@ -7975,51 +7953,31 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset) | |||
| 7975 | /* Notify the XPT that a bus reset occurred */ | 7953 | /* Notify the XPT that a bus reset occurred */ |
| 7976 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, | 7954 | ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD, |
| 7977 | CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); | 7955 | CAM_LUN_WILDCARD, AC_BUS_RESET, NULL); |
| 7978 | ahd_restart(ahd); | 7956 | |
| 7979 | /* | 7957 | /* |
| 7980 | * Freeze the SIMQ until our poller can determine that | 7958 | * Revert to async/narrow transfers until we renegotiate. |
| 7981 | * the bus reset has really gone away. We set the initial | ||
| 7982 | * timer to 0 to have the check performed as soon as possible | ||
| 7983 | * from the timer context. | ||
| 7984 | */ | 7959 | */ |
| 7985 | if ((ahd->flags & AHD_RESET_POLL_ACTIVE) == 0) { | 7960 | for (target = 0; target <= max_scsiid; target++) { |
| 7986 | ahd->flags |= AHD_RESET_POLL_ACTIVE; | ||
| 7987 | ahd_freeze_simq(ahd); | ||
| 7988 | ahd_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd); | ||
| 7989 | } | ||
| 7990 | return (found); | ||
| 7991 | } | ||
| 7992 | 7961 | ||
| 7962 | if (ahd->enabled_targets[target] == NULL) | ||
| 7963 | continue; | ||
| 7964 | for (initiator = 0; initiator <= max_scsiid; initiator++) { | ||
| 7965 | struct ahd_devinfo devinfo; | ||
| 7993 | 7966 | ||
| 7994 | #define AHD_RESET_POLL_US 1000 | 7967 | ahd_compile_devinfo(&devinfo, target, initiator, |
| 7995 | static void | 7968 | CAM_LUN_WILDCARD, |
| 7996 | ahd_reset_poll(void *arg) | 7969 | 'A', ROLE_UNKNOWN); |
| 7997 | { | 7970 | ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT, |
| 7998 | struct ahd_softc *ahd = arg; | 7971 | AHD_TRANS_CUR, /*paused*/TRUE); |
| 7999 | u_int scsiseq1; | 7972 | ahd_set_syncrate(ahd, &devinfo, /*period*/0, |
| 8000 | u_long s; | 7973 | /*offset*/0, /*ppr_options*/0, |
| 8001 | 7974 | AHD_TRANS_CUR, /*paused*/TRUE); | |
| 8002 | ahd_lock(ahd, &s); | 7975 | } |
| 8003 | ahd_pause(ahd); | ||
| 8004 | ahd_update_modes(ahd); | ||
| 8005 | ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI); | ||
| 8006 | ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI); | ||
| 8007 | if ((ahd_inb(ahd, SSTAT1) & SCSIRSTI) != 0) { | ||
| 8008 | ahd_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US, | ||
| 8009 | ahd_reset_poll, ahd); | ||
| 8010 | ahd_unpause(ahd); | ||
| 8011 | ahd_unlock(ahd, &s); | ||
| 8012 | return; | ||
| 8013 | } | 7976 | } |
| 8014 | 7977 | ||
| 8015 | /* Reset is now low. Complete chip reinitialization. */ | 7978 | ahd_restart(ahd); |
| 8016 | ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST); | 7979 | |
| 8017 | scsiseq1 = ahd_inb(ahd, SCSISEQ_TEMPLATE); | 7980 | return (found); |
| 8018 | ahd_outb(ahd, SCSISEQ1, scsiseq1 & (ENSELI|ENRSELI|ENAUTOATNP)); | ||
| 8019 | ahd_unpause(ahd); | ||
| 8020 | ahd->flags &= ~AHD_RESET_POLL_ACTIVE; | ||
| 8021 | ahd_unlock(ahd, &s); | ||
| 8022 | ahd_release_simq(ahd); | ||
| 8023 | } | 7981 | } |
| 8024 | 7982 | ||
| 8025 | /**************************** Statistics Processing ***************************/ | 7983 | /**************************** Statistics Processing ***************************/ |
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index bcced0a417e6..66e4a47bb9ee 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c | |||
| @@ -782,6 +782,7 @@ ahd_linux_bus_reset(struct scsi_cmnd *cmd) | |||
| 782 | { | 782 | { |
| 783 | struct ahd_softc *ahd; | 783 | struct ahd_softc *ahd; |
| 784 | int found; | 784 | int found; |
| 785 | unsigned long flags; | ||
| 785 | 786 | ||
| 786 | ahd = *(struct ahd_softc **)cmd->device->host->hostdata; | 787 | ahd = *(struct ahd_softc **)cmd->device->host->hostdata; |
| 787 | #ifdef AHD_DEBUG | 788 | #ifdef AHD_DEBUG |
| @@ -789,8 +790,11 @@ ahd_linux_bus_reset(struct scsi_cmnd *cmd) | |||
| 789 | printf("%s: Bus reset called for cmd %p\n", | 790 | printf("%s: Bus reset called for cmd %p\n", |
| 790 | ahd_name(ahd), cmd); | 791 | ahd_name(ahd), cmd); |
| 791 | #endif | 792 | #endif |
| 793 | ahd_lock(ahd, &flags); | ||
| 794 | |||
| 792 | found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', | 795 | found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A', |
| 793 | /*initiate reset*/TRUE); | 796 | /*initiate reset*/TRUE); |
| 797 | ahd_unlock(ahd, &flags); | ||
| 794 | 798 | ||
| 795 | if (bootverbose) | 799 | if (bootverbose) |
| 796 | printf("%s: SCSI bus reset delivered. " | 800 | printf("%s: SCSI bus reset delivered. " |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index eaefeddb2b4a..0a8ad37ae899 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
| @@ -168,7 +168,7 @@ static void release_event_pool(struct event_pool *pool, | |||
| 168 | ++in_use; | 168 | ++in_use; |
| 169 | if (pool->events[i].ext_list) { | 169 | if (pool->events[i].ext_list) { |
| 170 | dma_free_coherent(hostdata->dev, | 170 | dma_free_coherent(hostdata->dev, |
| 171 | SG_ALL * sizeof(struct memory_descriptor), | 171 | SG_ALL * sizeof(struct srp_direct_buf), |
| 172 | pool->events[i].ext_list, | 172 | pool->events[i].ext_list, |
| 173 | pool->events[i].ext_list_token); | 173 | pool->events[i].ext_list_token); |
| 174 | } | 174 | } |
| @@ -284,40 +284,37 @@ static void set_srp_direction(struct scsi_cmnd *cmd, | |||
| 284 | struct srp_cmd *srp_cmd, | 284 | struct srp_cmd *srp_cmd, |
| 285 | int numbuf) | 285 | int numbuf) |
| 286 | { | 286 | { |
| 287 | u8 fmt; | ||
| 288 | |||
| 287 | if (numbuf == 0) | 289 | if (numbuf == 0) |
| 288 | return; | 290 | return; |
| 289 | 291 | ||
| 290 | if (numbuf == 1) { | 292 | if (numbuf == 1) |
| 293 | fmt = SRP_DATA_DESC_DIRECT; | ||
| 294 | else { | ||
| 295 | fmt = SRP_DATA_DESC_INDIRECT; | ||
| 296 | numbuf = min(numbuf, MAX_INDIRECT_BUFS); | ||
| 297 | |||
| 291 | if (cmd->sc_data_direction == DMA_TO_DEVICE) | 298 | if (cmd->sc_data_direction == DMA_TO_DEVICE) |
| 292 | srp_cmd->data_out_format = SRP_DIRECT_BUFFER; | 299 | srp_cmd->data_out_desc_cnt = numbuf; |
| 293 | else | 300 | else |
| 294 | srp_cmd->data_in_format = SRP_DIRECT_BUFFER; | 301 | srp_cmd->data_in_desc_cnt = numbuf; |
| 295 | } else { | ||
| 296 | if (cmd->sc_data_direction == DMA_TO_DEVICE) { | ||
| 297 | srp_cmd->data_out_format = SRP_INDIRECT_BUFFER; | ||
| 298 | srp_cmd->data_out_count = | ||
| 299 | numbuf < MAX_INDIRECT_BUFS ? | ||
| 300 | numbuf: MAX_INDIRECT_BUFS; | ||
| 301 | } else { | ||
| 302 | srp_cmd->data_in_format = SRP_INDIRECT_BUFFER; | ||
| 303 | srp_cmd->data_in_count = | ||
| 304 | numbuf < MAX_INDIRECT_BUFS ? | ||
| 305 | numbuf: MAX_INDIRECT_BUFS; | ||
| 306 | } | ||
| 307 | } | 302 | } |
| 303 | |||
| 304 | if (cmd->sc_data_direction == DMA_TO_DEVICE) | ||
| 305 | srp_cmd->buf_fmt = fmt << 4; | ||
| 306 | else | ||
| 307 | srp_cmd->buf_fmt = fmt; | ||
| 308 | } | 308 | } |
| 309 | 309 | ||
| 310 | static void unmap_sg_list(int num_entries, | 310 | static void unmap_sg_list(int num_entries, |
| 311 | struct device *dev, | 311 | struct device *dev, |
| 312 | struct memory_descriptor *md) | 312 | struct srp_direct_buf *md) |
| 313 | { | 313 | { |
| 314 | int i; | 314 | int i; |
| 315 | 315 | ||
| 316 | for (i = 0; i < num_entries; ++i) { | 316 | for (i = 0; i < num_entries; ++i) |
| 317 | dma_unmap_single(dev, | 317 | dma_unmap_single(dev, md[i].va, md[i].len, DMA_BIDIRECTIONAL); |
| 318 | md[i].virtual_address, | ||
| 319 | md[i].length, DMA_BIDIRECTIONAL); | ||
| 320 | } | ||
| 321 | } | 318 | } |
| 322 | 319 | ||
| 323 | /** | 320 | /** |
| @@ -330,23 +327,26 @@ static void unmap_cmd_data(struct srp_cmd *cmd, | |||
| 330 | struct srp_event_struct *evt_struct, | 327 | struct srp_event_struct *evt_struct, |
| 331 | struct device *dev) | 328 | struct device *dev) |
| 332 | { | 329 | { |
| 333 | if ((cmd->data_out_format == SRP_NO_BUFFER) && | 330 | u8 out_fmt, in_fmt; |
| 334 | (cmd->data_in_format == SRP_NO_BUFFER)) | 331 | |
| 332 | out_fmt = cmd->buf_fmt >> 4; | ||
| 333 | in_fmt = cmd->buf_fmt & ((1U << 4) - 1); | ||
| 334 | |||
| 335 | if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC) | ||
| 335 | return; | 336 | return; |
| 336 | else if ((cmd->data_out_format == SRP_DIRECT_BUFFER) || | 337 | else if (out_fmt == SRP_DATA_DESC_DIRECT || |
| 337 | (cmd->data_in_format == SRP_DIRECT_BUFFER)) { | 338 | in_fmt == SRP_DATA_DESC_DIRECT) { |
| 338 | struct memory_descriptor *data = | 339 | struct srp_direct_buf *data = |
| 339 | (struct memory_descriptor *)cmd->additional_data; | 340 | (struct srp_direct_buf *) cmd->add_data; |
| 340 | dma_unmap_single(dev, data->virtual_address, data->length, | 341 | dma_unmap_single(dev, data->va, data->len, DMA_BIDIRECTIONAL); |
| 341 | DMA_BIDIRECTIONAL); | ||
| 342 | } else { | 342 | } else { |
| 343 | struct indirect_descriptor *indirect = | 343 | struct srp_indirect_buf *indirect = |
| 344 | (struct indirect_descriptor *)cmd->additional_data; | 344 | (struct srp_indirect_buf *) cmd->add_data; |
| 345 | int num_mapped = indirect->head.length / | 345 | int num_mapped = indirect->table_desc.len / |
| 346 | sizeof(indirect->list[0]); | 346 | sizeof(struct srp_direct_buf); |
| 347 | 347 | ||
| 348 | if (num_mapped <= MAX_INDIRECT_BUFS) { | 348 | if (num_mapped <= MAX_INDIRECT_BUFS) { |
| 349 | unmap_sg_list(num_mapped, dev, &indirect->list[0]); | 349 | unmap_sg_list(num_mapped, dev, &indirect->desc_list[0]); |
| 350 | return; | 350 | return; |
| 351 | } | 351 | } |
| 352 | 352 | ||
| @@ -356,17 +356,17 @@ static void unmap_cmd_data(struct srp_cmd *cmd, | |||
| 356 | 356 | ||
| 357 | static int map_sg_list(int num_entries, | 357 | static int map_sg_list(int num_entries, |
| 358 | struct scatterlist *sg, | 358 | struct scatterlist *sg, |
| 359 | struct memory_descriptor *md) | 359 | struct srp_direct_buf *md) |
| 360 | { | 360 | { |
| 361 | int i; | 361 | int i; |
| 362 | u64 total_length = 0; | 362 | u64 total_length = 0; |
| 363 | 363 | ||
| 364 | for (i = 0; i < num_entries; ++i) { | 364 | for (i = 0; i < num_entries; ++i) { |
| 365 | struct memory_descriptor *descr = md + i; | 365 | struct srp_direct_buf *descr = md + i; |
| 366 | struct scatterlist *sg_entry = &sg[i]; | 366 | struct scatterlist *sg_entry = &sg[i]; |
| 367 | descr->virtual_address = sg_dma_address(sg_entry); | 367 | descr->va = sg_dma_address(sg_entry); |
| 368 | descr->length = sg_dma_len(sg_entry); | 368 | descr->len = sg_dma_len(sg_entry); |
| 369 | descr->memory_handle = 0; | 369 | descr->key = 0; |
| 370 | total_length += sg_dma_len(sg_entry); | 370 | total_length += sg_dma_len(sg_entry); |
| 371 | } | 371 | } |
| 372 | return total_length; | 372 | return total_length; |
| @@ -389,10 +389,10 @@ static int map_sg_data(struct scsi_cmnd *cmd, | |||
| 389 | int sg_mapped; | 389 | int sg_mapped; |
| 390 | u64 total_length = 0; | 390 | u64 total_length = 0; |
| 391 | struct scatterlist *sg = cmd->request_buffer; | 391 | struct scatterlist *sg = cmd->request_buffer; |
| 392 | struct memory_descriptor *data = | 392 | struct srp_direct_buf *data = |
| 393 | (struct memory_descriptor *)srp_cmd->additional_data; | 393 | (struct srp_direct_buf *) srp_cmd->add_data; |
| 394 | struct indirect_descriptor *indirect = | 394 | struct srp_indirect_buf *indirect = |
| 395 | (struct indirect_descriptor *)data; | 395 | (struct srp_indirect_buf *) data; |
| 396 | 396 | ||
| 397 | sg_mapped = dma_map_sg(dev, sg, cmd->use_sg, DMA_BIDIRECTIONAL); | 397 | sg_mapped = dma_map_sg(dev, sg, cmd->use_sg, DMA_BIDIRECTIONAL); |
| 398 | 398 | ||
| @@ -403,9 +403,9 @@ static int map_sg_data(struct scsi_cmnd *cmd, | |||
| 403 | 403 | ||
| 404 | /* special case; we can use a single direct descriptor */ | 404 | /* special case; we can use a single direct descriptor */ |
| 405 | if (sg_mapped == 1) { | 405 | if (sg_mapped == 1) { |
| 406 | data->virtual_address = sg_dma_address(&sg[0]); | 406 | data->va = sg_dma_address(&sg[0]); |
| 407 | data->length = sg_dma_len(&sg[0]); | 407 | data->len = sg_dma_len(&sg[0]); |
| 408 | data->memory_handle = 0; | 408 | data->key = 0; |
| 409 | return 1; | 409 | return 1; |
| 410 | } | 410 | } |
| 411 | 411 | ||
| @@ -416,25 +416,26 @@ static int map_sg_data(struct scsi_cmnd *cmd, | |||
| 416 | return 0; | 416 | return 0; |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | indirect->head.virtual_address = 0; | 419 | indirect->table_desc.va = 0; |
| 420 | indirect->head.length = sg_mapped * sizeof(indirect->list[0]); | 420 | indirect->table_desc.len = sg_mapped * sizeof(struct srp_direct_buf); |
| 421 | indirect->head.memory_handle = 0; | 421 | indirect->table_desc.key = 0; |
| 422 | 422 | ||
| 423 | if (sg_mapped <= MAX_INDIRECT_BUFS) { | 423 | if (sg_mapped <= MAX_INDIRECT_BUFS) { |
| 424 | total_length = map_sg_list(sg_mapped, sg, &indirect->list[0]); | 424 | total_length = map_sg_list(sg_mapped, sg, |
| 425 | indirect->total_length = total_length; | 425 | &indirect->desc_list[0]); |
| 426 | indirect->len = total_length; | ||
| 426 | return 1; | 427 | return 1; |
| 427 | } | 428 | } |
| 428 | 429 | ||
| 429 | /* get indirect table */ | 430 | /* get indirect table */ |
| 430 | if (!evt_struct->ext_list) { | 431 | if (!evt_struct->ext_list) { |
| 431 | evt_struct->ext_list =(struct memory_descriptor*) | 432 | evt_struct->ext_list = (struct srp_direct_buf *) |
| 432 | dma_alloc_coherent(dev, | 433 | dma_alloc_coherent(dev, |
| 433 | SG_ALL * sizeof(struct memory_descriptor), | 434 | SG_ALL * sizeof(struct srp_direct_buf), |
| 434 | &evt_struct->ext_list_token, 0); | 435 | &evt_struct->ext_list_token, 0); |
| 435 | if (!evt_struct->ext_list) { | 436 | if (!evt_struct->ext_list) { |
| 436 | printk(KERN_ERR | 437 | printk(KERN_ERR |
| 437 | "ibmvscsi: Can't allocate memory for indirect table\n"); | 438 | "ibmvscsi: Can't allocate memory for indirect table\n"); |
| 438 | return 0; | 439 | return 0; |
| 439 | 440 | ||
| 440 | } | 441 | } |
| @@ -442,11 +443,11 @@ static int map_sg_data(struct scsi_cmnd *cmd, | |||
| 442 | 443 | ||
| 443 | total_length = map_sg_list(sg_mapped, sg, evt_struct->ext_list); | 444 | total_length = map_sg_list(sg_mapped, sg, evt_struct->ext_list); |
| 444 | 445 | ||
| 445 | indirect->total_length = total_length; | 446 | indirect->len = total_length; |
| 446 | indirect->head.virtual_address = evt_struct->ext_list_token; | 447 | indirect->table_desc.va = evt_struct->ext_list_token; |
| 447 | indirect->head.length = sg_mapped * sizeof(indirect->list[0]); | 448 | indirect->table_desc.len = sg_mapped * sizeof(indirect->desc_list[0]); |
| 448 | memcpy(indirect->list, evt_struct->ext_list, | 449 | memcpy(indirect->desc_list, evt_struct->ext_list, |
| 449 | MAX_INDIRECT_BUFS * sizeof(struct memory_descriptor)); | 450 | MAX_INDIRECT_BUFS * sizeof(struct srp_direct_buf)); |
| 450 | 451 | ||
| 451 | return 1; | 452 | return 1; |
| 452 | } | 453 | } |
| @@ -463,20 +464,20 @@ static int map_sg_data(struct scsi_cmnd *cmd, | |||
| 463 | static int map_single_data(struct scsi_cmnd *cmd, | 464 | static int map_single_data(struct scsi_cmnd *cmd, |
| 464 | struct srp_cmd *srp_cmd, struct device *dev) | 465 | struct srp_cmd *srp_cmd, struct device *dev) |
| 465 | { | 466 | { |
| 466 | struct memory_descriptor *data = | 467 | struct srp_direct_buf *data = |
| 467 | (struct memory_descriptor *)srp_cmd->additional_data; | 468 | (struct srp_direct_buf *) srp_cmd->add_data; |
| 468 | 469 | ||
| 469 | data->virtual_address = | 470 | data->va = |
| 470 | dma_map_single(dev, cmd->request_buffer, | 471 | dma_map_single(dev, cmd->request_buffer, |
| 471 | cmd->request_bufflen, | 472 | cmd->request_bufflen, |
| 472 | DMA_BIDIRECTIONAL); | 473 | DMA_BIDIRECTIONAL); |
| 473 | if (dma_mapping_error(data->virtual_address)) { | 474 | if (dma_mapping_error(data->va)) { |
| 474 | printk(KERN_ERR | 475 | printk(KERN_ERR |
| 475 | "ibmvscsi: Unable to map request_buffer for command!\n"); | 476 | "ibmvscsi: Unable to map request_buffer for command!\n"); |
| 476 | return 0; | 477 | return 0; |
| 477 | } | 478 | } |
| 478 | data->length = cmd->request_bufflen; | 479 | data->len = cmd->request_bufflen; |
| 479 | data->memory_handle = 0; | 480 | data->key = 0; |
| 480 | 481 | ||
| 481 | set_srp_direction(cmd, srp_cmd, 1); | 482 | set_srp_direction(cmd, srp_cmd, 1); |
| 482 | 483 | ||
| @@ -548,7 +549,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct, | |||
| 548 | 549 | ||
| 549 | /* Copy the IU into the transfer area */ | 550 | /* Copy the IU into the transfer area */ |
| 550 | *evt_struct->xfer_iu = evt_struct->iu; | 551 | *evt_struct->xfer_iu = evt_struct->iu; |
| 551 | evt_struct->xfer_iu->srp.generic.tag = (u64)evt_struct; | 552 | evt_struct->xfer_iu->srp.rsp.tag = (u64)evt_struct; |
| 552 | 553 | ||
| 553 | /* Add this to the sent list. We need to do this | 554 | /* Add this to the sent list. We need to do this |
| 554 | * before we actually send | 555 | * before we actually send |
| @@ -586,27 +587,27 @@ static void handle_cmd_rsp(struct srp_event_struct *evt_struct) | |||
| 586 | struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp; | 587 | struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp; |
| 587 | struct scsi_cmnd *cmnd = evt_struct->cmnd; | 588 | struct scsi_cmnd *cmnd = evt_struct->cmnd; |
| 588 | 589 | ||
| 589 | if (unlikely(rsp->type != SRP_RSP_TYPE)) { | 590 | if (unlikely(rsp->opcode != SRP_RSP)) { |
| 590 | if (printk_ratelimit()) | 591 | if (printk_ratelimit()) |
| 591 | printk(KERN_WARNING | 592 | printk(KERN_WARNING |
| 592 | "ibmvscsi: bad SRP RSP type %d\n", | 593 | "ibmvscsi: bad SRP RSP type %d\n", |
| 593 | rsp->type); | 594 | rsp->opcode); |
| 594 | } | 595 | } |
| 595 | 596 | ||
| 596 | if (cmnd) { | 597 | if (cmnd) { |
| 597 | cmnd->result = rsp->status; | 598 | cmnd->result = rsp->status; |
| 598 | if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION) | 599 | if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION) |
| 599 | memcpy(cmnd->sense_buffer, | 600 | memcpy(cmnd->sense_buffer, |
| 600 | rsp->sense_and_response_data, | 601 | rsp->data, |
| 601 | rsp->sense_data_list_length); | 602 | rsp->sense_data_len); |
| 602 | unmap_cmd_data(&evt_struct->iu.srp.cmd, | 603 | unmap_cmd_data(&evt_struct->iu.srp.cmd, |
| 603 | evt_struct, | 604 | evt_struct, |
| 604 | evt_struct->hostdata->dev); | 605 | evt_struct->hostdata->dev); |
| 605 | 606 | ||
| 606 | if (rsp->doover) | 607 | if (rsp->flags & SRP_RSP_FLAG_DOOVER) |
| 607 | cmnd->resid = rsp->data_out_residual_count; | 608 | cmnd->resid = rsp->data_out_res_cnt; |
| 608 | else if (rsp->diover) | 609 | else if (rsp->flags & SRP_RSP_FLAG_DIOVER) |
| 609 | cmnd->resid = rsp->data_in_residual_count; | 610 | cmnd->resid = rsp->data_in_res_cnt; |
| 610 | } | 611 | } |
| 611 | 612 | ||
| 612 | if (evt_struct->cmnd_done) | 613 | if (evt_struct->cmnd_done) |
| @@ -633,10 +634,11 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, | |||
| 633 | { | 634 | { |
| 634 | struct srp_cmd *srp_cmd; | 635 | struct srp_cmd *srp_cmd; |
| 635 | struct srp_event_struct *evt_struct; | 636 | struct srp_event_struct *evt_struct; |
| 636 | struct indirect_descriptor *indirect; | 637 | struct srp_indirect_buf *indirect; |
| 637 | struct ibmvscsi_host_data *hostdata = | 638 | struct ibmvscsi_host_data *hostdata = |
| 638 | (struct ibmvscsi_host_data *)&cmnd->device->host->hostdata; | 639 | (struct ibmvscsi_host_data *)&cmnd->device->host->hostdata; |
| 639 | u16 lun = lun_from_dev(cmnd->device); | 640 | u16 lun = lun_from_dev(cmnd->device); |
| 641 | u8 out_fmt, in_fmt; | ||
| 640 | 642 | ||
| 641 | evt_struct = get_event_struct(&hostdata->pool); | 643 | evt_struct = get_event_struct(&hostdata->pool); |
| 642 | if (!evt_struct) | 644 | if (!evt_struct) |
| @@ -644,8 +646,8 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, | |||
| 644 | 646 | ||
| 645 | /* Set up the actual SRP IU */ | 647 | /* Set up the actual SRP IU */ |
| 646 | srp_cmd = &evt_struct->iu.srp.cmd; | 648 | srp_cmd = &evt_struct->iu.srp.cmd; |
| 647 | memset(srp_cmd, 0x00, sizeof(*srp_cmd)); | 649 | memset(srp_cmd, 0x00, SRP_MAX_IU_LEN); |
| 648 | srp_cmd->type = SRP_CMD_TYPE; | 650 | srp_cmd->opcode = SRP_CMD; |
| 649 | memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(cmnd->cmnd)); | 651 | memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(cmnd->cmnd)); |
| 650 | srp_cmd->lun = ((u64) lun) << 48; | 652 | srp_cmd->lun = ((u64) lun) << 48; |
| 651 | 653 | ||
| @@ -664,13 +666,15 @@ static int ibmvscsi_queuecommand(struct scsi_cmnd *cmnd, | |||
| 664 | evt_struct->cmnd_done = done; | 666 | evt_struct->cmnd_done = done; |
| 665 | 667 | ||
| 666 | /* Fix up dma address of the buffer itself */ | 668 | /* Fix up dma address of the buffer itself */ |
| 667 | indirect = (struct indirect_descriptor *)srp_cmd->additional_data; | 669 | indirect = (struct srp_indirect_buf *) srp_cmd->add_data; |
| 668 | if (((srp_cmd->data_out_format == SRP_INDIRECT_BUFFER) || | 670 | out_fmt = srp_cmd->buf_fmt >> 4; |
| 669 | (srp_cmd->data_in_format == SRP_INDIRECT_BUFFER)) && | 671 | in_fmt = srp_cmd->buf_fmt & ((1U << 4) - 1); |
| 670 | (indirect->head.virtual_address == 0)) { | 672 | if ((in_fmt == SRP_DATA_DESC_INDIRECT || |
| 671 | indirect->head.virtual_address = evt_struct->crq.IU_data_ptr + | 673 | out_fmt == SRP_DATA_DESC_INDIRECT) && |
| 672 | offsetof(struct srp_cmd, additional_data) + | 674 | indirect->table_desc.va == 0) { |
| 673 | offsetof(struct indirect_descriptor, list); | 675 | indirect->table_desc.va = evt_struct->crq.IU_data_ptr + |
| 676 | offsetof(struct srp_cmd, add_data) + | ||
| 677 | offsetof(struct srp_indirect_buf, desc_list); | ||
| 674 | } | 678 | } |
| 675 | 679 | ||
| 676 | return ibmvscsi_send_srp_event(evt_struct, hostdata); | 680 | return ibmvscsi_send_srp_event(evt_struct, hostdata); |
| @@ -780,10 +784,10 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata) | |||
| 780 | static void login_rsp(struct srp_event_struct *evt_struct) | 784 | static void login_rsp(struct srp_event_struct *evt_struct) |
| 781 | { | 785 | { |
| 782 | struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; | 786 | struct ibmvscsi_host_data *hostdata = evt_struct->hostdata; |
| 783 | switch (evt_struct->xfer_iu->srp.generic.type) { | 787 | switch (evt_struct->xfer_iu->srp.login_rsp.opcode) { |
| 784 | case SRP_LOGIN_RSP_TYPE: /* it worked! */ | 788 | case SRP_LOGIN_RSP: /* it worked! */ |
| 785 | break; | 789 | break; |
| 786 | case SRP_LOGIN_REJ_TYPE: /* refused! */ | 790 | case SRP_LOGIN_REJ: /* refused! */ |
| 787 | printk(KERN_INFO "ibmvscsi: SRP_LOGIN_REJ reason %u\n", | 791 | printk(KERN_INFO "ibmvscsi: SRP_LOGIN_REJ reason %u\n", |
| 788 | evt_struct->xfer_iu->srp.login_rej.reason); | 792 | evt_struct->xfer_iu->srp.login_rej.reason); |
| 789 | /* Login failed. */ | 793 | /* Login failed. */ |
| @@ -792,7 +796,7 @@ static void login_rsp(struct srp_event_struct *evt_struct) | |||
| 792 | default: | 796 | default: |
| 793 | printk(KERN_ERR | 797 | printk(KERN_ERR |
| 794 | "ibmvscsi: Invalid login response typecode 0x%02x!\n", | 798 | "ibmvscsi: Invalid login response typecode 0x%02x!\n", |
| 795 | evt_struct->xfer_iu->srp.generic.type); | 799 | evt_struct->xfer_iu->srp.login_rsp.opcode); |
| 796 | /* Login failed. */ | 800 | /* Login failed. */ |
| 797 | atomic_set(&hostdata->request_limit, -1); | 801 | atomic_set(&hostdata->request_limit, -1); |
| 798 | return; | 802 | return; |
| @@ -800,17 +804,17 @@ static void login_rsp(struct srp_event_struct *evt_struct) | |||
| 800 | 804 | ||
| 801 | printk(KERN_INFO "ibmvscsi: SRP_LOGIN succeeded\n"); | 805 | printk(KERN_INFO "ibmvscsi: SRP_LOGIN succeeded\n"); |
| 802 | 806 | ||
| 803 | if (evt_struct->xfer_iu->srp.login_rsp.request_limit_delta > | 807 | if (evt_struct->xfer_iu->srp.login_rsp.req_lim_delta > |
| 804 | (max_requests - 2)) | 808 | (max_requests - 2)) |
| 805 | evt_struct->xfer_iu->srp.login_rsp.request_limit_delta = | 809 | evt_struct->xfer_iu->srp.login_rsp.req_lim_delta = |
| 806 | max_requests - 2; | 810 | max_requests - 2; |
| 807 | 811 | ||
| 808 | /* Now we know what the real request-limit is */ | 812 | /* Now we know what the real request-limit is */ |
| 809 | atomic_set(&hostdata->request_limit, | 813 | atomic_set(&hostdata->request_limit, |
| 810 | evt_struct->xfer_iu->srp.login_rsp.request_limit_delta); | 814 | evt_struct->xfer_iu->srp.login_rsp.req_lim_delta); |
| 811 | 815 | ||
| 812 | hostdata->host->can_queue = | 816 | hostdata->host->can_queue = |
| 813 | evt_struct->xfer_iu->srp.login_rsp.request_limit_delta - 2; | 817 | evt_struct->xfer_iu->srp.login_rsp.req_lim_delta - 2; |
| 814 | 818 | ||
| 815 | if (hostdata->host->can_queue < 1) { | 819 | if (hostdata->host->can_queue < 1) { |
| 816 | printk(KERN_ERR "ibmvscsi: Invalid request_limit_delta\n"); | 820 | printk(KERN_ERR "ibmvscsi: Invalid request_limit_delta\n"); |
| @@ -849,18 +853,19 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata) | |||
| 849 | 853 | ||
| 850 | login = &evt_struct->iu.srp.login_req; | 854 | login = &evt_struct->iu.srp.login_req; |
| 851 | memset(login, 0x00, sizeof(struct srp_login_req)); | 855 | memset(login, 0x00, sizeof(struct srp_login_req)); |
| 852 | login->type = SRP_LOGIN_REQ_TYPE; | 856 | login->opcode = SRP_LOGIN_REQ; |
| 853 | login->max_requested_initiator_to_target_iulen = sizeof(union srp_iu); | 857 | login->req_it_iu_len = sizeof(union srp_iu); |
| 854 | login->required_buffer_formats = 0x0006; | 858 | login->req_buf_fmt = SRP_BUF_FORMAT_DIRECT | SRP_BUF_FORMAT_INDIRECT; |
| 855 | 859 | ||
| 860 | spin_lock_irqsave(hostdata->host->host_lock, flags); | ||
| 856 | /* Start out with a request limit of 1, since this is negotiated in | 861 | /* Start out with a request limit of 1, since this is negotiated in |
| 857 | * the login request we are just sending | 862 | * the login request we are just sending |
| 858 | */ | 863 | */ |
| 859 | atomic_set(&hostdata->request_limit, 1); | 864 | atomic_set(&hostdata->request_limit, 1); |
| 860 | 865 | ||
| 861 | spin_lock_irqsave(hostdata->host->host_lock, flags); | ||
| 862 | rc = ibmvscsi_send_srp_event(evt_struct, hostdata); | 866 | rc = ibmvscsi_send_srp_event(evt_struct, hostdata); |
| 863 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); | 867 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); |
| 868 | printk("ibmvscsic: sent SRP login\n"); | ||
| 864 | return rc; | 869 | return rc; |
| 865 | }; | 870 | }; |
| 866 | 871 | ||
| @@ -928,13 +933,13 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) | |||
| 928 | 933 | ||
| 929 | /* Set up an abort SRP command */ | 934 | /* Set up an abort SRP command */ |
| 930 | memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); | 935 | memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); |
| 931 | tsk_mgmt->type = SRP_TSK_MGMT_TYPE; | 936 | tsk_mgmt->opcode = SRP_TSK_MGMT; |
| 932 | tsk_mgmt->lun = ((u64) lun) << 48; | 937 | tsk_mgmt->lun = ((u64) lun) << 48; |
| 933 | tsk_mgmt->task_mgmt_flags = 0x01; /* ABORT TASK */ | 938 | tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK; |
| 934 | tsk_mgmt->managed_task_tag = (u64) found_evt; | 939 | tsk_mgmt->task_tag = (u64) found_evt; |
| 935 | 940 | ||
| 936 | printk(KERN_INFO "ibmvscsi: aborting command. lun 0x%lx, tag 0x%lx\n", | 941 | printk(KERN_INFO "ibmvscsi: aborting command. lun 0x%lx, tag 0x%lx\n", |
| 937 | tsk_mgmt->lun, tsk_mgmt->managed_task_tag); | 942 | tsk_mgmt->lun, tsk_mgmt->task_tag); |
| 938 | 943 | ||
| 939 | evt->sync_srp = &srp_rsp; | 944 | evt->sync_srp = &srp_rsp; |
| 940 | init_completion(&evt->comp); | 945 | init_completion(&evt->comp); |
| @@ -948,25 +953,25 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) | |||
| 948 | wait_for_completion(&evt->comp); | 953 | wait_for_completion(&evt->comp); |
| 949 | 954 | ||
| 950 | /* make sure we got a good response */ | 955 | /* make sure we got a good response */ |
| 951 | if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) { | 956 | if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) { |
| 952 | if (printk_ratelimit()) | 957 | if (printk_ratelimit()) |
| 953 | printk(KERN_WARNING | 958 | printk(KERN_WARNING |
| 954 | "ibmvscsi: abort bad SRP RSP type %d\n", | 959 | "ibmvscsi: abort bad SRP RSP type %d\n", |
| 955 | srp_rsp.srp.generic.type); | 960 | srp_rsp.srp.rsp.opcode); |
| 956 | return FAILED; | 961 | return FAILED; |
| 957 | } | 962 | } |
| 958 | 963 | ||
| 959 | if (srp_rsp.srp.rsp.rspvalid) | 964 | if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID) |
| 960 | rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data); | 965 | rsp_rc = *((int *)srp_rsp.srp.rsp.data); |
| 961 | else | 966 | else |
| 962 | rsp_rc = srp_rsp.srp.rsp.status; | 967 | rsp_rc = srp_rsp.srp.rsp.status; |
| 963 | 968 | ||
| 964 | if (rsp_rc) { | 969 | if (rsp_rc) { |
| 965 | if (printk_ratelimit()) | 970 | if (printk_ratelimit()) |
| 966 | printk(KERN_WARNING | 971 | printk(KERN_WARNING |
| 967 | "ibmvscsi: abort code %d for task tag 0x%lx\n", | 972 | "ibmvscsi: abort code %d for task tag 0x%lx\n", |
| 968 | rsp_rc, | 973 | rsp_rc, |
| 969 | tsk_mgmt->managed_task_tag); | 974 | tsk_mgmt->task_tag); |
| 970 | return FAILED; | 975 | return FAILED; |
| 971 | } | 976 | } |
| 972 | 977 | ||
| @@ -987,13 +992,13 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd) | |||
| 987 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); | 992 | spin_unlock_irqrestore(hostdata->host->host_lock, flags); |
| 988 | printk(KERN_INFO | 993 | printk(KERN_INFO |
| 989 | "ibmvscsi: aborted task tag 0x%lx completed\n", | 994 | "ibmvscsi: aborted task tag 0x%lx completed\n", |
| 990 | tsk_mgmt->managed_task_tag); | 995 | tsk_mgmt->task_tag); |
| 991 | return SUCCESS; | 996 | return SUCCESS; |
| 992 | } | 997 | } |
| 993 | 998 | ||
| 994 | printk(KERN_INFO | 999 | printk(KERN_INFO |
| 995 | "ibmvscsi: successfully aborted task tag 0x%lx\n", | 1000 | "ibmvscsi: successfully aborted task tag 0x%lx\n", |
| 996 | tsk_mgmt->managed_task_tag); | 1001 | tsk_mgmt->task_tag); |
| 997 | 1002 | ||
| 998 | cmd->result = (DID_ABORT << 16); | 1003 | cmd->result = (DID_ABORT << 16); |
| 999 | list_del(&found_evt->list); | 1004 | list_del(&found_evt->list); |
| @@ -1040,9 +1045,9 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) | |||
| 1040 | 1045 | ||
| 1041 | /* Set up a lun reset SRP command */ | 1046 | /* Set up a lun reset SRP command */ |
| 1042 | memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); | 1047 | memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt)); |
| 1043 | tsk_mgmt->type = SRP_TSK_MGMT_TYPE; | 1048 | tsk_mgmt->opcode = SRP_TSK_MGMT; |
| 1044 | tsk_mgmt->lun = ((u64) lun) << 48; | 1049 | tsk_mgmt->lun = ((u64) lun) << 48; |
| 1045 | tsk_mgmt->task_mgmt_flags = 0x08; /* LUN RESET */ | 1050 | tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET; |
| 1046 | 1051 | ||
| 1047 | printk(KERN_INFO "ibmvscsi: resetting device. lun 0x%lx\n", | 1052 | printk(KERN_INFO "ibmvscsi: resetting device. lun 0x%lx\n", |
| 1048 | tsk_mgmt->lun); | 1053 | tsk_mgmt->lun); |
| @@ -1059,16 +1064,16 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) | |||
| 1059 | wait_for_completion(&evt->comp); | 1064 | wait_for_completion(&evt->comp); |
| 1060 | 1065 | ||
| 1061 | /* make sure we got a good response */ | 1066 | /* make sure we got a good response */ |
| 1062 | if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) { | 1067 | if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) { |
| 1063 | if (printk_ratelimit()) | 1068 | if (printk_ratelimit()) |
| 1064 | printk(KERN_WARNING | 1069 | printk(KERN_WARNING |
| 1065 | "ibmvscsi: reset bad SRP RSP type %d\n", | 1070 | "ibmvscsi: reset bad SRP RSP type %d\n", |
| 1066 | srp_rsp.srp.generic.type); | 1071 | srp_rsp.srp.rsp.opcode); |
| 1067 | return FAILED; | 1072 | return FAILED; |
| 1068 | } | 1073 | } |
| 1069 | 1074 | ||
| 1070 | if (srp_rsp.srp.rsp.rspvalid) | 1075 | if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID) |
| 1071 | rsp_rc = *((int *)srp_rsp.srp.rsp.sense_and_response_data); | 1076 | rsp_rc = *((int *)srp_rsp.srp.rsp.data); |
| 1072 | else | 1077 | else |
| 1073 | rsp_rc = srp_rsp.srp.rsp.status; | 1078 | rsp_rc = srp_rsp.srp.rsp.status; |
| 1074 | 1079 | ||
| @@ -1076,8 +1081,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd) | |||
| 1076 | if (printk_ratelimit()) | 1081 | if (printk_ratelimit()) |
| 1077 | printk(KERN_WARNING | 1082 | printk(KERN_WARNING |
| 1078 | "ibmvscsi: reset code %d for task tag 0x%lx\n", | 1083 | "ibmvscsi: reset code %d for task tag 0x%lx\n", |
| 1079 | rsp_rc, | 1084 | rsp_rc, tsk_mgmt->task_tag); |
| 1080 | tsk_mgmt->managed_task_tag); | ||
| 1081 | return FAILED; | 1085 | return FAILED; |
| 1082 | } | 1086 | } |
| 1083 | 1087 | ||
| @@ -1179,6 +1183,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, | |||
| 1179 | /* We need to re-setup the interpartition connection */ | 1183 | /* We need to re-setup the interpartition connection */ |
| 1180 | printk(KERN_INFO | 1184 | printk(KERN_INFO |
| 1181 | "ibmvscsi: Re-enabling adapter!\n"); | 1185 | "ibmvscsi: Re-enabling adapter!\n"); |
| 1186 | atomic_set(&hostdata->request_limit, -1); | ||
| 1182 | purge_requests(hostdata, DID_REQUEUE); | 1187 | purge_requests(hostdata, DID_REQUEUE); |
| 1183 | if (ibmvscsi_reenable_crq_queue(&hostdata->queue, | 1188 | if (ibmvscsi_reenable_crq_queue(&hostdata->queue, |
| 1184 | hostdata) == 0) | 1189 | hostdata) == 0) |
| @@ -1226,7 +1231,7 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq, | |||
| 1226 | } | 1231 | } |
| 1227 | 1232 | ||
| 1228 | if (crq->format == VIOSRP_SRP_FORMAT) | 1233 | if (crq->format == VIOSRP_SRP_FORMAT) |
| 1229 | atomic_add(evt_struct->xfer_iu->srp.rsp.request_limit_delta, | 1234 | atomic_add(evt_struct->xfer_iu->srp.rsp.req_lim_delta, |
| 1230 | &hostdata->request_limit); | 1235 | &hostdata->request_limit); |
| 1231 | 1236 | ||
| 1232 | if (evt_struct->done) | 1237 | if (evt_struct->done) |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h index 4550d71e4744..5c6d93582929 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.h +++ b/drivers/scsi/ibmvscsi/ibmvscsi.h | |||
| @@ -68,7 +68,7 @@ struct srp_event_struct { | |||
| 68 | void (*cmnd_done) (struct scsi_cmnd *); | 68 | void (*cmnd_done) (struct scsi_cmnd *); |
| 69 | struct completion comp; | 69 | struct completion comp; |
| 70 | union viosrp_iu *sync_srp; | 70 | union viosrp_iu *sync_srp; |
| 71 | struct memory_descriptor *ext_list; | 71 | struct srp_direct_buf *ext_list; |
| 72 | dma_addr_t ext_list_token; | 72 | dma_addr_t ext_list_token; |
| 73 | }; | 73 | }; |
| 74 | 74 | ||
diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c index 892e8ed63091..1a9992bdfef8 100644 --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c | |||
| @@ -34,7 +34,6 @@ | |||
| 34 | #include <linux/dma-mapping.h> | 34 | #include <linux/dma-mapping.h> |
| 35 | #include <linux/interrupt.h> | 35 | #include <linux/interrupt.h> |
| 36 | #include "ibmvscsi.h" | 36 | #include "ibmvscsi.h" |
| 37 | #include "srp.h" | ||
| 38 | 37 | ||
| 39 | static char partition_name[97] = "UNKNOWN"; | 38 | static char partition_name[97] = "UNKNOWN"; |
| 40 | static unsigned int partition_number = -1; | 39 | static unsigned int partition_number = -1; |
diff --git a/drivers/scsi/ibmvscsi/srp.h b/drivers/scsi/ibmvscsi/srp.h deleted file mode 100644 index 7d8e4c4accb9..000000000000 --- a/drivers/scsi/ibmvscsi/srp.h +++ /dev/null | |||
| @@ -1,227 +0,0 @@ | |||
| 1 | /*****************************************************************************/ | ||
| 2 | /* srp.h -- SCSI RDMA Protocol definitions */ | ||
| 3 | /* */ | ||
| 4 | /* Written By: Colin Devilbis, IBM Corporation */ | ||
| 5 | /* */ | ||
| 6 | /* Copyright (C) 2003 IBM Corporation */ | ||
| 7 | /* */ | ||
| 8 | /* This program is free software; you can redistribute it and/or modify */ | ||
| 9 | /* it under the terms of the GNU General Public License as published by */ | ||
| 10 | /* the Free Software Foundation; either version 2 of the License, or */ | ||
| 11 | /* (at your option) any later version. */ | ||
| 12 | /* */ | ||
| 13 | /* This program is distributed in the hope that it will be useful, */ | ||
| 14 | /* but WITHOUT ANY WARRANTY; without even the implied warranty of */ | ||
| 15 | /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ | ||
| 16 | /* GNU General Public License for more details. */ | ||
| 17 | /* */ | ||
| 18 | /* You should have received a copy of the GNU General Public License */ | ||
| 19 | /* along with this program; if not, write to the Free Software */ | ||
| 20 | /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ | ||
| 21 | /* */ | ||
| 22 | /* */ | ||
| 23 | /* This file contains structures and definitions for the SCSI RDMA Protocol */ | ||
| 24 | /* (SRP) as defined in the T10 standard available at www.t10.org. This */ | ||
| 25 | /* file was based on the 16a version of the standard */ | ||
| 26 | /* */ | ||
| 27 | /*****************************************************************************/ | ||
| 28 | #ifndef SRP_H | ||
| 29 | #define SRP_H | ||
| 30 | |||
| 31 | #define SRP_VERSION "16.a" | ||
| 32 | |||
| 33 | #define PACKED __attribute__((packed)) | ||
| 34 | |||
| 35 | enum srp_types { | ||
| 36 | SRP_LOGIN_REQ_TYPE = 0x00, | ||
| 37 | SRP_LOGIN_RSP_TYPE = 0xC0, | ||
| 38 | SRP_LOGIN_REJ_TYPE = 0xC2, | ||
| 39 | SRP_I_LOGOUT_TYPE = 0x03, | ||
| 40 | SRP_T_LOGOUT_TYPE = 0x80, | ||
| 41 | SRP_TSK_MGMT_TYPE = 0x01, | ||
| 42 | SRP_CMD_TYPE = 0x02, | ||
| 43 | SRP_RSP_TYPE = 0xC1, | ||
| 44 | SRP_CRED_REQ_TYPE = 0x81, | ||
| 45 | SRP_CRED_RSP_TYPE = 0x41, | ||
| 46 | SRP_AER_REQ_TYPE = 0x82, | ||
| 47 | SRP_AER_RSP_TYPE = 0x42 | ||
| 48 | }; | ||
| 49 | |||
| 50 | enum srp_descriptor_formats { | ||
| 51 | SRP_NO_BUFFER = 0x00, | ||
| 52 | SRP_DIRECT_BUFFER = 0x01, | ||
| 53 | SRP_INDIRECT_BUFFER = 0x02 | ||
| 54 | }; | ||
| 55 | |||
| 56 | struct memory_descriptor { | ||
| 57 | u64 virtual_address; | ||
| 58 | u32 memory_handle; | ||
| 59 | u32 length; | ||
| 60 | }; | ||
| 61 | |||
| 62 | struct indirect_descriptor { | ||
| 63 | struct memory_descriptor head; | ||
| 64 | u32 total_length; | ||
| 65 | struct memory_descriptor list[1] PACKED; | ||
| 66 | }; | ||
| 67 | |||
| 68 | struct srp_generic { | ||
| 69 | u8 type; | ||
| 70 | u8 reserved1[7]; | ||
| 71 | u64 tag; | ||
| 72 | }; | ||
| 73 | |||
| 74 | struct srp_login_req { | ||
| 75 | u8 type; | ||
| 76 | u8 reserved1[7]; | ||
| 77 | u64 tag; | ||
| 78 | u32 max_requested_initiator_to_target_iulen; | ||
| 79 | u32 reserved2; | ||
| 80 | u16 required_buffer_formats; | ||
| 81 | u8 reserved3:6; | ||
| 82 | u8 multi_channel_action:2; | ||
| 83 | u8 reserved4; | ||
| 84 | u32 reserved5; | ||
| 85 | u8 initiator_port_identifier[16]; | ||
| 86 | u8 target_port_identifier[16]; | ||
| 87 | }; | ||
| 88 | |||
| 89 | struct srp_login_rsp { | ||
| 90 | u8 type; | ||
| 91 | u8 reserved1[3]; | ||
| 92 | u32 request_limit_delta; | ||
| 93 | u64 tag; | ||
| 94 | u32 max_initiator_to_target_iulen; | ||
| 95 | u32 max_target_to_initiator_iulen; | ||
| 96 | u16 supported_buffer_formats; | ||
| 97 | u8 reserved2:6; | ||
| 98 | u8 multi_channel_result:2; | ||
| 99 | u8 reserved3; | ||
| 100 | u8 reserved4[24]; | ||
| 101 | }; | ||
| 102 | |||
| 103 | struct srp_login_rej { | ||
| 104 | u8 type; | ||
| 105 | u8 reserved1[3]; | ||
| 106 | u32 reason; | ||
| 107 | u64 tag; | ||
| 108 | u64 reserved2; | ||
| 109 | u16 supported_buffer_formats; | ||
| 110 | u8 reserved3[6]; | ||
| 111 | }; | ||
| 112 | |||
| 113 | struct srp_i_logout { | ||
| 114 | u8 type; | ||
| 115 | u8 reserved1[7]; | ||
| 116 | u64 tag; | ||
| 117 | }; | ||
| 118 | |||
| 119 | struct srp_t_logout { | ||
| 120 | u8 type; | ||
| 121 | u8 reserved1[3]; | ||
| 122 | u32 reason; | ||
| 123 | u64 tag; | ||
| 124 | }; | ||
| 125 | |||
| 126 | struct srp_tsk_mgmt { | ||
| 127 | u8 type; | ||
| 128 | u8 reserved1[7]; | ||
| 129 | u64 tag; | ||
| 130 | u32 reserved2; | ||
| 131 | u64 lun PACKED; | ||
| 132 | u8 reserved3; | ||
| 133 | u8 reserved4; | ||
| 134 | u8 task_mgmt_flags; | ||
| 135 | u8 reserved5; | ||
| 136 | u64 managed_task_tag; | ||
| 137 | u64 reserved6; | ||
| 138 | }; | ||
| 139 | |||
| 140 | struct srp_cmd { | ||
| 141 | u8 type; | ||
| 142 | u32 reserved1 PACKED; | ||
| 143 | u8 data_out_format:4; | ||
| 144 | u8 data_in_format:4; | ||
| 145 | u8 data_out_count; | ||
| 146 | u8 data_in_count; | ||
| 147 | u64 tag; | ||
| 148 | u32 reserved2; | ||
| 149 | u64 lun PACKED; | ||
| 150 | u8 reserved3; | ||
| 151 | u8 reserved4:5; | ||
| 152 | u8 task_attribute:3; | ||
| 153 | u8 reserved5; | ||
| 154 | u8 additional_cdb_len; | ||
| 155 | u8 cdb[16]; | ||
| 156 | u8 additional_data[0x100 - 0x30]; | ||
| 157 | }; | ||
| 158 | |||
| 159 | struct srp_rsp { | ||
| 160 | u8 type; | ||
| 161 | u8 reserved1[3]; | ||
| 162 | u32 request_limit_delta; | ||
| 163 | u64 tag; | ||
| 164 | u16 reserved2; | ||
| 165 | u8 reserved3:2; | ||
| 166 | u8 diunder:1; | ||
| 167 | u8 diover:1; | ||
| 168 | u8 dounder:1; | ||
| 169 | u8 doover:1; | ||
| 170 | u8 snsvalid:1; | ||
| 171 | u8 rspvalid:1; | ||
| 172 | u8 status; | ||
| 173 | u32 data_in_residual_count; | ||
| 174 | u32 data_out_residual_count; | ||
| 175 | u32 sense_data_list_length; | ||
| 176 | u32 response_data_list_length; | ||
| 177 | u8 sense_and_response_data[18]; | ||
| 178 | }; | ||
| 179 | |||
| 180 | struct srp_cred_req { | ||
| 181 | u8 type; | ||
| 182 | u8 reserved1[3]; | ||
| 183 | u32 request_limit_delta; | ||
| 184 | u64 tag; | ||
| 185 | }; | ||
| 186 | |||
| 187 | struct srp_cred_rsp { | ||
| 188 | u8 type; | ||
| 189 | u8 reserved1[7]; | ||
| 190 | u64 tag; | ||
| 191 | }; | ||
| 192 | |||
| 193 | struct srp_aer_req { | ||
| 194 | u8 type; | ||
| 195 | u8 reserved1[3]; | ||
| 196 | u32 request_limit_delta; | ||
| 197 | u64 tag; | ||
| 198 | u32 reserved2; | ||
| 199 | u64 lun; | ||
| 200 | u32 sense_data_list_length; | ||
| 201 | u32 reserved3; | ||
| 202 | u8 sense_data[20]; | ||
| 203 | }; | ||
| 204 | |||
| 205 | struct srp_aer_rsp { | ||
| 206 | u8 type; | ||
| 207 | u8 reserved1[7]; | ||
| 208 | u64 tag; | ||
| 209 | }; | ||
| 210 | |||
| 211 | union srp_iu { | ||
| 212 | struct srp_generic generic; | ||
| 213 | struct srp_login_req login_req; | ||
| 214 | struct srp_login_rsp login_rsp; | ||
| 215 | struct srp_login_rej login_rej; | ||
| 216 | struct srp_i_logout i_logout; | ||
| 217 | struct srp_t_logout t_logout; | ||
| 218 | struct srp_tsk_mgmt tsk_mgmt; | ||
| 219 | struct srp_cmd cmd; | ||
| 220 | struct srp_rsp rsp; | ||
| 221 | struct srp_cred_req cred_req; | ||
| 222 | struct srp_cred_rsp cred_rsp; | ||
| 223 | struct srp_aer_req aer_req; | ||
| 224 | struct srp_aer_rsp aer_rsp; | ||
| 225 | }; | ||
| 226 | |||
| 227 | #endif | ||
diff --git a/drivers/scsi/ibmvscsi/viosrp.h b/drivers/scsi/ibmvscsi/viosrp.h index 6a6bba8a2f34..90f1a61283ad 100644 --- a/drivers/scsi/ibmvscsi/viosrp.h +++ b/drivers/scsi/ibmvscsi/viosrp.h | |||
| @@ -33,7 +33,22 @@ | |||
| 33 | /*****************************************************************************/ | 33 | /*****************************************************************************/ |
| 34 | #ifndef VIOSRP_H | 34 | #ifndef VIOSRP_H |
| 35 | #define VIOSRP_H | 35 | #define VIOSRP_H |
| 36 | #include "srp.h" | 36 | #include <scsi/srp.h> |
| 37 | |||
| 38 | #define SRP_VERSION "16.a" | ||
| 39 | #define SRP_MAX_IU_LEN 256 | ||
| 40 | |||
| 41 | union srp_iu { | ||
| 42 | struct srp_login_req login_req; | ||
| 43 | struct srp_login_rsp login_rsp; | ||
| 44 | struct srp_login_rej login_rej; | ||
| 45 | struct srp_i_logout i_logout; | ||
| 46 | struct srp_t_logout t_logout; | ||
| 47 | struct srp_tsk_mgmt tsk_mgmt; | ||
| 48 | struct srp_cmd cmd; | ||
| 49 | struct srp_rsp rsp; | ||
| 50 | u8 reserved[SRP_MAX_IU_LEN]; | ||
| 51 | }; | ||
| 37 | 52 | ||
| 38 | enum viosrp_crq_formats { | 53 | enum viosrp_crq_formats { |
| 39 | VIOSRP_SRP_FORMAT = 0x01, | 54 | VIOSRP_SRP_FORMAT = 0x01, |
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 5890e5f92d82..8b80e59c8c52 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c | |||
| @@ -164,29 +164,6 @@ MODULE_PARM_DESC(auto_create, "Auto-create single device RAID 0 arrays when init | |||
| 164 | MODULE_LICENSE("GPL"); | 164 | MODULE_LICENSE("GPL"); |
| 165 | MODULE_VERSION(IPR_DRIVER_VERSION); | 165 | MODULE_VERSION(IPR_DRIVER_VERSION); |
| 166 | 166 | ||
| 167 | static const char *ipr_gpdd_dev_end_states[] = { | ||
| 168 | "Command complete", | ||
| 169 | "Terminated by host", | ||
| 170 | "Terminated by device reset", | ||
| 171 | "Terminated by bus reset", | ||
| 172 | "Unknown", | ||
| 173 | "Command not started" | ||
| 174 | }; | ||
| 175 | |||
| 176 | static const char *ipr_gpdd_dev_bus_phases[] = { | ||
| 177 | "Bus free", | ||
| 178 | "Arbitration", | ||
| 179 | "Selection", | ||
| 180 | "Message out", | ||
| 181 | "Command", | ||
| 182 | "Message in", | ||
| 183 | "Data out", | ||
| 184 | "Data in", | ||
| 185 | "Status", | ||
| 186 | "Reselection", | ||
| 187 | "Unknown" | ||
| 188 | }; | ||
| 189 | |||
| 190 | /* A constant array of IOASCs/URCs/Error Messages */ | 167 | /* A constant array of IOASCs/URCs/Error Messages */ |
| 191 | static const | 168 | static const |
| 192 | struct ipr_error_table_t ipr_error_table[] = { | 169 | struct ipr_error_table_t ipr_error_table[] = { |
| @@ -869,8 +846,8 @@ static void ipr_handle_config_change(struct ipr_ioa_cfg *ioa_cfg, | |||
| 869 | 846 | ||
| 870 | if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { | 847 | if (hostrcb->hcam.notify_type == IPR_HOST_RCB_NOTIF_TYPE_REM_ENTRY) { |
| 871 | if (res->sdev) { | 848 | if (res->sdev) { |
| 872 | res->sdev->hostdata = NULL; | ||
| 873 | res->del_from_ml = 1; | 849 | res->del_from_ml = 1; |
| 850 | res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; | ||
| 874 | if (ioa_cfg->allow_ml_add_del) | 851 | if (ioa_cfg->allow_ml_add_del) |
| 875 | schedule_work(&ioa_cfg->work_q); | 852 | schedule_work(&ioa_cfg->work_q); |
| 876 | } else | 853 | } else |
| @@ -1356,8 +1333,8 @@ static void ipr_handle_log_data(struct ipr_ioa_cfg *ioa_cfg, | |||
| 1356 | return; | 1333 | return; |
| 1357 | 1334 | ||
| 1358 | if (ipr_is_device(&hostrcb->hcam.u.error.failing_dev_res_addr)) { | 1335 | if (ipr_is_device(&hostrcb->hcam.u.error.failing_dev_res_addr)) { |
| 1359 | ipr_res_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr, | 1336 | ipr_ra_err(ioa_cfg, hostrcb->hcam.u.error.failing_dev_res_addr, |
| 1360 | "%s\n", ipr_error_table[error_index].error); | 1337 | "%s\n", ipr_error_table[error_index].error); |
| 1361 | } else { | 1338 | } else { |
| 1362 | dev_err(&ioa_cfg->pdev->dev, "%s\n", | 1339 | dev_err(&ioa_cfg->pdev->dev, "%s\n", |
| 1363 | ipr_error_table[error_index].error); | 1340 | ipr_error_table[error_index].error); |
| @@ -2107,7 +2084,6 @@ restart: | |||
| 2107 | did_work = 1; | 2084 | did_work = 1; |
| 2108 | sdev = res->sdev; | 2085 | sdev = res->sdev; |
| 2109 | if (!scsi_device_get(sdev)) { | 2086 | if (!scsi_device_get(sdev)) { |
| 2110 | res->sdev = NULL; | ||
| 2111 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); | 2087 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); |
| 2112 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 2088 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
| 2113 | scsi_remove_device(sdev); | 2089 | scsi_remove_device(sdev); |
| @@ -2124,6 +2100,7 @@ restart: | |||
| 2124 | bus = res->cfgte.res_addr.bus; | 2100 | bus = res->cfgte.res_addr.bus; |
| 2125 | target = res->cfgte.res_addr.target; | 2101 | target = res->cfgte.res_addr.target; |
| 2126 | lun = res->cfgte.res_addr.lun; | 2102 | lun = res->cfgte.res_addr.lun; |
| 2103 | res->add_to_ml = 0; | ||
| 2127 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); | 2104 | spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags); |
| 2128 | scsi_add_device(ioa_cfg->host, bus, target, lun); | 2105 | scsi_add_device(ioa_cfg->host, bus, target, lun); |
| 2129 | spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); | 2106 | spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags); |
| @@ -3214,7 +3191,7 @@ static int ipr_slave_configure(struct scsi_device *sdev) | |||
| 3214 | sdev->timeout = IPR_VSET_RW_TIMEOUT; | 3191 | sdev->timeout = IPR_VSET_RW_TIMEOUT; |
| 3215 | blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); | 3192 | blk_queue_max_sectors(sdev->request_queue, IPR_VSET_MAX_SECTORS); |
| 3216 | } | 3193 | } |
| 3217 | if (IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data)) | 3194 | if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res)) |
| 3218 | sdev->allow_restart = 1; | 3195 | sdev->allow_restart = 1; |
| 3219 | scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); | 3196 | scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); |
| 3220 | } | 3197 | } |
| @@ -3304,6 +3281,44 @@ static int ipr_eh_host_reset(struct scsi_cmnd * cmd) | |||
| 3304 | } | 3281 | } |
| 3305 | 3282 | ||
| 3306 | /** | 3283 | /** |
| 3284 | * ipr_device_reset - Reset the device | ||
| 3285 | * @ioa_cfg: ioa config struct | ||
| 3286 | * @res: resource entry struct | ||
| 3287 | * | ||
| 3288 | * This function issues a device reset to the affected device. | ||
| 3289 | * If the device is a SCSI device, a LUN reset will be sent | ||
| 3290 | * to the device first. If that does not work, a target reset | ||
| 3291 | * will be sent. | ||
| 3292 | * | ||
| 3293 | * Return value: | ||
| 3294 | * 0 on success / non-zero on failure | ||
| 3295 | **/ | ||
| 3296 | static int ipr_device_reset(struct ipr_ioa_cfg *ioa_cfg, | ||
| 3297 | struct ipr_resource_entry *res) | ||
| 3298 | { | ||
| 3299 | struct ipr_cmnd *ipr_cmd; | ||
| 3300 | struct ipr_ioarcb *ioarcb; | ||
| 3301 | struct ipr_cmd_pkt *cmd_pkt; | ||
| 3302 | u32 ioasc; | ||
| 3303 | |||
| 3304 | ENTER; | ||
| 3305 | ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); | ||
| 3306 | ioarcb = &ipr_cmd->ioarcb; | ||
| 3307 | cmd_pkt = &ioarcb->cmd_pkt; | ||
| 3308 | |||
| 3309 | ioarcb->res_handle = res->cfgte.res_handle; | ||
| 3310 | cmd_pkt->request_type = IPR_RQTYPE_IOACMD; | ||
| 3311 | cmd_pkt->cdb[0] = IPR_RESET_DEVICE; | ||
| 3312 | |||
| 3313 | ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); | ||
| 3314 | ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); | ||
| 3315 | list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); | ||
| 3316 | |||
| 3317 | LEAVE; | ||
| 3318 | return (IPR_IOASC_SENSE_KEY(ioasc) ? -EIO : 0); | ||
| 3319 | } | ||
| 3320 | |||
| 3321 | /** | ||
| 3307 | * ipr_eh_dev_reset - Reset the device | 3322 | * ipr_eh_dev_reset - Reset the device |
| 3308 | * @scsi_cmd: scsi command struct | 3323 | * @scsi_cmd: scsi command struct |
| 3309 | * | 3324 | * |
| @@ -3319,8 +3334,7 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
| 3319 | struct ipr_cmnd *ipr_cmd; | 3334 | struct ipr_cmnd *ipr_cmd; |
| 3320 | struct ipr_ioa_cfg *ioa_cfg; | 3335 | struct ipr_ioa_cfg *ioa_cfg; |
| 3321 | struct ipr_resource_entry *res; | 3336 | struct ipr_resource_entry *res; |
| 3322 | struct ipr_cmd_pkt *cmd_pkt; | 3337 | int rc; |
| 3323 | u32 ioasc; | ||
| 3324 | 3338 | ||
| 3325 | ENTER; | 3339 | ENTER; |
| 3326 | ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; | 3340 | ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata; |
| @@ -3347,25 +3361,12 @@ static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd) | |||
| 3347 | } | 3361 | } |
| 3348 | 3362 | ||
| 3349 | res->resetting_device = 1; | 3363 | res->resetting_device = 1; |
| 3350 | 3364 | scmd_printk(KERN_ERR, scsi_cmd, "Resetting device\n"); | |
| 3351 | ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); | 3365 | rc = ipr_device_reset(ioa_cfg, res); |
| 3352 | |||
| 3353 | ipr_cmd->ioarcb.res_handle = res->cfgte.res_handle; | ||
| 3354 | cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; | ||
| 3355 | cmd_pkt->request_type = IPR_RQTYPE_IOACMD; | ||
| 3356 | cmd_pkt->cdb[0] = IPR_RESET_DEVICE; | ||
| 3357 | |||
| 3358 | ipr_sdev_err(scsi_cmd->device, "Resetting device\n"); | ||
| 3359 | ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); | ||
| 3360 | |||
| 3361 | ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); | ||
| 3362 | |||
| 3363 | res->resetting_device = 0; | 3366 | res->resetting_device = 0; |
| 3364 | 3367 | ||
| 3365 | list_add_tail(&ipr_cmd->queue, &ioa_cfg->free_q); | ||
| 3366 | |||
| 3367 | LEAVE; | 3368 | LEAVE; |
| 3368 | return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS); | 3369 | return (rc ? FAILED : SUCCESS); |
| 3369 | } | 3370 | } |
| 3370 | 3371 | ||
| 3371 | static int ipr_eh_dev_reset(struct scsi_cmnd * cmd) | 3372 | static int ipr_eh_dev_reset(struct scsi_cmnd * cmd) |
| @@ -3440,7 +3441,7 @@ static void ipr_abort_timeout(struct ipr_cmnd *ipr_cmd) | |||
| 3440 | return; | 3441 | return; |
| 3441 | } | 3442 | } |
| 3442 | 3443 | ||
| 3443 | ipr_sdev_err(ipr_cmd->u.sdev, "Abort timed out. Resetting bus\n"); | 3444 | sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n"); |
| 3444 | reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); | 3445 | reset_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); |
| 3445 | ipr_cmd->sibling = reset_cmd; | 3446 | ipr_cmd->sibling = reset_cmd; |
| 3446 | reset_cmd->sibling = ipr_cmd; | 3447 | reset_cmd->sibling = ipr_cmd; |
| @@ -3504,7 +3505,8 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd) | |||
| 3504 | cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; | 3505 | cmd_pkt->cdb[0] = IPR_CANCEL_ALL_REQUESTS; |
| 3505 | ipr_cmd->u.sdev = scsi_cmd->device; | 3506 | ipr_cmd->u.sdev = scsi_cmd->device; |
| 3506 | 3507 | ||
| 3507 | ipr_sdev_err(scsi_cmd->device, "Aborting command: %02X\n", scsi_cmd->cmnd[0]); | 3508 | scmd_printk(KERN_ERR, scsi_cmd, "Aborting command: %02X\n", |
| 3509 | scsi_cmd->cmnd[0]); | ||
| 3508 | ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT); | 3510 | ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT); |
| 3509 | ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); | 3511 | ioasc = be32_to_cpu(ipr_cmd->ioasa.ioasc); |
| 3510 | 3512 | ||
| @@ -3815,8 +3817,8 @@ static void ipr_erp_done(struct ipr_cmnd *ipr_cmd) | |||
| 3815 | 3817 | ||
| 3816 | if (IPR_IOASC_SENSE_KEY(ioasc) > 0) { | 3818 | if (IPR_IOASC_SENSE_KEY(ioasc) > 0) { |
| 3817 | scsi_cmd->result |= (DID_ERROR << 16); | 3819 | scsi_cmd->result |= (DID_ERROR << 16); |
| 3818 | ipr_sdev_err(scsi_cmd->device, | 3820 | scmd_printk(KERN_ERR, scsi_cmd, |
| 3819 | "Request Sense failed with IOASC: 0x%08X\n", ioasc); | 3821 | "Request Sense failed with IOASC: 0x%08X\n", ioasc); |
| 3820 | } else { | 3822 | } else { |
| 3821 | memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, | 3823 | memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, |
| 3822 | SCSI_SENSE_BUFFERSIZE); | 3824 | SCSI_SENSE_BUFFERSIZE); |
| @@ -3938,6 +3940,7 @@ static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) | |||
| 3938 | * ipr_dump_ioasa - Dump contents of IOASA | 3940 | * ipr_dump_ioasa - Dump contents of IOASA |
| 3939 | * @ioa_cfg: ioa config struct | 3941 | * @ioa_cfg: ioa config struct |
| 3940 | * @ipr_cmd: ipr command struct | 3942 | * @ipr_cmd: ipr command struct |
| 3943 | * @res: resource entry struct | ||
| 3941 | * | 3944 | * |
| 3942 | * This function is invoked by the interrupt handler when ops | 3945 | * This function is invoked by the interrupt handler when ops |
| 3943 | * fail. It will log the IOASA if appropriate. Only called | 3946 | * fail. It will log the IOASA if appropriate. Only called |
| @@ -3947,7 +3950,7 @@ static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) | |||
| 3947 | * none | 3950 | * none |
| 3948 | **/ | 3951 | **/ |
| 3949 | static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, | 3952 | static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, |
| 3950 | struct ipr_cmnd *ipr_cmd) | 3953 | struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res) |
| 3951 | { | 3954 | { |
| 3952 | int i; | 3955 | int i; |
| 3953 | u16 data_len; | 3956 | u16 data_len; |
| @@ -3975,16 +3978,7 @@ static void ipr_dump_ioasa(struct ipr_ioa_cfg *ioa_cfg, | |||
| 3975 | return; | 3978 | return; |
| 3976 | } | 3979 | } |
| 3977 | 3980 | ||
| 3978 | ipr_sdev_err(ipr_cmd->scsi_cmd->device, "%s\n", | 3981 | ipr_res_err(ioa_cfg, res, "%s\n", ipr_error_table[error_index].error); |
| 3979 | ipr_error_table[error_index].error); | ||
| 3980 | |||
| 3981 | if ((ioasa->u.gpdd.end_state <= ARRAY_SIZE(ipr_gpdd_dev_end_states)) && | ||
| 3982 | (ioasa->u.gpdd.bus_phase <= ARRAY_SIZE(ipr_gpdd_dev_bus_phases))) { | ||
| 3983 | ipr_sdev_err(ipr_cmd->scsi_cmd->device, | ||
| 3984 | "Device End state: %s Phase: %s\n", | ||
| 3985 | ipr_gpdd_dev_end_states[ioasa->u.gpdd.end_state], | ||
| 3986 | ipr_gpdd_dev_bus_phases[ioasa->u.gpdd.bus_phase]); | ||
| 3987 | } | ||
| 3988 | 3982 | ||
| 3989 | if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len)) | 3983 | if (sizeof(struct ipr_ioasa) < be16_to_cpu(ioasa->ret_stat_len)) |
| 3990 | data_len = sizeof(struct ipr_ioasa); | 3984 | data_len = sizeof(struct ipr_ioasa); |
| @@ -4141,7 +4135,7 @@ static void ipr_erp_start(struct ipr_ioa_cfg *ioa_cfg, | |||
| 4141 | } | 4135 | } |
| 4142 | 4136 | ||
| 4143 | if (ipr_is_gscsi(res)) | 4137 | if (ipr_is_gscsi(res)) |
| 4144 | ipr_dump_ioasa(ioa_cfg, ipr_cmd); | 4138 | ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); |
| 4145 | else | 4139 | else |
| 4146 | ipr_gen_sense(ipr_cmd); | 4140 | ipr_gen_sense(ipr_cmd); |
| 4147 | 4141 | ||
| @@ -4540,7 +4534,7 @@ static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) | |||
| 4540 | ipr_cmd->job_step = ipr_ioa_reset_done; | 4534 | ipr_cmd->job_step = ipr_ioa_reset_done; |
| 4541 | 4535 | ||
| 4542 | list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) { | 4536 | list_for_each_entry_continue(res, &ioa_cfg->used_res_q, queue) { |
| 4543 | if (!IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data)) | 4537 | if (!ipr_is_scsi_disk(res)) |
| 4544 | continue; | 4538 | continue; |
| 4545 | 4539 | ||
| 4546 | ipr_cmd->u.res = res; | 4540 | ipr_cmd->u.res = res; |
| @@ -4980,7 +4974,7 @@ static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) | |||
| 4980 | list_for_each_entry_safe(res, temp, &old_res, queue) { | 4974 | list_for_each_entry_safe(res, temp, &old_res, queue) { |
| 4981 | if (res->sdev) { | 4975 | if (res->sdev) { |
| 4982 | res->del_from_ml = 1; | 4976 | res->del_from_ml = 1; |
| 4983 | res->sdev->hostdata = NULL; | 4977 | res->cfgte.res_handle = IPR_INVALID_RES_HANDLE; |
| 4984 | list_move_tail(&res->queue, &ioa_cfg->used_res_q); | 4978 | list_move_tail(&res->queue, &ioa_cfg->used_res_q); |
| 4985 | } else { | 4979 | } else { |
| 4986 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); | 4980 | list_move_tail(&res->queue, &ioa_cfg->free_res_q); |
diff --git a/drivers/scsi/ipr.h b/drivers/scsi/ipr.h index fd360bfe56dd..1ad24df69d70 100644 --- a/drivers/scsi/ipr.h +++ b/drivers/scsi/ipr.h | |||
| @@ -36,8 +36,8 @@ | |||
| 36 | /* | 36 | /* |
| 37 | * Literals | 37 | * Literals |
| 38 | */ | 38 | */ |
| 39 | #define IPR_DRIVER_VERSION "2.1.2" | 39 | #define IPR_DRIVER_VERSION "2.1.3" |
| 40 | #define IPR_DRIVER_DATE "(February 8, 2006)" | 40 | #define IPR_DRIVER_DATE "(March 29, 2006)" |
| 41 | 41 | ||
| 42 | /* | 42 | /* |
| 43 | * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding | 43 | * IPR_MAX_CMD_PER_LUN: This defines the maximum number of outstanding |
| @@ -133,6 +133,7 @@ | |||
| 133 | #define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8)) | 133 | #define IPR_MAX_SCSI_RATE(width) ((320 * 10) / ((width) / 8)) |
| 134 | 134 | ||
| 135 | #define IPR_IOA_RES_HANDLE 0xffffffff | 135 | #define IPR_IOA_RES_HANDLE 0xffffffff |
| 136 | #define IPR_INVALID_RES_HANDLE 0 | ||
| 136 | #define IPR_IOA_RES_ADDR 0x00ffffff | 137 | #define IPR_IOA_RES_ADDR 0x00ffffff |
| 137 | 138 | ||
| 138 | /* | 139 | /* |
| @@ -1191,30 +1192,17 @@ struct ipr_ucode_image_header { | |||
| 1191 | */ | 1192 | */ |
| 1192 | #define ipr_err(...) printk(KERN_ERR IPR_NAME ": "__VA_ARGS__) | 1193 | #define ipr_err(...) printk(KERN_ERR IPR_NAME ": "__VA_ARGS__) |
| 1193 | #define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__) | 1194 | #define ipr_info(...) printk(KERN_INFO IPR_NAME ": "__VA_ARGS__) |
| 1194 | #define ipr_crit(...) printk(KERN_CRIT IPR_NAME ": "__VA_ARGS__) | ||
| 1195 | #define ipr_warn(...) printk(KERN_WARNING IPR_NAME": "__VA_ARGS__) | ||
| 1196 | #define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)) | 1195 | #define ipr_dbg(...) IPR_DBG_CMD(printk(KERN_INFO IPR_NAME ": "__VA_ARGS__)) |
| 1197 | 1196 | ||
| 1198 | #define ipr_sdev_printk(level, sdev, fmt, args...) \ | 1197 | #define ipr_ra_printk(level, ioa_cfg, ra, fmt, ...) \ |
| 1199 | sdev_printk(level, sdev, fmt, ## args) | 1198 | printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, (ioa_cfg)->host->host_no, \ |
| 1199 | (ra).bus, (ra).target, (ra).lun, ##__VA_ARGS__) | ||
| 1200 | 1200 | ||
| 1201 | #define ipr_sdev_err(sdev, fmt, ...) \ | 1201 | #define ipr_ra_err(ioa_cfg, ra, fmt, ...) \ |
| 1202 | ipr_sdev_printk(KERN_ERR, sdev, fmt, ##__VA_ARGS__) | 1202 | ipr_ra_printk(KERN_ERR, ioa_cfg, ra, fmt, ##__VA_ARGS__) |
| 1203 | |||
| 1204 | #define ipr_sdev_info(sdev, fmt, ...) \ | ||
| 1205 | ipr_sdev_printk(KERN_INFO, sdev, fmt, ##__VA_ARGS__) | ||
| 1206 | |||
| 1207 | #define ipr_sdev_dbg(sdev, fmt, ...) \ | ||
| 1208 | IPR_DBG_CMD(ipr_sdev_printk(KERN_INFO, sdev, fmt, ##__VA_ARGS__)) | ||
| 1209 | |||
| 1210 | #define ipr_res_printk(level, ioa_cfg, res, fmt, ...) \ | ||
| 1211 | printk(level IPR_NAME ": %d:%d:%d:%d: " fmt, ioa_cfg->host->host_no, \ | ||
| 1212 | res.bus, res.target, res.lun, ##__VA_ARGS__) | ||
| 1213 | 1203 | ||
| 1214 | #define ipr_res_err(ioa_cfg, res, fmt, ...) \ | 1204 | #define ipr_res_err(ioa_cfg, res, fmt, ...) \ |
| 1215 | ipr_res_printk(KERN_ERR, ioa_cfg, res, fmt, ##__VA_ARGS__) | 1205 | ipr_ra_err(ioa_cfg, (res)->cfgte.res_addr, fmt, ##__VA_ARGS__) |
| 1216 | #define ipr_res_dbg(ioa_cfg, res, fmt, ...) \ | ||
| 1217 | IPR_DBG_CMD(ipr_res_printk(KERN_INFO, ioa_cfg, res, fmt, ##__VA_ARGS__)) | ||
| 1218 | 1206 | ||
| 1219 | #define ipr_phys_res_err(ioa_cfg, res, fmt, ...) \ | 1207 | #define ipr_phys_res_err(ioa_cfg, res, fmt, ...) \ |
| 1220 | { \ | 1208 | { \ |
| @@ -1304,6 +1292,22 @@ static inline int ipr_is_gscsi(struct ipr_resource_entry *res) | |||
| 1304 | } | 1292 | } |
| 1305 | 1293 | ||
| 1306 | /** | 1294 | /** |
| 1295 | * ipr_is_scsi_disk - Determine if a resource is a SCSI disk | ||
| 1296 | * @res: resource entry struct | ||
| 1297 | * | ||
| 1298 | * Return value: | ||
| 1299 | * 1 if SCSI disk / 0 if not SCSI disk | ||
| 1300 | **/ | ||
| 1301 | static inline int ipr_is_scsi_disk(struct ipr_resource_entry *res) | ||
| 1302 | { | ||
| 1303 | if (ipr_is_af_dasd_device(res) || | ||
| 1304 | (ipr_is_gscsi(res) && IPR_IS_DASD_DEVICE(res->cfgte.std_inq_data))) | ||
| 1305 | return 1; | ||
| 1306 | else | ||
| 1307 | return 0; | ||
| 1308 | } | ||
| 1309 | |||
| 1310 | /** | ||
| 1307 | * ipr_is_naca_model - Determine if a resource is using NACA queueing model | 1311 | * ipr_is_naca_model - Determine if a resource is using NACA queueing model |
| 1308 | * @res: resource entry struct | 1312 | * @res: resource entry struct |
| 1309 | * | 1313 | * |
diff --git a/drivers/scsi/qlogicfc.c b/drivers/scsi/qlogicfc.c deleted file mode 100644 index 52b224a5d6fd..000000000000 --- a/drivers/scsi/qlogicfc.c +++ /dev/null | |||
| @@ -1,2228 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * QLogic ISP2x00 SCSI-FCP | ||
| 3 | * Written by Erik H. Moe, ehm@cris.com | ||
| 4 | * Copyright 1995, Erik H. Moe | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify it | ||
| 7 | * under the terms of the GNU General Public License as published by the | ||
| 8 | * Free Software Foundation; either version 2, or (at your option) any | ||
| 9 | * later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but | ||
| 12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 14 | * General Public License for more details. | ||
| 15 | */ | ||
| 16 | |||
| 17 | /* Renamed and updated to 1.3.x by Michael Griffith <grif@cs.ucr.edu> */ | ||
| 18 | |||
| 19 | /* This is a version of the isp1020 driver which was modified by | ||
| 20 | * Chris Loveland <cwl@iol.unh.edu> to support the isp2100 and isp2200 | ||
| 21 | * | ||
| 22 | * Big endian support and dynamic DMA mapping added | ||
| 23 | * by Jakub Jelinek <jakub@redhat.com>. | ||
| 24 | * | ||
| 25 | * Conversion to final pci64 DMA interfaces | ||
| 26 | * by David S. Miller <davem@redhat.com>. | ||
| 27 | */ | ||
| 28 | |||
| 29 | /* | ||
| 30 | * $Date: 1995/09/22 02:23:15 $ | ||
| 31 | * $Revision: 0.5 $ | ||
| 32 | * | ||
| 33 | * $Log: isp1020.c,v $ | ||
| 34 | * Revision 0.5 1995/09/22 02:23:15 root | ||
| 35 | * do auto request sense | ||
| 36 | * | ||
| 37 | * Revision 0.4 1995/08/07 04:44:33 root | ||
| 38 | * supply firmware with driver. | ||
| 39 | * numerous bug fixes/general cleanup of code. | ||
| 40 | * | ||
| 41 | * Revision 0.3 1995/07/16 16:15:39 root | ||
| 42 | * added reset/abort code. | ||
| 43 | * | ||
| 44 | * Revision 0.2 1995/06/29 03:14:19 root | ||
| 45 | * fixed biosparam. | ||
| 46 | * added queue protocol. | ||
| 47 | * | ||
| 48 | * Revision 0.1 1995/06/25 01:55:45 root | ||
| 49 | * Initial release. | ||
| 50 | * | ||
| 51 | */ | ||
| 52 | |||
| 53 | #include <linux/blkdev.h> | ||
| 54 | #include <linux/kernel.h> | ||
| 55 | #include <linux/string.h> | ||
| 56 | #include <linux/ioport.h> | ||
| 57 | #include <linux/sched.h> | ||
| 58 | #include <linux/types.h> | ||
| 59 | #include <linux/pci.h> | ||
| 60 | #include <linux/delay.h> | ||
| 61 | #include <linux/unistd.h> | ||
| 62 | #include <linux/spinlock.h> | ||
| 63 | #include <linux/interrupt.h> | ||
| 64 | #include <linux/dma-mapping.h> | ||
| 65 | #include <linux/jiffies.h> | ||
| 66 | #include <asm/io.h> | ||
| 67 | #include <asm/irq.h> | ||
| 68 | #include "scsi.h" | ||
| 69 | #include <scsi/scsi_host.h> | ||
| 70 | |||
| 71 | #define pci64_dma_hi32(a) ((u32) (0xffffffff & (((u64)(a))>>32))) | ||
| 72 | #define pci64_dma_lo32(a) ((u32) (0xffffffff & (((u64)(a))))) | ||
| 73 | #define pci64_dma_build(hi,lo) \ | ||
| 74 | ((dma_addr_t)(((u64)(lo))|(((u64)(hi))<<32))) | ||
| 75 | |||
| 76 | /* | ||
| 77 | * With the qlogic interface, every queue slot can hold a SCSI | ||
| 78 | * command with up to 2 scatter/gather entries. If we need more | ||
| 79 | * than 2 entries, continuation entries can be used that hold | ||
| 80 | * another 5 entries each. Unlike for other drivers, this means | ||
| 81 | * that the maximum number of scatter/gather entries we can | ||
| 82 | * support at any given time is a function of the number of queue | ||
| 83 | * slots available. That is, host->can_queue and host->sg_tablesize | ||
| 84 | * are dynamic and _not_ independent. This all works fine because | ||
| 85 | * requests are queued serially and the scatter/gather limit is | ||
| 86 | * determined for each queue request anew. | ||
| 87 | */ | ||
| 88 | |||
| 89 | #define DATASEGS_PER_COMMAND 2 | ||
| 90 | #define DATASEGS_PER_CONT 5 | ||
| 91 | |||
| 92 | #define QLOGICFC_REQ_QUEUE_LEN 255 /* must be power of two - 1 */ | ||
| 93 | #define QLOGICFC_MAX_SG(ql) (DATASEGS_PER_COMMAND + (((ql) > 0) ? DATASEGS_PER_CONT*((ql) - 1) : 0)) | ||
| 94 | #define QLOGICFC_CMD_PER_LUN 8 | ||
| 95 | |||
| 96 | /* Configuration section **************************************************** */ | ||
| 97 | |||
| 98 | /* Set the following macro to 1 to reload the ISP2x00's firmware. This is | ||
| 99 | version 1.17.30 of the isp2100's firmware and version 2.00.40 of the | ||
| 100 | isp2200's firmware. | ||
| 101 | */ | ||
| 102 | |||
| 103 | #define USE_NVRAM_DEFAULTS 1 | ||
| 104 | |||
| 105 | #define ISP2x00_PORTDB 1 | ||
| 106 | |||
| 107 | /* Set the following to 1 to include fabric support, fabric support is | ||
| 108 | * currently not as well tested as the other aspects of the driver */ | ||
| 109 | |||
| 110 | #define ISP2x00_FABRIC 1 | ||
| 111 | |||
| 112 | /* Macros used for debugging */ | ||
| 113 | #define DEBUG_ISP2x00 0 | ||
| 114 | #define DEBUG_ISP2x00_INT 0 | ||
| 115 | #define DEBUG_ISP2x00_INTR 0 | ||
| 116 | #define DEBUG_ISP2x00_SETUP 0 | ||
| 117 | #define DEBUG_ISP2x00_FABRIC 0 | ||
| 118 | #define TRACE_ISP 0 | ||
| 119 | |||
| 120 | |||
| 121 | #define DEFAULT_LOOP_COUNT 1000000000 | ||
| 122 | |||
| 123 | #define ISP_TIMEOUT (2*HZ) | ||
| 124 | /* End Configuration section ************************************************ */ | ||
| 125 | |||
| 126 | #include <linux/module.h> | ||
| 127 | |||
| 128 | #if TRACE_ISP | ||
| 129 | |||
| 130 | #define TRACE_BUF_LEN (32*1024) | ||
| 131 | |||
| 132 | struct { | ||
| 133 | u_long next; | ||
| 134 | struct { | ||
| 135 | u_long time; | ||
| 136 | u_int index; | ||
| 137 | u_int addr; | ||
| 138 | u_char *name; | ||
| 139 | } buf[TRACE_BUF_LEN]; | ||
| 140 | } trace; | ||
| 141 | |||
| 142 | #define TRACE(w, i, a) \ | ||
| 143 | { \ | ||
| 144 | unsigned long flags; \ | ||
| 145 | \ | ||
| 146 | save_flags(flags); \ | ||
| 147 | cli(); \ | ||
| 148 | trace.buf[trace.next].name = (w); \ | ||
| 149 | trace.buf[trace.next].time = jiffies; \ | ||
| 150 | trace.buf[trace.next].index = (i); \ | ||
| 151 | trace.buf[trace.next].addr = (long) (a); \ | ||
| 152 | trace.next = (trace.next + 1) & (TRACE_BUF_LEN - 1); \ | ||
| 153 | restore_flags(flags); \ | ||
| 154 | } | ||
| 155 | |||
| 156 | #else | ||
| 157 | #define TRACE(w, i, a) | ||
| 158 | #endif | ||
| 159 | |||
| 160 | #if DEBUG_ISP2x00_FABRIC | ||
| 161 | #define DEBUG_FABRIC(x) x | ||
| 162 | #else | ||
| 163 | #define DEBUG_FABRIC(x) | ||
| 164 | #endif /* DEBUG_ISP2x00_FABRIC */ | ||
| 165 | |||
| 166 | |||
| 167 | #if DEBUG_ISP2x00 | ||
| 168 | #define ENTER(x) printk("isp2x00 : entering %s()\n", x); | ||
| 169 | #define LEAVE(x) printk("isp2x00 : leaving %s()\n", x); | ||
| 170 | #define DEBUG(x) x | ||
| 171 | #else | ||
| 172 | #define ENTER(x) | ||
| 173 | #define LEAVE(x) | ||
| 174 | #define DEBUG(x) | ||
| 175 | #endif /* DEBUG_ISP2x00 */ | ||
| 176 | |||
| 177 | #if DEBUG_ISP2x00_INTR | ||
| 178 | #define ENTER_INTR(x) printk("isp2x00 : entering %s()\n", x); | ||
| 179 | #define LEAVE_INTR(x) printk("isp2x00 : leaving %s()\n", x); | ||
| 180 | #define DEBUG_INTR(x) x | ||
| 181 | #else | ||
| 182 | #define ENTER_INTR(x) | ||
| 183 | #define LEAVE_INTR(x) | ||
| 184 | #define DEBUG_INTR(x) | ||
| 185 | #endif /* DEBUG ISP2x00_INTR */ | ||
| 186 | |||
| 187 | |||
| 188 | #define ISP2100_REV_ID1 1 | ||
| 189 | #define ISP2100_REV_ID3 3 | ||
| 190 | #define ISP2200_REV_ID5 5 | ||
| 191 | |||
| 192 | /* host configuration and control registers */ | ||
| 193 | #define HOST_HCCR 0xc0 /* host command and control */ | ||
| 194 | |||
| 195 | /* pci bus interface registers */ | ||
| 196 | #define FLASH_BIOS_ADDR 0x00 | ||
| 197 | #define FLASH_BIOS_DATA 0x02 | ||
| 198 | #define ISP_CTRL_STATUS 0x06 /* configuration register #1 */ | ||
| 199 | #define PCI_INTER_CTL 0x08 /* pci interrupt control */ | ||
| 200 | #define PCI_INTER_STS 0x0a /* pci interrupt status */ | ||
| 201 | #define PCI_SEMAPHORE 0x0c /* pci semaphore */ | ||
| 202 | #define PCI_NVRAM 0x0e /* pci nvram interface */ | ||
| 203 | |||
| 204 | /* mailbox registers */ | ||
| 205 | #define MBOX0 0x10 /* mailbox 0 */ | ||
| 206 | #define MBOX1 0x12 /* mailbox 1 */ | ||
| 207 | #define MBOX2 0x14 /* mailbox 2 */ | ||
| 208 | #define MBOX3 0x16 /* mailbox 3 */ | ||
| 209 | #define MBOX4 0x18 /* mailbox 4 */ | ||
| 210 | #define MBOX5 0x1a /* mailbox 5 */ | ||
| 211 | #define MBOX6 0x1c /* mailbox 6 */ | ||
| 212 | #define MBOX7 0x1e /* mailbox 7 */ | ||
| 213 | |||
| 214 | /* mailbox command complete status codes */ | ||
| 215 | #define MBOX_COMMAND_COMPLETE 0x4000 | ||
| 216 | #define INVALID_COMMAND 0x4001 | ||
| 217 | #define HOST_INTERFACE_ERROR 0x4002 | ||
| 218 | #define TEST_FAILED 0x4003 | ||
| 219 | #define COMMAND_ERROR 0x4005 | ||
| 220 | #define COMMAND_PARAM_ERROR 0x4006 | ||
| 221 | #define PORT_ID_USED 0x4007 | ||
| 222 | #define LOOP_ID_USED 0x4008 | ||
| 223 | #define ALL_IDS_USED 0x4009 | ||
| 224 | |||
| 225 | /* async event status codes */ | ||
| 226 | #define RESET_DETECTED 0x8001 | ||
| 227 | #define SYSTEM_ERROR 0x8002 | ||
| 228 | #define REQUEST_TRANSFER_ERROR 0x8003 | ||
| 229 | #define RESPONSE_TRANSFER_ERROR 0x8004 | ||
| 230 | #define REQUEST_QUEUE_WAKEUP 0x8005 | ||
| 231 | #define LIP_OCCURRED 0x8010 | ||
| 232 | #define LOOP_UP 0x8011 | ||
| 233 | #define LOOP_DOWN 0x8012 | ||
| 234 | #define LIP_RECEIVED 0x8013 | ||
| 235 | #define PORT_DB_CHANGED 0x8014 | ||
| 236 | #define CHANGE_NOTIFICATION 0x8015 | ||
| 237 | #define SCSI_COMMAND_COMPLETE 0x8020 | ||
| 238 | #define POINT_TO_POINT_UP 0x8030 | ||
| 239 | #define CONNECTION_MODE 0x8036 | ||
| 240 | |||
| 241 | struct Entry_header { | ||
| 242 | u_char entry_type; | ||
| 243 | u_char entry_cnt; | ||
| 244 | u_char sys_def_1; | ||
| 245 | u_char flags; | ||
| 246 | }; | ||
| 247 | |||
| 248 | /* entry header type commands */ | ||
| 249 | #define ENTRY_COMMAND 0x19 | ||
| 250 | #define ENTRY_CONTINUATION 0x0a | ||
| 251 | |||
| 252 | #define ENTRY_STATUS 0x03 | ||
| 253 | #define ENTRY_MARKER 0x04 | ||
| 254 | |||
| 255 | |||
| 256 | /* entry header flag definitions */ | ||
| 257 | #define EFLAG_BUSY 2 | ||
| 258 | #define EFLAG_BAD_HEADER 4 | ||
| 259 | #define EFLAG_BAD_PAYLOAD 8 | ||
| 260 | |||
| 261 | struct dataseg { | ||
| 262 | u_int d_base; | ||
| 263 | u_int d_base_hi; | ||
| 264 | u_int d_count; | ||
| 265 | }; | ||
| 266 | |||
| 267 | struct Command_Entry { | ||
| 268 | struct Entry_header hdr; | ||
| 269 | u_int handle; | ||
| 270 | u_char target_lun; | ||
| 271 | u_char target_id; | ||
| 272 | u_short expanded_lun; | ||
| 273 | u_short control_flags; | ||
| 274 | u_short rsvd2; | ||
| 275 | u_short time_out; | ||
| 276 | u_short segment_cnt; | ||
| 277 | u_char cdb[16]; | ||
| 278 | u_int total_byte_cnt; | ||
| 279 | struct dataseg dataseg[DATASEGS_PER_COMMAND]; | ||
| 280 | }; | ||
| 281 | |||
| 282 | /* command entry control flag definitions */ | ||
| 283 | #define CFLAG_NODISC 0x01 | ||
| 284 | #define CFLAG_HEAD_TAG 0x02 | ||
| 285 | #define CFLAG_ORDERED_TAG 0x04 | ||
| 286 | #define CFLAG_SIMPLE_TAG 0x08 | ||
| 287 | #define CFLAG_TAR_RTN 0x10 | ||
| 288 | #define CFLAG_READ 0x20 | ||
| 289 | #define CFLAG_WRITE 0x40 | ||
| 290 | |||
| 291 | struct Continuation_Entry { | ||
| 292 | struct Entry_header hdr; | ||
| 293 | struct dataseg dataseg[DATASEGS_PER_CONT]; | ||
| 294 | }; | ||
| 295 | |||
| 296 | struct Marker_Entry { | ||
| 297 | struct Entry_header hdr; | ||
| 298 | u_int reserved; | ||
| 299 | u_char target_lun; | ||
| 300 | u_char target_id; | ||
| 301 | u_char modifier; | ||
| 302 | u_char expanded_lun; | ||
| 303 | u_char rsvds[52]; | ||
| 304 | }; | ||
| 305 | |||
| 306 | /* marker entry modifier definitions */ | ||
| 307 | #define SYNC_DEVICE 0 | ||
| 308 | #define SYNC_TARGET 1 | ||
| 309 | #define SYNC_ALL 2 | ||
| 310 | |||
| 311 | struct Status_Entry { | ||
| 312 | struct Entry_header hdr; | ||
| 313 | u_int handle; | ||
| 314 | u_short scsi_status; | ||
| 315 | u_short completion_status; | ||
| 316 | u_short state_flags; | ||
| 317 | u_short status_flags; | ||
| 318 | u_short res_info_len; | ||
| 319 | u_short req_sense_len; | ||
| 320 | u_int residual; | ||
| 321 | u_char res_info[8]; | ||
| 322 | u_char req_sense_data[32]; | ||
| 323 | }; | ||
| 324 | |||
| 325 | /* status entry completion status definitions */ | ||
| 326 | #define CS_COMPLETE 0x0000 | ||
| 327 | #define CS_DMA_ERROR 0x0002 | ||
| 328 | #define CS_RESET_OCCURRED 0x0004 | ||
| 329 | #define CS_ABORTED 0x0005 | ||
| 330 | #define CS_TIMEOUT 0x0006 | ||
| 331 | #define CS_DATA_OVERRUN 0x0007 | ||
| 332 | #define CS_DATA_UNDERRUN 0x0015 | ||
| 333 | #define CS_QUEUE_FULL 0x001c | ||
| 334 | #define CS_PORT_UNAVAILABLE 0x0028 | ||
| 335 | #define CS_PORT_LOGGED_OUT 0x0029 | ||
| 336 | #define CS_PORT_CONFIG_CHANGED 0x002a | ||
| 337 | |||
| 338 | /* status entry state flag definitions */ | ||
| 339 | #define SF_SENT_CDB 0x0400 | ||
| 340 | #define SF_TRANSFERRED_DATA 0x0800 | ||
| 341 | #define SF_GOT_STATUS 0x1000 | ||
| 342 | |||
| 343 | /* status entry status flag definitions */ | ||
| 344 | #define STF_BUS_RESET 0x0008 | ||
| 345 | #define STF_DEVICE_RESET 0x0010 | ||
| 346 | #define STF_ABORTED 0x0020 | ||
| 347 | #define STF_TIMEOUT 0x0040 | ||
| 348 | |||
| 349 | /* interrupt control commands */ | ||
| 350 | #define ISP_EN_INT 0x8000 | ||
| 351 | #define ISP_EN_RISC 0x0008 | ||
| 352 | |||
| 353 | /* host control commands */ | ||
| 354 | #define HCCR_NOP 0x0000 | ||
| 355 | #define HCCR_RESET 0x1000 | ||
| 356 | #define HCCR_PAUSE 0x2000 | ||
| 357 | #define HCCR_RELEASE 0x3000 | ||
| 358 | #define HCCR_SINGLE_STEP 0x4000 | ||
| 359 | #define HCCR_SET_HOST_INTR 0x5000 | ||
| 360 | #define HCCR_CLEAR_HOST_INTR 0x6000 | ||
| 361 | #define HCCR_CLEAR_RISC_INTR 0x7000 | ||
| 362 | #define HCCR_BP_ENABLE 0x8000 | ||
| 363 | #define HCCR_BIOS_DISABLE 0x9000 | ||
| 364 | #define HCCR_TEST_MODE 0xf000 | ||
| 365 | |||
| 366 | #define RISC_BUSY 0x0004 | ||
| 367 | |||
| 368 | /* mailbox commands */ | ||
| 369 | #define MBOX_NO_OP 0x0000 | ||
| 370 | #define MBOX_LOAD_RAM 0x0001 | ||
| 371 | #define MBOX_EXEC_FIRMWARE 0x0002 | ||
| 372 | #define MBOX_DUMP_RAM 0x0003 | ||
| 373 | #define MBOX_WRITE_RAM_WORD 0x0004 | ||
| 374 | #define MBOX_READ_RAM_WORD 0x0005 | ||
| 375 | #define MBOX_MAILBOX_REG_TEST 0x0006 | ||
| 376 | #define MBOX_VERIFY_CHECKSUM 0x0007 | ||
| 377 | #define MBOX_ABOUT_FIRMWARE 0x0008 | ||
| 378 | #define MBOX_LOAD_RISC_RAM 0x0009 | ||
| 379 | #define MBOX_DUMP_RISC_RAM 0x000a | ||
| 380 | #define MBOX_CHECK_FIRMWARE 0x000e | ||
| 381 | #define MBOX_INIT_REQ_QUEUE 0x0010 | ||
| 382 | #define MBOX_INIT_RES_QUEUE 0x0011 | ||
| 383 | #define MBOX_EXECUTE_IOCB 0x0012 | ||
| 384 | #define MBOX_WAKE_UP 0x0013 | ||
| 385 | #define MBOX_STOP_FIRMWARE 0x0014 | ||
| 386 | #define MBOX_ABORT_IOCB 0x0015 | ||
| 387 | #define MBOX_ABORT_DEVICE 0x0016 | ||
| 388 | #define MBOX_ABORT_TARGET 0x0017 | ||
| 389 | #define MBOX_BUS_RESET 0x0018 | ||
| 390 | #define MBOX_STOP_QUEUE 0x0019 | ||
| 391 | #define MBOX_START_QUEUE 0x001a | ||
| 392 | #define MBOX_SINGLE_STEP_QUEUE 0x001b | ||
| 393 | #define MBOX_ABORT_QUEUE 0x001c | ||
| 394 | #define MBOX_GET_DEV_QUEUE_STATUS 0x001d | ||
| 395 | #define MBOX_GET_FIRMWARE_STATUS 0x001f | ||
| 396 | #define MBOX_GET_INIT_SCSI_ID 0x0020 | ||
| 397 | #define MBOX_GET_RETRY_COUNT 0x0022 | ||
| 398 | #define MBOX_GET_TARGET_PARAMS 0x0028 | ||
| 399 | #define MBOX_GET_DEV_QUEUE_PARAMS 0x0029 | ||
| 400 | #define MBOX_SET_RETRY_COUNT 0x0032 | ||
| 401 | #define MBOX_SET_TARGET_PARAMS 0x0038 | ||
| 402 | #define MBOX_SET_DEV_QUEUE_PARAMS 0x0039 | ||
| 403 | #define MBOX_EXECUTE_IOCB64 0x0054 | ||
| 404 | #define MBOX_INIT_FIRMWARE 0x0060 | ||
| 405 | #define MBOX_GET_INIT_CB 0x0061 | ||
| 406 | #define MBOX_INIT_LIP 0x0062 | ||
| 407 | #define MBOX_GET_POS_MAP 0x0063 | ||
| 408 | #define MBOX_GET_PORT_DB 0x0064 | ||
| 409 | #define MBOX_CLEAR_ACA 0x0065 | ||
| 410 | #define MBOX_TARGET_RESET 0x0066 | ||
| 411 | #define MBOX_CLEAR_TASK_SET 0x0067 | ||
| 412 | #define MBOX_ABORT_TASK_SET 0x0068 | ||
| 413 | #define MBOX_GET_FIRMWARE_STATE 0x0069 | ||
| 414 | #define MBOX_GET_PORT_NAME 0x006a | ||
| 415 | #define MBOX_SEND_SNS 0x006e | ||
| 416 | #define MBOX_PORT_LOGIN 0x006f | ||
| 417 | #define MBOX_SEND_CHANGE_REQUEST 0x0070 | ||
| 418 | #define MBOX_PORT_LOGOUT 0x0071 | ||
| 419 | |||
| 420 | /* | ||
| 421 | * Firmware if needed (note this is a hack, it belongs in a separate | ||
| 422 | * module. | ||
| 423 | */ | ||
| 424 | |||
| 425 | #ifdef CONFIG_SCSI_QLOGIC_FC_FIRMWARE | ||
| 426 | #include "qlogicfc_asm.c" | ||
| 427 | #else | ||
| 428 | static unsigned short risc_code_addr01 = 0x1000 ; | ||
| 429 | #endif | ||
| 430 | |||
| 431 | /* Each element in mbox_param is an 8 bit bitmap where each bit indicates | ||
| 432 | if that mbox should be copied as input. For example 0x2 would mean | ||
| 433 | only copy mbox1. */ | ||
| 434 | |||
| 435 | static const u_char mbox_param[] = | ||
| 436 | { | ||
| 437 | 0x01, /* MBOX_NO_OP */ | ||
| 438 | 0x1f, /* MBOX_LOAD_RAM */ | ||
| 439 | 0x03, /* MBOX_EXEC_FIRMWARE */ | ||
| 440 | 0x1f, /* MBOX_DUMP_RAM */ | ||
| 441 | 0x07, /* MBOX_WRITE_RAM_WORD */ | ||
| 442 | 0x03, /* MBOX_READ_RAM_WORD */ | ||
| 443 | 0xff, /* MBOX_MAILBOX_REG_TEST */ | ||
| 444 | 0x03, /* MBOX_VERIFY_CHECKSUM */ | ||
| 445 | 0x01, /* MBOX_ABOUT_FIRMWARE */ | ||
| 446 | 0xff, /* MBOX_LOAD_RISC_RAM */ | ||
| 447 | 0xff, /* MBOX_DUMP_RISC_RAM */ | ||
| 448 | 0x00, /* 0x000b */ | ||
| 449 | 0x00, /* 0x000c */ | ||
| 450 | 0x00, /* 0x000d */ | ||
| 451 | 0x01, /* MBOX_CHECK_FIRMWARE */ | ||
| 452 | 0x00, /* 0x000f */ | ||
| 453 | 0x1f, /* MBOX_INIT_REQ_QUEUE */ | ||
| 454 | 0x2f, /* MBOX_INIT_RES_QUEUE */ | ||
| 455 | 0x0f, /* MBOX_EXECUTE_IOCB */ | ||
| 456 | 0x03, /* MBOX_WAKE_UP */ | ||
| 457 | 0x01, /* MBOX_STOP_FIRMWARE */ | ||
| 458 | 0x0f, /* MBOX_ABORT_IOCB */ | ||
| 459 | 0x03, /* MBOX_ABORT_DEVICE */ | ||
| 460 | 0x07, /* MBOX_ABORT_TARGET */ | ||
| 461 | 0x03, /* MBOX_BUS_RESET */ | ||
| 462 | 0x03, /* MBOX_STOP_QUEUE */ | ||
| 463 | 0x03, /* MBOX_START_QUEUE */ | ||
| 464 | 0x03, /* MBOX_SINGLE_STEP_QUEUE */ | ||
| 465 | 0x03, /* MBOX_ABORT_QUEUE */ | ||
| 466 | 0x03, /* MBOX_GET_DEV_QUEUE_STATUS */ | ||
| 467 | 0x00, /* 0x001e */ | ||
| 468 | 0x01, /* MBOX_GET_FIRMWARE_STATUS */ | ||
| 469 | 0x01, /* MBOX_GET_INIT_SCSI_ID */ | ||
| 470 | 0x00, /* 0x0021 */ | ||
| 471 | 0x01, /* MBOX_GET_RETRY_COUNT */ | ||
| 472 | 0x00, /* 0x0023 */ | ||
| 473 | 0x00, /* 0x0024 */ | ||
| 474 | 0x00, /* 0x0025 */ | ||
| 475 | 0x00, /* 0x0026 */ | ||
| 476 | 0x00, /* 0x0027 */ | ||
| 477 | 0x03, /* MBOX_GET_TARGET_PARAMS */ | ||
| 478 | 0x03, /* MBOX_GET_DEV_QUEUE_PARAMS */ | ||
| 479 | 0x00, /* 0x002a */ | ||
| 480 | 0x00, /* 0x002b */ | ||
| 481 | 0x00, /* 0x002c */ | ||
| 482 | 0x00, /* 0x002d */ | ||
| 483 | 0x00, /* 0x002e */ | ||
| 484 | 0x00, /* 0x002f */ | ||
| 485 | 0x00, /* 0x0030 */ | ||
| 486 | 0x00, /* 0x0031 */ | ||
| 487 | 0x07, /* MBOX_SET_RETRY_COUNT */ | ||
| 488 | 0x00, /* 0x0033 */ | ||
| 489 | 0x00, /* 0x0034 */ | ||
| 490 | 0x00, /* 0x0035 */ | ||
| 491 | 0x00, /* 0x0036 */ | ||
| 492 | 0x00, /* 0x0037 */ | ||
| 493 | 0x0f, /* MBOX_SET_TARGET_PARAMS */ | ||
| 494 | 0x0f, /* MBOX_SET_DEV_QUEUE_PARAMS */ | ||
| 495 | 0x00, /* 0x003a */ | ||
| 496 | 0x00, /* 0x003b */ | ||
| 497 | 0x00, /* 0x003c */ | ||
| 498 | 0x00, /* 0x003d */ | ||
| 499 | 0x00, /* 0x003e */ | ||
| 500 | 0x00, /* 0x003f */ | ||
| 501 | 0x00, /* 0x0040 */ | ||
| 502 | 0x00, /* 0x0041 */ | ||
| 503 | 0x00, /* 0x0042 */ | ||
| 504 | 0x00, /* 0x0043 */ | ||
| 505 | 0x00, /* 0x0044 */ | ||
| 506 | 0x00, /* 0x0045 */ | ||
| 507 | 0x00, /* 0x0046 */ | ||
| 508 | 0x00, /* 0x0047 */ | ||
| 509 | 0x00, /* 0x0048 */ | ||
| 510 | 0x00, /* 0x0049 */ | ||
| 511 | 0x00, /* 0x004a */ | ||
| 512 | 0x00, /* 0x004b */ | ||
| 513 | 0x00, /* 0x004c */ | ||
| 514 | 0x00, /* 0x004d */ | ||
| 515 | 0x00, /* 0x004e */ | ||
| 516 | 0x00, /* 0x004f */ | ||
| 517 | 0x00, /* 0x0050 */ | ||
| 518 | 0x00, /* 0x0051 */ | ||
| 519 | 0x00, /* 0x0052 */ | ||
| 520 | 0x00, /* 0x0053 */ | ||
| 521 | 0xcf, /* MBOX_EXECUTE_IOCB64 */ | ||
| 522 | 0x00, /* 0x0055 */ | ||
| 523 | 0x00, /* 0x0056 */ | ||
| 524 | 0x00, /* 0x0057 */ | ||
| 525 | 0x00, /* 0x0058 */ | ||
| 526 | 0x00, /* 0x0059 */ | ||
| 527 | 0x00, /* 0x005a */ | ||
| 528 | 0x00, /* 0x005b */ | ||
| 529 | 0x00, /* 0x005c */ | ||
| 530 | 0x00, /* 0x005d */ | ||
| 531 | 0x00, /* 0x005e */ | ||
| 532 | 0x00, /* 0x005f */ | ||
| 533 | 0xff, /* MBOX_INIT_FIRMWARE */ | ||
| 534 | 0xcd, /* MBOX_GET_INIT_CB */ | ||
| 535 | 0x01, /* MBOX_INIT_LIP */ | ||
| 536 | 0xcd, /* MBOX_GET_POS_MAP */ | ||
| 537 | 0xcf, /* MBOX_GET_PORT_DB */ | ||
| 538 | 0x03, /* MBOX_CLEAR_ACA */ | ||
| 539 | 0x03, /* MBOX_TARGET_RESET */ | ||
| 540 | 0x03, /* MBOX_CLEAR_TASK_SET */ | ||
| 541 | 0x03, /* MBOX_ABORT_TASK_SET */ | ||
| 542 | 0x01, /* MBOX_GET_FIRMWARE_STATE */ | ||
| 543 | 0x03, /* MBOX_GET_PORT_NAME */ | ||
| 544 | 0x00, /* 0x006b */ | ||
| 545 | 0x00, /* 0x006c */ | ||
| 546 | 0x00, /* 0x006d */ | ||
| 547 | 0xcf, /* MBOX_SEND_SNS */ | ||
| 548 | 0x0f, /* MBOX_PORT_LOGIN */ | ||
| 549 | 0x03, /* MBOX_SEND_CHANGE_REQUEST */ | ||
| 550 | 0x03, /* MBOX_PORT_LOGOUT */ | ||
| 551 | }; | ||
| 552 | |||
| 553 | #define MAX_MBOX_COMMAND (sizeof(mbox_param)/sizeof(u_short)) | ||
| 554 | |||
| 555 | |||
| 556 | struct id_name_map { | ||
| 557 | u64 wwn; | ||
| 558 | u_char loop_id; | ||
| 559 | }; | ||
| 560 | |||
| 561 | struct sns_cb { | ||
| 562 | u_short len; | ||
| 563 | u_short res1; | ||
| 564 | u_int response_low; | ||
| 565 | u_int response_high; | ||
| 566 | u_short sub_len; | ||
| 567 | u_short res2; | ||
| 568 | u_char data[44]; | ||
| 569 | }; | ||
| 570 | |||
| 571 | /* address of instance of this struct is passed to adapter to initialize things | ||
| 572 | */ | ||
| 573 | struct init_cb { | ||
| 574 | u_char version; | ||
| 575 | u_char reseverd1[1]; | ||
| 576 | u_short firm_opts; | ||
| 577 | u_short max_frame_len; | ||
| 578 | u_short max_iocb; | ||
| 579 | u_short exec_throttle; | ||
| 580 | u_char retry_cnt; | ||
| 581 | u_char retry_delay; | ||
| 582 | u_short node_name[4]; | ||
| 583 | u_short hard_addr; | ||
| 584 | u_char reserved2[10]; | ||
| 585 | u_short req_queue_out; | ||
| 586 | u_short res_queue_in; | ||
| 587 | u_short req_queue_len; | ||
| 588 | u_short res_queue_len; | ||
| 589 | u_int req_queue_addr_lo; | ||
| 590 | u_int req_queue_addr_high; | ||
| 591 | u_int res_queue_addr_lo; | ||
| 592 | u_int res_queue_addr_high; | ||
| 593 | /* the rest of this structure only applies to the isp2200 */ | ||
| 594 | u_short lun_enables; | ||
| 595 | u_char cmd_resource_cnt; | ||
| 596 | u_char notify_resource_cnt; | ||
| 597 | u_short timeout; | ||
| 598 | u_short reserved3; | ||
| 599 | u_short add_firm_opts; | ||
| 600 | u_char res_accum_timer; | ||
| 601 | u_char irq_delay_timer; | ||
| 602 | u_short special_options; | ||
| 603 | u_short reserved4[13]; | ||
| 604 | }; | ||
| 605 | |||
| 606 | /* | ||
| 607 | * The result queue can be quite a bit smaller since continuation entries | ||
| 608 | * do not show up there: | ||
| 609 | */ | ||
| 610 | #define RES_QUEUE_LEN ((QLOGICFC_REQ_QUEUE_LEN + 1) / 8 - 1) | ||
| 611 | #define QUEUE_ENTRY_LEN 64 | ||
| 612 | |||
| 613 | #if ISP2x00_FABRIC | ||
| 614 | #define QLOGICFC_MAX_ID 0xff | ||
| 615 | #else | ||
| 616 | #define QLOGICFC_MAX_ID 0x7d | ||
| 617 | #endif | ||
| 618 | |||
| 619 | #define QLOGICFC_MAX_LUN 128 | ||
| 620 | #define QLOGICFC_MAX_LOOP_ID 0x7d | ||
| 621 | |||
| 622 | /* the following connection options only apply to the 2200. i have only | ||
| 623 | * had success with LOOP_ONLY and P2P_ONLY. | ||
| 624 | */ | ||
| 625 | |||
| 626 | #define LOOP_ONLY 0 | ||
| 627 | #define P2P_ONLY 1 | ||
| 628 | #define LOOP_PREFERED 2 | ||
| 629 | #define P2P_PREFERED 3 | ||
| 630 | |||
| 631 | #define CONNECTION_PREFERENCE LOOP_ONLY | ||
| 632 | |||
| 633 | /* adapter_state values */ | ||
| 634 | #define AS_FIRMWARE_DEAD -1 | ||
| 635 | #define AS_LOOP_DOWN 0 | ||
| 636 | #define AS_LOOP_GOOD 1 | ||
| 637 | #define AS_REDO_FABRIC_PORTDB 2 | ||
| 638 | #define AS_REDO_LOOP_PORTDB 4 | ||
| 639 | |||
| 640 | #define RES_SIZE ((RES_QUEUE_LEN + 1)*QUEUE_ENTRY_LEN) | ||
| 641 | #define REQ_SIZE ((QLOGICFC_REQ_QUEUE_LEN + 1)*QUEUE_ENTRY_LEN) | ||
| 642 | |||
| 643 | struct isp2x00_hostdata { | ||
| 644 | u_char revision; | ||
| 645 | struct pci_dev *pci_dev; | ||
| 646 | /* result and request queues (shared with isp2x00): */ | ||
| 647 | u_int req_in_ptr; /* index of next request slot */ | ||
| 648 | u_int res_out_ptr; /* index of next result slot */ | ||
| 649 | |||
| 650 | /* this is here so the queues are nicely aligned */ | ||
| 651 | long send_marker; /* do we need to send a marker? */ | ||
| 652 | |||
| 653 | char * res; | ||
| 654 | char * req; | ||
| 655 | struct init_cb control_block; | ||
| 656 | int adapter_state; | ||
| 657 | unsigned long int tag_ages[QLOGICFC_MAX_ID + 1]; | ||
| 658 | Scsi_Cmnd *handle_ptrs[QLOGICFC_REQ_QUEUE_LEN + 1]; | ||
| 659 | unsigned long handle_serials[QLOGICFC_REQ_QUEUE_LEN + 1]; | ||
| 660 | struct id_name_map port_db[QLOGICFC_MAX_ID + 1]; | ||
| 661 | u_char mbox_done; | ||
| 662 | u64 wwn; | ||
| 663 | u_int port_id; | ||
| 664 | u_char queued; | ||
| 665 | u_char host_id; | ||
| 666 | struct timer_list explore_timer; | ||
| 667 | struct id_name_map tempmap[QLOGICFC_MAX_ID + 1]; | ||
| 668 | }; | ||
| 669 | |||
| 670 | |||
| 671 | /* queue length's _must_ be power of two: */ | ||
| 672 | #define QUEUE_DEPTH(in, out, ql) ((in - out) & (ql)) | ||
| 673 | #define REQ_QUEUE_DEPTH(in, out) QUEUE_DEPTH(in, out, \ | ||
| 674 | QLOGICFC_REQ_QUEUE_LEN) | ||
| 675 | #define RES_QUEUE_DEPTH(in, out) QUEUE_DEPTH(in, out, RES_QUEUE_LEN) | ||
| 676 | |||
| 677 | static void isp2x00_enable_irqs(struct Scsi_Host *); | ||
| 678 | static void isp2x00_disable_irqs(struct Scsi_Host *); | ||
| 679 | static int isp2x00_init(struct Scsi_Host *); | ||
| 680 | static int isp2x00_reset_hardware(struct Scsi_Host *); | ||
| 681 | static int isp2x00_mbox_command(struct Scsi_Host *, u_short[]); | ||
| 682 | static int isp2x00_return_status(Scsi_Cmnd *, struct Status_Entry *); | ||
| 683 | static void isp2x00_intr_handler(int, void *, struct pt_regs *); | ||
| 684 | static irqreturn_t do_isp2x00_intr_handler(int, void *, struct pt_regs *); | ||
| 685 | static int isp2x00_make_portdb(struct Scsi_Host *); | ||
| 686 | |||
| 687 | #if ISP2x00_FABRIC | ||
| 688 | static int isp2x00_init_fabric(struct Scsi_Host *, struct id_name_map *, int); | ||
| 689 | #endif | ||
| 690 | |||
| 691 | #if USE_NVRAM_DEFAULTS | ||
| 692 | static int isp2x00_get_nvram_defaults(struct Scsi_Host *, struct init_cb *); | ||
| 693 | static u_short isp2x00_read_nvram_word(struct Scsi_Host *, u_short); | ||
| 694 | #endif | ||
| 695 | |||
| 696 | #if DEBUG_ISP2x00 | ||
| 697 | static void isp2x00_print_scsi_cmd(Scsi_Cmnd *); | ||
| 698 | #endif | ||
| 699 | |||
| 700 | #if DEBUG_ISP2x00_INTR | ||
| 701 | static void isp2x00_print_status_entry(struct Status_Entry *); | ||
| 702 | #endif | ||
| 703 | |||
| 704 | static inline void isp2x00_enable_irqs(struct Scsi_Host *host) | ||
| 705 | { | ||
| 706 | outw(ISP_EN_INT | ISP_EN_RISC, host->io_port + PCI_INTER_CTL); | ||
| 707 | } | ||
| 708 | |||
| 709 | |||
| 710 | static inline void isp2x00_disable_irqs(struct Scsi_Host *host) | ||
| 711 | { | ||
| 712 | outw(0x0, host->io_port + PCI_INTER_CTL); | ||
| 713 | } | ||
| 714 | |||
| 715 | |||
| 716 | static int isp2x00_detect(struct scsi_host_template * tmpt) | ||
| 717 | { | ||
| 718 | int hosts = 0; | ||
| 719 | unsigned long wait_time; | ||
| 720 | struct Scsi_Host *host = NULL; | ||
| 721 | struct isp2x00_hostdata *hostdata; | ||
| 722 | struct pci_dev *pdev; | ||
| 723 | unsigned short device_ids[2]; | ||
| 724 | dma_addr_t busaddr; | ||
| 725 | int i; | ||
| 726 | |||
| 727 | |||
| 728 | ENTER("isp2x00_detect"); | ||
| 729 | |||
| 730 | device_ids[0] = PCI_DEVICE_ID_QLOGIC_ISP2100; | ||
| 731 | device_ids[1] = PCI_DEVICE_ID_QLOGIC_ISP2200; | ||
| 732 | |||
| 733 | tmpt->proc_name = "isp2x00"; | ||
| 734 | |||
| 735 | for (i=0; i<2; i++){ | ||
| 736 | pdev = NULL; | ||
| 737 | while ((pdev = pci_find_device(PCI_VENDOR_ID_QLOGIC, device_ids[i], pdev))) { | ||
| 738 | if (pci_enable_device(pdev)) | ||
| 739 | continue; | ||
| 740 | |||
| 741 | /* Try to configure DMA attributes. */ | ||
| 742 | if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) && | ||
| 743 | pci_set_dma_mask(pdev, DMA_32BIT_MASK)) | ||
| 744 | continue; | ||
| 745 | |||
| 746 | host = scsi_register(tmpt, sizeof(struct isp2x00_hostdata)); | ||
| 747 | if (!host) { | ||
| 748 | printk("qlogicfc%d : could not register host.\n", hosts); | ||
| 749 | continue; | ||
| 750 | } | ||
| 751 | host->max_id = QLOGICFC_MAX_ID + 1; | ||
| 752 | host->max_lun = QLOGICFC_MAX_LUN; | ||
| 753 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 754 | |||
| 755 | memset(hostdata, 0, sizeof(struct isp2x00_hostdata)); | ||
| 756 | hostdata->pci_dev = pdev; | ||
| 757 | hostdata->res = pci_alloc_consistent(pdev, RES_SIZE + REQ_SIZE, &busaddr); | ||
| 758 | |||
| 759 | if (!hostdata->res){ | ||
| 760 | printk("qlogicfc%d : could not allocate memory for request and response queue.\n", hosts); | ||
| 761 | scsi_unregister(host); | ||
| 762 | continue; | ||
| 763 | } | ||
| 764 | hostdata->req = hostdata->res + (RES_QUEUE_LEN + 1)*QUEUE_ENTRY_LEN; | ||
| 765 | hostdata->queued = 0; | ||
| 766 | /* set up the control block */ | ||
| 767 | hostdata->control_block.version = 0x1; | ||
| 768 | hostdata->control_block.firm_opts = cpu_to_le16(0x800e); | ||
| 769 | hostdata->control_block.max_frame_len = cpu_to_le16(2048); | ||
| 770 | hostdata->control_block.max_iocb = cpu_to_le16(QLOGICFC_REQ_QUEUE_LEN); | ||
| 771 | hostdata->control_block.exec_throttle = cpu_to_le16(QLOGICFC_CMD_PER_LUN); | ||
| 772 | hostdata->control_block.retry_delay = 5; | ||
| 773 | hostdata->control_block.retry_cnt = 1; | ||
| 774 | hostdata->control_block.node_name[0] = cpu_to_le16(0x0020); | ||
| 775 | hostdata->control_block.node_name[1] = cpu_to_le16(0xE000); | ||
| 776 | hostdata->control_block.node_name[2] = cpu_to_le16(0x008B); | ||
| 777 | hostdata->control_block.node_name[3] = cpu_to_le16(0x0000); | ||
| 778 | hostdata->control_block.hard_addr = cpu_to_le16(0x0003); | ||
| 779 | hostdata->control_block.req_queue_len = cpu_to_le16(QLOGICFC_REQ_QUEUE_LEN + 1); | ||
| 780 | hostdata->control_block.res_queue_len = cpu_to_le16(RES_QUEUE_LEN + 1); | ||
| 781 | hostdata->control_block.res_queue_addr_lo = cpu_to_le32(pci64_dma_lo32(busaddr)); | ||
| 782 | hostdata->control_block.res_queue_addr_high = cpu_to_le32(pci64_dma_hi32(busaddr)); | ||
| 783 | hostdata->control_block.req_queue_addr_lo = cpu_to_le32(pci64_dma_lo32(busaddr + RES_SIZE)); | ||
| 784 | hostdata->control_block.req_queue_addr_high = cpu_to_le32(pci64_dma_hi32(busaddr + RES_SIZE)); | ||
| 785 | |||
| 786 | |||
| 787 | hostdata->control_block.add_firm_opts |= cpu_to_le16(CONNECTION_PREFERENCE<<4); | ||
| 788 | hostdata->adapter_state = AS_LOOP_DOWN; | ||
| 789 | hostdata->explore_timer.data = 1; | ||
| 790 | hostdata->host_id = hosts; | ||
| 791 | |||
| 792 | if (isp2x00_init(host) || isp2x00_reset_hardware(host)) { | ||
| 793 | pci_free_consistent (pdev, RES_SIZE + REQ_SIZE, hostdata->res, busaddr); | ||
| 794 | scsi_unregister(host); | ||
| 795 | continue; | ||
| 796 | } | ||
| 797 | host->this_id = 0; | ||
| 798 | |||
| 799 | if (request_irq(host->irq, do_isp2x00_intr_handler, SA_INTERRUPT | SA_SHIRQ, "qlogicfc", host)) { | ||
| 800 | printk("qlogicfc%d : interrupt %d already in use\n", | ||
| 801 | hostdata->host_id, host->irq); | ||
| 802 | pci_free_consistent (pdev, RES_SIZE + REQ_SIZE, hostdata->res, busaddr); | ||
| 803 | scsi_unregister(host); | ||
| 804 | continue; | ||
| 805 | } | ||
| 806 | if (!request_region(host->io_port, 0xff, "qlogicfc")) { | ||
| 807 | printk("qlogicfc%d : i/o region 0x%lx-0x%lx already " | ||
| 808 | "in use\n", | ||
| 809 | hostdata->host_id, host->io_port, host->io_port + 0xff); | ||
| 810 | free_irq(host->irq, host); | ||
| 811 | pci_free_consistent (pdev, RES_SIZE + REQ_SIZE, hostdata->res, busaddr); | ||
| 812 | scsi_unregister(host); | ||
| 813 | continue; | ||
| 814 | } | ||
| 815 | |||
| 816 | outw(0x0, host->io_port + PCI_SEMAPHORE); | ||
| 817 | outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR); | ||
| 818 | isp2x00_enable_irqs(host); | ||
| 819 | /* wait for the loop to come up */ | ||
| 820 | for (wait_time = jiffies + 10 * HZ; time_before(jiffies, wait_time) && hostdata->adapter_state == AS_LOOP_DOWN;) { | ||
| 821 | barrier(); | ||
| 822 | cpu_relax(); | ||
| 823 | } | ||
| 824 | if (hostdata->adapter_state == AS_LOOP_DOWN) { | ||
| 825 | printk("qlogicfc%d : link is not up\n", hostdata->host_id); | ||
| 826 | } | ||
| 827 | hosts++; | ||
| 828 | hostdata->explore_timer.data = 0; | ||
| 829 | } | ||
| 830 | } | ||
| 831 | |||
| 832 | |||
| 833 | /* this busy loop should not be needed but the isp2x00 seems to need | ||
| 834 | some time before recognizing it is attached to a fabric */ | ||
| 835 | |||
| 836 | #if ISP2x00_FABRIC | ||
| 837 | if (hosts) { | ||
| 838 | for (wait_time = jiffies + 5 * HZ; time_before(jiffies, wait_time);) { | ||
| 839 | barrier(); | ||
| 840 | cpu_relax(); | ||
| 841 | } | ||
| 842 | } | ||
| 843 | #endif | ||
| 844 | |||
| 845 | LEAVE("isp2x00_detect"); | ||
| 846 | |||
| 847 | return hosts; | ||
| 848 | } | ||
| 849 | |||
| 850 | |||
| 851 | static int isp2x00_make_portdb(struct Scsi_Host *host) | ||
| 852 | { | ||
| 853 | |||
| 854 | short param[8]; | ||
| 855 | int i, j; | ||
| 856 | struct isp2x00_hostdata *hostdata; | ||
| 857 | |||
| 858 | isp2x00_disable_irqs(host); | ||
| 859 | |||
| 860 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 861 | memset(hostdata->tempmap, 0, sizeof(hostdata->tempmap)); | ||
| 862 | |||
| 863 | #if ISP2x00_FABRIC | ||
| 864 | for (i = 0x81; i < QLOGICFC_MAX_ID; i++) { | ||
| 865 | param[0] = MBOX_PORT_LOGOUT; | ||
| 866 | param[1] = i << 8; | ||
| 867 | param[2] = 0; | ||
| 868 | param[3] = 0; | ||
| 869 | |||
| 870 | isp2x00_mbox_command(host, param); | ||
| 871 | |||
| 872 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 873 | |||
| 874 | DEBUG_FABRIC(printk("qlogicfc%d : logout failed %x %x\n", hostdata->host_id, i, param[0])); | ||
| 875 | } | ||
| 876 | } | ||
| 877 | #endif | ||
| 878 | |||
| 879 | |||
| 880 | param[0] = MBOX_GET_INIT_SCSI_ID; | ||
| 881 | |||
| 882 | isp2x00_mbox_command(host, param); | ||
| 883 | |||
| 884 | if (param[0] == MBOX_COMMAND_COMPLETE) { | ||
| 885 | hostdata->port_id = ((u_int) param[3]) << 16; | ||
| 886 | hostdata->port_id |= param[2]; | ||
| 887 | hostdata->tempmap[0].loop_id = param[1]; | ||
| 888 | hostdata->tempmap[0].wwn = hostdata->wwn; | ||
| 889 | } | ||
| 890 | else { | ||
| 891 | printk("qlogicfc%d : error getting scsi id.\n", hostdata->host_id); | ||
| 892 | } | ||
| 893 | |||
| 894 | for (i = 0; i <=QLOGICFC_MAX_ID; i++) | ||
| 895 | hostdata->tempmap[i].loop_id = hostdata->tempmap[0].loop_id; | ||
| 896 | |||
| 897 | for (i = 0, j = 1; i <= QLOGICFC_MAX_LOOP_ID; i++) { | ||
| 898 | param[0] = MBOX_GET_PORT_NAME; | ||
| 899 | param[1] = (i << 8) & 0xff00; | ||
| 900 | |||
| 901 | isp2x00_mbox_command(host, param); | ||
| 902 | |||
| 903 | if (param[0] == MBOX_COMMAND_COMPLETE) { | ||
| 904 | hostdata->tempmap[j].loop_id = i; | ||
| 905 | hostdata->tempmap[j].wwn = ((u64) (param[2] & 0xff)) << 56; | ||
| 906 | hostdata->tempmap[j].wwn |= ((u64) ((param[2] >> 8) & 0xff)) << 48; | ||
| 907 | hostdata->tempmap[j].wwn |= ((u64) (param[3] & 0xff)) << 40; | ||
| 908 | hostdata->tempmap[j].wwn |= ((u64) ((param[3] >> 8) & 0xff)) << 32; | ||
| 909 | hostdata->tempmap[j].wwn |= ((u64) (param[6] & 0xff)) << 24; | ||
| 910 | hostdata->tempmap[j].wwn |= ((u64) ((param[6] >> 8) & 0xff)) << 16; | ||
| 911 | hostdata->tempmap[j].wwn |= ((u64) (param[7] & 0xff)) << 8; | ||
| 912 | hostdata->tempmap[j].wwn |= ((u64) ((param[7] >> 8) & 0xff)); | ||
| 913 | |||
| 914 | j++; | ||
| 915 | |||
| 916 | } | ||
| 917 | } | ||
| 918 | |||
| 919 | |||
| 920 | #if ISP2x00_FABRIC | ||
| 921 | isp2x00_init_fabric(host, hostdata->tempmap, j); | ||
| 922 | #endif | ||
| 923 | |||
| 924 | for (i = 0; i <= QLOGICFC_MAX_ID; i++) { | ||
| 925 | if (hostdata->tempmap[i].wwn != hostdata->port_db[i].wwn) { | ||
| 926 | for (j = 0; j <= QLOGICFC_MAX_ID; j++) { | ||
| 927 | if (hostdata->tempmap[j].wwn == hostdata->port_db[i].wwn) { | ||
| 928 | hostdata->port_db[i].loop_id = hostdata->tempmap[j].loop_id; | ||
| 929 | break; | ||
| 930 | } | ||
| 931 | } | ||
| 932 | if (j == QLOGICFC_MAX_ID + 1) | ||
| 933 | hostdata->port_db[i].loop_id = hostdata->tempmap[0].loop_id; | ||
| 934 | |||
| 935 | for (j = 0; j <= QLOGICFC_MAX_ID; j++) { | ||
| 936 | if (hostdata->port_db[j].wwn == hostdata->tempmap[i].wwn || !hostdata->port_db[j].wwn) { | ||
| 937 | break; | ||
| 938 | } | ||
| 939 | } | ||
| 940 | if (j == QLOGICFC_MAX_ID + 1) | ||
| 941 | printk("qlogicfc%d : Too many scsi devices, no more room in port map.\n", hostdata->host_id); | ||
| 942 | if (!hostdata->port_db[j].wwn) { | ||
| 943 | hostdata->port_db[j].loop_id = hostdata->tempmap[i].loop_id; | ||
| 944 | hostdata->port_db[j].wwn = hostdata->tempmap[i].wwn; | ||
| 945 | } | ||
| 946 | } else | ||
| 947 | hostdata->port_db[i].loop_id = hostdata->tempmap[i].loop_id; | ||
| 948 | |||
| 949 | } | ||
| 950 | |||
| 951 | isp2x00_enable_irqs(host); | ||
| 952 | |||
| 953 | return 0; | ||
| 954 | } | ||
| 955 | |||
| 956 | |||
| 957 | #if ISP2x00_FABRIC | ||
| 958 | |||
| 959 | #define FABRIC_PORT 0x7e | ||
| 960 | #define FABRIC_CONTROLLER 0x7f | ||
| 961 | #define FABRIC_SNS 0x80 | ||
| 962 | |||
| 963 | int isp2x00_init_fabric(struct Scsi_Host *host, struct id_name_map *port_db, int cur_scsi_id) | ||
| 964 | { | ||
| 965 | |||
| 966 | u_short param[8]; | ||
| 967 | u64 wwn; | ||
| 968 | int done = 0; | ||
| 969 | u_short loop_id = 0x81; | ||
| 970 | u_short scsi_id = cur_scsi_id; | ||
| 971 | u_int port_id; | ||
| 972 | struct sns_cb *req; | ||
| 973 | u_char *sns_response; | ||
| 974 | dma_addr_t busaddr; | ||
| 975 | struct isp2x00_hostdata *hostdata; | ||
| 976 | |||
| 977 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 978 | |||
| 979 | DEBUG_FABRIC(printk("qlogicfc%d : Checking for a fabric.\n", hostdata->host_id)); | ||
| 980 | param[0] = MBOX_GET_PORT_NAME; | ||
| 981 | param[1] = (u16)FABRIC_PORT << 8; | ||
| 982 | |||
| 983 | isp2x00_mbox_command(host, param); | ||
| 984 | |||
| 985 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 986 | DEBUG_FABRIC(printk("qlogicfc%d : fabric check result %x\n", hostdata->host_id, param[0])); | ||
| 987 | return 0; | ||
| 988 | } | ||
| 989 | printk("qlogicfc%d : Fabric found.\n", hostdata->host_id); | ||
| 990 | |||
| 991 | req = (struct sns_cb *)pci_alloc_consistent(hostdata->pci_dev, sizeof(*req) + 608, &busaddr); | ||
| 992 | |||
| 993 | if (!req){ | ||
| 994 | printk("qlogicfc%d : Could not allocate DMA resources for fabric initialization\n", hostdata->host_id); | ||
| 995 | return 0; | ||
| 996 | } | ||
| 997 | sns_response = (u_char *)(req + 1); | ||
| 998 | |||
| 999 | if (hostdata->adapter_state & AS_REDO_LOOP_PORTDB){ | ||
| 1000 | memset(req, 0, sizeof(*req)); | ||
| 1001 | |||
| 1002 | req->len = cpu_to_le16(8); | ||
| 1003 | req->response_low = cpu_to_le32(pci64_dma_lo32(busaddr + sizeof(*req))); | ||
| 1004 | req->response_high = cpu_to_le32(pci64_dma_hi32(busaddr + sizeof(*req))); | ||
| 1005 | req->sub_len = cpu_to_le16(22); | ||
| 1006 | req->data[0] = 0x17; | ||
| 1007 | req->data[1] = 0x02; | ||
| 1008 | req->data[8] = (u_char) (hostdata->port_id & 0xff); | ||
| 1009 | req->data[9] = (u_char) (hostdata->port_id >> 8 & 0xff); | ||
| 1010 | req->data[10] = (u_char) (hostdata->port_id >> 16 & 0xff); | ||
| 1011 | req->data[13] = 0x01; | ||
| 1012 | param[0] = MBOX_SEND_SNS; | ||
| 1013 | param[1] = 30; | ||
| 1014 | param[2] = pci64_dma_lo32(busaddr) >> 16; | ||
| 1015 | param[3] = pci64_dma_lo32(busaddr); | ||
| 1016 | param[6] = pci64_dma_hi32(busaddr) >> 16; | ||
| 1017 | param[7] = pci64_dma_hi32(busaddr); | ||
| 1018 | |||
| 1019 | isp2x00_mbox_command(host, param); | ||
| 1020 | |||
| 1021 | if (param[0] != MBOX_COMMAND_COMPLETE) | ||
| 1022 | printk("qlogicfc%d : error sending RFC-4\n", hostdata->host_id); | ||
| 1023 | } | ||
| 1024 | |||
| 1025 | port_id = hostdata->port_id; | ||
| 1026 | while (!done) { | ||
| 1027 | memset(req, 0, sizeof(*req)); | ||
| 1028 | |||
| 1029 | req->len = cpu_to_le16(304); | ||
| 1030 | req->response_low = cpu_to_le32(pci64_dma_lo32(busaddr + sizeof(*req))); | ||
| 1031 | req->response_high = cpu_to_le32(pci64_dma_hi32(busaddr + sizeof(*req))); | ||
| 1032 | req->sub_len = cpu_to_le16(6); | ||
| 1033 | req->data[0] = 0x00; | ||
| 1034 | req->data[1] = 0x01; | ||
| 1035 | req->data[8] = (u_char) (port_id & 0xff); | ||
| 1036 | req->data[9] = (u_char) (port_id >> 8 & 0xff); | ||
| 1037 | req->data[10] = (u_char) (port_id >> 16 & 0xff); | ||
| 1038 | |||
| 1039 | param[0] = MBOX_SEND_SNS; | ||
| 1040 | param[1] = 14; | ||
| 1041 | param[2] = pci64_dma_lo32(busaddr) >> 16; | ||
| 1042 | param[3] = pci64_dma_lo32(busaddr); | ||
| 1043 | param[6] = pci64_dma_hi32(busaddr) >> 16; | ||
| 1044 | param[7] = pci64_dma_hi32(busaddr); | ||
| 1045 | |||
| 1046 | isp2x00_mbox_command(host, param); | ||
| 1047 | |||
| 1048 | if (param[0] == MBOX_COMMAND_COMPLETE) { | ||
| 1049 | DEBUG_FABRIC(printk("qlogicfc%d : found node %02x%02x%02x%02x%02x%02x%02x%02x ", hostdata->host_id, sns_response[20], sns_response[21], sns_response[22], sns_response[23], sns_response[24], sns_response[25], sns_response[26], sns_response[27])); | ||
| 1050 | DEBUG_FABRIC(printk(" port id: %02x%02x%02x\n", sns_response[17], sns_response[18], sns_response[19])); | ||
| 1051 | port_id = ((u_int) sns_response[17]) << 16; | ||
| 1052 | port_id |= ((u_int) sns_response[18]) << 8; | ||
| 1053 | port_id |= ((u_int) sns_response[19]); | ||
| 1054 | wwn = ((u64) sns_response[20]) << 56; | ||
| 1055 | wwn |= ((u64) sns_response[21]) << 48; | ||
| 1056 | wwn |= ((u64) sns_response[22]) << 40; | ||
| 1057 | wwn |= ((u64) sns_response[23]) << 32; | ||
| 1058 | wwn |= ((u64) sns_response[24]) << 24; | ||
| 1059 | wwn |= ((u64) sns_response[25]) << 16; | ||
| 1060 | wwn |= ((u64) sns_response[26]) << 8; | ||
| 1061 | wwn |= ((u64) sns_response[27]); | ||
| 1062 | if (hostdata->port_id >> 8 != port_id >> 8) { | ||
| 1063 | DEBUG_FABRIC(printk("qlogicfc%d : adding a fabric port: %x\n", hostdata->host_id, port_id)); | ||
| 1064 | param[0] = MBOX_PORT_LOGIN; | ||
| 1065 | param[1] = loop_id << 8; | ||
| 1066 | param[2] = (u_short) (port_id >> 16); | ||
| 1067 | param[3] = (u_short) (port_id); | ||
| 1068 | |||
| 1069 | isp2x00_mbox_command(host, param); | ||
| 1070 | |||
| 1071 | if (param[0] == MBOX_COMMAND_COMPLETE) { | ||
| 1072 | port_db[scsi_id].wwn = wwn; | ||
| 1073 | port_db[scsi_id].loop_id = loop_id; | ||
| 1074 | loop_id++; | ||
| 1075 | scsi_id++; | ||
| 1076 | } else { | ||
| 1077 | printk("qlogicfc%d : Error performing port login %x\n", hostdata->host_id, param[0]); | ||
| 1078 | DEBUG_FABRIC(printk("qlogicfc%d : loop_id: %x\n", hostdata->host_id, loop_id)); | ||
| 1079 | param[0] = MBOX_PORT_LOGOUT; | ||
| 1080 | param[1] = loop_id << 8; | ||
| 1081 | param[2] = 0; | ||
| 1082 | param[3] = 0; | ||
| 1083 | |||
| 1084 | isp2x00_mbox_command(host, param); | ||
| 1085 | |||
| 1086 | } | ||
| 1087 | |||
| 1088 | } | ||
| 1089 | if (hostdata->port_id == port_id) | ||
| 1090 | done = 1; | ||
| 1091 | } else { | ||
| 1092 | printk("qlogicfc%d : Get All Next failed %x.\n", hostdata->host_id, param[0]); | ||
| 1093 | pci_free_consistent(hostdata->pci_dev, sizeof(*req) + 608, req, busaddr); | ||
| 1094 | return 0; | ||
| 1095 | } | ||
| 1096 | } | ||
| 1097 | |||
| 1098 | pci_free_consistent(hostdata->pci_dev, sizeof(*req) + 608, req, busaddr); | ||
| 1099 | return 1; | ||
| 1100 | } | ||
| 1101 | |||
| 1102 | #endif /* ISP2x00_FABRIC */ | ||
| 1103 | |||
| 1104 | |||
| 1105 | static int isp2x00_release(struct Scsi_Host *host) | ||
| 1106 | { | ||
| 1107 | struct isp2x00_hostdata *hostdata; | ||
| 1108 | dma_addr_t busaddr; | ||
| 1109 | |||
| 1110 | ENTER("isp2x00_release"); | ||
| 1111 | |||
| 1112 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1113 | |||
| 1114 | outw(0x0, host->io_port + PCI_INTER_CTL); | ||
| 1115 | free_irq(host->irq, host); | ||
| 1116 | |||
| 1117 | release_region(host->io_port, 0xff); | ||
| 1118 | |||
| 1119 | busaddr = pci64_dma_build(le32_to_cpu(hostdata->control_block.res_queue_addr_high), | ||
| 1120 | le32_to_cpu(hostdata->control_block.res_queue_addr_lo)); | ||
| 1121 | pci_free_consistent(hostdata->pci_dev, RES_SIZE + REQ_SIZE, hostdata->res, busaddr); | ||
| 1122 | |||
| 1123 | LEAVE("isp2x00_release"); | ||
| 1124 | |||
| 1125 | return 0; | ||
| 1126 | } | ||
| 1127 | |||
| 1128 | |||
| 1129 | static const char *isp2x00_info(struct Scsi_Host *host) | ||
| 1130 | { | ||
| 1131 | static char buf[80]; | ||
| 1132 | struct isp2x00_hostdata *hostdata; | ||
| 1133 | ENTER("isp2x00_info"); | ||
| 1134 | |||
| 1135 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1136 | sprintf(buf, | ||
| 1137 | "QLogic ISP%04x SCSI on PCI bus %02x device %02x irq %d base 0x%lx", | ||
| 1138 | hostdata->pci_dev->device, hostdata->pci_dev->bus->number, hostdata->pci_dev->devfn, host->irq, | ||
| 1139 | host->io_port); | ||
| 1140 | |||
| 1141 | |||
| 1142 | LEAVE("isp2x00_info"); | ||
| 1143 | |||
| 1144 | return buf; | ||
| 1145 | } | ||
| 1146 | |||
| 1147 | |||
| 1148 | /* | ||
| 1149 | * The middle SCSI layer ensures that queuecommand never gets invoked | ||
| 1150 | * concurrently with itself or the interrupt handler (though the | ||
| 1151 | * interrupt handler may call this routine as part of | ||
| 1152 | * request-completion handling). | ||
| 1153 | */ | ||
| 1154 | static int isp2x00_queuecommand(Scsi_Cmnd * Cmnd, void (*done) (Scsi_Cmnd *)) | ||
| 1155 | { | ||
| 1156 | int i, sg_count, n, num_free; | ||
| 1157 | u_int in_ptr, out_ptr; | ||
| 1158 | struct dataseg *ds; | ||
| 1159 | struct scatterlist *sg; | ||
| 1160 | struct Command_Entry *cmd; | ||
| 1161 | struct Continuation_Entry *cont; | ||
| 1162 | struct Scsi_Host *host; | ||
| 1163 | struct isp2x00_hostdata *hostdata; | ||
| 1164 | |||
| 1165 | ENTER("isp2x00_queuecommand"); | ||
| 1166 | |||
| 1167 | host = Cmnd->device->host; | ||
| 1168 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1169 | Cmnd->scsi_done = done; | ||
| 1170 | |||
| 1171 | DEBUG(isp2x00_print_scsi_cmd(Cmnd)); | ||
| 1172 | |||
| 1173 | if (hostdata->adapter_state & AS_REDO_FABRIC_PORTDB || hostdata->adapter_state & AS_REDO_LOOP_PORTDB) { | ||
| 1174 | isp2x00_make_portdb(host); | ||
| 1175 | hostdata->adapter_state = AS_LOOP_GOOD; | ||
| 1176 | printk("qlogicfc%d : Port Database\n", hostdata->host_id); | ||
| 1177 | for (i = 0; hostdata->port_db[i].wwn != 0; i++) { | ||
| 1178 | printk("wwn: %08x%08x scsi_id: %x loop_id: ", (u_int) (hostdata->port_db[i].wwn >> 32), (u_int) hostdata->port_db[i].wwn, i); | ||
| 1179 | if (hostdata->port_db[i].loop_id != hostdata->port_db[0].loop_id || i == 0) | ||
| 1180 | printk("%x", hostdata->port_db[i].loop_id); | ||
| 1181 | else | ||
| 1182 | printk("Not Available"); | ||
| 1183 | printk("\n"); | ||
| 1184 | } | ||
| 1185 | } | ||
| 1186 | if (hostdata->adapter_state == AS_FIRMWARE_DEAD) { | ||
| 1187 | printk("qlogicfc%d : The firmware is dead, just return.\n", hostdata->host_id); | ||
| 1188 | host->max_id = 0; | ||
| 1189 | return 0; | ||
| 1190 | } | ||
| 1191 | |||
| 1192 | out_ptr = inw(host->io_port + MBOX4); | ||
| 1193 | in_ptr = hostdata->req_in_ptr; | ||
| 1194 | |||
| 1195 | DEBUG(printk("qlogicfc%d : request queue depth %d\n", hostdata->host_id, | ||
| 1196 | REQ_QUEUE_DEPTH(in_ptr, out_ptr))); | ||
| 1197 | |||
| 1198 | cmd = (struct Command_Entry *) &hostdata->req[in_ptr*QUEUE_ENTRY_LEN]; | ||
| 1199 | in_ptr = (in_ptr + 1) & QLOGICFC_REQ_QUEUE_LEN; | ||
| 1200 | if (in_ptr == out_ptr) { | ||
| 1201 | DEBUG(printk("qlogicfc%d : request queue overflow\n", hostdata->host_id)); | ||
| 1202 | return 1; | ||
| 1203 | } | ||
| 1204 | if (hostdata->send_marker) { | ||
| 1205 | struct Marker_Entry *marker; | ||
| 1206 | |||
| 1207 | TRACE("queue marker", in_ptr, 0); | ||
| 1208 | |||
| 1209 | DEBUG(printk("qlogicfc%d : adding marker entry\n", hostdata->host_id)); | ||
| 1210 | marker = (struct Marker_Entry *) cmd; | ||
| 1211 | memset(marker, 0, sizeof(struct Marker_Entry)); | ||
| 1212 | |||
| 1213 | marker->hdr.entry_type = ENTRY_MARKER; | ||
| 1214 | marker->hdr.entry_cnt = 1; | ||
| 1215 | marker->modifier = SYNC_ALL; | ||
| 1216 | |||
| 1217 | hostdata->send_marker = 0; | ||
| 1218 | |||
| 1219 | if (((in_ptr + 1) & QLOGICFC_REQ_QUEUE_LEN) == out_ptr) { | ||
| 1220 | outw(in_ptr, host->io_port + MBOX4); | ||
| 1221 | hostdata->req_in_ptr = in_ptr; | ||
| 1222 | DEBUG(printk("qlogicfc%d : request queue overflow\n", hostdata->host_id)); | ||
| 1223 | return 1; | ||
| 1224 | } | ||
| 1225 | cmd = (struct Command_Entry *) &hostdata->req[in_ptr*QUEUE_ENTRY_LEN]; | ||
| 1226 | in_ptr = (in_ptr + 1) & QLOGICFC_REQ_QUEUE_LEN; | ||
| 1227 | } | ||
| 1228 | TRACE("queue command", in_ptr, Cmnd); | ||
| 1229 | |||
| 1230 | memset(cmd, 0, sizeof(struct Command_Entry)); | ||
| 1231 | |||
| 1232 | /* find a free handle mapping slot */ | ||
| 1233 | for (i = in_ptr; i != (in_ptr - 1) && hostdata->handle_ptrs[i]; i = ((i + 1) % (QLOGICFC_REQ_QUEUE_LEN + 1))); | ||
| 1234 | |||
| 1235 | if (!hostdata->handle_ptrs[i]) { | ||
| 1236 | cmd->handle = cpu_to_le32(i); | ||
| 1237 | hostdata->handle_ptrs[i] = Cmnd; | ||
| 1238 | hostdata->handle_serials[i] = Cmnd->serial_number; | ||
| 1239 | } else { | ||
| 1240 | printk("qlogicfc%d : no handle slots, this should not happen.\n", hostdata->host_id); | ||
| 1241 | printk("hostdata->queued is %x, in_ptr: %x\n", hostdata->queued, in_ptr); | ||
| 1242 | for (i = 0; i <= QLOGICFC_REQ_QUEUE_LEN; i++){ | ||
| 1243 | if (!hostdata->handle_ptrs[i]){ | ||
| 1244 | printk("slot %d has %p\n", i, hostdata->handle_ptrs[i]); | ||
| 1245 | } | ||
| 1246 | } | ||
| 1247 | return 1; | ||
| 1248 | } | ||
| 1249 | |||
| 1250 | cmd->hdr.entry_type = ENTRY_COMMAND; | ||
| 1251 | cmd->hdr.entry_cnt = 1; | ||
| 1252 | cmd->target_lun = Cmnd->device->lun; | ||
| 1253 | cmd->expanded_lun = cpu_to_le16(Cmnd->device->lun); | ||
| 1254 | #if ISP2x00_PORTDB | ||
| 1255 | cmd->target_id = hostdata->port_db[Cmnd->device->id].loop_id; | ||
| 1256 | #else | ||
| 1257 | cmd->target_id = Cmnd->target; | ||
| 1258 | #endif | ||
| 1259 | cmd->total_byte_cnt = cpu_to_le32(Cmnd->request_bufflen); | ||
| 1260 | cmd->time_out = 0; | ||
| 1261 | memcpy(cmd->cdb, Cmnd->cmnd, Cmnd->cmd_len); | ||
| 1262 | |||
| 1263 | if (Cmnd->use_sg) { | ||
| 1264 | sg = (struct scatterlist *) Cmnd->request_buffer; | ||
| 1265 | sg_count = pci_map_sg(hostdata->pci_dev, sg, Cmnd->use_sg, Cmnd->sc_data_direction); | ||
| 1266 | cmd->segment_cnt = cpu_to_le16(sg_count); | ||
| 1267 | ds = cmd->dataseg; | ||
| 1268 | /* fill in first two sg entries: */ | ||
| 1269 | n = sg_count; | ||
| 1270 | if (n > DATASEGS_PER_COMMAND) | ||
| 1271 | n = DATASEGS_PER_COMMAND; | ||
| 1272 | |||
| 1273 | for (i = 0; i < n; i++) { | ||
| 1274 | ds[i].d_base = cpu_to_le32(pci64_dma_lo32(sg_dma_address(sg))); | ||
| 1275 | ds[i].d_base_hi = cpu_to_le32(pci64_dma_hi32(sg_dma_address(sg))); | ||
| 1276 | ds[i].d_count = cpu_to_le32(sg_dma_len(sg)); | ||
| 1277 | ++sg; | ||
| 1278 | } | ||
| 1279 | sg_count -= DATASEGS_PER_COMMAND; | ||
| 1280 | |||
| 1281 | while (sg_count > 0) { | ||
| 1282 | ++cmd->hdr.entry_cnt; | ||
| 1283 | cont = (struct Continuation_Entry *) | ||
| 1284 | &hostdata->req[in_ptr*QUEUE_ENTRY_LEN]; | ||
| 1285 | memset(cont, 0, sizeof(struct Continuation_Entry)); | ||
| 1286 | in_ptr = (in_ptr + 1) & QLOGICFC_REQ_QUEUE_LEN; | ||
| 1287 | if (in_ptr == out_ptr) { | ||
| 1288 | DEBUG(printk("qlogicfc%d : unexpected request queue overflow\n", hostdata->host_id)); | ||
| 1289 | return 1; | ||
| 1290 | } | ||
| 1291 | TRACE("queue continuation", in_ptr, 0); | ||
| 1292 | cont->hdr.entry_type = ENTRY_CONTINUATION; | ||
| 1293 | ds = cont->dataseg; | ||
| 1294 | n = sg_count; | ||
| 1295 | if (n > DATASEGS_PER_CONT) | ||
| 1296 | n = DATASEGS_PER_CONT; | ||
| 1297 | for (i = 0; i < n; ++i) { | ||
| 1298 | ds[i].d_base = cpu_to_le32(pci64_dma_lo32(sg_dma_address(sg))); | ||
| 1299 | ds[i].d_base_hi = cpu_to_le32(pci64_dma_hi32(sg_dma_address(sg))); | ||
| 1300 | ds[i].d_count = cpu_to_le32(sg_dma_len(sg)); | ||
| 1301 | ++sg; | ||
| 1302 | } | ||
| 1303 | sg_count -= n; | ||
| 1304 | } | ||
| 1305 | } else if (Cmnd->request_bufflen && Cmnd->sc_data_direction != PCI_DMA_NONE) { | ||
| 1306 | struct page *page = virt_to_page(Cmnd->request_buffer); | ||
| 1307 | unsigned long offset = offset_in_page(Cmnd->request_buffer); | ||
| 1308 | dma_addr_t busaddr = pci_map_page(hostdata->pci_dev, | ||
| 1309 | page, offset, | ||
| 1310 | Cmnd->request_bufflen, | ||
| 1311 | Cmnd->sc_data_direction); | ||
| 1312 | Cmnd->SCp.dma_handle = busaddr; | ||
| 1313 | |||
| 1314 | cmd->dataseg[0].d_base = cpu_to_le32(pci64_dma_lo32(busaddr)); | ||
| 1315 | cmd->dataseg[0].d_base_hi = cpu_to_le32(pci64_dma_hi32(busaddr)); | ||
| 1316 | cmd->dataseg[0].d_count = cpu_to_le32(Cmnd->request_bufflen); | ||
| 1317 | cmd->segment_cnt = cpu_to_le16(1); | ||
| 1318 | } else { | ||
| 1319 | cmd->dataseg[0].d_base = 0; | ||
| 1320 | cmd->dataseg[0].d_base_hi = 0; | ||
| 1321 | cmd->segment_cnt = cpu_to_le16(1); /* Shouldn't this be 0? */ | ||
| 1322 | } | ||
| 1323 | |||
| 1324 | if (Cmnd->sc_data_direction == DMA_TO_DEVICE) | ||
| 1325 | cmd->control_flags = cpu_to_le16(CFLAG_WRITE); | ||
| 1326 | else | ||
| 1327 | cmd->control_flags = cpu_to_le16(CFLAG_READ); | ||
| 1328 | |||
| 1329 | if (Cmnd->device->tagged_supported) { | ||
| 1330 | if (time_after(jiffies, hostdata->tag_ages[Cmnd->device->id] + (2 * ISP_TIMEOUT))) { | ||
| 1331 | cmd->control_flags |= cpu_to_le16(CFLAG_ORDERED_TAG); | ||
| 1332 | hostdata->tag_ages[Cmnd->device->id] = jiffies; | ||
| 1333 | } else | ||
| 1334 | switch (Cmnd->tag) { | ||
| 1335 | case HEAD_OF_QUEUE_TAG: | ||
| 1336 | cmd->control_flags |= cpu_to_le16(CFLAG_HEAD_TAG); | ||
| 1337 | break; | ||
| 1338 | case ORDERED_QUEUE_TAG: | ||
| 1339 | cmd->control_flags |= cpu_to_le16(CFLAG_ORDERED_TAG); | ||
| 1340 | break; | ||
| 1341 | default: | ||
| 1342 | cmd->control_flags |= cpu_to_le16(CFLAG_SIMPLE_TAG); | ||
| 1343 | break; | ||
| 1344 | } | ||
| 1345 | } | ||
| 1346 | /* | ||
| 1347 | * TEST_UNIT_READY commands from scsi_scan will fail due to "overlapped | ||
| 1348 | * commands attempted" unless we setup at least a simple queue (midlayer | ||
| 1349 | * will embelish this once it can do an INQUIRY command to the device) | ||
| 1350 | */ | ||
| 1351 | else | ||
| 1352 | cmd->control_flags |= cpu_to_le16(CFLAG_SIMPLE_TAG); | ||
| 1353 | outw(in_ptr, host->io_port + MBOX4); | ||
| 1354 | hostdata->req_in_ptr = in_ptr; | ||
| 1355 | |||
| 1356 | hostdata->queued++; | ||
| 1357 | |||
| 1358 | num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr); | ||
| 1359 | num_free = (num_free > 2) ? num_free - 2 : 0; | ||
| 1360 | host->can_queue = host->host_busy + num_free; | ||
| 1361 | if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN) | ||
| 1362 | host->can_queue = QLOGICFC_REQ_QUEUE_LEN; | ||
| 1363 | host->sg_tablesize = QLOGICFC_MAX_SG(num_free); | ||
| 1364 | |||
| 1365 | LEAVE("isp2x00_queuecommand"); | ||
| 1366 | |||
| 1367 | return 0; | ||
| 1368 | } | ||
| 1369 | |||
| 1370 | |||
| 1371 | /* we have received an event, such as a lip or an RSCN, which may mean that | ||
| 1372 | * our port database is incorrect so the port database must be recreated. | ||
| 1373 | */ | ||
| 1374 | static void redo_port_db(unsigned long arg) | ||
| 1375 | { | ||
| 1376 | |||
| 1377 | struct Scsi_Host * host = (struct Scsi_Host *) arg; | ||
| 1378 | struct isp2x00_hostdata * hostdata; | ||
| 1379 | unsigned long flags; | ||
| 1380 | int i; | ||
| 1381 | |||
| 1382 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1383 | hostdata->explore_timer.data = 0; | ||
| 1384 | del_timer(&hostdata->explore_timer); | ||
| 1385 | |||
| 1386 | spin_lock_irqsave(host->host_lock, flags); | ||
| 1387 | |||
| 1388 | if (hostdata->adapter_state & AS_REDO_FABRIC_PORTDB || hostdata->adapter_state & AS_REDO_LOOP_PORTDB) { | ||
| 1389 | isp2x00_make_portdb(host); | ||
| 1390 | printk("qlogicfc%d : Port Database\n", hostdata->host_id); | ||
| 1391 | for (i = 0; hostdata->port_db[i].wwn != 0; i++) { | ||
| 1392 | printk("wwn: %08x%08x scsi_id: %x loop_id: ", (u_int) (hostdata->port_db[i].wwn >> 32), (u_int) hostdata->port_db[i].wwn, i); | ||
| 1393 | if (hostdata->port_db[i].loop_id != hostdata->port_db[0].loop_id || i == 0) | ||
| 1394 | printk("%x", hostdata->port_db[i].loop_id); | ||
| 1395 | else | ||
| 1396 | printk("Not Available"); | ||
| 1397 | printk("\n"); | ||
| 1398 | } | ||
| 1399 | |||
| 1400 | for (i = 0; i < QLOGICFC_REQ_QUEUE_LEN; i++){ | ||
| 1401 | if (hostdata->handle_ptrs[i] && (hostdata->port_db[hostdata->handle_ptrs[i]->device->id].loop_id > QLOGICFC_MAX_LOOP_ID || hostdata->adapter_state & AS_REDO_LOOP_PORTDB)){ | ||
| 1402 | if (hostdata->port_db[hostdata->handle_ptrs[i]->device->id].loop_id != hostdata->port_db[0].loop_id){ | ||
| 1403 | Scsi_Cmnd *Cmnd = hostdata->handle_ptrs[i]; | ||
| 1404 | |||
| 1405 | if (Cmnd->use_sg) | ||
| 1406 | pci_unmap_sg(hostdata->pci_dev, | ||
| 1407 | (struct scatterlist *)Cmnd->buffer, | ||
| 1408 | Cmnd->use_sg, | ||
| 1409 | Cmnd->sc_data_direction); | ||
| 1410 | else if (Cmnd->request_bufflen && | ||
| 1411 | Cmnd->sc_data_direction != PCI_DMA_NONE) { | ||
| 1412 | pci_unmap_page(hostdata->pci_dev, | ||
| 1413 | Cmnd->SCp.dma_handle, | ||
| 1414 | Cmnd->request_bufflen, | ||
| 1415 | Cmnd->sc_data_direction); | ||
| 1416 | } | ||
| 1417 | |||
| 1418 | hostdata->handle_ptrs[i]->result = DID_SOFT_ERROR << 16; | ||
| 1419 | |||
| 1420 | if (hostdata->handle_ptrs[i]->scsi_done){ | ||
| 1421 | (*hostdata->handle_ptrs[i]->scsi_done) (hostdata->handle_ptrs[i]); | ||
| 1422 | } | ||
| 1423 | else printk("qlogicfc%d : done is null?\n", hostdata->host_id); | ||
| 1424 | hostdata->handle_ptrs[i] = NULL; | ||
| 1425 | hostdata->handle_serials[i] = 0; | ||
| 1426 | } | ||
| 1427 | } | ||
| 1428 | } | ||
| 1429 | |||
| 1430 | hostdata->adapter_state = AS_LOOP_GOOD; | ||
| 1431 | } | ||
| 1432 | |||
| 1433 | spin_unlock_irqrestore(host->host_lock, flags); | ||
| 1434 | |||
| 1435 | } | ||
| 1436 | |||
| 1437 | #define ASYNC_EVENT_INTERRUPT 0x01 | ||
| 1438 | |||
| 1439 | irqreturn_t do_isp2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) | ||
| 1440 | { | ||
| 1441 | struct Scsi_Host *host = dev_id; | ||
| 1442 | unsigned long flags; | ||
| 1443 | |||
| 1444 | spin_lock_irqsave(host->host_lock, flags); | ||
| 1445 | isp2x00_intr_handler(irq, dev_id, regs); | ||
| 1446 | spin_unlock_irqrestore(host->host_lock, flags); | ||
| 1447 | |||
| 1448 | return IRQ_HANDLED; | ||
| 1449 | } | ||
| 1450 | |||
| 1451 | void isp2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) | ||
| 1452 | { | ||
| 1453 | Scsi_Cmnd *Cmnd; | ||
| 1454 | struct Status_Entry *sts; | ||
| 1455 | struct Scsi_Host *host = dev_id; | ||
| 1456 | struct isp2x00_hostdata *hostdata; | ||
| 1457 | u_int in_ptr, out_ptr, handle, num_free; | ||
| 1458 | u_short status; | ||
| 1459 | |||
| 1460 | ENTER_INTR("isp2x00_intr_handler"); | ||
| 1461 | |||
| 1462 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1463 | |||
| 1464 | DEBUG_INTR(printk("qlogicfc%d : interrupt on line %d\n", hostdata->host_id, irq)); | ||
| 1465 | |||
| 1466 | if (!(inw(host->io_port + PCI_INTER_STS) & 0x08)) { | ||
| 1467 | /* spurious interrupts can happen legally */ | ||
| 1468 | DEBUG_INTR(printk("qlogicfc%d : got spurious interrupt\n", hostdata->host_id)); | ||
| 1469 | return; | ||
| 1470 | } | ||
| 1471 | in_ptr = inw(host->io_port + MBOX5); | ||
| 1472 | out_ptr = hostdata->res_out_ptr; | ||
| 1473 | |||
| 1474 | if ((inw(host->io_port + PCI_SEMAPHORE) & ASYNC_EVENT_INTERRUPT)) { | ||
| 1475 | status = inw(host->io_port + MBOX0); | ||
| 1476 | |||
| 1477 | DEBUG_INTR(printk("qlogicfc%d : mbox completion status: %x\n", | ||
| 1478 | hostdata->host_id, status)); | ||
| 1479 | |||
| 1480 | switch (status) { | ||
| 1481 | case LOOP_UP: | ||
| 1482 | case POINT_TO_POINT_UP: | ||
| 1483 | printk("qlogicfc%d : Link is Up\n", hostdata->host_id); | ||
| 1484 | hostdata->adapter_state = AS_REDO_FABRIC_PORTDB | AS_REDO_LOOP_PORTDB; | ||
| 1485 | break; | ||
| 1486 | case LOOP_DOWN: | ||
| 1487 | printk("qlogicfc%d : Link is Down\n", hostdata->host_id); | ||
| 1488 | hostdata->adapter_state = AS_LOOP_DOWN; | ||
| 1489 | break; | ||
| 1490 | case CONNECTION_MODE: | ||
| 1491 | printk("received CONNECTION_MODE irq %x\n", inw(host->io_port + MBOX1)); | ||
| 1492 | break; | ||
| 1493 | case CHANGE_NOTIFICATION: | ||
| 1494 | printk("qlogicfc%d : RSCN Received\n", hostdata->host_id); | ||
| 1495 | if (hostdata->adapter_state == AS_LOOP_GOOD) | ||
| 1496 | hostdata->adapter_state = AS_REDO_FABRIC_PORTDB; | ||
| 1497 | break; | ||
| 1498 | case LIP_OCCURRED: | ||
| 1499 | case LIP_RECEIVED: | ||
| 1500 | printk("qlogicfc%d : Loop Reinitialized\n", hostdata->host_id); | ||
| 1501 | if (hostdata->adapter_state == AS_LOOP_GOOD) | ||
| 1502 | hostdata->adapter_state = AS_REDO_LOOP_PORTDB; | ||
| 1503 | break; | ||
| 1504 | case SYSTEM_ERROR: | ||
| 1505 | printk("qlogicfc%d : The firmware just choked.\n", hostdata->host_id); | ||
| 1506 | hostdata->adapter_state = AS_FIRMWARE_DEAD; | ||
| 1507 | break; | ||
| 1508 | case SCSI_COMMAND_COMPLETE: | ||
| 1509 | handle = inw(host->io_port + MBOX1) | (inw(host->io_port + MBOX2) << 16); | ||
| 1510 | Cmnd = hostdata->handle_ptrs[handle]; | ||
| 1511 | hostdata->handle_ptrs[handle] = NULL; | ||
| 1512 | hostdata->handle_serials[handle] = 0; | ||
| 1513 | hostdata->queued--; | ||
| 1514 | if (Cmnd != NULL) { | ||
| 1515 | if (Cmnd->use_sg) | ||
| 1516 | pci_unmap_sg(hostdata->pci_dev, | ||
| 1517 | (struct scatterlist *)Cmnd->buffer, | ||
| 1518 | Cmnd->use_sg, | ||
| 1519 | Cmnd->sc_data_direction); | ||
| 1520 | else if (Cmnd->request_bufflen && | ||
| 1521 | Cmnd->sc_data_direction != PCI_DMA_NONE) | ||
| 1522 | pci_unmap_page(hostdata->pci_dev, | ||
| 1523 | Cmnd->SCp.dma_handle, | ||
| 1524 | Cmnd->request_bufflen, | ||
| 1525 | Cmnd->sc_data_direction); | ||
| 1526 | Cmnd->result = 0x0; | ||
| 1527 | (*Cmnd->scsi_done) (Cmnd); | ||
| 1528 | } else | ||
| 1529 | printk("qlogicfc%d.c : got a null value out of handle_ptrs, this sucks\n", hostdata->host_id); | ||
| 1530 | break; | ||
| 1531 | case MBOX_COMMAND_COMPLETE: | ||
| 1532 | case INVALID_COMMAND: | ||
| 1533 | case HOST_INTERFACE_ERROR: | ||
| 1534 | case TEST_FAILED: | ||
| 1535 | case COMMAND_ERROR: | ||
| 1536 | case COMMAND_PARAM_ERROR: | ||
| 1537 | case PORT_ID_USED: | ||
| 1538 | case LOOP_ID_USED: | ||
| 1539 | case ALL_IDS_USED: | ||
| 1540 | hostdata->mbox_done = 1; | ||
| 1541 | outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR); | ||
| 1542 | return; | ||
| 1543 | default: | ||
| 1544 | printk("qlogicfc%d : got an unknown status? %x\n", hostdata->host_id, status); | ||
| 1545 | } | ||
| 1546 | if ((hostdata->adapter_state & AS_REDO_LOOP_PORTDB || hostdata->adapter_state & AS_REDO_FABRIC_PORTDB) && hostdata->explore_timer.data == 0){ | ||
| 1547 | hostdata->explore_timer.function = redo_port_db; | ||
| 1548 | hostdata->explore_timer.data = (unsigned long)host; | ||
| 1549 | hostdata->explore_timer.expires = jiffies + (HZ/4); | ||
| 1550 | init_timer(&hostdata->explore_timer); | ||
| 1551 | add_timer(&hostdata->explore_timer); | ||
| 1552 | } | ||
| 1553 | outw(0x0, host->io_port + PCI_SEMAPHORE); | ||
| 1554 | } else { | ||
| 1555 | DEBUG_INTR(printk("qlogicfc%d : response queue update\n", hostdata->host_id)); | ||
| 1556 | DEBUG_INTR(printk("qlogicfc%d : response queue depth %d\n", hostdata->host_id, RES_QUEUE_DEPTH(in_ptr, out_ptr))); | ||
| 1557 | |||
| 1558 | while (out_ptr != in_ptr) { | ||
| 1559 | unsigned le_hand; | ||
| 1560 | sts = (struct Status_Entry *) &hostdata->res[out_ptr*QUEUE_ENTRY_LEN]; | ||
| 1561 | out_ptr = (out_ptr + 1) & RES_QUEUE_LEN; | ||
| 1562 | |||
| 1563 | TRACE("done", out_ptr, Cmnd); | ||
| 1564 | DEBUG_INTR(isp2x00_print_status_entry(sts)); | ||
| 1565 | le_hand = le32_to_cpu(sts->handle); | ||
| 1566 | if (sts->hdr.entry_type == ENTRY_STATUS && (Cmnd = hostdata->handle_ptrs[le_hand])) { | ||
| 1567 | Cmnd->result = isp2x00_return_status(Cmnd, sts); | ||
| 1568 | hostdata->queued--; | ||
| 1569 | |||
| 1570 | if (Cmnd->use_sg) | ||
| 1571 | pci_unmap_sg(hostdata->pci_dev, | ||
| 1572 | (struct scatterlist *)Cmnd->buffer, Cmnd->use_sg, | ||
| 1573 | Cmnd->sc_data_direction); | ||
| 1574 | else if (Cmnd->request_bufflen && Cmnd->sc_data_direction != PCI_DMA_NONE) | ||
| 1575 | pci_unmap_page(hostdata->pci_dev, | ||
| 1576 | Cmnd->SCp.dma_handle, | ||
| 1577 | Cmnd->request_bufflen, | ||
| 1578 | Cmnd->sc_data_direction); | ||
| 1579 | |||
| 1580 | /* | ||
| 1581 | * if any of the following are true we do not | ||
| 1582 | * call scsi_done. if the status is CS_ABORTED | ||
| 1583 | * we don't have to call done because the upper | ||
| 1584 | * level should already know its aborted. | ||
| 1585 | */ | ||
| 1586 | if (hostdata->handle_serials[le_hand] != Cmnd->serial_number | ||
| 1587 | || le16_to_cpu(sts->completion_status) == CS_ABORTED){ | ||
| 1588 | hostdata->handle_serials[le_hand] = 0; | ||
| 1589 | hostdata->handle_ptrs[le_hand] = NULL; | ||
| 1590 | outw(out_ptr, host->io_port + MBOX5); | ||
| 1591 | continue; | ||
| 1592 | } | ||
| 1593 | /* | ||
| 1594 | * if we get back an error indicating the port | ||
| 1595 | * is not there or if the link is down and | ||
| 1596 | * this is a device that used to be there | ||
| 1597 | * allow the command to timeout. | ||
| 1598 | * the device may well be back in a couple of | ||
| 1599 | * seconds. | ||
| 1600 | */ | ||
| 1601 | if ((hostdata->adapter_state == AS_LOOP_DOWN || sts->completion_status == cpu_to_le16(CS_PORT_UNAVAILABLE) || sts->completion_status == cpu_to_le16(CS_PORT_LOGGED_OUT) || sts->completion_status == cpu_to_le16(CS_PORT_CONFIG_CHANGED)) && hostdata->port_db[Cmnd->device->id].wwn){ | ||
| 1602 | outw(out_ptr, host->io_port + MBOX5); | ||
| 1603 | continue; | ||
| 1604 | } | ||
| 1605 | } else { | ||
| 1606 | outw(out_ptr, host->io_port + MBOX5); | ||
| 1607 | continue; | ||
| 1608 | } | ||
| 1609 | |||
| 1610 | hostdata->handle_ptrs[le_hand] = NULL; | ||
| 1611 | |||
| 1612 | if (sts->completion_status == cpu_to_le16(CS_RESET_OCCURRED) | ||
| 1613 | || (sts->status_flags & cpu_to_le16(STF_BUS_RESET))) | ||
| 1614 | hostdata->send_marker = 1; | ||
| 1615 | |||
| 1616 | if (le16_to_cpu(sts->scsi_status) & 0x0200) | ||
| 1617 | memcpy(Cmnd->sense_buffer, sts->req_sense_data, | ||
| 1618 | sizeof(Cmnd->sense_buffer)); | ||
| 1619 | |||
| 1620 | outw(out_ptr, host->io_port + MBOX5); | ||
| 1621 | |||
| 1622 | if (Cmnd->scsi_done != NULL) { | ||
| 1623 | (*Cmnd->scsi_done) (Cmnd); | ||
| 1624 | } else | ||
| 1625 | printk("qlogicfc%d : Ouch, scsi done is NULL\n", hostdata->host_id); | ||
| 1626 | } | ||
| 1627 | hostdata->res_out_ptr = out_ptr; | ||
| 1628 | } | ||
| 1629 | |||
| 1630 | |||
| 1631 | out_ptr = inw(host->io_port + MBOX4); | ||
| 1632 | in_ptr = hostdata->req_in_ptr; | ||
| 1633 | |||
| 1634 | num_free = QLOGICFC_REQ_QUEUE_LEN - REQ_QUEUE_DEPTH(in_ptr, out_ptr); | ||
| 1635 | num_free = (num_free > 2) ? num_free - 2 : 0; | ||
| 1636 | host->can_queue = host->host_busy + num_free; | ||
| 1637 | if (host->can_queue > QLOGICFC_REQ_QUEUE_LEN) | ||
| 1638 | host->can_queue = QLOGICFC_REQ_QUEUE_LEN; | ||
| 1639 | host->sg_tablesize = QLOGICFC_MAX_SG(num_free); | ||
| 1640 | |||
| 1641 | outw(HCCR_CLEAR_RISC_INTR, host->io_port + HOST_HCCR); | ||
| 1642 | LEAVE_INTR("isp2x00_intr_handler"); | ||
| 1643 | } | ||
| 1644 | |||
| 1645 | |||
| 1646 | static int isp2x00_return_status(Scsi_Cmnd *Cmnd, struct Status_Entry *sts) | ||
| 1647 | { | ||
| 1648 | int host_status = DID_ERROR; | ||
| 1649 | #if DEBUG_ISP2x00_INTR | ||
| 1650 | static char *reason[] = | ||
| 1651 | { | ||
| 1652 | "DID_OK", | ||
| 1653 | "DID_NO_CONNECT", | ||
| 1654 | "DID_BUS_BUSY", | ||
| 1655 | "DID_TIME_OUT", | ||
| 1656 | "DID_BAD_TARGET", | ||
| 1657 | "DID_ABORT", | ||
| 1658 | "DID_PARITY", | ||
| 1659 | "DID_ERROR", | ||
| 1660 | "DID_RESET", | ||
| 1661 | "DID_BAD_INTR" | ||
| 1662 | }; | ||
| 1663 | #endif /* DEBUG_ISP2x00_INTR */ | ||
| 1664 | |||
| 1665 | ENTER("isp2x00_return_status"); | ||
| 1666 | |||
| 1667 | DEBUG(printk("qlogicfc : completion status = 0x%04x\n", | ||
| 1668 | le16_to_cpu(sts->completion_status))); | ||
| 1669 | |||
| 1670 | switch (le16_to_cpu(sts->completion_status)) { | ||
| 1671 | case CS_COMPLETE: | ||
| 1672 | host_status = DID_OK; | ||
| 1673 | break; | ||
| 1674 | case CS_DMA_ERROR: | ||
| 1675 | host_status = DID_ERROR; | ||
| 1676 | break; | ||
| 1677 | case CS_RESET_OCCURRED: | ||
| 1678 | host_status = DID_RESET; | ||
| 1679 | break; | ||
| 1680 | case CS_ABORTED: | ||
| 1681 | host_status = DID_ABORT; | ||
| 1682 | break; | ||
| 1683 | case CS_TIMEOUT: | ||
| 1684 | host_status = DID_TIME_OUT; | ||
| 1685 | break; | ||
| 1686 | case CS_DATA_OVERRUN: | ||
| 1687 | host_status = DID_ERROR; | ||
| 1688 | break; | ||
| 1689 | case CS_DATA_UNDERRUN: | ||
| 1690 | if (Cmnd->underflow <= (Cmnd->request_bufflen - le32_to_cpu(sts->residual))) | ||
| 1691 | host_status = DID_OK; | ||
| 1692 | else | ||
| 1693 | host_status = DID_ERROR; | ||
| 1694 | break; | ||
| 1695 | case CS_PORT_UNAVAILABLE: | ||
| 1696 | case CS_PORT_LOGGED_OUT: | ||
| 1697 | case CS_PORT_CONFIG_CHANGED: | ||
| 1698 | host_status = DID_BAD_TARGET; | ||
| 1699 | break; | ||
| 1700 | case CS_QUEUE_FULL: | ||
| 1701 | host_status = DID_ERROR; | ||
| 1702 | break; | ||
| 1703 | default: | ||
| 1704 | printk("qlogicfc : unknown completion status 0x%04x\n", | ||
| 1705 | le16_to_cpu(sts->completion_status)); | ||
| 1706 | host_status = DID_ERROR; | ||
| 1707 | break; | ||
| 1708 | } | ||
| 1709 | |||
| 1710 | DEBUG_INTR(printk("qlogicfc : host status (%s) scsi status %x\n", | ||
| 1711 | reason[host_status], le16_to_cpu(sts->scsi_status))); | ||
| 1712 | |||
| 1713 | LEAVE("isp2x00_return_status"); | ||
| 1714 | |||
| 1715 | return (le16_to_cpu(sts->scsi_status) & STATUS_MASK) | (host_status << 16); | ||
| 1716 | } | ||
| 1717 | |||
| 1718 | |||
| 1719 | static int isp2x00_abort(Scsi_Cmnd * Cmnd) | ||
| 1720 | { | ||
| 1721 | u_short param[8]; | ||
| 1722 | int i; | ||
| 1723 | struct Scsi_Host *host; | ||
| 1724 | struct isp2x00_hostdata *hostdata; | ||
| 1725 | int return_status = SUCCESS; | ||
| 1726 | |||
| 1727 | ENTER("isp2x00_abort"); | ||
| 1728 | |||
| 1729 | host = Cmnd->device->host; | ||
| 1730 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1731 | |||
| 1732 | for (i = 0; i < QLOGICFC_REQ_QUEUE_LEN; i++) | ||
| 1733 | if (hostdata->handle_ptrs[i] == Cmnd) | ||
| 1734 | break; | ||
| 1735 | |||
| 1736 | if (i == QLOGICFC_REQ_QUEUE_LEN){ | ||
| 1737 | return SUCCESS; | ||
| 1738 | } | ||
| 1739 | |||
| 1740 | isp2x00_disable_irqs(host); | ||
| 1741 | |||
| 1742 | param[0] = MBOX_ABORT_IOCB; | ||
| 1743 | #if ISP2x00_PORTDB | ||
| 1744 | param[1] = (((u_short) hostdata->port_db[Cmnd->device->id].loop_id) << 8) | Cmnd->device->lun; | ||
| 1745 | #else | ||
| 1746 | param[1] = (((u_short) Cmnd->target) << 8) | Cmnd->lun; | ||
| 1747 | #endif | ||
| 1748 | param[2] = i & 0xffff; | ||
| 1749 | param[3] = i >> 16; | ||
| 1750 | |||
| 1751 | isp2x00_mbox_command(host, param); | ||
| 1752 | |||
| 1753 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1754 | printk("qlogicfc%d : scsi abort failure: %x\n", hostdata->host_id, param[0]); | ||
| 1755 | if (param[0] == 0x4005) | ||
| 1756 | Cmnd->result = DID_ERROR << 16; | ||
| 1757 | if (param[0] == 0x4006) | ||
| 1758 | Cmnd->result = DID_BAD_TARGET << 16; | ||
| 1759 | return_status = FAILED; | ||
| 1760 | } | ||
| 1761 | |||
| 1762 | if (return_status != SUCCESS){ | ||
| 1763 | param[0] = MBOX_GET_FIRMWARE_STATE; | ||
| 1764 | isp2x00_mbox_command(host, param); | ||
| 1765 | printk("qlogicfc%d : abort failed\n", hostdata->host_id); | ||
| 1766 | printk("qlogicfc%d : firmware status is %x %x\n", hostdata->host_id, param[0], param[1]); | ||
| 1767 | } | ||
| 1768 | |||
| 1769 | isp2x00_enable_irqs(host); | ||
| 1770 | |||
| 1771 | LEAVE("isp2x00_abort"); | ||
| 1772 | |||
| 1773 | return return_status; | ||
| 1774 | } | ||
| 1775 | |||
| 1776 | |||
| 1777 | static int isp2x00_biosparam(struct scsi_device *sdev, struct block_device *n, | ||
| 1778 | sector_t capacity, int ip[]) | ||
| 1779 | { | ||
| 1780 | int size = capacity; | ||
| 1781 | |||
| 1782 | ENTER("isp2x00_biosparam"); | ||
| 1783 | |||
| 1784 | ip[0] = 64; | ||
| 1785 | ip[1] = 32; | ||
| 1786 | ip[2] = size >> 11; | ||
| 1787 | if (ip[2] > 1024) { | ||
| 1788 | ip[0] = 255; | ||
| 1789 | ip[1] = 63; | ||
| 1790 | ip[2] = size / (ip[0] * ip[1]); | ||
| 1791 | } | ||
| 1792 | LEAVE("isp2x00_biosparam"); | ||
| 1793 | |||
| 1794 | return 0; | ||
| 1795 | } | ||
| 1796 | |||
| 1797 | static int isp2x00_reset_hardware(struct Scsi_Host *host) | ||
| 1798 | { | ||
| 1799 | u_short param[8]; | ||
| 1800 | struct isp2x00_hostdata *hostdata; | ||
| 1801 | int loop_count; | ||
| 1802 | dma_addr_t busaddr; | ||
| 1803 | |||
| 1804 | ENTER("isp2x00_reset_hardware"); | ||
| 1805 | |||
| 1806 | hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 1807 | |||
| 1808 | /* | ||
| 1809 | * This cannot be right - PCI writes are posted | ||
| 1810 | * (apparently this is hardware design flaw not software ?) | ||
| 1811 | */ | ||
| 1812 | |||
| 1813 | outw(0x01, host->io_port + ISP_CTRL_STATUS); | ||
| 1814 | udelay(100); | ||
| 1815 | outw(HCCR_RESET, host->io_port + HOST_HCCR); | ||
| 1816 | udelay(100); | ||
| 1817 | outw(HCCR_RELEASE, host->io_port + HOST_HCCR); | ||
| 1818 | outw(HCCR_BIOS_DISABLE, host->io_port + HOST_HCCR); | ||
| 1819 | |||
| 1820 | loop_count = DEFAULT_LOOP_COUNT; | ||
| 1821 | while (--loop_count && inw(host->io_port + HOST_HCCR) == RISC_BUSY) { | ||
| 1822 | barrier(); | ||
| 1823 | cpu_relax(); | ||
| 1824 | } | ||
| 1825 | if (!loop_count) | ||
| 1826 | printk("qlogicfc%d : reset_hardware loop timeout\n", hostdata->host_id); | ||
| 1827 | |||
| 1828 | |||
| 1829 | |||
| 1830 | #if DEBUG_ISP2x00 | ||
| 1831 | printk("qlogicfc%d : mbox 0 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX0)); | ||
| 1832 | printk("qlogicfc%d : mbox 1 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX1)); | ||
| 1833 | printk("qlogicfc%d : mbox 2 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX2)); | ||
| 1834 | printk("qlogicfc%d : mbox 3 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX3)); | ||
| 1835 | printk("qlogicfc%d : mbox 4 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX4)); | ||
| 1836 | printk("qlogicfc%d : mbox 5 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX5)); | ||
| 1837 | printk("qlogicfc%d : mbox 6 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX6)); | ||
| 1838 | printk("qlogicfc%d : mbox 7 0x%04x \n", hostdata->host_id, inw(host->io_port + MBOX7)); | ||
| 1839 | #endif /* DEBUG_ISP2x00 */ | ||
| 1840 | |||
| 1841 | DEBUG(printk("qlogicfc%d : verifying checksum\n", hostdata->host_id)); | ||
| 1842 | |||
| 1843 | #if defined(CONFIG_SCSI_QLOGIC_FC_FIRMWARE) | ||
| 1844 | { | ||
| 1845 | int i; | ||
| 1846 | unsigned short * risc_code = NULL; | ||
| 1847 | unsigned short risc_code_len = 0; | ||
| 1848 | if (hostdata->pci_dev->device == PCI_DEVICE_ID_QLOGIC_ISP2100){ | ||
| 1849 | risc_code = risc_code2100; | ||
| 1850 | risc_code_len = risc_code_length2100; | ||
| 1851 | } | ||
| 1852 | else if (hostdata->pci_dev->device == PCI_DEVICE_ID_QLOGIC_ISP2200){ | ||
| 1853 | risc_code = risc_code2200; | ||
| 1854 | risc_code_len = risc_code_length2200; | ||
| 1855 | } | ||
| 1856 | |||
| 1857 | for (i = 0; i < risc_code_len; i++) { | ||
| 1858 | param[0] = MBOX_WRITE_RAM_WORD; | ||
| 1859 | param[1] = risc_code_addr01 + i; | ||
| 1860 | param[2] = risc_code[i]; | ||
| 1861 | |||
| 1862 | isp2x00_mbox_command(host, param); | ||
| 1863 | |||
| 1864 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1865 | printk("qlogicfc%d : firmware load failure\n", hostdata->host_id); | ||
| 1866 | return 1; | ||
| 1867 | } | ||
| 1868 | } | ||
| 1869 | } | ||
| 1870 | #endif /* RELOAD_FIRMWARE */ | ||
| 1871 | |||
| 1872 | param[0] = MBOX_VERIFY_CHECKSUM; | ||
| 1873 | param[1] = risc_code_addr01; | ||
| 1874 | |||
| 1875 | isp2x00_mbox_command(host, param); | ||
| 1876 | |||
| 1877 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1878 | printk("qlogicfc%d : ram checksum failure\n", hostdata->host_id); | ||
| 1879 | return 1; | ||
| 1880 | } | ||
| 1881 | DEBUG(printk("qlogicfc%d : executing firmware\n", hostdata->host_id)); | ||
| 1882 | |||
| 1883 | param[0] = MBOX_EXEC_FIRMWARE; | ||
| 1884 | param[1] = risc_code_addr01; | ||
| 1885 | |||
| 1886 | isp2x00_mbox_command(host, param); | ||
| 1887 | |||
| 1888 | param[0] = MBOX_ABOUT_FIRMWARE; | ||
| 1889 | |||
| 1890 | isp2x00_mbox_command(host, param); | ||
| 1891 | |||
| 1892 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1893 | printk("qlogicfc%d : about firmware failure\n", hostdata->host_id); | ||
| 1894 | return 1; | ||
| 1895 | } | ||
| 1896 | DEBUG(printk("qlogicfc%d : firmware major revision %d\n", hostdata->host_id, param[1])); | ||
| 1897 | DEBUG(printk("qlogicfc%d : firmware minor revision %d\n", hostdata->host_id, param[2])); | ||
| 1898 | |||
| 1899 | #ifdef USE_NVRAM_DEFAULTS | ||
| 1900 | |||
| 1901 | if (isp2x00_get_nvram_defaults(host, &hostdata->control_block) != 0) { | ||
| 1902 | printk("qlogicfc%d : Could not read from NVRAM\n", hostdata->host_id); | ||
| 1903 | } | ||
| 1904 | #endif | ||
| 1905 | |||
| 1906 | hostdata->wwn = (u64) (cpu_to_le16(hostdata->control_block.node_name[0])) << 56; | ||
| 1907 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[0]) & 0xff00) << 48; | ||
| 1908 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[1]) & 0xff00) << 24; | ||
| 1909 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[1]) & 0x00ff) << 48; | ||
| 1910 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[2]) & 0x00ff) << 24; | ||
| 1911 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[2]) & 0xff00) << 8; | ||
| 1912 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[3]) & 0x00ff) << 8; | ||
| 1913 | hostdata->wwn |= (u64) (cpu_to_le16(hostdata->control_block.node_name[3]) & 0xff00) >> 8; | ||
| 1914 | |||
| 1915 | /* FIXME: If the DMA transfer goes one way only, this should use | ||
| 1916 | * PCI_DMA_TODEVICE and below as well. | ||
| 1917 | */ | ||
| 1918 | busaddr = pci_map_page(hostdata->pci_dev, | ||
| 1919 | virt_to_page(&hostdata->control_block), | ||
| 1920 | offset_in_page(&hostdata->control_block), | ||
| 1921 | sizeof(hostdata->control_block), | ||
| 1922 | PCI_DMA_BIDIRECTIONAL); | ||
| 1923 | |||
| 1924 | param[0] = MBOX_INIT_FIRMWARE; | ||
| 1925 | param[2] = (u_short) (pci64_dma_lo32(busaddr) >> 16); | ||
| 1926 | param[3] = (u_short) (pci64_dma_lo32(busaddr) & 0xffff); | ||
| 1927 | param[4] = 0; | ||
| 1928 | param[5] = 0; | ||
| 1929 | param[6] = (u_short) (pci64_dma_hi32(busaddr) >> 16); | ||
| 1930 | param[7] = (u_short) (pci64_dma_hi32(busaddr) & 0xffff); | ||
| 1931 | isp2x00_mbox_command(host, param); | ||
| 1932 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1933 | printk("qlogicfc%d.c: Ouch 0x%04x\n", hostdata->host_id, param[0]); | ||
| 1934 | pci_unmap_page(hostdata->pci_dev, busaddr, | ||
| 1935 | sizeof(hostdata->control_block), | ||
| 1936 | PCI_DMA_BIDIRECTIONAL); | ||
| 1937 | return 1; | ||
| 1938 | } | ||
| 1939 | param[0] = MBOX_GET_FIRMWARE_STATE; | ||
| 1940 | isp2x00_mbox_command(host, param); | ||
| 1941 | if (param[0] != MBOX_COMMAND_COMPLETE) { | ||
| 1942 | printk("qlogicfc%d.c: 0x%04x\n", hostdata->host_id, param[0]); | ||
| 1943 | pci_unmap_page(hostdata->pci_dev, busaddr, | ||
| 1944 | sizeof(hostdata->control_block), | ||
| 1945 | PCI_DMA_BIDIRECTIONAL); | ||
| 1946 | return 1; | ||
| 1947 | } | ||
| 1948 | |||
| 1949 | pci_unmap_page(hostdata->pci_dev, busaddr, | ||
| 1950 | sizeof(hostdata->control_block), | ||
| 1951 | PCI_DMA_BIDIRECTIONAL); | ||
| 1952 | LEAVE("isp2x00_reset_hardware"); | ||
| 1953 | |||
| 1954 | return 0; | ||
| 1955 | } | ||
| 1956 | |||
| 1957 | #ifdef USE_NVRAM_DEFAULTS | ||
| 1958 | |||
| 1959 | static int isp2x00_get_nvram_defaults(struct Scsi_Host *host, struct init_cb *control_block) | ||
| 1960 | { | ||
| 1961 | |||
| 1962 | u_short value; | ||
| 1963 | if (isp2x00_read_nvram_word(host, 0) != 0x5349) | ||
| 1964 | return 1; | ||
| 1965 | |||
| 1966 | value = isp2x00_read_nvram_word(host, 8); | ||
| 1967 | control_block->node_name[0] = cpu_to_le16(isp2x00_read_nvram_word(host, 9)); | ||
| 1968 | control_block->node_name[1] = cpu_to_le16(isp2x00_read_nvram_word(host, 10)); | ||
| 1969 | control_block->node_name[2] = cpu_to_le16(isp2x00_read_nvram_word(host, 11)); | ||
| 1970 | control_block->node_name[3] = cpu_to_le16(isp2x00_read_nvram_word(host, 12)); | ||
| 1971 | control_block->hard_addr = cpu_to_le16(isp2x00_read_nvram_word(host, 13)); | ||
| 1972 | |||
| 1973 | return 0; | ||
| 1974 | |||
| 1975 | } | ||
| 1976 | |||
| 1977 | #endif | ||
| 1978 | |||
| 1979 | static int isp2x00_init(struct Scsi_Host *sh) | ||
| 1980 | { | ||
| 1981 | u_long io_base; | ||
| 1982 | struct isp2x00_hostdata *hostdata; | ||
| 1983 | u_char revision; | ||
| 1984 | u_int irq; | ||
| 1985 | u_short command; | ||
| 1986 | struct pci_dev *pdev; | ||
| 1987 | |||
| 1988 | |||
| 1989 | ENTER("isp2x00_init"); | ||
| 1990 | |||
| 1991 | hostdata = (struct isp2x00_hostdata *) sh->hostdata; | ||
| 1992 | pdev = hostdata->pci_dev; | ||
| 1993 | |||
| 1994 | if (pci_read_config_word(pdev, PCI_COMMAND, &command) | ||
| 1995 | || pci_read_config_byte(pdev, PCI_CLASS_REVISION, &revision)) { | ||
| 1996 | printk("qlogicfc%d : error reading PCI configuration\n", hostdata->host_id); | ||
| 1997 | return 1; | ||
| 1998 | } | ||
| 1999 | io_base = pci_resource_start(pdev, 0); | ||
| 2000 | irq = pdev->irq; | ||
| 2001 | |||
| 2002 | |||
| 2003 | if (pdev->vendor != PCI_VENDOR_ID_QLOGIC) { | ||
| 2004 | printk("qlogicfc%d : 0x%04x is not QLogic vendor ID\n", hostdata->host_id, | ||
| 2005 | pdev->vendor); | ||
| 2006 | return 1; | ||
| 2007 | } | ||
| 2008 | if (pdev->device != PCI_DEVICE_ID_QLOGIC_ISP2100 && pdev->device != PCI_DEVICE_ID_QLOGIC_ISP2200) { | ||
| 2009 | printk("qlogicfc%d : 0x%04x does not match ISP2100 or ISP2200 device id\n", hostdata->host_id, | ||
| 2010 | pdev->device); | ||
| 2011 | return 1; | ||
| 2012 | } | ||
| 2013 | if (!(command & PCI_COMMAND_IO) || | ||
| 2014 | !(pdev->resource[0].flags & IORESOURCE_IO)) { | ||
| 2015 | printk("qlogicfc%d : i/o mapping is disabled\n", hostdata->host_id); | ||
| 2016 | return 1; | ||
| 2017 | } | ||
| 2018 | |||
| 2019 | pci_set_master(pdev); | ||
| 2020 | if (revision != ISP2100_REV_ID1 && revision != ISP2100_REV_ID3 && revision != ISP2200_REV_ID5) | ||
| 2021 | printk("qlogicfc%d : new isp2x00 revision ID (%d)\n", hostdata->host_id, revision); | ||
| 2022 | |||
| 2023 | |||
| 2024 | hostdata->revision = revision; | ||
| 2025 | |||
| 2026 | sh->irq = irq; | ||
| 2027 | sh->io_port = io_base; | ||
| 2028 | |||
| 2029 | LEAVE("isp2x00_init"); | ||
| 2030 | |||
| 2031 | return 0; | ||
| 2032 | } | ||
| 2033 | |||
| 2034 | #if USE_NVRAM_DEFAULTS | ||
| 2035 | |||
| 2036 | #define NVRAM_DELAY() udelay(10) /* 10 microsecond delay */ | ||
| 2037 | |||
| 2038 | |||
| 2039 | u_short isp2x00_read_nvram_word(struct Scsi_Host * host, u_short byte) | ||
| 2040 | { | ||
| 2041 | int i; | ||
| 2042 | u_short value, output, input; | ||
| 2043 | |||
| 2044 | outw(0x2, host->io_port + PCI_NVRAM); | ||
| 2045 | NVRAM_DELAY(); | ||
| 2046 | outw(0x3, host->io_port + PCI_NVRAM); | ||
| 2047 | NVRAM_DELAY(); | ||
| 2048 | |||
| 2049 | byte &= 0xff; | ||
| 2050 | byte |= 0x0600; | ||
| 2051 | for (i = 10; i >= 0; i--) { | ||
| 2052 | output = ((byte >> i) & 0x1) ? 0x4 : 0x0; | ||
| 2053 | outw(output | 0x2, host->io_port + PCI_NVRAM); | ||
| 2054 | NVRAM_DELAY(); | ||
| 2055 | outw(output | 0x3, host->io_port + PCI_NVRAM); | ||
| 2056 | NVRAM_DELAY(); | ||
| 2057 | outw(output | 0x2, host->io_port + PCI_NVRAM); | ||
| 2058 | NVRAM_DELAY(); | ||
| 2059 | } | ||
| 2060 | |||
| 2061 | for (i = 0xf, value = 0; i >= 0; i--) { | ||
| 2062 | value <<= 1; | ||
| 2063 | outw(0x3, host->io_port + PCI_NVRAM); | ||
| 2064 | NVRAM_DELAY(); | ||
| 2065 | input = inw(host->io_port + PCI_NVRAM); | ||
| 2066 | NVRAM_DELAY(); | ||
| 2067 | outw(0x2, host->io_port + PCI_NVRAM); | ||
| 2068 | NVRAM_DELAY(); | ||
| 2069 | if (input & 0x8) | ||
| 2070 | value |= 1; | ||
| 2071 | } | ||
| 2072 | |||
| 2073 | outw(0x0, host->io_port + PCI_NVRAM); | ||
| 2074 | NVRAM_DELAY(); | ||
| 2075 | |||
| 2076 | return value; | ||
| 2077 | } | ||
| 2078 | |||
| 2079 | |||
| 2080 | #endif /* USE_NVRAM_DEFAULTS */ | ||
| 2081 | |||
| 2082 | |||
| 2083 | |||
| 2084 | /* | ||
| 2085 | * currently, this is only called during initialization or abort/reset, | ||
| 2086 | * at which times interrupts are disabled, so polling is OK, I guess... | ||
| 2087 | */ | ||
| 2088 | static int isp2x00_mbox_command(struct Scsi_Host *host, u_short param[]) | ||
| 2089 | { | ||
| 2090 | int loop_count; | ||
| 2091 | struct isp2x00_hostdata *hostdata = (struct isp2x00_hostdata *) host->hostdata; | ||
| 2092 | |||
| 2093 | if (mbox_param[param[0]] == 0 || hostdata->adapter_state == AS_FIRMWARE_DEAD) | ||
| 2094 | return 1; | ||
| 2095 | |||
| 2096 | loop_count = DEFAULT_LOOP_COUNT; | ||
| 2097 | while (--loop_count && inw(host->io_port + HOST_HCCR) & 0x0080) { | ||
| 2098 | barrier(); | ||
| 2099 | cpu_relax(); | ||
| 2100 | } | ||
| 2101 | if (!loop_count) { | ||
| 2102 | printk("qlogicfc%d : mbox_command loop timeout #1\n", hostdata->host_id); | ||
| 2103 | param[0] = 0x4006; | ||
| 2104 | hostdata->adapter_state = AS_FIRMWARE_DEAD; | ||
| 2105 | return 1; | ||
| 2106 | } | ||
| 2107 | hostdata->mbox_done = 0; | ||
| 2108 | |||
| 2109 | if (mbox_param[param[0]] == 0) | ||
| 2110 | printk("qlogicfc%d : invalid mbox command\n", hostdata->host_id); | ||
| 2111 | |||
| 2112 | if (mbox_param[param[0]] & 0x80) | ||
| 2113 | outw(param[7], host->io_port + MBOX7); | ||
| 2114 | if (mbox_param[param[0]] & 0x40) | ||
| 2115 | outw(param[6], host->io_port + MBOX6); | ||
| 2116 | if (mbox_param[param[0]] & 0x20) | ||
| 2117 | outw(param[5], host->io_port + MBOX5); | ||
| 2118 | if (mbox_param[param[0]] & 0x10) | ||
| 2119 | outw(param[4], host->io_port + MBOX4); | ||
| 2120 | if (mbox_param[param[0]] & 0x08) | ||
| 2121 | outw(param[3], host->io_port + MBOX3); | ||
| 2122 | if (mbox_param[param[0]] & 0x04) | ||
| 2123 | outw(param[2], host->io_port + MBOX2); | ||
| 2124 | if (mbox_param[param[0]] & 0x02) | ||
| 2125 | outw(param[1], host->io_port + MBOX1); | ||
| 2126 | if (mbox_param[param[0]] & 0x01) | ||
| 2127 | outw(param[0], host->io_port + MBOX0); | ||
| 2128 | |||
| 2129 | |||
| 2130 | outw(HCCR_SET_HOST_INTR, host->io_port + HOST_HCCR); | ||
| 2131 | |||
| 2132 | while (1) { | ||
| 2133 | loop_count = DEFAULT_LOOP_COUNT; | ||
| 2134 | while (--loop_count && !(inw(host->io_port + PCI_INTER_STS) & 0x08)) { | ||
| 2135 | barrier(); | ||
| 2136 | cpu_relax(); | ||
| 2137 | } | ||
| 2138 | |||
| 2139 | if (!loop_count) { | ||
| 2140 | hostdata->adapter_state = AS_FIRMWARE_DEAD; | ||
| 2141 | printk("qlogicfc%d : mbox_command loop timeout #2\n", hostdata->host_id); | ||
| 2142 | break; | ||
| 2143 | } | ||
| 2144 | isp2x00_intr_handler(host->irq, host, NULL); | ||
| 2145 | |||
| 2146 | if (hostdata->mbox_done == 1) | ||
| 2147 | break; | ||
| 2148 | |||
| 2149 | } | ||
| 2150 | |||
| 2151 | loop_count = DEFAULT_LOOP_COUNT; | ||
| 2152 | while (--loop_count && inw(host->io_port + MBOX0) == 0x04) { | ||
| 2153 | barrier(); | ||
| 2154 | cpu_relax(); | ||
| 2155 | } | ||
| 2156 | if (!loop_count) | ||
| 2157 | printk("qlogicfc%d : mbox_command loop timeout #3\n", hostdata->host_id); | ||
| 2158 | |||
| 2159 | param[7] = inw(host->io_port + MBOX7); | ||
| 2160 | param[6] = inw(host->io_port + MBOX6); | ||
| 2161 | param[5] = inw(host->io_port + MBOX5); | ||
| 2162 | param[4] = inw(host->io_port + MBOX4); | ||
| 2163 | param[3] = inw(host->io_port + MBOX3); | ||
| 2164 | param[2] = inw(host->io_port + MBOX2); | ||
| 2165 | param[1] = inw(host->io_port + MBOX1); | ||
| 2166 | param[0] = inw(host->io_port + MBOX0); | ||
| 2167 | |||
| 2168 | |||
| 2169 | outw(0x0, host->io_port + PCI_SEMAPHORE); | ||
| 2170 | |||
| 2171 | if (inw(host->io_port + HOST_HCCR) & 0x0080) { | ||
| 2172 | hostdata->adapter_state = AS_FIRMWARE_DEAD; | ||
| 2173 | printk("qlogicfc%d : mbox op is still pending\n", hostdata->host_id); | ||
| 2174 | } | ||
| 2175 | return 0; | ||
| 2176 | } | ||
| 2177 | |||
| 2178 | #if DEBUG_ISP2x00_INTR | ||
| 2179 | |||
| 2180 | void isp2x00_print_status_entry(struct Status_Entry *status) | ||
| 2181 | { | ||
| 2182 | printk("qlogicfc : entry count = 0x%02x, type = 0x%02x, flags = 0x%02x\n", | ||
| 2183 | status->hdr.entry_cnt, status->hdr.entry_type, status->hdr.flags); | ||
| 2184 | printk("qlogicfc : scsi status = 0x%04x, completion status = 0x%04x\n", | ||
| 2185 | le16_to_cpu(status->scsi_status), le16_to_cpu(status->completion_status)); | ||
| 2186 | printk("qlogicfc : state flags = 0x%04x, status flags = 0x%04x\n", | ||
| 2187 | le16_to_cpu(status->state_flags), le16_to_cpu(status->status_flags)); | ||
| 2188 | printk("qlogicfc : response info length = 0x%04x, request sense length = 0x%04x\n", | ||
| 2189 | le16_to_cpu(status->res_info_len), le16_to_cpu(status->req_sense_len)); | ||
| 2190 | printk("qlogicfc : residual transfer length = 0x%08x, response = 0x%02x\n", le32_to_cpu(status->residual), status->res_info[3]); | ||
| 2191 | |||
| 2192 | } | ||
| 2193 | |||
| 2194 | #endif /* DEBUG_ISP2x00_INTR */ | ||
| 2195 | |||
| 2196 | |||
| 2197 | #if DEBUG_ISP2x00 | ||
| 2198 | |||
| 2199 | void isp2x00_print_scsi_cmd(Scsi_Cmnd * cmd) | ||
| 2200 | { | ||
| 2201 | int i; | ||
| 2202 | |||
| 2203 | printk("qlogicfc : target = 0x%02x, lun = 0x%02x, cmd_len = 0x%02x\n", | ||
| 2204 | cmd->target, cmd->lun, cmd->cmd_len); | ||
| 2205 | printk("qlogicfc : command = "); | ||
| 2206 | for (i = 0; i < cmd->cmd_len; i++) | ||
| 2207 | printk("0x%02x ", cmd->cmnd[i]); | ||
| 2208 | printk("\n"); | ||
| 2209 | } | ||
| 2210 | |||
| 2211 | #endif /* DEBUG_ISP2x00 */ | ||
| 2212 | |||
| 2213 | MODULE_LICENSE("GPL"); | ||
| 2214 | |||
| 2215 | static struct scsi_host_template driver_template = { | ||
| 2216 | .detect = isp2x00_detect, | ||
| 2217 | .release = isp2x00_release, | ||
| 2218 | .info = isp2x00_info, | ||
| 2219 | .queuecommand = isp2x00_queuecommand, | ||
| 2220 | .eh_abort_handler = isp2x00_abort, | ||
| 2221 | .bios_param = isp2x00_biosparam, | ||
| 2222 | .can_queue = QLOGICFC_REQ_QUEUE_LEN, | ||
| 2223 | .this_id = -1, | ||
| 2224 | .sg_tablesize = QLOGICFC_MAX_SG(QLOGICFC_REQ_QUEUE_LEN), | ||
| 2225 | .cmd_per_lun = QLOGICFC_CMD_PER_LUN, | ||
| 2226 | .use_clustering = ENABLE_CLUSTERING, | ||
| 2227 | }; | ||
| 2228 | #include "scsi_module.c" | ||
diff --git a/drivers/scsi/qlogicfc_asm.c b/drivers/scsi/qlogicfc_asm.c deleted file mode 100644 index b1d45102d388..000000000000 --- a/drivers/scsi/qlogicfc_asm.c +++ /dev/null | |||
| @@ -1,9751 +0,0 @@ | |||
| 1 | /************************************************************************ | ||
| 2 | * * | ||
| 3 | * --- ISP2100 Fabric Initiator/Target Firmware --- * | ||
| 4 | * with expanded LUN addressing * | ||
| 5 | * and FcTape (FCP-2) support * | ||
| 6 | * * | ||
| 7 | * * | ||
| 8 | ************************************************************************ | ||
| 9 | Copyright (C) 2000 and 2001 Qlogic Corporation | ||
| 10 | (www.qlogic.com) | ||
| 11 | |||
| 12 | This program is distributed in the hope that it will be useful, but | ||
| 13 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 15 | General Public License for more details. | ||
| 16 | ************************************************************************/ | ||
| 17 | |||
| 18 | /* | ||
| 19 | * Firmware Version 1.19.16 (10:36 Nov 02, 2000) | ||
| 20 | */ | ||
| 21 | |||
| 22 | static unsigned short risc_code_addr01 = 0x1000 ; | ||
| 23 | |||
| 24 | static unsigned short risc_code_length2100 = 0x9260; | ||
| 25 | static unsigned short risc_code2100[] = { | ||
| 26 | 0x0078, 0x102d, 0x0000, 0x9260, 0x0000, 0x0001, 0x0013, 0x0010, | ||
| 27 | 0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, | ||
| 28 | 0x3920, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, | ||
| 29 | 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3231, 0x3030, 0x2046, 0x6972, | ||
| 30 | 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, | ||
| 31 | 0x312e, 0x3139, 0x2020, 0x2020, 0x2400, 0x2091, 0x2000, 0x20c1, | ||
| 32 | 0x0021, 0x2039, 0xffff, 0x2019, 0xaaaa, 0x2760, 0x2069, 0x7fff, | ||
| 33 | 0x20c1, 0x0020, 0x2c2c, 0x2d34, 0x2762, 0x236a, 0x2c24, 0x2d04, | ||
| 34 | 0x266a, 0x2562, 0xa406, 0x00c0, 0x1052, 0x20c1, 0x0021, 0x2c2c, | ||
| 35 | 0x2362, 0x2c04, 0x2562, 0xa306, 0x0040, 0x1052, 0x20c1, 0x0020, | ||
| 36 | 0x2039, 0x8fff, 0x20a1, 0xaa00, 0x2708, 0x810d, 0x810d, 0x810d, | ||
| 37 | 0x810d, 0xa18c, 0x000f, 0x2001, 0x000a, 0xa112, 0xa00e, 0x21a8, | ||
| 38 | 0x41a4, 0x3400, 0x8211, 0x00c0, 0x105f, 0x2708, 0x3400, 0xa102, | ||
| 39 | 0x0040, 0x106f, 0x0048, 0x106f, 0x20a8, 0xa00e, 0x41a4, 0x20a1, | ||
| 40 | 0xa260, 0x2009, 0x0000, 0x20a9, 0x07a0, 0x41a4, 0x3400, 0x20c9, | ||
| 41 | 0xa7ff, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x255d, | ||
| 42 | 0x2051, 0xa300, 0x2a70, 0x775e, 0xa786, 0x8fff, 0x0040, 0x1092, | ||
| 43 | 0x705b, 0xca00, 0x7057, 0xc9f1, 0x7063, 0x0200, 0x7067, 0x0200, | ||
| 44 | 0x0078, 0x109a, 0x7057, 0xba01, 0x7063, 0x0100, 0x7067, 0x0100, | ||
| 45 | 0x705b, 0xba00, 0x1078, 0x12df, 0x1078, 0x13c0, 0x1078, 0x1569, | ||
| 46 | 0x1078, 0x1ca4, 0x1078, 0x4229, 0x1078, 0x74cf, 0x1078, 0x134b, | ||
| 47 | 0x1078, 0x2a3f, 0x1078, 0x4da2, 0x1078, 0x48b2, 0x1078, 0x57df, | ||
| 48 | 0x1078, 0x21f7, 0x1078, 0x5abf, 0x1078, 0x5369, 0x1078, 0x210d, | ||
| 49 | 0x1078, 0x21d4, 0x2091, 0x3009, 0x7823, 0x0000, 0x0090, 0x10cf, | ||
| 50 | 0x7820, 0xa086, 0x0002, 0x00c0, 0x10cf, 0x7823, 0x4000, 0x0068, | ||
| 51 | 0x10c7, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, | ||
| 52 | 0x7003, 0x0000, 0x2001, 0x017f, 0x2003, 0x0000, 0x2a70, 0x7000, | ||
| 53 | 0xa08e, 0x0003, 0x00c0, 0x10ef, 0x1078, 0x35bc, 0x1078, 0x2a67, | ||
| 54 | 0x1078, 0x4df2, 0x1078, 0x4a75, 0x2009, 0x0100, 0x2104, 0xa082, | ||
| 55 | 0x0002, 0x0048, 0x10f3, 0x1078, 0x57fb, 0x0078, 0x10d6, 0x1079, | ||
| 56 | 0x10f7, 0x0078, 0x10dc, 0x1078, 0x6fa9, 0x0078, 0x10eb, 0x1101, | ||
| 57 | 0x1102, 0x11be, 0x10ff, 0x1246, 0x12dc, 0x12dd, 0x12de, 0x1078, | ||
| 58 | 0x1328, 0x007c, 0x127e, 0x0f7e, 0x2091, 0x8000, 0x7000, 0xa086, | ||
| 59 | 0x0001, 0x00c0, 0x1198, 0x1078, 0x3a43, 0x2079, 0x0100, 0x7844, | ||
| 60 | 0xa005, 0x00c0, 0x1198, 0x2011, 0x4129, 0x1078, 0x58d4, 0x1078, | ||
| 61 | 0x1ab1, 0x780f, 0x00ff, 0x7840, 0xa084, 0xfffb, 0x7842, 0x2011, | ||
| 62 | 0x8010, 0x73c0, 0x1078, 0x3579, 0x2001, 0xffff, 0x1078, 0x5975, | ||
| 63 | 0x7238, 0xc284, 0x723a, 0x2001, 0xa30c, 0x2014, 0xc2ac, 0x2202, | ||
| 64 | 0x1078, 0x6db5, 0x2011, 0x0004, 0x1078, 0x8a59, 0x1078, 0x47ce, | ||
| 65 | 0x1078, 0x4211, 0x0040, 0x1144, 0x7083, 0x0001, 0x70bb, 0x0000, | ||
| 66 | 0x1078, 0x3bf5, 0x0078, 0x1198, 0x1078, 0x4897, 0x0040, 0x114d, | ||
| 67 | 0x7a0c, 0xc2b4, 0x7a0e, 0x0078, 0x1159, 0x1078, 0x8ddf, 0x70c8, | ||
| 68 | 0xd09c, 0x00c0, 0x1159, 0x7094, 0xa005, 0x0040, 0x1159, 0x1078, | ||
| 69 | 0x41f5, 0x70d3, 0x0000, 0x70cf, 0x0000, 0x72c8, 0x2079, 0xa351, | ||
| 70 | 0x7804, 0xd0ac, 0x0040, 0x1165, 0xc295, 0x72ca, 0xa296, 0x0004, | ||
| 71 | 0x0040, 0x1186, 0x2011, 0x0001, 0x1078, 0x8a59, 0x708f, 0x0000, | ||
| 72 | 0x7093, 0xffff, 0x7003, 0x0002, 0x0f7f, 0x1078, 0x260d, 0x2011, | ||
| 73 | 0x0005, 0x1078, 0x6ef2, 0x1078, 0x6109, 0x0c7e, 0x2061, 0x0100, | ||
| 74 | 0x60e3, 0x0008, 0x0c7f, 0x127f, 0x0078, 0x119a, 0x708f, 0x0000, | ||
| 75 | 0x7093, 0xffff, 0x7003, 0x0002, 0x2011, 0x0005, 0x1078, 0x6ef2, | ||
| 76 | 0x1078, 0x6109, 0x0c7e, 0x2061, 0x0100, 0x60e3, 0x0008, 0x0c7f, | ||
| 77 | 0x0f7f, 0x127f, 0x007c, 0x0c7e, 0x20a9, 0x0082, 0x2009, 0x007e, | ||
| 78 | 0x017e, 0x027e, 0x037e, 0x2110, 0x027e, 0x2019, 0x0029, 0x1078, | ||
| 79 | 0x71e0, 0x027f, 0x1078, 0xa190, 0x037f, 0x027f, 0x017f, 0x1078, | ||
| 80 | 0x2921, 0x8108, 0x00f0, 0x11a0, 0x0c7f, 0x706b, 0x0000, 0x706c, | ||
| 81 | 0xa084, 0x00ff, 0x706e, 0x7097, 0x0000, 0x007c, 0x127e, 0x2091, | ||
| 82 | 0x8000, 0x7000, 0xa086, 0x0002, 0x00c0, 0x1244, 0x7090, 0xa086, | ||
| 83 | 0xffff, 0x0040, 0x11d1, 0x1078, 0x260d, 0x1078, 0x6109, 0x0078, | ||
| 84 | 0x1244, 0x70c8, 0xd09c, 0x0040, 0x11fd, 0xd084, 0x0040, 0x11fd, | ||
| 85 | 0x0f7e, 0x2079, 0x0100, 0x790c, 0xc1b5, 0x790e, 0x0f7f, 0xd08c, | ||
| 86 | 0x0040, 0x11fd, 0x70cc, 0xa086, 0xffff, 0x0040, 0x11f9, 0x1078, | ||
| 87 | 0x278a, 0x1078, 0x6109, 0x70c8, 0xd094, 0x00c0, 0x1244, 0x2011, | ||
| 88 | 0x0001, 0x2019, 0x0000, 0x1078, 0x27c2, 0x1078, 0x6109, 0x0078, | ||
| 89 | 0x1244, 0x70d0, 0xa005, 0x00c0, 0x1244, 0x708c, 0xa005, 0x00c0, | ||
| 90 | 0x1244, 0x1078, 0x4897, 0x00c0, 0x1244, 0x2001, 0xa352, 0x2004, | ||
| 91 | 0xd0ac, 0x0040, 0x1227, 0x157e, 0x0c7e, 0x20a9, 0x007f, 0x2009, | ||
| 92 | 0x0000, 0x017e, 0x1078, 0x4501, 0x00c0, 0x121a, 0x6000, 0xd0ec, | ||
| 93 | 0x00c0, 0x1222, 0x017f, 0x8108, 0x00f0, 0x1211, 0x0c7f, 0x157f, | ||
| 94 | 0x0078, 0x1227, 0x017f, 0x0c7f, 0x157f, 0x0078, 0x1244, 0x7003, | ||
| 95 | 0x0003, 0x7093, 0xffff, 0x2001, 0x0000, 0x1078, 0x2480, 0x1078, | ||
| 96 | 0x35f7, 0x2001, 0xa5ac, 0x2004, 0xa086, 0x0005, 0x00c0, 0x123c, | ||
| 97 | 0x2011, 0x0000, 0x1078, 0x6ef2, 0x2011, 0x0000, 0x1078, 0x6efc, | ||
| 98 | 0x1078, 0x6109, 0x1078, 0x61d3, 0x127f, 0x007c, 0x017e, 0x0f7e, | ||
| 99 | 0x127e, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0x00f7, 0x1078, | ||
| 100 | 0x41de, 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0040, | ||
| 101 | 0x125b, 0x7827, 0x0040, 0xd19c, 0x0040, 0x1260, 0x7827, 0x0008, | ||
| 102 | 0x007e, 0x037e, 0x157e, 0xa006, 0x1078, 0x5975, 0x7900, 0xa18a, | ||
| 103 | 0x0003, 0x0050, 0x1289, 0x7954, 0xd1ac, 0x00c0, 0x1289, 0x2009, | ||
| 104 | 0x00f8, 0x1078, 0x41de, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, | ||
| 105 | 0x09c4, 0x7820, 0xd09c, 0x00c0, 0x1281, 0x7824, 0xd0ac, 0x00c0, | ||
| 106 | 0x12ca, 0x00f0, 0x1279, 0x2001, 0x0001, 0x1078, 0x2480, 0x0078, | ||
| 107 | 0x12d5, 0x7853, 0x0000, 0x782f, 0x0020, 0x20a9, 0x0050, 0x00e0, | ||
| 108 | 0x128f, 0x2091, 0x6000, 0x00f0, 0x128f, 0x7853, 0x0400, 0x782f, | ||
| 109 | 0x0000, 0x2009, 0x00f8, 0x1078, 0x41de, 0x20a9, 0x000e, 0x0005, | ||
| 110 | 0x00f0, 0x129f, 0x7853, 0x1400, 0x7843, 0x0090, 0x7843, 0x0010, | ||
| 111 | 0x2019, 0x61a8, 0x7854, 0x0005, 0x0005, 0xd08c, 0x0040, 0x12b4, | ||
| 112 | 0x7824, 0xd0ac, 0x00c0, 0x12ca, 0x8319, 0x00c0, 0x12aa, 0x2009, | ||
| 113 | 0xa331, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0040, 0x12c4, | ||
| 114 | 0x200b, 0x0000, 0x1078, 0x251e, 0x2001, 0x0001, 0x1078, 0x2480, | ||
| 115 | 0x0078, 0x12d3, 0x2001, 0xa331, 0x2003, 0x0000, 0x7828, 0xc09d, | ||
| 116 | 0x782a, 0x7827, 0x0048, 0x7853, 0x0400, 0x157f, 0x037f, 0x007f, | ||
| 117 | 0x127f, 0x0f7f, 0x017f, 0x007c, 0x007c, 0x007c, 0x007c, 0x2a70, | ||
| 118 | 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0048, 0x12eb, 0x704f, | ||
| 119 | 0xffff, 0x0078, 0x12ed, 0x704f, 0x0000, 0x7053, 0xffff, 0x706b, | ||
| 120 | 0x0000, 0x706f, 0x0000, 0x1078, 0x8ddf, 0x2061, 0xa58c, 0x6003, | ||
| 121 | 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, | ||
| 122 | 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061, | ||
| 123 | 0xa594, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f, | ||
| 124 | 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, 0x601f, | ||
| 125 | 0x0000, 0x2061, 0xa5a3, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, | ||
| 126 | 0x4943, 0x600f, 0x2020, 0x2001, 0xa325, 0x2003, 0x0000, 0x007c, | ||
| 127 | 0x2091, 0x8000, 0x0068, 0x132a, 0x007e, 0x017e, 0x2079, 0x0000, | ||
| 128 | 0x7818, 0xd084, 0x00c0, 0x1330, 0x017f, 0x792e, 0x007f, 0x782a, | ||
| 129 | 0x007f, 0x7826, 0x3900, 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, | ||
| 130 | 0x2091, 0x5000, 0x2091, 0x4080, 0x2079, 0xa300, 0x7803, 0x0005, | ||
| 131 | 0x0078, 0x1348, 0x007c, 0x2071, 0xa300, 0x7158, 0x712e, 0x2021, | ||
| 132 | 0x0001, 0xa190, 0x002d, 0xa298, 0x002d, 0x0048, 0x1361, 0x705c, | ||
| 133 | 0xa302, 0x00c8, 0x1361, 0x220a, 0x2208, 0x2310, 0x8420, 0x0078, | ||
| 134 | 0x1353, 0x200b, 0x0000, 0x74a6, 0x74aa, 0x007c, 0x0e7e, 0x127e, | ||
| 135 | 0x2091, 0x8000, 0x2071, 0xa300, 0x70a8, 0xa0ea, 0x0010, 0x00c8, | ||
| 136 | 0x1374, 0xa06e, 0x0078, 0x137e, 0x8001, 0x70aa, 0x702c, 0x2068, | ||
| 137 | 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, 0x0e7f, | ||
| 138 | 0x007c, 0x0e7e, 0x2071, 0xa300, 0x127e, 0x2091, 0x8000, 0x70a8, | ||
| 139 | 0x8001, 0x00c8, 0x138e, 0xa06e, 0x0078, 0x1397, 0x70aa, 0x702c, | ||
| 140 | 0x2068, 0x2d04, 0x702e, 0x206b, 0x0000, 0x6807, 0x0000, 0x127f, | ||
| 141 | 0x0e7f, 0x007c, 0x0e7e, 0x127e, 0x2091, 0x8000, 0x2071, 0xa300, | ||
| 142 | 0x702c, 0x206a, 0x2d00, 0x702e, 0x70a8, 0x8000, 0x70aa, 0x127f, | ||
| 143 | 0x0e7f, 0x007c, 0x8dff, 0x0040, 0x13b6, 0x6804, 0x6807, 0x0000, | ||
| 144 | 0x007e, 0x1078, 0x139a, 0x0d7f, 0x0078, 0x13aa, 0x007c, 0x0e7e, | ||
| 145 | 0x2071, 0xa300, 0x70a8, 0xa08a, 0x0010, 0xa00d, 0x0e7f, 0x007c, | ||
| 146 | 0x0e7e, 0x2071, 0xa5d0, 0x7007, 0x0000, 0x701b, 0x0000, 0x701f, | ||
| 147 | 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, 0x8004, 0x7012, 0x0e7f, | ||
| 148 | 0x007c, 0x0e7e, 0x2270, 0x700b, 0x0000, 0x2071, 0xa5d0, 0x7018, | ||
| 149 | 0xa088, 0xa5d9, 0x220a, 0x8000, 0xa084, 0x0007, 0x701a, 0x7004, | ||
| 150 | 0xa005, 0x00c0, 0x13e9, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13fa, | ||
| 151 | 0x0f7f, 0x0e7f, 0x007c, 0x0e7e, 0x2071, 0xa5d0, 0x7004, 0xa005, | ||
| 152 | 0x00c0, 0x13f8, 0x0f7e, 0x2079, 0x0010, 0x1078, 0x13fa, 0x0f7f, | ||
| 153 | 0x0e7f, 0x007c, 0x7000, 0x0079, 0x13fd, 0x1401, 0x146b, 0x1488, | ||
| 154 | 0x1488, 0x7018, 0x711c, 0xa106, 0x00c0, 0x1409, 0x7007, 0x0000, | ||
| 155 | 0x007c, 0x0d7e, 0xa180, 0xa5d9, 0x2004, 0x700a, 0x2068, 0x8108, | ||
| 156 | 0xa18c, 0x0007, 0x711e, 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, | ||
| 157 | 0x7836, 0x682c, 0x783a, 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, | ||
| 158 | 0x7016, 0x6804, 0x0d7f, 0xd084, 0x0040, 0x142b, 0x7007, 0x0001, | ||
| 159 | 0x1078, 0x1430, 0x007c, 0x7007, 0x0002, 0x1078, 0x1446, 0x007c, | ||
| 160 | 0x017e, 0x027e, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, | ||
| 161 | 0x143b, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, 0x7803, | ||
| 162 | 0x0020, 0x7803, 0x0041, 0x027f, 0x017f, 0x007c, 0x017e, 0x027e, | ||
| 163 | 0x137e, 0x147e, 0x157e, 0x7014, 0x2098, 0x20a1, 0x0014, 0x7803, | ||
| 164 | 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x00c8, 0x145a, | ||
| 165 | 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, | ||
| 166 | 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x157f, 0x147f, 0x137f, | ||
| 167 | 0x027f, 0x017f, 0x007c, 0x137e, 0x147e, 0x157e, 0x2099, 0xa3f9, | ||
| 168 | 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, | ||
| 169 | 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, | ||
| 170 | 0x7002, 0x700b, 0xa3f4, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, | ||
| 171 | 0x137e, 0x147e, 0x157e, 0x2001, 0xa428, 0x209c, 0x20a1, 0x0014, | ||
| 172 | 0x7803, 0x0026, 0x2001, 0xa429, 0x20ac, 0x53a6, 0x2099, 0xa42a, | ||
| 173 | 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x127e, | ||
| 174 | 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, | ||
| 175 | 0x7002, 0x700b, 0xa425, 0x127f, 0x157f, 0x147f, 0x137f, 0x007c, | ||
| 176 | 0x017e, 0x0e7e, 0x2071, 0xa5d0, 0x0f7e, 0x2079, 0x0010, 0x7904, | ||
| 177 | 0x7803, 0x0002, 0xd1fc, 0x0040, 0x14c2, 0xa18c, 0x0700, 0x7004, | ||
| 178 | 0x1079, 0x14c6, 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x13fa, 0x14ce, | ||
| 179 | 0x14fb, 0x1523, 0x1556, 0x14cc, 0x0078, 0x14cc, 0xa18c, 0x0700, | ||
| 180 | 0x00c0, 0x14f4, 0x137e, 0x147e, 0x157e, 0x7014, 0x20a0, 0x2099, | ||
| 181 | 0x0014, 0x7803, 0x0040, 0x7010, 0x20a8, 0x53a5, 0x3400, 0x7016, | ||
| 182 | 0x157f, 0x147f, 0x137f, 0x700c, 0xa005, 0x0040, 0x1510, 0x1078, | ||
| 183 | 0x1430, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, | ||
| 184 | 0x0000, 0x1078, 0x13fa, 0x007c, 0x7008, 0xa080, 0x0002, 0x2003, | ||
| 185 | 0x0200, 0x0078, 0x14ef, 0xa18c, 0x0700, 0x00c0, 0x1506, 0x700c, | ||
| 186 | 0xa005, 0x0040, 0x1510, 0x1078, 0x1446, 0x007c, 0x7008, 0xa080, | ||
| 187 | 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x1078, 0x13fa, 0x007c, | ||
| 188 | 0x0d7e, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, | ||
| 189 | 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x0d7f, 0x7007, 0x0000, | ||
| 190 | 0x1078, 0x13fa, 0x007c, 0xa18c, 0x0700, 0x00c0, 0x1550, 0x137e, | ||
| 191 | 0x147e, 0x157e, 0x2001, 0xa3f7, 0x2004, 0xa080, 0x000d, 0x20a0, | ||
| 192 | 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, | ||
| 193 | 0xa3f9, 0x2004, 0xd0bc, 0x0040, 0x1546, 0x2001, 0xa402, 0x2004, | ||
| 194 | 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x157f, 0x147f, | ||
| 195 | 0x137f, 0x7007, 0x0000, 0x1078, 0x4e9b, 0x1078, 0x13fa, 0x007c, | ||
| 196 | 0x2011, 0x8003, 0x1078, 0x3579, 0x0078, 0x1554, 0xa18c, 0x0700, | ||
| 197 | 0x00c0, 0x1563, 0x2001, 0xa427, 0x2003, 0x0100, 0x7007, 0x0000, | ||
| 198 | 0x1078, 0x13fa, 0x007c, 0x2011, 0x8004, 0x1078, 0x3579, 0x0078, | ||
| 199 | 0x1567, 0x127e, 0x2091, 0x2100, 0x2079, 0x0030, 0x2071, 0xa5e1, | ||
| 200 | 0x7803, 0x0004, 0x7003, 0x0000, 0x700f, 0xa5e7, 0x7013, 0xa5e7, | ||
| 201 | 0x780f, 0x0076, 0x7803, 0x0004, 0x127f, 0x007c, 0x6934, 0xa184, | ||
| 202 | 0x0007, 0x0079, 0x1583, 0x158b, 0x15d1, 0x158b, 0x158b, 0x158b, | ||
| 203 | 0x15b6, 0x159a, 0x158f, 0xa085, 0x0001, 0x0078, 0x15eb, 0x684c, | ||
| 204 | 0xd0bc, 0x0040, 0x158b, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, | ||
| 205 | 0x0078, 0x15d9, 0xa18c, 0x00ff, 0xa186, 0x001e, 0x00c0, 0x158b, | ||
| 206 | 0x684c, 0xd0bc, 0x0040, 0x158b, 0x6860, 0x682e, 0x685c, 0x682a, | ||
| 207 | 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, | ||
| 208 | 0x2015, 0x2004, 0x6832, 0x6858, 0x0078, 0x15e1, 0xa18c, 0x00ff, | ||
| 209 | 0xa186, 0x0015, 0x00c0, 0x158b, 0x684c, 0xd0ac, 0x0040, 0x158b, | ||
| 210 | 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, | ||
| 211 | 0x2015, 0x2004, 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, 0x0078, | ||
| 212 | 0x15e1, 0x684c, 0xd0ac, 0x0040, 0x158b, 0xa006, 0x682e, 0x682a, | ||
| 213 | 0x6858, 0xa18c, 0x000f, 0xa188, 0x2015, 0x210c, 0x6932, 0x2d08, | ||
| 214 | 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, | ||
| 215 | 0x6912, 0x6980, 0x6916, 0x007c, 0x20e1, 0x0007, 0x20e1, 0x2000, | ||
| 216 | 0x2001, 0x020a, 0x2004, 0x82ff, 0x0040, 0x160e, 0xa280, 0x0004, | ||
| 217 | 0x0d7e, 0x206c, 0x684c, 0xd0dc, 0x00c0, 0x160a, 0x1078, 0x157e, | ||
| 218 | 0x0040, 0x160a, 0x0d7f, 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, | ||
| 219 | 0x0078, 0x160e, 0x6808, 0x8000, 0x680a, 0x0d7f, 0x127e, 0x047e, | ||
| 220 | 0x037e, 0x027e, 0x2091, 0x2100, 0x027f, 0x037f, 0x047f, 0x7000, | ||
| 221 | 0xa005, 0x00c0, 0x1622, 0x7206, 0x2001, 0x1643, 0x007e, 0x2260, | ||
| 222 | 0x0078, 0x17be, 0x710c, 0x220a, 0x8108, 0x230a, 0x8108, 0x240a, | ||
| 223 | 0x8108, 0xa182, 0xa602, 0x0048, 0x162f, 0x2009, 0xa5e7, 0x710e, | ||
| 224 | 0x7010, 0xa102, 0xa082, 0x0009, 0x0040, 0x163a, 0xa080, 0x001b, | ||
| 225 | 0x00c0, 0x163d, 0x2009, 0x0138, 0x200a, 0x7000, 0xa005, 0x00c0, | ||
| 226 | 0x1643, 0x1078, 0x179f, 0x127f, 0x007c, 0x127e, 0x027e, 0x037e, | ||
| 227 | 0x0c7e, 0x007e, 0x2091, 0x2100, 0x007f, 0x047f, 0x037f, 0x027f, | ||
| 228 | 0x0d7e, 0x0c7e, 0x2460, 0x6110, 0x2168, 0x6a62, 0x6b5e, 0xa005, | ||
| 229 | 0x0040, 0x16cf, 0x6808, 0xa005, 0x0040, 0x173c, 0x7000, 0xa005, | ||
| 230 | 0x00c0, 0x1664, 0x0078, 0x16c4, 0x700c, 0x7110, 0xa106, 0x00c0, | ||
| 231 | 0x1745, 0x7004, 0xa406, 0x00c0, 0x16c4, 0x2001, 0x0005, 0x2004, | ||
| 232 | 0xd08c, 0x0040, 0x1681, 0x047e, 0x1078, 0x18e2, 0x047f, 0x2460, | ||
| 233 | 0x6010, 0xa080, 0x0002, 0x2004, 0xa005, 0x0040, 0x173c, 0x0078, | ||
| 234 | 0x165e, 0x2001, 0x0207, 0x2004, 0xd09c, 0x00c0, 0x166d, 0x7804, | ||
| 235 | 0xa084, 0x6000, 0x0040, 0x1692, 0xa086, 0x6000, 0x0040, 0x1692, | ||
| 236 | 0x0078, 0x166d, 0x7100, 0xa186, 0x0002, 0x00c0, 0x16b2, 0x0e7e, | ||
| 237 | 0x2b68, 0x6818, 0x2060, 0x1078, 0x1fea, 0x2804, 0xac70, 0x6034, | ||
| 238 | 0xd09c, 0x00c0, 0x16a7, 0x7108, 0x720c, 0x0078, 0x16a9, 0x7110, | ||
| 239 | 0x7214, 0x6810, 0xa100, 0x6812, 0x6814, 0xa201, 0x6816, 0x0e7f, | ||
| 240 | 0x0078, 0x16b6, 0xa186, 0x0001, 0x00c0, 0x16be, 0x7820, 0x6910, | ||
| 241 | 0xa100, 0x6812, 0x7824, 0x6914, 0xa101, 0x6816, 0x7803, 0x0004, | ||
| 242 | 0x7003, 0x0000, 0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, 0x00c0, | ||
| 243 | 0x1745, 0x2009, 0x0048, 0x1078, 0x756c, 0x0078, 0x1745, 0x6808, | ||
| 244 | 0xa005, 0x0040, 0x173c, 0x7000, 0xa005, 0x00c0, 0x16d9, 0x0078, | ||
| 245 | 0x173c, 0x700c, 0x7110, 0xa106, 0x00c0, 0x16e2, 0x7004, 0xa406, | ||
| 246 | 0x00c0, 0x173c, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0040, 0x16f6, | ||
| 247 | 0x047e, 0x1078, 0x18e2, 0x047f, 0x2460, 0x6010, 0xa080, 0x0002, | ||
| 248 | 0x2004, 0xa005, 0x0040, 0x173c, 0x0078, 0x16d3, 0x2001, 0x0207, | ||
| 249 | 0x2004, 0xd09c, 0x00c0, 0x16e2, 0x2001, 0x0005, 0x2004, 0xd08c, | ||
| 250 | 0x00c0, 0x16e8, 0x7804, 0xa084, 0x6000, 0x0040, 0x170d, 0xa086, | ||
| 251 | 0x6000, 0x0040, 0x170d, 0x0078, 0x16e2, 0x7007, 0x0000, 0xa016, | ||
| 252 | 0x2218, 0x7000, 0xa08e, 0x0001, 0x0040, 0x172e, 0xa08e, 0x0002, | ||
| 253 | 0x00c0, 0x173c, 0x0c7e, 0x0e7e, 0x6818, 0x2060, 0x1078, 0x1fea, | ||
| 254 | 0x2804, 0xac70, 0x6034, 0xd09c, 0x00c0, 0x172a, 0x7308, 0x720c, | ||
| 255 | 0x0078, 0x172c, 0x7310, 0x7214, 0x0e7f, 0x0c7f, 0x7820, 0xa318, | ||
| 256 | 0x7824, 0xa211, 0x6810, 0xa300, 0x6812, 0x6814, 0xa201, 0x6816, | ||
| 257 | 0x7803, 0x0004, 0x7003, 0x0000, 0x6100, 0xa18e, 0x0004, 0x00c0, | ||
| 258 | 0x1745, 0x2009, 0x0048, 0x1078, 0x756c, 0x0c7f, 0x0d7f, 0x127f, | ||
| 259 | 0x007c, 0x0f7e, 0x0e7e, 0x027e, 0x037e, 0x047e, 0x1078, 0x1af7, | ||
| 260 | 0x027e, 0x2071, 0xa5e1, 0x7000, 0xa086, 0x0000, 0x0040, 0x1790, | ||
| 261 | 0x7004, 0xac06, 0x00c0, 0x1781, 0x2079, 0x0030, 0x7000, 0xa086, | ||
| 262 | 0x0003, 0x0040, 0x1781, 0x7804, 0xd0fc, 0x00c0, 0x177d, 0x2001, | ||
| 263 | 0x0207, 0x2004, 0xd09c, 0x00c0, 0x1763, 0x7803, 0x0004, 0x7804, | ||
| 264 | 0xd0ac, 0x00c0, 0x176f, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, | ||
| 265 | 0x0003, 0x7007, 0x0000, 0x0078, 0x1781, 0x1078, 0x18e2, 0x0078, | ||
| 266 | 0x1753, 0x157e, 0x20a9, 0x0009, 0x2009, 0xa5e7, 0x2104, 0xac06, | ||
| 267 | 0x00c0, 0x178b, 0x200a, 0xa188, 0x0003, 0x00f0, 0x1786, 0x157f, | ||
| 268 | 0x027f, 0x2001, 0x015d, 0x201c, 0x831a, 0x2302, 0x2001, 0x0138, | ||
| 269 | 0x2202, 0x047f, 0x037f, 0x027f, 0x0e7f, 0x0f7f, 0x007c, 0x700c, | ||
| 270 | 0x7110, 0xa106, 0x00c0, 0x17a7, 0x7003, 0x0000, 0x007c, 0x2104, | ||
| 271 | 0x7006, 0x2060, 0x8108, 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, | ||
| 272 | 0xa602, 0x0048, 0x17b5, 0x2009, 0xa5e7, 0x7112, 0x700c, 0xa106, | ||
| 273 | 0x00c0, 0x17be, 0x2001, 0x0138, 0x2003, 0x0008, 0x8cff, 0x00c0, | ||
| 274 | 0x17c5, 0x1078, 0x1b22, 0x0078, 0x1823, 0x6010, 0x2068, 0x2d58, | ||
| 275 | 0x6828, 0xa406, 0x00c0, 0x17d0, 0x682c, 0xa306, 0x0040, 0x17fe, | ||
| 276 | 0x601c, 0xa086, 0x0008, 0x0040, 0x17fe, 0x6024, 0xd0f4, 0x00c0, | ||
| 277 | 0x17fa, 0xd0d4, 0x0040, 0x17f6, 0x6038, 0xa402, 0x6034, 0xa303, | ||
| 278 | 0x0040, 0x17e4, 0x00c8, 0x17f6, 0x643a, 0x6336, 0x6c2a, 0x6b2e, | ||
| 279 | 0x047e, 0x037e, 0x2400, 0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80, | ||
| 280 | 0xa303, 0x6816, 0x037f, 0x047f, 0x0078, 0x17fa, 0x1078, 0x8d8e, | ||
| 281 | 0x0040, 0x17c1, 0x1078, 0x2035, 0x00c0, 0x17c1, 0x0c7e, 0x7004, | ||
| 282 | 0x2060, 0x6024, 0xc0d4, 0x6026, 0x0c7f, 0x684c, 0xd0f4, 0x0040, | ||
| 283 | 0x180f, 0x6817, 0xffff, 0x6813, 0xffff, 0x0078, 0x17c1, 0x6824, | ||
| 284 | 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, 0xa0cc, 0x000f, | ||
| 285 | 0x2009, 0x0011, 0x1078, 0x1824, 0x0040, 0x1822, 0x2009, 0x0001, | ||
| 286 | 0x1078, 0x1824, 0x2d58, 0x007c, 0x8aff, 0x0040, 0x18bb, 0xa03e, | ||
| 287 | 0x2730, 0x6850, 0xd0fc, 0x00c0, 0x1846, 0xd0f4, 0x00c0, 0x1856, | ||
| 288 | 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1836, 0x189d, 0x185d, | ||
| 289 | 0x185d, 0x189d, 0x189d, 0x1895, 0x189d, 0x185d, 0x189d, 0x1863, | ||
| 290 | 0x1863, 0x189d, 0x189d, 0x189d, 0x188c, 0x1863, 0xc0fc, 0x6852, | ||
| 291 | 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x0d7e, 0xd99c, 0x0040, 0x18a0, | ||
| 292 | 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x18a0, 0xc0f4, 0x6852, | ||
| 293 | 0x6b6c, 0x6a70, 0x0d7e, 0x0078, 0x18a7, 0x6b08, 0x6a0c, 0x6d00, | ||
| 294 | 0x6c04, 0x0078, 0x18a0, 0x7b0c, 0xd3bc, 0x0040, 0x1884, 0x7004, | ||
| 295 | 0x0e7e, 0x2070, 0x701c, 0x0e7f, 0xa086, 0x0008, 0x00c0, 0x1884, | ||
| 296 | 0x7b08, 0xa39c, 0x0fff, 0x2d20, 0x0d7f, 0x0d7e, 0x6a14, 0x82ff, | ||
| 297 | 0x00c0, 0x187f, 0x6810, 0xa302, 0x0048, 0x187f, 0x6b10, 0x2011, | ||
| 298 | 0x0000, 0x2468, 0x0078, 0x1886, 0x6b10, 0x6a14, 0x6d00, 0x6c04, | ||
| 299 | 0x6f08, 0x6e0c, 0x0078, 0x18a0, 0x0d7f, 0x0d7e, 0x6834, 0xa084, | ||
| 300 | 0x00ff, 0xa086, 0x001e, 0x00c0, 0x189d, 0x0d7f, 0x1078, 0x1fd1, | ||
| 301 | 0x00c0, 0x1824, 0xa00e, 0x0078, 0x18bb, 0x0d7f, 0x1078, 0x1328, | ||
| 302 | 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, 0x7902, 0x7000, | ||
| 303 | 0x8000, 0x7002, 0x0d7f, 0x6828, 0xa300, 0x682a, 0x682c, 0xa201, | ||
| 304 | 0x682e, 0x2300, 0x6b10, 0xa302, 0x6812, 0x2200, 0x6a14, 0xa203, | ||
| 305 | 0x6816, 0x1078, 0x1fd1, 0x007c, 0x1078, 0x1328, 0x1078, 0x1c52, | ||
| 306 | 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x7003, 0x0000, 0x1078, | ||
| 307 | 0x1ac6, 0x1078, 0x8a44, 0x0040, 0x18db, 0x6808, 0x8001, 0x680a, | ||
| 308 | 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, 0xffff, | ||
| 309 | 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8758, 0x0078, 0x1aad, | ||
| 310 | 0x1078, 0x1328, 0x127e, 0x2091, 0x2100, 0x007e, 0x017e, 0x2b68, | ||
| 311 | 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x00c0, | ||
| 312 | 0x18be, 0xa184, 0x0003, 0xa086, 0x0003, 0x0040, 0x18e0, 0x7000, | ||
| 313 | 0x0079, 0x18fa, 0x1902, 0x1904, 0x1a06, 0x1a84, 0x1a9b, 0x1902, | ||
| 314 | 0x1902, 0x1902, 0x1078, 0x1328, 0x8001, 0x7002, 0xa184, 0x0880, | ||
| 315 | 0x00c0, 0x1919, 0x8aff, 0x0040, 0x199b, 0x2009, 0x0001, 0x1078, | ||
| 316 | 0x1824, 0x0040, 0x1aad, 0x2009, 0x0001, 0x1078, 0x1824, 0x0078, | ||
| 317 | 0x1aad, 0x7803, 0x0004, 0x7003, 0x0000, 0xd1bc, 0x00c0, 0x1979, | ||
| 318 | 0x027e, 0x037e, 0x7808, 0xd0ec, 0x00c0, 0x1930, 0x7c20, 0x7d24, | ||
| 319 | 0x7e30, 0x7f34, 0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1932, | ||
| 320 | 0x1078, 0x1b9f, 0x6b28, 0x6a2c, 0x2400, 0x686e, 0xa31a, 0x2500, | ||
| 321 | 0x6872, 0xa213, 0x6b2a, 0x6a2e, 0x0c7e, 0x7004, 0x2060, 0x6024, | ||
| 322 | 0xd0f4, 0x00c0, 0x1945, 0x633a, 0x6236, 0x0c7f, 0x2400, 0x6910, | ||
| 323 | 0xa100, 0x6812, 0x2500, 0x6914, 0xa101, 0x6816, 0x037f, 0x027f, | ||
| 324 | 0x2600, 0x681e, 0x2700, 0x6822, 0x1078, 0x1fea, 0x2a00, 0x6826, | ||
| 325 | 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, 0x6808, | ||
| 326 | 0x8001, 0x680a, 0x00c0, 0x196e, 0x684c, 0xd0e4, 0x0040, 0x196e, | ||
| 327 | 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x756c, 0x7000, 0xa086, | ||
| 328 | 0x0004, 0x0040, 0x1aad, 0x7003, 0x0000, 0x1078, 0x179f, 0x0078, | ||
| 329 | 0x1aad, 0x057e, 0x7d0c, 0xd5bc, 0x00c0, 0x1980, 0x1078, 0xa20c, | ||
| 330 | 0x057f, 0x1078, 0x1ac6, 0x0f7e, 0x7004, 0x2078, 0x1078, 0x4893, | ||
| 331 | 0x0040, 0x198d, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, 0xffff, | ||
| 332 | 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, | ||
| 333 | 0x6916, 0x0078, 0x1aad, 0x7004, 0x0c7e, 0x2060, 0x6024, 0x0c7f, | ||
| 334 | 0xd0f4, 0x0040, 0x19a8, 0x6808, 0x8001, 0x680a, 0x0078, 0x1aad, | ||
| 335 | 0x684c, 0xc0f5, 0x684e, 0x7814, 0xa005, 0x00c0, 0x19c0, 0x7003, | ||
| 336 | 0x0000, 0x6808, 0x8001, 0x680a, 0x00c0, 0x19bc, 0x7004, 0x2060, | ||
| 337 | 0x2009, 0x0048, 0x1078, 0x756c, 0x1078, 0x179f, 0x0078, 0x1aad, | ||
| 338 | 0x7814, 0x6910, 0xa102, 0x6812, 0x6914, 0xa183, 0x0000, 0x6816, | ||
| 339 | 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, | ||
| 340 | 0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, | ||
| 341 | 0x810b, 0x1078, 0x1b4d, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, | ||
| 342 | 0x0001, 0x7804, 0xd0fc, 0x0040, 0x19e1, 0x7803, 0x0002, 0x7803, | ||
| 343 | 0x0004, 0x780f, 0x0076, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, | ||
| 344 | 0x0048, 0x1078, 0x756c, 0x1078, 0x1b81, 0x0040, 0x19bc, 0x7908, | ||
| 345 | 0xd1ec, 0x00c0, 0x19ff, 0x2009, 0x0009, 0x0078, 0x1a01, 0x2009, | ||
| 346 | 0x0019, 0x7902, 0x7003, 0x0003, 0x0078, 0x1aad, 0x8001, 0x7002, | ||
| 347 | 0xd194, 0x0040, 0x1a18, 0x7804, 0xd0fc, 0x00c0, 0x18ea, 0x8aff, | ||
| 348 | 0x0040, 0x1aad, 0x2009, 0x0001, 0x1078, 0x1824, 0x0078, 0x1aad, | ||
| 349 | 0xa184, 0x0880, 0x00c0, 0x1a25, 0x8aff, 0x0040, 0x1aad, 0x2009, | ||
| 350 | 0x0001, 0x1078, 0x1824, 0x0078, 0x1aad, 0x7803, 0x0004, 0x7003, | ||
| 351 | 0x0000, 0xd1bc, 0x00c0, 0x1a65, 0x027e, 0x037e, 0x7808, 0xd0ec, | ||
| 352 | 0x00c0, 0x1a38, 0x7803, 0x0009, 0x7003, 0x0004, 0x0078, 0x1a3a, | ||
| 353 | 0x1078, 0x1b9f, 0x6b28, 0x6a2c, 0x1078, 0x1fea, 0x0d7e, 0x0f7e, | ||
| 354 | 0x2d78, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1a55, 0x6808, | ||
| 355 | 0x2008, 0xa31a, 0x680c, 0xa213, 0x7810, 0xa100, 0x7812, 0x690c, | ||
| 356 | 0x7814, 0xa101, 0x7816, 0x0078, 0x1a61, 0x6810, 0x2008, 0xa31a, | ||
| 357 | 0x6814, 0xa213, 0x7810, 0xa100, 0x7812, 0x6914, 0x7814, 0xa101, | ||
| 358 | 0x7816, 0x0f7f, 0x0d7f, 0x0078, 0x1934, 0x057e, 0x7d0c, 0x1078, | ||
| 359 | 0xa20c, 0x057f, 0x1078, 0x1ac6, 0x0f7e, 0x7004, 0x2078, 0x1078, | ||
| 360 | 0x4893, 0x0040, 0x1a76, 0x7824, 0xc0f5, 0x7826, 0x0f7f, 0x682b, | ||
| 361 | 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, | ||
| 362 | 0x6980, 0x6916, 0x0078, 0x1aad, 0x7803, 0x0004, 0x7003, 0x0000, | ||
| 363 | 0x7004, 0xa00d, 0x0040, 0x1a97, 0x6808, 0x8001, 0x680a, 0x00c0, | ||
| 364 | 0x1a97, 0x7004, 0x2060, 0x2009, 0x0048, 0x1078, 0x756c, 0x1078, | ||
| 365 | 0x179f, 0x0078, 0x1aad, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, | ||
| 366 | 0x2060, 0x6010, 0xa005, 0x0040, 0x1a97, 0x2068, 0x6808, 0x8000, | ||
| 367 | 0x680a, 0x6c28, 0x6b2c, 0x1078, 0x17be, 0x017f, 0x007f, 0x127f, | ||
| 368 | 0x007c, 0x127e, 0x2091, 0x2100, 0x7000, 0xa086, 0x0003, 0x00c0, | ||
| 369 | 0x1ac4, 0x700c, 0x7110, 0xa106, 0x0040, 0x1ac4, 0x20e1, 0x9028, | ||
| 370 | 0x700f, 0xa5e7, 0x7013, 0xa5e7, 0x127f, 0x007c, 0x0c7e, 0x1078, | ||
| 371 | 0x1af7, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x0040, 0x1aed, | ||
| 372 | 0x2104, 0xa005, 0x0040, 0x1ada, 0x2060, 0x6010, 0x2060, 0x6008, | ||
| 373 | 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xa602, 0x0048, 0x1ae2, | ||
| 374 | 0x2009, 0xa5e7, 0x7112, 0x700c, 0xa106, 0x00c0, 0x1acb, 0x2001, | ||
| 375 | 0x0138, 0x2003, 0x0008, 0x0078, 0x1acb, 0x2001, 0x015d, 0x200c, | ||
| 376 | 0x810a, 0x2102, 0x2001, 0x0138, 0x2202, 0x0c7f, 0x007c, 0x2001, | ||
| 377 | 0x0138, 0x2014, 0x2003, 0x0000, 0x2021, 0xb015, 0x2001, 0x0141, | ||
| 378 | 0x201c, 0xd3dc, 0x00c0, 0x1b14, 0x2001, 0x0109, 0x201c, 0xa39c, | ||
| 379 | 0x0048, 0x00c0, 0x1b14, 0x2001, 0x0111, 0x201c, 0x83ff, 0x00c0, | ||
| 380 | 0x1b14, 0x8421, 0x00c0, 0x1afe, 0x007c, 0x2011, 0x0201, 0x2009, | ||
| 381 | 0x003c, 0x2204, 0xa005, 0x00c0, 0x1b21, 0x8109, 0x00c0, 0x1b19, | ||
| 382 | 0x007c, 0x007c, 0x1078, 0x1b15, 0x0040, 0x1b4a, 0x7908, 0xd1ec, | ||
| 383 | 0x00c0, 0x1b3a, 0x1078, 0x1b81, 0x0040, 0x1b3a, 0x7803, 0x0009, | ||
| 384 | 0x7904, 0xd1fc, 0x0040, 0x1b30, 0x7803, 0x0006, 0x1078, 0x1b15, | ||
| 385 | 0x0040, 0x1b4a, 0x780c, 0xd0a4, 0x00c0, 0x1b4a, 0x7007, 0x0000, | ||
| 386 | 0x1078, 0x1b81, 0x0040, 0x1b4c, 0x7803, 0x0019, 0x7003, 0x0003, | ||
| 387 | 0x0078, 0x1b4c, 0x1078, 0x1ac6, 0x007c, 0x0e7e, 0x2071, 0x0200, | ||
| 388 | 0x7808, 0xa084, 0xf000, 0xa10d, 0x1078, 0x1af7, 0x2019, 0x5000, | ||
| 389 | 0x8319, 0x0040, 0x1b6b, 0x2001, 0xa602, 0x2004, 0xa086, 0x0000, | ||
| 390 | 0x0040, 0x1b6b, 0x2001, 0x0021, 0xd0fc, 0x0040, 0x1b58, 0x1078, | ||
| 391 | 0x1e5d, 0x0078, 0x1b56, 0x20e1, 0x7000, 0x7324, 0x7420, 0x7028, | ||
| 392 | 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, 0x712e, 0x702f, 0x0100, | ||
| 393 | 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, 0x0138, 0x2202, 0x0e7f, | ||
| 394 | 0x007c, 0x7908, 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0048, 0x1b8c, | ||
| 395 | 0xa085, 0x0001, 0x0078, 0x1b9e, 0x2001, 0x020a, 0x81ff, 0x0040, | ||
| 396 | 0x1b97, 0x20e1, 0x6000, 0x200c, 0x200c, 0x200c, 0x200c, 0x20e1, | ||
| 397 | 0x7000, 0x200c, 0x200c, 0x7003, 0x0000, 0xa006, 0x007c, 0x7c20, | ||
| 398 | 0x7d24, 0x7e30, 0x7f34, 0x700c, 0x7110, 0xa106, 0x0040, 0x1c24, | ||
| 399 | 0x7004, 0x017e, 0x210c, 0xa106, 0x017f, 0x0040, 0x1c24, 0x0d7e, | ||
| 400 | 0x0c7e, 0x216c, 0x2d00, 0xa005, 0x0040, 0x1c22, 0x6824, 0xd0d4, | ||
| 401 | 0x00c0, 0x1c22, 0x6810, 0x2068, 0x6850, 0xd0fc, 0x0040, 0x1bec, | ||
| 402 | 0x8108, 0x2104, 0x6b2c, 0xa306, 0x00c0, 0x1c22, 0x8108, 0x2104, | ||
| 403 | 0x6a28, 0xa206, 0x00c0, 0x1c22, 0x6850, 0xc0fc, 0xc0f5, 0x6852, | ||
| 404 | 0x686c, 0x7822, 0x6870, 0x7826, 0x681c, 0x7832, 0x6820, 0x7836, | ||
| 405 | 0x6818, 0x2060, 0x6034, 0xd09c, 0x0040, 0x1be7, 0x6830, 0x2004, | ||
| 406 | 0xac68, 0x6808, 0x783a, 0x680c, 0x783e, 0x0078, 0x1c20, 0xa006, | ||
| 407 | 0x783a, 0x783e, 0x0078, 0x1c20, 0x8108, 0x2104, 0xa005, 0x00c0, | ||
| 408 | 0x1c22, 0x8108, 0x2104, 0xa005, 0x00c0, 0x1c22, 0x6850, 0xc0f5, | ||
| 409 | 0x6852, 0x6830, 0x2004, 0x6918, 0xa160, 0xa180, 0x000d, 0x2004, | ||
| 410 | 0xd09c, 0x00c0, 0x1c12, 0x6008, 0x7822, 0x686e, 0x600c, 0x7826, | ||
| 411 | 0x6872, 0x6000, 0x7832, 0x6004, 0x7836, 0xa006, 0x783a, 0x783e, | ||
| 412 | 0x0078, 0x1c20, 0x6010, 0x7822, 0x686e, 0x6014, 0x7826, 0x6872, | ||
| 413 | 0x6000, 0x7832, 0x6004, 0x7836, 0x6008, 0x783a, 0x600c, 0x783e, | ||
| 414 | 0x7803, 0x0011, 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, 0x017e, | ||
| 415 | 0x027e, 0x2071, 0xa5e1, 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, | ||
| 416 | 0xa086, 0x0000, 0x0040, 0x1c4d, 0x8211, 0x0040, 0x1c4b, 0x2001, | ||
| 417 | 0x0005, 0x2004, 0xd08c, 0x0040, 0x1c34, 0x7904, 0xa18c, 0x0780, | ||
| 418 | 0x017e, 0x1078, 0x18e2, 0x017f, 0x81ff, 0x00c0, 0x1c4b, 0x2011, | ||
| 419 | 0x0050, 0x0078, 0x1c2f, 0xa085, 0x0001, 0x027f, 0x017f, 0x0e7f, | ||
| 420 | 0x0f7f, 0x007c, 0x7803, 0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, | ||
| 421 | 0x0040, 0x1ca3, 0x8109, 0x00c0, 0x1c56, 0x2009, 0x0100, 0x210c, | ||
| 422 | 0xa18a, 0x0003, 0x1048, 0x1328, 0x1078, 0x1f75, 0x0e7e, 0x0f7e, | ||
| 423 | 0x2071, 0xa5d0, 0x2079, 0x0010, 0x7004, 0xa086, 0x0000, 0x0040, | ||
| 424 | 0x1c9b, 0x7800, 0x007e, 0x7820, 0x007e, 0x7830, 0x007e, 0x7834, | ||
| 425 | 0x007e, 0x7838, 0x007e, 0x783c, 0x007e, 0x7803, 0x0004, 0x7823, | ||
| 426 | 0x0000, 0x0005, 0x0005, 0x2079, 0x0030, 0x7804, 0xd0ac, 0x10c0, | ||
| 427 | 0x1328, 0x2079, 0x0010, 0x007f, 0x783e, 0x007f, 0x783a, 0x007f, | ||
| 428 | 0x7836, 0x007f, 0x7832, 0x007f, 0x7822, 0x007f, 0x7802, 0x0f7f, | ||
| 429 | 0x0e7f, 0x0078, 0x1ca1, 0x0f7f, 0x0e7f, 0x7804, 0xd0ac, 0x10c0, | ||
| 430 | 0x1328, 0x1078, 0x61d3, 0x007c, 0x0e7e, 0x2071, 0xa602, 0x7003, | ||
| 431 | 0x0000, 0x0e7f, 0x007c, 0x0d7e, 0xa280, 0x0004, 0x206c, 0x694c, | ||
| 432 | 0xd1dc, 0x00c0, 0x1d26, 0x6934, 0xa184, 0x0007, 0x0079, 0x1cb8, | ||
| 433 | 0x1cc0, 0x1d11, 0x1cc0, 0x1cc0, 0x1cc0, 0x1cf6, 0x1cd3, 0x1cc2, | ||
| 434 | 0x1078, 0x1328, 0x684c, 0xd0b4, 0x0040, 0x1e34, 0x6860, 0x682e, | ||
| 435 | 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, | ||
| 436 | 0x6958, 0x0078, 0x1d19, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, | ||
| 437 | 0x00c0, 0x1cc0, 0x684c, 0xd0b4, 0x0040, 0x1e34, 0x6860, 0x682e, | ||
| 438 | 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, 0x6880, 0x680e, | ||
| 439 | 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, | ||
| 440 | 0x2015, 0x2004, 0x6832, 0x6958, 0x0078, 0x1d22, 0xa18c, 0x00ff, | ||
| 441 | 0xa186, 0x0015, 0x00c0, 0x1d26, 0x684c, 0xd0b4, 0x0040, 0x1e34, | ||
| 442 | 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, | ||
| 443 | 0x2015, 0x2004, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0078, | ||
| 444 | 0x1d22, 0x684c, 0xd0b4, 0x0040, 0x18bc, 0x6958, 0xa006, 0x682e, | ||
| 445 | 0x682a, 0x2d00, 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x2015, | ||
| 446 | 0x2004, 0x6832, 0x6926, 0x684c, 0xc0dd, 0x684e, 0x0d7f, 0x007c, | ||
| 447 | 0x0f7e, 0x2079, 0x0020, 0x7804, 0xd0fc, 0x10c0, 0x1e5d, 0x0e7e, | ||
| 448 | 0x0d7e, 0x2071, 0xa602, 0x7000, 0xa005, 0x00c0, 0x1dab, 0x0c7e, | ||
| 449 | 0x7206, 0xa280, 0x0004, 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, | ||
| 450 | 0x6818, 0x0d7e, 0x2068, 0x686c, 0x7812, 0x6890, 0x0f7e, 0x20e1, | ||
| 451 | 0x9040, 0x2079, 0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, | ||
| 452 | 0x0f7f, 0x0d7f, 0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, | ||
| 453 | 0x2040, 0x6034, 0xa0cc, 0x000f, 0x6908, 0x2001, 0x04fd, 0x2004, | ||
| 454 | 0xa086, 0x0007, 0x0040, 0x1d6d, 0xa184, 0x0007, 0x0040, 0x1d6d, | ||
| 455 | 0x017e, 0x2009, 0x0008, 0xa102, 0x017f, 0xa108, 0x791a, 0x7116, | ||
| 456 | 0x701e, 0x680c, 0xa081, 0x0000, 0x781e, 0x701a, 0xa006, 0x700e, | ||
| 457 | 0x7012, 0x7004, 0x692c, 0x6814, 0xa106, 0x00c0, 0x1d84, 0x6928, | ||
| 458 | 0x6810, 0xa106, 0x0040, 0x1d91, 0x037e, 0x047e, 0x6b14, 0x6c10, | ||
| 459 | 0x1078, 0x2035, 0x047f, 0x037f, 0x0040, 0x1d91, 0x0c7f, 0x0078, | ||
| 460 | 0x1dab, 0x8aff, 0x00c0, 0x1d99, 0x0c7f, 0xa085, 0x0001, 0x0078, | ||
| 461 | 0x1dab, 0x127e, 0x2091, 0x8000, 0x2079, 0x0020, 0x2009, 0x0001, | ||
| 462 | 0x1078, 0x1daf, 0x0040, 0x1da8, 0x2009, 0x0001, 0x1078, 0x1daf, | ||
| 463 | 0x127f, 0x0c7f, 0xa006, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x077e, | ||
| 464 | 0x067e, 0x057e, 0x047e, 0x037e, 0x027e, 0x8aff, 0x0040, 0x1e2d, | ||
| 465 | 0x700c, 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, 0x0048, 0x1e2c, | ||
| 466 | 0xa705, 0x0040, 0x1e2c, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x00c0, | ||
| 467 | 0x1ddf, 0x0d7e, 0x2804, 0xac68, 0x2900, 0x0079, 0x1dcf, 0x1e0e, | ||
| 468 | 0x1def, 0x1def, 0x1e0e, 0x1e0e, 0x1e06, 0x1e0e, 0x1def, 0x1e0e, | ||
| 469 | 0x1df5, 0x1df5, 0x1e0e, 0x1e0e, 0x1e0e, 0x1dfd, 0x1df5, 0xc0fc, | ||
| 470 | 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x0040, 0x1e12, | ||
| 471 | 0x0d7e, 0x2804, 0xac68, 0x6f08, 0x6e0c, 0x0078, 0x1e11, 0x6b08, | ||
| 472 | 0x6a0c, 0x6d00, 0x6c04, 0x0078, 0x1e11, 0x6b10, 0x6a14, 0x6d00, | ||
| 473 | 0x6c04, 0x6f08, 0x6e0c, 0x0078, 0x1e11, 0x0d7f, 0x0d7e, 0x6834, | ||
| 474 | 0xa084, 0x00ff, 0xa086, 0x001e, 0x00c0, 0x1e0e, 0x0d7f, 0x1078, | ||
| 475 | 0x1fd1, 0x00c0, 0x1db5, 0xa00e, 0x0078, 0x1e2d, 0x0d7f, 0x1078, | ||
| 476 | 0x1328, 0x0d7f, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, 0x7e3e, | ||
| 477 | 0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, 0x682c, | ||
| 478 | 0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, 0x7012, | ||
| 479 | 0x1078, 0x1fd1, 0x0078, 0x1e2d, 0xa006, 0x027f, 0x037f, 0x047f, | ||
| 480 | 0x057f, 0x067f, 0x077f, 0x007c, 0x1078, 0x1328, 0x027e, 0x2001, | ||
| 481 | 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, | ||
| 482 | 0x0000, 0x7004, 0x2060, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8a44, | ||
| 483 | 0x0040, 0x1e4d, 0x6850, 0xc0bd, 0x6852, 0x0d7f, 0x1078, 0x8758, | ||
| 484 | 0x20e1, 0x9040, 0x1078, 0x719a, 0x2011, 0x0000, 0x1078, 0x6efc, | ||
| 485 | 0x1078, 0x61d3, 0x027f, 0x0078, 0x1f29, 0x127e, 0x2091, 0x2200, | ||
| 486 | 0x007e, 0x017e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x2079, 0x0020, | ||
| 487 | 0x2071, 0xa602, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, | ||
| 488 | 0xa184, 0x0700, 0x00c0, 0x1e36, 0x7000, 0x0079, 0x1e77, 0x1f29, | ||
| 489 | 0x1e7b, 0x1ef6, 0x1f27, 0x8001, 0x7002, 0xd19c, 0x00c0, 0x1e8f, | ||
| 490 | 0x8aff, 0x0040, 0x1eae, 0x2009, 0x0001, 0x1078, 0x1daf, 0x0040, | ||
| 491 | 0x1f29, 0x2009, 0x0001, 0x1078, 0x1daf, 0x0078, 0x1f29, 0x7803, | ||
| 492 | 0x0004, 0xd194, 0x0040, 0x1e9f, 0x6850, 0xc0fc, 0x6852, 0x8aff, | ||
| 493 | 0x00c0, 0x1ea4, 0x684c, 0xc0f5, 0x684e, 0x0078, 0x1ea4, 0x1078, | ||
| 494 | 0x1fea, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, 0x2c00, 0x681a, | ||
| 495 | 0x2800, 0x6832, 0x7003, 0x0000, 0x0078, 0x1f29, 0x711c, 0x81ff, | ||
| 496 | 0x0040, 0x1ec4, 0x7918, 0x7922, 0x7827, 0x0000, 0x7803, 0x0001, | ||
| 497 | 0x7000, 0x8000, 0x7002, 0x700c, 0xa100, 0x700e, 0x7010, 0xa081, | ||
| 498 | 0x0000, 0x7012, 0x0078, 0x1f29, 0x0f7e, 0x027e, 0x781c, 0x007e, | ||
| 499 | 0x7818, 0x007e, 0x2079, 0x0100, 0x7a14, 0xa284, 0x0004, 0xa085, | ||
| 500 | 0x0012, 0x7816, 0x037e, 0x2019, 0x1000, 0x8319, 0x1040, 0x1328, | ||
| 501 | 0x7820, 0xd0bc, 0x00c0, 0x1ed5, 0x037f, 0x79c8, 0x007f, 0xa102, | ||
| 502 | 0x017f, 0x007e, 0x017e, 0x79c4, 0x007f, 0xa103, 0x78c6, 0x007f, | ||
| 503 | 0x78ca, 0xa284, 0x0004, 0xa085, 0x0012, 0x7816, 0x027f, 0x0f7f, | ||
| 504 | 0x7803, 0x0008, 0x7003, 0x0000, 0x0078, 0x1f29, 0x8001, 0x7002, | ||
| 505 | 0xd194, 0x0040, 0x1f0b, 0x7804, 0xd0fc, 0x00c0, 0x1e6d, 0xd19c, | ||
| 506 | 0x00c0, 0x1f25, 0x8aff, 0x0040, 0x1f29, 0x2009, 0x0001, 0x1078, | ||
| 507 | 0x1daf, 0x0078, 0x1f29, 0x027e, 0x037e, 0x6b28, 0x6a2c, 0x1078, | ||
| 508 | 0x1fea, 0x0d7e, 0x2804, 0xac68, 0x6034, 0xd09c, 0x00c0, 0x1f1e, | ||
| 509 | 0x6808, 0xa31a, 0x680c, 0xa213, 0x0078, 0x1f22, 0x6810, 0xa31a, | ||
| 510 | 0x6814, 0xa213, 0x0d7f, 0x0078, 0x1e9f, 0x0078, 0x1e9f, 0x1078, | ||
| 511 | 0x1328, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x017f, 0x007f, 0x127f, | ||
| 512 | 0x007c, 0x0f7e, 0x0e7e, 0x2071, 0xa602, 0x7000, 0xa086, 0x0000, | ||
| 513 | 0x0040, 0x1f72, 0x2079, 0x0020, 0x017e, 0x2009, 0x0207, 0x210c, | ||
| 514 | 0xd194, 0x0040, 0x1f4f, 0x2009, 0x020c, 0x210c, 0xa184, 0x0003, | ||
| 515 | 0x0040, 0x1f4f, 0x20e1, 0x9040, 0x2001, 0x020c, 0x2102, 0x2009, | ||
| 516 | 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, 0x00c0, 0x1f5a, | ||
| 517 | 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x0040, 0x1f3d, 0x1078, 0x1e5d, | ||
| 518 | 0x7000, 0xa086, 0x0000, 0x00c0, 0x1f3d, 0x017f, 0x7803, 0x0004, | ||
| 519 | 0x7804, 0xd0ac, 0x00c0, 0x1f68, 0x20e1, 0x9040, 0x7803, 0x0002, | ||
| 520 | 0x7003, 0x0000, 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x0c7e, 0x0d7e, | ||
| 521 | 0x0e7e, 0x0f7e, 0x2071, 0xa602, 0x2079, 0x0020, 0x7000, 0xa086, | ||
| 522 | 0x0000, 0x0040, 0x1fae, 0x7004, 0x2060, 0x6010, 0x2068, 0x1078, | ||
| 523 | 0x8a44, 0x0040, 0x1f98, 0x6850, 0xc0b5, 0x6852, 0x680c, 0x7a1c, | ||
| 524 | 0xa206, 0x00c0, 0x1f98, 0x6808, 0x7a18, 0xa206, 0x0040, 0x1fb4, | ||
| 525 | 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, | ||
| 526 | 0x7003, 0x0000, 0x7004, 0x2060, 0x1078, 0x8758, 0x20e1, 0x9040, | ||
| 527 | 0x1078, 0x719a, 0x2011, 0x0000, 0x1078, 0x6efc, 0x0f7f, 0x0e7f, | ||
| 528 | 0x0d7f, 0x0c7f, 0x027f, 0x007c, 0x6810, 0x6a14, 0xa205, 0x00c0, | ||
| 529 | 0x1f98, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x1078, 0x1cab, 0x2001, | ||
| 530 | 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, | ||
| 531 | 0x0000, 0x2069, 0xa5ab, 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, | ||
| 532 | 0x1fae, 0x8840, 0x2804, 0xa005, 0x00c0, 0x1fe5, 0x6004, 0xa005, | ||
| 533 | 0x0040, 0x1fe7, 0x681a, 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, | ||
| 534 | 0x2015, 0x2044, 0x88ff, 0x1040, 0x1328, 0x8a51, 0x007c, 0x2051, | ||
| 535 | 0x0000, 0x007c, 0x8a50, 0x8841, 0x2804, 0xa005, 0x00c0, 0x2004, | ||
| 536 | 0x2c00, 0xad06, 0x0040, 0x1ff9, 0x6000, 0xa005, 0x00c0, 0x1ff9, | ||
| 537 | 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080, 0x2025, | ||
| 538 | 0x2044, 0x88ff, 0x1040, 0x1328, 0x007c, 0x0000, 0x0011, 0x0015, | ||
| 539 | 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f, 0x0015, | ||
| 540 | 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x200a, 0x2006, | ||
| 541 | 0x0000, 0x0000, 0x2014, 0x0000, 0x200a, 0x0000, 0x2011, 0x200e, | ||
| 542 | 0x0000, 0x0000, 0x0000, 0x2014, 0x2011, 0x0000, 0x200c, 0x200c, | ||
| 543 | 0x0000, 0x0000, 0x2014, 0x0000, 0x200c, 0x0000, 0x2012, 0x2012, | ||
| 544 | 0x0000, 0x0000, 0x0000, 0x2014, 0x2012, 0x0a7e, 0x097e, 0x087e, | ||
| 545 | 0x6b2e, 0x6c2a, 0x6858, 0xa055, 0x0040, 0x20d8, 0x2d60, 0x6034, | ||
| 546 | 0xa0cc, 0x000f, 0xa9c0, 0x2015, 0xa986, 0x0007, 0x0040, 0x2050, | ||
| 547 | 0xa986, 0x000e, 0x0040, 0x2050, 0xa986, 0x000f, 0x00c0, 0x2054, | ||
| 548 | 0x605c, 0xa422, 0x6060, 0xa31a, 0x2804, 0xa045, 0x00c0, 0x2062, | ||
| 549 | 0x0050, 0x205c, 0x0078, 0x20d8, 0x6004, 0xa065, 0x0040, 0x20d8, | ||
| 550 | 0x0078, 0x203f, 0x2804, 0xa005, 0x0040, 0x2080, 0xac68, 0xd99c, | ||
| 551 | 0x00c0, 0x2070, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0078, 0x2074, | ||
| 552 | 0x6810, 0xa422, 0x6814, 0xa31b, 0x0048, 0x209f, 0x2300, 0xa405, | ||
| 553 | 0x0040, 0x2086, 0x8a51, 0x0040, 0x20d8, 0x8840, 0x0078, 0x2062, | ||
| 554 | 0x6004, 0xa065, 0x0040, 0x20d8, 0x0078, 0x203f, 0x8a51, 0x0040, | ||
| 555 | 0x20d8, 0x8840, 0x2804, 0xa005, 0x00c0, 0x2099, 0x6004, 0xa065, | ||
| 556 | 0x0040, 0x20d8, 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x2015, 0x2804, | ||
| 557 | 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, 0x0078, 0x20cc, 0x8422, | ||
| 558 | 0x8420, 0x831a, 0xa399, 0x0000, 0x0d7e, 0x2b68, 0x6c6e, 0x6b72, | ||
| 559 | 0x0d7f, 0xd99c, 0x00c0, 0x20ba, 0x6908, 0x2400, 0xa122, 0x690c, | ||
| 560 | 0x2300, 0xa11b, 0x1048, 0x1328, 0x6800, 0xa420, 0x6804, 0xa319, | ||
| 561 | 0x0078, 0x20c6, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, | ||
| 562 | 0x1048, 0x1328, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, | ||
| 563 | 0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, | ||
| 564 | 0x2a00, 0x6826, 0x007f, 0x007f, 0x007f, 0xa006, 0x0078, 0x20dd, | ||
| 565 | 0x087f, 0x097f, 0x0a7f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0005, | ||
| 566 | 0x2004, 0xa084, 0x0007, 0x0079, 0x20e5, 0x20ed, 0x20ee, 0x20f1, | ||
| 567 | 0x20f4, 0x20f9, 0x20fc, 0x2101, 0x2106, 0x007c, 0x1078, 0x1e5d, | ||
| 568 | 0x007c, 0x1078, 0x18e2, 0x007c, 0x1078, 0x18e2, 0x1078, 0x1e5d, | ||
| 569 | 0x007c, 0x1078, 0x14b0, 0x007c, 0x1078, 0x1e5d, 0x1078, 0x14b0, | ||
| 570 | 0x007c, 0x1078, 0x18e2, 0x1078, 0x14b0, 0x007c, 0x1078, 0x18e2, | ||
| 571 | 0x1078, 0x1e5d, 0x1078, 0x14b0, 0x007c, 0x127e, 0x2091, 0x2300, | ||
| 572 | 0x2079, 0x0200, 0x2071, 0xa880, 0x2069, 0xa300, 0x2009, 0x0004, | ||
| 573 | 0x7912, 0x7817, 0x0004, 0x1078, 0x24b5, 0x781b, 0x0002, 0x20e1, | ||
| 574 | 0x8700, 0x127f, 0x007c, 0x127e, 0x2091, 0x2300, 0x781c, 0xa084, | ||
| 575 | 0x0007, 0x0079, 0x212b, 0x214f, 0x2133, 0x2137, 0x213b, 0x2141, | ||
| 576 | 0x2145, 0x2149, 0x214d, 0x1078, 0x5372, 0x0078, 0x214f, 0x1078, | ||
| 577 | 0x53b3, 0x0078, 0x214f, 0x1078, 0x5372, 0x1078, 0x53b3, 0x0078, | ||
| 578 | 0x214f, 0x1078, 0x2151, 0x0078, 0x214f, 0x1078, 0x2151, 0x0078, | ||
| 579 | 0x214f, 0x1078, 0x2151, 0x0078, 0x214f, 0x1078, 0x2151, 0x127f, | ||
| 580 | 0x007c, 0x007e, 0x017e, 0x027e, 0x7930, 0xa184, 0x0003, 0x0040, | ||
| 581 | 0x215d, 0x20e1, 0x9040, 0x0078, 0x2186, 0xa184, 0x0030, 0x0040, | ||
| 582 | 0x216e, 0x6a00, 0xa286, 0x0003, 0x00c0, 0x2168, 0x0078, 0x216a, | ||
| 583 | 0x1078, 0x4171, 0x20e1, 0x9010, 0x0078, 0x2186, 0xa184, 0x00c0, | ||
| 584 | 0x0040, 0x2180, 0x0e7e, 0x037e, 0x047e, 0x057e, 0x2071, 0xa5e1, | ||
| 585 | 0x1078, 0x1ac6, 0x057f, 0x047f, 0x037f, 0x0e7f, 0x0078, 0x2186, | ||
| 586 | 0xa184, 0x0300, 0x0040, 0x2186, 0x20e1, 0x9020, 0x7932, 0x027f, | ||
| 587 | 0x017f, 0x007f, 0x007c, 0x017e, 0x0e7e, 0x0f7e, 0x2071, 0xa300, | ||
| 588 | 0x7128, 0x2001, 0xa58f, 0x2102, 0x2001, 0xa597, 0x2102, 0xa182, | ||
| 589 | 0x0211, 0x00c8, 0x219f, 0x2009, 0x0008, 0x0078, 0x21c9, 0xa182, | ||
| 590 | 0x0259, 0x00c8, 0x21a7, 0x2009, 0x0007, 0x0078, 0x21c9, 0xa182, | ||
| 591 | 0x02c1, 0x00c8, 0x21af, 0x2009, 0x0006, 0x0078, 0x21c9, 0xa182, | ||
| 592 | 0x0349, 0x00c8, 0x21b7, 0x2009, 0x0005, 0x0078, 0x21c9, 0xa182, | ||
| 593 | 0x0421, 0x00c8, 0x21bf, 0x2009, 0x0004, 0x0078, 0x21c9, 0xa182, | ||
| 594 | 0x0581, 0x00c8, 0x21c7, 0x2009, 0x0003, 0x0078, 0x21c9, 0x2009, | ||
| 595 | 0x0002, 0x2079, 0x0200, 0x7912, 0x7817, 0x0004, 0x1078, 0x24b5, | ||
| 596 | 0x0f7f, 0x0e7f, 0x017f, 0x007c, 0x127e, 0x2091, 0x2200, 0x2061, | ||
| 597 | 0x0100, 0x2071, 0xa300, 0x6024, 0x6026, 0x6053, 0x0030, 0x6033, | ||
| 598 | 0x00ef, 0x60e7, 0x0000, 0x60eb, 0x00ef, 0x60e3, 0x0008, 0x604b, | ||
| 599 | 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, | ||
| 600 | 0x0eaf, 0x600f, 0x00ff, 0x602b, 0x002f, 0x127f, 0x007c, 0x2001, | ||
| 601 | 0xa32f, 0x2003, 0x0000, 0x2001, 0xa32e, 0x2003, 0x0001, 0x007c, | ||
| 602 | 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, 0x6124, 0xa184, | ||
| 603 | 0x002c, 0x00c0, 0x220f, 0xa184, 0x0007, 0x0079, 0x2215, 0xa195, | ||
| 604 | 0x0004, 0xa284, 0x0007, 0x0079, 0x2215, 0x2241, 0x221d, 0x2221, | ||
| 605 | 0x2225, 0x222b, 0x222f, 0x2235, 0x223b, 0x1078, 0x5ad2, 0x0078, | ||
| 606 | 0x2241, 0x1078, 0x5bc1, 0x0078, 0x2241, 0x1078, 0x5bc1, 0x1078, | ||
| 607 | 0x5ad2, 0x0078, 0x2241, 0x1078, 0x2246, 0x0078, 0x2241, 0x1078, | ||
| 608 | 0x5ad2, 0x1078, 0x2246, 0x0078, 0x2241, 0x1078, 0x5bc1, 0x1078, | ||
| 609 | 0x2246, 0x0078, 0x2241, 0x1078, 0x5bc1, 0x1078, 0x5ad2, 0x1078, | ||
| 610 | 0x2246, 0x027f, 0x017f, 0x007f, 0x127f, 0x007c, 0x6124, 0xd1ac, | ||
| 611 | 0x0040, 0x2342, 0x017e, 0x047e, 0x0c7e, 0x644c, 0xa486, 0xf0f0, | ||
| 612 | 0x00c0, 0x2259, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, | ||
| 613 | 0x0010, 0x74c2, 0xa48c, 0xff00, 0x7034, 0xd084, 0x0040, 0x2271, | ||
| 614 | 0xa186, 0xf800, 0x00c0, 0x2271, 0x7038, 0xd084, 0x00c0, 0x2271, | ||
| 615 | 0xc085, 0x703a, 0x037e, 0x2418, 0x2011, 0x8016, 0x1078, 0x3579, | ||
| 616 | 0x037f, 0xa196, 0xff00, 0x0040, 0x22b3, 0x6030, 0xa084, 0x00ff, | ||
| 617 | 0x810f, 0xa116, 0x0040, 0x22b3, 0x7130, 0xd184, 0x00c0, 0x22b3, | ||
| 618 | 0x2011, 0xa352, 0x2214, 0xd2ec, 0x0040, 0x228e, 0xc18d, 0x7132, | ||
| 619 | 0x2011, 0xa352, 0x2214, 0xd2ac, 0x00c0, 0x22b3, 0x6240, 0xa294, | ||
| 620 | 0x0010, 0x0040, 0x229a, 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, | ||
| 621 | 0x0040, 0x22b3, 0x7030, 0xd08c, 0x0040, 0x2305, 0x7034, 0xd08c, | ||
| 622 | 0x00c0, 0x22aa, 0x2001, 0xa30c, 0x200c, 0xd1ac, 0x00c0, 0x2305, | ||
| 623 | 0xc1ad, 0x2102, 0x037e, 0x73c0, 0x2011, 0x8013, 0x1078, 0x3579, | ||
| 624 | 0x037f, 0x0078, 0x2305, 0x7034, 0xd08c, 0x00c0, 0x22bf, 0x2001, | ||
| 625 | 0xa30c, 0x200c, 0xd1ac, 0x00c0, 0x2305, 0xc1ad, 0x2102, 0x037e, | ||
| 626 | 0x73c0, 0x2011, 0x8013, 0x1078, 0x3579, 0x037f, 0x7130, 0xc185, | ||
| 627 | 0x7132, 0x2011, 0xa352, 0x220c, 0xd1a4, 0x0040, 0x22e9, 0x017e, | ||
| 628 | 0x2009, 0x0001, 0x2011, 0x0100, 0x1078, 0x5a6d, 0x2019, 0x000e, | ||
| 629 | 0x1078, 0x9e3b, 0xa484, 0x00ff, 0xa080, 0x293f, 0x200c, 0xa18c, | ||
| 630 | 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x1078, 0x9ec0, | ||
| 631 | 0x017f, 0xd1ac, 0x00c0, 0x22f6, 0x017e, 0x2009, 0x0000, 0x2019, | ||
| 632 | 0x0004, 0x1078, 0x27e2, 0x017f, 0x0078, 0x2305, 0x157e, 0x20a9, | ||
| 633 | 0x007f, 0x2009, 0x0000, 0x1078, 0x4501, 0x00c0, 0x2301, 0x1078, | ||
| 634 | 0x4235, 0x8108, 0x00f0, 0x22fb, 0x157f, 0x0c7f, 0x047f, 0x0f7e, | ||
| 635 | 0x2079, 0xa5be, 0x783c, 0xa086, 0x0000, 0x0040, 0x2317, 0x6027, | ||
| 636 | 0x0004, 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x0000, 0x0f7f, | ||
| 637 | 0x2011, 0x0003, 0x1078, 0x6ef2, 0x2011, 0x0002, 0x1078, 0x6efc, | ||
| 638 | 0x1078, 0x6dda, 0x1078, 0x595a, 0x037e, 0x2019, 0x0000, 0x1078, | ||
| 639 | 0x6e6c, 0x037f, 0x60e3, 0x0000, 0x017f, 0x2001, 0xa300, 0x2014, | ||
| 640 | 0xa296, 0x0004, 0x00c0, 0x233a, 0xd19c, 0x00c0, 0x233a, 0x6228, | ||
| 641 | 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xa321, 0x2003, 0x0000, | ||
| 642 | 0x6027, 0x0020, 0xd194, 0x0040, 0x2426, 0x0f7e, 0x2079, 0xa5be, | ||
| 643 | 0x783c, 0xa086, 0x0001, 0x00c0, 0x2366, 0x017e, 0x6027, 0x0004, | ||
| 644 | 0x783f, 0x0000, 0x2079, 0x0140, 0x7803, 0x1000, 0x7803, 0x0000, | ||
| 645 | 0x2079, 0xa5ab, 0x7807, 0x0000, 0x7833, 0x0000, 0x1078, 0x6109, | ||
| 646 | 0x1078, 0x61d3, 0x017f, 0x0f7f, 0x0078, 0x2426, 0x0f7f, 0x017e, | ||
| 647 | 0x3900, 0xa082, 0xa6cd, 0x00c8, 0x2371, 0x017e, 0x1078, 0x728a, | ||
| 648 | 0x017f, 0x6220, 0xd2b4, 0x0040, 0x23dc, 0x1078, 0x595a, 0x1078, | ||
| 649 | 0x6c41, 0x6027, 0x0004, 0x0f7e, 0x2019, 0xa5b4, 0x2304, 0xa07d, | ||
| 650 | 0x0040, 0x23b2, 0x7804, 0xa086, 0x0032, 0x00c0, 0x23b2, 0x0d7e, | ||
| 651 | 0x0c7e, 0x0e7e, 0x2069, 0x0140, 0x618c, 0x6288, 0x7818, 0x608e, | ||
| 652 | 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x00c0, | ||
| 653 | 0x2396, 0x6043, 0x0000, 0x6803, 0x1000, 0x6803, 0x0000, 0x618e, | ||
| 654 | 0x628a, 0x1078, 0x6010, 0x1078, 0x6109, 0x7810, 0x2070, 0x7037, | ||
| 655 | 0x0103, 0x2f60, 0x1078, 0x753d, 0x0e7f, 0x0c7f, 0x0d7f, 0x0f7f, | ||
| 656 | 0x017f, 0x007c, 0x0f7f, 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, | ||
| 657 | 0x4000, 0x0040, 0x23bf, 0x6803, 0x1000, 0x6803, 0x0000, 0x0d7f, | ||
| 658 | 0x0c7e, 0x2061, 0xa5ab, 0x6028, 0xa09a, 0x00c8, 0x00c8, 0x23cf, | ||
| 659 | 0x8000, 0x602a, 0x0c7f, 0x1078, 0x6c33, 0x0078, 0x2425, 0x2019, | ||
| 660 | 0xa5b4, 0x2304, 0xa065, 0x0040, 0x23d9, 0x2009, 0x0027, 0x1078, | ||
| 661 | 0x756c, 0x0c7f, 0x0078, 0x2425, 0xd2bc, 0x0040, 0x2425, 0x1078, | ||
| 662 | 0x5967, 0x6017, 0x0010, 0x6027, 0x0004, 0x0d7e, 0x2069, 0x0140, | ||
| 663 | 0x6804, 0xa084, 0x4000, 0x0040, 0x23f1, 0x6803, 0x1000, 0x6803, | ||
| 664 | 0x0000, 0x0d7f, 0x0c7e, 0x2061, 0xa5ab, 0x6044, 0xa09a, 0x00c8, | ||
| 665 | 0x00c8, 0x2414, 0x8000, 0x6046, 0x603c, 0x0c7f, 0xa005, 0x0040, | ||
| 666 | 0x2425, 0x2009, 0x07d0, 0x1078, 0x595f, 0xa080, 0x0007, 0x2004, | ||
| 667 | 0xa086, 0x0006, 0x00c0, 0x2410, 0x6017, 0x0012, 0x0078, 0x2425, | ||
| 668 | 0x6017, 0x0016, 0x0078, 0x2425, 0x037e, 0x2019, 0x0001, 0x1078, | ||
| 669 | 0x6e6c, 0x037f, 0x2019, 0xa5ba, 0x2304, 0xa065, 0x0040, 0x2424, | ||
| 670 | 0x2009, 0x004f, 0x1078, 0x756c, 0x0c7f, 0x017f, 0xd19c, 0x0040, | ||
| 671 | 0x247c, 0x7034, 0xd0ac, 0x00c0, 0x2457, 0x017e, 0x157e, 0x6027, | ||
| 672 | 0x0008, 0x602f, 0x0020, 0x20a9, 0x000a, 0x00f0, 0x2435, 0x602f, | ||
| 673 | 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, 0x20a9, 0x0320, 0x00e0, | ||
| 674 | 0x243f, 0x2091, 0x6000, 0x6020, 0xd09c, 0x00c0, 0x244e, 0x157f, | ||
| 675 | 0x6152, 0x017f, 0x6027, 0x0008, 0x0078, 0x247c, 0x1078, 0x250d, | ||
| 676 | 0x00f0, 0x243f, 0x157f, 0x6152, 0x017f, 0x6027, 0x0008, 0x017e, | ||
| 677 | 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x1078, 0x6ef2, 0x2011, | ||
| 678 | 0x0002, 0x1078, 0x6efc, 0x1078, 0x6dda, 0x1078, 0x595a, 0x037e, | ||
| 679 | 0x2019, 0x0000, 0x1078, 0x6e6c, 0x037f, 0x60e3, 0x0000, 0x1078, | ||
| 680 | 0xa22a, 0x1078, 0xa248, 0x2001, 0xa300, 0x2003, 0x0004, 0x6027, | ||
| 681 | 0x0008, 0x1078, 0x1246, 0x017f, 0xa18c, 0xffd0, 0x6126, 0x007c, | ||
| 682 | 0x007e, 0x017e, 0x027e, 0x0e7e, 0x0f7e, 0x127e, 0x2091, 0x8000, | ||
| 683 | 0x2071, 0xa300, 0x71b8, 0x70ba, 0xa116, 0x0040, 0x24ae, 0x81ff, | ||
| 684 | 0x0040, 0x2498, 0x2011, 0x8011, 0x1078, 0x3579, 0x0078, 0x24ae, | ||
| 685 | 0x2011, 0x8012, 0x1078, 0x3579, 0x2001, 0xa371, 0x2004, 0xd0fc, | ||
| 686 | 0x00c0, 0x24ae, 0x037e, 0x0c7e, 0x2061, 0x0100, 0x2019, 0x0028, | ||
| 687 | 0x2009, 0x0000, 0x1078, 0x27e2, 0x0c7f, 0x037f, 0x127f, 0x0f7f, | ||
| 688 | 0x0e7f, 0x027f, 0x017f, 0x007f, 0x007c, 0x0c7e, 0x0f7e, 0x007e, | ||
| 689 | 0x027e, 0x2061, 0x0100, 0xa190, 0x24d1, 0x2204, 0x60f2, 0x2011, | ||
| 690 | 0x24de, 0x6000, 0xa082, 0x0003, 0x00c8, 0x24ca, 0x2001, 0x00ff, | ||
| 691 | 0x0078, 0x24cb, 0x2204, 0x60ee, 0x027f, 0x007f, 0x0f7f, 0x0c7f, | ||
| 692 | 0x007c, 0x0840, 0x0840, 0x0840, 0x0580, 0x0420, 0x0348, 0x02c0, | ||
| 693 | 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, 0x01a8, 0x0140, 0x00f8, | ||
| 694 | 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, 0x00ff, 0x2130, 0xa094, | ||
| 695 | 0xff00, 0x00c0, 0x24ee, 0x81ff, 0x0040, 0x24f2, 0x1078, 0x5623, | ||
| 696 | 0x0078, 0x24f9, 0xa080, 0x293f, 0x200c, 0xa18c, 0xff00, 0x810f, | ||
| 697 | 0xa006, 0x007c, 0xa080, 0x293f, 0x200c, 0xa18c, 0x00ff, 0x007c, | ||
| 698 | 0x0c7e, 0x2061, 0xa300, 0x6030, 0x0040, 0x2509, 0xc09d, 0x0078, | ||
| 699 | 0x250a, 0xc09c, 0x6032, 0x0c7f, 0x007c, 0x007e, 0x157e, 0x0f7e, | ||
| 700 | 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd08c, 0x00c0, 0x251a, | ||
| 701 | 0x00f0, 0x2514, 0x0f7f, 0x157f, 0x007f, 0x007c, 0x0c7e, 0x007e, | ||
| 702 | 0x2061, 0x0100, 0x6030, 0x007e, 0x6048, 0x007e, 0x60e4, 0x007e, | ||
| 703 | 0x60e8, 0x007e, 0x6050, 0x007e, 0x60f0, 0x007e, 0x60ec, 0x007e, | ||
| 704 | 0x600c, 0x007e, 0x6004, 0x007e, 0x6028, 0x007e, 0x60e0, 0x007e, | ||
| 705 | 0x602f, 0x0100, 0x602f, 0x0000, 0x0005, 0x0005, 0x0005, 0x0005, | ||
| 706 | 0x602f, 0x0040, 0x602f, 0x0000, 0x007f, 0x60e2, 0x007f, 0x602a, | ||
| 707 | 0x007f, 0x6006, 0x007f, 0x600e, 0x007f, 0x60ee, 0x007f, 0x60f2, | ||
| 708 | 0x007f, 0x6052, 0x007f, 0x60ea, 0x007f, 0x60e6, 0x007f, 0x604a, | ||
| 709 | 0x007f, 0x6032, 0x007f, 0x0c7f, 0x007c, 0x257d, 0x2581, 0x2585, | ||
| 710 | 0x258b, 0x2591, 0x2597, 0x259d, 0x25a5, 0x25ad, 0x25b3, 0x25b9, | ||
| 711 | 0x25c1, 0x25c9, 0x25d1, 0x25d9, 0x25e3, 0x25ed, 0x25ed, 0x25ed, | ||
| 712 | 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x25ed, | ||
| 713 | 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x25ed, 0x107e, 0x007e, 0x0078, | ||
| 714 | 0x2606, 0x107e, 0x007e, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, | ||
| 715 | 0x2200, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, 0x2200, 0x0078, | ||
| 716 | 0x2606, 0x107e, 0x007e, 0x1078, 0x20de, 0x0078, 0x2606, 0x107e, | ||
| 717 | 0x007e, 0x1078, 0x20de, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, | ||
| 718 | 0x2200, 0x1078, 0x20de, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, | ||
| 719 | 0x2200, 0x1078, 0x20de, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, | ||
| 720 | 0x2123, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, 0x2123, 0x0078, | ||
| 721 | 0x2606, 0x107e, 0x007e, 0x1078, 0x2200, 0x1078, 0x2123, 0x0078, | ||
| 722 | 0x2606, 0x107e, 0x007e, 0x1078, 0x2200, 0x1078, 0x2123, 0x0078, | ||
| 723 | 0x2606, 0x107e, 0x007e, 0x1078, 0x20de, 0x1078, 0x2123, 0x0078, | ||
| 724 | 0x2606, 0x107e, 0x007e, 0x1078, 0x20de, 0x1078, 0x2123, 0x0078, | ||
| 725 | 0x2606, 0x107e, 0x007e, 0x1078, 0x2200, 0x1078, 0x20de, 0x1078, | ||
| 726 | 0x2123, 0x0078, 0x2606, 0x107e, 0x007e, 0x1078, 0x2200, 0x1078, | ||
| 727 | 0x20de, 0x1078, 0x2123, 0x0078, 0x2606, 0x0005, 0x0078, 0x25ed, | ||
| 728 | 0xb084, 0x003c, 0x8004, 0x8004, 0x0079, 0x25f6, 0x2606, 0x2583, | ||
| 729 | 0x2587, 0x258d, 0x2593, 0x2599, 0x259f, 0x25a7, 0x25af, 0x25b5, | ||
| 730 | 0x25bb, 0x25c3, 0x25cb, 0x25d3, 0x25db, 0x25e5, 0x0008, 0x25f0, | ||
| 731 | 0x007f, 0x107f, 0x2091, 0x8001, 0x007c, 0x0c7e, 0x027e, 0x047e, | ||
| 732 | 0x2021, 0x0000, 0x1078, 0x4897, 0x00c0, 0x2705, 0x70c8, 0xd09c, | ||
| 733 | 0x0040, 0x2624, 0xd084, 0x00c0, 0x2624, 0xd0bc, 0x00c0, 0x2705, | ||
| 734 | 0x1078, 0x2709, 0x0078, 0x2705, 0xd094, 0x0040, 0x262b, 0x7093, | ||
| 735 | 0xffff, 0x0078, 0x2705, 0x2001, 0x010c, 0x203c, 0x7280, 0xd284, | ||
| 736 | 0x0040, 0x2694, 0xd28c, 0x00c0, 0x2694, 0x037e, 0x7390, 0xa38e, | ||
| 737 | 0xffff, 0x0040, 0x263e, 0x83ff, 0x00c0, 0x2640, 0x2019, 0x0001, | ||
| 738 | 0x8314, 0xa2e0, 0xa9c0, 0x2c04, 0xa38c, 0x0001, 0x0040, 0x264d, | ||
| 739 | 0xa084, 0xff00, 0x8007, 0x0078, 0x264f, 0xa084, 0x00ff, 0xa70e, | ||
| 740 | 0x0040, 0x2689, 0xa08e, 0x0000, 0x0040, 0x2689, 0xa08e, 0x00ff, | ||
| 741 | 0x00c0, 0x2666, 0x7230, 0xd284, 0x00c0, 0x268f, 0x7280, 0xc28d, | ||
| 742 | 0x7282, 0x7093, 0xffff, 0x037f, 0x0078, 0x2694, 0x2009, 0x0000, | ||
| 743 | 0x1078, 0x24e3, 0x1078, 0x4499, 0x00c0, 0x268c, 0x6004, 0xa084, | ||
| 744 | 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2683, 0x7030, 0xd08c, 0x0040, | ||
| 745 | 0x267d, 0x6000, 0xd0bc, 0x0040, 0x2683, 0x1078, 0x271f, 0x0040, | ||
| 746 | 0x268c, 0x0078, 0x2689, 0x1078, 0x2857, 0x1078, 0x274c, 0x0040, | ||
| 747 | 0x268c, 0x8318, 0x0078, 0x2640, 0x7392, 0x0078, 0x2691, 0x7093, | ||
| 748 | 0xffff, 0x037f, 0x0078, 0x2705, 0xa780, 0x293f, 0x203c, 0xa7bc, | ||
| 749 | 0xff00, 0x873f, 0x2041, 0x007e, 0x7090, 0xa096, 0xffff, 0x00c0, | ||
| 750 | 0x26a6, 0x2009, 0x0000, 0x28a8, 0x0078, 0x26b2, 0xa812, 0x0048, | ||
| 751 | 0x26ae, 0x2008, 0xa802, 0x20a8, 0x0078, 0x26b2, 0x7093, 0xffff, | ||
| 752 | 0x0078, 0x2705, 0x2700, 0x157e, 0x017e, 0xa106, 0x0040, 0x26f9, | ||
| 753 | 0xc484, 0x1078, 0x4501, 0x0040, 0x26c3, 0x1078, 0x4499, 0x00c0, | ||
| 754 | 0x2702, 0x0078, 0x26c4, 0xc485, 0x6004, 0xa084, 0x00ff, 0xa086, | ||
| 755 | 0x0006, 0x00c0, 0x26d3, 0x7030, 0xd08c, 0x0040, 0x26f1, 0x6000, | ||
| 756 | 0xd0bc, 0x00c0, 0x26f1, 0x7280, 0xd28c, 0x0040, 0x26e9, 0x6004, | ||
| 757 | 0xa084, 0x00ff, 0xa082, 0x0006, 0x0048, 0x26f9, 0xd484, 0x00c0, | ||
| 758 | 0x26e5, 0x1078, 0x44bc, 0x0078, 0x26e7, 0x1078, 0x2921, 0x0078, | ||
| 759 | 0x26f9, 0x1078, 0x2857, 0x1078, 0x274c, 0x0040, 0x2702, 0x0078, | ||
| 760 | 0x26f9, 0x1078, 0x28ec, 0x0040, 0x26f9, 0x1078, 0x271f, 0x0040, | ||
| 761 | 0x2702, 0x017f, 0x8108, 0x157f, 0x00f0, 0x26b2, 0x7093, 0xffff, | ||
| 762 | 0x0078, 0x2705, 0x017f, 0x157f, 0x7192, 0x047f, 0x027f, 0x0c7f, | ||
| 763 | 0x007c, 0x0c7e, 0x017e, 0x7093, 0x0000, 0x2009, 0x007e, 0x1078, | ||
| 764 | 0x4499, 0x00c0, 0x271c, 0x1078, 0x2857, 0x1078, 0x274c, 0x0040, | ||
| 765 | 0x271c, 0x70c8, 0xc0bd, 0x70ca, 0x017f, 0x0c7f, 0x007c, 0x017e, | ||
| 766 | 0x077e, 0x0d7e, 0x0c7e, 0x2c68, 0x2001, 0xa356, 0x2004, 0xa084, | ||
| 767 | 0x00ff, 0x6842, 0x1078, 0x74d7, 0x0040, 0x2747, 0x2d00, 0x601a, | ||
| 768 | 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x442b, 0x2001, 0x0000, | ||
| 769 | 0x1078, 0x443f, 0x127e, 0x2091, 0x8000, 0x708c, 0x8000, 0x708e, | ||
| 770 | 0x127f, 0x2009, 0x0004, 0x1078, 0x756c, 0xa085, 0x0001, 0x0c7f, | ||
| 771 | 0x0d7f, 0x077f, 0x017f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, | ||
| 772 | 0x2c68, 0x2001, 0xa356, 0x2004, 0xa084, 0x00ff, 0x6842, 0x1078, | ||
| 773 | 0x74d7, 0x0040, 0x2785, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, | ||
| 774 | 0x68a0, 0xa086, 0x007e, 0x0040, 0x276e, 0x6804, 0xa084, 0x00ff, | ||
| 775 | 0xa086, 0x0006, 0x00c0, 0x276e, 0x1078, 0x2813, 0x601f, 0x0001, | ||
| 776 | 0x2001, 0x0000, 0x1078, 0x442b, 0x2001, 0x0002, 0x1078, 0x443f, | ||
| 777 | 0x127e, 0x2091, 0x8000, 0x708c, 0x8000, 0x708e, 0x127f, 0x2009, | ||
| 778 | 0x0002, 0x1078, 0x756c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, | ||
| 779 | 0x017f, 0x007c, 0x0c7e, 0x027e, 0x2009, 0x0080, 0x1078, 0x4499, | ||
| 780 | 0x00c0, 0x2798, 0x1078, 0x279b, 0x0040, 0x2798, 0x70cf, 0xffff, | ||
| 781 | 0x027f, 0x0c7f, 0x007c, 0x017e, 0x077e, 0x0d7e, 0x0c7e, 0x2c68, | ||
| 782 | 0x1078, 0x74d7, 0x0040, 0x27bd, 0x2d00, 0x601a, 0x601f, 0x0001, | ||
| 783 | 0x2001, 0x0000, 0x1078, 0x442b, 0x2001, 0x0002, 0x1078, 0x443f, | ||
| 784 | 0x127e, 0x2091, 0x8000, 0x70d0, 0x8000, 0x70d2, 0x127f, 0x2009, | ||
| 785 | 0x0002, 0x1078, 0x756c, 0xa085, 0x0001, 0x0c7f, 0x0d7f, 0x077f, | ||
| 786 | 0x017f, 0x007c, 0x0c7e, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2009, | ||
| 787 | 0x007f, 0x1078, 0x4499, 0x00c0, 0x27de, 0x2c68, 0x1078, 0x74d7, | ||
| 788 | 0x0040, 0x27de, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, | ||
| 789 | 0x2009, 0x0022, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, 0x0d7f, | ||
| 790 | 0x0c7f, 0x007c, 0x0e7e, 0x0c7e, 0x067e, 0x037e, 0x027e, 0x1078, | ||
| 791 | 0x5d60, 0x1078, 0x5d02, 0x1078, 0x7ddf, 0x2130, 0x81ff, 0x0040, | ||
| 792 | 0x27f7, 0x20a9, 0x007e, 0x2009, 0x0000, 0x0078, 0x27fb, 0x20a9, | ||
| 793 | 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x4501, 0x00c0, 0x2804, | ||
| 794 | 0x1078, 0x471b, 0x1078, 0x4235, 0x017f, 0x8108, 0x00f0, 0x27fb, | ||
| 795 | 0x86ff, 0x00c0, 0x280d, 0x1078, 0x119b, 0x027f, 0x037f, 0x067f, | ||
| 796 | 0x0c7f, 0x0e7f, 0x007c, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, | ||
| 797 | 0x6218, 0x2270, 0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x5d53, | ||
| 798 | 0x077e, 0x2039, 0x0000, 0x1078, 0x5c78, 0x2c08, 0x1078, 0x9c38, | ||
| 799 | 0x077f, 0x017f, 0x2e60, 0x1078, 0x471b, 0x6210, 0x6314, 0x1078, | ||
| 800 | 0x4235, 0x6212, 0x6316, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, | ||
| 801 | 0x007c, 0x0e7e, 0x007e, 0x6018, 0xa080, 0x0028, 0x2004, 0xd0bc, | ||
| 802 | 0x00c0, 0x284d, 0x2071, 0xa300, 0x708c, 0xa005, 0x0040, 0x284a, | ||
| 803 | 0x8001, 0x708e, 0x007f, 0x0e7f, 0x007c, 0x2071, 0xa300, 0x70d0, | ||
| 804 | 0xa005, 0x0040, 0x284a, 0x8001, 0x70d2, 0x0078, 0x284a, 0x6000, | ||
| 805 | 0xc08c, 0x6002, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x037e, 0x027e, | ||
| 806 | 0x017e, 0x157e, 0x2178, 0x81ff, 0x00c0, 0x286a, 0x20a9, 0x0001, | ||
| 807 | 0x0078, 0x2885, 0x2001, 0xa352, 0x2004, 0xd0c4, 0x0040, 0x2881, | ||
| 808 | 0xd0a4, 0x0040, 0x2881, 0x047e, 0x6018, 0xa080, 0x0028, 0x2024, | ||
| 809 | 0xa4a4, 0x00ff, 0x8427, 0xa006, 0x2009, 0x002d, 0x1078, 0x9ec0, | ||
| 810 | 0x047f, 0x20a9, 0x00ff, 0x2011, 0x0000, 0x027e, 0xa28e, 0x007e, | ||
| 811 | 0x0040, 0x28c9, 0xa28e, 0x007f, 0x0040, 0x28c9, 0xa28e, 0x0080, | ||
| 812 | 0x0040, 0x28c9, 0xa288, 0xa434, 0x210c, 0x81ff, 0x0040, 0x28c9, | ||
| 813 | 0x8fff, 0x1040, 0x28d5, 0x0c7e, 0x2160, 0x2001, 0x0001, 0x1078, | ||
| 814 | 0x48a2, 0x0c7f, 0x2019, 0x0029, 0x1078, 0x5d53, 0x077e, 0x2039, | ||
| 815 | 0x0000, 0x1078, 0x5c78, 0x0c7e, 0x027e, 0x2160, 0x6204, 0xa294, | ||
| 816 | 0x00ff, 0xa286, 0x0006, 0x00c0, 0x28b9, 0x6007, 0x0404, 0x0078, | ||
| 817 | 0x28be, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, 0x027f, 0x0c7f, | ||
| 818 | 0x017e, 0x2c08, 0x1078, 0x9c38, 0x017f, 0x077f, 0x2160, 0x1078, | ||
| 819 | 0x471b, 0x027f, 0x8210, 0x00f0, 0x2885, 0x157f, 0x017f, 0x027f, | ||
| 820 | 0x037f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x047e, 0x027e, 0x017e, | ||
| 821 | 0x2001, 0xa352, 0x2004, 0xd0c4, 0x0040, 0x28e8, 0xd0a4, 0x0040, | ||
| 822 | 0x28e8, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x1078, 0x9ec0, | ||
| 823 | 0x017f, 0x027f, 0x047f, 0x007c, 0x017e, 0x027e, 0x037e, 0x0c7e, | ||
| 824 | 0x7280, 0x82ff, 0x0040, 0x291a, 0xa290, 0xa352, 0x2214, 0xd2ac, | ||
| 825 | 0x00c0, 0x291a, 0x2100, 0x1078, 0x24fa, 0x81ff, 0x0040, 0x291c, | ||
| 826 | 0x2019, 0x0001, 0x8314, 0xa2e0, 0xa9c0, 0x2c04, 0xd384, 0x0040, | ||
| 827 | 0x290e, 0xa084, 0xff00, 0x8007, 0x0078, 0x2910, 0xa084, 0x00ff, | ||
| 828 | 0xa116, 0x0040, 0x291c, 0xa096, 0x00ff, 0x0040, 0x291a, 0x8318, | ||
| 829 | 0x0078, 0x2902, 0xa085, 0x0001, 0x0c7f, 0x037f, 0x027f, 0x017f, | ||
| 830 | 0x007c, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0xa180, 0xa434, | ||
| 831 | 0x2004, 0xa065, 0x0040, 0x293b, 0x017e, 0x0c7e, 0x1078, 0x8ec0, | ||
| 832 | 0x017f, 0x1040, 0x1328, 0x611a, 0x1078, 0x2813, 0x1078, 0x753d, | ||
| 833 | 0x017f, 0x1078, 0x44bc, 0x127f, 0x0c7f, 0x017f, 0x007c, 0x7eef, | ||
| 834 | 0x7de8, 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, | ||
| 835 | 0x80d6, 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, | ||
| 836 | 0x80cc, 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, | ||
| 837 | 0x80bc, 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, | ||
| 838 | 0x80b1, 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, | ||
| 839 | 0x6da6, 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, | ||
| 840 | 0x6797, 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, | ||
| 841 | 0x617c, 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, | ||
| 842 | 0x8071, 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, | ||
| 843 | 0x5a66, 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, | ||
| 844 | 0x5454, 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, | ||
| 845 | 0x4e4a, 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, | ||
| 846 | 0x8039, 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, | ||
| 847 | 0x472d, 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, | ||
| 848 | 0x4123, 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, | ||
| 849 | 0x3b0f, 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, | ||
| 850 | 0x3700, 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, | ||
| 851 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, | ||
| 852 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, | ||
| 853 | 0x8000, 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, | ||
| 854 | 0x8000, 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, | ||
| 855 | 0x2700, 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, | ||
| 856 | 0x2100, 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, | ||
| 857 | 0x1b00, 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, | ||
| 858 | 0x8000, 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, | ||
| 859 | 0x1400, 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, | ||
| 860 | 0x0e00, 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, | ||
| 861 | 0x0800, 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, | ||
| 862 | 0x0400, 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, | ||
| 863 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, | ||
| 864 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, | ||
| 865 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, | ||
| 866 | 0xa381, 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, | ||
| 867 | 0x7033, 0xa391, 0x7037, 0xa391, 0x7007, 0x0001, 0x2061, 0xa3d1, | ||
| 868 | 0x6003, 0x0002, 0x007c, 0x0090, 0x2a66, 0x0068, 0x2a66, 0x2071, | ||
| 869 | 0xa381, 0x2b78, 0x7818, 0xd084, 0x00c0, 0x2a66, 0x2a60, 0x7820, | ||
| 870 | 0xa08e, 0x0069, 0x00c0, 0x2b56, 0x0079, 0x2aea, 0x007c, 0x2071, | ||
| 871 | 0xa381, 0x7004, 0x0079, 0x2a6c, 0x2a70, 0x2a71, 0x2a7b, 0x2a8d, | ||
| 872 | 0x007c, 0x0090, 0x2a7a, 0x0068, 0x2a7a, 0x2b78, 0x7818, 0xd084, | ||
| 873 | 0x0040, 0x2a99, 0x007c, 0x2b78, 0x2061, 0xa3d1, 0x6008, 0xa08e, | ||
| 874 | 0x0100, 0x0040, 0x2a88, 0xa086, 0x0200, 0x0040, 0x2b4e, 0x007c, | ||
| 875 | 0x7014, 0x2068, 0x2a60, 0x7018, 0x007a, 0x7010, 0x2068, 0x6834, | ||
| 876 | 0xa086, 0x0103, 0x0040, 0x2a95, 0x007c, 0x2a60, 0x2b78, 0x7018, | ||
| 877 | 0x007a, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x00c8, 0x2aa2, 0x61b8, | ||
| 878 | 0x0079, 0x2aaa, 0x2100, 0xa08a, 0x003f, 0x00c8, 0x2b4a, 0x61b8, | ||
| 879 | 0x0079, 0x2aea, 0x2b2c, 0x2b5e, 0x2b66, 0x2b6a, 0x2b72, 0x2b78, | ||
| 880 | 0x2b7c, 0x2b88, 0x2b8c, 0x2b96, 0x2b9a, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 881 | 0x2b9e, 0x2b4a, 0x2bae, 0x2bc5, 0x2bdc, 0x2c58, 0x2c5d, 0x2c8a, | ||
| 882 | 0x2ce4, 0x2cf5, 0x2d13, 0x2d54, 0x2d5e, 0x2d6b, 0x2d7e, 0x2d9d, | ||
| 883 | 0x2da6, 0x2de3, 0x2de9, 0x2b4a, 0x2e05, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 884 | 0x2b4a, 0x2b4a, 0x2e0c, 0x2e16, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 885 | 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2e1e, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 886 | 0x2b4a, 0x2b4a, 0x2e30, 0x2e47, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 887 | 0x2b4a, 0x2b4a, 0x2e59, 0x2eb0, 0x2f0e, 0x2f1f, 0x2b4a, 0x2b4a, | ||
| 888 | 0x2b4a, 0x38f1, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 889 | 0x2b4a, 0x2b4a, 0x2b96, 0x2b9a, 0x2f36, 0x2b4a, 0x2f43, 0x397d, | ||
| 890 | 0x39da, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, | ||
| 891 | 0x2b4a, 0x2b4a, 0x2f90, 0x30c5, 0x30e1, 0x30ed, 0x3150, 0x31a9, | ||
| 892 | 0x31b4, 0x31f3, 0x3202, 0x3211, 0x3214, 0x2f47, 0x3238, 0x3284, | ||
| 893 | 0x3291, 0x33a2, 0x34cd, 0x34f7, 0x3604, 0x3614, 0x3621, 0x365b, | ||
| 894 | 0x372a, 0x2b4a, 0x2b4a, 0x2b4a, 0x2b4a, 0x3792, 0x37ae, 0x3828, | ||
| 895 | 0x38e2, 0x713c, 0x0078, 0x2b2c, 0x2021, 0x4000, 0x1078, 0x3553, | ||
| 896 | 0x127e, 0x2091, 0x8000, 0x0068, 0x2b39, 0x7818, 0xd084, 0x0040, | ||
| 897 | 0x2b3c, 0x127f, 0x0078, 0x2b30, 0x7c22, 0x7926, 0x7a2a, 0x7b2e, | ||
| 898 | 0x781b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, | ||
| 899 | 0x127f, 0x007c, 0x2021, 0x4001, 0x0078, 0x2b2e, 0x2021, 0x4002, | ||
| 900 | 0x0078, 0x2b2e, 0x2021, 0x4003, 0x0078, 0x2b2e, 0x2021, 0x4005, | ||
| 901 | 0x0078, 0x2b2e, 0x2021, 0x4006, 0x0078, 0x2b2e, 0xa02e, 0x2520, | ||
| 902 | 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0078, 0x3562, 0x7823, 0x0004, | ||
| 903 | 0x7824, 0x007a, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, | ||
| 904 | 0x0078, 0x3566, 0x7924, 0x7828, 0x2114, 0x200a, 0x0078, 0x2b2c, | ||
| 905 | 0x7924, 0x2114, 0x0078, 0x2b2c, 0x2099, 0x0009, 0x20a1, 0x0009, | ||
| 906 | 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0078, 0x2b2c, | ||
| 907 | 0x7824, 0x2060, 0x0078, 0x2ba0, 0x2009, 0x0001, 0x2011, 0x0013, | ||
| 908 | 0x2019, 0x0010, 0x783b, 0x0017, 0x0078, 0x2b2c, 0x7d38, 0x7c3c, | ||
| 909 | 0x0078, 0x2b60, 0x7d38, 0x7c3c, 0x0078, 0x2b6c, 0x2061, 0x1000, | ||
| 910 | 0x610c, 0xa006, 0x2c14, 0xa200, 0x8c60, 0x8109, 0x00c0, 0x2ba2, | ||
| 911 | 0x2010, 0xa005, 0x0040, 0x2b2c, 0x0078, 0x2b52, 0x2069, 0xa351, | ||
| 912 | 0x7824, 0x7930, 0xa11a, 0x00c8, 0x2b5a, 0x8019, 0x0040, 0x2b5a, | ||
| 913 | 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, | ||
| 914 | 0x685e, 0x1078, 0x4dbd, 0x0078, 0x2b2c, 0x2069, 0xa351, 0x7824, | ||
| 915 | 0x7934, 0xa11a, 0x00c8, 0x2b5a, 0x8019, 0x0040, 0x2b5a, 0x684e, | ||
| 916 | 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, | ||
| 917 | 0x1078, 0x494d, 0x0078, 0x2b2c, 0xa02e, 0x2520, 0x81ff, 0x00c0, | ||
| 918 | 0x2b56, 0x7924, 0x7b28, 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xa388, | ||
| 919 | 0x41a1, 0x1078, 0x3518, 0x0040, 0x2b56, 0x2009, 0x0020, 0x1078, | ||
| 920 | 0x3562, 0x701b, 0x2bf4, 0x007c, 0x6834, 0x2008, 0xa084, 0x00ff, | ||
| 921 | 0xa096, 0x0011, 0x0040, 0x2c00, 0xa096, 0x0019, 0x00c0, 0x2b56, | ||
| 922 | 0x810f, 0xa18c, 0x00ff, 0x0040, 0x2b56, 0x710e, 0x700c, 0x8001, | ||
| 923 | 0x0040, 0x2c31, 0x700e, 0x1078, 0x3518, 0x0040, 0x2b56, 0x2009, | ||
| 924 | 0x0020, 0x2061, 0xa3d1, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, | ||
| 925 | 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x1078, | ||
| 926 | 0x3562, 0x701b, 0x2c24, 0x007c, 0x6834, 0xa084, 0x00ff, 0xa096, | ||
| 927 | 0x0002, 0x0040, 0x2c2f, 0xa096, 0x000a, 0x00c0, 0x2b56, 0x0078, | ||
| 928 | 0x2c06, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x436e, | ||
| 929 | 0x00c0, 0x2c3f, 0x7007, 0x0003, 0x701b, 0x2c41, 0x007c, 0x1078, | ||
| 930 | 0x4a60, 0x127e, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, 0xa388, | ||
| 931 | 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, | ||
| 932 | 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x127f, 0x0078, 0x3566, | ||
| 933 | 0x61a0, 0x7824, 0x60a2, 0x0078, 0x2b2c, 0x2091, 0x8000, 0x7823, | ||
| 934 | 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, | ||
| 935 | 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, | ||
| 936 | 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, | ||
| 937 | 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, | ||
| 938 | 0x2071, 0x0010, 0x20c1, 0x00f0, 0xa08a, 0x0003, 0x00c8, 0x0427, | ||
| 939 | 0x0078, 0x0423, 0x81ff, 0x00c0, 0x2b56, 0x7924, 0x810f, 0xa18c, | ||
| 940 | 0x00ff, 0x1078, 0x4501, 0x00c0, 0x2b5a, 0x7e38, 0xa684, 0x3fff, | ||
| 941 | 0xa082, 0x4000, 0x0048, 0x2c9e, 0x0078, 0x2b5a, 0x7c28, 0x7d2c, | ||
| 942 | 0x1078, 0x46d6, 0xd28c, 0x00c0, 0x2ca9, 0x1078, 0x466a, 0x0078, | ||
| 943 | 0x2cab, 0x1078, 0x46a4, 0x00c0, 0x2cd5, 0x2061, 0xaa00, 0x127e, | ||
| 944 | 0x2091, 0x8000, 0x6000, 0xa086, 0x0000, 0x0040, 0x2cc3, 0x6010, | ||
| 945 | 0xa06d, 0x0040, 0x2cc3, 0x683c, 0xa406, 0x00c0, 0x2cc3, 0x6840, | ||
| 946 | 0xa506, 0x0040, 0x2cce, 0x127f, 0xace0, 0x0010, 0x2001, 0xa315, | ||
| 947 | 0x2004, 0xac02, 0x00c8, 0x2b56, 0x0078, 0x2caf, 0x1078, 0x8758, | ||
| 948 | 0x127f, 0x0040, 0x2b56, 0x0078, 0x2b2c, 0xa00e, 0x2001, 0x0005, | ||
| 949 | 0x1078, 0x4a60, 0x127e, 0x2091, 0x8000, 0x1078, 0x8cc0, 0x1078, | ||
| 950 | 0x4982, 0x127f, 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, 0x1078, | ||
| 951 | 0x3530, 0x0040, 0x2b5a, 0x1078, 0x45a7, 0x0040, 0x2b56, 0x1078, | ||
| 952 | 0x46e4, 0x0040, 0x2b56, 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, | ||
| 953 | 0x1078, 0x3542, 0x0040, 0x2b5a, 0x1078, 0x475f, 0x0040, 0x2b56, | ||
| 954 | 0x2019, 0x0005, 0x1078, 0x4705, 0x0040, 0x2b56, 0x7828, 0xa08a, | ||
| 955 | 0x1000, 0x00c8, 0x2b5a, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, | ||
| 956 | 0x58e1, 0x0078, 0x2b2c, 0x127e, 0x2091, 0x8000, 0x81ff, 0x0040, | ||
| 957 | 0x2d1d, 0x2009, 0x0001, 0x0078, 0x2d4e, 0x2029, 0x00ff, 0x644c, | ||
| 958 | 0x2400, 0xa506, 0x0040, 0x2d48, 0x2508, 0x1078, 0x4501, 0x00c0, | ||
| 959 | 0x2d48, 0x1078, 0x475f, 0x00c0, 0x2d33, 0x2009, 0x0002, 0x62a8, | ||
| 960 | 0x2518, 0x0078, 0x2d4e, 0x2019, 0x0004, 0x1078, 0x4705, 0x00c0, | ||
| 961 | 0x2d3d, 0x2009, 0x0006, 0x0078, 0x2d4e, 0x7824, 0xa08a, 0x1000, | ||
| 962 | 0x00c8, 0x2d51, 0x8003, 0x800b, 0x810b, 0xa108, 0x1078, 0x58e1, | ||
| 963 | 0x8529, 0x00c8, 0x2d20, 0x127f, 0x0078, 0x2b2c, 0x127f, 0x0078, | ||
| 964 | 0x2b56, 0x127f, 0x0078, 0x2b5a, 0x1078, 0x3530, 0x0040, 0x2b5a, | ||
| 965 | 0x1078, 0x461b, 0x1078, 0x46d6, 0x0078, 0x2b2c, 0x81ff, 0x00c0, | ||
| 966 | 0x2b56, 0x1078, 0x3530, 0x0040, 0x2b5a, 0x1078, 0x460a, 0x1078, | ||
| 967 | 0x46d6, 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x3530, | ||
| 968 | 0x0040, 0x2b5a, 0x1078, 0x46a7, 0x0040, 0x2b56, 0x1078, 0x43c1, | ||
| 969 | 0x1078, 0x4663, 0x1078, 0x46d6, 0x0078, 0x2b2c, 0x1078, 0x3530, | ||
| 970 | 0x0040, 0x2b5a, 0x1078, 0x45a7, 0x0040, 0x2b56, 0x62a0, 0x2019, | ||
| 971 | 0x0005, 0x0c7e, 0x1078, 0x471b, 0x0c7f, 0x1078, 0x5d53, 0x077e, | ||
| 972 | 0x2039, 0x0000, 0x1078, 0x5c78, 0x2009, 0x0000, 0x1078, 0x9c38, | ||
| 973 | 0x077f, 0x1078, 0x46d6, 0x0078, 0x2b2c, 0x1078, 0x3530, 0x0040, | ||
| 974 | 0x2b5a, 0x1078, 0x46d6, 0x2208, 0x0078, 0x2b2c, 0x157e, 0x0d7e, | ||
| 975 | 0x0e7e, 0x2069, 0xa413, 0x6810, 0x6914, 0xa10a, 0x00c8, 0x2db2, | ||
| 976 | 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, | ||
| 977 | 0x00ff, 0x2069, 0xa434, 0x2d04, 0xa075, 0x0040, 0x2dc7, 0x704c, | ||
| 978 | 0x1078, 0x2dd1, 0xa210, 0x7080, 0x1078, 0x2dd1, 0xa318, 0x8d68, | ||
| 979 | 0x00f0, 0x2dbb, 0x2300, 0xa218, 0x0e7f, 0x0d7f, 0x157f, 0x0078, | ||
| 980 | 0x2b2c, 0x0f7e, 0x017e, 0xa07d, 0x0040, 0x2de0, 0x2001, 0x0000, | ||
| 981 | 0x8000, 0x2f0c, 0x81ff, 0x0040, 0x2de0, 0x2178, 0x0078, 0x2dd8, | ||
| 982 | 0x017f, 0x0f7f, 0x007c, 0x2069, 0xa413, 0x6910, 0x62a4, 0x0078, | ||
| 983 | 0x2b2c, 0x81ff, 0x00c0, 0x2b56, 0x614c, 0xa190, 0x293f, 0x2214, | ||
| 984 | 0xa294, 0x00ff, 0x606c, 0xa084, 0xff00, 0xa215, 0x6368, 0x67c8, | ||
| 985 | 0xd79c, 0x0040, 0x2dff, 0x2031, 0x0001, 0x0078, 0x2e01, 0x2031, | ||
| 986 | 0x0000, 0x7e3a, 0x7f3e, 0x0078, 0x2b2c, 0x613c, 0x6240, 0x2019, | ||
| 987 | 0xa5a0, 0x231c, 0x0078, 0x2b2c, 0x127e, 0x2091, 0x8000, 0x6134, | ||
| 988 | 0xa006, 0x2010, 0x2018, 0x127f, 0x0078, 0x2b2c, 0x1078, 0x3542, | ||
| 989 | 0x0040, 0x2b5a, 0x6244, 0x6338, 0x0078, 0x2b2c, 0x613c, 0x6240, | ||
| 990 | 0x7824, 0x603e, 0x7b28, 0x6342, 0x2069, 0xa351, 0x831f, 0xa305, | ||
| 991 | 0x6816, 0x782c, 0x2069, 0xa5a0, 0x2d1c, 0x206a, 0x0078, 0x2b2c, | ||
| 992 | 0x017e, 0x127e, 0x2091, 0x8000, 0x7824, 0x6036, 0xd094, 0x0040, | ||
| 993 | 0x2e43, 0x7828, 0xa085, 0x0001, 0x2009, 0xa5a9, 0x200a, 0x2001, | ||
| 994 | 0xffff, 0x1078, 0x5975, 0x127f, 0x017f, 0x0078, 0x2b2c, 0x1078, | ||
| 995 | 0x3542, 0x0040, 0x2b5a, 0x7828, 0xa00d, 0x0040, 0x2b5a, 0x782c, | ||
| 996 | 0xa005, 0x0040, 0x2b5a, 0x6244, 0x6146, 0x6338, 0x603a, 0x0078, | ||
| 997 | 0x2b2c, 0x2001, 0xa300, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2b56, | ||
| 998 | 0x0c7e, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, | ||
| 999 | 0x00ff, 0x00c0, 0x2e70, 0x6030, 0xa085, 0xff00, 0x0078, 0x2e7f, | ||
| 1000 | 0xa182, 0x007f, 0x00c8, 0x2ea9, 0xa188, 0x293f, 0x210c, 0xa18c, | ||
| 1001 | 0x00ff, 0x6030, 0xa116, 0x0040, 0x2ea9, 0x810f, 0xa105, 0x127e, | ||
| 1002 | 0x2091, 0x8000, 0x007e, 0x1078, 0x74d7, 0x007f, 0x0040, 0x2ea5, | ||
| 1003 | 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x1078, 0x3518, 0x0040, | ||
| 1004 | 0x2eac, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, | ||
| 1005 | 0xc0fd, 0x683a, 0x701b, 0x2f07, 0x2d00, 0x6012, 0x2009, 0x0032, | ||
| 1006 | 0x1078, 0x756c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, | ||
| 1007 | 0x2b56, 0x0c7f, 0x0078, 0x2b5a, 0x1078, 0x753d, 0x0078, 0x2ea5, | ||
| 1008 | 0x2001, 0xa300, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2b56, 0x0c7e, | ||
| 1009 | 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, | ||
| 1010 | 0x00c0, 0x2ec7, 0x6030, 0xa085, 0xff00, 0x0078, 0x2ed6, 0xa182, | ||
| 1011 | 0x007f, 0x00c8, 0x2f00, 0xa188, 0x293f, 0x210c, 0xa18c, 0x00ff, | ||
| 1012 | 0x6030, 0xa116, 0x0040, 0x2f00, 0x810f, 0xa105, 0x127e, 0x2091, | ||
| 1013 | 0x8000, 0x007e, 0x1078, 0x74d7, 0x007f, 0x0040, 0x2efc, 0x601a, | ||
| 1014 | 0x600b, 0xbc05, 0x601f, 0x0001, 0x1078, 0x3518, 0x0040, 0x2f03, | ||
| 1015 | 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, | ||
| 1016 | 0x683a, 0x701b, 0x2f07, 0x2d00, 0x6012, 0x2009, 0x0032, 0x1078, | ||
| 1017 | 0x756c, 0x127f, 0x0c7f, 0x007c, 0x127f, 0x0c7f, 0x0078, 0x2b56, | ||
| 1018 | 0x0c7f, 0x0078, 0x2b5a, 0x1078, 0x753d, 0x0078, 0x2efc, 0x6830, | ||
| 1019 | 0xa086, 0x0100, 0x0040, 0x2b56, 0x0078, 0x2b2c, 0x2061, 0xa62d, | ||
| 1020 | 0x127e, 0x2091, 0x8000, 0x6000, 0xd084, 0x0040, 0x2f1c, 0x6104, | ||
| 1021 | 0x6208, 0x127f, 0x0078, 0x2b2c, 0x127f, 0x0078, 0x2b5a, 0x81ff, | ||
| 1022 | 0x00c0, 0x2b56, 0x127e, 0x2091, 0x8000, 0x6244, 0x6060, 0xa202, | ||
| 1023 | 0x0048, 0x2f33, 0xa085, 0x0001, 0x1078, 0x2500, 0x1078, 0x3bf5, | ||
| 1024 | 0x127f, 0x0078, 0x2b2c, 0x127f, 0x0078, 0x2b5a, 0x127e, 0x2091, | ||
| 1025 | 0x8000, 0x20a9, 0x0011, 0x2001, 0xa340, 0x20a0, 0xa006, 0x40a4, | ||
| 1026 | 0x127f, 0x0078, 0x2b2c, 0x7d38, 0x7c3c, 0x0078, 0x2bde, 0x7824, | ||
| 1027 | 0xa09c, 0x00ff, 0xa39a, 0x0003, 0x00c8, 0x2b56, 0x624c, 0xa084, | ||
| 1028 | 0xff00, 0x8007, 0xa206, 0x00c0, 0x2f5f, 0x2001, 0xa340, 0x2009, | ||
| 1029 | 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x3566, 0x81ff, | ||
| 1030 | 0x00c0, 0x2b56, 0x1078, 0x3542, 0x0040, 0x2b5a, 0x6004, 0xa084, | ||
| 1031 | 0x00ff, 0xa086, 0x0006, 0x00c0, 0x2b56, 0x0c7e, 0x1078, 0x3518, | ||
| 1032 | 0x0c7f, 0x0040, 0x2b56, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, | ||
| 1033 | 0x1078, 0x8b85, 0x0040, 0x2b56, 0x7007, 0x0003, 0x701b, 0x2f81, | ||
| 1034 | 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, 0x2b56, 0xad80, 0x000e, | ||
| 1035 | 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, 0x3566, | ||
| 1036 | 0x1078, 0x3518, 0x0040, 0x2b56, 0x1078, 0x421a, 0x2009, 0x001c, | ||
| 1037 | 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3562, 0x701b, 0x2fa1, | ||
| 1038 | 0x007c, 0xade8, 0x000d, 0x6800, 0xa005, 0x0040, 0x2b5a, 0x6804, | ||
| 1039 | 0xd0ac, 0x0040, 0x2fae, 0xd0a4, 0x0040, 0x2b5a, 0xd094, 0x0040, | ||
| 1040 | 0x2fb9, 0x0c7e, 0x2061, 0x0100, 0x6104, 0xa18c, 0xffdf, 0x6106, | ||
| 1041 | 0x0c7f, 0xd08c, 0x0040, 0x2fc4, 0x0c7e, 0x2061, 0x0100, 0x6104, | ||
| 1042 | 0xa18d, 0x0010, 0x6106, 0x0c7f, 0x2009, 0x0100, 0x210c, 0xa18a, | ||
| 1043 | 0x0002, 0x0048, 0x2fd9, 0xd084, 0x0040, 0x2fd9, 0x6a28, 0xa28a, | ||
| 1044 | 0x007f, 0x00c8, 0x2b5a, 0xa288, 0x293f, 0x210c, 0xa18c, 0x00ff, | ||
| 1045 | 0x6152, 0xd0dc, 0x0040, 0x2fe2, 0x6828, 0xa08a, 0x007f, 0x00c8, | ||
| 1046 | 0x2b5a, 0x604e, 0x6808, 0xa08a, 0x0100, 0x0048, 0x2b5a, 0xa08a, | ||
| 1047 | 0x0841, 0x00c8, 0x2b5a, 0xa084, 0x0007, 0x00c0, 0x2b5a, 0x680c, | ||
| 1048 | 0xa005, 0x0040, 0x2b5a, 0x6810, 0xa005, 0x0040, 0x2b5a, 0x6848, | ||
| 1049 | 0x6940, 0xa10a, 0x00c8, 0x2b5a, 0x8001, 0x0040, 0x2b5a, 0x684c, | ||
| 1050 | 0x6944, 0xa10a, 0x00c8, 0x2b5a, 0x8001, 0x0040, 0x2b5a, 0x6804, | ||
| 1051 | 0xd0fc, 0x0040, 0x3038, 0x1078, 0x3518, 0x0040, 0x2b56, 0x2009, | ||
| 1052 | 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399, | ||
| 1053 | 0x0000, 0x1078, 0x3562, 0x701b, 0x301e, 0x007c, 0xade8, 0x000d, | ||
| 1054 | 0x20a9, 0x0014, 0x2d98, 0x2069, 0xa36d, 0x2da0, 0x53a3, 0x7010, | ||
| 1055 | 0xa0e8, 0x000d, 0x2001, 0xa371, 0x200c, 0xd1e4, 0x0040, 0x3038, | ||
| 1056 | 0x0c7e, 0x2061, 0x0100, 0x6004, 0xa085, 0x0b00, 0x6006, 0x0c7f, | ||
| 1057 | 0x20a9, 0x001c, 0x2d98, 0x2069, 0xa351, 0x2da0, 0x53a3, 0x6814, | ||
| 1058 | 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084, 0x00ff, 0x6042, 0x1078, | ||
| 1059 | 0x4dbd, 0x1078, 0x48dd, 0x1078, 0x494d, 0x6000, 0xa086, 0x0000, | ||
| 1060 | 0x00c0, 0x30c3, 0x6808, 0x602a, 0x1078, 0x218b, 0x6818, 0x691c, | ||
| 1061 | 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, | ||
| 1062 | 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0040, 0x3070, 0x6830, 0x6934, | ||
| 1063 | 0x6a38, 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0078, 0x3072, | ||
| 1064 | 0xa084, 0xf0ff, 0x6006, 0x610a, 0x620e, 0x6312, 0x1078, 0x59a8, | ||
| 1065 | 0x6904, 0xd1fc, 0x0040, 0x30a5, 0x0c7e, 0x2009, 0x0000, 0x20a9, | ||
| 1066 | 0x0001, 0x6b70, 0xd384, 0x0040, 0x30a2, 0x0078, 0x308c, 0x839d, | ||
| 1067 | 0x00c8, 0x30a2, 0x3508, 0x8109, 0x1078, 0x5364, 0x6878, 0x6016, | ||
| 1068 | 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a, 0xa184, 0x00ff, | ||
| 1069 | 0x6006, 0x8108, 0x00c0, 0x30a0, 0x6003, 0x0003, 0x0078, 0x30a2, | ||
| 1070 | 0x6003, 0x0001, 0x00f0, 0x3087, 0x0c7f, 0x0c7e, 0x2061, 0x0100, | ||
| 1071 | 0x602f, 0x0040, 0x602f, 0x0000, 0x0c7f, 0x1078, 0x3784, 0x0040, | ||
| 1072 | 0x30b3, 0x1078, 0x2500, 0x60bc, 0xa005, 0x0040, 0x30bf, 0x6003, | ||
| 1073 | 0x0001, 0x2091, 0x301d, 0x1078, 0x4171, 0x0078, 0x30c3, 0x6003, | ||
| 1074 | 0x0004, 0x2091, 0x301d, 0x0078, 0x2b2c, 0x6000, 0xa086, 0x0000, | ||
| 1075 | 0x0040, 0x2b56, 0x2069, 0xa351, 0x7830, 0x6842, 0x7834, 0x6846, | ||
| 1076 | 0x6804, 0xd0fc, 0x0040, 0x30d8, 0x2009, 0x0030, 0x0078, 0x30da, | ||
| 1077 | 0x2009, 0x001c, 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, | ||
| 1078 | 0x3566, 0xa006, 0x1078, 0x2500, 0x81ff, 0x00c0, 0x2b56, 0x1078, | ||
| 1079 | 0x421a, 0x1078, 0x4171, 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, | ||
| 1080 | 0x6180, 0x81ff, 0x0040, 0x3107, 0x703f, 0x0000, 0x2001, 0xa9c0, | ||
| 1081 | 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x127e, 0x2091, | ||
| 1082 | 0x8000, 0x1078, 0x3566, 0x701b, 0x2b29, 0x127f, 0x007c, 0x703f, | ||
| 1083 | 0x0001, 0x0d7e, 0x2069, 0xa9c0, 0x20a9, 0x0040, 0x20a1, 0xa9c0, | ||
| 1084 | 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588, 0x293f, 0x210c, 0xa18c, | ||
| 1085 | 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x0040, | ||
| 1086 | 0x3139, 0x1078, 0x4501, 0x00c0, 0x3139, 0x6014, 0x821c, 0x0048, | ||
| 1087 | 0x3131, 0xa398, 0xa9c0, 0xa085, 0xff00, 0x8007, 0x201a, 0x0078, | ||
| 1088 | 0x3138, 0xa398, 0xa9c0, 0x2324, 0xa4a4, 0xff00, 0xa405, 0x201a, | ||
| 1089 | 0x8210, 0x8108, 0xa182, 0x0080, 0x00c8, 0x3140, 0x0078, 0x311d, | ||
| 1090 | 0x8201, 0x8007, 0x2d0c, 0xa105, 0x206a, 0x0d7f, 0x20a9, 0x0040, | ||
| 1091 | 0x20a1, 0xa9c0, 0x2099, 0xa9c0, 0x1078, 0x41be, 0x0078, 0x30f6, | ||
| 1092 | 0x1078, 0x3542, 0x0040, 0x2b5a, 0x0c7e, 0x1078, 0x3518, 0x0c7f, | ||
| 1093 | 0x00c0, 0x315e, 0x2009, 0x0002, 0x0078, 0x2b56, 0x2001, 0xa352, | ||
| 1094 | 0x2004, 0xd0b4, 0x0040, 0x3185, 0x6000, 0xd08c, 0x00c0, 0x3185, | ||
| 1095 | 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x3185, 0x6837, | ||
| 1096 | 0x0000, 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8bd9, 0x00c0, 0x317c, | ||
| 1097 | 0x2009, 0x0003, 0x0078, 0x2b56, 0x7007, 0x0003, 0x701b, 0x3181, | ||
| 1098 | 0x007c, 0x1078, 0x3542, 0x0040, 0x2b5a, 0x20a9, 0x002b, 0x2c98, | ||
| 1099 | 0xade8, 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, | ||
| 1100 | 0x2098, 0xad80, 0x0006, 0x20a0, 0x1078, 0x41be, 0x20a9, 0x0004, | ||
| 1101 | 0xac80, 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x1078, 0x41be, | ||
| 1102 | 0x2d00, 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0078, | ||
| 1103 | 0x3566, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x3530, 0x0040, 0x2b5a, | ||
| 1104 | 0x1078, 0x46ef, 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, 0x7828, | ||
| 1105 | 0xa08a, 0x1000, 0x00c8, 0x2b5a, 0x1078, 0x3542, 0x0040, 0x2b5a, | ||
| 1106 | 0x1078, 0x475f, 0x0040, 0x2b56, 0x2019, 0x0004, 0x1078, 0x4705, | ||
| 1107 | 0x7924, 0x810f, 0x7a28, 0x1078, 0x31cf, 0x0078, 0x2b2c, 0xa186, | ||
| 1108 | 0x00ff, 0x0040, 0x31d7, 0x1078, 0x31e7, 0x0078, 0x31e6, 0x2029, | ||
| 1109 | 0x007e, 0x2061, 0xa300, 0x644c, 0x2400, 0xa506, 0x0040, 0x31e3, | ||
| 1110 | 0x2508, 0x1078, 0x31e7, 0x8529, 0x00c8, 0x31dc, 0x007c, 0x1078, | ||
| 1111 | 0x4501, 0x00c0, 0x31f2, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, | ||
| 1112 | 0x1078, 0x58e1, 0x007c, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x3530, | ||
| 1113 | 0x0040, 0x2b5a, 0x1078, 0x45a7, 0x0040, 0x2b56, 0x1078, 0x46fa, | ||
| 1114 | 0x0078, 0x2b2c, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x3530, 0x0040, | ||
| 1115 | 0x2b5a, 0x1078, 0x45a7, 0x0040, 0x2b56, 0x1078, 0x46e4, 0x0078, | ||
| 1116 | 0x2b2c, 0x6100, 0x0078, 0x2b2c, 0x1078, 0x3542, 0x0040, 0x2b5a, | ||
| 1117 | 0x2001, 0xa300, 0x2004, 0xa086, 0x0003, 0x00c0, 0x2b56, 0x0d7e, | ||
| 1118 | 0xace8, 0x000a, 0x7924, 0xd184, 0x0040, 0x3228, 0xace8, 0x0006, | ||
| 1119 | 0x680c, 0x8007, 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, | ||
| 1120 | 0x6a00, 0x8217, 0x0d7f, 0x6100, 0xa18c, 0x0200, 0x0078, 0x2b2c, | ||
| 1121 | 0xa006, 0x1078, 0x2500, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, | ||
| 1122 | 0x0040, 0x3245, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x421a, 0x7828, | ||
| 1123 | 0xa08a, 0x1000, 0x00c8, 0x2b5a, 0x7924, 0xa18c, 0xff00, 0x810f, | ||
| 1124 | 0xa186, 0x00ff, 0x0040, 0x325b, 0xa182, 0x007f, 0x00c8, 0x2b5a, | ||
| 1125 | 0x2100, 0x1078, 0x24fa, 0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, | ||
| 1126 | 0x2061, 0xa5be, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0x0100, | ||
| 1127 | 0x6030, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, | ||
| 1128 | 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4196, 0x1078, 0x596c, | ||
| 1129 | 0x7924, 0xa18c, 0xff00, 0x810f, 0x7a28, 0x1078, 0x31cf, 0x127f, | ||
| 1130 | 0x0c7f, 0x027f, 0x0078, 0x2b2c, 0x7924, 0xa18c, 0xff00, 0x810f, | ||
| 1131 | 0x0c7e, 0x1078, 0x4499, 0x2c08, 0x0c7f, 0x00c0, 0x2b5a, 0x0078, | ||
| 1132 | 0x2b2c, 0x81ff, 0x0040, 0x3298, 0x2009, 0x0001, 0x0078, 0x2b56, | ||
| 1133 | 0x60c8, 0xd09c, 0x00c0, 0x32a0, 0x2009, 0x0005, 0x0078, 0x2b56, | ||
| 1134 | 0x1078, 0x3518, 0x00c0, 0x32a8, 0x2009, 0x0002, 0x0078, 0x2b56, | ||
| 1135 | 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3562, 0x701b, | ||
| 1136 | 0x32b2, 0x007c, 0x2009, 0x0080, 0x1078, 0x4501, 0x00c0, 0x32bf, | ||
| 1137 | 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, 0x32c3, 0x2021, | ||
| 1138 | 0x400a, 0x0078, 0x2b2e, 0x0d7e, 0xade8, 0x000d, 0x6900, 0x6a08, | ||
| 1139 | 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0040, | ||
| 1140 | 0x3336, 0xa0be, 0x0112, 0x0040, 0x3336, 0xa0be, 0x0113, 0x0040, | ||
| 1141 | 0x3336, 0xa0be, 0x0114, 0x0040, 0x3336, 0xa0be, 0x0117, 0x0040, | ||
| 1142 | 0x3336, 0xa0be, 0x011a, 0x0040, 0x3336, 0xa0be, 0x0121, 0x0040, | ||
| 1143 | 0x332c, 0xa0be, 0x0131, 0x0040, 0x332c, 0xa0be, 0x0171, 0x0040, | ||
| 1144 | 0x3336, 0xa0be, 0x0173, 0x0040, 0x3336, 0xa0be, 0x01a1, 0x00c0, | ||
| 1145 | 0x32fe, 0x6830, 0x8007, 0x6832, 0x0078, 0x333c, 0xa0be, 0x0212, | ||
| 1146 | 0x0040, 0x3332, 0xa0be, 0x0213, 0x0040, 0x3332, 0xa0be, 0x0214, | ||
| 1147 | 0x0040, 0x3324, 0xa0be, 0x0217, 0x0040, 0x331e, 0xa0be, 0x021a, | ||
| 1148 | 0x00c0, 0x3317, 0x6838, 0x8007, 0x683a, 0x0078, 0x3336, 0xa0be, | ||
| 1149 | 0x0300, 0x0040, 0x3336, 0x0d7f, 0x0078, 0x2b5a, 0xad80, 0x0010, | ||
| 1150 | 0x20a9, 0x0007, 0x1078, 0x337e, 0xad80, 0x000e, 0x20a9, 0x0001, | ||
| 1151 | 0x1078, 0x337e, 0x0078, 0x3336, 0xad80, 0x000c, 0x1078, 0x338c, | ||
| 1152 | 0x0078, 0x333c, 0xad80, 0x000e, 0x1078, 0x338c, 0xad80, 0x000c, | ||
| 1153 | 0x20a9, 0x0001, 0x1078, 0x337e, 0x0c7e, 0x1078, 0x3518, 0x0040, | ||
| 1154 | 0x336f, 0x6838, 0xc0fd, 0x683a, 0x6837, 0x0119, 0x6853, 0x0000, | ||
| 1155 | 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, 0x697e, 0x6883, 0x0000, | ||
| 1156 | 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, 0x689b, 0x0000, 0x0c7f, | ||
| 1157 | 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, | ||
| 1158 | 0x6804, 0x2068, 0x1078, 0x8ba1, 0x00c0, 0x336a, 0x2009, 0x0003, | ||
| 1159 | 0x0078, 0x2b56, 0x7007, 0x0003, 0x701b, 0x3375, 0x007c, 0x0c7f, | ||
| 1160 | 0x0d7f, 0x2009, 0x0002, 0x0078, 0x2b56, 0x6820, 0xa086, 0x8001, | ||
| 1161 | 0x00c0, 0x2b2c, 0x2009, 0x0004, 0x0078, 0x2b56, 0x017e, 0x2008, | ||
| 1162 | 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, 0x280a, 0x8108, | ||
| 1163 | 0x00f0, 0x3380, 0x017f, 0x007c, 0x017e, 0x0a7e, 0x0b7e, 0x2008, | ||
| 1164 | 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000, 0x205c, 0x2b0a, | ||
| 1165 | 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, 0x0b7f, 0x0a7f, | ||
| 1166 | 0x017f, 0x007c, 0x81ff, 0x0040, 0x33a9, 0x2009, 0x0001, 0x0078, | ||
| 1167 | 0x2b56, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, | ||
| 1168 | 0x0048, 0x2b5a, 0xa182, 0x00ff, 0x00c8, 0x2b5a, 0x7a2c, 0x7b28, | ||
| 1169 | 0x6068, 0xa306, 0x00c0, 0x33c4, 0x606c, 0xa24e, 0x0040, 0x2b5a, | ||
| 1170 | 0xa9cc, 0xff00, 0x0040, 0x2b5a, 0x0c7e, 0x1078, 0x346d, 0x2c68, | ||
| 1171 | 0x0c7f, 0x0040, 0x33fc, 0xa0c6, 0x4000, 0x00c0, 0x33e2, 0x0c7e, | ||
| 1172 | 0x007e, 0x2d60, 0x2009, 0x0000, 0x1078, 0x47cb, 0x00c0, 0x33d9, | ||
| 1173 | 0xc185, 0x6000, 0xd0bc, 0x0040, 0x33de, 0xc18d, 0x007f, 0x0c7f, | ||
| 1174 | 0x0078, 0x33f9, 0xa0c6, 0x4007, 0x00c0, 0x33e9, 0x2408, 0x0078, | ||
| 1175 | 0x33f9, 0xa0c6, 0x4008, 0x00c0, 0x33f1, 0x2708, 0x2610, 0x0078, | ||
| 1176 | 0x33f9, 0xa0c6, 0x4009, 0x00c0, 0x33f7, 0x0078, 0x33f9, 0x2001, | ||
| 1177 | 0x4006, 0x2020, 0x0078, 0x2b2e, 0x2d00, 0x7022, 0x017e, 0x0b7e, | ||
| 1178 | 0x0c7e, 0x0e7e, 0x2c70, 0x1078, 0x74d7, 0x0040, 0x3442, 0x2d00, | ||
| 1179 | 0x601a, 0x2001, 0xa356, 0x2004, 0xa084, 0x00ff, 0x6842, 0x2e58, | ||
| 1180 | 0x0e7f, 0x0e7e, 0x0c7e, 0x1078, 0x3518, 0x0c7f, 0x2b70, 0x00c0, | ||
| 1181 | 0x3423, 0x1078, 0x753d, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x2009, | ||
| 1182 | 0x0002, 0x0078, 0x2b56, 0x6837, 0x0000, 0x2d00, 0x6012, 0x6833, | ||
| 1183 | 0x0000, 0x6838, 0xc0fd, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, | ||
| 1184 | 0x2813, 0x127f, 0x601f, 0x0001, 0x2001, 0x0000, 0x1078, 0x442b, | ||
| 1185 | 0x2001, 0x0002, 0x1078, 0x443f, 0x2009, 0x0002, 0x1078, 0x756c, | ||
| 1186 | 0xa085, 0x0001, 0x0e7f, 0x0c7f, 0x0b7f, 0x017f, 0x00c0, 0x344c, | ||
| 1187 | 0x2009, 0x0003, 0x0078, 0x2b56, 0x7007, 0x0003, 0x701b, 0x3451, | ||
| 1188 | 0x007c, 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, 0x00c0, 0x345f, | ||
| 1189 | 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0078, 0x2b56, 0x2009, | ||
| 1190 | 0x0000, 0x1078, 0x47cb, 0x00c0, 0x3466, 0xc185, 0x6000, 0xd0bc, | ||
| 1191 | 0x0040, 0x346b, 0xc18d, 0x0078, 0x2b2c, 0x0e7e, 0x0d7e, 0x2029, | ||
| 1192 | 0x0000, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0xa4b4, 0x2e04, | ||
| 1193 | 0xa005, 0x00c0, 0x3482, 0x2100, 0xa406, 0x00c0, 0x34b3, 0x2428, | ||
| 1194 | 0x0078, 0x34b3, 0x2068, 0x6f10, 0x2700, 0xa306, 0x00c0, 0x34a4, | ||
| 1195 | 0x6e14, 0x2600, 0xa206, 0x00c0, 0x34a4, 0x2400, 0xa106, 0x00c0, | ||
| 1196 | 0x34a0, 0x2d60, 0xd884, 0x0040, 0x34c8, 0x6004, 0xa084, 0x00ff, | ||
| 1197 | 0xa086, 0x0006, 0x00c0, 0x34c8, 0x2001, 0x4000, 0x0078, 0x34c9, | ||
| 1198 | 0x2001, 0x4007, 0x0078, 0x34c9, 0x2400, 0xa106, 0x00c0, 0x34b3, | ||
| 1199 | 0x6e14, 0x87ff, 0x00c0, 0x34af, 0x86ff, 0x0040, 0x347f, 0x2001, | ||
| 1200 | 0x4008, 0x0078, 0x34c9, 0x8420, 0x8e70, 0x00f0, 0x3477, 0x85ff, | ||
| 1201 | 0x00c0, 0x34c2, 0x2001, 0x4009, 0x0078, 0x34c9, 0x2001, 0x0001, | ||
| 1202 | 0x0078, 0x34c9, 0x1078, 0x4499, 0x00c0, 0x34be, 0x6312, 0x6216, | ||
| 1203 | 0xa006, 0xa005, 0x0d7f, 0x0e7f, 0x007c, 0x81ff, 0x00c0, 0x2b56, | ||
| 1204 | 0x1078, 0x3518, 0x0040, 0x2b56, 0x6837, 0x0000, 0x6838, 0xc0fd, | ||
| 1205 | 0x683a, 0x7824, 0xa005, 0x0040, 0x2b5a, 0xa096, 0x00ff, 0x0040, | ||
| 1206 | 0x34e5, 0xa092, 0x0004, 0x00c8, 0x2b5a, 0x2010, 0x2d18, 0x1078, | ||
| 1207 | 0x27c2, 0x0040, 0x2b56, 0x7007, 0x0003, 0x701b, 0x34f0, 0x007c, | ||
| 1208 | 0x6830, 0xa086, 0x0100, 0x0040, 0x2b56, 0x0078, 0x2b2c, 0x7924, | ||
| 1209 | 0xa18c, 0xff00, 0x810f, 0xa182, 0x0080, 0x0048, 0x2b5a, 0xa182, | ||
| 1210 | 0x00ff, 0x00c8, 0x2b5a, 0x127e, 0x2091, 0x8000, 0x1078, 0x8a89, | ||
| 1211 | 0x00c0, 0x3515, 0xa190, 0xa434, 0x2204, 0xa065, 0x0040, 0x3515, | ||
| 1212 | 0x1078, 0x4235, 0x127f, 0x0078, 0x2b2c, 0x127f, 0x0078, 0x2b56, | ||
| 1213 | 0x1078, 0x1381, 0x0040, 0x352f, 0xa006, 0x6802, 0x7010, 0xa005, | ||
| 1214 | 0x00c0, 0x3527, 0x2d00, 0x7012, 0x7016, 0x0078, 0x352d, 0x7014, | ||
| 1215 | 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, 0x000d, 0x007c, | ||
| 1216 | 0x7924, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x4501, 0x00c0, 0x353f, | ||
| 1217 | 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0048, 0x3540, 0xa066, | ||
| 1218 | 0x8cff, 0x007c, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x1078, 0x4501, | ||
| 1219 | 0x00c0, 0x3550, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0048, 0x3551, | ||
| 1220 | 0xa066, 0x8cff, 0x007c, 0x017e, 0x7110, 0x81ff, 0x0040, 0x355e, | ||
| 1221 | 0x2168, 0x6904, 0x1078, 0x139a, 0x0078, 0x3555, 0x7112, 0x7116, | ||
| 1222 | 0x017f, 0x007c, 0x2031, 0x0001, 0x0078, 0x3568, 0x2031, 0x0000, | ||
| 1223 | 0x2061, 0xa3d1, 0x6606, 0x6112, 0x600e, 0x6226, 0x632a, 0x642e, | ||
| 1224 | 0x6532, 0x2c10, 0x1078, 0x13d1, 0x7007, 0x0002, 0x701b, 0x2b2c, | ||
| 1225 | 0x007c, 0x0f7e, 0x127e, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, | ||
| 1226 | 0xa38f, 0x2004, 0xa005, 0x00c0, 0x3594, 0x0068, 0x3594, 0x7818, | ||
| 1227 | 0xd084, 0x00c0, 0x3594, 0x7a22, 0x7b26, 0x7c2a, 0x781b, 0x0001, | ||
| 1228 | 0x2091, 0x4080, 0x0078, 0x35b9, 0x017e, 0x0c7e, 0x0e7e, 0x2071, | ||
| 1229 | 0xa381, 0x7138, 0xa182, 0x0008, 0x0048, 0x35a2, 0x7030, 0x2060, | ||
| 1230 | 0x0078, 0x35b3, 0x7030, 0xa0e0, 0x0008, 0xac82, 0xa3d1, 0x0048, | ||
| 1231 | 0x35ab, 0x2061, 0xa391, 0x2c00, 0x7032, 0x81ff, 0x00c0, 0x35b1, | ||
| 1232 | 0x7036, 0x8108, 0x713a, 0x2262, 0x6306, 0x640a, 0x0e7f, 0x0c7f, | ||
| 1233 | 0x017f, 0x127f, 0x0f7f, 0x007c, 0x0e7e, 0x2071, 0xa381, 0x7038, | ||
| 1234 | 0xa005, 0x0040, 0x35f5, 0x127e, 0x2091, 0x8000, 0x0068, 0x35f4, | ||
| 1235 | 0x0f7e, 0x2079, 0x0000, 0x7818, 0xd084, 0x00c0, 0x35f3, 0x0c7e, | ||
| 1236 | 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, 0x6008, 0x782a, | ||
| 1237 | 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, 0x703a, 0xa005, | ||
| 1238 | 0x00c0, 0x35e9, 0x7033, 0xa391, 0x7037, 0xa391, 0x0c7f, 0x0078, | ||
| 1239 | 0x35f3, 0xac80, 0x0008, 0xa0fa, 0xa3d1, 0x0048, 0x35f1, 0x2001, | ||
| 1240 | 0xa391, 0x7036, 0x0c7f, 0x0f7f, 0x127f, 0x0e7f, 0x007c, 0x027e, | ||
| 1241 | 0x2001, 0xa352, 0x2004, 0xd0c4, 0x0040, 0x3602, 0x2011, 0x8014, | ||
| 1242 | 0x1078, 0x3579, 0x027f, 0x007c, 0x81ff, 0x00c0, 0x2b56, 0x127e, | ||
| 1243 | 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x1078, | ||
| 1244 | 0x4171, 0x127f, 0x0078, 0x2b2c, 0x7824, 0x2008, 0xa18c, 0xfffd, | ||
| 1245 | 0x00c0, 0x361f, 0x61d4, 0xa10d, 0x61d6, 0x0078, 0x2b2c, 0x0078, | ||
| 1246 | 0x2b5a, 0x81ff, 0x00c0, 0x2b56, 0x6000, 0xa086, 0x0003, 0x00c0, | ||
| 1247 | 0x2b56, 0x2001, 0xa352, 0x2004, 0xd0ac, 0x00c0, 0x2b56, 0x1078, | ||
| 1248 | 0x3542, 0x0040, 0x2b5a, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, | ||
| 1249 | 0x00c0, 0x363e, 0x7828, 0xa005, 0x0040, 0x2b2c, 0x0c7e, 0x1078, | ||
| 1250 | 0x3518, 0x0c7f, 0x0040, 0x2b56, 0x6837, 0x0000, 0x6833, 0x0000, | ||
| 1251 | 0x6838, 0xc0fd, 0x683a, 0x1078, 0x8c4d, 0x0040, 0x2b56, 0x7007, | ||
| 1252 | 0x0003, 0x701b, 0x3654, 0x007c, 0x6830, 0xa086, 0x0100, 0x0040, | ||
| 1253 | 0x2b56, 0x0078, 0x2b2c, 0x2001, 0xa300, 0x2004, 0xa086, 0x0003, | ||
| 1254 | 0x00c0, 0x2b56, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x1078, | ||
| 1255 | 0x3518, 0x0040, 0x2b56, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, | ||
| 1256 | 0x0000, 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x1078, | ||
| 1257 | 0x4501, 0x00c0, 0x36d8, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, | ||
| 1258 | 0x0040, 0x3688, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x00c0, 0x36d8, | ||
| 1259 | 0x2001, 0xa352, 0x2004, 0xd0ac, 0x00c0, 0x3695, 0x1078, 0x47cb, | ||
| 1260 | 0x00c0, 0x3695, 0xd79c, 0x0040, 0x36d8, 0xd794, 0x00c0, 0x369b, | ||
| 1261 | 0xd784, 0x0040, 0x36a7, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, | ||
| 1262 | 0x0004, 0x53a3, 0x1078, 0x338c, 0xd794, 0x0040, 0x36b0, 0xac80, | ||
| 1263 | 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x1078, 0x338c, | ||
| 1264 | 0x21a2, 0xd794, 0x0040, 0x36d0, 0xac80, 0x0000, 0x2098, 0x94a0, | ||
| 1265 | 0x20a9, 0x0002, 0x53a3, 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, | ||
| 1266 | 0x0004, 0x2098, 0x3400, 0x20a9, 0x0002, 0x53a3, 0x1078, 0x337e, | ||
| 1267 | 0xac80, 0x0026, 0x2098, 0x20a9, 0x0002, 0x53a3, 0x0078, 0x36d1, | ||
| 1268 | 0x94a0, 0xd794, 0x0040, 0x36d6, 0xa6b0, 0x000b, 0xa6b0, 0x0005, | ||
| 1269 | 0x8108, 0xd78c, 0x0040, 0x36e2, 0xa186, 0x0100, 0x0040, 0x36f3, | ||
| 1270 | 0x0078, 0x36e6, 0xa186, 0x007e, 0x0040, 0x36f3, 0xd794, 0x0040, | ||
| 1271 | 0x36ed, 0xa686, 0x0020, 0x0078, 0x36ef, 0xa686, 0x0028, 0x0040, | ||
| 1272 | 0x36fc, 0x0078, 0x3677, 0x86ff, 0x00c0, 0x36fa, 0x7120, 0x810b, | ||
| 1273 | 0x0078, 0x2b2c, 0x702f, 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, | ||
| 1274 | 0x772a, 0x2061, 0xa3d1, 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, | ||
| 1275 | 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x1078, 0x13d1, 0x7007, | ||
| 1276 | 0x0002, 0x701b, 0x3714, 0x007c, 0x702c, 0xa005, 0x00c0, 0x3726, | ||
| 1277 | 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, 0xa3d1, | ||
| 1278 | 0x6224, 0x6328, 0x642c, 0x6530, 0x0078, 0x3677, 0x7120, 0x810b, | ||
| 1279 | 0x0078, 0x2b2c, 0x2029, 0x007e, 0x7924, 0x7a28, 0x7b2c, 0x7c38, | ||
| 1280 | 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2b5a, 0xa502, | ||
| 1281 | 0x0048, 0x2b5a, 0xa184, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2b5a, | ||
| 1282 | 0xa502, 0x0048, 0x2b5a, 0xa284, 0xff00, 0x8007, 0xa0e2, 0x0020, | ||
| 1283 | 0x0048, 0x2b5a, 0xa502, 0x0048, 0x2b5a, 0xa284, 0x00ff, 0xa0e2, | ||
| 1284 | 0x0020, 0x0048, 0x2b5a, 0xa502, 0x0048, 0x2b5a, 0xa384, 0xff00, | ||
| 1285 | 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2b5a, 0xa502, 0x0048, 0x2b5a, | ||
| 1286 | 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0048, 0x2b5a, 0xa502, 0x0048, | ||
| 1287 | 0x2b5a, 0xa484, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0048, 0x2b5a, | ||
| 1288 | 0xa502, 0x0048, 0x2b5a, 0xa484, 0x00ff, 0xa0e2, 0x0020, 0x0048, | ||
| 1289 | 0x2b5a, 0xa502, 0x0048, 0x2b5a, 0x2061, 0xa5a3, 0x6102, 0x6206, | ||
| 1290 | 0x630a, 0x640e, 0x0078, 0x2b2c, 0x007e, 0x2001, 0xa352, 0x2004, | ||
| 1291 | 0xd0cc, 0x007f, 0x007c, 0x007e, 0x2001, 0xa371, 0x2004, 0xd0bc, | ||
| 1292 | 0x007f, 0x007c, 0x6160, 0x7a24, 0x6300, 0x82ff, 0x00c0, 0x379b, | ||
| 1293 | 0x7926, 0x0078, 0x2b2c, 0x83ff, 0x00c0, 0x2b5a, 0x2001, 0xfff0, | ||
| 1294 | 0xa200, 0x00c8, 0x2b5a, 0x2019, 0xffff, 0x6064, 0xa302, 0xa200, | ||
| 1295 | 0x0048, 0x2b5a, 0x7926, 0x6262, 0x0078, 0x2b2c, 0x2001, 0xa300, | ||
| 1296 | 0x2004, 0xa086, 0x0003, 0x00c0, 0x2b56, 0x7c28, 0x7d24, 0x7e38, | ||
| 1297 | 0x7f2c, 0x1078, 0x3518, 0x0040, 0x2b56, 0x2009, 0x0000, 0x2019, | ||
| 1298 | 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, 0x0003, 0x7026, | ||
| 1299 | 0x20a0, 0xa1e0, 0xa434, 0x2c64, 0x8cff, 0x0040, 0x37e8, 0x6004, | ||
| 1300 | 0xa084, 0x00ff, 0xa086, 0x0006, 0x0040, 0x37dd, 0x6004, 0xa084, | ||
| 1301 | 0xff00, 0xa086, 0x0600, 0x00c0, 0x37e8, 0x6014, 0x20a2, 0x94a0, | ||
| 1302 | 0x6010, 0x8007, 0xa105, 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, | ||
| 1303 | 0x8108, 0xa182, 0x00ff, 0x0040, 0x37f3, 0xa386, 0x002a, 0x0040, | ||
| 1304 | 0x37fc, 0x0078, 0x37c9, 0x83ff, 0x00c0, 0x37fa, 0x7120, 0x810c, | ||
| 1305 | 0x0078, 0x2b2c, 0x702f, 0x0001, 0x711e, 0x7020, 0xa300, 0x7022, | ||
| 1306 | 0x2061, 0xa3d1, 0x6007, 0x0000, 0x6312, 0x7024, 0x600e, 0x6426, | ||
| 1307 | 0x652a, 0x662e, 0x6732, 0x2c10, 0x1078, 0x13d1, 0x7007, 0x0002, | ||
| 1308 | 0x701b, 0x3813, 0x007c, 0x702c, 0xa005, 0x00c0, 0x3824, 0x711c, | ||
| 1309 | 0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xa3d1, 0x6424, 0x6528, | ||
| 1310 | 0x662c, 0x6730, 0x0078, 0x37c9, 0x7120, 0x810c, 0x0078, 0x2b2c, | ||
| 1311 | 0x81ff, 0x00c0, 0x2b56, 0x60c8, 0xd09c, 0x0040, 0x2b56, 0x1078, | ||
| 1312 | 0x3518, 0x0040, 0x2b56, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, | ||
| 1313 | 0x1078, 0x3562, 0x701b, 0x383d, 0x007c, 0x0d7e, 0xade8, 0x000d, | ||
| 1314 | 0x6828, 0xa0be, 0x7000, 0x0040, 0x3850, 0xa0be, 0x7100, 0x0040, | ||
| 1315 | 0x3850, 0xa0be, 0x7200, 0x0040, 0x3850, 0x0d7f, 0x0078, 0x2b5a, | ||
| 1316 | 0x6820, 0x6924, 0x1078, 0x24e3, 0x00c0, 0x387b, 0x1078, 0x4499, | ||
| 1317 | 0x00c0, 0x387b, 0x7122, 0x6612, 0x6516, 0x6e18, 0x0c7e, 0x1078, | ||
| 1318 | 0x3518, 0x0040, 0x387b, 0x1078, 0x3518, 0x0040, 0x387b, 0x0c7f, | ||
| 1319 | 0x0d7f, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, | ||
| 1320 | 0x6804, 0x2068, 0x1078, 0x8bbd, 0x0040, 0x2b56, 0x7007, 0x0003, | ||
| 1321 | 0x701b, 0x387e, 0x007c, 0x0d7f, 0x0078, 0x2b56, 0x7120, 0x1078, | ||
| 1322 | 0x2921, 0x6820, 0xa086, 0x8001, 0x0040, 0x2b56, 0x2d00, 0x701e, | ||
| 1323 | 0x6804, 0xa080, 0x0002, 0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, | ||
| 1324 | 0x1078, 0x41be, 0x007f, 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, | ||
| 1325 | 0x6d14, 0x2061, 0xa3d1, 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, | ||
| 1326 | 0x7000, 0x00c0, 0x38a5, 0x0078, 0x38a9, 0xa7c6, 0x7100, 0x00c0, | ||
| 1327 | 0x38b1, 0xa6c2, 0x0004, 0x0048, 0x2b5a, 0x2009, 0x0004, 0x0078, | ||
| 1328 | 0x3566, 0xa7c6, 0x7200, 0x00c0, 0x2b5a, 0xa6c2, 0x0054, 0x0048, | ||
| 1329 | 0x2b5a, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, | ||
| 1330 | 0x2c10, 0x1078, 0x13d1, 0x7007, 0x0002, 0x701b, 0x38c8, 0x007c, | ||
| 1331 | 0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, | ||
| 1332 | 0x007e, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x1078, 0x41be, 0x007f, | ||
| 1333 | 0x2009, 0x002a, 0x2061, 0xa3d1, 0x6224, 0x6328, 0x642c, 0x6530, | ||
| 1334 | 0x0078, 0x3566, 0x81ff, 0x00c0, 0x2b56, 0x1078, 0x3530, 0x0040, | ||
| 1335 | 0x2b5a, 0x1078, 0x45a7, 0x0040, 0x2b56, 0x1078, 0x4710, 0x0078, | ||
| 1336 | 0x2b2c, 0x7824, 0xd084, 0x0040, 0x3150, 0x1078, 0x3542, 0x0040, | ||
| 1337 | 0x2b5a, 0x0c7e, 0x1078, 0x3518, 0x0c7f, 0x00c0, 0x3903, 0x2009, | ||
| 1338 | 0x0002, 0x0078, 0x2b56, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, | ||
| 1339 | 0x0040, 0x3910, 0xa08e, 0x0004, 0x0040, 0x3910, 0xa08e, 0x0005, | ||
| 1340 | 0x00c0, 0x3934, 0x2001, 0xa352, 0x2004, 0xd0b4, 0x0040, 0x3185, | ||
| 1341 | 0x6000, 0xd08c, 0x00c0, 0x3185, 0x6837, 0x0000, 0x6838, 0xc0fd, | ||
| 1342 | 0x683a, 0x1078, 0x8bd9, 0x00c0, 0x3929, 0x2009, 0x0003, 0x0078, | ||
| 1343 | 0x2b56, 0x7007, 0x0003, 0x701b, 0x392e, 0x007c, 0x1078, 0x3542, | ||
| 1344 | 0x0040, 0x2b5a, 0x0078, 0x3185, 0x2009, 0xa32e, 0x210c, 0x81ff, | ||
| 1345 | 0x0040, 0x393e, 0x2009, 0x0001, 0x0078, 0x2b56, 0x2001, 0xa300, | ||
| 1346 | 0x2004, 0xa086, 0x0003, 0x0040, 0x3949, 0x2009, 0x0007, 0x0078, | ||
| 1347 | 0x2b56, 0x2001, 0xa352, 0x2004, 0xd0ac, 0x0040, 0x3953, 0x2009, | ||
| 1348 | 0x0008, 0x0078, 0x2b56, 0x609c, 0xd0a4, 0x00c0, 0x395a, 0xd0ac, | ||
| 1349 | 0x00c0, 0x3185, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, | ||
| 1350 | 0x683a, 0x1078, 0x8c4d, 0x00c0, 0x3969, 0x2009, 0x0003, 0x0078, | ||
| 1351 | 0x2b56, 0x7007, 0x0003, 0x701b, 0x396e, 0x007c, 0x6830, 0xa086, | ||
| 1352 | 0x0100, 0x00c0, 0x3977, 0x2009, 0x0004, 0x0078, 0x2b56, 0x1078, | ||
| 1353 | 0x3542, 0x0040, 0x2b5a, 0x0078, 0x3912, 0x81ff, 0x2009, 0x0001, | ||
| 1354 | 0x00c0, 0x2b56, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, | ||
| 1355 | 0x2b56, 0x2001, 0xa352, 0x2004, 0xd0ac, 0x2009, 0x0008, 0x00c0, | ||
| 1356 | 0x2b56, 0x1078, 0x3542, 0x0040, 0x2b5a, 0x6004, 0xa084, 0x00ff, | ||
| 1357 | 0xa086, 0x0006, 0x2009, 0x0009, 0x00c0, 0x2b56, 0x0c7e, 0x1078, | ||
| 1358 | 0x3518, 0x0c7f, 0x2009, 0x0002, 0x0040, 0x2b56, 0x6837, 0x0000, | ||
| 1359 | 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, | ||
| 1360 | 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x00c0, 0x39bc, 0xc0ed, 0x6952, | ||
| 1361 | 0x792c, 0x6956, 0x0078, 0x39c5, 0xa28e, 0x0100, 0x00c0, 0x2b5a, | ||
| 1362 | 0xc0e5, 0x6853, 0x0000, 0x6857, 0x0000, 0x683e, 0x1078, 0x8df6, | ||
| 1363 | 0x2009, 0x0003, 0x0040, 0x2b56, 0x7007, 0x0003, 0x701b, 0x39d1, | ||
| 1364 | 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040, 0x2b56, | ||
| 1365 | 0x0078, 0x2b2c, 0x81ff, 0x2009, 0x0001, 0x00c0, 0x2b56, 0x6000, | ||
| 1366 | 0xa086, 0x0003, 0x2009, 0x0007, 0x00c0, 0x2b56, 0x1078, 0x3542, | ||
| 1367 | 0x0040, 0x2b5a, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, | ||
| 1368 | 0x0009, 0x00c0, 0x2b56, 0x0c7e, 0x1078, 0x3518, 0x0c7f, 0x2009, | ||
| 1369 | 0x0002, 0x0040, 0x2b56, 0xad80, 0x000f, 0x2009, 0x0008, 0x7a2c, | ||
| 1370 | 0x7b28, 0x7c3c, 0x7d38, 0x1078, 0x3562, 0x701b, 0x3a08, 0x007c, | ||
| 1371 | 0x0d7e, 0xade8, 0x000f, 0x6800, 0xa086, 0x0500, 0x00c0, 0x3a1b, | ||
| 1372 | 0x6804, 0xa005, 0x00c0, 0x3a1b, 0x6808, 0xa084, 0xff00, 0x00c0, | ||
| 1373 | 0x3a1b, 0x0078, 0x3a1e, 0x0d7f, 0x00c0, 0x2b5a, 0x0d7f, 0x6837, | ||
| 1374 | 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x0c7e, 0x1078, | ||
| 1375 | 0x3542, 0x00c0, 0x3a2e, 0x0c7f, 0x0078, 0x2b5a, 0x1078, 0x8e52, | ||
| 1376 | 0x2009, 0x0003, 0x0c7f, 0x0040, 0x2b56, 0x7007, 0x0003, 0x701b, | ||
| 1377 | 0x3a3a, 0x007c, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0040, | ||
| 1378 | 0x2b56, 0x0078, 0x2b2c, 0x127e, 0x0c7e, 0x0e7e, 0x2061, 0x0100, | ||
| 1379 | 0x2071, 0xa300, 0x6044, 0xd0a4, 0x00c0, 0x3a6c, 0xd084, 0x0040, | ||
| 1380 | 0x3a55, 0x1078, 0x3bcc, 0x0078, 0x3a68, 0xd08c, 0x0040, 0x3a5c, | ||
| 1381 | 0x1078, 0x3ae3, 0x0078, 0x3a68, 0xd094, 0x0040, 0x3a63, 0x1078, | ||
| 1382 | 0x3ab7, 0x0078, 0x3a68, 0xd09c, 0x0040, 0x3a68, 0x1078, 0x3a76, | ||
| 1383 | 0x0e7f, 0x0c7f, 0x127f, 0x007c, 0x017e, 0x6128, 0xd19c, 0x00c0, | ||
| 1384 | 0x3a73, 0xc19d, 0x612a, 0x017f, 0x0078, 0x3a68, 0x624c, 0xa286, | ||
| 1385 | 0xf0f0, 0x00c0, 0x3a87, 0x6048, 0xa086, 0xf0f0, 0x0040, 0x3a87, | ||
| 1386 | 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0078, 0x3ab6, 0xa294, | ||
| 1387 | 0xff00, 0xa296, 0xf700, 0x0040, 0x3a9c, 0x7134, 0xd1a4, 0x00c0, | ||
| 1388 | 0x3a9c, 0x6240, 0xa294, 0x0010, 0x0040, 0x3a9c, 0x2009, 0x00f7, | ||
| 1389 | 0x1078, 0x41de, 0x0078, 0x3ab6, 0x6043, 0x0040, 0x6043, 0x0000, | ||
| 1390 | 0x7073, 0x0000, 0x708b, 0x0001, 0x70af, 0x0000, 0x70cb, 0x0000, | ||
| 1391 | 0x2009, 0xa9c0, 0x200b, 0x0000, 0x7083, 0x0000, 0x7077, 0x000f, | ||
| 1392 | 0x2009, 0x000f, 0x2011, 0x4122, 0x1078, 0x596c, 0x007c, 0x157e, | ||
| 1393 | 0x7074, 0xa005, 0x00c0, 0x3ae1, 0x2011, 0x4122, 0x1078, 0x58d4, | ||
| 1394 | 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, 0x00c8, | ||
| 1395 | 0x6044, 0xd08c, 0x00c0, 0x3ada, 0x00f0, 0x3ac8, 0x6242, 0x7087, | ||
| 1396 | 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, 0x6242, | ||
| 1397 | 0x0078, 0x3ae1, 0x6242, 0x7087, 0x0000, 0x707b, 0x0000, 0x0078, | ||
| 1398 | 0x3ae1, 0x157f, 0x007c, 0x7078, 0xa08a, 0x0003, 0x00c8, 0x3aec, | ||
| 1399 | 0x1079, 0x3aef, 0x0078, 0x3aee, 0x1078, 0x1328, 0x007c, 0x3af2, | ||
| 1400 | 0x3b41, 0x3bcb, 0x0f7e, 0x707b, 0x0001, 0x20e1, 0xa000, 0x20e1, | ||
| 1401 | 0x8700, 0x1078, 0x218b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2079, | ||
| 1402 | 0xa800, 0x207b, 0x2200, 0x7807, 0x00ef, 0x780b, 0x0000, 0x780f, | ||
| 1403 | 0x00ef, 0x7813, 0x0138, 0x7817, 0x0000, 0x781b, 0x0000, 0x781f, | ||
| 1404 | 0x0000, 0x7823, 0xffff, 0x7827, 0xffff, 0x782b, 0x0000, 0x782f, | ||
| 1405 | 0x0000, 0x2079, 0xa80c, 0x207b, 0x1101, 0x7807, 0x0000, 0x2099, | ||
| 1406 | 0xa305, 0x20a1, 0xa80e, 0x20a9, 0x0004, 0x53a3, 0x2079, 0xa812, | ||
| 1407 | 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xa800, 0x20a1, 0x020b, | ||
| 1408 | 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, 0x0000, 0x1078, | ||
| 1409 | 0x4158, 0x0f7f, 0x707f, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000, | ||
| 1410 | 0x007c, 0x0d7e, 0x707c, 0x707f, 0x0000, 0xa025, 0x0040, 0x3bb5, | ||
| 1411 | 0x6020, 0xd0b4, 0x00c0, 0x3bb3, 0x7188, 0x81ff, 0x0040, 0x3ba2, | ||
| 1412 | 0xa486, 0x000c, 0x00c0, 0x3bad, 0xa480, 0x0018, 0x8004, 0x20a8, | ||
| 1413 | 0x2011, 0xa880, 0x2019, 0xa800, 0x220c, 0x2304, 0xa106, 0x00c0, | ||
| 1414 | 0x3b79, 0x8210, 0x8318, 0x00f0, 0x3b5c, 0x6043, 0x0004, 0x608b, | ||
| 1415 | 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x707b, 0x0002, 0x7087, | ||
| 1416 | 0x0002, 0x2009, 0x07d0, 0x2011, 0x4129, 0x1078, 0x596c, 0x0078, | ||
| 1417 | 0x3bb3, 0x2069, 0xa880, 0x6930, 0xa18e, 0x1101, 0x00c0, 0x3bad, | ||
| 1418 | 0x6834, 0xa005, 0x00c0, 0x3bad, 0x6900, 0xa18c, 0x00ff, 0x00c0, | ||
| 1419 | 0x3b8d, 0x6804, 0xa005, 0x0040, 0x3ba2, 0x2011, 0xa88e, 0x2019, | ||
| 1420 | 0xa305, 0x20a9, 0x0004, 0x220c, 0x2304, 0xa102, 0x0048, 0x3ba0, | ||
| 1421 | 0x00c0, 0x3bad, 0x8210, 0x8318, 0x00f0, 0x3b93, 0x0078, 0x3bad, | ||
| 1422 | 0x708b, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xa880, | ||
| 1423 | 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008, 0x6043, | ||
| 1424 | 0x0000, 0x0078, 0x3bb5, 0x0d7f, 0x007c, 0x6020, 0xd0b4, 0x00c0, | ||
| 1425 | 0x3bb3, 0x60c3, 0x000c, 0x2011, 0xa5b5, 0x2013, 0x0000, 0x707f, | ||
| 1426 | 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x1078, | ||
| 1427 | 0x6c38, 0x0078, 0x3bb3, 0x007c, 0x7084, 0xa08a, 0x001d, 0x00c8, | ||
| 1428 | 0x3bd5, 0x1079, 0x3bd8, 0x0078, 0x3bd7, 0x1078, 0x1328, 0x007c, | ||
| 1429 | 0x3c02, 0x3c11, 0x3c40, 0x3c59, 0x3c85, 0x3cb1, 0x3cdd, 0x3d13, | ||
| 1430 | 0x3d3f, 0x3d67, 0x3daa, 0x3dd4, 0x3df6, 0x3e0c, 0x3e32, 0x3e45, | ||
| 1431 | 0x3e4e, 0x3e7e, 0x3eaa, 0x3ed6, 0x3f02, 0x3f38, 0x3f7d, 0x3fac, | ||
| 1432 | 0x3fce, 0x4010, 0x4036, 0x404f, 0x4050, 0x0c7e, 0x2061, 0xa300, | ||
| 1433 | 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, 0x6006, | ||
| 1434 | 0x0c7f, 0x007c, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0002, | ||
| 1435 | 0x7087, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4129, 0x1078, 0x596c, | ||
| 1436 | 0x007c, 0x0f7e, 0x707c, 0xa086, 0x0014, 0x00c0, 0x3c3e, 0x6043, | ||
| 1437 | 0x0000, 0x6020, 0xd0b4, 0x00c0, 0x3c3e, 0x2079, 0xa880, 0x7a30, | ||
| 1438 | 0xa296, 0x1102, 0x00c0, 0x3c3c, 0x7834, 0xa005, 0x00c0, 0x3c3c, | ||
| 1439 | 0x7a38, 0xd2fc, 0x0040, 0x3c32, 0x70ac, 0xa005, 0x00c0, 0x3c32, | ||
| 1440 | 0x70af, 0x0001, 0x2011, 0x4129, 0x1078, 0x58d4, 0x7087, 0x0010, | ||
| 1441 | 0x1078, 0x3e4e, 0x0078, 0x3c3e, 0x1078, 0x4171, 0x0f7f, 0x007c, | ||
| 1442 | 0x7087, 0x0003, 0x6043, 0x0004, 0x2011, 0x4129, 0x1078, 0x58d4, | ||
| 1443 | 0x1078, 0x41c6, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a, | ||
| 1444 | 0x20a3, 0x0000, 0x00f0, 0x3c50, 0x60c3, 0x0014, 0x1078, 0x4158, | ||
| 1445 | 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3c83, 0x2011, 0x4129, | ||
| 1446 | 0x1078, 0x58d4, 0xa086, 0x0014, 0x00c0, 0x3c81, 0x2079, 0xa880, | ||
| 1447 | 0x7a30, 0xa296, 0x1102, 0x00c0, 0x3c81, 0x7834, 0xa005, 0x00c0, | ||
| 1448 | 0x3c81, 0x7a38, 0xd2fc, 0x0040, 0x3c7b, 0x70ac, 0xa005, 0x00c0, | ||
| 1449 | 0x3c7b, 0x70af, 0x0001, 0x7087, 0x0004, 0x1078, 0x3c85, 0x0078, | ||
| 1450 | 0x3c83, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, 0x0005, 0x1078, | ||
| 1451 | 0x41c6, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xa88e, | ||
| 1452 | 0x1078, 0x4211, 0x00c0, 0x3ca3, 0x7070, 0xa005, 0x00c0, 0x3ca3, | ||
| 1453 | 0x714c, 0xa186, 0xffff, 0x0040, 0x3ca3, 0x1078, 0x40ea, 0x0040, | ||
| 1454 | 0x3ca3, 0x1078, 0x41f5, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, | ||
| 1455 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x4158, | ||
| 1456 | 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3cdb, 0x2011, 0x4129, | ||
| 1457 | 0x1078, 0x58d4, 0xa086, 0x0014, 0x00c0, 0x3cd9, 0x2079, 0xa880, | ||
| 1458 | 0x7a30, 0xa296, 0x1103, 0x00c0, 0x3cd9, 0x7834, 0xa005, 0x00c0, | ||
| 1459 | 0x3cd9, 0x7a38, 0xd2fc, 0x0040, 0x3cd3, 0x70ac, 0xa005, 0x00c0, | ||
| 1460 | 0x3cd3, 0x70af, 0x0001, 0x7087, 0x0006, 0x1078, 0x3cdd, 0x0078, | ||
| 1461 | 0x3cdb, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, 0x0007, 0x1078, | ||
| 1462 | 0x41c6, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xa88e, | ||
| 1463 | 0x1078, 0x4211, 0x00c0, 0x3d05, 0x7070, 0xa005, 0x00c0, 0x3d05, | ||
| 1464 | 0x7150, 0xa186, 0xffff, 0x0040, 0x3d05, 0xa180, 0x293f, 0x200c, | ||
| 1465 | 0xa18c, 0xff00, 0x810f, 0x1078, 0x40ea, 0x0040, 0x3d05, 0x1078, | ||
| 1466 | 0x378b, 0x0040, 0x3d05, 0x1078, 0x2500, 0x20a9, 0x0008, 0x2298, | ||
| 1467 | 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, | ||
| 1468 | 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3d3d, | ||
| 1469 | 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, 0x0014, 0x00c0, 0x3d3b, | ||
| 1470 | 0x2079, 0xa880, 0x7a30, 0xa296, 0x1104, 0x00c0, 0x3d3b, 0x7834, | ||
| 1471 | 0xa005, 0x00c0, 0x3d3b, 0x7a38, 0xd2fc, 0x0040, 0x3d35, 0x70ac, | ||
| 1472 | 0xa005, 0x00c0, 0x3d35, 0x70af, 0x0001, 0x7087, 0x0008, 0x1078, | ||
| 1473 | 0x3d3f, 0x0078, 0x3d3d, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, | ||
| 1474 | 0x0009, 0x1078, 0x41c6, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, | ||
| 1475 | 0x1078, 0x4211, 0x00c0, 0x3d58, 0x7070, 0xa005, 0x00c0, 0x3d58, | ||
| 1476 | 0x1078, 0x4051, 0x00c0, 0x3d62, 0xa085, 0x0001, 0x1078, 0x2500, | ||
| 1477 | 0x20a9, 0x0008, 0x2099, 0xa88e, 0x26a0, 0x53a6, 0x20a3, 0x0000, | ||
| 1478 | 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x4158, 0x007c, 0x0f7e, | ||
| 1479 | 0x707c, 0xa005, 0x0040, 0x3da8, 0x2011, 0x4129, 0x1078, 0x58d4, | ||
| 1480 | 0xa086, 0x0014, 0x00c0, 0x3da6, 0x2079, 0xa880, 0x7a30, 0xa296, | ||
| 1481 | 0x1105, 0x00c0, 0x3da6, 0x7834, 0x2011, 0x0100, 0xa21e, 0x00c0, | ||
| 1482 | 0x3d91, 0x7a38, 0xd2fc, 0x0040, 0x3d8b, 0x70ac, 0xa005, 0x00c0, | ||
| 1483 | 0x3d8b, 0x70af, 0x0001, 0x7087, 0x000a, 0x1078, 0x3daa, 0x0078, | ||
| 1484 | 0x3da8, 0xa005, 0x00c0, 0x3da6, 0x7a38, 0xd2fc, 0x0040, 0x3d9e, | ||
| 1485 | 0x70ac, 0xa005, 0x00c0, 0x3d9e, 0x70af, 0x0001, 0x7083, 0x0000, | ||
| 1486 | 0x7087, 0x000e, 0x1078, 0x3e32, 0x0078, 0x3da8, 0x1078, 0x4171, | ||
| 1487 | 0x0f7f, 0x007c, 0x7087, 0x000b, 0x2011, 0xa80e, 0x22a0, 0x20a9, | ||
| 1488 | 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, | ||
| 1489 | 0x41a4, 0x1078, 0x41c6, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x1078, | ||
| 1490 | 0x4211, 0x0040, 0x3dc7, 0x2013, 0x0000, 0x0078, 0x3dcb, 0x6030, | ||
| 1491 | 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, | ||
| 1492 | 0x0084, 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, | ||
| 1493 | 0x3df4, 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, 0x0084, 0x00c0, | ||
| 1494 | 0x3df2, 0x2079, 0xa880, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x3df2, | ||
| 1495 | 0x7834, 0xa005, 0x00c0, 0x3df2, 0x7087, 0x000c, 0x1078, 0x3df6, | ||
| 1496 | 0x0078, 0x3df4, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, 0x000d, | ||
| 1497 | 0x1078, 0x41c6, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, 0xa88e, | ||
| 1498 | 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, | ||
| 1499 | 0x0084, 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, | ||
| 1500 | 0x3e30, 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, 0x0084, 0x00c0, | ||
| 1501 | 0x3e2e, 0x2079, 0xa880, 0x7a30, 0xa296, 0x1107, 0x00c0, 0x3e2e, | ||
| 1502 | 0x7834, 0xa005, 0x00c0, 0x3e2e, 0x7083, 0x0001, 0x1078, 0x41b8, | ||
| 1503 | 0x7087, 0x000e, 0x1078, 0x3e32, 0x0078, 0x3e30, 0x1078, 0x4171, | ||
| 1504 | 0x0f7f, 0x007c, 0x7087, 0x000f, 0x707f, 0x0000, 0x608b, 0xbc85, | ||
| 1505 | 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, | ||
| 1506 | 0x2011, 0x4129, 0x1078, 0x58c7, 0x007c, 0x707c, 0xa005, 0x0040, | ||
| 1507 | 0x3e4d, 0x2011, 0x4129, 0x1078, 0x58d4, 0x007c, 0x7087, 0x0011, | ||
| 1508 | 0x1078, 0x4211, 0x00c0, 0x3e67, 0x7168, 0x81ff, 0x0040, 0x3e67, | ||
| 1509 | 0x2009, 0x0000, 0x706c, 0xa084, 0x00ff, 0x1078, 0x24e3, 0xa186, | ||
| 1510 | 0x0080, 0x0040, 0x3e67, 0x2011, 0xa88e, 0x1078, 0x40ea, 0x20e1, | ||
| 1511 | 0x9080, 0x20e1, 0x4000, 0x2099, 0xa880, 0x20a1, 0x020b, 0x747c, | ||
| 1512 | 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, | ||
| 1513 | 0x53a6, 0x60c3, 0x0014, 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, | ||
| 1514 | 0xa005, 0x0040, 0x3ea8, 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, | ||
| 1515 | 0x0014, 0x00c0, 0x3ea6, 0x2079, 0xa880, 0x7a30, 0xa296, 0x1103, | ||
| 1516 | 0x00c0, 0x3ea6, 0x7834, 0xa005, 0x00c0, 0x3ea6, 0x7a38, 0xd2fc, | ||
| 1517 | 0x0040, 0x3ea0, 0x70ac, 0xa005, 0x00c0, 0x3ea0, 0x70af, 0x0001, | ||
| 1518 | 0x7087, 0x0012, 0x1078, 0x3eaa, 0x0078, 0x3ea8, 0x1078, 0x4171, | ||
| 1519 | 0x0f7f, 0x007c, 0x7087, 0x0013, 0x1078, 0x41d2, 0x20a3, 0x1103, | ||
| 1520 | 0x20a3, 0x0000, 0x3430, 0x2011, 0xa88e, 0x1078, 0x4211, 0x00c0, | ||
| 1521 | 0x3ec8, 0x7070, 0xa005, 0x00c0, 0x3ec8, 0x714c, 0xa186, 0xffff, | ||
| 1522 | 0x0040, 0x3ec8, 0x1078, 0x40ea, 0x0040, 0x3ec8, 0x1078, 0x41f5, | ||
| 1523 | 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, | ||
| 1524 | 0x0000, 0x60c3, 0x0014, 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, | ||
| 1525 | 0xa005, 0x0040, 0x3f00, 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, | ||
| 1526 | 0x0014, 0x00c0, 0x3efe, 0x2079, 0xa880, 0x7a30, 0xa296, 0x1104, | ||
| 1527 | 0x00c0, 0x3efe, 0x7834, 0xa005, 0x00c0, 0x3efe, 0x7a38, 0xd2fc, | ||
| 1528 | 0x0040, 0x3ef8, 0x70ac, 0xa005, 0x00c0, 0x3ef8, 0x70af, 0x0001, | ||
| 1529 | 0x7087, 0x0014, 0x1078, 0x3f02, 0x0078, 0x3f00, 0x1078, 0x4171, | ||
| 1530 | 0x0f7f, 0x007c, 0x7087, 0x0015, 0x1078, 0x41d2, 0x20a3, 0x1104, | ||
| 1531 | 0x20a3, 0x0000, 0x3430, 0x2011, 0xa88e, 0x1078, 0x4211, 0x00c0, | ||
| 1532 | 0x3f2a, 0x7070, 0xa005, 0x00c0, 0x3f2a, 0x7150, 0xa186, 0xffff, | ||
| 1533 | 0x0040, 0x3f2a, 0xa180, 0x293f, 0x200c, 0xa18c, 0xff00, 0x810f, | ||
| 1534 | 0x1078, 0x40ea, 0x0040, 0x3f2a, 0x1078, 0x378b, 0x0040, 0x3f2a, | ||
| 1535 | 0x1078, 0x2500, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, | ||
| 1536 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x4158, 0x007c, | ||
| 1537 | 0x0f7e, 0x707c, 0xa005, 0x0040, 0x3f7b, 0x2011, 0x4129, 0x1078, | ||
| 1538 | 0x58d4, 0xa086, 0x0014, 0x00c0, 0x3f79, 0x2079, 0xa880, 0x7a30, | ||
| 1539 | 0xa296, 0x1105, 0x00c0, 0x3f79, 0x7834, 0x2011, 0x0100, 0xa21e, | ||
| 1540 | 0x00c0, 0x3f5e, 0x7a38, 0xd2fc, 0x0040, 0x3f5c, 0x70ac, 0xa005, | ||
| 1541 | 0x00c0, 0x3f5c, 0x70af, 0x0001, 0x0078, 0x3f6d, 0xa005, 0x00c0, | ||
| 1542 | 0x3f79, 0x7a38, 0xd2fc, 0x0040, 0x3f6b, 0x70ac, 0xa005, 0x00c0, | ||
| 1543 | 0x3f6b, 0x70af, 0x0001, 0x7083, 0x0000, 0x7a38, 0xd2f4, 0x0040, | ||
| 1544 | 0x3f73, 0x70cb, 0x0008, 0x7087, 0x0016, 0x1078, 0x3f7d, 0x0078, | ||
| 1545 | 0x3f7b, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x20e1, 0x9080, 0x20e1, | ||
| 1546 | 0x4000, 0x2099, 0xa880, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, | ||
| 1547 | 0x3430, 0x2011, 0xa88e, 0x7087, 0x0017, 0x1078, 0x4211, 0x00c0, | ||
| 1548 | 0x3f9d, 0x7070, 0xa005, 0x00c0, 0x3f9d, 0x1078, 0x4051, 0x00c0, | ||
| 1549 | 0x3fa7, 0xa085, 0x0001, 0x1078, 0x2500, 0x20a9, 0x0008, 0x2099, | ||
| 1550 | 0xa88e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, | ||
| 1551 | 0x0014, 0x1078, 0x4158, 0x007c, 0x0f7e, 0x707c, 0xa005, 0x0040, | ||
| 1552 | 0x3fcc, 0x2011, 0x4129, 0x1078, 0x58d4, 0xa086, 0x0084, 0x00c0, | ||
| 1553 | 0x3fca, 0x2079, 0xa880, 0x7a30, 0xa296, 0x1106, 0x00c0, 0x3fca, | ||
| 1554 | 0x7834, 0xa005, 0x00c0, 0x3fca, 0x7087, 0x0018, 0x1078, 0x3fce, | ||
| 1555 | 0x0078, 0x3fcc, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, 0x0019, | ||
| 1556 | 0x1078, 0x41d2, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, | ||
| 1557 | 0xa88e, 0x2039, 0xa80e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x1078, | ||
| 1558 | 0x4211, 0x00c0, 0x4002, 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, | ||
| 1559 | 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, 0xa205, 0x202a, 0x6030, | ||
| 1560 | 0x2310, 0x8214, 0xa2a0, 0xa80e, 0x2414, 0xa38c, 0x0001, 0x0040, | ||
| 1561 | 0x3ffd, 0xa294, 0xff00, 0x0078, 0x4000, 0xa294, 0x00ff, 0x8007, | ||
| 1562 | 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, 0x20a3, | ||
| 1563 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x1078, 0x4158, 0x007c, | ||
| 1564 | 0x0f7e, 0x707c, 0xa005, 0x0040, 0x4034, 0x2011, 0x4129, 0x1078, | ||
| 1565 | 0x58d4, 0xa086, 0x0084, 0x00c0, 0x4032, 0x2079, 0xa880, 0x7a30, | ||
| 1566 | 0xa296, 0x1107, 0x00c0, 0x4032, 0x7834, 0xa005, 0x00c0, 0x4032, | ||
| 1567 | 0x7083, 0x0001, 0x1078, 0x41b8, 0x7087, 0x001a, 0x1078, 0x4036, | ||
| 1568 | 0x0078, 0x4034, 0x1078, 0x4171, 0x0f7f, 0x007c, 0x7087, 0x001b, | ||
| 1569 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xa880, 0x20a1, 0x020b, | ||
| 1570 | 0x747c, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, | ||
| 1571 | 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x1078, 0x4158, 0x007c, 0x007c, | ||
| 1572 | 0x007c, 0x087e, 0x097e, 0x2029, 0xa352, 0x252c, 0x20a9, 0x0008, | ||
| 1573 | 0x2041, 0xa80e, 0x28a0, 0x2099, 0xa88e, 0x53a3, 0x20a9, 0x0008, | ||
| 1574 | 0x2011, 0x0007, 0xd5d4, 0x0040, 0x4067, 0x2011, 0x0000, 0x2800, | ||
| 1575 | 0xa200, 0x200c, 0xa1a6, 0xffff, 0x00c0, 0x4079, 0xd5d4, 0x0040, | ||
| 1576 | 0x4074, 0x8210, 0x0078, 0x4075, 0x8211, 0x00f0, 0x4067, 0x0078, | ||
| 1577 | 0x40e1, 0x82ff, 0x00c0, 0x408b, 0xd5d4, 0x0040, 0x4085, 0xa1a6, | ||
| 1578 | 0x3fff, 0x0040, 0x4071, 0x0078, 0x4089, 0xa1a6, 0x3fff, 0x0040, | ||
| 1579 | 0x40e1, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, | ||
| 1580 | 0x0040, 0x4094, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0040, 0x409b, | ||
| 1581 | 0x8423, 0x0078, 0x409c, 0x8424, 0x00c8, 0x40a9, 0xd5d4, 0x0040, | ||
| 1582 | 0x40a4, 0x8319, 0x0078, 0x40a5, 0x8318, 0x00f0, 0x4095, 0x0078, | ||
| 1583 | 0x40e1, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x00f0, 0x40ad, | ||
| 1584 | 0x2328, 0x8529, 0xa2be, 0x0007, 0x0040, 0x40c1, 0x007e, 0x2039, | ||
| 1585 | 0x0007, 0x2200, 0xa73a, 0x007f, 0x27a8, 0xa5a8, 0x0010, 0x00f0, | ||
| 1586 | 0x40bd, 0x754e, 0xa5c8, 0x293f, 0x292c, 0xa5ac, 0x00ff, 0x6532, | ||
| 1587 | 0x60e7, 0x0000, 0x65ea, 0x706b, 0x0000, 0x756e, 0x2018, 0x2304, | ||
| 1588 | 0xa405, 0x201a, 0x7073, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008, | ||
| 1589 | 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0078, | ||
| 1590 | 0x40e7, 0xa006, 0x0078, 0x40e7, 0xa006, 0x1078, 0x1328, 0x097f, | ||
| 1591 | 0x087f, 0x007c, 0x2118, 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a, | ||
| 1592 | 0x0010, 0x0048, 0x40f7, 0x8420, 0x8001, 0x0078, 0x40ef, 0x2118, | ||
| 1593 | 0x84ff, 0x0040, 0x4100, 0xa39a, 0x0010, 0x8421, 0x00c0, 0x40fb, | ||
| 1594 | 0x2021, 0x0001, 0x83ff, 0x0040, 0x4109, 0x8423, 0x8319, 0x00c0, | ||
| 1595 | 0x4105, 0xa238, 0x2704, 0xa42c, 0x00c0, 0x4121, 0xa405, 0x203a, | ||
| 1596 | 0x714e, 0xa1a0, 0x293f, 0x242c, 0xa5ac, 0x00ff, 0x6532, 0x60e7, | ||
| 1597 | 0x0000, 0x65ea, 0x706b, 0x0000, 0x756e, 0x7073, 0x0001, 0xa084, | ||
| 1598 | 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa300, 0x7077, 0x0000, 0x0e7f, | ||
| 1599 | 0x007c, 0x0e7e, 0x0f7e, 0x2001, 0x0002, 0x1078, 0x5975, 0x2079, | ||
| 1600 | 0x0100, 0x2071, 0x0140, 0x1078, 0x6c41, 0x7004, 0xa084, 0x4000, | ||
| 1601 | 0x0040, 0x413e, 0x7003, 0x1000, 0x7003, 0x0000, 0x127e, 0x2091, | ||
| 1602 | 0x8000, 0x2071, 0xa321, 0x2073, 0x0000, 0x7840, 0x027e, 0x017e, | ||
| 1603 | 0x2009, 0x00f7, 0x1078, 0x41de, 0x017f, 0xa094, 0x0010, 0xa285, | ||
| 1604 | 0x0080, 0x7842, 0x7a42, 0x027f, 0x127f, 0x0f7f, 0x0e7f, 0x007c, | ||
| 1605 | 0x127e, 0x2091, 0x8000, 0x2011, 0xa5b5, 0x2013, 0x0000, 0x707f, | ||
| 1606 | 0x0000, 0x127f, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, | ||
| 1607 | 0x1078, 0x6c38, 0x2009, 0x07d0, 0x2011, 0x4129, 0x1078, 0x596c, | ||
| 1608 | 0x007c, 0x017e, 0x027e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x2009, | ||
| 1609 | 0x00f7, 0x1078, 0x41de, 0x2061, 0xa5be, 0x601b, 0x0000, 0x601f, | ||
| 1610 | 0x0000, 0x2061, 0xa300, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, | ||
| 1611 | 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4196, 0x1078, | ||
| 1612 | 0x58c7, 0x127f, 0x0c7f, 0x027f, 0x017f, 0x007c, 0x0e7e, 0x007e, | ||
| 1613 | 0x127e, 0x2091, 0x8000, 0x2001, 0x0001, 0x1078, 0x5975, 0x2071, | ||
| 1614 | 0x0100, 0x1078, 0x6c41, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, | ||
| 1615 | 0x0040, 0x41ae, 0x7003, 0x1000, 0x7003, 0x0000, 0x2001, 0x0001, | ||
| 1616 | 0x1078, 0x2480, 0x1078, 0x4171, 0x127f, 0x007f, 0x0e7f, 0x007c, | ||
| 1617 | 0x20a9, 0x0040, 0x20a1, 0xa9c0, 0x2099, 0xa88e, 0x3304, 0x8007, | ||
| 1618 | 0x20a2, 0x9398, 0x94a0, 0x00f0, 0x41be, 0x007c, 0x20e1, 0x9080, | ||
| 1619 | 0x20e1, 0x4000, 0x2099, 0xa800, 0x20a1, 0x020b, 0x20a9, 0x000c, | ||
| 1620 | 0x53a6, 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xa880, | ||
| 1621 | 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x007c, 0x0c7e, 0x007e, | ||
| 1622 | 0x2061, 0x0100, 0x810f, 0x2001, 0xa32e, 0x2004, 0xa005, 0x00c0, | ||
| 1623 | 0x41ef, 0x6030, 0xa084, 0x00ff, 0xa105, 0x0078, 0x41f1, 0xa185, | ||
| 1624 | 0x00f7, 0x604a, 0x007f, 0x0c7f, 0x007c, 0x017e, 0x047e, 0x2001, | ||
| 1625 | 0xa352, 0x2004, 0xd0a4, 0x0040, 0x4208, 0xa006, 0x2020, 0x2009, | ||
| 1626 | 0x002a, 0x1078, 0x9ec0, 0x2001, 0xa30c, 0x200c, 0xc195, 0x2102, | ||
| 1627 | 0x2019, 0x002a, 0x2009, 0x0000, 0x1078, 0x27e2, 0x047f, 0x017f, | ||
| 1628 | 0x007c, 0x007e, 0x2001, 0xa30c, 0x2004, 0xd09c, 0x0040, 0x4218, | ||
| 1629 | 0x007f, 0x007c, 0x007e, 0x017e, 0x127e, 0x2091, 0x8000, 0x2001, | ||
| 1630 | 0x0101, 0x200c, 0xa18d, 0x0006, 0x2102, 0x127f, 0x017f, 0x007f, | ||
| 1631 | 0x007c, 0x157e, 0x20a9, 0x00ff, 0x2009, 0xa434, 0xa006, 0x200a, | ||
| 1632 | 0x8108, 0x00f0, 0x422f, 0x157f, 0x007c, 0x0d7e, 0x037e, 0x157e, | ||
| 1633 | 0x137e, 0x147e, 0x2069, 0xa351, 0xa006, 0x6002, 0x6007, 0x0707, | ||
| 1634 | 0x600a, 0x600e, 0x6012, 0xa198, 0x293f, 0x231c, 0xa39c, 0x00ff, | ||
| 1635 | 0x6316, 0x20a9, 0x0004, 0xac98, 0x0006, 0x23a0, 0x40a4, 0x20a9, | ||
| 1636 | 0x0004, 0xac98, 0x000a, 0x23a0, 0x40a4, 0x603e, 0x6042, 0x604e, | ||
| 1637 | 0x6052, 0x6056, 0x605a, 0x605e, 0x6062, 0x6066, 0x606a, 0x606e, | ||
| 1638 | 0x6072, 0x6076, 0x607a, 0x607e, 0x6082, 0x6086, 0x608a, 0x608e, | ||
| 1639 | 0x6092, 0x6096, 0x609a, 0x609e, 0x60ae, 0x61a2, 0x0d7e, 0x60a4, | ||
| 1640 | 0xa06d, 0x0040, 0x4275, 0x1078, 0x139a, 0x60a7, 0x0000, 0x60a8, | ||
| 1641 | 0xa06d, 0x0040, 0x427d, 0x1078, 0x139a, 0x60ab, 0x0000, 0x0d7f, | ||
| 1642 | 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, 0x6046, 0x6814, 0xa084, | ||
| 1643 | 0x00ff, 0x6042, 0x147f, 0x137f, 0x157f, 0x037f, 0x0d7f, 0x007c, | ||
| 1644 | 0x127e, 0x2091, 0x8000, 0x6944, 0x6e48, 0xa684, 0x3fff, 0xa082, | ||
| 1645 | 0x4000, 0x00c8, 0x4361, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, | ||
| 1646 | 0x00c8, 0x4367, 0x2001, 0xa30c, 0x2004, 0xa084, 0x0003, 0x0040, | ||
| 1647 | 0x42c2, 0x2001, 0xa30c, 0x2004, 0xd084, 0x00c0, 0x4342, 0xa188, | ||
| 1648 | 0xa434, 0x2104, 0xa065, 0x0040, 0x4342, 0x6004, 0xa084, 0x00ff, | ||
| 1649 | 0xa08e, 0x0006, 0x00c0, 0x4342, 0x6000, 0xd0c4, 0x0040, 0x4342, | ||
| 1650 | 0x0078, 0x42cf, 0xa188, 0xa434, 0x2104, 0xa065, 0x0040, 0x4326, | ||
| 1651 | 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x00c0, 0x432c, 0x60a4, | ||
| 1652 | 0xa00d, 0x0040, 0x42d7, 0x1078, 0x4749, 0x0040, 0x4320, 0x60a8, | ||
| 1653 | 0xa00d, 0x0040, 0x42f1, 0x1078, 0x479a, 0x00c0, 0x42f1, 0x694c, | ||
| 1654 | 0xd1fc, 0x00c0, 0x42e7, 0x1078, 0x441c, 0x0078, 0x431b, 0x1078, | ||
| 1655 | 0x43d6, 0x694c, 0xd1ec, 0x00c0, 0x431b, 0x1078, 0x460a, 0x0078, | ||
| 1656 | 0x431b, 0x694c, 0xa184, 0xa000, 0x0040, 0x430b, 0xd1ec, 0x0040, | ||
| 1657 | 0x4304, 0xd1fc, 0x0040, 0x4300, 0x1078, 0x461b, 0x0078, 0x4307, | ||
| 1658 | 0x1078, 0x461b, 0x0078, 0x430b, 0xd1fc, 0x0040, 0x430b, 0x1078, | ||
| 1659 | 0x43d6, 0x0078, 0x431b, 0x6050, 0xa00d, 0x0040, 0x4316, 0x2d00, | ||
| 1660 | 0x200a, 0x6803, 0x0000, 0x6052, 0x0078, 0x431b, 0x2d00, 0x6052, | ||
| 1661 | 0x604e, 0x6803, 0x0000, 0x1078, 0x5c17, 0xa006, 0x127f, 0x007c, | ||
| 1662 | 0x2001, 0x0005, 0x2009, 0x0000, 0x0078, 0x436b, 0x2001, 0x0028, | ||
| 1663 | 0x2009, 0x0000, 0x0078, 0x436b, 0xa082, 0x0006, 0x00c8, 0x4342, | ||
| 1664 | 0x60a0, 0xd0bc, 0x00c0, 0x433e, 0x6100, 0xd1fc, 0x0040, 0x42cf, | ||
| 1665 | 0x2001, 0x0029, 0x2009, 0x1000, 0x0078, 0x436b, 0x2001, 0x0028, | ||
| 1666 | 0x0078, 0x435d, 0x2009, 0xa30c, 0x210c, 0xd18c, 0x0040, 0x434c, | ||
| 1667 | 0x2001, 0x0004, 0x0078, 0x435d, 0xd184, 0x0040, 0x4353, 0x2001, | ||
| 1668 | 0x0004, 0x0078, 0x435d, 0x2001, 0x0029, 0x6100, 0xd1fc, 0x0040, | ||
| 1669 | 0x435d, 0x2009, 0x1000, 0x0078, 0x436b, 0x2009, 0x0000, 0x0078, | ||
| 1670 | 0x436b, 0x2001, 0x0029, 0x2009, 0x0000, 0x0078, 0x436b, 0x2001, | ||
| 1671 | 0x0029, 0x2009, 0x0000, 0xa005, 0x127f, 0x007c, 0x6944, 0x6e48, | ||
| 1672 | 0xa684, 0x3fff, 0xa082, 0x4000, 0x00c8, 0x43bb, 0xa18c, 0xff00, | ||
| 1673 | 0x810f, 0xa182, 0x00ff, 0x00c8, 0x43a1, 0xa188, 0xa434, 0x2104, | ||
| 1674 | 0xa065, 0x0040, 0x43a1, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, | ||
| 1675 | 0x00c0, 0x43a7, 0x684c, 0xd0ec, 0x0040, 0x4394, 0x1078, 0x461b, | ||
| 1676 | 0x1078, 0x43d6, 0x0078, 0x439c, 0x1078, 0x43d6, 0x684c, 0xd0fc, | ||
| 1677 | 0x0040, 0x439c, 0x1078, 0x460a, 0x1078, 0x4663, 0xa006, 0x0078, | ||
| 1678 | 0x43bf, 0x2001, 0x0028, 0x2009, 0x0000, 0x0078, 0x43bf, 0xa082, | ||
| 1679 | 0x0006, 0x00c8, 0x43b5, 0x6100, 0xd1fc, 0x0040, 0x438a, 0x2001, | ||
| 1680 | 0x0029, 0x2009, 0x1000, 0x0078, 0x43bf, 0x2001, 0x0029, 0x2009, | ||
| 1681 | 0x0000, 0x0078, 0x43bf, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, | ||
| 1682 | 0x007c, 0x127e, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0040, 0x43cf, | ||
| 1683 | 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x127f, 0x007c, 0x2d00, | ||
| 1684 | 0x6052, 0x604e, 0x6803, 0x0000, 0x0078, 0x43cd, 0x127e, 0x2091, | ||
| 1685 | 0x8000, 0x604c, 0xa005, 0x0040, 0x43ec, 0x0e7e, 0x2071, 0xa5ab, | ||
| 1686 | 0x7004, 0xa086, 0x0002, 0x0040, 0x43f3, 0x0e7f, 0x604c, 0x6802, | ||
| 1687 | 0x2d00, 0x604e, 0x127f, 0x007c, 0x2d00, 0x6052, 0x604e, 0x6803, | ||
| 1688 | 0x0000, 0x0078, 0x43ea, 0x701c, 0xac06, 0x00c0, 0x43e5, 0x604c, | ||
| 1689 | 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x0e7f, 0x127f, 0x007c, | ||
| 1690 | 0x127e, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0040, 0x440e, 0x6800, | ||
| 1691 | 0xa005, 0x00c0, 0x440c, 0x6052, 0x604e, 0xad05, 0x127f, 0x007c, | ||
| 1692 | 0x604c, 0xa06d, 0x0040, 0x441b, 0x6800, 0xa005, 0x00c0, 0x4419, | ||
| 1693 | 0x6052, 0x604e, 0xad05, 0x007c, 0x6803, 0x0000, 0x6084, 0xa00d, | ||
| 1694 | 0x0040, 0x4426, 0x2d00, 0x200a, 0x6086, 0x007c, 0x2d00, 0x6086, | ||
| 1695 | 0x6082, 0x0078, 0x4425, 0x127e, 0x0c7e, 0x027e, 0x2091, 0x8000, | ||
| 1696 | 0x6218, 0x2260, 0x6200, 0xa005, 0x0040, 0x4439, 0xc285, 0x0078, | ||
| 1697 | 0x443a, 0xc284, 0x6202, 0x027f, 0x0c7f, 0x127f, 0x007c, 0x127e, | ||
| 1698 | 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x007e, 0xa086, | ||
| 1699 | 0x0006, 0x00c0, 0x445e, 0x609c, 0xd0ac, 0x0040, 0x445e, 0x2001, | ||
| 1700 | 0xa352, 0x2004, 0xd0a4, 0x0040, 0x445e, 0xa284, 0xff00, 0x8007, | ||
| 1701 | 0xa086, 0x0007, 0x00c0, 0x445e, 0x2011, 0x0600, 0x007f, 0xa294, | ||
| 1702 | 0xff00, 0xa215, 0x6206, 0x007e, 0xa086, 0x0006, 0x00c0, 0x446e, | ||
| 1703 | 0x6290, 0x82ff, 0x00c0, 0x446e, 0x1078, 0x1328, 0x007f, 0x0c7f, | ||
| 1704 | 0x127f, 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x6218, 0x2260, | ||
| 1705 | 0x6204, 0x007e, 0xa086, 0x0006, 0x00c0, 0x4490, 0x609c, 0xd0a4, | ||
| 1706 | 0x0040, 0x4490, 0x2001, 0xa352, 0x2004, 0xd0ac, 0x00c0, 0x4490, | ||
| 1707 | 0xa284, 0x00ff, 0xa086, 0x0007, 0x00c0, 0x4490, 0x2011, 0x0006, | ||
| 1708 | 0x007f, 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x0c7f, 0x127f, | ||
| 1709 | 0x007c, 0x027e, 0xa182, 0x00ff, 0x0048, 0x44a2, 0xa085, 0x0001, | ||
| 1710 | 0x0078, 0x44ba, 0xa190, 0xa434, 0x2204, 0xa065, 0x00c0, 0x44b9, | ||
| 1711 | 0x017e, 0x0d7e, 0x1078, 0x1366, 0x2d60, 0x0d7f, 0x017f, 0x0040, | ||
| 1712 | 0x449e, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x1078, | ||
| 1713 | 0x4235, 0xa006, 0x027f, 0x007c, 0x127e, 0x2091, 0x8000, 0x027e, | ||
| 1714 | 0xa182, 0x00ff, 0x0048, 0x44c8, 0xa085, 0x0001, 0x0078, 0x44fe, | ||
| 1715 | 0x0d7e, 0xa190, 0xa434, 0x2204, 0xa06d, 0x0040, 0x44fc, 0x2013, | ||
| 1716 | 0x0000, 0x0d7e, 0x0c7e, 0x2d60, 0x60a4, 0xa06d, 0x0040, 0x44da, | ||
| 1717 | 0x1078, 0x139a, 0x60a8, 0xa06d, 0x0040, 0x44e0, 0x1078, 0x139a, | ||
| 1718 | 0x0c7f, 0x0d7f, 0x0d7e, 0x0c7e, 0x68ac, 0x2060, 0x8cff, 0x0040, | ||
| 1719 | 0x44f8, 0x600c, 0x007e, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, | ||
| 1720 | 0x44f3, 0x1078, 0x13aa, 0x1078, 0x753d, 0x0c7f, 0x0078, 0x44e6, | ||
| 1721 | 0x0c7f, 0x0d7f, 0x1078, 0x139a, 0x0d7f, 0xa006, 0x027f, 0x127f, | ||
| 1722 | 0x007c, 0x017e, 0xa182, 0x00ff, 0x0048, 0x450a, 0xa085, 0x0001, | ||
| 1723 | 0x0078, 0x4511, 0xa188, 0xa434, 0x2104, 0xa065, 0x0040, 0x4506, | ||
| 1724 | 0xa006, 0x017f, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x600b, | ||
| 1725 | 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x2069, 0xa88e, | ||
| 1726 | 0x6808, 0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, 0x0048, 0x4529, | ||
| 1727 | 0x603a, 0x6814, 0x6066, 0x2099, 0xa896, 0xac88, 0x000a, 0x21a0, | ||
| 1728 | 0x20a9, 0x0004, 0x53a3, 0x2099, 0xa89a, 0xac88, 0x0006, 0x21a0, | ||
| 1729 | 0x20a9, 0x0004, 0x53a3, 0x2069, 0xa8ae, 0x6808, 0x606a, 0x690c, | ||
| 1730 | 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, 0xa182, 0x0211, 0x00c8, | ||
| 1731 | 0x454d, 0x2009, 0x0008, 0x0078, 0x4577, 0xa182, 0x0259, 0x00c8, | ||
| 1732 | 0x4555, 0x2009, 0x0007, 0x0078, 0x4577, 0xa182, 0x02c1, 0x00c8, | ||
| 1733 | 0x455d, 0x2009, 0x0006, 0x0078, 0x4577, 0xa182, 0x0349, 0x00c8, | ||
| 1734 | 0x4565, 0x2009, 0x0005, 0x0078, 0x4577, 0xa182, 0x0421, 0x00c8, | ||
| 1735 | 0x456d, 0x2009, 0x0004, 0x0078, 0x4577, 0xa182, 0x0581, 0x00c8, | ||
| 1736 | 0x4575, 0x2009, 0x0003, 0x0078, 0x4577, 0x2009, 0x0002, 0x6192, | ||
| 1737 | 0x147f, 0x137f, 0x157f, 0x0d7f, 0x007c, 0x017e, 0x027e, 0x0e7e, | ||
| 1738 | 0x2071, 0xa88d, 0x2e04, 0x6896, 0x2071, 0xa88e, 0x7004, 0x689a, | ||
| 1739 | 0x701c, 0x689e, 0x6a00, 0x2009, 0xa371, 0x210c, 0xd0bc, 0x0040, | ||
| 1740 | 0x4597, 0xd1ec, 0x0040, 0x4597, 0xc2ad, 0x0078, 0x4598, 0xc2ac, | ||
| 1741 | 0xd0c4, 0x0040, 0x45a1, 0xd1e4, 0x0040, 0x45a1, 0xc2bd, 0x0078, | ||
| 1742 | 0x45a2, 0xc2bc, 0x6a02, 0x0e7f, 0x027f, 0x017f, 0x007c, 0x0d7e, | ||
| 1743 | 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x0040, 0x45cb, 0x6900, | ||
| 1744 | 0x81ff, 0x00c0, 0x45df, 0x6a04, 0xa282, 0x0010, 0x00c8, 0x45e4, | ||
| 1745 | 0xad88, 0x0004, 0x20a9, 0x0010, 0x2104, 0xa086, 0xffff, 0x0040, | ||
| 1746 | 0x45c6, 0x8108, 0x00f0, 0x45bc, 0x1078, 0x1328, 0x260a, 0x8210, | ||
| 1747 | 0x6a06, 0x0078, 0x45df, 0x1078, 0x1381, 0x0040, 0x45e4, 0x2d00, | ||
| 1748 | 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, | ||
| 1749 | 0xffff, 0x8108, 0x00f0, 0x45d7, 0x6807, 0x0001, 0x6e12, 0xa085, | ||
| 1750 | 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, 0x0078, 0x45e1, 0x127e, | ||
| 1751 | 0x2091, 0x8000, 0x0d7e, 0x60a4, 0xa00d, 0x0040, 0x4607, 0x2168, | ||
| 1752 | 0x6800, 0xa005, 0x00c0, 0x4603, 0x1078, 0x4749, 0x00c0, 0x4607, | ||
| 1753 | 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, 0x0048, 0x4603, 0x8001, | ||
| 1754 | 0x6806, 0x0078, 0x4607, 0x1078, 0x139a, 0x60a7, 0x0000, 0x0d7f, | ||
| 1755 | 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x47af, 0x0078, | ||
| 1756 | 0x4613, 0x1078, 0x43c1, 0x1078, 0x46a7, 0x00c0, 0x4611, 0x1078, | ||
| 1757 | 0x4663, 0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a8, | ||
| 1758 | 0xa06d, 0x0040, 0x463f, 0x6950, 0x81ff, 0x00c0, 0x4653, 0x6a54, | ||
| 1759 | 0xa282, 0x0010, 0x00c8, 0x4660, 0xad88, 0x0018, 0x20a9, 0x0010, | ||
| 1760 | 0x2104, 0xa086, 0xffff, 0x0040, 0x463a, 0x8108, 0x00f0, 0x4630, | ||
| 1761 | 0x1078, 0x1328, 0x260a, 0x8210, 0x6a56, 0x0078, 0x4653, 0x1078, | ||
| 1762 | 0x1381, 0x0040, 0x4660, 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, | ||
| 1763 | 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x00f0, 0x464b, | ||
| 1764 | 0x6857, 0x0001, 0x6e62, 0x0078, 0x4657, 0x1078, 0x441c, 0x1078, | ||
| 1765 | 0x466d, 0x00c0, 0x4655, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, | ||
| 1766 | 0xa006, 0x0078, 0x465d, 0x127e, 0x2091, 0x8000, 0x1078, 0x5c17, | ||
| 1767 | 0x127f, 0x007c, 0xa01e, 0x0078, 0x466f, 0x2019, 0x0001, 0xa00e, | ||
| 1768 | 0x127e, 0x2091, 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x00c0, | ||
| 1769 | 0x468d, 0x8dff, 0x0040, 0x46a2, 0x83ff, 0x0040, 0x4685, 0x6848, | ||
| 1770 | 0xa606, 0x0040, 0x4692, 0x0078, 0x468d, 0x683c, 0xa406, 0x00c0, | ||
| 1771 | 0x468d, 0x6840, 0xa506, 0x0040, 0x4692, 0x2d08, 0x6800, 0x2068, | ||
| 1772 | 0x0078, 0x4679, 0x6a00, 0x604c, 0xad06, 0x00c0, 0x469a, 0x624e, | ||
| 1773 | 0x0078, 0x469d, 0xa180, 0x0000, 0x2202, 0x82ff, 0x00c0, 0x46a2, | ||
| 1774 | 0x6152, 0x8dff, 0x127f, 0x007c, 0xa01e, 0x0078, 0x46a9, 0x2019, | ||
| 1775 | 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x0040, 0x46d5, 0x83ff, | ||
| 1776 | 0x0040, 0x46b8, 0x6848, 0xa606, 0x0040, 0x46c5, 0x0078, 0x46c0, | ||
| 1777 | 0x683c, 0xa406, 0x00c0, 0x46c0, 0x6840, 0xa506, 0x0040, 0x46c5, | ||
| 1778 | 0x2d08, 0x6800, 0x2068, 0x0078, 0x46ac, 0x6a00, 0x6080, 0xad06, | ||
| 1779 | 0x00c0, 0x46cd, 0x6282, 0x0078, 0x46d0, 0xa180, 0x0000, 0x2202, | ||
| 1780 | 0x82ff, 0x00c0, 0x46d5, 0x6186, 0x8dff, 0x007c, 0xa016, 0x1078, | ||
| 1781 | 0x4742, 0x00c0, 0x46dd, 0x2011, 0x0001, 0x1078, 0x4793, 0x00c0, | ||
| 1782 | 0x46e3, 0xa295, 0x0002, 0x007c, 0x1078, 0x47cb, 0x0040, 0x46ec, | ||
| 1783 | 0x1078, 0x8b12, 0x0078, 0x46ee, 0xa085, 0x0001, 0x007c, 0x1078, | ||
| 1784 | 0x47cb, 0x0040, 0x46f7, 0x1078, 0x8aaa, 0x0078, 0x46f9, 0xa085, | ||
| 1785 | 0x0001, 0x007c, 0x1078, 0x47cb, 0x0040, 0x4702, 0x1078, 0x8af4, | ||
| 1786 | 0x0078, 0x4704, 0xa085, 0x0001, 0x007c, 0x1078, 0x47cb, 0x0040, | ||
| 1787 | 0x470d, 0x1078, 0x8ac6, 0x0078, 0x470f, 0xa085, 0x0001, 0x007c, | ||
| 1788 | 0x1078, 0x47cb, 0x0040, 0x4718, 0x1078, 0x8b30, 0x0078, 0x471a, | ||
| 1789 | 0xa085, 0x0001, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, 0x8000, | ||
| 1790 | 0x6080, 0xa06d, 0x0040, 0x473a, 0x6800, 0x007e, 0x6837, 0x0103, | ||
| 1791 | 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8cb8, 0x007e, 0x6000, 0xd0fc, | ||
| 1792 | 0x0040, 0x4734, 0x1078, 0xa18c, 0x007f, 0x1078, 0x4982, 0x007f, | ||
| 1793 | 0x0078, 0x4721, 0x6083, 0x0000, 0x6087, 0x0000, 0x0d7f, 0x007f, | ||
| 1794 | 0x127f, 0x007c, 0x60a4, 0xa00d, 0x00c0, 0x4749, 0xa085, 0x0001, | ||
| 1795 | 0x007c, 0x0e7e, 0x2170, 0x7000, 0xa005, 0x00c0, 0x475c, 0x20a9, | ||
| 1796 | 0x0010, 0xae88, 0x0004, 0x2104, 0xa606, 0x0040, 0x475c, 0x8108, | ||
| 1797 | 0x00f0, 0x4753, 0xa085, 0x0001, 0xa006, 0x0e7f, 0x007c, 0x0d7e, | ||
| 1798 | 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x00c0, 0x476d, 0x1078, | ||
| 1799 | 0x1381, 0x0040, 0x477f, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, | ||
| 1800 | 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, | ||
| 1801 | 0x00f0, 0x4775, 0xa085, 0x0001, 0x127f, 0x0d7f, 0x007c, 0xa006, | ||
| 1802 | 0x0078, 0x477c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x60a4, 0xa06d, | ||
| 1803 | 0x0040, 0x4790, 0x60a7, 0x0000, 0x1078, 0x139a, 0xa085, 0x0001, | ||
| 1804 | 0x127f, 0x0d7f, 0x007c, 0x60a8, 0xa00d, 0x00c0, 0x479a, 0xa085, | ||
| 1805 | 0x0001, 0x007c, 0x0e7e, 0x2170, 0x7050, 0xa005, 0x00c0, 0x47ad, | ||
| 1806 | 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0040, 0x47ad, | ||
| 1807 | 0x8108, 0x00f0, 0x47a4, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x127e, | ||
| 1808 | 0x2091, 0x8000, 0x1078, 0x4793, 0x00c0, 0x47c9, 0x200b, 0xffff, | ||
| 1809 | 0x0d7e, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0048, 0x47c4, | ||
| 1810 | 0x8001, 0x6856, 0x0078, 0x47c8, 0x1078, 0x139a, 0x60ab, 0x0000, | ||
| 1811 | 0x0d7f, 0x127f, 0x007c, 0x609c, 0xd0a4, 0x007c, 0x0f7e, 0x71ac, | ||
| 1812 | 0x81ff, 0x00c0, 0x47e9, 0x71c8, 0xd19c, 0x0040, 0x47e9, 0x2001, | ||
| 1813 | 0x007e, 0xa080, 0xa434, 0x2004, 0xa07d, 0x0040, 0x47e9, 0x7804, | ||
| 1814 | 0xa084, 0x00ff, 0xa086, 0x0006, 0x00c0, 0x47e9, 0x7800, 0xc0ed, | ||
| 1815 | 0x7802, 0x2079, 0xa351, 0x7804, 0xd0a4, 0x0040, 0x480f, 0x157e, | ||
| 1816 | 0x0c7e, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x4501, | ||
| 1817 | 0x00c0, 0x4809, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, | ||
| 1818 | 0x0040, 0x4806, 0xa086, 0x0006, 0x00c0, 0x4809, 0x6000, 0xc0ed, | ||
| 1819 | 0x6002, 0x017f, 0x8108, 0x00f0, 0x47f5, 0x0c7f, 0x157f, 0x1078, | ||
| 1820 | 0x4897, 0x0040, 0x4818, 0x2001, 0xa59f, 0x200c, 0x0078, 0x4820, | ||
| 1821 | 0x2079, 0xa351, 0x7804, 0xd0a4, 0x0040, 0x4824, 0x2009, 0x07d0, | ||
| 1822 | 0x2011, 0x4826, 0x1078, 0x596c, 0x0f7f, 0x007c, 0x2011, 0x4826, | ||
| 1823 | 0x1078, 0x58d4, 0x1078, 0x4897, 0x0040, 0x484e, 0x2001, 0xa4b2, | ||
| 1824 | 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xa352, | ||
| 1825 | 0x2004, 0xd0a4, 0x0040, 0x4842, 0x2009, 0x07d0, 0x2011, 0x4826, | ||
| 1826 | 0x1078, 0x596c, 0x0e7e, 0x2071, 0xa300, 0x706b, 0x0000, 0x706f, | ||
| 1827 | 0x0000, 0x1078, 0x260d, 0x0e7f, 0x0078, 0x4886, 0x157e, 0x0c7e, | ||
| 1828 | 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x1078, 0x4501, 0x00c0, | ||
| 1829 | 0x4880, 0x6000, 0xd0ec, 0x0040, 0x4880, 0x047e, 0x62a0, 0xa294, | ||
| 1830 | 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x1078, 0x9ec0, 0x6000, | ||
| 1831 | 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, | ||
| 1832 | 0x6006, 0x2019, 0x0029, 0x1078, 0x5d53, 0x077e, 0x2039, 0x0000, | ||
| 1833 | 0x1078, 0x5c78, 0x2009, 0x0000, 0x1078, 0x9c38, 0x077f, 0x047f, | ||
| 1834 | 0x017f, 0x8108, 0x00f0, 0x4854, 0x0c7f, 0x157f, 0x007c, 0x0c7e, | ||
| 1835 | 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x0c7f, 0x007c, 0x7818, | ||
| 1836 | 0x2004, 0xd0ac, 0x007c, 0x7818, 0x2004, 0xd0bc, 0x007c, 0x0f7e, | ||
| 1837 | 0x2001, 0xa4b2, 0x2004, 0xa07d, 0x0040, 0x48a0, 0x7800, 0xd0ec, | ||
| 1838 | 0x0f7f, 0x007c, 0x127e, 0x027e, 0x2091, 0x8000, 0x6200, 0xa005, | ||
| 1839 | 0x0040, 0x48ad, 0xc2fd, 0x0078, 0x48ae, 0xc2fc, 0x6202, 0x027f, | ||
| 1840 | 0x127f, 0x007c, 0x2071, 0xa413, 0x7003, 0x0001, 0x7007, 0x0000, | ||
| 1841 | 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, 0x0000, 0x701f, 0x0000, | ||
| 1842 | 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, 0x0000, 0x705b, 0x0020, | ||
| 1843 | 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, 0xa57c, 0x7003, 0xa413, | ||
| 1844 | 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xa55c, 0x7013, 0x0020, | ||
| 1845 | 0x7017, 0x0040, 0x7037, 0x0000, 0x007c, 0x017e, 0x0e7e, 0x2071, | ||
| 1846 | 0xa534, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0xa352, | ||
| 1847 | 0x2004, 0xd0fc, 0x00c0, 0x48f7, 0x2001, 0xa352, 0x2004, 0xa00e, | ||
| 1848 | 0xd09c, 0x0040, 0x48f4, 0x8108, 0x7102, 0x0078, 0x494a, 0x2001, | ||
| 1849 | 0xa371, 0x200c, 0xa184, 0x000f, 0x2009, 0xa372, 0x210c, 0x0079, | ||
| 1850 | 0x4901, 0x48ec, 0x4922, 0x492a, 0x4935, 0x493b, 0x48ec, 0x48ec, | ||
| 1851 | 0x48ec, 0x4911, 0x48ec, 0x48ec, 0x48ec, 0x48ec, 0x48ec, 0x48ec, | ||
| 1852 | 0x48ec, 0x7003, 0x0004, 0x137e, 0x147e, 0x157e, 0x2099, 0xa375, | ||
| 1853 | 0x20a1, 0xa585, 0x20a9, 0x0004, 0x53a3, 0x157f, 0x147f, 0x137f, | ||
| 1854 | 0x0078, 0x494a, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, | ||
| 1855 | 0x0078, 0x4930, 0x708f, 0x0002, 0x7007, 0x0121, 0x2001, 0x0003, | ||
| 1856 | 0x7002, 0x7097, 0x0001, 0x0078, 0x4947, 0x7007, 0x0122, 0x2001, | ||
| 1857 | 0x0002, 0x0078, 0x493f, 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, | ||
| 1858 | 0xa006, 0x7096, 0x708e, 0xa184, 0xff00, 0x8007, 0x709a, 0xa184, | ||
| 1859 | 0x00ff, 0x7092, 0x0e7f, 0x017f, 0x007c, 0x0e7e, 0x2071, 0xa413, | ||
| 1860 | 0x684c, 0xa005, 0x00c0, 0x495b, 0x7028, 0xc085, 0x702a, 0xa085, | ||
| 1861 | 0x0001, 0x0078, 0x4980, 0x6a60, 0x7236, 0x6b64, 0x733a, 0x6868, | ||
| 1862 | 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, 0x702e, 0x6844, | ||
| 1863 | 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, 0x8007, 0x8006, | ||
| 1864 | 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, | ||
| 1865 | 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0xa006, | ||
| 1866 | 0x0e7f, 0x007c, 0x0e7e, 0x027e, 0x6838, 0xd0fc, 0x00c0, 0x49d8, | ||
| 1867 | 0x6804, 0xa00d, 0x0040, 0x499e, 0x0d7e, 0x2071, 0xa300, 0xa016, | ||
| 1868 | 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x00c0, | ||
| 1869 | 0x4991, 0x702e, 0x70a8, 0xa200, 0x70aa, 0x0d7f, 0x2071, 0xa413, | ||
| 1870 | 0x701c, 0xa005, 0x00c0, 0x49ea, 0x0068, 0x49e8, 0x2071, 0xa534, | ||
| 1871 | 0x7200, 0x82ff, 0x0040, 0x49e8, 0x6934, 0xa186, 0x0103, 0x00c0, | ||
| 1872 | 0x49fb, 0x6948, 0x6844, 0xa105, 0x00c0, 0x49db, 0x2009, 0x8020, | ||
| 1873 | 0x2200, 0x0079, 0x49bb, 0x49e8, 0x49c0, 0x4a18, 0x4a26, 0x49e8, | ||
| 1874 | 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x49e8, 0x7122, 0x683c, | ||
| 1875 | 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x2071, | ||
| 1876 | 0xa300, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70a8, 0x8000, 0x70aa, | ||
| 1877 | 0x027f, 0x0e7f, 0x007c, 0x6844, 0xa086, 0x0100, 0x00c0, 0x49e8, | ||
| 1878 | 0x6868, 0xa005, 0x00c0, 0x49e8, 0x2009, 0x8020, 0x0078, 0x49b8, | ||
| 1879 | 0x2071, 0xa413, 0x2d08, 0x206b, 0x0000, 0x7010, 0x8000, 0x7012, | ||
| 1880 | 0x7018, 0xa06d, 0x711a, 0x0040, 0x49f8, 0x6902, 0x0078, 0x49f9, | ||
| 1881 | 0x711e, 0x0078, 0x49d8, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0040, | ||
| 1882 | 0x4a09, 0xa186, 0x001e, 0x0040, 0x4a09, 0xa18e, 0x001f, 0x00c0, | ||
| 1883 | 0x49e8, 0x684c, 0xd0cc, 0x0040, 0x49e8, 0x6850, 0xa084, 0x00ff, | ||
| 1884 | 0xa086, 0x0001, 0x00c0, 0x49e8, 0x2009, 0x8021, 0x0078, 0x49b8, | ||
| 1885 | 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x49e8, 0x7186, 0xae90, | ||
| 1886 | 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x4a36, 0x7084, 0x8008, | ||
| 1887 | 0xa092, 0x000f, 0x00c8, 0x49e8, 0x7186, 0xae90, 0x0003, 0x8003, | ||
| 1888 | 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, | ||
| 1889 | 0x0048, 0x49cf, 0x718c, 0x7084, 0xa10a, 0x0048, 0x49cf, 0x2071, | ||
| 1890 | 0x0000, 0x7018, 0xd084, 0x00c0, 0x49cf, 0x2071, 0xa534, 0x7000, | ||
| 1891 | 0xa086, 0x0002, 0x00c0, 0x4a56, 0x1078, 0x4cd2, 0x2071, 0x0000, | ||
| 1892 | 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x49cf, 0x1078, 0x4cfd, | ||
| 1893 | 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x49cf, | ||
| 1894 | 0x007e, 0x684c, 0x007e, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, | ||
| 1895 | 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, 0x007f, 0xa084, 0x00ff, | ||
| 1896 | 0x684e, 0x007f, 0x684a, 0x6952, 0x007c, 0x2071, 0xa413, 0x7004, | ||
| 1897 | 0x0079, 0x4a7a, 0x4a84, 0x4a95, 0x4ca3, 0x4ca4, 0x4ccb, 0x4cd1, | ||
| 1898 | 0x4a85, 0x4c91, 0x4c32, 0x4cb4, 0x007c, 0x127e, 0x2091, 0x8000, | ||
| 1899 | 0x0068, 0x4a94, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, | ||
| 1900 | 0x7007, 0x0001, 0x700b, 0x0000, 0x127f, 0x2069, 0xa5be, 0x6844, | ||
| 1901 | 0xa005, 0x0050, 0x4abd, 0x00c0, 0x4abd, 0x127e, 0x2091, 0x8000, | ||
| 1902 | 0x2069, 0x0000, 0x6934, 0x2001, 0xa41f, 0x2004, 0xa10a, 0x0040, | ||
| 1903 | 0x4ab8, 0x0068, 0x4abc, 0x2069, 0x0000, 0x6818, 0xd084, 0x00c0, | ||
| 1904 | 0x4abc, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, | ||
| 1905 | 0x2069, 0xa5be, 0x6847, 0xffff, 0x127f, 0x2069, 0xa300, 0x6844, | ||
| 1906 | 0x6960, 0xa102, 0x2069, 0xa534, 0x688a, 0x6984, 0x701c, 0xa06d, | ||
| 1907 | 0x0040, 0x4acf, 0x81ff, 0x0040, 0x4b17, 0x0078, 0x4ae5, 0x81ff, | ||
| 1908 | 0x0040, 0x4be9, 0x2071, 0xa534, 0x7184, 0x7088, 0xa10a, 0x00c8, | ||
| 1909 | 0x4ae5, 0x7190, 0x2071, 0xa5be, 0x7040, 0xa005, 0x0040, 0x4ae5, | ||
| 1910 | 0x00d0, 0x4be9, 0x7142, 0x0078, 0x4be9, 0x2071, 0xa534, 0x718c, | ||
| 1911 | 0x127e, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0048, 0x4c06, 0x0068, | ||
| 1912 | 0x4b9b, 0x2071, 0x0000, 0x7018, 0xd084, 0x00c0, 0x4b9b, 0x2001, | ||
| 1913 | 0xffff, 0x2071, 0xa5be, 0x7042, 0x2071, 0xa534, 0x7000, 0xa086, | ||
| 1914 | 0x0002, 0x00c0, 0x4b0d, 0x1078, 0x4cd2, 0x2071, 0x0000, 0x701b, | ||
| 1915 | 0x0001, 0x2091, 0x4080, 0x0078, 0x4b9b, 0x1078, 0x4cfd, 0x2071, | ||
| 1916 | 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x4b9b, 0x2071, | ||
| 1917 | 0xa534, 0x7000, 0xa005, 0x0040, 0x4bc8, 0x6934, 0xa186, 0x0103, | ||
| 1918 | 0x00c0, 0x4b9e, 0x684c, 0xd0bc, 0x00c0, 0x4bc8, 0x6948, 0x6844, | ||
| 1919 | 0xa105, 0x00c0, 0x4bbb, 0x2009, 0x8020, 0x2071, 0xa534, 0x7000, | ||
| 1920 | 0x0079, 0x4b32, 0x4bc8, 0x4b80, 0x4b58, 0x4b6a, 0x4b37, 0x137e, | ||
| 1921 | 0x147e, 0x157e, 0x2099, 0xa375, 0x20a1, 0xa585, 0x20a9, 0x0004, | ||
| 1922 | 0x53a3, 0x157f, 0x147f, 0x137f, 0x2071, 0xa57c, 0xad80, 0x000f, | ||
| 1923 | 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, 0x2e10, | ||
| 1924 | 0x1078, 0x13d1, 0x2071, 0xa413, 0x7007, 0x0009, 0x0078, 0x4be9, | ||
| 1925 | 0x7084, 0x8008, 0xa092, 0x001e, 0x00c8, 0x4be9, 0xae90, 0x0003, | ||
| 1926 | 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xa413, 0x1078, 0x4d5b, | ||
| 1927 | 0x0078, 0x4be9, 0x7084, 0x8008, 0xa092, 0x000f, 0x00c8, 0x4be9, | ||
| 1928 | 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, | ||
| 1929 | 0x2012, 0x7186, 0x2071, 0xa413, 0x1078, 0x4d5b, 0x0078, 0x4be9, | ||
| 1930 | 0x127e, 0x2091, 0x8000, 0x0068, 0x4b9b, 0x2071, 0x0000, 0x7018, | ||
| 1931 | 0xd084, 0x00c0, 0x4b9b, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, | ||
| 1932 | 0x701b, 0x0001, 0x2091, 0x4080, 0x127f, 0x2071, 0xa413, 0x1078, | ||
| 1933 | 0x4d5b, 0x0078, 0x4be9, 0x127f, 0x0078, 0x4be9, 0xa18c, 0x00ff, | ||
| 1934 | 0xa186, 0x0017, 0x0040, 0x4bac, 0xa186, 0x001e, 0x0040, 0x4bac, | ||
| 1935 | 0xa18e, 0x001f, 0x00c0, 0x4bc8, 0x684c, 0xd0cc, 0x0040, 0x4bc8, | ||
| 1936 | 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x00c0, 0x4bc8, 0x2009, | ||
| 1937 | 0x8021, 0x0078, 0x4b2d, 0x6844, 0xa086, 0x0100, 0x00c0, 0x4bc8, | ||
| 1938 | 0x6868, 0xa005, 0x00c0, 0x4bc8, 0x2009, 0x8020, 0x0078, 0x4b2d, | ||
| 1939 | 0x2071, 0xa413, 0x1078, 0x4d6f, 0x0040, 0x4be9, 0x2071, 0xa413, | ||
| 1940 | 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x00c0, | ||
| 1941 | 0x4be0, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0040, 0x4be0, 0x710e, | ||
| 1942 | 0x7007, 0x0003, 0x1078, 0x4d8f, 0x7050, 0xa086, 0x0100, 0x0040, | ||
| 1943 | 0x4ca4, 0x127e, 0x2091, 0x8000, 0x2071, 0xa413, 0x7008, 0xa086, | ||
| 1944 | 0x0001, 0x00c0, 0x4c04, 0x0068, 0x4c04, 0x2009, 0x000d, 0x7030, | ||
| 1945 | 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, | ||
| 1946 | 0x00c0, 0x4c04, 0x7007, 0x0001, 0x127f, 0x007c, 0x2071, 0xa413, | ||
| 1947 | 0x1078, 0x4d6f, 0x0040, 0x4c2f, 0x2071, 0xa534, 0x7084, 0x700a, | ||
| 1948 | 0x20a9, 0x0020, 0x2099, 0xa535, 0x20a1, 0xa55c, 0x53a3, 0x7087, | ||
| 1949 | 0x0000, 0x2071, 0xa413, 0x2069, 0xa57c, 0x706c, 0x6826, 0x7070, | ||
| 1950 | 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, 0x1078, 0x13d1, | ||
| 1951 | 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xa5be, 0x7042, 0x127f, | ||
| 1952 | 0x0078, 0x4be9, 0x2069, 0xa57c, 0x6808, 0xa08e, 0x0000, 0x0040, | ||
| 1953 | 0x4c90, 0xa08e, 0x0200, 0x0040, 0x4c8e, 0xa08e, 0x0100, 0x00c0, | ||
| 1954 | 0x4c90, 0x127e, 0x2091, 0x8000, 0x0068, 0x4c8b, 0x2069, 0x0000, | ||
| 1955 | 0x6818, 0xd084, 0x00c0, 0x4c8b, 0x702c, 0x7130, 0x8108, 0xa102, | ||
| 1956 | 0x0048, 0x4c59, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0078, | ||
| 1957 | 0x4c63, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4c63, 0x7070, | ||
| 1958 | 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, 0x0000, 0x2001, | ||
| 1959 | 0xa559, 0x2004, 0xa005, 0x00c0, 0x4c82, 0x6934, 0x2069, 0xa534, | ||
| 1960 | 0x689c, 0x699e, 0x2069, 0xa5be, 0xa102, 0x00c0, 0x4c7b, 0x6844, | ||
| 1961 | 0xa005, 0x00d0, 0x4c89, 0x2001, 0xa55a, 0x200c, 0x810d, 0x6946, | ||
| 1962 | 0x0078, 0x4c89, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, | ||
| 1963 | 0x4080, 0x7007, 0x0001, 0x127f, 0x0078, 0x4c90, 0x7007, 0x0005, | ||
| 1964 | 0x007c, 0x701c, 0xa06d, 0x0040, 0x4ca2, 0x1078, 0x4d6f, 0x0040, | ||
| 1965 | 0x4ca2, 0x7007, 0x0003, 0x1078, 0x4d8f, 0x7050, 0xa086, 0x0100, | ||
| 1966 | 0x0040, 0x4ca4, 0x007c, 0x007c, 0x7050, 0xa09e, 0x0100, 0x00c0, | ||
| 1967 | 0x4cad, 0x7007, 0x0004, 0x0078, 0x4ccb, 0xa086, 0x0200, 0x00c0, | ||
| 1968 | 0x4cb3, 0x7007, 0x0005, 0x007c, 0x2001, 0xa57e, 0x2004, 0xa08e, | ||
| 1969 | 0x0100, 0x00c0, 0x4cc0, 0x7007, 0x0001, 0x1078, 0x4d5b, 0x007c, | ||
| 1970 | 0xa08e, 0x0000, 0x0040, 0x4cbf, 0xa08e, 0x0200, 0x00c0, 0x4cbf, | ||
| 1971 | 0x7007, 0x0005, 0x007c, 0x1078, 0x4d25, 0x7006, 0x1078, 0x4d5b, | ||
| 1972 | 0x007c, 0x007c, 0x0e7e, 0x157e, 0x2071, 0xa534, 0x7184, 0x81ff, | ||
| 1973 | 0x0040, 0x4cfa, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, | ||
| 1974 | 0x21a8, 0x2014, 0x7226, 0x8000, 0x0070, 0x4cf7, 0x2014, 0x722a, | ||
| 1975 | 0x8000, 0x0070, 0x4cf7, 0x2014, 0x722e, 0x8000, 0x0070, 0x4cf7, | ||
| 1976 | 0x2014, 0x723a, 0x8000, 0x0070, 0x4cf7, 0x2014, 0x723e, 0xa180, | ||
| 1977 | 0x8030, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x0e7e, 0x157e, 0x2071, | ||
| 1978 | 0xa534, 0x7184, 0x81ff, 0x0040, 0x4d22, 0xa006, 0x7086, 0xae80, | ||
| 1979 | 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, | ||
| 1980 | 0x722a, 0x8000, 0x0070, 0x4d1b, 0x2014, 0x723a, 0x8000, 0x2014, | ||
| 1981 | 0x723e, 0x0078, 0x4d1f, 0x2001, 0x8020, 0x0078, 0x4d21, 0x2001, | ||
| 1982 | 0x8042, 0x7022, 0x157f, 0x0e7f, 0x007c, 0x702c, 0x7130, 0x8108, | ||
| 1983 | 0xa102, 0x0048, 0x4d32, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, | ||
| 1984 | 0x0078, 0x4d3c, 0x706c, 0xa080, 0x0040, 0x706e, 0x00c8, 0x4d3c, | ||
| 1985 | 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x700c, 0x8001, 0x700e, | ||
| 1986 | 0x00c0, 0x4d52, 0x127e, 0x2091, 0x8000, 0x0068, 0x4d55, 0x2001, | ||
| 1987 | 0x000d, 0x2102, 0x2091, 0x4080, 0x2001, 0x0001, 0x700b, 0x0000, | ||
| 1988 | 0x127f, 0x007c, 0x2001, 0x0007, 0x007c, 0x2001, 0x0006, 0x700b, | ||
| 1989 | 0x0001, 0x127f, 0x007c, 0x701c, 0xa06d, 0x0040, 0x4d6e, 0x127e, | ||
| 1990 | 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, 0x2d04, 0x701e, 0xa005, | ||
| 1991 | 0x00c0, 0x4d6b, 0x701a, 0x127f, 0x1078, 0x139a, 0x007c, 0x2019, | ||
| 1992 | 0x000d, 0x2304, 0x230c, 0xa10e, 0x0040, 0x4d7e, 0x2304, 0x230c, | ||
| 1993 | 0xa10e, 0x0040, 0x4d7e, 0xa006, 0x0078, 0x4d8e, 0x732c, 0x8319, | ||
| 1994 | 0x7130, 0xa102, 0x00c0, 0x4d88, 0x2300, 0xa005, 0x0078, 0x4d8e, | ||
| 1995 | 0x0048, 0x4d8d, 0xa302, 0x0078, 0x4d8e, 0x8002, 0x007c, 0x2d00, | ||
| 1996 | 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, 0x0000, 0x127e, 0x2091, | ||
| 1997 | 0x8000, 0x2009, 0xa5d0, 0x2104, 0xc08d, 0x200a, 0x127f, 0x1078, | ||
| 1998 | 0x13eb, 0x007c, 0x2071, 0xa3e1, 0x7003, 0x0000, 0x7007, 0x0000, | ||
| 1999 | 0x700f, 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053, 0x0001, | ||
| 2000 | 0x705f, 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b, 0x0000, | ||
| 2001 | 0x708f, 0x0001, 0x70bf, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa3e1, | ||
| 2002 | 0x6848, 0xa005, 0x00c0, 0x4dcb, 0x7028, 0xc085, 0x702a, 0xa085, | ||
| 2003 | 0x0001, 0x0078, 0x4df0, 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, | ||
| 2004 | 0x703e, 0x707a, 0x685c, 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, | ||
| 2005 | 0x7032, 0x2009, 0x000c, 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, | ||
| 2006 | 0x003f, 0xa084, 0xffc0, 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, | ||
| 2007 | 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, | ||
| 2008 | 0x0e7f, 0x007c, 0x2b78, 0x2071, 0xa3e1, 0x7004, 0x1079, 0x4e50, | ||
| 2009 | 0x700c, 0x0079, 0x4dfb, 0x4e00, 0x4df5, 0x4df5, 0x4df5, 0x4df5, | ||
| 2010 | 0x007c, 0x700c, 0x0079, 0x4e04, 0x4e09, 0x4e4e, 0x4e4e, 0x4e4f, | ||
| 2011 | 0x4e4f, 0x7830, 0x7930, 0xa106, 0x0040, 0x4e13, 0x7830, 0x7930, | ||
| 2012 | 0xa106, 0x00c0, 0x4e39, 0x7030, 0xa10a, 0x0040, 0x4e39, 0x00c8, | ||
| 2013 | 0x4e1b, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x00c8, 0x4e3a, 0x1078, | ||
| 2014 | 0x1366, 0x0040, 0x4e39, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, | ||
| 2015 | 0x0003, 0x7057, 0x0000, 0x127e, 0x007e, 0x2091, 0x8000, 0x2009, | ||
| 2016 | 0xa5d0, 0x2104, 0xc085, 0x200a, 0x007f, 0x700e, 0x127f, 0x1078, | ||
| 2017 | 0x13eb, 0x007c, 0x1078, 0x1366, 0x0040, 0x4e39, 0x2d00, 0x705a, | ||
| 2018 | 0x1078, 0x1366, 0x00c0, 0x4e46, 0x0078, 0x4e25, 0x2d00, 0x7086, | ||
| 2019 | 0x7063, 0x0080, 0x2001, 0x0004, 0x0078, 0x4e29, 0x007c, 0x007c, | ||
| 2020 | 0x4e61, 0x4e62, 0x4e99, 0x4e9a, 0x4e4e, 0x4ed0, 0x4ed5, 0x4f0c, | ||
| 2021 | 0x4f0d, 0x4f28, 0x4f29, 0x4f2a, 0x4f2b, 0x4f2c, 0x4f2d, 0x4fad, | ||
| 2022 | 0x4fd7, 0x007c, 0x700c, 0x0079, 0x4e65, 0x4e6a, 0x4e6d, 0x4e7d, | ||
| 2023 | 0x4e98, 0x4e98, 0x1078, 0x4e01, 0x007c, 0x127e, 0x8001, 0x700e, | ||
| 2024 | 0x7058, 0x007e, 0x1078, 0x5348, 0x0040, 0x4e7a, 0x2091, 0x8000, | ||
| 2025 | 0x1078, 0x4e01, 0x0d7f, 0x0078, 0x4e86, 0x127e, 0x8001, 0x700e, | ||
| 2026 | 0x1078, 0x5348, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, | ||
| 2027 | 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x0020, 0x00c8, | ||
| 2028 | 0x4e95, 0x1079, 0x4eb0, 0x127f, 0x007c, 0x127f, 0x1078, 0x4f2e, | ||
| 2029 | 0x007c, 0x007c, 0x007c, 0x0e7e, 0x2071, 0xa3e1, 0x700c, 0x0079, | ||
| 2030 | 0x4ea1, 0x4ea6, 0x4ea6, 0x4ea6, 0x4ea8, 0x4eac, 0x0e7f, 0x007c, | ||
| 2031 | 0x700f, 0x0001, 0x0078, 0x4eae, 0x700f, 0x0002, 0x0e7f, 0x007c, | ||
| 2032 | 0x4f2e, 0x4f2e, 0x4f4a, 0x4f2e, 0x5080, 0x4f2e, 0x4f2e, 0x4f2e, | ||
| 2033 | 0x4f2e, 0x4f2e, 0x4f4a, 0x50ca, 0x5117, 0x5170, 0x5186, 0x4f2e, | ||
| 2034 | 0x4f2e, 0x4f66, 0x4f4a, 0x4f2e, 0x4f2e, 0x4f87, 0x5245, 0x5263, | ||
| 2035 | 0x4f2e, 0x4f66, 0x4f2e, 0x4f2e, 0x4f2e, 0x4f2e, 0x4f7c, 0x5263, | ||
| 2036 | 0x7020, 0x2068, 0x1078, 0x139a, 0x007c, 0x700c, 0x0079, 0x4ed8, | ||
| 2037 | 0x4edd, 0x4ee0, 0x4ef0, 0x4f0b, 0x4f0b, 0x1078, 0x4e01, 0x007c, | ||
| 2038 | 0x127e, 0x8001, 0x700e, 0x7058, 0x007e, 0x1078, 0x5348, 0x0040, | ||
| 2039 | 0x4eed, 0x2091, 0x8000, 0x1078, 0x4e01, 0x0d7f, 0x0078, 0x4ef9, | ||
| 2040 | 0x127e, 0x8001, 0x700e, 0x1078, 0x5348, 0x7058, 0x2068, 0x7084, | ||
| 2041 | 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, | ||
| 2042 | 0xa08a, 0x001a, 0x00c8, 0x4f08, 0x1079, 0x4f0e, 0x127f, 0x007c, | ||
| 2043 | 0x127f, 0x1078, 0x4f2e, 0x007c, 0x007c, 0x007c, 0x4f2e, 0x4f4a, | ||
| 2044 | 0x506a, 0x4f2e, 0x4f4a, 0x4f2e, 0x4f4a, 0x4f4a, 0x4f2e, 0x4f4a, | ||
| 2045 | 0x506a, 0x4f4a, 0x4f4a, 0x4f4a, 0x4f4a, 0x4f4a, 0x4f2e, 0x4f4a, | ||
| 2046 | 0x506a, 0x4f2e, 0x4f2e, 0x4f4a, 0x4f2e, 0x4f2e, 0x4f2e, 0x4f4a, | ||
| 2047 | 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x007c, 0x7007, 0x0001, | ||
| 2048 | 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x127e, 0x2091, 0x8000, | ||
| 2049 | 0x1078, 0x4982, 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, | ||
| 2050 | 0x00ff, 0xc0e5, 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4982, | ||
| 2051 | 0x127f, 0x007c, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, | ||
| 2052 | 0x683a, 0x127e, 0x2091, 0x8000, 0x1078, 0x4982, 0x127f, 0x007c, | ||
| 2053 | 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x127e, | ||
| 2054 | 0x2091, 0x8000, 0x1078, 0x4982, 0x127f, 0x007c, 0x6834, 0x8007, | ||
| 2055 | 0xa084, 0x00ff, 0x0040, 0x4f3c, 0x8001, 0x00c0, 0x4f73, 0x7007, | ||
| 2056 | 0x0001, 0x0078, 0x5049, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, | ||
| 2057 | 0x701a, 0x704b, 0x5049, 0x007c, 0x684c, 0xa084, 0x00c0, 0xa086, | ||
| 2058 | 0x00c0, 0x00c0, 0x4f87, 0x7007, 0x0001, 0x0078, 0x5280, 0x2d00, | ||
| 2059 | 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, | ||
| 2060 | 0xa40c, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x00c8, 0x4f58, | ||
| 2061 | 0x6884, 0xa08a, 0x0002, 0x00c8, 0x4f58, 0x82ff, 0x00c0, 0x4fa9, | ||
| 2062 | 0x6888, 0x698c, 0xa105, 0x0040, 0x4fa9, 0x2001, 0x5019, 0x0078, | ||
| 2063 | 0x4fac, 0xa280, 0x500f, 0x2004, 0x70c6, 0x7010, 0xa015, 0x0040, | ||
| 2064 | 0x4ff7, 0x1078, 0x1366, 0x00c0, 0x4fb8, 0x7007, 0x000f, 0x007c, | ||
| 2065 | 0x2d00, 0x7022, 0x70c4, 0x2060, 0x6000, 0x6836, 0x6004, 0xad00, | ||
| 2066 | 0x7096, 0x6008, 0xa20a, 0x00c8, 0x4fc7, 0xa00e, 0x2200, 0x7112, | ||
| 2067 | 0x620c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0040, 0x4fd0, 0xa108, | ||
| 2068 | 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x1078, 0x13d1, 0x7090, | ||
| 2069 | 0xa08e, 0x0100, 0x0040, 0x4feb, 0xa086, 0x0200, 0x0040, 0x4fe3, | ||
| 2070 | 0x7007, 0x0010, 0x007c, 0x7020, 0x2068, 0x1078, 0x139a, 0x7014, | ||
| 2071 | 0x2068, 0x0078, 0x4f58, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, | ||
| 2072 | 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0078, 0x4fad, 0x7014, | ||
| 2073 | 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x00c0, 0x5006, 0x6888, | ||
| 2074 | 0x698c, 0xa105, 0x0040, 0x5006, 0x1078, 0x501d, 0x6834, 0xa084, | ||
| 2075 | 0x00ff, 0xa086, 0x001e, 0x0040, 0x5280, 0x0078, 0x5049, 0x5011, | ||
| 2076 | 0x5015, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, 0x000f, 0x0005, | ||
| 2077 | 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x0f7e, 0x0e7e, 0x0c7e, | ||
| 2078 | 0x077e, 0x067e, 0x6f88, 0x6e8c, 0x6804, 0x2060, 0xacf0, 0x0021, | ||
| 2079 | 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, 0x7008, 0x7812, | ||
| 2080 | 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, 0x8109, 0x0040, | ||
| 2081 | 0x503f, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0078, 0x502c, 0x6004, | ||
| 2082 | 0xa065, 0x00c0, 0x5026, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x0f7f, | ||
| 2083 | 0x007c, 0x2009, 0xa32e, 0x210c, 0x81ff, 0x00c0, 0x5064, 0x6838, | ||
| 2084 | 0xa084, 0x00ff, 0x683a, 0x1078, 0x4290, 0x00c0, 0x5058, 0x007c, | ||
| 2085 | 0x1078, 0x4a60, 0x127e, 0x2091, 0x8000, 0x1078, 0x8cb8, 0x1078, | ||
| 2086 | 0x4982, 0x127f, 0x0078, 0x5057, 0x2001, 0x0028, 0x2009, 0x0000, | ||
| 2087 | 0x0078, 0x5058, 0x7018, 0x6802, 0x2d08, 0x2068, 0x6906, 0x711a, | ||
| 2088 | 0x7010, 0x8001, 0x7012, 0x0040, 0x5079, 0x7007, 0x0006, 0x0078, | ||
| 2089 | 0x507f, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, 0x107a, 0x007c, | ||
| 2090 | 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x6848, 0xa084, | ||
| 2091 | 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x0040, 0x50a9, 0x2009, | ||
| 2092 | 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0040, 0x50a9, 0xa005, | ||
| 2093 | 0x00c0, 0x50bc, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x1078, 0x4501, | ||
| 2094 | 0x00c0, 0x50bc, 0x067e, 0x6e50, 0x1078, 0x45e7, 0x067f, 0x0078, | ||
| 2095 | 0x50bc, 0x047e, 0x2011, 0xa30c, 0x2224, 0xc484, 0xc48c, 0x2412, | ||
| 2096 | 0x047f, 0x0c7e, 0x1078, 0x4501, 0x00c0, 0x50b8, 0x1078, 0x4782, | ||
| 2097 | 0x8108, 0x00f0, 0x50b2, 0x0c7f, 0x684c, 0xd084, 0x00c0, 0x50c3, | ||
| 2098 | 0x1078, 0x139a, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, 0x4982, | ||
| 2099 | 0x127f, 0x007c, 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, | ||
| 2100 | 0xa352, 0x2004, 0xd0a4, 0x0040, 0x510e, 0x2061, 0xa62d, 0x6100, | ||
| 2101 | 0xd184, 0x0040, 0x50ee, 0x6858, 0xa084, 0x00ff, 0x00c0, 0x5111, | ||
| 2102 | 0x6000, 0xd084, 0x0040, 0x510e, 0x6004, 0xa005, 0x00c0, 0x5114, | ||
| 2103 | 0x6003, 0x0000, 0x600b, 0x0000, 0x0078, 0x510b, 0x2011, 0x0001, | ||
| 2104 | 0x6860, 0xa005, 0x00c0, 0x50f6, 0x2001, 0x001e, 0x8000, 0x6016, | ||
| 2105 | 0x6858, 0xa084, 0x00ff, 0x0040, 0x510e, 0x6006, 0x6858, 0x8007, | ||
| 2106 | 0xa084, 0x00ff, 0x0040, 0x510e, 0x600a, 0x6858, 0x8000, 0x00c0, | ||
| 2107 | 0x510a, 0xc28d, 0x6202, 0x127f, 0x0078, 0x5337, 0x127f, 0x0078, | ||
| 2108 | 0x532f, 0x127f, 0x0078, 0x5327, 0x127f, 0x0078, 0x532b, 0x127e, | ||
| 2109 | 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xa352, 0x2004, 0xd0a4, | ||
| 2110 | 0x0040, 0x516d, 0x2061, 0xa62d, 0x6000, 0xd084, 0x0040, 0x516d, | ||
| 2111 | 0x6204, 0x6308, 0xd08c, 0x00c0, 0x515f, 0x6c48, 0xa484, 0x0003, | ||
| 2112 | 0x0040, 0x5145, 0x6958, 0xa18c, 0x00ff, 0x8001, 0x00c0, 0x513e, | ||
| 2113 | 0x2100, 0xa210, 0x0048, 0x516a, 0x0078, 0x5145, 0x8001, 0x00c0, | ||
| 2114 | 0x516a, 0x2100, 0xa212, 0x0048, 0x516a, 0xa484, 0x000c, 0x0040, | ||
| 2115 | 0x515f, 0x6958, 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x00c0, | ||
| 2116 | 0x5157, 0x2100, 0xa318, 0x0048, 0x516a, 0x0078, 0x515f, 0xa082, | ||
| 2117 | 0x0004, 0x00c0, 0x516a, 0x2100, 0xa31a, 0x0048, 0x516a, 0x6860, | ||
| 2118 | 0xa005, 0x0040, 0x5165, 0x8000, 0x6016, 0x6206, 0x630a, 0x127f, | ||
| 2119 | 0x0078, 0x5337, 0x127f, 0x0078, 0x5333, 0x127f, 0x0078, 0x532f, | ||
| 2120 | 0x127e, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xa62d, 0x6300, | ||
| 2121 | 0xd38c, 0x00c0, 0x5180, 0x6308, 0x8318, 0x0048, 0x5183, 0x630a, | ||
| 2122 | 0x127f, 0x0078, 0x5345, 0x127f, 0x0078, 0x5333, 0x127e, 0x0c7e, | ||
| 2123 | 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0040, 0x519a, | ||
| 2124 | 0x0c7e, 0x2061, 0xa62d, 0x6000, 0xa084, 0xfcff, 0x6002, 0x0c7f, | ||
| 2125 | 0x0078, 0x51c9, 0x6858, 0xa005, 0x0040, 0x51e0, 0x685c, 0xa065, | ||
| 2126 | 0x0040, 0x51dc, 0x2001, 0xa32e, 0x2004, 0xa005, 0x0040, 0x51ac, | ||
| 2127 | 0x1078, 0x8c01, 0x0078, 0x51ba, 0x6013, 0x0400, 0x6037, 0x0000, | ||
| 2128 | 0x694c, 0xd1a4, 0x0040, 0x51b6, 0x6950, 0x6136, 0x2009, 0x0041, | ||
| 2129 | 0x1078, 0x756c, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000, 0x00c0, | ||
| 2130 | 0x51c9, 0x027e, 0x2009, 0x0000, 0x2011, 0xfdff, 0x1078, 0x5a6d, | ||
| 2131 | 0x027f, 0x684c, 0xd0c4, 0x0040, 0x51d8, 0x2061, 0xa62d, 0x6000, | ||
| 2132 | 0xd08c, 0x00c0, 0x51d8, 0x6008, 0x8000, 0x0048, 0x51dc, 0x600a, | ||
| 2133 | 0x0c7f, 0x127f, 0x0078, 0x5337, 0x0c7f, 0x127f, 0x0078, 0x532f, | ||
| 2134 | 0x6954, 0xa186, 0x0045, 0x0040, 0x5213, 0xa186, 0x002a, 0x00c0, | ||
| 2135 | 0x51f0, 0x2001, 0xa30c, 0x200c, 0xc194, 0x2102, 0x0078, 0x51c9, | ||
| 2136 | 0xa186, 0x0020, 0x0040, 0x5209, 0xa186, 0x0029, 0x0040, 0x51fc, | ||
| 2137 | 0xa186, 0x002d, 0x00c0, 0x51dc, 0x6944, 0xa18c, 0xff00, 0x810f, | ||
| 2138 | 0x1078, 0x4501, 0x00c0, 0x51c9, 0x6000, 0xc0e4, 0x6002, 0x0078, | ||
| 2139 | 0x51c9, 0x685c, 0xa065, 0x0040, 0x51dc, 0x2001, 0xa5a1, 0x2004, | ||
| 2140 | 0x6016, 0x0078, 0x51c9, 0x685c, 0xa065, 0x0040, 0x51dc, 0x0e7e, | ||
| 2141 | 0x6860, 0xa075, 0x2001, 0xa32e, 0x2004, 0xa005, 0x0040, 0x522b, | ||
| 2142 | 0x1078, 0x8c01, 0x8eff, 0x0040, 0x5228, 0x2e60, 0x1078, 0x8c01, | ||
| 2143 | 0x0e7f, 0x0078, 0x51c9, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, | ||
| 2144 | 0x6007, 0x003a, 0x6870, 0xa005, 0x0040, 0x523c, 0x6007, 0x003b, | ||
| 2145 | 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x1078, 0x5bf8, | ||
| 2146 | 0x1078, 0x6109, 0x0e7f, 0x0078, 0x51c9, 0x2061, 0xa62d, 0x6000, | ||
| 2147 | 0xd084, 0x0040, 0x525f, 0xd08c, 0x00c0, 0x5345, 0x2091, 0x8000, | ||
| 2148 | 0x6204, 0x8210, 0x0048, 0x5259, 0x6206, 0x2091, 0x8001, 0x0078, | ||
| 2149 | 0x5345, 0x2091, 0x8001, 0x6853, 0x0016, 0x0078, 0x533e, 0x6853, | ||
| 2150 | 0x0007, 0x0078, 0x533e, 0x6834, 0x8007, 0xa084, 0x00ff, 0x00c0, | ||
| 2151 | 0x526d, 0x1078, 0x4f3c, 0x0078, 0x527f, 0x2030, 0x8001, 0x00c0, | ||
| 2152 | 0x5277, 0x7007, 0x0001, 0x1078, 0x5280, 0x0078, 0x527f, 0x7007, | ||
| 2153 | 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x5280, 0x007c, | ||
| 2154 | 0x0e7e, 0x127e, 0x2091, 0x8000, 0x2009, 0xa32e, 0x210c, 0x81ff, | ||
| 2155 | 0x00c0, 0x530b, 0x2009, 0xa30c, 0x210c, 0xd194, 0x00c0, 0x5315, | ||
| 2156 | 0x6848, 0x2070, 0xae82, 0xaa00, 0x0048, 0x52fb, 0x2001, 0xa315, | ||
| 2157 | 0x2004, 0xae02, 0x00c8, 0x52fb, 0x2061, 0xa62d, 0x6100, 0xa184, | ||
| 2158 | 0x0301, 0xa086, 0x0001, 0x00c0, 0x52de, 0x711c, 0xa186, 0x0006, | ||
| 2159 | 0x00c0, 0x52e6, 0x7018, 0xa005, 0x0040, 0x530b, 0x2004, 0xd0e4, | ||
| 2160 | 0x00c0, 0x530f, 0x7024, 0xd0dc, 0x00c0, 0x5319, 0x6853, 0x0000, | ||
| 2161 | 0x6803, 0x0000, 0x2d08, 0x7010, 0xa005, 0x00c0, 0x52ca, 0x7112, | ||
| 2162 | 0x684c, 0xd0f4, 0x00c0, 0x531d, 0x2e60, 0x1078, 0x59b6, 0x127f, | ||
| 2163 | 0x0e7f, 0x007c, 0x2068, 0x6800, 0xa005, 0x00c0, 0x52ca, 0x6902, | ||
| 2164 | 0x2168, 0x684c, 0xd0f4, 0x00c0, 0x531d, 0x127f, 0x0e7f, 0x007c, | ||
| 2165 | 0x127f, 0x0e7f, 0x6853, 0x0006, 0x0078, 0x533e, 0xd184, 0x0040, | ||
| 2166 | 0x52d8, 0xd1c4, 0x00c0, 0x52ff, 0x0078, 0x5303, 0x6944, 0xa18c, | ||
| 2167 | 0xff00, 0x810f, 0x1078, 0x4501, 0x00c0, 0x530f, 0x6000, 0xd0e4, | ||
| 2168 | 0x00c0, 0x530f, 0x711c, 0xa186, 0x0007, 0x00c0, 0x52fb, 0x6853, | ||
| 2169 | 0x0002, 0x0078, 0x5311, 0x6853, 0x0008, 0x0078, 0x5311, 0x6853, | ||
| 2170 | 0x000e, 0x0078, 0x5311, 0x6853, 0x0017, 0x0078, 0x5311, 0x6853, | ||
| 2171 | 0x0035, 0x0078, 0x5311, 0x6853, 0x0028, 0x0078, 0x5311, 0x6853, | ||
| 2172 | 0x0029, 0x127f, 0x0e7f, 0x0078, 0x533e, 0x6853, 0x002a, 0x0078, | ||
| 2173 | 0x5311, 0x6853, 0x0045, 0x0078, 0x5311, 0x2e60, 0x2019, 0x0002, | ||
| 2174 | 0x6017, 0x0014, 0x1078, 0x9a6a, 0x127f, 0x0e7f, 0x007c, 0x2009, | ||
| 2175 | 0x003e, 0x0078, 0x5339, 0x2009, 0x0004, 0x0078, 0x5339, 0x2009, | ||
| 2176 | 0x0006, 0x0078, 0x5339, 0x2009, 0x0016, 0x0078, 0x5339, 0x2009, | ||
| 2177 | 0x0001, 0x6854, 0xa084, 0xff00, 0xa105, 0x6856, 0x2091, 0x8000, | ||
| 2178 | 0x1078, 0x4982, 0x2091, 0x8001, 0x007c, 0x1078, 0x139a, 0x007c, | ||
| 2179 | 0x702c, 0x7130, 0x8108, 0xa102, 0x0048, 0x5355, 0xa00e, 0x7034, | ||
| 2180 | 0x7072, 0x7038, 0x7076, 0x0078, 0x5361, 0x7070, 0xa080, 0x0040, | ||
| 2181 | 0x7072, 0x00c8, 0x5361, 0x7074, 0xa081, 0x0000, 0x7076, 0xa085, | ||
| 2182 | 0x0001, 0x7932, 0x7132, 0x007c, 0x0d7e, 0x1078, 0x59ad, 0x0d7f, | ||
| 2183 | 0x007c, 0x0d7e, 0x2011, 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, | ||
| 2184 | 0x0d7f, 0x007c, 0x20e1, 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, | ||
| 2185 | 0xa084, 0x7000, 0x0040, 0x5380, 0xa086, 0x1000, 0x00c0, 0x53ac, | ||
| 2186 | 0x20e1, 0x0000, 0x3d00, 0xa094, 0xff00, 0x8217, 0xa084, 0xf000, | ||
| 2187 | 0xa086, 0x3000, 0x00c0, 0x5390, 0x1078, 0x5570, 0x0078, 0x53a7, | ||
| 2188 | 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x00c0, 0x5397, 0x3e60, 0xac84, | ||
| 2189 | 0x000f, 0x00c0, 0x53ac, 0xac82, 0xaa00, 0x0048, 0x53ac, 0x6854, | ||
| 2190 | 0xac02, 0x00c8, 0x53ac, 0x2009, 0x0047, 0x1078, 0x756c, 0x7a1c, | ||
| 2191 | 0xd284, 0x00c0, 0x5372, 0x007c, 0xa016, 0x1078, 0x15ec, 0x0078, | ||
| 2192 | 0x53a7, 0x0078, 0x53ac, 0x781c, 0xd08c, 0x0040, 0x53db, 0x157e, | ||
| 2193 | 0x137e, 0x147e, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, | ||
| 2194 | 0x00c0, 0x53f1, 0xa484, 0x7000, 0xa086, 0x1000, 0x00c0, 0x53e0, | ||
| 2195 | 0x1078, 0x540c, 0x0040, 0x53f1, 0x20e1, 0x3000, 0x7828, 0x7828, | ||
| 2196 | 0x1078, 0x542a, 0x147f, 0x137f, 0x157f, 0x2009, 0xa5b3, 0x2104, | ||
| 2197 | 0xa005, 0x00c0, 0x53dc, 0x007c, 0x1078, 0x6109, 0x0078, 0x53db, | ||
| 2198 | 0xa484, 0x7000, 0x00c0, 0x53f1, 0x1078, 0x540c, 0x0040, 0x5403, | ||
| 2199 | 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0040, 0x53cc, 0x0078, | ||
| 2200 | 0x5403, 0x1078, 0xa1ee, 0xd5a4, 0x0040, 0x53ff, 0x1078, 0x1af7, | ||
| 2201 | 0x20e1, 0x9010, 0x2001, 0x0138, 0x2202, 0x0078, 0x5407, 0x1078, | ||
| 2202 | 0x540c, 0x687f, 0x0000, 0x20e1, 0x3000, 0x7828, 0x7828, 0x147f, | ||
| 2203 | 0x137f, 0x157f, 0x0078, 0x53db, 0xa484, 0x01ff, 0x687e, 0xa005, | ||
| 2204 | 0x0040, 0x541e, 0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, 0x20e1, | ||
| 2205 | 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x007c, 0x20a9, 0x000c, | ||
| 2206 | 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, 0x0001, | ||
| 2207 | 0x0078, 0x541d, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, | ||
| 2208 | 0xa196, 0x0000, 0x00c0, 0x5437, 0x0078, 0x567c, 0x007c, 0xa196, | ||
| 2209 | 0x2000, 0x00c0, 0x5448, 0x6900, 0xa18e, 0x0001, 0x00c0, 0x5444, | ||
| 2210 | 0x1078, 0x3a43, 0x0078, 0x5436, 0x1078, 0x5450, 0x0078, 0x5436, | ||
| 2211 | 0xa196, 0x8000, 0x00c0, 0x5436, 0x1078, 0x570c, 0x0078, 0x5436, | ||
| 2212 | 0x0c7e, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0040, | ||
| 2213 | 0x545d, 0xa196, 0x0023, 0x00c0, 0x5568, 0xa08e, 0x0023, 0x00c0, | ||
| 2214 | 0x5492, 0x1078, 0x57b2, 0x0040, 0x5568, 0x7124, 0x610a, 0x7030, | ||
| 2215 | 0xa08e, 0x0200, 0x00c0, 0x5476, 0x7034, 0xa005, 0x00c0, 0x5568, | ||
| 2216 | 0x2009, 0x0015, 0x1078, 0x756c, 0x0078, 0x5568, 0xa08e, 0x0214, | ||
| 2217 | 0x0040, 0x547e, 0xa08e, 0x0210, 0x00c0, 0x5484, 0x2009, 0x0015, | ||
| 2218 | 0x1078, 0x756c, 0x0078, 0x5568, 0xa08e, 0x0100, 0x00c0, 0x5568, | ||
| 2219 | 0x7034, 0xa005, 0x00c0, 0x5568, 0x2009, 0x0016, 0x1078, 0x756c, | ||
| 2220 | 0x0078, 0x5568, 0xa08e, 0x0022, 0x00c0, 0x5568, 0x7030, 0xa08e, | ||
| 2221 | 0x0300, 0x00c0, 0x54a3, 0x7034, 0xa005, 0x00c0, 0x5568, 0x2009, | ||
| 2222 | 0x0017, 0x0078, 0x5534, 0xa08e, 0x0500, 0x00c0, 0x54af, 0x7034, | ||
| 2223 | 0xa005, 0x00c0, 0x5568, 0x2009, 0x0018, 0x0078, 0x5534, 0xa08e, | ||
| 2224 | 0x2010, 0x00c0, 0x54b7, 0x2009, 0x0019, 0x0078, 0x5534, 0xa08e, | ||
| 2225 | 0x2110, 0x00c0, 0x54bf, 0x2009, 0x001a, 0x0078, 0x5534, 0xa08e, | ||
| 2226 | 0x5200, 0x00c0, 0x54cb, 0x7034, 0xa005, 0x00c0, 0x5568, 0x2009, | ||
| 2227 | 0x001b, 0x0078, 0x5534, 0xa08e, 0x5000, 0x00c0, 0x54d7, 0x7034, | ||
| 2228 | 0xa005, 0x00c0, 0x5568, 0x2009, 0x001c, 0x0078, 0x5534, 0xa08e, | ||
| 2229 | 0x1300, 0x00c0, 0x54df, 0x2009, 0x0034, 0x0078, 0x5534, 0xa08e, | ||
| 2230 | 0x1200, 0x00c0, 0x54eb, 0x7034, 0xa005, 0x00c0, 0x5568, 0x2009, | ||
| 2231 | 0x0024, 0x0078, 0x5534, 0xa08c, 0xff00, 0xa18e, 0x2400, 0x00c0, | ||
| 2232 | 0x54f5, 0x2009, 0x002d, 0x0078, 0x5534, 0xa08c, 0xff00, 0xa18e, | ||
| 2233 | 0x5300, 0x00c0, 0x54ff, 0x2009, 0x002a, 0x0078, 0x5534, 0xa08e, | ||
| 2234 | 0x0f00, 0x00c0, 0x5507, 0x2009, 0x0020, 0x0078, 0x5534, 0xa08e, | ||
| 2235 | 0x5300, 0x00c0, 0x550d, 0x0078, 0x552a, 0xa08e, 0x6104, 0x00c0, | ||
| 2236 | 0x552a, 0x2011, 0xa88d, 0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, | ||
| 2237 | 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, 0x8108, 0x047e, 0x2124, | ||
| 2238 | 0x1078, 0x3579, 0x047f, 0x8108, 0x00f0, 0x551a, 0x2009, 0x0023, | ||
| 2239 | 0x0078, 0x5534, 0xa08e, 0x6000, 0x00c0, 0x5532, 0x2009, 0x003f, | ||
| 2240 | 0x0078, 0x5534, 0x2009, 0x001d, 0x017e, 0x2011, 0xa883, 0x2204, | ||
| 2241 | 0x8211, 0x220c, 0x1078, 0x24e3, 0x00c0, 0x556a, 0x1078, 0x4499, | ||
| 2242 | 0x00c0, 0x556a, 0x6612, 0x6516, 0x86ff, 0x0040, 0x555a, 0x017f, | ||
| 2243 | 0x017e, 0xa186, 0x0017, 0x00c0, 0x555a, 0x6868, 0xa606, 0x00c0, | ||
| 2244 | 0x555a, 0x686c, 0xa506, 0xa084, 0xff00, 0x00c0, 0x555a, 0x6000, | ||
| 2245 | 0xc0f5, 0x6002, 0x0c7e, 0x1078, 0x74d7, 0x0040, 0x556d, 0x017f, | ||
| 2246 | 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x017f, 0x1078, 0x756c, | ||
| 2247 | 0x0c7f, 0x007c, 0x017f, 0x0078, 0x5568, 0x0c7f, 0x0078, 0x556a, | ||
| 2248 | 0x0c7e, 0x1078, 0x55d4, 0x00c0, 0x55d2, 0xa184, 0xff00, 0x8007, | ||
| 2249 | 0xa086, 0x0008, 0x00c0, 0x55d2, 0xa28e, 0x0033, 0x00c0, 0x55a3, | ||
| 2250 | 0x1078, 0x57b2, 0x0040, 0x55d2, 0x7124, 0x610a, 0x7030, 0xa08e, | ||
| 2251 | 0x0200, 0x00c0, 0x5595, 0x7034, 0xa005, 0x00c0, 0x55d2, 0x2009, | ||
| 2252 | 0x0015, 0x1078, 0x756c, 0x0078, 0x55d2, 0xa08e, 0x0100, 0x00c0, | ||
| 2253 | 0x55d2, 0x7034, 0xa005, 0x00c0, 0x55d2, 0x2009, 0x0016, 0x1078, | ||
| 2254 | 0x756c, 0x0078, 0x55d2, 0xa28e, 0x0032, 0x00c0, 0x55d2, 0x7030, | ||
| 2255 | 0xa08e, 0x1400, 0x00c0, 0x55d2, 0x2009, 0x0038, 0x017e, 0x2011, | ||
| 2256 | 0xa883, 0x2204, 0x8211, 0x220c, 0x1078, 0x24e3, 0x00c0, 0x55d1, | ||
| 2257 | 0x1078, 0x4499, 0x00c0, 0x55d1, 0x6612, 0x6516, 0x0c7e, 0x1078, | ||
| 2258 | 0x74d7, 0x0040, 0x55d0, 0x017f, 0x611a, 0x601f, 0x0004, 0x7120, | ||
| 2259 | 0x610a, 0x017f, 0x1078, 0x756c, 0x1078, 0x6109, 0x0078, 0x55d2, | ||
| 2260 | 0x0c7f, 0x017f, 0x0c7f, 0x007c, 0x0f7e, 0x0d7e, 0x027e, 0x017e, | ||
| 2261 | 0x137e, 0x147e, 0x157e, 0x3c00, 0x007e, 0x2079, 0x0030, 0x2069, | ||
| 2262 | 0x0200, 0x1078, 0x1c25, 0x00c0, 0x5615, 0x1078, 0x1b15, 0x0040, | ||
| 2263 | 0x561f, 0x7908, 0xa18c, 0x1fff, 0xa182, 0x0011, 0x00c8, 0x561f, | ||
| 2264 | 0x20a9, 0x000c, 0x20e1, 0x0000, 0x2ea0, 0x2099, 0x020a, 0x53a5, | ||
| 2265 | 0x20e1, 0x2000, 0x2001, 0x020a, 0x2004, 0x7a0c, 0x7808, 0xa080, | ||
| 2266 | 0x0007, 0xa084, 0x1ff8, 0xa08a, 0x0140, 0x10c8, 0x1328, 0x80ac, | ||
| 2267 | 0x20e1, 0x6000, 0x2099, 0x020a, 0x53a5, 0x20e1, 0x7000, 0x6828, | ||
| 2268 | 0x6828, 0x7803, 0x0004, 0xa294, 0x0070, 0x007f, 0x20e0, 0x157f, | ||
| 2269 | 0x147f, 0x137f, 0x017f, 0x027f, 0x0d7f, 0x0f7f, 0x007c, 0xa085, | ||
| 2270 | 0x0001, 0x0078, 0x5615, 0x047e, 0x0e7e, 0x0d7e, 0x2028, 0x2130, | ||
| 2271 | 0xa696, 0x00ff, 0x00c0, 0x5644, 0xa596, 0xfffd, 0x00c0, 0x5634, | ||
| 2272 | 0x2009, 0x007f, 0x0078, 0x5677, 0xa596, 0xfffe, 0x00c0, 0x563c, | ||
| 2273 | 0x2009, 0x007e, 0x0078, 0x5677, 0xa596, 0xfffc, 0x00c0, 0x5644, | ||
| 2274 | 0x2009, 0x0080, 0x0078, 0x5677, 0x2011, 0x0000, 0x2021, 0x0081, | ||
| 2275 | 0x20a9, 0x007e, 0x2071, 0xa4b5, 0x2e1c, 0x83ff, 0x00c0, 0x5656, | ||
| 2276 | 0x82ff, 0x00c0, 0x566b, 0x2410, 0x0078, 0x566b, 0x2368, 0x6f10, | ||
| 2277 | 0x007e, 0x2100, 0xa706, 0x007f, 0x6b14, 0x00c0, 0x5665, 0xa346, | ||
| 2278 | 0x00c0, 0x5665, 0x2408, 0x0078, 0x5677, 0x87ff, 0x00c0, 0x566b, | ||
| 2279 | 0x83ff, 0x0040, 0x5650, 0x8420, 0x8e70, 0x00f0, 0x564c, 0x82ff, | ||
| 2280 | 0x00c0, 0x5676, 0xa085, 0x0001, 0x0078, 0x5678, 0x2208, 0xa006, | ||
| 2281 | 0x0d7f, 0x0e7f, 0x047f, 0x007c, 0xa084, 0x0007, 0x0079, 0x5681, | ||
| 2282 | 0x007c, 0x5689, 0x5689, 0x5689, 0x57c8, 0x5689, 0x568a, 0x56a3, | ||
| 2283 | 0x56f3, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x56a2, 0x7120, 0x2160, | ||
| 2284 | 0xac8c, 0x000f, 0x00c0, 0x56a2, 0xac8a, 0xaa00, 0x0048, 0x56a2, | ||
| 2285 | 0x6854, 0xac02, 0x00c8, 0x56a2, 0x7124, 0x610a, 0x2009, 0x0046, | ||
| 2286 | 0x1078, 0x756c, 0x007c, 0x0c7e, 0x7110, 0xd1bc, 0x00c0, 0x56f1, | ||
| 2287 | 0x2011, 0xa883, 0x2204, 0x8211, 0x220c, 0x1078, 0x24e3, 0x00c0, | ||
| 2288 | 0x56f1, 0x1078, 0x4499, 0x00c0, 0x56f1, 0x6612, 0x6516, 0x6000, | ||
| 2289 | 0xd0ec, 0x00c0, 0x56f1, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, | ||
| 2290 | 0x0006, 0x00c0, 0x56d6, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, | ||
| 2291 | 0x56f1, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6122, | ||
| 2292 | 0x2009, 0x0044, 0x1078, 0x756c, 0x0078, 0x56f1, 0x0c7e, 0x1078, | ||
| 2293 | 0x74d7, 0x017f, 0x0040, 0x56f1, 0x611a, 0x601f, 0x0004, 0x7120, | ||
| 2294 | 0x610a, 0xa286, 0x0004, 0x00c0, 0x56e9, 0x6007, 0x0005, 0x0078, | ||
| 2295 | 0x56eb, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5c45, 0x1078, | ||
| 2296 | 0x6109, 0x0c7f, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x570b, 0x7020, | ||
| 2297 | 0x2060, 0xac84, 0x000f, 0x00c0, 0x570b, 0xac82, 0xaa00, 0x0048, | ||
| 2298 | 0x570b, 0x6854, 0xac02, 0x00c8, 0x570b, 0x7124, 0x610a, 0x2009, | ||
| 2299 | 0x0045, 0x1078, 0x756c, 0x007c, 0x7110, 0xa18c, 0xff00, 0x810f, | ||
| 2300 | 0xa18e, 0x0000, 0x00c0, 0x571c, 0xa084, 0x000f, 0xa08a, 0x0006, | ||
| 2301 | 0x00c8, 0x571c, 0x1079, 0x571d, 0x007c, 0x5723, 0x5724, 0x5723, | ||
| 2302 | 0x5723, 0x5794, 0x57a3, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x572c, | ||
| 2303 | 0x702c, 0xd084, 0x0040, 0x5793, 0x700c, 0x7108, 0x1078, 0x24e3, | ||
| 2304 | 0x00c0, 0x5793, 0x1078, 0x4499, 0x00c0, 0x5793, 0x6612, 0x6516, | ||
| 2305 | 0x6204, 0x7110, 0xd1bc, 0x0040, 0x575e, 0xa28c, 0x00ff, 0xa186, | ||
| 2306 | 0x0004, 0x0040, 0x5747, 0xa186, 0x0006, 0x00c0, 0x5784, 0x0c7e, | ||
| 2307 | 0x1078, 0x57b2, 0x0c7f, 0x0040, 0x5793, 0x0c7e, 0x1078, 0x74d7, | ||
| 2308 | 0x017f, 0x0040, 0x5793, 0x611a, 0x601f, 0x0002, 0x7120, 0x610a, | ||
| 2309 | 0x2009, 0x0088, 0x1078, 0x756c, 0x0078, 0x5793, 0xa28c, 0x00ff, | ||
| 2310 | 0xa186, 0x0006, 0x0040, 0x5773, 0xa186, 0x0004, 0x0040, 0x5773, | ||
| 2311 | 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, 0x0040, 0x5773, 0xa286, | ||
| 2312 | 0x0006, 0x00c0, 0x5784, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, | ||
| 2313 | 0x5793, 0x611a, 0x601f, 0x0005, 0x7120, 0x610a, 0x2009, 0x0088, | ||
| 2314 | 0x1078, 0x756c, 0x0078, 0x5793, 0x0c7e, 0x1078, 0x74d7, 0x017f, | ||
| 2315 | 0x0040, 0x5793, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x2009, | ||
| 2316 | 0x0001, 0x1078, 0x756c, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x57a2, | ||
| 2317 | 0x1078, 0x57b2, 0x0040, 0x57a2, 0x7124, 0x610a, 0x2009, 0x0089, | ||
| 2318 | 0x1078, 0x756c, 0x007c, 0x7110, 0xd1bc, 0x0040, 0x57b1, 0x1078, | ||
| 2319 | 0x57b2, 0x0040, 0x57b1, 0x7124, 0x610a, 0x2009, 0x008a, 0x1078, | ||
| 2320 | 0x756c, 0x007c, 0x7020, 0x2060, 0xac84, 0x000f, 0x00c0, 0x57c5, | ||
| 2321 | 0xac82, 0xaa00, 0x0048, 0x57c5, 0x2001, 0xa315, 0x2004, 0xac02, | ||
| 2322 | 0x00c8, 0x57c5, 0xa085, 0x0001, 0x007c, 0xa006, 0x0078, 0x57c4, | ||
| 2323 | 0x7110, 0xd1bc, 0x00c0, 0x57de, 0x7024, 0x2060, 0xac84, 0x000f, | ||
| 2324 | 0x00c0, 0x57de, 0xac82, 0xaa00, 0x0048, 0x57de, 0x6854, 0xac02, | ||
| 2325 | 0x00c8, 0x57de, 0x2009, 0x0051, 0x1078, 0x756c, 0x007c, 0x2071, | ||
| 2326 | 0xa5be, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7012, | ||
| 2327 | 0x7017, 0xaa00, 0x7007, 0x0000, 0x7026, 0x702b, 0x6c4e, 0x7032, | ||
| 2328 | 0x7037, 0x6ca0, 0x703b, 0x0002, 0x703f, 0x0000, 0x7043, 0xffff, | ||
| 2329 | 0x7047, 0xffff, 0x007c, 0x2071, 0xa5be, 0x00e0, 0x58c1, 0x2091, | ||
| 2330 | 0x6000, 0x700c, 0x8001, 0x700e, 0x00c0, 0x5873, 0x700f, 0x0361, | ||
| 2331 | 0x7007, 0x0001, 0x127e, 0x2091, 0x8000, 0x7138, 0x8109, 0x713a, | ||
| 2332 | 0x00c0, 0x5871, 0x703b, 0x0002, 0x2009, 0x0100, 0x2104, 0xa082, | ||
| 2333 | 0x0003, 0x00c8, 0x5871, 0x703c, 0xa086, 0x0001, 0x00c0, 0x584e, | ||
| 2334 | 0x0d7e, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0040, 0x582c, | ||
| 2335 | 0x6803, 0x1000, 0x0078, 0x5833, 0x6804, 0xa084, 0x1000, 0x0040, | ||
| 2336 | 0x5833, 0x6803, 0x0100, 0x6803, 0x0000, 0x703f, 0x0000, 0x2069, | ||
| 2337 | 0xa5ab, 0x6804, 0xa082, 0x0006, 0x00c0, 0x5840, 0x6807, 0x0000, | ||
| 2338 | 0x6830, 0xa082, 0x0003, 0x00c0, 0x5847, 0x6833, 0x0000, 0x1078, | ||
| 2339 | 0x6109, 0x1078, 0x61d3, 0x0d7f, 0x0078, 0x5871, 0x0d7e, 0x2069, | ||
| 2340 | 0xa300, 0x6944, 0x6860, 0xa102, 0x00c8, 0x5870, 0x2069, 0xa5ab, | ||
| 2341 | 0x6804, 0xa086, 0x0000, 0x00c0, 0x5870, 0x6830, 0xa086, 0x0000, | ||
| 2342 | 0x00c0, 0x5870, 0x703f, 0x0001, 0x6807, 0x0006, 0x6833, 0x0003, | ||
| 2343 | 0x2069, 0x0100, 0x6830, 0x689e, 0x2069, 0x0140, 0x6803, 0x0600, | ||
| 2344 | 0x0d7f, 0x0078, 0x5876, 0x127e, 0x2091, 0x8000, 0x7024, 0xa00d, | ||
| 2345 | 0x0040, 0x588e, 0x7020, 0x8001, 0x7022, 0x00c0, 0x588e, 0x7023, | ||
| 2346 | 0x0009, 0x8109, 0x7126, 0xa186, 0x03e8, 0x00c0, 0x5889, 0x7028, | ||
| 2347 | 0x107a, 0x81ff, 0x00c0, 0x588e, 0x7028, 0x107a, 0x7030, 0xa00d, | ||
| 2348 | 0x0040, 0x589f, 0x702c, 0x8001, 0x702e, 0x00c0, 0x589f, 0x702f, | ||
| 2349 | 0x0009, 0x8109, 0x7132, 0x00c0, 0x589f, 0x7034, 0x107a, 0x7040, | ||
| 2350 | 0xa005, 0x0040, 0x58a7, 0x0050, 0x58a7, 0x8001, 0x7042, 0x7044, | ||
| 2351 | 0xa005, 0x0040, 0x58af, 0x0050, 0x58af, 0x8001, 0x7046, 0x7018, | ||
| 2352 | 0xa00d, 0x0040, 0x58c0, 0x7008, 0x8001, 0x700a, 0x00c0, 0x58c0, | ||
| 2353 | 0x700b, 0x0009, 0x8109, 0x711a, 0x00c0, 0x58c0, 0x701c, 0x107a, | ||
| 2354 | 0x127f, 0x7004, 0x0079, 0x58c4, 0x58eb, 0x58ec, 0x5908, 0x0e7e, | ||
| 2355 | 0x2071, 0xa5be, 0x7018, 0xa005, 0x00c0, 0x58d2, 0x711a, 0x721e, | ||
| 2356 | 0x700b, 0x0009, 0x0e7f, 0x007c, 0x0e7e, 0x007e, 0x2071, 0xa5be, | ||
| 2357 | 0x701c, 0xa206, 0x00c0, 0x58de, 0x701a, 0x701e, 0x007f, 0x0e7f, | ||
| 2358 | 0x007c, 0x0e7e, 0x2071, 0xa5be, 0x6088, 0xa102, 0x0048, 0x58e9, | ||
| 2359 | 0x618a, 0x0e7f, 0x007c, 0x007c, 0x7110, 0x1078, 0x4501, 0x00c0, | ||
| 2360 | 0x58fe, 0x6088, 0x8001, 0x0048, 0x58fe, 0x608a, 0x00c0, 0x58fe, | ||
| 2361 | 0x127e, 0x2091, 0x8000, 0x1078, 0x6109, 0x127f, 0x8108, 0xa182, | ||
| 2362 | 0x00ff, 0x0048, 0x5906, 0xa00e, 0x7007, 0x0002, 0x7112, 0x007c, | ||
| 2363 | 0x7014, 0x2060, 0x127e, 0x2091, 0x8000, 0x603c, 0xa005, 0x0040, | ||
| 2364 | 0x5917, 0x8001, 0x603e, 0x00c0, 0x5917, 0x1078, 0x8cd7, 0x6014, | ||
| 2365 | 0xa005, 0x0040, 0x5941, 0x8001, 0x6016, 0x00c0, 0x5941, 0x611c, | ||
| 2366 | 0xa186, 0x0003, 0x0040, 0x5928, 0xa186, 0x0006, 0x00c0, 0x593f, | ||
| 2367 | 0x6010, 0x2068, 0x6854, 0xa08a, 0x199a, 0x0048, 0x593f, 0xa082, | ||
| 2368 | 0x1999, 0x6856, 0xa08a, 0x199a, 0x0048, 0x5938, 0x2001, 0x1999, | ||
| 2369 | 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x0078, 0x5941, 0x1078, | ||
| 2370 | 0x8810, 0x127f, 0xac88, 0x0010, 0x7116, 0x2001, 0xca00, 0xa102, | ||
| 2371 | 0x0048, 0x594e, 0x7017, 0xaa00, 0x7007, 0x0000, 0x007c, 0x0e7e, | ||
| 2372 | 0x2071, 0xa5be, 0x7027, 0x07d0, 0x7023, 0x0009, 0x703b, 0x0002, | ||
| 2373 | 0x0e7f, 0x007c, 0x2001, 0xa5c7, 0x2003, 0x0000, 0x007c, 0x0e7e, | ||
| 2374 | 0x2071, 0xa5be, 0x7132, 0x702f, 0x0009, 0x0e7f, 0x007c, 0x2011, | ||
| 2375 | 0xa5ca, 0x2013, 0x0000, 0x007c, 0x0e7e, 0x2071, 0xa5be, 0x711a, | ||
| 2376 | 0x721e, 0x700b, 0x0009, 0x0e7f, 0x007c, 0x027e, 0x0e7e, 0x0f7e, | ||
| 2377 | 0x2079, 0xa300, 0x7a34, 0xd294, 0x0040, 0x59a4, 0x2071, 0xa5aa, | ||
| 2378 | 0x2e14, 0xa0fe, 0x0000, 0x0040, 0x5991, 0xa0fe, 0x0001, 0x0040, | ||
| 2379 | 0x5995, 0xa0fe, 0x0002, 0x00c0, 0x59a0, 0xa292, 0x0085, 0x0078, | ||
| 2380 | 0x5997, 0xa292, 0x0005, 0x0078, 0x5997, 0xa292, 0x0002, 0x2272, | ||
| 2381 | 0x0040, 0x599c, 0x00c8, 0x59a4, 0x2011, 0x8037, 0x1078, 0x3579, | ||
| 2382 | 0x2011, 0xa5a9, 0x2204, 0x2072, 0x0f7f, 0x0e7f, 0x027f, 0x007c, | ||
| 2383 | 0x0c7e, 0x2061, 0xa62d, 0x0c7f, 0x007c, 0xa184, 0x000f, 0x8003, | ||
| 2384 | 0x8003, 0x8003, 0xa080, 0xa62d, 0x2060, 0x007c, 0x6854, 0xa08a, | ||
| 2385 | 0x199a, 0x0048, 0x59bd, 0x2001, 0x1999, 0xa005, 0x00c0, 0x59cc, | ||
| 2386 | 0x0c7e, 0x2061, 0xa62d, 0x6014, 0x0c7f, 0xa005, 0x00c0, 0x59d1, | ||
| 2387 | 0x2001, 0x001e, 0x0078, 0x59d1, 0xa08e, 0xffff, 0x00c0, 0x59d1, | ||
| 2388 | 0xa006, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c, | ||
| 2389 | 0x00c0, 0xa18e, 0x00c0, 0x0040, 0x5a24, 0xd0b4, 0x00c0, 0x59e8, | ||
| 2390 | 0xd0bc, 0x00c0, 0x5a14, 0x2009, 0x0006, 0x1078, 0x5a43, 0x007c, | ||
| 2391 | 0xd0fc, 0x0040, 0x59f3, 0xa084, 0x0003, 0x0040, 0x59f3, 0xa086, | ||
| 2392 | 0x0003, 0x00c0, 0x5a3c, 0x6024, 0xd0d4, 0x0040, 0x59fd, 0xc0d4, | ||
| 2393 | 0x6026, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xa373, 0x2104, | ||
| 2394 | 0xd084, 0x0040, 0x5a0f, 0x6118, 0xa188, 0x0027, 0x2104, 0xd08c, | ||
| 2395 | 0x00c0, 0x5a0f, 0x2009, 0x0042, 0x1078, 0x756c, 0x007c, 0x2009, | ||
| 2396 | 0x0043, 0x1078, 0x756c, 0x007c, 0xd0fc, 0x0040, 0x5a1f, 0xa084, | ||
| 2397 | 0x0003, 0x0040, 0x5a1f, 0xa086, 0x0003, 0x00c0, 0x5a3c, 0x2009, | ||
| 2398 | 0x0042, 0x1078, 0x756c, 0x007c, 0xd0fc, 0x0040, 0x5a32, 0xa084, | ||
| 2399 | 0x0003, 0xa08e, 0x0002, 0x0040, 0x5a36, 0x2009, 0x0041, 0x1078, | ||
| 2400 | 0x756c, 0x007c, 0x1078, 0x5a41, 0x0078, 0x5a31, 0x2009, 0x0043, | ||
| 2401 | 0x1078, 0x756c, 0x0078, 0x5a31, 0x2009, 0x0004, 0x1078, 0x5a43, | ||
| 2402 | 0x007c, 0x2009, 0x0001, 0x0d7e, 0x6010, 0xa0ec, 0xf000, 0x0040, | ||
| 2403 | 0x5a6b, 0x2068, 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x00c0, | ||
| 2404 | 0x5a65, 0x694c, 0xa18c, 0x8100, 0xa18e, 0x8100, 0x00c0, 0x5a65, | ||
| 2405 | 0x0c7e, 0x2061, 0xa62d, 0x6200, 0xd28c, 0x00c0, 0x5a64, 0x6204, | ||
| 2406 | 0x8210, 0x0048, 0x5a64, 0x6206, 0x0c7f, 0x1078, 0x4982, 0x6010, | ||
| 2407 | 0xa06d, 0x10c0, 0x59b6, 0x0d7f, 0x007c, 0x157e, 0x0c7e, 0x2061, | ||
| 2408 | 0xa62d, 0x6000, 0x81ff, 0x0040, 0x5a78, 0xa205, 0x0078, 0x5a79, | ||
| 2409 | 0xa204, 0x6002, 0x0c7f, 0x157f, 0x007c, 0x6800, 0xd08c, 0x00c0, | ||
| 2410 | 0x5a89, 0x6808, 0xa005, 0x0040, 0x5a89, 0x8001, 0x680a, 0xa085, | ||
| 2411 | 0x0001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, | ||
| 2412 | 0x00c8, 0x5a93, 0xa200, 0x00f0, 0x5a8e, 0x8086, 0x818e, 0x007c, | ||
| 2413 | 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x5ab9, 0xa11a, 0x00c8, | ||
| 2414 | 0x5ab9, 0x8213, 0x818d, 0x0048, 0x5aac, 0xa11a, 0x00c8, 0x5aad, | ||
| 2415 | 0x00f0, 0x5aa1, 0x0078, 0x5ab1, 0xa11a, 0x2308, 0x8210, 0x00f0, | ||
| 2416 | 0x5aa1, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, | ||
| 2417 | 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x5ab5, 0x127e, | ||
| 2418 | 0x2091, 0x2200, 0x2079, 0xa5ab, 0x127f, 0x0d7e, 0x2069, 0xa5ab, | ||
| 2419 | 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a, | ||
| 2420 | 0x0d7f, 0x007c, 0x0c7e, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007, | ||
| 2421 | 0x0079, 0x5ada, 0x5ae4, 0x5b09, 0x5b64, 0x5aea, 0x5b09, 0x5ae4, | ||
| 2422 | 0x5ae2, 0x5ae2, 0x1078, 0x1328, 0x1078, 0x595a, 0x1078, 0x6109, | ||
| 2423 | 0x0c7f, 0x007c, 0x62c0, 0x82ff, 0x00c0, 0x5af0, 0x0c7f, 0x007c, | ||
| 2424 | 0x2011, 0x4129, 0x1078, 0x58d4, 0x7828, 0xa092, 0x00c8, 0x00c8, | ||
| 2425 | 0x5aff, 0x8000, 0x782a, 0x1078, 0x4168, 0x0078, 0x5aee, 0x1078, | ||
| 2426 | 0x4129, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0078, | ||
| 2427 | 0x5aee, 0x1078, 0x595a, 0x3c00, 0x007e, 0x2011, 0x0209, 0x20e1, | ||
| 2428 | 0x4000, 0x2214, 0x007f, 0x20e0, 0x82ff, 0x0040, 0x5b27, 0x62c0, | ||
| 2429 | 0x82ff, 0x00c0, 0x5b27, 0x782b, 0x0000, 0x7824, 0xa065, 0x1040, | ||
| 2430 | 0x1328, 0x2009, 0x0013, 0x1078, 0x756c, 0x0c7f, 0x007c, 0x3900, | ||
| 2431 | 0xa082, 0xa6cd, 0x00c8, 0x5b2e, 0x1078, 0x728a, 0x0c7e, 0x7824, | ||
| 2432 | 0xa065, 0x1040, 0x1328, 0x7804, 0xa086, 0x0004, 0x0040, 0x5ba9, | ||
| 2433 | 0x7828, 0xa092, 0x2710, 0x00c8, 0x5b44, 0x8000, 0x782a, 0x0c7f, | ||
| 2434 | 0x1078, 0x6c33, 0x0078, 0x5b25, 0x6104, 0xa186, 0x0003, 0x00c0, | ||
| 2435 | 0x5b5b, 0x0e7e, 0x2071, 0xa300, 0x70d4, 0x0e7f, 0xd08c, 0x0040, | ||
| 2436 | 0x5b5b, 0x0c7e, 0x0e7e, 0x2061, 0x0100, 0x2071, 0xa300, 0x1078, | ||
| 2437 | 0x4171, 0x0e7f, 0x0c7f, 0x1078, 0xa241, 0x2009, 0x0014, 0x1078, | ||
| 2438 | 0x756c, 0x0c7f, 0x0078, 0x5b25, 0x2001, 0xa5c7, 0x2003, 0x0000, | ||
| 2439 | 0x62c0, 0x82ff, 0x00c0, 0x5b78, 0x782b, 0x0000, 0x7824, 0xa065, | ||
| 2440 | 0x1040, 0x1328, 0x2009, 0x0013, 0x1078, 0x75c3, 0x0c7f, 0x007c, | ||
| 2441 | 0x0c7e, 0x0d7e, 0x3900, 0xa082, 0xa6cd, 0x00c8, 0x5b81, 0x1078, | ||
| 2442 | 0x728a, 0x7824, 0xa005, 0x1040, 0x1328, 0x781c, 0xa06d, 0x1040, | ||
| 2443 | 0x1328, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x1078, 0x753d, | ||
| 2444 | 0x693c, 0x81ff, 0x1040, 0x1328, 0x8109, 0x693e, 0x6854, 0xa015, | ||
| 2445 | 0x0040, 0x5b9d, 0x7a1e, 0x0078, 0x5b9f, 0x7918, 0x791e, 0x7807, | ||
| 2446 | 0x0000, 0x7827, 0x0000, 0x0d7f, 0x0c7f, 0x1078, 0x6109, 0x0078, | ||
| 2447 | 0x5b76, 0x6104, 0xa186, 0x0002, 0x0040, 0x5bb4, 0xa186, 0x0004, | ||
| 2448 | 0x0040, 0x5bb4, 0x0078, 0x5b38, 0x7808, 0xac06, 0x0040, 0x5b38, | ||
| 2449 | 0x1078, 0x6010, 0x1078, 0x5c45, 0x0c7f, 0x1078, 0x6109, 0x0078, | ||
| 2450 | 0x5b25, 0x0c7e, 0x6027, 0x0002, 0x62c8, 0x82ff, 0x00c0, 0x5bdb, | ||
| 2451 | 0x62c4, 0x82ff, 0x00c0, 0x5bdb, 0x793c, 0xa1e5, 0x0000, 0x0040, | ||
| 2452 | 0x5bd5, 0x2009, 0x0049, 0x1078, 0x756c, 0x2011, 0xa5ca, 0x2013, | ||
| 2453 | 0x0000, 0x0c7f, 0x007c, 0x3908, 0xa192, 0xa6cd, 0x00c8, 0x5be2, | ||
| 2454 | 0x1078, 0x728a, 0x6017, 0x0010, 0x793c, 0x81ff, 0x0040, 0x5bd5, | ||
| 2455 | 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, 0x0006, 0x00c0, 0x5bf4, | ||
| 2456 | 0x6017, 0x0012, 0x0078, 0x5bd9, 0x6017, 0x0016, 0x0078, 0x5bd9, | ||
| 2457 | 0x007e, 0x017e, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, | ||
| 2458 | 0x2c08, 0x2061, 0xa5ab, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, | ||
| 2459 | 0x0040, 0x5c13, 0xa080, 0x0003, 0x2102, 0x6112, 0x127f, 0x0c7f, | ||
| 2460 | 0x017f, 0x007f, 0x007c, 0x6116, 0x6112, 0x0078, 0x5c0e, 0x0d7e, | ||
| 2461 | 0x2069, 0xa5ab, 0x6000, 0xd0d4, 0x0040, 0x5c2c, 0x6820, 0x8000, | ||
| 2462 | 0x6822, 0xa086, 0x0001, 0x00c0, 0x5c27, 0x2c00, 0x681e, 0x6804, | ||
| 2463 | 0xa084, 0x0007, 0x0079, 0x6111, 0xc0d5, 0x6002, 0x6818, 0xa005, | ||
| 2464 | 0x0040, 0x5c3e, 0x6056, 0x605b, 0x0000, 0x007e, 0x2c00, 0x681a, | ||
| 2465 | 0x0d7f, 0x685a, 0x2069, 0xa5ab, 0x0078, 0x5c1e, 0x6056, 0x605a, | ||
| 2466 | 0x2c00, 0x681a, 0x681e, 0x0078, 0x5c1e, 0x007e, 0x017e, 0x0c7e, | ||
| 2467 | 0x127e, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0xa5ab, | ||
| 2468 | 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0040, 0x5c60, 0xa080, | ||
| 2469 | 0x0003, 0x2102, 0x610a, 0x127f, 0x0c7f, 0x017f, 0x007f, 0x007c, | ||
| 2470 | 0x610e, 0x610a, 0x0078, 0x5c5b, 0x0c7e, 0x600f, 0x0000, 0x2c08, | ||
| 2471 | 0x2061, 0xa5ab, 0x6034, 0xa005, 0x0040, 0x5c74, 0xa080, 0x0003, | ||
| 2472 | 0x2102, 0x6136, 0x0c7f, 0x007c, 0x613a, 0x6136, 0x0078, 0x5c72, | ||
| 2473 | 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x027e, 0x017e, 0x007e, | ||
| 2474 | 0x127e, 0x2071, 0xa5ab, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, | ||
| 2475 | 0x8cff, 0x0040, 0x5ced, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, | ||
| 2476 | 0x00c0, 0x5ce8, 0x87ff, 0x0040, 0x5c99, 0x6020, 0xa106, 0x00c0, | ||
| 2477 | 0x5ce8, 0x703c, 0xac06, 0x00c0, 0x5cab, 0x037e, 0x2019, 0x0001, | ||
| 2478 | 0x1078, 0x6e6c, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, | ||
| 2479 | 0x7047, 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x5cb1, 0x660c, | ||
| 2480 | 0x763a, 0x7034, 0xac36, 0x00c0, 0x5cbf, 0x2c00, 0xaf36, 0x0040, | ||
| 2481 | 0x5cbd, 0x2f00, 0x7036, 0x0078, 0x5cbf, 0x7037, 0x0000, 0x660c, | ||
| 2482 | 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5cc8, 0x7e0e, 0x0078, 0x5cc9, | ||
| 2483 | 0x2678, 0x600f, 0x0000, 0x1078, 0x8a44, 0x0040, 0x5ce3, 0x6010, | ||
| 2484 | 0x2068, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5cf7, 0x6837, 0x0103, | ||
| 2485 | 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8cb8, 0x1078, 0xa181, 0x1078, | ||
| 2486 | 0x4982, 0x1078, 0x8bf4, 0x1078, 0x8c01, 0x0c7f, 0x0078, 0x5c88, | ||
| 2487 | 0x2c78, 0x600c, 0x2060, 0x0078, 0x5c88, 0x127f, 0x007f, 0x017f, | ||
| 2488 | 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x601c, | ||
| 2489 | 0xa086, 0x0006, 0x00c0, 0x5cd6, 0x1078, 0xa181, 0x1078, 0x9e70, | ||
| 2490 | 0x0078, 0x5ce3, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x0f7e, 0x2031, | ||
| 2491 | 0x0000, 0x127e, 0x2091, 0x8000, 0x2079, 0xa5ab, 0x7838, 0xa065, | ||
| 2492 | 0x0040, 0x5d41, 0x600c, 0x007e, 0x600f, 0x0000, 0x783c, 0xac06, | ||
| 2493 | 0x00c0, 0x5d28, 0x037e, 0x2019, 0x0001, 0x1078, 0x6e6c, 0x7833, | ||
| 2494 | 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x037f, | ||
| 2495 | 0x1078, 0x8a44, 0x0040, 0x5d3c, 0x6010, 0x2068, 0x601c, 0xa086, | ||
| 2496 | 0x0003, 0x00c0, 0x5d4a, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, | ||
| 2497 | 0x1078, 0x4982, 0x1078, 0x8bf4, 0x1078, 0x8c01, 0x007f, 0x0078, | ||
| 2498 | 0x5d0f, 0x7e3a, 0x7e36, 0x127f, 0x0f7f, 0x0d7f, 0x0c7f, 0x067f, | ||
| 2499 | 0x007f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5d33, 0x1078, | ||
| 2500 | 0x9e70, 0x0078, 0x5d3c, 0x017e, 0x027e, 0x087e, 0x2041, 0x0000, | ||
| 2501 | 0x1078, 0x5d6d, 0x1078, 0x5e21, 0x087f, 0x027f, 0x017f, 0x007c, | ||
| 2502 | 0x0f7e, 0x127e, 0x2079, 0xa5ab, 0x2091, 0x8000, 0x1078, 0x5ebc, | ||
| 2503 | 0x1078, 0x5f32, 0x127f, 0x0f7f, 0x007c, 0x0f7e, 0x0e7e, 0x0d7e, | ||
| 2504 | 0x0c7e, 0x067e, 0x017e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, | ||
| 2505 | 0xa5ab, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0040, 0x5e01, 0x6018, | ||
| 2506 | 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x5dfc, 0x88ff, 0x0040, | ||
| 2507 | 0x5d8d, 0x6020, 0xa106, 0x00c0, 0x5dfc, 0x7024, 0xac06, 0x00c0, | ||
| 2508 | 0x5dbd, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, 0x5db8, 0x1078, | ||
| 2509 | 0x595a, 0x1078, 0x6c41, 0x68c3, 0x0000, 0x1078, 0x7188, 0x7027, | ||
| 2510 | 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, | ||
| 2511 | 0x5dad, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, | ||
| 2512 | 0xd084, 0x0040, 0x5db5, 0x6827, 0x0001, 0x037f, 0x0078, 0x5dbd, | ||
| 2513 | 0x6003, 0x0009, 0x630a, 0x0078, 0x5dfc, 0x7014, 0xac36, 0x00c0, | ||
| 2514 | 0x5dc3, 0x660c, 0x7616, 0x7010, 0xac36, 0x00c0, 0x5dd1, 0x2c00, | ||
| 2515 | 0xaf36, 0x0040, 0x5dcf, 0x2f00, 0x7012, 0x0078, 0x5dd1, 0x7013, | ||
| 2516 | 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, 0x5dda, 0x7e0e, | ||
| 2517 | 0x0078, 0x5ddb, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, | ||
| 2518 | 0x8a44, 0x0040, 0x5df5, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5e0a, | ||
| 2519 | 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x8cb8, 0x1078, | ||
| 2520 | 0xa181, 0x1078, 0x4982, 0x1078, 0x8bf4, 0x1078, 0x8c01, 0x1078, | ||
| 2521 | 0x7045, 0x0c7f, 0x0078, 0x5d7c, 0x2c78, 0x600c, 0x2060, 0x0078, | ||
| 2522 | 0x5d7c, 0x127f, 0x007f, 0x017f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, | ||
| 2523 | 0x0f7f, 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x5e15, 0x1078, | ||
| 2524 | 0xa181, 0x1078, 0x9e70, 0x0078, 0x5df5, 0x601c, 0xa086, 0x0002, | ||
| 2525 | 0x00c0, 0x5df5, 0x6004, 0xa086, 0x0085, 0x0040, 0x5de8, 0x0078, | ||
| 2526 | 0x5df5, 0x0c7e, 0x007e, 0x127e, 0x2091, 0x8000, 0xa280, 0xa434, | ||
| 2527 | 0x2004, 0xa065, 0x0040, 0x5eb8, 0x0f7e, 0x0e7e, 0x0d7e, 0x067e, | ||
| 2528 | 0x2071, 0xa5ab, 0x6654, 0x7018, 0xac06, 0x00c0, 0x5e38, 0x761a, | ||
| 2529 | 0x701c, 0xac06, 0x00c0, 0x5e44, 0x86ff, 0x00c0, 0x5e43, 0x7018, | ||
| 2530 | 0x701e, 0x0078, 0x5e44, 0x761e, 0x6058, 0xa07d, 0x0040, 0x5e49, | ||
| 2531 | 0x7e56, 0xa6ed, 0x0000, 0x0040, 0x5e4f, 0x2f00, 0x685a, 0x6057, | ||
| 2532 | 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, | ||
| 2533 | 0x4410, 0x0040, 0x5eb4, 0x7624, 0x86ff, 0x0040, 0x5ea2, 0xa680, | ||
| 2534 | 0x0004, 0x2004, 0xad06, 0x00c0, 0x5ea2, 0x0d7e, 0x2069, 0x0100, | ||
| 2535 | 0x68c0, 0xa005, 0x0040, 0x5e99, 0x1078, 0x595a, 0x1078, 0x6c41, | ||
| 2536 | 0x68c3, 0x0000, 0x1078, 0x7188, 0x7027, 0x0000, 0x037e, 0x2069, | ||
| 2537 | 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5e82, 0x6803, 0x0100, | ||
| 2538 | 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5e8a, | ||
| 2539 | 0x6827, 0x0001, 0x037f, 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, | ||
| 2540 | 0x5e93, 0x8001, 0x603e, 0x2660, 0x1078, 0x8c01, 0x0c7f, 0x0078, | ||
| 2541 | 0x5ea2, 0x0d7f, 0x0c7e, 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, | ||
| 2542 | 0x0078, 0x5e57, 0x8dff, 0x0040, 0x5eb0, 0x6837, 0x0103, 0x6b4a, | ||
| 2543 | 0x6847, 0x0000, 0x1078, 0x8cb8, 0x1078, 0xa181, 0x1078, 0x4982, | ||
| 2544 | 0x1078, 0x7045, 0x0078, 0x5e57, 0x067f, 0x0d7f, 0x0e7f, 0x0f7f, | ||
| 2545 | 0x127f, 0x007f, 0x0c7f, 0x007c, 0x007e, 0x067e, 0x0c7e, 0x0d7e, | ||
| 2546 | 0x2031, 0x0000, 0x7814, 0xa065, 0x0040, 0x5f16, 0x600c, 0x007e, | ||
| 2547 | 0x600f, 0x0000, 0x7824, 0xac06, 0x00c0, 0x5efb, 0x2069, 0x0100, | ||
| 2548 | 0x68c0, 0xa005, 0x0040, 0x5ef5, 0x1078, 0x595a, 0x1078, 0x6c41, | ||
| 2549 | 0x68c3, 0x0000, 0x1078, 0x7188, 0x7827, 0x0000, 0x037e, 0x2069, | ||
| 2550 | 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x5eea, 0x6803, 0x0100, | ||
| 2551 | 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x5ef2, | ||
| 2552 | 0x6827, 0x0001, 0x037f, 0x0078, 0x5efb, 0x6003, 0x0009, 0x630a, | ||
| 2553 | 0x2c30, 0x0078, 0x5f13, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, | ||
| 2554 | 0x5f0f, 0x601c, 0xa086, 0x0003, 0x00c0, 0x5f1d, 0x6837, 0x0103, | ||
| 2555 | 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4982, 0x1078, 0x8bf4, 0x1078, | ||
| 2556 | 0x8c01, 0x1078, 0x7045, 0x007f, 0x0078, 0x5ec3, 0x7e16, 0x7e12, | ||
| 2557 | 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x601c, 0xa086, 0x0006, | ||
| 2558 | 0x00c0, 0x5f26, 0x1078, 0x9e70, 0x0078, 0x5f0f, 0x601c, 0xa086, | ||
| 2559 | 0x0002, 0x00c0, 0x5f0f, 0x6004, 0xa086, 0x0085, 0x0040, 0x5f06, | ||
| 2560 | 0x0078, 0x5f0f, 0x007e, 0x067e, 0x0c7e, 0x0d7e, 0x7818, 0xa065, | ||
| 2561 | 0x0040, 0x5fa0, 0x6054, 0x007e, 0x6057, 0x0000, 0x605b, 0x0000, | ||
| 2562 | 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x1078, 0x4410, 0x0040, 0x5f9d, | ||
| 2563 | 0x7e24, 0x86ff, 0x0040, 0x5f8f, 0xa680, 0x0004, 0x2004, 0xad06, | ||
| 2564 | 0x00c0, 0x5f8f, 0x0d7e, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0040, | ||
| 2565 | 0x5f86, 0x1078, 0x595a, 0x1078, 0x6c41, 0x68c3, 0x0000, 0x1078, | ||
| 2566 | 0x7188, 0x7827, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, | ||
| 2567 | 0x1000, 0x0040, 0x5f6f, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, | ||
| 2568 | 0x0100, 0x6824, 0xd084, 0x0040, 0x5f77, 0x6827, 0x0001, 0x037f, | ||
| 2569 | 0x0d7f, 0x0c7e, 0x603c, 0xa005, 0x0040, 0x5f80, 0x8001, 0x603e, | ||
| 2570 | 0x2660, 0x1078, 0x8c01, 0x0c7f, 0x0078, 0x5f8f, 0x0d7f, 0x0c7e, | ||
| 2571 | 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x5f44, 0x8dff, | ||
| 2572 | 0x0040, 0x5f99, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, | ||
| 2573 | 0x4982, 0x1078, 0x7045, 0x0078, 0x5f44, 0x007f, 0x0078, 0x5f37, | ||
| 2574 | 0x781e, 0x781a, 0x0d7f, 0x0c7f, 0x067f, 0x007f, 0x007c, 0x0e7e, | ||
| 2575 | 0x0d7e, 0x067e, 0x6000, 0xd0dc, 0x0040, 0x5fc4, 0x604c, 0xa06d, | ||
| 2576 | 0x0040, 0x5fc4, 0x6848, 0xa606, 0x00c0, 0x5fc4, 0x2071, 0xa5ab, | ||
| 2577 | 0x7024, 0xa035, 0x0040, 0x5fc4, 0xa080, 0x0004, 0x2004, 0xad06, | ||
| 2578 | 0x00c0, 0x5fc4, 0x1078, 0x5fc8, 0x067f, 0x0d7f, 0x0e7f, 0x007c, | ||
| 2579 | 0x0f7e, 0x2079, 0x0100, 0x78c0, 0xa005, 0x00c0, 0x5fd7, 0x0c7e, | ||
| 2580 | 0x2660, 0x6003, 0x0009, 0x630a, 0x0c7f, 0x0078, 0x600e, 0x1078, | ||
| 2581 | 0x6c41, 0x78c3, 0x0000, 0x1078, 0x7188, 0x7027, 0x0000, 0x037e, | ||
| 2582 | 0x2079, 0x0140, 0x7b04, 0xa384, 0x1000, 0x0040, 0x5feb, 0x7803, | ||
| 2583 | 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, 0x7824, 0xd084, 0x0040, | ||
| 2584 | 0x5ff3, 0x7827, 0x0001, 0x1078, 0x7188, 0x037f, 0x1078, 0x4410, | ||
| 2585 | 0x0c7e, 0x603c, 0xa005, 0x0040, 0x5fff, 0x8001, 0x603e, 0x2660, | ||
| 2586 | 0x1078, 0x753d, 0x0c7f, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, | ||
| 2587 | 0x1078, 0x8cb8, 0x1078, 0x4982, 0x1078, 0x7045, 0x0f7f, 0x007c, | ||
| 2588 | 0x0e7e, 0x0c7e, 0x2071, 0xa5ab, 0x7004, 0xa084, 0x0007, 0x0079, | ||
| 2589 | 0x6019, 0x6023, 0x6026, 0x603f, 0x605b, 0x60a0, 0x6023, 0x6023, | ||
| 2590 | 0x6021, 0x1078, 0x1328, 0x0c7f, 0x0e7f, 0x007c, 0x7024, 0xa065, | ||
| 2591 | 0x0040, 0x6034, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, 0x0040, | ||
| 2592 | 0x603b, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, | ||
| 2593 | 0x0c7f, 0x0e7f, 0x007c, 0x7216, 0x7212, 0x0078, 0x6034, 0x6018, | ||
| 2594 | 0x2060, 0x1078, 0x4410, 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, | ||
| 2595 | 0x7022, 0x0040, 0x6050, 0x6054, 0xa015, 0x0040, 0x6057, 0x721e, | ||
| 2596 | 0x7007, 0x0000, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x7218, | ||
| 2597 | 0x721e, 0x0078, 0x6050, 0x7024, 0xa065, 0x0040, 0x609d, 0x700c, | ||
| 2598 | 0xac06, 0x00c0, 0x6072, 0x1078, 0x7045, 0x600c, 0xa015, 0x0040, | ||
| 2599 | 0x606e, 0x720e, 0x600f, 0x0000, 0x0078, 0x609b, 0x720e, 0x720a, | ||
| 2600 | 0x0078, 0x609b, 0x7014, 0xac06, 0x00c0, 0x6085, 0x1078, 0x7045, | ||
| 2601 | 0x600c, 0xa015, 0x0040, 0x6081, 0x7216, 0x600f, 0x0000, 0x0078, | ||
| 2602 | 0x609b, 0x7216, 0x7212, 0x0078, 0x609b, 0x6018, 0x2060, 0x1078, | ||
| 2603 | 0x4410, 0x6000, 0xc0dc, 0x6002, 0x1078, 0x7045, 0x701c, 0xa065, | ||
| 2604 | 0x0040, 0x609b, 0x6054, 0xa015, 0x0040, 0x6099, 0x721e, 0x0078, | ||
| 2605 | 0x609b, 0x7218, 0x721e, 0x7027, 0x0000, 0x0c7f, 0x0e7f, 0x007c, | ||
| 2606 | 0x7024, 0xa065, 0x0040, 0x60ad, 0x1078, 0x7045, 0x600c, 0xa015, | ||
| 2607 | 0x0040, 0x60b4, 0x720e, 0x600f, 0x0000, 0x1078, 0x7188, 0x7027, | ||
| 2608 | 0x0000, 0x0c7f, 0x0e7f, 0x007c, 0x720e, 0x720a, 0x0078, 0x60ad, | ||
| 2609 | 0x0d7e, 0x2069, 0xa5ab, 0x6830, 0xa084, 0x0003, 0x0079, 0x60c0, | ||
| 2610 | 0x60c6, 0x60c8, 0x60ee, 0x60c6, 0x1078, 0x1328, 0x0d7f, 0x007c, | ||
| 2611 | 0x0c7e, 0x6840, 0xa086, 0x0001, 0x0040, 0x60e4, 0x683c, 0xa065, | ||
| 2612 | 0x0040, 0x60d9, 0x600c, 0xa015, 0x0040, 0x60e0, 0x6a3a, 0x600f, | ||
| 2613 | 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x0c7f, 0x0d7f, 0x007c, | ||
| 2614 | 0x683a, 0x6836, 0x0078, 0x60d9, 0x6843, 0x0000, 0x6838, 0xa065, | ||
| 2615 | 0x0040, 0x60d9, 0x6003, 0x0003, 0x0078, 0x60d9, 0x0c7e, 0x6843, | ||
| 2616 | 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0040, 0x6106, 0x600c, | ||
| 2617 | 0xa015, 0x0040, 0x6102, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, | ||
| 2618 | 0x0078, 0x6106, 0x683f, 0x0000, 0x683a, 0x6836, 0x0c7f, 0x0d7f, | ||
| 2619 | 0x007c, 0x0d7e, 0x2069, 0xa5ab, 0x6804, 0xa084, 0x0007, 0x0079, | ||
| 2620 | 0x6111, 0x611b, 0x61c2, 0x61c2, 0x61c2, 0x61c2, 0x61c4, 0x61c2, | ||
| 2621 | 0x6119, 0x1078, 0x1328, 0x6820, 0xa005, 0x00c0, 0x6121, 0x0d7f, | ||
| 2622 | 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, 0x6130, 0x6807, 0x0004, | ||
| 2623 | 0x6826, 0x682b, 0x0000, 0x1078, 0x620a, 0x0c7f, 0x0d7f, 0x007c, | ||
| 2624 | 0x6814, 0xa065, 0x0040, 0x613e, 0x6807, 0x0001, 0x6826, 0x682b, | ||
| 2625 | 0x0000, 0x1078, 0x620a, 0x0c7f, 0x0d7f, 0x007c, 0x0e7e, 0x037e, | ||
| 2626 | 0x6a1c, 0xa2f5, 0x0000, 0x0040, 0x61bd, 0x704c, 0xa00d, 0x0040, | ||
| 2627 | 0x614d, 0x7088, 0xa005, 0x0040, 0x6165, 0x7054, 0xa075, 0x0040, | ||
| 2628 | 0x6156, 0xa20e, 0x0040, 0x61bd, 0x0078, 0x615b, 0x6818, 0xa20e, | ||
| 2629 | 0x0040, 0x61bd, 0x2070, 0x704c, 0xa00d, 0x0040, 0x614d, 0x7088, | ||
| 2630 | 0xa005, 0x00c0, 0x614d, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, | ||
| 2631 | 0x00c8, 0x614d, 0x1078, 0x750c, 0x0040, 0x61bd, 0x8318, 0x733e, | ||
| 2632 | 0x6112, 0x2e10, 0x621a, 0xa180, 0x0014, 0x2004, 0xa084, 0x00ff, | ||
| 2633 | 0x6032, 0xa180, 0x0014, 0x2003, 0x0000, 0xa180, 0x0015, 0x2004, | ||
| 2634 | 0xa08a, 0x199a, 0x0048, 0x6186, 0x2001, 0x1999, 0x8003, 0x801b, | ||
| 2635 | 0x831b, 0xa318, 0x6316, 0x037f, 0x0f7e, 0x2c78, 0x71a0, 0xd1bc, | ||
| 2636 | 0x0040, 0x619f, 0x7100, 0xd1f4, 0x0040, 0x619b, 0x7114, 0xa18c, | ||
| 2637 | 0x00ff, 0x0078, 0x61a4, 0x2009, 0x0000, 0x0078, 0x61a4, 0xa1e0, | ||
| 2638 | 0x293f, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x1078, | ||
| 2639 | 0x679b, 0x7300, 0xc3dd, 0x7302, 0x6807, 0x0002, 0x2f18, 0x6b26, | ||
| 2640 | 0x682b, 0x0000, 0x781f, 0x0003, 0x7803, 0x0001, 0x7807, 0x0040, | ||
| 2641 | 0x0f7f, 0x0e7f, 0x0c7f, 0x0d7f, 0x007c, 0x037f, 0x0e7f, 0x0c7f, | ||
| 2642 | 0x0078, 0x61bb, 0x0d7f, 0x007c, 0x0c7e, 0x680c, 0xa065, 0x0040, | ||
| 2643 | 0x61d0, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x1078, 0x620a, | ||
| 2644 | 0x0c7f, 0x0d7f, 0x007c, 0x0f7e, 0x0d7e, 0x2069, 0xa5ab, 0x6830, | ||
| 2645 | 0xa086, 0x0000, 0x00c0, 0x61f1, 0x6838, 0xa07d, 0x0040, 0x61f1, | ||
| 2646 | 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x127e, 0x0f7e, 0x2091, | ||
| 2647 | 0x2200, 0x027f, 0x1078, 0x1d28, 0x00c0, 0x61f4, 0x127f, 0x1078, | ||
| 2648 | 0x6ae5, 0x0d7f, 0x0f7f, 0x007c, 0x127f, 0x6843, 0x0000, 0x7803, | ||
| 2649 | 0x0002, 0x780c, 0xa015, 0x0040, 0x6206, 0x6a3a, 0x780f, 0x0000, | ||
| 2650 | 0x6833, 0x0000, 0x683f, 0x0000, 0x0078, 0x61f1, 0x683a, 0x6836, | ||
| 2651 | 0x0078, 0x6200, 0x601c, 0xa084, 0x000f, 0x1079, 0x6210, 0x007c, | ||
| 2652 | 0x6219, 0x621e, 0x663f, 0x6758, 0x621e, 0x663f, 0x6758, 0x6219, | ||
| 2653 | 0x621e, 0x1078, 0x6010, 0x1078, 0x6109, 0x007c, 0x157e, 0x137e, | ||
| 2654 | 0x147e, 0x0c7e, 0x0f7e, 0x6004, 0xa08a, 0x0044, 0x10c8, 0x1328, | ||
| 2655 | 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x623b, 0x7900, 0xd1f4, | ||
| 2656 | 0x0040, 0x6237, 0x7914, 0xa18c, 0x00ff, 0x0078, 0x6240, 0x2009, | ||
| 2657 | 0x0000, 0x0078, 0x6240, 0xa1f8, 0x293f, 0x2f0c, 0xa18c, 0x00ff, | ||
| 2658 | 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x00c8, 0x6292, | ||
| 2659 | 0x1079, 0x6250, 0x0f7f, 0x0c7f, 0x147f, 0x137f, 0x157f, 0x007c, | ||
| 2660 | 0x62f8, 0x6340, 0x6368, 0x6403, 0x6433, 0x643b, 0x6462, 0x6473, | ||
| 2661 | 0x6484, 0x648c, 0x64a4, 0x648c, 0x650f, 0x6473, 0x6530, 0x6538, | ||
| 2662 | 0x6484, 0x6538, 0x6549, 0x6290, 0x6290, 0x6290, 0x6290, 0x6290, | ||
| 2663 | 0x6290, 0x6290, 0x6290, 0x6290, 0x6290, 0x6290, 0x6d05, 0x6d2a, | ||
| 2664 | 0x6d3f, 0x6d62, 0x6d83, 0x6462, 0x6290, 0x6462, 0x648c, 0x6290, | ||
| 2665 | 0x6368, 0x6403, 0x6290, 0x72ac, 0x648c, 0x6290, 0x72cc, 0x648c, | ||
| 2666 | 0x6290, 0x6290, 0x62f3, 0x62a1, 0x6290, 0x72f1, 0x7368, 0x7450, | ||
| 2667 | 0x6290, 0x7461, 0x645c, 0x747d, 0x6290, 0x6d98, 0x6290, 0x6290, | ||
| 2668 | 0x1078, 0x1328, 0x2100, 0x1079, 0x629b, 0x0f7f, 0x0c7f, 0x147f, | ||
| 2669 | 0x137f, 0x157f, 0x007c, 0x629f, 0x629f, 0x629f, 0x62d5, 0x1078, | ||
| 2670 | 0x1328, 0x0d7e, 0x20a1, 0x020b, 0x1078, 0x6567, 0x7810, 0x2068, | ||
| 2671 | 0x20a3, 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x683c, 0x20a2, | ||
| 2672 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 2673 | 0x6850, 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 2674 | 0x60c3, 0x0018, 0x1078, 0x6c2d, 0x0d7f, 0x007c, 0x0d7e, 0x7818, | ||
| 2675 | 0x2068, 0x68a0, 0xa082, 0x007e, 0x0048, 0x62d2, 0xa085, 0x0001, | ||
| 2676 | 0x0d7f, 0x007c, 0xa006, 0x0078, 0x62d0, 0x0d7e, 0x20a1, 0x020b, | ||
| 2677 | 0x1078, 0x6567, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x7810, 0xa0e8, | ||
| 2678 | 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, 0x20a2, 0x6814, | ||
| 2679 | 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, 0x0010, 0x1078, | ||
| 2680 | 0x6c2d, 0x0d7f, 0x007c, 0x6030, 0x609a, 0x1078, 0x6c2d, 0x007c, | ||
| 2681 | 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, 0x5200, 0x20a3, 0x0000, | ||
| 2682 | 0x0d7e, 0x2069, 0xa351, 0x6804, 0xd084, 0x0040, 0x6312, 0x6828, | ||
| 2683 | 0x20a3, 0x0000, 0x017e, 0x1078, 0x24fa, 0x21a2, 0x017f, 0x0d7f, | ||
| 2684 | 0x0078, 0x6317, 0x0d7f, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, | ||
| 2685 | 0x0004, 0x2099, 0xa305, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa301, | ||
| 2686 | 0x53a6, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0048, | ||
| 2687 | 0x6331, 0x2001, 0xa31a, 0x20a6, 0x2001, 0xa31b, 0x20a6, 0x0078, | ||
| 2688 | 0x6337, 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a3, | ||
| 2689 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, 0x6c2d, 0x007c, | ||
| 2690 | 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, 0x0500, 0x20a3, 0x0000, | ||
| 2691 | 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0048, 0x6358, | ||
| 2692 | 0x2001, 0xa31a, 0x20a6, 0x2001, 0xa31b, 0x20a6, 0x0078, 0x635e, | ||
| 2693 | 0x20a3, 0x0000, 0x6030, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, | ||
| 2694 | 0x2099, 0xa305, 0x53a6, 0x60c3, 0x0010, 0x1078, 0x6c2d, 0x007c, | ||
| 2695 | 0x20a1, 0x020b, 0x1078, 0x6567, 0x0c7e, 0x7818, 0x2060, 0x2001, | ||
| 2696 | 0x0000, 0x1078, 0x48a2, 0x0c7f, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 2697 | 0xa086, 0x007e, 0x00c0, 0x6383, 0x20a3, 0x0400, 0x620c, 0xc2b4, | ||
| 2698 | 0x620e, 0x0078, 0x6385, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x7818, | ||
| 2699 | 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x00c0, 0x63d2, 0x2099, | ||
| 2700 | 0xa58c, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, 0xa084, 0x3fff, | ||
| 2701 | 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 2702 | 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, 0xa305, 0x53a6, | ||
| 2703 | 0x20a9, 0x0004, 0x2099, 0xa301, 0x53a6, 0x20a9, 0x0010, 0x20a3, | ||
| 2704 | 0x0000, 0x00f0, 0x63af, 0x2099, 0xa594, 0x3304, 0xc0dd, 0x20a2, | ||
| 2705 | 0x2001, 0xa371, 0x2004, 0xd0e4, 0x0040, 0x63ca, 0x20a3, 0x0000, | ||
| 2706 | 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, | ||
| 2707 | 0x0078, 0x63cc, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x00f0, 0x63cc, | ||
| 2708 | 0x0078, 0x63f2, 0x2099, 0xa58c, 0x20a9, 0x0008, 0x53a6, 0x20a9, | ||
| 2709 | 0x0004, 0x2099, 0xa305, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xa301, | ||
| 2710 | 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x63e3, 0x20a9, | ||
| 2711 | 0x0008, 0x20a3, 0x0000, 0x00f0, 0x63e9, 0x2099, 0xa594, 0x20a9, | ||
| 2712 | 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x00f0, 0x63f4, | ||
| 2713 | 0x20a9, 0x000a, 0x20a3, 0x0000, 0x00f0, 0x63fa, 0x60c3, 0x0074, | ||
| 2714 | 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, | ||
| 2715 | 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, | ||
| 2716 | 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa351, | ||
| 2717 | 0x7904, 0x0f7f, 0xd1ac, 0x00c0, 0x641f, 0xa085, 0x0020, 0xd1a4, | ||
| 2718 | 0x0040, 0x6424, 0xa085, 0x0010, 0xa085, 0x0002, 0x0d7e, 0x0078, | ||
| 2719 | 0x64ed, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, | ||
| 2720 | 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, | ||
| 2721 | 0x5000, 0x0078, 0x6385, 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, | ||
| 2722 | 0x2110, 0x20a3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 2723 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 2724 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, | ||
| 2725 | 0x0014, 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, 0x65ef, | ||
| 2726 | 0x0078, 0x6466, 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0200, | ||
| 2727 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, | ||
| 2728 | 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, | ||
| 2729 | 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, | ||
| 2730 | 0x0008, 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, 0x65f8, | ||
| 2731 | 0x20a3, 0x0200, 0x0078, 0x6385, 0x20a1, 0x020b, 0x1078, 0x65f8, | ||
| 2732 | 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0040, 0x649b, | ||
| 2733 | 0x20a2, 0x0078, 0x649d, 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, | ||
| 2734 | 0x0008, 0x1078, 0x6c2d, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, | ||
| 2735 | 0x65f8, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x7818, | ||
| 2736 | 0x2068, 0x6894, 0xa086, 0x0014, 0x00c0, 0x64ca, 0x6998, 0xa184, | ||
| 2737 | 0xc000, 0x00c0, 0x64c6, 0xd1ec, 0x0040, 0x64c2, 0x20a3, 0x2100, | ||
| 2738 | 0x0078, 0x64cc, 0x20a3, 0x0100, 0x0078, 0x64cc, 0x20a3, 0x0400, | ||
| 2739 | 0x0078, 0x64cc, 0x20a3, 0x0700, 0xa006, 0x20a2, 0x20a2, 0x20a2, | ||
| 2740 | 0x20a2, 0x20a2, 0x0f7e, 0x2079, 0xa351, 0x7904, 0x0f7f, 0xd1ac, | ||
| 2741 | 0x00c0, 0x64dc, 0xa085, 0x0020, 0xd1a4, 0x0040, 0x64e1, 0xa085, | ||
| 2742 | 0x0010, 0x2009, 0xa373, 0x210c, 0xd184, 0x0040, 0x64eb, 0x699c, | ||
| 2743 | 0xd18c, 0x0040, 0x64ed, 0xa085, 0x0002, 0x027e, 0x2009, 0xa371, | ||
| 2744 | 0x210c, 0xd1e4, 0x0040, 0x64fb, 0xc0c5, 0xa094, 0x0030, 0xa296, | ||
| 2745 | 0x0010, 0x0040, 0x6505, 0xd1ec, 0x0040, 0x6505, 0xa094, 0x0030, | ||
| 2746 | 0xa296, 0x0010, 0x0040, 0x6505, 0xc0bd, 0x027f, 0x20a2, 0x20a2, | ||
| 2747 | 0x20a2, 0x60c3, 0x0014, 0x1078, 0x6c2d, 0x0d7f, 0x007c, 0x20a1, | ||
| 2748 | 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, | ||
| 2749 | 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 2750 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 2751 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x1078, 0x6c2d, 0x007c, | ||
| 2752 | 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0200, 0x0078, 0x62fe, | ||
| 2753 | 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0100, 0x20a3, 0x0000, | ||
| 2754 | 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x1078, 0x6c2d, | ||
| 2755 | 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, 0x1078, | ||
| 2756 | 0x65f8, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, | ||
| 2757 | 0x0000, 0x60c3, 0x0008, 0x1078, 0x6c2d, 0x007c, 0x027e, 0x037e, | ||
| 2758 | 0x047e, 0x2019, 0x3200, 0x2021, 0x0800, 0x0078, 0x656e, 0x027e, | ||
| 2759 | 0x037e, 0x047e, 0x2019, 0x2200, 0x2021, 0x0100, 0x20e1, 0x9080, | ||
| 2760 | 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, | ||
| 2761 | 0x00c0, 0x6581, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffe, 0x0078, | ||
| 2762 | 0x65b6, 0xa286, 0x007f, 0x00c0, 0x658d, 0x0d7e, 0xa385, 0x00ff, | ||
| 2763 | 0x20a2, 0x20a3, 0xfffd, 0x0078, 0x65a4, 0xd2bc, 0x0040, 0x65ac, | ||
| 2764 | 0xa286, 0x0080, 0x0d7e, 0x00c0, 0x659c, 0xa385, 0x00ff, 0x20a2, | ||
| 2765 | 0x20a3, 0xfffc, 0x0078, 0x65a4, 0xa2e8, 0xa434, 0x2d6c, 0x6810, | ||
| 2766 | 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, | ||
| 2767 | 0x2da6, 0x0d7f, 0x0078, 0x65ba, 0x0d7e, 0xa2e8, 0xa434, 0x2d6c, | ||
| 2768 | 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, | ||
| 2769 | 0x6230, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x047f, 0x037f, 0x20a3, | ||
| 2770 | 0x0000, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, | ||
| 2771 | 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, | ||
| 2772 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, | ||
| 2773 | 0x22a2, 0x0d7e, 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, | ||
| 2774 | 0x20a3, 0x2029, 0x20a3, 0x0000, 0x0078, 0x65c1, 0x20a3, 0x0100, | ||
| 2775 | 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, 0x0000, 0x007c, 0x027e, | ||
| 2776 | 0x037e, 0x047e, 0x2019, 0x3300, 0x2021, 0x0800, 0x0078, 0x65ff, | ||
| 2777 | 0x027e, 0x037e, 0x047e, 0x2019, 0x2300, 0x2021, 0x0100, 0x20e1, | ||
| 2778 | 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, | ||
| 2779 | 0x007e, 0x0048, 0x661c, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, | ||
| 2780 | 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, | ||
| 2781 | 0x2da6, 0x0d7f, 0x0078, 0x662a, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, | ||
| 2782 | 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, | ||
| 2783 | 0x6230, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, 0x0000, 0x047f, | ||
| 2784 | 0x037f, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, | ||
| 2785 | 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0c7e, | ||
| 2786 | 0x0f7e, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1328, 0xa08a, 0x008c, | ||
| 2787 | 0x10c8, 0x1328, 0x6118, 0x2178, 0x79a0, 0xd1bc, 0x0040, 0x665d, | ||
| 2788 | 0x7900, 0xd1f4, 0x0040, 0x6659, 0x7914, 0xa18c, 0x00ff, 0x0078, | ||
| 2789 | 0x6662, 0x2009, 0x0000, 0x0078, 0x6662, 0xa1f8, 0x293f, 0x2f0c, | ||
| 2790 | 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, | ||
| 2791 | 0x1079, 0x666d, 0x0f7f, 0x0c7f, 0x007c, 0x6676, 0x6681, 0x669c, | ||
| 2792 | 0x6674, 0x6674, 0x6674, 0x6676, 0x1078, 0x1328, 0x147e, 0x20a1, | ||
| 2793 | 0x020b, 0x1078, 0x66af, 0x60c3, 0x0000, 0x1078, 0x6c2d, 0x147f, | ||
| 2794 | 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, 0x66e3, 0x20a3, 0x0000, | ||
| 2795 | 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, | ||
| 2796 | 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, | ||
| 2797 | 0x1078, 0x6c2d, 0x147f, 0x007c, 0x147e, 0x20a1, 0x020b, 0x1078, | ||
| 2798 | 0x6724, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, | ||
| 2799 | 0x0000, 0x60c3, 0x0004, 0x1078, 0x6c2d, 0x147f, 0x007c, 0x027e, | ||
| 2800 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 2801 | 0xa092, 0x007e, 0x0048, 0x66ce, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, | ||
| 2802 | 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, | ||
| 2803 | 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x66dd, 0x0d7e, 0xa0e8, | ||
| 2804 | 0xa434, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, | ||
| 2805 | 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0009, 0x20a3, | ||
| 2806 | 0x0000, 0x0078, 0x65c1, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, | ||
| 2807 | 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, 0x6702, | ||
| 2808 | 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, | ||
| 2809 | 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, | ||
| 2810 | 0x0078, 0x6711, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, | ||
| 2811 | 0x8400, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, | ||
| 2812 | 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x1078, 0x6c1c, 0x22a2, | ||
| 2813 | 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7a10, 0x22a2, 0x20a3, 0x0000, | ||
| 2814 | 0x20a3, 0x0000, 0x027f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, | ||
| 2815 | 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa092, 0x007e, 0x0048, | ||
| 2816 | 0x6743, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x8500, | ||
| 2817 | 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, | ||
| 2818 | 0x0d7f, 0x0078, 0x6752, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, | ||
| 2819 | 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, | ||
| 2820 | 0x6230, 0x22a2, 0x20a3, 0x0099, 0x20a3, 0x0000, 0x0078, 0x6715, | ||
| 2821 | 0x0c7e, 0x0f7e, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x1048, 0x1328, | ||
| 2822 | 0xa08a, 0x0053, 0x10c8, 0x1328, 0x7918, 0x2160, 0x61a0, 0xd1bc, | ||
| 2823 | 0x0040, 0x6777, 0x6100, 0xd1f4, 0x0040, 0x6773, 0x6114, 0xa18c, | ||
| 2824 | 0x00ff, 0x0078, 0x677c, 0x2009, 0x0000, 0x0078, 0x677c, 0xa1e0, | ||
| 2825 | 0x293f, 0x2c0c, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, | ||
| 2826 | 0x0040, 0x1079, 0x6786, 0x0f7f, 0x0c7f, 0x007c, 0x679b, 0x68a9, | ||
| 2827 | 0x684a, 0x6a59, 0x6799, 0x6799, 0x6799, 0x6799, 0x6799, 0x6799, | ||
| 2828 | 0x6799, 0x6f5e, 0x6f6f, 0x6f80, 0x6f91, 0x6799, 0x748e, 0x6799, | ||
| 2829 | 0x6f4d, 0x1078, 0x1328, 0x0d7e, 0x157e, 0x147e, 0x780b, 0xffff, | ||
| 2830 | 0x20a1, 0x020b, 0x1078, 0x6806, 0x7910, 0x2168, 0x6948, 0x7922, | ||
| 2831 | 0x21a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x694c, 0xa184, 0x000f, | ||
| 2832 | 0x00c0, 0x67b6, 0x2001, 0x0005, 0x0078, 0x67c0, 0xd184, 0x0040, | ||
| 2833 | 0x67bd, 0x2001, 0x0004, 0x0078, 0x67c0, 0xa084, 0x0006, 0x8004, | ||
| 2834 | 0x017e, 0x2008, 0x7830, 0xa084, 0x00ff, 0x8007, 0xa105, 0x017f, | ||
| 2835 | 0x20a2, 0xd1ac, 0x0040, 0x67d0, 0x20a3, 0x0002, 0x0078, 0x67dc, | ||
| 2836 | 0xd1b4, 0x0040, 0x67d7, 0x20a3, 0x0001, 0x0078, 0x67dc, 0x20a3, | ||
| 2837 | 0x0000, 0x2230, 0x0078, 0x67de, 0x6a80, 0x6e7c, 0x20a9, 0x0008, | ||
| 2838 | 0xad80, 0x0017, 0x200c, 0x810f, 0x21a2, 0x8000, 0x00f0, 0x67e2, | ||
| 2839 | 0x22a2, 0x26a2, 0x60c3, 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, | ||
| 2840 | 0x0004, 0xa085, 0x0009, 0x6016, 0x2001, 0xa5c7, 0x2003, 0x07d0, | ||
| 2841 | 0x2001, 0xa5c6, 0x2003, 0x0009, 0x2001, 0xa5cc, 0x2003, 0x0002, | ||
| 2842 | 0x1078, 0x157e, 0x147f, 0x157f, 0x0d7f, 0x007c, 0x20e1, 0x9080, | ||
| 2843 | 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, | ||
| 2844 | 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, | ||
| 2845 | 0x0040, 0x682c, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, | ||
| 2846 | 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, | ||
| 2847 | 0x2da6, 0x0d7f, 0x0078, 0x683b, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, | ||
| 2848 | 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, | ||
| 2849 | 0x0000, 0x6130, 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, | ||
| 2850 | 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, | ||
| 2851 | 0x0000, 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x20a1, 0x020b, | ||
| 2852 | 0x1078, 0x686a, 0x7810, 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, | ||
| 2853 | 0x6880, 0x20a2, 0x687c, 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, | ||
| 2854 | 0x20a2, 0x60c3, 0x000c, 0x1078, 0x6c2d, 0x147f, 0x137f, 0x157f, | ||
| 2855 | 0x0d7f, 0x007c, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, | ||
| 2856 | 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6888, 0x0d7e, 0xa0e8, | ||
| 2857 | 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, | ||
| 2858 | 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6897, | ||
| 2859 | 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, | ||
| 2860 | 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, | ||
| 2861 | 0x0889, 0x20a3, 0x0000, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, | ||
| 2862 | 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, | ||
| 2863 | 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x7810, 0xa06d, 0x1078, | ||
| 2864 | 0x488f, 0x0040, 0x68bd, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, | ||
| 2865 | 0x00c0, 0x68bd, 0x7824, 0xc0cd, 0x7826, 0x20a1, 0x020b, 0x1078, | ||
| 2866 | 0x6a12, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, | ||
| 2867 | 0xa084, 0xf000, 0x00c0, 0x68d4, 0x7810, 0xa084, 0x0700, 0x8007, | ||
| 2868 | 0x1079, 0x68dc, 0x0078, 0x68d7, 0xa006, 0x1079, 0x68dc, 0x147f, | ||
| 2869 | 0x137f, 0x157f, 0x0d7f, 0x007c, 0x68e6, 0x697e, 0x6989, 0x69b3, | ||
| 2870 | 0x69c7, 0x69e3, 0x69ee, 0x68e4, 0x1078, 0x1328, 0x017e, 0x037e, | ||
| 2871 | 0x694c, 0xa18c, 0x0003, 0x0040, 0x68f1, 0xa186, 0x0003, 0x00c0, | ||
| 2872 | 0x6900, 0x6b78, 0x7824, 0xd0cc, 0x0040, 0x68f7, 0xc3e5, 0x23a2, | ||
| 2873 | 0x6868, 0x20a2, 0x6864, 0x20a2, 0x037f, 0x017f, 0x0078, 0x69be, | ||
| 2874 | 0xa186, 0x0001, 0x10c0, 0x1328, 0x6b78, 0x7824, 0xd0cc, 0x0040, | ||
| 2875 | 0x690a, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, | ||
| 2876 | 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, | ||
| 2877 | 0x0300, 0x0040, 0x6978, 0xd3c4, 0x0040, 0x6920, 0x687c, 0xa108, | ||
| 2878 | 0xd3cc, 0x0040, 0x6925, 0x6874, 0xa108, 0x157e, 0x20a9, 0x000d, | ||
| 2879 | 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, 0x8000, 0x00f0, 0x692a, | ||
| 2880 | 0x157f, 0x22a2, 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0040, 0x6978, | ||
| 2881 | 0x20a1, 0x020b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x007e, 0x7818, | ||
| 2882 | 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6958, 0x0d7e, 0xa0e8, | ||
| 2883 | 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, | ||
| 2884 | 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6967, | ||
| 2885 | 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, | ||
| 2886 | 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x007f, | ||
| 2887 | 0x7b24, 0xd3cc, 0x0040, 0x6970, 0x20a3, 0x0889, 0x0078, 0x6972, | ||
| 2888 | 0x20a3, 0x0898, 0x20a2, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, | ||
| 2889 | 0x61c2, 0x037f, 0x017f, 0x1078, 0x6c2d, 0x007c, 0x2011, 0x0008, | ||
| 2890 | 0x7824, 0xd0cc, 0x0040, 0x6985, 0xc2e5, 0x22a2, 0xa016, 0x0078, | ||
| 2891 | 0x69bc, 0x2011, 0x0302, 0x7824, 0xd0cc, 0x0040, 0x6990, 0xc2e5, | ||
| 2892 | 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, | ||
| 2893 | 0x20a3, 0x0008, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, | ||
| 2894 | 0x20a3, 0x0500, 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, | ||
| 2895 | 0x2500, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, | ||
| 2896 | 0x1078, 0x6c2d, 0x007c, 0x2011, 0x0028, 0x7824, 0xd0cc, 0x0040, | ||
| 2897 | 0x69ba, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, | ||
| 2898 | 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x1078, 0x6c2d, 0x007c, 0x2011, | ||
| 2899 | 0x0100, 0x7824, 0xd0cc, 0x0040, 0x69ce, 0xc2e5, 0x22a2, 0xa016, | ||
| 2900 | 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0008, 0x22a2, | ||
| 2901 | 0x7834, 0xa084, 0x00ff, 0x20a2, 0x22a2, 0x22a2, 0x60c3, 0x0020, | ||
| 2902 | 0x1078, 0x6c2d, 0x007c, 0x2011, 0x0008, 0x7824, 0xd0cc, 0x0040, | ||
| 2903 | 0x69ea, 0xc2e5, 0x22a2, 0xa016, 0x0078, 0x69bc, 0x037e, 0x7b10, | ||
| 2904 | 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, 0x00c0, 0x6a01, | ||
| 2905 | 0x7824, 0xd0cc, 0x0040, 0x69fd, 0xc2e5, 0x22a2, 0x037f, 0x0078, | ||
| 2906 | 0x69bc, 0x047e, 0x2021, 0x0800, 0x007e, 0x7824, 0xd0cc, 0x007f, | ||
| 2907 | 0x0040, 0x6a0b, 0xc4e5, 0x24a2, 0x047f, 0x22a2, 0x20a2, 0x037f, | ||
| 2908 | 0x0078, 0x69be, 0x027e, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, | ||
| 2909 | 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, 0x6a30, 0x0d7e, 0xa0e8, | ||
| 2910 | 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, | ||
| 2911 | 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x6a3f, | ||
| 2912 | 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, | ||
| 2913 | 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x7824, | ||
| 2914 | 0xd0cc, 0x0040, 0x6a47, 0x20a3, 0x0889, 0x0078, 0x6a49, 0x20a3, | ||
| 2915 | 0x0898, 0x20a3, 0x0000, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, | ||
| 2916 | 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x027f, | ||
| 2917 | 0x007c, 0x0d7e, 0x157e, 0x137e, 0x147e, 0x017e, 0x037e, 0x7810, | ||
| 2918 | 0xa084, 0x0700, 0x8007, 0x1079, 0x6a6c, 0x037f, 0x017f, 0x147f, | ||
| 2919 | 0x137f, 0x157f, 0x0d7f, 0x007c, 0x6a74, 0x6a74, 0x6a76, 0x6a74, | ||
| 2920 | 0x6a74, 0x6a74, 0x6a9b, 0x6a74, 0x1078, 0x1328, 0x7910, 0xa18c, | ||
| 2921 | 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, | ||
| 2922 | 0x1078, 0x6aa5, 0x0d7e, 0x2069, 0xa351, 0x6804, 0xd0bc, 0x0040, | ||
| 2923 | 0x6a90, 0x682c, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0078, 0x6a92, | ||
| 2924 | 0x20a3, 0x3f00, 0x0d7f, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, | ||
| 2925 | 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x2009, 0x0003, 0x1078, | ||
| 2926 | 0x6aa5, 0x20a3, 0x7f00, 0x0078, 0x6a93, 0x027e, 0x20e1, 0x9080, | ||
| 2927 | 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0xd0bc, 0x0040, | ||
| 2928 | 0x6ac3, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, 0xa085, 0x0100, | ||
| 2929 | 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, 0x2da6, 0x8d68, 0x2da6, | ||
| 2930 | 0x0d7f, 0x0078, 0x6ad2, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, 0x6810, | ||
| 2931 | 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, 0x0d7f, 0x20a3, 0x0000, | ||
| 2932 | 0x6230, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x1078, | ||
| 2933 | 0x6c1c, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, | ||
| 2934 | 0x0000, 0x20a3, 0x0000, 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x0c7e, | ||
| 2935 | 0x057e, 0x047e, 0x037e, 0x2061, 0x0100, 0x2071, 0xa300, 0x6130, | ||
| 2936 | 0x7818, 0x2068, 0x68a0, 0x2028, 0xd0bc, 0x00c0, 0x6afc, 0x6910, | ||
| 2937 | 0x6a14, 0x6430, 0x0078, 0x6b00, 0x6910, 0x6a14, 0x7368, 0x746c, | ||
| 2938 | 0x781c, 0xa086, 0x0006, 0x0040, 0x6b5f, 0xd5bc, 0x0040, 0x6b10, | ||
| 2939 | 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, 0x646e, 0x0078, 0x6b17, | ||
| 2940 | 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x6073, | ||
| 2941 | 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, | ||
| 2942 | 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, | ||
| 2943 | 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, | ||
| 2944 | 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, | ||
| 2945 | 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x6b49, 0x6a00, 0xd2f4, | ||
| 2946 | 0x0040, 0x6b47, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6b49, 0x2011, | ||
| 2947 | 0x0000, 0x629e, 0x6017, 0x0016, 0x2009, 0x07d0, 0x60c4, 0xa084, | ||
| 2948 | 0xfff0, 0xa005, 0x0040, 0x6b56, 0x2009, 0x1b58, 0x1078, 0x595f, | ||
| 2949 | 0x037f, 0x047f, 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7810, | ||
| 2950 | 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0040, 0x6bb7, | ||
| 2951 | 0xd5bc, 0x0040, 0x6b73, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, | ||
| 2952 | 0x646e, 0x0078, 0x6b7a, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, | ||
| 2953 | 0x0000, 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, | ||
| 2954 | 0xa084, 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, | ||
| 2955 | 0x6086, 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, | ||
| 2956 | 0x60c6, 0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, | ||
| 2957 | 0x7928, 0xa109, 0x792a, 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, | ||
| 2958 | 0x95d5, 0x60d7, 0x0000, 0xa582, 0x0080, 0x0048, 0x6bb2, 0x6a00, | ||
| 2959 | 0xd2f4, 0x0040, 0x6bb0, 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6bb2, | ||
| 2960 | 0x2011, 0x0000, 0x629e, 0x6017, 0x0012, 0x0078, 0x6b4c, 0xd5bc, | ||
| 2961 | 0x0040, 0x6bc2, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, | ||
| 2962 | 0x0078, 0x6bc9, 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, | ||
| 2963 | 0x646e, 0x1078, 0x488f, 0x0040, 0x6bdf, 0x0d7e, 0x7810, 0xa06d, | ||
| 2964 | 0x684c, 0x0d7f, 0xa084, 0x2020, 0xa086, 0x2020, 0x00c0, 0x6bdf, | ||
| 2965 | 0x7824, 0xc0cd, 0x7826, 0x6073, 0x0889, 0x0078, 0x6be1, 0x6073, | ||
| 2966 | 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, | ||
| 2967 | 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, 0x7808, 0x6082, | ||
| 2968 | 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, 0x7008, 0x60ca, | ||
| 2969 | 0x686c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, | ||
| 2970 | 0xa582, 0x0080, 0x0048, 0x6c0f, 0x6a00, 0xd2f4, 0x0040, 0x6c0d, | ||
| 2971 | 0x6a14, 0xa294, 0x00ff, 0x0078, 0x6c0f, 0x2011, 0x0000, 0x629e, | ||
| 2972 | 0x7824, 0xd0cc, 0x0040, 0x6c18, 0x6017, 0x0016, 0x0078, 0x6b4c, | ||
| 2973 | 0x6017, 0x0012, 0x0078, 0x6b4c, 0x7a18, 0xa280, 0x0023, 0x2014, | ||
| 2974 | 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x007c, 0x0d7e, 0x2069, | ||
| 2975 | 0xa5ab, 0x6843, 0x0001, 0x0d7f, 0x007c, 0x20e1, 0x9080, 0x60a3, | ||
| 2976 | 0x0056, 0x60a7, 0x9575, 0x1078, 0x6c38, 0x1078, 0x594f, 0x007c, | ||
| 2977 | 0x007e, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, 0x6016, 0x007f, | ||
| 2978 | 0x007c, 0x007e, 0x0c7e, 0x2061, 0x0100, 0x6014, 0xa084, 0x0004, | ||
| 2979 | 0xa085, 0x0008, 0x6016, 0x0c7f, 0x007f, 0x007c, 0x0c7e, 0x0d7e, | ||
| 2980 | 0x017e, 0x027e, 0x2061, 0x0100, 0x2069, 0x0140, 0x6904, 0xa194, | ||
| 2981 | 0x4000, 0x0040, 0x6c89, 0x1078, 0x6c41, 0x6803, 0x1000, 0x6803, | ||
| 2982 | 0x0000, 0x0c7e, 0x2061, 0xa5ab, 0x6128, 0xa192, 0x00c8, 0x00c8, | ||
| 2983 | 0x6c76, 0x8108, 0x612a, 0x6124, 0x0c7f, 0x81ff, 0x0040, 0x6c84, | ||
| 2984 | 0x1078, 0x594f, 0x1078, 0x6c38, 0x0078, 0x6c84, 0x6124, 0xa1e5, | ||
| 2985 | 0x0000, 0x0040, 0x6c81, 0x1078, 0xa241, 0x2009, 0x0014, 0x1078, | ||
| 2986 | 0x756c, 0x0c7f, 0x0078, 0x6c84, 0x027f, 0x017f, 0x0d7f, 0x0c7f, | ||
| 2987 | 0x007c, 0x2001, 0xa5c7, 0x2004, 0xa005, 0x00c0, 0x6c84, 0x0c7e, | ||
| 2988 | 0x2061, 0xa5ab, 0x6128, 0xa192, 0x0003, 0x00c8, 0x6c76, 0x8108, | ||
| 2989 | 0x612a, 0x0c7f, 0x1078, 0x594f, 0x1078, 0x4171, 0x0078, 0x6c84, | ||
| 2990 | 0x0c7e, 0x0d7e, 0x0e7e, 0x017e, 0x027e, 0x1078, 0x5967, 0x2071, | ||
| 2991 | 0xa5ab, 0x713c, 0x81ff, 0x0040, 0x6cca, 0x2061, 0x0100, 0x2069, | ||
| 2992 | 0x0140, 0x6904, 0xa194, 0x4000, 0x0040, 0x6cd0, 0x6803, 0x1000, | ||
| 2993 | 0x6803, 0x0000, 0x037e, 0x2019, 0x0001, 0x1078, 0x6e6c, 0x037f, | ||
| 2994 | 0x713c, 0x2160, 0x1078, 0xa241, 0x2009, 0x004a, 0x1078, 0x756c, | ||
| 2995 | 0x0078, 0x6cca, 0x027f, 0x017f, 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, | ||
| 2996 | 0x0078, 0x6cba, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x057e, 0x047e, | ||
| 2997 | 0x007e, 0x127e, 0x2091, 0x8000, 0x6018, 0x2068, 0x6ca0, 0x2071, | ||
| 2998 | 0xa5ab, 0x7018, 0x2068, 0x8dff, 0x0040, 0x6cfc, 0x68a0, 0xa406, | ||
| 2999 | 0x0040, 0x6cee, 0x6854, 0x2068, 0x0078, 0x6ce3, 0x6010, 0x2060, | ||
| 3000 | 0x643c, 0x6540, 0x6e48, 0x2d60, 0x1078, 0x466a, 0x0040, 0x6cfc, | ||
| 3001 | 0x1078, 0x7045, 0xa085, 0x0001, 0x127f, 0x007f, 0x047f, 0x057f, | ||
| 3002 | 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x20a1, 0x020b, 0x1078, | ||
| 3003 | 0x6567, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, | ||
| 3004 | 0xa086, 0x0004, 0x00c0, 0x6d17, 0x6098, 0x0078, 0x6d18, 0x6030, | ||
| 3005 | 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, | ||
| 3006 | 0x20a2, 0x00f0, 0x6d20, 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x1078, | ||
| 3007 | 0x6c2d, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x6567, | ||
| 3008 | 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, | ||
| 3009 | 0x60c3, 0x0008, 0x1078, 0x6c2d, 0x147f, 0x157f, 0x007c, 0x157e, | ||
| 3010 | 0x147e, 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0200, 0x20a3, | ||
| 3011 | 0x0000, 0x20a9, 0x0006, 0x2011, 0xa340, 0x2019, 0xa341, 0x23a6, | ||
| 3012 | 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x00f0, 0x6d4f, 0x20a3, | ||
| 3013 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x1078, 0x6c2d, 0x147f, | ||
| 3014 | 0x157f, 0x007c, 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, | ||
| 3015 | 0x1078, 0x65cf, 0x1078, 0x65e6, 0x7810, 0xa080, 0x0000, 0x2004, | ||
| 3016 | 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, | ||
| 3017 | 0xa080, 0x0004, 0x8003, 0x60c2, 0x1078, 0x6c2d, 0x027f, 0x017f, | ||
| 3018 | 0x147f, 0x157f, 0x007c, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, | ||
| 3019 | 0x6567, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, | ||
| 3020 | 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6c2d, 0x147f, 0x157f, 0x007c, | ||
| 3021 | 0x157e, 0x147e, 0x017e, 0x027e, 0x20a1, 0x020b, 0x1078, 0x6567, | ||
| 3022 | 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, | ||
| 3023 | 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x1078, 0x6c2d, | ||
| 3024 | 0x027f, 0x017f, 0x147f, 0x157f, 0x007c, 0x0e7e, 0x0c7e, 0x007e, | ||
| 3025 | 0x127e, 0x2091, 0x8000, 0x2071, 0xa5ab, 0x700c, 0x2060, 0x8cff, | ||
| 3026 | 0x0040, 0x6dd1, 0x1078, 0x8c3b, 0x00c0, 0x6dc8, 0x1078, 0x7a05, | ||
| 3027 | 0x600c, 0x007e, 0x1078, 0x753d, 0x1078, 0x7045, 0x0c7f, 0x0078, | ||
| 3028 | 0x6dbf, 0x700f, 0x0000, 0x700b, 0x0000, 0x127f, 0x007f, 0x0c7f, | ||
| 3029 | 0x0e7f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, | ||
| 3030 | 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, | ||
| 3031 | 0x0140, 0x2071, 0xa5ab, 0x7024, 0x2060, 0x8cff, 0x0040, 0x6e2a, | ||
| 3032 | 0x1078, 0x6c41, 0x68c3, 0x0000, 0x1078, 0x595a, 0x2009, 0x0013, | ||
| 3033 | 0x1078, 0x756c, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0040, 0x6e0d, | ||
| 3034 | 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x6e1f, 0x7803, | ||
| 3035 | 0x1000, 0x7803, 0x0000, 0x0078, 0x6e1f, 0xd084, 0x0040, 0x6e14, | ||
| 3036 | 0x6827, 0x0001, 0x0078, 0x6e16, 0x00f0, 0x6dfc, 0x7804, 0xa084, | ||
| 3037 | 0x1000, 0x0040, 0x6e1f, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, | ||
| 3038 | 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, | ||
| 3039 | 0x127f, 0x007c, 0x2001, 0xa300, 0x2004, 0xa096, 0x0001, 0x0040, | ||
| 3040 | 0x6e62, 0xa096, 0x0004, 0x0040, 0x6e62, 0x6817, 0x0008, 0x68c3, | ||
| 3041 | 0x0000, 0x2011, 0x4129, 0x1078, 0x58d4, 0x20a9, 0x01f4, 0x6824, | ||
| 3042 | 0xd094, 0x0040, 0x6e50, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, | ||
| 3043 | 0x0040, 0x6e62, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0x6e62, | ||
| 3044 | 0xd084, 0x0040, 0x6e57, 0x6827, 0x0001, 0x0078, 0x6e59, 0x00f0, | ||
| 3045 | 0x6e3f, 0x7804, 0xa084, 0x1000, 0x0040, 0x6e62, 0x7803, 0x0100, | ||
| 3046 | 0x7803, 0x0000, 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, | ||
| 3047 | 0x0f7f, 0x157f, 0x127f, 0x007c, 0x127e, 0x157e, 0x0f7e, 0x0e7e, | ||
| 3048 | 0x0d7e, 0x0c7e, 0x027e, 0x017e, 0x007e, 0x2091, 0x8000, 0x2069, | ||
| 3049 | 0x0100, 0x2079, 0x0140, 0x2071, 0xa5ab, 0x703c, 0x2060, 0x8cff, | ||
| 3050 | 0x0040, 0x6ee8, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x00c0, | ||
| 3051 | 0x6e86, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x1078, 0x5967, 0x1078, | ||
| 3052 | 0x1f31, 0x047e, 0x057e, 0x2009, 0x017f, 0x212c, 0x200b, 0x00a5, | ||
| 3053 | 0x2021, 0x0169, 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, | ||
| 3054 | 0x6eb7, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x0e7e, 0x0f7e, 0x2079, | ||
| 3055 | 0x0020, 0x2071, 0xa602, 0x6814, 0xa084, 0x0004, 0xa085, 0x0012, | ||
| 3056 | 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x0f7f, 0x0e7f, 0x250a, | ||
| 3057 | 0x057f, 0x047f, 0xa39d, 0x0000, 0x00c0, 0x6ec2, 0x2009, 0x0049, | ||
| 3058 | 0x1078, 0x756c, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0040, 0x6ed5, | ||
| 3059 | 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x0040, 0x6ee7, 0x7803, | ||
| 3060 | 0x1000, 0x7803, 0x0000, 0x0078, 0x6ee7, 0xd08c, 0x0040, 0x6edc, | ||
| 3061 | 0x6827, 0x0002, 0x0078, 0x6ede, 0x00f0, 0x6ec4, 0x7804, 0xa084, | ||
| 3062 | 0x1000, 0x0040, 0x6ee7, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, | ||
| 3063 | 0x007f, 0x017f, 0x027f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x157f, | ||
| 3064 | 0x127f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, 0x2069, 0xa5ab, | ||
| 3065 | 0x6a06, 0x127f, 0x0d7f, 0x007c, 0x0d7e, 0x127e, 0x2091, 0x8000, | ||
| 3066 | 0x2069, 0xa5ab, 0x6a32, 0x127f, 0x0d7f, 0x007c, 0x0f7e, 0x0e7e, | ||
| 3067 | 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2071, 0xa5ab, 0x7614, 0x2660, | ||
| 3068 | 0x2678, 0x2091, 0x8000, 0x8cff, 0x0040, 0x6f46, 0x601c, 0xa206, | ||
| 3069 | 0x00c0, 0x6f41, 0x7014, 0xac36, 0x00c0, 0x6f20, 0x660c, 0x7616, | ||
| 3070 | 0x7010, 0xac36, 0x00c0, 0x6f2e, 0x2c00, 0xaf36, 0x0040, 0x6f2c, | ||
| 3071 | 0x2f00, 0x7012, 0x0078, 0x6f2e, 0x7013, 0x0000, 0x660c, 0x067e, | ||
| 3072 | 0x2c00, 0xaf06, 0x0040, 0x6f37, 0x7e0e, 0x0078, 0x6f38, 0x2678, | ||
| 3073 | 0x600f, 0x0000, 0x1078, 0x8c01, 0x1078, 0x7045, 0x0c7f, 0x0078, | ||
| 3074 | 0x6f13, 0x2c78, 0x600c, 0x2060, 0x0078, 0x6f13, 0x127f, 0x007f, | ||
| 3075 | 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0x157e, 0x147e, 0x20a1, | ||
| 3076 | 0x020b, 0x1078, 0x6806, 0x7810, 0x20a2, 0xa006, 0x20a2, 0x20a2, | ||
| 3077 | 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0078, 0x6fa0, 0x157e, 0x147e, | ||
| 3078 | 0x20a1, 0x020b, 0x1078, 0x6806, 0x7810, 0x20a2, 0xa006, 0x20a2, | ||
| 3079 | 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0078, 0x6fa0, 0x157e, | ||
| 3080 | 0x147e, 0x20a1, 0x020b, 0x1078, 0x6806, 0x7810, 0x20a2, 0xa006, | ||
| 3081 | 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x0078, 0x6fa0, | ||
| 3082 | 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x6806, 0x7810, 0x20a2, | ||
| 3083 | 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, | ||
| 3084 | 0x6fa0, 0x157e, 0x147e, 0x20a1, 0x020b, 0x1078, 0x6806, 0x7810, | ||
| 3085 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, | ||
| 3086 | 0x1078, 0x7050, 0x60c3, 0x0020, 0x1078, 0x6c2d, 0x147f, 0x157f, | ||
| 3087 | 0x007c, 0x127e, 0x0c7e, 0x2091, 0x8000, 0x2061, 0x0100, 0x6120, | ||
| 3088 | 0xd1b4, 0x00c0, 0x6fb8, 0xd1bc, 0x00c0, 0x7002, 0x0078, 0x7042, | ||
| 3089 | 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, 0x0d7e, 0x2069, | ||
| 3090 | 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, 0xa084, 0x4000, | ||
| 3091 | 0x0040, 0x6ff9, 0x6020, 0xd0b4, 0x0040, 0x6ff9, 0x6024, 0xd094, | ||
| 3092 | 0x00c0, 0x6ff9, 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, | ||
| 3093 | 0x6ff9, 0x00f0, 0x6fc5, 0x027e, 0x6198, 0xa18c, 0x00ff, 0x8107, | ||
| 3094 | 0x6130, 0xa18c, 0x00ff, 0xa10d, 0x6088, 0x628c, 0x618e, 0x608b, | ||
| 3095 | 0xbc91, 0x6043, 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6024, | ||
| 3096 | 0xd094, 0x00c0, 0x6ff8, 0x6a04, 0xa294, 0x4000, 0x00c0, 0x6fef, | ||
| 3097 | 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, 0x200b, 0x0000, | ||
| 3098 | 0x0078, 0x7042, 0x2009, 0x017f, 0x200b, 0x00a1, 0x157e, 0x007e, | ||
| 3099 | 0x0d7e, 0x2069, 0x0140, 0x20a9, 0x001e, 0x2009, 0x0169, 0x6804, | ||
| 3100 | 0xa084, 0x4000, 0x0040, 0x703b, 0x6020, 0xd0bc, 0x0040, 0x703b, | ||
| 3101 | 0x2104, 0xa084, 0x000f, 0xa086, 0x0004, 0x00c0, 0x703b, 0x00f0, | ||
| 3102 | 0x700f, 0x027e, 0x6164, 0xa18c, 0x00ff, 0x8107, 0x6130, 0xa18c, | ||
| 3103 | 0x00ff, 0xa10d, 0x6088, 0x628c, 0x608b, 0xbc91, 0x618e, 0x6043, | ||
| 3104 | 0x0001, 0x6043, 0x0000, 0x608a, 0x628e, 0x6a04, 0xa294, 0x4000, | ||
| 3105 | 0x00c0, 0x7035, 0x027f, 0x0d7f, 0x007f, 0x157f, 0x2009, 0x017f, | ||
| 3106 | 0x200b, 0x0000, 0x0c7f, 0x127f, 0x007c, 0x0e7e, 0x2071, 0xa5ab, | ||
| 3107 | 0x7020, 0xa005, 0x0040, 0x704e, 0x8001, 0x7022, 0x0e7f, 0x007c, | ||
| 3108 | 0x20a9, 0x0008, 0x20a2, 0x00f0, 0x7052, 0x20a2, 0x20a2, 0x007c, | ||
| 3109 | 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x077e, 0x067e, 0x007e, 0x127e, | ||
| 3110 | 0x2091, 0x8000, 0x2071, 0xa5ab, 0x7614, 0x2660, 0x2678, 0x2039, | ||
| 3111 | 0x0001, 0x87ff, 0x0040, 0x70f4, 0x8cff, 0x0040, 0x70f4, 0x601c, | ||
| 3112 | 0xa086, 0x0006, 0x00c0, 0x70ef, 0x88ff, 0x0040, 0x707f, 0x2800, | ||
| 3113 | 0xac06, 0x00c0, 0x70ef, 0x2039, 0x0000, 0x0078, 0x708a, 0x6018, | ||
| 3114 | 0xa206, 0x00c0, 0x70ef, 0x85ff, 0x0040, 0x708a, 0x6020, 0xa106, | ||
| 3115 | 0x00c0, 0x70ef, 0x7024, 0xac06, 0x00c0, 0x70ba, 0x2069, 0x0100, | ||
| 3116 | 0x68c0, 0xa005, 0x0040, 0x70b5, 0x1078, 0x595a, 0x6817, 0x0008, | ||
| 3117 | 0x68c3, 0x0000, 0x1078, 0x7188, 0x7027, 0x0000, 0x037e, 0x2069, | ||
| 3118 | 0x0140, 0x6b04, 0xa384, 0x1000, 0x0040, 0x70aa, 0x6803, 0x0100, | ||
| 3119 | 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0040, 0x70b2, | ||
| 3120 | 0x6827, 0x0001, 0x037f, 0x0078, 0x70ba, 0x6003, 0x0009, 0x630a, | ||
| 3121 | 0x0078, 0x70ef, 0x7014, 0xac36, 0x00c0, 0x70c0, 0x660c, 0x7616, | ||
| 3122 | 0x7010, 0xac36, 0x00c0, 0x70ce, 0x2c00, 0xaf36, 0x0040, 0x70cc, | ||
| 3123 | 0x2f00, 0x7012, 0x0078, 0x70ce, 0x7013, 0x0000, 0x660c, 0x067e, | ||
| 3124 | 0x2c00, 0xaf06, 0x0040, 0x70d7, 0x7e0e, 0x0078, 0x70d8, 0x2678, | ||
| 3125 | 0x89ff, 0x00c0, 0x70e7, 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, | ||
| 3126 | 0x8a44, 0x0040, 0x70e5, 0x1078, 0x9e70, 0x1078, 0x8c01, 0x1078, | ||
| 3127 | 0x7045, 0x88ff, 0x00c0, 0x70fe, 0x0c7f, 0x0078, 0x7069, 0x2c78, | ||
| 3128 | 0x600c, 0x2060, 0x0078, 0x7069, 0xa006, 0x127f, 0x007f, 0x067f, | ||
| 3129 | 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, 0x007c, 0x6017, 0x0000, | ||
| 3130 | 0x0c7f, 0xa8c5, 0x0001, 0x0078, 0x70f5, 0x0f7e, 0x0e7e, 0x0d7e, | ||
| 3131 | 0x0c7e, 0x067e, 0x027e, 0x007e, 0x127e, 0x2091, 0x8000, 0x2071, | ||
| 3132 | 0xa5ab, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0040, 0x7177, 0x601c, | ||
| 3133 | 0xa086, 0x0006, 0x00c0, 0x7172, 0x87ff, 0x0040, 0x7125, 0x2700, | ||
| 3134 | 0xac06, 0x00c0, 0x7172, 0x0078, 0x7130, 0x6018, 0xa206, 0x00c0, | ||
| 3135 | 0x7172, 0x85ff, 0x0040, 0x7130, 0x6020, 0xa106, 0x00c0, 0x7172, | ||
| 3136 | 0x703c, 0xac06, 0x00c0, 0x7142, 0x037e, 0x2019, 0x0001, 0x1078, | ||
| 3137 | 0x6e6c, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, | ||
| 3138 | 0x0000, 0x037f, 0x7038, 0xac36, 0x00c0, 0x7148, 0x660c, 0x763a, | ||
| 3139 | 0x7034, 0xac36, 0x00c0, 0x7156, 0x2c00, 0xaf36, 0x0040, 0x7154, | ||
| 3140 | 0x2f00, 0x7036, 0x0078, 0x7156, 0x7037, 0x0000, 0x660c, 0x067e, | ||
| 3141 | 0x2c00, 0xaf06, 0x0040, 0x715f, 0x7e0e, 0x0078, 0x7160, 0x2678, | ||
| 3142 | 0x600f, 0x0000, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x716a, | ||
| 3143 | 0x1078, 0x9e70, 0x1078, 0x8c01, 0x87ff, 0x00c0, 0x7181, 0x0c7f, | ||
| 3144 | 0x0078, 0x7114, 0x2c78, 0x600c, 0x2060, 0x0078, 0x7114, 0xa006, | ||
| 3145 | 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, | ||
| 3146 | 0x007c, 0x6017, 0x0000, 0x0c7f, 0xa7bd, 0x0001, 0x0078, 0x7178, | ||
| 3147 | 0x0e7e, 0x2071, 0xa5ab, 0x2001, 0xa300, 0x2004, 0xa086, 0x0002, | ||
| 3148 | 0x00c0, 0x7196, 0x7007, 0x0005, 0x0078, 0x7198, 0x7007, 0x0000, | ||
| 3149 | 0x0e7f, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x067e, 0x027e, 0x007e, | ||
| 3150 | 0x127e, 0x2091, 0x8000, 0x2071, 0xa5ab, 0x2c10, 0x7638, 0x2660, | ||
| 3151 | 0x2678, 0x8cff, 0x0040, 0x71d8, 0x2200, 0xac06, 0x00c0, 0x71d3, | ||
| 3152 | 0x7038, 0xac36, 0x00c0, 0x71b6, 0x660c, 0x763a, 0x7034, 0xac36, | ||
| 3153 | 0x00c0, 0x71c4, 0x2c00, 0xaf36, 0x0040, 0x71c2, 0x2f00, 0x7036, | ||
| 3154 | 0x0078, 0x71c4, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0040, | ||
| 3155 | 0x71cc, 0x7e0e, 0x0078, 0x71cd, 0x2678, 0x600f, 0x0000, 0xa085, | ||
| 3156 | 0x0001, 0x0078, 0x71d8, 0x2c78, 0x600c, 0x2060, 0x0078, 0x71a9, | ||
| 3157 | 0x127f, 0x007f, 0x027f, 0x067f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, | ||
| 3158 | 0x0f7e, 0x0e7e, 0x0d7e, 0x0c7e, 0x067e, 0x007e, 0x127e, 0x2091, | ||
| 3159 | 0x8000, 0x2071, 0xa5ab, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0040, | ||
| 3160 | 0x7279, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x00c0, 0x7274, | ||
| 3161 | 0x7024, 0xac06, 0x00c0, 0x721f, 0x2069, 0x0100, 0x68c0, 0xa005, | ||
| 3162 | 0x0040, 0x724d, 0x1078, 0x6c41, 0x68c3, 0x0000, 0x1078, 0x7188, | ||
| 3163 | 0x7027, 0x0000, 0x037e, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, | ||
| 3164 | 0x0040, 0x7216, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, | ||
| 3165 | 0x6824, 0xd084, 0x0040, 0x721e, 0x6827, 0x0001, 0x037f, 0x700c, | ||
| 3166 | 0xac36, 0x00c0, 0x7225, 0x660c, 0x760e, 0x7008, 0xac36, 0x00c0, | ||
| 3167 | 0x7233, 0x2c00, 0xaf36, 0x0040, 0x7231, 0x2f00, 0x700a, 0x0078, | ||
| 3168 | 0x7233, 0x700b, 0x0000, 0x660c, 0x067e, 0x2c00, 0xaf06, 0x0040, | ||
| 3169 | 0x723c, 0x7e0e, 0x0078, 0x723d, 0x2678, 0x600f, 0x0000, 0x1078, | ||
| 3170 | 0x8c27, 0x00c0, 0x7251, 0x1078, 0x2839, 0x1078, 0x8c3b, 0x00c0, | ||
| 3171 | 0x726d, 0x1078, 0x7a05, 0x0078, 0x726d, 0x1078, 0x7188, 0x0078, | ||
| 3172 | 0x721f, 0x1078, 0x8c3b, 0x00c0, 0x7259, 0x1078, 0x7a05, 0x0078, | ||
| 3173 | 0x726d, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x726d, 0x601c, | ||
| 3174 | 0xa086, 0x0003, 0x00c0, 0x7281, 0x6837, 0x0103, 0x6b4a, 0x6847, | ||
| 3175 | 0x0000, 0x1078, 0x4982, 0x1078, 0x8bf4, 0x1078, 0x8c01, 0x1078, | ||
| 3176 | 0x7045, 0x0c7f, 0x0078, 0x71ee, 0x2c78, 0x600c, 0x2060, 0x0078, | ||
| 3177 | 0x71ee, 0x127f, 0x007f, 0x067f, 0x0c7f, 0x0d7f, 0x0e7f, 0x0f7f, | ||
| 3178 | 0x007c, 0x601c, 0xa086, 0x0006, 0x00c0, 0x726d, 0x1078, 0x9e70, | ||
| 3179 | 0x0078, 0x726d, 0x037e, 0x157e, 0x137e, 0x147e, 0x3908, 0xa006, | ||
| 3180 | 0xa190, 0x0020, 0x221c, 0xa39e, 0x260c, 0x00c0, 0x729b, 0x8210, | ||
| 3181 | 0x8000, 0x0078, 0x7292, 0xa005, 0x0040, 0x72a7, 0x20a9, 0x0020, | ||
| 3182 | 0x2198, 0x8211, 0xa282, 0x0020, 0x20c8, 0x20a0, 0x53a3, 0x147f, | ||
| 3183 | 0x137f, 0x157f, 0x037f, 0x007c, 0x0d7e, 0x20a1, 0x020b, 0x1078, | ||
| 3184 | 0x65f8, 0x20a3, 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, | ||
| 3185 | 0x0000, 0x20a3, 0x0000, 0x2099, 0xa5a3, 0x20a9, 0x0004, 0x53a6, | ||
| 3186 | 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 3187 | 0x1078, 0x6c2d, 0x0d7f, 0x007c, 0x20a1, 0x020b, 0x1078, 0x65f8, | ||
| 3188 | 0x20a3, 0x0214, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, | ||
| 3189 | 0xff00, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 3190 | 0x20a3, 0x0000, 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, | ||
| 3191 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0018, 0x1078, 0x6c2d, | ||
| 3192 | 0x007c, 0x0d7e, 0x017e, 0x2f68, 0x2009, 0x0035, 0x1078, 0x8ef5, | ||
| 3193 | 0x00c0, 0x7361, 0x20a1, 0x020b, 0x1078, 0x6567, 0x20a3, 0x1300, | ||
| 3194 | 0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0040, | ||
| 3195 | 0x733d, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x00c0, | ||
| 3196 | 0x7317, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0078, 0x7352, 0xa286, | ||
| 3197 | 0x007f, 0x00c0, 0x7321, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0078, | ||
| 3198 | 0x7352, 0xd2bc, 0x0040, 0x7337, 0xa286, 0x0080, 0x00c0, 0x732e, | ||
| 3199 | 0x20a3, 0x00ff, 0x20a3, 0xfffc, 0x0078, 0x7352, 0xa2e8, 0xa434, | ||
| 3200 | 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x0078, 0x7352, 0x20a3, | ||
| 3201 | 0x0000, 0x6098, 0x20a2, 0x0078, 0x7352, 0x7818, 0xa080, 0x0028, | ||
| 3202 | 0x2004, 0xa082, 0x007e, 0x0048, 0x734e, 0x0d7e, 0x2069, 0xa31a, | ||
| 3203 | 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x7352, 0x20a3, 0x0000, | ||
| 3204 | 0x6030, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, 0x0000, | ||
| 3205 | 0x20a3, 0x0000, 0x60c3, 0x000c, 0x1078, 0x6c2d, 0x017f, 0x0d7f, | ||
| 3206 | 0x007c, 0x7817, 0x0001, 0x7803, 0x0006, 0x017f, 0x0d7f, 0x007c, | ||
| 3207 | 0x0d7e, 0x027e, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, 0x0040, | ||
| 3208 | 0x738a, 0xa186, 0x0003, 0x0040, 0x73e5, 0xa186, 0x0005, 0x0040, | ||
| 3209 | 0x73c8, 0xa186, 0x0004, 0x0040, 0x73b8, 0xa186, 0x0008, 0x0040, | ||
| 3210 | 0x73d2, 0x7807, 0x0037, 0x7813, 0x1700, 0x1078, 0x7450, 0x027f, | ||
| 3211 | 0x0d7f, 0x007c, 0x1078, 0x740d, 0x2009, 0x4000, 0x6800, 0x0079, | ||
| 3212 | 0x7391, 0x73a4, 0x73b2, 0x73a6, 0x73b2, 0x73ad, 0x73a4, 0x73a4, | ||
| 3213 | 0x73b2, 0x73b2, 0x73b2, 0x73b2, 0x73a4, 0x73a4, 0x73a4, 0x73a4, | ||
| 3214 | 0x73a4, 0x73b2, 0x73a4, 0x73b2, 0x1078, 0x1328, 0x6824, 0xd0e4, | ||
| 3215 | 0x0040, 0x73ad, 0xd0cc, 0x0040, 0x73b0, 0xa00e, 0x0078, 0x73b2, | ||
| 3216 | 0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0078, 0x7403, | ||
| 3217 | 0x1078, 0x740d, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, | ||
| 3218 | 0x6a00, 0xa286, 0x0002, 0x00c0, 0x73c6, 0xa00e, 0x0078, 0x7403, | ||
| 3219 | 0x1078, 0x740d, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, | ||
| 3220 | 0x0078, 0x7403, 0x1078, 0x740d, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 3221 | 0x2009, 0x4000, 0xa286, 0x0005, 0x0040, 0x73e2, 0xa286, 0x0002, | ||
| 3222 | 0x00c0, 0x73e3, 0xa00e, 0x0078, 0x7403, 0x1078, 0x740d, 0x6810, | ||
| 3223 | 0x2068, 0x697c, 0x6810, 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, | ||
| 3224 | 0x22a2, 0x7928, 0xa180, 0x0000, 0x2004, 0xa08e, 0x0002, 0x0040, | ||
| 3225 | 0x7401, 0xa08e, 0x0004, 0x0040, 0x7401, 0x2009, 0x4000, 0x0078, | ||
| 3226 | 0x7403, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, 0x60c3, 0x0018, | ||
| 3227 | 0x1078, 0x6c2d, 0x027f, 0x0d7f, 0x007c, 0x037e, 0x047e, 0x057e, | ||
| 3228 | 0x067e, 0x20a1, 0x020b, 0x1078, 0x65f8, 0xa006, 0x20a3, 0x0200, | ||
| 3229 | 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, | ||
| 3230 | 0x2004, 0xa092, 0x007e, 0x0048, 0x7433, 0x0d7e, 0x2069, 0xa31a, | ||
| 3231 | 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xa434, 0x2d6c, 0x6b10, 0x6c14, | ||
| 3232 | 0x0d7f, 0x0078, 0x7439, 0x2019, 0x0000, 0x6498, 0x2029, 0x0000, | ||
| 3233 | 0x6630, 0x7828, 0xa080, 0x0007, 0x2004, 0xa086, 0x0003, 0x00c0, | ||
| 3234 | 0x7447, 0x25a2, 0x26a2, 0x23a2, 0x24a2, 0x0078, 0x744b, 0x23a2, | ||
| 3235 | 0x24a2, 0x25a2, 0x26a2, 0x067f, 0x057f, 0x047f, 0x037f, 0x007c, | ||
| 3236 | 0x20a1, 0x020b, 0x1078, 0x65f8, 0x20a3, 0x0100, 0x20a3, 0x0000, | ||
| 3237 | 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6c2d, | ||
| 3238 | 0x007c, 0x20a1, 0x020b, 0x1078, 0x655e, 0x20a3, 0x1400, 0x20a3, | ||
| 3239 | 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c, | ||
| 3240 | 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000, | ||
| 3241 | 0x60c3, 0x0010, 0x1078, 0x6c2d, 0x007c, 0x20a1, 0x020b, 0x1078, | ||
| 3242 | 0x65ef, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810, | ||
| 3243 | 0x20a2, 0x60c3, 0x0008, 0x1078, 0x6c2d, 0x007c, 0x147e, 0x20a1, | ||
| 3244 | 0x020b, 0x1078, 0x7499, 0x60c3, 0x0000, 0x1078, 0x6c2d, 0x147f, | ||
| 3245 | 0x007c, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, | ||
| 3246 | 0x2004, 0xd0bc, 0x0040, 0x74b6, 0x0d7e, 0xa0e8, 0xa434, 0x2d6c, | ||
| 3247 | 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xa31a, | ||
| 3248 | 0x2da6, 0x8d68, 0x2da6, 0x0d7f, 0x0078, 0x74be, 0x20a3, 0x0300, | ||
| 3249 | 0x6298, 0x22a2, 0x20a3, 0x0000, 0x6230, 0x22a2, 0x20a3, 0x0819, | ||
| 3250 | 0x20a3, 0x0000, 0x1078, 0x6c1c, 0x22a2, 0x20a3, 0x0000, 0x2fa2, | ||
| 3251 | 0x7a08, 0x22a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x007c, 0x2061, | ||
| 3252 | 0xaa00, 0x2a70, 0x7060, 0x7046, 0x704b, 0xaa00, 0x007c, 0x0e7e, | ||
| 3253 | 0x127e, 0x2071, 0xa300, 0x2091, 0x8000, 0x7544, 0xa582, 0x0010, | ||
| 3254 | 0x0048, 0x7509, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0040, | ||
| 3255 | 0x74f5, 0xace0, 0x0010, 0x7054, 0xac02, 0x00c8, 0x74f1, 0x0078, | ||
| 3256 | 0x74e4, 0x2061, 0xaa00, 0x0078, 0x74e4, 0x6003, 0x0008, 0x8529, | ||
| 3257 | 0x7546, 0xaca8, 0x0010, 0x7054, 0xa502, 0x00c8, 0x7505, 0x754a, | ||
| 3258 | 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704b, 0xaa00, 0x0078, | ||
| 3259 | 0x7500, 0xa006, 0x0078, 0x7502, 0x0e7e, 0x2071, 0xa300, 0x7544, | ||
| 3260 | 0xa582, 0x0010, 0x0048, 0x753a, 0x7048, 0x2060, 0x6000, 0xa086, | ||
| 3261 | 0x0000, 0x0040, 0x7527, 0xace0, 0x0010, 0x7054, 0xac02, 0x00c8, | ||
| 3262 | 0x7523, 0x0078, 0x7516, 0x2061, 0xaa00, 0x0078, 0x7516, 0x6003, | ||
| 3263 | 0x0008, 0x8529, 0x7546, 0xaca8, 0x0010, 0x7054, 0xa502, 0x00c8, | ||
| 3264 | 0x7536, 0x754a, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x704b, 0xaa00, | ||
| 3265 | 0x0078, 0x7532, 0xa006, 0x0078, 0x7534, 0xac82, 0xaa00, 0x1048, | ||
| 3266 | 0x1328, 0x2001, 0xa315, 0x2004, 0xac02, 0x10c8, 0x1328, 0xa006, | ||
| 3267 | 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, | ||
| 3268 | 0x6003, 0x0000, 0x6022, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, | ||
| 3269 | 0x603a, 0x603e, 0x2061, 0xa300, 0x6044, 0x8000, 0x6046, 0xa086, | ||
| 3270 | 0x0001, 0x0040, 0x7564, 0x007c, 0x127e, 0x2091, 0x8000, 0x1078, | ||
| 3271 | 0x6109, 0x127f, 0x0078, 0x7563, 0x601c, 0xa084, 0x000f, 0x0079, | ||
| 3272 | 0x7571, 0x757a, 0x758b, 0x75a7, 0x75c3, 0x8f2d, 0x8f49, 0x8f65, | ||
| 3273 | 0x757a, 0x758b, 0xa186, 0x0013, 0x00c0, 0x7583, 0x1078, 0x6010, | ||
| 3274 | 0x1078, 0x6109, 0x007c, 0xa18e, 0x0047, 0x00c0, 0x758a, 0xa016, | ||
| 3275 | 0x1078, 0x15ec, 0x007c, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, | ||
| 3276 | 0x1328, 0x1079, 0x7595, 0x067f, 0x007c, 0x75a5, 0x7891, 0x7a34, | ||
| 3277 | 0x75a5, 0x7ab8, 0x75df, 0x75a5, 0x75a5, 0x7823, 0x7e6d, 0x75a5, | ||
| 3278 | 0x75a5, 0x75a5, 0x75a5, 0x75a5, 0x75a5, 0x1078, 0x1328, 0x067e, | ||
| 3279 | 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1328, 0x1079, 0x75b1, 0x067f, | ||
| 3280 | 0x007c, 0x75c1, 0x8522, 0x75c1, 0x75c1, 0x75c1, 0x75c1, 0x75c1, | ||
| 3281 | 0x75c1, 0x84c5, 0x86a8, 0x75c1, 0x8552, 0x85d8, 0x8552, 0x85d8, | ||
| 3282 | 0x75c1, 0x1078, 0x1328, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, | ||
| 3283 | 0x1328, 0x1079, 0x75cd, 0x067f, 0x007c, 0x75dd, 0x7eb4, 0x7f81, | ||
| 3284 | 0x80c6, 0x8242, 0x75dd, 0x75dd, 0x75dd, 0x7e8d, 0x846d, 0x8471, | ||
| 3285 | 0x75dd, 0x75dd, 0x75dd, 0x75dd, 0x84a1, 0x1078, 0x1328, 0xa1b6, | ||
| 3286 | 0x0015, 0x00c0, 0x75e7, 0x1078, 0x753d, 0x0078, 0x75ed, 0xa1b6, | ||
| 3287 | 0x0016, 0x10c0, 0x1328, 0x1078, 0x753d, 0x007c, 0x20a9, 0x000e, | ||
| 3288 | 0x2e98, 0x6010, 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, | ||
| 3289 | 0x9398, 0x94a0, 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, | ||
| 3290 | 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x00f0, 0x75fc, | ||
| 3291 | 0x0e7e, 0x1078, 0x8a44, 0x0040, 0x7613, 0x6010, 0x2070, 0x7007, | ||
| 3292 | 0x0000, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x753d, 0x007c, 0x0d7e, | ||
| 3293 | 0x037e, 0x7330, 0xa386, 0x0200, 0x00c0, 0x7624, 0x6018, 0x2068, | ||
| 3294 | 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0040, 0x762e, | ||
| 3295 | 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x1078, 0x753d, | ||
| 3296 | 0x037f, 0x0d7f, 0x007c, 0x017e, 0x20a9, 0x002a, 0xae80, 0x000c, | ||
| 3297 | 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, 0x53a3, 0x20a9, 0x002a, | ||
| 3298 | 0x6010, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x20a0, 0x53a3, | ||
| 3299 | 0x0e7e, 0x6010, 0x2004, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, | ||
| 3300 | 0x753d, 0x017f, 0x007c, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2c68, | ||
| 3301 | 0x017e, 0x2009, 0x0035, 0x1078, 0x8ef5, 0x017f, 0x00c0, 0x766f, | ||
| 3302 | 0x027e, 0x6228, 0x2268, 0x027f, 0x2071, 0xa88c, 0x6b1c, 0xa386, | ||
| 3303 | 0x0003, 0x0040, 0x7673, 0xa386, 0x0006, 0x0040, 0x7677, 0x1078, | ||
| 3304 | 0x753d, 0x0078, 0x7679, 0x1078, 0x767c, 0x0078, 0x7679, 0x1078, | ||
| 3305 | 0x771e, 0x0d7f, 0x0e7f, 0x007c, 0x0f7e, 0x6810, 0x2078, 0xa186, | ||
| 3306 | 0x0015, 0x0040, 0x7705, 0xa18e, 0x0016, 0x00c0, 0x771c, 0x700c, | ||
| 3307 | 0xa084, 0xff00, 0xa086, 0x1700, 0x00c0, 0x76e0, 0x8fff, 0x0040, | ||
| 3308 | 0x771a, 0x6808, 0xa086, 0xffff, 0x00c0, 0x7709, 0x784c, 0xa084, | ||
| 3309 | 0x0060, 0xa086, 0x0020, 0x00c0, 0x76a7, 0x797c, 0x7810, 0xa106, | ||
| 3310 | 0x00c0, 0x7709, 0x7980, 0x7814, 0xa106, 0x00c0, 0x7709, 0x1078, | ||
| 3311 | 0x8bf4, 0x6830, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, | ||
| 3312 | 0x027e, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x1078, 0x5a98, 0x7854, | ||
| 3313 | 0xa20a, 0x0048, 0x76bc, 0x8011, 0x7a56, 0x82ff, 0x027f, 0x00c0, | ||
| 3314 | 0x76c8, 0x0c7e, 0x2d60, 0x1078, 0x8832, 0x0c7f, 0x0078, 0x771a, | ||
| 3315 | 0x0c7e, 0x0d7e, 0x2f68, 0x6838, 0xd0fc, 0x00c0, 0x76d3, 0x1078, | ||
| 3316 | 0x4290, 0x0078, 0x76d5, 0x1078, 0x436e, 0x0d7f, 0x0c7f, 0x00c0, | ||
| 3317 | 0x7709, 0x0c7e, 0x2d60, 0x1078, 0x753d, 0x0c7f, 0x0078, 0x771a, | ||
| 3318 | 0x7008, 0xa086, 0x000b, 0x00c0, 0x76fa, 0x6018, 0x200c, 0xc1bc, | ||
| 3319 | 0x2102, 0x0c7e, 0x2d60, 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, | ||
| 3320 | 0x000b, 0x601f, 0x0002, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0c7f, | ||
| 3321 | 0x0078, 0x771a, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x7709, 0x2001, | ||
| 3322 | 0xa5a2, 0x2004, 0x683e, 0x0078, 0x771a, 0x1078, 0x7739, 0x0078, | ||
| 3323 | 0x771c, 0x8fff, 0x1040, 0x1328, 0x0c7e, 0x0d7e, 0x2d60, 0x2f68, | ||
| 3324 | 0x684b, 0x0003, 0x1078, 0x8726, 0x1078, 0x8bf4, 0x1078, 0x8c01, | ||
| 3325 | 0x0d7f, 0x0c7f, 0x1078, 0x753d, 0x0f7f, 0x007c, 0xa186, 0x0015, | ||
| 3326 | 0x00c0, 0x7728, 0x2001, 0xa5a2, 0x2004, 0x683e, 0x0078, 0x7736, | ||
| 3327 | 0xa18e, 0x0016, 0x00c0, 0x7738, 0x0c7e, 0x2d00, 0x2060, 0x1078, | ||
| 3328 | 0xa134, 0x1078, 0x5a41, 0x1078, 0x753d, 0x0c7f, 0x1078, 0x753d, | ||
| 3329 | 0x007c, 0x027e, 0x037e, 0x047e, 0x7228, 0x7c80, 0x7b7c, 0xd2f4, | ||
| 3330 | 0x0040, 0x7748, 0x2001, 0xa5a2, 0x2004, 0x683e, 0x0078, 0x77ac, | ||
| 3331 | 0x0c7e, 0x2d60, 0x1078, 0x874a, 0x0c7f, 0x6804, 0xa086, 0x0050, | ||
| 3332 | 0x00c0, 0x7760, 0x0c7e, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, | ||
| 3333 | 0x0050, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0c7f, 0x0078, 0x77ac, | ||
| 3334 | 0x6800, 0xa086, 0x000f, 0x0040, 0x7782, 0x8fff, 0x1040, 0x1328, | ||
| 3335 | 0x6824, 0xd0dc, 0x00c0, 0x7782, 0x6800, 0xa086, 0x0004, 0x00c0, | ||
| 3336 | 0x7787, 0x784c, 0xd0ac, 0x0040, 0x7787, 0x784c, 0xc0dc, 0xc0f4, | ||
| 3337 | 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, 0x2001, 0x0001, 0x682e, | ||
| 3338 | 0x0078, 0x77a6, 0x2001, 0x0007, 0x682e, 0x0078, 0x77a6, 0x784c, | ||
| 3339 | 0xd0b4, 0x00c0, 0x7794, 0xd0ac, 0x0040, 0x7782, 0x784c, 0xd0f4, | ||
| 3340 | 0x00c0, 0x7782, 0x0078, 0x7775, 0xd2ec, 0x00c0, 0x7782, 0x7024, | ||
| 3341 | 0xa306, 0x00c0, 0x779f, 0x7020, 0xa406, 0x0040, 0x7782, 0x7020, | ||
| 3342 | 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, 0x1078, 0x8d2b, | ||
| 3343 | 0x1078, 0x6109, 0x0078, 0x77ae, 0x1078, 0x753d, 0x047f, 0x037f, | ||
| 3344 | 0x027f, 0x007c, 0x0e7e, 0x0d7e, 0x027e, 0x6034, 0x2068, 0x6a1c, | ||
| 3345 | 0xa286, 0x0007, 0x0040, 0x7806, 0xa286, 0x0002, 0x0040, 0x7806, | ||
| 3346 | 0xa286, 0x0000, 0x0040, 0x7806, 0x6808, 0x6338, 0xa306, 0x00c0, | ||
| 3347 | 0x7806, 0x2071, 0xa88c, 0xa186, 0x0015, 0x0040, 0x7800, 0xa18e, | ||
| 3348 | 0x0016, 0x00c0, 0x77e8, 0x6030, 0xa084, 0x00ff, 0xa086, 0x0001, | ||
| 3349 | 0x00c0, 0x77e8, 0x700c, 0xa086, 0x2a00, 0x00c0, 0x77e8, 0x6034, | ||
| 3350 | 0xa080, 0x0009, 0x200c, 0xc1dd, 0xc1f5, 0x2102, 0x0078, 0x7800, | ||
| 3351 | 0x0c7e, 0x6034, 0x2060, 0x6010, 0x2068, 0x1078, 0x8a44, 0x1040, | ||
| 3352 | 0x1328, 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, | ||
| 3353 | 0x0002, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0c7f, 0x0078, 0x7806, | ||
| 3354 | 0x6034, 0x2068, 0x2001, 0xa5a2, 0x2004, 0x683e, 0x1078, 0x753d, | ||
| 3355 | 0x027f, 0x0d7f, 0x0e7f, 0x007c, 0x0d7e, 0x20a9, 0x000e, 0x2e98, | ||
| 3356 | 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x00c0, 0x7820, 0x6018, | ||
| 3357 | 0x2068, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, | ||
| 3358 | 0x0d7f, 0x0078, 0x7608, 0x2100, 0xa1b2, 0x0044, 0x10c8, 0x1328, | ||
| 3359 | 0xa1b2, 0x0040, 0x00c8, 0x7888, 0x0079, 0x782e, 0x787c, 0x7870, | ||
| 3360 | 0x787c, 0x787c, 0x787c, 0x787c, 0x786e, 0x786e, 0x786e, 0x786e, | ||
| 3361 | 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, | ||
| 3362 | 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, | ||
| 3363 | 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x787c, 0x786e, 0x787c, | ||
| 3364 | 0x787c, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x787c, 0x786e, | ||
| 3365 | 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, | ||
| 3366 | 0x787c, 0x787c, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, 0x786e, | ||
| 3367 | 0x786e, 0x786e, 0x786e, 0x787c, 0x786e, 0x786e, 0x1078, 0x1328, | ||
| 3368 | 0x6003, 0x0001, 0x6106, 0x1078, 0x5c45, 0x127e, 0x2091, 0x8000, | ||
| 3369 | 0x1078, 0x6109, 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, | ||
| 3370 | 0x5c45, 0x127e, 0x2091, 0x8000, 0x1078, 0x6109, 0x127f, 0x007c, | ||
| 3371 | 0x2600, 0x0079, 0x788b, 0x788f, 0x788f, 0x788f, 0x787c, 0x1078, | ||
| 3372 | 0x1328, 0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1328, 0xa1b6, 0x0013, | ||
| 3373 | 0x00c0, 0x78a1, 0xa0b2, 0x0040, 0x00c8, 0x79fb, 0x2008, 0x0079, | ||
| 3374 | 0x7941, 0xa1b6, 0x0027, 0x00c0, 0x78fe, 0x1078, 0x6010, 0x6004, | ||
| 3375 | 0x1078, 0x8c27, 0x0040, 0x78be, 0x1078, 0x8c3b, 0x0040, 0x78f6, | ||
| 3376 | 0xa08e, 0x0021, 0x0040, 0x78fa, 0xa08e, 0x0022, 0x0040, 0x78f6, | ||
| 3377 | 0xa08e, 0x003d, 0x0040, 0x78fa, 0x0078, 0x78f1, 0x1078, 0x2839, | ||
| 3378 | 0x2001, 0x0007, 0x1078, 0x443f, 0x6018, 0xa080, 0x0028, 0x200c, | ||
| 3379 | 0x1078, 0x7a05, 0xa186, 0x007e, 0x00c0, 0x78d3, 0x2001, 0xa332, | ||
| 3380 | 0x2014, 0xc285, 0x2202, 0x017e, 0x027e, 0x037e, 0x2110, 0x2019, | ||
| 3381 | 0x0028, 0x1078, 0x5d53, 0x077e, 0x2039, 0x0000, 0x1078, 0x5c78, | ||
| 3382 | 0x0c7e, 0x6018, 0xa065, 0x0040, 0x78e7, 0x1078, 0x471b, 0x0c7f, | ||
| 3383 | 0x2c08, 0x1078, 0x9c38, 0x077f, 0x037f, 0x027f, 0x017f, 0x1078, | ||
| 3384 | 0x44bc, 0x1078, 0x753d, 0x1078, 0x6109, 0x007c, 0x1078, 0x7a05, | ||
| 3385 | 0x0078, 0x78f1, 0x1078, 0x7a28, 0x0078, 0x78f1, 0xa186, 0x0014, | ||
| 3386 | 0x00c0, 0x78f5, 0x1078, 0x6010, 0x1078, 0x2813, 0x1078, 0x8c27, | ||
| 3387 | 0x00c0, 0x791d, 0x1078, 0x2839, 0x6018, 0xa080, 0x0028, 0x200c, | ||
| 3388 | 0x1078, 0x7a05, 0xa186, 0x007e, 0x00c0, 0x791b, 0x2001, 0xa332, | ||
| 3389 | 0x200c, 0xc185, 0x2102, 0x0078, 0x78f1, 0x1078, 0x8c3b, 0x00c0, | ||
| 3390 | 0x7925, 0x1078, 0x7a05, 0x0078, 0x78f1, 0x6004, 0xa08e, 0x0032, | ||
| 3391 | 0x00c0, 0x7936, 0x0e7e, 0x0f7e, 0x2071, 0xa381, 0x2079, 0x0000, | ||
| 3392 | 0x1078, 0x2b56, 0x0f7f, 0x0e7f, 0x0078, 0x78f1, 0x6004, 0xa08e, | ||
| 3393 | 0x0021, 0x0040, 0x7921, 0xa08e, 0x0022, 0x1040, 0x7a05, 0x0078, | ||
| 3394 | 0x78f1, 0x7983, 0x7985, 0x7989, 0x798d, 0x7991, 0x7995, 0x7981, | ||
| 3395 | 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, | ||
| 3396 | 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, | ||
| 3397 | 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, 0x7999, | ||
| 3398 | 0x79ab, 0x7981, 0x79ad, 0x79ab, 0x7981, 0x7981, 0x7981, 0x7981, | ||
| 3399 | 0x7981, 0x79ab, 0x79ab, 0x7981, 0x7981, 0x7981, 0x7981, 0x7981, | ||
| 3400 | 0x7981, 0x7981, 0x7981, 0x79de, 0x79ab, 0x7981, 0x79a5, 0x7981, | ||
| 3401 | 0x7981, 0x7981, 0x79a7, 0x7981, 0x7981, 0x7981, 0x79ab, 0x7981, | ||
| 3402 | 0x7981, 0x1078, 0x1328, 0x0078, 0x79ab, 0x2001, 0x000b, 0x0078, | ||
| 3403 | 0x79b8, 0x2001, 0x0003, 0x0078, 0x79b8, 0x2001, 0x0005, 0x0078, | ||
| 3404 | 0x79b8, 0x2001, 0x0001, 0x0078, 0x79b8, 0x2001, 0x0009, 0x0078, | ||
| 3405 | 0x79b8, 0x1078, 0x6010, 0x6003, 0x0005, 0x2001, 0xa5a2, 0x2004, | ||
| 3406 | 0x603e, 0x1078, 0x6109, 0x0078, 0x79b7, 0x0078, 0x79ab, 0x0078, | ||
| 3407 | 0x79ab, 0x1078, 0x443f, 0x0078, 0x79f0, 0x1078, 0x6010, 0x6003, | ||
| 3408 | 0x0004, 0x2001, 0xa5a0, 0x2004, 0x6016, 0x1078, 0x6109, 0x007c, | ||
| 3409 | 0x1078, 0x443f, 0x1078, 0x6010, 0x2001, 0xa5a2, 0x2004, 0x603e, | ||
| 3410 | 0x6003, 0x0002, 0x037e, 0x2019, 0xa35c, 0x2304, 0xa084, 0xff00, | ||
| 3411 | 0x00c0, 0x79cf, 0x2019, 0xa5a0, 0x231c, 0x0078, 0x79d8, 0x8007, | ||
| 3412 | 0xa09a, 0x0004, 0x0048, 0x79ca, 0x8003, 0x801b, 0x831b, 0xa318, | ||
| 3413 | 0x6316, 0x037f, 0x1078, 0x6109, 0x0078, 0x79b7, 0x0e7e, 0x0f7e, | ||
| 3414 | 0x2071, 0xa381, 0x2079, 0x0000, 0x1078, 0x2b56, 0x0f7f, 0x0e7f, | ||
| 3415 | 0x1078, 0x6010, 0x1078, 0x753d, 0x1078, 0x6109, 0x0078, 0x79b7, | ||
| 3416 | 0x1078, 0x6010, 0x6003, 0x0002, 0x2001, 0xa5a0, 0x2004, 0x6016, | ||
| 3417 | 0x1078, 0x6109, 0x007c, 0x2600, 0x2008, 0x0079, 0x79ff, 0x7a03, | ||
| 3418 | 0x7a03, 0x7a03, 0x79f0, 0x1078, 0x1328, 0x0e7e, 0x1078, 0x8a44, | ||
| 3419 | 0x0040, 0x7a21, 0x6010, 0x2070, 0x7038, 0xd0fc, 0x0040, 0x7a21, | ||
| 3420 | 0x7007, 0x0000, 0x017e, 0x6004, 0xa08e, 0x0021, 0x0040, 0x7a23, | ||
| 3421 | 0xa08e, 0x003d, 0x0040, 0x7a23, 0x017f, 0x7037, 0x0103, 0x7033, | ||
| 3422 | 0x0100, 0x0e7f, 0x007c, 0x017f, 0x1078, 0x7a28, 0x0078, 0x7a21, | ||
| 3423 | 0x0e7e, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, | ||
| 3424 | 0x7023, 0x8001, 0x0e7f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, | ||
| 3425 | 0xa084, 0x00ff, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1328, 0x6604, | ||
| 3426 | 0xa6b6, 0x0043, 0x00c0, 0x7a48, 0x1078, 0x8e6d, 0x0078, 0x7aa7, | ||
| 3427 | 0x6604, 0xa6b6, 0x0033, 0x00c0, 0x7a51, 0x1078, 0x8e11, 0x0078, | ||
| 3428 | 0x7aa7, 0x6604, 0xa6b6, 0x0028, 0x00c0, 0x7a5a, 0x1078, 0x8c6a, | ||
| 3429 | 0x0078, 0x7aa7, 0x6604, 0xa6b6, 0x0029, 0x00c0, 0x7a63, 0x1078, | ||
| 3430 | 0x8c84, 0x0078, 0x7aa7, 0x6604, 0xa6b6, 0x001f, 0x00c0, 0x7a6c, | ||
| 3431 | 0x1078, 0x75ee, 0x0078, 0x7aa7, 0x6604, 0xa6b6, 0x0000, 0x00c0, | ||
| 3432 | 0x7a75, 0x1078, 0x780c, 0x0078, 0x7aa7, 0x6604, 0xa6b6, 0x0022, | ||
| 3433 | 0x00c0, 0x7a7e, 0x1078, 0x7617, 0x0078, 0x7aa7, 0x6604, 0xa6b6, | ||
| 3434 | 0x0035, 0x00c0, 0x7a87, 0x1078, 0x7653, 0x0078, 0x7aa7, 0x6604, | ||
| 3435 | 0xa6b6, 0x0039, 0x00c0, 0x7a90, 0x1078, 0x77b2, 0x0078, 0x7aa7, | ||
| 3436 | 0x6604, 0xa6b6, 0x003d, 0x00c0, 0x7a99, 0x1078, 0x7633, 0x0078, | ||
| 3437 | 0x7aa7, 0xa1b6, 0x0015, 0x00c0, 0x7aa1, 0x1079, 0x7aac, 0x0078, | ||
| 3438 | 0x7aa7, 0xa1b6, 0x0016, 0x00c0, 0x7aa8, 0x1079, 0x7bfd, 0x007c, | ||
| 3439 | 0x1078, 0x7583, 0x0078, 0x7aa7, 0x7ad0, 0x7ad3, 0x7ad0, 0x7b1e, | ||
| 3440 | 0x7ad0, 0x7b91, 0x7c09, 0x7ad0, 0x7ad0, 0x7bd5, 0x7ad0, 0x7beb, | ||
| 3441 | 0xa1b6, 0x0048, 0x0040, 0x7ac4, 0x20e1, 0x0005, 0x3d18, 0x3e20, | ||
| 3442 | 0x2c10, 0x1078, 0x15ec, 0x007c, 0x0e7e, 0xacf0, 0x0004, 0x2e74, | ||
| 3443 | 0x7000, 0x2070, 0x7037, 0x0103, 0x0e7f, 0x1078, 0x753d, 0x007c, | ||
| 3444 | 0x0005, 0x0005, 0x007c, 0x0e7e, 0x2071, 0xa300, 0x707c, 0xa086, | ||
| 3445 | 0x0074, 0x00c0, 0x7b07, 0x1078, 0x9c0c, 0x00c0, 0x7af9, 0x0d7e, | ||
| 3446 | 0x6018, 0x2068, 0x7030, 0xd08c, 0x0040, 0x7aec, 0x6800, 0xd0bc, | ||
| 3447 | 0x0040, 0x7aec, 0xc0c5, 0x6802, 0x1078, 0x7b0b, 0x0d7f, 0x2001, | ||
| 3448 | 0x0006, 0x1078, 0x443f, 0x1078, 0x2839, 0x1078, 0x753d, 0x0078, | ||
| 3449 | 0x7b09, 0x2001, 0x000a, 0x1078, 0x443f, 0x1078, 0x2839, 0x6003, | ||
| 3450 | 0x0001, 0x6007, 0x0001, 0x1078, 0x5c45, 0x0078, 0x7b09, 0x1078, | ||
| 3451 | 0x7b81, 0x0e7f, 0x007c, 0x6800, 0xd084, 0x0040, 0x7b1d, 0x2001, | ||
| 3452 | 0x0000, 0x1078, 0x442b, 0x2069, 0xa351, 0x6804, 0xd0a4, 0x0040, | ||
| 3453 | 0x7b1d, 0x2001, 0x0006, 0x1078, 0x4472, 0x007c, 0x0d7e, 0x2011, | ||
| 3454 | 0xa31f, 0x2204, 0xa086, 0x0074, 0x00c0, 0x7b7d, 0x6018, 0x2068, | ||
| 3455 | 0x6aa0, 0xa286, 0x007e, 0x00c0, 0x7b31, 0x1078, 0x7d17, 0x0078, | ||
| 3456 | 0x7b7f, 0x1078, 0x7d0d, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, | ||
| 3457 | 0xa286, 0x0080, 0x00c0, 0x7b55, 0x6813, 0x00ff, 0x6817, 0xfffc, | ||
| 3458 | 0x6010, 0xa005, 0x0040, 0x7b4b, 0x2068, 0x6807, 0x0000, 0x6837, | ||
| 3459 | 0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x1078, 0x443f, 0x1078, | ||
| 3460 | 0x2839, 0x1078, 0x753d, 0x0078, 0x7b7f, 0x0e7e, 0x2071, 0xa332, | ||
| 3461 | 0x2e04, 0xd09c, 0x0040, 0x7b70, 0x2071, 0xa880, 0x7108, 0x720c, | ||
| 3462 | 0xa18c, 0x00ff, 0x00c0, 0x7b68, 0xa284, 0xff00, 0x0040, 0x7b70, | ||
| 3463 | 0x6018, 0x2070, 0x70a0, 0xd0bc, 0x00c0, 0x7b70, 0x7112, 0x7216, | ||
| 3464 | 0x0e7f, 0x2001, 0x0004, 0x1078, 0x443f, 0x6003, 0x0001, 0x6007, | ||
| 3465 | 0x0003, 0x1078, 0x5c45, 0x0078, 0x7b7f, 0x1078, 0x7b81, 0x0d7f, | ||
| 3466 | 0x007c, 0x2001, 0xa300, 0x2004, 0xa086, 0x0003, 0x0040, 0x7b8c, | ||
| 3467 | 0x2001, 0x0007, 0x1078, 0x443f, 0x1078, 0x2839, 0x1078, 0x753d, | ||
| 3468 | 0x007c, 0x0e7e, 0x2071, 0xa300, 0x707c, 0xa086, 0x0014, 0x00c0, | ||
| 3469 | 0x7bcf, 0x7000, 0xa086, 0x0003, 0x00c0, 0x7ba4, 0x6010, 0xa005, | ||
| 3470 | 0x00c0, 0x7ba4, 0x1078, 0x35f7, 0x0d7e, 0x6018, 0x2068, 0x1078, | ||
| 3471 | 0x457d, 0x1078, 0x7b0b, 0x0d7f, 0x1078, 0x7dba, 0x00c0, 0x7bcf, | ||
| 3472 | 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, 0xa005, 0x0040, 0x7bcf, | ||
| 3473 | 0x2001, 0x0006, 0x1078, 0x443f, 0x0e7e, 0x6010, 0xa005, 0x0040, | ||
| 3474 | 0x7bc8, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, 0x7033, 0x0200, | ||
| 3475 | 0x0e7f, 0x1078, 0x2839, 0x1078, 0x753d, 0x0078, 0x7bd3, 0x1078, | ||
| 3476 | 0x7a05, 0x1078, 0x7b81, 0x0e7f, 0x007c, 0x2011, 0xa31f, 0x2204, | ||
| 3477 | 0xa086, 0x0014, 0x00c0, 0x7be8, 0x2001, 0x0002, 0x1078, 0x443f, | ||
| 3478 | 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5c45, 0x0078, 0x7bea, | ||
| 3479 | 0x1078, 0x7b81, 0x007c, 0x2011, 0xa31f, 0x2204, 0xa086, 0x0004, | ||
| 3480 | 0x00c0, 0x7bfa, 0x2001, 0x0007, 0x1078, 0x443f, 0x1078, 0x753d, | ||
| 3481 | 0x0078, 0x7bfc, 0x1078, 0x7b81, 0x007c, 0x7ad0, 0x7c11, 0x7ad0, | ||
| 3482 | 0x7c4e, 0x7ad0, 0x7cc0, 0x7c09, 0x7ad0, 0x7ad0, 0x7cd5, 0x7ad0, | ||
| 3483 | 0x7ce8, 0x6604, 0xa6b6, 0x001e, 0x00c0, 0x7c10, 0x1078, 0x753d, | ||
| 3484 | 0x007c, 0x0d7e, 0x0c7e, 0x1078, 0x7cfb, 0x00c0, 0x7c27, 0x2001, | ||
| 3485 | 0x0000, 0x1078, 0x442b, 0x2001, 0x0002, 0x1078, 0x443f, 0x6003, | ||
| 3486 | 0x0001, 0x6007, 0x0002, 0x1078, 0x5c45, 0x0078, 0x7c4b, 0x2009, | ||
| 3487 | 0xa88e, 0x2104, 0xa086, 0x0009, 0x00c0, 0x7c3c, 0x6018, 0x2068, | ||
| 3488 | 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x7c49, 0x8001, 0x6842, | ||
| 3489 | 0x6017, 0x000a, 0x0078, 0x7c4b, 0x2009, 0xa88f, 0x2104, 0xa084, | ||
| 3490 | 0xff00, 0xa086, 0x1900, 0x00c0, 0x7c49, 0x1078, 0x753d, 0x0078, | ||
| 3491 | 0x7c4b, 0x1078, 0x7b81, 0x0c7f, 0x0d7f, 0x007c, 0x1078, 0x7d0a, | ||
| 3492 | 0x00c0, 0x7c62, 0x2001, 0x0000, 0x1078, 0x442b, 0x2001, 0x0002, | ||
| 3493 | 0x1078, 0x443f, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, 0x5c45, | ||
| 3494 | 0x0078, 0x7c8e, 0x1078, 0x7a05, 0x2009, 0xa88e, 0x2134, 0xa6b4, | ||
| 3495 | 0x00ff, 0xa686, 0x0005, 0x0040, 0x7c8f, 0xa686, 0x000b, 0x0040, | ||
| 3496 | 0x7c8c, 0x2009, 0xa88f, 0x2104, 0xa084, 0xff00, 0x00c0, 0x7c7c, | ||
| 3497 | 0xa686, 0x0009, 0x0040, 0x7c8f, 0xa086, 0x1900, 0x00c0, 0x7c8c, | ||
| 3498 | 0xa686, 0x0009, 0x0040, 0x7c8f, 0x2001, 0x0004, 0x1078, 0x443f, | ||
| 3499 | 0x1078, 0x753d, 0x0078, 0x7c8e, 0x1078, 0x7b81, 0x007c, 0x0d7e, | ||
| 3500 | 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x7c9d, 0x6838, 0xd0fc, | ||
| 3501 | 0x0040, 0x7c9d, 0x0d7f, 0x0078, 0x7c8c, 0x6018, 0x2068, 0x6840, | ||
| 3502 | 0xa084, 0x00ff, 0xa005, 0x0040, 0x7cae, 0x8001, 0x6842, 0x6017, | ||
| 3503 | 0x000a, 0x6007, 0x0016, 0x0d7f, 0x0078, 0x7c8e, 0x68a0, 0xa086, | ||
| 3504 | 0x007e, 0x00c0, 0x7cbb, 0x0e7e, 0x2071, 0xa300, 0x1078, 0x41f5, | ||
| 3505 | 0x0e7f, 0x0078, 0x7cbd, 0x1078, 0x2813, 0x0d7f, 0x0078, 0x7c8c, | ||
| 3506 | 0x1078, 0x7d0a, 0x00c0, 0x7cd0, 0x2001, 0x0004, 0x1078, 0x443f, | ||
| 3507 | 0x6003, 0x0001, 0x6007, 0x0003, 0x1078, 0x5c45, 0x0078, 0x7cd4, | ||
| 3508 | 0x1078, 0x7a05, 0x1078, 0x7b81, 0x007c, 0x1078, 0x7d0a, 0x00c0, | ||
| 3509 | 0x7ce5, 0x2001, 0x0008, 0x1078, 0x443f, 0x6003, 0x0001, 0x6007, | ||
| 3510 | 0x0005, 0x1078, 0x5c45, 0x0078, 0x7ce7, 0x1078, 0x7b81, 0x007c, | ||
| 3511 | 0x1078, 0x7d0a, 0x00c0, 0x7cf8, 0x2001, 0x000a, 0x1078, 0x443f, | ||
| 3512 | 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, 0x5c45, 0x0078, 0x7cfa, | ||
| 3513 | 0x1078, 0x7b81, 0x007c, 0x2009, 0xa88e, 0x2104, 0xa086, 0x0003, | ||
| 3514 | 0x00c0, 0x7d09, 0x2009, 0xa88f, 0x2104, 0xa084, 0xff00, 0xa086, | ||
| 3515 | 0x2a00, 0x007c, 0xa085, 0x0001, 0x007c, 0x0c7e, 0x017e, 0xac88, | ||
| 3516 | 0x0006, 0x2164, 0x1078, 0x4513, 0x017f, 0x0c7f, 0x007c, 0x0f7e, | ||
| 3517 | 0x0e7e, 0x0d7e, 0x037e, 0x017e, 0x6018, 0x2068, 0x2071, 0xa332, | ||
| 3518 | 0x2e04, 0xa085, 0x0003, 0x2072, 0x1078, 0x7d8b, 0x0040, 0x7d50, | ||
| 3519 | 0x2001, 0xa352, 0x2004, 0xd0a4, 0x0040, 0x7d39, 0xa006, 0x2020, | ||
| 3520 | 0x2009, 0x002a, 0x1078, 0x9ec0, 0x2001, 0xa30c, 0x200c, 0xc195, | ||
| 3521 | 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x1078, 0x27e2, 0x2071, | ||
| 3522 | 0xa300, 0x1078, 0x260d, 0x0c7e, 0x157e, 0x20a9, 0x0081, 0x2009, | ||
| 3523 | 0x007f, 0x1078, 0x2921, 0x8108, 0x00f0, 0x7d49, 0x157f, 0x0c7f, | ||
| 3524 | 0x1078, 0x7d0d, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xa880, | ||
| 3525 | 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xa31a, 0x206a, | ||
| 3526 | 0x78e6, 0x007e, 0x8e70, 0x2e04, 0x2069, 0xa31b, 0x206a, 0x78ea, | ||
| 3527 | 0xa084, 0xff00, 0x017f, 0xa105, 0x2009, 0xa325, 0x200a, 0x2069, | ||
| 3528 | 0xa88e, 0x2071, 0xa59c, 0x6810, 0x2072, 0x6814, 0x7006, 0x6818, | ||
| 3529 | 0x700a, 0x681c, 0x700e, 0x1078, 0x8da9, 0x2001, 0x0006, 0x1078, | ||
| 3530 | 0x443f, 0x1078, 0x2839, 0x1078, 0x753d, 0x017f, 0x037f, 0x0d7f, | ||
| 3531 | 0x0e7f, 0x0f7f, 0x007c, 0x027e, 0x037e, 0x0e7e, 0x157e, 0x2019, | ||
| 3532 | 0xa325, 0x231c, 0x83ff, 0x0040, 0x7db5, 0x2071, 0xa880, 0x2e14, | ||
| 3533 | 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306, 0x00c0, | ||
| 3534 | 0x7db5, 0x2011, 0xa896, 0xad98, 0x000a, 0x20a9, 0x0004, 0x1078, | ||
| 3535 | 0x7e55, 0x00c0, 0x7db5, 0x2011, 0xa89a, 0xad98, 0x0006, 0x20a9, | ||
| 3536 | 0x0004, 0x1078, 0x7e55, 0x00c0, 0x7db5, 0x157f, 0x0e7f, 0x037f, | ||
| 3537 | 0x027f, 0x007c, 0x0e7e, 0x2071, 0xa88c, 0x7004, 0xa086, 0x0014, | ||
| 3538 | 0x00c0, 0x7ddd, 0x7008, 0xa086, 0x0800, 0x00c0, 0x7ddd, 0x700c, | ||
| 3539 | 0xd0ec, 0x0040, 0x7ddb, 0xa084, 0x0f00, 0xa086, 0x0100, 0x00c0, | ||
| 3540 | 0x7ddb, 0x7024, 0xd0a4, 0x00c0, 0x7dd8, 0xd0ac, 0x0040, 0x7ddb, | ||
| 3541 | 0xa006, 0x0078, 0x7ddd, 0xa085, 0x0001, 0x0e7f, 0x007c, 0x0e7e, | ||
| 3542 | 0x0d7e, 0x0c7e, 0x077e, 0x057e, 0x047e, 0x027e, 0x007e, 0x127e, | ||
| 3543 | 0x2091, 0x8000, 0x2029, 0xa5b4, 0x252c, 0x2021, 0xa5ba, 0x2424, | ||
| 3544 | 0x2061, 0xaa00, 0x2071, 0xa300, 0x7244, 0x7060, 0xa202, 0x00c8, | ||
| 3545 | 0x7e43, 0x1078, 0x9ee5, 0x0040, 0x7e3b, 0x671c, 0xa786, 0x0001, | ||
| 3546 | 0x0040, 0x7e3b, 0xa786, 0x0007, 0x0040, 0x7e3b, 0x2500, 0xac06, | ||
| 3547 | 0x0040, 0x7e3b, 0x2400, 0xac06, 0x0040, 0x7e3b, 0x0c7e, 0x6000, | ||
| 3548 | 0xa086, 0x0004, 0x00c0, 0x7e16, 0x1078, 0x1749, 0xa786, 0x0008, | ||
| 3549 | 0x00c0, 0x7e25, 0x1078, 0x8c3b, 0x00c0, 0x7e25, 0x0c7f, 0x1078, | ||
| 3550 | 0x7a05, 0x1078, 0x8c01, 0x0078, 0x7e3b, 0x6010, 0x2068, 0x1078, | ||
| 3551 | 0x8a44, 0x0040, 0x7e38, 0xa786, 0x0003, 0x00c0, 0x7e4d, 0x6837, | ||
| 3552 | 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0x4982, 0x1078, 0x8bf4, | ||
| 3553 | 0x1078, 0x8c01, 0x0c7f, 0xace0, 0x0010, 0x7054, 0xac02, 0x00c8, | ||
| 3554 | 0x7e43, 0x0078, 0x7df4, 0x127f, 0x007f, 0x027f, 0x047f, 0x057f, | ||
| 3555 | 0x077f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0, | ||
| 3556 | 0x7e2f, 0x1078, 0x9e70, 0x0078, 0x7e38, 0x220c, 0x2304, 0xa106, | ||
| 3557 | 0x00c0, 0x7e60, 0x8210, 0x8318, 0x00f0, 0x7e55, 0xa006, 0x007c, | ||
| 3558 | 0x2304, 0xa102, 0x0048, 0x7e68, 0x2001, 0x0001, 0x0078, 0x7e6a, | ||
| 3559 | 0x2001, 0x0000, 0xa18d, 0x0001, 0x007c, 0x6004, 0xa08a, 0x0044, | ||
| 3560 | 0x10c8, 0x1328, 0x1078, 0x8c27, 0x0040, 0x7e7c, 0x1078, 0x8c3b, | ||
| 3561 | 0x0040, 0x7e89, 0x0078, 0x7e82, 0x1078, 0x2839, 0x1078, 0x8c3b, | ||
| 3562 | 0x0040, 0x7e89, 0x1078, 0x6010, 0x1078, 0x753d, 0x1078, 0x6109, | ||
| 3563 | 0x007c, 0x1078, 0x7a05, 0x0078, 0x7e82, 0xa182, 0x0040, 0x0079, | ||
| 3564 | 0x7e91, 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea4, | ||
| 3565 | 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea6, 0x7ea6, 0x7ea6, 0x7ea6, | ||
| 3566 | 0x7ea4, 0x7ea4, 0x7ea4, 0x7ea6, 0x1078, 0x1328, 0x600b, 0xffff, | ||
| 3567 | 0x6003, 0x0001, 0x6106, 0x1078, 0x5bf8, 0x127e, 0x2091, 0x8000, | ||
| 3568 | 0x1078, 0x6109, 0x127f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x7ebd, | ||
| 3569 | 0x6004, 0xa082, 0x0040, 0x0079, 0x7f48, 0xa186, 0x0027, 0x00c0, | ||
| 3570 | 0x7edf, 0x1078, 0x6010, 0x1078, 0x2813, 0x0d7e, 0x6110, 0x2168, | ||
| 3571 | 0x1078, 0x8a44, 0x0040, 0x7ed9, 0x6837, 0x0103, 0x684b, 0x0029, | ||
| 3572 | 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x1078, 0x4982, 0x1078, | ||
| 3573 | 0x8bf4, 0x0d7f, 0x1078, 0x753d, 0x1078, 0x6109, 0x007c, 0xa186, | ||
| 3574 | 0x0014, 0x00c0, 0x7ee8, 0x6004, 0xa082, 0x0040, 0x0079, 0x7f10, | ||
| 3575 | 0xa186, 0x0046, 0x0040, 0x7ef4, 0xa186, 0x0045, 0x0040, 0x7ef4, | ||
| 3576 | 0xa186, 0x0047, 0x10c0, 0x1328, 0x2001, 0x0109, 0x2004, 0xd084, | ||
| 3577 | 0x0040, 0x7f0d, 0x127e, 0x2091, 0x2200, 0x007e, 0x017e, 0x027e, | ||
| 3578 | 0x1078, 0x5ad2, 0x027f, 0x017f, 0x007f, 0x127f, 0x6000, 0xa086, | ||
| 3579 | 0x0002, 0x00c0, 0x7f0d, 0x0078, 0x7f81, 0x1078, 0x7583, 0x007c, | ||
| 3580 | 0x7f25, 0x7f23, 0x7f23, 0x7f23, 0x7f23, 0x7f23, 0x7f23, 0x7f23, | ||
| 3581 | 0x7f23, 0x7f23, 0x7f23, 0x7f41, 0x7f41, 0x7f41, 0x7f41, 0x7f23, | ||
| 3582 | 0x7f41, 0x7f23, 0x7f41, 0x1078, 0x1328, 0x1078, 0x6010, 0x0d7e, | ||
| 3583 | 0x6110, 0x2168, 0x1078, 0x8a44, 0x0040, 0x7f3b, 0x6837, 0x0103, | ||
| 3584 | 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x1078, | ||
| 3585 | 0x4982, 0x1078, 0x8bf4, 0x0d7f, 0x1078, 0x753d, 0x1078, 0x6109, | ||
| 3586 | 0x007c, 0x1078, 0x6010, 0x1078, 0x753d, 0x1078, 0x6109, 0x007c, | ||
| 3587 | 0x7f5d, 0x7f5b, 0x7f5b, 0x7f5b, 0x7f5b, 0x7f5b, 0x7f5b, 0x7f5b, | ||
| 3588 | 0x7f5b, 0x7f5b, 0x7f5b, 0x7f6f, 0x7f6f, 0x7f6f, 0x7f6f, 0x7f5b, | ||
| 3589 | 0x7f7a, 0x7f5b, 0x7f6f, 0x1078, 0x1328, 0x1078, 0x6010, 0x2001, | ||
| 3590 | 0xa5a2, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x6109, 0x6010, | ||
| 3591 | 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x007c, 0x1078, | ||
| 3592 | 0x6010, 0x2001, 0xa5a2, 0x2004, 0x603e, 0x6003, 0x000f, 0x1078, | ||
| 3593 | 0x6109, 0x007c, 0x1078, 0x6010, 0x1078, 0x753d, 0x1078, 0x6109, | ||
| 3594 | 0x007c, 0xa182, 0x0040, 0x0079, 0x7f85, 0x7f98, 0x7f98, 0x7f98, | ||
| 3595 | 0x7f98, 0x7f98, 0x7f9a, 0x8095, 0x80b7, 0x7f98, 0x7f98, 0x7f98, | ||
| 3596 | 0x7f98, 0x7f98, 0x7f98, 0x7f98, 0x7f98, 0x7f98, 0x7f98, 0x7f98, | ||
| 3597 | 0x1078, 0x1328, 0x0e7e, 0x0d7e, 0x603f, 0x0000, 0x2071, 0xa880, | ||
| 3598 | 0x7124, 0x610a, 0x2071, 0xa88c, 0x6110, 0x2168, 0x7614, 0xa6b4, | ||
| 3599 | 0x0fff, 0x86ff, 0x0040, 0x8058, 0xa68c, 0x0c00, 0x0040, 0x7fd1, | ||
| 3600 | 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, 0x0040, 0x7fcd, 0x684c, | ||
| 3601 | 0xd0ac, 0x0040, 0x7fcd, 0x6024, 0xd0dc, 0x00c0, 0x7fcd, 0x6850, | ||
| 3602 | 0xd0bc, 0x00c0, 0x7fcd, 0x7318, 0x6814, 0xa306, 0x00c0, 0x806f, | ||
| 3603 | 0x731c, 0x6810, 0xa306, 0x00c0, 0x806f, 0x7318, 0x6b62, 0x731c, | ||
| 3604 | 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x8004, 0xa186, | ||
| 3605 | 0x0028, 0x00c0, 0x7fe1, 0x1078, 0x8c15, 0x684b, 0x001c, 0x0078, | ||
| 3606 | 0x8006, 0xd6dc, 0x0040, 0x7ffd, 0x684b, 0x0015, 0x684c, 0xd0ac, | ||
| 3607 | 0x0040, 0x7ffb, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, 0x7ffb, | ||
| 3608 | 0x7018, 0xa106, 0x00c0, 0x7ff8, 0x701c, 0xa206, 0x0040, 0x7ffb, | ||
| 3609 | 0x6962, 0x6a5e, 0xc6dc, 0x0078, 0x8006, 0xd6d4, 0x0040, 0x8004, | ||
| 3610 | 0x684b, 0x0007, 0x0078, 0x8006, 0x684b, 0x0000, 0x6837, 0x0103, | ||
| 3611 | 0x6e46, 0xa01e, 0xd6c4, 0x0040, 0x802f, 0xa686, 0x0100, 0x00c0, | ||
| 3612 | 0x801a, 0x2001, 0xa899, 0x2004, 0xa005, 0x00c0, 0x801a, 0xc6c4, | ||
| 3613 | 0x0078, 0x7fa9, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0040, 0x802f, | ||
| 3614 | 0xa38a, 0x0009, 0x0048, 0x8026, 0x2019, 0x0008, 0x037e, 0x2308, | ||
| 3615 | 0x2019, 0xa898, 0xad90, 0x0019, 0x1078, 0x8739, 0x037f, 0xd6cc, | ||
| 3616 | 0x0040, 0x8085, 0x7124, 0x695a, 0x81ff, 0x0040, 0x8085, 0xa192, | ||
| 3617 | 0x0021, 0x00c8, 0x8046, 0x2071, 0xa898, 0x831c, 0x2300, 0xae18, | ||
| 3618 | 0xad90, 0x001d, 0x1078, 0x8739, 0x0078, 0x8085, 0x6838, 0xd0fc, | ||
| 3619 | 0x0040, 0x804f, 0x2009, 0x0020, 0x695a, 0x0078, 0x803b, 0x0f7e, | ||
| 3620 | 0x2d78, 0x1078, 0x86d1, 0x0f7f, 0x1078, 0x8726, 0x0078, 0x8087, | ||
| 3621 | 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, 0x0040, 0x8075, 0x684c, | ||
| 3622 | 0xd0ac, 0x0040, 0x8075, 0x6024, 0xd0dc, 0x00c0, 0x8075, 0x6850, | ||
| 3623 | 0xd0bc, 0x00c0, 0x8075, 0x684c, 0xd0f4, 0x00c0, 0x8075, 0x1078, | ||
| 3624 | 0x8cfa, 0x0d7f, 0x0e7f, 0x0078, 0x8094, 0x684b, 0x0000, 0x6837, | ||
| 3625 | 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0040, 0x8085, 0x6810, 0x6914, | ||
| 3626 | 0xa115, 0x0040, 0x8085, 0x1078, 0x8233, 0x1078, 0x4982, 0x6218, | ||
| 3627 | 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x1078, 0x8cc4, 0x0d7f, 0x0e7f, | ||
| 3628 | 0x00c0, 0x8094, 0x1078, 0x753d, 0x007c, 0x0f7e, 0x6003, 0x0003, | ||
| 3629 | 0x2079, 0xa88c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, | ||
| 3630 | 0x784c, 0xd0ac, 0x0040, 0x80a8, 0x6003, 0x0002, 0x0f7f, 0x007c, | ||
| 3631 | 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x0f7f, 0x603f, 0x0000, 0x2c10, | ||
| 3632 | 0x1078, 0x1cab, 0x1078, 0x5c64, 0x1078, 0x61d3, 0x007c, 0x2001, | ||
| 3633 | 0xa5a2, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, | ||
| 3634 | 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15ec, 0x007c, 0xa182, 0x0040, | ||
| 3635 | 0x0079, 0x80ca, 0x80dd, 0x80dd, 0x80dd, 0x80dd, 0x80dd, 0x80df, | ||
| 3636 | 0x8182, 0x80dd, 0x80dd, 0x8198, 0x8209, 0x80dd, 0x80dd, 0x80dd, | ||
| 3637 | 0x80dd, 0x8218, 0x80dd, 0x80dd, 0x80dd, 0x1078, 0x1328, 0x077e, | ||
| 3638 | 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, 0xa88c, 0x6110, 0x2178, 0x7614, | ||
| 3639 | 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, | ||
| 3640 | 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0040, 0x817d, 0xa694, 0xff00, | ||
| 3641 | 0xa284, 0x0c00, 0x0040, 0x8100, 0x7018, 0x7862, 0x701c, 0x785e, | ||
| 3642 | 0xa284, 0x0300, 0x0040, 0x817d, 0x1078, 0x1381, 0x1040, 0x1328, | ||
| 3643 | 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, | ||
| 3644 | 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, | ||
| 3645 | 0x0040, 0x811e, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, | ||
| 3646 | 0xa186, 0x0002, 0x0040, 0x813a, 0xa186, 0x0028, 0x00c0, 0x812c, | ||
| 3647 | 0x684b, 0x001c, 0x0078, 0x813c, 0xd6dc, 0x0040, 0x8133, 0x684b, | ||
| 3648 | 0x0015, 0x0078, 0x813c, 0xd6d4, 0x0040, 0x813a, 0x684b, 0x0007, | ||
| 3649 | 0x0078, 0x813c, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, | ||
| 3650 | 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x815a, 0x7328, 0x732c, 0x6b56, | ||
| 3651 | 0x83ff, 0x0040, 0x815a, 0xa38a, 0x0009, 0x0048, 0x8151, 0x2019, | ||
| 3652 | 0x0008, 0x037e, 0x2308, 0x2019, 0xa898, 0xad90, 0x0019, 0x1078, | ||
| 3653 | 0x8739, 0x037f, 0xd6cc, 0x0040, 0x817d, 0x7124, 0x695a, 0x81ff, | ||
| 3654 | 0x0040, 0x817d, 0xa192, 0x0021, 0x00c8, 0x8171, 0x2071, 0xa898, | ||
| 3655 | 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x1078, 0x8739, 0x0078, | ||
| 3656 | 0x817d, 0x7838, 0xd0fc, 0x0040, 0x817a, 0x2009, 0x0020, 0x695a, | ||
| 3657 | 0x0078, 0x8166, 0x2d78, 0x1078, 0x86d1, 0x0d7f, 0x0e7f, 0x0f7f, | ||
| 3658 | 0x077f, 0x007c, 0x0f7e, 0x6003, 0x0003, 0x2079, 0xa88c, 0x7c04, | ||
| 3659 | 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, | ||
| 3660 | 0x7d0e, 0x0f7f, 0x2c10, 0x1078, 0x1cab, 0x1078, 0x6c26, 0x007c, | ||
| 3661 | 0x0d7e, 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, 0x0040, 0x81a4, | ||
| 3662 | 0x2001, 0xa5a2, 0x2004, 0x603e, 0x6003, 0x0002, 0x1078, 0x60b8, | ||
| 3663 | 0x1078, 0x61d3, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0040, 0x8207, | ||
| 3664 | 0xd1cc, 0x0040, 0x81de, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x81d6, | ||
| 3665 | 0x017e, 0x684c, 0x007e, 0x6850, 0x007e, 0xad90, 0x000d, 0xa198, | ||
| 3666 | 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, 0x2304, 0x2012, 0x8318, | ||
| 3667 | 0x8210, 0x00f0, 0x81c5, 0x157f, 0x007f, 0x6852, 0x007f, 0x684e, | ||
| 3668 | 0x017f, 0x2168, 0x1078, 0x13aa, 0x0078, 0x8201, 0x017e, 0x1078, | ||
| 3669 | 0x13aa, 0x0d7f, 0x1078, 0x8726, 0x0078, 0x8201, 0x6837, 0x0103, | ||
| 3670 | 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, 0x81fd, 0xa086, | ||
| 3671 | 0x0028, 0x00c0, 0x81ef, 0x684b, 0x001c, 0x0078, 0x81ff, 0xd1dc, | ||
| 3672 | 0x0040, 0x81f6, 0x684b, 0x0015, 0x0078, 0x81ff, 0xd1d4, 0x0040, | ||
| 3673 | 0x81fd, 0x684b, 0x0007, 0x0078, 0x81ff, 0x684b, 0x0000, 0x1078, | ||
| 3674 | 0x4982, 0x1078, 0x8cc4, 0x00c0, 0x8207, 0x1078, 0x753d, 0x0d7f, | ||
| 3675 | 0x007c, 0x2019, 0x0001, 0x1078, 0x6e6c, 0x6003, 0x0002, 0x2001, | ||
| 3676 | 0xa5a2, 0x2004, 0x603e, 0x1078, 0x60b8, 0x1078, 0x61d3, 0x007c, | ||
| 3677 | 0x1078, 0x60b8, 0x1078, 0x2813, 0x0d7e, 0x6110, 0x2168, 0x1078, | ||
| 3678 | 0x8a44, 0x0040, 0x822d, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, | ||
| 3679 | 0x0000, 0x1078, 0x4982, 0x1078, 0x8bf4, 0x0d7f, 0x1078, 0x753d, | ||
| 3680 | 0x1078, 0x61d3, 0x007c, 0x684b, 0x0015, 0xd1fc, 0x0040, 0x823f, | ||
| 3681 | 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, | ||
| 3682 | 0x685e, 0x007c, 0xa182, 0x0040, 0x0079, 0x8246, 0x8259, 0x8259, | ||
| 3683 | 0x8259, 0x8259, 0x8259, 0x825b, 0x8259, 0x8333, 0x833f, 0x8259, | ||
| 3684 | 0x8259, 0x8259, 0x8259, 0x8259, 0x8259, 0x8259, 0x8259, 0x8259, | ||
| 3685 | 0x8259, 0x1078, 0x1328, 0x077e, 0x0f7e, 0x0e7e, 0x0d7e, 0x2071, | ||
| 3686 | 0xa88c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x0f7e, 0x2c78, | ||
| 3687 | 0x1078, 0x4893, 0x0f7f, 0x0040, 0x827e, 0xa684, 0x00ff, 0x00c0, | ||
| 3688 | 0x827e, 0x6024, 0xd0f4, 0x00c0, 0x827a, 0x7808, 0xa086, 0x0000, | ||
| 3689 | 0x00c0, 0x827e, 0x1078, 0x8cfa, 0x0078, 0x832e, 0x7e46, 0x7f4c, | ||
| 3690 | 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, | ||
| 3691 | 0x0040, 0x8323, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0040, 0x8294, | ||
| 3692 | 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0040, 0x8320, | ||
| 3693 | 0xa686, 0x0100, 0x00c0, 0x82a6, 0x2001, 0xa899, 0x2004, 0xa005, | ||
| 3694 | 0x00c0, 0x82a6, 0xc6c4, 0x7e46, 0x0078, 0x8287, 0x1078, 0x1381, | ||
| 3695 | 0x1040, 0x1328, 0x2d00, 0x784a, 0x7f4c, 0xa7bd, 0x0200, 0x7f4e, | ||
| 3696 | 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, | ||
| 3697 | 0x6e46, 0xa68c, 0x0c00, 0x0040, 0x82c1, 0x7318, 0x6b62, 0x731c, | ||
| 3698 | 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0040, 0x82dd, 0xa186, | ||
| 3699 | 0x0028, 0x00c0, 0x82cf, 0x684b, 0x001c, 0x0078, 0x82df, 0xd6dc, | ||
| 3700 | 0x0040, 0x82d6, 0x684b, 0x0015, 0x0078, 0x82df, 0xd6d4, 0x0040, | ||
| 3701 | 0x82dd, 0x684b, 0x0007, 0x0078, 0x82df, 0x684b, 0x0000, 0x6f4e, | ||
| 3702 | 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, 0xd6c4, 0x0040, 0x82fd, | ||
| 3703 | 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0040, 0x82fd, 0xa38a, 0x0009, | ||
| 3704 | 0x0048, 0x82f4, 0x2019, 0x0008, 0x037e, 0x2308, 0x2019, 0xa898, | ||
| 3705 | 0xad90, 0x0019, 0x1078, 0x8739, 0x037f, 0xd6cc, 0x0040, 0x8320, | ||
| 3706 | 0x7124, 0x695a, 0x81ff, 0x0040, 0x8320, 0xa192, 0x0021, 0x00c8, | ||
| 3707 | 0x8314, 0x2071, 0xa898, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, | ||
| 3708 | 0x1078, 0x8739, 0x0078, 0x8320, 0x7838, 0xd0fc, 0x0040, 0x831d, | ||
| 3709 | 0x2009, 0x0020, 0x695a, 0x0078, 0x8309, 0x2d78, 0x1078, 0x86d1, | ||
| 3710 | 0xd6dc, 0x00c0, 0x8326, 0xa006, 0x0078, 0x832c, 0x2001, 0x0001, | ||
| 3711 | 0x2071, 0xa88c, 0x7218, 0x731c, 0x1078, 0x1645, 0x0d7f, 0x0e7f, | ||
| 3712 | 0x0f7f, 0x077f, 0x007c, 0x2001, 0xa5a2, 0x2004, 0x603e, 0x20e1, | ||
| 3713 | 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15ec, 0x007c, 0x2001, | ||
| 3714 | 0xa5a2, 0x2004, 0x603e, 0x0d7e, 0x6003, 0x0002, 0x6110, 0x2168, | ||
| 3715 | 0x694c, 0xd1e4, 0x0040, 0x846b, 0x603f, 0x0000, 0x0f7e, 0x2c78, | ||
| 3716 | 0x1078, 0x4893, 0x0f7f, 0x0040, 0x8385, 0x6814, 0x6910, 0xa115, | ||
| 3717 | 0x0040, 0x8385, 0x6a60, 0xa206, 0x00c0, 0x8362, 0x685c, 0xa106, | ||
| 3718 | 0x0040, 0x8385, 0x684c, 0xc0e4, 0x684e, 0x6847, 0x0000, 0x6863, | ||
| 3719 | 0x0000, 0x685f, 0x0000, 0x6024, 0xd0f4, 0x00c0, 0x837a, 0x697c, | ||
| 3720 | 0x6810, 0xa102, 0x603a, 0x6980, 0x6814, 0xa103, 0x6036, 0x6024, | ||
| 3721 | 0xc0f5, 0x6026, 0x0d7e, 0x6018, 0x2068, 0x683c, 0x8000, 0x683e, | ||
| 3722 | 0x0d7f, 0x1078, 0x8cfa, 0x0078, 0x846b, 0x694c, 0xd1cc, 0x0040, | ||
| 3723 | 0x8430, 0x6948, 0x6838, 0xd0fc, 0x0040, 0x83ea, 0x017e, 0x684c, | ||
| 3724 | 0x007e, 0x6850, 0x007e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, | ||
| 3725 | 0xa0b6, 0x0002, 0x0040, 0x83bf, 0xa086, 0x0028, 0x00c0, 0x83a6, | ||
| 3726 | 0x684b, 0x001c, 0x784b, 0x001c, 0x0078, 0x83ca, 0xd1dc, 0x0040, | ||
| 3727 | 0x83b6, 0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x8ea5, 0x0040, | ||
| 3728 | 0x83b4, 0x7944, 0xc1dc, 0x7946, 0x0078, 0x83ca, 0xd1d4, 0x0040, | ||
| 3729 | 0x83bf, 0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x83ca, 0x684c, | ||
| 3730 | 0xd0ac, 0x0040, 0x83ca, 0x6810, 0x6914, 0xa115, 0x0040, 0x83ca, | ||
| 3731 | 0x1078, 0x8233, 0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, | ||
| 3732 | 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, 0x157e, 0x21a8, | ||
| 3733 | 0x2304, 0x2012, 0x8318, 0x8210, 0x00f0, 0x83d8, 0x157f, 0x0f7f, | ||
| 3734 | 0x007f, 0x6852, 0x007f, 0x684e, 0x017f, 0x2168, 0x1078, 0x13aa, | ||
| 3735 | 0x0078, 0x8465, 0x017e, 0x0f7e, 0x2178, 0x7944, 0xa184, 0x00ff, | ||
| 3736 | 0xa0b6, 0x0002, 0x0040, 0x8417, 0xa086, 0x0028, 0x00c0, 0x83fe, | ||
| 3737 | 0x684b, 0x001c, 0x784b, 0x001c, 0x0078, 0x8422, 0xd1dc, 0x0040, | ||
| 3738 | 0x840e, 0x684b, 0x0015, 0x784b, 0x0015, 0x1078, 0x8ea5, 0x0040, | ||
| 3739 | 0x840c, 0x7944, 0xc1dc, 0x7946, 0x0078, 0x8422, 0xd1d4, 0x0040, | ||
| 3740 | 0x8417, 0x684b, 0x0007, 0x784b, 0x0007, 0x0078, 0x8422, 0x684c, | ||
| 3741 | 0xd0ac, 0x0040, 0x8422, 0x6810, 0x6914, 0xa115, 0x0040, 0x8422, | ||
| 3742 | 0x1078, 0x8233, 0x6860, 0x7862, 0x685c, 0x785e, 0x684c, 0x784e, | ||
| 3743 | 0x0f7f, 0x1078, 0x13aa, 0x0d7f, 0x1078, 0x8726, 0x0078, 0x8465, | ||
| 3744 | 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0040, | ||
| 3745 | 0x8456, 0xa086, 0x0028, 0x00c0, 0x8441, 0x684b, 0x001c, 0x0078, | ||
| 3746 | 0x8463, 0xd1dc, 0x0040, 0x844f, 0x684b, 0x0015, 0x1078, 0x8ea5, | ||
| 3747 | 0x0040, 0x844d, 0x6944, 0xc1dc, 0x6946, 0x0078, 0x8463, 0xd1d4, | ||
| 3748 | 0x0040, 0x8456, 0x684b, 0x0007, 0x0078, 0x8463, 0x684b, 0x0000, | ||
| 3749 | 0x684c, 0xd0ac, 0x0040, 0x8463, 0x6810, 0x6914, 0xa115, 0x0040, | ||
| 3750 | 0x8463, 0x1078, 0x8233, 0x1078, 0x4982, 0x1078, 0x8cc4, 0x00c0, | ||
| 3751 | 0x846b, 0x1078, 0x753d, 0x0d7f, 0x007c, 0x1078, 0x6010, 0x0078, | ||
| 3752 | 0x8473, 0x1078, 0x60b8, 0x1078, 0x8a44, 0x0040, 0x8492, 0x0d7e, | ||
| 3753 | 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xa30c, 0x210c, 0xd18c, | ||
| 3754 | 0x00c0, 0x849d, 0xd184, 0x00c0, 0x8499, 0x6108, 0x694a, 0xa18e, | ||
| 3755 | 0x0029, 0x00c0, 0x848d, 0x1078, 0xa181, 0x6847, 0x0000, 0x1078, | ||
| 3756 | 0x4982, 0x0d7f, 0x1078, 0x753d, 0x1078, 0x6109, 0x1078, 0x61d3, | ||
| 3757 | 0x007c, 0x684b, 0x0004, 0x0078, 0x848d, 0x684b, 0x0004, 0x0078, | ||
| 3758 | 0x848d, 0xa182, 0x0040, 0x0079, 0x84a5, 0x84b8, 0x84b8, 0x84b8, | ||
| 3759 | 0x84b8, 0x84b8, 0x84ba, 0x84b8, 0x84bd, 0x84b8, 0x84b8, 0x84b8, | ||
| 3760 | 0x84b8, 0x84b8, 0x84b8, 0x84b8, 0x84b8, 0x84b8, 0x84b8, 0x84b8, | ||
| 3761 | 0x1078, 0x1328, 0x1078, 0x753d, 0x007c, 0x007e, 0x027e, 0xa016, | ||
| 3762 | 0x1078, 0x15ec, 0x027f, 0x007f, 0x007c, 0xa182, 0x0085, 0x0079, | ||
| 3763 | 0x84c9, 0x84d2, 0x84d0, 0x84d0, 0x84de, 0x84d0, 0x84d0, 0x84d0, | ||
| 3764 | 0x1078, 0x1328, 0x6003, 0x0001, 0x6106, 0x1078, 0x5bf8, 0x127e, | ||
| 3765 | 0x2091, 0x8000, 0x1078, 0x6109, 0x127f, 0x007c, 0x027e, 0x057e, | ||
| 3766 | 0x0d7e, 0x0e7e, 0x2071, 0xa880, 0x7224, 0x6212, 0x7220, 0x1078, | ||
| 3767 | 0x8a30, 0x0040, 0x8503, 0x2268, 0x6800, 0xa086, 0x0000, 0x0040, | ||
| 3768 | 0x8503, 0x6018, 0x6d18, 0xa52e, 0x00c0, 0x8503, 0x0c7e, 0x2d60, | ||
| 3769 | 0x1078, 0x874a, 0x0c7f, 0x0040, 0x8503, 0x6803, 0x0002, 0x6007, | ||
| 3770 | 0x0086, 0x0078, 0x8505, 0x6007, 0x0087, 0x6003, 0x0001, 0x1078, | ||
| 3771 | 0x5bf8, 0x1078, 0x6109, 0x0f7e, 0x2278, 0x1078, 0x4893, 0x0f7f, | ||
| 3772 | 0x0040, 0x851d, 0x6824, 0xd0ec, 0x0040, 0x851d, 0x0c7e, 0x2260, | ||
| 3773 | 0x603f, 0x0000, 0x1078, 0x8cfa, 0x0c7f, 0x0e7f, 0x0d7f, 0x057f, | ||
| 3774 | 0x027f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x8533, 0x6004, 0xa08a, | ||
| 3775 | 0x0085, 0x1048, 0x1328, 0xa08a, 0x008c, 0x10c8, 0x1328, 0xa082, | ||
| 3776 | 0x0085, 0x0079, 0x8542, 0xa186, 0x0027, 0x0040, 0x853b, 0xa186, | ||
| 3777 | 0x0014, 0x10c0, 0x1328, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, | ||
| 3778 | 0x6109, 0x007c, 0x8549, 0x854b, 0x854b, 0x8549, 0x8549, 0x8549, | ||
| 3779 | 0x8549, 0x1078, 0x1328, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, | ||
| 3780 | 0x6109, 0x007c, 0xa186, 0x0013, 0x00c0, 0x855c, 0x6004, 0xa082, | ||
| 3781 | 0x0085, 0x2008, 0x0078, 0x8597, 0xa186, 0x0027, 0x00c0, 0x857f, | ||
| 3782 | 0x1078, 0x6010, 0x1078, 0x2813, 0x0d7e, 0x6010, 0x2068, 0x1078, | ||
| 3783 | 0x8a44, 0x0040, 0x8575, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, | ||
| 3784 | 0x0029, 0x1078, 0x4982, 0x1078, 0x8bf4, 0x0d7f, 0x1078, 0x753d, | ||
| 3785 | 0x1078, 0x6109, 0x007c, 0x1078, 0x7583, 0x0078, 0x857a, 0xa186, | ||
| 3786 | 0x0014, 0x00c0, 0x857b, 0x1078, 0x6010, 0x0d7e, 0x6010, 0x2068, | ||
| 3787 | 0x1078, 0x8a44, 0x0040, 0x8575, 0x6837, 0x0103, 0x6847, 0x0000, | ||
| 3788 | 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x0078, 0x8571, 0x0079, | ||
| 3789 | 0x8599, 0x85a2, 0x85a0, 0x85a0, 0x85a0, 0x85a0, 0x85a0, 0x85bd, | ||
| 3790 | 0x1078, 0x1328, 0x1078, 0x6010, 0x6030, 0xa08c, 0xff00, 0x810f, | ||
| 3791 | 0xa186, 0x0039, 0x0040, 0x85b0, 0xa186, 0x0035, 0x00c0, 0x85b4, | ||
| 3792 | 0x2001, 0xa5a0, 0x0078, 0x85b6, 0x2001, 0xa5a1, 0x2004, 0x6016, | ||
| 3793 | 0x6003, 0x000c, 0x1078, 0x6109, 0x007c, 0x1078, 0x6010, 0x6030, | ||
| 3794 | 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0040, 0x85cb, 0xa186, | ||
| 3795 | 0x0035, 0x00c0, 0x85cf, 0x2001, 0xa5a0, 0x0078, 0x85d1, 0x2001, | ||
| 3796 | 0xa5a1, 0x2004, 0x6016, 0x6003, 0x000e, 0x1078, 0x6109, 0x007c, | ||
| 3797 | 0xa182, 0x008c, 0x00c8, 0x85e2, 0xa182, 0x0085, 0x0048, 0x85e2, | ||
| 3798 | 0x0079, 0x85e5, 0x1078, 0x7583, 0x007c, 0x85ec, 0x85ec, 0x85ec, | ||
| 3799 | 0x85ec, 0x85ee, 0x8643, 0x85ec, 0x1078, 0x1328, 0x0f7e, 0x2c78, | ||
| 3800 | 0x1078, 0x4893, 0x0f7f, 0x0040, 0x8601, 0x6030, 0xa08c, 0xff00, | ||
| 3801 | 0x810f, 0xa186, 0x0039, 0x0040, 0x865a, 0xa186, 0x0035, 0x0040, | ||
| 3802 | 0x865a, 0x0d7e, 0x1078, 0x8bf4, 0x1078, 0x8a44, 0x0040, 0x8625, | ||
| 3803 | 0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0040, 0x8616, | ||
| 3804 | 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0078, 0x8621, 0xd0bc, 0x0040, | ||
| 3805 | 0x861d, 0x684b, 0x0002, 0x0078, 0x8621, 0x684b, 0x0005, 0x1078, | ||
| 3806 | 0x8cc0, 0x6847, 0x0000, 0x1078, 0x4982, 0x2c68, 0x1078, 0x74d7, | ||
| 3807 | 0x0040, 0x863e, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xa88e, | ||
| 3808 | 0x210c, 0x6136, 0x2009, 0xa88f, 0x210c, 0x613a, 0x6918, 0x611a, | ||
| 3809 | 0x6920, 0x6122, 0x601f, 0x0001, 0x1078, 0x5bf8, 0x2d60, 0x1078, | ||
| 3810 | 0x753d, 0x0d7f, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, | ||
| 3811 | 0x0040, 0x8680, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, | ||
| 3812 | 0x0040, 0x865a, 0xa186, 0x001e, 0x0040, 0x865a, 0xa186, 0x0039, | ||
| 3813 | 0x00c0, 0x8680, 0x0d7e, 0x2c68, 0x1078, 0x8ef5, 0x00c0, 0x86a4, | ||
| 3814 | 0x1078, 0x74d7, 0x0040, 0x867d, 0x6106, 0x6003, 0x0001, 0x601f, | ||
| 3815 | 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, 0x612e, 0x6930, | ||
| 3816 | 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, 0x613a, 0x6920, | ||
| 3817 | 0x6122, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x2d60, 0x0078, 0x86a4, | ||
| 3818 | 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x86a4, 0x6837, | ||
| 3819 | 0x0103, 0x6850, 0xd0b4, 0x0040, 0x8693, 0xc0ec, 0x6852, 0x684b, | ||
| 3820 | 0x0006, 0x0078, 0x869e, 0xd0bc, 0x0040, 0x869a, 0x684b, 0x0002, | ||
| 3821 | 0x0078, 0x869e, 0x684b, 0x0005, 0x1078, 0x8cc0, 0x6847, 0x0000, | ||
| 3822 | 0x1078, 0x4982, 0x1078, 0x8bf4, 0x0d7f, 0x1078, 0x753d, 0x007c, | ||
| 3823 | 0x017e, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x86b8, | ||
| 3824 | 0x6837, 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x1078, 0x4982, | ||
| 3825 | 0x0d7f, 0x017f, 0xa186, 0x0013, 0x0040, 0x86ca, 0xa186, 0x0014, | ||
| 3826 | 0x0040, 0x86ca, 0xa186, 0x0027, 0x0040, 0x86ca, 0x1078, 0x7583, | ||
| 3827 | 0x0078, 0x86d0, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, 0x6109, | ||
| 3828 | 0x007c, 0x057e, 0x067e, 0x0d7e, 0x0f7e, 0x2029, 0x0001, 0xa182, | ||
| 3829 | 0x0101, 0x00c8, 0x86dd, 0x0078, 0x86df, 0x2009, 0x0100, 0x2130, | ||
| 3830 | 0x2069, 0xa898, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, | ||
| 3831 | 0x001d, 0x1078, 0x8739, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0040, | ||
| 3832 | 0x86f3, 0x1078, 0x13aa, 0x1078, 0x1381, 0x0040, 0x871d, 0x8528, | ||
| 3833 | 0x6837, 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, | ||
| 3834 | 0x00c8, 0x8709, 0x2608, 0xad90, 0x000f, 0x1078, 0x8739, 0x0078, | ||
| 3835 | 0x871d, 0xa6b2, 0x003c, 0x2009, 0x003c, 0x2d78, 0xad90, 0x000f, | ||
| 3836 | 0x1078, 0x8739, 0x0078, 0x86f3, 0x0f7f, 0x852f, 0xa5ad, 0x0003, | ||
| 3837 | 0x7d36, 0xa5ac, 0x0000, 0x0078, 0x8722, 0x0f7f, 0x852f, 0xa5ad, | ||
| 3838 | 0x0003, 0x7d36, 0x0d7f, 0x067f, 0x057f, 0x007c, 0x0f7e, 0x8dff, | ||
| 3839 | 0x0040, 0x8737, 0x6804, 0xa07d, 0x0040, 0x8735, 0x6807, 0x0000, | ||
| 3840 | 0x1078, 0x4982, 0x2f68, 0x0078, 0x872a, 0x1078, 0x4982, 0x0f7f, | ||
| 3841 | 0x007c, 0x157e, 0xa184, 0x0001, 0x0040, 0x873f, 0x8108, 0x810c, | ||
| 3842 | 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, 0x8210, 0x00f0, 0x8741, | ||
| 3843 | 0x157f, 0x007c, 0x067e, 0x127e, 0x2091, 0x8000, 0x2031, 0x0001, | ||
| 3844 | 0x601c, 0xa084, 0x000f, 0x1079, 0x8766, 0x127f, 0x067f, 0x007c, | ||
| 3845 | 0x127e, 0x2091, 0x8000, 0x067e, 0x2031, 0x0000, 0x601c, 0xa084, | ||
| 3846 | 0x000f, 0x1079, 0x8766, 0x067f, 0x127f, 0x007c, 0x8780, 0x876e, | ||
| 3847 | 0x877b, 0x879c, 0x876e, 0x877b, 0x879c, 0x877b, 0x1078, 0x1328, | ||
| 3848 | 0x037e, 0x2019, 0x0010, 0x1078, 0x9a6a, 0x601f, 0x0006, 0x6003, | ||
| 3849 | 0x0007, 0x037f, 0x007c, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, | ||
| 3850 | 0x0d7e, 0x86ff, 0x00c0, 0x8797, 0x6010, 0x2068, 0x1078, 0x8a44, | ||
| 3851 | 0x0040, 0x8799, 0xa00e, 0x2001, 0x0005, 0x1078, 0x4a60, 0x1078, | ||
| 3852 | 0x8cc0, 0x1078, 0x4982, 0x1078, 0x753d, 0xa085, 0x0001, 0x0d7f, | ||
| 3853 | 0x007c, 0xa006, 0x0078, 0x8797, 0x6000, 0xa08a, 0x0010, 0x10c8, | ||
| 3854 | 0x1328, 0x1079, 0x87a4, 0x007c, 0x87b4, 0x87d4, 0x87b6, 0x87f7, | ||
| 3855 | 0x87d0, 0x87b4, 0x877b, 0x8780, 0x8780, 0x877b, 0x877b, 0x877b, | ||
| 3856 | 0x877b, 0x877b, 0x877b, 0x877b, 0x1078, 0x1328, 0x86ff, 0x00c0, | ||
| 3857 | 0x87cd, 0x0d7e, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x87c2, | ||
| 3858 | 0x1078, 0x8cc0, 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, | ||
| 3859 | 0x0002, 0x1078, 0x5bf8, 0x1078, 0x6109, 0xa085, 0x0001, 0x007c, | ||
| 3860 | 0x1078, 0x1749, 0x0078, 0x87b6, 0x0e7e, 0x2071, 0xa5ab, 0x7024, | ||
| 3861 | 0xac06, 0x00c0, 0x87dd, 0x1078, 0x6dda, 0x601c, 0xa084, 0x000f, | ||
| 3862 | 0xa086, 0x0006, 0x00c0, 0x87ef, 0x087e, 0x097e, 0x2049, 0x0001, | ||
| 3863 | 0x2c40, 0x1078, 0x7058, 0x097f, 0x087f, 0x0078, 0x87f1, 0x1078, | ||
| 3864 | 0x6cd2, 0x0e7f, 0x00c0, 0x87b6, 0x1078, 0x877b, 0x007c, 0x037e, | ||
| 3865 | 0x0e7e, 0x2071, 0xa5ab, 0x703c, 0xac06, 0x00c0, 0x8807, 0x2019, | ||
| 3866 | 0x0000, 0x1078, 0x6e6c, 0x0e7f, 0x037f, 0x0078, 0x87b6, 0x1078, | ||
| 3867 | 0x719a, 0x0e7f, 0x037f, 0x00c0, 0x87b6, 0x1078, 0x877b, 0x007c, | ||
| 3868 | 0x0c7e, 0x601c, 0xa084, 0x000f, 0x1079, 0x8818, 0x0c7f, 0x007c, | ||
| 3869 | 0x8827, 0x8895, 0x89cd, 0x8832, 0x8c01, 0x8827, 0x9a5b, 0x753d, | ||
| 3870 | 0x8895, 0x1078, 0x8c3b, 0x00c0, 0x8827, 0x1078, 0x7a05, 0x007c, | ||
| 3871 | 0x1078, 0x6010, 0x1078, 0x6109, 0x1078, 0x753d, 0x007c, 0x6017, | ||
| 3872 | 0x0001, 0x007c, 0x6010, 0xa080, 0x0019, 0x2c02, 0x6000, 0xa08a, | ||
| 3873 | 0x0010, 0x10c8, 0x1328, 0x1079, 0x883e, 0x007c, 0x884e, 0x8850, | ||
| 3874 | 0x8872, 0x8884, 0x8891, 0x884e, 0x8827, 0x8827, 0x8827, 0x8884, | ||
| 3875 | 0x8884, 0x884e, 0x884e, 0x884e, 0x884e, 0x888e, 0x1078, 0x1328, | ||
| 3876 | 0x0e7e, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, 0xa5ab, | ||
| 3877 | 0x7024, 0xac06, 0x0040, 0x886e, 0x1078, 0x6cd2, 0x6007, 0x0085, | ||
| 3878 | 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xa5a1, 0x2004, 0x6016, | ||
| 3879 | 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0e7f, 0x007c, 0x6017, 0x0001, | ||
| 3880 | 0x0078, 0x886c, 0x0d7e, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, | ||
| 3881 | 0x0d7f, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x1078, | ||
| 3882 | 0x5bf8, 0x1078, 0x6109, 0x007c, 0x0d7e, 0x6017, 0x0001, 0x6010, | ||
| 3883 | 0x2068, 0x6850, 0xc0b5, 0x6852, 0x0d7f, 0x007c, 0x1078, 0x753d, | ||
| 3884 | 0x007c, 0x1078, 0x1749, 0x0078, 0x8872, 0x6000, 0xa08a, 0x0010, | ||
| 3885 | 0x10c8, 0x1328, 0x1079, 0x889d, 0x007c, 0x88ad, 0x882f, 0x88af, | ||
| 3886 | 0x88ad, 0x88af, 0x88af, 0x8828, 0x88ad, 0x8821, 0x8821, 0x88ad, | ||
| 3887 | 0x88ad, 0x88ad, 0x88ad, 0x88ad, 0x88ad, 0x1078, 0x1328, 0x0d7e, | ||
| 3888 | 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, 0xa08a, 0x000c, | ||
| 3889 | 0x10c8, 0x1328, 0x1079, 0x88bd, 0x007c, 0x88c9, 0x8971, 0x88cb, | ||
| 3890 | 0x890b, 0x88cb, 0x890b, 0x88cb, 0x88d8, 0x88c9, 0x890b, 0x88c9, | ||
| 3891 | 0x88f5, 0x1078, 0x1328, 0x6004, 0xa08e, 0x0016, 0x0040, 0x8906, | ||
| 3892 | 0xa08e, 0x0004, 0x0040, 0x8906, 0xa08e, 0x0002, 0x0040, 0x8906, | ||
| 3893 | 0x6004, 0x1078, 0x8c3b, 0x0040, 0x898c, 0xa08e, 0x0021, 0x0040, | ||
| 3894 | 0x8990, 0xa08e, 0x0022, 0x0040, 0x898c, 0xa08e, 0x003d, 0x0040, | ||
| 3895 | 0x8990, 0xa08e, 0x0039, 0x0040, 0x8994, 0xa08e, 0x0035, 0x0040, | ||
| 3896 | 0x8994, 0xa08e, 0x001e, 0x0040, 0x8908, 0xa08e, 0x0001, 0x00c0, | ||
| 3897 | 0x8904, 0x0d7e, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x0d7f, | ||
| 3898 | 0xa086, 0x0006, 0x0040, 0x8906, 0x1078, 0x2813, 0x1078, 0x7a05, | ||
| 3899 | 0x1078, 0x8c01, 0x007c, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, | ||
| 3900 | 0x0040, 0x8961, 0xa186, 0x0002, 0x00c0, 0x8934, 0x6018, 0x2068, | ||
| 3901 | 0x68a0, 0xd0bc, 0x00c0, 0x89b8, 0x6840, 0xa084, 0x00ff, 0xa005, | ||
| 3902 | 0x0040, 0x8934, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, | ||
| 3903 | 0x6017, 0x0398, 0x1078, 0x74d7, 0x0040, 0x8934, 0x2d00, 0x601a, | ||
| 3904 | 0x601f, 0x0001, 0x0078, 0x8961, 0x0d7f, 0x0c7f, 0x6004, 0xa08e, | ||
| 3905 | 0x0002, 0x00c0, 0x8952, 0x6018, 0xa080, 0x0028, 0x2004, 0xa086, | ||
| 3906 | 0x007e, 0x00c0, 0x8952, 0x2009, 0xa332, 0x2104, 0xc085, 0x200a, | ||
| 3907 | 0x0e7e, 0x2071, 0xa300, 0x1078, 0x41f5, 0x0e7f, 0x1078, 0x7a05, | ||
| 3908 | 0x0078, 0x8956, 0x1078, 0x7a05, 0x1078, 0x2813, 0x0e7e, 0x127e, | ||
| 3909 | 0x2091, 0x8000, 0x1078, 0x2839, 0x127f, 0x0e7f, 0x1078, 0x8c01, | ||
| 3910 | 0x007c, 0x2001, 0x0002, 0x1078, 0x443f, 0x6003, 0x0001, 0x6007, | ||
| 3911 | 0x0002, 0x1078, 0x5c45, 0x1078, 0x6109, 0x0d7f, 0x0c7f, 0x0078, | ||
| 3912 | 0x8960, 0x0c7e, 0x0d7e, 0x6104, 0xa186, 0x0016, 0x0040, 0x8961, | ||
| 3913 | 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0040, 0x8934, | ||
| 3914 | 0x8001, 0x6842, 0x6003, 0x0001, 0x1078, 0x5c45, 0x1078, 0x6109, | ||
| 3915 | 0x0d7f, 0x0c7f, 0x0078, 0x8960, 0x1078, 0x7a05, 0x0078, 0x8908, | ||
| 3916 | 0x1078, 0x7a28, 0x0078, 0x8908, 0x0d7e, 0x2c68, 0x6104, 0x1078, | ||
| 3917 | 0x8ef5, 0x0d7f, 0x0040, 0x89a0, 0x1078, 0x753d, 0x0078, 0x89b7, | ||
| 3918 | 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, | ||
| 3919 | 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, 0x600a, 0x2001, | ||
| 3920 | 0xa5a1, 0x2004, 0x6016, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x007c, | ||
| 3921 | 0x0d7f, 0x0c7f, 0x1078, 0x7a05, 0x1078, 0x2813, 0x0e7e, 0x127e, | ||
| 3922 | 0x2091, 0x8000, 0x1078, 0x2839, 0x6013, 0x0000, 0x601f, 0x0007, | ||
| 3923 | 0x6017, 0x0398, 0x127f, 0x0e7f, 0x007c, 0x6000, 0xa08a, 0x0010, | ||
| 3924 | 0x10c8, 0x1328, 0x1079, 0x89d5, 0x007c, 0x89e5, 0x89e5, 0x89e5, | ||
| 3925 | 0x89e5, 0x89e5, 0x89e5, 0x89e5, 0x89e5, 0x89e5, 0x8827, 0x89e5, | ||
| 3926 | 0x882f, 0x89e7, 0x882f, 0x89f5, 0x89e5, 0x1078, 0x1328, 0x6004, | ||
| 3927 | 0xa086, 0x008b, 0x0040, 0x89f5, 0x6007, 0x008b, 0x6003, 0x000d, | ||
| 3928 | 0x1078, 0x5bf8, 0x1078, 0x6109, 0x007c, 0x1078, 0x8bf4, 0x1078, | ||
| 3929 | 0x8a44, 0x0040, 0x8a2d, 0x1078, 0x2813, 0x0d7e, 0x1078, 0x8a44, | ||
| 3930 | 0x0040, 0x8a0f, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, | ||
| 3931 | 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x1078, 0x4982, 0x2c68, | ||
| 3932 | 0x1078, 0x74d7, 0x0040, 0x8a1d, 0x6818, 0x601a, 0x0c7e, 0x2d60, | ||
| 3933 | 0x1078, 0x8c01, 0x0c7f, 0x0078, 0x8a1e, 0x2d60, 0x0d7f, 0x6013, | ||
| 3934 | 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, | ||
| 3935 | 0x5c45, 0x1078, 0x6109, 0x0078, 0x8a2f, 0x1078, 0x8c01, 0x007c, | ||
| 3936 | 0xa284, 0x000f, 0x00c0, 0x8a41, 0xa282, 0xaa00, 0x0048, 0x8a41, | ||
| 3937 | 0x2001, 0xa315, 0x2004, 0xa202, 0x00c8, 0x8a41, 0xa085, 0x0001, | ||
| 3938 | 0x007c, 0xa006, 0x0078, 0x8a40, 0x027e, 0x0e7e, 0x2071, 0xa300, | ||
| 3939 | 0x6210, 0x7058, 0xa202, 0x0048, 0x8a56, 0x705c, 0xa202, 0x00c8, | ||
| 3940 | 0x8a56, 0xa085, 0x0001, 0x0e7f, 0x027f, 0x007c, 0xa006, 0x0078, | ||
| 3941 | 0x8a53, 0x0e7e, 0x0c7e, 0x037e, 0x007e, 0x127e, 0x2091, 0x8000, | ||
| 3942 | 0x2061, 0xaa00, 0x2071, 0xa300, 0x7344, 0x7060, 0xa302, 0x00c8, | ||
| 3943 | 0x8a83, 0x601c, 0xa206, 0x00c0, 0x8a7b, 0x1078, 0x8d66, 0x0040, | ||
| 3944 | 0x8a7b, 0x1078, 0x8c3b, 0x00c0, 0x8a77, 0x1078, 0x7a05, 0x0c7e, | ||
| 3945 | 0x1078, 0x753d, 0x0c7f, 0xace0, 0x0010, 0x7054, 0xac02, 0x00c8, | ||
| 3946 | 0x8a83, 0x0078, 0x8a64, 0x127f, 0x007f, 0x037f, 0x0c7f, 0x0e7f, | ||
| 3947 | 0x007c, 0x0e7e, 0x0c7e, 0x017e, 0xa188, 0xa434, 0x210c, 0x81ff, | ||
| 3948 | 0x0040, 0x8aa1, 0x2061, 0xaa00, 0x2071, 0xa300, 0x017e, 0x1078, | ||
| 3949 | 0x74d7, 0x017f, 0x0040, 0x8aa4, 0x611a, 0x1078, 0x2813, 0x1078, | ||
| 3950 | 0x753d, 0xa006, 0x0078, 0x8aa6, 0xa085, 0x0001, 0x017f, 0x0c7f, | ||
| 3951 | 0x0e7f, 0x007c, 0x0c7e, 0x057e, 0x127e, 0x2091, 0x8000, 0x0c7e, | ||
| 3952 | 0x1078, 0x74d7, 0x057f, 0x0040, 0x8ac3, 0x6612, 0x651a, 0x601f, | ||
| 3953 | 0x0003, 0x2009, 0x004b, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, | ||
| 3954 | 0x057f, 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8abf, 0x0c7e, 0x057e, | ||
| 3955 | 0x127e, 0x2091, 0x8000, 0x62a0, 0x0c7e, 0x1078, 0x74d7, 0x057f, | ||
| 3956 | 0x0040, 0x8af1, 0x6013, 0x0000, 0x651a, 0x601f, 0x0003, 0x0c7e, | ||
| 3957 | 0x2560, 0x1078, 0x471b, 0x0c7f, 0x1078, 0x5d53, 0x077e, 0x2039, | ||
| 3958 | 0x0000, 0x1078, 0x5c78, 0x2c08, 0x1078, 0x9c38, 0x077f, 0x2009, | ||
| 3959 | 0x004c, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, 0x057f, 0x0c7f, | ||
| 3960 | 0x007c, 0xa006, 0x0078, 0x8aed, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, | ||
| 3961 | 0x1078, 0x74d7, 0x2c78, 0x0c7f, 0x0040, 0x8b0e, 0x7e12, 0x2c00, | ||
| 3962 | 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x1078, 0x8b4e, 0x2f60, | ||
| 3963 | 0x2009, 0x004d, 0x1078, 0x756c, 0xa085, 0x0001, 0x047f, 0x0c7f, | ||
| 3964 | 0x0f7f, 0x007c, 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x74d7, | ||
| 3965 | 0x2c78, 0x0c7f, 0x0040, 0x8b2c, 0x7e12, 0x2c00, 0x781a, 0x781f, | ||
| 3966 | 0x0003, 0x2021, 0x0005, 0x1078, 0x8b4e, 0x2f60, 0x2009, 0x004e, | ||
| 3967 | 0x1078, 0x756c, 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c, | ||
| 3968 | 0x0f7e, 0x0c7e, 0x047e, 0x0c7e, 0x1078, 0x74d7, 0x2c78, 0x0c7f, | ||
| 3969 | 0x0040, 0x8b4a, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, | ||
| 3970 | 0x0004, 0x1078, 0x8b4e, 0x2f60, 0x2009, 0x0052, 0x1078, 0x756c, | ||
| 3971 | 0xa085, 0x0001, 0x047f, 0x0c7f, 0x0f7f, 0x007c, 0x097e, 0x077e, | ||
| 3972 | 0x127e, 0x2091, 0x8000, 0x1078, 0x46a7, 0x0040, 0x8b5b, 0x2001, | ||
| 3973 | 0x8b53, 0x0078, 0x8b61, 0x1078, 0x466d, 0x0040, 0x8b6a, 0x2001, | ||
| 3974 | 0x8b5b, 0x007e, 0xa00e, 0x2400, 0x1078, 0x4a60, 0x1078, 0x4982, | ||
| 3975 | 0x007f, 0x007a, 0x2418, 0x1078, 0x5fa7, 0x62a0, 0x087e, 0x2041, | ||
| 3976 | 0x0001, 0x2039, 0x0001, 0x2608, 0x1078, 0x5d6d, 0x087f, 0x1078, | ||
| 3977 | 0x5c78, 0x2f08, 0x2648, 0x1078, 0x9c38, 0x613c, 0x81ff, 0x1040, | ||
| 3978 | 0x5e21, 0x127f, 0x077f, 0x097f, 0x007c, 0x0c7e, 0x127e, 0x2091, | ||
| 3979 | 0x8000, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, 0x8b9e, 0x660a, | ||
| 3980 | 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x001f, 0x1078, | ||
| 3981 | 0x756c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, | ||
| 3982 | 0x8b9b, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x74d7, | ||
| 3983 | 0x017f, 0x0040, 0x8bba, 0x660a, 0x611a, 0x601f, 0x0008, 0x2d00, | ||
| 3984 | 0x6012, 0x2009, 0x0021, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, | ||
| 3985 | 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8bb7, 0x0c7e, 0x127e, 0x2091, | ||
| 3986 | 0x8000, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, 0x8bd6, 0x660a, | ||
| 3987 | 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x003d, 0x1078, | ||
| 3988 | 0x756c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, | ||
| 3989 | 0x8bd3, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, 0x74d7, | ||
| 3990 | 0x017f, 0x0040, 0x8bf1, 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, | ||
| 3991 | 0x2009, 0x0000, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, 0x0c7f, | ||
| 3992 | 0x007c, 0xa006, 0x0078, 0x8bee, 0x027e, 0x0d7e, 0x6218, 0x2268, | ||
| 3993 | 0x6a3c, 0x82ff, 0x0040, 0x8bfe, 0x8211, 0x6a3e, 0x0d7f, 0x027f, | ||
| 3994 | 0x007c, 0x007e, 0x6000, 0xa086, 0x0000, 0x0040, 0x8c13, 0x6013, | ||
| 3995 | 0x0000, 0x601f, 0x0007, 0x2001, 0xa5a1, 0x2004, 0x6016, 0x1078, | ||
| 3996 | 0xa134, 0x603f, 0x0000, 0x007f, 0x007c, 0x067e, 0x0c7e, 0x0d7e, | ||
| 3997 | 0x2031, 0xa352, 0x2634, 0xd6e4, 0x0040, 0x8c23, 0x6618, 0x2660, | ||
| 3998 | 0x6e48, 0x1078, 0x461b, 0x0d7f, 0x0c7f, 0x067f, 0x007c, 0x007e, | ||
| 3999 | 0x017e, 0x6004, 0xa08e, 0x0002, 0x0040, 0x8c38, 0xa08e, 0x0003, | ||
| 4000 | 0x0040, 0x8c38, 0xa08e, 0x0004, 0x0040, 0x8c38, 0xa085, 0x0001, | ||
| 4001 | 0x017f, 0x007f, 0x007c, 0x007e, 0x0d7e, 0x6010, 0xa06d, 0x0040, | ||
| 4002 | 0x8c48, 0x6838, 0xd0fc, 0x0040, 0x8c48, 0xa006, 0x0078, 0x8c4a, | ||
| 4003 | 0xa085, 0x0001, 0x0d7f, 0x007f, 0x007c, 0x0c7e, 0x127e, 0x2091, | ||
| 4004 | 0x8000, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, 0x8c67, 0x611a, | ||
| 4005 | 0x601f, 0x0001, 0x2d00, 0x6012, 0x1078, 0x2813, 0x2009, 0x0028, | ||
| 4006 | 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, | ||
| 4007 | 0x0078, 0x8c64, 0xa186, 0x0015, 0x00c0, 0x8c7f, 0x2011, 0xa31f, | ||
| 4008 | 0x2204, 0xa086, 0x0074, 0x00c0, 0x8c7f, 0x1078, 0x7d0d, 0x6003, | ||
| 4009 | 0x0001, 0x6007, 0x0029, 0x1078, 0x5c45, 0x0078, 0x8c83, 0x1078, | ||
| 4010 | 0x7a05, 0x1078, 0x753d, 0x007c, 0xa186, 0x0016, 0x00c0, 0x8c8e, | ||
| 4011 | 0x2001, 0x0004, 0x1078, 0x443f, 0x0078, 0x8caf, 0xa186, 0x0015, | ||
| 4012 | 0x00c0, 0x8cb3, 0x2011, 0xa31f, 0x2204, 0xa086, 0x0014, 0x00c0, | ||
| 4013 | 0x8cb3, 0x0d7e, 0x6018, 0x2068, 0x1078, 0x457d, 0x0d7f, 0x1078, | ||
| 4014 | 0x7dba, 0x00c0, 0x8cb3, 0x0d7e, 0x6018, 0x2068, 0x6890, 0x0d7f, | ||
| 4015 | 0xa005, 0x0040, 0x8cb3, 0x2001, 0x0006, 0x1078, 0x443f, 0x1078, | ||
| 4016 | 0x7608, 0x0078, 0x8cb7, 0x1078, 0x7a05, 0x1078, 0x753d, 0x007c, | ||
| 4017 | 0x6848, 0xa086, 0x0005, 0x00c0, 0x8cbf, 0x1078, 0x8cc0, 0x007c, | ||
| 4018 | 0x6850, 0xc0ad, 0x6852, 0x007c, 0x0e7e, 0x2071, 0xa88c, 0x7014, | ||
| 4019 | 0xd0e4, 0x0040, 0x8cd5, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, | ||
| 4020 | 0x0050, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0e7f, 0x007c, 0x0c7e, | ||
| 4021 | 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, 0x0040, 0x8ce4, 0x601c, | ||
| 4022 | 0xa084, 0x000f, 0x1079, 0x8ce6, 0x0c7f, 0x007c, 0x8827, 0x8cf1, | ||
| 4023 | 0x8cf4, 0x8cf7, 0x9f00, 0x9f1c, 0x9f1f, 0x8827, 0x8827, 0x1078, | ||
| 4024 | 0x1328, 0x0005, 0x0005, 0x007c, 0x0005, 0x0005, 0x007c, 0x1078, | ||
| 4025 | 0x8cfa, 0x007c, 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0040, 0x8d29, | ||
| 4026 | 0x1078, 0x74d7, 0x00c0, 0x8d0a, 0x2001, 0xa5a2, 0x2004, 0x783e, | ||
| 4027 | 0x0078, 0x8d29, 0x7818, 0x601a, 0x781c, 0xa086, 0x0003, 0x0040, | ||
| 4028 | 0x8d17, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0078, 0x8d1b, 0x7808, | ||
| 4029 | 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, | ||
| 4030 | 0x6003, 0x0001, 0x7920, 0x6122, 0x1078, 0x5bf8, 0x1078, 0x6109, | ||
| 4031 | 0x2f60, 0x0f7f, 0x007c, 0x017e, 0x0f7e, 0x682c, 0x6032, 0xa08e, | ||
| 4032 | 0x0001, 0x0040, 0x8d3c, 0xa086, 0x0005, 0x0040, 0x8d40, 0xa006, | ||
| 4033 | 0x602a, 0x602e, 0x0078, 0x8d51, 0x6824, 0xc0f4, 0xc0d5, 0x6826, | ||
| 4034 | 0x6810, 0x2078, 0x787c, 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, | ||
| 4035 | 0x00c8, 0x8d37, 0x6834, 0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, | ||
| 4036 | 0x602e, 0x2d00, 0x6036, 0x6808, 0x603a, 0x6918, 0x611a, 0x6920, | ||
| 4037 | 0x6122, 0x601f, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x1078, | ||
| 4038 | 0x5bf8, 0x6803, 0x0002, 0x0f7f, 0x017f, 0x007c, 0x007e, 0x017e, | ||
| 4039 | 0x6004, 0xa08e, 0x0034, 0x0040, 0x8d8b, 0xa08e, 0x0035, 0x0040, | ||
| 4040 | 0x8d8b, 0xa08e, 0x0036, 0x0040, 0x8d8b, 0xa08e, 0x0037, 0x0040, | ||
| 4041 | 0x8d8b, 0xa08e, 0x0038, 0x0040, 0x8d8b, 0xa08e, 0x0039, 0x0040, | ||
| 4042 | 0x8d8b, 0xa08e, 0x003a, 0x0040, 0x8d8b, 0xa08e, 0x003b, 0x0040, | ||
| 4043 | 0x8d8b, 0xa085, 0x0001, 0x017f, 0x007f, 0x007c, 0x0f7e, 0x2c78, | ||
| 4044 | 0x1078, 0x4893, 0x00c0, 0x8d98, 0xa085, 0x0001, 0x0078, 0x8da7, | ||
| 4045 | 0x6024, 0xd0f4, 0x00c0, 0x8da6, 0xc0f5, 0x6026, 0x6010, 0x2078, | ||
| 4046 | 0x7828, 0x603a, 0x782c, 0x6036, 0x1078, 0x1749, 0xa006, 0x0f7f, | ||
| 4047 | 0x007c, 0x007e, 0x017e, 0x027e, 0x037e, 0x0e7e, 0x2001, 0xa59c, | ||
| 4048 | 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x1078, 0x5a98, 0x2001, | ||
| 4049 | 0xa5a0, 0x82ff, 0x00c0, 0x8dbe, 0x2011, 0x0002, 0x2202, 0x2001, | ||
| 4050 | 0xa59e, 0x200c, 0x8000, 0x2014, 0x2071, 0xa58c, 0x711a, 0x721e, | ||
| 4051 | 0x2001, 0x0064, 0x1078, 0x5a98, 0x2001, 0xa5a1, 0x82ff, 0x00c0, | ||
| 4052 | 0x8dd3, 0x2011, 0x0002, 0x2202, 0x2009, 0xa5a2, 0xa280, 0x000a, | ||
| 4053 | 0x200a, 0x0e7f, 0x037f, 0x027f, 0x017f, 0x007f, 0x007c, 0x007e, | ||
| 4054 | 0x0e7e, 0x2001, 0xa5a0, 0x2003, 0x0028, 0x2001, 0xa5a1, 0x2003, | ||
| 4055 | 0x0014, 0x2071, 0xa58c, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, | ||
| 4056 | 0xa5a2, 0x2003, 0x001e, 0x0e7f, 0x007f, 0x007c, 0x0c7e, 0x127e, | ||
| 4057 | 0x2091, 0x8000, 0x0c7e, 0x1078, 0x74d7, 0x017f, 0x0040, 0x8e0e, | ||
| 4058 | 0x611a, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, 0x1078, | ||
| 4059 | 0x756c, 0xa085, 0x0001, 0x127f, 0x0c7f, 0x007c, 0xa006, 0x0078, | ||
| 4060 | 0x8e0b, 0x0d7e, 0x0e7e, 0x0f7e, 0x2071, 0xa300, 0xa186, 0x0015, | ||
| 4061 | 0x00c0, 0x8e40, 0x707c, 0xa086, 0x0018, 0x00c0, 0x8e40, 0x6010, | ||
| 4062 | 0x2068, 0x6a3c, 0xd2e4, 0x00c0, 0x8e34, 0x2c78, 0x1078, 0x62c6, | ||
| 4063 | 0x0040, 0x8e48, 0x7068, 0x6a50, 0xa206, 0x00c0, 0x8e3c, 0x706c, | ||
| 4064 | 0x6a54, 0xa206, 0x00c0, 0x8e3c, 0x6218, 0xa290, 0x0028, 0x2214, | ||
| 4065 | 0x2009, 0x0000, 0x1078, 0x285b, 0x1078, 0x7608, 0x0078, 0x8e44, | ||
| 4066 | 0x1078, 0x7a05, 0x1078, 0x753d, 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, | ||
| 4067 | 0x704c, 0xa080, 0x293f, 0x2004, 0x6a54, 0xa206, 0x0040, 0x8e34, | ||
| 4068 | 0x0078, 0x8e3c, 0x0c7e, 0x127e, 0x2091, 0x8000, 0x0c7e, 0x1078, | ||
| 4069 | 0x74d7, 0x017f, 0x0040, 0x8e6a, 0x611a, 0x601f, 0x0001, 0x2d00, | ||
| 4070 | 0x6012, 0x2009, 0x0043, 0x1078, 0x756c, 0xa085, 0x0001, 0x127f, | ||
| 4071 | 0x0c7f, 0x007c, 0xa006, 0x0078, 0x8e67, 0x0d7e, 0x0e7e, 0x0f7e, | ||
| 4072 | 0x2071, 0xa300, 0xa186, 0x0015, 0x00c0, 0x8e93, 0x707c, 0xa086, | ||
| 4073 | 0x0004, 0x00c0, 0x8e93, 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x1078, | ||
| 4074 | 0x62c6, 0x0040, 0x8e9b, 0x7068, 0x6a08, 0xa206, 0x00c0, 0x8e8f, | ||
| 4075 | 0x706c, 0x6a0c, 0xa206, 0x00c0, 0x8e8f, 0x1078, 0x2813, 0x1078, | ||
| 4076 | 0x7608, 0x0078, 0x8e97, 0x1078, 0x7a05, 0x1078, 0x753d, 0x0f7f, | ||
| 4077 | 0x0e7f, 0x0d7f, 0x007c, 0x704c, 0xa080, 0x293f, 0x2004, 0x6a0c, | ||
| 4078 | 0xa206, 0x0040, 0x8e8d, 0x0078, 0x8e8f, 0x017e, 0x027e, 0x684c, | ||
| 4079 | 0xd0ac, 0x0040, 0x8ebd, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0040, | ||
| 4080 | 0x8ebd, 0x6860, 0xa106, 0x00c0, 0x8eb9, 0x685c, 0xa206, 0x0040, | ||
| 4081 | 0x8ebd, 0x6962, 0x6a5e, 0xa085, 0x0001, 0x027f, 0x017f, 0x007c, | ||
| 4082 | 0x0e7e, 0x127e, 0x2071, 0xa300, 0x2091, 0x8000, 0x7544, 0xa582, | ||
| 4083 | 0x0001, 0x0048, 0x8ef2, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, | ||
| 4084 | 0x0040, 0x8ede, 0xace0, 0x0010, 0x7054, 0xac02, 0x00c8, 0x8eda, | ||
| 4085 | 0x0078, 0x8ecd, 0x2061, 0xaa00, 0x0078, 0x8ecd, 0x6003, 0x0008, | ||
| 4086 | 0x8529, 0x7546, 0xaca8, 0x0010, 0x7054, 0xa502, 0x00c8, 0x8eee, | ||
| 4087 | 0x754a, 0xa085, 0x0001, 0x127f, 0x0e7f, 0x007c, 0x704b, 0xaa00, | ||
| 4088 | 0x0078, 0x8ee9, 0xa006, 0x0078, 0x8eeb, 0x0c7e, 0x027e, 0x017e, | ||
| 4089 | 0xa186, 0x0035, 0x0040, 0x8eff, 0x6a34, 0x0078, 0x8f00, 0x6a28, | ||
| 4090 | 0x1078, 0x8a30, 0x0040, 0x8f29, 0x2260, 0x611c, 0xa186, 0x0003, | ||
| 4091 | 0x0040, 0x8f0e, 0xa186, 0x0006, 0x00c0, 0x8f25, 0x6834, 0xa206, | ||
| 4092 | 0x0040, 0x8f1d, 0x6838, 0xa206, 0x00c0, 0x8f25, 0x6108, 0x6834, | ||
| 4093 | 0xa106, 0x00c0, 0x8f25, 0x0078, 0x8f22, 0x6008, 0x6938, 0xa106, | ||
| 4094 | 0x00c0, 0x8f25, 0x6018, 0x6918, 0xa106, 0x017f, 0x027f, 0x0c7f, | ||
| 4095 | 0x007c, 0xa085, 0x0001, 0x0078, 0x8f25, 0x067e, 0x6000, 0xa0b2, | ||
| 4096 | 0x0010, 0x10c8, 0x1328, 0x1079, 0x8f37, 0x067f, 0x007c, 0x8f47, | ||
| 4097 | 0x93bb, 0x94d3, 0x8f47, 0x8f47, 0x8f47, 0x8f47, 0x8f47, 0x8f81, | ||
| 4098 | 0x955e, 0x8f47, 0x8f47, 0x8f47, 0x8f47, 0x8f47, 0x8f47, 0x1078, | ||
| 4099 | 0x1328, 0x067e, 0x6000, 0xa0b2, 0x0010, 0x10c8, 0x1328, 0x1079, | ||
| 4100 | 0x8f53, 0x067f, 0x007c, 0x8f63, 0x99f6, 0x8f63, 0x8f63, 0x8f63, | ||
| 4101 | 0x8f63, 0x8f63, 0x8f63, 0x99b4, 0x9a44, 0x8f63, 0xa053, 0xa087, | ||
| 4102 | 0xa053, 0xa087, 0x8f63, 0x1078, 0x1328, 0x067e, 0x6000, 0xa0b2, | ||
| 4103 | 0x0010, 0x10c8, 0x1328, 0x1079, 0x8f6f, 0x067f, 0x007c, 0x8f7f, | ||
| 4104 | 0x969f, 0x976a, 0x9798, 0x9813, 0x8f7f, 0x9919, 0x98c1, 0x956a, | ||
| 4105 | 0x9988, 0x999e, 0x8f7f, 0x8f7f, 0x8f7f, 0x8f7f, 0x8f7f, 0x1078, | ||
| 4106 | 0x1328, 0xa1b2, 0x0044, 0x10c8, 0x1328, 0x2100, 0x0079, 0x8f88, | ||
| 4107 | 0x8fc8, 0x919a, 0x8fc8, 0x8fc8, 0x8fc8, 0x91a2, 0x8fc8, 0x8fc8, | ||
| 4108 | 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, | ||
| 4109 | 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fca, | ||
| 4110 | 0x902d, 0x9038, 0x9081, 0x909c, 0x911b, 0x918b, 0x8fc8, 0x8fc8, | ||
| 4111 | 0x91a6, 0x8fc8, 0x8fc8, 0x91b5, 0x91bc, 0x8fc8, 0x8fc8, 0x8fc8, | ||
| 4112 | 0x8fc8, 0x8fc8, 0x91ea, 0x8fc8, 0x8fc8, 0x91f5, 0x8fc8, 0x8fc8, | ||
| 4113 | 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x920a, 0x8fc8, 0x8fc8, 0x8fc8, | ||
| 4114 | 0x9291, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x9305, | ||
| 4115 | 0x1078, 0x1328, 0x1078, 0x4897, 0x00c0, 0x8fd7, 0x2001, 0xa332, | ||
| 4116 | 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x00c0, 0x8fdf, 0x6007, | ||
| 4117 | 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0078, 0x9195, 0x1078, | ||
| 4118 | 0x4887, 0x0e7e, 0x0c7e, 0x037e, 0x027e, 0x017e, 0x6218, 0x2270, | ||
| 4119 | 0x72a0, 0x027e, 0x2019, 0x0029, 0x1078, 0x5d53, 0x077e, 0x2039, | ||
| 4120 | 0x0000, 0x1078, 0x5c78, 0x2c08, 0x1078, 0x9c38, 0x077f, 0x017f, | ||
| 4121 | 0x2e60, 0x1078, 0x471b, 0x017f, 0x027f, 0x037f, 0x0c7f, 0x0e7f, | ||
| 4122 | 0x6618, 0x0c7e, 0x2660, 0x1078, 0x4513, 0x0c7f, 0xa6b0, 0x0001, | ||
| 4123 | 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0048, 0x901f, 0x1078, | ||
| 4124 | 0x9b6c, 0x00c0, 0x907b, 0x1078, 0x9afd, 0x00c0, 0x901b, 0x6007, | ||
| 4125 | 0x0008, 0x0078, 0x9195, 0x6007, 0x0009, 0x0078, 0x9195, 0x1078, | ||
| 4126 | 0x9d45, 0x0040, 0x9029, 0x1078, 0x9b6c, 0x0040, 0x9013, 0x0078, | ||
| 4127 | 0x907b, 0x6013, 0x1900, 0x0078, 0x901b, 0x6106, 0x1078, 0x9aa8, | ||
| 4128 | 0x6007, 0x0006, 0x0078, 0x9195, 0x6007, 0x0007, 0x0078, 0x9195, | ||
| 4129 | 0x1078, 0xa0bf, 0x00c0, 0x9340, 0x0d7e, 0x6618, 0x2668, 0x6e04, | ||
| 4130 | 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x905d, 0xa686, | ||
| 4131 | 0x0004, 0x0040, 0x905d, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, | ||
| 4132 | 0x0040, 0x905d, 0xa686, 0x0004, 0x0040, 0x905d, 0xa686, 0x0005, | ||
| 4133 | 0x0040, 0x905d, 0x0d7f, 0x0078, 0x907b, 0x1078, 0x9bd2, 0x00c0, | ||
| 4134 | 0x9076, 0xa686, 0x0006, 0x00c0, 0x906f, 0x027e, 0x6218, 0xa290, | ||
| 4135 | 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, 0x285b, 0x027f, 0x1078, | ||
| 4136 | 0x457d, 0x6007, 0x000a, 0x0d7f, 0x0078, 0x9195, 0x6007, 0x000b, | ||
| 4137 | 0x0d7f, 0x0078, 0x9195, 0x1078, 0x2813, 0x6007, 0x0001, 0x0078, | ||
| 4138 | 0x9195, 0x1078, 0xa0bf, 0x00c0, 0x9340, 0x6618, 0x0d7e, 0x2668, | ||
| 4139 | 0x6e04, 0x0d7f, 0xa686, 0x0707, 0x0040, 0x907b, 0x027e, 0x6218, | ||
| 4140 | 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x1078, 0x285b, 0x027f, | ||
| 4141 | 0x6007, 0x000c, 0x0078, 0x9195, 0x1078, 0x4897, 0x00c0, 0x90a9, | ||
| 4142 | 0x2001, 0xa332, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x00c0, | ||
| 4143 | 0x90b1, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0078, | ||
| 4144 | 0x9195, 0x1078, 0x4887, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, | ||
| 4145 | 0x00ff, 0xa082, 0x0006, 0x0048, 0x90f5, 0xa6b4, 0xff00, 0x8637, | ||
| 4146 | 0xa686, 0x0004, 0x0040, 0x90c8, 0xa686, 0x0006, 0x00c0, 0x907b, | ||
| 4147 | 0x1078, 0x9be1, 0x00c0, 0x90d0, 0x6007, 0x000e, 0x0078, 0x9195, | ||
| 4148 | 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, | ||
| 4149 | 0x047e, 0x1078, 0x2813, 0x047f, 0x017e, 0xa006, 0x2009, 0xa352, | ||
| 4150 | 0x210c, 0xd1a4, 0x0040, 0x90ef, 0x2009, 0x0029, 0x1078, 0x9ec0, | ||
| 4151 | 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x0d7f, 0x017f, | ||
| 4152 | 0x047f, 0x6007, 0x0001, 0x0078, 0x9195, 0x2001, 0x0001, 0x1078, | ||
| 4153 | 0x442b, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, | ||
| 4154 | 0xa305, 0x2011, 0xa890, 0x1078, 0x7e55, 0x037f, 0x027f, 0x017f, | ||
| 4155 | 0x157f, 0xa005, 0x0040, 0x9115, 0xa6b4, 0xff00, 0x8637, 0xa686, | ||
| 4156 | 0x0006, 0x0040, 0x90c8, 0x0078, 0x907b, 0x6013, 0x1900, 0x6007, | ||
| 4157 | 0x0009, 0x0078, 0x9195, 0x1078, 0x4897, 0x00c0, 0x9128, 0x2001, | ||
| 4158 | 0xa332, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x00c0, 0x9130, | ||
| 4159 | 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0078, 0x9195, | ||
| 4160 | 0x1078, 0x4887, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, | ||
| 4161 | 0xa082, 0x0006, 0x0048, 0x9178, 0xa6b4, 0xff00, 0x8637, 0xa686, | ||
| 4162 | 0x0004, 0x0040, 0x9147, 0xa686, 0x0006, 0x00c0, 0x907b, 0x1078, | ||
| 4163 | 0x9c0c, 0x00c0, 0x9153, 0x1078, 0x9afd, 0x00c0, 0x9153, 0x6007, | ||
| 4164 | 0x0010, 0x0078, 0x9195, 0x047e, 0x6418, 0xa4a0, 0x0028, 0x2424, | ||
| 4165 | 0xa4a4, 0x00ff, 0x8427, 0x047e, 0x1078, 0x2813, 0x047f, 0x017e, | ||
| 4166 | 0xa006, 0x2009, 0xa352, 0x210c, 0xd1a4, 0x0040, 0x9172, 0x2009, | ||
| 4167 | 0x0029, 0x1078, 0x9ec0, 0x6018, 0x0d7e, 0x2068, 0x6800, 0xc0e5, | ||
| 4168 | 0x6802, 0x0d7f, 0x017f, 0x047f, 0x6007, 0x0001, 0x0078, 0x9195, | ||
| 4169 | 0x1078, 0x9d45, 0x0040, 0x9185, 0xa6b4, 0xff00, 0x8637, 0xa686, | ||
| 4170 | 0x0006, 0x0040, 0x9147, 0x0078, 0x907b, 0x6013, 0x1900, 0x6007, | ||
| 4171 | 0x0009, 0x0078, 0x9195, 0x1078, 0xa0bf, 0x00c0, 0x9340, 0x1078, | ||
| 4172 | 0x9343, 0x00c0, 0x907b, 0x6007, 0x0012, 0x6003, 0x0001, 0x1078, | ||
| 4173 | 0x5c45, 0x007c, 0x6007, 0x0001, 0x6003, 0x0001, 0x1078, 0x5c45, | ||
| 4174 | 0x0078, 0x9199, 0x6007, 0x0005, 0x0078, 0x919c, 0x1078, 0xa0bf, | ||
| 4175 | 0x00c0, 0x9340, 0x1078, 0x9343, 0x00c0, 0x907b, 0x6007, 0x0020, | ||
| 4176 | 0x6003, 0x0001, 0x1078, 0x5c45, 0x007c, 0x6007, 0x0023, 0x6003, | ||
| 4177 | 0x0001, 0x1078, 0x5c45, 0x007c, 0x1078, 0xa0bf, 0x00c0, 0x9340, | ||
| 4178 | 0x1078, 0x9343, 0x00c0, 0x907b, 0x017e, 0x027e, 0x2011, 0xa890, | ||
| 4179 | 0x2214, 0x2c08, 0x1078, 0x9e8c, 0x00c0, 0x91de, 0x2160, 0x6007, | ||
| 4180 | 0x0026, 0x6013, 0x1700, 0x2011, 0xa889, 0x2214, 0xa296, 0xffff, | ||
| 4181 | 0x00c0, 0x91e3, 0x6007, 0x0025, 0x0078, 0x91e3, 0x1078, 0x753d, | ||
| 4182 | 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x1078, 0x5c45, 0x027f, | ||
| 4183 | 0x017f, 0x007c, 0x6106, 0x1078, 0x9363, 0x6007, 0x002b, 0x0078, | ||
| 4184 | 0x9195, 0x6007, 0x002c, 0x0078, 0x9195, 0x1078, 0xa0bf, 0x00c0, | ||
| 4185 | 0x9340, 0x1078, 0x9343, 0x00c0, 0x907b, 0x6106, 0x1078, 0x9368, | ||
| 4186 | 0x00c0, 0x9206, 0x6007, 0x002e, 0x0078, 0x9195, 0x6007, 0x002f, | ||
| 4187 | 0x0078, 0x9195, 0x0e7e, 0x0d7e, 0x0c7e, 0x6018, 0xa080, 0x0001, | ||
| 4188 | 0x200c, 0xa184, 0x00ff, 0xa086, 0x0006, 0x0040, 0x9223, 0xa184, | ||
| 4189 | 0xff00, 0x8007, 0xa086, 0x0006, 0x0040, 0x9223, 0x0c7f, 0x0d7f, | ||
| 4190 | 0x0e7f, 0x0078, 0x919a, 0x2001, 0xa371, 0x2004, 0xd0e4, 0x0040, | ||
| 4191 | 0x928d, 0x2071, 0xa88c, 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, | ||
| 4192 | 0x720c, 0x2001, 0xa352, 0x2004, 0xd0a4, 0x0040, 0x9241, 0x6018, | ||
| 4193 | 0x2068, 0x6810, 0xa106, 0x00c0, 0x9241, 0x6814, 0xa206, 0x0040, | ||
| 4194 | 0x9265, 0x2001, 0xa352, 0x2004, 0xd0ac, 0x00c0, 0x9281, 0x2069, | ||
| 4195 | 0xa300, 0x686c, 0xa206, 0x00c0, 0x9281, 0x6868, 0xa106, 0x00c0, | ||
| 4196 | 0x9281, 0x7210, 0x1078, 0x8a30, 0x0040, 0x9287, 0x1078, 0x9f31, | ||
| 4197 | 0x0040, 0x9287, 0x622a, 0x6007, 0x0036, 0x6003, 0x0001, 0x1078, | ||
| 4198 | 0x5bf8, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x7214, 0xa286, 0xffff, | ||
| 4199 | 0x0040, 0x9277, 0x1078, 0x8a30, 0x0040, 0x9287, 0xa280, 0x0002, | ||
| 4200 | 0x2004, 0x7110, 0xa106, 0x00c0, 0x9287, 0x0078, 0x9252, 0x7210, | ||
| 4201 | 0x2c08, 0x1078, 0x9e8c, 0x2c10, 0x2160, 0x0040, 0x9287, 0x0078, | ||
| 4202 | 0x9252, 0x6007, 0x0037, 0x6013, 0x1500, 0x0078, 0x925d, 0x6007, | ||
| 4203 | 0x0037, 0x6013, 0x1700, 0x0078, 0x925d, 0x6007, 0x0012, 0x0078, | ||
| 4204 | 0x925d, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, 0xff00, 0x8007, | ||
| 4205 | 0xa086, 0x0006, 0x00c0, 0x919a, 0x0e7e, 0x0d7e, 0x0c7e, 0x2001, | ||
| 4206 | 0xa371, 0x2004, 0xd0e4, 0x0040, 0x92fd, 0x2069, 0xa300, 0x2071, | ||
| 4207 | 0xa88c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, 0xffff, 0x00c0, | ||
| 4208 | 0x92ba, 0x7208, 0x0c7e, 0x2c08, 0x1078, 0x9e8c, 0x2c10, 0x0c7f, | ||
| 4209 | 0x0040, 0x92f1, 0x1078, 0x8a30, 0x0040, 0x92f1, 0x0c7e, 0x027e, | ||
| 4210 | 0x2260, 0x1078, 0x874a, 0x027f, 0x0c7f, 0x7118, 0xa18c, 0xff00, | ||
| 4211 | 0x810f, 0xa186, 0x0001, 0x0040, 0x92db, 0xa186, 0x0005, 0x0040, | ||
| 4212 | 0x92d5, 0xa186, 0x0007, 0x00c0, 0x92e5, 0xa280, 0x0004, 0x2004, | ||
| 4213 | 0xa005, 0x0040, 0x92e5, 0x057e, 0x7510, 0x7614, 0x1078, 0x9f46, | ||
| 4214 | 0x057f, 0x0c7f, 0x0d7f, 0x0e7f, 0x007c, 0x6007, 0x003b, 0x602b, | ||
| 4215 | 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x1078, 0x5bf8, 0x0078, | ||
| 4216 | 0x92e1, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x1700, 0x6003, | ||
| 4217 | 0x0001, 0x1078, 0x5bf8, 0x0078, 0x92e1, 0x6007, 0x003b, 0x602b, | ||
| 4218 | 0x000b, 0x6013, 0x0000, 0x0078, 0x925d, 0x0e7e, 0x027e, 0x1078, | ||
| 4219 | 0x4897, 0x0040, 0x933a, 0x1078, 0x4887, 0x1078, 0xa148, 0x00c0, | ||
| 4220 | 0x9338, 0x2071, 0xa300, 0x70c8, 0xc085, 0x70ca, 0x0f7e, 0x2079, | ||
| 4221 | 0x0100, 0x7294, 0xa284, 0x00ff, 0x706a, 0x78e6, 0xa284, 0xff00, | ||
| 4222 | 0x726c, 0xa205, 0x706e, 0x78ea, 0x0f7f, 0x70d3, 0x0000, 0x2001, | ||
| 4223 | 0xa352, 0x2004, 0xd0a4, 0x0040, 0x9331, 0x2011, 0xa5c4, 0x2013, | ||
| 4224 | 0x07d0, 0xd0ac, 0x00c0, 0x933a, 0x1078, 0x260d, 0x0078, 0x933a, | ||
| 4225 | 0x1078, 0xa178, 0x027f, 0x0e7f, 0x1078, 0x753d, 0x0078, 0x9199, | ||
| 4226 | 0x1078, 0x753d, 0x007c, 0x0d7e, 0x067e, 0x6618, 0x2668, 0x6e04, | ||
| 4227 | 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x9360, 0xa686, | ||
| 4228 | 0x0004, 0x0040, 0x9360, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, | ||
| 4229 | 0x0040, 0x9360, 0xa686, 0x0004, 0x0040, 0x9360, 0xa085, 0x0001, | ||
| 4230 | 0x067f, 0x0d7f, 0x007c, 0x0d7e, 0x1078, 0x9397, 0x0d7f, 0x007c, | ||
| 4231 | 0x0d7e, 0x1078, 0x93a6, 0x00c0, 0x9390, 0x680c, 0xa08c, 0xff00, | ||
| 4232 | 0x6820, 0xa084, 0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4, | ||
| 4233 | 0x0040, 0x937e, 0x2009, 0x0001, 0x0078, 0x938c, 0xd1ec, 0x0040, | ||
| 4234 | 0x9390, 0x6920, 0xa18c, 0x00ff, 0x6824, 0x1078, 0x24e3, 0x00c0, | ||
| 4235 | 0x9390, 0x2110, 0x2009, 0x0000, 0x1078, 0x285b, 0x0078, 0x9394, | ||
| 4236 | 0xa085, 0x0001, 0x0078, 0x9395, 0xa006, 0x0d7f, 0x007c, 0x2069, | ||
| 4237 | 0xa88d, 0x6800, 0xa082, 0x0010, 0x00c8, 0x93a4, 0x6013, 0x0000, | ||
| 4238 | 0xa085, 0x0001, 0x0078, 0x93a5, 0xa006, 0x007c, 0x6013, 0x0000, | ||
| 4239 | 0x2069, 0xa88c, 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x00c0, | ||
| 4240 | 0x93ba, 0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, 0x0040, 0x93ba, | ||
| 4241 | 0xa08e, 0x0010, 0x007c, 0x6004, 0xa0b2, 0x0044, 0x10c8, 0x1328, | ||
| 4242 | 0xa1b6, 0x0013, 0x00c0, 0x93c7, 0x2008, 0x0079, 0x93da, 0xa1b6, | ||
| 4243 | 0x0027, 0x0040, 0x93cf, 0xa1b6, 0x0014, 0x10c0, 0x1328, 0x2001, | ||
| 4244 | 0x0007, 0x1078, 0x4472, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, | ||
| 4245 | 0x6109, 0x007c, 0x941a, 0x941c, 0x941a, 0x941a, 0x941a, 0x941c, | ||
| 4246 | 0x9424, 0x94ae, 0x9471, 0x94ae, 0x9485, 0x94ae, 0x9424, 0x94ae, | ||
| 4247 | 0x94a6, 0x94ae, 0x94a6, 0x94ae, 0x94ae, 0x941a, 0x941a, 0x941a, | ||
| 4248 | 0x941a, 0x941a, 0x941a, 0x941a, 0x941a, 0x941a, 0x941a, 0x941a, | ||
| 4249 | 0x941c, 0x941a, 0x94ae, 0x941a, 0x941a, 0x94ae, 0x941a, 0x94ae, | ||
| 4250 | 0x94ae, 0x941a, 0x941a, 0x941a, 0x941a, 0x94ae, 0x94ae, 0x941a, | ||
| 4251 | 0x94ae, 0x94ae, 0x941a, 0x941a, 0x941a, 0x941a, 0x941a, 0x941c, | ||
| 4252 | 0x94ae, 0x94ae, 0x941a, 0x941a, 0x94ae, 0x94ae, 0x941a, 0x941a, | ||
| 4253 | 0x941a, 0x941a, 0x1078, 0x1328, 0x1078, 0x6010, 0x6003, 0x0002, | ||
| 4254 | 0x1078, 0x6109, 0x0078, 0x94b4, 0x0f7e, 0x2079, 0xa351, 0x7804, | ||
| 4255 | 0x0f7f, 0xd0ac, 0x00c0, 0x94ae, 0x2001, 0x0000, 0x1078, 0x442b, | ||
| 4256 | 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, 0x00ff, 0x0040, 0x94ae, | ||
| 4257 | 0x0c7e, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x00c0, 0x9448, 0x6010, | ||
| 4258 | 0xa005, 0x0040, 0x9448, 0x0c7f, 0x1078, 0x35f7, 0x0078, 0x94ae, | ||
| 4259 | 0x0c7f, 0x2001, 0xa300, 0x2004, 0xa086, 0x0002, 0x00c0, 0x9457, | ||
| 4260 | 0x0f7e, 0x2079, 0xa300, 0x788c, 0x8000, 0x788e, 0x0f7f, 0x2001, | ||
| 4261 | 0x0002, 0x1078, 0x443f, 0x1078, 0x6010, 0x601f, 0x0001, 0x6003, | ||
| 4262 | 0x0001, 0x6007, 0x0002, 0x1078, 0x5c45, 0x1078, 0x6109, 0x0c7e, | ||
| 4263 | 0x6118, 0x2160, 0x2009, 0x0001, 0x1078, 0x58e1, 0x0c7f, 0x0078, | ||
| 4264 | 0x94b4, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, 0xff00, | ||
| 4265 | 0x8637, 0xa686, 0x0006, 0x0040, 0x94ae, 0xa686, 0x0004, 0x0040, | ||
| 4266 | 0x94ae, 0x2001, 0x0004, 0x0078, 0x94ac, 0x2001, 0xa300, 0x2004, | ||
| 4267 | 0xa086, 0x0003, 0x00c0, 0x948e, 0x1078, 0x35f7, 0x2001, 0x0006, | ||
| 4268 | 0x1078, 0x94b5, 0x6618, 0x0d7e, 0x2668, 0x6e04, 0x0d7f, 0xa6b4, | ||
| 4269 | 0xff00, 0x8637, 0xa686, 0x0006, 0x0040, 0x94ae, 0x2001, 0x0006, | ||
| 4270 | 0x0078, 0x94ac, 0x2001, 0x0004, 0x0078, 0x94ac, 0x2001, 0x0006, | ||
| 4271 | 0x1078, 0x94b5, 0x0078, 0x94ae, 0x1078, 0x4472, 0x1078, 0x6010, | ||
| 4272 | 0x1078, 0x753d, 0x1078, 0x6109, 0x007c, 0x017e, 0x0d7e, 0x6118, | ||
| 4273 | 0x2168, 0x6900, 0xd184, 0x0040, 0x94d0, 0x6104, 0xa18e, 0x000a, | ||
| 4274 | 0x00c0, 0x94c8, 0x699c, 0xd1a4, 0x00c0, 0x94c8, 0x2001, 0x0007, | ||
| 4275 | 0x1078, 0x443f, 0x2001, 0x0000, 0x1078, 0x442b, 0x1078, 0x2839, | ||
| 4276 | 0x0d7f, 0x017f, 0x007c, 0x0d7e, 0x6618, 0x2668, 0x6804, 0xa084, | ||
| 4277 | 0xff00, 0x8007, 0x0d7f, 0xa0b2, 0x000c, 0x10c8, 0x1328, 0xa1b6, | ||
| 4278 | 0x0015, 0x00c0, 0x94e7, 0x1079, 0x94ee, 0x0078, 0x94ed, 0xa1b6, | ||
| 4279 | 0x0016, 0x10c0, 0x1328, 0x1079, 0x94fa, 0x007c, 0x7ad0, 0x7ad0, | ||
| 4280 | 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x9547, 0x9506, 0x7ad0, 0x7ad0, | ||
| 4281 | 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, | ||
| 4282 | 0x9547, 0x954f, 0x7ad0, 0x7ad0, 0x7ad0, 0x7ad0, 0x0f7e, 0x2079, | ||
| 4283 | 0xa351, 0x7804, 0xd0ac, 0x00c0, 0x952d, 0x6018, 0xa07d, 0x0040, | ||
| 4284 | 0x952d, 0x7800, 0xd0f4, 0x00c0, 0x9519, 0x7810, 0xa005, 0x00c0, | ||
| 4285 | 0x952d, 0x2001, 0x0000, 0x1078, 0x442b, 0x2001, 0x0002, 0x1078, | ||
| 4286 | 0x443f, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x1078, | ||
| 4287 | 0x5c45, 0x1078, 0x6109, 0x0078, 0x9545, 0x2011, 0xa883, 0x2204, | ||
| 4288 | 0x8211, 0x220c, 0x1078, 0x24e3, 0x00c0, 0x9545, 0x0c7e, 0x1078, | ||
| 4289 | 0x4501, 0x0040, 0x9540, 0x0c7f, 0x1078, 0x753d, 0x0078, 0x9545, | ||
| 4290 | 0x1078, 0x4235, 0x0c7f, 0x1078, 0x753d, 0x0f7f, 0x007c, 0x6604, | ||
| 4291 | 0xa6b6, 0x001e, 0x00c0, 0x954e, 0x1078, 0x753d, 0x007c, 0x1078, | ||
| 4292 | 0x7d0a, 0x00c0, 0x955b, 0x6003, 0x0001, 0x6007, 0x0001, 0x1078, | ||
| 4293 | 0x5c45, 0x0078, 0x955d, 0x1078, 0x753d, 0x007c, 0x6004, 0xa08a, | ||
| 4294 | 0x0044, 0x10c8, 0x1328, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, | ||
| 4295 | 0x6109, 0x007c, 0xa182, 0x0040, 0x0079, 0x956e, 0x9581, 0x9581, | ||
| 4296 | 0x9581, 0x9581, 0x9583, 0x9581, 0x9581, 0x9581, 0x9581, 0x9581, | ||
| 4297 | 0x9581, 0x9581, 0x9581, 0x9581, 0x9581, 0x9581, 0x9581, 0x9581, | ||
| 4298 | 0x9581, 0x1078, 0x1328, 0x0d7e, 0x0e7e, 0x0f7e, 0x157e, 0x047e, | ||
| 4299 | 0x027e, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0040, 0x9594, | ||
| 4300 | 0x2021, 0x0000, 0x1078, 0xa111, 0x6106, 0x2071, 0xa880, 0x7444, | ||
| 4301 | 0xa4a4, 0xff00, 0x0040, 0x95eb, 0xa486, 0x2000, 0x00c0, 0x95a6, | ||
| 4302 | 0x2009, 0x0001, 0x2011, 0x0200, 0x1078, 0x5a6d, 0x1078, 0x1381, | ||
| 4303 | 0x1040, 0x1328, 0x6003, 0x0007, 0x2d00, 0x6837, 0x010d, 0x6803, | ||
| 4304 | 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, 0x6008, 0x68b2, | ||
| 4305 | 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, 0x017e, 0xa084, | ||
| 4306 | 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, 0x1078, 0x4982, | ||
| 4307 | 0x017f, 0xa486, 0x2000, 0x00c0, 0x95d3, 0x2019, 0x0017, 0x1078, | ||
| 4308 | 0x9e3b, 0x0078, 0x9645, 0xa486, 0x0400, 0x00c0, 0x95dd, 0x2019, | ||
| 4309 | 0x0002, 0x1078, 0x9dec, 0x0078, 0x9645, 0xa486, 0x0200, 0x00c0, | ||
| 4310 | 0x95e3, 0x1078, 0x9dd1, 0xa486, 0x1000, 0x00c0, 0x95e9, 0x1078, | ||
| 4311 | 0x9e20, 0x0078, 0x9645, 0x2069, 0xa62d, 0x6a00, 0xd284, 0x0040, | ||
| 4312 | 0x969b, 0xa284, 0x0300, 0x00c0, 0x9693, 0x6804, 0xa005, 0x0040, | ||
| 4313 | 0x9683, 0x2d78, 0x6003, 0x0007, 0x1078, 0x1366, 0x0040, 0x964c, | ||
| 4314 | 0x7800, 0xd08c, 0x00c0, 0x9607, 0x7804, 0x8001, 0x7806, 0x6013, | ||
| 4315 | 0x0000, 0x6803, 0x0000, 0x6837, 0x0116, 0x683b, 0x0000, 0x6008, | ||
| 4316 | 0x68b2, 0x2c00, 0x684a, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, | ||
| 4317 | 0x6986, 0x6846, 0x6853, 0x003d, 0x7244, 0xa294, 0x0003, 0xa286, | ||
| 4318 | 0x0002, 0x00c0, 0x9627, 0x684f, 0x0040, 0x0078, 0x9631, 0xa286, | ||
| 4319 | 0x0001, 0x00c0, 0x962f, 0x684f, 0x0080, 0x0078, 0x9631, 0x684f, | ||
| 4320 | 0x0000, 0x20a9, 0x000a, 0x2001, 0xa890, 0xad90, 0x0015, 0x200c, | ||
| 4321 | 0x810f, 0x2112, 0x8000, 0x8210, 0x00f0, 0x9637, 0x200c, 0x6982, | ||
| 4322 | 0x8000, 0x200c, 0x697e, 0x1078, 0x4982, 0x027f, 0x047f, 0x157f, | ||
| 4323 | 0x0f7f, 0x0e7f, 0x0d7f, 0x007c, 0x6013, 0x0100, 0x6003, 0x0001, | ||
| 4324 | 0x6007, 0x0041, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0078, 0x9645, | ||
| 4325 | 0x2069, 0xa892, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200, 0x00c0, | ||
| 4326 | 0x9677, 0x2069, 0xa880, 0x686c, 0xa084, 0x00ff, 0x017e, 0x6110, | ||
| 4327 | 0xa18c, 0x0700, 0xa10d, 0x6112, 0x017f, 0x6003, 0x0001, 0x6007, | ||
| 4328 | 0x0043, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0078, 0x9645, 0x6013, | ||
| 4329 | 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5bf8, 0x1078, | ||
| 4330 | 0x6109, 0x0078, 0x9645, 0x6013, 0x0300, 0x0078, 0x9689, 0x6013, | ||
| 4331 | 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x1078, 0x5bf8, 0x1078, | ||
| 4332 | 0x6109, 0x0078, 0x9645, 0x6013, 0x0500, 0x0078, 0x9689, 0x6013, | ||
| 4333 | 0x0600, 0x0078, 0x9658, 0x6013, 0x0200, 0x0078, 0x9658, 0xa186, | ||
| 4334 | 0x0013, 0x00c0, 0x96b1, 0x6004, 0xa08a, 0x0040, 0x1048, 0x1328, | ||
| 4335 | 0xa08a, 0x0053, 0x10c8, 0x1328, 0xa082, 0x0040, 0x2008, 0x0079, | ||
| 4336 | 0x9725, 0xa186, 0x0051, 0x0040, 0x96be, 0xa186, 0x0047, 0x00c0, | ||
| 4337 | 0x96d7, 0x6004, 0xa086, 0x0041, 0x0040, 0x96e5, 0x2001, 0x0109, | ||
| 4338 | 0x2004, 0xd084, 0x0040, 0x96e5, 0x127e, 0x2091, 0x2200, 0x007e, | ||
| 4339 | 0x017e, 0x027e, 0x1078, 0x5ad2, 0x027f, 0x017f, 0x007f, 0x127f, | ||
| 4340 | 0x6000, 0xa086, 0x0002, 0x00c0, 0x96e5, 0x0078, 0x976a, 0xa186, | ||
| 4341 | 0x0027, 0x0040, 0x96df, 0xa186, 0x0014, 0x10c0, 0x1328, 0x6004, | ||
| 4342 | 0xa082, 0x0040, 0x2008, 0x0079, 0x96e8, 0x1078, 0x7583, 0x007c, | ||
| 4343 | 0x96fb, 0x96fd, 0x96fd, 0x96fb, 0x96fb, 0x96fb, 0x96fb, 0x96fb, | ||
| 4344 | 0x96fb, 0x96fb, 0x96fb, 0x96fb, 0x96fb, 0x96fb, 0x96fb, 0x96fb, | ||
| 4345 | 0x96fb, 0x96fb, 0x96fb, 0x1078, 0x1328, 0x1078, 0x6010, 0x1078, | ||
| 4346 | 0x6109, 0x037e, 0x0d7e, 0x6010, 0xa06d, 0x0040, 0x9722, 0xad84, | ||
| 4347 | 0xf000, 0x0040, 0x9722, 0x6003, 0x0002, 0x6018, 0x2004, 0xd0bc, | ||
| 4348 | 0x00c0, 0x9722, 0x2019, 0x0004, 0x1078, 0x9e70, 0x6013, 0x0000, | ||
| 4349 | 0x6014, 0xa005, 0x00c0, 0x9720, 0x2001, 0xa5a1, 0x2004, 0x6016, | ||
| 4350 | 0x6003, 0x0007, 0x0d7f, 0x037f, 0x007c, 0x9738, 0x9757, 0x9741, | ||
| 4351 | 0x9764, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, | ||
| 4352 | 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, 0x9738, | ||
| 4353 | 0x1078, 0x1328, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, | ||
| 4354 | 0x200a, 0x1078, 0x6010, 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, | ||
| 4355 | 0x0040, 0x9752, 0x6003, 0x0007, 0x2009, 0x0043, 0x1078, 0x756c, | ||
| 4356 | 0x0078, 0x9754, 0x6003, 0x0002, 0x1078, 0x6109, 0x007c, 0x1078, | ||
| 4357 | 0x6010, 0x1078, 0xa0c6, 0x00c0, 0x9761, 0x1078, 0x5a41, 0x1078, | ||
| 4358 | 0x753d, 0x1078, 0x6109, 0x007c, 0x1078, 0x6010, 0x2009, 0x0041, | ||
| 4359 | 0x0078, 0x98c1, 0xa182, 0x0040, 0x0079, 0x976e, 0x9781, 0x9783, | ||
| 4360 | 0x9781, 0x9781, 0x9781, 0x9781, 0x9781, 0x9784, 0x9781, 0x9781, | ||
| 4361 | 0x9781, 0x9781, 0x9781, 0x9781, 0x9781, 0x9781, 0x9781, 0x978f, | ||
| 4362 | 0x9781, 0x1078, 0x1328, 0x007c, 0x6003, 0x0004, 0x6110, 0x20e1, | ||
| 4363 | 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x1078, 0x15ec, 0x007c, 0x0d7e, | ||
| 4364 | 0x1078, 0x5a41, 0x0d7f, 0x1078, 0xa134, 0x1078, 0x753d, 0x007c, | ||
| 4365 | 0xa182, 0x0040, 0x0079, 0x979c, 0x97af, 0x97af, 0x97af, 0x97af, | ||
| 4366 | 0x97af, 0x97af, 0x97af, 0x97b1, 0x97af, 0x97b4, 0x97df, 0x97af, | ||
| 4367 | 0x97af, 0x97af, 0x97af, 0x97df, 0x97af, 0x97af, 0x97af, 0x1078, | ||
| 4368 | 0x1328, 0x1078, 0x7583, 0x007c, 0x1078, 0x60b8, 0x1078, 0x61d3, | ||
| 4369 | 0x6010, 0x0d7e, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x97ca, 0xa08c, | ||
| 4370 | 0x0003, 0xa18e, 0x0002, 0x0040, 0x97d2, 0x2009, 0x0041, 0x0d7f, | ||
| 4371 | 0x0078, 0x98c1, 0x6003, 0x0007, 0x6017, 0x0000, 0x1078, 0x5a41, | ||
| 4372 | 0x0d7f, 0x007c, 0x1078, 0xa0c6, 0x0040, 0x97d8, 0x0d7f, 0x007c, | ||
| 4373 | 0x1078, 0x5a41, 0x1078, 0x753d, 0x0d7f, 0x0078, 0x97d1, 0x037e, | ||
| 4374 | 0x1078, 0x60b8, 0x1078, 0x61d3, 0x6010, 0x0d7e, 0x2068, 0x6018, | ||
| 4375 | 0x2004, 0xd0bc, 0x0040, 0x97ff, 0x684c, 0xa084, 0x0003, 0xa086, | ||
| 4376 | 0x0002, 0x0040, 0x97fb, 0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, | ||
| 4377 | 0x6328, 0xa31b, 0x632a, 0x6003, 0x0002, 0x0078, 0x9810, 0x2019, | ||
| 4378 | 0x0004, 0x1078, 0x9e70, 0x6014, 0xa005, 0x00c0, 0x980c, 0x2001, | ||
| 4379 | 0xa5a1, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, 0x0007, | ||
| 4380 | 0x0d7f, 0x037f, 0x007c, 0xa186, 0x0013, 0x00c0, 0x9821, 0x6004, | ||
| 4381 | 0xa086, 0x0042, 0x10c0, 0x1328, 0x1078, 0x6010, 0x1078, 0x6109, | ||
| 4382 | 0x007c, 0xa186, 0x0027, 0x0040, 0x9829, 0xa186, 0x0014, 0x00c0, | ||
| 4383 | 0x9839, 0x6004, 0xa086, 0x0042, 0x10c0, 0x1328, 0x2001, 0x0007, | ||
| 4384 | 0x1078, 0x4472, 0x1078, 0x6010, 0x1078, 0x8c01, 0x1078, 0x6109, | ||
| 4385 | 0x007c, 0xa182, 0x0040, 0x0079, 0x983d, 0x9850, 0x9850, 0x9850, | ||
| 4386 | 0x9850, 0x9850, 0x9850, 0x9850, 0x9852, 0x985e, 0x9850, 0x9850, | ||
| 4387 | 0x9850, 0x9850, 0x9850, 0x9850, 0x9850, 0x9850, 0x9850, 0x9850, | ||
| 4388 | 0x1078, 0x1328, 0x037e, 0x047e, 0x20e1, 0x0005, 0x3d18, 0x3e20, | ||
| 4389 | 0x2c10, 0x1078, 0x15ec, 0x047f, 0x037f, 0x007c, 0x6010, 0x0d7e, | ||
| 4390 | 0x2068, 0x6810, 0x6a14, 0x6118, 0x210c, 0xd1bc, 0x0040, 0x987d, | ||
| 4391 | 0x6124, 0xd1f4, 0x00c0, 0x987d, 0x007e, 0x047e, 0x057e, 0x6c7c, | ||
| 4392 | 0xa422, 0x6d80, 0x2200, 0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, | ||
| 4393 | 0xa529, 0x652a, 0x057f, 0x047f, 0x007f, 0xa20d, 0x00c0, 0x9891, | ||
| 4394 | 0x684c, 0xd0fc, 0x0040, 0x9889, 0x2009, 0x0041, 0x0d7f, 0x0078, | ||
| 4395 | 0x98c1, 0x6003, 0x0007, 0x6017, 0x0000, 0x1078, 0x5a41, 0x0d7f, | ||
| 4396 | 0x007c, 0x007e, 0x0f7e, 0x2c78, 0x1078, 0x4893, 0x0f7f, 0x007f, | ||
| 4397 | 0x0040, 0x989e, 0x6003, 0x0002, 0x0d7f, 0x007c, 0x2009, 0xa30d, | ||
| 4398 | 0x210c, 0xd19c, 0x0040, 0x98a8, 0x6003, 0x0007, 0x0078, 0x98aa, | ||
| 4399 | 0x6003, 0x0006, 0x1078, 0x98b0, 0x1078, 0x5a43, 0x0d7f, 0x007c, | ||
| 4400 | 0xd2fc, 0x0040, 0x98bc, 0x8002, 0x8000, 0x8212, 0xa291, 0x0000, | ||
| 4401 | 0x2009, 0x0009, 0x0078, 0x98be, 0x2009, 0x0015, 0x6a6a, 0x6866, | ||
| 4402 | 0x007c, 0xa182, 0x0040, 0x0048, 0x98c7, 0x0079, 0x98d4, 0xa186, | ||
| 4403 | 0x0013, 0x0040, 0x98cf, 0xa186, 0x0014, 0x10c0, 0x1328, 0x6024, | ||
| 4404 | 0xd0dc, 0x1040, 0x1328, 0x007c, 0x98e7, 0x98ee, 0x98fa, 0x9906, | ||
| 4405 | 0x98e7, 0x98e7, 0x98e7, 0x9915, 0x98e7, 0x98e9, 0x98e9, 0x98e7, | ||
| 4406 | 0x98e7, 0x98e7, 0x98e7, 0x98e7, 0x98e7, 0x98e7, 0x98e7, 0x1078, | ||
| 4407 | 0x1328, 0x6024, 0xd0dc, 0x1040, 0x1328, 0x007c, 0x6003, 0x0001, | ||
| 4408 | 0x6106, 0x1078, 0x5bf8, 0x127e, 0x2091, 0x8000, 0x1078, 0x6109, | ||
| 4409 | 0x127f, 0x007c, 0x6003, 0x0001, 0x6106, 0x1078, 0x5bf8, 0x127e, | ||
| 4410 | 0x2091, 0x8000, 0x1078, 0x6109, 0x127f, 0x007c, 0x6003, 0x0003, | ||
| 4411 | 0x6106, 0x2c10, 0x1078, 0x1cab, 0x127e, 0x2091, 0x8000, 0x1078, | ||
| 4412 | 0x5c64, 0x1078, 0x61d3, 0x127f, 0x007c, 0xa016, 0x1078, 0x15ec, | ||
| 4413 | 0x007c, 0x127e, 0x2091, 0x8000, 0x037e, 0x0d7e, 0xa182, 0x0040, | ||
| 4414 | 0x1079, 0x9926, 0x0d7f, 0x037f, 0x127f, 0x007c, 0x9936, 0x9938, | ||
| 4415 | 0x994d, 0x996c, 0x9936, 0x9936, 0x9936, 0x9984, 0x9936, 0x9936, | ||
| 4416 | 0x9936, 0x9936, 0x9936, 0x9936, 0x9936, 0x9936, 0x1078, 0x1328, | ||
| 4417 | 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0040, 0x9962, 0xa09c, 0x0003, | ||
| 4418 | 0xa39e, 0x0003, 0x0040, 0x9962, 0x6003, 0x0001, 0x6106, 0x1078, | ||
| 4419 | 0x5bf8, 0x1078, 0x6109, 0x0078, 0x9987, 0x6010, 0x2068, 0x684c, | ||
| 4420 | 0xd0fc, 0x0040, 0x9962, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, | ||
| 4421 | 0x9962, 0x6003, 0x0001, 0x6106, 0x1078, 0x5bf8, 0x1078, 0x6109, | ||
| 4422 | 0x0078, 0x9987, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, 0x0004, | ||
| 4423 | 0x1078, 0x9e70, 0x0078, 0x9987, 0x6010, 0x2068, 0x684c, 0xd0fc, | ||
| 4424 | 0x0040, 0x9962, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0040, 0x9962, | ||
| 4425 | 0x6003, 0x0003, 0x6106, 0x2c10, 0x1078, 0x1cab, 0x1078, 0x5c64, | ||
| 4426 | 0x1078, 0x61d3, 0x0078, 0x9987, 0xa016, 0x1078, 0x15ec, 0x007c, | ||
| 4427 | 0x1078, 0x6010, 0x6110, 0x81ff, 0x0040, 0x9999, 0x0d7e, 0x2168, | ||
| 4428 | 0x1078, 0xa181, 0x037e, 0x2019, 0x0029, 0x1078, 0x9e70, 0x037f, | ||
| 4429 | 0x0d7f, 0x1078, 0x8c01, 0x1078, 0x6109, 0x007c, 0x1078, 0x60b8, | ||
| 4430 | 0x6110, 0x81ff, 0x0040, 0x99af, 0x0d7e, 0x2168, 0x1078, 0xa181, | ||
| 4431 | 0x037e, 0x2019, 0x0029, 0x1078, 0x9e70, 0x037f, 0x0d7f, 0x1078, | ||
| 4432 | 0x8c01, 0x1078, 0x61d3, 0x007c, 0xa182, 0x0085, 0x0079, 0x99b8, | ||
| 4433 | 0x99c1, 0x99bf, 0x99bf, 0x99cd, 0x99bf, 0x99bf, 0x99bf, 0x1078, | ||
| 4434 | 0x1328, 0x6003, 0x000b, 0x6106, 0x1078, 0x5bf8, 0x127e, 0x2091, | ||
| 4435 | 0x8000, 0x1078, 0x6109, 0x127f, 0x007c, 0x027e, 0x0e7e, 0x1078, | ||
| 4436 | 0xa0bf, 0x0040, 0x99d7, 0x1078, 0x753d, 0x0078, 0x99f3, 0x2071, | ||
| 4437 | 0xa880, 0x7224, 0x6212, 0x7220, 0x1078, 0x9d10, 0x0040, 0x99e4, | ||
| 4438 | 0x6007, 0x0086, 0x0078, 0x99ed, 0x6007, 0x0087, 0x7224, 0xa296, | ||
| 4439 | 0xffff, 0x00c0, 0x99ed, 0x6007, 0x0086, 0x6003, 0x0001, 0x1078, | ||
| 4440 | 0x5bf8, 0x1078, 0x6109, 0x0e7f, 0x027f, 0x007c, 0xa186, 0x0013, | ||
| 4441 | 0x00c0, 0x9a07, 0x6004, 0xa08a, 0x0085, 0x1048, 0x1328, 0xa08a, | ||
| 4442 | 0x008c, 0x10c8, 0x1328, 0xa082, 0x0085, 0x0079, 0x9a1e, 0xa186, | ||
| 4443 | 0x0027, 0x0040, 0x9a13, 0xa186, 0x0014, 0x0040, 0x9a13, 0x1078, | ||
| 4444 | 0x7583, 0x0078, 0x9a1d, 0x2001, 0x0007, 0x1078, 0x4472, 0x1078, | ||
| 4445 | 0x6010, 0x1078, 0x8c01, 0x1078, 0x6109, 0x007c, 0x9a25, 0x9a27, | ||
| 4446 | 0x9a27, 0x9a25, 0x9a25, 0x9a25, 0x9a25, 0x1078, 0x1328, 0x1078, | ||
| 4447 | 0x6010, 0x1078, 0x8c01, 0x1078, 0x6109, 0x007c, 0xa182, 0x0085, | ||
| 4448 | 0x1048, 0x1328, 0xa182, 0x008c, 0x10c8, 0x1328, 0xa182, 0x0085, | ||
| 4449 | 0x0079, 0x9a3a, 0x9a41, 0x9a41, 0x9a41, 0x9a43, 0x9a41, 0x9a41, | ||
| 4450 | 0x9a41, 0x1078, 0x1328, 0x007c, 0xa186, 0x0013, 0x0040, 0x9a54, | ||
| 4451 | 0xa186, 0x0014, 0x0040, 0x9a54, 0xa186, 0x0027, 0x0040, 0x9a54, | ||
| 4452 | 0x1078, 0x7583, 0x0078, 0x9a5a, 0x1078, 0x6010, 0x1078, 0x8c01, | ||
| 4453 | 0x1078, 0x6109, 0x007c, 0x037e, 0x1078, 0xa134, 0x603f, 0x0000, | ||
| 4454 | 0x2019, 0x000b, 0x1078, 0x9a6a, 0x601f, 0x0006, 0x6003, 0x0007, | ||
| 4455 | 0x037f, 0x007c, 0x127e, 0x037e, 0x2091, 0x8000, 0x087e, 0x2c40, | ||
| 4456 | 0x097e, 0x2049, 0x0000, 0x1078, 0x7058, 0x097f, 0x087f, 0x00c0, | ||
| 4457 | 0x9aa5, 0x077e, 0x2c38, 0x1078, 0x7105, 0x077f, 0x00c0, 0x9aa5, | ||
| 4458 | 0x6000, 0xa086, 0x0000, 0x0040, 0x9aa5, 0x601c, 0xa086, 0x0007, | ||
| 4459 | 0x0040, 0x9aa5, 0x0d7e, 0x6000, 0xa086, 0x0004, 0x00c0, 0x9a96, | ||
| 4460 | 0x1078, 0xa134, 0x601f, 0x0007, 0x1078, 0x1749, 0x6010, 0x2068, | ||
| 4461 | 0x1078, 0x8a44, 0x0040, 0x9a9e, 0x1078, 0x9e70, 0x0d7f, 0x6013, | ||
| 4462 | 0x0000, 0x1078, 0xa134, 0x601f, 0x0007, 0x037f, 0x127f, 0x007c, | ||
| 4463 | 0x0f7e, 0x0c7e, 0x037e, 0x157e, 0x2079, 0xa880, 0x7938, 0x783c, | ||
| 4464 | 0x1078, 0x24e3, 0x00c0, 0x9af6, 0x017e, 0x0c7e, 0x1078, 0x4501, | ||
| 4465 | 0x00c0, 0x9af6, 0x2011, 0xa890, 0xac98, 0x000a, 0x20a9, 0x0004, | ||
| 4466 | 0x1078, 0x7e55, 0x00c0, 0x9af6, 0x017f, 0x027f, 0x027e, 0x017e, | ||
| 4467 | 0x2019, 0x0029, 0x1078, 0x71e0, 0x1078, 0x5d53, 0x077e, 0x2039, | ||
| 4468 | 0x0000, 0x1078, 0x5c78, 0x077f, 0x017f, 0x077e, 0x2039, 0x0000, | ||
| 4469 | 0x1078, 0x9c38, 0x077f, 0x1078, 0x471b, 0x027e, 0x6204, 0xa294, | ||
| 4470 | 0xff00, 0x8217, 0xa286, 0x0006, 0x0040, 0x9aea, 0xa286, 0x0004, | ||
| 4471 | 0x00c0, 0x9aed, 0x62a0, 0x1078, 0x28d5, 0x027f, 0x017f, 0x1078, | ||
| 4472 | 0x4235, 0x6612, 0x6516, 0xa006, 0x0078, 0x9af8, 0x0c7f, 0x017f, | ||
| 4473 | 0x157f, 0x037f, 0x0c7f, 0x0f7f, 0x007c, 0x0c7e, 0x0d7e, 0x0e7e, | ||
| 4474 | 0x017e, 0x2009, 0xa31f, 0x2104, 0xa086, 0x0074, 0x00c0, 0x9b60, | ||
| 4475 | 0x2069, 0xa88e, 0x690c, 0xa182, 0x0100, 0x0048, 0x9b50, 0x6908, | ||
| 4476 | 0xa184, 0x8000, 0x0040, 0x9b5c, 0x6018, 0x2070, 0x7010, 0xa084, | ||
| 4477 | 0x00ff, 0x0040, 0x9b1f, 0x7000, 0xd0f4, 0x0040, 0x9b23, 0xa184, | ||
| 4478 | 0x0800, 0x0040, 0x9b5c, 0x6910, 0xa18a, 0x0001, 0x0048, 0x9b54, | ||
| 4479 | 0x6914, 0x2069, 0xa8ae, 0x6904, 0x81ff, 0x00c0, 0x9b48, 0x690c, | ||
| 4480 | 0xa182, 0x0100, 0x0048, 0x9b50, 0x6908, 0x81ff, 0x00c0, 0x9b4c, | ||
| 4481 | 0x6910, 0xa18a, 0x0001, 0x0048, 0x9b54, 0x6918, 0xa18a, 0x0001, | ||
| 4482 | 0x0048, 0x9b5c, 0x0078, 0x9b66, 0x6013, 0x0100, 0x0078, 0x9b62, | ||
| 4483 | 0x6013, 0x0300, 0x0078, 0x9b62, 0x6013, 0x0500, 0x0078, 0x9b62, | ||
| 4484 | 0x6013, 0x0700, 0x0078, 0x9b62, 0x6013, 0x0900, 0x0078, 0x9b62, | ||
| 4485 | 0x6013, 0x0b00, 0x0078, 0x9b62, 0x6013, 0x0f00, 0x0078, 0x9b62, | ||
| 4486 | 0x6013, 0x2d00, 0xa085, 0x0001, 0x0078, 0x9b67, 0xa006, 0x017f, | ||
| 4487 | 0x0e7f, 0x0d7f, 0x0c7f, 0x007c, 0x0c7e, 0x0d7e, 0x027e, 0x037e, | ||
| 4488 | 0x157e, 0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, 0xa286, 0x0006, | ||
| 4489 | 0x0040, 0x9b90, 0xa286, 0x0004, 0x0040, 0x9b90, 0xa394, 0xff00, | ||
| 4490 | 0x8217, 0xa286, 0x0006, 0x0040, 0x9b90, 0xa286, 0x0004, 0x0040, | ||
| 4491 | 0x9b90, 0x0c7e, 0x2d60, 0x1078, 0x4513, 0x0c7f, 0x0078, 0x9bcb, | ||
| 4492 | 0x2011, 0xa896, 0xad98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x7e55, | ||
| 4493 | 0x00c0, 0x9bcc, 0x2011, 0xa89a, 0xad98, 0x0006, 0x20a9, 0x0004, | ||
| 4494 | 0x1078, 0x7e55, 0x00c0, 0x9bcc, 0x047e, 0x017e, 0x6aa0, 0xa294, | ||
| 4495 | 0x00ff, 0x8227, 0xa006, 0x2009, 0xa352, 0x210c, 0xd1a4, 0x0040, | ||
| 4496 | 0x9bb8, 0x2009, 0x0029, 0x1078, 0x9ec0, 0x6800, 0xc0e5, 0x6802, | ||
| 4497 | 0x2019, 0x0029, 0x1078, 0x5d53, 0x077e, 0x2039, 0x0000, 0x1078, | ||
| 4498 | 0x5c78, 0x2c08, 0x1078, 0x9c38, 0x077f, 0x2001, 0x0007, 0x1078, | ||
| 4499 | 0x4472, 0x017f, 0x047f, 0xa006, 0x157f, 0x037f, 0x027f, 0x0d7f, | ||
| 4500 | 0x0c7f, 0x007c, 0x0d7e, 0x2069, 0xa88e, 0x6800, 0xa086, 0x0800, | ||
| 4501 | 0x0040, 0x9bde, 0x6013, 0x0000, 0x0078, 0x9bdf, 0xa006, 0x0d7f, | ||
| 4502 | 0x007c, 0x0c7e, 0x0f7e, 0x017e, 0x027e, 0x037e, 0x157e, 0x2079, | ||
| 4503 | 0xa88c, 0x7930, 0x7834, 0x1078, 0x24e3, 0x00c0, 0x9c05, 0x1078, | ||
| 4504 | 0x4501, 0x00c0, 0x9c05, 0x2011, 0xa890, 0xac98, 0x000a, 0x20a9, | ||
| 4505 | 0x0004, 0x1078, 0x7e55, 0x00c0, 0x9c05, 0x2011, 0xa894, 0xac98, | ||
| 4506 | 0x0006, 0x20a9, 0x0004, 0x1078, 0x7e55, 0x157f, 0x037f, 0x027f, | ||
| 4507 | 0x017f, 0x0f7f, 0x0c7f, 0x007c, 0x0c7e, 0x007e, 0x017e, 0x027e, | ||
| 4508 | 0x037e, 0x157e, 0x2011, 0xa883, 0x2204, 0x8211, 0x220c, 0x1078, | ||
| 4509 | 0x24e3, 0x00c0, 0x9c31, 0x1078, 0x4501, 0x00c0, 0x9c31, 0x2011, | ||
| 4510 | 0xa896, 0xac98, 0x000a, 0x20a9, 0x0004, 0x1078, 0x7e55, 0x00c0, | ||
| 4511 | 0x9c31, 0x2011, 0xa89a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x1078, | ||
| 4512 | 0x7e55, 0x157f, 0x037f, 0x027f, 0x017f, 0x007f, 0x0c7f, 0x007c, | ||
| 4513 | 0x0e7e, 0x0c7e, 0x087e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, | ||
| 4514 | 0x127e, 0x2091, 0x8000, 0x2740, 0x2029, 0xa5b4, 0x252c, 0x2021, | ||
| 4515 | 0xa5ba, 0x2424, 0x2061, 0xaa00, 0x2071, 0xa300, 0x7644, 0x7060, | ||
| 4516 | 0x81ff, 0x0040, 0x9c59, 0x8001, 0xa602, 0x00c8, 0x9cc3, 0x0078, | ||
| 4517 | 0x9c5c, 0xa606, 0x0040, 0x9cc3, 0x2100, 0xac06, 0x0040, 0x9cb9, | ||
| 4518 | 0x1078, 0x9ee5, 0x0040, 0x9cb9, 0x671c, 0xa786, 0x0001, 0x0040, | ||
| 4519 | 0x9cde, 0xa786, 0x0004, 0x0040, 0x9cde, 0xa786, 0x0007, 0x0040, | ||
| 4520 | 0x9cb9, 0x2500, 0xac06, 0x0040, 0x9cb9, 0x2400, 0xac06, 0x0040, | ||
| 4521 | 0x9cb9, 0x1078, 0x9ef9, 0x00c0, 0x9cb9, 0x88ff, 0x0040, 0x9c84, | ||
| 4522 | 0x6020, 0xa906, 0x00c0, 0x9cb9, 0x0d7e, 0x6000, 0xa086, 0x0004, | ||
| 4523 | 0x00c0, 0x9c8e, 0x017e, 0x1078, 0x1749, 0x017f, 0xa786, 0x0008, | ||
| 4524 | 0x00c0, 0x9c9d, 0x1078, 0x8c3b, 0x00c0, 0x9c9d, 0x1078, 0x7a05, | ||
| 4525 | 0x0d7f, 0x1078, 0x8c01, 0x0078, 0x9cb9, 0x6010, 0x2068, 0x1078, | ||
| 4526 | 0x8a44, 0x0040, 0x9cb6, 0xa786, 0x0003, 0x00c0, 0x9ccd, 0x6837, | ||
| 4527 | 0x0103, 0x6b4a, 0x6847, 0x0000, 0x1078, 0xa181, 0x017e, 0x1078, | ||
| 4528 | 0x8cb8, 0x1078, 0x4982, 0x017f, 0x1078, 0x8bf4, 0x0d7f, 0x1078, | ||
| 4529 | 0x8c01, 0xace0, 0x0010, 0x2001, 0xa315, 0x2004, 0xac02, 0x00c8, | ||
| 4530 | 0x9cc3, 0x0078, 0x9c4c, 0x127f, 0x027f, 0x047f, 0x057f, 0x067f, | ||
| 4531 | 0x077f, 0x087f, 0x0c7f, 0x0e7f, 0x007c, 0xa786, 0x0006, 0x00c0, | ||
| 4532 | 0x9ca7, 0xa386, 0x0005, 0x0040, 0x9cdb, 0x1078, 0xa181, 0x1078, | ||
| 4533 | 0x9e70, 0x0078, 0x9cb6, 0x0d7f, 0x0078, 0x9cb9, 0x1078, 0x9ef9, | ||
| 4534 | 0x00c0, 0x9cb9, 0x81ff, 0x0040, 0x9cb9, 0xa180, 0x0001, 0x2004, | ||
| 4535 | 0xa086, 0x0018, 0x0040, 0x9cf3, 0xa180, 0x0001, 0x2004, 0xa086, | ||
| 4536 | 0x002d, 0x00c0, 0x9cb9, 0x6000, 0xa086, 0x0002, 0x00c0, 0x9cb9, | ||
| 4537 | 0x1078, 0x8c27, 0x0040, 0x9d04, 0x1078, 0x8c3b, 0x00c0, 0x9cb9, | ||
| 4538 | 0x1078, 0x7a05, 0x0078, 0x9d0c, 0x1078, 0x2839, 0x1078, 0x8c3b, | ||
| 4539 | 0x00c0, 0x9d0c, 0x1078, 0x7a05, 0x1078, 0x8c01, 0x0078, 0x9cb9, | ||
| 4540 | 0x0c7e, 0x0e7e, 0x017e, 0x2c08, 0x2170, 0x1078, 0x9e8c, 0x017f, | ||
| 4541 | 0x0040, 0x9d1f, 0x601c, 0xa084, 0x000f, 0x1079, 0x9d22, 0x0e7f, | ||
| 4542 | 0x0c7f, 0x007c, 0x9d2a, 0x9d2a, 0x9d2a, 0x9d2a, 0x9d2a, 0x9d2a, | ||
| 4543 | 0x9d2c, 0x9d2a, 0xa006, 0x007c, 0x047e, 0x017e, 0x7018, 0xa080, | ||
| 4544 | 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, | ||
| 4545 | 0x1078, 0x9ec0, 0x017f, 0x047f, 0x037e, 0x2019, 0x0002, 0x1078, | ||
| 4546 | 0x9a6a, 0x037f, 0xa085, 0x0001, 0x007c, 0x2001, 0x0001, 0x1078, | ||
| 4547 | 0x442b, 0x157e, 0x017e, 0x027e, 0x037e, 0x20a9, 0x0004, 0x2019, | ||
| 4548 | 0xa305, 0x2011, 0xa896, 0x1078, 0x7e55, 0x037f, 0x027f, 0x017f, | ||
| 4549 | 0x157f, 0xa005, 0x007c, 0x0f7e, 0x0e7e, 0x0c7e, 0x087e, 0x077e, | ||
| 4550 | 0x067e, 0x027e, 0x127e, 0x2091, 0x8000, 0x2740, 0x2061, 0xaa00, | ||
| 4551 | 0x2079, 0x0001, 0x8fff, 0x0040, 0x9dc3, 0x2071, 0xa300, 0x7644, | ||
| 4552 | 0x7060, 0x8001, 0xa602, 0x00c8, 0x9dc3, 0x88ff, 0x0040, 0x9d7e, | ||
| 4553 | 0x2800, 0xac06, 0x00c0, 0x9db9, 0x2079, 0x0000, 0x1078, 0x9ee5, | ||
| 4554 | 0x0040, 0x9db9, 0x2400, 0xac06, 0x0040, 0x9db9, 0x671c, 0xa786, | ||
| 4555 | 0x0006, 0x00c0, 0x9db9, 0xa786, 0x0007, 0x0040, 0x9db9, 0x88ff, | ||
| 4556 | 0x00c0, 0x9d9d, 0x6018, 0xa206, 0x00c0, 0x9db9, 0x85ff, 0x0040, | ||
| 4557 | 0x9d9d, 0x6020, 0xa106, 0x00c0, 0x9db9, 0x0d7e, 0x6000, 0xa086, | ||
| 4558 | 0x0004, 0x00c0, 0x9da9, 0x1078, 0xa134, 0x601f, 0x0007, 0x1078, | ||
| 4559 | 0x1749, 0x6010, 0x2068, 0x1078, 0x8a44, 0x0040, 0x9db3, 0x047e, | ||
| 4560 | 0x1078, 0x9e70, 0x047f, 0x0d7f, 0x1078, 0x8c01, 0x88ff, 0x00c0, | ||
| 4561 | 0x9dcd, 0xace0, 0x0010, 0x2001, 0xa315, 0x2004, 0xac02, 0x00c8, | ||
| 4562 | 0x9dc3, 0x0078, 0x9d6a, 0xa006, 0x127f, 0x027f, 0x067f, 0x077f, | ||
| 4563 | 0x087f, 0x0c7f, 0x0e7f, 0x0f7f, 0x007c, 0xa8c5, 0x0001, 0x0078, | ||
| 4564 | 0x9dc4, 0x077e, 0x057e, 0x087e, 0x2041, 0x0000, 0x2029, 0x0001, | ||
| 4565 | 0x2c20, 0x2019, 0x0002, 0x6218, 0x097e, 0x2049, 0x0000, 0x1078, | ||
| 4566 | 0x7058, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, 0x7105, 0x1078, | ||
| 4567 | 0x9d5b, 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e, 0x077e, | ||
| 4568 | 0x0c7e, 0x157e, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000, | ||
| 4569 | 0x017e, 0x037e, 0x1078, 0x4501, 0x00c0, 0x9e14, 0x2c10, 0x057e, | ||
| 4570 | 0x087e, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, 0x097e, 0x2049, | ||
| 4571 | 0x0000, 0x1078, 0x7058, 0x097f, 0x087f, 0x2039, 0x0000, 0x1078, | ||
| 4572 | 0x7105, 0x1078, 0x9d5b, 0x057f, 0x037f, 0x017f, 0x8108, 0x00f0, | ||
| 4573 | 0x9df8, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, 0x027f, 0x007c, | ||
| 4574 | 0x077e, 0x057e, 0x6218, 0x087e, 0x2041, 0x0000, 0x2029, 0x0001, | ||
| 4575 | 0x2019, 0x0048, 0x097e, 0x2049, 0x0000, 0x1078, 0x7058, 0x097f, | ||
| 4576 | 0x087f, 0x2039, 0x0000, 0x1078, 0x7105, 0x2c20, 0x1078, 0x9d5b, | ||
| 4577 | 0x057f, 0x077f, 0x007c, 0x027e, 0x047e, 0x057e, 0x077e, 0x0c7e, | ||
| 4578 | 0x157e, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, 0x017e, 0x037e, | ||
| 4579 | 0x1078, 0x4501, 0x00c0, 0x9e64, 0x2c10, 0x087e, 0x2041, 0x0000, | ||
| 4580 | 0x2828, 0x047e, 0x2021, 0x0001, 0x1078, 0xa111, 0x047f, 0x097e, | ||
| 4581 | 0x2049, 0x0000, 0x1078, 0x7058, 0x097f, 0x087f, 0x2039, 0x0000, | ||
| 4582 | 0x1078, 0x7105, 0x1078, 0x9d5b, 0x037f, 0x017f, 0x8108, 0x00f0, | ||
| 4583 | 0x9e46, 0x157f, 0x0c7f, 0x077f, 0x057f, 0x047f, 0x027f, 0x007c, | ||
| 4584 | 0x017e, 0x0f7e, 0xad82, 0xca00, 0x0048, 0x9e89, 0xad82, 0xffff, | ||
| 4585 | 0x00c8, 0x9e89, 0x6800, 0xa07d, 0x0040, 0x9e86, 0x6803, 0x0000, | ||
| 4586 | 0x6b52, 0x1078, 0x4982, 0x2f68, 0x0078, 0x9e7a, 0x6b52, 0x1078, | ||
| 4587 | 0x4982, 0x0f7f, 0x017f, 0x007c, 0x0e7e, 0x047e, 0x037e, 0x2061, | ||
| 4588 | 0xaa00, 0x2071, 0xa300, 0x7444, 0x7060, 0x8001, 0xa402, 0x00c8, | ||
| 4589 | 0x9ebb, 0x2100, 0xac06, 0x0040, 0x9ead, 0x6000, 0xa086, 0x0000, | ||
| 4590 | 0x0040, 0x9ead, 0x6008, 0xa206, 0x00c0, 0x9ead, 0x6018, 0xa1a0, | ||
| 4591 | 0x0006, 0x2424, 0xa406, 0x0040, 0x9eb7, 0xace0, 0x0010, 0x2001, | ||
| 4592 | 0xa315, 0x2004, 0xac02, 0x00c8, 0x9ebb, 0x0078, 0x9e91, 0xa085, | ||
| 4593 | 0x0001, 0x0078, 0x9ebc, 0xa006, 0x037f, 0x047f, 0x0e7f, 0x007c, | ||
| 4594 | 0x0d7e, 0x007e, 0x1078, 0x1381, 0x007f, 0x1040, 0x1328, 0x6837, | ||
| 4595 | 0x010d, 0x685e, 0x027e, 0x2010, 0x1078, 0x8a30, 0x2001, 0x0000, | ||
| 4596 | 0x0040, 0x9ed6, 0x2200, 0xa080, 0x0008, 0x2004, 0x027f, 0x684a, | ||
| 4597 | 0x6956, 0x6c46, 0x684f, 0x0000, 0xa006, 0x68b2, 0x6802, 0x683a, | ||
| 4598 | 0x685a, 0x1078, 0x4982, 0x0d7f, 0x007c, 0x6700, 0xa786, 0x0000, | ||
| 4599 | 0x0040, 0x9ef8, 0xa786, 0x0001, 0x0040, 0x9ef8, 0xa786, 0x000a, | ||
| 4600 | 0x0040, 0x9ef8, 0xa786, 0x0009, 0x0040, 0x9ef8, 0xa085, 0x0001, | ||
| 4601 | 0x007c, 0x0e7e, 0x6018, 0x2070, 0x70a0, 0xa206, 0x0e7f, 0x007c, | ||
| 4602 | 0x017e, 0x6004, 0xa08e, 0x001e, 0x00c0, 0x9f1a, 0x8007, 0x6130, | ||
| 4603 | 0xa18c, 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, | ||
| 4604 | 0x601f, 0x0005, 0x2001, 0xa5a1, 0x2004, 0x6016, 0x1078, 0x5bf8, | ||
| 4605 | 0x1078, 0x6109, 0x017f, 0x007c, 0x0005, 0x0005, 0x007c, 0x6024, | ||
| 4606 | 0xd0e4, 0x0040, 0x9f30, 0xd0cc, 0x0040, 0x9f2a, 0x1078, 0x8cfa, | ||
| 4607 | 0x0078, 0x9f30, 0x1078, 0xa134, 0x1078, 0x5a41, 0x1078, 0x753d, | ||
| 4608 | 0x007c, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, 0x0079, 0x9f38, | ||
| 4609 | 0x9f41, 0x9f41, 0x9f41, 0x9f43, 0x9f41, 0x9f43, 0x9f43, 0x9f41, | ||
| 4610 | 0x9f43, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa280, 0x0007, | ||
| 4611 | 0x2004, 0xa084, 0x000f, 0x0079, 0x9f4d, 0x9f56, 0x9f56, 0x9f56, | ||
| 4612 | 0x9f56, 0x9f56, 0x9f56, 0x9f61, 0x9f56, 0x9f56, 0x6007, 0x003b, | ||
| 4613 | 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x1078, 0x5bf8, | ||
| 4614 | 0x007c, 0x0c7e, 0x2260, 0x1078, 0xa134, 0x603f, 0x0000, 0x6024, | ||
| 4615 | 0xc0f4, 0xc0cc, 0x6026, 0x0c7f, 0x0d7e, 0x2268, 0xa186, 0x0007, | ||
| 4616 | 0x00c0, 0x9fc2, 0x6810, 0xa005, 0x0040, 0x9f7f, 0xa080, 0x0013, | ||
| 4617 | 0x2004, 0xd0fc, 0x00c0, 0x9f7f, 0x0d7f, 0x0078, 0x9f56, 0x6007, | ||
| 4618 | 0x003a, 0x6003, 0x0001, 0x1078, 0x5bf8, 0x1078, 0x6109, 0x0c7e, | ||
| 4619 | 0x2d60, 0x6100, 0xa186, 0x0002, 0x00c0, 0xa050, 0x6010, 0xa005, | ||
| 4620 | 0x00c0, 0x9f99, 0x6000, 0xa086, 0x0007, 0x10c0, 0x1328, 0x0078, | ||
| 4621 | 0xa050, 0xa08c, 0xf000, 0x00c0, 0x9fa5, 0x0078, 0x9fa5, 0x2068, | ||
| 4622 | 0x6800, 0xa005, 0x00c0, 0x9f9f, 0x2d00, 0xa080, 0x0013, 0x2004, | ||
| 4623 | 0xa084, 0x0003, 0xa086, 0x0002, 0x00c0, 0x9fbe, 0x6010, 0x2068, | ||
| 4624 | 0x684c, 0xc0dc, 0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, | ||
| 4625 | 0x2009, 0x0043, 0x1078, 0x98c1, 0x0078, 0xa050, 0x2009, 0x0041, | ||
| 4626 | 0x0078, 0xa04a, 0xa186, 0x0005, 0x00c0, 0xa009, 0x6810, 0xa080, | ||
| 4627 | 0x0013, 0x2004, 0xd0bc, 0x00c0, 0x9fd0, 0x0d7f, 0x0078, 0x9f56, | ||
| 4628 | 0xd0b4, 0x0040, 0x9fd8, 0xd0fc, 0x1040, 0x1328, 0x0078, 0x9f72, | ||
| 4629 | 0x6007, 0x003a, 0x6003, 0x0001, 0x1078, 0x5bf8, 0x1078, 0x6109, | ||
| 4630 | 0x0c7e, 0x2d60, 0x6100, 0xa186, 0x0002, 0x0040, 0x9feb, 0xa186, | ||
| 4631 | 0x0004, 0x00c0, 0xa050, 0x2071, 0xa5e1, 0x7000, 0xa086, 0x0003, | ||
| 4632 | 0x00c0, 0x9ff8, 0x7004, 0xac06, 0x00c0, 0x9ff8, 0x7003, 0x0000, | ||
| 4633 | 0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, | ||
| 4634 | 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0078, | ||
| 4635 | 0xa04a, 0x037e, 0x0d7e, 0x0d7e, 0x1078, 0x1381, 0x037f, 0x1040, | ||
| 4636 | 0x1328, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, | ||
| 4637 | 0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, | ||
| 4638 | 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6018, 0xa080, 0x0028, 0x2004, | ||
| 4639 | 0xa084, 0x00ff, 0x8007, 0x6320, 0x6b4a, 0x6846, 0x684f, 0x0000, | ||
| 4640 | 0x6d6a, 0x6e66, 0x686f, 0x0001, 0x1078, 0x4982, 0x2019, 0x0045, | ||
| 4641 | 0x6008, 0x2068, 0x1078, 0x9a6a, 0x2d00, 0x600a, 0x601f, 0x0006, | ||
| 4642 | 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000, 0x0d7f, 0x037f, | ||
| 4643 | 0x0078, 0xa051, 0x603f, 0x0000, 0x6003, 0x0007, 0x1078, 0x98c1, | ||
| 4644 | 0x0c7f, 0x0d7f, 0x007c, 0xa186, 0x0013, 0x00c0, 0xa05d, 0x6004, | ||
| 4645 | 0xa082, 0x0085, 0x2008, 0x0079, 0xa077, 0xa186, 0x0027, 0x00c0, | ||
| 4646 | 0xa070, 0x1078, 0x6010, 0x037e, 0x0d7e, 0x6010, 0x2068, 0x2019, | ||
| 4647 | 0x0004, 0x1078, 0x9e70, 0x0d7f, 0x037f, 0x1078, 0x6109, 0x007c, | ||
| 4648 | 0xa186, 0x0014, 0x0040, 0xa061, 0x1078, 0x7583, 0x007c, 0xa080, | ||
| 4649 | 0xa07e, 0xa07e, 0xa07e, 0xa07e, 0xa07e, 0xa080, 0x1078, 0x1328, | ||
| 4650 | 0x1078, 0x6010, 0x6003, 0x000c, 0x1078, 0x6109, 0x007c, 0xa182, | ||
| 4651 | 0x008c, 0x00c8, 0xa091, 0xa182, 0x0085, 0x0048, 0xa091, 0x0079, | ||
| 4652 | 0xa094, 0x1078, 0x7583, 0x007c, 0xa09b, 0xa09b, 0xa09b, 0xa09b, | ||
| 4653 | 0xa09d, 0xa0bc, 0xa09b, 0x1078, 0x1328, 0x0d7e, 0x2c68, 0x1078, | ||
| 4654 | 0x74d7, 0x0040, 0xa0b7, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, | ||
| 4655 | 0xa88e, 0x210c, 0x6136, 0x2009, 0xa88f, 0x210c, 0x613a, 0x600b, | ||
| 4656 | 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x1078, 0x5bf8, 0x2d60, | ||
| 4657 | 0x1078, 0x753d, 0x0d7f, 0x007c, 0x1078, 0x753d, 0x007c, 0x0e7e, | ||
| 4658 | 0x6018, 0x2070, 0x7000, 0xd0ec, 0x0e7f, 0x007c, 0x6010, 0xa080, | ||
| 4659 | 0x0013, 0x200c, 0xd1ec, 0x0040, 0xa110, 0x2001, 0xa371, 0x2004, | ||
| 4660 | 0xd0ec, 0x0040, 0xa110, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, | ||
| 4661 | 0xd1ac, 0x0040, 0xa0ee, 0x0f7e, 0x2c78, 0x1078, 0x488f, 0x0f7f, | ||
| 4662 | 0x0040, 0xa0ee, 0x2001, 0xa5a2, 0x2004, 0x603e, 0x2009, 0xa371, | ||
| 4663 | 0x210c, 0xd1f4, 0x00c0, 0xa10e, 0x0078, 0xa100, 0x2009, 0xa371, | ||
| 4664 | 0x210c, 0xd1f4, 0x0040, 0xa0fa, 0x6024, 0xc0e4, 0x6026, 0xa006, | ||
| 4665 | 0x0078, 0xa110, 0x2001, 0xa5a2, 0x200c, 0x8103, 0xa100, 0x603e, | ||
| 4666 | 0x6018, 0xa088, 0x002b, 0x2104, 0xa005, 0x0040, 0xa10b, 0xa088, | ||
| 4667 | 0x0003, 0x0078, 0xa103, 0x2c0a, 0x600f, 0x0000, 0xa085, 0x0001, | ||
| 4668 | 0x007c, 0x017e, 0x0c7e, 0x0e7e, 0x6120, 0xa2f0, 0x002b, 0x2e04, | ||
| 4669 | 0x2060, 0x8cff, 0x0040, 0xa130, 0x84ff, 0x00c0, 0xa123, 0x6020, | ||
| 4670 | 0xa106, 0x00c0, 0xa12b, 0x600c, 0x2072, 0x1078, 0x5a41, 0x1078, | ||
| 4671 | 0x753d, 0x0078, 0xa12d, 0xacf0, 0x0003, 0x2e64, 0x0078, 0xa119, | ||
| 4672 | 0x0e7f, 0x0c7f, 0x017f, 0x007c, 0x0d7e, 0x6018, 0xa0e8, 0x002b, | ||
| 4673 | 0x2d04, 0xa005, 0x0040, 0xa146, 0xac06, 0x0040, 0xa144, 0x2d04, | ||
| 4674 | 0xa0e8, 0x0003, 0x0078, 0xa138, 0x600c, 0x206a, 0x0d7f, 0x007c, | ||
| 4675 | 0x027e, 0x037e, 0x157e, 0x2011, 0xa325, 0x2204, 0xa084, 0x00ff, | ||
| 4676 | 0x2019, 0xa88e, 0x2334, 0xa636, 0x00c0, 0xa174, 0x8318, 0x2334, | ||
| 4677 | 0x2204, 0xa084, 0xff00, 0xa636, 0x00c0, 0xa174, 0x2011, 0xa890, | ||
| 4678 | 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x1078, 0x7e55, 0x00c0, | ||
| 4679 | 0xa174, 0x2011, 0xa894, 0x6018, 0xa098, 0x0006, 0x20a9, 0x0004, | ||
| 4680 | 0x1078, 0x7e55, 0x00c0, 0xa174, 0x157f, 0x037f, 0x027f, 0x007c, | ||
| 4681 | 0x0e7e, 0x2071, 0xa300, 0x1078, 0x41f5, 0x1078, 0x260d, 0x0e7f, | ||
| 4682 | 0x007c, 0x0e7e, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0040, 0xa18a, | ||
| 4683 | 0x1078, 0xa18c, 0x0e7f, 0x007c, 0x6850, 0xc0e5, 0x6852, 0x007c, | ||
| 4684 | 0x0e7e, 0x0c7e, 0x077e, 0x067e, 0x057e, 0x047e, 0x027e, 0x017e, | ||
| 4685 | 0x127e, 0x2091, 0x8000, 0x2029, 0xa5b4, 0x252c, 0x2021, 0xa5ba, | ||
| 4686 | 0x2424, 0x2061, 0xaa00, 0x2071, 0xa300, 0x7644, 0x7060, 0xa606, | ||
| 4687 | 0x0040, 0xa1e4, 0x671c, 0xa786, 0x0001, 0x0040, 0xa1b3, 0xa786, | ||
| 4688 | 0x0008, 0x00c0, 0xa1da, 0x2500, 0xac06, 0x0040, 0xa1da, 0x2400, | ||
| 4689 | 0xac06, 0x0040, 0xa1da, 0x1078, 0x9ee5, 0x0040, 0xa1da, 0x1078, | ||
| 4690 | 0x9ef9, 0x00c0, 0xa1da, 0x6000, 0xa086, 0x0004, 0x00c0, 0xa1cc, | ||
| 4691 | 0x017e, 0x1078, 0x1749, 0x017f, 0x1078, 0x8c27, 0x00c0, 0xa1d2, | ||
| 4692 | 0x1078, 0x2839, 0x1078, 0x8c3b, 0x00c0, 0xa1d8, 0x1078, 0x7a05, | ||
| 4693 | 0x1078, 0x8c01, 0xace0, 0x0010, 0x2001, 0xa315, 0x2004, 0xac02, | ||
| 4694 | 0x00c8, 0xa1e4, 0x0078, 0xa1a3, 0x127f, 0x017f, 0x027f, 0x047f, | ||
| 4695 | 0x057f, 0x067f, 0x077f, 0x0c7f, 0x0e7f, 0x007c, 0x127e, 0x007e, | ||
| 4696 | 0x0e7e, 0x2091, 0x8000, 0x2071, 0xa340, 0xd5a4, 0x0040, 0xa1fb, | ||
| 4697 | 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0040, 0xa201, 0x7030, 0x8000, | ||
| 4698 | 0x7032, 0xd5ac, 0x0040, 0xa208, 0x2071, 0xa34a, 0x1078, 0xa237, | ||
| 4699 | 0x0e7f, 0x007f, 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, | ||
| 4700 | 0x8000, 0x2071, 0xa340, 0xd5a4, 0x0040, 0xa219, 0x7034, 0x8000, | ||
| 4701 | 0x7036, 0xd5b4, 0x0040, 0xa21f, 0x7030, 0x8000, 0x7032, 0xd5ac, | ||
| 4702 | 0x0040, 0xa226, 0x2071, 0xa34a, 0x1078, 0xa237, 0x0e7f, 0x007f, | ||
| 4703 | 0x127f, 0x007c, 0x127e, 0x007e, 0x0e7e, 0x2091, 0x8000, 0x2071, | ||
| 4704 | 0xa342, 0x1078, 0xa237, 0x0e7f, 0x007f, 0x127f, 0x007c, 0x2e04, | ||
| 4705 | 0x8000, 0x2072, 0x00c8, 0xa240, 0x8e70, 0x2e04, 0x8000, 0x2072, | ||
| 4706 | 0x007c, 0x0e7e, 0x2071, 0xa340, 0x1078, 0xa237, 0x0e7f, 0x007c, | ||
| 4707 | 0x0e7e, 0x2071, 0xa344, 0x1078, 0xa237, 0x0e7f, 0x007c, 0x0001, | ||
| 4708 | 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, | ||
| 4709 | 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x6286 | ||
| 4710 | }; | ||
| 4711 | |||
| 4712 | /************************************************************************ | ||
| 4713 | * * | ||
| 4714 | * --- ISP2200 Initiator/Target Firmware --- * | ||
| 4715 | * with Fabric (Public Loop), Point-point, and * | ||
| 4716 | * expanded LUN addressing for FCTAPE * | ||
| 4717 | * * | ||
| 4718 | ************************************************************************ | ||
| 4719 | Copyright (C) 2000 and 2100 Qlogic Corporation | ||
| 4720 | (www.qlogic.com) | ||
| 4721 | |||
| 4722 | This program is distributed in the hope that it will be useful, but | ||
| 4723 | WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 4724 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 4725 | General Public License for more details. | ||
| 4726 | ************************************************************************/ | ||
| 4727 | |||
| 4728 | /* | ||
| 4729 | * Firmware Version 2.01.27 (11:07 Dec 18, 2000) | ||
| 4730 | */ | ||
| 4731 | |||
| 4732 | static unsigned short risc_code_length2200 = 0x9cbf; | ||
| 4733 | static unsigned short risc_code2200[] = { | ||
| 4734 | 0x0470, 0x0000, 0x0000, 0x9cbf, 0x0000, 0x0002, 0x0001, 0x001b, | ||
| 4735 | 0x0017, 0x2043, 0x4f50, 0x5952, 0x4947, 0x4854, 0x2031, 0x3939, | ||
| 4736 | 0x3920, 0x514c, 0x4f47, 0x4943, 0x2043, 0x4f52, 0x504f, 0x5241, | ||
| 4737 | 0x5449, 0x4f4e, 0x2049, 0x5350, 0x3232, 0x3030, 0x2046, 0x6972, | ||
| 4738 | 0x6d77, 0x6172, 0x6520, 0x2056, 0x6572, 0x7369, 0x6f6e, 0x2030, | ||
| 4739 | 0x322e, 0x3031, 0x2e32, 0x3720, 0x2020, 0x2020, 0x2400, 0x20c1, | ||
| 4740 | 0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xb1ff, 0x2091, | ||
| 4741 | 0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x27b5, | ||
| 4742 | 0x2051, 0xad00, 0x2a70, 0x2029, 0xe400, 0x2031, 0xffff, 0x2039, | ||
| 4743 | 0xe3e9, 0x2021, 0x0200, 0x0804, 0x1449, 0x20a1, 0xacbf, 0xa00e, | ||
| 4744 | 0x20a9, 0x0741, 0x41a4, 0x3400, 0x755e, 0x7662, 0x775a, 0x7466, | ||
| 4745 | 0x746a, 0x20a1, 0xb400, 0x7160, 0x810d, 0x810d, 0x810d, 0x810d, | ||
| 4746 | 0xa18c, 0x000f, 0x2001, 0x000b, 0xa112, 0xa00e, 0x21a8, 0x41a4, | ||
| 4747 | 0x3400, 0x8211, 0x1dd8, 0x7160, 0x3400, 0xa102, 0x0120, 0x0218, | ||
| 4748 | 0x20a8, 0xa00e, 0x41a4, 0x3800, 0xd08c, 0x01d8, 0x2009, 0xad00, | ||
| 4749 | 0x810d, 0x810d, 0x810d, 0x810d, 0xa18c, 0x000f, 0x2001, 0x0001, | ||
| 4750 | 0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0, | ||
| 4751 | 0x2009, 0xad00, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e, | ||
| 4752 | 0x41a4, 0x080c, 0x13fc, 0x080c, 0x1613, 0x080c, 0x17ac, 0x080c, | ||
| 4753 | 0x1e67, 0x080c, 0x492e, 0x080c, 0x801a, 0x080c, 0x159c, 0x080c, | ||
| 4754 | 0x2ce6, 0x080c, 0x5a01, 0x080c, 0x5045, 0x080c, 0x6487, 0x080c, | ||
| 4755 | 0x236a, 0x080c, 0x6686, 0x080c, 0x5fae, 0x080c, 0x226b, 0x080c, | ||
| 4756 | 0x2338, 0x2091, 0x3009, 0x7823, 0x0000, 0x1004, 0x10c5, 0x7820, | ||
| 4757 | 0xa086, 0x0002, 0x1150, 0x7823, 0x4000, 0x0e04, 0x10bd, 0x781b, | ||
| 4758 | 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x2a70, 0x7003, 0x0000, | ||
| 4759 | 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3c98, 0x080c, | ||
| 4760 | 0x2d0d, 0x080c, 0x5a4f, 0x080c, 0x51f4, 0x080c, 0x64a2, 0x0c80, | ||
| 4761 | 0x000b, 0x0c98, 0x10e4, 0x10e5, 0x1203, 0x10e2, 0x12cc, 0x13f9, | ||
| 4762 | 0x13fa, 0x13fb, 0x080c, 0x14f6, 0x0005, 0x0126, 0x00f6, 0x2091, | ||
| 4763 | 0x8000, 0x7000, 0xa086, 0x0001, 0x1904, 0x11d1, 0x080c, 0x1569, | ||
| 4764 | 0x080c, 0x574f, 0x0150, 0x080c, 0x5775, 0x1580, 0x2079, 0x0100, | ||
| 4765 | 0x7828, 0xa085, 0x1800, 0x782a, 0x0448, 0x080c, 0x569a, 0x7000, | ||
| 4766 | 0xa086, 0x0001, 0x1904, 0x11d1, 0x7088, 0xa086, 0x0028, 0x1904, | ||
| 4767 | 0x11d1, 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0xa295, 0x1e2f, | ||
| 4768 | 0x7a2a, 0x2011, 0x566e, 0x080c, 0x650d, 0x2011, 0x567b, 0x080c, | ||
| 4769 | 0x650d, 0x2011, 0x481b, 0x080c, 0x650d, 0x2011, 0x8030, 0x2019, | ||
| 4770 | 0x0000, 0x7087, 0x0000, 0x080c, 0x1d0f, 0x00e8, 0x080c, 0x41d1, | ||
| 4771 | 0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11d1, 0x2011, 0x481b, | ||
| 4772 | 0x080c, 0x650d, 0x2011, 0x567b, 0x080c, 0x650d, 0x080c, 0x1d0f, | ||
| 4773 | 0x2001, 0xaf8c, 0x2004, 0x780e, 0x7840, 0xa084, 0xfffb, 0x7842, | ||
| 4774 | 0x2011, 0x8010, 0x73c8, 0x080c, 0x3c5c, 0x7238, 0xc284, 0x723a, | ||
| 4775 | 0x2001, 0xad0c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x79bd, 0x2011, | ||
| 4776 | 0x0004, 0x080c, 0x959c, 0x080c, 0x4f71, 0x080c, 0x574f, 0x0158, | ||
| 4777 | 0x080c, 0x4917, 0x0140, 0x7087, 0x0001, 0x70c3, 0x0000, 0x080c, | ||
| 4778 | 0x436e, 0x0804, 0x11d1, 0x080c, 0x502d, 0x0120, 0x7a0c, 0xc2b4, | ||
| 4779 | 0x7a0e, 0x0050, 0x080c, 0x9937, 0x70d0, 0xd09c, 0x1128, 0x709c, | ||
| 4780 | 0xa005, 0x0110, 0x080c, 0x48f5, 0x70db, 0x0000, 0x70d7, 0x0000, | ||
| 4781 | 0x72d0, 0x080c, 0x574f, 0x1178, 0x2011, 0x0000, 0x0016, 0x080c, | ||
| 4782 | 0x2744, 0x2019, 0xaf8e, 0x211a, 0x001e, 0x704f, 0xffff, 0x7053, | ||
| 4783 | 0x00ef, 0x7073, 0x0000, 0x2079, 0xad51, 0x7804, 0xd0ac, 0x0108, | ||
| 4784 | 0xc295, 0x72d2, 0x080c, 0x574f, 0x0118, 0xa296, 0x0004, 0x0508, | ||
| 4785 | 0x2011, 0x0001, 0x080c, 0x959c, 0x7097, 0x0000, 0x709b, 0xffff, | ||
| 4786 | 0x7003, 0x0002, 0x00fe, 0x080c, 0x28fa, 0x2011, 0x0005, 0x080c, | ||
| 4787 | 0x7adf, 0x080c, 0x6c50, 0x080c, 0x574f, 0x0148, 0x00c6, 0x2061, | ||
| 4788 | 0x0100, 0x0016, 0x080c, 0x2744, 0x61e2, 0x001e, 0x00ce, 0x012e, | ||
| 4789 | 0x00d0, 0x7097, 0x0000, 0x709b, 0xffff, 0x7003, 0x0002, 0x2011, | ||
| 4790 | 0x0005, 0x080c, 0x7adf, 0x080c, 0x6c50, 0x080c, 0x574f, 0x0148, | ||
| 4791 | 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2744, 0x61e2, 0x001e, | ||
| 4792 | 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x574f, 0x1118, | ||
| 4793 | 0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x574f, 0x1118, | ||
| 4794 | 0x2009, 0x0000, 0x0010, 0x2009, 0x007e, 0x0016, 0x0026, 0x0036, | ||
| 4795 | 0x2110, 0x0026, 0x2019, 0x0029, 0x080c, 0x7cf4, 0x002e, 0x080c, | ||
| 4796 | 0xac07, 0x003e, 0x002e, 0x001e, 0x080c, 0x2bc9, 0x8108, 0x1f04, | ||
| 4797 | 0x11e5, 0x00ce, 0x706f, 0x0000, 0x7070, 0xa084, 0x00ff, 0x7072, | ||
| 4798 | 0x709f, 0x0000, 0x0005, 0x0126, 0x2091, 0x8000, 0x7000, 0xa086, | ||
| 4799 | 0x0002, 0x1904, 0x12ca, 0x7098, 0xa086, 0xffff, 0x0130, 0x080c, | ||
| 4800 | 0x28fa, 0x080c, 0x6c50, 0x0804, 0x12ca, 0x70d0, 0xd0ac, 0x1110, | ||
| 4801 | 0xd09c, 0x0540, 0xd084, 0x0530, 0x0006, 0x0016, 0x2001, 0x0103, | ||
| 4802 | 0x2009, 0xaf8c, 0x210c, 0x2102, 0x001e, 0x000e, 0xd08c, 0x01d0, | ||
| 4803 | 0x70d4, 0xa086, 0xffff, 0x0190, 0x080c, 0x2a56, 0x080c, 0x6c50, | ||
| 4804 | 0x70d0, 0xd094, 0x1904, 0x12ca, 0x2011, 0x0001, 0x2019, 0x0000, | ||
| 4805 | 0x080c, 0x2a8c, 0x080c, 0x6c50, 0x0804, 0x12ca, 0x70d8, 0xa005, | ||
| 4806 | 0x1904, 0x12ca, 0x7094, 0xa005, 0x1904, 0x12ca, 0x70d0, 0xd0a4, | ||
| 4807 | 0x0118, 0xd0b4, 0x0904, 0x12ca, 0x080c, 0x502d, 0x1904, 0x12ca, | ||
| 4808 | 0x2001, 0xad52, 0x2004, 0xd0ac, 0x01c8, 0x0156, 0x00c6, 0x20a9, | ||
| 4809 | 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4cdc, 0x1118, 0x6000, | ||
| 4810 | 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x125b, 0x00ce, 0x015e, | ||
| 4811 | 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x12ca, 0x0006, 0x0016, | ||
| 4812 | 0x2001, 0x0103, 0x2009, 0xaf8c, 0x210c, 0x2102, 0x001e, 0x000e, | ||
| 4813 | 0xa006, 0x2009, 0x0700, 0x20a9, 0x0002, 0x20a1, 0xafb5, 0x40a1, | ||
| 4814 | 0x706c, 0x8007, 0x7170, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x2009, | ||
| 4815 | 0x0000, 0x080c, 0x14dc, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, | ||
| 4816 | 0x40a1, 0xa006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x20a1, 0xafc5, | ||
| 4817 | 0x40a1, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x709b, 0xffff, | ||
| 4818 | 0x080c, 0x1562, 0xa006, 0x080c, 0x261e, 0x080c, 0x3cce, 0x00f6, | ||
| 4819 | 0x2079, 0x0100, 0x080c, 0x5775, 0x0150, 0x080c, 0x574f, 0x7828, | ||
| 4820 | 0x0118, 0xa084, 0xe1ff, 0x0010, 0xa084, 0xffdf, 0x782a, 0x00fe, | ||
| 4821 | 0x2001, 0xafc8, 0x2004, 0xa086, 0x0005, 0x1120, 0x2011, 0x0000, | ||
| 4822 | 0x080c, 0x7adf, 0x2011, 0x0000, 0x080c, 0x7ae9, 0x080c, 0x6c50, | ||
| 4823 | 0x080c, 0x6d0d, 0x012e, 0x0005, 0x0016, 0x0046, 0x00f6, 0x0126, | ||
| 4824 | 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0xad33, 0x2104, 0xa005, | ||
| 4825 | 0x1110, 0x080c, 0x2770, 0x2009, 0x00f7, 0x080c, 0x48de, 0x7940, | ||
| 4826 | 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, | ||
| 4827 | 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, | ||
| 4828 | 0xd1ac, 0x1904, 0x133a, 0x080c, 0x5761, 0x0158, 0x080c, 0x5775, | ||
| 4829 | 0x1128, 0x2001, 0xaf9d, 0x2003, 0x0000, 0x0070, 0x080c, 0x5757, | ||
| 4830 | 0x0dc0, 0x2001, 0xaf9d, 0x2003, 0xaaaa, 0x2001, 0xaf9e, 0x2003, | ||
| 4831 | 0x0001, 0x080c, 0x569a, 0x0058, 0x080c, 0x574f, 0x0140, 0x2009, | ||
| 4832 | 0x00f8, 0x080c, 0x48de, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, | ||
| 4833 | 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x574f, 0x0138, 0x7824, | ||
| 4834 | 0xd0ac, 0x1904, 0x13e0, 0x1f04, 0x1319, 0x0070, 0x7824, 0x080c, | ||
| 4835 | 0x576b, 0x0118, 0xd0ac, 0x1904, 0x13e0, 0xa084, 0x1800, 0x0d98, | ||
| 4836 | 0x7003, 0x0001, 0x0804, 0x13e0, 0x2001, 0x0001, 0x080c, 0x261e, | ||
| 4837 | 0x0804, 0x13ef, 0x7850, 0xa084, 0x0180, 0x7852, 0x782f, 0x0020, | ||
| 4838 | 0x20a9, 0x0046, 0x1d04, 0x1342, 0x2091, 0x6000, 0x1f04, 0x1342, | ||
| 4839 | 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852, 0x782f, 0x0000, | ||
| 4840 | 0x080c, 0x5761, 0x0158, 0x080c, 0x5775, 0x1128, 0x2001, 0xaf9d, | ||
| 4841 | 0x2003, 0x0000, 0x0070, 0x080c, 0x5757, 0x0dc0, 0x2001, 0xaf9d, | ||
| 4842 | 0x2003, 0xaaaa, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x080c, 0x569a, | ||
| 4843 | 0x0020, 0x2009, 0x00f8, 0x080c, 0x48de, 0x20a9, 0x000e, 0xe000, | ||
| 4844 | 0x1f04, 0x136f, 0x7850, 0xa084, 0x0180, 0xa085, 0x1400, 0x7852, | ||
| 4845 | 0x080c, 0x574f, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, | ||
| 4846 | 0xe678, 0x2019, 0xea60, 0x7820, 0xd09c, 0x1558, 0x080c, 0x574f, | ||
| 4847 | 0x05b8, 0x7824, 0xd0ac, 0x1904, 0x13e0, 0x080c, 0x5775, 0x1508, | ||
| 4848 | 0x0046, 0x2021, 0x0190, 0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, | ||
| 4849 | 0x7827, 0x0048, 0x20a9, 0x01f4, 0x1d04, 0x139c, 0x2091, 0x6000, | ||
| 4850 | 0x1f04, 0x139c, 0x7824, 0xa084, 0x0068, 0x15a8, 0x2001, 0xaf9d, | ||
| 4851 | 0x2003, 0xaaaa, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x7003, 0x0001, | ||
| 4852 | 0x0478, 0x8319, 0x1980, 0x2009, 0xad33, 0x2104, 0x8000, 0x200a, | ||
| 4853 | 0xa084, 0xfff0, 0x0120, 0x200b, 0x0000, 0x080c, 0x2770, 0x00d8, | ||
| 4854 | 0x080c, 0x5761, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c, 0x5726, | ||
| 4855 | 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000, 0x7824, | ||
| 4856 | 0x080c, 0x576b, 0x0110, 0xd0ac, 0x1158, 0xa084, 0x1800, 0x09c8, | ||
| 4857 | 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x261e, 0x0048, | ||
| 4858 | 0x2001, 0xad33, 0x2003, 0x0000, 0x7827, 0x0048, 0x7828, 0xc09d, | ||
| 4859 | 0x782a, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852, 0x015e, | ||
| 4860 | 0x003e, 0x000e, 0x080c, 0x1539, 0x012e, 0x00fe, 0x004e, 0x001e, | ||
| 4861 | 0x0005, 0x0005, 0x0005, 0x0005, 0x2a70, 0x2001, 0xaf9d, 0x2003, | ||
| 4862 | 0x0000, 0x7087, 0x0000, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, | ||
| 4863 | 0x0218, 0x704f, 0xffff, 0x0010, 0x704f, 0x0000, 0x7057, 0xffff, | ||
| 4864 | 0x706f, 0x0000, 0x7073, 0x0000, 0x080c, 0x9937, 0x2061, 0xaf8d, | ||
| 4865 | 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, | ||
| 4866 | 0x6013, 0x00ff, 0x6017, 0x0003, 0x601b, 0x0000, 0x601f, 0x07d0, | ||
| 4867 | 0x2061, 0xaf95, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, | ||
| 4868 | 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x0000, 0x601b, 0x0001, | ||
| 4869 | 0x601f, 0x0000, 0x2061, 0xafa6, 0x6003, 0x514c, 0x6007, 0x4f47, | ||
| 4870 | 0x600b, 0x4943, 0x600f, 0x2020, 0x2001, 0xad27, 0x2003, 0x0000, | ||
| 4871 | 0x0005, 0x04a0, 0x2011, 0x0000, 0x81ff, 0x0570, 0xa186, 0x0001, | ||
| 4872 | 0x1148, 0x2031, 0x8fff, 0x2039, 0xcc01, 0x2021, 0x0100, 0x2029, | ||
| 4873 | 0xcc00, 0x00e8, 0xa186, 0x0002, 0x1118, 0x2011, 0x0000, 0x00b8, | ||
| 4874 | 0xa186, 0x0005, 0x1118, 0x2011, 0x0001, 0x0088, 0xa186, 0x0009, | ||
| 4875 | 0x1118, 0x2011, 0x0002, 0x0058, 0xa186, 0x000a, 0x1118, 0x2011, | ||
| 4876 | 0x0002, 0x0028, 0xa186, 0x0055, 0x1110, 0x2011, 0x0003, 0x3800, | ||
| 4877 | 0xa084, 0xfffc, 0xa205, 0x20c0, 0x0804, 0x104d, 0xa00e, 0x2011, | ||
| 4878 | 0x0003, 0x2019, 0x1485, 0x0804, 0x14d6, 0x2019, 0xaaaa, 0x2061, | ||
| 4879 | 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000, 0x2c04, 0xa306, 0x2262, | ||
| 4880 | 0x1110, 0xc1b5, 0xc1a5, 0x2011, 0x0000, 0x2019, 0x1498, 0x04f0, | ||
| 4881 | 0x2019, 0xaaaa, 0x2061, 0xffff, 0x2c14, 0x2362, 0xe000, 0xe000, | ||
| 4882 | 0x2c1c, 0x2061, 0x7fff, 0xe000, 0xe000, 0x2c04, 0x2061, 0xffff, | ||
| 4883 | 0x2262, 0xa306, 0x0110, 0xc18d, 0x0008, 0xc185, 0x2011, 0x0002, | ||
| 4884 | 0x2019, 0x14b3, 0x0418, 0x2061, 0xffff, 0x2019, 0xaaaa, 0x2c14, | ||
| 4885 | 0x2362, 0xe000, 0xe000, 0x2c04, 0x2262, 0xa306, 0x1180, 0x2c14, | ||
| 4886 | 0x2362, 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0x2c04, 0x2061, | ||
| 4887 | 0xffff, 0x2262, 0xa306, 0x1110, 0xc195, 0x0008, 0xc19d, 0x2011, | ||
| 4888 | 0x0001, 0x2019, 0x14d4, 0x0010, 0x0804, 0x144a, 0x3800, 0xa084, | ||
| 4889 | 0xfffc, 0xa205, 0x20c0, 0x0837, 0x2011, 0x0000, 0x080c, 0x4cdc, | ||
| 4890 | 0x1178, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0128, 0xa0c4, | ||
| 4891 | 0xff00, 0xa8c6, 0x0600, 0x1120, 0xa186, 0x0080, 0x0108, 0x8210, | ||
| 4892 | 0x8108, 0xa186, 0x0100, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, | ||
| 4893 | 0x0e04, 0x14f8, 0x0006, 0x0016, 0x2079, 0x0000, 0x7818, 0xd084, | ||
| 4894 | 0x1de8, 0x001e, 0x792e, 0x000e, 0x782a, 0x000e, 0x7826, 0x3900, | ||
| 4895 | 0x783a, 0x7823, 0x8002, 0x781b, 0x0001, 0x2091, 0x5000, 0x0126, | ||
| 4896 | 0x0156, 0x0146, 0x20a9, 0x0010, 0x20a1, 0xb0c8, 0x2091, 0x2000, | ||
| 4897 | 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2200, 0x40a1, 0x20a9, 0x0010, | ||
| 4898 | 0x2091, 0x2400, 0x40a1, 0x20a9, 0x0010, 0x2091, 0x2600, 0x40a1, | ||
| 4899 | 0x20a9, 0x0010, 0x2091, 0x2800, 0x40a1, 0x014e, 0x015e, 0x012e, | ||
| 4900 | 0x2079, 0xad00, 0x7803, 0x0005, 0x2091, 0x4080, 0x04c9, 0x0cf8, | ||
| 4901 | 0x0005, 0x0006, 0x080c, 0x1584, 0x1518, 0x00f6, 0x2079, 0xad23, | ||
| 4902 | 0x2f04, 0x8000, 0x207a, 0xa082, 0x000f, 0x0258, 0xa006, 0x207a, | ||
| 4903 | 0x2079, 0xad25, 0x2f04, 0xa084, 0x0001, 0xa086, 0x0001, 0x207a, | ||
| 4904 | 0x0070, 0x2079, 0xad25, 0x2f7c, 0x8fff, 0x1128, 0x2001, 0x0c03, | ||
| 4905 | 0x2003, 0x0040, 0x0020, 0x2001, 0x0c03, 0x2003, 0x00c0, 0x00fe, | ||
| 4906 | 0x000e, 0x0005, 0x0409, 0x1120, 0x2001, 0x0c03, 0x2003, 0x0080, | ||
| 4907 | 0x0005, 0x00d1, 0x1120, 0x2001, 0x0c03, 0x2003, 0x0040, 0x0005, | ||
| 4908 | 0x0006, 0x0091, 0x1178, 0x2001, 0x0c03, 0x2003, 0x0040, 0x2009, | ||
| 4909 | 0x0fff, 0x00a1, 0x2001, 0x0c03, 0x2003, 0x0080, 0x2009, 0x0fff, | ||
| 4910 | 0x0069, 0x0c88, 0x000e, 0x0005, 0x00c6, 0x2061, 0x0c00, 0x2c04, | ||
| 4911 | 0xa084, 0x00ff, 0xa086, 0x00aa, 0x00ce, 0x0005, 0x0156, 0x0126, | ||
| 4912 | 0xa18c, 0x0fff, 0x21a8, 0x1d04, 0x1593, 0x2091, 0x6000, 0x1f04, | ||
| 4913 | 0x1593, 0x012e, 0x015e, 0x0005, 0x2071, 0xad00, 0x715c, 0x712e, | ||
| 4914 | 0x2021, 0x0001, 0xa190, 0x0030, 0xa298, 0x0030, 0x0240, 0x7060, | ||
| 4915 | 0xa302, 0x1228, 0x220a, 0x2208, 0x2310, 0x8420, 0x0ca8, 0x3800, | ||
| 4916 | 0xd08c, 0x0148, 0x7060, 0xa086, 0xad00, 0x0128, 0x7063, 0xad00, | ||
| 4917 | 0x2011, 0x1000, 0x0c48, 0x200b, 0x0000, 0x74ae, 0x74b2, 0x0005, | ||
| 4918 | 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xad00, 0x70b0, 0xa0ea, | ||
| 4919 | 0x0010, 0x0268, 0x8001, 0x70b2, 0x702c, 0x2068, 0x2d04, 0x702e, | ||
| 4920 | 0x206b, 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e, | ||
| 4921 | 0x0cd8, 0x00e6, 0x2071, 0xad00, 0x0126, 0x2091, 0x8000, 0x70b0, | ||
| 4922 | 0x8001, 0x0260, 0x70b2, 0x702c, 0x2068, 0x2d04, 0x702e, 0x206b, | ||
| 4923 | 0x0000, 0x6807, 0x0000, 0x012e, 0x00ee, 0x0005, 0xa06e, 0x0cd8, | ||
| 4924 | 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0xad00, 0x702c, 0x206a, | ||
| 4925 | 0x2d00, 0x702e, 0x70b0, 0x8000, 0x70b2, 0x012e, 0x00ee, 0x0005, | ||
| 4926 | 0x8dff, 0x0138, 0x6804, 0x6807, 0x0000, 0x0006, 0x0c49, 0x00de, | ||
| 4927 | 0x0cb8, 0x0005, 0x00e6, 0x2071, 0xad00, 0x70b0, 0xa08a, 0x0010, | ||
| 4928 | 0xa00d, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xafec, 0x7007, 0x0000, | ||
| 4929 | 0x701b, 0x0000, 0x701f, 0x0000, 0x2071, 0x0000, 0x7010, 0xa085, | ||
| 4930 | 0x8004, 0x7012, 0x00ee, 0x0005, 0x00e6, 0x2270, 0x700b, 0x0000, | ||
| 4931 | 0x2071, 0xafec, 0x7018, 0xa088, 0xaff5, 0x220a, 0x8000, 0xa084, | ||
| 4932 | 0x0007, 0x701a, 0x7004, 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010, | ||
| 4933 | 0x0081, 0x00fe, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xafec, 0x7004, | ||
| 4934 | 0xa005, 0x1128, 0x00f6, 0x2079, 0x0010, 0x0019, 0x00fe, 0x00ee, | ||
| 4935 | 0x0005, 0x7000, 0x0002, 0x164f, 0x16b3, 0x16d0, 0x16d0, 0x7018, | ||
| 4936 | 0x711c, 0xa106, 0x1118, 0x7007, 0x0000, 0x0005, 0x00d6, 0xa180, | ||
| 4937 | 0xaff5, 0x2004, 0x700a, 0x2068, 0x8108, 0xa18c, 0x0007, 0x711e, | ||
| 4938 | 0x7803, 0x0026, 0x6824, 0x7832, 0x6828, 0x7836, 0x682c, 0x783a, | ||
| 4939 | 0x6830, 0x783e, 0x6810, 0x700e, 0x680c, 0x7016, 0x6804, 0x00de, | ||
| 4940 | 0xd084, 0x0120, 0x7007, 0x0001, 0x0029, 0x0005, 0x7007, 0x0002, | ||
| 4941 | 0x00b1, 0x0005, 0x0016, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, | ||
| 4942 | 0x0040, 0x1210, 0x2110, 0xa006, 0x700e, 0x7212, 0x8203, 0x7822, | ||
| 4943 | 0x7803, 0x0020, 0x7803, 0x0041, 0x002e, 0x001e, 0x0005, 0x0016, | ||
| 4944 | 0x0026, 0x0136, 0x0146, 0x0156, 0x7014, 0x2098, 0x20a1, 0x0014, | ||
| 4945 | 0x7803, 0x0026, 0x710c, 0x2011, 0x0040, 0xa182, 0x0040, 0x1210, | ||
| 4946 | 0x2110, 0xa006, 0x700e, 0x22a8, 0x53a6, 0x8203, 0x7822, 0x7803, | ||
| 4947 | 0x0020, 0x3300, 0x7016, 0x7803, 0x0001, 0x015e, 0x014e, 0x013e, | ||
| 4948 | 0x002e, 0x001e, 0x0005, 0x0136, 0x0146, 0x0156, 0x2099, 0xadf9, | ||
| 4949 | 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, | ||
| 4950 | 0x2091, 0x8000, 0x7803, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, | ||
| 4951 | 0x7002, 0x700b, 0xadf4, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, | ||
| 4952 | 0x0136, 0x0146, 0x0156, 0x2001, 0xae28, 0x209c, 0x20a1, 0x0014, | ||
| 4953 | 0x7803, 0x0026, 0x2001, 0xae29, 0x20ac, 0x53a6, 0x2099, 0xae2a, | ||
| 4954 | 0x20a1, 0x0018, 0x20a9, 0x0008, 0x53a3, 0x7803, 0x0020, 0x0126, | ||
| 4955 | 0x2091, 0x8000, 0x7803, 0x0001, 0x7007, 0x0004, 0x7000, 0xc08c, | ||
| 4956 | 0x7002, 0x700b, 0xae25, 0x012e, 0x015e, 0x014e, 0x013e, 0x0005, | ||
| 4957 | 0x0016, 0x00e6, 0x2071, 0xafec, 0x00f6, 0x2079, 0x0010, 0x7904, | ||
| 4958 | 0x7803, 0x0002, 0xd1fc, 0x0120, 0xa18c, 0x0700, 0x7004, 0x0023, | ||
| 4959 | 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1649, 0x1713, 0x1741, 0x176b, | ||
| 4960 | 0x179b, 0x1712, 0x0cf8, 0xa18c, 0x0700, 0x1528, 0x0136, 0x0146, | ||
| 4961 | 0x0156, 0x7014, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x7010, | ||
| 4962 | 0x20a8, 0x53a5, 0x3400, 0x7016, 0x015e, 0x014e, 0x013e, 0x700c, | ||
| 4963 | 0xa005, 0x0570, 0x7830, 0x7832, 0x7834, 0x7836, 0x080c, 0x167a, | ||
| 4964 | 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0100, 0x7007, 0x0000, | ||
| 4965 | 0x080c, 0x1649, 0x0005, 0x7008, 0xa080, 0x0002, 0x2003, 0x0200, | ||
| 4966 | 0x0ca8, 0xa18c, 0x0700, 0x1150, 0x700c, 0xa005, 0x0188, 0x7830, | ||
| 4967 | 0x7832, 0x7834, 0x7836, 0x080c, 0x168f, 0x0005, 0x7008, 0xa080, | ||
| 4968 | 0x0002, 0x2003, 0x0200, 0x7007, 0x0000, 0x080c, 0x1649, 0x0005, | ||
| 4969 | 0x00d6, 0x7008, 0x2068, 0x7830, 0x6826, 0x7834, 0x682a, 0x7838, | ||
| 4970 | 0x682e, 0x783c, 0x6832, 0x680b, 0x0100, 0x00de, 0x7007, 0x0000, | ||
| 4971 | 0x080c, 0x1649, 0x0005, 0xa18c, 0x0700, 0x1540, 0x0136, 0x0146, | ||
| 4972 | 0x0156, 0x2001, 0xadf7, 0x2004, 0xa080, 0x000d, 0x20a0, 0x2099, | ||
| 4973 | 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, 0x53a5, 0x2001, 0xadf9, | ||
| 4974 | 0x2004, 0xd0bc, 0x0148, 0x2001, 0xae02, 0x2004, 0xa080, 0x000d, | ||
| 4975 | 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, 0x014e, 0x013e, 0x7007, | ||
| 4976 | 0x0000, 0x080c, 0x5ae6, 0x080c, 0x1649, 0x0005, 0x2011, 0x8003, | ||
| 4977 | 0x080c, 0x3c5c, 0x0cf8, 0xa18c, 0x0700, 0x1148, 0x2001, 0xae27, | ||
| 4978 | 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1649, 0x0005, 0x2011, | ||
| 4979 | 0x8004, 0x080c, 0x3c5c, 0x0cf8, 0x0126, 0x2091, 0x2200, 0x2079, | ||
| 4980 | 0x0030, 0x2071, 0xaffd, 0x7003, 0x0000, 0x700f, 0xb003, 0x7013, | ||
| 4981 | 0xb003, 0x780f, 0x00f6, 0x7803, 0x0004, 0x012e, 0x0005, 0x6934, | ||
| 4982 | 0xa184, 0x0007, 0x0002, 0x17cb, 0x1809, 0x17cb, 0x17cb, 0x17cb, | ||
| 4983 | 0x17f1, 0x17d8, 0x17cf, 0xa085, 0x0001, 0x0804, 0x1823, 0x684c, | ||
| 4984 | 0xd0bc, 0x0dc8, 0x6860, 0x682e, 0x685c, 0x682a, 0x6858, 0x04c8, | ||
| 4985 | 0xa18c, 0x00ff, 0xa186, 0x001e, 0x1d70, 0x684c, 0xd0bc, 0x0d58, | ||
| 4986 | 0x6860, 0x682e, 0x685c, 0x682a, 0x6804, 0x681a, 0xa080, 0x000d, | ||
| 4987 | 0x2004, 0xa084, 0x000f, 0xa080, 0x2186, 0x2005, 0x6832, 0x6858, | ||
| 4988 | 0x0440, 0xa18c, 0x00ff, 0xa186, 0x0015, 0x19a8, 0x684c, 0xd0ac, | ||
| 4989 | 0x0990, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, | ||
| 4990 | 0xa080, 0x2186, 0x2005, 0x6832, 0xa006, 0x682e, 0x682a, 0x6858, | ||
| 4991 | 0x0080, 0x684c, 0xd0ac, 0x0904, 0x17cb, 0xa006, 0x682e, 0x682a, | ||
| 4992 | 0x6858, 0xa18c, 0x000f, 0xa188, 0x2186, 0x210d, 0x6932, 0x2d08, | ||
| 4993 | 0x691a, 0x6826, 0x684c, 0xc0dd, 0x684e, 0xa006, 0x680a, 0x697c, | ||
| 4994 | 0x6912, 0x6980, 0x6916, 0x0005, 0x20e1, 0x0007, 0x20e1, 0x2000, | ||
| 4995 | 0x2001, 0x020a, 0x2004, 0x82ff, 0x01a8, 0xa280, 0x0004, 0x00d6, | ||
| 4996 | 0x206c, 0x684c, 0xd0dc, 0x1150, 0x080c, 0x17bf, 0x0138, 0x00de, | ||
| 4997 | 0xa280, 0x0000, 0x2003, 0x0002, 0xa016, 0x0020, 0x6808, 0x8000, | ||
| 4998 | 0x680a, 0x00de, 0x0126, 0x0046, 0x0036, 0x0026, 0x2091, 0x2200, | ||
| 4999 | 0x002e, 0x003e, 0x004e, 0x7000, 0xa005, 0x01d0, 0x710c, 0x220a, | ||
| 5000 | 0x8108, 0x230a, 0x8108, 0x240a, 0x8108, 0xa182, 0xb01e, 0x0210, | ||
| 5001 | 0x2009, 0xb003, 0x710e, 0x7010, 0xa102, 0xa082, 0x0009, 0x0118, | ||
| 5002 | 0xa080, 0x001b, 0x1118, 0x2009, 0x0138, 0x200a, 0x012e, 0x0005, | ||
| 5003 | 0x7206, 0x2001, 0x1866, 0x0006, 0x2260, 0x0804, 0x197a, 0x0126, | ||
| 5004 | 0x0026, 0x0036, 0x00c6, 0x0006, 0x2091, 0x2200, 0x000e, 0x004e, | ||
| 5005 | 0x003e, 0x002e, 0x00d6, 0x00c6, 0x2460, 0x6110, 0x2168, 0x6a62, | ||
| 5006 | 0x6b5e, 0xa005, 0x0904, 0x18c8, 0x6808, 0xa005, 0x0904, 0x18ff, | ||
| 5007 | 0x7000, 0xa005, 0x1108, 0x0488, 0x700c, 0x7110, 0xa106, 0x1904, | ||
| 5008 | 0x1907, 0x7004, 0xa406, 0x1548, 0x2001, 0x0005, 0x2004, 0xd08c, | ||
| 5009 | 0x0168, 0x0046, 0x080c, 0x1a6c, 0x004e, 0x2460, 0x6010, 0xa080, | ||
| 5010 | 0x0002, 0x2004, 0xa005, 0x0904, 0x18ff, 0x0c10, 0x2001, 0x0207, | ||
| 5011 | 0x2004, 0xd09c, 0x1d48, 0x7804, 0xa084, 0x6000, 0x0120, 0xa086, | ||
| 5012 | 0x6000, 0x0108, 0x0c08, 0x7818, 0x6812, 0x781c, 0x6816, 0x7803, | ||
| 5013 | 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x6100, 0xa18e, 0x0004, | ||
| 5014 | 0x1904, 0x1907, 0x2009, 0x0048, 0x080c, 0x80a7, 0x0804, 0x1907, | ||
| 5015 | 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, 0x700c, 0x7110, | ||
| 5016 | 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, 0x0005, 0x2004, | ||
| 5017 | 0xd08c, 0x0160, 0x0046, 0x080c, 0x1a6c, 0x004e, 0x2460, 0x6010, | ||
| 5018 | 0xa080, 0x0002, 0x2004, 0xa005, 0x01d0, 0x0c28, 0x2001, 0x0207, | ||
| 5019 | 0x2004, 0xd09c, 0x1d50, 0x2001, 0x0005, 0x2004, 0xd08c, 0x1d50, | ||
| 5020 | 0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, 0x19f0, 0x7818, | ||
| 5021 | 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, 0x0000, 0x6100, | ||
| 5022 | 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x80a7, 0x00ce, | ||
| 5023 | 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, 0x0036, 0x0046, | ||
| 5024 | 0x0056, 0x080c, 0x1d86, 0x0026, 0x0056, 0x2071, 0xaffd, 0x7000, | ||
| 5025 | 0xa086, 0x0000, 0x0580, 0x7004, 0xac06, 0x11f8, 0x2079, 0x0030, | ||
| 5026 | 0x7000, 0xa086, 0x0003, 0x01c8, 0x7804, 0xd0fc, 0x1198, 0x2001, | ||
| 5027 | 0x0207, 0x2004, 0xd09c, 0x1dc0, 0x7803, 0x0004, 0x7804, 0xd0ac, | ||
| 5028 | 0x1de8, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, 0x7007, | ||
| 5029 | 0x0000, 0x0018, 0x080c, 0x1a6c, 0x08d0, 0x0156, 0x20a9, 0x0009, | ||
| 5030 | 0x2009, 0xb003, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, | ||
| 5031 | 0x1f04, 0x1942, 0x015e, 0x005e, 0x002e, 0x2001, 0x015d, 0x201c, | ||
| 5032 | 0x831a, 0x2302, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, | ||
| 5033 | 0x005e, 0x004e, 0x003e, 0x002e, 0x00ee, 0x00fe, 0x0005, 0x700c, | ||
| 5034 | 0x7110, 0xa106, 0x0904, 0x19dd, 0x2104, 0x7006, 0x2060, 0x8108, | ||
| 5035 | 0x211c, 0x8108, 0x2124, 0x8108, 0xa182, 0xb01e, 0x0210, 0x2009, | ||
| 5036 | 0xb003, 0x7112, 0x700c, 0xa106, 0x1128, 0x080c, 0x2744, 0x2001, | ||
| 5037 | 0x0138, 0x2102, 0x8cff, 0x0588, 0x6010, 0x2068, 0x2d58, 0x6828, | ||
| 5038 | 0xa406, 0x1580, 0x682c, 0xa306, 0x1568, 0x7004, 0x2060, 0x6020, | ||
| 5039 | 0xc0d4, 0x6022, 0x684c, 0xd0f4, 0x0128, 0x6817, 0xffff, 0x6813, | ||
| 5040 | 0xffff, 0x00d8, 0x6850, 0xd0f4, 0x1130, 0x7803, 0x0004, 0x6810, | ||
| 5041 | 0x781a, 0x6814, 0x781e, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, | ||
| 5042 | 0x2040, 0x6034, 0xa0cc, 0x000f, 0x2009, 0x0011, 0x04c9, 0x0118, | ||
| 5043 | 0x2009, 0x0001, 0x04a9, 0x2d58, 0x0005, 0x080c, 0x1ced, 0x0904, | ||
| 5044 | 0x195f, 0x0cd0, 0x6020, 0xd0d4, 0x01b8, 0x6038, 0xa402, 0x6034, | ||
| 5045 | 0xa303, 0x0108, 0x1288, 0x643a, 0x6336, 0x6c2a, 0x6b2e, 0x0046, | ||
| 5046 | 0x0036, 0x2400, 0x6c7c, 0xa402, 0x6812, 0x2300, 0x6b80, 0xa303, | ||
| 5047 | 0x6816, 0x003e, 0x004e, 0x0018, 0x080c, 0x98cb, 0x09f0, 0x601c, | ||
| 5048 | 0xa08e, 0x0008, 0x0904, 0x1985, 0xa08e, 0x000a, 0x0904, 0x1985, | ||
| 5049 | 0x080c, 0x21a6, 0x1990, 0x0804, 0x1985, 0x7003, 0x0000, 0x0005, | ||
| 5050 | 0x8aff, 0x0904, 0x1a46, 0xa03e, 0x2730, 0x6850, 0xd0fc, 0x11b8, | ||
| 5051 | 0xd0f4, 0x1528, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x1a30, | ||
| 5052 | 0x1a15, 0x1a15, 0x1a30, 0x1a30, 0x1a29, 0x1a30, 0x1a15, 0x1a30, | ||
| 5053 | 0x1a1a, 0x1a1a, 0x1a30, 0x1a30, 0x1a30, 0x1a21, 0x1a1a, 0x7803, | ||
| 5054 | 0x0004, 0xc0fc, 0x6852, 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0x00d6, | ||
| 5055 | 0xd99c, 0x0548, 0x2805, 0xac68, 0x6f08, 0x6e0c, 0x0420, 0xc0f4, | ||
| 5056 | 0x6852, 0x6b6c, 0x6a70, 0x00d6, 0x0428, 0x6b08, 0x6a0c, 0x6d00, | ||
| 5057 | 0x6c04, 0x00c8, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, | ||
| 5058 | 0x0090, 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, | ||
| 5059 | 0x1138, 0x00de, 0x080c, 0x2148, 0x1904, 0x19e0, 0xa00e, 0x00b0, | ||
| 5060 | 0x00de, 0x080c, 0x14f6, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, | ||
| 5061 | 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x00de, 0x6828, 0xa300, | ||
| 5062 | 0x682a, 0x682c, 0xa201, 0x682e, 0x080c, 0x2148, 0x0005, 0x080c, | ||
| 5063 | 0x14f6, 0x080c, 0x1e1a, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, | ||
| 5064 | 0x7003, 0x0000, 0x080c, 0x1d22, 0x080c, 0x9596, 0x0170, 0x6808, | ||
| 5065 | 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, | ||
| 5066 | 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0x929c, | ||
| 5067 | 0x0804, 0x1c5e, 0x080c, 0x14f6, 0x0126, 0x2091, 0x2200, 0x0006, | ||
| 5068 | 0x0016, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, | ||
| 5069 | 0x0700, 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, 0x0d58, 0x7000, | ||
| 5070 | 0x0002, 0x1a89, 0x1a8f, 0x1b92, 0x1c39, 0x1c4d, 0x1a89, 0x1a89, | ||
| 5071 | 0x1a89, 0x7804, 0xd09c, 0x1904, 0x1c5e, 0x080c, 0x14f6, 0x8001, | ||
| 5072 | 0x7002, 0xa184, 0x0880, 0x1190, 0xd19c, 0x1904, 0x1b20, 0x8aff, | ||
| 5073 | 0x0904, 0x1b20, 0x2009, 0x0001, 0x080c, 0x19e0, 0x0904, 0x1c5e, | ||
| 5074 | 0x2009, 0x0001, 0x080c, 0x19e0, 0x0804, 0x1c5e, 0x7803, 0x0004, | ||
| 5075 | 0x7003, 0x0000, 0xd1bc, 0x1904, 0x1b00, 0x0026, 0x0036, 0x7c20, | ||
| 5076 | 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816, 0x2001, | ||
| 5077 | 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128, 0x7803, | ||
| 5078 | 0x0009, 0x7003, 0x0004, 0x0010, 0x080c, 0x1c62, 0x6b28, 0x6a2c, | ||
| 5079 | 0x2400, 0x686e, 0xa31a, 0x2500, 0x6872, 0xa213, 0x6b2a, 0x6a2e, | ||
| 5080 | 0x00c6, 0x7004, 0x2060, 0x6020, 0xd0f4, 0x1110, 0x633a, 0x6236, | ||
| 5081 | 0x00ce, 0x003e, 0x002e, 0x6e1e, 0x6f22, 0x080c, 0x215e, 0x2a00, | ||
| 5082 | 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6850, 0xc0fd, 0x6852, | ||
| 5083 | 0x6808, 0x8001, 0x680a, 0x1148, 0x684c, 0xd0e4, 0x0130, 0x7004, | ||
| 5084 | 0x2060, 0x2009, 0x0048, 0x080c, 0x80a7, 0x7000, 0xa086, 0x0004, | ||
| 5085 | 0x0904, 0x1c5e, 0x7003, 0x0000, 0x080c, 0x195f, 0x0804, 0x1c5e, | ||
| 5086 | 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c, 0xac73, 0x005e, 0x080c, | ||
| 5087 | 0x1d22, 0x00f6, 0x7004, 0x2078, 0x080c, 0x5029, 0x0118, 0x7820, | ||
| 5088 | 0xc0f5, 0x7822, 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, | ||
| 5089 | 0x8001, 0x680a, 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, 0x1c5e, | ||
| 5090 | 0x7004, 0x00c6, 0x2060, 0x6020, 0x00ce, 0xd0f4, 0x0128, 0x6808, | ||
| 5091 | 0x8001, 0x680a, 0x0804, 0x1c5e, 0x7818, 0x6812, 0x7a1c, 0x6a16, | ||
| 5092 | 0xd19c, 0x0160, 0xa205, 0x0150, 0x7004, 0xa080, 0x0007, 0x2004, | ||
| 5093 | 0xa084, 0xfffd, 0xa086, 0x0008, 0x1904, 0x1aa6, 0x684c, 0xc0f5, | ||
| 5094 | 0x684e, 0x7814, 0xa005, 0x1180, 0x7003, 0x0000, 0x6808, 0x8001, | ||
| 5095 | 0x680a, 0x1130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x80a7, | ||
| 5096 | 0x080c, 0x195f, 0x0804, 0x1c5e, 0x7818, 0x6812, 0x781c, 0x6816, | ||
| 5097 | 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa188, 0x0007, 0x8114, 0x8214, | ||
| 5098 | 0x8214, 0xa10a, 0x8104, 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, | ||
| 5099 | 0x810b, 0x080c, 0x1da5, 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, | ||
| 5100 | 0x0001, 0x7804, 0xd0fc, 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004, | ||
| 5101 | 0x780f, 0x00f6, 0x7004, 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, | ||
| 5102 | 0x080c, 0x80a7, 0x080c, 0x1dd7, 0x0958, 0x7908, 0xd1ec, 0x1118, | ||
| 5103 | 0x2009, 0x0009, 0x0010, 0x2009, 0x0019, 0x7902, 0x7003, 0x0003, | ||
| 5104 | 0x0804, 0x1c5e, 0x8001, 0x7002, 0xd194, 0x01a8, 0x7804, 0xd0fc, | ||
| 5105 | 0x1904, 0x1c2c, 0xd09c, 0x0130, 0x7804, 0xd0fc, 0x1904, 0x1a74, | ||
| 5106 | 0xd09c, 0x11a8, 0x8aff, 0x0904, 0x1c5e, 0x2009, 0x0001, 0x080c, | ||
| 5107 | 0x19e0, 0x0804, 0x1c5e, 0xa184, 0x0888, 0x1148, 0x8aff, 0x0904, | ||
| 5108 | 0x1c5e, 0x2009, 0x0001, 0x080c, 0x19e0, 0x0804, 0x1c5e, 0x7818, | ||
| 5109 | 0x6812, 0x7a1c, 0x6a16, 0xa205, 0x0904, 0x1b3e, 0x7803, 0x0004, | ||
| 5110 | 0x7003, 0x0000, 0xd1bc, 0x1904, 0x1c0f, 0x6834, 0xa084, 0x00ff, | ||
| 5111 | 0xa086, 0x0029, 0x1118, 0xd19c, 0x1904, 0x1b3e, 0x0026, 0x0036, | ||
| 5112 | 0x7c20, 0x7d24, 0x7e30, 0x7f34, 0x7818, 0x6812, 0x781c, 0x6816, | ||
| 5113 | 0x2001, 0x0201, 0x2004, 0xa005, 0x0140, 0x7808, 0xd0ec, 0x1128, | ||
| 5114 | 0x7803, 0x0009, 0x7003, 0x0004, 0x0020, 0x0016, 0x080c, 0x1c62, | ||
| 5115 | 0x001e, 0x6b28, 0x6a2c, 0x080c, 0x215e, 0x00d6, 0x2805, 0xac68, | ||
| 5116 | 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c, 0xa213, 0x0020, | ||
| 5117 | 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0xd194, 0x0904, 0x1ac8, | ||
| 5118 | 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, | ||
| 5119 | 0x680a, 0x6b2a, 0x6a2e, 0x003e, 0x002e, 0x0804, 0x1b50, 0x0056, | ||
| 5120 | 0x7d0c, 0x080c, 0xac73, 0x005e, 0x080c, 0x1d22, 0x00f6, 0x7004, | ||
| 5121 | 0x2078, 0x080c, 0x5029, 0x0118, 0x7820, 0xc0f5, 0x7822, 0x00fe, | ||
| 5122 | 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, 0x697c, | ||
| 5123 | 0x791a, 0x6980, 0x791e, 0x0490, 0x7804, 0xd09c, 0x0904, 0x1a74, | ||
| 5124 | 0x7c20, 0x7824, 0xa405, 0x1904, 0x1a74, 0x7803, 0x0002, 0x0804, | ||
| 5125 | 0x1bb7, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0xa00d, 0x0150, | ||
| 5126 | 0x6808, 0x8001, 0x680a, 0x1130, 0x7004, 0x2060, 0x2009, 0x0048, | ||
| 5127 | 0x080c, 0x80a7, 0x080c, 0x195f, 0x0088, 0x7803, 0x0004, 0x7003, | ||
| 5128 | 0x0000, 0x7004, 0x2060, 0x6010, 0xa005, 0x0da0, 0x2068, 0x6808, | ||
| 5129 | 0x8000, 0x680a, 0x6c28, 0x6b2c, 0x080c, 0x197a, 0x001e, 0x000e, | ||
| 5130 | 0x012e, 0x0005, 0x700c, 0x7110, 0xa106, 0x0904, 0x1ce1, 0x7004, | ||
| 5131 | 0x0016, 0x210c, 0xa106, 0x001e, 0x0904, 0x1ce1, 0x00d6, 0x00c6, | ||
| 5132 | 0x216c, 0x2d00, 0xa005, 0x0904, 0x1cdf, 0x6820, 0xd0d4, 0x1904, | ||
| 5133 | 0x1cdf, 0x6810, 0x2068, 0x6850, 0xd0fc, 0x0558, 0x8108, 0x2104, | ||
| 5134 | 0x6b2c, 0xa306, 0x1904, 0x1cdf, 0x8108, 0x2104, 0x6a28, 0xa206, | ||
| 5135 | 0x1904, 0x1cdf, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, | ||
| 5136 | 0x6870, 0x7826, 0x681c, 0x7832, 0x6820, 0x7836, 0x6818, 0x2060, | ||
| 5137 | 0x6034, 0xd09c, 0x0150, 0x6830, 0x2005, 0x00d6, 0xac68, 0x6808, | ||
| 5138 | 0x783a, 0x680c, 0x783e, 0x00de, 0x04a0, 0xa006, 0x783a, 0x783e, | ||
| 5139 | 0x0480, 0x8108, 0x2104, 0xa005, 0x1590, 0x8108, 0x2104, 0xa005, | ||
| 5140 | 0x1570, 0x6850, 0xc0f5, 0x6852, 0x6830, 0x2005, 0x6918, 0xa160, | ||
| 5141 | 0xa180, 0x000d, 0x2004, 0xd09c, 0x1170, 0x6008, 0x7822, 0x686e, | ||
| 5142 | 0x600c, 0x7826, 0x6872, 0x6000, 0x7832, 0x6004, 0x7836, 0xa006, | ||
| 5143 | 0x783a, 0x783e, 0x0070, 0x6010, 0x7822, 0x686e, 0x6014, 0x7826, | ||
| 5144 | 0x6872, 0x6000, 0x7832, 0x6004, 0x7836, 0x6008, 0x783a, 0x600c, | ||
| 5145 | 0x783e, 0x6810, 0x781a, 0x6814, 0x781e, 0x7803, 0x0011, 0x00ce, | ||
| 5146 | 0x00de, 0x0005, 0x2011, 0x0201, 0x2009, 0x003c, 0x2204, 0xa005, | ||
| 5147 | 0x1118, 0x8109, 0x1dd8, 0x0005, 0x0005, 0x0ca1, 0x01e0, 0x7908, | ||
| 5148 | 0xd1ec, 0x1160, 0x080c, 0x1dd7, 0x0148, 0x7803, 0x0009, 0x7904, | ||
| 5149 | 0xd1fc, 0x0de8, 0x7803, 0x0006, 0x0c29, 0x0168, 0x780c, 0xd0a4, | ||
| 5150 | 0x1150, 0x7007, 0x0000, 0x080c, 0x1dd7, 0x0140, 0x7803, 0x0019, | ||
| 5151 | 0x7003, 0x0003, 0x0018, 0x00b1, 0xa085, 0x0001, 0x0005, 0x0126, | ||
| 5152 | 0x2091, 0x2200, 0x7000, 0xa086, 0x0003, 0x1150, 0x700c, 0x7110, | ||
| 5153 | 0xa106, 0x0130, 0x20e1, 0x9028, 0x700f, 0xb003, 0x7013, 0xb003, | ||
| 5154 | 0x012e, 0x0005, 0x00c6, 0x080c, 0x574f, 0x1550, 0x2001, 0x0160, | ||
| 5155 | 0x2003, 0x0000, 0x2001, 0x0138, 0x2003, 0x0000, 0x2011, 0x00c8, | ||
| 5156 | 0xe000, 0xe000, 0x8211, 0x1de0, 0x080c, 0x1d7e, 0x700c, 0x7110, | ||
| 5157 | 0xa106, 0x0190, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, | ||
| 5158 | 0x6008, 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb01e, 0x0210, | ||
| 5159 | 0x2009, 0xb003, 0x7112, 0x0c50, 0x080c, 0x57d1, 0x00ce, 0x0005, | ||
| 5160 | 0x04a9, 0x20e1, 0x9028, 0x700c, 0x7110, 0xa106, 0x01d0, 0x2104, | ||
| 5161 | 0xa005, 0x0130, 0x2060, 0x6010, 0x2060, 0x6008, 0x8001, 0x600a, | ||
| 5162 | 0xa188, 0x0003, 0xa182, 0xb01e, 0x0210, 0x2009, 0xb003, 0x7112, | ||
| 5163 | 0x700c, 0xa106, 0x1d40, 0x080c, 0x2744, 0x2001, 0x0138, 0x2102, | ||
| 5164 | 0x0c10, 0x2001, 0x015d, 0x200c, 0x810a, 0x2102, 0x2001, 0x0160, | ||
| 5165 | 0x2502, 0x2001, 0x0138, 0x2202, 0x00ce, 0x0005, 0x20e1, 0x9028, | ||
| 5166 | 0x2001, 0x015d, 0x200c, 0x810a, 0x2102, 0x0005, 0x2001, 0x0138, | ||
| 5167 | 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, | ||
| 5168 | 0x2021, 0xb015, 0x2001, 0x0141, 0x201c, 0xd3dc, 0x1168, 0x2001, | ||
| 5169 | 0x0109, 0x201c, 0xa39c, 0x0048, 0x1138, 0x2001, 0x0111, 0x201c, | ||
| 5170 | 0x83ff, 0x1110, 0x8421, 0x1d70, 0x0005, 0x00e6, 0x2071, 0x0200, | ||
| 5171 | 0x7808, 0xa084, 0xf000, 0xa10d, 0x08c9, 0x2019, 0x5000, 0x8319, | ||
| 5172 | 0x0168, 0x2001, 0xb01e, 0x2004, 0xa086, 0x0000, 0x0138, 0x2001, | ||
| 5173 | 0x0021, 0xd0fc, 0x0da0, 0x080c, 0x1ff4, 0x0c78, 0x20e1, 0x7000, | ||
| 5174 | 0x7324, 0x7420, 0x7028, 0x7028, 0x7426, 0x7037, 0x0001, 0x810f, | ||
| 5175 | 0x712e, 0x702f, 0x0100, 0x7037, 0x0008, 0x7326, 0x7422, 0x2001, | ||
| 5176 | 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x00ee, 0x0005, 0x7908, | ||
| 5177 | 0xa18c, 0x0fff, 0xa182, 0x0009, 0x0218, 0xa085, 0x0001, 0x0088, | ||
| 5178 | 0x2001, 0x020a, 0x81ff, 0x0130, 0x20e1, 0x6000, 0x200c, 0x200c, | ||
| 5179 | 0x200c, 0x200c, 0x20e1, 0x7000, 0x200c, 0x200c, 0x7003, 0x0000, | ||
| 5180 | 0xa006, 0x0005, 0x00f6, 0x00e6, 0x0016, 0x0026, 0x2071, 0xaffd, | ||
| 5181 | 0x2079, 0x0030, 0x2011, 0x0050, 0x7000, 0xa086, 0x0000, 0x01a8, | ||
| 5182 | 0x8211, 0x0188, 0x2001, 0x0005, 0x2004, 0xd08c, 0x0dc8, 0x7904, | ||
| 5183 | 0xa18c, 0x0780, 0x0016, 0x080c, 0x1a6c, 0x001e, 0x81ff, 0x1118, | ||
| 5184 | 0x2011, 0x0050, 0x0c48, 0xa085, 0x0001, 0x002e, 0x001e, 0x00ee, | ||
| 5185 | 0x00fe, 0x0005, 0x7803, 0x0004, 0x2009, 0x0064, 0x7804, 0xd0ac, | ||
| 5186 | 0x0904, 0x1e66, 0x8109, 0x1dd0, 0x2009, 0x0100, 0x210c, 0xa18a, | ||
| 5187 | 0x0003, 0x0a0c, 0x14f6, 0x080c, 0x20f2, 0x00e6, 0x00f6, 0x2071, | ||
| 5188 | 0xafec, 0x2079, 0x0010, 0x7004, 0xa086, 0x0000, 0x0538, 0x7800, | ||
| 5189 | 0x0006, 0x7820, 0x0006, 0x7830, 0x0006, 0x7834, 0x0006, 0x7838, | ||
| 5190 | 0x0006, 0x783c, 0x0006, 0x7803, 0x0004, 0xe000, 0xe000, 0x2079, | ||
| 5191 | 0x0030, 0x7804, 0xd0ac, 0x190c, 0x14f6, 0x2079, 0x0010, 0x000e, | ||
| 5192 | 0x783e, 0x000e, 0x783a, 0x000e, 0x7836, 0x000e, 0x7832, 0x000e, | ||
| 5193 | 0x7822, 0x000e, 0x7802, 0x00fe, 0x00ee, 0x0030, 0x00fe, 0x00ee, | ||
| 5194 | 0x7804, 0xd0ac, 0x190c, 0x14f6, 0x080c, 0x6d0d, 0x0005, 0x00e6, | ||
| 5195 | 0x2071, 0xb01e, 0x7003, 0x0000, 0x00ee, 0x0005, 0x00d6, 0xa280, | ||
| 5196 | 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x1ee4, 0x6934, 0xa184, | ||
| 5197 | 0x0007, 0x0002, 0x1e82, 0x1ecf, 0x1e82, 0x1e82, 0x1e82, 0x1eb6, | ||
| 5198 | 0x1e95, 0x1e84, 0x080c, 0x14f6, 0x684c, 0xd0b4, 0x0904, 0x1fcc, | ||
| 5199 | 0x6860, 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, | ||
| 5200 | 0x6880, 0x680e, 0x6958, 0x0804, 0x1ed7, 0x6834, 0xa084, 0x00ff, | ||
| 5201 | 0xa086, 0x001e, 0x1d38, 0x684c, 0xd0b4, 0x0904, 0x1fcc, 0x6860, | ||
| 5202 | 0x682e, 0x6816, 0x685c, 0x682a, 0x6812, 0x687c, 0x680a, 0x6880, | ||
| 5203 | 0x680e, 0x6804, 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, | ||
| 5204 | 0xa080, 0x2186, 0x2005, 0x6832, 0x6958, 0x0450, 0xa18c, 0x00ff, | ||
| 5205 | 0xa186, 0x0015, 0x1548, 0x684c, 0xd0b4, 0x0904, 0x1fcc, 0x6804, | ||
| 5206 | 0x681a, 0xa080, 0x000d, 0x2004, 0xa084, 0x000f, 0xa080, 0x2186, | ||
| 5207 | 0x2005, 0x6832, 0x6958, 0xa006, 0x682e, 0x682a, 0x0088, 0x684c, | ||
| 5208 | 0xd0b4, 0x0904, 0x1a47, 0x6958, 0xa006, 0x682e, 0x682a, 0x2d00, | ||
| 5209 | 0x681a, 0x6834, 0xa084, 0x000f, 0xa080, 0x2186, 0x2005, 0x6832, | ||
| 5210 | 0x6926, 0x684c, 0xc0dd, 0x684e, 0x00de, 0x0005, 0x00f6, 0x2079, | ||
| 5211 | 0x0020, 0x7804, 0xd0fc, 0x190c, 0x1ff4, 0x00e6, 0x00d6, 0x2071, | ||
| 5212 | 0xb01e, 0x7000, 0xa005, 0x1904, 0x1f4c, 0x00c6, 0x7206, 0xa280, | ||
| 5213 | 0x0004, 0x205c, 0x7004, 0x2068, 0x7803, 0x0004, 0x6818, 0x00d6, | ||
| 5214 | 0x2068, 0x686c, 0x7812, 0x6890, 0x00f6, 0x20e1, 0x9040, 0x2079, | ||
| 5215 | 0x0200, 0x781a, 0x2079, 0x0100, 0x8004, 0x78d6, 0x00fe, 0x00de, | ||
| 5216 | 0x2b68, 0x6824, 0x2050, 0x6818, 0x2060, 0x6830, 0x2040, 0x6034, | ||
| 5217 | 0xa0cc, 0x000f, 0x6908, 0x791a, 0x7116, 0x680c, 0x781e, 0x701a, | ||
| 5218 | 0xa006, 0x700e, 0x7012, 0x7004, 0x692c, 0x6814, 0xa106, 0x1120, | ||
| 5219 | 0x6928, 0x6810, 0xa106, 0x0158, 0x0036, 0x0046, 0x6b14, 0x6c10, | ||
| 5220 | 0x080c, 0x21a6, 0x004e, 0x003e, 0x0110, 0x00ce, 0x00a8, 0x8aff, | ||
| 5221 | 0x1120, 0x00ce, 0xa085, 0x0001, 0x0078, 0x0126, 0x2091, 0x8000, | ||
| 5222 | 0x2079, 0x0020, 0x2009, 0x0001, 0x0059, 0x0118, 0x2009, 0x0001, | ||
| 5223 | 0x0039, 0x012e, 0x00ce, 0xa006, 0x00de, 0x00ee, 0x00fe, 0x0005, | ||
| 5224 | 0x0076, 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, | ||
| 5225 | 0x1fc5, 0x700c, 0x7214, 0xa23a, 0x7010, 0x7218, 0xa203, 0x0a04, | ||
| 5226 | 0x1fc4, 0xa705, 0x0904, 0x1fc4, 0xa03e, 0x2730, 0x6850, 0xd0fc, | ||
| 5227 | 0x11a8, 0x00d6, 0x2805, 0xac68, 0x2900, 0x0002, 0x1fa7, 0x1f8c, | ||
| 5228 | 0x1f8c, 0x1fa7, 0x1fa7, 0x1fa0, 0x1fa7, 0x1f8c, 0x1fa7, 0x1f91, | ||
| 5229 | 0x1f91, 0x1fa7, 0x1fa7, 0x1fa7, 0x1f98, 0x1f91, 0xc0fc, 0x6852, | ||
| 5230 | 0x6b6c, 0x6a70, 0x6d1c, 0x6c20, 0xd99c, 0x0528, 0x00d6, 0x2805, | ||
| 5231 | 0xac68, 0x6f08, 0x6e0c, 0x00f0, 0x6b08, 0x6a0c, 0x6d00, 0x6c04, | ||
| 5232 | 0x00c8, 0x6b10, 0x6a14, 0x6d00, 0x6c04, 0x6f08, 0x6e0c, 0x0090, | ||
| 5233 | 0x00de, 0x00d6, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x1138, | ||
| 5234 | 0x00de, 0x080c, 0x2148, 0x1904, 0x1f56, 0xa00e, 0x00f0, 0x00de, | ||
| 5235 | 0x080c, 0x14f6, 0x00de, 0x7b22, 0x7a26, 0x7d32, 0x7c36, 0x7f3a, | ||
| 5236 | 0x7e3e, 0x7902, 0x7000, 0x8000, 0x7002, 0x6828, 0xa300, 0x682a, | ||
| 5237 | 0x682c, 0xa201, 0x682e, 0x700c, 0xa300, 0x700e, 0x7010, 0xa201, | ||
| 5238 | 0x7012, 0x080c, 0x2148, 0x0008, 0xa006, 0x002e, 0x003e, 0x004e, | ||
| 5239 | 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x14f6, 0x0026, 0x2001, | ||
| 5240 | 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, | ||
| 5241 | 0x0000, 0x7004, 0x2060, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9596, | ||
| 5242 | 0x0118, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0x929c, 0x20e1, | ||
| 5243 | 0x9040, 0x080c, 0x7cb8, 0x2011, 0x0000, 0x080c, 0x7ae9, 0x080c, | ||
| 5244 | 0x6d0d, 0x002e, 0x0804, 0x20ad, 0x0126, 0x2091, 0x2400, 0x0006, | ||
| 5245 | 0x0016, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, | ||
| 5246 | 0xb01e, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, | ||
| 5247 | 0x0700, 0x1920, 0x7000, 0x0002, 0x20ad, 0x2010, 0x2080, 0x20ab, | ||
| 5248 | 0x8001, 0x7002, 0xd19c, 0x1170, 0x8aff, 0x05d0, 0x2009, 0x0001, | ||
| 5249 | 0x080c, 0x1f50, 0x0904, 0x20ad, 0x2009, 0x0001, 0x080c, 0x1f50, | ||
| 5250 | 0x0804, 0x20ad, 0x7803, 0x0004, 0xd194, 0x0148, 0x6850, 0xc0fc, | ||
| 5251 | 0x6852, 0x8aff, 0x11d8, 0x684c, 0xc0f5, 0x684e, 0x00b8, 0x0026, | ||
| 5252 | 0x0036, 0x6b28, 0x6a2c, 0x7820, 0x686e, 0xa31a, 0x7824, 0x6872, | ||
| 5253 | 0xa213, 0x7830, 0x681e, 0x7834, 0x6822, 0x6b2a, 0x6a2e, 0x003e, | ||
| 5254 | 0x002e, 0x080c, 0x215e, 0x6850, 0xc0fd, 0x6852, 0x2a00, 0x6826, | ||
| 5255 | 0x2c00, 0x681a, 0x2800, 0x6832, 0x7003, 0x0000, 0x0804, 0x20ad, | ||
| 5256 | 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, 0x0100, | ||
| 5257 | 0x7a14, 0xa284, 0x0184, 0xa085, 0x0012, 0x7816, 0x0036, 0x2019, | ||
| 5258 | 0x1000, 0x8319, 0x090c, 0x14f6, 0x7820, 0xd0bc, 0x1dd0, 0x003e, | ||
| 5259 | 0x79c8, 0x000e, 0xa102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, | ||
| 5260 | 0xa103, 0x78c6, 0x000e, 0x78ca, 0xa284, 0x0184, 0xa085, 0x0012, | ||
| 5261 | 0x7816, 0x002e, 0x00fe, 0x7803, 0x0008, 0x7003, 0x0000, 0x0468, | ||
| 5262 | 0x8001, 0x7002, 0xd194, 0x0168, 0x7804, 0xd0fc, 0x1904, 0x2004, | ||
| 5263 | 0xd19c, 0x11f8, 0x8aff, 0x0508, 0x2009, 0x0001, 0x080c, 0x1f50, | ||
| 5264 | 0x00e0, 0x0026, 0x0036, 0x6b28, 0x6a2c, 0x080c, 0x215e, 0x00d6, | ||
| 5265 | 0x2805, 0xac68, 0x6034, 0xd09c, 0x1128, 0x6808, 0xa31a, 0x680c, | ||
| 5266 | 0xa213, 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0x0804, | ||
| 5267 | 0x2033, 0x0804, 0x202f, 0x080c, 0x14f6, 0x00ce, 0x00de, 0x00ee, | ||
| 5268 | 0x00fe, 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, | ||
| 5269 | 0xb01e, 0x7000, 0xa086, 0x0000, 0x0590, 0x2079, 0x0020, 0x0016, | ||
| 5270 | 0x2009, 0x0207, 0x210c, 0xd194, 0x0158, 0x2009, 0x020c, 0x210c, | ||
| 5271 | 0xa184, 0x0003, 0x0128, 0x20e1, 0x9040, 0x2001, 0x020c, 0x2102, | ||
| 5272 | 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, 0x1110, | ||
| 5273 | 0x20e1, 0x9040, 0x7804, 0xd0fc, 0x0d18, 0x080c, 0x1ff4, 0x7000, | ||
| 5274 | 0xa086, 0x0000, 0x19e8, 0x001e, 0x7803, 0x0004, 0x7804, 0xd0ac, | ||
| 5275 | 0x1de8, 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x00ee, | ||
| 5276 | 0x00fe, 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071, | ||
| 5277 | 0xb01e, 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, 0x7004, | ||
| 5278 | 0x2060, 0x6010, 0x2068, 0x080c, 0x9596, 0x0158, 0x6850, 0xc0b5, | ||
| 5279 | 0x6852, 0x680c, 0x7a1c, 0xa206, 0x1120, 0x6808, 0x7a18, 0xa206, | ||
| 5280 | 0x01e0, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, | ||
| 5281 | 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0x929c, 0x20e1, | ||
| 5282 | 0x9040, 0x080c, 0x7cb8, 0x2011, 0x0000, 0x080c, 0x7ae9, 0x00fe, | ||
| 5283 | 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, 0xa205, | ||
| 5284 | 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x1e6e, 0x2001, | ||
| 5285 | 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, | ||
| 5286 | 0x0000, 0x2069, 0xafc7, 0x6833, 0x0000, 0x683f, 0x0000, 0x08f8, | ||
| 5287 | 0x8840, 0x2805, 0xa005, 0x1170, 0x6004, 0xa005, 0x0168, 0x681a, | ||
| 5288 | 0x2060, 0x6034, 0xa084, 0x000f, 0xa080, 0x2186, 0x2045, 0x88ff, | ||
| 5289 | 0x090c, 0x14f6, 0x8a51, 0x0005, 0x2050, 0x0005, 0x8a50, 0x8841, | ||
| 5290 | 0x2805, 0xa005, 0x1190, 0x2c00, 0xad06, 0x0120, 0x6000, 0xa005, | ||
| 5291 | 0x1108, 0x2d00, 0x2060, 0x681a, 0x6034, 0xa084, 0x000f, 0xa080, | ||
| 5292 | 0x2196, 0x2045, 0x88ff, 0x090c, 0x14f6, 0x0005, 0x0000, 0x0011, | ||
| 5293 | 0x0015, 0x0019, 0x001d, 0x0021, 0x0025, 0x0029, 0x0000, 0x000f, | ||
| 5294 | 0x0015, 0x001b, 0x0021, 0x0027, 0x0000, 0x0000, 0x0000, 0x217b, | ||
| 5295 | 0x2177, 0x0000, 0x0000, 0x2185, 0x0000, 0x217b, 0x0000, 0x2182, | ||
| 5296 | 0x217f, 0x0000, 0x0000, 0x0000, 0x2185, 0x2182, 0x0000, 0x217d, | ||
| 5297 | 0x217d, 0x0000, 0x0000, 0x2185, 0x0000, 0x217d, 0x0000, 0x2183, | ||
| 5298 | 0x2183, 0x0000, 0x0000, 0x0000, 0x2185, 0x2183, 0x00a6, 0x0096, | ||
| 5299 | 0x0086, 0x6b2e, 0x6c2a, 0x6858, 0xa055, 0x0904, 0x2237, 0x2d60, | ||
| 5300 | 0x6034, 0xa0cc, 0x000f, 0xa9c0, 0x2186, 0xa986, 0x0007, 0x0130, | ||
| 5301 | 0xa986, 0x000e, 0x0118, 0xa986, 0x000f, 0x1120, 0x605c, 0xa422, | ||
| 5302 | 0x6060, 0xa31a, 0x2805, 0xa045, 0x1140, 0x0310, 0x0804, 0x2237, | ||
| 5303 | 0x6004, 0xa065, 0x0904, 0x2237, 0x0c18, 0x2805, 0xa005, 0x01a8, | ||
| 5304 | 0xac68, 0xd99c, 0x1128, 0x6808, 0xa422, 0x680c, 0xa31b, 0x0020, | ||
| 5305 | 0x6810, 0xa422, 0x6814, 0xa31b, 0x0620, 0x2300, 0xa405, 0x0150, | ||
| 5306 | 0x8a51, 0x0904, 0x2237, 0x8840, 0x0c40, 0x6004, 0xa065, 0x0904, | ||
| 5307 | 0x2237, 0x0830, 0x8a51, 0x0904, 0x2237, 0x8840, 0x2805, 0xa005, | ||
| 5308 | 0x1158, 0x6004, 0xa065, 0x0904, 0x2237, 0x6034, 0xa0cc, 0x000f, | ||
| 5309 | 0xa9c0, 0x2186, 0x2805, 0x2040, 0x2b68, 0x6850, 0xc0fc, 0x6852, | ||
| 5310 | 0x0458, 0x8422, 0x8420, 0x831a, 0xa399, 0x0000, 0x00d6, 0x2b68, | ||
| 5311 | 0x6c6e, 0x6b72, 0x00de, 0xd99c, 0x1168, 0x6908, 0x2400, 0xa122, | ||
| 5312 | 0x690c, 0x2300, 0xa11b, 0x0a0c, 0x14f6, 0x6800, 0xa420, 0x6804, | ||
| 5313 | 0xa319, 0x0060, 0x6910, 0x2400, 0xa122, 0x6914, 0x2300, 0xa11b, | ||
| 5314 | 0x0a0c, 0x14f6, 0x6800, 0xa420, 0x6804, 0xa319, 0x2b68, 0x6c1e, | ||
| 5315 | 0x6b22, 0x6850, 0xc0fd, 0x6852, 0x2c00, 0x681a, 0x2800, 0x6832, | ||
| 5316 | 0x2a00, 0x6826, 0x000e, 0x000e, 0x000e, 0xa006, 0x0028, 0x008e, | ||
| 5317 | 0x009e, 0x00ae, 0xa085, 0x0001, 0x0005, 0x2001, 0x0005, 0x2004, | ||
| 5318 | 0xa084, 0x0007, 0x0002, 0x224b, 0x224c, 0x224f, 0x2252, 0x2257, | ||
| 5319 | 0x225a, 0x225f, 0x2264, 0x0005, 0x080c, 0x1ff4, 0x0005, 0x080c, | ||
| 5320 | 0x1a6c, 0x0005, 0x080c, 0x1a6c, 0x080c, 0x1ff4, 0x0005, 0x080c, | ||
| 5321 | 0x16f8, 0x0005, 0x080c, 0x1ff4, 0x080c, 0x16f8, 0x0005, 0x080c, | ||
| 5322 | 0x1a6c, 0x080c, 0x16f8, 0x0005, 0x080c, 0x1a6c, 0x080c, 0x1ff4, | ||
| 5323 | 0x080c, 0x16f8, 0x0005, 0x0126, 0x2091, 0x2600, 0x2079, 0x0200, | ||
| 5324 | 0x2071, 0xb280, 0x2069, 0xad00, 0x2009, 0x0004, 0x7912, 0x7817, | ||
| 5325 | 0x0004, 0x080c, 0x2651, 0x781b, 0x0002, 0x20e1, 0x9080, 0x20e1, | ||
| 5326 | 0x4000, 0x20a9, 0x0080, 0x782f, 0x0000, 0x1f04, 0x2283, 0x20e1, | ||
| 5327 | 0x9080, 0x783b, 0x001f, 0x20e1, 0x8700, 0x012e, 0x0005, 0x0126, | ||
| 5328 | 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, 0x2335, 0xa084, 0x0007, | ||
| 5329 | 0x0002, 0x22b3, 0x22a1, 0x22a4, 0x22a7, 0x22ac, 0x22ae, 0x22b0, | ||
| 5330 | 0x22b2, 0x080c, 0x5fb7, 0x0078, 0x080c, 0x5ff0, 0x0060, 0x080c, | ||
| 5331 | 0x5fb7, 0x080c, 0x5ff0, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, | ||
| 5332 | 0x0021, 0x0008, 0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, | ||
| 5333 | 0x7930, 0xa184, 0x0003, 0x0118, 0x20e1, 0x9040, 0x04a0, 0xa184, | ||
| 5334 | 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, 0x1108, 0x00a0, 0x080c, | ||
| 5335 | 0x574f, 0x1178, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x2001, 0xad00, | ||
| 5336 | 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5793, 0x080c, 0x569a, | ||
| 5337 | 0x0010, 0x080c, 0x485e, 0x20e1, 0x9010, 0x00a8, 0xa184, 0x00c0, | ||
| 5338 | 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xaffd, 0x080c, | ||
| 5339 | 0x1d22, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0028, 0xa184, 0x0300, | ||
| 5340 | 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, 0x001e, 0x000e, 0x0005, | ||
| 5341 | 0x0016, 0x00e6, 0x00f6, 0x2071, 0xad00, 0x7128, 0x2001, 0xaf90, | ||
| 5342 | 0x2102, 0x2001, 0xaf98, 0x2102, 0xa182, 0x0211, 0x1218, 0x2009, | ||
| 5343 | 0x0008, 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, 0x0007, 0x00d0, | ||
| 5344 | 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, 0xa182, 0x0349, | ||
| 5345 | 0x1218, 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, 0x1218, 0x2009, | ||
| 5346 | 0x0004, 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, 0x0003, 0x0010, | ||
| 5347 | 0x2009, 0x0002, 0x2079, 0x0200, 0x7912, 0x7817, 0x0004, 0x080c, | ||
| 5348 | 0x2651, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x7938, 0x080c, 0x14f6, | ||
| 5349 | 0x0126, 0x2091, 0x2800, 0x2061, 0x0100, 0x2071, 0xad00, 0x6024, | ||
| 5350 | 0x6026, 0x6053, 0x0030, 0x080c, 0x2690, 0x6050, 0xa084, 0xfe7f, | ||
| 5351 | 0x6052, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x26a0, 0x60e7, | ||
| 5352 | 0x0000, 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, | ||
| 5353 | 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x0e9f, 0x601b, 0x001e, | ||
| 5354 | 0x600f, 0x00ff, 0x2001, 0xaf8c, 0x2003, 0x00ff, 0x602b, 0x002f, | ||
| 5355 | 0x012e, 0x0005, 0x2001, 0xad31, 0x2003, 0x0000, 0x2001, 0xad30, | ||
| 5356 | 0x2003, 0x0001, 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, | ||
| 5357 | 0x0026, 0x6124, 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, 0x002a, | ||
| 5358 | 0xa195, 0x0004, 0xa284, 0x0007, 0x0002, 0x23a7, 0x238d, 0x2390, | ||
| 5359 | 0x2393, 0x2398, 0x239a, 0x239e, 0x23a2, 0x080c, 0x6699, 0x00b8, | ||
| 5360 | 0x080c, 0x6774, 0x00a0, 0x080c, 0x6774, 0x080c, 0x6699, 0x0078, | ||
| 5361 | 0x0099, 0x0068, 0x080c, 0x6699, 0x0079, 0x0048, 0x080c, 0x6774, | ||
| 5362 | 0x0059, 0x0028, 0x080c, 0x6774, 0x080c, 0x6699, 0x0029, 0x002e, | ||
| 5363 | 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, 0xd19c, 0x1904, 0x25bf, | ||
| 5364 | 0x080c, 0x574f, 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, 0x6024, | ||
| 5365 | 0xa084, 0x1800, 0x0178, 0x080c, 0x5775, 0x0118, 0x080c, 0x5761, | ||
| 5366 | 0x1148, 0x6027, 0x0020, 0x6043, 0x0000, 0x2001, 0xaf9d, 0x2003, | ||
| 5367 | 0xaaaa, 0x0458, 0x080c, 0x5775, 0x15d0, 0x6024, 0xa084, 0x1800, | ||
| 5368 | 0x1108, 0x04a8, 0x2001, 0xaf9d, 0x2003, 0xaaaa, 0x2001, 0xaf9e, | ||
| 5369 | 0x2003, 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0x080c, 0x569a, | ||
| 5370 | 0x0804, 0x25bf, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, 0xd0e4, | ||
| 5371 | 0x1188, 0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x7088, 0xa086, 0x0028, | ||
| 5372 | 0x1110, 0x080c, 0x58da, 0x0804, 0x25bf, 0x2001, 0xaf9e, 0x2003, | ||
| 5373 | 0x0000, 0x0048, 0x2001, 0xaf9e, 0x2003, 0x0002, 0x0020, 0x080c, | ||
| 5374 | 0x584d, 0x0804, 0x25bf, 0x080c, 0x597a, 0x0804, 0x25bf, 0xd1ac, | ||
| 5375 | 0x0904, 0x2507, 0x080c, 0x574f, 0x11d8, 0x6027, 0x0020, 0x0006, | ||
| 5376 | 0x0026, 0x0036, 0x080c, 0x576b, 0x1170, 0x2001, 0xaf9e, 0x2003, | ||
| 5377 | 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0x080c, 0x569a, 0x003e, | ||
| 5378 | 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x5726, | ||
| 5379 | 0x0016, 0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, 0x2061, | ||
| 5380 | 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74ca, 0xa48c, | ||
| 5381 | 0xff00, 0x7034, 0xd084, 0x0178, 0xa186, 0xf800, 0x1160, 0x7038, | ||
| 5382 | 0xd084, 0x1148, 0xc085, 0x703a, 0x0036, 0x2418, 0x2011, 0x8016, | ||
| 5383 | 0x080c, 0x3c5c, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7050, 0xa084, | ||
| 5384 | 0x00ff, 0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, 0x2011, | ||
| 5385 | 0xad52, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, 0xad52, | ||
| 5386 | 0x2214, 0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, 0x6248, | ||
| 5387 | 0xa294, 0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, | ||
| 5388 | 0x24d2, 0x7034, 0xd08c, 0x1140, 0x2001, 0xad0c, 0x200c, 0xd1ac, | ||
| 5389 | 0x1904, 0x24d2, 0xc1ad, 0x2102, 0x0036, 0x73c8, 0x2011, 0x8013, | ||
| 5390 | 0x080c, 0x3c5c, 0x003e, 0x0804, 0x24d2, 0x7034, 0xd08c, 0x1140, | ||
| 5391 | 0x2001, 0xad0c, 0x200c, 0xd1ac, 0x1904, 0x24d2, 0xc1ad, 0x2102, | ||
| 5392 | 0x0036, 0x73c8, 0x2011, 0x8013, 0x080c, 0x3c5c, 0x003e, 0x7130, | ||
| 5393 | 0xc185, 0x7132, 0x2011, 0xad52, 0x220c, 0xd1a4, 0x01d0, 0x0016, | ||
| 5394 | 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x663f, 0x2019, 0x000e, | ||
| 5395 | 0x080c, 0xa8eb, 0xa484, 0x00ff, 0xa080, 0x2be6, 0x200d, 0xa18c, | ||
| 5396 | 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, 0xa96c, | ||
| 5397 | 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, | ||
| 5398 | 0x080c, 0x2aac, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, | ||
| 5399 | 0x0000, 0x080c, 0x4cdc, 0x1110, 0x080c, 0x493a, 0x8108, 0x1f04, | ||
| 5400 | 0x24c9, 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x7adf, | ||
| 5401 | 0x2011, 0x0002, 0x080c, 0x7ae9, 0x080c, 0x79e1, 0x080c, 0x6581, | ||
| 5402 | 0x0036, 0x2019, 0x0000, 0x080c, 0x7a64, 0x003e, 0x60e3, 0x0000, | ||
| 5403 | 0x001e, 0x2001, 0xad00, 0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, | ||
| 5404 | 0x1118, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xad22, | ||
| 5405 | 0x2003, 0x0000, 0x6027, 0x0020, 0x080c, 0x5775, 0x1140, 0x0016, | ||
| 5406 | 0x2009, 0x07d0, 0x2011, 0x567b, 0x080c, 0x6593, 0x001e, 0xd194, | ||
| 5407 | 0x0904, 0x25bf, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x2570, 0x080c, | ||
| 5408 | 0x6581, 0x080c, 0x7834, 0x6027, 0x0004, 0x00f6, 0x2019, 0xafd0, | ||
| 5409 | 0x2304, 0xa07d, 0x0570, 0x7804, 0xa086, 0x0032, 0x1550, 0x00d6, | ||
| 5410 | 0x00c6, 0x00e6, 0x2069, 0x0140, 0x618c, 0x6288, 0x7818, 0x608e, | ||
| 5411 | 0x7808, 0x608a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, | ||
| 5412 | 0x6043, 0x0000, 0x6803, 0x1000, 0x6803, 0x0000, 0x618e, 0x628a, | ||
| 5413 | 0x080c, 0x6b73, 0x080c, 0x6c50, 0x7810, 0x2070, 0x7037, 0x0103, | ||
| 5414 | 0x2f60, 0x080c, 0x8078, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, | ||
| 5415 | 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, | ||
| 5416 | 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, | ||
| 5417 | 0xafc7, 0x6028, 0xa09a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, | ||
| 5418 | 0x080c, 0x7827, 0x0804, 0x25be, 0x2019, 0xafd0, 0x2304, 0xa065, | ||
| 5419 | 0x0120, 0x2009, 0x0027, 0x080c, 0x80a7, 0x00ce, 0x0804, 0x25be, | ||
| 5420 | 0xd2bc, 0x0904, 0x25be, 0x080c, 0x658e, 0x6014, 0xa084, 0x0184, | ||
| 5421 | 0xa085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, | ||
| 5422 | 0x6804, 0xa084, 0x4000, 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, | ||
| 5423 | 0x00de, 0x00c6, 0x2061, 0xafc7, 0x6044, 0xa09a, 0x00c8, 0x12f0, | ||
| 5424 | 0x8000, 0x6046, 0x603c, 0x00ce, 0xa005, 0x0540, 0x2009, 0x07d0, | ||
| 5425 | 0x080c, 0x6586, 0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, | ||
| 5426 | 0x6114, 0xa18c, 0x0184, 0xa18d, 0x0012, 0x6116, 0x00b8, 0x6114, | ||
| 5427 | 0xa18c, 0x0184, 0xa18d, 0x0016, 0x6116, 0x0080, 0x0036, 0x2019, | ||
| 5428 | 0x0001, 0x080c, 0x7a64, 0x003e, 0x2019, 0xafd6, 0x2304, 0xa065, | ||
| 5429 | 0x0120, 0x2009, 0x004f, 0x080c, 0x80a7, 0x00ce, 0x001e, 0xd19c, | ||
| 5430 | 0x0904, 0x261a, 0x7034, 0xd0ac, 0x1560, 0x0016, 0x0156, 0x6027, | ||
| 5431 | 0x0008, 0x602f, 0x0020, 0x20a9, 0x0006, 0x1d04, 0x25cd, 0x2091, | ||
| 5432 | 0x6000, 0x1f04, 0x25cd, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, | ||
| 5433 | 0x6052, 0x20a9, 0x0366, 0x1d04, 0x25db, 0x2091, 0x6000, 0x6020, | ||
| 5434 | 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0490, | ||
| 5435 | 0x080c, 0x2760, 0x1f04, 0x25db, 0x015e, 0x6152, 0x001e, 0x6027, | ||
| 5436 | 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, | ||
| 5437 | 0x7adf, 0x2011, 0x0002, 0x080c, 0x7ae9, 0x080c, 0x79e1, 0x080c, | ||
| 5438 | 0x6581, 0x0036, 0x2019, 0x0000, 0x080c, 0x7a64, 0x003e, 0x60e3, | ||
| 5439 | 0x0000, 0x080c, 0xac8d, 0x080c, 0xaca8, 0xa085, 0x0001, 0x080c, | ||
| 5440 | 0x5793, 0x2001, 0xad00, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, | ||
| 5441 | 0x12cc, 0x001e, 0xa18c, 0xffd0, 0x6126, 0x0005, 0x0006, 0x0016, | ||
| 5442 | 0x0026, 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0xad00, | ||
| 5443 | 0x71c0, 0x70c2, 0xa116, 0x01f0, 0x81ff, 0x0128, 0x2011, 0x8011, | ||
| 5444 | 0x080c, 0x3c5c, 0x00b8, 0x2011, 0x8012, 0x080c, 0x3c5c, 0x2001, | ||
| 5445 | 0xad71, 0x2004, 0xd0fc, 0x1170, 0x0036, 0x00c6, 0x080c, 0x26eb, | ||
| 5446 | 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c, 0x2aac, | ||
| 5447 | 0x00ce, 0x003e, 0x012e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, | ||
| 5448 | 0x0005, 0x00c6, 0x00f6, 0x0006, 0x0026, 0x2061, 0x0100, 0xa190, | ||
| 5449 | 0x2664, 0x2205, 0x60f2, 0x2011, 0x2671, 0x2205, 0x60ee, 0x002e, | ||
| 5450 | 0x000e, 0x00fe, 0x00ce, 0x0005, 0x0840, 0x0840, 0x0840, 0x0580, | ||
| 5451 | 0x0420, 0x0348, 0x02c0, 0x0258, 0x0210, 0x01a8, 0x01a8, 0x01a8, | ||
| 5452 | 0x01a8, 0x0140, 0x00f8, 0x00d0, 0x00b0, 0x00a0, 0x2028, 0xa18c, | ||
| 5453 | 0x00ff, 0x2130, 0xa094, 0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, | ||
| 5454 | 0x6278, 0x0038, 0xa080, 0x2be6, 0x200d, 0xa18c, 0xff00, 0x810f, | ||
| 5455 | 0xa006, 0x0005, 0xa080, 0x2be6, 0x200d, 0xa18c, 0x00ff, 0x0005, | ||
| 5456 | 0x00d6, 0x2069, 0x0140, 0x2001, 0xad14, 0x2003, 0x00ef, 0x20a9, | ||
| 5457 | 0x0010, 0xa006, 0x6852, 0x6856, 0x1f04, 0x269b, 0x00de, 0x0005, | ||
| 5458 | 0x0006, 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0xad14, 0x2102, | ||
| 5459 | 0x8114, 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, | ||
| 5460 | 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xacae, 0x2005, | ||
| 5461 | 0x6856, 0x8211, 0x1f04, 0x26b0, 0x002e, 0x00de, 0x000e, 0x0005, | ||
| 5462 | 0x00c6, 0x2061, 0xad00, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, | ||
| 5463 | 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, | ||
| 5464 | 0x2069, 0x0140, 0x6980, 0xa116, 0x0180, 0xa112, 0x1230, 0x8212, | ||
| 5465 | 0x8210, 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, | ||
| 5466 | 0x680e, 0x1f04, 0x26e0, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, | ||
| 5467 | 0x00de, 0x015e, 0x0005, 0x2001, 0xad52, 0x2004, 0xd0c4, 0x0150, | ||
| 5468 | 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, | ||
| 5469 | 0xa96c, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, | ||
| 5470 | 0x78c4, 0xd0dc, 0x0548, 0xa084, 0x0700, 0xa08e, 0x0300, 0x1520, | ||
| 5471 | 0x2011, 0x0000, 0x2009, 0x0002, 0x2300, 0xa080, 0x0020, 0x2018, | ||
| 5472 | 0x2300, 0x080c, 0x6665, 0x2011, 0x0030, 0x2200, 0x8007, 0xa085, | ||
| 5473 | 0x004c, 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100, 0x2009, | ||
| 5474 | 0x0138, 0x200a, 0x080c, 0x574f, 0x1118, 0x2009, 0xaf8e, 0x200a, | ||
| 5475 | 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, | ||
| 5476 | 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, | ||
| 5477 | 0x8000, 0x2014, 0xa184, 0x0003, 0x0110, 0x0804, 0x1a6a, 0x002e, | ||
| 5478 | 0x001e, 0x000e, 0x012e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, | ||
| 5479 | 0xa082, 0x0005, 0x000e, 0x0268, 0x2001, 0x0170, 0x200c, 0xa18c, | ||
| 5480 | 0x00ff, 0xa18e, 0x004c, 0x1128, 0x200c, 0xa18c, 0xff00, 0x810f, | ||
| 5481 | 0x0010, 0x2009, 0x0000, 0x2001, 0x0204, 0x2004, 0xa108, 0x0005, | ||
| 5482 | 0x0006, 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, | ||
| 5483 | 0xd08c, 0x1110, 0x1f04, 0x2767, 0x00fe, 0x015e, 0x000e, 0x0005, | ||
| 5484 | 0x0016, 0x00c6, 0x0006, 0x2061, 0x0100, 0x6030, 0x0006, 0x6048, | ||
| 5485 | 0x0006, 0x60e4, 0x0006, 0x60e8, 0x0006, 0x6050, 0x0006, 0x60f0, | ||
| 5486 | 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, | ||
| 5487 | 0x0006, 0x60e0, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, 0xe000, | ||
| 5488 | 0xe000, 0xe000, 0xe000, 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, | ||
| 5489 | 0x60e2, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, 0x000e, | ||
| 5490 | 0x60ee, 0x000e, 0x60f2, 0x000e, 0x6052, 0x000e, 0x60ea, 0x000e, | ||
| 5491 | 0x60e6, 0x000e, 0x604a, 0x000e, 0x6032, 0x6036, 0x2008, 0x080c, | ||
| 5492 | 0x26a0, 0x000e, 0x00ce, 0x001e, 0x0005, 0x2845, 0x2849, 0x284d, | ||
| 5493 | 0x2853, 0x2859, 0x285f, 0x2865, 0x286d, 0x2875, 0x287b, 0x2881, | ||
| 5494 | 0x2889, 0x2891, 0x2899, 0x28a1, 0x28ab, 0x28b5, 0x28b5, 0x28b5, | ||
| 5495 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5496 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5497 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5498 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5499 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5500 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b7, 0x28b7, 0x28bc, | ||
| 5501 | 0x28bc, 0x28c3, 0x28c3, 0x28ca, 0x28ca, 0x28d3, 0x28d3, 0x28da, | ||
| 5502 | 0x28da, 0x28e3, 0x28e3, 0x28ec, 0x28ec, 0x28b5, 0x28b5, 0x28b5, | ||
| 5503 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5504 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5505 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5506 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5507 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5508 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5509 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, | ||
| 5510 | 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x28b5, 0x0106, 0x0006, 0x0804, | ||
| 5511 | 0x28f7, 0x0106, 0x0006, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, | ||
| 5512 | 0x2373, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, 0x2373, 0x0804, | ||
| 5513 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x223d, 0x0804, 0x28f7, 0x0106, | ||
| 5514 | 0x0006, 0x080c, 0x223d, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, | ||
| 5515 | 0x2373, 0x080c, 0x223d, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, | ||
| 5516 | 0x2373, 0x080c, 0x223d, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, | ||
| 5517 | 0x228f, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, 0x228f, 0x0804, | ||
| 5518 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x2373, 0x080c, 0x228f, 0x0804, | ||
| 5519 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x2373, 0x080c, 0x228f, 0x0804, | ||
| 5520 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x223d, 0x080c, 0x228f, 0x0804, | ||
| 5521 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x223d, 0x080c, 0x228f, 0x0804, | ||
| 5522 | 0x28f7, 0x0106, 0x0006, 0x080c, 0x2373, 0x080c, 0x223d, 0x080c, | ||
| 5523 | 0x228f, 0x0804, 0x28f7, 0x0106, 0x0006, 0x080c, 0x2373, 0x080c, | ||
| 5524 | 0x223d, 0x080c, 0x228f, 0x0804, 0x28f7, 0xe000, 0x0cf0, 0x0106, | ||
| 5525 | 0x0006, 0x080c, 0x272f, 0x04d8, 0x0106, 0x0006, 0x080c, 0x272f, | ||
| 5526 | 0x080c, 0x2373, 0x04a0, 0x0106, 0x0006, 0x080c, 0x272f, 0x080c, | ||
| 5527 | 0x223d, 0x0468, 0x0106, 0x0006, 0x080c, 0x272f, 0x080c, 0x2373, | ||
| 5528 | 0x080c, 0x223d, 0x0420, 0x0106, 0x0006, 0x080c, 0x272f, 0x080c, | ||
| 5529 | 0x228f, 0x00e8, 0x0106, 0x0006, 0x080c, 0x272f, 0x080c, 0x2373, | ||
| 5530 | 0x080c, 0x228f, 0x00a0, 0x0106, 0x0006, 0x080c, 0x272f, 0x080c, | ||
| 5531 | 0x223d, 0x080c, 0x228f, 0x0058, 0x0106, 0x0006, 0x080c, 0x272f, | ||
| 5532 | 0x080c, 0x2373, 0x080c, 0x223d, 0x080c, 0x228f, 0x0000, 0x000e, | ||
| 5533 | 0x010e, 0x000d, 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c, | ||
| 5534 | 0x502d, 0x1904, 0x29d4, 0x72d0, 0x2001, 0xaf9d, 0x2004, 0xa005, | ||
| 5535 | 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x29d4, | ||
| 5536 | 0x080c, 0x29d8, 0x0804, 0x29d4, 0x080c, 0x574f, 0x1120, 0x709b, | ||
| 5537 | 0xffff, 0x0804, 0x29d4, 0xd294, 0x0120, 0x709b, 0xffff, 0x0804, | ||
| 5538 | 0x29d4, 0x2001, 0xad14, 0x203c, 0x7284, 0xd284, 0x0904, 0x2976, | ||
| 5539 | 0xd28c, 0x1904, 0x2976, 0x0036, 0x7398, 0xa38e, 0xffff, 0x1110, | ||
| 5540 | 0x2019, 0x0001, 0x8314, 0xa2e0, 0xb3c0, 0x2c04, 0xa38c, 0x0001, | ||
| 5541 | 0x0120, 0xa084, 0xff00, 0x8007, 0x0010, 0xa084, 0x00ff, 0xa70e, | ||
| 5542 | 0x0560, 0xa08e, 0x0000, 0x0548, 0xa08e, 0x00ff, 0x1150, 0x7230, | ||
| 5543 | 0xd284, 0x1538, 0x7284, 0xc28d, 0x7286, 0x709b, 0xffff, 0x003e, | ||
| 5544 | 0x0428, 0x2009, 0x0000, 0x080c, 0x2676, 0x080c, 0x4c80, 0x11b8, | ||
| 5545 | 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1150, 0x7030, 0xd08c, | ||
| 5546 | 0x0118, 0x6000, 0xd0bc, 0x0120, 0x080c, 0x29eb, 0x0140, 0x0028, | ||
| 5547 | 0x080c, 0x2b1a, 0x080c, 0x2a19, 0x0110, 0x8318, 0x0818, 0x739a, | ||
| 5548 | 0x0010, 0x709b, 0xffff, 0x003e, 0x0804, 0x29d4, 0xa780, 0x2be6, | ||
| 5549 | 0x203d, 0xa7bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x7098, 0xa096, | ||
| 5550 | 0xffff, 0x1120, 0x2009, 0x0000, 0x28a8, 0x0050, 0xa812, 0x0220, | ||
| 5551 | 0x2008, 0xa802, 0x20a8, 0x0020, 0x709b, 0xffff, 0x0804, 0x29d4, | ||
| 5552 | 0x2700, 0x0156, 0x0016, 0xa106, 0x05a0, 0xc484, 0x080c, 0x4cdc, | ||
| 5553 | 0x0120, 0x080c, 0x4c80, 0x15a8, 0x0008, 0xc485, 0x6004, 0xa084, | ||
| 5554 | 0x00ff, 0xa086, 0x0006, 0x1130, 0x7030, 0xd08c, 0x01e8, 0x6000, | ||
| 5555 | 0xd0bc, 0x11d0, 0x7284, 0xd28c, 0x0188, 0x6004, 0xa084, 0x00ff, | ||
| 5556 | 0xa082, 0x0006, 0x02b0, 0xd484, 0x1118, 0x080c, 0x4c9f, 0x0028, | ||
| 5557 | 0x080c, 0x2b9c, 0x0170, 0x080c, 0x2bc9, 0x0058, 0x080c, 0x2b1a, | ||
| 5558 | 0x080c, 0x2a19, 0x0170, 0x0028, 0x080c, 0x2b9c, 0x0110, 0x0419, | ||
| 5559 | 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2990, 0x709b, 0xffff, | ||
| 5560 | 0x0018, 0x001e, 0x015e, 0x719a, 0x004e, 0x002e, 0x00ce, 0x0005, | ||
| 5561 | 0x00c6, 0x0016, 0x709b, 0x0000, 0x2009, 0x007e, 0x080c, 0x4c80, | ||
| 5562 | 0x1138, 0x080c, 0x2b1a, 0x04a9, 0x0118, 0x70d0, 0xc0bd, 0x70d2, | ||
| 5563 | 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, | ||
| 5564 | 0x2001, 0xad56, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9807, | ||
| 5565 | 0x01d8, 0x2d00, 0x601a, 0x080c, 0x9956, 0x601f, 0x0001, 0x2001, | ||
| 5566 | 0x0000, 0x080c, 0x4c1e, 0x2001, 0x0000, 0x080c, 0x4c30, 0x0126, | ||
| 5567 | 0x2091, 0x8000, 0x7094, 0x8000, 0x7096, 0x012e, 0x2009, 0x0004, | ||
| 5568 | 0x080c, 0x80a7, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, | ||
| 5569 | 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xad56, | ||
| 5570 | 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9807, 0x0550, 0x2d00, | ||
| 5571 | 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, 0x0140, | ||
| 5572 | 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x080c, 0x2ad9, | ||
| 5573 | 0x080c, 0x9956, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4c1e, | ||
| 5574 | 0x2001, 0x0002, 0x080c, 0x4c30, 0x0126, 0x2091, 0x8000, 0x7094, | ||
| 5575 | 0x8000, 0x7096, 0x012e, 0x2009, 0x0002, 0x080c, 0x80a7, 0xa085, | ||
| 5576 | 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x0026, | ||
| 5577 | 0x2009, 0x0080, 0x080c, 0x4c80, 0x1120, 0x0031, 0x0110, 0x70d7, | ||
| 5578 | 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, | ||
| 5579 | 0x2c68, 0x080c, 0x8022, 0x01d8, 0x2d00, 0x601a, 0x080c, 0x9956, | ||
| 5580 | 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x2001, 0x0002, | ||
| 5581 | 0x080c, 0x4c30, 0x0126, 0x2091, 0x8000, 0x70d8, 0x8000, 0x70da, | ||
| 5582 | 0x012e, 0x2009, 0x0002, 0x080c, 0x80a7, 0xa085, 0x0001, 0x00ce, | ||
| 5583 | 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, | ||
| 5584 | 0x8000, 0x2009, 0x007f, 0x080c, 0x4c80, 0x1190, 0x2c68, 0x080c, | ||
| 5585 | 0x8022, 0x0170, 0x2d00, 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, | ||
| 5586 | 0x080c, 0x9956, 0x2009, 0x0022, 0x080c, 0x80a7, 0xa085, 0x0001, | ||
| 5587 | 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, | ||
| 5588 | 0x0026, 0x080c, 0x68f3, 0x080c, 0x689d, 0x080c, 0x8a15, 0x2130, | ||
| 5589 | 0x81ff, 0x0128, 0x20a9, 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, | ||
| 5590 | 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4cdc, 0x1120, 0x080c, | ||
| 5591 | 0x4ecf, 0x080c, 0x493a, 0x001e, 0x8108, 0x1f04, 0x2ac3, 0x86ff, | ||
| 5592 | 0x1110, 0x080c, 0x11d4, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, | ||
| 5593 | 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, | ||
| 5594 | 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x68e7, 0x0076, 0x2039, | ||
| 5595 | 0x0000, 0x080c, 0x681d, 0x2c08, 0x080c, 0xa712, 0x007e, 0x001e, | ||
| 5596 | 0x2e60, 0x080c, 0x4ecf, 0x6210, 0x6314, 0x080c, 0x493a, 0x6212, | ||
| 5597 | 0x6316, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, | ||
| 5598 | 0x0006, 0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x0080, 0x0150, | ||
| 5599 | 0x2071, 0xad00, 0x7094, 0xa005, 0x0110, 0x8001, 0x7096, 0x000e, | ||
| 5600 | 0x00ee, 0x0005, 0x2071, 0xad00, 0x70d8, 0xa005, 0x0dc0, 0x8001, | ||
| 5601 | 0x70da, 0x0ca8, 0x6000, 0xc08c, 0x6002, 0x0005, 0x00f6, 0x00e6, | ||
| 5602 | 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, | ||
| 5603 | 0x20a9, 0x0001, 0x0098, 0x2001, 0xad52, 0x2004, 0xd0c4, 0x0150, | ||
| 5604 | 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, | ||
| 5605 | 0xa96c, 0x004e, 0x20a9, 0x00ff, 0x2011, 0x0000, 0x0026, 0xa28e, | ||
| 5606 | 0x007e, 0x05c8, 0xa28e, 0x007f, 0x05b0, 0xa28e, 0x0080, 0x0598, | ||
| 5607 | 0xa288, 0xae34, 0x210c, 0x81ff, 0x0570, 0x8fff, 0x05c1, 0x00c6, | ||
| 5608 | 0x2160, 0x2001, 0x0001, 0x080c, 0x5037, 0x00ce, 0x2019, 0x0029, | ||
| 5609 | 0x080c, 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, 0x00c6, | ||
| 5610 | 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118, | ||
| 5611 | 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, | ||
| 5612 | 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xa712, 0x001e, 0x007e, | ||
| 5613 | 0x2160, 0x080c, 0x4ecf, 0x002e, 0x8210, 0x1f04, 0x2b3e, 0x015e, | ||
| 5614 | 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, | ||
| 5615 | 0x0026, 0x0016, 0x2001, 0xad52, 0x2004, 0xd0c4, 0x0148, 0xd0a4, | ||
| 5616 | 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xa96c, | ||
| 5617 | 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, | ||
| 5618 | 0x7284, 0x82ff, 0x01f8, 0x2011, 0xad52, 0x2214, 0xd2ac, 0x11d0, | ||
| 5619 | 0x2100, 0x080c, 0x268a, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, | ||
| 5620 | 0xa2e0, 0xb3c0, 0x2c04, 0xd384, 0x0120, 0xa084, 0xff00, 0x8007, | ||
| 5621 | 0x0010, 0xa084, 0x00ff, 0xa116, 0x0138, 0xa096, 0x00ff, 0x0110, | ||
| 5622 | 0x8318, 0x0c68, 0xa085, 0x0001, 0x00ce, 0x003e, 0x002e, 0x001e, | ||
| 5623 | 0x0005, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0xa180, 0xae34, | ||
| 5624 | 0x2004, 0xa065, 0x0178, 0x0016, 0x00c6, 0x080c, 0x9807, 0x001e, | ||
| 5625 | 0x090c, 0x14f6, 0x611a, 0x080c, 0x2ad9, 0x080c, 0x8078, 0x001e, | ||
| 5626 | 0x080c, 0x4c9f, 0x012e, 0x00ce, 0x001e, 0x0005, 0x7eef, 0x7de8, | ||
| 5627 | 0x7ce4, 0x80e2, 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, | ||
| 5628 | 0x80d5, 0x80d4, 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, | ||
| 5629 | 0x80cb, 0x80ca, 0x80c9, 0x80c7, 0x80c6, 0x77c5, 0x76c3, 0x80bc, | ||
| 5630 | 0x80ba, 0x75b9, 0x80b6, 0x74b5, 0x73b4, 0x72b3, 0x80b2, 0x80b1, | ||
| 5631 | 0x80ae, 0x71ad, 0x80ac, 0x70ab, 0x6faa, 0x6ea9, 0x80a7, 0x6da6, | ||
| 5632 | 0x6ca5, 0x6ba3, 0x6a9f, 0x699e, 0x689d, 0x809b, 0x8098, 0x6797, | ||
| 5633 | 0x6690, 0x658f, 0x6488, 0x6384, 0x6282, 0x8081, 0x8080, 0x617c, | ||
| 5634 | 0x607a, 0x8079, 0x5f76, 0x8075, 0x8074, 0x8073, 0x8072, 0x8071, | ||
| 5635 | 0x806e, 0x5e6d, 0x806c, 0x5d6b, 0x5c6a, 0x5b69, 0x8067, 0x5a66, | ||
| 5636 | 0x5965, 0x5863, 0x575c, 0x565a, 0x5559, 0x8056, 0x8055, 0x5454, | ||
| 5637 | 0x5353, 0x5252, 0x5151, 0x504e, 0x4f4d, 0x804c, 0x804b, 0x4e4a, | ||
| 5638 | 0x4d49, 0x8047, 0x4c46, 0x8045, 0x8043, 0x803c, 0x803a, 0x8039, | ||
| 5639 | 0x8036, 0x4b35, 0x8034, 0x4a33, 0x4932, 0x4831, 0x802e, 0x472d, | ||
| 5640 | 0x462c, 0x452b, 0x442a, 0x4329, 0x4227, 0x8026, 0x8025, 0x4123, | ||
| 5641 | 0x401f, 0x3f1e, 0x3e1d, 0x3d1b, 0x3c18, 0x8017, 0x8010, 0x3b0f, | ||
| 5642 | 0x3a08, 0x8004, 0x3902, 0x8001, 0x8000, 0x8000, 0x3800, 0x3700, | ||
| 5643 | 0x3600, 0x8000, 0x3500, 0x8000, 0x8000, 0x8000, 0x3400, 0x8000, | ||
| 5644 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3300, 0x3200, 0x8000, | ||
| 5645 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x3100, 0x3000, 0x8000, | ||
| 5646 | 0x8000, 0x2f00, 0x8000, 0x2e00, 0x2d00, 0x2c00, 0x8000, 0x8000, | ||
| 5647 | 0x8000, 0x2b00, 0x8000, 0x2a00, 0x2900, 0x2800, 0x8000, 0x2700, | ||
| 5648 | 0x2600, 0x2500, 0x2400, 0x2300, 0x2200, 0x8000, 0x8000, 0x2100, | ||
| 5649 | 0x2000, 0x1f00, 0x1e00, 0x1d00, 0x1c00, 0x8000, 0x8000, 0x1b00, | ||
| 5650 | 0x1a00, 0x8000, 0x1900, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, | ||
| 5651 | 0x8000, 0x1800, 0x8000, 0x1700, 0x1600, 0x1500, 0x8000, 0x1400, | ||
| 5652 | 0x1300, 0x1200, 0x1100, 0x1000, 0x0f00, 0x8000, 0x8000, 0x0e00, | ||
| 5653 | 0x0d00, 0x0c00, 0x0b00, 0x0a00, 0x0900, 0x8000, 0x8000, 0x0800, | ||
| 5654 | 0x0700, 0x8000, 0x0600, 0x8000, 0x8000, 0x8000, 0x0500, 0x0400, | ||
| 5655 | 0x0300, 0x8000, 0x0200, 0x8000, 0x8000, 0x8000, 0x0100, 0x8000, | ||
| 5656 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x0000, 0x8000, 0x8000, | ||
| 5657 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, | ||
| 5658 | 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x2071, 0xad81, | ||
| 5659 | 0x7003, 0x0002, 0xa006, 0x7012, 0x7016, 0x703a, 0x703e, 0x7033, | ||
| 5660 | 0xad91, 0x7037, 0xad91, 0x7007, 0x0001, 0x2061, 0xadd1, 0x6003, | ||
| 5661 | 0x0002, 0x0005, 0x1004, 0x2d0c, 0x0e04, 0x2d0c, 0x2071, 0xad81, | ||
| 5662 | 0x2b78, 0x7818, 0xd084, 0x1140, 0x2a60, 0x7820, 0xa08e, 0x0069, | ||
| 5663 | 0x1904, 0x2df1, 0x0804, 0x2d8a, 0x0005, 0x2071, 0xad81, 0x7004, | ||
| 5664 | 0x0002, 0x2d15, 0x2d16, 0x2d1f, 0x2d30, 0x0005, 0x1004, 0x2d1e, | ||
| 5665 | 0x0e04, 0x2d1e, 0x2b78, 0x7818, 0xd084, 0x01e8, 0x0005, 0x2b78, | ||
| 5666 | 0x2061, 0xadd1, 0x6008, 0xa08e, 0x0100, 0x0128, 0xa086, 0x0200, | ||
| 5667 | 0x0904, 0x2deb, 0x0005, 0x7014, 0x2068, 0x2a60, 0x7018, 0x0807, | ||
| 5668 | 0x7010, 0x2068, 0x6834, 0xa086, 0x0103, 0x0108, 0x0005, 0x2a60, | ||
| 5669 | 0x2b78, 0x7018, 0x0807, 0x2a60, 0x7820, 0xa08a, 0x0040, 0x1210, | ||
| 5670 | 0x61c0, 0x0042, 0x2100, 0xa08a, 0x003f, 0x1a04, 0x2de8, 0x61c0, | ||
| 5671 | 0x0804, 0x2d8a, 0x2dcc, 0x2df7, 0x2dff, 0x2e03, 0x2e0b, 0x2e11, | ||
| 5672 | 0x2e15, 0x2e21, 0x2e24, 0x2e2e, 0x2e31, 0x2de8, 0x2de8, 0x2de8, | ||
| 5673 | 0x2e34, 0x2de8, 0x2e43, 0x2e5a, 0x2e71, 0x2ee8, 0x2eed, 0x2f16, | ||
| 5674 | 0x2f67, 0x2f78, 0x2f96, 0x2fcd, 0x2fd7, 0x2fe4, 0x2ff7, 0x3018, | ||
| 5675 | 0x3021, 0x3057, 0x305d, 0x2de8, 0x3086, 0x2de8, 0x2de8, 0x2de8, | ||
| 5676 | 0x2de8, 0x2de8, 0x308d, 0x3097, 0x2de8, 0x2de8, 0x2de8, 0x2de8, | ||
| 5677 | 0x2de8, 0x2de8, 0x2de8, 0x2de8, 0x309f, 0x2de8, 0x2de8, 0x2de8, | ||
| 5678 | 0x2de8, 0x2de8, 0x30b1, 0x30b9, 0x2de8, 0x2de8, 0x2de8, 0x2de8, | ||
| 5679 | 0x2de8, 0x2de8, 0x0002, 0x30cb, 0x311f, 0x317a, 0x318a, 0x2de8, | ||
| 5680 | 0x31a4, 0x35cb, 0x3fbb, 0x2de8, 0x2de8, 0x2de8, 0x2de8, 0x2de8, | ||
| 5681 | 0x2de8, 0x2de8, 0x2de8, 0x2e2e, 0x2e31, 0x35cd, 0x2de8, 0x35da, | ||
| 5682 | 0x403c, 0x4097, 0x40fb, 0x2de8, 0x415a, 0x4180, 0x419f, 0x2de8, | ||
| 5683 | 0x2de8, 0x2de8, 0x2de8, 0x35de, 0x376b, 0x3785, 0x37a3, 0x3804, | ||
| 5684 | 0x3858, 0x3863, 0x389a, 0x38a9, 0x38b8, 0x38bb, 0x38de, 0x3928, | ||
| 5685 | 0x398e, 0x399b, 0x3a9c, 0x3bb3, 0x3bdc, 0x3cda, 0x3cfc, 0x3d08, | ||
| 5686 | 0x3d41, 0x3e05, 0x2de8, 0x2de8, 0x2de8, 0x2de8, 0x3e6d, 0x3e88, | ||
| 5687 | 0x3efa, 0x3fac, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x3c39, | ||
| 5688 | 0x0126, 0x2091, 0x8000, 0x0e04, 0x2dd8, 0x7818, 0xd084, 0x0110, | ||
| 5689 | 0x012e, 0x0cb0, 0x7c22, 0x7926, 0x7a2a, 0x7b2e, 0x781b, 0x0001, | ||
| 5690 | 0x2091, 0x4080, 0x7007, 0x0001, 0x2091, 0x5000, 0x012e, 0x0005, | ||
| 5691 | 0x2021, 0x4001, 0x0c18, 0x2021, 0x4002, 0x0c00, 0x2021, 0x4003, | ||
| 5692 | 0x08e8, 0x2021, 0x4005, 0x08d0, 0x2021, 0x4006, 0x08b8, 0xa02e, | ||
| 5693 | 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x3c46, 0x7823, | ||
| 5694 | 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, | ||
| 5695 | 0x7930, 0x0804, 0x3c49, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, | ||
| 5696 | 0x2dcc, 0x7924, 0x2114, 0x0804, 0x2dcc, 0x2099, 0x0009, 0x20a1, | ||
| 5697 | 0x0009, 0x20a9, 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0804, | ||
| 5698 | 0x2dcc, 0x7824, 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0001, | ||
| 5699 | 0x2019, 0x001b, 0x783b, 0x0017, 0x0804, 0x2dcc, 0x7d38, 0x7c3c, | ||
| 5700 | 0x0840, 0x7d38, 0x7c3c, 0x0888, 0x2061, 0x1000, 0xe10c, 0xa006, | ||
| 5701 | 0x2c15, 0xa200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0xa005, 0x0904, | ||
| 5702 | 0x2dcc, 0x0804, 0x2dee, 0x2069, 0xad51, 0x7824, 0x7930, 0xa11a, | ||
| 5703 | 0x1a04, 0x2df4, 0x8019, 0x0904, 0x2df4, 0x684a, 0x6942, 0x782c, | ||
| 5704 | 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x5a1c, | ||
| 5705 | 0x0804, 0x2dcc, 0x2069, 0xad51, 0x7824, 0x7934, 0xa11a, 0x1a04, | ||
| 5706 | 0x2df4, 0x8019, 0x0904, 0x2df4, 0x684e, 0x6946, 0x782c, 0x6862, | ||
| 5707 | 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x50d9, 0x0804, | ||
| 5708 | 0x2dcc, 0xa02e, 0x2520, 0x81ff, 0x1904, 0x2df1, 0x7924, 0x7b28, | ||
| 5709 | 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xad88, 0x41a1, 0x080c, 0x3c05, | ||
| 5710 | 0x0904, 0x2df1, 0x2009, 0x0020, 0x080c, 0x3c46, 0x701b, 0x2e89, | ||
| 5711 | 0x0005, 0x6834, 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0120, | ||
| 5712 | 0xa096, 0x0019, 0x1904, 0x2df1, 0x810f, 0xa18c, 0x00ff, 0x0904, | ||
| 5713 | 0x2df1, 0x710e, 0x700c, 0x8001, 0x0528, 0x700e, 0x080c, 0x3c05, | ||
| 5714 | 0x0904, 0x2df1, 0x2009, 0x0020, 0x2061, 0xadd1, 0x6224, 0x6328, | ||
| 5715 | 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, 0x0000, | ||
| 5716 | 0xa5a9, 0x0000, 0x080c, 0x3c46, 0x701b, 0x2eb7, 0x0005, 0x6834, | ||
| 5717 | 0xa084, 0x00ff, 0xa096, 0x0002, 0x0120, 0xa096, 0x000a, 0x1904, | ||
| 5718 | 0x2df1, 0x08c0, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, 0x080c, | ||
| 5719 | 0x4b7c, 0x1128, 0x7007, 0x0003, 0x701b, 0x2ed1, 0x0005, 0x080c, | ||
| 5720 | 0x51df, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, 0xad88, | ||
| 5721 | 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, | ||
| 5722 | 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x012e, 0x0804, 0x3c49, | ||
| 5723 | 0x61a8, 0x7824, 0x60aa, 0x0804, 0x2dcc, 0x2091, 0x8000, 0x7823, | ||
| 5724 | 0x4000, 0x7827, 0x4953, 0x782b, 0x5020, 0x782f, 0x2020, 0x2009, | ||
| 5725 | 0x017f, 0x2104, 0x7832, 0x3f00, 0x7836, 0x2061, 0x0100, 0x6200, | ||
| 5726 | 0x2061, 0x0200, 0x603c, 0x8007, 0xa205, 0x783a, 0x2009, 0x04fd, | ||
| 5727 | 0x2104, 0x783e, 0x781b, 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, | ||
| 5728 | 0x2071, 0x0010, 0x20c1, 0x00f0, 0x0804, 0x0427, 0x81ff, 0x1904, | ||
| 5729 | 0x2df1, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4cdc, 0x1904, | ||
| 5730 | 0x2df4, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0210, 0x0804, | ||
| 5731 | 0x2df4, 0x7c28, 0x7d2c, 0x080c, 0x4e96, 0xd28c, 0x1118, 0x080c, | ||
| 5732 | 0x4e41, 0x0010, 0x080c, 0x4e6f, 0x1518, 0x2061, 0xb400, 0x0126, | ||
| 5733 | 0x2091, 0x8000, 0x6000, 0xa086, 0x0000, 0x0148, 0x6010, 0xa06d, | ||
| 5734 | 0x0130, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0150, 0x012e, | ||
| 5735 | 0xace0, 0x0018, 0x2001, 0xad16, 0x2004, 0xac02, 0x1a04, 0x2df1, | ||
| 5736 | 0x0c30, 0x080c, 0x929c, 0x012e, 0x0904, 0x2df1, 0x0804, 0x2dcc, | ||
| 5737 | 0xa00e, 0x2001, 0x0005, 0x080c, 0x51df, 0x0126, 0x2091, 0x8000, | ||
| 5738 | 0x080c, 0x9803, 0x080c, 0x510c, 0x012e, 0x0804, 0x2dcc, 0x81ff, | ||
| 5739 | 0x1904, 0x2df1, 0x080c, 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4d96, | ||
| 5740 | 0x0904, 0x2df1, 0x080c, 0x4ea2, 0x0904, 0x2df1, 0x0804, 0x2dcc, | ||
| 5741 | 0x81ff, 0x1904, 0x2df1, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x080c, | ||
| 5742 | 0x4f0d, 0x0904, 0x2df1, 0x2019, 0x0005, 0x080c, 0x4ebd, 0x0904, | ||
| 5743 | 0x2df1, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2df4, 0x8003, 0x800b, | ||
| 5744 | 0x810b, 0xa108, 0x080c, 0x6519, 0x0804, 0x2dcc, 0x0126, 0x2091, | ||
| 5745 | 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0448, 0x2029, 0x00ff, | ||
| 5746 | 0x644c, 0x2400, 0xa506, 0x01f0, 0x2508, 0x080c, 0x4cdc, 0x11d0, | ||
| 5747 | 0x080c, 0x4f0d, 0x1128, 0x2009, 0x0002, 0x62b0, 0x2518, 0x00b8, | ||
| 5748 | 0x2019, 0x0004, 0x080c, 0x4ebd, 0x1118, 0x2009, 0x0006, 0x0078, | ||
| 5749 | 0x7824, 0xa08a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, | ||
| 5750 | 0x080c, 0x6519, 0x8529, 0x1ae8, 0x012e, 0x0804, 0x2dcc, 0x012e, | ||
| 5751 | 0x0804, 0x2df1, 0x012e, 0x0804, 0x2df4, 0x080c, 0x3c1a, 0x0904, | ||
| 5752 | 0x2df4, 0x080c, 0x4dfc, 0x080c, 0x4e96, 0x0804, 0x2dcc, 0x81ff, | ||
| 5753 | 0x1904, 0x2df1, 0x080c, 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4ded, | ||
| 5754 | 0x080c, 0x4e96, 0x0804, 0x2dcc, 0x81ff, 0x1904, 0x2df1, 0x080c, | ||
| 5755 | 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4e71, 0x0904, 0x2df1, 0x080c, | ||
| 5756 | 0x4bc0, 0x080c, 0x4e3a, 0x080c, 0x4e96, 0x0804, 0x2dcc, 0x080c, | ||
| 5757 | 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4d96, 0x0904, 0x2df1, 0x62a0, | ||
| 5758 | 0x2019, 0x0005, 0x00c6, 0x080c, 0x4ecf, 0x2061, 0x0000, 0x080c, | ||
| 5759 | 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, 0x2009, 0x0000, | ||
| 5760 | 0x080c, 0xa712, 0x007e, 0x00ce, 0x080c, 0x4e96, 0x0804, 0x2dcc, | ||
| 5761 | 0x080c, 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4e96, 0x2208, 0x0804, | ||
| 5762 | 0x2dcc, 0x0156, 0x00d6, 0x00e6, 0x2069, 0xae13, 0x6810, 0x6914, | ||
| 5763 | 0xa10a, 0x1210, 0x2009, 0x0000, 0x6816, 0x2011, 0x0000, 0x2019, | ||
| 5764 | 0x0000, 0x20a9, 0x007e, 0x2069, 0xae34, 0x2d04, 0xa075, 0x0130, | ||
| 5765 | 0x704c, 0x0071, 0xa210, 0x7080, 0x0059, 0xa318, 0x8d68, 0x1f04, | ||
| 5766 | 0x3035, 0x2300, 0xa218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x2dcc, | ||
| 5767 | 0x00f6, 0x0016, 0xa07d, 0x0140, 0x2001, 0x0000, 0x8000, 0x2f0c, | ||
| 5768 | 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, | ||
| 5769 | 0xae13, 0x6910, 0x62ac, 0x0804, 0x2dcc, 0x81ff, 0x1904, 0x2df1, | ||
| 5770 | 0x614c, 0xa190, 0x2be6, 0x2215, 0xa294, 0x00ff, 0x636c, 0x83ff, | ||
| 5771 | 0x0108, 0x6270, 0x67d0, 0xd79c, 0x0118, 0x2031, 0x0001, 0x0090, | ||
| 5772 | 0xd7ac, 0x0118, 0x2031, 0x0003, 0x0068, 0xd7a4, 0x0118, 0x2031, | ||
| 5773 | 0x0002, 0x0040, 0x080c, 0x574f, 0x1118, 0x2031, 0x0004, 0x0010, | ||
| 5774 | 0x2031, 0x0000, 0x7e3a, 0x7f3e, 0x0804, 0x2dcc, 0x613c, 0x6240, | ||
| 5775 | 0x2019, 0xafa3, 0x231c, 0x0804, 0x2dcc, 0x0126, 0x2091, 0x8000, | ||
| 5776 | 0x6134, 0xa006, 0x2010, 0x2018, 0x012e, 0x0804, 0x2dcc, 0x080c, | ||
| 5777 | 0x3c2a, 0x0904, 0x2df4, 0x6244, 0x6338, 0x0804, 0x2dcc, 0x613c, | ||
| 5778 | 0x6240, 0x7824, 0x603e, 0x7b28, 0x6342, 0x2069, 0xad51, 0x831f, | ||
| 5779 | 0xa305, 0x6816, 0x782c, 0x2069, 0xafa3, 0x2d1c, 0x206a, 0x0804, | ||
| 5780 | 0x2dcc, 0x0126, 0x2091, 0x8000, 0x7824, 0x6036, 0x012e, 0x0804, | ||
| 5781 | 0x2dcc, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x7828, 0xa00d, 0x0904, | ||
| 5782 | 0x2df4, 0x782c, 0xa005, 0x0904, 0x2df4, 0x6244, 0x6146, 0x6338, | ||
| 5783 | 0x603a, 0x0804, 0x2dcc, 0x2001, 0xad00, 0x2004, 0xa086, 0x0003, | ||
| 5784 | 0x1904, 0x2df1, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, 0xa18c, | ||
| 5785 | 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0xad14, 0x2004, 0xa085, | ||
| 5786 | 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2be6, 0x210d, | ||
| 5787 | 0xa18c, 0x00ff, 0x2001, 0xad14, 0x2004, 0xa116, 0x0550, 0x810f, | ||
| 5788 | 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x8022, 0x000e, | ||
| 5789 | 0x01e0, 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x3c05, | ||
| 5790 | 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, | ||
| 5791 | 0xc0fd, 0x683a, 0x701b, 0x3173, 0x2d00, 0x6012, 0x2009, 0x0032, | ||
| 5792 | 0x080c, 0x80a7, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, | ||
| 5793 | 0x2df1, 0x00ce, 0x0804, 0x2df4, 0x080c, 0x8078, 0x0cb0, 0x2001, | ||
| 5794 | 0xad00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2df1, 0x00c6, 0x2061, | ||
| 5795 | 0x0100, 0x7924, 0x810f, 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, | ||
| 5796 | 0x2001, 0xad14, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, | ||
| 5797 | 0x16a0, 0xa188, 0x2be6, 0x210d, 0xa18c, 0x00ff, 0x2001, 0xad14, | ||
| 5798 | 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, | ||
| 5799 | 0x0006, 0x080c, 0x8022, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, | ||
| 5800 | 0x601f, 0x0001, 0x080c, 0x3c05, 0x01d8, 0x6837, 0x0000, 0x7007, | ||
| 5801 | 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x3173, | ||
| 5802 | 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x80a7, 0x012e, 0x00ce, | ||
| 5803 | 0x0005, 0x012e, 0x00ce, 0x0804, 0x2df1, 0x00ce, 0x0804, 0x2df4, | ||
| 5804 | 0x080c, 0x8078, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904, 0x2df1, | ||
| 5805 | 0x0804, 0x2dcc, 0x2061, 0xb048, 0x0126, 0x2091, 0x8000, 0x6000, | ||
| 5806 | 0xd084, 0x0128, 0x6104, 0x6208, 0x012e, 0x0804, 0x2dcc, 0x012e, | ||
| 5807 | 0x0804, 0x2df4, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x574f, 0x0904, | ||
| 5808 | 0x2df1, 0x0126, 0x2091, 0x8000, 0x6244, 0x6064, 0xa202, 0x0248, | ||
| 5809 | 0xa085, 0x0001, 0x080c, 0x26c0, 0x080c, 0x436e, 0x012e, 0x0804, | ||
| 5810 | 0x2dcc, 0x012e, 0x0804, 0x2df4, 0x0126, 0x2091, 0x8000, 0x7824, | ||
| 5811 | 0xa084, 0x0007, 0x0002, 0x31b6, 0x31bf, 0x31c6, 0x31b3, 0x31b3, | ||
| 5812 | 0x31b3, 0x31b3, 0x31b3, 0x012e, 0x0804, 0x2df4, 0x2009, 0x0114, | ||
| 5813 | 0x2104, 0xa085, 0x0800, 0x200a, 0x080c, 0x332f, 0x0070, 0x2009, | ||
| 5814 | 0x010b, 0x200b, 0x0010, 0x080c, 0x332f, 0x0038, 0x81ff, 0x0128, | ||
| 5815 | 0x012e, 0x2021, 0x400b, 0x0804, 0x2dce, 0x0086, 0x0096, 0x00a6, | ||
| 5816 | 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2009, 0x0101, 0x210c, | ||
| 5817 | 0x0016, 0x2001, 0x0138, 0x200c, 0x2003, 0x0001, 0x0016, 0x2001, | ||
| 5818 | 0x007a, 0x2034, 0x2001, 0x007b, 0x202c, 0xa006, 0x2048, 0x2050, | ||
| 5819 | 0x2058, 0x080c, 0x3570, 0x080c, 0x34da, 0xa03e, 0x2720, 0x00f6, | ||
| 5820 | 0x00e6, 0x00c6, 0x2d60, 0x2071, 0xb01e, 0x2079, 0x0020, 0x00d6, | ||
| 5821 | 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0140, 0x2001, 0x007d, 0x2004, | ||
| 5822 | 0x783e, 0x2001, 0x007c, 0x2004, 0x783a, 0x00de, 0x2011, 0x0001, | ||
| 5823 | 0x080c, 0x3486, 0x080c, 0x3486, 0x00ce, 0x00ee, 0x00fe, 0x080c, | ||
| 5824 | 0x33d5, 0x080c, 0x34ae, 0x080c, 0x342b, 0x080c, 0x3394, 0x080c, | ||
| 5825 | 0x33c5, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd094, 0x0530, 0x7814, | ||
| 5826 | 0xa084, 0x0184, 0xa085, 0x0010, 0x7816, 0x2079, 0x0140, 0x080c, | ||
| 5827 | 0x330d, 0x1110, 0x00fe, 0x0430, 0x7804, 0xd0dc, 0x0dc0, 0x2079, | ||
| 5828 | 0x0100, 0x7827, 0x0086, 0x7814, 0xa084, 0x0184, 0xa085, 0x0032, | ||
| 5829 | 0x7816, 0x080c, 0x330d, 0x1110, 0x00fe, 0x00a0, 0x7824, 0xd0bc, | ||
| 5830 | 0x0dc0, 0x7827, 0x0080, 0xa026, 0x7c16, 0x7824, 0xd0ac, 0x0130, | ||
| 5831 | 0x8b58, 0x080c, 0x3317, 0x00fe, 0x0804, 0x32d7, 0x00fe, 0x080c, | ||
| 5832 | 0x330d, 0x1150, 0x8948, 0x2001, 0x007a, 0x2602, 0x2001, 0x007b, | ||
| 5833 | 0x2502, 0x080c, 0x3317, 0x0088, 0x87ff, 0x0140, 0x2001, 0x0201, | ||
| 5834 | 0x2004, 0xa005, 0x1904, 0x3211, 0x8739, 0x0038, 0x2001, 0xaffd, | ||
| 5835 | 0x2004, 0xa086, 0x0000, 0x1904, 0x3211, 0x2001, 0x0033, 0x2003, | ||
| 5836 | 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0xa605, 0x0904, 0x32d7, | ||
| 5837 | 0x7824, 0xd0bc, 0x0128, 0x2900, 0xaa05, 0xab05, 0x1904, 0x32d7, | ||
| 5838 | 0x6033, 0x000d, 0x2001, 0x0030, 0x2003, 0x0004, 0x7824, 0xd0ac, | ||
| 5839 | 0x1148, 0x2001, 0xaffd, 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, | ||
| 5840 | 0x0009, 0x0040, 0x6027, 0x0001, 0x2001, 0x0075, 0x2004, 0xa005, | ||
| 5841 | 0x0108, 0x6026, 0x2c00, 0x601a, 0x20e1, 0x9040, 0x2d00, 0x681a, | ||
| 5842 | 0x6833, 0x000d, 0x7824, 0xd0a4, 0x1180, 0x6827, 0x0000, 0x00c6, | ||
| 5843 | 0x20a9, 0x0004, 0x2061, 0x0020, 0x6003, 0x0008, 0x2001, 0x0203, | ||
| 5844 | 0x2004, 0x1f04, 0x32ac, 0x00ce, 0x0040, 0x6827, 0x0001, 0x2001, | ||
| 5845 | 0x0074, 0x2004, 0xa005, 0x0108, 0x6826, 0x00f6, 0x00c6, 0x2079, | ||
| 5846 | 0x0100, 0x2061, 0x0020, 0x7827, 0x0002, 0x2001, 0x0072, 0x2004, | ||
| 5847 | 0xa084, 0xfff8, 0x601a, 0x0006, 0x2001, 0x0073, 0x2004, 0x601e, | ||
| 5848 | 0x78c6, 0x000e, 0x78ca, 0x00ce, 0x00fe, 0x0804, 0x31ef, 0x2061, | ||
| 5849 | 0x0100, 0x6027, 0x0002, 0x001e, 0x61e2, 0x001e, 0x6106, 0x7824, | ||
| 5850 | 0xa084, 0x0003, 0xa086, 0x0002, 0x0188, 0x20e1, 0x9028, 0x6050, | ||
| 5851 | 0xa084, 0xf7ef, 0x6052, 0x602f, 0x0000, 0x602c, 0xc0ac, 0x602e, | ||
| 5852 | 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, 0x2908, 0x2a10, | ||
| 5853 | 0x2b18, 0x2b00, 0xaa05, 0xa905, 0x00fe, 0x00ee, 0x00de, 0x00ce, | ||
| 5854 | 0x00be, 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x2dcc, | ||
| 5855 | 0x012e, 0x2021, 0x400c, 0x0804, 0x2dce, 0xa085, 0x0001, 0x1d04, | ||
| 5856 | 0x3316, 0x2091, 0x6000, 0x8420, 0xa486, 0x0064, 0x0005, 0x2001, | ||
| 5857 | 0x0105, 0x2003, 0x0010, 0x2001, 0x0030, 0x2003, 0x0004, 0x2001, | ||
| 5858 | 0x0020, 0x2003, 0x0004, 0x2001, 0xaffd, 0x2003, 0x0000, 0x2001, | ||
| 5859 | 0xb01e, 0x2003, 0x0000, 0x20e1, 0xf000, 0xa026, 0x0005, 0x00f6, | ||
| 5860 | 0x2079, 0x0100, 0x2001, 0xad14, 0x200c, 0x7932, 0x7936, 0x080c, | ||
| 5861 | 0x26a0, 0x7850, 0xa084, 0x0980, 0xa085, 0x0030, 0x7852, 0x2019, | ||
| 5862 | 0x01f4, 0x8319, 0x1df0, 0xa084, 0x0980, 0x7852, 0x782c, 0xc0ad, | ||
| 5863 | 0x782e, 0x20a9, 0x0046, 0x1d04, 0x334b, 0x2091, 0x6000, 0x1f04, | ||
| 5864 | 0x334b, 0x7850, 0xa085, 0x0400, 0x7852, 0x2001, 0x0009, 0x2004, | ||
| 5865 | 0xa084, 0x0003, 0xa086, 0x0001, 0x1118, 0x782c, 0xc0ac, 0x782e, | ||
| 5866 | 0x784b, 0xf7f7, 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x000e, | ||
| 5867 | 0xe000, 0x1f04, 0x3368, 0x7850, 0xa085, 0x1400, 0x7852, 0x2019, | ||
| 5868 | 0x61a8, 0x7854, 0xe000, 0xe000, 0xd08c, 0x1110, 0x8319, 0x1dc8, | ||
| 5869 | 0x7827, 0x0048, 0x7850, 0xa085, 0x0400, 0x7852, 0x7843, 0x0040, | ||
| 5870 | 0x2019, 0x01f4, 0xe000, 0xe000, 0x8319, 0x1de0, 0x2001, 0x0140, | ||
| 5871 | 0x2003, 0x0100, 0x7827, 0x0020, 0x7843, 0x0000, 0x2003, 0x0000, | ||
| 5872 | 0x7827, 0x0048, 0x00fe, 0x0005, 0x7824, 0xd0ac, 0x11c8, 0x00f6, | ||
| 5873 | 0x00e6, 0x2071, 0xaffd, 0x2079, 0x0030, 0x2001, 0x0201, 0x2004, | ||
| 5874 | 0xa005, 0x0160, 0x7000, 0xa086, 0x0000, 0x1140, 0x0051, 0xd0bc, | ||
| 5875 | 0x0108, 0x8738, 0x7003, 0x0003, 0x7803, 0x0019, 0x00ee, 0x00fe, | ||
| 5876 | 0x0005, 0x780c, 0xa08c, 0x0070, 0x0178, 0x2009, 0x007a, 0x260a, | ||
| 5877 | 0x2009, 0x007b, 0x250a, 0xd0b4, 0x0108, 0x8a50, 0xd0ac, 0x0108, | ||
| 5878 | 0x8948, 0xd0a4, 0x0108, 0x8b58, 0x0005, 0x00f6, 0x2079, 0x0200, | ||
| 5879 | 0x781c, 0xd084, 0x0140, 0x20e1, 0x0007, 0x20e1, 0x2000, 0x2001, | ||
| 5880 | 0x020a, 0x2004, 0x0ca8, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x0100, | ||
| 5881 | 0x2009, 0xad14, 0x210c, 0x716e, 0x7063, 0x0100, 0x7166, 0x719e, | ||
| 5882 | 0x706b, 0x0000, 0x7073, 0x0809, 0x7077, 0x0008, 0x7078, 0xa080, | ||
| 5883 | 0x0100, 0x707a, 0x7080, 0x8000, 0x7082, 0x7087, 0xaaaa, 0xa006, | ||
| 5884 | 0x708a, 0x708e, 0x707e, 0x70d6, 0x70ab, 0x0036, 0x70af, 0x95d5, | ||
| 5885 | 0x7027, 0x0080, 0x7014, 0xa084, 0x0184, 0xa085, 0x0032, 0x7016, | ||
| 5886 | 0x080c, 0x34ae, 0x080c, 0x330d, 0x1110, 0x8421, 0x0028, 0x7024, | ||
| 5887 | 0xd0bc, 0x0db0, 0x7027, 0x0080, 0x00f6, 0x00e6, 0x2071, 0xaffd, | ||
| 5888 | 0x2079, 0x0030, 0x00d6, 0x2069, 0x0000, 0x6824, 0xd0b4, 0x0120, | ||
| 5889 | 0x683c, 0x783e, 0x6838, 0x783a, 0x00de, 0x2011, 0x0011, 0x080c, | ||
| 5890 | 0x3486, 0x2011, 0x0001, 0x080c, 0x3486, 0x00ee, 0x00fe, 0x7017, | ||
| 5891 | 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0xaffd, 0x2079, | ||
| 5892 | 0x0030, 0x7904, 0xd1fc, 0x0904, 0x3483, 0x7803, 0x0002, 0xa026, | ||
| 5893 | 0xd19c, 0x1904, 0x347f, 0x7000, 0x0002, 0x3483, 0x3441, 0x3465, | ||
| 5894 | 0x347f, 0xd1bc, 0x1150, 0xd1dc, 0x1150, 0x8001, 0x7002, 0x2011, | ||
| 5895 | 0x0001, 0x04e1, 0x05c0, 0x04d1, 0x04b0, 0x780f, 0x0000, 0x7820, | ||
| 5896 | 0x7924, 0x7803, 0x0004, 0x7822, 0x7926, 0x2001, 0x0201, 0x200c, | ||
| 5897 | 0x81ff, 0x0de8, 0x080c, 0x33b1, 0x2009, 0x0001, 0x7808, 0xd0ec, | ||
| 5898 | 0x0110, 0x2009, 0x0011, 0x7902, 0x00f0, 0x8001, 0x7002, 0xa184, | ||
| 5899 | 0x0880, 0x1138, 0x7804, 0xd0fc, 0x1940, 0x2011, 0x0001, 0x00b1, | ||
| 5900 | 0x0090, 0x6030, 0xa092, 0x0004, 0xa086, 0x0009, 0x1120, 0x6000, | ||
| 5901 | 0x601a, 0x2011, 0x0025, 0x6232, 0xd1dc, 0x1988, 0x0870, 0x7803, | ||
| 5902 | 0x0004, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x6024, 0xa005, | ||
| 5903 | 0x0520, 0x8001, 0x6026, 0x6018, 0x6130, 0xa140, 0x2804, 0x7832, | ||
| 5904 | 0x8840, 0x2804, 0x7836, 0x8840, 0x2804, 0x7822, 0x8840, 0x2804, | ||
| 5905 | 0x7826, 0x8840, 0x7a02, 0x7000, 0x8000, 0x7002, 0x6018, 0xa802, | ||
| 5906 | 0xa08a, 0x0029, 0x1138, 0x6018, 0xa080, 0x0001, 0x2004, 0x601a, | ||
| 5907 | 0x2001, 0x000d, 0x6032, 0xa085, 0x0001, 0x0005, 0x00f6, 0x00e6, | ||
| 5908 | 0x00c6, 0x2071, 0xb01e, 0x2079, 0x0020, 0x7904, 0xd1fc, 0x01f0, | ||
| 5909 | 0x7803, 0x0002, 0x2d60, 0xa026, 0x7000, 0x0002, 0x34d6, 0x34c1, | ||
| 5910 | 0x34cd, 0x8001, 0x7002, 0xd19c, 0x1188, 0x2011, 0x0001, 0x080c, | ||
| 5911 | 0x3486, 0x0160, 0x080c, 0x3486, 0x0048, 0x8001, 0x7002, 0x7804, | ||
| 5912 | 0xd0fc, 0x1d30, 0x2011, 0x0001, 0x080c, 0x3486, 0x00ce, 0x00ee, | ||
| 5913 | 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x601b, | ||
| 5914 | 0x0004, 0x2061, 0x0100, 0x60cf, 0x0400, 0x6004, 0xc0ac, 0xa085, | ||
| 5915 | 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005, 0x01f8, 0x2038, | ||
| 5916 | 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c, 0x080c, 0x3c05, | ||
| 5917 | 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, | ||
| 5918 | 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, | ||
| 5919 | 0x000d, 0x04a1, 0x1d90, 0x2d00, 0x681a, 0x0088, 0x080c, 0x3c05, | ||
| 5920 | 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00, 0x681a, 0x2001, | ||
| 5921 | 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004, 0x7006, 0x2061, | ||
| 5922 | 0x0020, 0x2079, 0x0100, 0x6013, 0x0400, 0x20e1, 0x9040, 0x2001, | ||
| 5923 | 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x601a, 0x0006, 0x2001, | ||
| 5924 | 0x0073, 0x2004, 0x700e, 0x601e, 0x78c6, 0x000e, 0x78ca, 0xa006, | ||
| 5925 | 0x603a, 0x603e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x2071, | ||
| 5926 | 0x0010, 0x20a0, 0x2099, 0x0014, 0x7003, 0x0026, 0x7432, 0x7336, | ||
| 5927 | 0xa006, 0x703a, 0x703e, 0x810b, 0x810b, 0x21a8, 0x810b, 0x7122, | ||
| 5928 | 0x7003, 0x0041, 0x7004, 0xd0fc, 0x0de8, 0x7003, 0x0002, 0x7003, | ||
| 5929 | 0x0040, 0x53a5, 0x7430, 0x7334, 0x87ff, 0x0180, 0x00c6, 0x00d6, | ||
| 5930 | 0x2d60, 0x00c6, 0x080c, 0x3c05, 0x00ce, 0x6018, 0x2070, 0x2d00, | ||
| 5931 | 0x7006, 0x601a, 0x00de, 0x00ce, 0xa085, 0x0001, 0x00ee, 0x0005, | ||
| 5932 | 0x00e6, 0x2001, 0x0075, 0x2004, 0xa005, 0x0508, 0x2038, 0x2001, | ||
| 5933 | 0x0078, 0x2024, 0x2001, 0x0079, 0x201c, 0x080c, 0x3c05, 0x2d60, | ||
| 5934 | 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, | ||
| 5935 | 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, | ||
| 5936 | 0x000d, 0x080c, 0x353e, 0x1d88, 0x2d00, 0x681a, 0x00e0, 0x080c, | ||
| 5937 | 0x3c05, 0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, 0x0001, 0x2c00, | ||
| 5938 | 0x601a, 0x2001, 0x0078, 0x2004, 0x2072, 0x2001, 0x0079, 0x2004, | ||
| 5939 | 0x7006, 0x2001, 0x0072, 0x2004, 0xa084, 0xfff8, 0x700a, 0x2001, | ||
| 5940 | 0x0073, 0x2004, 0x700e, 0x2001, 0x0030, 0x2003, 0x0004, 0x7824, | ||
| 5941 | 0xd0ac, 0x1178, 0x2001, 0x0101, 0x200c, 0xc1ed, 0x2102, 0x6027, | ||
| 5942 | 0x0000, 0x2001, 0xaffd, 0x2003, 0x0003, 0x2001, 0x0030, 0x2003, | ||
| 5943 | 0x0009, 0x00ee, 0x0005, 0x0804, 0x2dcc, 0x0126, 0x2091, 0x8000, | ||
| 5944 | 0x20a9, 0x0011, 0x2001, 0xad40, 0x20a0, 0xa006, 0x40a4, 0x012e, | ||
| 5945 | 0x0804, 0x2dcc, 0x7d38, 0x7c3c, 0x0804, 0x2e73, 0x080c, 0x3c05, | ||
| 5946 | 0x0904, 0x2df1, 0x080c, 0x574f, 0x0110, 0x080c, 0x491f, 0x2009, | ||
| 5947 | 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3c46, 0x701b, | ||
| 5948 | 0x35f2, 0x0005, 0xade8, 0x000d, 0x6800, 0xa005, 0x0904, 0x2df4, | ||
| 5949 | 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x2df4, 0xd094, 0x00c6, | ||
| 5950 | 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0xa292, 0x0005, 0x0218, | ||
| 5951 | 0xa18c, 0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, 0x00ce, 0xd08c, | ||
| 5952 | 0x00c6, 0x2061, 0x0100, 0x6104, 0x0118, 0xa18d, 0x0010, 0x0010, | ||
| 5953 | 0xa18c, 0xffef, 0x6106, 0x00ce, 0x2009, 0x0100, 0x210c, 0xa18a, | ||
| 5954 | 0x0002, 0x0268, 0xd084, 0x0158, 0x6a28, 0xa28a, 0x007f, 0x1a04, | ||
| 5955 | 0x2df4, 0xa288, 0x2be6, 0x210d, 0xa18c, 0x00ff, 0x6156, 0xd0dc, | ||
| 5956 | 0x0130, 0x6828, 0xa08a, 0x007f, 0x1a04, 0x2df4, 0x604e, 0x6808, | ||
| 5957 | 0xa08a, 0x0100, 0x0a04, 0x2df4, 0xa08a, 0x0841, 0x1a04, 0x2df4, | ||
| 5958 | 0xa084, 0x0007, 0x1904, 0x2df4, 0x680c, 0xa005, 0x0904, 0x2df4, | ||
| 5959 | 0x6810, 0xa005, 0x0904, 0x2df4, 0x6848, 0x6940, 0xa10a, 0x1a04, | ||
| 5960 | 0x2df4, 0x8001, 0x0904, 0x2df4, 0x684c, 0x6944, 0xa10a, 0x1a04, | ||
| 5961 | 0x2df4, 0x8001, 0x0904, 0x2df4, 0x6804, 0xd0fc, 0x0560, 0x080c, | ||
| 5962 | 0x3c05, 0x0904, 0x2df1, 0x2009, 0x0014, 0x7a2c, 0x7b28, 0x7c3c, | ||
| 5963 | 0x7d38, 0xa290, 0x0038, 0xa399, 0x0000, 0x080c, 0x3c46, 0x701b, | ||
| 5964 | 0x3672, 0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, 0x2d98, 0x2069, | ||
| 5965 | 0xad6d, 0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, 0x2001, 0xad71, | ||
| 5966 | 0x200c, 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, 0x6004, 0xa085, | ||
| 5967 | 0x0b00, 0x6006, 0x00ce, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xad51, | ||
| 5968 | 0x2da0, 0x53a3, 0x6814, 0xa08c, 0x00ff, 0x613e, 0x8007, 0xa084, | ||
| 5969 | 0x00ff, 0x6042, 0x080c, 0x5a1c, 0x080c, 0x5070, 0x080c, 0x50d9, | ||
| 5970 | 0x6000, 0xa086, 0x0000, 0x1904, 0x3755, 0x6808, 0x602a, 0x080c, | ||
| 5971 | 0x22f8, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, | ||
| 5972 | 0x0268, 0x2009, 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b, | ||
| 5973 | 0x0000, 0x0036, 0x6b08, 0x080c, 0x26fb, 0x003e, 0x6818, 0x691c, | ||
| 5974 | 0x6a20, 0x6b24, 0x8007, 0x810f, 0x8217, 0x831f, 0x6016, 0x611a, | ||
| 5975 | 0x621e, 0x6322, 0x6c04, 0xd4f4, 0x0148, 0x6830, 0x6934, 0x6a38, | ||
| 5976 | 0x6b3c, 0x8007, 0x810f, 0x8217, 0x831f, 0x0010, 0xa084, 0xf0ff, | ||
| 5977 | 0x6006, 0x610a, 0x620e, 0x6312, 0x8007, 0x810f, 0x8217, 0x831f, | ||
| 5978 | 0x20a9, 0x0004, 0x20a1, 0xafad, 0x40a1, 0x080c, 0x659c, 0x6904, | ||
| 5979 | 0xd1fc, 0x0520, 0x00c6, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70, | ||
| 5980 | 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, | ||
| 5981 | 0x5fa9, 0x6878, 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, | ||
| 5982 | 0x600a, 0xa184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, | ||
| 5983 | 0x0010, 0x6003, 0x0001, 0x1f04, 0x36f3, 0x00ce, 0x2069, 0xad51, | ||
| 5984 | 0x2001, 0xaf9d, 0x6a80, 0xa294, 0x0030, 0xa28e, 0x0000, 0x0170, | ||
| 5985 | 0xa28e, 0x0010, 0x0118, 0xa28e, 0x0020, 0x0140, 0x2003, 0xaaaa, | ||
| 5986 | 0x080c, 0x2744, 0x2001, 0xaf8e, 0x2102, 0x0008, 0x2102, 0x00c6, | ||
| 5987 | 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, | ||
| 5988 | 0x574f, 0x0128, 0x080c, 0x3e5f, 0x0110, 0x080c, 0x26c0, 0x60c4, | ||
| 5989 | 0xa005, 0x01b0, 0x6003, 0x0001, 0x2009, 0x373f, 0x00c0, 0x080c, | ||
| 5990 | 0x574f, 0x1158, 0x2011, 0x566e, 0x080c, 0x650d, 0x2001, 0xaf9e, | ||
| 5991 | 0x2003, 0x0000, 0x080c, 0x569a, 0x0040, 0x080c, 0x485e, 0x0028, | ||
| 5992 | 0x6003, 0x0004, 0x2009, 0x3755, 0x0010, 0x0804, 0x2dcc, 0x2001, | ||
| 5993 | 0x0100, 0x2004, 0xa082, 0x0005, 0x0258, 0x2001, 0x0170, 0x2004, | ||
| 5994 | 0xa084, 0x00ff, 0xa086, 0x004c, 0x1118, 0x2091, 0x309d, 0x0817, | ||
| 5995 | 0x2091, 0x301d, 0x0817, 0x6000, 0xa086, 0x0000, 0x0904, 0x2df1, | ||
| 5996 | 0x2069, 0xad51, 0x7830, 0x6842, 0x7834, 0x6846, 0x6804, 0xd0fc, | ||
| 5997 | 0x0118, 0x2009, 0x0030, 0x0010, 0x2009, 0x001c, 0x2d00, 0x7a2c, | ||
| 5998 | 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3c49, 0xa006, 0x080c, 0x26c0, | ||
| 5999 | 0x81ff, 0x1904, 0x2df1, 0x080c, 0x574f, 0x1178, 0x2001, 0xaf9e, | ||
| 6000 | 0x2003, 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0xa085, 0x0001, | ||
| 6001 | 0x080c, 0x5793, 0x080c, 0x569a, 0x0020, 0x080c, 0x491f, 0x080c, | ||
| 6002 | 0x485e, 0x0804, 0x2dcc, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x574f, | ||
| 6003 | 0x1110, 0x0804, 0x2df1, 0x6184, 0x81ff, 0x0198, 0x703f, 0x0000, | ||
| 6004 | 0x2001, 0xb3c0, 0x2009, 0x0040, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, | ||
| 6005 | 0x0126, 0x2091, 0x8000, 0x080c, 0x3c49, 0x701b, 0x2dca, 0x012e, | ||
| 6006 | 0x0005, 0x703f, 0x0001, 0x00d6, 0x2069, 0xb3c0, 0x20a9, 0x0040, | ||
| 6007 | 0x20a1, 0xb3c0, 0x2019, 0xffff, 0x43a4, 0x654c, 0xa588, 0x2be6, | ||
| 6008 | 0x210d, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, 0x0002, 0x2100, | ||
| 6009 | 0xa506, 0x01a8, 0x080c, 0x4cdc, 0x1190, 0x6014, 0x821c, 0x0238, | ||
| 6010 | 0xa398, 0xb3c0, 0xa085, 0xff00, 0x8007, 0x201a, 0x0038, 0xa398, | ||
| 6011 | 0xb3c0, 0x2324, 0xa4a4, 0xff00, 0xa405, 0x201a, 0x8210, 0x8108, | ||
| 6012 | 0xa182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, 0xa105, | ||
| 6013 | 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0xb3c0, 0x2099, 0xb3c0, | ||
| 6014 | 0x080c, 0x48be, 0x0804, 0x37b0, 0x080c, 0x3c2a, 0x0904, 0x2df4, | ||
| 6015 | 0x00c6, 0x080c, 0x3c05, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, | ||
| 6016 | 0x2df1, 0x2001, 0xad52, 0x2004, 0xd0b4, 0x01f0, 0x6000, 0xd08c, | ||
| 6017 | 0x11d8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x11a8, 0x6837, | ||
| 6018 | 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x970b, 0x1120, 0x2009, | ||
| 6019 | 0x0003, 0x0804, 0x2df1, 0x7007, 0x0003, 0x701b, 0x3830, 0x0005, | ||
| 6020 | 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x20a9, 0x002b, 0x2c98, 0xade8, | ||
| 6021 | 0x0002, 0x2da0, 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, | ||
| 6022 | 0xad80, 0x0006, 0x20a0, 0x080c, 0x48be, 0x20a9, 0x0004, 0xac80, | ||
| 6023 | 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x48be, 0x2d00, | ||
| 6024 | 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3c49, | ||
| 6025 | 0x81ff, 0x1904, 0x2df1, 0x080c, 0x3c1a, 0x0904, 0x2df4, 0x080c, | ||
| 6026 | 0x4eab, 0x0804, 0x2dcc, 0x81ff, 0x1904, 0x2df1, 0x7828, 0xa08a, | ||
| 6027 | 0x1000, 0x1a04, 0x2df4, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x080c, | ||
| 6028 | 0x4f0d, 0x0904, 0x2df1, 0x2019, 0x0004, 0x080c, 0x4ebd, 0x7924, | ||
| 6029 | 0x810f, 0x7a28, 0x0011, 0x0804, 0x2dcc, 0xa186, 0x00ff, 0x0110, | ||
| 6030 | 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0xad00, 0x644c, 0x2400, | ||
| 6031 | 0xa506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, | ||
| 6032 | 0x4cdc, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, | ||
| 6033 | 0x6519, 0x0005, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x3c1a, 0x0904, | ||
| 6034 | 0x2df4, 0x080c, 0x4d96, 0x0904, 0x2df1, 0x080c, 0x4eb4, 0x0804, | ||
| 6035 | 0x2dcc, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x3c1a, 0x0904, 0x2df4, | ||
| 6036 | 0x080c, 0x4d96, 0x0904, 0x2df1, 0x080c, 0x4ea2, 0x0804, 0x2dcc, | ||
| 6037 | 0x6100, 0x0804, 0x2dcc, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x2001, | ||
| 6038 | 0xad00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2df1, 0x00d6, 0xace8, | ||
| 6039 | 0x000a, 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c, 0x8007, | ||
| 6040 | 0x783e, 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, 0x8217, | ||
| 6041 | 0x00de, 0x6100, 0xa18c, 0x0200, 0x0804, 0x2dcc, 0x7824, 0xa09c, | ||
| 6042 | 0x00ff, 0xa39a, 0x0003, 0x1a04, 0x2df1, 0x624c, 0xa294, 0x00ff, | ||
| 6043 | 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xad40, 0x2009, | ||
| 6044 | 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3c49, 0x81ff, | ||
| 6045 | 0x1904, 0x2df1, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x6004, 0xa084, | ||
| 6046 | 0x00ff, 0xa086, 0x0006, 0x1904, 0x2df1, 0x00c6, 0x080c, 0x3c05, | ||
| 6047 | 0x00ce, 0x0904, 0x2df1, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, | ||
| 6048 | 0x080c, 0x96b7, 0x0904, 0x2df1, 0x7007, 0x0003, 0x701b, 0x3919, | ||
| 6049 | 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2df1, 0xad80, 0x000e, | ||
| 6050 | 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3c49, | ||
| 6051 | 0xa006, 0x080c, 0x26c0, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, | ||
| 6052 | 0x0118, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x574f, 0x0110, 0x080c, | ||
| 6053 | 0x491f, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2df4, 0x7924, 0xa18c, | ||
| 6054 | 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f, 0x1a04, | ||
| 6055 | 0x2df4, 0x2100, 0x080c, 0x268a, 0x0026, 0x00c6, 0x0126, 0x2091, | ||
| 6056 | 0x8000, 0x2061, 0xafda, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, | ||
| 6057 | 0x574f, 0x1178, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x2001, 0xad00, | ||
| 6058 | 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5793, 0x080c, 0x569a, | ||
| 6059 | 0x00a0, 0x2061, 0x0100, 0x2001, 0xad14, 0x2004, 0xa084, 0x00ff, | ||
| 6060 | 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, | ||
| 6061 | 0x002d, 0x2011, 0x4883, 0x080c, 0x6593, 0x7924, 0xa18c, 0xff00, | ||
| 6062 | 0x810f, 0x080c, 0x574f, 0x1110, 0x2009, 0x00ff, 0x7a28, 0x080c, | ||
| 6063 | 0x387d, 0x012e, 0x00ce, 0x002e, 0x0804, 0x2dcc, 0x7924, 0xa18c, | ||
| 6064 | 0xff00, 0x810f, 0x00c6, 0x080c, 0x4c80, 0x2c08, 0x00ce, 0x1904, | ||
| 6065 | 0x2df4, 0x0804, 0x2dcc, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, | ||
| 6066 | 0x2df1, 0x60d0, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, | ||
| 6067 | 0x0804, 0x2df1, 0x080c, 0x3c05, 0x1120, 0x2009, 0x0002, 0x0804, | ||
| 6068 | 0x2df1, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3c46, | ||
| 6069 | 0x701b, 0x39bb, 0x0005, 0x2009, 0x0080, 0x080c, 0x4cdc, 0x1130, | ||
| 6070 | 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, 0x400a, | ||
| 6071 | 0x0804, 0x2dce, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, | ||
| 6072 | 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, 0x3a32, | ||
| 6073 | 0xa0be, 0x0112, 0x0904, 0x3a32, 0xa0be, 0x0113, 0x0904, 0x3a32, | ||
| 6074 | 0xa0be, 0x0114, 0x0904, 0x3a32, 0xa0be, 0x0117, 0x0904, 0x3a32, | ||
| 6075 | 0xa0be, 0x011a, 0x0904, 0x3a32, 0xa0be, 0x011c, 0x0904, 0x3a32, | ||
| 6076 | 0xa0be, 0x0121, 0x05b0, 0xa0be, 0x0131, 0x0598, 0xa0be, 0x0171, | ||
| 6077 | 0x05c8, 0xa0be, 0x0173, 0x05b0, 0xa0be, 0x01a1, 0x1120, 0x6830, | ||
| 6078 | 0x8007, 0x6832, 0x04a8, 0xa0be, 0x0212, 0x0540, 0xa0be, 0x0213, | ||
| 6079 | 0x0528, 0xa0be, 0x0214, 0x01b0, 0xa0be, 0x0217, 0x0168, 0xa0be, | ||
| 6080 | 0x021a, 0x1120, 0x6838, 0x8007, 0x683a, 0x00e0, 0xa0be, 0x0300, | ||
| 6081 | 0x01c8, 0x00de, 0x0804, 0x2df4, 0xad80, 0x0010, 0x20a9, 0x0007, | ||
| 6082 | 0x080c, 0x3a78, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, 0x3a78, | ||
| 6083 | 0x0048, 0xad80, 0x000c, 0x080c, 0x3a86, 0x0050, 0xad80, 0x000e, | ||
| 6084 | 0x080c, 0x3a86, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, 0x3a78, | ||
| 6085 | 0x00c6, 0x080c, 0x3c05, 0x0568, 0x6838, 0xc0fd, 0x683a, 0x6837, | ||
| 6086 | 0x0119, 0x6853, 0x0000, 0x684f, 0x0020, 0x685b, 0x0001, 0x810b, | ||
| 6087 | 0x697e, 0x6883, 0x0000, 0x6a86, 0x6b8a, 0x6c8e, 0x6d92, 0x6996, | ||
| 6088 | 0x689b, 0x0000, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, | ||
| 6089 | 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0x96d3, 0x1120, | ||
| 6090 | 0x2009, 0x0003, 0x0804, 0x2df1, 0x7007, 0x0003, 0x701b, 0x3a6f, | ||
| 6091 | 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x2df1, 0x6820, | ||
| 6092 | 0xa086, 0x8001, 0x1904, 0x2dcc, 0x2009, 0x0004, 0x0804, 0x2df1, | ||
| 6093 | 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, | ||
| 6094 | 0x280a, 0x8108, 0x1f04, 0x3a7a, 0x001e, 0x0005, 0x0016, 0x00a6, | ||
| 6095 | 0x00b6, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x2054, 0x8000, | ||
| 6096 | 0x205c, 0x2b0a, 0x8108, 0x2a0a, 0x8108, 0x290a, 0x8108, 0x280a, | ||
| 6097 | 0x00be, 0x00ae, 0x001e, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, | ||
| 6098 | 0x0804, 0x2df1, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0x60d0, | ||
| 6099 | 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x2df4, 0xa182, 0x00ff, | ||
| 6100 | 0x1a04, 0x2df4, 0x7a2c, 0x7b28, 0x606c, 0xa306, 0x1140, 0x6070, | ||
| 6101 | 0xa24e, 0x0904, 0x2df4, 0xa9cc, 0xff00, 0x0904, 0x2df4, 0x00c6, | ||
| 6102 | 0x080c, 0x3b58, 0x2c68, 0x00ce, 0x0538, 0xa0c6, 0x4000, 0x1180, | ||
| 6103 | 0x00c6, 0x0006, 0x2d60, 0x2009, 0x0000, 0x080c, 0x4f6e, 0x1108, | ||
| 6104 | 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x000e, 0x00ce, 0x0088, | ||
| 6105 | 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, 0x1118, | ||
| 6106 | 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, 0x2001, | ||
| 6107 | 0x4006, 0x2020, 0x0804, 0x2dce, 0x2d00, 0x7022, 0x0016, 0x00b6, | ||
| 6108 | 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x8022, 0x05d8, 0x2d00, 0x601a, | ||
| 6109 | 0x080c, 0x9956, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x3c05, | ||
| 6110 | 0x00ce, 0x2b70, 0x1150, 0x080c, 0x8078, 0x00ee, 0x00ce, 0x00be, | ||
| 6111 | 0x001e, 0x2009, 0x0002, 0x0804, 0x2df1, 0x6837, 0x0000, 0x683b, | ||
| 6112 | 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0xd88c, | ||
| 6113 | 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2ad9, | ||
| 6114 | 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x2001, | ||
| 6115 | 0x0002, 0x080c, 0x4c30, 0x2009, 0x0002, 0x080c, 0x80a7, 0xa085, | ||
| 6116 | 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, | ||
| 6117 | 0x0804, 0x2df1, 0x7007, 0x0003, 0x701b, 0x3b3f, 0x0005, 0x6830, | ||
| 6118 | 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, | ||
| 6119 | 0xa294, 0x00ff, 0x0804, 0x2df1, 0x2009, 0x0000, 0x080c, 0x4f6e, | ||
| 6120 | 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x2dcc, | ||
| 6121 | 0x00e6, 0x00d6, 0x2029, 0x0000, 0x2001, 0xad34, 0x2004, 0xd0ac, | ||
| 6122 | 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xae34, 0x0030, | ||
| 6123 | 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, 0xaeb4, 0x2e04, 0xa005, | ||
| 6124 | 0x1130, 0x2100, 0xa406, 0x1548, 0x2428, 0xc5fd, 0x0430, 0x2068, | ||
| 6125 | 0x6f10, 0x2700, 0xa306, 0x11b0, 0x6e14, 0x2600, 0xa206, 0x1190, | ||
| 6126 | 0x2400, 0xa106, 0x1160, 0x2d60, 0xd884, 0x0540, 0x6004, 0xa084, | ||
| 6127 | 0x00ff, 0xa086, 0x0006, 0x1510, 0x2001, 0x4000, 0x0400, 0x2001, | ||
| 6128 | 0x4007, 0x00e8, 0x2400, 0xa106, 0x1140, 0x6e14, 0x87ff, 0x1110, | ||
| 6129 | 0x86ff, 0x09d0, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, | ||
| 6130 | 0x3b6e, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, | ||
| 6131 | 0x0030, 0x080c, 0x4c80, 0x1dd0, 0x6312, 0x6216, 0xa006, 0xa005, | ||
| 6132 | 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x2df1, 0x080c, 0x3c05, | ||
| 6133 | 0x0904, 0x2df1, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7824, | ||
| 6134 | 0xa005, 0x0904, 0x2df4, 0xa096, 0x00ff, 0x0120, 0xa092, 0x0004, | ||
| 6135 | 0x1a04, 0x2df4, 0x2010, 0x2d18, 0x080c, 0x2a8c, 0x0904, 0x2df1, | ||
| 6136 | 0x7007, 0x0003, 0x701b, 0x3bd5, 0x0005, 0x6830, 0xa086, 0x0100, | ||
| 6137 | 0x0904, 0x2df1, 0x0804, 0x2dcc, 0x7924, 0xa18c, 0xff00, 0x810f, | ||
| 6138 | 0x60d0, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x2df4, 0xa182, | ||
| 6139 | 0x00ff, 0x1a04, 0x2df4, 0x0126, 0x2091, 0x8000, 0x080c, 0x95c6, | ||
| 6140 | 0x1188, 0xa190, 0xae34, 0x2204, 0xa065, 0x0160, 0x080c, 0x493a, | ||
| 6141 | 0x2001, 0xad34, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, | ||
| 6142 | 0x0804, 0x2dcc, 0x012e, 0x0804, 0x2df1, 0x080c, 0x15d9, 0x0188, | ||
| 6143 | 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, | ||
| 6144 | 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, | ||
| 6145 | 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4cdc, | ||
| 6146 | 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, 0xa066, | ||
| 6147 | 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, 0x4cdc, | ||
| 6148 | 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, 0x8cff, | ||
| 6149 | 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, | ||
| 6150 | 0x15f0, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, | ||
| 6151 | 0x0010, 0x2031, 0x0000, 0x2061, 0xadd1, 0x6606, 0x6112, 0x600e, | ||
| 6152 | 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x1624, 0x7007, | ||
| 6153 | 0x0002, 0x701b, 0x2dcc, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, | ||
| 6154 | 0x2079, 0x0000, 0x2001, 0xad8f, 0x2004, 0xa005, 0x1168, 0x0e04, | ||
| 6155 | 0x3c74, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, 0x781b, | ||
| 6156 | 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, | ||
| 6157 | 0xad81, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, 0x0078, | ||
| 6158 | 0x7030, 0xa0e0, 0x0004, 0xac82, 0xadd1, 0x0210, 0x2061, 0xad91, | ||
| 6159 | 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, 0x2262, | ||
| 6160 | 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, | ||
| 6161 | 0x00e6, 0x2071, 0xad81, 0x7038, 0xa005, 0x0570, 0x0126, 0x2091, | ||
| 6162 | 0x8000, 0x0e04, 0x3ccb, 0x00f6, 0x2079, 0x0000, 0x7818, 0xd084, | ||
| 6163 | 0x1508, 0x00c6, 0x7034, 0x2060, 0x2c04, 0x7822, 0x6004, 0x7826, | ||
| 6164 | 0x6008, 0x782a, 0x781b, 0x0001, 0x2091, 0x4080, 0x7038, 0x8001, | ||
| 6165 | 0x703a, 0xa005, 0x1130, 0x7033, 0xad91, 0x7037, 0xad91, 0x00ce, | ||
| 6166 | 0x0048, 0xac80, 0x0004, 0xa0fa, 0xadd1, 0x0210, 0x2001, 0xad91, | ||
| 6167 | 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001, | ||
| 6168 | 0xad52, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3c5c, | ||
| 6169 | 0x002e, 0x0005, 0x81ff, 0x1904, 0x2df1, 0x0126, 0x2091, 0x8000, | ||
| 6170 | 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x574f, 0x1178, | ||
| 6171 | 0x2001, 0xaf9e, 0x2003, 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, | ||
| 6172 | 0xa085, 0x0001, 0x080c, 0x5793, 0x080c, 0x569a, 0x0010, 0x080c, | ||
| 6173 | 0x485e, 0x012e, 0x0804, 0x2dcc, 0x7824, 0x2008, 0xa18c, 0xfffd, | ||
| 6174 | 0x1128, 0x61dc, 0xa10d, 0x61de, 0x0804, 0x2dcc, 0x0804, 0x2df4, | ||
| 6175 | 0x81ff, 0x1904, 0x2df1, 0x6000, 0xa086, 0x0003, 0x1904, 0x2df1, | ||
| 6176 | 0x2001, 0xad52, 0x2004, 0xd0ac, 0x1904, 0x2df1, 0x080c, 0x3c2a, | ||
| 6177 | 0x0904, 0x2df4, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, | ||
| 6178 | 0x7828, 0xa005, 0x0904, 0x2dcc, 0x00c6, 0x080c, 0x3c05, 0x00ce, | ||
| 6179 | 0x0904, 0x2df1, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, | ||
| 6180 | 0x683a, 0x080c, 0x979c, 0x0904, 0x2df1, 0x7007, 0x0003, 0x701b, | ||
| 6181 | 0x3d3a, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2df1, 0x0804, | ||
| 6182 | 0x2dcc, 0x2001, 0xad00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2df1, | ||
| 6183 | 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3c05, 0x0904, | ||
| 6184 | 0x2df1, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, | ||
| 6185 | 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x4cdc, 0x1904, | ||
| 6186 | 0x3db4, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, 0xa0c4, | ||
| 6187 | 0xff00, 0xa8c6, 0x0600, 0x1904, 0x3db4, 0x2001, 0xad52, 0x2004, | ||
| 6188 | 0xd0ac, 0x1128, 0x080c, 0x4f6e, 0x1110, 0xd79c, 0x05e8, 0xd794, | ||
| 6189 | 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, | ||
| 6190 | 0x0004, 0x53a3, 0x080c, 0x3a86, 0xd794, 0x0148, 0xac80, 0x000a, | ||
| 6191 | 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3a86, 0x21a2, | ||
| 6192 | 0xd794, 0x01d8, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, | ||
| 6193 | 0x53a3, 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, | ||
| 6194 | 0x3400, 0x20a9, 0x0002, 0x53a3, 0x080c, 0x3a78, 0xac80, 0x0026, | ||
| 6195 | 0x2098, 0x20a9, 0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, | ||
| 6196 | 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0x2001, 0xad34, 0x2004, | ||
| 6197 | 0xd0ac, 0x0118, 0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, | ||
| 6198 | 0x0100, 0x0170, 0x0018, 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, | ||
| 6199 | 0xa686, 0x0020, 0x0010, 0xa686, 0x0028, 0x0150, 0x0804, 0x3d5d, | ||
| 6200 | 0x86ff, 0x1120, 0x7120, 0x810b, 0x0804, 0x2dcc, 0x702f, 0x0001, | ||
| 6201 | 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xadd1, 0x6007, | ||
| 6202 | 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, | ||
| 6203 | 0x2c10, 0x080c, 0x1624, 0x7007, 0x0002, 0x701b, 0x3df0, 0x0005, | ||
| 6204 | 0x702c, 0xa005, 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, | ||
| 6205 | 0x0000, 0x2061, 0xadd1, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, | ||
| 6206 | 0x3d5d, 0x7120, 0x810b, 0x0804, 0x2dcc, 0x2029, 0x007e, 0x7924, | ||
| 6207 | 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, | ||
| 6208 | 0x0a04, 0x2df4, 0xa502, 0x0a04, 0x2df4, 0xa184, 0x00ff, 0xa0e2, | ||
| 6209 | 0x0020, 0x0a04, 0x2df4, 0xa502, 0x0a04, 0x2df4, 0xa284, 0xff00, | ||
| 6210 | 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2df4, 0xa502, 0x0a04, 0x2df4, | ||
| 6211 | 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2df4, 0xa502, 0x0a04, | ||
| 6212 | 0x2df4, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2df4, | ||
| 6213 | 0xa502, 0x0a04, 0x2df4, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, | ||
| 6214 | 0x2df4, 0xa502, 0x0a04, 0x2df4, 0xa484, 0xff00, 0x8007, 0xa0e2, | ||
| 6215 | 0x0020, 0x0a04, 0x2df4, 0xa502, 0x0a04, 0x2df4, 0xa484, 0x00ff, | ||
| 6216 | 0xa0e2, 0x0020, 0x0a04, 0x2df4, 0xa502, 0x0a04, 0x2df4, 0x2061, | ||
| 6217 | 0xafa6, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x2dcc, 0x0006, | ||
| 6218 | 0x2001, 0xad52, 0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, | ||
| 6219 | 0xad71, 0x2004, 0xd0bc, 0x000e, 0x0005, 0x6164, 0x7a24, 0x6300, | ||
| 6220 | 0x82ff, 0x1118, 0x7926, 0x0804, 0x2dcc, 0x83ff, 0x1904, 0x2df4, | ||
| 6221 | 0x2001, 0xfff0, 0xa200, 0x1a04, 0x2df4, 0x2019, 0xffff, 0x6068, | ||
| 6222 | 0xa302, 0xa200, 0x0a04, 0x2df4, 0x7926, 0x6266, 0x0804, 0x2dcc, | ||
| 6223 | 0x2001, 0xad00, 0x2004, 0xa086, 0x0003, 0x1904, 0x2df1, 0x7c28, | ||
| 6224 | 0x7d24, 0x7e38, 0x7f2c, 0x080c, 0x3c05, 0x0904, 0x2df1, 0x2009, | ||
| 6225 | 0x0000, 0x2019, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, | ||
| 6226 | 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xae34, 0x2c64, 0x8cff, 0x01b8, | ||
| 6227 | 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0130, 0x6004, 0xa084, | ||
| 6228 | 0xff00, 0xa086, 0x0600, 0x1158, 0x6014, 0x20a2, 0x94a0, 0x6010, | ||
| 6229 | 0x8007, 0xa105, 0x8007, 0x20a2, 0x94a0, 0xa398, 0x0002, 0x8108, | ||
| 6230 | 0xa182, 0x00ff, 0x0120, 0xa386, 0x002a, 0x0148, 0x08e0, 0x83ff, | ||
| 6231 | 0x1120, 0x7120, 0x810c, 0x0804, 0x2dcc, 0x702f, 0x0001, 0x711e, | ||
| 6232 | 0x7020, 0xa300, 0x7022, 0x2061, 0xadd1, 0x6007, 0x0000, 0x6312, | ||
| 6233 | 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c, | ||
| 6234 | 0x1624, 0x7007, 0x0002, 0x701b, 0x3ee6, 0x0005, 0x702c, 0xa005, | ||
| 6235 | 0x1168, 0x711c, 0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xadd1, | ||
| 6236 | 0x6424, 0x6528, 0x662c, 0x6730, 0x0804, 0x3ea3, 0x7120, 0x810c, | ||
| 6237 | 0x0804, 0x2dcc, 0x81ff, 0x1904, 0x2df1, 0x60d0, 0xd0ac, 0x1118, | ||
| 6238 | 0xd09c, 0x0904, 0x2df1, 0x080c, 0x3c05, 0x0904, 0x2df1, 0x7924, | ||
| 6239 | 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3c46, 0x701b, 0x3f11, | ||
| 6240 | 0x0005, 0x00d6, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, | ||
| 6241 | 0xa0be, 0x7100, 0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, | ||
| 6242 | 0x2df4, 0x6820, 0x6924, 0x080c, 0x2676, 0x1510, 0x080c, 0x4c80, | ||
| 6243 | 0x11f8, 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x3c05, | ||
| 6244 | 0x01b8, 0x080c, 0x3c05, 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, | ||
| 6245 | 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, | ||
| 6246 | 0x96ef, 0x0904, 0x2df1, 0x7007, 0x0003, 0x701b, 0x3f4b, 0x0005, | ||
| 6247 | 0x00de, 0x0804, 0x2df1, 0x7120, 0x080c, 0x2bc9, 0x6820, 0xa086, | ||
| 6248 | 0x8001, 0x0904, 0x2df1, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, | ||
| 6249 | 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x48be, 0x000e, | ||
| 6250 | 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xadd1, | ||
| 6251 | 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, 0x0018, | ||
| 6252 | 0xa7c6, 0x7100, 0x1140, 0xa6c2, 0x0004, 0x0a04, 0x2df4, 0x2009, | ||
| 6253 | 0x0004, 0x0804, 0x3c49, 0xa7c6, 0x7200, 0x1904, 0x2df4, 0xa6c2, | ||
| 6254 | 0x0054, 0x0a04, 0x2df4, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, | ||
| 6255 | 0x642e, 0x6532, 0x2c10, 0x080c, 0x1624, 0x7007, 0x0002, 0x701b, | ||
| 6256 | 0x3f92, 0x0005, 0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, | ||
| 6257 | 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, | ||
| 6258 | 0x48be, 0x000e, 0x2009, 0x002a, 0x2061, 0xadd1, 0x6224, 0x6328, | ||
| 6259 | 0x642c, 0x6530, 0x0804, 0x3c49, 0x81ff, 0x1904, 0x2df1, 0x080c, | ||
| 6260 | 0x3c1a, 0x0904, 0x2df4, 0x080c, 0x4d96, 0x0904, 0x2df1, 0x080c, | ||
| 6261 | 0x4ec6, 0x0804, 0x2dcc, 0x7824, 0xd084, 0x0904, 0x3804, 0x080c, | ||
| 6262 | 0x3c2a, 0x0904, 0x2df4, 0x00c6, 0x080c, 0x3c05, 0x00ce, 0x1120, | ||
| 6263 | 0x2009, 0x0002, 0x0804, 0x2df1, 0x6004, 0xa084, 0x00ff, 0xa086, | ||
| 6264 | 0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa08e, 0x0005, 0x1508, | ||
| 6265 | 0x2001, 0xad52, 0x2004, 0xd0b4, 0x0904, 0x3834, 0x6000, 0xd08c, | ||
| 6266 | 0x1904, 0x3834, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, | ||
| 6267 | 0x970b, 0x1120, 0x2009, 0x0003, 0x0804, 0x2df1, 0x7007, 0x0003, | ||
| 6268 | 0x701b, 0x3ff3, 0x0005, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x0804, | ||
| 6269 | 0x3834, 0x2009, 0xad30, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, | ||
| 6270 | 0x0804, 0x2df1, 0x2001, 0xad00, 0x2004, 0xa086, 0x0003, 0x0120, | ||
| 6271 | 0x2009, 0x0007, 0x0804, 0x2df1, 0x2001, 0xad52, 0x2004, 0xd0ac, | ||
| 6272 | 0x0120, 0x2009, 0x0008, 0x0804, 0x2df1, 0x609c, 0xd0a4, 0x1118, | ||
| 6273 | 0xd0ac, 0x1904, 0x3834, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, | ||
| 6274 | 0xc0fd, 0x683a, 0x080c, 0x979c, 0x1120, 0x2009, 0x0003, 0x0804, | ||
| 6275 | 0x2df1, 0x7007, 0x0003, 0x701b, 0x402e, 0x0005, 0x6830, 0xa086, | ||
| 6276 | 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2df1, 0x080c, 0x3c2a, | ||
| 6277 | 0x0904, 0x2df4, 0x0804, 0x3fd8, 0x81ff, 0x2009, 0x0001, 0x1904, | ||
| 6278 | 0x2df1, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x2df1, | ||
| 6279 | 0x2001, 0xad52, 0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, 0x2df1, | ||
| 6280 | 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x6004, 0xa084, 0x00ff, 0xa086, | ||
| 6281 | 0x0006, 0x2009, 0x0009, 0x1904, 0x2df1, 0x00c6, 0x080c, 0x3c05, | ||
| 6282 | 0x00ce, 0x2009, 0x0002, 0x0904, 0x2df1, 0x6837, 0x0000, 0x6833, | ||
| 6283 | 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, 0xa18c, | ||
| 6284 | 0x00ff, 0xa006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, 0x6956, | ||
| 6285 | 0x0048, 0xa28e, 0x0100, 0x1904, 0x2df4, 0xc0e5, 0x6853, 0x0000, | ||
| 6286 | 0x6857, 0x0000, 0x683e, 0x080c, 0x9957, 0x2009, 0x0003, 0x0904, | ||
| 6287 | 0x2df1, 0x7007, 0x0003, 0x701b, 0x408e, 0x0005, 0x6830, 0xa086, | ||
| 6288 | 0x0100, 0x2009, 0x0004, 0x0904, 0x2df1, 0x0804, 0x2dcc, 0x81ff, | ||
| 6289 | 0x2009, 0x0001, 0x1904, 0x2df1, 0x6000, 0xa086, 0x0003, 0x2009, | ||
| 6290 | 0x0007, 0x1904, 0x2df1, 0x080c, 0x3c2a, 0x0904, 0x2df4, 0x6004, | ||
| 6291 | 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2df1, | ||
| 6292 | 0x00c6, 0x080c, 0x3c05, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2df1, | ||
| 6293 | 0xad80, 0x000f, 0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, | ||
| 6294 | 0x080c, 0x3c46, 0x701b, 0x40c5, 0x0005, 0x00d6, 0xade8, 0x000f, | ||
| 6295 | 0x6800, 0xa086, 0x0500, 0x1140, 0x6804, 0xa005, 0x1128, 0x6808, | ||
| 6296 | 0xa084, 0xff00, 0x1108, 0x0018, 0x00de, 0x1904, 0x2df4, 0x00de, | ||
| 6297 | 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x00c6, | ||
| 6298 | 0x080c, 0x3c2a, 0x1118, 0x00ce, 0x0804, 0x2df4, 0x080c, 0x99a6, | ||
| 6299 | 0x2009, 0x0003, 0x00ce, 0x0904, 0x2df1, 0x7007, 0x0003, 0x701b, | ||
| 6300 | 0x40f2, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, | ||
| 6301 | 0x2df1, 0x0804, 0x2dcc, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, | ||
| 6302 | 0x2df1, 0x6000, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, | ||
| 6303 | 0x2df1, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, 0x080c, | ||
| 6304 | 0x4cdc, 0x1904, 0x2df4, 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, | ||
| 6305 | 0x00ff, 0xa086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2df1, | ||
| 6306 | 0x00c6, 0x080c, 0x3c05, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, | ||
| 6307 | 0x2df1, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9726, | ||
| 6308 | 0x1120, 0x2009, 0x0003, 0x0804, 0x2df1, 0x7007, 0x0003, 0x701b, | ||
| 6309 | 0x413a, 0x0005, 0x6808, 0x8007, 0xa086, 0x0100, 0x1120, 0x2009, | ||
| 6310 | 0x0004, 0x0804, 0x2df1, 0x68b0, 0x6836, 0x6810, 0x8007, 0xa084, | ||
| 6311 | 0x00ff, 0x808e, 0x6814, 0x8007, 0xa084, 0x00ff, 0x8086, 0xa080, | ||
| 6312 | 0x0002, 0xa108, 0xad80, 0x0004, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, | ||
| 6313 | 0x0804, 0x3c49, 0x080c, 0x3c05, 0x1120, 0x2009, 0x0002, 0x0804, | ||
| 6314 | 0x2df1, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, | ||
| 6315 | 0x0110, 0x0804, 0x2df4, 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, | ||
| 6316 | 0x7d38, 0x080c, 0x3c46, 0x701b, 0x4176, 0x0005, 0xad80, 0x000d, | ||
| 6317 | 0x2098, 0x20a9, 0x001a, 0x20a1, 0xafad, 0x53a3, 0x0804, 0x2dcc, | ||
| 6318 | 0x080c, 0x3c05, 0x1120, 0x2009, 0x0002, 0x0804, 0x2df1, 0x7924, | ||
| 6319 | 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, | ||
| 6320 | 0x2df4, 0x2099, 0xafad, 0x20a0, 0x20a9, 0x001a, 0x53a3, 0x2009, | ||
| 6321 | 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3c49, 0x7824, | ||
| 6322 | 0xa08a, 0x1000, 0x1a04, 0x2df4, 0x0126, 0x2091, 0x8000, 0x8003, | ||
| 6323 | 0x800b, 0x810b, 0xa108, 0x00c6, 0x2061, 0xafda, 0x6142, 0x00ce, | ||
| 6324 | 0x012e, 0x0804, 0x2dcc, 0x00c6, 0x080c, 0x574f, 0x1188, 0x2001, | ||
| 6325 | 0xaf9e, 0x2003, 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0xa085, | ||
| 6326 | 0x0001, 0x080c, 0x5793, 0x080c, 0x569a, 0x080c, 0x14f6, 0x0038, | ||
| 6327 | 0x2061, 0xad00, 0x6030, 0xc09d, 0x6032, 0x080c, 0x485e, 0x00ce, | ||
| 6328 | 0x0005, 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xad00, | ||
| 6329 | 0x6044, 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, 0x4348, 0x0068, | ||
| 6330 | 0xd08c, 0x0118, 0x080c, 0x4269, 0x0040, 0xd094, 0x0118, 0x080c, | ||
| 6331 | 0x423a, 0x0018, 0xd09c, 0x0108, 0x0061, 0x00ee, 0x00ce, 0x012e, | ||
| 6332 | 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, | ||
| 6333 | 0x0ca0, 0x624c, 0xa286, 0xf0f0, 0x1150, 0x6048, 0xa086, 0xf0f0, | ||
| 6334 | 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0xa294, | ||
| 6335 | 0xff00, 0xa296, 0xf700, 0x0178, 0x7134, 0xd1a4, 0x1160, 0x6240, | ||
| 6336 | 0xa295, 0x0100, 0x6242, 0xa294, 0x0010, 0x0128, 0x2009, 0x00f7, | ||
| 6337 | 0x080c, 0x48de, 0x00f0, 0x6040, 0xa084, 0x0010, 0xa085, 0x0040, | ||
| 6338 | 0x6042, 0x6043, 0x0000, 0x7077, 0x0000, 0x7093, 0x0001, 0x70b7, | ||
| 6339 | 0x0000, 0x70d3, 0x0000, 0x2009, 0xb3c0, 0x200b, 0x0000, 0x7087, | ||
| 6340 | 0x0000, 0x707b, 0x000a, 0x2009, 0x000a, 0x2011, 0x4814, 0x080c, | ||
| 6341 | 0x6593, 0x0005, 0x0156, 0x2001, 0xad73, 0x2004, 0xd08c, 0x0110, | ||
| 6342 | 0x704f, 0xffff, 0x7078, 0xa005, 0x1510, 0x2011, 0x4814, 0x080c, | ||
| 6343 | 0x650d, 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, | ||
| 6344 | 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x4251, 0x6242, 0x708b, | ||
| 6345 | 0x0000, 0x6040, 0xa094, 0x0010, 0xa285, 0x0080, 0x6042, 0x6242, | ||
| 6346 | 0x0030, 0x6242, 0x708b, 0x0000, 0x707f, 0x0000, 0x0000, 0x015e, | ||
| 6347 | 0x0005, 0x707c, 0xa08a, 0x0003, 0x1210, 0x0023, 0x0010, 0x080c, | ||
| 6348 | 0x14f6, 0x0005, 0x4275, 0x42c5, 0x4347, 0x00f6, 0x707f, 0x0001, | ||
| 6349 | 0x20e1, 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, 0x22f8, 0x20e1, | ||
| 6350 | 0x9080, 0x20e1, 0x4000, 0x2079, 0xb200, 0x207b, 0x2200, 0x7807, | ||
| 6351 | 0x00ef, 0x780b, 0x0000, 0x780f, 0x00ef, 0x7813, 0x0138, 0x7817, | ||
| 6352 | 0x0000, 0x781b, 0x0000, 0x781f, 0x0000, 0x7823, 0xffff, 0x7827, | ||
| 6353 | 0xffff, 0x782b, 0x0000, 0x782f, 0x0000, 0x2079, 0xb20c, 0x207b, | ||
| 6354 | 0x1101, 0x7807, 0x0000, 0x2099, 0xad05, 0x20a1, 0xb20e, 0x20a9, | ||
| 6355 | 0x0004, 0x53a3, 0x2079, 0xb212, 0x207b, 0x0000, 0x7807, 0x0000, | ||
| 6356 | 0x2099, 0xb200, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, | ||
| 6357 | 0x000c, 0x600f, 0x0000, 0x080c, 0x4845, 0x00fe, 0x7083, 0x0000, | ||
| 6358 | 0x6043, 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, 0x7080, 0x7083, | ||
| 6359 | 0x0000, 0xa025, 0x0904, 0x432f, 0x6020, 0xd0b4, 0x1904, 0x432d, | ||
| 6360 | 0x7190, 0x81ff, 0x0904, 0x431d, 0xa486, 0x000c, 0x1904, 0x4328, | ||
| 6361 | 0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, 0xb280, 0x2019, 0xb200, | ||
| 6362 | 0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, 0x1f04, 0x42e0, | ||
| 6363 | 0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, | ||
| 6364 | 0x707f, 0x0002, 0x708b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x481b, | ||
| 6365 | 0x080c, 0x6593, 0x0490, 0x2069, 0xb280, 0x6930, 0xa18e, 0x1101, | ||
| 6366 | 0x1538, 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118, | ||
| 6367 | 0x6804, 0xa005, 0x0190, 0x2011, 0xb28e, 0x2019, 0xad05, 0x20a9, | ||
| 6368 | 0x0004, 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318, | ||
| 6369 | 0x1f04, 0x4311, 0x0068, 0x7093, 0x0000, 0x20e1, 0x9080, 0x20e1, | ||
| 6370 | 0x4000, 0x2099, 0xb280, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, | ||
| 6371 | 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, 0x0005, 0x6040, | ||
| 6372 | 0xa085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c, | ||
| 6373 | 0x2011, 0xafd1, 0x2013, 0x0000, 0x7083, 0x0000, 0x20e1, 0x9080, | ||
| 6374 | 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x782b, 0x0c30, 0x0005, | ||
| 6375 | 0x7088, 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, 0x080c, 0x14f6, | ||
| 6376 | 0x0005, 0x437b, 0x438a, 0x43b2, 0x43cb, 0x43ef, 0x4417, 0x443b, | ||
| 6377 | 0x446c, 0x4490, 0x44b8, 0x44ef, 0x4517, 0x4533, 0x4549, 0x4569, | ||
| 6378 | 0x457c, 0x4584, 0x45b1, 0x45d5, 0x45fd, 0x4621, 0x4652, 0x468f, | ||
| 6379 | 0x46be, 0x46da, 0x4719, 0x4739, 0x4752, 0x4753, 0x00c6, 0x2061, | ||
| 6380 | 0xad00, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, | ||
| 6381 | 0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, | ||
| 6382 | 0x0002, 0x708b, 0x0001, 0x2009, 0x07d0, 0x2011, 0x481b, 0x080c, | ||
| 6383 | 0x6593, 0x0005, 0x00f6, 0x7080, 0xa086, 0x0014, 0x1508, 0x6043, | ||
| 6384 | 0x0000, 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xb280, 0x7a30, 0xa296, | ||
| 6385 | 0x1102, 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128, | ||
| 6386 | 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, 0x2011, 0x481b, 0x080c, | ||
| 6387 | 0x650d, 0x708b, 0x0010, 0x080c, 0x4584, 0x0010, 0x080c, 0x485e, | ||
| 6388 | 0x00fe, 0x0005, 0x708b, 0x0003, 0x6043, 0x0004, 0x2011, 0x481b, | ||
| 6389 | 0x080c, 0x650d, 0x080c, 0x48c6, 0x20a3, 0x1102, 0x20a3, 0x0000, | ||
| 6390 | 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x43c2, 0x60c3, 0x0014, | ||
| 6391 | 0x080c, 0x4845, 0x0005, 0x00f6, 0x7080, 0xa005, 0x01f0, 0x2011, | ||
| 6392 | 0x481b, 0x080c, 0x650d, 0xa086, 0x0014, 0x11a8, 0x2079, 0xb280, | ||
| 6393 | 0x7a30, 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, | ||
| 6394 | 0xd2fc, 0x0128, 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, 0x708b, | ||
| 6395 | 0x0004, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, 0x0005, 0x708b, | ||
| 6396 | 0x0005, 0x080c, 0x48c6, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, | ||
| 6397 | 0x2011, 0xb28e, 0x080c, 0x4917, 0x1160, 0x7074, 0xa005, 0x1148, | ||
| 6398 | 0x714c, 0xa186, 0xffff, 0x0128, 0x080c, 0x47df, 0x0110, 0x080c, | ||
| 6399 | 0x48f5, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, | ||
| 6400 | 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4845, 0x0005, 0x00f6, | ||
| 6401 | 0x7080, 0xa005, 0x01f0, 0x2011, 0x481b, 0x080c, 0x650d, 0xa086, | ||
| 6402 | 0x0014, 0x11a8, 0x2079, 0xb280, 0x7a30, 0xa296, 0x1103, 0x1178, | ||
| 6403 | 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b4, 0xa005, | ||
| 6404 | 0x1110, 0x70b7, 0x0001, 0x708b, 0x0006, 0x0029, 0x0010, 0x080c, | ||
| 6405 | 0x485e, 0x00fe, 0x0005, 0x708b, 0x0007, 0x080c, 0x48c6, 0x20a3, | ||
| 6406 | 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xb28e, 0x080c, 0x4917, | ||
| 6407 | 0x11a8, 0x7074, 0xa005, 0x1190, 0x7154, 0xa186, 0xffff, 0x0170, | ||
| 6408 | 0xa180, 0x2be6, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x47df, | ||
| 6409 | 0x0128, 0x080c, 0x3e66, 0x0110, 0x080c, 0x26c0, 0x20a9, 0x0008, | ||
| 6410 | 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, | ||
| 6411 | 0x0014, 0x080c, 0x4845, 0x0005, 0x00f6, 0x7080, 0xa005, 0x01f0, | ||
| 6412 | 0x2011, 0x481b, 0x080c, 0x650d, 0xa086, 0x0014, 0x11a8, 0x2079, | ||
| 6413 | 0xb280, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, | ||
| 6414 | 0x7a38, 0xd2fc, 0x0128, 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, | ||
| 6415 | 0x708b, 0x0008, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, 0x0005, | ||
| 6416 | 0x708b, 0x0009, 0x080c, 0x48c6, 0x20a3, 0x1105, 0x20a3, 0x0100, | ||
| 6417 | 0x3430, 0x080c, 0x4917, 0x1150, 0x7074, 0xa005, 0x1138, 0x080c, | ||
| 6418 | 0x4754, 0x1170, 0xa085, 0x0001, 0x080c, 0x26c0, 0x20a9, 0x0008, | ||
| 6419 | 0x2099, 0xb28e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 6420 | 0x60c3, 0x0014, 0x080c, 0x4845, 0x0010, 0x080c, 0x436e, 0x0005, | ||
| 6421 | 0x00f6, 0x7080, 0xa005, 0x0588, 0x2011, 0x481b, 0x080c, 0x650d, | ||
| 6422 | 0xa086, 0x0014, 0x1540, 0x2079, 0xb280, 0x7a30, 0xa296, 0x1105, | ||
| 6423 | 0x1510, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1160, 0x7a38, 0xd2fc, | ||
| 6424 | 0x0128, 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, 0x708b, 0x000a, | ||
| 6425 | 0x00b1, 0x0098, 0xa005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70b4, | ||
| 6426 | 0xa005, 0x1110, 0x70b7, 0x0001, 0x7087, 0x0000, 0x708b, 0x000e, | ||
| 6427 | 0x080c, 0x4569, 0x0010, 0x080c, 0x485e, 0x00fe, 0x0005, 0x708b, | ||
| 6428 | 0x000b, 0x2011, 0xb20e, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, | ||
| 6429 | 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, 0x080c, 0x48c6, | ||
| 6430 | 0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, 0x4917, 0x0118, 0x2013, | ||
| 6431 | 0x0000, 0x0020, 0x7050, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, | ||
| 6432 | 0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4845, 0x0005, 0x00f6, | ||
| 6433 | 0x7080, 0xa005, 0x01b0, 0x2011, 0x481b, 0x080c, 0x650d, 0xa086, | ||
| 6434 | 0x0084, 0x1168, 0x2079, 0xb280, 0x7a30, 0xa296, 0x1106, 0x1138, | ||
| 6435 | 0x7834, 0xa005, 0x1120, 0x708b, 0x000c, 0x0029, 0x0010, 0x080c, | ||
| 6436 | 0x485e, 0x00fe, 0x0005, 0x708b, 0x000d, 0x080c, 0x48c6, 0x20a3, | ||
| 6437 | 0x1107, 0x20a3, 0x0000, 0x2099, 0xb28e, 0x20a9, 0x0040, 0x53a6, | ||
| 6438 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4845, | ||
| 6439 | 0x0005, 0x00f6, 0x7080, 0xa005, 0x01d0, 0x2011, 0x481b, 0x080c, | ||
| 6440 | 0x650d, 0xa086, 0x0084, 0x1188, 0x2079, 0xb280, 0x7a30, 0xa296, | ||
| 6441 | 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x7087, 0x0001, 0x080c, | ||
| 6442 | 0x48b8, 0x708b, 0x000e, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, | ||
| 6443 | 0x0005, 0x708b, 0x000f, 0x7083, 0x0000, 0x608b, 0xbc85, 0x608f, | ||
| 6444 | 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, | ||
| 6445 | 0x481b, 0x080c, 0x6501, 0x0005, 0x7080, 0xa005, 0x0120, 0x2011, | ||
| 6446 | 0x481b, 0x080c, 0x650d, 0x0005, 0x708b, 0x0011, 0x080c, 0x4917, | ||
| 6447 | 0x1188, 0x716c, 0x81ff, 0x0170, 0x2009, 0x0000, 0x7070, 0xa084, | ||
| 6448 | 0x00ff, 0x080c, 0x2676, 0xa186, 0x0080, 0x0120, 0x2011, 0xb28e, | ||
| 6449 | 0x080c, 0x47df, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xb280, | ||
| 6450 | 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007, 0xa084, | ||
| 6451 | 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x080c, 0x4845, | ||
| 6452 | 0x0005, 0x00f6, 0x7080, 0xa005, 0x01f0, 0x2011, 0x481b, 0x080c, | ||
| 6453 | 0x650d, 0xa086, 0x0014, 0x11a8, 0x2079, 0xb280, 0x7a30, 0xa296, | ||
| 6454 | 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, | ||
| 6455 | 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, 0x708b, 0x0012, 0x0029, | ||
| 6456 | 0x0010, 0x080c, 0x485e, 0x00fe, 0x0005, 0x708b, 0x0013, 0x080c, | ||
| 6457 | 0x48d2, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xb28e, | ||
| 6458 | 0x080c, 0x4917, 0x1160, 0x7074, 0xa005, 0x1148, 0x714c, 0xa186, | ||
| 6459 | 0xffff, 0x0128, 0x080c, 0x47df, 0x0110, 0x080c, 0x48f5, 0x20a9, | ||
| 6460 | 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 6461 | 0x60c3, 0x0014, 0x080c, 0x4845, 0x0005, 0x00f6, 0x7080, 0xa005, | ||
| 6462 | 0x01f0, 0x2011, 0x481b, 0x080c, 0x650d, 0xa086, 0x0014, 0x11a8, | ||
| 6463 | 0x2079, 0xb280, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, | ||
| 6464 | 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b4, 0xa005, 0x1110, 0x70b7, | ||
| 6465 | 0x0001, 0x708b, 0x0014, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, | ||
| 6466 | 0x0005, 0x708b, 0x0015, 0x080c, 0x48d2, 0x20a3, 0x1104, 0x20a3, | ||
| 6467 | 0x0000, 0x3430, 0x2011, 0xb28e, 0x080c, 0x4917, 0x11a8, 0x7074, | ||
| 6468 | 0xa005, 0x1190, 0x7154, 0xa186, 0xffff, 0x0170, 0xa180, 0x2be6, | ||
| 6469 | 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x47df, 0x0128, 0x080c, | ||
| 6470 | 0x3e66, 0x0110, 0x080c, 0x26c0, 0x20a9, 0x0008, 0x2298, 0x26a0, | ||
| 6471 | 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, | ||
| 6472 | 0x4845, 0x0005, 0x00f6, 0x7080, 0xa005, 0x05b8, 0x2011, 0x481b, | ||
| 6473 | 0x080c, 0x650d, 0xa086, 0x0014, 0x1570, 0x2079, 0xb280, 0x7a30, | ||
| 6474 | 0xa296, 0x1105, 0x1540, 0x7834, 0x2011, 0x0100, 0xa21e, 0x1148, | ||
| 6475 | 0x7a38, 0xd2fc, 0x0128, 0x70b4, 0xa005, 0x1110, 0x70b7, 0x0001, | ||
| 6476 | 0x0060, 0xa005, 0x11c0, 0x7a38, 0xd2fc, 0x0128, 0x70b4, 0xa005, | ||
| 6477 | 0x1110, 0x70b7, 0x0001, 0x7087, 0x0000, 0x7a38, 0xd2f4, 0x0138, | ||
| 6478 | 0x2001, 0xad73, 0x2004, 0xd0a4, 0x1110, 0x70d3, 0x0008, 0x708b, | ||
| 6479 | 0x0016, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, 0x0005, 0x20e1, | ||
| 6480 | 0x9080, 0x20e1, 0x4000, 0x2099, 0xb280, 0x20a1, 0x020b, 0x20a9, | ||
| 6481 | 0x000e, 0x53a6, 0x3430, 0x2011, 0xb28e, 0x708b, 0x0017, 0x080c, | ||
| 6482 | 0x4917, 0x1150, 0x7074, 0xa005, 0x1138, 0x080c, 0x4754, 0x1170, | ||
| 6483 | 0xa085, 0x0001, 0x080c, 0x26c0, 0x20a9, 0x0008, 0x2099, 0xb28e, | ||
| 6484 | 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, | ||
| 6485 | 0x080c, 0x4845, 0x0010, 0x080c, 0x436e, 0x0005, 0x00f6, 0x7080, | ||
| 6486 | 0xa005, 0x01b0, 0x2011, 0x481b, 0x080c, 0x650d, 0xa086, 0x0084, | ||
| 6487 | 0x1168, 0x2079, 0xb280, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, | ||
| 6488 | 0xa005, 0x1120, 0x708b, 0x0018, 0x0029, 0x0010, 0x080c, 0x485e, | ||
| 6489 | 0x00fe, 0x0005, 0x708b, 0x0019, 0x080c, 0x48d2, 0x20a3, 0x1106, | ||
| 6490 | 0x20a3, 0x0000, 0x3430, 0x2099, 0xb28e, 0x2039, 0xb20e, 0x27a0, | ||
| 6491 | 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4917, 0x11e8, 0x2728, 0x2514, | ||
| 6492 | 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, 0x8007, | ||
| 6493 | 0xa205, 0x202a, 0x7050, 0x2310, 0x8214, 0xa2a0, 0xb20e, 0x2414, | ||
| 6494 | 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00, 0x0018, 0xa294, 0x00ff, | ||
| 6495 | 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, 0x0040, 0x53a6, | ||
| 6496 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4845, | ||
| 6497 | 0x0005, 0x00f6, 0x7080, 0xa005, 0x01d0, 0x2011, 0x481b, 0x080c, | ||
| 6498 | 0x650d, 0xa086, 0x0084, 0x1188, 0x2079, 0xb280, 0x7a30, 0xa296, | ||
| 6499 | 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x7087, 0x0001, 0x080c, | ||
| 6500 | 0x48b8, 0x708b, 0x001a, 0x0029, 0x0010, 0x080c, 0x485e, 0x00fe, | ||
| 6501 | 0x0005, 0x708b, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, | ||
| 6502 | 0xb280, 0x20a1, 0x020b, 0x7480, 0xa480, 0x0018, 0xa080, 0x0007, | ||
| 6503 | 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, 0x080c, | ||
| 6504 | 0x4845, 0x0005, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0xad52, | ||
| 6505 | 0x252c, 0x20a9, 0x0008, 0x2041, 0xb20e, 0x28a0, 0x2099, 0xb28e, | ||
| 6506 | 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0110, 0x2011, | ||
| 6507 | 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x1148, 0xd5d4, | ||
| 6508 | 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4769, 0x0804, 0x47d7, | ||
| 6509 | 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, | ||
| 6510 | 0xa1a6, 0x3fff, 0x0904, 0x47d7, 0xa18d, 0xc000, 0x20a9, 0x0010, | ||
| 6511 | 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, | ||
| 6512 | 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, | ||
| 6513 | 0x0008, 0x8318, 0x1f04, 0x478f, 0x04d0, 0x23a8, 0x2021, 0x0001, | ||
| 6514 | 0x8426, 0x8425, 0x1f04, 0x47a1, 0x2328, 0x8529, 0xa2be, 0x0007, | ||
| 6515 | 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, | ||
| 6516 | 0xa5a8, 0x0010, 0x1f04, 0x47b0, 0x754e, 0xa5c8, 0x2be6, 0x292d, | ||
| 6517 | 0xa5ac, 0x00ff, 0x7572, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, | ||
| 6518 | 0x26a0, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0xa405, | ||
| 6519 | 0x201a, 0x7077, 0x0001, 0x26a0, 0x2898, 0x20a9, 0x0008, 0x53a6, | ||
| 6520 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0xa085, 0x0001, 0x0028, 0xa006, | ||
| 6521 | 0x0018, 0xa006, 0x080c, 0x14f6, 0x009e, 0x008e, 0x0005, 0x2118, | ||
| 6522 | 0x2021, 0x0000, 0x2001, 0x0007, 0xa39a, 0x0010, 0x0218, 0x8420, | ||
| 6523 | 0x8001, 0x0cd0, 0x2118, 0x84ff, 0x0120, 0xa39a, 0x0010, 0x8421, | ||
| 6524 | 0x1de0, 0x2021, 0x0001, 0x83ff, 0x0118, 0x8423, 0x8319, 0x1de8, | ||
| 6525 | 0xa238, 0x2704, 0xa42c, 0x11b8, 0xa405, 0x203a, 0x714e, 0xa1a0, | ||
| 6526 | 0x2be6, 0x242d, 0xa5ac, 0x00ff, 0x7572, 0x6532, 0x6536, 0x0016, | ||
| 6527 | 0x2508, 0x080c, 0x26a0, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7077, | ||
| 6528 | 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6, 0x2071, 0xad00, 0x707b, | ||
| 6529 | 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, | ||
| 6530 | 0x0140, 0x080c, 0x7834, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, | ||
| 6531 | 0x1000, 0x7003, 0x0000, 0x0126, 0x2091, 0x8000, 0x2071, 0xad22, | ||
| 6532 | 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, | ||
| 6533 | 0x48de, 0x001e, 0xa094, 0x0010, 0xa285, 0x0080, 0x7842, 0x7a42, | ||
| 6534 | 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, | ||
| 6535 | 0x2011, 0xafd1, 0x2013, 0x0000, 0x7083, 0x0000, 0x012e, 0x20e1, | ||
| 6536 | 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x782b, 0x2009, | ||
| 6537 | 0x07d0, 0x2011, 0x481b, 0x080c, 0x6593, 0x0005, 0x0016, 0x0026, | ||
| 6538 | 0x00c6, 0x0126, 0x2091, 0x8000, 0x2009, 0x00f7, 0x080c, 0x48de, | ||
| 6539 | 0x2061, 0xafda, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xad00, | ||
| 6540 | 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, | ||
| 6541 | 0x2009, 0x002d, 0x2011, 0x4883, 0x080c, 0x6501, 0x012e, 0x00ce, | ||
| 6542 | 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, | ||
| 6543 | 0x2071, 0x0100, 0x080c, 0x7834, 0x2071, 0x0140, 0x7004, 0xa084, | ||
| 6544 | 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x080c, 0x5757, | ||
| 6545 | 0x01a8, 0x080c, 0x5775, 0x1190, 0x2001, 0xaf9d, 0x2003, 0xaaaa, | ||
| 6546 | 0x0016, 0x080c, 0x2744, 0x2001, 0xaf8e, 0x2102, 0x001e, 0x2001, | ||
| 6547 | 0xaf9e, 0x2003, 0x0000, 0x080c, 0x569a, 0x0030, 0x2001, 0x0001, | ||
| 6548 | 0x080c, 0x261e, 0x080c, 0x485e, 0x012e, 0x000e, 0x00ee, 0x0005, | ||
| 6549 | 0x20a9, 0x0040, 0x20a1, 0xb3c0, 0x2099, 0xb28e, 0x3304, 0x8007, | ||
| 6550 | 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x48be, 0x0005, 0x20e1, 0x9080, | ||
| 6551 | 0x20e1, 0x4000, 0x2099, 0xb200, 0x20a1, 0x020b, 0x20a9, 0x000c, | ||
| 6552 | 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xb280, | ||
| 6553 | 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x00c6, 0x0006, | ||
| 6554 | 0x2061, 0x0100, 0x810f, 0x2001, 0xad30, 0x2004, 0xa005, 0x1138, | ||
| 6555 | 0x2001, 0xad14, 0x2004, 0xa084, 0x00ff, 0xa105, 0x0010, 0xa185, | ||
| 6556 | 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x2001, | ||
| 6557 | 0xad52, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a, | ||
| 6558 | 0x080c, 0xa96c, 0x2001, 0xad0c, 0x200c, 0xc195, 0x2102, 0x2019, | ||
| 6559 | 0x002a, 0x2009, 0x0000, 0x080c, 0x2aac, 0x004e, 0x001e, 0x0005, | ||
| 6560 | 0x080c, 0x485e, 0x708b, 0x0000, 0x7083, 0x0000, 0x0005, 0x0006, | ||
| 6561 | 0x2001, 0xad0c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, 0x0006, | ||
| 6562 | 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, 0xa18d, | ||
| 6563 | 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x0156, 0x20a9, | ||
| 6564 | 0x00ff, 0x2009, 0xae34, 0xa006, 0x200a, 0x8108, 0x1f04, 0x4934, | ||
| 6565 | 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, 0x2069, | ||
| 6566 | 0xad51, 0xa006, 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, 0x6012, | ||
| 6567 | 0xa198, 0x2be6, 0x231d, 0xa39c, 0x00ff, 0x6316, 0x20a9, 0x0004, | ||
| 6568 | 0xac98, 0x0006, 0x23a0, 0x40a4, 0x20a9, 0x0004, 0xac98, 0x000a, | ||
| 6569 | 0x23a0, 0x40a4, 0x603e, 0x6042, 0x604e, 0x6052, 0x6056, 0x605a, | ||
| 6570 | 0x605e, 0x6062, 0x6066, 0x606a, 0x606e, 0x6072, 0x6076, 0x607a, | ||
| 6571 | 0x607e, 0x6082, 0x6086, 0x608a, 0x608e, 0x6092, 0x6096, 0x609a, | ||
| 6572 | 0x609e, 0x60ae, 0x61a2, 0x00d6, 0x60a4, 0xa06d, 0x0110, 0x080c, | ||
| 6573 | 0x15f0, 0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0110, 0x080c, 0x15f0, | ||
| 6574 | 0x60ab, 0x0000, 0x00de, 0xa006, 0x604a, 0x6810, 0x603a, 0x680c, | ||
| 6575 | 0x6046, 0x6814, 0xa084, 0x00ff, 0x6042, 0x014e, 0x013e, 0x015e, | ||
| 6576 | 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0x6944, 0x6e48, | ||
| 6577 | 0xa684, 0x3fff, 0xa082, 0x4000, 0x1a04, 0x4a49, 0xa18c, 0xff00, | ||
| 6578 | 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4a4e, 0x2001, 0xad0c, 0x2004, | ||
| 6579 | 0xa084, 0x0003, 0x01c0, 0x2001, 0xad0c, 0x2004, 0xd084, 0x1904, | ||
| 6580 | 0x4a31, 0xa188, 0xae34, 0x2104, 0xa065, 0x0904, 0x4a31, 0x6004, | ||
| 6581 | 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, 0x4a31, 0x6000, 0xd0c4, | ||
| 6582 | 0x0904, 0x4a31, 0x0068, 0xa188, 0xae34, 0x2104, 0xa065, 0x0904, | ||
| 6583 | 0x4a15, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, 0x4a1a, | ||
| 6584 | 0x60a4, 0xa00d, 0x0118, 0x080c, 0x4ef9, 0x05d0, 0x60a8, 0xa00d, | ||
| 6585 | 0x0188, 0x080c, 0x4f43, 0x1170, 0x694c, 0xd1fc, 0x1118, 0x080c, | ||
| 6586 | 0x4c11, 0x0448, 0x080c, 0x4bd3, 0x694c, 0xd1ec, 0x1520, 0x080c, | ||
| 6587 | 0x4ded, 0x0408, 0x694c, 0xa184, 0xa000, 0x0178, 0xd1ec, 0x0140, | ||
| 6588 | 0xd1fc, 0x0118, 0x080c, 0x4dfc, 0x0028, 0x080c, 0x4dfc, 0x0028, | ||
| 6589 | 0xd1fc, 0x0118, 0x080c, 0x4bd3, 0x0070, 0x6050, 0xa00d, 0x0130, | ||
| 6590 | 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0028, 0x2d00, 0x6052, | ||
| 6591 | 0x604e, 0x6803, 0x0000, 0x080c, 0x67c5, 0xa006, 0x012e, 0x0005, | ||
| 6592 | 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8, 0x2001, 0x0028, 0x2009, | ||
| 6593 | 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0, 0x2001, 0xad34, 0x2004, | ||
| 6594 | 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148, 0x6100, 0xd1fc, 0x0904, | ||
| 6595 | 0x49d0, 0x2001, 0x0029, 0x2009, 0x1000, 0x0420, 0x2001, 0x0028, | ||
| 6596 | 0x00a8, 0x2009, 0xad0c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, | ||
| 6597 | 0x0068, 0xd184, 0x0118, 0x2001, 0x0004, 0x0040, 0x2001, 0x0029, | ||
| 6598 | 0x6100, 0xd1fc, 0x0118, 0x2009, 0x1000, 0x0060, 0x2009, 0x0000, | ||
| 6599 | 0x0048, 0x2001, 0x0029, 0x2009, 0x0000, 0x0020, 0x2001, 0x0029, | ||
| 6600 | 0x2009, 0x0000, 0xa005, 0x012e, 0x0005, 0x00e6, 0x0126, 0x2091, | ||
| 6601 | 0x8000, 0x6844, 0x8007, 0xa084, 0x00ff, 0x2008, 0xa182, 0x00ff, | ||
| 6602 | 0x1a04, 0x4aa8, 0xa188, 0xae34, 0x2104, 0xa065, 0x01c0, 0x6004, | ||
| 6603 | 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8, 0x2c70, 0x080c, 0x8022, | ||
| 6604 | 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, | ||
| 6605 | 0x000a, 0x2009, 0x0003, 0x080c, 0x80a7, 0xa006, 0x0460, 0x2001, | ||
| 6606 | 0x0028, 0x0440, 0xa082, 0x0006, 0x1298, 0x2001, 0xad34, 0x2004, | ||
| 6607 | 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc, 0x09e8, | ||
| 6608 | 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, 0x0090, | ||
| 6609 | 0x2009, 0xad0c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0050, | ||
| 6610 | 0xd184, 0x0118, 0x2001, 0x0004, 0x0028, 0x2001, 0x0029, 0x0010, | ||
| 6611 | 0x2001, 0x0029, 0xa005, 0x012e, 0x00ee, 0x0005, 0x2001, 0x002c, | ||
| 6612 | 0x0cc8, 0x00f6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2011, 0x0000, | ||
| 6613 | 0x2079, 0xad00, 0x6944, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, | ||
| 6614 | 0x1a04, 0x4b77, 0x2001, 0xad0c, 0x2004, 0xa084, 0x0003, 0x1904, | ||
| 6615 | 0x4b65, 0x080c, 0x4cdc, 0x1180, 0x6004, 0xa084, 0x00ff, 0xa082, | ||
| 6616 | 0x0006, 0x1250, 0x2001, 0xad34, 0x2004, 0xd0ac, 0x1904, 0x4b60, | ||
| 6617 | 0x60a0, 0xd0bc, 0x1904, 0x4b60, 0x6864, 0xa0c6, 0x006f, 0x0118, | ||
| 6618 | 0x2008, 0x0804, 0x4b28, 0x6968, 0x2140, 0xa18c, 0xff00, 0x810f, | ||
| 6619 | 0x78d0, 0xd0ac, 0x1118, 0xa182, 0x0080, 0x06d0, 0xa182, 0x00ff, | ||
| 6620 | 0x16b8, 0x6a70, 0x6b6c, 0x786c, 0xa306, 0x1160, 0x7870, 0xa24e, | ||
| 6621 | 0x1118, 0x2208, 0x2310, 0x0460, 0xa9cc, 0xff00, 0x1118, 0x2208, | ||
| 6622 | 0x2310, 0x0430, 0x080c, 0x3b58, 0x2c70, 0x0550, 0x2009, 0x0000, | ||
| 6623 | 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, | ||
| 6624 | 0x4f6e, 0x1108, 0xc185, 0x7000, 0xd0bc, 0x0108, 0xc18d, 0x000e, | ||
| 6625 | 0x0088, 0xa0c6, 0x4007, 0x1110, 0x2408, 0x0060, 0xa0c6, 0x4008, | ||
| 6626 | 0x1118, 0x2708, 0x2610, 0x0030, 0xa0c6, 0x4009, 0x1108, 0x0010, | ||
| 6627 | 0x2001, 0x4006, 0x6866, 0x696a, 0x6a6e, 0x2001, 0x0030, 0x0458, | ||
| 6628 | 0x080c, 0x8022, 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, | ||
| 6629 | 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0x9956, 0x2d00, 0x6012, | ||
| 6630 | 0x601f, 0x0001, 0xa006, 0xd88c, 0x0110, 0x2001, 0x4000, 0x683a, | ||
| 6631 | 0x0126, 0x2091, 0x8000, 0x080c, 0x2ad9, 0x012e, 0x2001, 0x0000, | ||
| 6632 | 0x080c, 0x4c1e, 0x2001, 0x0002, 0x080c, 0x4c30, 0x2009, 0x0002, | ||
| 6633 | 0x080c, 0x80a7, 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, | ||
| 6634 | 0x2001, 0x0028, 0x2009, 0x0000, 0x0cb0, 0x2009, 0xad0c, 0x210c, | ||
| 6635 | 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, | ||
| 6636 | 0x0004, 0x0010, 0x2001, 0x0029, 0x2009, 0x0000, 0x0c20, 0x2001, | ||
| 6637 | 0x0029, 0x2009, 0x0000, 0x08f8, 0x6944, 0x6e48, 0xa684, 0x3fff, | ||
| 6638 | 0xa082, 0x4000, 0x16b8, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, | ||
| 6639 | 0x12e0, 0xa188, 0xae34, 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, | ||
| 6640 | 0x00ff, 0xa08e, 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, | ||
| 6641 | 0x4dfc, 0x04c9, 0x0030, 0x04b9, 0x684c, 0xd0fc, 0x0110, 0x080c, | ||
| 6642 | 0x4ded, 0x080c, 0x4e3a, 0xa006, 0x00c8, 0x2001, 0x0028, 0x2009, | ||
| 6643 | 0x0000, 0x00a0, 0xa082, 0x0006, 0x1240, 0x6100, 0xd1fc, 0x0d20, | ||
| 6644 | 0x2001, 0x0029, 0x2009, 0x1000, 0x0048, 0x2001, 0x0029, 0x2009, | ||
| 6645 | 0x0000, 0x0020, 0x2001, 0x0029, 0x2009, 0x0000, 0xa005, 0x0005, | ||
| 6646 | 0x0126, 0x2091, 0x8000, 0x6050, 0xa00d, 0x0138, 0x2d00, 0x200a, | ||
| 6647 | 0x6803, 0x0000, 0x6052, 0x012e, 0x0005, 0x2d00, 0x6052, 0x604e, | ||
| 6648 | 0x6803, 0x0000, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x604c, 0xa005, | ||
| 6649 | 0x0170, 0x00e6, 0x2071, 0xafc7, 0x7004, 0xa086, 0x0002, 0x0168, | ||
| 6650 | 0x00ee, 0x604c, 0x6802, 0x2d00, 0x604e, 0x012e, 0x0005, 0x2d00, | ||
| 6651 | 0x6052, 0x604e, 0x6803, 0x0000, 0x0cc0, 0x701c, 0xac06, 0x1d80, | ||
| 6652 | 0x604c, 0x2070, 0x7000, 0x6802, 0x2d00, 0x7002, 0x00ee, 0x012e, | ||
| 6653 | 0x0005, 0x0126, 0x2091, 0x8000, 0x604c, 0xa06d, 0x0130, 0x6800, | ||
| 6654 | 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, 0x012e, 0x0005, 0x604c, | ||
| 6655 | 0xa06d, 0x0130, 0x6800, 0xa005, 0x1108, 0x6052, 0x604e, 0xad05, | ||
| 6656 | 0x0005, 0x6803, 0x0000, 0x6084, 0xa00d, 0x0120, 0x2d00, 0x200a, | ||
| 6657 | 0x6086, 0x0005, 0x2d00, 0x6086, 0x6082, 0x0cd8, 0x0126, 0x00c6, | ||
| 6658 | 0x0026, 0x2091, 0x8000, 0x6218, 0x2260, 0x6200, 0xa005, 0x0110, | ||
| 6659 | 0xc285, 0x0008, 0xc284, 0x6202, 0x002e, 0x00ce, 0x012e, 0x0005, | ||
| 6660 | 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, | ||
| 6661 | 0xa086, 0x0006, 0x1180, 0x609c, 0xd0ac, 0x0168, 0x2001, 0xad52, | ||
| 6662 | 0x2004, 0xd0a4, 0x0140, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, | ||
| 6663 | 0x1110, 0x2011, 0x0600, 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, | ||
| 6664 | 0x0006, 0xa086, 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, | ||
| 6665 | 0x14f6, 0x000e, 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, | ||
| 6666 | 0x8000, 0x6218, 0x2260, 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, | ||
| 6667 | 0x609c, 0xd0a4, 0x0160, 0x2001, 0xad52, 0x2004, 0xd0ac, 0x1138, | ||
| 6668 | 0xa284, 0x00ff, 0xa086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, | ||
| 6669 | 0xa294, 0x00ff, 0x8007, 0xa215, 0x6206, 0x00ce, 0x012e, 0x0005, | ||
| 6670 | 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x00b0, 0xa190, | ||
| 6671 | 0xae34, 0x2204, 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x15c0, | ||
| 6672 | 0x2d60, 0x00de, 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, | ||
| 6673 | 0x60ab, 0x0000, 0x080c, 0x493a, 0xa006, 0x002e, 0x0005, 0x0126, | ||
| 6674 | 0x2091, 0x8000, 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, | ||
| 6675 | 0x0480, 0x00d6, 0xa190, 0xae34, 0x2204, 0xa06d, 0x0540, 0x2013, | ||
| 6676 | 0x0000, 0x00d6, 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, | ||
| 6677 | 0x15f0, 0x60a8, 0xa06d, 0x0110, 0x080c, 0x15f0, 0x00ce, 0x00de, | ||
| 6678 | 0x00d6, 0x00c6, 0x68ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, | ||
| 6679 | 0x6010, 0x2068, 0x080c, 0x9596, 0x0110, 0x080c, 0x1600, 0x080c, | ||
| 6680 | 0x8078, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x080c, 0x15f0, 0x00de, | ||
| 6681 | 0xa006, 0x002e, 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, | ||
| 6682 | 0xa085, 0x0001, 0x0030, 0xa188, 0xae34, 0x2104, 0xa065, 0x0dc0, | ||
| 6683 | 0xa006, 0x001e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, | ||
| 6684 | 0x0000, 0x600f, 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x574f, | ||
| 6685 | 0x1538, 0x60a0, 0xa086, 0x007e, 0x2069, 0xb290, 0x0130, 0x2001, | ||
| 6686 | 0xad34, 0x2004, 0xd0ac, 0x11e0, 0x0098, 0x2d04, 0xd0e4, 0x01c0, | ||
| 6687 | 0x00d6, 0x2069, 0xb28e, 0x00c6, 0x2061, 0xaf9f, 0x6810, 0x2062, | ||
| 6688 | 0x6814, 0x6006, 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, | ||
| 6689 | 0x8d69, 0x2d04, 0x2069, 0x0140, 0x6886, 0x2069, 0xad00, 0x68a2, | ||
| 6690 | 0x2069, 0xb28e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138, 0xa10a, | ||
| 6691 | 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, 0xb296, 0xac88, 0x000a, | ||
| 6692 | 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xb29a, 0xac88, 0x0006, | ||
| 6693 | 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xb2ae, 0x6808, 0x606a, | ||
| 6694 | 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, 0xa182, 0x0211, | ||
| 6695 | 0x1218, 0x2009, 0x0008, 0x0400, 0xa182, 0x0259, 0x1218, 0x2009, | ||
| 6696 | 0x0007, 0x00d0, 0xa182, 0x02c1, 0x1218, 0x2009, 0x0006, 0x00a0, | ||
| 6697 | 0xa182, 0x0349, 0x1218, 0x2009, 0x0005, 0x0070, 0xa182, 0x0421, | ||
| 6698 | 0x1218, 0x2009, 0x0004, 0x0040, 0xa182, 0x0581, 0x1218, 0x2009, | ||
| 6699 | 0x0003, 0x0010, 0x2009, 0x0002, 0x6192, 0x014e, 0x013e, 0x015e, | ||
| 6700 | 0x00de, 0x0005, 0x0016, 0x0026, 0x00e6, 0x2071, 0xb28d, 0x2e04, | ||
| 6701 | 0x6896, 0x2071, 0xb28e, 0x7004, 0x689a, 0x701c, 0x689e, 0x6a00, | ||
| 6702 | 0x2009, 0xad71, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, | ||
| 6703 | 0x0008, 0xc2ac, 0xd0c4, 0x0120, 0xd1e4, 0x0110, 0xc2bd, 0x0008, | ||
| 6704 | 0xc2bc, 0x6a02, 0x00ee, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0126, | ||
| 6705 | 0x2091, 0x8000, 0x60a4, 0xa06d, 0x01c0, 0x6900, 0x81ff, 0x1540, | ||
| 6706 | 0x6a04, 0xa282, 0x0010, 0x1648, 0xad88, 0x0004, 0x20a9, 0x0010, | ||
| 6707 | 0x2104, 0xa086, 0xffff, 0x0128, 0x8108, 0x1f04, 0x4da8, 0x080c, | ||
| 6708 | 0x14f6, 0x260a, 0x8210, 0x6a06, 0x0098, 0x080c, 0x15d9, 0x01a8, | ||
| 6709 | 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, | ||
| 6710 | 0x200b, 0xffff, 0x8108, 0x1f04, 0x4dc0, 0x6807, 0x0001, 0x6e12, | ||
| 6711 | 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, | ||
| 6712 | 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, | ||
| 6713 | 0xa005, 0x1160, 0x080c, 0x4ef9, 0x1168, 0x200b, 0xffff, 0x6804, | ||
| 6714 | 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, 0x0020, 0x080c, 0x15f0, | ||
| 6715 | 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, | ||
| 6716 | 0x080c, 0x4f56, 0x0010, 0x080c, 0x4bc0, 0x080c, 0x4e71, 0x1dd8, | ||
| 6717 | 0x080c, 0x4e3a, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, | ||
| 6718 | 0x60a8, 0xa06d, 0x01c0, 0x6950, 0x81ff, 0x1540, 0x6a54, 0xa282, | ||
| 6719 | 0x0010, 0x1670, 0xad88, 0x0018, 0x20a9, 0x0010, 0x2104, 0xa086, | ||
| 6720 | 0xffff, 0x0128, 0x8108, 0x1f04, 0x4e0e, 0x080c, 0x14f6, 0x260a, | ||
| 6721 | 0x8210, 0x6a56, 0x0098, 0x080c, 0x15d9, 0x01d0, 0x2d00, 0x60aa, | ||
| 6722 | 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, | ||
| 6723 | 0x8108, 0x1f04, 0x4e26, 0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, | ||
| 6724 | 0x4c11, 0x0089, 0x1de0, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, | ||
| 6725 | 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c, 0x67c5, 0x012e, | ||
| 6726 | 0x0005, 0xa01e, 0x0010, 0x2019, 0x0001, 0xa00e, 0x0126, 0x2091, | ||
| 6727 | 0x8000, 0x604c, 0x2068, 0x6000, 0xd0dc, 0x1170, 0x8dff, 0x01e8, | ||
| 6728 | 0x83ff, 0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, | ||
| 6729 | 0x1118, 0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, | ||
| 6730 | 0x6a00, 0x604c, 0xad06, 0x1110, 0x624e, 0x0018, 0xa180, 0x0000, | ||
| 6731 | 0x2202, 0x82ff, 0x1110, 0x6152, 0x8dff, 0x012e, 0x0005, 0xa01e, | ||
| 6732 | 0x0010, 0x2019, 0x0001, 0xa00e, 0x6080, 0x2068, 0x8dff, 0x01e8, | ||
| 6733 | 0x83ff, 0x0120, 0x6848, 0xa606, 0x0158, 0x0030, 0x683c, 0xa406, | ||
| 6734 | 0x1118, 0x6840, 0xa506, 0x0120, 0x2d08, 0x6800, 0x2068, 0x0c70, | ||
| 6735 | 0x6a00, 0x6080, 0xad06, 0x1110, 0x6282, 0x0018, 0xa180, 0x0000, | ||
| 6736 | 0x2202, 0x82ff, 0x1110, 0x6186, 0x8dff, 0x0005, 0xa016, 0x080c, | ||
| 6737 | 0x4ef3, 0x1110, 0x2011, 0x0001, 0x080c, 0x4f3d, 0x1110, 0xa295, | ||
| 6738 | 0x0002, 0x0005, 0x080c, 0x4f6e, 0x0118, 0x080c, 0x964b, 0x0010, | ||
| 6739 | 0xa085, 0x0001, 0x0005, 0x080c, 0x4f6e, 0x0118, 0x080c, 0x95e4, | ||
| 6740 | 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x4f6e, 0x0118, 0x080c, | ||
| 6741 | 0x962e, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x4f6e, 0x0118, | ||
| 6742 | 0x080c, 0x9600, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x4f6e, | ||
| 6743 | 0x0118, 0x080c, 0x9667, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, | ||
| 6744 | 0x0006, 0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, | ||
| 6745 | 0x0006, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x97fd, | ||
| 6746 | 0x0006, 0x6000, 0xd0fc, 0x0110, 0x080c, 0xac03, 0x000e, 0x080c, | ||
| 6747 | 0x510c, 0x000e, 0x0c50, 0x6083, 0x0000, 0x6087, 0x0000, 0x00de, | ||
| 6748 | 0x000e, 0x012e, 0x0005, 0x60a4, 0xa00d, 0x1118, 0xa085, 0x0001, | ||
| 6749 | 0x0005, 0x00e6, 0x2170, 0x7000, 0xa005, 0x1160, 0x20a9, 0x0010, | ||
| 6750 | 0xae88, 0x0004, 0x2104, 0xa606, 0x0128, 0x8108, 0x1f04, 0x4f02, | ||
| 6751 | 0xa085, 0x0001, 0xa006, 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, | ||
| 6752 | 0x8000, 0x60a4, 0xa06d, 0x1128, 0x080c, 0x15d9, 0x01a0, 0x2d00, | ||
| 6753 | 0x60a6, 0x6803, 0x0001, 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, | ||
| 6754 | 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x4f21, 0xa085, 0x0001, | ||
| 6755 | 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, | ||
| 6756 | 0x8000, 0x60a4, 0xa06d, 0x0130, 0x60a7, 0x0000, 0x080c, 0x15f0, | ||
| 6757 | 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0x60a8, 0xa00d, 0x1118, | ||
| 6758 | 0xa085, 0x0001, 0x0005, 0x00e6, 0x2170, 0x7050, 0xa005, 0x1160, | ||
| 6759 | 0x20a9, 0x0010, 0xae88, 0x0018, 0x2104, 0xa606, 0x0128, 0x8108, | ||
| 6760 | 0x1f04, 0x4f4c, 0xa085, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, | ||
| 6761 | 0x8000, 0x0c19, 0x1188, 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, | ||
| 6762 | 0x6854, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6856, 0x0020, 0x080c, | ||
| 6763 | 0x15f0, 0x60ab, 0x0000, 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, | ||
| 6764 | 0x0005, 0x00f6, 0x080c, 0x574f, 0x01b0, 0x71b4, 0x81ff, 0x1198, | ||
| 6765 | 0x71d0, 0xd19c, 0x0180, 0x2001, 0x007e, 0xa080, 0xae34, 0x2004, | ||
| 6766 | 0xa07d, 0x0148, 0x7804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, | ||
| 6767 | 0x7800, 0xc0ed, 0x7802, 0x2079, 0xad51, 0x7804, 0xd0a4, 0x01e8, | ||
| 6768 | 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, | ||
| 6769 | 0x4cdc, 0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, | ||
| 6770 | 0x0118, 0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, | ||
| 6771 | 0x8108, 0x1f04, 0x4f96, 0x00ce, 0x015e, 0x080c, 0x502d, 0x0120, | ||
| 6772 | 0x2001, 0xafa2, 0x200c, 0x0038, 0x2079, 0xad51, 0x7804, 0xd0a4, | ||
| 6773 | 0x0130, 0x2009, 0x07d0, 0x2011, 0x4fc1, 0x080c, 0x6593, 0x00fe, | ||
| 6774 | 0x0005, 0x2011, 0x4fc1, 0x080c, 0x650d, 0x080c, 0x502d, 0x01f0, | ||
| 6775 | 0x2001, 0xaeb2, 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, | ||
| 6776 | 0x2001, 0xad52, 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, | ||
| 6777 | 0x4fc1, 0x080c, 0x6593, 0x00e6, 0x2071, 0xad00, 0x706f, 0x0000, | ||
| 6778 | 0x7073, 0x0000, 0x080c, 0x28fa, 0x00ee, 0x04b0, 0x0156, 0x00c6, | ||
| 6779 | 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4cdc, 0x1530, | ||
| 6780 | 0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, | ||
| 6781 | 0xa006, 0x2009, 0x0029, 0x080c, 0xa96c, 0x6000, 0xc0e5, 0xc0ec, | ||
| 6782 | 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, | ||
| 6783 | 0x0029, 0x080c, 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, | ||
| 6784 | 0x2009, 0x0000, 0x080c, 0xa712, 0x007e, 0x004e, 0x001e, 0x8108, | ||
| 6785 | 0x1f04, 0x4fec, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, | ||
| 6786 | 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x7818, 0x2004, 0xd0ac, | ||
| 6787 | 0x0005, 0x7818, 0x2004, 0xd0bc, 0x0005, 0x00f6, 0x2001, 0xaeb2, | ||
| 6788 | 0x2004, 0xa07d, 0x0110, 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, | ||
| 6789 | 0x0026, 0x2091, 0x8000, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, | ||
| 6790 | 0xc2fc, 0x6202, 0x002e, 0x012e, 0x0005, 0x2071, 0xae13, 0x7003, | ||
| 6791 | 0x0001, 0x7007, 0x0000, 0x7013, 0x0000, 0x7017, 0x0000, 0x701b, | ||
| 6792 | 0x0000, 0x701f, 0x0000, 0x700b, 0x0000, 0x704b, 0x0001, 0x704f, | ||
| 6793 | 0x0000, 0x705b, 0x0020, 0x705f, 0x0040, 0x707f, 0x0000, 0x2071, | ||
| 6794 | 0xaf7c, 0x7003, 0xae13, 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, | ||
| 6795 | 0xaf5c, 0x7013, 0x0020, 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, | ||
| 6796 | 0x0016, 0x00e6, 0x2071, 0xaf34, 0xa00e, 0x7186, 0x718a, 0x7097, | ||
| 6797 | 0x0001, 0x2001, 0xad52, 0x2004, 0xd0fc, 0x1150, 0x2001, 0xad52, | ||
| 6798 | 0x2004, 0xa00e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0804, 0x50d6, | ||
| 6799 | 0x2001, 0xad71, 0x200c, 0xa184, 0x000f, 0x2009, 0xad72, 0x210c, | ||
| 6800 | 0x0002, 0x507e, 0x50b1, 0x50b8, 0x50c2, 0x50c7, 0x507e, 0x507e, | ||
| 6801 | 0x507e, 0x50a1, 0x507e, 0x507e, 0x507e, 0x507e, 0x507e, 0x507e, | ||
| 6802 | 0x507e, 0x7003, 0x0004, 0x0136, 0x0146, 0x0156, 0x2099, 0xad75, | ||
| 6803 | 0x20a1, 0xaf85, 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, | ||
| 6804 | 0x0428, 0x708f, 0x0005, 0x7007, 0x0122, 0x2001, 0x0002, 0x0030, | ||
| 6805 | 0x708f, 0x0002, 0x7007, 0x0121, 0x2001, 0x0003, 0x7002, 0x7097, | ||
| 6806 | 0x0001, 0x0088, 0x7007, 0x0122, 0x2001, 0x0002, 0x0020, 0x7007, | ||
| 6807 | 0x0121, 0x2001, 0x0003, 0x7002, 0xa006, 0x7096, 0x708e, 0xa184, | ||
| 6808 | 0xff00, 0x8007, 0x709a, 0xa184, 0x00ff, 0x7092, 0x00ee, 0x001e, | ||
| 6809 | 0x0005, 0x00e6, 0x2071, 0xae13, 0x684c, 0xa005, 0x1130, 0x7028, | ||
| 6810 | 0xc085, 0x702a, 0xa085, 0x0001, 0x0428, 0x6a60, 0x7236, 0x6b64, | ||
| 6811 | 0x733a, 0x6868, 0x703e, 0x7076, 0x686c, 0x7042, 0x707a, 0x684c, | ||
| 6812 | 0x702e, 0x6844, 0x7032, 0x2009, 0x000d, 0x200a, 0x700b, 0x0000, | ||
| 6813 | 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, 0xa210, | ||
| 6814 | 0x2100, 0xa319, 0x726e, 0x7372, 0x7028, 0xc084, 0x702a, 0x7007, | ||
| 6815 | 0x0001, 0xa006, 0x00ee, 0x0005, 0x0156, 0x00e6, 0x0026, 0x6838, | ||
| 6816 | 0xd0fc, 0x1904, 0x5165, 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, | ||
| 6817 | 0xad00, 0xa016, 0x702c, 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, | ||
| 6818 | 0x81ff, 0x1dc8, 0x702e, 0x70b0, 0xa200, 0x70b2, 0x00de, 0x2071, | ||
| 6819 | 0xae13, 0x701c, 0xa005, 0x1904, 0x5175, 0x20a9, 0x0032, 0x0f04, | ||
| 6820 | 0x5173, 0x0e04, 0x512f, 0x2071, 0xaf34, 0x7200, 0x82ff, 0x05d8, | ||
| 6821 | 0x6934, 0xa186, 0x0103, 0x1904, 0x5183, 0x6948, 0x6844, 0xa105, | ||
| 6822 | 0x1540, 0x2009, 0x8020, 0x2200, 0x0002, 0x5173, 0x514a, 0x519b, | ||
| 6823 | 0x51a7, 0x5173, 0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x5173, | ||
| 6824 | 0x7018, 0xd084, 0x1dd8, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, | ||
| 6825 | 0x701b, 0x0001, 0x2091, 0x4080, 0x2071, 0xad00, 0x702c, 0x206a, | ||
| 6826 | 0x2d00, 0x702e, 0x70b0, 0x8000, 0x70b2, 0x002e, 0x00ee, 0x015e, | ||
| 6827 | 0x0005, 0x6844, 0xa086, 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, | ||
| 6828 | 0x2009, 0x8020, 0x0880, 0x2071, 0xae13, 0x2d08, 0x206b, 0x0000, | ||
| 6829 | 0x7010, 0x8000, 0x7012, 0x7018, 0xa06d, 0x711a, 0x0110, 0x6902, | ||
| 6830 | 0x0008, 0x711e, 0x0c10, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, | ||
| 6831 | 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f, 0x1d28, 0x684c, 0xd0cc, | ||
| 6832 | 0x0d10, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, 0x19e0, 0x2009, | ||
| 6833 | 0x8021, 0x0804, 0x5143, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a98, | ||
| 6834 | 0x7186, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0078, 0x7084, | ||
| 6835 | 0x8008, 0xa092, 0x000f, 0x1a38, 0x7186, 0xae90, 0x0003, 0x8003, | ||
| 6836 | 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, | ||
| 6837 | 0x0a04, 0x515c, 0x718c, 0x7084, 0xa10a, 0x0a04, 0x515c, 0x2071, | ||
| 6838 | 0x0000, 0x7018, 0xd084, 0x1904, 0x515c, 0x2071, 0xaf34, 0x7000, | ||
| 6839 | 0xa086, 0x0002, 0x1150, 0x080c, 0x5426, 0x2071, 0x0000, 0x701b, | ||
| 6840 | 0x0001, 0x2091, 0x4080, 0x0804, 0x515c, 0x080c, 0x5450, 0x2071, | ||
| 6841 | 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x515c, 0x0006, | ||
| 6842 | 0x684c, 0x0006, 0x6837, 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, | ||
| 6843 | 0x20a0, 0x2001, 0x0000, 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, | ||
| 6844 | 0x000e, 0x684a, 0x6952, 0x0005, 0x2071, 0xae13, 0x7004, 0x0002, | ||
| 6845 | 0x5202, 0x5213, 0x5411, 0x5412, 0x541f, 0x5425, 0x5203, 0x5402, | ||
| 6846 | 0x5398, 0x53ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5212, | ||
| 6847 | 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, | ||
| 6848 | 0x700b, 0x0000, 0x012e, 0x2069, 0xafda, 0x683c, 0xa005, 0x03f8, | ||
| 6849 | 0x11f0, 0x0126, 0x2091, 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, | ||
| 6850 | 0xae1f, 0x2004, 0xa10a, 0x0170, 0x0e04, 0x5236, 0x2069, 0x0000, | ||
| 6851 | 0x6818, 0xd084, 0x1158, 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, | ||
| 6852 | 0x2091, 0x4080, 0x2069, 0xafda, 0x683f, 0xffff, 0x012e, 0x2069, | ||
| 6853 | 0xad00, 0x6844, 0x6964, 0xa102, 0x2069, 0xaf34, 0x688a, 0x6984, | ||
| 6854 | 0x701c, 0xa06d, 0x0120, 0x81ff, 0x0904, 0x528c, 0x00a0, 0x81ff, | ||
| 6855 | 0x0904, 0x5352, 0x2071, 0xaf34, 0x7184, 0x7088, 0xa10a, 0x1258, | ||
| 6856 | 0x7190, 0x2071, 0xafda, 0x7038, 0xa005, 0x0128, 0x1b04, 0x5352, | ||
| 6857 | 0x713a, 0x0804, 0x5352, 0x2071, 0xaf34, 0x718c, 0x0126, 0x2091, | ||
| 6858 | 0x8000, 0x7084, 0xa10a, 0x0a04, 0x536d, 0x0e04, 0x530e, 0x2071, | ||
| 6859 | 0x0000, 0x7018, 0xd084, 0x1904, 0x530e, 0x2001, 0xffff, 0x2071, | ||
| 6860 | 0xafda, 0x703a, 0x2071, 0xaf34, 0x7000, 0xa086, 0x0002, 0x1150, | ||
| 6861 | 0x080c, 0x5426, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, | ||
| 6862 | 0x0804, 0x530e, 0x080c, 0x5450, 0x2071, 0x0000, 0x701b, 0x0001, | ||
| 6863 | 0x2091, 0x4080, 0x0804, 0x530e, 0x2071, 0xaf34, 0x7000, 0xa005, | ||
| 6864 | 0x0904, 0x5334, 0x6934, 0xa186, 0x0103, 0x1904, 0x5311, 0x684c, | ||
| 6865 | 0xd0bc, 0x1904, 0x5334, 0x6948, 0x6844, 0xa105, 0x1904, 0x5329, | ||
| 6866 | 0x2009, 0x8020, 0x2071, 0xaf34, 0x7000, 0x0002, 0x5334, 0x52f4, | ||
| 6867 | 0x52cc, 0x52de, 0x52ab, 0x0136, 0x0146, 0x0156, 0x2099, 0xad75, | ||
| 6868 | 0x20a1, 0xaf85, 0x20a9, 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, | ||
| 6869 | 0x2071, 0xaf7c, 0xad80, 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, | ||
| 6870 | 0x0002, 0x700b, 0x0000, 0x2e10, 0x080c, 0x1624, 0x2071, 0xae13, | ||
| 6871 | 0x7007, 0x0009, 0x0804, 0x5352, 0x7084, 0x8008, 0xa092, 0x001e, | ||
| 6872 | 0x1a04, 0x5352, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, | ||
| 6873 | 0x2071, 0xae13, 0x080c, 0x54a7, 0x0804, 0x5352, 0x7084, 0x8008, | ||
| 6874 | 0xa092, 0x000f, 0x1a04, 0x5352, 0xae90, 0x0003, 0x8003, 0xa210, | ||
| 6875 | 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xae13, | ||
| 6876 | 0x080c, 0x54a7, 0x0804, 0x5352, 0x0126, 0x2091, 0x8000, 0x0e04, | ||
| 6877 | 0x530e, 0x2071, 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, | ||
| 6878 | 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, | ||
| 6879 | 0x2071, 0xae13, 0x080c, 0x54a7, 0x0804, 0x5352, 0x012e, 0x0804, | ||
| 6880 | 0x5352, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, | ||
| 6881 | 0x0118, 0xa18e, 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, | ||
| 6882 | 0xa084, 0x00ff, 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, | ||
| 6883 | 0x52a2, 0x6844, 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, | ||
| 6884 | 0x2009, 0x8020, 0x0804, 0x52a2, 0x2071, 0xae13, 0x080c, 0x54b9, | ||
| 6885 | 0x01c8, 0x2071, 0xae13, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, | ||
| 6886 | 0xa086, 0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, | ||
| 6887 | 0x710e, 0x7007, 0x0003, 0x080c, 0x54d2, 0x7050, 0xa086, 0x0100, | ||
| 6888 | 0x0904, 0x5412, 0x0126, 0x2091, 0x8000, 0x2071, 0xae13, 0x7008, | ||
| 6889 | 0xa086, 0x0001, 0x1180, 0x0e04, 0x536b, 0x2009, 0x000d, 0x7030, | ||
| 6890 | 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, | ||
| 6891 | 0x1110, 0x7007, 0x0001, 0x012e, 0x0005, 0x2071, 0xae13, 0x080c, | ||
| 6892 | 0x54b9, 0x0518, 0x2071, 0xaf34, 0x7084, 0x700a, 0x20a9, 0x0020, | ||
| 6893 | 0x2099, 0xaf35, 0x20a1, 0xaf5c, 0x53a3, 0x7087, 0x0000, 0x2071, | ||
| 6894 | 0xae13, 0x2069, 0xaf7c, 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, | ||
| 6895 | 0x682e, 0x7078, 0x6832, 0x2d10, 0x080c, 0x1624, 0x7007, 0x0008, | ||
| 6896 | 0x2001, 0xffff, 0x2071, 0xafda, 0x703a, 0x012e, 0x0804, 0x5352, | ||
| 6897 | 0x2069, 0xaf7c, 0x6808, 0xa08e, 0x0000, 0x0904, 0x53ed, 0xa08e, | ||
| 6898 | 0x0200, 0x0904, 0x53eb, 0xa08e, 0x0100, 0x1904, 0x53ed, 0x0126, | ||
| 6899 | 0x2091, 0x8000, 0x0e04, 0x53e9, 0x2069, 0x0000, 0x6818, 0xd084, | ||
| 6900 | 0x15c0, 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, | ||
| 6901 | 0x706e, 0x7038, 0x7072, 0x0048, 0x706c, 0xa080, 0x0040, 0x706e, | ||
| 6902 | 0x1220, 0x7070, 0xa081, 0x0000, 0x7072, 0x7132, 0x6936, 0x700b, | ||
| 6903 | 0x0000, 0x2001, 0xaf59, 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, | ||
| 6904 | 0xaf34, 0x689c, 0x699e, 0x2069, 0xafda, 0xa102, 0x1118, 0x683c, | ||
| 6905 | 0xa005, 0x1368, 0x2001, 0xaf5a, 0x200c, 0x810d, 0x693e, 0x0038, | ||
| 6906 | 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, | ||
| 6907 | 0x0001, 0x012e, 0x0010, 0x7007, 0x0005, 0x0005, 0x2001, 0xaf7e, | ||
| 6908 | 0x2004, 0xa08e, 0x0100, 0x1128, 0x7007, 0x0001, 0x080c, 0x54a7, | ||
| 6909 | 0x0005, 0xa08e, 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, | ||
| 6910 | 0x0005, 0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x54b9, 0x0140, | ||
| 6911 | 0x7007, 0x0003, 0x080c, 0x54d2, 0x7050, 0xa086, 0x0100, 0x0110, | ||
| 6912 | 0x0005, 0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, | ||
| 6913 | 0x0030, 0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, | ||
| 6914 | 0x5475, 0x7006, 0x080c, 0x54a7, 0x0005, 0x0005, 0x00e6, 0x0156, | ||
| 6915 | 0x2071, 0xaf34, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, | ||
| 6916 | 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, | ||
| 6917 | 0x544a, 0x2014, 0x722a, 0x8000, 0x0f04, 0x544a, 0x2014, 0x722e, | ||
| 6918 | 0x8000, 0x0f04, 0x544a, 0x2014, 0x723a, 0x8000, 0x0f04, 0x544a, | ||
| 6919 | 0x2014, 0x723e, 0xa180, 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, | ||
| 6920 | 0x00e6, 0x0156, 0x2071, 0xaf34, 0x7184, 0x81ff, 0x01d8, 0xa006, | ||
| 6921 | 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, | ||
| 6922 | 0x8000, 0x2014, 0x722a, 0x8000, 0x0f04, 0x546c, 0x2014, 0x723a, | ||
| 6923 | 0x8000, 0x2014, 0x723e, 0x0018, 0x2001, 0x8020, 0x0010, 0x2001, | ||
| 6924 | 0x8042, 0x7022, 0x015e, 0x00ee, 0x0005, 0x702c, 0x7130, 0x8108, | ||
| 6925 | 0xa102, 0x0230, 0xa00e, 0x7034, 0x706e, 0x7038, 0x7072, 0x0048, | ||
| 6926 | 0x706c, 0xa080, 0x0040, 0x706e, 0x1220, 0x7070, 0xa081, 0x0000, | ||
| 6927 | 0x7072, 0x7132, 0x700c, 0x8001, 0x700e, 0x1180, 0x0126, 0x2091, | ||
| 6928 | 0x8000, 0x0e04, 0x54a1, 0x2001, 0x000d, 0x2102, 0x2091, 0x4080, | ||
| 6929 | 0x2001, 0x0001, 0x700b, 0x0000, 0x012e, 0x0005, 0x2001, 0x0007, | ||
| 6930 | 0x0005, 0x2001, 0x0006, 0x700b, 0x0001, 0x012e, 0x0005, 0x701c, | ||
| 6931 | 0xa06d, 0x0170, 0x0126, 0x2091, 0x8000, 0x7010, 0x8001, 0x7012, | ||
| 6932 | 0x2d04, 0x701e, 0xa005, 0x1108, 0x701a, 0x012e, 0x080c, 0x15f0, | ||
| 6933 | 0x0005, 0x2019, 0x000d, 0x2304, 0x230c, 0xa10e, 0x0130, 0x2304, | ||
| 6934 | 0x230c, 0xa10e, 0x0110, 0xa006, 0x0060, 0x732c, 0x8319, 0x7130, | ||
| 6935 | 0xa102, 0x1118, 0x2300, 0xa005, 0x0020, 0x0210, 0xa302, 0x0008, | ||
| 6936 | 0x8002, 0x0005, 0x2d00, 0x7026, 0xa080, 0x000d, 0x7056, 0x7053, | ||
| 6937 | 0x0000, 0x0126, 0x2091, 0x8000, 0x2009, 0xafec, 0x2104, 0xc08d, | ||
| 6938 | 0x200a, 0x012e, 0x080c, 0x163c, 0x0005, 0x7088, 0xa08a, 0x0029, | ||
| 6939 | 0x1220, 0xa082, 0x001d, 0x0033, 0x0010, 0x080c, 0x14f6, 0x6027, | ||
| 6940 | 0x1e00, 0x0005, 0x55c1, 0x555b, 0x5571, 0x5595, 0x55b4, 0x55e6, | ||
| 6941 | 0x55f8, 0x5571, 0x55d2, 0x54ff, 0x552d, 0x54fe, 0x0005, 0x00d6, | ||
| 6942 | 0x2069, 0x0200, 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, | ||
| 6943 | 0x708b, 0x0028, 0x2069, 0xafac, 0x2d04, 0x7002, 0x080c, 0x584d, | ||
| 6944 | 0x6028, 0xa085, 0x0600, 0x602a, 0x00b0, 0x708b, 0x0028, 0x2069, | ||
| 6945 | 0xafac, 0x2d04, 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, | ||
| 6946 | 0x0036, 0x0046, 0x0056, 0x2071, 0xaffd, 0x080c, 0x1d22, 0x005e, | ||
| 6947 | 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, | ||
| 6948 | 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708b, 0x0028, | ||
| 6949 | 0x2069, 0xafac, 0x2d04, 0x7002, 0x080c, 0x58da, 0x6028, 0xa085, | ||
| 6950 | 0x0600, 0x602a, 0x00b0, 0x708b, 0x0028, 0x2069, 0xafac, 0x2d04, | ||
| 6951 | 0x7002, 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, | ||
| 6952 | 0x0056, 0x2071, 0xaffd, 0x080c, 0x1d22, 0x005e, 0x004e, 0x003e, | ||
| 6953 | 0x00ee, 0x00de, 0x0005, 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1180, | ||
| 6954 | 0x080c, 0x5663, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1cc, 0x0140, | ||
| 6955 | 0x708b, 0x0020, 0x0028, 0x708b, 0x001d, 0x0010, 0x708b, 0x001f, | ||
| 6956 | 0x0005, 0x6803, 0x0088, 0x6124, 0xd1cc, 0x11c8, 0xd1dc, 0x11a0, | ||
| 6957 | 0xd1e4, 0x1178, 0xa184, 0x1e00, 0x11b8, 0x60e3, 0x0001, 0x600c, | ||
| 6958 | 0xc0b4, 0x600e, 0x080c, 0x577f, 0x6803, 0x0080, 0x708b, 0x0028, | ||
| 6959 | 0x0058, 0x708b, 0x001e, 0x0040, 0x708b, 0x001d, 0x0028, 0x708b, | ||
| 6960 | 0x0020, 0x0010, 0x708b, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, | ||
| 6961 | 0xc0b4, 0x600e, 0x080c, 0x577f, 0x6803, 0x0080, 0x6124, 0xd1d4, | ||
| 6962 | 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0xa184, 0x1e00, 0x1158, | ||
| 6963 | 0x708b, 0x0028, 0x0040, 0x708b, 0x001e, 0x0028, 0x708b, 0x001d, | ||
| 6964 | 0x0010, 0x708b, 0x001f, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1dc, | ||
| 6965 | 0x1128, 0xd1e4, 0x0128, 0x708b, 0x001e, 0x0010, 0x708b, 0x001d, | ||
| 6966 | 0x0005, 0x080c, 0x568d, 0x6124, 0xd1dc, 0x1158, 0x080c, 0x5663, | ||
| 6967 | 0xd1d4, 0x1128, 0xd1e4, 0x0128, 0x708b, 0x001e, 0x0010, 0x708b, | ||
| 6968 | 0x001f, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1d4, 0x1160, 0xd1cc, | ||
| 6969 | 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708b, 0x001e, 0x0028, | ||
| 6970 | 0x708b, 0x001d, 0x0010, 0x708b, 0x0021, 0x0005, 0x080c, 0x568d, | ||
| 6971 | 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708b, | ||
| 6972 | 0x001e, 0x0028, 0x708b, 0x001d, 0x0010, 0x708b, 0x001f, 0x0005, | ||
| 6973 | 0x6803, 0x0090, 0x6124, 0xd1d4, 0x1178, 0xd1cc, 0x1150, 0xd1dc, | ||
| 6974 | 0x1128, 0xd1e4, 0x0158, 0x708b, 0x001e, 0x0040, 0x708b, 0x001d, | ||
| 6975 | 0x0028, 0x708b, 0x0020, 0x0010, 0x708b, 0x001f, 0x0005, 0x0016, | ||
| 6976 | 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, 0x2069, 0x0140, | ||
| 6977 | 0x2071, 0xad00, 0x2091, 0x8000, 0x080c, 0x574f, 0x11e8, 0x2001, | ||
| 6978 | 0xad0c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, 0x2102, 0x6027, 0x0200, | ||
| 6979 | 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, 0x6803, 0x00a0, 0x2001, | ||
| 6980 | 0xaf9e, 0x2003, 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0x0428, | ||
| 6981 | 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x576b, 0x0150, 0x080c, | ||
| 6982 | 0x5761, 0x1138, 0x2001, 0x0001, 0x080c, 0x261e, 0x080c, 0x5726, | ||
| 6983 | 0x00a0, 0x080c, 0x568a, 0x0178, 0x2001, 0x0001, 0x080c, 0x261e, | ||
| 6984 | 0x7088, 0xa086, 0x001e, 0x0120, 0x7088, 0xa086, 0x0022, 0x1118, | ||
| 6985 | 0x708b, 0x0025, 0x0010, 0x708b, 0x0021, 0x012e, 0x00ee, 0x00de, | ||
| 6986 | 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, | ||
| 6987 | 0x566e, 0x080c, 0x6501, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, | ||
| 6988 | 0x0016, 0x080c, 0x7834, 0x2071, 0xad00, 0x080c, 0x560f, 0x001e, | ||
| 6989 | 0x00fe, 0x00ee, 0x0005, 0x2001, 0xad00, 0x2004, 0xa086, 0x0004, | ||
| 6990 | 0x0140, 0x2001, 0xaf9d, 0x2003, 0xaaaa, 0x2001, 0xaf9e, 0x2003, | ||
| 6991 | 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6803, 0x00c0, 0x0156, | ||
| 6992 | 0x20a9, 0x002d, 0x1d04, 0x5692, 0x2091, 0x6000, 0x1f04, 0x5692, | ||
| 6993 | 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, | ||
| 6994 | 0x0140, 0x2071, 0xad00, 0x2001, 0xaf9e, 0x200c, 0xa186, 0x0000, | ||
| 6995 | 0x0158, 0xa186, 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, | ||
| 6996 | 0x0003, 0x0158, 0x0804, 0x5714, 0x708b, 0x0022, 0x0040, 0x708b, | ||
| 6997 | 0x0021, 0x0028, 0x708b, 0x0023, 0x0020, 0x708b, 0x0024, 0x6043, | ||
| 6998 | 0x0000, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, | ||
| 6999 | 0x26cb, 0x0026, 0x2011, 0x0003, 0x080c, 0x7adf, 0x2011, 0x0002, | ||
| 7000 | 0x080c, 0x7ae9, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, | ||
| 7001 | 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, | ||
| 7002 | 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0118, 0x012e, 0x015e, 0x04d0, | ||
| 7003 | 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, | ||
| 7004 | 0x6803, 0x0100, 0x1f04, 0x56e2, 0x080c, 0x57a0, 0x012e, 0x015e, | ||
| 7005 | 0x080c, 0x5761, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, | ||
| 7006 | 0xa085, 0x0020, 0x6052, 0x080c, 0x57a0, 0xa006, 0x8001, 0x1df0, | ||
| 7007 | 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x57a0, | ||
| 7008 | 0x2001, 0xaf9e, 0x2003, 0x0004, 0x080c, 0x54e5, 0x080c, 0x5761, | ||
| 7009 | 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, 0xaf9e, | ||
| 7010 | 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, | ||
| 7011 | 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xad00, 0x2001, | ||
| 7012 | 0xaf9d, 0x2003, 0x0000, 0x2001, 0xaf8e, 0x2003, 0x0000, 0x708b, | ||
| 7013 | 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c, | ||
| 7014 | 0x26cb, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, | ||
| 7015 | 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, | ||
| 7016 | 0x2001, 0xaf9d, 0x2004, 0xa086, 0xaaaa, 0x000e, 0x0005, 0x0006, | ||
| 7017 | 0x2001, 0xad71, 0x2004, 0xa084, 0x0030, 0xa086, 0x0000, 0x000e, | ||
| 7018 | 0x0005, 0x0006, 0x2001, 0xad71, 0x2004, 0xa084, 0x0030, 0xa086, | ||
| 7019 | 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xad71, 0x2004, 0xa084, | ||
| 7020 | 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, 0x2001, 0xad71, | ||
| 7021 | 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, 0x0005, 0x2001, | ||
| 7022 | 0xad0c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x26eb, 0x0036, 0x0016, | ||
| 7023 | 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2aac, 0x001e, 0x003e, | ||
| 7024 | 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xad0c, 0x2e04, 0x0118, | ||
| 7025 | 0xa085, 0x0010, 0x0010, 0xa084, 0xffef, 0x2072, 0x00ee, 0x0005, | ||
| 7026 | 0x6050, 0x0006, 0x60f0, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, | ||
| 7027 | 0x6004, 0x0006, 0x6028, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, | ||
| 7028 | 0x602f, 0x0040, 0x602f, 0x0000, 0x000e, 0x602a, 0x000e, 0x6006, | ||
| 7029 | 0x000e, 0x600e, 0x000e, 0x60ee, 0x000e, 0x60f2, 0x60e3, 0x0000, | ||
| 7030 | 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x26cb, 0x6800, 0xa084, | ||
| 7031 | 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, 0x6052, 0x6050, | ||
| 7032 | 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, | ||
| 7033 | 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xad00, 0x6020, 0xa084, | ||
| 7034 | 0x0080, 0x0138, 0x2001, 0xad0c, 0x200c, 0xc1bd, 0x2102, 0x0804, | ||
| 7035 | 0x5845, 0x2001, 0xad0c, 0x200c, 0xc1bc, 0x2102, 0x6028, 0xa084, | ||
| 7036 | 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, 0x20a9, 0x0384, | ||
| 7037 | 0x6024, 0xd0cc, 0x1518, 0x1d04, 0x57f8, 0x2091, 0x6000, 0x1f04, | ||
| 7038 | 0x57f8, 0x2011, 0x0003, 0x080c, 0x7adf, 0x2011, 0x0002, 0x080c, | ||
| 7039 | 0x7ae9, 0x080c, 0x79e1, 0x080c, 0x6581, 0x2019, 0x0000, 0x080c, | ||
| 7040 | 0x7a64, 0x6803, 0x00a0, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x2001, | ||
| 7041 | 0xad00, 0x2003, 0x0001, 0xa085, 0x0001, 0x0438, 0x60e3, 0x0000, | ||
| 7042 | 0x2001, 0xaf8e, 0x2004, 0x080c, 0x26cb, 0x60e2, 0x6803, 0x0080, | ||
| 7043 | 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, | ||
| 7044 | 0xa10c, 0x0138, 0x1d04, 0x582a, 0x2091, 0x6000, 0x1f04, 0x582a, | ||
| 7045 | 0x0840, 0x6028, 0xa085, 0x1e00, 0x602a, 0x70a0, 0xa005, 0x1118, | ||
| 7046 | 0x6887, 0x0001, 0x0008, 0x6886, 0xa006, 0x00ee, 0x00de, 0x00ce, | ||
| 7047 | 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, | ||
| 7048 | 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xad00, | ||
| 7049 | 0x2069, 0x0140, 0x6020, 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, | ||
| 7050 | 0x1904, 0x58a1, 0x6803, 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, | ||
| 7051 | 0x2001, 0x0000, 0x080c, 0x26cb, 0x2069, 0x0200, 0x6804, 0xa005, | ||
| 7052 | 0x1118, 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, | ||
| 7053 | 0x6027, 0x0400, 0x2069, 0xafac, 0x7000, 0x206a, 0x708b, 0x0026, | ||
| 7054 | 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x5884, 0x2091, 0x6000, | ||
| 7055 | 0x1f04, 0x5884, 0x0804, 0x58d2, 0x2069, 0x0140, 0x20a9, 0x0384, | ||
| 7056 | 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0530, | ||
| 7057 | 0xa084, 0x1a00, 0x1518, 0x1d04, 0x5890, 0x2091, 0x6000, 0x1f04, | ||
| 7058 | 0x5890, 0x2011, 0x0003, 0x080c, 0x7adf, 0x2011, 0x0002, 0x080c, | ||
| 7059 | 0x7ae9, 0x080c, 0x79e1, 0x080c, 0x6581, 0x2019, 0x0000, 0x080c, | ||
| 7060 | 0x7a64, 0x6803, 0x00a0, 0x2001, 0xaf9e, 0x2003, 0x0001, 0x2001, | ||
| 7061 | 0xad00, 0x2003, 0x0001, 0xa085, 0x0001, 0x00a0, 0x6803, 0x0080, | ||
| 7062 | 0x2069, 0x0140, 0x60e3, 0x0000, 0x70a0, 0xa005, 0x1118, 0x6887, | ||
| 7063 | 0x0001, 0x0008, 0x6886, 0x2001, 0xaf8e, 0x2004, 0x080c, 0x26cb, | ||
| 7064 | 0x60e2, 0xa006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, | ||
| 7065 | 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, | ||
| 7066 | 0x00e6, 0x2061, 0x0100, 0x2071, 0xad00, 0x6020, 0xa084, 0x00c0, | ||
| 7067 | 0x01f0, 0x2011, 0x0003, 0x080c, 0x7adf, 0x2011, 0x0002, 0x080c, | ||
| 7068 | 0x7ae9, 0x080c, 0x79e1, 0x080c, 0x6581, 0x2019, 0x0000, 0x080c, | ||
| 7069 | 0x7a64, 0x2069, 0x0140, 0x6803, 0x00a0, 0x2001, 0xaf9e, 0x2003, | ||
| 7070 | 0x0001, 0x2001, 0xad00, 0x2003, 0x0001, 0x0804, 0x5972, 0x2001, | ||
| 7071 | 0xad0c, 0x200c, 0xd1b4, 0x1150, 0xc1b5, 0x2102, 0x080c, 0x5663, | ||
| 7072 | 0x2069, 0x0140, 0x6803, 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, | ||
| 7073 | 0x6804, 0xa005, 0x1118, 0x6808, 0xa005, 0x01b8, 0x6028, 0xa084, | ||
| 7074 | 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0xafac, 0x7000, 0x206a, | ||
| 7075 | 0x708b, 0x0027, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x592e, | ||
| 7076 | 0x2091, 0x6000, 0x1f04, 0x592e, 0x04e8, 0x6027, 0x1e00, 0x2009, | ||
| 7077 | 0x1e00, 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, | ||
| 7078 | 0x1d04, 0x5935, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, | ||
| 7079 | 0x64a2, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, | ||
| 7080 | 0xafda, 0x7018, 0x00ee, 0xa005, 0x1d00, 0x01e0, 0x0026, 0x2011, | ||
| 7081 | 0x566e, 0x080c, 0x650d, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, | ||
| 7082 | 0x70a0, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, | ||
| 7083 | 0xaf8e, 0x2004, 0x080c, 0x26cb, 0x60e2, 0x2001, 0xad0c, 0x200c, | ||
| 7084 | 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, | ||
| 7085 | 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, 0x00c6, | ||
| 7086 | 0x00e6, 0x2061, 0x0100, 0x2071, 0xad00, 0x7130, 0xd184, 0x1180, | ||
| 7087 | 0x2011, 0xad52, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, | ||
| 7088 | 0xad52, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x59df, | ||
| 7089 | 0x7130, 0xc185, 0x7132, 0x2011, 0xad52, 0x220c, 0xd1a4, 0x0530, | ||
| 7090 | 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x663f, 0x2019, | ||
| 7091 | 0x000e, 0x080c, 0xa8eb, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, | ||
| 7092 | 0xa186, 0x007e, 0x0170, 0xa186, 0x0080, 0x0158, 0x080c, 0x4cdc, | ||
| 7093 | 0x1140, 0x8127, 0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xa96c, | ||
| 7094 | 0x001e, 0x8108, 0x1f04, 0x59b0, 0x015e, 0x001e, 0xd1ac, 0x1148, | ||
| 7095 | 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, 0x2aac, 0x001e, | ||
| 7096 | 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0x080c, 0x4cdc, | ||
| 7097 | 0x1110, 0x080c, 0x493a, 0x8108, 0x1f04, 0x59d6, 0x015e, 0x2011, | ||
| 7098 | 0x0003, 0x080c, 0x7adf, 0x2011, 0x0002, 0x080c, 0x7ae9, 0x080c, | ||
| 7099 | 0x79e1, 0x080c, 0x6581, 0x0036, 0x2019, 0x0000, 0x080c, 0x7a64, | ||
| 7100 | 0x003e, 0x60e3, 0x0000, 0x2001, 0xad00, 0x2003, 0x0001, 0x080c, | ||
| 7101 | 0x569a, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, | ||
| 7102 | 0x0005, 0x2071, 0xade1, 0x7003, 0x0000, 0x7007, 0x0000, 0x700f, | ||
| 7103 | 0x0000, 0x702b, 0x0001, 0x704f, 0x0000, 0x7053, 0x0001, 0x705f, | ||
| 7104 | 0x0020, 0x7063, 0x0040, 0x7083, 0x0000, 0x708b, 0x0000, 0x708f, | ||
| 7105 | 0x0001, 0x70bf, 0x0000, 0x0005, 0x00e6, 0x2071, 0xade1, 0x6848, | ||
| 7106 | 0xa005, 0x1130, 0x7028, 0xc085, 0x702a, 0xa085, 0x0001, 0x0428, | ||
| 7107 | 0x6a50, 0x7236, 0x6b54, 0x733a, 0x6858, 0x703e, 0x707a, 0x685c, | ||
| 7108 | 0x7042, 0x707e, 0x6848, 0x702e, 0x6840, 0x7032, 0x2009, 0x000c, | ||
| 7109 | 0x200a, 0x8007, 0x8006, 0x8006, 0xa08c, 0x003f, 0xa084, 0xffc0, | ||
| 7110 | 0xa210, 0x2100, 0xa319, 0x7272, 0x7376, 0x7028, 0xc084, 0x702a, | ||
| 7111 | 0x7007, 0x0001, 0x700f, 0x0000, 0xa006, 0x00ee, 0x0005, 0x2b78, | ||
| 7112 | 0x2071, 0xade1, 0x7004, 0x0043, 0x700c, 0x0002, 0x5a5b, 0x5a52, | ||
| 7113 | 0x5a52, 0x5a52, 0x5a52, 0x0005, 0x5ab1, 0x5ab2, 0x5ae4, 0x5ae5, | ||
| 7114 | 0x5aaf, 0x5b33, 0x5b38, 0x5b69, 0x5b6a, 0x5b85, 0x5b86, 0x5b87, | ||
| 7115 | 0x5b88, 0x5b89, 0x5b8a, 0x5c40, 0x5c67, 0x700c, 0x0002, 0x5a74, | ||
| 7116 | 0x5aaf, 0x5aaf, 0x5ab0, 0x5ab0, 0x7830, 0x7930, 0xa106, 0x0120, | ||
| 7117 | 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, 0xa10a, 0x01f8, 0x1210, | ||
| 7118 | 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, 0x080c, 0x15c0, 0x01b0, | ||
| 7119 | 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, 0x0000, | ||
| 7120 | 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xafec, 0x2104, 0xc085, | ||
| 7121 | 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x163c, 0x0005, 0x080c, | ||
| 7122 | 0x15c0, 0x0de0, 0x2d00, 0x705a, 0x080c, 0x15c0, 0x1108, 0x0c10, | ||
| 7123 | 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x08f8, 0x0005, | ||
| 7124 | 0x0005, 0x0005, 0x700c, 0x0002, 0x5ab9, 0x5abc, 0x5aca, 0x5ae3, | ||
| 7125 | 0x5ae3, 0x080c, 0x5a6d, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058, | ||
| 7126 | 0x0006, 0x080c, 0x5f90, 0x0120, 0x2091, 0x8000, 0x080c, 0x5a6d, | ||
| 7127 | 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x5f90, 0x7058, | ||
| 7128 | 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, | ||
| 7129 | 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, 0x00db, 0x012e, 0x0005, | ||
| 7130 | 0x012e, 0x080c, 0x5b8b, 0x0005, 0x0005, 0x0005, 0x00e6, 0x2071, | ||
| 7131 | 0xade1, 0x700c, 0x0002, 0x5af0, 0x5af0, 0x5af0, 0x5af2, 0x5af5, | ||
| 7132 | 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, 0x700f, 0x0002, 0x00ee, | ||
| 7133 | 0x0005, 0x5b8b, 0x5b8b, 0x5ba7, 0x5b8b, 0x5d22, 0x5b8b, 0x5b8b, | ||
| 7134 | 0x5b8b, 0x5b8b, 0x5b8b, 0x5ba7, 0x5d64, 0x5da7, 0x5df0, 0x5e04, | ||
| 7135 | 0x5b8b, 0x5b8b, 0x5bc3, 0x5ba7, 0x5b8b, 0x5b8b, 0x5c1d, 0x5ead, | ||
| 7136 | 0x5ec8, 0x5b8b, 0x5bc3, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5c13, | ||
| 7137 | 0x5ec8, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, | ||
| 7138 | 0x5b8b, 0x5b8b, 0x5bd7, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, | ||
| 7139 | 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, 0x5b8b, | ||
| 7140 | 0x5b8b, 0x5b8b, 0x5bec, 0x7020, 0x2068, 0x080c, 0x15f0, 0x0005, | ||
| 7141 | 0x700c, 0x0002, 0x5b3f, 0x5b42, 0x5b50, 0x5b68, 0x5b68, 0x080c, | ||
| 7142 | 0x5a6d, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, | ||
| 7143 | 0x5f90, 0x0120, 0x2091, 0x8000, 0x080c, 0x5a6d, 0x00de, 0x0048, | ||
| 7144 | 0x0126, 0x8001, 0x700e, 0x080c, 0x5f90, 0x7058, 0x2068, 0x7084, | ||
| 7145 | 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, | ||
| 7146 | 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, 0x0005, 0x012e, 0x0419, | ||
| 7147 | 0x0005, 0x0005, 0x0005, 0x5b8b, 0x5ba7, 0x5d0e, 0x5b8b, 0x5ba7, | ||
| 7148 | 0x5b8b, 0x5ba7, 0x5ba7, 0x5b8b, 0x5ba7, 0x5d0e, 0x5ba7, 0x5ba7, | ||
| 7149 | 0x5ba7, 0x5ba7, 0x5ba7, 0x5b8b, 0x5ba7, 0x5d0e, 0x5b8b, 0x5b8b, | ||
| 7150 | 0x5ba7, 0x5b8b, 0x5b8b, 0x5b8b, 0x5ba7, 0x0005, 0x0005, 0x0005, | ||
| 7151 | 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, | ||
| 7152 | 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x510c, 0x012e, | ||
| 7153 | 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, | ||
| 7154 | 0x0126, 0x2091, 0x8000, 0x080c, 0x510c, 0x012e, 0x0005, 0x7007, | ||
| 7155 | 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x0126, 0x2091, | ||
| 7156 | 0x8000, 0x080c, 0x510c, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, | ||
| 7157 | 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, | ||
| 7158 | 0x510c, 0x012e, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0988, | ||
| 7159 | 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x5cd0, 0x7007, 0x0006, | ||
| 7160 | 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x5cd0, 0x0005, 0x6834, | ||
| 7161 | 0x8007, 0xa084, 0x00ff, 0x0904, 0x5b99, 0x8001, 0x1120, 0x7007, | ||
| 7162 | 0x0001, 0x0804, 0x5ced, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, | ||
| 7163 | 0x701a, 0x704b, 0x5ced, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, | ||
| 7164 | 0xa086, 0x0001, 0x1904, 0x5b99, 0x7007, 0x0001, 0x2009, 0xad30, | ||
| 7165 | 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, 0x683a, 0x6853, | ||
| 7166 | 0x0000, 0x080c, 0x4ab1, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, | ||
| 7167 | 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x510c, 0x012e, 0x0ca0, | ||
| 7168 | 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, 0xa086, 0x00c0, | ||
| 7169 | 0x1120, 0x7007, 0x0001, 0x0804, 0x5ee0, 0x2d00, 0x7016, 0x701a, | ||
| 7170 | 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, 0xae0c, 0x53a3, | ||
| 7171 | 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x5bb5, 0x6a84, 0xa28a, | ||
| 7172 | 0x0002, 0x1a04, 0x5bb5, 0x82ff, 0x1138, 0x6888, 0x698c, 0xa105, | ||
| 7173 | 0x0118, 0x2001, 0x5ca3, 0x0018, 0xa280, 0x5c99, 0x2005, 0x70c6, | ||
| 7174 | 0x7010, 0xa015, 0x0904, 0x5c85, 0x080c, 0x15c0, 0x1118, 0x7007, | ||
| 7175 | 0x000f, 0x0005, 0x2d00, 0x7022, 0x70c4, 0x2060, 0x2c05, 0x6836, | ||
| 7176 | 0xe004, 0xad00, 0x7096, 0xe008, 0xa20a, 0x1210, 0xa00e, 0x2200, | ||
| 7177 | 0x7112, 0xe20c, 0x8003, 0x800b, 0xa296, 0x0004, 0x0108, 0xa108, | ||
| 7178 | 0x719a, 0x810b, 0x719e, 0xae90, 0x0022, 0x080c, 0x1624, 0x7090, | ||
| 7179 | 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, 0x7007, 0x0010, | ||
| 7180 | 0x0005, 0x7020, 0x2068, 0x080c, 0x15f0, 0x7014, 0x2068, 0x0804, | ||
| 7181 | 0x5bb5, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, 0x2d08, | ||
| 7182 | 0x2068, 0x6906, 0x711a, 0x0804, 0x5c40, 0x7014, 0x2068, 0x7007, | ||
| 7183 | 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, 0xa105, 0x0108, | ||
| 7184 | 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0904, 0x5ee0, | ||
| 7185 | 0x04b8, 0x5c9b, 0x5c9f, 0x0002, 0x0011, 0x0007, 0x0004, 0x000a, | ||
| 7186 | 0x000f, 0x0005, 0x0006, 0x000a, 0x0011, 0x0005, 0x0004, 0x00f6, | ||
| 7187 | 0x00e6, 0x00c6, 0x0076, 0x0066, 0x6f88, 0x6e8c, 0x6804, 0x2060, | ||
| 7188 | 0xacf0, 0x0021, 0xacf8, 0x0027, 0x2009, 0x0005, 0x700c, 0x7816, | ||
| 7189 | 0x7008, 0x7812, 0x7004, 0x7806, 0x7000, 0x7802, 0x7e0e, 0x7f0a, | ||
| 7190 | 0x8109, 0x0128, 0xaef2, 0x0004, 0xaffa, 0x0006, 0x0c78, 0x6004, | ||
| 7191 | 0xa065, 0x1d30, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x00fe, 0x0005, | ||
| 7192 | 0x2009, 0xad30, 0x210c, 0x81ff, 0x1198, 0x6838, 0xa084, 0x00ff, | ||
| 7193 | 0x683a, 0x080c, 0x4993, 0x1108, 0x0005, 0x080c, 0x51df, 0x0126, | ||
| 7194 | 0x2091, 0x8000, 0x080c, 0x97fd, 0x080c, 0x510c, 0x012e, 0x0ca0, | ||
| 7195 | 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, 0xad30, 0x210c, | ||
| 7196 | 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01b0, 0x6838, 0xa084, 0x00ff, | ||
| 7197 | 0x683a, 0x6853, 0x0000, 0x080c, 0x4a55, 0x1108, 0x0005, 0x0126, | ||
| 7198 | 0x2091, 0x8000, 0x080c, 0x51df, 0x080c, 0x510c, 0x012e, 0x0cb0, | ||
| 7199 | 0x2001, 0x0028, 0x0ca0, 0x2001, 0x0000, 0x0c88, 0x7018, 0x6802, | ||
| 7200 | 0x2d08, 0x2068, 0x6906, 0x711a, 0x7010, 0x8001, 0x7012, 0x0118, | ||
| 7201 | 0x7007, 0x0006, 0x0030, 0x7014, 0x2068, 0x7007, 0x0001, 0x7048, | ||
| 7202 | 0x080f, 0x0005, 0x7007, 0x0001, 0x6944, 0x810f, 0xa18c, 0x00ff, | ||
| 7203 | 0x6848, 0xa084, 0x00ff, 0x20a9, 0x0001, 0xa096, 0x0001, 0x01b0, | ||
| 7204 | 0x2009, 0x0000, 0x20a9, 0x00ff, 0xa096, 0x0002, 0x0178, 0xa005, | ||
| 7205 | 0x11f0, 0x6944, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4cdc, 0x11b8, | ||
| 7206 | 0x0066, 0x6e50, 0x080c, 0x4dcf, 0x006e, 0x0088, 0x0046, 0x2011, | ||
| 7207 | 0xad0c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x4cdc, | ||
| 7208 | 0x1110, 0x080c, 0x4f2d, 0x8108, 0x1f04, 0x5d4e, 0x00ce, 0x684c, | ||
| 7209 | 0xd084, 0x1118, 0x080c, 0x15f0, 0x0005, 0x0126, 0x2091, 0x8000, | ||
| 7210 | 0x080c, 0x510c, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, | ||
| 7211 | 0x0001, 0x2001, 0xad52, 0x2004, 0xd0a4, 0x0580, 0x2061, 0xb048, | ||
| 7212 | 0x6100, 0xd184, 0x0178, 0x6858, 0xa084, 0x00ff, 0x1550, 0x6000, | ||
| 7213 | 0xd084, 0x0520, 0x6004, 0xa005, 0x1538, 0x6003, 0x0000, 0x600b, | ||
| 7214 | 0x0000, 0x00c8, 0x2011, 0x0001, 0x6860, 0xa005, 0x1110, 0x2001, | ||
| 7215 | 0x001e, 0x8000, 0x6016, 0x6858, 0xa084, 0x00ff, 0x0178, 0x6006, | ||
| 7216 | 0x6858, 0x8007, 0xa084, 0x00ff, 0x0148, 0x600a, 0x6858, 0x8000, | ||
| 7217 | 0x1108, 0xc28d, 0x6202, 0x012e, 0x0804, 0x5f7f, 0x012e, 0x0804, | ||
| 7218 | 0x5f79, 0x012e, 0x0804, 0x5f73, 0x012e, 0x0804, 0x5f76, 0x0126, | ||
| 7219 | 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xad52, 0x2004, 0xd0a4, | ||
| 7220 | 0x05e0, 0x2061, 0xb048, 0x6000, 0xd084, 0x05b8, 0x6204, 0x6308, | ||
| 7221 | 0xd08c, 0x1530, 0x6c48, 0xa484, 0x0003, 0x0170, 0x6958, 0xa18c, | ||
| 7222 | 0x00ff, 0x8001, 0x1120, 0x2100, 0xa210, 0x0620, 0x0028, 0x8001, | ||
| 7223 | 0x1508, 0x2100, 0xa212, 0x02f0, 0xa484, 0x000c, 0x0188, 0x6958, | ||
| 7224 | 0x810f, 0xa18c, 0x00ff, 0xa082, 0x0004, 0x1120, 0x2100, 0xa318, | ||
| 7225 | 0x0288, 0x0030, 0xa082, 0x0004, 0x1168, 0x2100, 0xa31a, 0x0250, | ||
| 7226 | 0x6860, 0xa005, 0x0110, 0x8000, 0x6016, 0x6206, 0x630a, 0x012e, | ||
| 7227 | 0x0804, 0x5f7f, 0x012e, 0x0804, 0x5f7c, 0x012e, 0x0804, 0x5f79, | ||
| 7228 | 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0xb048, 0x6300, | ||
| 7229 | 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, | ||
| 7230 | 0x5f8d, 0x012e, 0x0804, 0x5f7c, 0x0126, 0x00c6, 0x2091, 0x8000, | ||
| 7231 | 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0xb048, | ||
| 7232 | 0x6000, 0xa084, 0xfcff, 0x6002, 0x00ce, 0x0448, 0x6858, 0xa005, | ||
| 7233 | 0x05d0, 0x685c, 0xa065, 0x0598, 0x2001, 0xad30, 0x2004, 0xa005, | ||
| 7234 | 0x0118, 0x080c, 0x974e, 0x0068, 0x6013, 0x0400, 0x6057, 0x0000, | ||
| 7235 | 0x694c, 0xd1a4, 0x0110, 0x6950, 0x6156, 0x2009, 0x0041, 0x080c, | ||
| 7236 | 0x80a7, 0x6958, 0xa18c, 0xff00, 0xa186, 0x2000, 0x1140, 0x0026, | ||
| 7237 | 0x2009, 0x0000, 0x2011, 0xfdff, 0x080c, 0x663f, 0x002e, 0x684c, | ||
| 7238 | 0xd0c4, 0x0148, 0x2061, 0xb048, 0x6000, 0xd08c, 0x1120, 0x6008, | ||
| 7239 | 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x0804, 0x5f7f, 0x00ce, | ||
| 7240 | 0x012e, 0x0804, 0x5f79, 0x6954, 0xa186, 0x002e, 0x0d40, 0xa186, | ||
| 7241 | 0x002d, 0x0d28, 0xa186, 0x0045, 0x0510, 0xa186, 0x002a, 0x1130, | ||
| 7242 | 0x2001, 0xad0c, 0x200c, 0xc194, 0x2102, 0x08c8, 0xa186, 0x0020, | ||
| 7243 | 0x0170, 0xa186, 0x0029, 0x1d18, 0x6944, 0xa18c, 0xff00, 0x810f, | ||
| 7244 | 0x080c, 0x4cdc, 0x1960, 0x6000, 0xc0e4, 0x6002, 0x0840, 0x685c, | ||
| 7245 | 0xa065, 0x09a8, 0x2001, 0xafa3, 0x2004, 0x6016, 0x0800, 0x685c, | ||
| 7246 | 0xa065, 0x0968, 0x00e6, 0x6860, 0xa075, 0x2001, 0xad30, 0x2004, | ||
| 7247 | 0xa005, 0x0150, 0x080c, 0x974e, 0x8eff, 0x0118, 0x2e60, 0x080c, | ||
| 7248 | 0x974e, 0x00ee, 0x0804, 0x5e3f, 0x6020, 0xc0dc, 0xc0d5, 0x6022, | ||
| 7249 | 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, | ||
| 7250 | 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x67a8, | ||
| 7251 | 0x080c, 0x6c50, 0x00ee, 0x0804, 0x5e3f, 0x2061, 0xb048, 0x6000, | ||
| 7252 | 0xd084, 0x0190, 0xd08c, 0x1904, 0x5f8d, 0x0126, 0x2091, 0x8000, | ||
| 7253 | 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x5f8d, 0x012e, | ||
| 7254 | 0x6853, 0x0016, 0x0804, 0x5f86, 0x6853, 0x0007, 0x0804, 0x5f86, | ||
| 7255 | 0x6834, 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x5b99, 0x0078, | ||
| 7256 | 0x2030, 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, | ||
| 7257 | 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x5ee0, 0x0005, | ||
| 7258 | 0x00e6, 0x0126, 0x2091, 0x8000, 0x2009, 0xad30, 0x210c, 0x81ff, | ||
| 7259 | 0x1904, 0x5f5b, 0x2009, 0xad0c, 0x210c, 0xd194, 0x1904, 0x5f63, | ||
| 7260 | 0x6848, 0x2070, 0xae82, 0xb400, 0x0a04, 0x5f4f, 0x2001, 0xad16, | ||
| 7261 | 0x2004, 0xae02, 0x1a04, 0x5f4f, 0x2061, 0xb048, 0x6100, 0xa184, | ||
| 7262 | 0x0301, 0xa086, 0x0001, 0x15a8, 0x711c, 0xa186, 0x0006, 0x15b0, | ||
| 7263 | 0x7018, 0xa005, 0x0904, 0x5f5b, 0x2004, 0xd0e4, 0x1904, 0x5f5e, | ||
| 7264 | 0x7020, 0xd0dc, 0x1904, 0x5f66, 0x6853, 0x0000, 0x6803, 0x0000, | ||
| 7265 | 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4, 0x1904, | ||
| 7266 | 0x5f69, 0x2e60, 0x080c, 0x65aa, 0x012e, 0x00ee, 0x0005, 0x2068, | ||
| 7267 | 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x15c8, | ||
| 7268 | 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, 0x0006, 0x0804, | ||
| 7269 | 0x5f86, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, 0x6944, 0xa18c, | ||
| 7270 | 0xff00, 0x810f, 0x080c, 0x4cdc, 0x11c8, 0x6000, 0xd0e4, 0x11b0, | ||
| 7271 | 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, 0x0088, 0x6853, | ||
| 7272 | 0x0008, 0x0070, 0x6853, 0x000e, 0x0058, 0x6853, 0x0017, 0x0040, | ||
| 7273 | 0x6853, 0x0035, 0x0028, 0x6853, 0x0028, 0x0010, 0x6853, 0x0029, | ||
| 7274 | 0x012e, 0x00ee, 0x0418, 0x6853, 0x002a, 0x0cd0, 0x6853, 0x0045, | ||
| 7275 | 0x0cb8, 0x2e60, 0x2019, 0x0002, 0x6017, 0x0014, 0x080c, 0xa566, | ||
| 7276 | 0x012e, 0x00ee, 0x0005, 0x2009, 0x003e, 0x0058, 0x2009, 0x0004, | ||
| 7277 | 0x0040, 0x2009, 0x0006, 0x0028, 0x2009, 0x0016, 0x0010, 0x2009, | ||
| 7278 | 0x0001, 0x6854, 0xa084, 0xff00, 0xa105, 0x6856, 0x0126, 0x2091, | ||
| 7279 | 0x8000, 0x080c, 0x510c, 0x012e, 0x0005, 0x080c, 0x15f0, 0x0005, | ||
| 7280 | 0x702c, 0x7130, 0x8108, 0xa102, 0x0230, 0xa00e, 0x7034, 0x7072, | ||
| 7281 | 0x7038, 0x7076, 0x0058, 0x7070, 0xa080, 0x0040, 0x7072, 0x1230, | ||
| 7282 | 0x7074, 0xa081, 0x0000, 0x7076, 0xa085, 0x0001, 0x7932, 0x7132, | ||
| 7283 | 0x0005, 0x00d6, 0x080c, 0x65a1, 0x00de, 0x0005, 0x00d6, 0x2011, | ||
| 7284 | 0x0004, 0x2204, 0xa085, 0x8002, 0x2012, 0x00de, 0x0005, 0x20e1, | ||
| 7285 | 0x0002, 0x3d08, 0x20e1, 0x2000, 0x3d00, 0xa084, 0x7000, 0x0118, | ||
| 7286 | 0xa086, 0x1000, 0x1540, 0x20e1, 0x0000, 0x3d00, 0xa094, 0xff00, | ||
| 7287 | 0x8217, 0xa084, 0xf000, 0xa086, 0x3000, 0x1118, 0x080c, 0x61c6, | ||
| 7288 | 0x00b0, 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, | ||
| 7289 | 0x0007, 0x1188, 0xac82, 0xb400, 0x0270, 0x6858, 0xac02, 0x1258, | ||
| 7290 | 0x6120, 0xd1f4, 0x1160, 0x2009, 0x0047, 0x080c, 0x80a7, 0x7a1c, | ||
| 7291 | 0xd284, 0x1968, 0x0005, 0xa016, 0x080c, 0x1824, 0x0cc0, 0x0cd8, | ||
| 7292 | 0x781c, 0xd08c, 0x0500, 0x0156, 0x0136, 0x0146, 0x20e1, 0x3000, | ||
| 7293 | 0x3d20, 0x3e28, 0xa584, 0x0076, 0x1530, 0xa484, 0x7000, 0xa086, | ||
| 7294 | 0x1000, 0x11a8, 0x080c, 0x604e, 0x01f0, 0x20e1, 0x3000, 0x7828, | ||
| 7295 | 0x7828, 0x080c, 0x606a, 0x014e, 0x013e, 0x015e, 0x2009, 0xafcf, | ||
| 7296 | 0x2104, 0xa005, 0x1108, 0x0005, 0x080c, 0x6c50, 0x0ce0, 0xa484, | ||
| 7297 | 0x7000, 0x1518, 0x0499, 0x01b8, 0x7000, 0xa084, 0xff00, 0xa086, | ||
| 7298 | 0x8100, 0x0d18, 0x0080, 0xd5a4, 0x0158, 0x080c, 0x1d86, 0x20e1, | ||
| 7299 | 0x9010, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0048, | ||
| 7300 | 0x00e9, 0x6883, 0x0000, 0x080c, 0xac59, 0x20e1, 0x3000, 0x7828, | ||
| 7301 | 0x7828, 0x014e, 0x013e, 0x015e, 0x08b0, 0x0081, 0x1130, 0x7000, | ||
| 7302 | 0xa084, 0xff00, 0xa086, 0x8100, 0x1d70, 0x080c, 0xac59, 0x20e1, | ||
| 7303 | 0x3000, 0x7828, 0x7828, 0x080c, 0x642d, 0x0c58, 0xa484, 0x01ff, | ||
| 7304 | 0x6882, 0xa005, 0x0160, 0xa080, 0x001f, 0xa084, 0x03f8, 0x80ac, | ||
| 7305 | 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x0005, 0x20a9, | ||
| 7306 | 0x000c, 0x20e1, 0x1000, 0x2ea0, 0x2099, 0x020a, 0x53a5, 0xa085, | ||
| 7307 | 0x0001, 0x0ca0, 0x7000, 0xa084, 0xff00, 0xa08c, 0xf000, 0x8007, | ||
| 7308 | 0xa196, 0x0000, 0x1118, 0x0804, 0x62cf, 0x0005, 0xa196, 0x2000, | ||
| 7309 | 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x41d1, 0x0ca8, | ||
| 7310 | 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x6372, 0x0c68, | ||
| 7311 | 0x00c6, 0x6a80, 0x82ff, 0x0904, 0x61c0, 0x7110, 0xa18c, 0xff00, | ||
| 7312 | 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904, 0x61c0, | ||
| 7313 | 0xa08e, 0x0023, 0x1570, 0x080c, 0x6408, 0x0904, 0x61c0, 0x7124, | ||
| 7314 | 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005, 0x1904, | ||
| 7315 | 0x61c0, 0x2009, 0x0015, 0x080c, 0x80a7, 0x0804, 0x61c0, 0xa08e, | ||
| 7316 | 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, | ||
| 7317 | 0x80a7, 0x0804, 0x61c0, 0xa08e, 0x0100, 0x1904, 0x61c0, 0x7034, | ||
| 7318 | 0xa005, 0x1904, 0x61c0, 0x2009, 0x0016, 0x080c, 0x80a7, 0x0804, | ||
| 7319 | 0x61c0, 0xa08e, 0x0022, 0x1904, 0x61c0, 0x7030, 0xa08e, 0x0300, | ||
| 7320 | 0x1580, 0x68d0, 0xd0a4, 0x0528, 0xc0b5, 0x68d2, 0x7100, 0xa18c, | ||
| 7321 | 0x00ff, 0x696e, 0x7004, 0x6872, 0x00f6, 0x2079, 0x0100, 0x79e6, | ||
| 7322 | 0x78ea, 0x0006, 0xa084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x26a0, | ||
| 7323 | 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x2676, 0x694e, | ||
| 7324 | 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0xad00, 0x70a2, | ||
| 7325 | 0x00ee, 0x7034, 0xa005, 0x1904, 0x61c0, 0x2009, 0x0017, 0x0804, | ||
| 7326 | 0x6193, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, 0x1904, 0x61c0, | ||
| 7327 | 0x68d0, 0xc0a5, 0x68d2, 0x2009, 0x0030, 0x0804, 0x6193, 0xa08e, | ||
| 7328 | 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x61c0, 0x2009, 0x0018, | ||
| 7329 | 0x0804, 0x6193, 0xa08e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, | ||
| 7330 | 0x6193, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x6193, | ||
| 7331 | 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, 0x61c0, 0x2009, | ||
| 7332 | 0x001b, 0x0804, 0x6193, 0xa08e, 0x5000, 0x1140, 0x7034, 0xa005, | ||
| 7333 | 0x1904, 0x61c0, 0x2009, 0x001c, 0x0804, 0x6193, 0xa08e, 0x1300, | ||
| 7334 | 0x1120, 0x2009, 0x0034, 0x0804, 0x6193, 0xa08e, 0x1200, 0x1140, | ||
| 7335 | 0x7034, 0xa005, 0x1904, 0x61c0, 0x2009, 0x0024, 0x0804, 0x6193, | ||
| 7336 | 0xa08c, 0xff00, 0xa18e, 0x2400, 0x1118, 0x2009, 0x002d, 0x04d8, | ||
| 7337 | 0xa08c, 0xff00, 0xa18e, 0x5300, 0x1118, 0x2009, 0x002a, 0x0498, | ||
| 7338 | 0xa08e, 0x0f00, 0x1118, 0x2009, 0x0020, 0x0468, 0xa08e, 0x5300, | ||
| 7339 | 0x1108, 0x00d8, 0xa08e, 0x6104, 0x11c0, 0x2011, 0xb28d, 0x8208, | ||
| 7340 | 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, | ||
| 7341 | 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3c5c, 0x004e, 0x8108, | ||
| 7342 | 0x1f04, 0x6176, 0x2009, 0x0023, 0x0070, 0xa08e, 0x6000, 0x1118, | ||
| 7343 | 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, | ||
| 7344 | 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xb283, 0x2204, 0x8211, | ||
| 7345 | 0x220c, 0x080c, 0x2676, 0x1530, 0x080c, 0x4c80, 0x1518, 0x6612, | ||
| 7346 | 0x6516, 0x86ff, 0x0180, 0x001e, 0x0016, 0xa186, 0x0017, 0x1158, | ||
| 7347 | 0x686c, 0xa606, 0x1140, 0x6870, 0xa506, 0xa084, 0xff00, 0x1118, | ||
| 7348 | 0x6000, 0xc0f5, 0x6002, 0x00c6, 0x080c, 0x8022, 0x0168, 0x001e, | ||
| 7349 | 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x80a7, | ||
| 7350 | 0x00ce, 0x0005, 0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, | ||
| 7351 | 0x080c, 0x6221, 0x1904, 0x621e, 0xa184, 0xff00, 0x8007, 0xa086, | ||
| 7352 | 0x0008, 0x1904, 0x621e, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6408, | ||
| 7353 | 0x0904, 0x621e, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, | ||
| 7354 | 0x7034, 0xa005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x80a7, 0x04b0, | ||
| 7355 | 0xa08e, 0x0100, 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, | ||
| 7356 | 0x080c, 0x80a7, 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, | ||
| 7357 | 0x1400, 0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0xb283, 0x2204, | ||
| 7358 | 0x8211, 0x220c, 0x080c, 0x2676, 0x11c0, 0x080c, 0x4c80, 0x11a8, | ||
| 7359 | 0x6612, 0x6516, 0x00c6, 0x080c, 0x8022, 0x0170, 0x001e, 0x611a, | ||
| 7360 | 0x080c, 0x9956, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, | ||
| 7361 | 0x80a7, 0x080c, 0x6c50, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, | ||
| 7362 | 0x0005, 0x00f6, 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, | ||
| 7363 | 0x3c00, 0x0006, 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1df2, | ||
| 7364 | 0x1590, 0x080c, 0x1ce2, 0x05c8, 0x04d9, 0x1130, 0x7908, 0xa18c, | ||
| 7365 | 0x1fff, 0xa182, 0x0011, 0x1688, 0x20a9, 0x000c, 0x20e1, 0x0000, | ||
| 7366 | 0x2ea0, 0x2099, 0x020a, 0x53a5, 0x20e1, 0x2000, 0x2001, 0x020a, | ||
| 7367 | 0x2004, 0x7a0c, 0x7808, 0xa080, 0x0007, 0xa084, 0x1ff8, 0x0401, | ||
| 7368 | 0x1120, 0xa08a, 0x0140, 0x1a0c, 0x14f6, 0x80ac, 0x20e1, 0x6000, | ||
| 7369 | 0x2099, 0x020a, 0x53a5, 0x20e1, 0x7000, 0x6828, 0x6828, 0x7803, | ||
| 7370 | 0x0004, 0xa294, 0x0070, 0x000e, 0x20e0, 0x015e, 0x014e, 0x013e, | ||
| 7371 | 0x001e, 0x002e, 0x00de, 0x00fe, 0x0005, 0xa085, 0x0001, 0x0c98, | ||
| 7372 | 0x0006, 0x2001, 0x0111, 0x2004, 0xa084, 0x0003, 0x000e, 0x0005, | ||
| 7373 | 0x0046, 0x00e6, 0x00d6, 0x2028, 0x2130, 0xa696, 0x00ff, 0x1198, | ||
| 7374 | 0xa596, 0xfffd, 0x1120, 0x2009, 0x007f, 0x0804, 0x62ca, 0xa596, | ||
| 7375 | 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, 0xfffc, 0x1118, | ||
| 7376 | 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, 0xad34, 0x231c, | ||
| 7377 | 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, 0xae34, | ||
| 7378 | 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0xaeb5, 0x2e1c, | ||
| 7379 | 0x83ff, 0x1128, 0x82ff, 0x1198, 0x2410, 0xc2fd, 0x0080, 0x2368, | ||
| 7380 | 0x6f10, 0x0006, 0x2100, 0xa706, 0x000e, 0x6b14, 0x1120, 0xa346, | ||
| 7381 | 0x1110, 0x2408, 0x0078, 0x87ff, 0x1110, 0x83ff, 0x0d58, 0x8420, | ||
| 7382 | 0x8e70, 0x1f04, 0x62a7, 0x82ff, 0x1118, 0xa085, 0x0001, 0x0018, | ||
| 7383 | 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, 0xa084, | ||
| 7384 | 0x0007, 0x000a, 0x0005, 0x62db, 0x62db, 0x62db, 0x641a, 0x62db, | ||
| 7385 | 0x62dc, 0x62f1, 0x635d, 0x0005, 0x7110, 0xd1bc, 0x0188, 0x7120, | ||
| 7386 | 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xb400, 0x0248, 0x6858, | ||
| 7387 | 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x80a7, | ||
| 7388 | 0x0005, 0x00c6, 0x7110, 0xd1bc, 0x1904, 0x6344, 0x2011, 0xb283, | ||
| 7389 | 0x2204, 0x8211, 0x220c, 0x080c, 0x2676, 0x1904, 0x6344, 0x080c, | ||
| 7390 | 0x4c80, 0x1904, 0x6344, 0x6612, 0x6516, 0x6000, 0xd0ec, 0x15e0, | ||
| 7391 | 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0160, 0x080c, | ||
| 7392 | 0x574f, 0x11d0, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x11a0, | ||
| 7393 | 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0530, | ||
| 7394 | 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, | ||
| 7395 | 0x0044, 0x080c, 0x80a7, 0x00c0, 0x00c6, 0x080c, 0x8022, 0x001e, | ||
| 7396 | 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, 0x0004, | ||
| 7397 | 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, | ||
| 7398 | 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00ce, 0x0005, 0x00c6, 0x080c, | ||
| 7399 | 0x9807, 0x001e, 0x0dc8, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, | ||
| 7400 | 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, 0x6007, 0x0041, | ||
| 7401 | 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0c38, 0x7110, 0xd1bc, 0x0188, | ||
| 7402 | 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, 0xb400, 0x0248, | ||
| 7403 | 0x6858, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0045, 0x080c, | ||
| 7404 | 0x80a7, 0x0005, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, | ||
| 7405 | 0x1130, 0xa084, 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, | ||
| 7406 | 0x6386, 0x6387, 0x6386, 0x6386, 0x63f0, 0x63fc, 0x0005, 0x7110, | ||
| 7407 | 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x63ef, 0x700c, 0x7108, | ||
| 7408 | 0x080c, 0x2676, 0x1904, 0x63ef, 0x080c, 0x4c80, 0x1904, 0x63ef, | ||
| 7409 | 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, | ||
| 7410 | 0xa186, 0x0004, 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, | ||
| 7411 | 0x6408, 0x00ce, 0x0904, 0x63ef, 0x00c6, 0x080c, 0x8022, 0x001e, | ||
| 7412 | 0x05f0, 0x611a, 0x080c, 0x9956, 0x601f, 0x0002, 0x7120, 0x610a, | ||
| 7413 | 0x2009, 0x0088, 0x080c, 0x80a7, 0x0490, 0xa28c, 0x00ff, 0xa186, | ||
| 7414 | 0x0006, 0x0160, 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, | ||
| 7415 | 0xa286, 0x0004, 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, | ||
| 7416 | 0x8022, 0x001e, 0x01e0, 0x611a, 0x080c, 0x9956, 0x601f, 0x0005, | ||
| 7417 | 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x80a7, 0x0080, 0x00c6, | ||
| 7418 | 0x080c, 0x8022, 0x001e, 0x0158, 0x611a, 0x080c, 0x9956, 0x601f, | ||
| 7419 | 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x80a7, 0x0005, | ||
| 7420 | 0x7110, 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, | ||
| 7421 | 0x0089, 0x080c, 0x80a7, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, | ||
| 7422 | 0x0130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x80a7, 0x0005, | ||
| 7423 | 0x7020, 0x2060, 0xac84, 0x0007, 0x1158, 0xac82, 0xb400, 0x0240, | ||
| 7424 | 0x2001, 0xad16, 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, | ||
| 7425 | 0xa006, 0x0ce8, 0x7110, 0xd1bc, 0x1178, 0x7024, 0x2060, 0xac84, | ||
| 7426 | 0x0007, 0x1150, 0xac82, 0xb400, 0x0238, 0x6858, 0xac02, 0x1220, | ||
| 7427 | 0x2009, 0x0051, 0x080c, 0x80a7, 0x0005, 0x2031, 0x0105, 0x0069, | ||
| 7428 | 0x0005, 0x2031, 0x0206, 0x0049, 0x0005, 0x2031, 0x0207, 0x0029, | ||
| 7429 | 0x0005, 0x2031, 0x0213, 0x0009, 0x0005, 0x00c6, 0x00d6, 0x00f6, | ||
| 7430 | 0x7000, 0xa084, 0xf000, 0xa086, 0xc000, 0x05b0, 0x080c, 0x8022, | ||
| 7431 | 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xb283, 0x2204, 0x8211, | ||
| 7432 | 0x220c, 0x080c, 0x2676, 0x1580, 0x080c, 0x4c80, 0x1568, 0x6612, | ||
| 7433 | 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, 0x9956, 0x080c, | ||
| 7434 | 0x15d9, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, 0x6837, 0x0000, | ||
| 7435 | 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, 0x2e98, 0x53a3, | ||
| 7436 | 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, 0x6003, 0x0001, | ||
| 7437 | 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00fe, 0x00de, 0x00ce, 0x0005, | ||
| 7438 | 0x080c, 0x8078, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x2071, | ||
| 7439 | 0xafda, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7012, | ||
| 7440 | 0x7017, 0xb400, 0x7007, 0x0000, 0x7026, 0x702b, 0x7841, 0x7032, | ||
| 7441 | 0x7037, 0x789d, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042, 0x7047, | ||
| 7442 | 0x41b3, 0x0005, 0x2071, 0xafda, 0x1d04, 0x64fc, 0x2091, 0x6000, | ||
| 7443 | 0x700c, 0x8001, 0x700e, 0x1180, 0x700f, 0x0361, 0x7007, 0x0001, | ||
| 7444 | 0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0148, 0x8109, 0x7142, | ||
| 7445 | 0x1130, 0x7044, 0x080f, 0x0018, 0x0126, 0x2091, 0x8000, 0x7024, | ||
| 7446 | 0xa00d, 0x0188, 0x7020, 0x8001, 0x7022, 0x1168, 0x7023, 0x0009, | ||
| 7447 | 0x8109, 0x7126, 0xa186, 0x03e8, 0x1110, 0x7028, 0x080f, 0x81ff, | ||
| 7448 | 0x1110, 0x7028, 0x080f, 0x7030, 0xa00d, 0x0158, 0x702c, 0x8001, | ||
| 7449 | 0x702e, 0x1138, 0x702f, 0x0009, 0x8109, 0x7132, 0x1110, 0x7034, | ||
| 7450 | 0x080f, 0x7038, 0xa005, 0x0118, 0x0310, 0x8001, 0x703a, 0x703c, | ||
| 7451 | 0xa005, 0x0118, 0x0310, 0x8001, 0x703e, 0x7018, 0xa00d, 0x0158, | ||
| 7452 | 0x7008, 0x8001, 0x700a, 0x1138, 0x700b, 0x0009, 0x8109, 0x711a, | ||
| 7453 | 0x1110, 0x701c, 0x080f, 0x012e, 0x7004, 0x0002, 0x6522, 0x6523, | ||
| 7454 | 0x653b, 0x00e6, 0x2071, 0xafda, 0x7018, 0xa005, 0x1120, 0x711a, | ||
| 7455 | 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, | ||
| 7456 | 0xafda, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, | ||
| 7457 | 0x0005, 0x00e6, 0x2071, 0xafda, 0x6088, 0xa102, 0x0208, 0x618a, | ||
| 7458 | 0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x4cdc, 0x1158, 0x6088, | ||
| 7459 | 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, | ||
| 7460 | 0x6c50, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007, | ||
| 7461 | 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, | ||
| 7462 | 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0x9846, | ||
| 7463 | 0x6014, 0xa005, 0x0500, 0x8001, 0x6016, 0x11e8, 0x611c, 0xa186, | ||
| 7464 | 0x0003, 0x0118, 0xa186, 0x0006, 0x11a0, 0x6010, 0x2068, 0x6854, | ||
| 7465 | 0xa08a, 0x199a, 0x0270, 0xa082, 0x1999, 0x6856, 0xa08a, 0x199a, | ||
| 7466 | 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, | ||
| 7467 | 0x0010, 0x080c, 0x9350, 0x012e, 0xac88, 0x0018, 0x7116, 0x2001, | ||
| 7468 | 0xe400, 0xa102, 0x0220, 0x7017, 0xb400, 0x7007, 0x0000, 0x0005, | ||
| 7469 | 0x00e6, 0x2071, 0xafda, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, | ||
| 7470 | 0x0005, 0x2001, 0xafe3, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, | ||
| 7471 | 0xafda, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0xafe6, | ||
| 7472 | 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0xafda, 0x711a, 0x721e, | ||
| 7473 | 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x2061, 0xb048, 0x00ce, | ||
| 7474 | 0x0005, 0xa184, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0xb048, | ||
| 7475 | 0x2060, 0x0005, 0x6854, 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, | ||
| 7476 | 0xa005, 0x1150, 0x00c6, 0x2061, 0xb048, 0x6014, 0x00ce, 0xa005, | ||
| 7477 | 0x1138, 0x2001, 0x001e, 0x0020, 0xa08e, 0xffff, 0x1108, 0xa006, | ||
| 7478 | 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, 0x684c, 0xa08c, 0x00c0, | ||
| 7479 | 0xa18e, 0x00c0, 0x05b0, 0xd0b4, 0x1138, 0xd0bc, 0x1528, 0x2009, | ||
| 7480 | 0x0006, 0x080c, 0x661a, 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, | ||
| 7481 | 0x0118, 0xa086, 0x0003, 0x15c0, 0x6020, 0xd0d4, 0x0130, 0xc0d4, | ||
| 7482 | 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, 0xad73, 0x2104, | ||
| 7483 | 0xd084, 0x0128, 0x2009, 0x0042, 0x080c, 0x80a7, 0x0005, 0x2009, | ||
| 7484 | 0x0043, 0x080c, 0x80a7, 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, | ||
| 7485 | 0x0118, 0xa086, 0x0003, 0x11c0, 0x2009, 0x0042, 0x080c, 0x80a7, | ||
| 7486 | 0x0005, 0xd0fc, 0x0150, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0138, | ||
| 7487 | 0x2009, 0x0041, 0x080c, 0x80a7, 0x0005, 0x0051, 0x0ce8, 0x2009, | ||
| 7488 | 0x0043, 0x080c, 0x80a7, 0x0cc0, 0x2009, 0x0004, 0x0019, 0x0005, | ||
| 7489 | 0x2009, 0x0001, 0x00d6, 0x6010, 0xa0ec, 0xf000, 0x01f0, 0x2068, | ||
| 7490 | 0x6952, 0x6800, 0x6012, 0xa186, 0x0001, 0x1188, 0x694c, 0xa18c, | ||
| 7491 | 0x8100, 0xa18e, 0x8100, 0x1158, 0x00c6, 0x2061, 0xb048, 0x6200, | ||
| 7492 | 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, | ||
| 7493 | 0x510c, 0x6010, 0xa06d, 0x190c, 0x65aa, 0x00de, 0x0005, 0x0156, | ||
| 7494 | 0x00c6, 0x2061, 0xb048, 0x6000, 0x81ff, 0x0110, 0xa205, 0x0008, | ||
| 7495 | 0xa204, 0x6002, 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, | ||
| 7496 | 0x6808, 0xa005, 0x0120, 0x8001, 0x680a, 0xa085, 0x0001, 0x0005, | ||
| 7497 | 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, 0x1208, 0xa200, | ||
| 7498 | 0x1f04, 0x665c, 0x8086, 0x818e, 0x0005, 0x0156, 0x20a9, 0x0010, | ||
| 7499 | 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, 0x818d, 0x0228, 0xa11a, | ||
| 7500 | 0x1220, 0x1f04, 0x666c, 0x0028, 0xa11a, 0x2308, 0x8210, 0x1f04, | ||
| 7501 | 0x666c, 0x0006, 0x3200, 0xa084, 0xefff, 0x2080, 0x000e, 0x015e, | ||
| 7502 | 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, 0x0cb8, 0x0126, 0x2091, | ||
| 7503 | 0x2800, 0x2079, 0xafc7, 0x012e, 0x00d6, 0x2069, 0xafc7, 0x6803, | ||
| 7504 | 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, 0x8001, 0x206a, 0x00de, | ||
| 7505 | 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, 0xa084, 0x0007, 0x0002, | ||
| 7506 | 0x66aa, 0x66cb, 0x671e, 0x66b0, 0x66cb, 0x66aa, 0x66a8, 0x66a8, | ||
| 7507 | 0x080c, 0x14f6, 0x080c, 0x6581, 0x080c, 0x6c50, 0x00ce, 0x0005, | ||
| 7508 | 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, 0x2011, 0x481b, 0x080c, | ||
| 7509 | 0x650d, 0x7828, 0xa092, 0x00c8, 0x1228, 0x8000, 0x782a, 0x080c, | ||
| 7510 | 0x4855, 0x0c88, 0x080c, 0x481b, 0x7807, 0x0003, 0x7827, 0x0000, | ||
| 7511 | 0x782b, 0x0000, 0x0c40, 0x080c, 0x6581, 0x3c00, 0x0006, 0x2011, | ||
| 7512 | 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, 0x20e0, 0x82ff, 0x0178, | ||
| 7513 | 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, | ||
| 7514 | 0x14f6, 0x2009, 0x0013, 0x080c, 0x80a7, 0x00ce, 0x0005, 0x3900, | ||
| 7515 | 0xa082, 0xb0e8, 0x1210, 0x080c, 0x7d8d, 0x00c6, 0x7824, 0xa065, | ||
| 7516 | 0x090c, 0x14f6, 0x7804, 0xa086, 0x0004, 0x0904, 0x675e, 0x7828, | ||
| 7517 | 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, 0x00ce, 0x080c, 0x7827, | ||
| 7518 | 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, 0x00e6, 0x2071, 0xad00, | ||
| 7519 | 0x70dc, 0x00ee, 0xd08c, 0x0150, 0x00c6, 0x00e6, 0x2061, 0x0100, | ||
| 7520 | 0x2071, 0xad00, 0x080c, 0x485e, 0x00ee, 0x00ce, 0x080c, 0xaca2, | ||
| 7521 | 0x2009, 0x0014, 0x080c, 0x80a7, 0x00ce, 0x0838, 0x2001, 0xafe3, | ||
| 7522 | 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, 0x7824, | ||
| 7523 | 0xa065, 0x090c, 0x14f6, 0x2009, 0x0013, 0x080c, 0x80fb, 0x00ce, | ||
| 7524 | 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xb0e8, 0x1210, 0x080c, | ||
| 7525 | 0x7d8d, 0x7824, 0xa005, 0x090c, 0x14f6, 0x781c, 0xa06d, 0x090c, | ||
| 7526 | 0x14f6, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, 0x080c, 0x8078, | ||
| 7527 | 0x693c, 0x81ff, 0x090c, 0x14f6, 0x8109, 0x693e, 0x6854, 0xa015, | ||
| 7528 | 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, 0x7807, 0x0000, 0x7827, | ||
| 7529 | 0x0000, 0x00de, 0x00ce, 0x080c, 0x6c50, 0x0888, 0x6104, 0xa186, | ||
| 7530 | 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, 0x0804, 0x66f7, 0x7808, | ||
| 7531 | 0xac06, 0x0904, 0x66f7, 0x080c, 0x6b73, 0x080c, 0x67ee, 0x00ce, | ||
| 7532 | 0x080c, 0x6c50, 0x0804, 0x66e5, 0x00c6, 0x6027, 0x0002, 0x62c8, | ||
| 7533 | 0x60c4, 0xa205, 0x1178, 0x793c, 0xa1e5, 0x0000, 0x0130, 0x2009, | ||
| 7534 | 0x0049, 0x080c, 0x80a7, 0x00ce, 0x0005, 0x2011, 0xafe6, 0x2013, | ||
| 7535 | 0x0000, 0x0cc8, 0x3908, 0xa192, 0xb0e8, 0x1210, 0x080c, 0x7d8d, | ||
| 7536 | 0x793c, 0x81ff, 0x0d90, 0x793c, 0xa188, 0x0007, 0x210c, 0xa18e, | ||
| 7537 | 0x0006, 0x1138, 0x6014, 0xa084, 0x0184, 0xa085, 0x0012, 0x6016, | ||
| 7538 | 0x0c10, 0x6014, 0xa084, 0x0184, 0xa085, 0x0016, 0x6016, 0x08d8, | ||
| 7539 | 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, | ||
| 7540 | 0x2c08, 0x2061, 0xafc7, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, | ||
| 7541 | 0x0148, 0xa080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, | ||
| 7542 | 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0xafc7, | ||
| 7543 | 0x6000, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, | ||
| 7544 | 0x1110, 0x2c00, 0x681e, 0x6804, 0xa084, 0x0007, 0x0804, 0x6c56, | ||
| 7545 | 0xc0d5, 0x6002, 0x6818, 0xa005, 0x0158, 0x6056, 0x605b, 0x0000, | ||
| 7546 | 0x0006, 0x2c00, 0x681a, 0x00de, 0x685a, 0x2069, 0xafc7, 0x0c18, | ||
| 7547 | 0x6056, 0x605a, 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006, 0x0016, | ||
| 7548 | 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, | ||
| 7549 | 0xafc7, 0x6020, 0x8000, 0x6022, 0x6008, 0xa005, 0x0148, 0xa080, | ||
| 7550 | 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, | ||
| 7551 | 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, | ||
| 7552 | 0xafc7, 0x6034, 0xa005, 0x0130, 0xa080, 0x0003, 0x2102, 0x6136, | ||
| 7553 | 0x00ce, 0x0005, 0x613a, 0x6136, 0x0cd8, 0x00f6, 0x00e6, 0x00d6, | ||
| 7554 | 0x00c6, 0x0076, 0x0066, 0x0026, 0x0016, 0x0006, 0x0126, 0x2071, | ||
| 7555 | 0xafc7, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, | ||
| 7556 | 0x6889, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x6884, | ||
| 7557 | 0x87ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6884, 0x703c, 0xac06, | ||
| 7558 | 0x1170, 0x0036, 0x2019, 0x0001, 0x080c, 0x7a64, 0x7033, 0x0000, | ||
| 7559 | 0x703f, 0x0000, 0x7043, 0x0000, 0x7047, 0x0000, 0x003e, 0x7038, | ||
| 7560 | 0xac36, 0x1110, 0x660c, 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, | ||
| 7561 | 0xaf36, 0x0118, 0x2f00, 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, | ||
| 7562 | 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, | ||
| 7563 | 0x0000, 0x080c, 0x9596, 0x0198, 0x6010, 0x2068, 0x601c, 0xa086, | ||
| 7564 | 0x0003, 0x1510, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, | ||
| 7565 | 0x97fd, 0x080c, 0xabfa, 0x080c, 0x510c, 0x080c, 0x9742, 0x080c, | ||
| 7566 | 0x974e, 0x00ce, 0x0804, 0x682e, 0x2c78, 0x600c, 0x2060, 0x0804, | ||
| 7567 | 0x682e, 0x012e, 0x000e, 0x001e, 0x002e, 0x006e, 0x007e, 0x00ce, | ||
| 7568 | 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x19d0, | ||
| 7569 | 0x080c, 0xabfa, 0x080c, 0xa91f, 0x0c10, 0x0006, 0x0066, 0x00c6, | ||
| 7570 | 0x00d6, 0x00f6, 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, | ||
| 7571 | 0xafc7, 0x7838, 0xa065, 0x0558, 0x600c, 0x0006, 0x600f, 0x0000, | ||
| 7572 | 0x783c, 0xac06, 0x1170, 0x0036, 0x2019, 0x0001, 0x080c, 0x7a64, | ||
| 7573 | 0x7833, 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, | ||
| 7574 | 0x003e, 0x080c, 0x9596, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, | ||
| 7575 | 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, | ||
| 7576 | 0x510c, 0x080c, 0x9742, 0x080c, 0x974e, 0x000e, 0x0898, 0x7e3a, | ||
| 7577 | 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, | ||
| 7578 | 0x601c, 0xa086, 0x0006, 0x1d30, 0x080c, 0xa91f, 0x0c60, 0x0016, | ||
| 7579 | 0x0026, 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x69a9, 0x008e, | ||
| 7580 | 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xafc7, 0x2091, | ||
| 7581 | 0x8000, 0x080c, 0x6a36, 0x080c, 0x6aa8, 0x012e, 0x00fe, 0x0005, | ||
| 7582 | 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, | ||
| 7583 | 0x2091, 0x8000, 0x2071, 0xafc7, 0x7614, 0x2660, 0x2678, 0x8cff, | ||
| 7584 | 0x0904, 0x6985, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, | ||
| 7585 | 0x6980, 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6980, 0x7024, | ||
| 7586 | 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, | ||
| 7587 | 0x6581, 0x080c, 0x7834, 0x68c3, 0x0000, 0x080c, 0x7ca8, 0x7027, | ||
| 7588 | 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, | ||
| 7589 | 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, | ||
| 7590 | 0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, 0x0009, 0x630a, | ||
| 7591 | 0x04b8, 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, 0x7010, 0xac36, | ||
| 7592 | 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, 0x0010, 0x7013, | ||
| 7593 | 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, | ||
| 7594 | 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0x9596, 0x0188, | ||
| 7595 | 0x601c, 0xa086, 0x0003, 0x1510, 0x6837, 0x0103, 0x6b4a, 0x6847, | ||
| 7596 | 0x0000, 0x080c, 0x97fd, 0x080c, 0xabfa, 0x080c, 0x510c, 0x080c, | ||
| 7597 | 0x9742, 0x080c, 0x974e, 0x080c, 0x7b88, 0x00ce, 0x0804, 0x690f, | ||
| 7598 | 0x2c78, 0x600c, 0x2060, 0x0804, 0x690f, 0x012e, 0x000e, 0x001e, | ||
| 7599 | 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, | ||
| 7600 | 0x0006, 0x1128, 0x080c, 0xabfa, 0x080c, 0xa91f, 0x0c10, 0x601c, | ||
| 7601 | 0xa086, 0x0002, 0x1128, 0x6004, 0xa086, 0x0085, 0x0968, 0x08c8, | ||
| 7602 | 0x601c, 0xa086, 0x0005, 0x19a8, 0x6004, 0xa086, 0x0085, 0x0d50, | ||
| 7603 | 0x0880, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0xa280, 0xae34, | ||
| 7604 | 0x2004, 0xa065, 0x0904, 0x6a32, 0x00f6, 0x00e6, 0x00d6, 0x0066, | ||
| 7605 | 0x2071, 0xafc7, 0x6654, 0x7018, 0xac06, 0x1108, 0x761a, 0x701c, | ||
| 7606 | 0xac06, 0x1130, 0x86ff, 0x1118, 0x7018, 0x701e, 0x0008, 0x761e, | ||
| 7607 | 0x6058, 0xa07d, 0x0108, 0x7e56, 0xa6ed, 0x0000, 0x0110, 0x2f00, | ||
| 7608 | 0x685a, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, | ||
| 7609 | 0x6002, 0x080c, 0x4c07, 0x0904, 0x6a2e, 0x7624, 0x86ff, 0x05e8, | ||
| 7610 | 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, | ||
| 7611 | 0x68c0, 0xa005, 0x0548, 0x080c, 0x6581, 0x080c, 0x7834, 0x68c3, | ||
| 7612 | 0x0000, 0x080c, 0x7ca8, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, | ||
| 7613 | 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, | ||
| 7614 | 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, | ||
| 7615 | 0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, | ||
| 7616 | 0x080c, 0x974e, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, | ||
| 7617 | 0x0009, 0x630a, 0x00ce, 0x0804, 0x69d9, 0x8dff, 0x0158, 0x6837, | ||
| 7618 | 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x97fd, 0x080c, 0xabfa, | ||
| 7619 | 0x080c, 0x510c, 0x080c, 0x7b88, 0x0804, 0x69d9, 0x006e, 0x00de, | ||
| 7620 | 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x0005, 0x0006, 0x0066, | ||
| 7621 | 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814, 0xa065, 0x0904, 0x6a88, | ||
| 7622 | 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0xac06, 0x1540, 0x2069, | ||
| 7623 | 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x6581, 0x080c, 0x7834, | ||
| 7624 | 0x68c3, 0x0000, 0x080c, 0x7ca8, 0x7827, 0x0000, 0x0036, 0x2069, | ||
| 7625 | 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, | ||
| 7626 | 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, | ||
| 7627 | 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00b0, 0x6010, | ||
| 7628 | 0x2068, 0x080c, 0x9596, 0x0168, 0x601c, 0xa086, 0x0003, 0x11b8, | ||
| 7629 | 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x510c, 0x080c, | ||
| 7630 | 0x9742, 0x080c, 0x974e, 0x080c, 0x7b88, 0x000e, 0x0804, 0x6a3d, | ||
| 7631 | 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x601c, | ||
| 7632 | 0xa086, 0x0006, 0x1118, 0x080c, 0xa91f, 0x0c58, 0x601c, 0xa086, | ||
| 7633 | 0x0002, 0x1128, 0x6004, 0xa086, 0x0085, 0x09d0, 0x0c10, 0x601c, | ||
| 7634 | 0xa086, 0x0005, 0x19f0, 0x6004, 0xa086, 0x0085, 0x0d60, 0x08c8, | ||
| 7635 | 0x0006, 0x0066, 0x00c6, 0x00d6, 0x7818, 0xa065, 0x0904, 0x6b0e, | ||
| 7636 | 0x6054, 0x0006, 0x6057, 0x0000, 0x605b, 0x0000, 0x6000, 0xc0d4, | ||
| 7637 | 0xc0dc, 0x6002, 0x080c, 0x4c07, 0x0904, 0x6b0b, 0x7e24, 0x86ff, | ||
| 7638 | 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, 0x2069, | ||
| 7639 | 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x6581, 0x080c, 0x7834, | ||
| 7640 | 0x68c3, 0x0000, 0x080c, 0x7ca8, 0x7827, 0x0000, 0x0036, 0x2069, | ||
| 7641 | 0x0140, 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, | ||
| 7642 | 0x0000, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, | ||
| 7643 | 0x003e, 0x00de, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, | ||
| 7644 | 0x2660, 0x080c, 0x974e, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, | ||
| 7645 | 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x6aba, 0x8dff, 0x0138, | ||
| 7646 | 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x510c, 0x080c, | ||
| 7647 | 0x7b88, 0x0804, 0x6aba, 0x000e, 0x0804, 0x6aad, 0x781e, 0x781a, | ||
| 7648 | 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0066, | ||
| 7649 | 0x6000, 0xd0dc, 0x0188, 0x604c, 0xa06d, 0x0170, 0x6848, 0xa606, | ||
| 7650 | 0x1158, 0x2071, 0xafc7, 0x7024, 0xa035, 0x0130, 0xa080, 0x0004, | ||
| 7651 | 0x2004, 0xad06, 0x1108, 0x0021, 0x006e, 0x00de, 0x00ee, 0x0005, | ||
| 7652 | 0x00f6, 0x2079, 0x0100, 0x78c0, 0xa005, 0x1138, 0x00c6, 0x2660, | ||
| 7653 | 0x6003, 0x0009, 0x630a, 0x00ce, 0x04a0, 0x080c, 0x7834, 0x78c3, | ||
| 7654 | 0x0000, 0x080c, 0x7ca8, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, | ||
| 7655 | 0x7b04, 0xa384, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, | ||
| 7656 | 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, | ||
| 7657 | 0x7ca8, 0x003e, 0x080c, 0x4c07, 0x00c6, 0x603c, 0xa005, 0x0110, | ||
| 7658 | 0x8001, 0x603e, 0x2660, 0x080c, 0x8078, 0x00ce, 0x6837, 0x0103, | ||
| 7659 | 0x6b4a, 0x6847, 0x0000, 0x080c, 0x97fd, 0x080c, 0x510c, 0x080c, | ||
| 7660 | 0x7b88, 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2071, 0xafc7, 0x7004, | ||
| 7661 | 0xa084, 0x0007, 0x0002, 0x6b85, 0x6b88, 0x6b9e, 0x6bb7, 0x6bf0, | ||
| 7662 | 0x6b85, 0x6b83, 0x6b83, 0x080c, 0x14f6, 0x00ce, 0x00ee, 0x0005, | ||
| 7663 | 0x7024, 0xa065, 0x0148, 0x7020, 0x8001, 0x7022, 0x600c, 0xa015, | ||
| 7664 | 0x0150, 0x7216, 0x600f, 0x0000, 0x7007, 0x0000, 0x7027, 0x0000, | ||
| 7665 | 0x00ce, 0x00ee, 0x0005, 0x7216, 0x7212, 0x0cb0, 0x6018, 0x2060, | ||
| 7666 | 0x080c, 0x4c07, 0x6000, 0xc0dc, 0x6002, 0x7020, 0x8001, 0x7022, | ||
| 7667 | 0x0120, 0x6054, 0xa015, 0x0140, 0x721e, 0x7007, 0x0000, 0x7027, | ||
| 7668 | 0x0000, 0x00ce, 0x00ee, 0x0005, 0x7218, 0x721e, 0x0cb0, 0x7024, | ||
| 7669 | 0xa065, 0x0598, 0x700c, 0xac06, 0x1160, 0x080c, 0x7b88, 0x600c, | ||
| 7670 | 0xa015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0428, 0x720e, 0x720a, | ||
| 7671 | 0x0410, 0x7014, 0xac06, 0x1160, 0x080c, 0x7b88, 0x600c, 0xa015, | ||
| 7672 | 0x0120, 0x7216, 0x600f, 0x0000, 0x00b0, 0x7216, 0x7212, 0x0098, | ||
| 7673 | 0x6018, 0x2060, 0x080c, 0x4c07, 0x6000, 0xc0dc, 0x6002, 0x080c, | ||
| 7674 | 0x7b88, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015, 0x0110, 0x721e, | ||
| 7675 | 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, | ||
| 7676 | 0x7024, 0xa065, 0x0140, 0x080c, 0x7b88, 0x600c, 0xa015, 0x0150, | ||
| 7677 | 0x720e, 0x600f, 0x0000, 0x080c, 0x7ca8, 0x7027, 0x0000, 0x00ce, | ||
| 7678 | 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, 0x2069, 0xafc7, | ||
| 7679 | 0x6830, 0xa084, 0x0003, 0x0002, 0x6c12, 0x6c14, 0x6c38, 0x6c10, | ||
| 7680 | 0x080c, 0x14f6, 0x00de, 0x0005, 0x00c6, 0x6840, 0xa086, 0x0001, | ||
| 7681 | 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015, 0x0170, 0x6a3a, | ||
| 7682 | 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0xafe6, | ||
| 7683 | 0x2013, 0x0000, 0x00ce, 0x00de, 0x0005, 0x683a, 0x6836, 0x0c90, | ||
| 7684 | 0x6843, 0x0000, 0x6838, 0xa065, 0x0d68, 0x6003, 0x0003, 0x0c50, | ||
| 7685 | 0x00c6, 0x6843, 0x0000, 0x6847, 0x0000, 0x683c, 0xa065, 0x0168, | ||
| 7686 | 0x600c, 0xa015, 0x0130, 0x6a3a, 0x600f, 0x0000, 0x683f, 0x0000, | ||
| 7687 | 0x0020, 0x683f, 0x0000, 0x683a, 0x6836, 0x00ce, 0x00de, 0x0005, | ||
| 7688 | 0x00d6, 0x2069, 0xafc7, 0x6804, 0xa084, 0x0007, 0x0002, 0x6c61, | ||
| 7689 | 0x6cfd, 0x6cfd, 0x6cfd, 0x6cfd, 0x6cff, 0x6c5f, 0x6c5f, 0x080c, | ||
| 7690 | 0x14f6, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, 0x00c6, 0x680c, | ||
| 7691 | 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, | ||
| 7692 | 0x6d49, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, 0x0150, 0x6807, | ||
| 7693 | 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x6d49, 0x00ce, 0x00de, | ||
| 7694 | 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, 0x0904, 0x6cf9, | ||
| 7695 | 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, 0x7054, 0xa075, | ||
| 7696 | 0x0120, 0xa20e, 0x0904, 0x6cf9, 0x0028, 0x6818, 0xa20e, 0x0904, | ||
| 7697 | 0x6cf9, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, 0xa005, 0x1d70, | ||
| 7698 | 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, 0x080c, 0x804f, | ||
| 7699 | 0x0904, 0x6cf9, 0x8318, 0x733e, 0x6112, 0x2e10, 0x621a, 0xa180, | ||
| 7700 | 0x0014, 0x2004, 0xa084, 0x00ff, 0x605a, 0xa180, 0x0014, 0x2003, | ||
| 7701 | 0x0000, 0xa180, 0x0015, 0x2004, 0xa08a, 0x199a, 0x0210, 0x2001, | ||
| 7702 | 0x1999, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x00f6, | ||
| 7703 | 0x2c78, 0x71a0, 0x2001, 0xad34, 0x2004, 0xd0ac, 0x1110, 0xd1bc, | ||
| 7704 | 0x0150, 0x7100, 0xd1f4, 0x0120, 0x7114, 0xa18c, 0x00ff, 0x0040, | ||
| 7705 | 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2be6, 0x2c0d, 0xa18c, 0x00ff, | ||
| 7706 | 0x2061, 0x0100, 0x619a, 0x080c, 0x736f, 0x7300, 0xc3dd, 0x7302, | ||
| 7707 | 0x6807, 0x0002, 0x2f18, 0x6b26, 0x682b, 0x0000, 0x781f, 0x0003, | ||
| 7708 | 0x7803, 0x0001, 0x7807, 0x0040, 0x00fe, 0x00ee, 0x00ce, 0x00de, | ||
| 7709 | 0x0005, 0x003e, 0x00ee, 0x00ce, 0x0cd0, 0x00de, 0x0005, 0x00c6, | ||
| 7710 | 0x680c, 0xa065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, 0x0000, | ||
| 7711 | 0x080c, 0x6d49, 0x00ce, 0x00de, 0x0005, 0x00f6, 0x00d6, 0x2069, | ||
| 7712 | 0xafc7, 0x6830, 0xa086, 0x0000, 0x11c0, 0x2001, 0xad0c, 0x200c, | ||
| 7713 | 0xd1bc, 0x1550, 0x6838, 0xa07d, 0x0180, 0x6833, 0x0001, 0x683e, | ||
| 7714 | 0x6847, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, | ||
| 7715 | 0x1ee6, 0x1130, 0x012e, 0x080c, 0x76a5, 0x00de, 0x00fe, 0x0005, | ||
| 7716 | 0x012e, 0xe000, 0x6843, 0x0000, 0x7803, 0x0002, 0x780c, 0xa015, | ||
| 7717 | 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, | ||
| 7718 | 0x0c60, 0x683a, 0x6836, 0x0cc0, 0xc1bc, 0x2102, 0x080c, 0x57d1, | ||
| 7719 | 0x0888, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x6d57, 0x6d5c, | ||
| 7720 | 0x7210, 0x732c, 0x6d5c, 0x7210, 0x732c, 0x6d57, 0x6d5c, 0x080c, | ||
| 7721 | 0x6b73, 0x080c, 0x6c50, 0x0005, 0x0156, 0x0136, 0x0146, 0x00c6, | ||
| 7722 | 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x14f6, 0x6118, 0x2178, | ||
| 7723 | 0x79a0, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, | ||
| 7724 | 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, | ||
| 7725 | 0x0000, 0x0028, 0xa1f8, 0x2be6, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, | ||
| 7726 | 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, 0x6dd0, 0x0033, | ||
| 7727 | 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x6e7c, 0x6ec7, | ||
| 7728 | 0x6ef4, 0x6fc1, 0x6fef, 0x6ff7, 0x701d, 0x702e, 0x703f, 0x7047, | ||
| 7729 | 0x705d, 0x7047, 0x70b7, 0x702e, 0x70d8, 0x70e0, 0x703f, 0x70e0, | ||
| 7730 | 0x70f1, 0x6dce, 0x6dce, 0x6dce, 0x6dce, 0x6dce, 0x6dce, 0x6dce, | ||
| 7731 | 0x6dce, 0x6dce, 0x6dce, 0x6dce, 0x790d, 0x7932, 0x7947, 0x796a, | ||
| 7732 | 0x798b, 0x701d, 0x6dce, 0x701d, 0x7047, 0x6dce, 0x6ef4, 0x6fc1, | ||
| 7733 | 0x6dce, 0x7daa, 0x7047, 0x6dce, 0x7dca, 0x7047, 0x6dce, 0x703f, | ||
| 7734 | 0x6e75, 0x6de0, 0x6dce, 0x7def, 0x7e64, 0x7f3b, 0x6dce, 0x7f4c, | ||
| 7735 | 0x7018, 0x7f68, 0x6dce, 0x79a0, 0x7fc3, 0x6dce, 0x080c, 0x14f6, | ||
| 7736 | 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, | ||
| 7737 | 0x6dde, 0x6dde, 0x6dde, 0x6e14, 0x6e32, 0x6e48, 0x080c, 0x14f6, | ||
| 7738 | 0x00d6, 0x20a1, 0x020b, 0x080c, 0x710e, 0x7810, 0x2068, 0x20a3, | ||
| 7739 | 0x2414, 0x20a3, 0x0018, 0x20a3, 0x0800, 0x683c, 0x20a2, 0x20a3, | ||
| 7740 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x6850, | ||
| 7741 | 0x20a2, 0x6854, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, | ||
| 7742 | 0x0018, 0x080c, 0x7821, 0x00de, 0x0005, 0x00d6, 0x7818, 0x2068, | ||
| 7743 | 0x68a0, 0x2069, 0xad00, 0x6ad0, 0xd2ac, 0x1110, 0xd0bc, 0x0110, | ||
| 7744 | 0xa085, 0x0001, 0x00de, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, | ||
| 7745 | 0x710e, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x7810, 0xa0e8, 0x000f, | ||
| 7746 | 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, 0x20a2, 0x6814, 0x20a2, | ||
| 7747 | 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, 0x0010, 0x080c, 0x7821, | ||
| 7748 | 0x00de, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x710e, | ||
| 7749 | 0x20a3, 0x7800, 0x20a3, 0x0000, 0x7808, 0x8007, 0x20a2, 0x20a3, | ||
| 7750 | 0x0000, 0x60c3, 0x0008, 0x080c, 0x7821, 0x014e, 0x015e, 0x0005, | ||
| 7751 | 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0200, | ||
| 7752 | 0x20a3, 0x0000, 0x20a3, 0xdf10, 0x20a3, 0x0034, 0x2099, 0xad05, | ||
| 7753 | 0x20a9, 0x0004, 0x53a6, 0x2099, 0xad01, 0x20a9, 0x0004, 0x53a6, | ||
| 7754 | 0x2099, 0xafad, 0x20a9, 0x001a, 0x3304, 0x8007, 0x20a2, 0x9398, | ||
| 7755 | 0x1f04, 0x6e64, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, | ||
| 7756 | 0x080c, 0x7821, 0x014e, 0x015e, 0x0005, 0x2001, 0xad14, 0x2004, | ||
| 7757 | 0x609a, 0x080c, 0x7821, 0x0005, 0x20a1, 0x020b, 0x080c, 0x710e, | ||
| 7758 | 0x20a3, 0x5200, 0x20a3, 0x0000, 0x00d6, 0x2069, 0xad51, 0x6804, | ||
| 7759 | 0xd084, 0x0150, 0x6828, 0x20a3, 0x0000, 0x0016, 0x080c, 0x268a, | ||
| 7760 | 0x21a2, 0x001e, 0x00de, 0x0028, 0x00de, 0x20a3, 0x0000, 0x20a3, | ||
| 7761 | 0x0000, 0x20a9, 0x0004, 0x2099, 0xad05, 0x53a6, 0x20a9, 0x0004, | ||
| 7762 | 0x2099, 0xad01, 0x53a6, 0x2001, 0xad34, 0x2004, 0xd0ac, 0x1138, | ||
| 7763 | 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, | ||
| 7764 | 0xad1b, 0x20a6, 0x2001, 0xad1c, 0x20a6, 0x0040, 0x20a3, 0x0000, | ||
| 7765 | 0x2001, 0xad14, 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, | ||
| 7766 | 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x7821, 0x0005, 0x20a1, | ||
| 7767 | 0x020b, 0x080c, 0x710e, 0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, | ||
| 7768 | 0xad34, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 7769 | 0xa082, 0x007f, 0x0238, 0x2001, 0xad1b, 0x20a6, 0x2001, 0xad1c, | ||
| 7770 | 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xad14, 0x2004, 0xa084, | ||
| 7771 | 0x00ff, 0x20a2, 0x20a9, 0x0004, 0x2099, 0xad05, 0x53a6, 0x60c3, | ||
| 7772 | 0x0010, 0x080c, 0x7821, 0x0005, 0x20a1, 0x020b, 0x080c, 0x710e, | ||
| 7773 | 0x00c6, 0x7818, 0x2060, 0x2001, 0x0000, 0x080c, 0x5037, 0x00ce, | ||
| 7774 | 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1130, 0x20a3, | ||
| 7775 | 0x0400, 0x620c, 0xc2b4, 0x620e, 0x0010, 0x20a3, 0x0300, 0x20a3, | ||
| 7776 | 0x0000, 0x7818, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1904, | ||
| 7777 | 0x6f83, 0x2001, 0xad34, 0x2004, 0xd0a4, 0x01c8, 0x2099, 0xaf8d, | ||
| 7778 | 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x3304, 0xa084, 0x2000, | ||
| 7779 | 0x20a2, 0x9398, 0x33a6, 0x9398, 0x20a3, 0x0000, 0x9398, 0x2001, | ||
| 7780 | 0x2710, 0x20a2, 0x9398, 0x33a6, 0x9398, 0x33a6, 0x00d0, 0x2099, | ||
| 7781 | 0xaf8d, 0x33a6, 0x9398, 0x33a6, 0x9398, 0x3304, 0x080c, 0x574f, | ||
| 7782 | 0x1118, 0xa084, 0x37ff, 0x0010, 0xa084, 0x3fff, 0x20a2, 0x9398, | ||
| 7783 | 0x33a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7784 | 0x0000, 0x20a9, 0x0004, 0x2099, 0xad05, 0x53a6, 0x20a9, 0x0004, | ||
| 7785 | 0x2099, 0xad01, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, | ||
| 7786 | 0x6f5d, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x6f63, 0x2099, | ||
| 7787 | 0xaf95, 0x3304, 0xc0dd, 0x20a2, 0x2001, 0xad71, 0x2004, 0xd0e4, | ||
| 7788 | 0x0158, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, | ||
| 7789 | 0x33a6, 0x20a9, 0x0004, 0x0010, 0x20a9, 0x0007, 0x20a3, 0x0000, | ||
| 7790 | 0x1f04, 0x6f7e, 0x0468, 0x2001, 0xad34, 0x2004, 0xd0a4, 0x0140, | ||
| 7791 | 0x2001, 0xaf8e, 0x2004, 0x60e3, 0x0000, 0x080c, 0x26cb, 0x60e2, | ||
| 7792 | 0x2099, 0xaf8d, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, | ||
| 7793 | 0xad05, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xad01, 0x53a6, 0x20a9, | ||
| 7794 | 0x0008, 0x20a3, 0x0000, 0x1f04, 0x6fa1, 0x20a9, 0x0008, 0x20a3, | ||
| 7795 | 0x0000, 0x1f04, 0x6fa7, 0x2099, 0xaf95, 0x20a9, 0x0008, 0x53a6, | ||
| 7796 | 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x6fb2, 0x20a9, 0x000a, | ||
| 7797 | 0x20a3, 0x0000, 0x1f04, 0x6fb8, 0x60c3, 0x0074, 0x080c, 0x7821, | ||
| 7798 | 0x0005, 0x20a1, 0x020b, 0x080c, 0x710e, 0x20a3, 0x2010, 0x20a3, | ||
| 7799 | 0x0014, 0x20a3, 0x0800, 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, | ||
| 7800 | 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xad51, 0x7904, 0x00fe, | ||
| 7801 | 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, | ||
| 7802 | 0xa085, 0x0002, 0x00d6, 0x0804, 0x7099, 0x20a2, 0x20a3, 0x0000, | ||
| 7803 | 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x7821, 0x0005, 0x20a1, | ||
| 7804 | 0x020b, 0x080c, 0x710e, 0x20a3, 0x5000, 0x0804, 0x6f0f, 0x20a1, | ||
| 7805 | 0x020b, 0x080c, 0x710e, 0x20a3, 0x2110, 0x20a3, 0x0014, 0x20a3, | ||
| 7806 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7807 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7808 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x7821, 0x0005, | ||
| 7809 | 0x20a1, 0x020b, 0x080c, 0x71a2, 0x0020, 0x20a1, 0x020b, 0x080c, | ||
| 7810 | 0x71aa, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7811 | 0x0000, 0x60c3, 0x0004, 0x080c, 0x7821, 0x0005, 0x20a1, 0x020b, | ||
| 7812 | 0x080c, 0x71aa, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, | ||
| 7813 | 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x7821, 0x0005, 0x20a1, | ||
| 7814 | 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0200, 0x0804, 0x6f0f, 0x20a1, | ||
| 7815 | 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, | ||
| 7816 | 0xa005, 0x0110, 0x20a2, 0x0010, 0x20a3, 0x0003, 0x7810, 0x20a2, | ||
| 7817 | 0x60c3, 0x0008, 0x080c, 0x7821, 0x0005, 0x00d6, 0x20a1, 0x020b, | ||
| 7818 | 0x080c, 0x71aa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, 0x0800, | ||
| 7819 | 0x7818, 0x2068, 0x6894, 0xa086, 0x0014, 0x1178, 0x6998, 0xa184, | ||
| 7820 | 0xc000, 0x1140, 0xd1ec, 0x0118, 0x20a3, 0x2100, 0x0040, 0x20a3, | ||
| 7821 | 0x0100, 0x0028, 0x20a3, 0x0400, 0x0010, 0x20a3, 0x0700, 0xa006, | ||
| 7822 | 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, 0x2079, 0xad51, | ||
| 7823 | 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, 0xd1a4, 0x0110, | ||
| 7824 | 0xa085, 0x0010, 0x2009, 0xad73, 0x210c, 0xd184, 0x1110, 0xa085, | ||
| 7825 | 0x0002, 0x0026, 0x2009, 0xad71, 0x210c, 0xd1e4, 0x0130, 0xc0c5, | ||
| 7826 | 0xa094, 0x0030, 0xa296, 0x0010, 0x0140, 0xd1ec, 0x0130, 0xa094, | ||
| 7827 | 0x0030, 0xa296, 0x0010, 0x0108, 0xc0bd, 0x002e, 0x20a2, 0x20a2, | ||
| 7828 | 0x20a2, 0x60c3, 0x0014, 0x080c, 0x7821, 0x00de, 0x0005, 0x20a1, | ||
| 7829 | 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0210, 0x20a3, 0x0014, 0x20a3, | ||
| 7830 | 0x0000, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7831 | 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, | ||
| 7832 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x7821, 0x0005, | ||
| 7833 | 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0200, 0x0804, 0x6e82, | ||
| 7834 | 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0100, 0x20a3, 0x0000, | ||
| 7835 | 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, 0x080c, 0x7821, | ||
| 7836 | 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, 0x020b, 0x080c, | ||
| 7837 | 0x71aa, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x000b, 0x20a3, | ||
| 7838 | 0x0000, 0x60c3, 0x0008, 0x080c, 0x7821, 0x0005, 0x0026, 0x0036, | ||
| 7839 | 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0038, 0x0026, 0x0036, | ||
| 7840 | 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x20e1, 0x9080, 0x20e1, | ||
| 7841 | 0x4000, 0x7818, 0xa080, 0x0028, 0x2014, 0xa286, 0x007e, 0x11a0, | ||
| 7842 | 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffe, 0x20a3, 0x0000, 0x2011, | ||
| 7843 | 0xad14, 0x2214, 0x2001, 0xaf9d, 0x2004, 0xa005, 0x0118, 0x2011, | ||
| 7844 | 0xad1c, 0x2214, 0x22a2, 0x04d0, 0xa286, 0x007f, 0x1138, 0x00d6, | ||
| 7845 | 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, 0x00c8, 0x2001, 0xad34, | ||
| 7846 | 0x2004, 0xd0ac, 0x1110, 0xd2bc, 0x01c8, 0xa286, 0x0080, 0x00d6, | ||
| 7847 | 0x1130, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffc, 0x0040, 0xa2e8, | ||
| 7848 | 0xae34, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x2069, | ||
| 7849 | 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa2e8, | ||
| 7850 | 0xae34, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, | ||
| 7851 | 0x20a3, 0x0000, 0x2011, 0xad14, 0x2214, 0x22a2, 0xa485, 0x0029, | ||
| 7852 | 0x20a2, 0x004e, 0x003e, 0x20a3, 0x0000, 0x080c, 0x7810, 0x22a2, | ||
| 7853 | 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, | ||
| 7854 | 0x0000, 0x002e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, | ||
| 7855 | 0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, 0x00d6, 0x2069, 0xad1b, | ||
| 7856 | 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x20a3, 0x2029, 0x20a3, 0x0000, | ||
| 7857 | 0x08e0, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0xfc02, 0x20a3, | ||
| 7858 | 0x0000, 0x0005, 0x0026, 0x0036, 0x0046, 0x2019, 0x3300, 0x2021, | ||
| 7859 | 0x0800, 0x0038, 0x0026, 0x0036, 0x0046, 0x2019, 0x2300, 0x2021, | ||
| 7860 | 0x0100, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, | ||
| 7861 | 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, | ||
| 7862 | 0x02d8, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa305, 0x20a2, | ||
| 7863 | 0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, 0x6814, 0xa005, 0x1128, | ||
| 7864 | 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, 0x2069, 0xad1b, 0x2da6, | ||
| 7865 | 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, | ||
| 7866 | 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, | ||
| 7867 | 0x2011, 0xad14, 0x2214, 0x22a2, 0xa485, 0x0098, 0x20a2, 0x20a3, | ||
| 7868 | 0x0000, 0x004e, 0x003e, 0x080c, 0x7810, 0x22a2, 0x20a3, 0x0000, | ||
| 7869 | 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, | ||
| 7870 | 0x0005, 0x080c, 0x7810, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, | ||
| 7871 | 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, | ||
| 7872 | 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x14f6, 0xa08a, | ||
| 7873 | 0x008c, 0x1a0c, 0x14f6, 0x6118, 0x2178, 0x79a0, 0x2011, 0xad34, | ||
| 7874 | 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, | ||
| 7875 | 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, | ||
| 7876 | 0x2be6, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, | ||
| 7877 | 0xa082, 0x0085, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x7247, 0x7251, | ||
| 7878 | 0x726c, 0x7245, 0x7245, 0x7245, 0x7247, 0x080c, 0x14f6, 0x0146, | ||
| 7879 | 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, 0x080c, 0x7821, 0x014e, | ||
| 7880 | 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x72b8, 0x20a3, 0x0000, | ||
| 7881 | 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, 0x20a3, 0x0000, | ||
| 7882 | 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, | ||
| 7883 | 0x080c, 0x7821, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, | ||
| 7884 | 0x72f2, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, 0x0000, 0x20a3, | ||
| 7885 | 0x0000, 0x60c3, 0x0004, 0x080c, 0x7821, 0x014e, 0x0005, 0x0026, | ||
| 7886 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 7887 | 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, | ||
| 7888 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, | ||
| 7889 | 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, | ||
| 7890 | 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x8100, | ||
| 7891 | 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xad14, | ||
| 7892 | 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, 0x0804, 0x7175, | ||
| 7893 | 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, | ||
| 7894 | 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, | ||
| 7895 | 0x0288, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x8400, | ||
| 7896 | 0x20a2, 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, | ||
| 7897 | 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, | ||
| 7898 | 0x8400, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, | ||
| 7899 | 0xad14, 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, | ||
| 7900 | 0x0804, 0x7201, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, | ||
| 7901 | 0xa080, 0x0028, 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1118, | ||
| 7902 | 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, | ||
| 7903 | 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, | ||
| 7904 | 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, | ||
| 7905 | 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, | ||
| 7906 | 0x0000, 0x2011, 0xad14, 0x2214, 0x22a2, 0x2001, 0x0099, 0x20a2, | ||
| 7907 | 0x20a3, 0x0000, 0x0804, 0x7201, 0x00c6, 0x00f6, 0x2c78, 0x7804, | ||
| 7908 | 0xa08a, 0x0040, 0x0a0c, 0x14f6, 0xa08a, 0x0053, 0x1a0c, 0x14f6, | ||
| 7909 | 0x7918, 0x2160, 0x61a0, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, | ||
| 7910 | 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, 0x6114, 0xa18c, 0x00ff, | ||
| 7911 | 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2be6, 0x2c0d, 0xa18c, | ||
| 7912 | 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, 0x0040, 0x001b, 0x00fe, | ||
| 7913 | 0x00ce, 0x0005, 0x736f, 0x747b, 0x7418, 0x761a, 0x736d, 0x736d, | ||
| 7914 | 0x736d, 0x736d, 0x736d, 0x736d, 0x736d, 0x7b41, 0x7b51, 0x7b61, | ||
| 7915 | 0x7b71, 0x736d, 0x7f79, 0x736d, 0x7b30, 0x080c, 0x14f6, 0x00d6, | ||
| 7916 | 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, 0x020b, 0x080c, 0x73cf, | ||
| 7917 | 0x7910, 0x2168, 0x6948, 0x7952, 0x21a2, 0xa016, 0x22a2, 0x22a2, | ||
| 7918 | 0x22a2, 0x694c, 0xa184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, | ||
| 7919 | 0xd184, 0x0118, 0x2001, 0x0004, 0x0018, 0xa084, 0x0006, 0x8004, | ||
| 7920 | 0x0016, 0x2008, 0x7858, 0xa084, 0x00ff, 0x8007, 0xa105, 0x001e, | ||
| 7921 | 0x20a2, 0xd1ac, 0x0118, 0x20a3, 0x0002, 0x0048, 0xd1b4, 0x0118, | ||
| 7922 | 0x20a3, 0x0001, 0x0020, 0x20a3, 0x0000, 0x2230, 0x0010, 0x6a80, | ||
| 7923 | 0x6e7c, 0x20a9, 0x0008, 0x0136, 0xad88, 0x0017, 0x2198, 0x20a1, | ||
| 7924 | 0x021b, 0x53a6, 0x013e, 0x20a1, 0x020b, 0x22a2, 0x26a2, 0x60c3, | ||
| 7925 | 0x0020, 0x20e1, 0x9080, 0x6014, 0xa084, 0x0004, 0xa085, 0x0009, | ||
| 7926 | 0x6016, 0x2001, 0xafe3, 0x2003, 0x07d0, 0x2001, 0xafe2, 0x2003, | ||
| 7927 | 0x0009, 0x080c, 0x17bf, 0x014e, 0x015e, 0x00de, 0x0005, 0x20e1, | ||
| 7928 | 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, | ||
| 7929 | 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 7930 | 0x2019, 0xad34, 0x231c, 0xd3ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, | ||
| 7931 | 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, | ||
| 7932 | 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, | ||
| 7933 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0600, 0x20a2, | ||
| 7934 | 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2009, 0xad14, 0x210c, | ||
| 7935 | 0x21a2, 0x20a3, 0x0829, 0x20a3, 0x0000, 0x22a2, 0x20a3, 0x0000, | ||
| 7936 | 0x2fa2, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x0005, | ||
| 7937 | 0x00d6, 0x0156, 0x0136, 0x0146, 0x20a1, 0x020b, 0x00c1, 0x7810, | ||
| 7938 | 0x2068, 0x6860, 0x20a2, 0x685c, 0x20a2, 0x6880, 0x20a2, 0x687c, | ||
| 7939 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x000c, | ||
| 7940 | 0x080c, 0x7821, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x0026, | ||
| 7941 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, | ||
| 7942 | 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, | ||
| 7943 | 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, | ||
| 7944 | 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, | ||
| 7945 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0500, 0x20a2, | ||
| 7946 | 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xad14, 0x2214, | ||
| 7947 | 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, 0x080c, 0x7810, 0x22a2, | ||
| 7948 | 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, | ||
| 7949 | 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x7810, | ||
| 7950 | 0xa06d, 0x080c, 0x5025, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086, | ||
| 7951 | 0x2020, 0x1118, 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c, | ||
| 7952 | 0x75d0, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, | ||
| 7953 | 0xa084, 0xf000, 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043, | ||
| 7954 | 0x0010, 0xa006, 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, | ||
| 7955 | 0x74b2, 0x7547, 0x7550, 0x7579, 0x758c, 0x75a7, 0x75b0, 0x74b0, | ||
| 7956 | 0x080c, 0x14f6, 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118, | ||
| 7957 | 0xa186, 0x0003, 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, | ||
| 7958 | 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, | ||
| 7959 | 0x7583, 0xa186, 0x0001, 0x190c, 0x14f6, 0x6b78, 0x7820, 0xd0cc, | ||
| 7960 | 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, | ||
| 7961 | 0x6874, 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, | ||
| 7962 | 0x0300, 0x0904, 0x7541, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc, | ||
| 7963 | 0x0110, 0x6874, 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020, | ||
| 7964 | 0x201c, 0x831f, 0x23a2, 0x8000, 0x1f04, 0x74f0, 0x015e, 0x22a2, | ||
| 7965 | 0x22a2, 0x22a2, 0xa184, 0x0003, 0x0904, 0x7541, 0x20a1, 0x020b, | ||
| 7966 | 0x20e1, 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028, | ||
| 7967 | 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, | ||
| 7968 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, | ||
| 7969 | 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, | ||
| 7970 | 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0700, | ||
| 7971 | 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xad14, | ||
| 7972 | 0x2214, 0x22a2, 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889, | ||
| 7973 | 0x0010, 0x20a3, 0x0898, 0x20a2, 0x080c, 0x7810, 0x22a2, 0x20a3, | ||
| 7974 | 0x0000, 0x61c2, 0x003e, 0x001e, 0x080c, 0x7821, 0x0005, 0x2011, | ||
| 7975 | 0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0488, | ||
| 7976 | 0x2011, 0x0302, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, | ||
| 7977 | 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x0012, 0x22a2, 0x20a3, 0x0008, | ||
| 7978 | 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x20a3, 0x7000, 0x20a3, 0x0500, | ||
| 7979 | 0x22a2, 0x20a3, 0x000a, 0x22a2, 0x22a2, 0x20a3, 0x2500, 0x22a2, | ||
| 7980 | 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0032, 0x080c, 0x7821, | ||
| 7981 | 0x0005, 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, | ||
| 7982 | 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, | ||
| 7983 | 0x0018, 0x080c, 0x7821, 0x0005, 0x2011, 0x0100, 0x7820, 0xd0cc, | ||
| 7984 | 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, | ||
| 7985 | 0x22a2, 0x20a3, 0x0008, 0x22a2, 0x7854, 0xa084, 0x00ff, 0x20a2, | ||
| 7986 | 0x22a2, 0x22a2, 0x60c3, 0x0020, 0x080c, 0x7821, 0x0005, 0x2011, | ||
| 7987 | 0x0008, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x0888, | ||
| 7988 | 0x0036, 0x7b10, 0xa384, 0xff00, 0x7812, 0xa384, 0x00ff, 0x8001, | ||
| 7989 | 0x1138, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0x003e, 0x0808, | ||
| 7990 | 0x0046, 0x2021, 0x0800, 0x0006, 0x7820, 0xd0cc, 0x000e, 0x0108, | ||
| 7991 | 0xc4e5, 0x24a2, 0x004e, 0x22a2, 0x20a2, 0x003e, 0x0804, 0x7583, | ||
| 7992 | 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, | ||
| 7993 | 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, | ||
| 7994 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, | ||
| 7995 | 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, | ||
| 7996 | 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0700, | ||
| 7997 | 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xad14, | ||
| 7998 | 0x2214, 0x22a2, 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010, | ||
| 7999 | 0x20a3, 0x0898, 0x20a3, 0x0000, 0x080c, 0x7810, 0x22a2, 0x20a3, | ||
| 8000 | 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 8001 | 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x0016, 0x0036, | ||
| 8002 | 0x7810, 0xa084, 0x0700, 0x8007, 0x003b, 0x003e, 0x001e, 0x014e, | ||
| 8003 | 0x013e, 0x015e, 0x00de, 0x0005, 0x7634, 0x7634, 0x7636, 0x7634, | ||
| 8004 | 0x7634, 0x7634, 0x7658, 0x7634, 0x080c, 0x14f6, 0x7910, 0xa18c, | ||
| 8005 | 0xf8ff, 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, | ||
| 8006 | 0x00f9, 0x00d6, 0x2069, 0xad51, 0x6804, 0xd0bc, 0x0130, 0x682c, | ||
| 8007 | 0xa084, 0x00ff, 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de, | ||
| 8008 | 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7821, 0x0005, | ||
| 8009 | 0x20a1, 0x020b, 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80, | ||
| 8010 | 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, | ||
| 8011 | 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, | ||
| 8012 | 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, | ||
| 8013 | 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, 0x00de, | ||
| 8014 | 0x0088, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, 0x0100, | ||
| 8015 | 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xad14, | ||
| 8016 | 0x2214, 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c, | ||
| 8017 | 0x7810, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, | ||
| 8018 | 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, | ||
| 8019 | 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xad00, 0x7150, | ||
| 8020 | 0x7818, 0x2068, 0x68a0, 0x2028, 0x76d0, 0xd6ac, 0x1130, 0xd0bc, | ||
| 8021 | 0x1120, 0x6910, 0x6a14, 0x7450, 0x0020, 0x6910, 0x6a14, 0x736c, | ||
| 8022 | 0x7470, 0x781c, 0xa0be, 0x0006, 0x0904, 0x775b, 0xa0be, 0x000a, | ||
| 8023 | 0x15e8, 0xa185, 0x0200, 0x6062, 0x6266, 0x636a, 0x646e, 0x6073, | ||
| 8024 | 0x2029, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, 0x00ff, 0x688e, | ||
| 8025 | 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, 0x7808, 0x6086, | ||
| 8026 | 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, | ||
| 8027 | 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, | ||
| 8028 | 0x609f, 0x0000, 0x080c, 0x8014, 0x2009, 0x07d0, 0x60c4, 0xa084, | ||
| 8029 | 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x6586, 0x003e, | ||
| 8030 | 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x70d0, 0xd0ac, | ||
| 8031 | 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, | ||
| 8032 | 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, | ||
| 8033 | 0x646e, 0x6073, 0x0809, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, | ||
| 8034 | 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6082, | ||
| 8035 | 0x7808, 0x6086, 0x7810, 0x2070, 0x7014, 0x608a, 0x7010, 0x608e, | ||
| 8036 | 0x700c, 0x60c6, 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, | ||
| 8037 | 0x60d7, 0x0000, 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, | ||
| 8038 | 0x6a14, 0xa294, 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, | ||
| 8039 | 0x8014, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, | ||
| 8040 | 0x2009, 0x1b58, 0x080c, 0x6586, 0x003e, 0x004e, 0x005e, 0x00ce, | ||
| 8041 | 0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, | ||
| 8042 | 0xa086, 0x0002, 0x0904, 0x77b1, 0x2001, 0xad34, 0x2004, 0xd0ac, | ||
| 8043 | 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0100, 0x6062, 0x6266, 0x636a, | ||
| 8044 | 0x646e, 0x0038, 0xa185, 0x0100, 0x6062, 0x6266, 0x606b, 0x0000, | ||
| 8045 | 0x646e, 0x6073, 0x0880, 0x6077, 0x0008, 0x688c, 0x8000, 0xa084, | ||
| 8046 | 0x00ff, 0x688e, 0x8007, 0x607a, 0x7834, 0x607e, 0x2f00, 0x6086, | ||
| 8047 | 0x7808, 0x6082, 0x7060, 0x608a, 0x705c, 0x608e, 0x7080, 0x60c6, | ||
| 8048 | 0x707c, 0x60ca, 0x707c, 0x792c, 0xa108, 0x792e, 0x7080, 0x7928, | ||
| 8049 | 0xa109, 0x792a, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, | ||
| 8050 | 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, | ||
| 8051 | 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x080c, 0x8011, 0x0804, | ||
| 8052 | 0x7749, 0x2001, 0xad34, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138, | ||
| 8053 | 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185, | ||
| 8054 | 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x5025, | ||
| 8055 | 0x0180, 0x00d6, 0x7810, 0xa06d, 0x684c, 0x00de, 0xa084, 0x2020, | ||
| 8056 | 0xa086, 0x2020, 0x1130, 0x7820, 0xc0cd, 0x7822, 0x6073, 0x0889, | ||
| 8057 | 0x0010, 0x6073, 0x0898, 0x6077, 0x0000, 0x688c, 0x8000, 0xa084, | ||
| 8058 | 0x00ff, 0x688e, 0x8007, 0x607a, 0x607f, 0x0000, 0x2f00, 0x6086, | ||
| 8059 | 0x7808, 0x6082, 0x7014, 0x608a, 0x7010, 0x608e, 0x700c, 0x60c6, | ||
| 8060 | 0x7008, 0x60ca, 0x686c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, | ||
| 8061 | 0xa582, 0x0080, 0x0248, 0x6a00, 0xd2f4, 0x0120, 0x6a14, 0xa294, | ||
| 8062 | 0x00ff, 0x0010, 0x2011, 0x0000, 0x629e, 0x7820, 0xd0cc, 0x0120, | ||
| 8063 | 0x080c, 0x8014, 0x0804, 0x7749, 0x080c, 0x8011, 0x0804, 0x7749, | ||
| 8064 | 0x7a18, 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, | ||
| 8065 | 0x8217, 0x0005, 0x00d6, 0x2069, 0xafc7, 0x6843, 0x0001, 0x00de, | ||
| 8066 | 0x0005, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019, | ||
| 8067 | 0x080c, 0x6578, 0x0005, 0x0006, 0x6014, 0xa084, 0x0004, 0xa085, | ||
| 8068 | 0x0009, 0x6016, 0x000e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, | ||
| 8069 | 0x6014, 0xa084, 0x0004, 0xa085, 0x0008, 0x6016, 0x00ce, 0x000e, | ||
| 8070 | 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, | ||
| 8071 | 0x0140, 0x080c, 0x574f, 0x1178, 0x2001, 0xafe3, 0x2004, 0xa005, | ||
| 8072 | 0x1598, 0x080c, 0x57d1, 0x1118, 0x080c, 0x6578, 0x0468, 0x00c6, | ||
| 8073 | 0x2061, 0xafc7, 0x00d8, 0x6904, 0xa194, 0x4000, 0x0550, 0x08a1, | ||
| 8074 | 0x6803, 0x1000, 0x6803, 0x0000, 0x00c6, 0x2061, 0xafc7, 0x6128, | ||
| 8075 | 0xa192, 0x00c8, 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, | ||
| 8076 | 0x0198, 0x080c, 0x6578, 0x080c, 0x782b, 0x0070, 0x6124, 0xa1e5, | ||
| 8077 | 0x0000, 0x0140, 0x080c, 0xaca2, 0x2009, 0x0014, 0x080c, 0x80a7, | ||
| 8078 | 0x080c, 0x6581, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, | ||
| 8079 | 0x0005, 0x2001, 0xafe3, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, | ||
| 8080 | 0xafc7, 0x6128, 0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, | ||
| 8081 | 0x080c, 0x6578, 0x080c, 0x485e, 0x0c38, 0x00c6, 0x00d6, 0x00e6, | ||
| 8082 | 0x0016, 0x0026, 0x080c, 0x658e, 0x2071, 0xafc7, 0x713c, 0x81ff, | ||
| 8083 | 0x0570, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x574f, 0x1188, | ||
| 8084 | 0x0036, 0x2019, 0x0001, 0x080c, 0x7a64, 0x003e, 0x713c, 0x2160, | ||
| 8085 | 0x080c, 0xaca2, 0x2009, 0x004a, 0x080c, 0x80a7, 0x080c, 0x57d1, | ||
| 8086 | 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803, 0x1000, 0x6803, | ||
| 8087 | 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x7a64, 0x003e, 0x713c, | ||
| 8088 | 0x2160, 0x080c, 0xaca2, 0x2009, 0x004a, 0x080c, 0x80a7, 0x002e, | ||
| 8089 | 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58, 0x00e6, 0x00d6, | ||
| 8090 | 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, | ||
| 8091 | 0x6018, 0x2068, 0x6ca0, 0x2071, 0xafc7, 0x7018, 0x2068, 0x8dff, | ||
| 8092 | 0x0198, 0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, 0x0cc0, 0x6010, | ||
| 8093 | 0x2060, 0x643c, 0x6540, 0x6e48, 0x2d60, 0x080c, 0x4e41, 0x0120, | ||
| 8094 | 0x080c, 0x7b88, 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, | ||
| 8095 | 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, | ||
| 8096 | 0x710e, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, | ||
| 8097 | 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0xad14, 0x2004, | ||
| 8098 | 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, | ||
| 8099 | 0x20a2, 0x1f04, 0x7928, 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, | ||
| 8100 | 0x7821, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x710e, | ||
| 8101 | 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, | ||
| 8102 | 0x60c3, 0x0008, 0x080c, 0x7821, 0x014e, 0x015e, 0x0005, 0x0156, | ||
| 8103 | 0x0146, 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0200, 0x20a3, | ||
| 8104 | 0x0000, 0x20a9, 0x0006, 0x2011, 0xad40, 0x2019, 0xad41, 0x23a6, | ||
| 8105 | 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04, 0x7957, 0x20a3, | ||
| 8106 | 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x7821, 0x014e, | ||
| 8107 | 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, | ||
| 8108 | 0x080c, 0x7183, 0x080c, 0x7199, 0x7810, 0xa080, 0x0000, 0x2004, | ||
| 8109 | 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, | ||
| 8110 | 0xa080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x7821, 0x002e, 0x001e, | ||
| 8111 | 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, | ||
| 8112 | 0x710e, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, | ||
| 8113 | 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7821, 0x014e, 0x015e, 0x0005, | ||
| 8114 | 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x710e, | ||
| 8115 | 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, | ||
| 8116 | 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x080c, 0x7821, | ||
| 8117 | 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, | ||
| 8118 | 0x0126, 0x2091, 0x8000, 0x2071, 0xafc7, 0x700c, 0x2060, 0x8cff, | ||
| 8119 | 0x0178, 0x080c, 0x9789, 0x1110, 0x080c, 0x85f3, 0x600c, 0x0006, | ||
| 8120 | 0x080c, 0x994e, 0x080c, 0x8078, 0x080c, 0x7b88, 0x00ce, 0x0c78, | ||
| 8121 | 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x000e, 0x00ce, 0x00ee, | ||
| 8122 | 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0026, | ||
| 8123 | 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, 0x0100, 0x2079, 0x0140, | ||
| 8124 | 0x2071, 0xafc7, 0x7024, 0x2060, 0x8cff, 0x05a0, 0x080c, 0x7834, | ||
| 8125 | 0x68c3, 0x0000, 0x080c, 0x6581, 0x2009, 0x0013, 0x080c, 0x80a7, | ||
| 8126 | 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, | ||
| 8127 | 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, | ||
| 8128 | 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x7a02, 0x7804, | ||
| 8129 | 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, | ||
| 8130 | 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, | ||
| 8131 | 0x012e, 0x0005, 0x2001, 0xad00, 0x2004, 0xa096, 0x0001, 0x0550, | ||
| 8132 | 0xa096, 0x0004, 0x0538, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, | ||
| 8133 | 0x481b, 0x080c, 0x650d, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, | ||
| 8134 | 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, | ||
| 8135 | 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, | ||
| 8136 | 0x1f04, 0x7a3d, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, | ||
| 8137 | 0x7803, 0x0000, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, | ||
| 8138 | 0x00fe, 0x015e, 0x012e, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, | ||
| 8139 | 0x00d6, 0x00c6, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2069, | ||
| 8140 | 0x0100, 0x2079, 0x0140, 0x2071, 0xafc7, 0x703c, 0x2060, 0x8cff, | ||
| 8141 | 0x0904, 0x7ad5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, | ||
| 8142 | 0x68c7, 0x0000, 0x68cb, 0x0008, 0x080c, 0x658e, 0x080c, 0x20b5, | ||
| 8143 | 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, 0x0169, 0x2404, | ||
| 8144 | 0xa084, 0x000f, 0xa086, 0x0004, 0x11b0, 0x68c7, 0x0000, 0x68cb, | ||
| 8145 | 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0020, 0x2071, 0xb01e, 0x6814, | ||
| 8146 | 0xa084, 0x0184, 0xa085, 0x0012, 0x6816, 0x7803, 0x0008, 0x7003, | ||
| 8147 | 0x0000, 0x00fe, 0x00ee, 0x200b, 0x0000, 0x004e, 0xa39d, 0x0000, | ||
| 8148 | 0x1120, 0x2009, 0x0049, 0x080c, 0x80a7, 0x20a9, 0x03e8, 0x6824, | ||
| 8149 | 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, | ||
| 8150 | 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, | ||
| 8151 | 0x0002, 0x0010, 0x1f04, 0x7ab7, 0x7804, 0xa084, 0x1000, 0x0120, | ||
| 8152 | 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, | ||
| 8153 | 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, | ||
| 8154 | 0x0126, 0x2091, 0x8000, 0x2069, 0xafc7, 0x6a06, 0x012e, 0x00de, | ||
| 8155 | 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xafc7, 0x6a32, | ||
| 8156 | 0x012e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, | ||
| 8157 | 0x0126, 0x2071, 0xafc7, 0x7614, 0x2660, 0x2678, 0x2091, 0x8000, | ||
| 8158 | 0x8cff, 0x0538, 0x601c, 0xa206, 0x1500, 0x7014, 0xac36, 0x1110, | ||
| 8159 | 0x660c, 0x7616, 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, | ||
| 8160 | 0x2f00, 0x7012, 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, | ||
| 8161 | 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, | ||
| 8162 | 0x974e, 0x080c, 0x7b88, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, | ||
| 8163 | 0x08b8, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, | ||
| 8164 | 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x73cf, 0x7810, 0x20a2, | ||
| 8165 | 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, | ||
| 8166 | 0x7b80, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x73cf, 0x7810, | ||
| 8167 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, | ||
| 8168 | 0x0478, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x73cf, 0x7810, | ||
| 8169 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, | ||
| 8170 | 0x00f8, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x73cf, 0x7810, | ||
| 8171 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, | ||
| 8172 | 0x0078, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x73cf, 0x7810, | ||
| 8173 | 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, | ||
| 8174 | 0x0089, 0x60c3, 0x0020, 0x080c, 0x7821, 0x014e, 0x015e, 0x0005, | ||
| 8175 | 0x00e6, 0x2071, 0xafc7, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, | ||
| 8176 | 0x00ee, 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x7b94, 0x20a2, | ||
| 8177 | 0x20a2, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, | ||
| 8178 | 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xafc7, 0x7614, 0x2660, | ||
| 8179 | 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x7c24, 0x8cff, 0x0904, | ||
| 8180 | 0x7c24, 0x601c, 0xa086, 0x0006, 0x1904, 0x7c1f, 0x88ff, 0x0138, | ||
| 8181 | 0x2800, 0xac06, 0x1904, 0x7c1f, 0x2039, 0x0000, 0x0050, 0x6018, | ||
| 8182 | 0xa206, 0x1904, 0x7c1f, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, | ||
| 8183 | 0x7c1f, 0x7024, 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, | ||
| 8184 | 0x01f0, 0x080c, 0x6581, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, | ||
| 8185 | 0x7ca8, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0xa384, | ||
| 8186 | 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, 0x2069, 0x0100, | ||
| 8187 | 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0020, 0x6003, | ||
| 8188 | 0x0009, 0x630a, 0x0460, 0x7014, 0xac36, 0x1110, 0x660c, 0x7616, | ||
| 8189 | 0x7010, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7012, | ||
| 8190 | 0x0010, 0x7013, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, | ||
| 8191 | 0x7e0e, 0x0008, 0x2678, 0x89ff, 0x1158, 0x600f, 0x0000, 0x6010, | ||
| 8192 | 0x2068, 0x080c, 0x9596, 0x0110, 0x080c, 0xa91f, 0x080c, 0x974e, | ||
| 8193 | 0x080c, 0x7b88, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x7bab, 0x2c78, | ||
| 8194 | 0x600c, 0x2060, 0x0804, 0x7bab, 0xa006, 0x012e, 0x000e, 0x006e, | ||
| 8195 | 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6017, 0x0000, | ||
| 8196 | 0x00ce, 0xa8c5, 0x0001, 0x0c88, 0x00f6, 0x00e6, 0x00d6, 0x00c6, | ||
| 8197 | 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xafc7, | ||
| 8198 | 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x7c98, 0x601c, 0xa086, | ||
| 8199 | 0x0006, 0x1904, 0x7c93, 0x87ff, 0x0128, 0x2700, 0xac06, 0x1904, | ||
| 8200 | 0x7c93, 0x0040, 0x6018, 0xa206, 0x15f0, 0x85ff, 0x0118, 0x6050, | ||
| 8201 | 0xa106, 0x15c8, 0x703c, 0xac06, 0x1170, 0x0036, 0x2019, 0x0001, | ||
| 8202 | 0x080c, 0x7a64, 0x7033, 0x0000, 0x703f, 0x0000, 0x7043, 0x0000, | ||
| 8203 | 0x7047, 0x0000, 0x003e, 0x7038, 0xac36, 0x1110, 0x660c, 0x763a, | ||
| 8204 | 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x7036, | ||
| 8205 | 0x0010, 0x7037, 0x0000, 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, | ||
| 8206 | 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, | ||
| 8207 | 0x9596, 0x0110, 0x080c, 0xa91f, 0x080c, 0x974e, 0x87ff, 0x1190, | ||
| 8208 | 0x00ce, 0x0804, 0x7c43, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7c43, | ||
| 8209 | 0xa006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, | ||
| 8210 | 0x00fe, 0x0005, 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, | ||
| 8211 | 0x00e6, 0x2071, 0xafc7, 0x2001, 0xad00, 0x2004, 0xa086, 0x0002, | ||
| 8212 | 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, | ||
| 8213 | 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, | ||
| 8214 | 0x8000, 0x2071, 0xafc7, 0x2c10, 0x7638, 0x2660, 0x2678, 0x8cff, | ||
| 8215 | 0x0518, 0x2200, 0xac06, 0x11e0, 0x7038, 0xac36, 0x1110, 0x660c, | ||
| 8216 | 0x763a, 0x7034, 0xac36, 0x1140, 0x2c00, 0xaf36, 0x0118, 0x2f00, | ||
| 8217 | 0x7036, 0x0010, 0x7037, 0x0000, 0x660c, 0x2c00, 0xaf06, 0x0110, | ||
| 8218 | 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0xa085, 0x0001, 0x0020, | ||
| 8219 | 0x2c78, 0x600c, 0x2060, 0x08d8, 0x012e, 0x000e, 0x002e, 0x006e, | ||
| 8220 | 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, | ||
| 8221 | 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xafc7, 0x760c, | ||
| 8222 | 0x2660, 0x2678, 0x8cff, 0x0904, 0x7d7e, 0x6018, 0xa080, 0x0028, | ||
| 8223 | 0x2004, 0xa206, 0x1904, 0x7d79, 0x7024, 0xac06, 0x1508, 0x2069, | ||
| 8224 | 0x0100, 0x68c0, 0xa005, 0x0904, 0x7d55, 0x080c, 0x7834, 0x68c3, | ||
| 8225 | 0x0000, 0x080c, 0x7ca8, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, | ||
| 8226 | 0x6b04, 0xa384, 0x1000, 0x0120, 0x6803, 0x0100, 0x6803, 0x0000, | ||
| 8227 | 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, | ||
| 8228 | 0x700c, 0xac36, 0x1110, 0x660c, 0x760e, 0x7008, 0xac36, 0x1140, | ||
| 8229 | 0x2c00, 0xaf36, 0x0118, 0x2f00, 0x700a, 0x0010, 0x700b, 0x0000, | ||
| 8230 | 0x660c, 0x0066, 0x2c00, 0xaf06, 0x0110, 0x7e0e, 0x0008, 0x2678, | ||
| 8231 | 0x600f, 0x0000, 0x080c, 0x9778, 0x1158, 0x080c, 0x2aff, 0x080c, | ||
| 8232 | 0x9789, 0x11f0, 0x080c, 0x85f3, 0x00d8, 0x080c, 0x7ca8, 0x08c0, | ||
| 8233 | 0x080c, 0x9789, 0x1118, 0x080c, 0x85f3, 0x0090, 0x6010, 0x2068, | ||
| 8234 | 0x080c, 0x9596, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, | ||
| 8235 | 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x510c, 0x080c, 0x9742, | ||
| 8236 | 0x080c, 0x994e, 0x080c, 0x974e, 0x080c, 0x7b88, 0x00ce, 0x0804, | ||
| 8237 | 0x7d02, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7d02, 0x012e, 0x000e, | ||
| 8238 | 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, | ||
| 8239 | 0x0006, 0x1d30, 0x080c, 0xa91f, 0x0c18, 0x0036, 0x0156, 0x0136, | ||
| 8240 | 0x0146, 0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x28f9, | ||
| 8241 | 0x1118, 0x8210, 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, | ||
| 8242 | 0x2198, 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, | ||
| 8243 | 0x003e, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, | ||
| 8244 | 0x0200, 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, | ||
| 8245 | 0x0000, 0x2099, 0xafa6, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, | ||
| 8246 | 0x20a3, 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x7821, | ||
| 8247 | 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, 0x0214, | ||
| 8248 | 0x20a3, 0x0018, 0x20a3, 0x0800, 0x7810, 0xa084, 0xff00, 0x20a2, | ||
| 8249 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, | ||
| 8250 | 0x7810, 0xa084, 0x00ff, 0x20a2, 0x7828, 0x20a2, 0x20a3, 0x0000, | ||
| 8251 | 0x20a3, 0x0000, 0x60c3, 0x0018, 0x080c, 0x7821, 0x0005, 0x00d6, | ||
| 8252 | 0x0016, 0x2f68, 0x2009, 0x0035, 0x080c, 0x9a34, 0x1904, 0x7e5d, | ||
| 8253 | 0x20a1, 0x020b, 0x080c, 0x710e, 0x20a3, 0x1300, 0x20a3, 0x0000, | ||
| 8254 | 0x7828, 0x2068, 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, | ||
| 8255 | 0x0028, 0x2014, 0x2001, 0xad34, 0x2004, 0xd0ac, 0x11d0, 0xa286, | ||
| 8256 | 0x007e, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x04b8, 0xa286, | ||
| 8257 | 0x007f, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffd, 0x0478, 0xd2bc, | ||
| 8258 | 0x0180, 0xa286, 0x0080, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffc, | ||
| 8259 | 0x0428, 0xa2e8, 0xae34, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, | ||
| 8260 | 0x00e8, 0x20a3, 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xad34, | ||
| 8261 | 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, | ||
| 8262 | 0x007e, 0x0240, 0x00d6, 0x2069, 0xad1b, 0x2da6, 0x8d68, 0x2da6, | ||
| 8263 | 0x00de, 0x0020, 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, | ||
| 8264 | 0x7838, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, | ||
| 8265 | 0x080c, 0x7821, 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, | ||
| 8266 | 0x0006, 0x001e, 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, | ||
| 8267 | 0x691c, 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x7ed3, | ||
| 8268 | 0xa186, 0x0005, 0x0904, 0x7ebc, 0xa186, 0x0004, 0x05b8, 0xa186, | ||
| 8269 | 0x0008, 0x0904, 0x7ec4, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, | ||
| 8270 | 0x7f3b, 0x002e, 0x00de, 0x0005, 0x080c, 0x7ef7, 0x2009, 0x4000, | ||
| 8271 | 0x6800, 0x0002, 0x7e9d, 0x7ea8, 0x7e9f, 0x7ea8, 0x7ea4, 0x7e9d, | ||
| 8272 | 0x7e9d, 0x7ea8, 0x7ea8, 0x7ea8, 0x7ea8, 0x7e9d, 0x7e9d, 0x7e9d, | ||
| 8273 | 0x7e9d, 0x7e9d, 0x7ea8, 0x7e9d, 0x7ea8, 0x080c, 0x14f6, 0x6820, | ||
| 8274 | 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, | ||
| 8275 | 0x6828, 0x20a2, 0x682c, 0x20a2, 0x0804, 0x7eed, 0x080c, 0x7ef7, | ||
| 8276 | 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2009, 0x4000, 0x6a00, 0xa286, | ||
| 8277 | 0x0002, 0x1108, 0xa00e, 0x0488, 0x04d1, 0x20a3, 0x0000, 0x20a3, | ||
| 8278 | 0x0000, 0x2009, 0x4000, 0x0448, 0x0491, 0x20a3, 0x0000, 0x20a3, | ||
| 8279 | 0x0000, 0x2009, 0x4000, 0xa286, 0x0005, 0x0118, 0xa286, 0x0002, | ||
| 8280 | 0x1108, 0xa00e, 0x00d0, 0x0419, 0x6810, 0x2068, 0x697c, 0x6810, | ||
| 8281 | 0xa112, 0x6980, 0x6814, 0xa103, 0x20a2, 0x22a2, 0x7928, 0xa180, | ||
| 8282 | 0x0000, 0x2004, 0xa08e, 0x0002, 0x0130, 0xa08e, 0x0004, 0x0118, | ||
| 8283 | 0x2009, 0x4000, 0x0010, 0x2009, 0x0000, 0x21a2, 0x20a3, 0x0000, | ||
| 8284 | 0x60c3, 0x0018, 0x080c, 0x7821, 0x002e, 0x00de, 0x0005, 0x0036, | ||
| 8285 | 0x0046, 0x0056, 0x0066, 0x20a1, 0x020b, 0x080c, 0x71aa, 0xa006, | ||
| 8286 | 0x20a3, 0x0200, 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, | ||
| 8287 | 0xa080, 0x0028, 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1118, | ||
| 8288 | 0xa092, 0x007e, 0x0268, 0x00d6, 0x2069, 0xad1b, 0x2d2c, 0x8d68, | ||
| 8289 | 0x2d34, 0xa0e8, 0xae34, 0x2d6c, 0x6b10, 0x6c14, 0x00de, 0x0030, | ||
| 8290 | 0x2019, 0x0000, 0x6498, 0x2029, 0x0000, 0x6634, 0x7828, 0xa080, | ||
| 8291 | 0x0007, 0x2004, 0xa086, 0x0003, 0x1128, 0x25a2, 0x26a2, 0x23a2, | ||
| 8292 | 0x24a2, 0x0020, 0x23a2, 0x24a2, 0x25a2, 0x26a2, 0x006e, 0x005e, | ||
| 8293 | 0x004e, 0x003e, 0x0005, 0x20a1, 0x020b, 0x080c, 0x71aa, 0x20a3, | ||
| 8294 | 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, | ||
| 8295 | 0x0008, 0x080c, 0x7821, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7106, | ||
| 8296 | 0x20a3, 0x1400, 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, | ||
| 8297 | 0x7828, 0x20a2, 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, | ||
| 8298 | 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0010, 0x080c, 0x7821, 0x0005, | ||
| 8299 | 0x20a1, 0x020b, 0x080c, 0x71a2, 0x20a3, 0x0100, 0x20a3, 0x0000, | ||
| 8300 | 0x7828, 0x20a2, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7821, | ||
| 8301 | 0x0005, 0x0146, 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, | ||
| 8302 | 0x7821, 0x014e, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, | ||
| 8303 | 0xa080, 0x0028, 0x2004, 0x2011, 0xad34, 0x2214, 0xd2ac, 0x1110, | ||
| 8304 | 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, 0xa085, | ||
| 8305 | 0x0300, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xad1b, 0x2da6, 0x8d68, | ||
| 8306 | 0x2da6, 0x00de, 0x0078, 0x00d6, 0xa0e8, 0xae34, 0x2d6c, 0x6810, | ||
| 8307 | 0xa085, 0x0300, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, | ||
| 8308 | 0x6234, 0x22a2, 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x7810, | ||
| 8309 | 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x7a08, 0x22a2, 0x20a3, 0x0000, | ||
| 8310 | 0x20a3, 0x0000, 0x0005, 0x20a1, 0x020b, 0x0079, 0x7910, 0x21a2, | ||
| 8311 | 0x20a3, 0x0000, 0x60c3, 0x0000, 0x20e1, 0x9080, 0x60a7, 0x9575, | ||
| 8312 | 0x080c, 0x782b, 0x080c, 0x6578, 0x0005, 0x0156, 0x0136, 0x0036, | ||
| 8313 | 0x00d6, 0x00e6, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7854, 0x2068, | ||
| 8314 | 0xadf0, 0x000f, 0x7210, 0xa296, 0x00c0, 0xa294, 0xfffd, 0x7212, | ||
| 8315 | 0x7214, 0xa294, 0x0300, 0x7216, 0x7100, 0xa194, 0x00ff, 0x7308, | ||
| 8316 | 0xa384, 0x00ff, 0xa08d, 0xc200, 0x7102, 0xa384, 0xff00, 0xa215, | ||
| 8317 | 0x720a, 0x7004, 0x720c, 0x700e, 0x7206, 0x20a9, 0x000a, 0x2e98, | ||
| 8318 | 0x53a6, 0x60a3, 0x0035, 0x6a38, 0xa294, 0x7000, 0xa286, 0x3000, | ||
| 8319 | 0x0110, 0x60a3, 0x0037, 0x00ee, 0x00de, 0x003e, 0x013e, 0x015e, | ||
| 8320 | 0x0005, 0x2009, 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, | ||
| 8321 | 0x6116, 0x0005, 0x2061, 0xb400, 0x2a70, 0x7064, 0x7046, 0x704b, | ||
| 8322 | 0xb400, 0x0005, 0x00e6, 0x0126, 0x2071, 0xad00, 0x2091, 0x8000, | ||
| 8323 | 0x7544, 0xa582, 0x0010, 0x0608, 0x7048, 0x2060, 0x6000, 0xa086, | ||
| 8324 | 0x0000, 0x0148, 0xace0, 0x0018, 0x7058, 0xac02, 0x1208, 0x0cb0, | ||
| 8325 | 0x2061, 0xb400, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, | ||
| 8326 | 0x0018, 0x7058, 0xa502, 0x1230, 0x754a, 0xa085, 0x0001, 0x012e, | ||
| 8327 | 0x00ee, 0x0005, 0x704b, 0xb400, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, | ||
| 8328 | 0x2071, 0xad00, 0x7544, 0xa582, 0x0010, 0x0600, 0x7048, 0x2060, | ||
| 8329 | 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x7058, 0xac02, | ||
| 8330 | 0x1208, 0x0cb0, 0x2061, 0xb400, 0x0c98, 0x6003, 0x0008, 0x8529, | ||
| 8331 | 0x7546, 0xaca8, 0x0018, 0x7058, 0xa502, 0x1228, 0x754a, 0xa085, | ||
| 8332 | 0x0001, 0x00ee, 0x0005, 0x704b, 0xb400, 0x0cc8, 0xa006, 0x0cc8, | ||
| 8333 | 0xac82, 0xb400, 0x0a0c, 0x14f6, 0x2001, 0xad16, 0x2004, 0xac02, | ||
| 8334 | 0x1a0c, 0x14f6, 0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, | ||
| 8335 | 0x601a, 0x601f, 0x0000, 0x6003, 0x0000, 0x6052, 0x6056, 0x6022, | ||
| 8336 | 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x2061, | ||
| 8337 | 0xad00, 0x6044, 0x8000, 0x6046, 0xa086, 0x0001, 0x0108, 0x0005, | ||
| 8338 | 0x0126, 0x2091, 0x8000, 0x080c, 0x6c50, 0x012e, 0x0cc0, 0x601c, | ||
| 8339 | 0xa084, 0x000f, 0x0002, 0x80b6, 0x80c5, 0x80e0, 0x80fb, 0x9a61, | ||
| 8340 | 0x9a7c, 0x9a97, 0x80b6, 0x80c5, 0x80b6, 0x8116, 0xa186, 0x0013, | ||
| 8341 | 0x1128, 0x080c, 0x6b73, 0x080c, 0x6c50, 0x0005, 0xa18e, 0x0047, | ||
| 8342 | 0x1118, 0xa016, 0x080c, 0x1824, 0x0005, 0x0066, 0x6000, 0xa0b2, | ||
| 8343 | 0x0010, 0x1a0c, 0x14f6, 0x0013, 0x006e, 0x0005, 0x80de, 0x8478, | ||
| 8344 | 0x862d, 0x80de, 0x86a2, 0x81cf, 0x80de, 0x80de, 0x840a, 0x8a91, | ||
| 8345 | 0x80de, 0x80de, 0x80de, 0x80de, 0x80de, 0x80de, 0x080c, 0x14f6, | ||
| 8346 | 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x14f6, 0x0013, 0x006e, | ||
| 8347 | 0x0005, 0x80f9, 0x909a, 0x80f9, 0x80f9, 0x80f9, 0x80f9, 0x80f9, | ||
| 8348 | 0x80f9, 0x9045, 0x9200, 0x80f9, 0x90c7, 0x913e, 0x90c7, 0x913e, | ||
| 8349 | 0x80f9, 0x080c, 0x14f6, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, | ||
| 8350 | 0x14f6, 0x0013, 0x006e, 0x0005, 0x8114, 0x8ad2, 0x8b98, 0x8cb8, | ||
| 8351 | 0x8e12, 0x8114, 0x8114, 0x8114, 0x8aac, 0x8ff5, 0x8ff8, 0x8114, | ||
| 8352 | 0x8114, 0x8114, 0x8114, 0x9022, 0x080c, 0x14f6, 0x0066, 0x6000, | ||
| 8353 | 0xa0b2, 0x0010, 0x1a0c, 0x14f6, 0x0013, 0x006e, 0x0005, 0x812f, | ||
| 8354 | 0x812f, 0x812f, 0x8152, 0x81a5, 0x812f, 0x812f, 0x812f, 0x8131, | ||
| 8355 | 0x812f, 0x812f, 0x812f, 0x812f, 0x812f, 0x812f, 0x812f, 0x080c, | ||
| 8356 | 0x14f6, 0xa186, 0x0003, 0x190c, 0x14f6, 0x00d6, 0x6003, 0x0003, | ||
| 8357 | 0x6106, 0x6010, 0x2068, 0x684f, 0x0040, 0x687c, 0x680a, 0x6880, | ||
| 8358 | 0x680e, 0x6813, 0x0000, 0x6817, 0x0000, 0x00de, 0x2c10, 0x080c, | ||
| 8359 | 0x1e6e, 0x080c, 0x680b, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d0d, | ||
| 8360 | 0x012e, 0x0005, 0xa182, 0x0047, 0x0002, 0x815e, 0x815e, 0x8160, | ||
| 8361 | 0x817f, 0x815e, 0x815e, 0x815e, 0x815e, 0x8191, 0x080c, 0x14f6, | ||
| 8362 | 0x00d6, 0x0016, 0x080c, 0x6c05, 0x080c, 0x6d0d, 0x6003, 0x0004, | ||
| 8363 | 0x6110, 0x2168, 0x6854, 0x8003, 0x800b, 0x810b, 0xa108, 0x6116, | ||
| 8364 | 0x684f, 0x0020, 0x685c, 0x685a, 0x6874, 0x687e, 0x6878, 0x6882, | ||
| 8365 | 0x6897, 0x0000, 0x689b, 0x0000, 0x001e, 0x00de, 0x0005, 0x080c, | ||
| 8366 | 0x6c05, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9596, 0x0120, 0x684b, | ||
| 8367 | 0x0006, 0x080c, 0x510c, 0x00de, 0x080c, 0x8078, 0x080c, 0x6d0d, | ||
| 8368 | 0x0005, 0x080c, 0x6c05, 0x080c, 0x2ad9, 0x00d6, 0x6110, 0x2168, | ||
| 8369 | 0x080c, 0x9596, 0x0120, 0x684b, 0x0029, 0x080c, 0x510c, 0x00de, | ||
| 8370 | 0x080c, 0x8078, 0x080c, 0x6d0d, 0x0005, 0xa182, 0x0047, 0x0002, | ||
| 8371 | 0x81b3, 0x81c2, 0x81b1, 0x81b1, 0x81b1, 0x81b1, 0x81b1, 0x81b1, | ||
| 8372 | 0x81b1, 0x080c, 0x14f6, 0x00d6, 0x6010, 0x2068, 0x684c, 0xc0f4, | ||
| 8373 | 0x684e, 0x00de, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, | ||
| 8374 | 0x1824, 0x0005, 0x00d6, 0x6110, 0x2168, 0x684b, 0x0000, 0x6853, | ||
| 8375 | 0x0000, 0x080c, 0x510c, 0x00de, 0x080c, 0x8078, 0x0005, 0xa1b6, | ||
| 8376 | 0x0015, 0x1118, 0x080c, 0x8078, 0x0030, 0xa1b6, 0x0016, 0x190c, | ||
| 8377 | 0x14f6, 0x080c, 0x8078, 0x0005, 0x20a9, 0x000e, 0x2e98, 0x6010, | ||
| 8378 | 0x20a0, 0x53a3, 0x20a9, 0x0006, 0x3310, 0x3420, 0x9398, 0x94a0, | ||
| 8379 | 0x3318, 0x3428, 0x222e, 0x2326, 0xa290, 0x0002, 0xa5a8, 0x0002, | ||
| 8380 | 0xa398, 0x0002, 0xa4a0, 0x0002, 0x1f04, 0x81ea, 0x00e6, 0x080c, | ||
| 8381 | 0x9596, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, 0x7037, 0x0103, | ||
| 8382 | 0x00ee, 0x080c, 0x8078, 0x0005, 0x00d6, 0x0036, 0x7330, 0xa386, | ||
| 8383 | 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, 0x6817, 0xfffd, | ||
| 8384 | 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, | ||
| 8385 | 0x6b32, 0x080c, 0x8078, 0x003e, 0x00de, 0x0005, 0x0016, 0x20a9, | ||
| 8386 | 0x002a, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, | ||
| 8387 | 0x53a3, 0x20a9, 0x002a, 0x6010, 0xa080, 0x0001, 0x2004, 0xa080, | ||
| 8388 | 0x0002, 0x20a0, 0x53a3, 0x00e6, 0x6010, 0x2004, 0x2070, 0x7037, | ||
| 8389 | 0x0103, 0x00ee, 0x080c, 0x8078, 0x001e, 0x0005, 0x0016, 0x2009, | ||
| 8390 | 0x0000, 0x7030, 0xa086, 0x0100, 0x0140, 0x7038, 0xa084, 0x00ff, | ||
| 8391 | 0x808e, 0x703c, 0xa084, 0x00ff, 0x8086, 0xa080, 0x0004, 0xa108, | ||
| 8392 | 0x21a8, 0xae80, 0x000c, 0x2098, 0x6010, 0xa080, 0x0002, 0x20a0, | ||
| 8393 | 0x080c, 0x48be, 0x00e6, 0x080c, 0x9596, 0x0140, 0x6010, 0x2070, | ||
| 8394 | 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, 0x00ee, 0x080c, | ||
| 8395 | 0x8078, 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, | ||
| 8396 | 0x0016, 0x2009, 0x0035, 0x080c, 0x9a34, 0x001e, 0x1168, 0x0026, | ||
| 8397 | 0x6228, 0x2268, 0x002e, 0x2071, 0xb28c, 0x6b1c, 0xa386, 0x0003, | ||
| 8398 | 0x0130, 0xa386, 0x0006, 0x0128, 0x080c, 0x8078, 0x0020, 0x0031, | ||
| 8399 | 0x0010, 0x080c, 0x8323, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, | ||
| 8400 | 0x2078, 0xa186, 0x0015, 0x0904, 0x830c, 0xa18e, 0x0016, 0x1904, | ||
| 8401 | 0x8321, 0x700c, 0xa084, 0xff00, 0xa086, 0x1700, 0x1904, 0x82eb, | ||
| 8402 | 0x8fff, 0x0904, 0x831f, 0x6808, 0xa086, 0xffff, 0x1904, 0x830e, | ||
| 8403 | 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, | ||
| 8404 | 0xa106, 0x1904, 0x830e, 0x7980, 0x7814, 0xa106, 0x1904, 0x830e, | ||
| 8405 | 0x080c, 0x9742, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, | ||
| 8406 | 0x784e, 0x0026, 0xa00e, 0x6a14, 0x2001, 0x000a, 0x080c, 0x6665, | ||
| 8407 | 0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, | ||
| 8408 | 0x00c6, 0x2d60, 0x080c, 0x9374, 0x00ce, 0x0804, 0x831f, 0x00c6, | ||
| 8409 | 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4993, 0x0010, | ||
| 8410 | 0x080c, 0x4b7c, 0x00de, 0x00ce, 0x1548, 0x00c6, 0x2d60, 0x080c, | ||
| 8411 | 0x8078, 0x00ce, 0x04a0, 0x7008, 0xa086, 0x000b, 0x11a0, 0x6018, | ||
| 8412 | 0x200c, 0xc1bc, 0x2102, 0x00c6, 0x2d60, 0x7853, 0x0003, 0x6007, | ||
| 8413 | 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x67a8, 0x080c, | ||
| 8414 | 0x6c50, 0x00ce, 0x00e0, 0x700c, 0xa086, 0x2a00, 0x1138, 0x2001, | ||
| 8415 | 0xafa5, 0x2004, 0x683e, 0x0098, 0x0471, 0x0098, 0x8fff, 0x090c, | ||
| 8416 | 0x14f6, 0x00c6, 0x00d6, 0x2d60, 0x2f68, 0x684b, 0x0003, 0x080c, | ||
| 8417 | 0x926f, 0x080c, 0x9742, 0x080c, 0x974e, 0x00de, 0x00ce, 0x080c, | ||
| 8418 | 0x8078, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, 0xafa5, | ||
| 8419 | 0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, | ||
| 8420 | 0x2060, 0x080c, 0xabb4, 0x080c, 0x6618, 0x080c, 0x8078, 0x00ce, | ||
| 8421 | 0x080c, 0x8078, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, | ||
| 8422 | 0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xafa5, 0x2004, 0x683e, 0x0804, | ||
| 8423 | 0x839d, 0x00c6, 0x2d60, 0x080c, 0x928f, 0x00ce, 0x6804, 0xa086, | ||
| 8424 | 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, | ||
| 8425 | 0x0050, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x00ce, 0x04f0, 0x6800, | ||
| 8426 | 0xa086, 0x000f, 0x01c8, 0x8fff, 0x090c, 0x14f6, 0x6820, 0xd0dc, | ||
| 8427 | 0x1198, 0x6800, 0xa086, 0x0004, 0x1198, 0x784c, 0xd0ac, 0x0180, | ||
| 8428 | 0x784c, 0xc0dc, 0xc0f4, 0x784e, 0x7850, 0xc0f4, 0xc0fc, 0x7852, | ||
| 8429 | 0x2001, 0x0001, 0x682e, 0x00e0, 0x2001, 0x0007, 0x682e, 0x00c0, | ||
| 8430 | 0x784c, 0xd0b4, 0x1130, 0xd0ac, 0x0db8, 0x784c, 0xd0f4, 0x1da0, | ||
| 8431 | 0x0c38, 0xd2ec, 0x1d88, 0x7024, 0xa306, 0x1118, 0x7020, 0xa406, | ||
| 8432 | 0x0d58, 0x7020, 0x6836, 0x7024, 0x683a, 0x2001, 0x0005, 0x682e, | ||
| 8433 | 0x080c, 0x9894, 0x080c, 0x6c50, 0x0010, 0x080c, 0x8078, 0x004e, | ||
| 8434 | 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, | ||
| 8435 | 0x6a1c, 0xa286, 0x0007, 0x0904, 0x83ee, 0xa286, 0x0002, 0x05f0, | ||
| 8436 | 0xa286, 0x0000, 0x05d8, 0x6808, 0x6338, 0xa306, 0x15b8, 0x2071, | ||
| 8437 | 0xb28c, 0xa186, 0x0015, 0x0560, 0xa18e, 0x0016, 0x1190, 0x6030, | ||
| 8438 | 0xa084, 0x00ff, 0xa086, 0x0001, 0x1160, 0x700c, 0xa086, 0x2a00, | ||
| 8439 | 0x1140, 0x6034, 0xa080, 0x0008, 0x200c, 0xc1dd, 0xc1f5, 0x2102, | ||
| 8440 | 0x00b8, 0x00c6, 0x6034, 0x2060, 0x6010, 0x2068, 0x080c, 0x9596, | ||
| 8441 | 0x090c, 0x14f6, 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, | ||
| 8442 | 0x601f, 0x0002, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x00ce, 0x0030, | ||
| 8443 | 0x6034, 0x2070, 0x2001, 0xafa5, 0x2004, 0x703e, 0x080c, 0x8078, | ||
| 8444 | 0x002e, 0x00de, 0x00ee, 0x0005, 0x00d6, 0x20a9, 0x000e, 0x2e98, | ||
| 8445 | 0x6010, 0x20a0, 0x53a3, 0xa1b6, 0x0015, 0x1148, 0x6018, 0x2068, | ||
| 8446 | 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, | ||
| 8447 | 0x0804, 0x81f6, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x14f6, 0xa1b2, | ||
| 8448 | 0x0040, 0x1a04, 0x846e, 0x0002, 0x8462, 0x8456, 0x8462, 0x8462, | ||
| 8449 | 0x8462, 0x8462, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, | ||
| 8450 | 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, | ||
| 8451 | 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, | ||
| 8452 | 0x8454, 0x8454, 0x8454, 0x8462, 0x8454, 0x8462, 0x8462, 0x8454, | ||
| 8453 | 0x8454, 0x8454, 0x8454, 0x8454, 0x8462, 0x8454, 0x8454, 0x8454, | ||
| 8454 | 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8462, 0x8462, | ||
| 8455 | 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, 0x8454, | ||
| 8456 | 0x8454, 0x8462, 0x8454, 0x8454, 0x080c, 0x14f6, 0x6003, 0x0001, | ||
| 8457 | 0x6106, 0x080c, 0x67ee, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c50, | ||
| 8458 | 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x67ee, 0x0126, | ||
| 8459 | 0x2091, 0x8000, 0x080c, 0x6c50, 0x012e, 0x0005, 0x2600, 0x0002, | ||
| 8460 | 0x8462, 0x8476, 0x8476, 0x8462, 0x8462, 0x8476, 0x080c, 0x14f6, | ||
| 8461 | 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x14f6, 0xa1b6, 0x0013, 0x0904, | ||
| 8462 | 0x8518, 0xa1b6, 0x0027, 0x1904, 0x84de, 0x080c, 0x6b73, 0x6004, | ||
| 8463 | 0x080c, 0x9778, 0x0188, 0x080c, 0x9789, 0x0904, 0x84d8, 0xa08e, | ||
| 8464 | 0x0021, 0x0904, 0x84db, 0xa08e, 0x0022, 0x0904, 0x84d8, 0xa08e, | ||
| 8465 | 0x003d, 0x0904, 0x84db, 0x04a8, 0x080c, 0x2aff, 0x2001, 0x0007, | ||
| 8466 | 0x080c, 0x4c30, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x85f3, | ||
| 8467 | 0xa186, 0x007e, 0x1148, 0x2001, 0xad34, 0x2014, 0xc285, 0x080c, | ||
| 8468 | 0x574f, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, | ||
| 8469 | 0x2019, 0x0028, 0x080c, 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, | ||
| 8470 | 0x681d, 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x4ecf, 0x00ce, | ||
| 8471 | 0x2c08, 0x080c, 0xa712, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, | ||
| 8472 | 0x4c9f, 0x080c, 0x994e, 0x080c, 0x8078, 0x080c, 0x6c50, 0x0005, | ||
| 8473 | 0x080c, 0x85f3, 0x0cb0, 0x080c, 0x8621, 0x0c98, 0xa186, 0x0014, | ||
| 8474 | 0x1db0, 0x080c, 0x6b73, 0x080c, 0x2ad9, 0x080c, 0x9778, 0x1188, | ||
| 8475 | 0x080c, 0x2aff, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x85f3, | ||
| 8476 | 0xa186, 0x007e, 0x1128, 0x2001, 0xad34, 0x200c, 0xc185, 0x2102, | ||
| 8477 | 0x08c0, 0x080c, 0x9789, 0x1118, 0x080c, 0x85f3, 0x0890, 0x6004, | ||
| 8478 | 0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xad81, 0x2079, | ||
| 8479 | 0x0000, 0x080c, 0x2df1, 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, | ||
| 8480 | 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x85f3, 0x0804, 0x84d1, | ||
| 8481 | 0xa0b2, 0x0040, 0x1a04, 0x85db, 0x2008, 0x0002, 0x8560, 0x8561, | ||
| 8482 | 0x8564, 0x8567, 0x856a, 0x856d, 0x855e, 0x855e, 0x855e, 0x855e, | ||
| 8483 | 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, | ||
| 8484 | 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, | ||
| 8485 | 0x855e, 0x855e, 0x855e, 0x855e, 0x8570, 0x857f, 0x855e, 0x8581, | ||
| 8486 | 0x857f, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x857f, 0x857f, | ||
| 8487 | 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, 0x855e, | ||
| 8488 | 0x85bb, 0x857f, 0x855e, 0x857b, 0x855e, 0x855e, 0x855e, 0x857c, | ||
| 8489 | 0x855e, 0x855e, 0x855e, 0x857f, 0x85b2, 0x855e, 0x080c, 0x14f6, | ||
| 8490 | 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, | ||
| 8491 | 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, | ||
| 8492 | 0x080c, 0x6b73, 0x6003, 0x0005, 0x2001, 0xafa5, 0x2004, 0x603e, | ||
| 8493 | 0x080c, 0x6c50, 0x00a0, 0x0018, 0x0010, 0x080c, 0x4c30, 0x0804, | ||
| 8494 | 0x85cc, 0x080c, 0x6b73, 0x2001, 0xafa3, 0x2004, 0x6016, 0x2001, | ||
| 8495 | 0xafa5, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x6c50, 0x0005, | ||
| 8496 | 0x080c, 0x4c30, 0x080c, 0x6b73, 0x6003, 0x0002, 0x2001, 0xafa5, | ||
| 8497 | 0x2004, 0x603e, 0x0036, 0x2019, 0xad5c, 0x2304, 0xa084, 0xff00, | ||
| 8498 | 0x1120, 0x2001, 0xafa3, 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, | ||
| 8499 | 0x0ec0, 0x8003, 0x801b, 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, | ||
| 8500 | 0x6c50, 0x08e8, 0x080c, 0x6b73, 0x080c, 0x994e, 0x080c, 0x8078, | ||
| 8501 | 0x080c, 0x6c50, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xad81, 0x2079, | ||
| 8502 | 0x0000, 0x080c, 0x2df1, 0x00fe, 0x00ee, 0x080c, 0x6b73, 0x080c, | ||
| 8503 | 0x8078, 0x080c, 0x6c50, 0x0818, 0x080c, 0x6b73, 0x2001, 0xafa5, | ||
| 8504 | 0x2004, 0x603e, 0x6003, 0x0002, 0x2001, 0xafa3, 0x2004, 0x6016, | ||
| 8505 | 0x080c, 0x6c50, 0x0005, 0x2600, 0x2008, 0x0002, 0x85e6, 0x85e4, | ||
| 8506 | 0x85e4, 0x85cc, 0x85cc, 0x85e4, 0x080c, 0x14f6, 0x080c, 0x6b73, | ||
| 8507 | 0x00d6, 0x6010, 0x2068, 0x080c, 0x15f0, 0x00de, 0x080c, 0x8078, | ||
| 8508 | 0x080c, 0x6c50, 0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0x9596, | ||
| 8509 | 0x0508, 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, | ||
| 8510 | 0x0030, 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0x9a05, 0x0090, | ||
| 8511 | 0x7038, 0xd0fc, 0x0178, 0x7007, 0x0000, 0x0016, 0x6004, 0xa08e, | ||
| 8512 | 0x0021, 0x0160, 0xa08e, 0x003d, 0x0148, 0x001e, 0x7037, 0x0103, | ||
| 8513 | 0x7033, 0x0100, 0x001e, 0x002e, 0x00ee, 0x0005, 0x001e, 0x0009, | ||
| 8514 | 0x0cc8, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, 0x2070, 0x7037, | ||
| 8515 | 0x0103, 0x7023, 0x8001, 0x00ee, 0x0005, 0x00d6, 0x6618, 0x2668, | ||
| 8516 | 0x6804, 0xa084, 0x00ff, 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x14f6, | ||
| 8517 | 0x6604, 0xa6b6, 0x0043, 0x1120, 0x080c, 0x99c1, 0x0804, 0x8692, | ||
| 8518 | 0x6604, 0xa6b6, 0x0033, 0x1120, 0x080c, 0x9971, 0x0804, 0x8692, | ||
| 8519 | 0x6604, 0xa6b6, 0x0028, 0x1120, 0x080c, 0x97b9, 0x0804, 0x8692, | ||
| 8520 | 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x97d0, 0x04d8, 0x6604, | ||
| 8521 | 0xa6b6, 0x001f, 0x1118, 0x080c, 0x81dc, 0x04a0, 0x6604, 0xa6b6, | ||
| 8522 | 0x0000, 0x1118, 0x080c, 0x83f4, 0x0468, 0x6604, 0xa6b6, 0x0022, | ||
| 8523 | 0x1118, 0x080c, 0x8204, 0x0430, 0x6604, 0xa6b6, 0x0035, 0x1118, | ||
| 8524 | 0x080c, 0x826b, 0x00f8, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, | ||
| 8525 | 0x83a3, 0x00c0, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x821e, | ||
| 8526 | 0x0088, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x823e, 0x0050, | ||
| 8527 | 0xa1b6, 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, | ||
| 8528 | 0x0804, 0x883f, 0x0005, 0x080c, 0x80be, 0x0ce0, 0x86b9, 0x86bc, | ||
| 8529 | 0x86b9, 0x86fe, 0x86b9, 0x87cc, 0x884d, 0x86b9, 0x86b9, 0x881b, | ||
| 8530 | 0x86b9, 0x882f, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, | ||
| 8531 | 0x3e20, 0x2c10, 0x080c, 0x1824, 0x0005, 0x00e6, 0xacf0, 0x0004, | ||
| 8532 | 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x8078, | ||
| 8533 | 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xad00, 0x7080, | ||
| 8534 | 0xa086, 0x0074, 0x1530, 0x080c, 0xa6e9, 0x11b0, 0x00d6, 0x6018, | ||
| 8535 | 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, 0xc0c5, | ||
| 8536 | 0x6802, 0x00d9, 0x00de, 0x2001, 0x0006, 0x080c, 0x4c30, 0x080c, | ||
| 8537 | 0x2aff, 0x080c, 0x8078, 0x0078, 0x2001, 0x000a, 0x080c, 0x4c30, | ||
| 8538 | 0x080c, 0x2aff, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x67ee, | ||
| 8539 | 0x0010, 0x080c, 0x87bd, 0x00ee, 0x0005, 0x6800, 0xd084, 0x0168, | ||
| 8540 | 0x2001, 0x0000, 0x080c, 0x4c1e, 0x2069, 0xad51, 0x6804, 0xd0a4, | ||
| 8541 | 0x0120, 0x2001, 0x0006, 0x080c, 0x4c5d, 0x0005, 0x00d6, 0x2011, | ||
| 8542 | 0xad20, 0x2204, 0xa086, 0x0074, 0x1904, 0x87ba, 0x6018, 0x2068, | ||
| 8543 | 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, 0x894d, 0x0804, 0x875e, | ||
| 8544 | 0x080c, 0x8943, 0x6018, 0x2068, 0xa080, 0x0028, 0x2014, 0xa286, | ||
| 8545 | 0x0080, 0x11c0, 0x6813, 0x00ff, 0x6817, 0xfffc, 0x6010, 0xa005, | ||
| 8546 | 0x0138, 0x2068, 0x6807, 0x0000, 0x6837, 0x0103, 0x6833, 0x0200, | ||
| 8547 | 0x2001, 0x0006, 0x080c, 0x4c30, 0x080c, 0x2aff, 0x080c, 0x8078, | ||
| 8548 | 0x0804, 0x87bb, 0x00e6, 0x2071, 0xad34, 0x2e04, 0xd09c, 0x0188, | ||
| 8549 | 0x2071, 0xb280, 0x7108, 0x720c, 0xa18c, 0x00ff, 0x1118, 0xa284, | ||
| 8550 | 0xff00, 0x0138, 0x6018, 0x2070, 0x70a0, 0xd0bc, 0x1110, 0x7112, | ||
| 8551 | 0x7216, 0x00ee, 0x6010, 0xa005, 0x0128, 0x2068, 0x6838, 0xd0f4, | ||
| 8552 | 0x0108, 0x0880, 0x2001, 0x0004, 0x080c, 0x4c30, 0x6003, 0x0001, | ||
| 8553 | 0x6007, 0x0003, 0x080c, 0x67ee, 0x0804, 0x87bb, 0x685c, 0xd0e4, | ||
| 8554 | 0x01d0, 0x080c, 0x9903, 0x080c, 0x574f, 0x0110, 0xd0dc, 0x1900, | ||
| 8555 | 0x2011, 0xad34, 0x2204, 0xc0ad, 0x2012, 0x2001, 0xaf8e, 0x2004, | ||
| 8556 | 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x26cb, 0x78e2, | ||
| 8557 | 0x00fe, 0x0804, 0x8728, 0x080c, 0x9937, 0x2011, 0xad34, 0x2204, | ||
| 8558 | 0xc0a5, 0x2012, 0x0006, 0x080c, 0xa801, 0x000e, 0x1904, 0x8728, | ||
| 8559 | 0xc0b5, 0x2012, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x00c6, 0x2009, | ||
| 8560 | 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x00fe, | ||
| 8561 | 0x080c, 0x26a0, 0x00f6, 0x2079, 0xad00, 0x7972, 0x2100, 0x2009, | ||
| 8562 | 0x0000, 0x080c, 0x2676, 0x794e, 0x00fe, 0x8108, 0x080c, 0x4c80, | ||
| 8563 | 0x2c00, 0x00ce, 0x1904, 0x8728, 0x601a, 0x2001, 0x0002, 0x080c, | ||
| 8564 | 0x4c30, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, | ||
| 8565 | 0x67ee, 0x0008, 0x0011, 0x00de, 0x0005, 0x2001, 0xad00, 0x2004, | ||
| 8566 | 0xa086, 0x0003, 0x0120, 0x2001, 0x0007, 0x080c, 0x4c30, 0x080c, | ||
| 8567 | 0x2aff, 0x080c, 0x8078, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, | ||
| 8568 | 0xad00, 0x7080, 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, | ||
| 8569 | 0x1128, 0x6010, 0xa005, 0x1110, 0x080c, 0x3cce, 0x00d6, 0x6018, | ||
| 8570 | 0x2068, 0x080c, 0x4d72, 0x080c, 0x86ed, 0x00de, 0x080c, 0x89f7, | ||
| 8571 | 0x1550, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, | ||
| 8572 | 0x2001, 0x0006, 0x080c, 0x4c30, 0x00e6, 0x6010, 0xa075, 0x01a8, | ||
| 8573 | 0x7034, 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, | ||
| 8574 | 0x2009, 0x0000, 0x2011, 0x4000, 0x080c, 0x9a05, 0x0030, 0x7007, | ||
| 8575 | 0x0000, 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2aff, | ||
| 8576 | 0x080c, 0x8078, 0x0020, 0x080c, 0x85f3, 0x080c, 0x87bd, 0x001e, | ||
| 8577 | 0x002e, 0x00ee, 0x0005, 0x2011, 0xad20, 0x2204, 0xa086, 0x0014, | ||
| 8578 | 0x1158, 0x2001, 0x0002, 0x080c, 0x4c30, 0x6003, 0x0001, 0x6007, | ||
| 8579 | 0x0001, 0x080c, 0x67ee, 0x0010, 0x080c, 0x87bd, 0x0005, 0x2011, | ||
| 8580 | 0xad20, 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, | ||
| 8581 | 0x4c30, 0x080c, 0x8078, 0x0010, 0x080c, 0x87bd, 0x0005, 0x000b, | ||
| 8582 | 0x0005, 0x86b9, 0x8854, 0x86b9, 0x888a, 0x86b9, 0x88ff, 0x884d, | ||
| 8583 | 0x86b9, 0x86b9, 0x8912, 0x86b9, 0x8922, 0x6604, 0xa6b6, 0x001e, | ||
| 8584 | 0x1110, 0x080c, 0x8078, 0x0005, 0x00d6, 0x00c6, 0x080c, 0x8932, | ||
| 8585 | 0x1178, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x2001, 0x0002, 0x080c, | ||
| 8586 | 0x4c30, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x67ee, 0x00f8, | ||
| 8587 | 0x2009, 0xb28e, 0x2104, 0xa086, 0x0009, 0x1160, 0x6018, 0x2068, | ||
| 8588 | 0x6840, 0xa084, 0x00ff, 0xa005, 0x0180, 0x8001, 0x6842, 0x6017, | ||
| 8589 | 0x000a, 0x0068, 0x2009, 0xb28f, 0x2104, 0xa084, 0xff00, 0xa086, | ||
| 8590 | 0x1900, 0x1118, 0x080c, 0x8078, 0x0010, 0x080c, 0x87bd, 0x00ce, | ||
| 8591 | 0x00de, 0x0005, 0x080c, 0x8940, 0x00d6, 0x2069, 0xaf9d, 0x2d04, | ||
| 8592 | 0xa005, 0x0168, 0x6018, 0x2068, 0x68a0, 0xa086, 0x007e, 0x1138, | ||
| 8593 | 0x2069, 0xad1c, 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, | ||
| 8594 | 0x0078, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x2001, 0x0002, 0x080c, | ||
| 8595 | 0x4c30, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x67ee, 0x0428, | ||
| 8596 | 0x080c, 0x85f3, 0x2009, 0xb28e, 0x2134, 0xa6b4, 0x00ff, 0xa686, | ||
| 8597 | 0x0005, 0x01e0, 0xa686, 0x000b, 0x01b0, 0x2009, 0xb28f, 0x2104, | ||
| 8598 | 0xa084, 0xff00, 0x1118, 0xa686, 0x0009, 0x0180, 0xa086, 0x1900, | ||
| 8599 | 0x1150, 0xa686, 0x0009, 0x0150, 0x2001, 0x0004, 0x080c, 0x4c30, | ||
| 8600 | 0x080c, 0x8078, 0x0010, 0x080c, 0x87bd, 0x0005, 0x00d6, 0x6010, | ||
| 8601 | 0x2068, 0x080c, 0x9596, 0x0128, 0x6838, 0xd0fc, 0x0110, 0x00de, | ||
| 8602 | 0x0c90, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0140, | ||
| 8603 | 0x8001, 0x6842, 0x6017, 0x000a, 0x6007, 0x0016, 0x00de, 0x0c28, | ||
| 8604 | 0x68a0, 0xa086, 0x007e, 0x1138, 0x00e6, 0x2071, 0xad00, 0x080c, | ||
| 8605 | 0x48f5, 0x00ee, 0x0010, 0x080c, 0x2ad9, 0x00de, 0x08a0, 0x080c, | ||
| 8606 | 0x8940, 0x1158, 0x2001, 0x0004, 0x080c, 0x4c30, 0x6003, 0x0001, | ||
| 8607 | 0x6007, 0x0003, 0x080c, 0x67ee, 0x0020, 0x080c, 0x85f3, 0x080c, | ||
| 8608 | 0x87bd, 0x0005, 0x0469, 0x1158, 0x2001, 0x0008, 0x080c, 0x4c30, | ||
| 8609 | 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x67ee, 0x0010, 0x080c, | ||
| 8610 | 0x87bd, 0x0005, 0x00e9, 0x1158, 0x2001, 0x000a, 0x080c, 0x4c30, | ||
| 8611 | 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x67ee, 0x0010, 0x080c, | ||
| 8612 | 0x87bd, 0x0005, 0x2009, 0xb28e, 0x2104, 0xa086, 0x0003, 0x1138, | ||
| 8613 | 0x2009, 0xb28f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, | ||
| 8614 | 0xa085, 0x0001, 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, | ||
| 8615 | 0x080c, 0x4ceb, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, | ||
| 8616 | 0x0036, 0x0016, 0x6018, 0x2068, 0x2071, 0xad34, 0x2e04, 0xa085, | ||
| 8617 | 0x0003, 0x2072, 0x080c, 0x89cc, 0x0538, 0x2001, 0xad52, 0x2004, | ||
| 8618 | 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a, 0x080c, 0xa96c, | ||
| 8619 | 0x2001, 0xad0c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, | ||
| 8620 | 0x0001, 0x080c, 0x2aac, 0x2071, 0xad00, 0x080c, 0x28fa, 0x00c6, | ||
| 8621 | 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, 0x080c, 0x2bc9, 0x8108, | ||
| 8622 | 0x1f04, 0x897d, 0x015e, 0x00ce, 0x080c, 0x8943, 0x6813, 0x00ff, | ||
| 8623 | 0x6817, 0xfffe, 0x2071, 0xb280, 0x2079, 0x0100, 0x2e04, 0xa084, | ||
| 8624 | 0x00ff, 0x2069, 0xad1b, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, | ||
| 8625 | 0x2069, 0xad1c, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0xa084, | ||
| 8626 | 0xff00, 0x001e, 0xa105, 0x2009, 0xad27, 0x200a, 0x2200, 0xa084, | ||
| 8627 | 0x00ff, 0x2008, 0x080c, 0x26a0, 0x080c, 0x574f, 0x0170, 0x2069, | ||
| 8628 | 0xb28e, 0x2071, 0xaf9f, 0x6810, 0x2072, 0x6814, 0x7006, 0x6818, | ||
| 8629 | 0x700a, 0x681c, 0x700e, 0x080c, 0x9903, 0x0040, 0x2001, 0x0006, | ||
| 8630 | 0x080c, 0x4c30, 0x080c, 0x2aff, 0x080c, 0x8078, 0x001e, 0x003e, | ||
| 8631 | 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036, 0x00e6, 0x0156, | ||
| 8632 | 0x2019, 0xad27, 0x231c, 0x83ff, 0x01e8, 0x2071, 0xb280, 0x2e14, | ||
| 8633 | 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, 0xa306, 0x1190, | ||
| 8634 | 0x2011, 0xb296, 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x8a7c, | ||
| 8635 | 0x1148, 0x2011, 0xb29a, 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c, | ||
| 8636 | 0x8a7c, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, 0x0005, 0x00e6, | ||
| 8637 | 0x2071, 0xb28c, 0x7004, 0xa086, 0x0014, 0x11a8, 0x7008, 0xa086, | ||
| 8638 | 0x0800, 0x1188, 0x700c, 0xd0ec, 0x0160, 0xa084, 0x0f00, 0xa086, | ||
| 8639 | 0x0100, 0x1138, 0x7024, 0xd0a4, 0x1110, 0xd0ac, 0x0110, 0xa006, | ||
| 8640 | 0x0010, 0xa085, 0x0001, 0x00ee, 0x0005, 0x00e6, 0x00d6, 0x00c6, | ||
| 8641 | 0x0076, 0x0056, 0x0046, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, | ||
| 8642 | 0x2029, 0xafd0, 0x252c, 0x2021, 0xafd6, 0x2424, 0x2061, 0xb400, | ||
| 8643 | 0x2071, 0xad00, 0x7244, 0x7064, 0xa202, 0x16f0, 0x080c, 0xa990, | ||
| 8644 | 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, 0xa786, 0x0007, 0x0568, | ||
| 8645 | 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, 0x0538, 0x00c6, 0x6000, | ||
| 8646 | 0xa086, 0x0004, 0x1110, 0x080c, 0x190b, 0xa786, 0x0008, 0x1148, | ||
| 8647 | 0x080c, 0x9789, 0x1130, 0x00ce, 0x080c, 0x85f3, 0x080c, 0x974e, | ||
| 8648 | 0x00a0, 0x6010, 0x2068, 0x080c, 0x9596, 0x0160, 0xa786, 0x0003, | ||
| 8649 | 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x510c, | ||
| 8650 | 0x080c, 0x9742, 0x080c, 0x974e, 0x00ce, 0xace0, 0x0018, 0x7058, | ||
| 8651 | 0xac02, 0x1210, 0x0804, 0x8a2a, 0x012e, 0x000e, 0x002e, 0x004e, | ||
| 8652 | 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0xa786, 0x0006, | ||
| 8653 | 0x1d00, 0x080c, 0xa91f, 0x0c30, 0x220c, 0x2304, 0xa106, 0x1130, | ||
| 8654 | 0x8210, 0x8318, 0x1f04, 0x8a7c, 0xa006, 0x0005, 0x2304, 0xa102, | ||
| 8655 | 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, | ||
| 8656 | 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x14f6, 0x080c, 0x9778, | ||
| 8657 | 0x0120, 0x080c, 0x9789, 0x0168, 0x0028, 0x080c, 0x2aff, 0x080c, | ||
| 8658 | 0x9789, 0x0138, 0x080c, 0x6b73, 0x080c, 0x8078, 0x080c, 0x6c50, | ||
| 8659 | 0x0005, 0x080c, 0x85f3, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x8ac2, | ||
| 8660 | 0x8ac2, 0x8ac2, 0x8ac2, 0x8ac2, 0x8ac2, 0x8ac2, 0x8ac2, 0x8ac2, | ||
| 8661 | 0x8ac2, 0x8ac2, 0x8ac4, 0x8ac4, 0x8ac4, 0x8ac4, 0x8ac2, 0x8ac2, | ||
| 8662 | 0x8ac2, 0x8ac4, 0x080c, 0x14f6, 0x600b, 0xffff, 0x6003, 0x0001, | ||
| 8663 | 0x6106, 0x080c, 0x67a8, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c50, | ||
| 8664 | 0x012e, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, | ||
| 8665 | 0x0804, 0x8b5e, 0xa186, 0x0027, 0x11e8, 0x080c, 0x6b73, 0x080c, | ||
| 8666 | 0x2ad9, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9596, 0x0168, 0x6837, | ||
| 8667 | 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, | ||
| 8668 | 0x080c, 0x510c, 0x080c, 0x9742, 0x00de, 0x080c, 0x8078, 0x080c, | ||
| 8669 | 0x6c50, 0x0005, 0xa186, 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, | ||
| 8670 | 0x0428, 0xa186, 0x0046, 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, | ||
| 8671 | 0x0047, 0x190c, 0x14f6, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, | ||
| 8672 | 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6699, | ||
| 8673 | 0x002e, 0x001e, 0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, | ||
| 8674 | 0x1110, 0x0804, 0x8b98, 0x080c, 0x80be, 0x0005, 0x0002, 0x8b3c, | ||
| 8675 | 0x8b3a, 0x8b3a, 0x8b3a, 0x8b3a, 0x8b3a, 0x8b3a, 0x8b3a, 0x8b3a, | ||
| 8676 | 0x8b3a, 0x8b3a, 0x8b57, 0x8b57, 0x8b57, 0x8b57, 0x8b3a, 0x8b57, | ||
| 8677 | 0x8b3a, 0x8b57, 0x080c, 0x14f6, 0x080c, 0x6b73, 0x00d6, 0x6110, | ||
| 8678 | 0x2168, 0x080c, 0x9596, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, | ||
| 8679 | 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x080c, 0x510c, 0x080c, | ||
| 8680 | 0x9742, 0x00de, 0x080c, 0x8078, 0x080c, 0x6c50, 0x0005, 0x080c, | ||
| 8681 | 0x6b73, 0x080c, 0x8078, 0x080c, 0x6c50, 0x0005, 0x0002, 0x8b74, | ||
| 8682 | 0x8b72, 0x8b72, 0x8b72, 0x8b72, 0x8b72, 0x8b72, 0x8b72, 0x8b72, | ||
| 8683 | 0x8b72, 0x8b72, 0x8b86, 0x8b86, 0x8b86, 0x8b86, 0x8b72, 0x8b91, | ||
| 8684 | 0x8b72, 0x8b86, 0x080c, 0x14f6, 0x080c, 0x6b73, 0x2001, 0xafa5, | ||
| 8685 | 0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x6c50, 0x6010, 0xa088, | ||
| 8686 | 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x6b73, | ||
| 8687 | 0x2001, 0xafa5, 0x2004, 0x603e, 0x6003, 0x000f, 0x080c, 0x6c50, | ||
| 8688 | 0x0005, 0x080c, 0x6b73, 0x080c, 0x8078, 0x080c, 0x6c50, 0x0005, | ||
| 8689 | 0xa182, 0x0040, 0x0002, 0x8bae, 0x8bae, 0x8bae, 0x8bae, 0x8bae, | ||
| 8690 | 0x8bb0, 0x8c88, 0x8ca9, 0x8bae, 0x8bae, 0x8bae, 0x8bae, 0x8bae, | ||
| 8691 | 0x8bae, 0x8bae, 0x8bae, 0x8bae, 0x8bae, 0x8bae, 0x080c, 0x14f6, | ||
| 8692 | 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xb280, 0x7124, 0x610a, | ||
| 8693 | 0x2071, 0xb28c, 0x6110, 0x2168, 0x7614, 0xa6b4, 0x0fff, 0x86ff, | ||
| 8694 | 0x0904, 0x8c54, 0xa68c, 0x0c00, 0x01e8, 0x00f6, 0x2c78, 0x080c, | ||
| 8695 | 0x5029, 0x00fe, 0x0198, 0x684c, 0xd0ac, 0x0180, 0x6020, 0xd0dc, | ||
| 8696 | 0x1168, 0x6850, 0xd0bc, 0x1150, 0x7318, 0x6814, 0xa306, 0x1904, | ||
| 8697 | 0x8c66, 0x731c, 0x6810, 0xa306, 0x1904, 0x8c66, 0x7318, 0x6b62, | ||
| 8698 | 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, | ||
| 8699 | 0x0028, 0x1128, 0x080c, 0x9767, 0x684b, 0x001c, 0x00e8, 0xd6dc, | ||
| 8700 | 0x01a0, 0x684b, 0x0015, 0x684c, 0xd0ac, 0x0170, 0x6914, 0x6a10, | ||
| 8701 | 0x2100, 0xa205, 0x0148, 0x7018, 0xa106, 0x1118, 0x701c, 0xa206, | ||
| 8702 | 0x0118, 0x6962, 0x6a5e, 0xc6dc, 0x0038, 0xd6d4, 0x0118, 0x684b, | ||
| 8703 | 0x0007, 0x0010, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0xa01e, | ||
| 8704 | 0xd6c4, 0x01f0, 0xa686, 0x0100, 0x1140, 0x2001, 0xb299, 0x2004, | ||
| 8705 | 0xa005, 0x1118, 0xc6c4, 0x0804, 0x8bbf, 0x7328, 0x732c, 0x6b56, | ||
| 8706 | 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, | ||
| 8707 | 0x2308, 0x2019, 0xb298, 0xad90, 0x0019, 0x080c, 0x927f, 0x003e, | ||
| 8708 | 0xd6cc, 0x0904, 0x8c79, 0x7124, 0x695a, 0x81ff, 0x0904, 0x8c79, | ||
| 8709 | 0xa192, 0x0021, 0x1250, 0x2071, 0xb298, 0x831c, 0x2300, 0xae18, | ||
| 8710 | 0xad90, 0x001d, 0x080c, 0x927f, 0x04a0, 0x6838, 0xd0fc, 0x0120, | ||
| 8711 | 0x2009, 0x0020, 0x695a, 0x0c78, 0x00f6, 0x2d78, 0x080c, 0x9224, | ||
| 8712 | 0x00fe, 0x080c, 0x926f, 0x0438, 0x00f6, 0x2c78, 0x080c, 0x5029, | ||
| 8713 | 0x00fe, 0x0188, 0x684c, 0xd0ac, 0x0170, 0x6020, 0xd0dc, 0x1158, | ||
| 8714 | 0x6850, 0xd0bc, 0x1140, 0x684c, 0xd0f4, 0x1128, 0x080c, 0x9866, | ||
| 8715 | 0x00de, 0x00ee, 0x00e0, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, | ||
| 8716 | 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, | ||
| 8717 | 0x8e04, 0x080c, 0x510c, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, | ||
| 8718 | 0x080c, 0x9834, 0x00de, 0x00ee, 0x1110, 0x080c, 0x8078, 0x0005, | ||
| 8719 | 0x00f6, 0x6003, 0x0003, 0x2079, 0xb28c, 0x7c04, 0x7b00, 0x7e0c, | ||
| 8720 | 0x7d08, 0x6010, 0x2078, 0x784c, 0xd0ac, 0x0120, 0x6003, 0x0002, | ||
| 8721 | 0x00fe, 0x0005, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, 0x603f, | ||
| 8722 | 0x0000, 0x2c10, 0x080c, 0x1e6e, 0x080c, 0x680b, 0x080c, 0x6d0d, | ||
| 8723 | 0x0005, 0x2001, 0xafa5, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, | ||
| 8724 | 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1824, 0x0005, | ||
| 8725 | 0xa182, 0x0040, 0x0002, 0x8cce, 0x8cce, 0x8cce, 0x8cce, 0x8cce, | ||
| 8726 | 0x8cd0, 0x8d61, 0x8cce, 0x8cce, 0x8d77, 0x8ddb, 0x8cce, 0x8cce, | ||
| 8727 | 0x8cce, 0x8cce, 0x8dea, 0x8cce, 0x8cce, 0x8cce, 0x080c, 0x14f6, | ||
| 8728 | 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xb28c, 0x6110, 0x2178, | ||
| 8729 | 0x7614, 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, | ||
| 8730 | 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x8d5c, 0xa694, | ||
| 8731 | 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, | ||
| 8732 | 0xa284, 0x0300, 0x0904, 0x8d5c, 0x080c, 0x15d9, 0x090c, 0x14f6, | ||
| 8733 | 0x2d00, 0x784a, 0x7f4c, 0xc7cd, 0x7f4e, 0x6837, 0x0103, 0x7838, | ||
| 8734 | 0x683a, 0x783c, 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, | ||
| 8735 | 0x0120, 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, | ||
| 8736 | 0x0002, 0x0180, 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, | ||
| 8737 | 0xd6dc, 0x0118, 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, | ||
| 8738 | 0x0007, 0x0010, 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, | ||
| 8739 | 0x6856, 0xa01e, 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, | ||
| 8740 | 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, | ||
| 8741 | 0x2019, 0xb298, 0xad90, 0x0019, 0x080c, 0x927f, 0x003e, 0xd6cc, | ||
| 8742 | 0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, | ||
| 8743 | 0x2071, 0xb298, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, | ||
| 8744 | 0x927f, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, | ||
| 8745 | 0x0c78, 0x2d78, 0x080c, 0x9224, 0x00de, 0x00ee, 0x00fe, 0x007e, | ||
| 8746 | 0x0005, 0x00f6, 0x6003, 0x0003, 0x2079, 0xb28c, 0x7c04, 0x7b00, | ||
| 8747 | 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, | ||
| 8748 | 0x00fe, 0x2c10, 0x080c, 0x1e6e, 0x080c, 0x781a, 0x0005, 0x00d6, | ||
| 8749 | 0x00f6, 0x2c78, 0x080c, 0x5029, 0x00fe, 0x0120, 0x2001, 0xafa5, | ||
| 8750 | 0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x6c05, 0x080c, 0x6d0d, | ||
| 8751 | 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x8dd9, 0xd1cc, 0x0540, | ||
| 8752 | 0x6948, 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, | ||
| 8753 | 0x0006, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, | ||
| 8754 | 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x8da1, 0x015e, | ||
| 8755 | 0x000e, 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1600, | ||
| 8756 | 0x0418, 0x0016, 0x080c, 0x1600, 0x00de, 0x080c, 0x926f, 0x00e0, | ||
| 8757 | 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x0180, | ||
| 8758 | 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd1dc, 0x0118, | ||
| 8759 | 0x684b, 0x0015, 0x0038, 0xd1d4, 0x0118, 0x684b, 0x0007, 0x0010, | ||
| 8760 | 0x684b, 0x0000, 0x080c, 0x510c, 0x080c, 0x9834, 0x1110, 0x080c, | ||
| 8761 | 0x8078, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x7a64, 0x6003, | ||
| 8762 | 0x0002, 0x2001, 0xafa5, 0x2004, 0x603e, 0x080c, 0x6c05, 0x080c, | ||
| 8763 | 0x6d0d, 0x0005, 0x080c, 0x6c05, 0x080c, 0x2ad9, 0x00d6, 0x6110, | ||
| 8764 | 0x2168, 0x080c, 0x9596, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, | ||
| 8765 | 0x6847, 0x0000, 0x080c, 0x510c, 0x080c, 0x9742, 0x00de, 0x080c, | ||
| 8766 | 0x8078, 0x080c, 0x6d0d, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, | ||
| 8767 | 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, | ||
| 8768 | 0x685e, 0x0005, 0xa182, 0x0040, 0x0002, 0x8e28, 0x8e28, 0x8e28, | ||
| 8769 | 0x8e28, 0x8e28, 0x8e2a, 0x8e28, 0x8ee3, 0x8eef, 0x8e28, 0x8e28, | ||
| 8770 | 0x8e28, 0x8e28, 0x8e28, 0x8e28, 0x8e28, 0x8e28, 0x8e28, 0x8e28, | ||
| 8771 | 0x080c, 0x14f6, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xb28c, | ||
| 8772 | 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, | ||
| 8773 | 0x5029, 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, | ||
| 8774 | 0x0120, 0x080c, 0x9866, 0x0804, 0x8ede, 0x7e46, 0x7f4c, 0xc7e5, | ||
| 8775 | 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x8211, 0x6a3e, 0x86ff, 0x0904, | ||
| 8776 | 0x8ed4, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, | ||
| 8777 | 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0x8ed2, 0xa686, 0x0100, | ||
| 8778 | 0x1140, 0x2001, 0xb299, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x7e46, | ||
| 8779 | 0x0c28, 0x080c, 0x15d9, 0x090c, 0x14f6, 0x2d00, 0x784a, 0x7f4c, | ||
| 8780 | 0xa7bd, 0x0200, 0x7f4e, 0x6837, 0x0103, 0x7838, 0x683a, 0x783c, | ||
| 8781 | 0x683e, 0x7840, 0x6842, 0x6e46, 0xa68c, 0x0c00, 0x0120, 0x7318, | ||
| 8782 | 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0180, | ||
| 8783 | 0xa186, 0x0028, 0x1118, 0x684b, 0x001c, 0x0060, 0xd6dc, 0x0118, | ||
| 8784 | 0x684b, 0x0015, 0x0038, 0xd6d4, 0x0118, 0x684b, 0x0007, 0x0010, | ||
| 8785 | 0x684b, 0x0000, 0x6f4e, 0x7850, 0x6852, 0x7854, 0x6856, 0xa01e, | ||
| 8786 | 0xd6c4, 0x0198, 0x7328, 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, | ||
| 8787 | 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0xb298, | ||
| 8788 | 0xad90, 0x0019, 0x080c, 0x927f, 0x003e, 0xd6cc, 0x01d8, 0x7124, | ||
| 8789 | 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, 0xb298, | ||
| 8790 | 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x927f, 0x0050, | ||
| 8791 | 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, 0x2d78, | ||
| 8792 | 0x080c, 0x9224, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, 0x0001, | ||
| 8793 | 0x2071, 0xb28c, 0x7218, 0x731c, 0x080c, 0x186f, 0x00de, 0x00ee, | ||
| 8794 | 0x00fe, 0x007e, 0x0005, 0x2001, 0xafa5, 0x2004, 0x603e, 0x20e1, | ||
| 8795 | 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1824, 0x0005, 0x2001, | ||
| 8796 | 0xafa5, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002, 0x6110, 0x2168, | ||
| 8797 | 0x694c, 0xd1e4, 0x0904, 0x8ff3, 0x603f, 0x0000, 0x00f6, 0x2c78, | ||
| 8798 | 0x080c, 0x5029, 0x00fe, 0x0548, 0x6814, 0x6910, 0xa115, 0x0528, | ||
| 8799 | 0x6a60, 0xa206, 0x1118, 0x685c, 0xa106, 0x01f8, 0x684c, 0xc0e4, | ||
| 8800 | 0x684e, 0x6847, 0x0000, 0x6863, 0x0000, 0x685f, 0x0000, 0x697c, | ||
| 8801 | 0x6810, 0xa102, 0x603a, 0x6980, 0x6814, 0xa103, 0x6036, 0x6020, | ||
| 8802 | 0xc0f5, 0x6022, 0x00d6, 0x6018, 0x2068, 0x683c, 0x8000, 0x683e, | ||
| 8803 | 0x00de, 0x080c, 0x9866, 0x0804, 0x8ff3, 0x694c, 0xd1cc, 0x0904, | ||
| 8804 | 0x8fc3, 0x6948, 0x6838, 0xd0fc, 0x0904, 0x8f88, 0x0016, 0x684c, | ||
| 8805 | 0x0006, 0x6850, 0x0006, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, | ||
| 8806 | 0xa0b6, 0x0002, 0x01e0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, | ||
| 8807 | 0x784b, 0x001c, 0x00e8, 0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, | ||
| 8808 | 0x0015, 0x080c, 0x99ee, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, | ||
| 8809 | 0xd1d4, 0x0128, 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, | ||
| 8810 | 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x8e04, | ||
| 8811 | 0x6848, 0x784a, 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, | ||
| 8812 | 0xaf98, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, 0x2012, | ||
| 8813 | 0x8318, 0x8210, 0x1f04, 0x8f76, 0x015e, 0x00fe, 0x000e, 0x6852, | ||
| 8814 | 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1600, 0x0804, 0x8fee, | ||
| 8815 | 0x0016, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, | ||
| 8816 | 0x01e0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, | ||
| 8817 | 0x00e8, 0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, | ||
| 8818 | 0x99ee, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, | ||
| 8819 | 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, | ||
| 8820 | 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x8e04, 0x6860, 0x7862, | ||
| 8821 | 0x685c, 0x785e, 0x684c, 0x784e, 0x00fe, 0x080c, 0x1600, 0x00de, | ||
| 8822 | 0x080c, 0x926f, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, | ||
| 8823 | 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, | ||
| 8824 | 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0x99ee, 0x0118, | ||
| 8825 | 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, | ||
| 8826 | 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, | ||
| 8827 | 0xa115, 0x0110, 0x080c, 0x8e04, 0x080c, 0x510c, 0x080c, 0x9834, | ||
| 8828 | 0x1110, 0x080c, 0x8078, 0x00de, 0x0005, 0x080c, 0x6b73, 0x0010, | ||
| 8829 | 0x080c, 0x6c05, 0x080c, 0x9596, 0x01c0, 0x00d6, 0x6110, 0x2168, | ||
| 8830 | 0x6837, 0x0103, 0x2009, 0xad0c, 0x210c, 0xd18c, 0x11c0, 0xd184, | ||
| 8831 | 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xabfa, | ||
| 8832 | 0x6847, 0x0000, 0x080c, 0x510c, 0x00de, 0x080c, 0x8078, 0x080c, | ||
| 8833 | 0x6c50, 0x080c, 0x6d0d, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, | ||
| 8834 | 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0x9038, 0x9038, 0x9038, | ||
| 8835 | 0x9038, 0x9038, 0x903a, 0x9038, 0x903d, 0x9038, 0x9038, 0x9038, | ||
| 8836 | 0x9038, 0x9038, 0x9038, 0x9038, 0x9038, 0x9038, 0x9038, 0x9038, | ||
| 8837 | 0x080c, 0x14f6, 0x080c, 0x8078, 0x0005, 0x0006, 0x0026, 0xa016, | ||
| 8838 | 0x080c, 0x1824, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, | ||
| 8839 | 0x9051, 0x904f, 0x904f, 0x905d, 0x904f, 0x904f, 0x904f, 0x080c, | ||
| 8840 | 0x14f6, 0x6003, 0x0001, 0x6106, 0x080c, 0x67a8, 0x0126, 0x2091, | ||
| 8841 | 0x8000, 0x080c, 0x6c50, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, | ||
| 8842 | 0x00e6, 0x2071, 0xb280, 0x7224, 0x6212, 0x7220, 0x080c, 0x9586, | ||
| 8843 | 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, | ||
| 8844 | 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0x928f, 0x00ce, 0x0128, | ||
| 8845 | 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, | ||
| 8846 | 0x0001, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x00f6, 0x2278, 0x080c, | ||
| 8847 | 0x5029, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, | ||
| 8848 | 0x603f, 0x0000, 0x080c, 0x9866, 0x00ce, 0x00ee, 0x00de, 0x005e, | ||
| 8849 | 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, | ||
| 8850 | 0x0a0c, 0x14f6, 0xa08a, 0x008c, 0x1a0c, 0x14f6, 0xa082, 0x0085, | ||
| 8851 | 0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x14f6, | ||
| 8852 | 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, 0x90be, | ||
| 8853 | 0x90c0, 0x90c0, 0x90be, 0x90be, 0x90be, 0x90be, 0x080c, 0x14f6, | ||
| 8854 | 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, 0xa186, | ||
| 8855 | 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, | ||
| 8856 | 0x0027, 0x11e8, 0x080c, 0x6b73, 0x080c, 0x2ad9, 0x00d6, 0x6010, | ||
| 8857 | 0x2068, 0x080c, 0x9596, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, | ||
| 8858 | 0x684b, 0x0029, 0x080c, 0x510c, 0x080c, 0x9742, 0x00de, 0x080c, | ||
| 8859 | 0x8078, 0x080c, 0x6c50, 0x0005, 0x080c, 0x80be, 0x0ce0, 0xa186, | ||
| 8860 | 0x0014, 0x1dd0, 0x080c, 0x6b73, 0x00d6, 0x6010, 0x2068, 0x080c, | ||
| 8861 | 0x9596, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, | ||
| 8862 | 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0x910e, 0x910c, 0x910c, | ||
| 8863 | 0x910c, 0x910c, 0x910c, 0x9126, 0x080c, 0x14f6, 0x080c, 0x6b73, | ||
| 8864 | 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, | ||
| 8865 | 0x0035, 0x1118, 0x2001, 0xafa3, 0x0010, 0x2001, 0xafa4, 0x2004, | ||
| 8866 | 0x6016, 0x6003, 0x000c, 0x080c, 0x6c50, 0x0005, 0x080c, 0x6b73, | ||
| 8867 | 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, | ||
| 8868 | 0x0035, 0x1118, 0x2001, 0xafa3, 0x0010, 0x2001, 0xafa4, 0x2004, | ||
| 8869 | 0x6016, 0x6003, 0x000e, 0x080c, 0x6c50, 0x0005, 0xa182, 0x008c, | ||
| 8870 | 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x80be, 0x0005, | ||
| 8871 | 0x914f, 0x914f, 0x914f, 0x914f, 0x9151, 0x91a4, 0x914f, 0x080c, | ||
| 8872 | 0x14f6, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x5029, 0x00fe, 0x0168, | ||
| 8873 | 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, | ||
| 8874 | 0x0035, 0x1118, 0x00de, 0x0804, 0x91b7, 0x080c, 0x9742, 0x080c, | ||
| 8875 | 0x9596, 0x01c8, 0x6010, 0x2068, 0x6837, 0x0103, 0x6850, 0xd0b4, | ||
| 8876 | 0x0128, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, | ||
| 8877 | 0x684b, 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9803, 0x6847, | ||
| 8878 | 0x0000, 0x080c, 0x510c, 0x2c68, 0x080c, 0x8022, 0x01c0, 0x6003, | ||
| 8879 | 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0xb28e, 0x210c, | ||
| 8880 | 0x6136, 0x2009, 0xb28f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, | ||
| 8881 | 0x9956, 0x6950, 0x6152, 0x601f, 0x0001, 0x080c, 0x67a8, 0x2d60, | ||
| 8882 | 0x080c, 0x8078, 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5029, | ||
| 8883 | 0x00fe, 0x0598, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, | ||
| 8884 | 0x0130, 0xa186, 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, | ||
| 8885 | 0x2c68, 0x080c, 0x9a34, 0x1904, 0x91fc, 0x080c, 0x8022, 0x01d8, | ||
| 8886 | 0x6106, 0x6003, 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, | ||
| 8887 | 0x612a, 0x692c, 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, | ||
| 8888 | 0x6136, 0x6938, 0x613a, 0x6950, 0x6152, 0x080c, 0x9956, 0x080c, | ||
| 8889 | 0x67a8, 0x080c, 0x6c50, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, | ||
| 8890 | 0x080c, 0x9596, 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, | ||
| 8891 | 0xc0ec, 0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, | ||
| 8892 | 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9803, 0x6847, 0x0000, | ||
| 8893 | 0x080c, 0x510c, 0x080c, 0x9742, 0x00de, 0x080c, 0x8078, 0x0005, | ||
| 8894 | 0x0016, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9596, 0x0140, 0x6837, | ||
| 8895 | 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x080c, 0x510c, 0x00de, | ||
| 8896 | 0x001e, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, | ||
| 8897 | 0x0027, 0x0118, 0x080c, 0x80be, 0x0030, 0x080c, 0x6b73, 0x080c, | ||
| 8898 | 0x974e, 0x080c, 0x6c50, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, | ||
| 8899 | 0x2029, 0x0001, 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, | ||
| 8900 | 0x2130, 0x2069, 0xb298, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, | ||
| 8901 | 0xaf90, 0x001d, 0x080c, 0x927f, 0xa6b2, 0x0020, 0x7804, 0xa06d, | ||
| 8902 | 0x0110, 0x080c, 0x1600, 0x080c, 0x15d9, 0x0500, 0x8528, 0x6837, | ||
| 8903 | 0x0110, 0x683b, 0x0000, 0x2d20, 0x7c06, 0xa68a, 0x003d, 0x1228, | ||
| 8904 | 0x2608, 0xad90, 0x000f, 0x0459, 0x0088, 0xa6b2, 0x003c, 0x2009, | ||
| 8905 | 0x003c, 0x2d78, 0xad90, 0x000f, 0x0411, 0x0c28, 0x00fe, 0x852f, | ||
| 8906 | 0xa5ad, 0x0003, 0x7d36, 0xa5ac, 0x0000, 0x0028, 0x00fe, 0x852f, | ||
| 8907 | 0xa5ad, 0x0003, 0x7d36, 0x00de, 0x006e, 0x005e, 0x0005, 0x00f6, | ||
| 8908 | 0x8dff, 0x0158, 0x6804, 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, | ||
| 8909 | 0x510c, 0x2f68, 0x0cb8, 0x080c, 0x510c, 0x00fe, 0x0005, 0x0156, | ||
| 8910 | 0xa184, 0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, | ||
| 8911 | 0x2012, 0x8318, 0x8210, 0x1f04, 0x9286, 0x015e, 0x0005, 0x0066, | ||
| 8912 | 0x0126, 0x2091, 0x8000, 0x2031, 0x0001, 0x601c, 0xa084, 0x000f, | ||
| 8913 | 0x0083, 0x012e, 0x006e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0066, | ||
| 8914 | 0x2031, 0x0000, 0x601c, 0xa084, 0x000f, 0x001b, 0x006e, 0x012e, | ||
| 8915 | 0x0005, 0x92c3, 0x92c3, 0x92be, 0x92e5, 0x92b1, 0x92be, 0x92e5, | ||
| 8916 | 0x92be, 0x080c, 0x14f6, 0x0036, 0x2019, 0x0010, 0x080c, 0xa566, | ||
| 8917 | 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, 0x0005, | ||
| 8918 | 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, 0x2068, | ||
| 8919 | 0x080c, 0x9596, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, 0x684b, | ||
| 8920 | 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, 0x080c, | ||
| 8921 | 0x51df, 0x080c, 0x9803, 0x080c, 0x510c, 0x080c, 0x8078, 0xa085, | ||
| 8922 | 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, 0x0010, | ||
| 8923 | 0x1a0c, 0x14f6, 0x000b, 0x0005, 0x92fc, 0x9319, 0x92fe, 0x9338, | ||
| 8924 | 0x9316, 0x92fc, 0x92be, 0x92c3, 0x92c3, 0x92be, 0x92be, 0x92be, | ||
| 8925 | 0x92be, 0x92be, 0x92be, 0x92be, 0x080c, 0x14f6, 0x86ff, 0x1198, | ||
| 8926 | 0x00d6, 0x6010, 0x2068, 0x080c, 0x9596, 0x0110, 0x080c, 0x9803, | ||
| 8927 | 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, | ||
| 8928 | 0x67a8, 0x080c, 0x6c50, 0xa085, 0x0001, 0x0005, 0x080c, 0x190b, | ||
| 8929 | 0x0c28, 0x00e6, 0x2071, 0xafc7, 0x7024, 0xac06, 0x1110, 0x080c, | ||
| 8930 | 0x79e1, 0x601c, 0xa084, 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, | ||
| 8931 | 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x7b9a, 0x009e, 0x008e, | ||
| 8932 | 0x0010, 0x080c, 0x78de, 0x00ee, 0x1948, 0x080c, 0x92be, 0x0005, | ||
| 8933 | 0x0036, 0x00e6, 0x2071, 0xafc7, 0x703c, 0xac06, 0x1140, 0x2019, | ||
| 8934 | 0x0000, 0x080c, 0x7a64, 0x00ee, 0x003e, 0x0804, 0x92fe, 0x080c, | ||
| 8935 | 0x7cb8, 0x00ee, 0x003e, 0x1904, 0x92fe, 0x080c, 0x92be, 0x0005, | ||
| 8936 | 0x00c6, 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, 0x9369, | ||
| 8937 | 0x93d3, 0x9501, 0x9374, 0x974e, 0x9369, 0xa558, 0x8078, 0x93d3, | ||
| 8938 | 0x9362, 0x955f, 0x080c, 0x14f6, 0x080c, 0x9789, 0x1110, 0x080c, | ||
| 8939 | 0x85f3, 0x0005, 0x080c, 0x6b73, 0x080c, 0x6c50, 0x080c, 0x8078, | ||
| 8940 | 0x0005, 0x6017, 0x0001, 0x0005, 0x6010, 0xa080, 0x0019, 0x2c02, | ||
| 8941 | 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x14f6, 0x000b, 0x0005, 0x938f, | ||
| 8942 | 0x9391, 0x93b1, 0x93c3, 0x93d0, 0x938f, 0x9369, 0x9369, 0x9369, | ||
| 8943 | 0x93c3, 0x93c3, 0x938f, 0x938f, 0x938f, 0x938f, 0x93cd, 0x080c, | ||
| 8944 | 0x14f6, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, | ||
| 8945 | 0xafc7, 0x7024, 0xac06, 0x0190, 0x080c, 0x78de, 0x6007, 0x0085, | ||
| 8946 | 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xafa4, 0x2004, 0x6016, | ||
| 8947 | 0x080c, 0x67a8, 0x080c, 0x6c50, 0x00ee, 0x0005, 0x6017, 0x0001, | ||
| 8948 | 0x0cd8, 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, | ||
| 8949 | 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x67a8, | ||
| 8950 | 0x080c, 0x6c50, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, | ||
| 8951 | 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x8078, 0x0005, | ||
| 8952 | 0x080c, 0x190b, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x14f6, | ||
| 8953 | 0x000b, 0x0005, 0x93ea, 0x9371, 0x93ec, 0x93ea, 0x93ec, 0x93ec, | ||
| 8954 | 0x936a, 0x93ea, 0x9364, 0x9364, 0x93ea, 0x93ea, 0x93ea, 0x93ea, | ||
| 8955 | 0x93ea, 0x93ea, 0x080c, 0x14f6, 0x00d6, 0x6018, 0x2068, 0x6804, | ||
| 8956 | 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x14f6, 0x000b, | ||
| 8957 | 0x0005, 0x9405, 0x94a7, 0x9407, 0x9441, 0x9407, 0x9441, 0x9407, | ||
| 8958 | 0x9411, 0x9405, 0x9441, 0x9405, 0x942d, 0x080c, 0x14f6, 0x6004, | ||
| 8959 | 0xa08e, 0x0016, 0x0588, 0xa08e, 0x0004, 0x0570, 0xa08e, 0x0002, | ||
| 8960 | 0x0558, 0x6004, 0x080c, 0x9789, 0x0904, 0x94c0, 0xa08e, 0x0021, | ||
| 8961 | 0x0904, 0x94c4, 0xa08e, 0x0022, 0x0904, 0x94c0, 0xa08e, 0x003d, | ||
| 8962 | 0x0904, 0x94c4, 0xa08e, 0x0039, 0x0904, 0x94c8, 0xa08e, 0x0035, | ||
| 8963 | 0x0904, 0x94c8, 0xa08e, 0x001e, 0x0188, 0xa08e, 0x0001, 0x1150, | ||
| 8964 | 0x00d6, 0x6018, 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa086, | ||
| 8965 | 0x0006, 0x0110, 0x080c, 0x2ad9, 0x080c, 0x85f3, 0x080c, 0x974e, | ||
| 8966 | 0x0005, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0904, 0x9498, | ||
| 8967 | 0xa186, 0x0002, 0x1518, 0x6018, 0x2068, 0x2001, 0xad34, 0x2004, | ||
| 8968 | 0xd0ac, 0x1904, 0x94ea, 0x68a0, 0xd0bc, 0x1904, 0x94ea, 0x6840, | ||
| 8969 | 0xa084, 0x00ff, 0xa005, 0x0190, 0x8001, 0x6842, 0x6013, 0x0000, | ||
| 8970 | 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x080c, 0x8022, | ||
| 8971 | 0x0128, 0x2d00, 0x601a, 0x601f, 0x0001, 0x0450, 0x00de, 0x00ce, | ||
| 8972 | 0x6004, 0xa08e, 0x0002, 0x11a8, 0x6018, 0xa080, 0x0028, 0x2004, | ||
| 8973 | 0xa086, 0x007e, 0x1170, 0x2009, 0xad34, 0x2104, 0xc085, 0x200a, | ||
| 8974 | 0x00e6, 0x2071, 0xad00, 0x080c, 0x48f5, 0x00ee, 0x080c, 0x85f3, | ||
| 8975 | 0x0020, 0x080c, 0x85f3, 0x080c, 0x2ad9, 0x00e6, 0x0126, 0x2091, | ||
| 8976 | 0x8000, 0x080c, 0x2aff, 0x012e, 0x00ee, 0x080c, 0x974e, 0x0005, | ||
| 8977 | 0x2001, 0x0002, 0x080c, 0x4c30, 0x6003, 0x0001, 0x6007, 0x0002, | ||
| 8978 | 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00de, 0x00ce, 0x0c80, 0x00c6, | ||
| 8979 | 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d58, 0x6018, 0x2068, 0x6840, | ||
| 8980 | 0xa084, 0x00ff, 0xa005, 0x0904, 0x946e, 0x8001, 0x6842, 0x6003, | ||
| 8981 | 0x0001, 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00de, 0x00ce, 0x08b8, | ||
| 8982 | 0x080c, 0x85f3, 0x0804, 0x943e, 0x080c, 0x8621, 0x0804, 0x943e, | ||
| 8983 | 0x00d6, 0x2c68, 0x6104, 0x080c, 0x9a34, 0x00de, 0x0118, 0x080c, | ||
| 8984 | 0x8078, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, | ||
| 8985 | 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, | ||
| 8986 | 0x600a, 0x2001, 0xafa4, 0x2004, 0x6016, 0x080c, 0x67a8, 0x080c, | ||
| 8987 | 0x6c50, 0x0005, 0x00de, 0x00ce, 0x080c, 0x85f3, 0x080c, 0x2ad9, | ||
| 8988 | 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2aff, 0x6013, 0x0000, | ||
| 8989 | 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e, 0x00ee, | ||
| 8990 | 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x14f6, 0x000b, 0x0005, | ||
| 8991 | 0x9518, 0x9518, 0x9518, 0x9518, 0x9518, 0x9518, 0x9518, 0x9518, | ||
| 8992 | 0x9518, 0x9369, 0x9518, 0x9371, 0x951a, 0x9371, 0x9527, 0x9518, | ||
| 8993 | 0x080c, 0x14f6, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, | ||
| 8994 | 0x6003, 0x000d, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0005, 0x080c, | ||
| 8995 | 0x9742, 0x080c, 0x9596, 0x0580, 0x080c, 0x2ad9, 0x00d6, 0x080c, | ||
| 8996 | 0x9596, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, | ||
| 8997 | 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x510c, 0x2c68, | ||
| 8998 | 0x080c, 0x8022, 0x0150, 0x6818, 0x601a, 0x080c, 0x9956, 0x00c6, | ||
| 8999 | 0x2d60, 0x080c, 0x974e, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, | ||
| 9000 | 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, | ||
| 9001 | 0x67ee, 0x080c, 0x6c50, 0x0010, 0x080c, 0x974e, 0x0005, 0x6000, | ||
| 9002 | 0xa08a, 0x0010, 0x1a0c, 0x14f6, 0x000b, 0x0005, 0x9576, 0x9576, | ||
| 9003 | 0x9576, 0x9578, 0x9579, 0x9576, 0x9576, 0x9576, 0x9576, 0x9576, | ||
| 9004 | 0x9576, 0x9576, 0x9576, 0x9576, 0x9576, 0x9576, 0x080c, 0x14f6, | ||
| 9005 | 0x0005, 0x080c, 0x7cb8, 0x190c, 0x14f6, 0x6110, 0x2168, 0x684b, | ||
| 9006 | 0x0006, 0x080c, 0x510c, 0x080c, 0x8078, 0x0005, 0xa284, 0x0007, | ||
| 9007 | 0x1158, 0xa282, 0xb400, 0x0240, 0x2001, 0xad16, 0x2004, 0xa202, | ||
| 9008 | 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, 0x0ce8, 0x0026, 0x6210, | ||
| 9009 | 0xa294, 0xf000, 0x002e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, | ||
| 9010 | 0x0126, 0x2091, 0x8000, 0x2061, 0xb400, 0x2071, 0xad00, 0x7344, | ||
| 9011 | 0x7064, 0xa302, 0x12a8, 0x601c, 0xa206, 0x1160, 0x080c, 0x98e3, | ||
| 9012 | 0x0148, 0x080c, 0x9789, 0x1110, 0x080c, 0x85f3, 0x00c6, 0x080c, | ||
| 9013 | 0x8078, 0x00ce, 0xace0, 0x0018, 0x7058, 0xac02, 0x1208, 0x0c38, | ||
| 9014 | 0x012e, 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, | ||
| 9015 | 0x0016, 0xa188, 0xae34, 0x210c, 0x81ff, 0x0170, 0x2061, 0xb400, | ||
| 9016 | 0x2071, 0xad00, 0x0016, 0x080c, 0x8022, 0x001e, 0x0138, 0x611a, | ||
| 9017 | 0x080c, 0x2ad9, 0x080c, 0x8078, 0xa006, 0x0010, 0xa085, 0x0001, | ||
| 9018 | 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, 0x0056, 0x0126, 0x2091, | ||
| 9019 | 0x8000, 0x00c6, 0x080c, 0x8022, 0x005e, 0x0180, 0x6612, 0x651a, | ||
| 9020 | 0x080c, 0x9956, 0x601f, 0x0003, 0x2009, 0x004b, 0x080c, 0x80a7, | ||
| 9021 | 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, | ||
| 9022 | 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x62a0, 0x00c6, 0x080c, | ||
| 9023 | 0x8022, 0x005e, 0x0508, 0x6013, 0x0000, 0x651a, 0x080c, 0x9956, | ||
| 9024 | 0x601f, 0x0003, 0x00c6, 0x2560, 0x080c, 0x4ecf, 0x00ce, 0x080c, | ||
| 9025 | 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, 0x2c08, 0x080c, | ||
| 9026 | 0xa712, 0x007e, 0x2009, 0x004c, 0x080c, 0x80a7, 0xa085, 0x0001, | ||
| 9027 | 0x012e, 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00f6, 0x00c6, | ||
| 9028 | 0x0046, 0x00c6, 0x080c, 0x8022, 0x2c78, 0x00ce, 0x0180, 0x7e12, | ||
| 9029 | 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x080c, 0x9683, | ||
| 9030 | 0x2f60, 0x2009, 0x004d, 0x080c, 0x80a7, 0xa085, 0x0001, 0x004e, | ||
| 9031 | 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, | ||
| 9032 | 0x8022, 0x2c78, 0x00ce, 0x0178, 0x7e12, 0x2c00, 0x781a, 0x781f, | ||
| 9033 | 0x0003, 0x2021, 0x0005, 0x0439, 0x2f60, 0x2009, 0x004e, 0x080c, | ||
| 9034 | 0x80a7, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, | ||
| 9035 | 0x00c6, 0x0046, 0x00c6, 0x080c, 0x8022, 0x2c78, 0x00ce, 0x0178, | ||
| 9036 | 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0004, 0x0059, | ||
| 9037 | 0x2f60, 0x2009, 0x0052, 0x080c, 0x80a7, 0xa085, 0x0001, 0x004e, | ||
| 9038 | 0x00ce, 0x00fe, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, | ||
| 9039 | 0x080c, 0x4e71, 0x0118, 0x2001, 0x9688, 0x0028, 0x080c, 0x4e43, | ||
| 9040 | 0x0158, 0x2001, 0x968e, 0x0006, 0xa00e, 0x2400, 0x080c, 0x51df, | ||
| 9041 | 0x080c, 0x510c, 0x000e, 0x0807, 0x2418, 0x080c, 0x6b15, 0x62a0, | ||
| 9042 | 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x6900, | ||
| 9043 | 0x008e, 0x080c, 0x681d, 0x2f08, 0x2648, 0x080c, 0xa712, 0x613c, | ||
| 9044 | 0x81ff, 0x090c, 0x69a9, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, | ||
| 9045 | 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0188, | ||
| 9046 | 0x660a, 0x611a, 0x080c, 0x9956, 0x601f, 0x0001, 0x2d00, 0x6012, | ||
| 9047 | 0x2009, 0x001f, 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, | ||
| 9048 | 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, | ||
| 9049 | 0x080c, 0x8022, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0x9956, | ||
| 9050 | 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x80a7, | ||
| 9051 | 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, | ||
| 9052 | 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0188, | ||
| 9053 | 0x660a, 0x611a, 0x080c, 0x9956, 0x601f, 0x0001, 0x2d00, 0x6012, | ||
| 9054 | 0x2009, 0x003d, 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, | ||
| 9055 | 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, | ||
| 9056 | 0x080c, 0x9807, 0x001e, 0x0180, 0x611a, 0x080c, 0x9956, 0x601f, | ||
| 9057 | 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x80a7, 0xa085, | ||
| 9058 | 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, | ||
| 9059 | 0x2091, 0x8000, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0188, 0x660a, | ||
| 9060 | 0x611a, 0x080c, 0x9956, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, | ||
| 9061 | 0x0044, 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, | ||
| 9062 | 0xa006, 0x0cd8, 0x0026, 0x00d6, 0x6218, 0x2268, 0x6a3c, 0x82ff, | ||
| 9063 | 0x0110, 0x8211, 0x6a3e, 0x00de, 0x002e, 0x0005, 0x0006, 0x6000, | ||
| 9064 | 0xa086, 0x0000, 0x0190, 0x6013, 0x0000, 0x601f, 0x0007, 0x2001, | ||
| 9065 | 0xafa3, 0x2004, 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004, | ||
| 9066 | 0x6016, 0x080c, 0xabb4, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, | ||
| 9067 | 0x00c6, 0x00d6, 0x2031, 0xad52, 0x2634, 0xd6e4, 0x0128, 0x6618, | ||
| 9068 | 0x2660, 0x6e48, 0x080c, 0x4dfc, 0x00de, 0x00ce, 0x006e, 0x0005, | ||
| 9069 | 0x0006, 0x0016, 0x6004, 0xa08e, 0x0002, 0x0140, 0xa08e, 0x0003, | ||
| 9070 | 0x0128, 0xa08e, 0x0004, 0x0110, 0xa085, 0x0001, 0x001e, 0x000e, | ||
| 9071 | 0x0005, 0x0006, 0x00d6, 0x6010, 0xa06d, 0x0148, 0x6834, 0xa086, | ||
| 9072 | 0x0139, 0x0138, 0x6838, 0xd0fc, 0x0110, 0xa006, 0x0010, 0xa085, | ||
| 9073 | 0x0001, 0x00de, 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, | ||
| 9074 | 0x00c6, 0x080c, 0x8022, 0x001e, 0x0190, 0x611a, 0x080c, 0x9956, | ||
| 9075 | 0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, 0x2ad9, 0x2009, 0x0028, | ||
| 9076 | 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, | ||
| 9077 | 0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, 0xad20, 0x2204, 0xa086, | ||
| 9078 | 0x0074, 0x1148, 0x080c, 0x8943, 0x6003, 0x0001, 0x6007, 0x0029, | ||
| 9079 | 0x080c, 0x67ee, 0x0020, 0x080c, 0x85f3, 0x080c, 0x8078, 0x0005, | ||
| 9080 | 0xa186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x4c30, 0x00e8, | ||
| 9081 | 0xa186, 0x0015, 0x11e8, 0x2011, 0xad20, 0x2204, 0xa086, 0x0014, | ||
| 9082 | 0x11b8, 0x00d6, 0x6018, 0x2068, 0x080c, 0x4d72, 0x00de, 0x080c, | ||
| 9083 | 0x89f7, 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, | ||
| 9084 | 0x0138, 0x2001, 0x0006, 0x080c, 0x4c30, 0x080c, 0x81f6, 0x0020, | ||
| 9085 | 0x080c, 0x85f3, 0x080c, 0x8078, 0x0005, 0x6848, 0xa086, 0x0005, | ||
| 9086 | 0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6, | ||
| 9087 | 0x0126, 0x2071, 0xad00, 0x2091, 0x8000, 0x7544, 0xa582, 0x0001, | ||
| 9088 | 0x0608, 0x7048, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, | ||
| 9089 | 0x0018, 0x7058, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xb400, 0x0c98, | ||
| 9090 | 0x6003, 0x0008, 0x8529, 0x7546, 0xaca8, 0x0018, 0x7058, 0xa502, | ||
| 9091 | 0x1230, 0x754a, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704b, | ||
| 9092 | 0xb400, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xb28c, 0x7014, | ||
| 9093 | 0xd0e4, 0x0150, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, | ||
| 9094 | 0x080c, 0x67a8, 0x080c, 0x6c50, 0x00ee, 0x0005, 0x00c6, 0x00f6, | ||
| 9095 | 0x2c78, 0x080c, 0x5029, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, | ||
| 9096 | 0x0013, 0x00ce, 0x0005, 0x9369, 0x985e, 0x9861, 0x9864, 0xa9a7, | ||
| 9097 | 0xa9c2, 0xa9c5, 0x9369, 0x9369, 0x080c, 0x14f6, 0xe000, 0xe000, | ||
| 9098 | 0x0005, 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, | ||
| 9099 | 0x080c, 0x5029, 0x0538, 0x080c, 0x8022, 0x1128, 0x2001, 0xafa5, | ||
| 9100 | 0x2004, 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0x9956, 0x781c, | ||
| 9101 | 0xa086, 0x0003, 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020, | ||
| 9102 | 0x7808, 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, | ||
| 9103 | 0x0035, 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x67a8, 0x080c, | ||
| 9104 | 0x6c50, 0x2f60, 0x00fe, 0x0005, 0x0016, 0x00f6, 0x682c, 0x6032, | ||
| 9105 | 0xa08e, 0x0001, 0x0138, 0xa086, 0x0005, 0x0140, 0xa006, 0x602a, | ||
| 9106 | 0x602e, 0x00a0, 0x6820, 0xc0f4, 0xc0d5, 0x6822, 0x6810, 0x2078, | ||
| 9107 | 0x787c, 0x6938, 0xa102, 0x7880, 0x6934, 0xa103, 0x1e78, 0x6834, | ||
| 9108 | 0x602a, 0x6838, 0xa084, 0xfffc, 0x683a, 0x602e, 0x2d00, 0x6036, | ||
| 9109 | 0x6808, 0x603a, 0x6918, 0x611a, 0x6950, 0x6152, 0x601f, 0x0001, | ||
| 9110 | 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x67a8, 0x6803, 0x0002, | ||
| 9111 | 0x00fe, 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5029, 0x1118, | ||
| 9112 | 0xa085, 0x0001, 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022, | ||
| 9113 | 0x6010, 0x2078, 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x190b, | ||
| 9114 | 0xa006, 0x00fe, 0x0005, 0x0006, 0x0016, 0x6004, 0xa08e, 0x0034, | ||
| 9115 | 0x01b8, 0xa08e, 0x0035, 0x01a0, 0xa08e, 0x0036, 0x0188, 0xa08e, | ||
| 9116 | 0x0037, 0x0170, 0xa08e, 0x0038, 0x0158, 0xa08e, 0x0039, 0x0140, | ||
| 9117 | 0xa08e, 0x003a, 0x0128, 0xa08e, 0x003b, 0x0110, 0xa085, 0x0001, | ||
| 9118 | 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, | ||
| 9119 | 0x2001, 0xaf9f, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, | ||
| 9120 | 0x6665, 0x2001, 0xafa3, 0x82ff, 0x1110, 0x2011, 0x0002, 0x2202, | ||
| 9121 | 0x2001, 0xafa1, 0x200c, 0x8000, 0x2014, 0x2071, 0xaf8d, 0x711a, | ||
| 9122 | 0x721e, 0x2001, 0x0064, 0x080c, 0x6665, 0x2001, 0xafa4, 0x82ff, | ||
| 9123 | 0x1110, 0x2011, 0x0002, 0x2202, 0x2009, 0xafa5, 0xa280, 0x000a, | ||
| 9124 | 0x200a, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, | ||
| 9125 | 0x00e6, 0x2001, 0xafa3, 0x2003, 0x0028, 0x2001, 0xafa4, 0x2003, | ||
| 9126 | 0x0014, 0x2071, 0xaf8d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, | ||
| 9127 | 0xafa5, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005, 0x00d6, 0x6054, | ||
| 9128 | 0xa06d, 0x0110, 0x080c, 0x15f0, 0x00de, 0x0005, 0x0005, 0x00c6, | ||
| 9129 | 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0178, | ||
| 9130 | 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0033, | ||
| 9131 | 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, | ||
| 9132 | 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xad00, 0xa186, 0x0015, | ||
| 9133 | 0x1500, 0x7080, 0xa086, 0x0018, 0x11e0, 0x6010, 0x2068, 0x6a3c, | ||
| 9134 | 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x6e05, 0x01d8, 0x706c, 0x6a50, | ||
| 9135 | 0xa206, 0x1160, 0x7070, 0x6a54, 0xa206, 0x1140, 0x6218, 0xa290, | ||
| 9136 | 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2b1e, 0x080c, 0x81f6, | ||
| 9137 | 0x0020, 0x080c, 0x85f3, 0x080c, 0x8078, 0x00fe, 0x00ee, 0x00de, | ||
| 9138 | 0x0005, 0x7050, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, 0x0126, | ||
| 9139 | 0x2091, 0x8000, 0x00c6, 0x080c, 0x8022, 0x001e, 0x0180, 0x611a, | ||
| 9140 | 0x080c, 0x9956, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0043, | ||
| 9141 | 0x080c, 0x80a7, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, | ||
| 9142 | 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xad00, 0xa186, 0x0015, | ||
| 9143 | 0x11c0, 0x7080, 0xa086, 0x0004, 0x11a0, 0x6010, 0xa0e8, 0x000f, | ||
| 9144 | 0x2c78, 0x080c, 0x6e05, 0x01a8, 0x706c, 0x6a08, 0xa206, 0x1130, | ||
| 9145 | 0x7070, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2ad9, 0x080c, 0x81f6, | ||
| 9146 | 0x0020, 0x080c, 0x85f3, 0x080c, 0x8078, 0x00fe, 0x00ee, 0x00de, | ||
| 9147 | 0x0005, 0x7050, 0x6a0c, 0xa206, 0x0d78, 0x0c80, 0x0016, 0x0026, | ||
| 9148 | 0x684c, 0xd0ac, 0x0178, 0x6914, 0x6a10, 0x2100, 0xa205, 0x0150, | ||
| 9149 | 0x6860, 0xa106, 0x1118, 0x685c, 0xa206, 0x0120, 0x6962, 0x6a5e, | ||
| 9150 | 0xa085, 0x0001, 0x002e, 0x001e, 0x0005, 0x00d6, 0x0036, 0x6310, | ||
| 9151 | 0x2368, 0x684a, 0x6952, 0xa29e, 0x4000, 0x1188, 0x00c6, 0x6318, | ||
| 9152 | 0x2360, 0x2009, 0x0000, 0x080c, 0x4f6e, 0x1108, 0xc185, 0x6000, | ||
| 9153 | 0xd0bc, 0x0108, 0xc18d, 0x6a66, 0x696a, 0x00ce, 0x0080, 0x6a66, | ||
| 9154 | 0x3918, 0xa398, 0x0006, 0x231c, 0x686b, 0x0004, 0x6b72, 0x00c6, | ||
| 9155 | 0x6318, 0x2360, 0x6004, 0xa084, 0x00ff, 0x686e, 0x00ce, 0x080c, | ||
| 9156 | 0x510c, 0x003e, 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, | ||
| 9157 | 0x0035, 0x0110, 0x6a34, 0x0008, 0x6a28, 0x080c, 0x9586, 0x01f0, | ||
| 9158 | 0x2260, 0x611c, 0xa186, 0x0003, 0x0118, 0xa186, 0x0006, 0x1190, | ||
| 9159 | 0x6834, 0xa206, 0x0140, 0x6838, 0xa206, 0x1160, 0x6108, 0x6834, | ||
| 9160 | 0xa106, 0x1140, 0x0020, 0x6008, 0x6938, 0xa106, 0x1118, 0x6018, | ||
| 9161 | 0x6918, 0xa106, 0x001e, 0x002e, 0x00ce, 0x0005, 0xa085, 0x0001, | ||
| 9162 | 0x0cc8, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x14f6, 0x0013, | ||
| 9163 | 0x006e, 0x0005, 0x9a7a, 0x9eff, 0xa027, 0x9a7a, 0x9a7a, 0x9a7a, | ||
| 9164 | 0x9a7a, 0x9a7a, 0x9ab2, 0xa0a3, 0x9a7a, 0x9a7a, 0x9a7a, 0x9a7a, | ||
| 9165 | 0x9a7a, 0x9a7a, 0x080c, 0x14f6, 0x0066, 0x6000, 0xa0b2, 0x0010, | ||
| 9166 | 0x1a0c, 0x14f6, 0x0013, 0x006e, 0x0005, 0x9a95, 0xa4fd, 0x9a95, | ||
| 9167 | 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0x9a95, 0xa4c1, 0xa545, 0x9a95, | ||
| 9168 | 0xaaea, 0xab1a, 0xaaea, 0xab1a, 0x9a95, 0x080c, 0x14f6, 0x0066, | ||
| 9169 | 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x14f6, 0x0013, 0x006e, 0x0005, | ||
| 9170 | 0x9ab0, 0xa1d8, 0xa295, 0xa2c2, 0xa346, 0x9ab0, 0xa433, 0xa3de, | ||
| 9171 | 0xa0af, 0xa497, 0xa4ac, 0x9ab0, 0x9ab0, 0x9ab0, 0x9ab0, 0x9ab0, | ||
| 9172 | 0x080c, 0x14f6, 0xa1b2, 0x0080, 0x1a0c, 0x14f6, 0x2100, 0xa1b2, | ||
| 9173 | 0x0040, 0x1a04, 0x9e79, 0x0002, 0x9afc, 0x9cab, 0x9afc, 0x9afc, | ||
| 9174 | 0x9afc, 0x9cb2, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, | ||
| 9175 | 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, | ||
| 9176 | 0x9afc, 0x9afc, 0x9afc, 0x9afe, 0x9b5a, 0x9b65, 0x9ba6, 0x9bc0, | ||
| 9177 | 0x9c3e, 0x9c9c, 0x9afc, 0x9afc, 0x9cb5, 0x9afc, 0x9afc, 0x9cc4, | ||
| 9178 | 0x9ccb, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9afc, 0x9d42, 0x9afc, | ||
| 9179 | 0x9afc, 0x9d4d, 0x9afc, 0x9afc, 0x9d18, 0x9afc, 0x9afc, 0x9afc, | ||
| 9180 | 0x9d61, 0x9afc, 0x9afc, 0x9afc, 0x9dd5, 0x9afc, 0x9afc, 0x9afc, | ||
| 9181 | 0x9afc, 0x9afc, 0x9afc, 0x9e40, 0x080c, 0x14f6, 0x080c, 0x502d, | ||
| 9182 | 0x1140, 0x2001, 0xad34, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, | ||
| 9183 | 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0804, | ||
| 9184 | 0x9ca6, 0x080c, 0x501d, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, | ||
| 9185 | 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x68e7, | ||
| 9186 | 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, 0x2c08, 0x080c, 0xa712, | ||
| 9187 | 0x007e, 0x001e, 0x2e60, 0x080c, 0x4ecf, 0x001e, 0x002e, 0x003e, | ||
| 9188 | 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, 0x4ceb, 0x00ce, | ||
| 9189 | 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x0278, | ||
| 9190 | 0x080c, 0xa656, 0x1904, 0x9ba0, 0x080c, 0xa5f6, 0x1120, 0x6007, | ||
| 9191 | 0x0008, 0x0804, 0x9ca6, 0x6007, 0x0009, 0x0804, 0x9ca6, 0x080c, | ||
| 9192 | 0xa801, 0x0128, 0x080c, 0xa656, 0x0d78, 0x0804, 0x9ba0, 0x6013, | ||
| 9193 | 0x1900, 0x0c88, 0x6106, 0x080c, 0xa5a6, 0x6007, 0x0006, 0x0804, | ||
| 9194 | 0x9ca6, 0x6007, 0x0007, 0x0804, 0x9ca6, 0x080c, 0xab4e, 0x1904, | ||
| 9195 | 0x9e76, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, | ||
| 9196 | 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, 0x0170, 0x6e04, 0xa6b4, | ||
| 9197 | 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, 0x0004, 0x0128, 0xa686, | ||
| 9198 | 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, 0xa6b4, 0x11a0, 0xa686, | ||
| 9199 | 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, | ||
| 9200 | 0x0000, 0x080c, 0x2b1e, 0x002e, 0x080c, 0x4d72, 0x6007, 0x000a, | ||
| 9201 | 0x00de, 0x0804, 0x9ca6, 0x6007, 0x000b, 0x00de, 0x0804, 0x9ca6, | ||
| 9202 | 0x080c, 0x2ad9, 0x6007, 0x0001, 0x0804, 0x9ca6, 0x080c, 0xab4e, | ||
| 9203 | 0x1904, 0x9e76, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, | ||
| 9204 | 0x0707, 0x0d70, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, | ||
| 9205 | 0x0000, 0x080c, 0x2b1e, 0x002e, 0x6007, 0x000c, 0x0804, 0x9ca6, | ||
| 9206 | 0x080c, 0x502d, 0x1140, 0x2001, 0xad34, 0x2004, 0xa084, 0x0009, | ||
| 9207 | 0xa086, 0x0008, 0x1110, 0x0804, 0x9b09, 0x080c, 0x501d, 0x6618, | ||
| 9208 | 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, | ||
| 9209 | 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x4c5d, 0x002e, 0x0050, | ||
| 9210 | 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, | ||
| 9211 | 0x1904, 0x9ba0, 0x080c, 0xa6c1, 0x1120, 0x6007, 0x000e, 0x0804, | ||
| 9212 | 0x9ca6, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, | ||
| 9213 | 0x8427, 0x0046, 0x080c, 0x2ad9, 0x004e, 0x0016, 0xa006, 0x2009, | ||
| 9214 | 0xad52, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xa96c, | ||
| 9215 | 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, | ||
| 9216 | 0x004e, 0x6007, 0x0001, 0x0804, 0x9ca6, 0x2001, 0x0001, 0x080c, | ||
| 9217 | 0x4c1e, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, | ||
| 9218 | 0xad05, 0x2011, 0xb290, 0x080c, 0x8a7c, 0x003e, 0x002e, 0x001e, | ||
| 9219 | 0x015e, 0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, | ||
| 9220 | 0x0a04, 0x9ba0, 0xa682, 0x0007, 0x0a04, 0x9bea, 0x0804, 0x9ba0, | ||
| 9221 | 0x6013, 0x1900, 0x6007, 0x0009, 0x0804, 0x9ca6, 0x080c, 0x502d, | ||
| 9222 | 0x1140, 0x2001, 0xad34, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, | ||
| 9223 | 0x1110, 0x0804, 0x9b09, 0x080c, 0x501d, 0x6618, 0xa6b0, 0x0001, | ||
| 9224 | 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06b0, 0xa6b4, 0xff00, | ||
| 9225 | 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0x9ba0, | ||
| 9226 | 0x080c, 0xa6e9, 0x1130, 0x080c, 0xa5f6, 0x1118, 0x6007, 0x0010, | ||
| 9227 | 0x04e8, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, | ||
| 9228 | 0x8427, 0x0046, 0x080c, 0x2ad9, 0x004e, 0x0016, 0xa006, 0x2009, | ||
| 9229 | 0xad52, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xa96c, | ||
| 9230 | 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, | ||
| 9231 | 0x004e, 0x6007, 0x0001, 0x00d0, 0x080c, 0xa801, 0x0140, 0xa6b4, | ||
| 9232 | 0xff00, 0x8637, 0xa686, 0x0006, 0x0958, 0x0804, 0x9ba0, 0x6013, | ||
| 9233 | 0x1900, 0x6007, 0x0009, 0x0050, 0x080c, 0xab4e, 0x1904, 0x9e76, | ||
| 9234 | 0x080c, 0x9e98, 0x1904, 0x9ba0, 0x6007, 0x0012, 0x6003, 0x0001, | ||
| 9235 | 0x080c, 0x67ee, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, | ||
| 9236 | 0x67ee, 0x0cc0, 0x6007, 0x0005, 0x0cc0, 0x080c, 0xab4e, 0x1904, | ||
| 9237 | 0x9e76, 0x080c, 0x9e98, 0x1904, 0x9ba0, 0x6007, 0x0020, 0x6003, | ||
| 9238 | 0x0001, 0x080c, 0x67ee, 0x0005, 0x6007, 0x0023, 0x6003, 0x0001, | ||
| 9239 | 0x080c, 0x67ee, 0x0005, 0x080c, 0xab4e, 0x1904, 0x9e76, 0x080c, | ||
| 9240 | 0x9e98, 0x1904, 0x9ba0, 0x0016, 0x0026, 0x2011, 0xb291, 0x2214, | ||
| 9241 | 0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0x9586, 0x01d8, 0x2260, | ||
| 9242 | 0x2011, 0xb290, 0x2214, 0x6008, 0xa206, 0x11a0, 0x6018, 0xa190, | ||
| 9243 | 0x0006, 0x2214, 0xa206, 0x01e0, 0x0068, 0x2011, 0xb290, 0x2214, | ||
| 9244 | 0x2c08, 0x080c, 0xa940, 0x11a0, 0x2011, 0xb291, 0x2214, 0xa286, | ||
| 9245 | 0xffff, 0x01a0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, | ||
| 9246 | 0xb289, 0x2214, 0xa296, 0xffff, 0x1160, 0x6007, 0x0025, 0x0048, | ||
| 9247 | 0x601c, 0xa086, 0x0007, 0x1d70, 0x080c, 0x8078, 0x2160, 0x6007, | ||
| 9248 | 0x0025, 0x6003, 0x0001, 0x080c, 0x67ee, 0x002e, 0x001e, 0x0005, | ||
| 9249 | 0x2001, 0x0001, 0x080c, 0x4c1e, 0x0156, 0x0016, 0x0026, 0x0036, | ||
| 9250 | 0x20a9, 0x0004, 0x2019, 0xad05, 0x2011, 0xb296, 0x080c, 0x8a7c, | ||
| 9251 | 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, | ||
| 9252 | 0x9ca6, 0x080c, 0x87bd, 0x080c, 0x574f, 0x1158, 0x0006, 0x0026, | ||
| 9253 | 0x0036, 0x080c, 0x576b, 0x0110, 0x080c, 0x5726, 0x003e, 0x002e, | ||
| 9254 | 0x000e, 0x0005, 0x6106, 0x080c, 0x9eb4, 0x6007, 0x002b, 0x0804, | ||
| 9255 | 0x9ca6, 0x6007, 0x002c, 0x0804, 0x9ca6, 0x080c, 0xab4e, 0x1904, | ||
| 9256 | 0x9e76, 0x080c, 0x9e98, 0x1904, 0x9ba0, 0x6106, 0x080c, 0x9eb8, | ||
| 9257 | 0x1120, 0x6007, 0x002e, 0x0804, 0x9ca6, 0x6007, 0x002f, 0x0804, | ||
| 9258 | 0x9ca6, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, | ||
| 9259 | 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, | ||
| 9260 | 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0x9cab, | ||
| 9261 | 0x2001, 0xad71, 0x2004, 0xd0e4, 0x0904, 0x9dd2, 0x2071, 0xb28c, | ||
| 9262 | 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xad52, | ||
| 9263 | 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, 0x1118, | ||
| 9264 | 0x6814, 0xa206, 0x01f8, 0x2001, 0xad52, 0x2004, 0xd0ac, 0x1580, | ||
| 9265 | 0x2069, 0xad00, 0x6870, 0xa206, 0x1558, 0x686c, 0xa106, 0x1540, | ||
| 9266 | 0x7210, 0x080c, 0x9586, 0x0548, 0x080c, 0xa9d4, 0x0530, 0x622a, | ||
| 9267 | 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x67a8, 0x00ce, 0x00de, | ||
| 9268 | 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, 0x9586, | ||
| 9269 | 0x01a0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1170, 0x0c08, | ||
| 9270 | 0x7210, 0x2c08, 0x080c, 0xa940, 0x2c10, 0x2160, 0x0130, 0x08c8, | ||
| 9271 | 0x6007, 0x0037, 0x6013, 0x1500, 0x08e8, 0x6007, 0x0037, 0x6013, | ||
| 9272 | 0x1700, 0x08c0, 0x6007, 0x0012, 0x08a8, 0x6018, 0xa080, 0x0001, | ||
| 9273 | 0x2004, 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0x9cab, | ||
| 9274 | 0x00e6, 0x00d6, 0x00c6, 0x2001, 0xad71, 0x2004, 0xd0e4, 0x0904, | ||
| 9275 | 0x9e38, 0x2069, 0xad00, 0x2071, 0xb28c, 0x7008, 0x6036, 0x720c, | ||
| 9276 | 0x623a, 0xa286, 0xffff, 0x1140, 0x7208, 0x00c6, 0x2c08, 0x080c, | ||
| 9277 | 0xa940, 0x2c10, 0x00ce, 0x0588, 0x080c, 0x9586, 0x0570, 0x00c6, | ||
| 9278 | 0x0026, 0x2260, 0x080c, 0x928f, 0x002e, 0x00ce, 0x7118, 0xa18c, | ||
| 9279 | 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, | ||
| 9280 | 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, | ||
| 9281 | 0x0056, 0x7510, 0x7614, 0x080c, 0xa9eb, 0x005e, 0x00ce, 0x00de, | ||
| 9282 | 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, | ||
| 9283 | 0x6003, 0x0001, 0x080c, 0x67a8, 0x0c88, 0x6007, 0x003b, 0x602b, | ||
| 9284 | 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x67a8, 0x0c30, | ||
| 9285 | 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, 0x9daa, | ||
| 9286 | 0x00e6, 0x0026, 0x080c, 0x502d, 0x0558, 0x080c, 0x501d, 0x080c, | ||
| 9287 | 0xabc5, 0x1520, 0x2071, 0xad00, 0x70d0, 0xc085, 0x70d2, 0x00f6, | ||
| 9288 | 0x2079, 0x0100, 0x729c, 0xa284, 0x00ff, 0x706e, 0x78e6, 0xa284, | ||
| 9289 | 0xff00, 0x7270, 0xa205, 0x7072, 0x78ea, 0x00fe, 0x70db, 0x0000, | ||
| 9290 | 0x2001, 0xad52, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xafe0, 0x2013, | ||
| 9291 | 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x28fa, 0x0010, 0x080c, 0xabf1, | ||
| 9292 | 0x002e, 0x00ee, 0x080c, 0x8078, 0x0804, 0x9caa, 0x080c, 0x8078, | ||
| 9293 | 0x0005, 0x2600, 0x0002, 0x9e81, 0x9e81, 0x9e81, 0x9e81, 0x9e81, | ||
| 9294 | 0x9e83, 0x080c, 0x14f6, 0x080c, 0xab4e, 0x1d80, 0x0089, 0x1138, | ||
| 9295 | 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x67ee, 0x0005, 0x080c, | ||
| 9296 | 0x2ad9, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x67ee, 0x0005, | ||
| 9297 | 0x00d6, 0x0066, 0x6618, 0x2668, 0x6e04, 0xa6b4, 0xff00, 0x8637, | ||
| 9298 | 0xa686, 0x0006, 0x0170, 0xa686, 0x0004, 0x0158, 0x6e04, 0xa6b4, | ||
| 9299 | 0x00ff, 0xa686, 0x0006, 0x0128, 0xa686, 0x0004, 0x0110, 0xa085, | ||
| 9300 | 0x0001, 0x006e, 0x00de, 0x0005, 0x00d6, 0x0449, 0x00de, 0x0005, | ||
| 9301 | 0x00d6, 0x0491, 0x11f0, 0x680c, 0xa08c, 0xff00, 0x6820, 0xa084, | ||
| 9302 | 0x00ff, 0xa115, 0x6212, 0x6824, 0x602a, 0xd1e4, 0x0118, 0x2009, | ||
| 9303 | 0x0001, 0x0060, 0xd1ec, 0x0168, 0x6920, 0xa18c, 0x00ff, 0x6824, | ||
| 9304 | 0x080c, 0x2676, 0x1130, 0x2110, 0x2009, 0x0000, 0x080c, 0x2b1e, | ||
| 9305 | 0x0018, 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, 0x0005, 0x2069, | ||
| 9306 | 0xb28d, 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, 0x0000, 0xa085, | ||
| 9307 | 0x0001, 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, 0x2069, 0xb28c, | ||
| 9308 | 0x6808, 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, 0x6800, 0xa084, | ||
| 9309 | 0x00ff, 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, 0x0005, 0x6004, | ||
| 9310 | 0xa0b2, 0x0080, 0x1a0c, 0x14f6, 0xa1b6, 0x0013, 0x1130, 0x2008, | ||
| 9311 | 0xa1b2, 0x0040, 0x1a04, 0x9ffb, 0x0092, 0xa1b6, 0x0027, 0x0120, | ||
| 9312 | 0xa1b6, 0x0014, 0x190c, 0x14f6, 0x2001, 0x0007, 0x080c, 0x4c5d, | ||
| 9313 | 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, 0x9f5f, | ||
| 9314 | 0x9f61, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f61, 0x9f6f, 0x9ff4, 0x9fbf, | ||
| 9315 | 0x9ff4, 0x9fd0, 0x9ff4, 0x9f6f, 0x9ff4, 0x9fec, 0x9ff4, 0x9fec, | ||
| 9316 | 0x9ff4, 0x9ff4, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, | ||
| 9317 | 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f61, 0x9f5f, 0x9ff4, | ||
| 9318 | 0x9f5f, 0x9f5f, 0x9ff4, 0x9f5f, 0x9ff1, 0x9ff4, 0x9f5f, 0x9f5f, | ||
| 9319 | 0x9f5f, 0x9f5f, 0x9ff4, 0x9ff4, 0x9f5f, 0x9ff4, 0x9ff4, 0x9f5f, | ||
| 9320 | 0x9f69, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x9ff0, 0x9ff4, 0x9f5f, | ||
| 9321 | 0x9f5f, 0x9ff4, 0x9ff4, 0x9f5f, 0x9f5f, 0x9f5f, 0x9f5f, 0x080c, | ||
| 9322 | 0x14f6, 0x080c, 0x6b73, 0x6003, 0x0002, 0x080c, 0x6c50, 0x0804, | ||
| 9323 | 0x9ffa, 0x2001, 0x0000, 0x080c, 0x4c1e, 0x0804, 0x9ff4, 0x00f6, | ||
| 9324 | 0x2079, 0xad51, 0x7804, 0x00fe, 0xd0ac, 0x1904, 0x9ff4, 0x2001, | ||
| 9325 | 0x0000, 0x080c, 0x4c1e, 0x6018, 0xa080, 0x0004, 0x2004, 0xa086, | ||
| 9326 | 0x00ff, 0x1140, 0x00f6, 0x2079, 0xad00, 0x7894, 0x8000, 0x7896, | ||
| 9327 | 0x00fe, 0x00e0, 0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, 0x1140, | ||
| 9328 | 0x6010, 0xa005, 0x0128, 0x00ce, 0x080c, 0x3cce, 0x0804, 0x9ff4, | ||
| 9329 | 0x00ce, 0x2001, 0xad00, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, | ||
| 9330 | 0x2079, 0xad00, 0x7894, 0x8000, 0x7896, 0x00fe, 0x2001, 0x0002, | ||
| 9331 | 0x080c, 0x4c30, 0x080c, 0x6b73, 0x601f, 0x0001, 0x6003, 0x0001, | ||
| 9332 | 0x6007, 0x0002, 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00c6, 0x6118, | ||
| 9333 | 0x2160, 0x2009, 0x0001, 0x080c, 0x6519, 0x00ce, 0x04d8, 0x6618, | ||
| 9334 | 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, | ||
| 9335 | 0x0006, 0x0550, 0xa686, 0x0004, 0x0538, 0x2001, 0x0004, 0x0410, | ||
| 9336 | 0x2001, 0xad00, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, 0x3cce, | ||
| 9337 | 0x2001, 0x0006, 0x0489, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, | ||
| 9338 | 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0170, 0x2001, 0x0006, | ||
| 9339 | 0x0048, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, 0x00e9, 0x0020, | ||
| 9340 | 0x0018, 0x0010, 0x080c, 0x4c5d, 0x080c, 0x6b73, 0x080c, 0x8078, | ||
| 9341 | 0x080c, 0x6c50, 0x0005, 0x2600, 0x0002, 0xa003, 0xa003, 0xa003, | ||
| 9342 | 0xa003, 0xa003, 0xa005, 0x080c, 0x14f6, 0x080c, 0x6b73, 0x080c, | ||
| 9343 | 0x8078, 0x080c, 0x6c50, 0x0005, 0x0016, 0x00d6, 0x6118, 0x2168, | ||
| 9344 | 0x6900, 0xd184, 0x0188, 0x6104, 0xa18e, 0x000a, 0x1128, 0x699c, | ||
| 9345 | 0xd1a4, 0x1110, 0x2001, 0x0007, 0x080c, 0x4c30, 0x2001, 0x0000, | ||
| 9346 | 0x080c, 0x4c1e, 0x080c, 0x2aff, 0x00de, 0x001e, 0x0005, 0x00d6, | ||
| 9347 | 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, 0x8007, 0x00de, 0xa0b2, | ||
| 9348 | 0x000c, 0x1a0c, 0x14f6, 0xa1b6, 0x0015, 0x1110, 0x003b, 0x0028, | ||
| 9349 | 0xa1b6, 0x0016, 0x190c, 0x14f6, 0x006b, 0x0005, 0x86b9, 0x86b9, | ||
| 9350 | 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0xa08f, 0xa056, 0x86b9, 0x86b9, | ||
| 9351 | 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0x86b9, | ||
| 9352 | 0xa08f, 0xa096, 0x86b9, 0x86b9, 0x86b9, 0x86b9, 0x00f6, 0x2079, | ||
| 9353 | 0xad51, 0x7804, 0xd0ac, 0x11e0, 0x6018, 0xa07d, 0x01c8, 0x7800, | ||
| 9354 | 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, 0x2001, 0x0000, 0x080c, | ||
| 9355 | 0x4c1e, 0x2001, 0x0002, 0x080c, 0x4c30, 0x601f, 0x0001, 0x6003, | ||
| 9356 | 0x0001, 0x6007, 0x0002, 0x080c, 0x67ee, 0x080c, 0x6c50, 0x00a8, | ||
| 9357 | 0x2011, 0xb283, 0x2204, 0x8211, 0x220c, 0x080c, 0x2676, 0x1168, | ||
| 9358 | 0x00c6, 0x080c, 0x4cdc, 0x0120, 0x00ce, 0x080c, 0x8078, 0x0028, | ||
| 9359 | 0x080c, 0x493a, 0x00ce, 0x080c, 0x8078, 0x00fe, 0x0005, 0x6604, | ||
| 9360 | 0xa6b6, 0x001e, 0x1110, 0x080c, 0x8078, 0x0005, 0x080c, 0x8940, | ||
| 9361 | 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x67ee, 0x0010, | ||
| 9362 | 0x080c, 0x8078, 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x14f6, | ||
| 9363 | 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, 0xa182, | ||
| 9364 | 0x0040, 0x0002, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c7, 0xa0c5, | ||
| 9365 | 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, | ||
| 9366 | 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0xa0c5, 0x080c, 0x14f6, 0x00d6, | ||
| 9367 | 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218, 0xa280, 0x002b, | ||
| 9368 | 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, 0x080c, 0xab96, 0x6106, | ||
| 9369 | 0x2071, 0xb280, 0x7444, 0xa4a4, 0xff00, 0x0904, 0xa129, 0xa486, | ||
| 9370 | 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x663f, | ||
| 9371 | 0x080c, 0x15d9, 0x090c, 0x14f6, 0x6003, 0x0007, 0x2d00, 0x6837, | ||
| 9372 | 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x6c5a, 0x2c00, 0x685e, | ||
| 9373 | 0x6008, 0x68b2, 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x694a, | ||
| 9374 | 0x0016, 0xa084, 0xff00, 0x6846, 0x684f, 0x0000, 0x6857, 0x0036, | ||
| 9375 | 0x080c, 0x510c, 0x001e, 0xa486, 0x2000, 0x1130, 0x2019, 0x0017, | ||
| 9376 | 0x080c, 0xa8eb, 0x0804, 0xa186, 0xa486, 0x0400, 0x1130, 0x2019, | ||
| 9377 | 0x0002, 0x080c, 0xa89d, 0x0804, 0xa186, 0xa486, 0x0200, 0x1110, | ||
| 9378 | 0x080c, 0xa882, 0xa486, 0x1000, 0x1110, 0x080c, 0xa8d0, 0x0804, | ||
| 9379 | 0xa186, 0x2069, 0xb048, 0x6a00, 0xd284, 0x0904, 0xa1d5, 0xa284, | ||
| 9380 | 0x0300, 0x1904, 0xa1cf, 0x6804, 0xa005, 0x0904, 0xa1c0, 0x2d78, | ||
| 9381 | 0x6003, 0x0007, 0x080c, 0x15c0, 0x0904, 0xa18d, 0x7800, 0xd08c, | ||
| 9382 | 0x1118, 0x7804, 0x8001, 0x7806, 0x6013, 0x0000, 0x6803, 0x0000, | ||
| 9383 | 0x6837, 0x0116, 0x683b, 0x0000, 0x6008, 0x68b2, 0x2c00, 0x684a, | ||
| 9384 | 0x6018, 0x2078, 0x78a0, 0x8007, 0x7130, 0x6986, 0x6846, 0x7928, | ||
| 9385 | 0x698a, 0x792c, 0x698e, 0x7930, 0x6992, 0x7934, 0x6996, 0x6853, | ||
| 9386 | 0x003d, 0x7244, 0xa294, 0x0003, 0xa286, 0x0002, 0x1118, 0x684f, | ||
| 9387 | 0x0040, 0x0040, 0xa286, 0x0001, 0x1118, 0x684f, 0x0080, 0x0010, | ||
| 9388 | 0x684f, 0x0000, 0x20a9, 0x000a, 0x2001, 0xb290, 0xad90, 0x0015, | ||
| 9389 | 0x200c, 0x810f, 0x2112, 0x8000, 0x8210, 0x1f04, 0xa178, 0x200c, | ||
| 9390 | 0x6982, 0x8000, 0x200c, 0x697e, 0x080c, 0x510c, 0x002e, 0x004e, | ||
| 9391 | 0x015e, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x6013, 0x0100, 0x6003, | ||
| 9392 | 0x0001, 0x6007, 0x0041, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0c70, | ||
| 9393 | 0x2069, 0xb292, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, | ||
| 9394 | 0x2069, 0xb280, 0x686c, 0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, | ||
| 9395 | 0x0700, 0xa10d, 0x6112, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, | ||
| 9396 | 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0888, 0x6013, 0x0200, 0x6003, | ||
| 9397 | 0x0001, 0x6007, 0x0041, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0830, | ||
| 9398 | 0x6013, 0x0300, 0x0010, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, | ||
| 9399 | 0x0041, 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0804, 0xa186, 0x6013, | ||
| 9400 | 0x0500, 0x0c98, 0x6013, 0x0600, 0x0818, 0x6013, 0x0200, 0x0800, | ||
| 9401 | 0xa186, 0x0013, 0x1170, 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x14f6, | ||
| 9402 | 0xa08a, 0x0053, 0x1a0c, 0x14f6, 0xa082, 0x0040, 0x2008, 0x0804, | ||
| 9403 | 0xa252, 0xa186, 0x0051, 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, | ||
| 9404 | 0xa086, 0x0041, 0x0518, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, | ||
| 9405 | 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6699, | ||
| 9406 | 0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, | ||
| 9407 | 0x0804, 0xa295, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, | ||
| 9408 | 0x14f6, 0x6004, 0xa082, 0x0040, 0x2008, 0x001a, 0x080c, 0x80be, | ||
| 9409 | 0x0005, 0xa22c, 0xa22e, 0xa22e, 0xa22c, 0xa22c, 0xa22c, 0xa22c, | ||
| 9410 | 0xa22c, 0xa22c, 0xa22c, 0xa22c, 0xa22c, 0xa22c, 0xa22c, 0xa22c, | ||
| 9411 | 0xa22c, 0xa22c, 0xa22c, 0xa22c, 0x080c, 0x14f6, 0x080c, 0x6b73, | ||
| 9412 | 0x080c, 0x6c50, 0x0036, 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, | ||
| 9413 | 0xf000, 0x01a8, 0x6003, 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, | ||
| 9414 | 0x2019, 0x0004, 0x080c, 0xa91f, 0x6013, 0x0000, 0x6014, 0xa005, | ||
| 9415 | 0x1120, 0x2001, 0xafa4, 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, | ||
| 9416 | 0x003e, 0x0005, 0x0002, 0xa266, 0xa283, 0xa26f, 0xa28f, 0xa266, | ||
| 9417 | 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, | ||
| 9418 | 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, 0xa266, 0x080c, 0x14f6, | ||
| 9419 | 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, | ||
| 9420 | 0x6b73, 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, | ||
| 9421 | 0x0007, 0x2009, 0x0043, 0x080c, 0x80a7, 0x0010, 0x6003, 0x0002, | ||
| 9422 | 0x080c, 0x6c50, 0x0005, 0x080c, 0x6b73, 0x080c, 0xab55, 0x1120, | ||
| 9423 | 0x080c, 0x6618, 0x080c, 0x8078, 0x080c, 0x6c50, 0x0005, 0x080c, | ||
| 9424 | 0x6b73, 0x2009, 0x0041, 0x0804, 0xa3de, 0xa182, 0x0040, 0x0002, | ||
| 9425 | 0xa2ab, 0xa2ad, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ae, | ||
| 9426 | 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, 0xa2ab, | ||
| 9427 | 0xa2ab, 0xa2b9, 0xa2ab, 0x080c, 0x14f6, 0x0005, 0x6003, 0x0004, | ||
| 9428 | 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1824, | ||
| 9429 | 0x0005, 0x00d6, 0x080c, 0x6618, 0x00de, 0x080c, 0xabb4, 0x080c, | ||
| 9430 | 0x8078, 0x0005, 0xa182, 0x0040, 0x0002, 0xa2d8, 0xa2d8, 0xa2d8, | ||
| 9431 | 0xa2d8, 0xa2d8, 0xa2d8, 0xa2d8, 0xa2da, 0xa2d8, 0xa2dd, 0xa316, | ||
| 9432 | 0xa2d8, 0xa2d8, 0xa2d8, 0xa2d8, 0xa316, 0xa2d8, 0xa2d8, 0xa2d8, | ||
| 9433 | 0x080c, 0x14f6, 0x080c, 0x80be, 0x0005, 0x2001, 0xad71, 0x2004, | ||
| 9434 | 0xd0e4, 0x0158, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, | ||
| 9435 | 0x2001, 0x011f, 0x2004, 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, | ||
| 9436 | 0x6c05, 0x080c, 0x6d0d, 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, | ||
| 9437 | 0x0150, 0xa08c, 0x0003, 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, | ||
| 9438 | 0x00de, 0x0804, 0xa3de, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, | ||
| 9439 | 0x6618, 0x00de, 0x0005, 0x080c, 0xab55, 0x0110, 0x00de, 0x0005, | ||
| 9440 | 0x080c, 0x6618, 0x080c, 0x8078, 0x00de, 0x0ca0, 0x0036, 0x080c, | ||
| 9441 | 0x6c05, 0x080c, 0x6d0d, 0x6010, 0x00d6, 0x2068, 0x6018, 0x2004, | ||
| 9442 | 0xd0bc, 0x0188, 0x684c, 0xa084, 0x0003, 0xa086, 0x0002, 0x0140, | ||
| 9443 | 0x687c, 0x632c, 0xa31a, 0x632e, 0x6880, 0x6328, 0xa31b, 0x632a, | ||
| 9444 | 0x6003, 0x0002, 0x0080, 0x2019, 0x0004, 0x080c, 0xa91f, 0x6014, | ||
| 9445 | 0xa005, 0x1128, 0x2001, 0xafa4, 0x2004, 0x8003, 0x6016, 0x6013, | ||
| 9446 | 0x0000, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, | ||
| 9447 | 0x1150, 0x6004, 0xa086, 0x0042, 0x190c, 0x14f6, 0x080c, 0x6b73, | ||
| 9448 | 0x080c, 0x6c50, 0x0005, 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, | ||
| 9449 | 0x1180, 0x6004, 0xa086, 0x0042, 0x190c, 0x14f6, 0x2001, 0x0007, | ||
| 9450 | 0x080c, 0x4c5d, 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, | ||
| 9451 | 0x0005, 0xa182, 0x0040, 0x0002, 0xa37f, 0xa37f, 0xa37f, 0xa37f, | ||
| 9452 | 0xa37f, 0xa37f, 0xa37f, 0xa381, 0xa38d, 0xa37f, 0xa37f, 0xa37f, | ||
| 9453 | 0xa37f, 0xa37f, 0xa37f, 0xa37f, 0xa37f, 0xa37f, 0xa37f, 0x080c, | ||
| 9454 | 0x14f6, 0x0036, 0x0046, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, | ||
| 9455 | 0x080c, 0x1824, 0x004e, 0x003e, 0x0005, 0x6010, 0x00d6, 0x2068, | ||
| 9456 | 0x6810, 0x6a14, 0x0006, 0x0046, 0x0056, 0x6c7c, 0xa422, 0x6d80, | ||
| 9457 | 0x2200, 0xa52b, 0x602c, 0xa420, 0x642e, 0x6028, 0xa529, 0x652a, | ||
| 9458 | 0x005e, 0x004e, 0x000e, 0xa20d, 0x1178, 0x684c, 0xd0fc, 0x0120, | ||
| 9459 | 0x2009, 0x0041, 0x00de, 0x0490, 0x6003, 0x0007, 0x6017, 0x0000, | ||
| 9460 | 0x080c, 0x6618, 0x00de, 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, | ||
| 9461 | 0x5029, 0x00fe, 0x000e, 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, | ||
| 9462 | 0x2009, 0xad0d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, | ||
| 9463 | 0x6003, 0x0006, 0x0021, 0x080c, 0x661a, 0x00de, 0x0005, 0xd2fc, | ||
| 9464 | 0x0140, 0x8002, 0x8000, 0x8212, 0xa291, 0x0000, 0x2009, 0x0009, | ||
| 9465 | 0x0010, 0x2009, 0x0015, 0x6a6a, 0x6866, 0x0005, 0xa182, 0x0040, | ||
| 9466 | 0x0208, 0x0062, 0xa186, 0x0013, 0x0120, 0xa186, 0x0014, 0x190c, | ||
| 9467 | 0x14f6, 0x6020, 0xd0dc, 0x090c, 0x14f6, 0x0005, 0xa401, 0xa408, | ||
| 9468 | 0xa414, 0xa420, 0xa401, 0xa401, 0xa401, 0xa42f, 0xa401, 0xa403, | ||
| 9469 | 0xa403, 0xa401, 0xa401, 0xa401, 0xa401, 0xa403, 0xa401, 0xa403, | ||
| 9470 | 0xa401, 0x080c, 0x14f6, 0x6020, 0xd0dc, 0x090c, 0x14f6, 0x0005, | ||
| 9471 | 0x6003, 0x0001, 0x6106, 0x080c, 0x67a8, 0x0126, 0x2091, 0x8000, | ||
| 9472 | 0x080c, 0x6c50, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, | ||
| 9473 | 0x67a8, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c50, 0x012e, 0x0005, | ||
| 9474 | 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1e6e, 0x0126, 0x2091, | ||
| 9475 | 0x8000, 0x080c, 0x680b, 0x080c, 0x6d0d, 0x012e, 0x0005, 0xa016, | ||
| 9476 | 0x080c, 0x1824, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, | ||
| 9477 | 0xa182, 0x0040, 0x0023, 0x00de, 0x003e, 0x012e, 0x0005, 0xa44f, | ||
| 9478 | 0xa451, 0xa463, 0xa47e, 0xa44f, 0xa44f, 0xa44f, 0xa493, 0xa44f, | ||
| 9479 | 0xa44f, 0xa44f, 0xa44f, 0xa44f, 0xa44f, 0xa44f, 0xa44f, 0x080c, | ||
| 9480 | 0x14f6, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, | ||
| 9481 | 0xa39e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x67a8, | ||
| 9482 | 0x080c, 0x6c50, 0x0498, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, | ||
| 9483 | 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, | ||
| 9484 | 0x080c, 0x67a8, 0x080c, 0x6c50, 0x0408, 0x6013, 0x0000, 0x6017, | ||
| 9485 | 0x0000, 0x2019, 0x0004, 0x080c, 0xa91f, 0x00c0, 0x6010, 0x2068, | ||
| 9486 | 0x684c, 0xd0fc, 0x0d90, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, | ||
| 9487 | 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1e6e, 0x080c, 0x680b, | ||
| 9488 | 0x080c, 0x6d0d, 0x0018, 0xa016, 0x080c, 0x1824, 0x0005, 0x080c, | ||
| 9489 | 0x6b73, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, 0xabfa, | ||
| 9490 | 0x0036, 0x2019, 0x0029, 0x080c, 0xa91f, 0x003e, 0x00de, 0x080c, | ||
| 9491 | 0x974e, 0x080c, 0x6c50, 0x0005, 0x080c, 0x6c05, 0x6110, 0x81ff, | ||
| 9492 | 0x0158, 0x00d6, 0x2168, 0x080c, 0xabfa, 0x0036, 0x2019, 0x0029, | ||
| 9493 | 0x080c, 0xa91f, 0x003e, 0x00de, 0x080c, 0x974e, 0x080c, 0x6d0d, | ||
| 9494 | 0x0005, 0xa182, 0x0085, 0x0002, 0xa4cd, 0xa4cb, 0xa4cb, 0xa4d9, | ||
| 9495 | 0xa4cb, 0xa4cb, 0xa4cb, 0x080c, 0x14f6, 0x6003, 0x000b, 0x6106, | ||
| 9496 | 0x080c, 0x67a8, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c50, 0x012e, | ||
| 9497 | 0x0005, 0x0026, 0x00e6, 0x080c, 0xab4e, 0x0118, 0x080c, 0x8078, | ||
| 9498 | 0x00c8, 0x2071, 0xb280, 0x7224, 0x6212, 0x7220, 0x080c, 0xa7ce, | ||
| 9499 | 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, | ||
| 9500 | 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x67a8, | ||
| 9501 | 0x080c, 0x6c50, 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, | ||
| 9502 | 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x14f6, 0xa08a, 0x008c, 0x1a0c, | ||
| 9503 | 0x14f6, 0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, | ||
| 9504 | 0x0014, 0x0118, 0x080c, 0x80be, 0x0050, 0x2001, 0x0007, 0x080c, | ||
| 9505 | 0x4c5d, 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, | ||
| 9506 | 0xa527, 0xa529, 0xa529, 0xa527, 0xa527, 0xa527, 0xa527, 0x080c, | ||
| 9507 | 0x14f6, 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, | ||
| 9508 | 0xa182, 0x0085, 0x0a0c, 0x14f6, 0xa182, 0x008c, 0x1a0c, 0x14f6, | ||
| 9509 | 0xa182, 0x0085, 0x0002, 0xa542, 0xa542, 0xa542, 0xa544, 0xa542, | ||
| 9510 | 0xa542, 0xa542, 0x080c, 0x14f6, 0x0005, 0xa186, 0x0013, 0x0148, | ||
| 9511 | 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x80be, | ||
| 9512 | 0x0030, 0x080c, 0x6b73, 0x080c, 0x974e, 0x080c, 0x6c50, 0x0005, | ||
| 9513 | 0x0036, 0x080c, 0xabb4, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, | ||
| 9514 | 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, | ||
| 9515 | 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, | ||
| 9516 | 0x7b9a, 0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x7c34, | ||
| 9517 | 0x007e, 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, | ||
| 9518 | 0x0007, 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, | ||
| 9519 | 0xabb4, 0x601f, 0x0007, 0x2001, 0xafa3, 0x2004, 0x6016, 0x080c, | ||
| 9520 | 0x190b, 0x6010, 0x2068, 0x080c, 0x9596, 0x0110, 0x080c, 0xa91f, | ||
| 9521 | 0x00de, 0x6013, 0x0000, 0x080c, 0xabb4, 0x601f, 0x0007, 0x2001, | ||
| 9522 | 0xafa3, 0x2004, 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, | ||
| 9523 | 0x0036, 0x0156, 0x2079, 0xb280, 0x7938, 0x783c, 0x080c, 0x2676, | ||
| 9524 | 0x1904, 0xa5f1, 0x0016, 0x00c6, 0x080c, 0x4cdc, 0x15c0, 0x2011, | ||
| 9525 | 0xb290, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x8a7c, 0x1578, | ||
| 9526 | 0x001e, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x7cf4, | ||
| 9527 | 0x080c, 0x68e7, 0x0076, 0x2039, 0x0000, 0x080c, 0x681d, 0x007e, | ||
| 9528 | 0x001e, 0x0076, 0x2039, 0x0000, 0x080c, 0xa712, 0x007e, 0x080c, | ||
| 9529 | 0x4ecf, 0x0026, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, | ||
| 9530 | 0x0118, 0xa286, 0x0004, 0x1118, 0x62a0, 0x080c, 0x2b87, 0x002e, | ||
| 9531 | 0x001e, 0x080c, 0x493a, 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, | ||
| 9532 | 0x001e, 0x015e, 0x003e, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, | ||
| 9533 | 0x00e6, 0x0016, 0x2009, 0xad20, 0x2104, 0xa086, 0x0074, 0x1904, | ||
| 9534 | 0xa64b, 0x2069, 0xb28e, 0x690c, 0xa182, 0x0100, 0x06c0, 0x6908, | ||
| 9535 | 0xa184, 0x8000, 0x05e8, 0x2001, 0xaf9d, 0x2004, 0xa005, 0x1160, | ||
| 9536 | 0x6018, 0x2070, 0x7010, 0xa084, 0x00ff, 0x0118, 0x7000, 0xd0f4, | ||
| 9537 | 0x0118, 0xa184, 0x0800, 0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, | ||
| 9538 | 0x6914, 0x2069, 0xb2ae, 0x6904, 0x81ff, 0x1198, 0x690c, 0xa182, | ||
| 9539 | 0x0100, 0x02a8, 0x6908, 0x81ff, 0x1178, 0x6910, 0xa18a, 0x0001, | ||
| 9540 | 0x0288, 0x6918, 0xa18a, 0x0001, 0x0298, 0x00d0, 0x6013, 0x0100, | ||
| 9541 | 0x00a0, 0x6013, 0x0300, 0x0088, 0x6013, 0x0500, 0x0070, 0x6013, | ||
| 9542 | 0x0700, 0x0058, 0x6013, 0x0900, 0x0040, 0x6013, 0x0b00, 0x0028, | ||
| 9543 | 0x6013, 0x0f00, 0x0010, 0x6013, 0x2d00, 0xa085, 0x0001, 0x0008, | ||
| 9544 | 0xa006, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, | ||
| 9545 | 0x0026, 0x0036, 0x0156, 0x6218, 0x2268, 0x6b04, 0xa394, 0x00ff, | ||
| 9546 | 0xa286, 0x0006, 0x0190, 0xa286, 0x0004, 0x0178, 0xa394, 0xff00, | ||
| 9547 | 0x8217, 0xa286, 0x0006, 0x0148, 0xa286, 0x0004, 0x0130, 0x00c6, | ||
| 9548 | 0x2d60, 0x080c, 0x4ceb, 0x00ce, 0x04c0, 0x2011, 0xb296, 0xad98, | ||
| 9549 | 0x000a, 0x20a9, 0x0004, 0x080c, 0x8a7c, 0x1580, 0x2011, 0xb29a, | ||
| 9550 | 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x8a7c, 0x1538, 0x0046, | ||
| 9551 | 0x0016, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xad52, | ||
| 9552 | 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xa96c, 0x6800, | ||
| 9553 | 0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c, 0x68e7, 0x0076, 0x2039, | ||
| 9554 | 0x0000, 0x080c, 0x681d, 0x2c08, 0x080c, 0xa712, 0x007e, 0x2001, | ||
| 9555 | 0x0007, 0x080c, 0x4c5d, 0x001e, 0x004e, 0xa006, 0x015e, 0x003e, | ||
| 9556 | 0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6, 0x2069, 0xb28e, 0x6800, | ||
| 9557 | 0xa086, 0x0800, 0x0118, 0x6013, 0x0000, 0x0008, 0xa006, 0x00de, | ||
| 9558 | 0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, | ||
| 9559 | 0xb28c, 0x7930, 0x7834, 0x080c, 0x2676, 0x11a0, 0x080c, 0x4cdc, | ||
| 9560 | 0x1188, 0x2011, 0xb290, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, | ||
| 9561 | 0x8a7c, 0x1140, 0x2011, 0xb294, 0xac98, 0x0006, 0x20a9, 0x0004, | ||
| 9562 | 0x080c, 0x8a7c, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, | ||
| 9563 | 0x0005, 0x00c6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, | ||
| 9564 | 0xb283, 0x2204, 0x8211, 0x220c, 0x080c, 0x2676, 0x11a0, 0x080c, | ||
| 9565 | 0x4cdc, 0x1188, 0x2011, 0xb296, 0xac98, 0x000a, 0x20a9, 0x0004, | ||
| 9566 | 0x080c, 0x8a7c, 0x1140, 0x2011, 0xb29a, 0xac98, 0x0006, 0x20a9, | ||
| 9567 | 0x0004, 0x080c, 0x8a7c, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, | ||
| 9568 | 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, | ||
| 9569 | 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0xafd0, | ||
| 9570 | 0x252c, 0x2021, 0xafd6, 0x2424, 0x2061, 0xb400, 0x2071, 0xad00, | ||
| 9571 | 0x7644, 0x7064, 0x81ff, 0x0128, 0x8001, 0xa602, 0x1a04, 0xa78e, | ||
| 9572 | 0x0018, 0xa606, 0x0904, 0xa78e, 0x2100, 0xac06, 0x0904, 0xa785, | ||
| 9573 | 0x080c, 0xa990, 0x0904, 0xa785, 0x671c, 0xa786, 0x0001, 0x0904, | ||
| 9574 | 0xa7a5, 0xa786, 0x0004, 0x0904, 0xa7a5, 0xa786, 0x0007, 0x05e8, | ||
| 9575 | 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, 0x080c, 0xa9a0, | ||
| 9576 | 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, 0x00d6, 0x6000, | ||
| 9577 | 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x190b, 0x001e, 0xa786, | ||
| 9578 | 0x0008, 0x1148, 0x080c, 0x9789, 0x1130, 0x080c, 0x85f3, 0x00de, | ||
| 9579 | 0x080c, 0x974e, 0x00d0, 0x6010, 0x2068, 0x080c, 0x9596, 0x0190, | ||
| 9580 | 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, | ||
| 9581 | 0x080c, 0xabfa, 0x0016, 0x080c, 0x97fd, 0x080c, 0x510c, 0x001e, | ||
| 9582 | 0x080c, 0x9742, 0x00de, 0x080c, 0x974e, 0xace0, 0x0018, 0x2001, | ||
| 9583 | 0xad16, 0x2004, 0xac02, 0x1210, 0x0804, 0xa726, 0x012e, 0x002e, | ||
| 9584 | 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, | ||
| 9585 | 0xa786, 0x0006, 0x19c0, 0xa386, 0x0005, 0x0128, 0x080c, 0xabfa, | ||
| 9586 | 0x080c, 0xa91f, 0x08f8, 0x00de, 0x0c00, 0x080c, 0xa9a0, 0x19e8, | ||
| 9587 | 0x81ff, 0x09d8, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x0130, | ||
| 9588 | 0xa180, 0x0001, 0x2004, 0xa086, 0x002d, 0x1978, 0x6000, 0xa086, | ||
| 9589 | 0x0002, 0x1958, 0x080c, 0x9778, 0x0130, 0x080c, 0x9789, 0x1928, | ||
| 9590 | 0x080c, 0x85f3, 0x0038, 0x080c, 0x2aff, 0x080c, 0x9789, 0x1110, | ||
| 9591 | 0x080c, 0x85f3, 0x080c, 0x974e, 0x0804, 0xa785, 0x00c6, 0x00e6, | ||
| 9592 | 0x0016, 0x2c08, 0x2170, 0x080c, 0xa940, 0x001e, 0x0120, 0x601c, | ||
| 9593 | 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xa7e6, 0xa7e6, | ||
| 9594 | 0xa7e6, 0xa7e6, 0xa7e6, 0xa7e6, 0xa7e8, 0xa7e6, 0xa006, 0x0005, | ||
| 9595 | 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, | ||
| 9596 | 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xa96c, 0x001e, 0x004e, | ||
| 9597 | 0x0036, 0x2019, 0x0002, 0x080c, 0xa566, 0x003e, 0xa085, 0x0001, | ||
| 9598 | 0x0005, 0x2001, 0x0001, 0x080c, 0x4c1e, 0x0156, 0x0016, 0x0026, | ||
| 9599 | 0x0036, 0x20a9, 0x0004, 0x2019, 0xad05, 0x2011, 0xb296, 0x080c, | ||
| 9600 | 0x8a7c, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, | ||
| 9601 | 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026, 0x0126, 0x2091, | ||
| 9602 | 0x8000, 0x2740, 0x2061, 0xb400, 0x2079, 0x0001, 0x8fff, 0x0904, | ||
| 9603 | 0xa875, 0x2071, 0xad00, 0x7644, 0x7064, 0x8001, 0xa602, 0x1a04, | ||
| 9604 | 0xa875, 0x88ff, 0x0128, 0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, | ||
| 9605 | 0x080c, 0xa990, 0x0588, 0x2400, 0xac06, 0x0570, 0x671c, 0xa786, | ||
| 9606 | 0x0006, 0x1550, 0xa786, 0x0007, 0x0538, 0x88ff, 0x1140, 0x6018, | ||
| 9607 | 0xa206, 0x1510, 0x85ff, 0x0118, 0x6050, 0xa106, 0x11e8, 0x00d6, | ||
| 9608 | 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xabb4, 0x601f, 0x0007, | ||
| 9609 | 0x2001, 0xafa3, 0x2004, 0x6016, 0x080c, 0x190b, 0x6010, 0x2068, | ||
| 9610 | 0x080c, 0x9596, 0x0120, 0x0046, 0x080c, 0xa91f, 0x004e, 0x00de, | ||
| 9611 | 0x080c, 0x974e, 0x88ff, 0x1198, 0xace0, 0x0018, 0x2001, 0xad16, | ||
| 9612 | 0x2004, 0xac02, 0x1210, 0x0804, 0xa826, 0xa006, 0x012e, 0x002e, | ||
| 9613 | 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0xa8c5, | ||
| 9614 | 0x0001, 0x0ca0, 0x0076, 0x0056, 0x0086, 0x2041, 0x0000, 0x2029, | ||
| 9615 | 0x0001, 0x2c20, 0x2019, 0x0002, 0x6218, 0x0096, 0x2049, 0x0000, | ||
| 9616 | 0x080c, 0x7b9a, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x7c34, | ||
| 9617 | 0x080c, 0xa817, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, | ||
| 9618 | 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, | ||
| 9619 | 0x0000, 0x0016, 0x0036, 0x080c, 0x4cdc, 0x11b0, 0x2c10, 0x0056, | ||
| 9620 | 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, 0x0096, 0x2049, | ||
| 9621 | 0x0000, 0x080c, 0x7b9a, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, | ||
| 9622 | 0x7c34, 0x080c, 0xa817, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, | ||
| 9623 | 0xa8a9, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, | ||
| 9624 | 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, | ||
| 9625 | 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, 0x080c, 0x7b9a, 0x009e, | ||
| 9626 | 0x008e, 0x2039, 0x0000, 0x080c, 0x7c34, 0x2c20, 0x080c, 0xa817, | ||
| 9627 | 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, | ||
| 9628 | 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, | ||
| 9629 | 0x080c, 0x4cdc, 0x11c0, 0x2c10, 0x0086, 0x2041, 0x0000, 0x2828, | ||
| 9630 | 0x0046, 0x2021, 0x0001, 0x080c, 0xab96, 0x004e, 0x0096, 0x2049, | ||
| 9631 | 0x0000, 0x080c, 0x7b9a, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, | ||
| 9632 | 0x7c34, 0x080c, 0xa817, 0x003e, 0x001e, 0x8108, 0x1f04, 0xa8f6, | ||
| 9633 | 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0016, | ||
| 9634 | 0x00f6, 0x3800, 0xd08c, 0x0130, 0xad82, 0x1000, 0x02b0, 0xad82, | ||
| 9635 | 0xad00, 0x0230, 0xad82, 0xe400, 0x0280, 0xad82, 0xffff, 0x1268, | ||
| 9636 | 0x6800, 0xa07d, 0x0138, 0x6803, 0x0000, 0x6b52, 0x080c, 0x510c, | ||
| 9637 | 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x510c, 0x00fe, 0x001e, 0x0005, | ||
| 9638 | 0x00e6, 0x0046, 0x0036, 0x2061, 0xb400, 0x2071, 0xad00, 0x7444, | ||
| 9639 | 0x7064, 0x8001, 0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, | ||
| 9640 | 0xa086, 0x0000, 0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, | ||
| 9641 | 0x0006, 0x2424, 0xa406, 0x0140, 0xace0, 0x0018, 0x2001, 0xad16, | ||
| 9642 | 0x2004, 0xac02, 0x1220, 0x0c08, 0xa085, 0x0001, 0x0008, 0xa006, | ||
| 9643 | 0x003e, 0x004e, 0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x15d9, | ||
| 9644 | 0x000e, 0x090c, 0x14f6, 0x6837, 0x010d, 0x685e, 0x0026, 0x2010, | ||
| 9645 | 0x080c, 0x9586, 0x2001, 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, | ||
| 9646 | 0x2004, 0x002e, 0x684a, 0x6956, 0x6c46, 0x684f, 0x0000, 0xa006, | ||
| 9647 | 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x510c, 0x00de, 0x0005, | ||
| 9648 | 0x6700, 0xa786, 0x0000, 0x0158, 0xa786, 0x0001, 0x0140, 0xa786, | ||
| 9649 | 0x000a, 0x0128, 0xa786, 0x0009, 0x0110, 0xa085, 0x0001, 0x0005, | ||
| 9650 | 0x00e6, 0x6018, 0x2070, 0x70a0, 0xa206, 0x00ee, 0x0005, 0x0016, | ||
| 9651 | 0x6004, 0xa08e, 0x001e, 0x11a0, 0x8007, 0x6130, 0xa18c, 0x00ff, | ||
| 9652 | 0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0005, | ||
| 9653 | 0x2001, 0xafa4, 0x2004, 0x6016, 0x080c, 0x67a8, 0x080c, 0x6c50, | ||
| 9654 | 0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, 0x0158, | ||
| 9655 | 0xd0cc, 0x0118, 0x080c, 0x9866, 0x0030, 0x080c, 0xabb4, 0x080c, | ||
| 9656 | 0x6618, 0x080c, 0x8078, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, | ||
| 9657 | 0x000f, 0x0002, 0xa9e3, 0xa9e3, 0xa9e3, 0xa9e8, 0xa9e3, 0xa9e5, | ||
| 9658 | 0xa9e5, 0xa9e3, 0xa9e5, 0xa006, 0x0005, 0x00c6, 0x2260, 0x00ce, | ||
| 9659 | 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, | ||
| 9660 | 0x0002, 0xa9fa, 0xa9fa, 0xa9fa, 0xa9fa, 0xa9fa, 0xa9fa, 0xaa05, | ||
| 9661 | 0xa9fa, 0xa9fa, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, | ||
| 9662 | 0x6003, 0x0001, 0x080c, 0x67a8, 0x0005, 0x00c6, 0x2260, 0x080c, | ||
| 9663 | 0xabb4, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, 0x6037, | ||
| 9664 | 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, 0xaa60, | ||
| 9665 | 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x1110, | ||
| 9666 | 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x67a8, | ||
| 9667 | 0x080c, 0x6c50, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, 0x1904, | ||
| 9668 | 0xaae7, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, 0x190c, | ||
| 9669 | 0x14f6, 0x0804, 0xaae7, 0xa08c, 0xf000, 0x1130, 0x0028, 0x2068, | ||
| 9670 | 0x6800, 0xa005, 0x1de0, 0x2d00, 0xa080, 0x0013, 0x2004, 0xa084, | ||
| 9671 | 0x0003, 0xa086, 0x0002, 0x1180, 0x6010, 0x2068, 0x684c, 0xc0dc, | ||
| 9672 | 0xc0f4, 0x684e, 0x6850, 0xc0f4, 0xc0fc, 0x6852, 0x2009, 0x0043, | ||
| 9673 | 0x080c, 0xa3de, 0x0804, 0xaae7, 0x2009, 0x0041, 0x0804, 0xaae1, | ||
| 9674 | 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, | ||
| 9675 | 0x1118, 0x00de, 0x0804, 0xa9fa, 0xd0b4, 0x0128, 0xd0fc, 0x090c, | ||
| 9676 | 0x14f6, 0x0804, 0xaa18, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, | ||
| 9677 | 0x67a8, 0x080c, 0x6c50, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, | ||
| 9678 | 0x0120, 0xa186, 0x0004, 0x1904, 0xaae7, 0x2071, 0xaffd, 0x7000, | ||
| 9679 | 0xa086, 0x0003, 0x1128, 0x7004, 0xac06, 0x1110, 0x7003, 0x0000, | ||
| 9680 | 0x6810, 0xa080, 0x0013, 0x200c, 0xc1f4, 0xc1dc, 0x2102, 0x8000, | ||
| 9681 | 0x200c, 0xc1f4, 0xc1fc, 0xc1bc, 0x2102, 0x2009, 0x0042, 0x0804, | ||
| 9682 | 0xaae1, 0x0036, 0x00d6, 0x00d6, 0x080c, 0x15d9, 0x003e, 0x090c, | ||
| 9683 | 0x14f6, 0x6837, 0x010d, 0x6803, 0x0000, 0x683b, 0x0000, 0x685b, | ||
| 9684 | 0x0000, 0x6b5e, 0x6857, 0x0045, 0x2c00, 0x6862, 0x6034, 0x6872, | ||
| 9685 | 0x2360, 0x6020, 0xc0dd, 0x6022, 0x6018, 0xa080, 0x0028, 0x2004, | ||
| 9686 | 0xa084, 0x00ff, 0x8007, 0x6350, 0x6b4a, 0x6846, 0x684f, 0x0000, | ||
| 9687 | 0x6d6a, 0x6e66, 0x686f, 0x0001, 0x080c, 0x510c, 0x2019, 0x0045, | ||
| 9688 | 0x6008, 0x2068, 0x080c, 0xa566, 0x2d00, 0x600a, 0x601f, 0x0006, | ||
| 9689 | 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000, 0x00de, 0x003e, | ||
| 9690 | 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, 0x080c, 0xa3de, 0x00ce, | ||
| 9691 | 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, | ||
| 9692 | 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, 0x080c, 0x6b73, 0x0036, | ||
| 9693 | 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, 0x080c, 0xa91f, 0x00de, | ||
| 9694 | 0x003e, 0x080c, 0x6c50, 0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, | ||
| 9695 | 0x80be, 0x0005, 0xab13, 0xab11, 0xab11, 0xab11, 0xab11, 0xab11, | ||
| 9696 | 0xab13, 0x080c, 0x14f6, 0x080c, 0x6b73, 0x6003, 0x000c, 0x080c, | ||
| 9697 | 0x6c50, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, | ||
| 9698 | 0x001a, 0x080c, 0x80be, 0x0005, 0xab2b, 0xab2b, 0xab2b, 0xab2b, | ||
| 9699 | 0xab2d, 0xab4b, 0xab2b, 0x080c, 0x14f6, 0x00d6, 0x2c68, 0x080c, | ||
| 9700 | 0x8022, 0x01a0, 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xb28e, | ||
| 9701 | 0x210c, 0x6136, 0x2009, 0xb28f, 0x210c, 0x613a, 0x600b, 0xffff, | ||
| 9702 | 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, 0x67a8, 0x2d60, 0x080c, | ||
| 9703 | 0x8078, 0x00de, 0x0005, 0x080c, 0x8078, 0x0005, 0x00e6, 0x6018, | ||
| 9704 | 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x6010, 0xa080, 0x0013, | ||
| 9705 | 0x200c, 0xd1ec, 0x05d0, 0x2001, 0xad71, 0x2004, 0xd0ec, 0x05a8, | ||
| 9706 | 0x6003, 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, | ||
| 9707 | 0x2c78, 0x080c, 0x5025, 0x00fe, 0x0150, 0x2001, 0xafa5, 0x2004, | ||
| 9708 | 0x603e, 0x2009, 0xad71, 0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, | ||
| 9709 | 0xad71, 0x210c, 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022, 0xa006, | ||
| 9710 | 0x00a0, 0x2001, 0xafa5, 0x200c, 0x8103, 0xa100, 0x603e, 0x6018, | ||
| 9711 | 0xa088, 0x002b, 0x2104, 0xa005, 0x0118, 0xa088, 0x0003, 0x0cd0, | ||
| 9712 | 0x2c0a, 0x600f, 0x0000, 0xa085, 0x0001, 0x0005, 0x0016, 0x00c6, | ||
| 9713 | 0x00e6, 0x6150, 0xa2f0, 0x002b, 0x2e04, 0x2060, 0x8cff, 0x0180, | ||
| 9714 | 0x84ff, 0x1118, 0x6050, 0xa106, 0x1138, 0x600c, 0x2072, 0x080c, | ||
| 9715 | 0x6618, 0x080c, 0x8078, 0x0010, 0xacf0, 0x0003, 0x2e64, 0x0c70, | ||
| 9716 | 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x6018, 0xa0e8, 0x002b, | ||
| 9717 | 0x2d04, 0xa005, 0x0140, 0xac06, 0x0120, 0x2d04, 0xa0e8, 0x0003, | ||
| 9718 | 0x0cb8, 0x600c, 0x206a, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, | ||
| 9719 | 0x2011, 0xad27, 0x2204, 0xa084, 0x00ff, 0x2019, 0xb28e, 0x2334, | ||
| 9720 | 0xa636, 0x11d8, 0x8318, 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, | ||
| 9721 | 0x11a0, 0x2011, 0xb290, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, | ||
| 9722 | 0x080c, 0x8a7c, 0x1150, 0x2011, 0xb294, 0x6018, 0xa098, 0x0006, | ||
| 9723 | 0x20a9, 0x0004, 0x080c, 0x8a7c, 0x1100, 0x015e, 0x003e, 0x002e, | ||
| 9724 | 0x0005, 0x00e6, 0x2071, 0xad00, 0x080c, 0x48f5, 0x080c, 0x28fa, | ||
| 9725 | 0x00ee, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0fc, 0x0108, | ||
| 9726 | 0x0011, 0x00ee, 0x0005, 0x6850, 0xc0e5, 0x6852, 0x0005, 0x00e6, | ||
| 9727 | 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, 0x0126, | ||
| 9728 | 0x2091, 0x8000, 0x2029, 0xafd0, 0x252c, 0x2021, 0xafd6, 0x2424, | ||
| 9729 | 0x2061, 0xb400, 0x2071, 0xad00, 0x7644, 0x7064, 0xa606, 0x0578, | ||
| 9730 | 0x671c, 0xa786, 0x0001, 0x0118, 0xa786, 0x0008, 0x1500, 0x2500, | ||
| 9731 | 0xac06, 0x01e8, 0x2400, 0xac06, 0x01d0, 0x080c, 0xa990, 0x01b8, | ||
| 9732 | 0x080c, 0xa9a0, 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, | ||
| 9733 | 0x080c, 0x190b, 0x001e, 0x080c, 0x9778, 0x1110, 0x080c, 0x2aff, | ||
| 9734 | 0x080c, 0x9789, 0x1110, 0x080c, 0x85f3, 0x080c, 0x974e, 0xace0, | ||
| 9735 | 0x0018, 0x2001, 0xad16, 0x2004, 0xac02, 0x1208, 0x0858, 0x012e, | ||
| 9736 | 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, | ||
| 9737 | 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xad40, | ||
| 9738 | 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, 0x0118, 0x7030, | ||
| 9739 | 0x8000, 0x7032, 0xd5ac, 0x0118, 0x2071, 0xad4a, 0x0451, 0x00ee, | ||
| 9740 | 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, | ||
| 9741 | 0x2071, 0xad40, 0xd5a4, 0x0118, 0x7034, 0x8000, 0x7036, 0xd5b4, | ||
| 9742 | 0x0118, 0x7030, 0x8000, 0x7032, 0xd5ac, 0x0118, 0x2071, 0xad4a, | ||
| 9743 | 0x0081, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, | ||
| 9744 | 0x2091, 0x8000, 0x2071, 0xad42, 0x0021, 0x00ee, 0x000e, 0x012e, | ||
| 9745 | 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, | ||
| 9746 | 0x2072, 0x0005, 0x00e6, 0x2071, 0xad40, 0x0c99, 0x00ee, 0x0005, | ||
| 9747 | 0x00e6, 0x2071, 0xad44, 0x0c69, 0x00ee, 0x0005, 0x0001, 0x0002, | ||
| 9748 | 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, | ||
| 9749 | 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x8529 | ||
| 9750 | }; | ||
| 9751 | |||
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index 08665ea1e94e..670ef16a8437 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
| @@ -747,7 +747,7 @@ static void mv_dump_all_regs(void __iomem *mmio_base, int port, | |||
| 747 | mv_dump_mem(mmio_base+0xf00, 0x4); | 747 | mv_dump_mem(mmio_base+0xf00, 0x4); |
| 748 | mv_dump_mem(mmio_base+0x1d00, 0x6c); | 748 | mv_dump_mem(mmio_base+0x1d00, 0x6c); |
| 749 | for (hc = start_hc; hc < start_hc + num_hcs; hc++) { | 749 | for (hc = start_hc; hc < start_hc + num_hcs; hc++) { |
| 750 | hc_base = mv_hc_base(mmio_base, port >> MV_PORT_HC_SHIFT); | 750 | hc_base = mv_hc_base(mmio_base, hc); |
| 751 | DPRINTK("HC regs (HC %i):\n", hc); | 751 | DPRINTK("HC regs (HC %i):\n", hc); |
| 752 | mv_dump_mem(hc_base, 0x1c); | 752 | mv_dump_mem(hc_base, 0x1c); |
| 753 | } | 753 | } |
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 6913b0623167..73994e2ac2cb 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
| @@ -565,7 +565,8 @@ int scsi_dispatch_cmd(struct scsi_cmnd *cmd) | |||
| 565 | /* | 565 | /* |
| 566 | * If SCSI-2 or lower, store the LUN value in cmnd. | 566 | * If SCSI-2 or lower, store the LUN value in cmnd. |
| 567 | */ | 567 | */ |
| 568 | if (cmd->device->scsi_level <= SCSI_2) { | 568 | if (cmd->device->scsi_level <= SCSI_2 && |
| 569 | cmd->device->scsi_level != SCSI_UNKNOWN) { | ||
| 569 | cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) | | 570 | cmd->cmnd[1] = (cmd->cmnd[1] & 0x1f) | |
| 570 | (cmd->device->lun << 5 & 0xe0); | 571 | (cmd->device->lun << 5 & 0xe0); |
| 571 | } | 572 | } |
| @@ -1243,7 +1244,7 @@ static int __init init_scsi(void) | |||
| 1243 | if (error) | 1244 | if (error) |
| 1244 | goto cleanup_sysctl; | 1245 | goto cleanup_sysctl; |
| 1245 | 1246 | ||
| 1246 | for_each_cpu(i) | 1247 | for_each_possible_cpu(i) |
| 1247 | INIT_LIST_HEAD(&per_cpu(scsi_done_q, i)); | 1248 | INIT_LIST_HEAD(&per_cpu(scsi_done_q, i)); |
| 1248 | 1249 | ||
| 1249 | printk(KERN_NOTICE "SCSI subsystem initialized\n"); | 1250 | printk(KERN_NOTICE "SCSI subsystem initialized\n"); |
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c index 84c3937ae8fb..c750d3399a97 100644 --- a/drivers/scsi/scsi_devinfo.c +++ b/drivers/scsi/scsi_devinfo.c | |||
| @@ -132,7 +132,9 @@ static struct { | |||
| 132 | {"CMD", "CRA-7280", NULL, BLIST_SPARSELUN}, /* CMD RAID Controller */ | 132 | {"CMD", "CRA-7280", NULL, BLIST_SPARSELUN}, /* CMD RAID Controller */ |
| 133 | {"CNSI", "G7324", NULL, BLIST_SPARSELUN}, /* Chaparral G7324 RAID */ | 133 | {"CNSI", "G7324", NULL, BLIST_SPARSELUN}, /* Chaparral G7324 RAID */ |
| 134 | {"CNSi", "G8324", NULL, BLIST_SPARSELUN}, /* Chaparral G8324 RAID */ | 134 | {"CNSi", "G8324", NULL, BLIST_SPARSELUN}, /* Chaparral G8324 RAID */ |
| 135 | {"COMPAQ", "LOGICAL VOLUME", NULL, BLIST_FORCELUN}, | 135 | {"COMPAQ", "ARRAY CONTROLLER", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | |
| 136 | BLIST_MAX_512 | BLIST_REPORTLUN2}, /* Compaq RA4x00 */ | ||
| 137 | {"COMPAQ", "LOGICAL VOLUME", NULL, BLIST_FORCELUN | BLIST_MAX_512}, /* Compaq RA4x00 */ | ||
| 136 | {"COMPAQ", "CR3500", NULL, BLIST_FORCELUN}, | 138 | {"COMPAQ", "CR3500", NULL, BLIST_FORCELUN}, |
| 137 | {"COMPAQ", "MSA1000", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, | 139 | {"COMPAQ", "MSA1000", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, |
| 138 | {"COMPAQ", "MSA1000 VOLUME", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, | 140 | {"COMPAQ", "MSA1000 VOLUME", NULL, BLIST_SPARSELUN | BLIST_NOSTARTONADD}, |
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c index 36e930066649..a89aff61d3d8 100644 --- a/drivers/scsi/scsi_ioctl.c +++ b/drivers/scsi/scsi_ioctl.c | |||
| @@ -158,180 +158,6 @@ int scsi_set_medium_removal(struct scsi_device *sdev, char state) | |||
| 158 | EXPORT_SYMBOL(scsi_set_medium_removal); | 158 | EXPORT_SYMBOL(scsi_set_medium_removal); |
| 159 | 159 | ||
| 160 | /* | 160 | /* |
| 161 | * This interface is deprecated - users should use the scsi generic (sg) | ||
| 162 | * interface instead, as this is a more flexible approach to performing | ||
| 163 | * generic SCSI commands on a device. | ||
| 164 | * | ||
| 165 | * The structure that we are passed should look like: | ||
| 166 | * | ||
| 167 | * struct sdata { | ||
| 168 | * unsigned int inlen; [i] Length of data to be written to device | ||
| 169 | * unsigned int outlen; [i] Length of data to be read from device | ||
| 170 | * unsigned char cmd[x]; [i] SCSI command (6 <= x <= 12). | ||
| 171 | * [o] Data read from device starts here. | ||
| 172 | * [o] On error, sense buffer starts here. | ||
| 173 | * unsigned char wdata[y]; [i] Data written to device starts here. | ||
| 174 | * }; | ||
| 175 | * Notes: | ||
| 176 | * - The SCSI command length is determined by examining the 1st byte | ||
| 177 | * of the given command. There is no way to override this. | ||
| 178 | * - Data transfers are limited to PAGE_SIZE (4K on i386, 8K on alpha). | ||
| 179 | * - The length (x + y) must be at least OMAX_SB_LEN bytes long to | ||
| 180 | * accommodate the sense buffer when an error occurs. | ||
| 181 | * The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that | ||
| 182 | * old code will not be surprised. | ||
| 183 | * - If a Unix error occurs (e.g. ENOMEM) then the user will receive | ||
| 184 | * a negative return and the Unix error code in 'errno'. | ||
| 185 | * If the SCSI command succeeds then 0 is returned. | ||
| 186 | * Positive numbers returned are the compacted SCSI error codes (4 | ||
| 187 | * bytes in one int) where the lowest byte is the SCSI status. | ||
| 188 | * See the drivers/scsi/scsi.h file for more information on this. | ||
| 189 | * | ||
| 190 | */ | ||
| 191 | #define OMAX_SB_LEN 16 /* Old sense buffer length */ | ||
| 192 | |||
| 193 | int scsi_ioctl_send_command(struct scsi_device *sdev, | ||
| 194 | struct scsi_ioctl_command __user *sic) | ||
| 195 | { | ||
| 196 | char *buf; | ||
| 197 | unsigned char cmd[MAX_COMMAND_SIZE]; | ||
| 198 | unsigned char sense[SCSI_SENSE_BUFFERSIZE]; | ||
| 199 | char __user *cmd_in; | ||
| 200 | unsigned char opcode; | ||
| 201 | unsigned int inlen, outlen, cmdlen; | ||
| 202 | unsigned int needed, buf_needed; | ||
| 203 | int timeout, retries, result; | ||
| 204 | int data_direction; | ||
| 205 | gfp_t gfp_mask = GFP_KERNEL; | ||
| 206 | |||
| 207 | if (!sic) | ||
| 208 | return -EINVAL; | ||
| 209 | |||
| 210 | if (sdev->host->unchecked_isa_dma) | ||
| 211 | gfp_mask |= GFP_DMA; | ||
| 212 | |||
| 213 | /* | ||
| 214 | * Verify that we can read at least this much. | ||
| 215 | */ | ||
| 216 | if (!access_ok(VERIFY_READ, sic, sizeof(Scsi_Ioctl_Command))) | ||
| 217 | return -EFAULT; | ||
| 218 | |||
| 219 | if(__get_user(inlen, &sic->inlen)) | ||
| 220 | return -EFAULT; | ||
| 221 | |||
| 222 | if(__get_user(outlen, &sic->outlen)) | ||
| 223 | return -EFAULT; | ||
| 224 | |||
| 225 | /* | ||
| 226 | * We do not transfer more than MAX_BUF with this interface. | ||
| 227 | * If the user needs to transfer more data than this, they | ||
| 228 | * should use scsi_generics (sg) instead. | ||
| 229 | */ | ||
| 230 | if (inlen > MAX_BUF) | ||
| 231 | return -EINVAL; | ||
| 232 | if (outlen > MAX_BUF) | ||
| 233 | return -EINVAL; | ||
| 234 | |||
| 235 | cmd_in = sic->data; | ||
| 236 | if(get_user(opcode, cmd_in)) | ||
| 237 | return -EFAULT; | ||
| 238 | |||
| 239 | needed = buf_needed = (inlen > outlen ? inlen : outlen); | ||
| 240 | if (buf_needed) { | ||
| 241 | buf_needed = (buf_needed + 511) & ~511; | ||
| 242 | if (buf_needed > MAX_BUF) | ||
| 243 | buf_needed = MAX_BUF; | ||
| 244 | buf = kzalloc(buf_needed, gfp_mask); | ||
| 245 | if (!buf) | ||
| 246 | return -ENOMEM; | ||
| 247 | if (inlen == 0) { | ||
| 248 | data_direction = DMA_FROM_DEVICE; | ||
| 249 | } else if (outlen == 0 ) { | ||
| 250 | data_direction = DMA_TO_DEVICE; | ||
| 251 | } else { | ||
| 252 | /* | ||
| 253 | * Can this ever happen? | ||
| 254 | */ | ||
| 255 | data_direction = DMA_BIDIRECTIONAL; | ||
| 256 | } | ||
| 257 | |||
| 258 | } else { | ||
| 259 | buf = NULL; | ||
| 260 | data_direction = DMA_NONE; | ||
| 261 | } | ||
| 262 | |||
| 263 | /* | ||
| 264 | * Obtain the command from the user's address space. | ||
| 265 | */ | ||
| 266 | cmdlen = COMMAND_SIZE(opcode); | ||
| 267 | |||
| 268 | result = -EFAULT; | ||
| 269 | |||
| 270 | if (!access_ok(VERIFY_READ, cmd_in, cmdlen + inlen)) | ||
| 271 | goto error; | ||
| 272 | |||
| 273 | if(__copy_from_user(cmd, cmd_in, cmdlen)) | ||
| 274 | goto error; | ||
| 275 | |||
| 276 | /* | ||
| 277 | * Obtain the data to be sent to the device (if any). | ||
| 278 | */ | ||
| 279 | |||
| 280 | if(inlen && copy_from_user(buf, cmd_in + cmdlen, inlen)) | ||
| 281 | goto error; | ||
| 282 | |||
| 283 | switch (opcode) { | ||
| 284 | case SEND_DIAGNOSTIC: | ||
| 285 | case FORMAT_UNIT: | ||
| 286 | timeout = FORMAT_UNIT_TIMEOUT; | ||
| 287 | retries = 1; | ||
| 288 | break; | ||
| 289 | case START_STOP: | ||
| 290 | timeout = START_STOP_TIMEOUT; | ||
| 291 | retries = NORMAL_RETRIES; | ||
| 292 | break; | ||
| 293 | case MOVE_MEDIUM: | ||
| 294 | timeout = MOVE_MEDIUM_TIMEOUT; | ||
| 295 | retries = NORMAL_RETRIES; | ||
| 296 | break; | ||
| 297 | case READ_ELEMENT_STATUS: | ||
| 298 | timeout = READ_ELEMENT_STATUS_TIMEOUT; | ||
| 299 | retries = NORMAL_RETRIES; | ||
| 300 | break; | ||
| 301 | case READ_DEFECT_DATA: | ||
| 302 | timeout = READ_DEFECT_DATA_TIMEOUT; | ||
| 303 | retries = 1; | ||
| 304 | break; | ||
| 305 | default: | ||
| 306 | timeout = IOCTL_NORMAL_TIMEOUT; | ||
| 307 | retries = NORMAL_RETRIES; | ||
| 308 | break; | ||
| 309 | } | ||
| 310 | |||
| 311 | result = scsi_execute(sdev, cmd, data_direction, buf, needed, | ||
| 312 | sense, timeout, retries, 0); | ||
| 313 | |||
| 314 | /* | ||
| 315 | * If there was an error condition, pass the info back to the user. | ||
| 316 | */ | ||
| 317 | if (result) { | ||
| 318 | int sb_len = sizeof(*sense); | ||
| 319 | |||
| 320 | sb_len = (sb_len > OMAX_SB_LEN) ? OMAX_SB_LEN : sb_len; | ||
| 321 | if (copy_to_user(cmd_in, sense, sb_len)) | ||
| 322 | result = -EFAULT; | ||
| 323 | } else { | ||
| 324 | if (outlen && copy_to_user(cmd_in, buf, outlen)) | ||
| 325 | result = -EFAULT; | ||
| 326 | } | ||
| 327 | |||
| 328 | error: | ||
| 329 | kfree(buf); | ||
| 330 | return result; | ||
| 331 | } | ||
| 332 | EXPORT_SYMBOL(scsi_ioctl_send_command); | ||
| 333 | |||
| 334 | /* | ||
| 335 | * The scsi_ioctl_get_pci() function places into arg the value | 161 | * The scsi_ioctl_get_pci() function places into arg the value |
| 336 | * pci_dev::slot_name (8 characters) for the PCI device (if any). | 162 | * pci_dev::slot_name (8 characters) for the PCI device (if any). |
| 337 | * Returns: 0 on success | 163 | * Returns: 0 on success |
| @@ -409,7 +235,7 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) | |||
| 409 | case SCSI_IOCTL_SEND_COMMAND: | 235 | case SCSI_IOCTL_SEND_COMMAND: |
| 410 | if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) | 236 | if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) |
| 411 | return -EACCES; | 237 | return -EACCES; |
| 412 | return scsi_ioctl_send_command(sdev, arg); | 238 | return sg_scsi_ioctl(NULL, sdev->request_queue, NULL, arg); |
| 413 | case SCSI_IOCTL_DOORLOCK: | 239 | case SCSI_IOCTL_DOORLOCK: |
| 414 | return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); | 240 | return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); |
| 415 | case SCSI_IOCTL_DOORUNLOCK: | 241 | case SCSI_IOCTL_DOORUNLOCK: |
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 8f010a314a3d..7b0f9a3810d2 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -1479,6 +1479,8 @@ static inline int scsi_host_queue_ready(struct request_queue *q, | |||
| 1479 | static void scsi_kill_request(struct request *req, request_queue_t *q) | 1479 | static void scsi_kill_request(struct request *req, request_queue_t *q) |
| 1480 | { | 1480 | { |
| 1481 | struct scsi_cmnd *cmd = req->special; | 1481 | struct scsi_cmnd *cmd = req->special; |
| 1482 | struct scsi_device *sdev = cmd->device; | ||
| 1483 | struct Scsi_Host *shost = sdev->host; | ||
| 1482 | 1484 | ||
| 1483 | blkdev_dequeue_request(req); | 1485 | blkdev_dequeue_request(req); |
| 1484 | 1486 | ||
| @@ -1491,6 +1493,19 @@ static void scsi_kill_request(struct request *req, request_queue_t *q) | |||
| 1491 | scsi_init_cmd_errh(cmd); | 1493 | scsi_init_cmd_errh(cmd); |
| 1492 | cmd->result = DID_NO_CONNECT << 16; | 1494 | cmd->result = DID_NO_CONNECT << 16; |
| 1493 | atomic_inc(&cmd->device->iorequest_cnt); | 1495 | atomic_inc(&cmd->device->iorequest_cnt); |
| 1496 | |||
| 1497 | /* | ||
| 1498 | * SCSI request completion path will do scsi_device_unbusy(), | ||
| 1499 | * bump busy counts. To bump the counters, we need to dance | ||
| 1500 | * with the locks as normal issue path does. | ||
| 1501 | */ | ||
| 1502 | sdev->device_busy++; | ||
| 1503 | spin_unlock(sdev->request_queue->queue_lock); | ||
| 1504 | spin_lock(shost->host_lock); | ||
| 1505 | shost->host_busy++; | ||
| 1506 | spin_unlock(shost->host_lock); | ||
| 1507 | spin_lock(sdev->request_queue->queue_lock); | ||
| 1508 | |||
| 1494 | __scsi_done(cmd); | 1509 | __scsi_done(cmd); |
| 1495 | } | 1510 | } |
| 1496 | 1511 | ||
diff --git a/drivers/scsi/scsi_sas_internal.h b/drivers/scsi/scsi_sas_internal.h new file mode 100644 index 000000000000..d76e6e3d8ca5 --- /dev/null +++ b/drivers/scsi/scsi_sas_internal.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | #ifndef _SCSI_SAS_INTERNAL_H | ||
| 2 | #define _SCSI_SAS_INTERNAL_H | ||
| 3 | |||
| 4 | #define SAS_HOST_ATTRS 0 | ||
| 5 | #define SAS_PORT_ATTRS 17 | ||
| 6 | #define SAS_RPORT_ATTRS 7 | ||
| 7 | #define SAS_END_DEV_ATTRS 3 | ||
| 8 | #define SAS_EXPANDER_ATTRS 7 | ||
| 9 | |||
| 10 | struct sas_internal { | ||
| 11 | struct scsi_transport_template t; | ||
| 12 | struct sas_function_template *f; | ||
| 13 | struct sas_domain_function_template *dft; | ||
| 14 | |||
| 15 | struct class_device_attribute private_host_attrs[SAS_HOST_ATTRS]; | ||
| 16 | struct class_device_attribute private_phy_attrs[SAS_PORT_ATTRS]; | ||
| 17 | struct class_device_attribute private_rphy_attrs[SAS_RPORT_ATTRS]; | ||
| 18 | struct class_device_attribute private_end_dev_attrs[SAS_END_DEV_ATTRS]; | ||
| 19 | struct class_device_attribute private_expander_attrs[SAS_EXPANDER_ATTRS]; | ||
| 20 | |||
| 21 | struct transport_container phy_attr_cont; | ||
| 22 | struct transport_container rphy_attr_cont; | ||
| 23 | struct transport_container end_dev_attr_cont; | ||
| 24 | struct transport_container expander_attr_cont; | ||
| 25 | |||
| 26 | /* | ||
| 27 | * The array of null terminated pointers to attributes | ||
| 28 | * needed by scsi_sysfs.c | ||
| 29 | */ | ||
| 30 | struct class_device_attribute *host_attrs[SAS_HOST_ATTRS + 1]; | ||
| 31 | struct class_device_attribute *phy_attrs[SAS_PORT_ATTRS + 1]; | ||
| 32 | struct class_device_attribute *rphy_attrs[SAS_RPORT_ATTRS + 1]; | ||
| 33 | struct class_device_attribute *end_dev_attrs[SAS_END_DEV_ATTRS + 1]; | ||
| 34 | struct class_device_attribute *expander_attrs[SAS_EXPANDER_ATTRS + 1]; | ||
| 35 | }; | ||
| 36 | #define to_sas_internal(tmpl) container_of(tmpl, struct sas_internal, t) | ||
| 37 | |||
| 38 | #endif | ||
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index f14945996ede..1a5474bd11a1 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
| @@ -673,6 +673,7 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) | |||
| 673 | case TYPE_MEDIUM_CHANGER: | 673 | case TYPE_MEDIUM_CHANGER: |
| 674 | case TYPE_ENCLOSURE: | 674 | case TYPE_ENCLOSURE: |
| 675 | case TYPE_COMM: | 675 | case TYPE_COMM: |
| 676 | case TYPE_RAID: | ||
| 676 | case TYPE_RBC: | 677 | case TYPE_RBC: |
| 677 | sdev->writeable = 1; | 678 | sdev->writeable = 1; |
| 678 | break; | 679 | break; |
| @@ -738,6 +739,13 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) | |||
| 738 | sdev->select_no_atn = 1; | 739 | sdev->select_no_atn = 1; |
| 739 | 740 | ||
| 740 | /* | 741 | /* |
| 742 | * Maximum 512 sector transfer length | ||
| 743 | * broken RA4x00 Compaq Disk Array | ||
| 744 | */ | ||
| 745 | if (*bflags & BLIST_MAX_512) | ||
| 746 | blk_queue_max_sectors(sdev->request_queue, 512); | ||
| 747 | |||
| 748 | /* | ||
| 741 | * Some devices may not want to have a start command automatically | 749 | * Some devices may not want to have a start command automatically |
| 742 | * issued when a device is added. | 750 | * issued when a device is added. |
| 743 | */ | 751 | */ |
| @@ -1123,10 +1131,13 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, | |||
| 1123 | * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does | 1131 | * Also allow SCSI-2 if BLIST_REPORTLUN2 is set and host adapter does |
| 1124 | * support more than 8 LUNs. | 1132 | * support more than 8 LUNs. |
| 1125 | */ | 1133 | */ |
| 1126 | if ((bflags & BLIST_NOREPORTLUN) || | 1134 | if (bflags & BLIST_NOREPORTLUN) |
| 1127 | starget->scsi_level < SCSI_2 || | 1135 | return 1; |
| 1128 | (starget->scsi_level < SCSI_3 && | 1136 | if (starget->scsi_level < SCSI_2 && |
| 1129 | (!(bflags & BLIST_REPORTLUN2) || shost->max_lun <= 8)) ) | 1137 | starget->scsi_level != SCSI_UNKNOWN) |
| 1138 | return 1; | ||
| 1139 | if (starget->scsi_level < SCSI_3 && | ||
| 1140 | (!(bflags & BLIST_REPORTLUN2) || shost->max_lun <= 8)) | ||
| 1130 | return 1; | 1141 | return 1; |
| 1131 | if (bflags & BLIST_NOLUN) | 1142 | if (bflags & BLIST_NOLUN) |
| 1132 | return 0; | 1143 | return 0; |
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 8db656214b5c..95c5478dcdfd 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c | |||
| @@ -34,6 +34,8 @@ | |||
| 34 | #include <scsi/scsi_cmnd.h> | 34 | #include <scsi/scsi_cmnd.h> |
| 35 | #include "scsi_priv.h" | 35 | #include "scsi_priv.h" |
| 36 | 36 | ||
| 37 | static int fc_queue_work(struct Scsi_Host *, struct work_struct *); | ||
| 38 | |||
| 37 | /* | 39 | /* |
| 38 | * Redefine so that we can have same named attributes in the | 40 | * Redefine so that we can have same named attributes in the |
| 39 | * sdev/starget/host objects. | 41 | * sdev/starget/host objects. |
| @@ -213,10 +215,8 @@ fc_bitfield_name_search(remote_port_roles, fc_remote_port_role_names) | |||
| 213 | #define FC_MGMTSRVR_PORTID 0x00000a | 215 | #define FC_MGMTSRVR_PORTID 0x00000a |
| 214 | 216 | ||
| 215 | 217 | ||
| 216 | static void fc_shost_remove_rports(void *data); | ||
| 217 | static void fc_timeout_deleted_rport(void *data); | 218 | static void fc_timeout_deleted_rport(void *data); |
| 218 | static void fc_scsi_scan_rport(void *data); | 219 | static void fc_scsi_scan_rport(void *data); |
| 219 | static void fc_rport_terminate(struct fc_rport *rport); | ||
| 220 | 220 | ||
| 221 | /* | 221 | /* |
| 222 | * Attribute counts pre object type... | 222 | * Attribute counts pre object type... |
| @@ -288,42 +288,58 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, | |||
| 288 | struct class_device *cdev) | 288 | struct class_device *cdev) |
| 289 | { | 289 | { |
| 290 | struct Scsi_Host *shost = dev_to_shost(dev); | 290 | struct Scsi_Host *shost = dev_to_shost(dev); |
| 291 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); | ||
| 291 | 292 | ||
| 292 | /* | 293 | /* |
| 293 | * Set default values easily detected by the midlayer as | 294 | * Set default values easily detected by the midlayer as |
| 294 | * failure cases. The scsi lldd is responsible for initializing | 295 | * failure cases. The scsi lldd is responsible for initializing |
| 295 | * all transport attributes to valid values per host. | 296 | * all transport attributes to valid values per host. |
| 296 | */ | 297 | */ |
| 297 | fc_host_node_name(shost) = -1; | 298 | fc_host->node_name = -1; |
| 298 | fc_host_port_name(shost) = -1; | 299 | fc_host->port_name = -1; |
| 299 | fc_host_permanent_port_name(shost) = -1; | 300 | fc_host->permanent_port_name = -1; |
| 300 | fc_host_supported_classes(shost) = FC_COS_UNSPECIFIED; | 301 | fc_host->supported_classes = FC_COS_UNSPECIFIED; |
| 301 | memset(fc_host_supported_fc4s(shost), 0, | 302 | memset(fc_host->supported_fc4s, 0, |
| 302 | sizeof(fc_host_supported_fc4s(shost))); | 303 | sizeof(fc_host->supported_fc4s)); |
| 303 | memset(fc_host_symbolic_name(shost), 0, | 304 | memset(fc_host->symbolic_name, 0, |
| 304 | sizeof(fc_host_symbolic_name(shost))); | 305 | sizeof(fc_host->symbolic_name)); |
| 305 | fc_host_supported_speeds(shost) = FC_PORTSPEED_UNKNOWN; | 306 | fc_host->supported_speeds = FC_PORTSPEED_UNKNOWN; |
| 306 | fc_host_maxframe_size(shost) = -1; | 307 | fc_host->maxframe_size = -1; |
| 307 | memset(fc_host_serial_number(shost), 0, | 308 | memset(fc_host->serial_number, 0, |
| 308 | sizeof(fc_host_serial_number(shost))); | 309 | sizeof(fc_host->serial_number)); |
| 309 | 310 | ||
| 310 | fc_host_port_id(shost) = -1; | 311 | fc_host->port_id = -1; |
| 311 | fc_host_port_type(shost) = FC_PORTTYPE_UNKNOWN; | 312 | fc_host->port_type = FC_PORTTYPE_UNKNOWN; |
| 312 | fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN; | 313 | fc_host->port_state = FC_PORTSTATE_UNKNOWN; |
| 313 | memset(fc_host_active_fc4s(shost), 0, | 314 | memset(fc_host->active_fc4s, 0, |
| 314 | sizeof(fc_host_active_fc4s(shost))); | 315 | sizeof(fc_host->active_fc4s)); |
| 315 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; | 316 | fc_host->speed = FC_PORTSPEED_UNKNOWN; |
| 316 | fc_host_fabric_name(shost) = -1; | 317 | fc_host->fabric_name = -1; |
| 317 | 318 | ||
| 318 | fc_host_tgtid_bind_type(shost) = FC_TGTID_BIND_BY_WWPN; | 319 | fc_host->tgtid_bind_type = FC_TGTID_BIND_BY_WWPN; |
| 319 | 320 | ||
| 320 | INIT_LIST_HEAD(&fc_host_rports(shost)); | 321 | INIT_LIST_HEAD(&fc_host->rports); |
| 321 | INIT_LIST_HEAD(&fc_host_rport_bindings(shost)); | 322 | INIT_LIST_HEAD(&fc_host->rport_bindings); |
| 322 | fc_host_next_rport_number(shost) = 0; | 323 | fc_host->next_rport_number = 0; |
| 323 | fc_host_next_target_id(shost) = 0; | 324 | fc_host->next_target_id = 0; |
| 324 | 325 | ||
| 325 | fc_host_flags(shost) = 0; | 326 | snprintf(fc_host->work_q_name, KOBJ_NAME_LEN, "fc_wq_%d", |
| 326 | INIT_WORK(&fc_host_rport_del_work(shost), fc_shost_remove_rports, shost); | 327 | shost->host_no); |
| 328 | fc_host->work_q = create_singlethread_workqueue( | ||
| 329 | fc_host->work_q_name); | ||
| 330 | if (!fc_host->work_q) | ||
| 331 | return -ENOMEM; | ||
| 332 | |||
| 333 | snprintf(fc_host->devloss_work_q_name, KOBJ_NAME_LEN, "fc_dl_%d", | ||
| 334 | shost->host_no); | ||
| 335 | fc_host->devloss_work_q = create_singlethread_workqueue( | ||
| 336 | fc_host->devloss_work_q_name); | ||
| 337 | if (!fc_host->devloss_work_q) { | ||
| 338 | destroy_workqueue(fc_host->work_q); | ||
| 339 | fc_host->work_q = NULL; | ||
| 340 | return -ENOMEM; | ||
| 341 | } | ||
| 342 | |||
| 327 | return 0; | 343 | return 0; |
| 328 | } | 344 | } |
| 329 | 345 | ||
| @@ -879,9 +895,9 @@ store_fc_private_host_tgtid_bind_type(struct class_device *cdev, | |||
| 879 | while (!list_empty(&fc_host_rport_bindings(shost))) { | 895 | while (!list_empty(&fc_host_rport_bindings(shost))) { |
| 880 | get_list_head_entry(rport, | 896 | get_list_head_entry(rport, |
| 881 | &fc_host_rport_bindings(shost), peers); | 897 | &fc_host_rport_bindings(shost), peers); |
| 882 | spin_unlock_irqrestore(shost->host_lock, flags); | 898 | list_del(&rport->peers); |
| 883 | fc_rport_terminate(rport); | 899 | rport->port_state = FC_PORTSTATE_DELETED; |
| 884 | spin_lock_irqsave(shost->host_lock, flags); | 900 | fc_queue_work(shost, &rport->rport_delete_work); |
| 885 | } | 901 | } |
| 886 | spin_unlock_irqrestore(shost->host_lock, flags); | 902 | spin_unlock_irqrestore(shost->host_lock, flags); |
| 887 | } | 903 | } |
| @@ -1262,6 +1278,90 @@ void fc_release_transport(struct scsi_transport_template *t) | |||
| 1262 | } | 1278 | } |
| 1263 | EXPORT_SYMBOL(fc_release_transport); | 1279 | EXPORT_SYMBOL(fc_release_transport); |
| 1264 | 1280 | ||
| 1281 | /** | ||
| 1282 | * fc_queue_work - Queue work to the fc_host workqueue. | ||
| 1283 | * @shost: Pointer to Scsi_Host bound to fc_host. | ||
| 1284 | * @work: Work to queue for execution. | ||
| 1285 | * | ||
| 1286 | * Return value: | ||
| 1287 | * 0 on success / != 0 for error | ||
| 1288 | **/ | ||
| 1289 | static int | ||
| 1290 | fc_queue_work(struct Scsi_Host *shost, struct work_struct *work) | ||
| 1291 | { | ||
| 1292 | if (unlikely(!fc_host_work_q(shost))) { | ||
| 1293 | printk(KERN_ERR | ||
| 1294 | "ERROR: FC host '%s' attempted to queue work, " | ||
| 1295 | "when no workqueue created.\n", shost->hostt->name); | ||
| 1296 | dump_stack(); | ||
| 1297 | |||
| 1298 | return -EINVAL; | ||
| 1299 | } | ||
| 1300 | |||
| 1301 | return queue_work(fc_host_work_q(shost), work); | ||
| 1302 | } | ||
| 1303 | |||
| 1304 | /** | ||
| 1305 | * fc_flush_work - Flush a fc_host's workqueue. | ||
| 1306 | * @shost: Pointer to Scsi_Host bound to fc_host. | ||
| 1307 | **/ | ||
| 1308 | static void | ||
| 1309 | fc_flush_work(struct Scsi_Host *shost) | ||
| 1310 | { | ||
| 1311 | if (!fc_host_work_q(shost)) { | ||
| 1312 | printk(KERN_ERR | ||
| 1313 | "ERROR: FC host '%s' attempted to flush work, " | ||
| 1314 | "when no workqueue created.\n", shost->hostt->name); | ||
| 1315 | dump_stack(); | ||
| 1316 | return; | ||
| 1317 | } | ||
| 1318 | |||
| 1319 | flush_workqueue(fc_host_work_q(shost)); | ||
| 1320 | } | ||
| 1321 | |||
| 1322 | /** | ||
| 1323 | * fc_queue_devloss_work - Schedule work for the fc_host devloss workqueue. | ||
| 1324 | * @shost: Pointer to Scsi_Host bound to fc_host. | ||
| 1325 | * @work: Work to queue for execution. | ||
| 1326 | * @delay: jiffies to delay the work queuing | ||
| 1327 | * | ||
| 1328 | * Return value: | ||
| 1329 | * 0 on success / != 0 for error | ||
| 1330 | **/ | ||
| 1331 | static int | ||
| 1332 | fc_queue_devloss_work(struct Scsi_Host *shost, struct work_struct *work, | ||
| 1333 | unsigned long delay) | ||
| 1334 | { | ||
| 1335 | if (unlikely(!fc_host_devloss_work_q(shost))) { | ||
| 1336 | printk(KERN_ERR | ||
| 1337 | "ERROR: FC host '%s' attempted to queue work, " | ||
| 1338 | "when no workqueue created.\n", shost->hostt->name); | ||
| 1339 | dump_stack(); | ||
| 1340 | |||
| 1341 | return -EINVAL; | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | return queue_delayed_work(fc_host_devloss_work_q(shost), work, delay); | ||
| 1345 | } | ||
| 1346 | |||
| 1347 | /** | ||
| 1348 | * fc_flush_devloss - Flush a fc_host's devloss workqueue. | ||
| 1349 | * @shost: Pointer to Scsi_Host bound to fc_host. | ||
| 1350 | **/ | ||
| 1351 | static void | ||
| 1352 | fc_flush_devloss(struct Scsi_Host *shost) | ||
| 1353 | { | ||
| 1354 | if (!fc_host_devloss_work_q(shost)) { | ||
| 1355 | printk(KERN_ERR | ||
| 1356 | "ERROR: FC host '%s' attempted to flush work, " | ||
| 1357 | "when no workqueue created.\n", shost->hostt->name); | ||
| 1358 | dump_stack(); | ||
| 1359 | return; | ||
| 1360 | } | ||
| 1361 | |||
| 1362 | flush_workqueue(fc_host_devloss_work_q(shost)); | ||
| 1363 | } | ||
| 1364 | |||
| 1265 | 1365 | ||
| 1266 | /** | 1366 | /** |
| 1267 | * fc_remove_host - called to terminate any fc_transport-related elements | 1367 | * fc_remove_host - called to terminate any fc_transport-related elements |
| @@ -1283,36 +1383,103 @@ void | |||
| 1283 | fc_remove_host(struct Scsi_Host *shost) | 1383 | fc_remove_host(struct Scsi_Host *shost) |
| 1284 | { | 1384 | { |
| 1285 | struct fc_rport *rport, *next_rport; | 1385 | struct fc_rport *rport, *next_rport; |
| 1386 | struct workqueue_struct *work_q; | ||
| 1387 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); | ||
| 1286 | 1388 | ||
| 1287 | /* Remove any remote ports */ | 1389 | /* Remove any remote ports */ |
| 1288 | list_for_each_entry_safe(rport, next_rport, | 1390 | list_for_each_entry_safe(rport, next_rport, |
| 1289 | &fc_host_rports(shost), peers) | 1391 | &fc_host->rports, peers) { |
| 1290 | fc_rport_terminate(rport); | 1392 | list_del(&rport->peers); |
| 1393 | rport->port_state = FC_PORTSTATE_DELETED; | ||
| 1394 | fc_queue_work(shost, &rport->rport_delete_work); | ||
| 1395 | } | ||
| 1396 | |||
| 1291 | list_for_each_entry_safe(rport, next_rport, | 1397 | list_for_each_entry_safe(rport, next_rport, |
| 1292 | &fc_host_rport_bindings(shost), peers) | 1398 | &fc_host->rport_bindings, peers) { |
| 1293 | fc_rport_terminate(rport); | 1399 | list_del(&rport->peers); |
| 1400 | rport->port_state = FC_PORTSTATE_DELETED; | ||
| 1401 | fc_queue_work(shost, &rport->rport_delete_work); | ||
| 1402 | } | ||
| 1403 | |||
| 1404 | /* flush all scan work items */ | ||
| 1405 | scsi_flush_work(shost); | ||
| 1406 | |||
| 1407 | /* flush all stgt delete, and rport delete work items, then kill it */ | ||
| 1408 | if (fc_host->work_q) { | ||
| 1409 | work_q = fc_host->work_q; | ||
| 1410 | fc_host->work_q = NULL; | ||
| 1411 | destroy_workqueue(work_q); | ||
| 1412 | } | ||
| 1413 | |||
| 1414 | /* flush all devloss work items, then kill it */ | ||
| 1415 | if (fc_host->devloss_work_q) { | ||
| 1416 | work_q = fc_host->devloss_work_q; | ||
| 1417 | fc_host->devloss_work_q = NULL; | ||
| 1418 | destroy_workqueue(work_q); | ||
| 1419 | } | ||
| 1294 | } | 1420 | } |
| 1295 | EXPORT_SYMBOL(fc_remove_host); | 1421 | EXPORT_SYMBOL(fc_remove_host); |
| 1296 | 1422 | ||
| 1297 | /* | 1423 | |
| 1298 | * fc_rport_tgt_remove - Removes the scsi target on the remote port | 1424 | /** |
| 1299 | * @rport: The remote port to be operated on | 1425 | * fc_starget_delete - called to delete the scsi decendents of an rport |
| 1300 | */ | 1426 | * (target and all sdevs) |
| 1427 | * | ||
| 1428 | * @data: remote port to be operated on. | ||
| 1429 | **/ | ||
| 1301 | static void | 1430 | static void |
| 1302 | fc_rport_tgt_remove(struct fc_rport *rport) | 1431 | fc_starget_delete(void *data) |
| 1303 | { | 1432 | { |
| 1433 | struct fc_rport *rport = (struct fc_rport *)data; | ||
| 1304 | struct Scsi_Host *shost = rport_to_shost(rport); | 1434 | struct Scsi_Host *shost = rport_to_shost(rport); |
| 1435 | unsigned long flags; | ||
| 1305 | 1436 | ||
| 1306 | scsi_target_unblock(&rport->dev); | 1437 | scsi_target_unblock(&rport->dev); |
| 1307 | 1438 | ||
| 1308 | /* Stop anything on the workq */ | 1439 | spin_lock_irqsave(shost->host_lock, flags); |
| 1309 | if (!cancel_delayed_work(&rport->dev_loss_work)) | 1440 | if (rport->flags & FC_RPORT_DEVLOSS_PENDING) { |
| 1310 | flush_scheduled_work(); | 1441 | spin_unlock_irqrestore(shost->host_lock, flags); |
| 1311 | scsi_flush_work(shost); | 1442 | if (!cancel_delayed_work(&rport->dev_loss_work)) |
| 1443 | fc_flush_devloss(shost); | ||
| 1444 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1445 | rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; | ||
| 1446 | } | ||
| 1447 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1312 | 1448 | ||
| 1313 | scsi_remove_target(&rport->dev); | 1449 | scsi_remove_target(&rport->dev); |
| 1314 | } | 1450 | } |
| 1315 | 1451 | ||
| 1452 | |||
| 1453 | /** | ||
| 1454 | * fc_rport_final_delete - finish rport termination and delete it. | ||
| 1455 | * | ||
| 1456 | * @data: remote port to be deleted. | ||
| 1457 | **/ | ||
| 1458 | static void | ||
| 1459 | fc_rport_final_delete(void *data) | ||
| 1460 | { | ||
| 1461 | struct fc_rport *rport = (struct fc_rport *)data; | ||
| 1462 | struct device *dev = &rport->dev; | ||
| 1463 | struct Scsi_Host *shost = rport_to_shost(rport); | ||
| 1464 | |||
| 1465 | /* Delete SCSI target and sdevs */ | ||
| 1466 | if (rport->scsi_target_id != -1) | ||
| 1467 | fc_starget_delete(data); | ||
| 1468 | |||
| 1469 | /* | ||
| 1470 | * if a scan is pending, flush the SCSI Host work_q so that | ||
| 1471 | * that we can reclaim the rport scan work element. | ||
| 1472 | */ | ||
| 1473 | if (rport->flags & FC_RPORT_SCAN_PENDING) | ||
| 1474 | scsi_flush_work(shost); | ||
| 1475 | |||
| 1476 | transport_remove_device(dev); | ||
| 1477 | device_del(dev); | ||
| 1478 | transport_destroy_device(dev); | ||
| 1479 | put_device(&shost->shost_gendev); | ||
| 1480 | } | ||
| 1481 | |||
| 1482 | |||
| 1316 | /** | 1483 | /** |
| 1317 | * fc_rport_create - allocates and creates a remote FC port. | 1484 | * fc_rport_create - allocates and creates a remote FC port. |
| 1318 | * @shost: scsi host the remote port is connected to. | 1485 | * @shost: scsi host the remote port is connected to. |
| @@ -1330,8 +1497,7 @@ struct fc_rport * | |||
| 1330 | fc_rport_create(struct Scsi_Host *shost, int channel, | 1497 | fc_rport_create(struct Scsi_Host *shost, int channel, |
| 1331 | struct fc_rport_identifiers *ids) | 1498 | struct fc_rport_identifiers *ids) |
| 1332 | { | 1499 | { |
| 1333 | struct fc_host_attrs *fc_host = | 1500 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); |
| 1334 | (struct fc_host_attrs *)shost->shost_data; | ||
| 1335 | struct fc_internal *fci = to_fc_internal(shost->transportt); | 1501 | struct fc_internal *fci = to_fc_internal(shost->transportt); |
| 1336 | struct fc_rport *rport; | 1502 | struct fc_rport *rport; |
| 1337 | struct device *dev; | 1503 | struct device *dev; |
| @@ -1360,6 +1526,8 @@ fc_rport_create(struct Scsi_Host *shost, int channel, | |||
| 1360 | 1526 | ||
| 1361 | INIT_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport, rport); | 1527 | INIT_WORK(&rport->dev_loss_work, fc_timeout_deleted_rport, rport); |
| 1362 | INIT_WORK(&rport->scan_work, fc_scsi_scan_rport, rport); | 1528 | INIT_WORK(&rport->scan_work, fc_scsi_scan_rport, rport); |
| 1529 | INIT_WORK(&rport->stgt_delete_work, fc_starget_delete, rport); | ||
| 1530 | INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete, rport); | ||
| 1363 | 1531 | ||
| 1364 | spin_lock_irqsave(shost->host_lock, flags); | 1532 | spin_lock_irqsave(shost->host_lock, flags); |
| 1365 | 1533 | ||
| @@ -1368,7 +1536,7 @@ fc_rport_create(struct Scsi_Host *shost, int channel, | |||
| 1368 | rport->scsi_target_id = fc_host->next_target_id++; | 1536 | rport->scsi_target_id = fc_host->next_target_id++; |
| 1369 | else | 1537 | else |
| 1370 | rport->scsi_target_id = -1; | 1538 | rport->scsi_target_id = -1; |
| 1371 | list_add_tail(&rport->peers, &fc_host_rports(shost)); | 1539 | list_add_tail(&rport->peers, &fc_host->rports); |
| 1372 | get_device(&shost->shost_gendev); | 1540 | get_device(&shost->shost_gendev); |
| 1373 | 1541 | ||
| 1374 | spin_unlock_irqrestore(shost->host_lock, flags); | 1542 | spin_unlock_irqrestore(shost->host_lock, flags); |
| @@ -1389,9 +1557,11 @@ fc_rport_create(struct Scsi_Host *shost, int channel, | |||
| 1389 | transport_add_device(dev); | 1557 | transport_add_device(dev); |
| 1390 | transport_configure_device(dev); | 1558 | transport_configure_device(dev); |
| 1391 | 1559 | ||
| 1392 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | 1560 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) { |
| 1393 | /* initiate a scan of the target */ | 1561 | /* initiate a scan of the target */ |
| 1562 | rport->flags |= FC_RPORT_SCAN_PENDING; | ||
| 1394 | scsi_queue_work(shost, &rport->scan_work); | 1563 | scsi_queue_work(shost, &rport->scan_work); |
| 1564 | } | ||
| 1395 | 1565 | ||
| 1396 | return rport; | 1566 | return rport; |
| 1397 | 1567 | ||
| @@ -1451,10 +1621,14 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1451 | struct fc_rport_identifiers *ids) | 1621 | struct fc_rport_identifiers *ids) |
| 1452 | { | 1622 | { |
| 1453 | struct fc_internal *fci = to_fc_internal(shost->transportt); | 1623 | struct fc_internal *fci = to_fc_internal(shost->transportt); |
| 1624 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); | ||
| 1454 | struct fc_rport *rport; | 1625 | struct fc_rport *rport; |
| 1455 | unsigned long flags; | 1626 | unsigned long flags; |
| 1456 | int match = 0; | 1627 | int match = 0; |
| 1457 | 1628 | ||
| 1629 | /* ensure any stgt delete functions are done */ | ||
| 1630 | fc_flush_work(shost); | ||
| 1631 | |||
| 1458 | /* | 1632 | /* |
| 1459 | * Search the list of "active" rports, for an rport that has been | 1633 | * Search the list of "active" rports, for an rport that has been |
| 1460 | * deleted, but we've held off the real delete while the target | 1634 | * deleted, but we've held off the real delete while the target |
| @@ -1462,12 +1636,12 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1462 | */ | 1636 | */ |
| 1463 | spin_lock_irqsave(shost->host_lock, flags); | 1637 | spin_lock_irqsave(shost->host_lock, flags); |
| 1464 | 1638 | ||
| 1465 | list_for_each_entry(rport, &fc_host_rports(shost), peers) { | 1639 | list_for_each_entry(rport, &fc_host->rports, peers) { |
| 1466 | 1640 | ||
| 1467 | if ((rport->port_state == FC_PORTSTATE_BLOCKED) && | 1641 | if ((rport->port_state == FC_PORTSTATE_BLOCKED) && |
| 1468 | (rport->channel == channel)) { | 1642 | (rport->channel == channel)) { |
| 1469 | 1643 | ||
| 1470 | switch (fc_host_tgtid_bind_type(shost)) { | 1644 | switch (fc_host->tgtid_bind_type) { |
| 1471 | case FC_TGTID_BIND_BY_WWPN: | 1645 | case FC_TGTID_BIND_BY_WWPN: |
| 1472 | case FC_TGTID_BIND_NONE: | 1646 | case FC_TGTID_BIND_NONE: |
| 1473 | if (rport->port_name == ids->port_name) | 1647 | if (rport->port_name == ids->port_name) |
| @@ -1521,27 +1695,34 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1521 | * transaction. | 1695 | * transaction. |
| 1522 | */ | 1696 | */ |
| 1523 | if (!cancel_delayed_work(work)) | 1697 | if (!cancel_delayed_work(work)) |
| 1524 | flush_scheduled_work(); | 1698 | fc_flush_devloss(shost); |
| 1699 | |||
| 1700 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1701 | |||
| 1702 | rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; | ||
| 1525 | 1703 | ||
| 1526 | /* initiate a scan of the target */ | 1704 | /* initiate a scan of the target */ |
| 1705 | rport->flags |= FC_RPORT_SCAN_PENDING; | ||
| 1527 | scsi_queue_work(shost, &rport->scan_work); | 1706 | scsi_queue_work(shost, &rport->scan_work); |
| 1528 | 1707 | ||
| 1708 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1709 | |||
| 1529 | return rport; | 1710 | return rport; |
| 1530 | } | 1711 | } |
| 1531 | } | 1712 | } |
| 1532 | } | 1713 | } |
| 1533 | 1714 | ||
| 1534 | /* Search the bindings array */ | 1715 | /* Search the bindings array */ |
| 1535 | if (fc_host_tgtid_bind_type(shost) != FC_TGTID_BIND_NONE) { | 1716 | if (fc_host->tgtid_bind_type != FC_TGTID_BIND_NONE) { |
| 1536 | 1717 | ||
| 1537 | /* search for a matching consistent binding */ | 1718 | /* search for a matching consistent binding */ |
| 1538 | 1719 | ||
| 1539 | list_for_each_entry(rport, &fc_host_rport_bindings(shost), | 1720 | list_for_each_entry(rport, &fc_host->rport_bindings, |
| 1540 | peers) { | 1721 | peers) { |
| 1541 | if (rport->channel != channel) | 1722 | if (rport->channel != channel) |
| 1542 | continue; | 1723 | continue; |
| 1543 | 1724 | ||
| 1544 | switch (fc_host_tgtid_bind_type(shost)) { | 1725 | switch (fc_host->tgtid_bind_type) { |
| 1545 | case FC_TGTID_BIND_BY_WWPN: | 1726 | case FC_TGTID_BIND_BY_WWPN: |
| 1546 | if (rport->port_name == ids->port_name) | 1727 | if (rport->port_name == ids->port_name) |
| 1547 | match = 1; | 1728 | match = 1; |
| @@ -1559,8 +1740,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1559 | } | 1740 | } |
| 1560 | 1741 | ||
| 1561 | if (match) { | 1742 | if (match) { |
| 1562 | list_move_tail(&rport->peers, | 1743 | list_move_tail(&rport->peers, &fc_host->rports); |
| 1563 | &fc_host_rports(shost)); | ||
| 1564 | break; | 1744 | break; |
| 1565 | } | 1745 | } |
| 1566 | } | 1746 | } |
| @@ -1574,15 +1754,17 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1574 | rport->roles = ids->roles; | 1754 | rport->roles = ids->roles; |
| 1575 | rport->port_state = FC_PORTSTATE_ONLINE; | 1755 | rport->port_state = FC_PORTSTATE_ONLINE; |
| 1576 | 1756 | ||
| 1577 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1578 | |||
| 1579 | if (fci->f->dd_fcrport_size) | 1757 | if (fci->f->dd_fcrport_size) |
| 1580 | memset(rport->dd_data, 0, | 1758 | memset(rport->dd_data, 0, |
| 1581 | fci->f->dd_fcrport_size); | 1759 | fci->f->dd_fcrport_size); |
| 1582 | 1760 | ||
| 1583 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) | 1761 | if (rport->roles & FC_RPORT_ROLE_FCP_TARGET) { |
| 1584 | /* initiate a scan of the target */ | 1762 | /* initiate a scan of the target */ |
| 1763 | rport->flags |= FC_RPORT_SCAN_PENDING; | ||
| 1585 | scsi_queue_work(shost, &rport->scan_work); | 1764 | scsi_queue_work(shost, &rport->scan_work); |
| 1765 | } | ||
| 1766 | |||
| 1767 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1586 | 1768 | ||
| 1587 | return rport; | 1769 | return rport; |
| 1588 | } | 1770 | } |
| @@ -1597,30 +1779,6 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel, | |||
| 1597 | } | 1779 | } |
| 1598 | EXPORT_SYMBOL(fc_remote_port_add); | 1780 | EXPORT_SYMBOL(fc_remote_port_add); |
| 1599 | 1781 | ||
| 1600 | /* | ||
| 1601 | * fc_rport_terminate - this routine tears down and deallocates a remote port. | ||
| 1602 | * @rport: The remote port to be terminated | ||
| 1603 | * | ||
| 1604 | * Notes: | ||
| 1605 | * This routine assumes no locks are held on entry. | ||
| 1606 | */ | ||
| 1607 | static void | ||
| 1608 | fc_rport_terminate(struct fc_rport *rport) | ||
| 1609 | { | ||
| 1610 | struct Scsi_Host *shost = rport_to_shost(rport); | ||
| 1611 | struct device *dev = &rport->dev; | ||
| 1612 | unsigned long flags; | ||
| 1613 | |||
| 1614 | fc_rport_tgt_remove(rport); | ||
| 1615 | |||
| 1616 | transport_remove_device(dev); | ||
| 1617 | device_del(dev); | ||
| 1618 | transport_destroy_device(dev); | ||
| 1619 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1620 | list_del(&rport->peers); | ||
| 1621 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1622 | put_device(&shost->shost_gendev); | ||
| 1623 | } | ||
| 1624 | 1782 | ||
| 1625 | /** | 1783 | /** |
| 1626 | * fc_remote_port_delete - notifies the fc transport that a remote | 1784 | * fc_remote_port_delete - notifies the fc transport that a remote |
| @@ -1675,20 +1833,39 @@ fc_rport_terminate(struct fc_rport *rport) | |||
| 1675 | void | 1833 | void |
| 1676 | fc_remote_port_delete(struct fc_rport *rport) | 1834 | fc_remote_port_delete(struct fc_rport *rport) |
| 1677 | { | 1835 | { |
| 1836 | struct Scsi_Host *shost = rport_to_shost(rport); | ||
| 1678 | int timeout = rport->dev_loss_tmo; | 1837 | int timeout = rport->dev_loss_tmo; |
| 1838 | unsigned long flags; | ||
| 1839 | |||
| 1840 | /* | ||
| 1841 | * No need to flush the fc_host work_q's, as all adds are synchronous. | ||
| 1842 | * | ||
| 1843 | * We do need to reclaim the rport scan work element, so eventually | ||
| 1844 | * (in fc_rport_final_delete()) we'll flush the scsi host work_q if | ||
| 1845 | * there's still a scan pending. | ||
| 1846 | */ | ||
| 1847 | |||
| 1848 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1679 | 1849 | ||
| 1680 | /* If no scsi target id mapping, delete it */ | 1850 | /* If no scsi target id mapping, delete it */ |
| 1681 | if (rport->scsi_target_id == -1) { | 1851 | if (rport->scsi_target_id == -1) { |
| 1682 | fc_rport_terminate(rport); | 1852 | list_del(&rport->peers); |
| 1853 | rport->port_state = FC_PORTSTATE_DELETED; | ||
| 1854 | fc_queue_work(shost, &rport->rport_delete_work); | ||
| 1855 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1683 | return; | 1856 | return; |
| 1684 | } | 1857 | } |
| 1685 | 1858 | ||
| 1859 | rport->port_state = FC_PORTSTATE_BLOCKED; | ||
| 1860 | |||
| 1861 | rport->flags |= FC_RPORT_DEVLOSS_PENDING; | ||
| 1862 | |||
| 1863 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1864 | |||
| 1686 | scsi_target_block(&rport->dev); | 1865 | scsi_target_block(&rport->dev); |
| 1687 | 1866 | ||
| 1688 | /* cap the length the devices can be blocked until they are deleted */ | 1867 | /* cap the length the devices can be blocked until they are deleted */ |
| 1689 | schedule_delayed_work(&rport->dev_loss_work, timeout * HZ); | 1868 | fc_queue_devloss_work(shost, &rport->dev_loss_work, timeout * HZ); |
| 1690 | |||
| 1691 | rport->port_state = FC_PORTSTATE_BLOCKED; | ||
| 1692 | } | 1869 | } |
| 1693 | EXPORT_SYMBOL(fc_remote_port_delete); | 1870 | EXPORT_SYMBOL(fc_remote_port_delete); |
| 1694 | 1871 | ||
| @@ -1716,8 +1893,7 @@ void | |||
| 1716 | fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) | 1893 | fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) |
| 1717 | { | 1894 | { |
| 1718 | struct Scsi_Host *shost = rport_to_shost(rport); | 1895 | struct Scsi_Host *shost = rport_to_shost(rport); |
| 1719 | struct fc_host_attrs *fc_host = | 1896 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); |
| 1720 | (struct fc_host_attrs *)shost->shost_data; | ||
| 1721 | unsigned long flags; | 1897 | unsigned long flags; |
| 1722 | int create = 0; | 1898 | int create = 0; |
| 1723 | 1899 | ||
| @@ -1729,10 +1905,11 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) | |||
| 1729 | } else if (!(rport->roles & FC_RPORT_ROLE_FCP_TARGET)) | 1905 | } else if (!(rport->roles & FC_RPORT_ROLE_FCP_TARGET)) |
| 1730 | create = 1; | 1906 | create = 1; |
| 1731 | } | 1907 | } |
| 1732 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1733 | 1908 | ||
| 1734 | rport->roles = roles; | 1909 | rport->roles = roles; |
| 1735 | 1910 | ||
| 1911 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1912 | |||
| 1736 | if (create) { | 1913 | if (create) { |
| 1737 | /* | 1914 | /* |
| 1738 | * There may have been a delete timer running on the | 1915 | * There may have been a delete timer running on the |
| @@ -1747,10 +1924,20 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles) | |||
| 1747 | * transaction. | 1924 | * transaction. |
| 1748 | */ | 1925 | */ |
| 1749 | if (!cancel_delayed_work(&rport->dev_loss_work)) | 1926 | if (!cancel_delayed_work(&rport->dev_loss_work)) |
| 1750 | flush_scheduled_work(); | 1927 | fc_flush_devloss(shost); |
| 1928 | |||
| 1929 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1930 | rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; | ||
| 1931 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1932 | |||
| 1933 | /* ensure any stgt delete functions are done */ | ||
| 1934 | fc_flush_work(shost); | ||
| 1751 | 1935 | ||
| 1752 | /* initiate a scan of the target */ | 1936 | /* initiate a scan of the target */ |
| 1937 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1938 | rport->flags |= FC_RPORT_SCAN_PENDING; | ||
| 1753 | scsi_queue_work(shost, &rport->scan_work); | 1939 | scsi_queue_work(shost, &rport->scan_work); |
| 1940 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1754 | } | 1941 | } |
| 1755 | } | 1942 | } |
| 1756 | EXPORT_SYMBOL(fc_remote_port_rolechg); | 1943 | EXPORT_SYMBOL(fc_remote_port_rolechg); |
| @@ -1767,22 +1954,24 @@ fc_timeout_deleted_rport(void *data) | |||
| 1767 | { | 1954 | { |
| 1768 | struct fc_rport *rport = (struct fc_rport *)data; | 1955 | struct fc_rport *rport = (struct fc_rport *)data; |
| 1769 | struct Scsi_Host *shost = rport_to_shost(rport); | 1956 | struct Scsi_Host *shost = rport_to_shost(rport); |
| 1957 | struct fc_host_attrs *fc_host = shost_to_fc_host(shost); | ||
| 1770 | unsigned long flags; | 1958 | unsigned long flags; |
| 1771 | 1959 | ||
| 1772 | spin_lock_irqsave(shost->host_lock, flags); | 1960 | spin_lock_irqsave(shost->host_lock, flags); |
| 1773 | 1961 | ||
| 1962 | rport->flags &= ~FC_RPORT_DEVLOSS_PENDING; | ||
| 1963 | |||
| 1774 | /* | 1964 | /* |
| 1775 | * If the port is ONLINE, then it came back, but was no longer an | 1965 | * If the port is ONLINE, then it came back. Validate it's still an |
| 1776 | * FCP target. Thus we need to tear down the scsi_target on it. | 1966 | * FCP target. If not, tear down the scsi_target on it. |
| 1777 | */ | 1967 | */ |
| 1778 | if (rport->port_state == FC_PORTSTATE_ONLINE) { | 1968 | if ((rport->port_state == FC_PORTSTATE_ONLINE) && |
| 1779 | spin_unlock_irqrestore(shost->host_lock, flags); | 1969 | !(rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { |
| 1780 | |||
| 1781 | dev_printk(KERN_ERR, &rport->dev, | 1970 | dev_printk(KERN_ERR, &rport->dev, |
| 1782 | "blocked FC remote port time out: removing target\n"); | 1971 | "blocked FC remote port time out: no longer" |
| 1783 | 1972 | " a FCP target, removing starget\n"); | |
| 1784 | fc_rport_tgt_remove(rport); | 1973 | fc_queue_work(shost, &rport->stgt_delete_work); |
| 1785 | 1974 | spin_unlock_irqrestore(shost->host_lock, flags); | |
| 1786 | return; | 1975 | return; |
| 1787 | } | 1976 | } |
| 1788 | 1977 | ||
| @@ -1793,11 +1982,13 @@ fc_timeout_deleted_rport(void *data) | |||
| 1793 | return; | 1982 | return; |
| 1794 | } | 1983 | } |
| 1795 | 1984 | ||
| 1796 | if (fc_host_tgtid_bind_type(shost) == FC_TGTID_BIND_NONE) { | 1985 | if (fc_host->tgtid_bind_type == FC_TGTID_BIND_NONE) { |
| 1797 | spin_unlock_irqrestore(shost->host_lock, flags); | 1986 | list_del(&rport->peers); |
| 1987 | rport->port_state = FC_PORTSTATE_DELETED; | ||
| 1798 | dev_printk(KERN_ERR, &rport->dev, | 1988 | dev_printk(KERN_ERR, &rport->dev, |
| 1799 | "blocked FC remote port time out: removing target\n"); | 1989 | "blocked FC remote port time out: removing target\n"); |
| 1800 | fc_rport_terminate(rport); | 1990 | fc_queue_work(shost, &rport->rport_delete_work); |
| 1991 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1801 | return; | 1992 | return; |
| 1802 | } | 1993 | } |
| 1803 | 1994 | ||
| @@ -1805,7 +1996,7 @@ fc_timeout_deleted_rport(void *data) | |||
| 1805 | "blocked FC remote port time out: removing target and " | 1996 | "blocked FC remote port time out: removing target and " |
| 1806 | "saving binding\n"); | 1997 | "saving binding\n"); |
| 1807 | 1998 | ||
| 1808 | list_move_tail(&rport->peers, &fc_host_rport_bindings(shost)); | 1999 | list_move_tail(&rport->peers, &fc_host->rport_bindings); |
| 1809 | 2000 | ||
| 1810 | /* | 2001 | /* |
| 1811 | * Note: We do not remove or clear the hostdata area. This allows | 2002 | * Note: We do not remove or clear the hostdata area. This allows |
| @@ -1819,10 +2010,10 @@ fc_timeout_deleted_rport(void *data) | |||
| 1819 | rport->maxframe_size = -1; | 2010 | rport->maxframe_size = -1; |
| 1820 | rport->supported_classes = FC_COS_UNSPECIFIED; | 2011 | rport->supported_classes = FC_COS_UNSPECIFIED; |
| 1821 | rport->roles = FC_RPORT_ROLE_UNKNOWN; | 2012 | rport->roles = FC_RPORT_ROLE_UNKNOWN; |
| 1822 | rport->port_state = FC_PORTSTATE_DELETED; | 2013 | rport->port_state = FC_PORTSTATE_NOTPRESENT; |
| 1823 | 2014 | ||
| 1824 | /* remove the identifiers that aren't used in the consisting binding */ | 2015 | /* remove the identifiers that aren't used in the consisting binding */ |
| 1825 | switch (fc_host_tgtid_bind_type(shost)) { | 2016 | switch (fc_host->tgtid_bind_type) { |
| 1826 | case FC_TGTID_BIND_BY_WWPN: | 2017 | case FC_TGTID_BIND_BY_WWPN: |
| 1827 | rport->node_name = -1; | 2018 | rport->node_name = -1; |
| 1828 | rport->port_id = -1; | 2019 | rport->port_id = -1; |
| @@ -1843,17 +2034,8 @@ fc_timeout_deleted_rport(void *data) | |||
| 1843 | * As this only occurs if the remote port (scsi target) | 2034 | * As this only occurs if the remote port (scsi target) |
| 1844 | * went away and didn't come back - we'll remove | 2035 | * went away and didn't come back - we'll remove |
| 1845 | * all attached scsi devices. | 2036 | * all attached scsi devices. |
| 1846 | * | ||
| 1847 | * We'll schedule the shost work item to perform the actual removal | ||
| 1848 | * to avoid recursion in the different flush calls if we perform | ||
| 1849 | * the removal in each target - and there are lots of targets | ||
| 1850 | * whose timeouts fire at the same time. | ||
| 1851 | */ | 2037 | */ |
| 1852 | 2038 | fc_queue_work(shost, &rport->stgt_delete_work); | |
| 1853 | if ( !(fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED)) { | ||
| 1854 | fc_host_flags(shost) |= FC_SHOST_RPORT_DEL_SCHEDULED; | ||
| 1855 | scsi_queue_work(shost, &fc_host_rport_del_work(shost)); | ||
| 1856 | } | ||
| 1857 | 2039 | ||
| 1858 | spin_unlock_irqrestore(shost->host_lock, flags); | 2040 | spin_unlock_irqrestore(shost->host_lock, flags); |
| 1859 | } | 2041 | } |
| @@ -1870,44 +2052,18 @@ static void | |||
| 1870 | fc_scsi_scan_rport(void *data) | 2052 | fc_scsi_scan_rport(void *data) |
| 1871 | { | 2053 | { |
| 1872 | struct fc_rport *rport = (struct fc_rport *)data; | 2054 | struct fc_rport *rport = (struct fc_rport *)data; |
| 1873 | 2055 | struct Scsi_Host *shost = rport_to_shost(rport); | |
| 1874 | scsi_target_unblock(&rport->dev); | ||
| 1875 | scsi_scan_target(&rport->dev, rport->channel, rport->scsi_target_id, | ||
| 1876 | SCAN_WILD_CARD, 1); | ||
| 1877 | } | ||
| 1878 | |||
| 1879 | |||
| 1880 | /** | ||
| 1881 | * fc_shost_remove_rports - called to remove all rports that are marked | ||
| 1882 | * as in a deleted (not connected) state. | ||
| 1883 | * | ||
| 1884 | * @data: shost whose rports are to be looked at | ||
| 1885 | **/ | ||
| 1886 | static void | ||
| 1887 | fc_shost_remove_rports(void *data) | ||
| 1888 | { | ||
| 1889 | struct Scsi_Host *shost = (struct Scsi_Host *)data; | ||
| 1890 | struct fc_rport *rport, *next_rport; | ||
| 1891 | unsigned long flags; | 2056 | unsigned long flags; |
| 1892 | 2057 | ||
| 1893 | spin_lock_irqsave(shost->host_lock, flags); | 2058 | if ((rport->port_state == FC_PORTSTATE_ONLINE) && |
| 1894 | while (fc_host_flags(shost) & FC_SHOST_RPORT_DEL_SCHEDULED) { | 2059 | (rport->roles & FC_RPORT_ROLE_FCP_TARGET)) { |
| 1895 | 2060 | scsi_target_unblock(&rport->dev); | |
| 1896 | fc_host_flags(shost) &= ~FC_SHOST_RPORT_DEL_SCHEDULED; | 2061 | scsi_scan_target(&rport->dev, rport->channel, |
| 1897 | 2062 | rport->scsi_target_id, SCAN_WILD_CARD, 1); | |
| 1898 | restart_search: | ||
| 1899 | list_for_each_entry_safe(rport, next_rport, | ||
| 1900 | &fc_host_rport_bindings(shost), peers) { | ||
| 1901 | if (rport->port_state == FC_PORTSTATE_DELETED) { | ||
| 1902 | rport->port_state = FC_PORTSTATE_NOTPRESENT; | ||
| 1903 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
| 1904 | fc_rport_tgt_remove(rport); | ||
| 1905 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 1906 | goto restart_search; | ||
| 1907 | } | ||
| 1908 | } | ||
| 1909 | |||
| 1910 | } | 2063 | } |
| 2064 | |||
| 2065 | spin_lock_irqsave(shost->host_lock, flags); | ||
| 2066 | rport->flags &= ~FC_RPORT_SCAN_PENDING; | ||
| 1911 | spin_unlock_irqrestore(shost->host_lock, flags); | 2067 | spin_unlock_irqrestore(shost->host_lock, flags); |
| 1912 | } | 2068 | } |
| 1913 | 2069 | ||
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c index 134c44c8538a..8b6d65e21bae 100644 --- a/drivers/scsi/scsi_transport_sas.c +++ b/drivers/scsi/scsi_transport_sas.c | |||
| @@ -35,40 +35,7 @@ | |||
| 35 | #include <scsi/scsi_transport.h> | 35 | #include <scsi/scsi_transport.h> |
| 36 | #include <scsi/scsi_transport_sas.h> | 36 | #include <scsi/scsi_transport_sas.h> |
| 37 | 37 | ||
| 38 | 38 | #include "scsi_sas_internal.h" | |
| 39 | #define SAS_HOST_ATTRS 0 | ||
| 40 | #define SAS_PORT_ATTRS 17 | ||
| 41 | #define SAS_RPORT_ATTRS 7 | ||
| 42 | #define SAS_END_DEV_ATTRS 3 | ||
| 43 | #define SAS_EXPANDER_ATTRS 7 | ||
| 44 | |||
| 45 | struct sas_internal { | ||
| 46 | struct scsi_transport_template t; | ||
| 47 | struct sas_function_template *f; | ||
| 48 | |||
| 49 | struct class_device_attribute private_host_attrs[SAS_HOST_ATTRS]; | ||
| 50 | struct class_device_attribute private_phy_attrs[SAS_PORT_ATTRS]; | ||
| 51 | struct class_device_attribute private_rphy_attrs[SAS_RPORT_ATTRS]; | ||
| 52 | struct class_device_attribute private_end_dev_attrs[SAS_END_DEV_ATTRS]; | ||
| 53 | struct class_device_attribute private_expander_attrs[SAS_EXPANDER_ATTRS]; | ||
| 54 | |||
| 55 | struct transport_container phy_attr_cont; | ||
| 56 | struct transport_container rphy_attr_cont; | ||
| 57 | struct transport_container end_dev_attr_cont; | ||
| 58 | struct transport_container expander_attr_cont; | ||
| 59 | |||
| 60 | /* | ||
| 61 | * The array of null terminated pointers to attributes | ||
| 62 | * needed by scsi_sysfs.c | ||
| 63 | */ | ||
| 64 | struct class_device_attribute *host_attrs[SAS_HOST_ATTRS + 1]; | ||
| 65 | struct class_device_attribute *phy_attrs[SAS_PORT_ATTRS + 1]; | ||
| 66 | struct class_device_attribute *rphy_attrs[SAS_RPORT_ATTRS + 1]; | ||
| 67 | struct class_device_attribute *end_dev_attrs[SAS_END_DEV_ATTRS + 1]; | ||
| 68 | struct class_device_attribute *expander_attrs[SAS_EXPANDER_ATTRS + 1]; | ||
| 69 | }; | ||
| 70 | #define to_sas_internal(tmpl) container_of(tmpl, struct sas_internal, t) | ||
| 71 | |||
| 72 | struct sas_host_attrs { | 39 | struct sas_host_attrs { |
| 73 | struct list_head rphy_list; | 40 | struct list_head rphy_list; |
| 74 | struct mutex lock; | 41 | struct mutex lock; |
| @@ -406,8 +373,6 @@ struct sas_phy *sas_phy_alloc(struct device *parent, int number) | |||
| 406 | if (!phy) | 373 | if (!phy) |
| 407 | return NULL; | 374 | return NULL; |
| 408 | 375 | ||
| 409 | get_device(parent); | ||
| 410 | |||
| 411 | phy->number = number; | 376 | phy->number = number; |
| 412 | 377 | ||
| 413 | device_initialize(&phy->dev); | 378 | device_initialize(&phy->dev); |
| @@ -459,10 +424,7 @@ EXPORT_SYMBOL(sas_phy_add); | |||
| 459 | void sas_phy_free(struct sas_phy *phy) | 424 | void sas_phy_free(struct sas_phy *phy) |
| 460 | { | 425 | { |
| 461 | transport_destroy_device(&phy->dev); | 426 | transport_destroy_device(&phy->dev); |
| 462 | put_device(phy->dev.parent); | 427 | put_device(&phy->dev); |
| 463 | put_device(phy->dev.parent); | ||
| 464 | put_device(phy->dev.parent); | ||
| 465 | kfree(phy); | ||
| 466 | } | 428 | } |
| 467 | EXPORT_SYMBOL(sas_phy_free); | 429 | EXPORT_SYMBOL(sas_phy_free); |
| 468 | 430 | ||
| @@ -484,7 +446,7 @@ sas_phy_delete(struct sas_phy *phy) | |||
| 484 | transport_remove_device(dev); | 446 | transport_remove_device(dev); |
| 485 | device_del(dev); | 447 | device_del(dev); |
| 486 | transport_destroy_device(dev); | 448 | transport_destroy_device(dev); |
| 487 | put_device(dev->parent); | 449 | put_device(dev); |
| 488 | } | 450 | } |
| 489 | EXPORT_SYMBOL(sas_phy_delete); | 451 | EXPORT_SYMBOL(sas_phy_delete); |
| 490 | 452 | ||
| @@ -800,7 +762,6 @@ struct sas_rphy *sas_end_device_alloc(struct sas_phy *parent) | |||
| 800 | 762 | ||
| 801 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); | 763 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); |
| 802 | if (!rdev) { | 764 | if (!rdev) { |
| 803 | put_device(&parent->dev); | ||
| 804 | return NULL; | 765 | return NULL; |
| 805 | } | 766 | } |
| 806 | 767 | ||
| @@ -836,7 +797,6 @@ struct sas_rphy *sas_expander_alloc(struct sas_phy *parent, | |||
| 836 | 797 | ||
| 837 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); | 798 | rdev = kzalloc(sizeof(*rdev), GFP_KERNEL); |
| 838 | if (!rdev) { | 799 | if (!rdev) { |
| 839 | put_device(&parent->dev); | ||
| 840 | return NULL; | 800 | return NULL; |
| 841 | } | 801 | } |
| 842 | 802 | ||
| @@ -885,6 +845,8 @@ int sas_rphy_add(struct sas_rphy *rphy) | |||
| 885 | (identify->target_port_protocols & | 845 | (identify->target_port_protocols & |
| 886 | (SAS_PROTOCOL_SSP|SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA))) | 846 | (SAS_PROTOCOL_SSP|SAS_PROTOCOL_STP|SAS_PROTOCOL_SATA))) |
| 887 | rphy->scsi_target_id = sas_host->next_target_id++; | 847 | rphy->scsi_target_id = sas_host->next_target_id++; |
| 848 | else if (identify->device_type == SAS_END_DEVICE) | ||
| 849 | rphy->scsi_target_id = -1; | ||
| 888 | mutex_unlock(&sas_host->lock); | 850 | mutex_unlock(&sas_host->lock); |
| 889 | 851 | ||
| 890 | if (identify->device_type == SAS_END_DEVICE && | 852 | if (identify->device_type == SAS_END_DEVICE && |
| @@ -910,6 +872,7 @@ EXPORT_SYMBOL(sas_rphy_add); | |||
| 910 | */ | 872 | */ |
| 911 | void sas_rphy_free(struct sas_rphy *rphy) | 873 | void sas_rphy_free(struct sas_rphy *rphy) |
| 912 | { | 874 | { |
| 875 | struct device *dev = &rphy->dev; | ||
| 913 | struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); | 876 | struct Scsi_Host *shost = dev_to_shost(rphy->dev.parent->parent); |
| 914 | struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); | 877 | struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); |
| 915 | 878 | ||
| @@ -917,21 +880,9 @@ void sas_rphy_free(struct sas_rphy *rphy) | |||
| 917 | list_del(&rphy->list); | 880 | list_del(&rphy->list); |
| 918 | mutex_unlock(&sas_host->lock); | 881 | mutex_unlock(&sas_host->lock); |
| 919 | 882 | ||
| 920 | transport_destroy_device(&rphy->dev); | 883 | transport_destroy_device(dev); |
| 921 | put_device(rphy->dev.parent); | ||
| 922 | put_device(rphy->dev.parent); | ||
| 923 | put_device(rphy->dev.parent); | ||
| 924 | if (rphy->identify.device_type == SAS_END_DEVICE) { | ||
| 925 | struct sas_end_device *edev = rphy_to_end_device(rphy); | ||
| 926 | |||
| 927 | kfree(edev); | ||
| 928 | } else { | ||
| 929 | /* must be expander */ | ||
| 930 | struct sas_expander_device *edev = | ||
| 931 | rphy_to_expander_device(rphy); | ||
| 932 | 884 | ||
| 933 | kfree(edev); | 885 | put_device(dev); |
| 934 | } | ||
| 935 | } | 886 | } |
| 936 | EXPORT_SYMBOL(sas_rphy_free); | 887 | EXPORT_SYMBOL(sas_rphy_free); |
| 937 | 888 | ||
| @@ -971,7 +922,7 @@ sas_rphy_delete(struct sas_rphy *rphy) | |||
| 971 | 922 | ||
| 972 | parent->rphy = NULL; | 923 | parent->rphy = NULL; |
| 973 | 924 | ||
| 974 | put_device(&parent->dev); | 925 | put_device(dev); |
| 975 | } | 926 | } |
| 976 | EXPORT_SYMBOL(sas_rphy_delete); | 927 | EXPORT_SYMBOL(sas_rphy_delete); |
| 977 | 928 | ||
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 7405d0df95db..b098942445ec 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -748,6 +748,7 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, | |||
| 748 | /* | 748 | /* |
| 749 | * most likely out of mem, but could also be a bad map | 749 | * most likely out of mem, but could also be a bad map |
| 750 | */ | 750 | */ |
| 751 | sg_finish_rem_req(srp); | ||
| 751 | return -ENOMEM; | 752 | return -ENOMEM; |
| 752 | } else | 753 | } else |
| 753 | return 0; | 754 | return 0; |
| @@ -1044,7 +1045,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 1044 | if (!sg_allow_access(opcode, sdp->device->type)) | 1045 | if (!sg_allow_access(opcode, sdp->device->type)) |
| 1045 | return -EPERM; | 1046 | return -EPERM; |
| 1046 | } | 1047 | } |
| 1047 | return scsi_ioctl_send_command(sdp->device, p); | 1048 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); |
| 1048 | case SG_SET_DEBUG: | 1049 | case SG_SET_DEBUG: |
| 1049 | result = get_user(val, ip); | 1050 | result = get_user(val, ip); |
| 1050 | if (result) | 1051 | if (result) |
| @@ -1798,8 +1799,10 @@ sg_build_direct(Sg_request * srp, Sg_fd * sfp, int dxfer_len) | |||
| 1798 | res = st_map_user_pages(schp->buffer, mx_sc_elems, | 1799 | res = st_map_user_pages(schp->buffer, mx_sc_elems, |
| 1799 | (unsigned long)hp->dxferp, dxfer_len, | 1800 | (unsigned long)hp->dxferp, dxfer_len, |
| 1800 | (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0); | 1801 | (SG_DXFER_TO_DEV == hp->dxfer_direction) ? 1 : 0); |
| 1801 | if (res <= 0) | 1802 | if (res <= 0) { |
| 1803 | sg_remove_scat(schp); | ||
| 1802 | return 1; | 1804 | return 1; |
| 1805 | } | ||
| 1803 | schp->k_use_sg = res; | 1806 | schp->k_use_sg = res; |
| 1804 | schp->dio_in_use = 1; | 1807 | schp->dio_in_use = 1; |
| 1805 | hp->info |= SG_INFO_DIRECT_IO; | 1808 | hp->info |= SG_INFO_DIRECT_IO; |
diff --git a/drivers/scsi/sym53c8xx_2/sym_defs.h b/drivers/scsi/sym53c8xx_2/sym_defs.h index 3659dd7b9d76..defccc477d1e 100644 --- a/drivers/scsi/sym53c8xx_2/sym_defs.h +++ b/drivers/scsi/sym53c8xx_2/sym_defs.h | |||
| @@ -40,7 +40,7 @@ | |||
| 40 | #ifndef SYM_DEFS_H | 40 | #ifndef SYM_DEFS_H |
| 41 | #define SYM_DEFS_H | 41 | #define SYM_DEFS_H |
| 42 | 42 | ||
| 43 | #define SYM_VERSION "2.2.2" | 43 | #define SYM_VERSION "2.2.3" |
| 44 | #define SYM_DRIVER_NAME "sym-" SYM_VERSION | 44 | #define SYM_DRIVER_NAME "sym-" SYM_VERSION |
| 45 | 45 | ||
| 46 | /* | 46 | /* |
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c index 1fffd2b3c654..9c83b4d39a26 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.c +++ b/drivers/scsi/sym53c8xx_2/sym_glue.c | |||
| @@ -134,66 +134,17 @@ static void sym2_setup_params(void) | |||
| 134 | } | 134 | } |
| 135 | } | 135 | } |
| 136 | 136 | ||
| 137 | /* | ||
| 138 | * We used to try to deal with 64-bit BARs here, but don't any more. | ||
| 139 | * There are many parts of this driver which would need to be modified | ||
| 140 | * to handle a 64-bit base address, including scripts. I'm uncomfortable | ||
| 141 | * with making those changes when I have no way of testing it, so I'm | ||
| 142 | * just going to disable it. | ||
| 143 | * | ||
| 144 | * Note that some machines (eg HP rx8620 and Superdome) have bus addresses | ||
| 145 | * below 4GB and physical addresses above 4GB. These will continue to work. | ||
| 146 | */ | ||
| 147 | static int __devinit | ||
| 148 | pci_get_base_address(struct pci_dev *pdev, int index, unsigned long *basep) | ||
| 149 | { | ||
| 150 | u32 tmp; | ||
| 151 | unsigned long base; | ||
| 152 | #define PCI_BAR_OFFSET(index) (PCI_BASE_ADDRESS_0 + (index<<2)) | ||
| 153 | |||
| 154 | pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp); | ||
| 155 | base = tmp; | ||
| 156 | if ((tmp & 0x7) == PCI_BASE_ADDRESS_MEM_TYPE_64) { | ||
| 157 | pci_read_config_dword(pdev, PCI_BAR_OFFSET(index++), &tmp); | ||
| 158 | if (tmp > 0) { | ||
| 159 | dev_err(&pdev->dev, | ||
| 160 | "BAR %d is 64-bit, disabling\n", index - 1); | ||
| 161 | base = 0; | ||
| 162 | } | ||
| 163 | } | ||
| 164 | |||
| 165 | if ((base & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) { | ||
| 166 | base &= PCI_BASE_ADDRESS_IO_MASK; | ||
| 167 | } else { | ||
| 168 | base &= PCI_BASE_ADDRESS_MEM_MASK; | ||
| 169 | } | ||
| 170 | |||
| 171 | *basep = base; | ||
| 172 | return index; | ||
| 173 | #undef PCI_BAR_OFFSET | ||
| 174 | } | ||
| 175 | |||
| 176 | static struct scsi_transport_template *sym2_transport_template = NULL; | 137 | static struct scsi_transport_template *sym2_transport_template = NULL; |
| 177 | 138 | ||
| 178 | /* | 139 | /* |
| 179 | * Used by the eh thread to wait for command completion. | ||
| 180 | * It is allocated on the eh thread stack. | ||
| 181 | */ | ||
| 182 | struct sym_eh_wait { | ||
| 183 | struct completion done; | ||
| 184 | struct timer_list timer; | ||
| 185 | void (*old_done)(struct scsi_cmnd *); | ||
| 186 | int to_do; | ||
| 187 | int timed_out; | ||
| 188 | }; | ||
| 189 | |||
| 190 | /* | ||
| 191 | * Driver private area in the SCSI command structure. | 140 | * Driver private area in the SCSI command structure. |
| 192 | */ | 141 | */ |
| 193 | struct sym_ucmd { /* Override the SCSI pointer structure */ | 142 | struct sym_ucmd { /* Override the SCSI pointer structure */ |
| 194 | dma_addr_t data_mapping; | 143 | dma_addr_t data_mapping; |
| 195 | u_char data_mapped; | 144 | unsigned char data_mapped; |
| 196 | struct sym_eh_wait *eh_wait; | 145 | unsigned char to_do; /* For error handling */ |
| 146 | void (*old_done)(struct scsi_cmnd *); /* For error handling */ | ||
| 147 | struct completion *eh_done; /* For error handling */ | ||
| 197 | }; | 148 | }; |
| 198 | 149 | ||
| 199 | #define SYM_UCMD_PTR(cmd) ((struct sym_ucmd *)(&(cmd)->SCp)) | 150 | #define SYM_UCMD_PTR(cmd) ((struct sym_ucmd *)(&(cmd)->SCp)) |
| @@ -514,8 +465,6 @@ static inline int sym_setup_cdb(struct sym_hcb *np, struct scsi_cmnd *cmd, struc | |||
| 514 | */ | 465 | */ |
| 515 | int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) | 466 | int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) |
| 516 | { | 467 | { |
| 517 | struct sym_tcb *tp = &np->target[cp->target]; | ||
| 518 | struct sym_lcb *lp = sym_lp(tp, cp->lun); | ||
| 519 | u32 lastp, goalp; | 468 | u32 lastp, goalp; |
| 520 | int dir; | 469 | int dir; |
| 521 | 470 | ||
| @@ -596,7 +545,7 @@ int sym_setup_data_and_start(struct sym_hcb *np, struct scsi_cmnd *cmd, struct s | |||
| 596 | /* | 545 | /* |
| 597 | * activate this job. | 546 | * activate this job. |
| 598 | */ | 547 | */ |
| 599 | sym_start_next_ccbs(np, lp, 2); | 548 | sym_put_start_queue(np, cp); |
| 600 | return 0; | 549 | return 0; |
| 601 | 550 | ||
| 602 | out_abort: | 551 | out_abort: |
| @@ -751,80 +700,54 @@ static void sym53c8xx_timer(unsigned long npref) | |||
| 751 | * What we will do regarding the involved SCSI command. | 700 | * What we will do regarding the involved SCSI command. |
| 752 | */ | 701 | */ |
| 753 | #define SYM_EH_DO_IGNORE 0 | 702 | #define SYM_EH_DO_IGNORE 0 |
| 754 | #define SYM_EH_DO_COMPLETE 1 | ||
| 755 | #define SYM_EH_DO_WAIT 2 | 703 | #define SYM_EH_DO_WAIT 2 |
| 756 | 704 | ||
| 757 | /* | 705 | /* |
| 758 | * Our general completion handler. | 706 | * scsi_done() alias when error recovery is in progress. |
| 759 | */ | 707 | */ |
| 760 | static void __sym_eh_done(struct scsi_cmnd *cmd, int timed_out) | 708 | static void sym_eh_done(struct scsi_cmnd *cmd) |
| 761 | { | 709 | { |
| 762 | struct sym_eh_wait *ep = SYM_UCMD_PTR(cmd)->eh_wait; | 710 | struct sym_ucmd *ucmd = SYM_UCMD_PTR(cmd); |
| 763 | if (!ep) | 711 | BUILD_BUG_ON(sizeof(struct scsi_pointer) < sizeof(struct sym_ucmd)); |
| 764 | return; | ||
| 765 | |||
| 766 | /* Try to avoid a race here (not 100% safe) */ | ||
| 767 | if (!timed_out) { | ||
| 768 | ep->timed_out = 0; | ||
| 769 | if (ep->to_do == SYM_EH_DO_WAIT && !del_timer(&ep->timer)) | ||
| 770 | return; | ||
| 771 | } | ||
| 772 | 712 | ||
| 773 | /* Revert everything */ | 713 | cmd->scsi_done = ucmd->old_done; |
| 774 | SYM_UCMD_PTR(cmd)->eh_wait = NULL; | ||
| 775 | cmd->scsi_done = ep->old_done; | ||
| 776 | 714 | ||
| 777 | /* Wake up the eh thread if it wants to sleep */ | 715 | if (ucmd->to_do == SYM_EH_DO_WAIT) |
| 778 | if (ep->to_do == SYM_EH_DO_WAIT) | 716 | complete(ucmd->eh_done); |
| 779 | complete(&ep->done); | ||
| 780 | } | 717 | } |
| 781 | 718 | ||
| 782 | /* | 719 | /* |
| 783 | * scsi_done() alias when error recovery is in progress. | ||
| 784 | */ | ||
| 785 | static void sym_eh_done(struct scsi_cmnd *cmd) { __sym_eh_done(cmd, 0); } | ||
| 786 | |||
| 787 | /* | ||
| 788 | * Some timeout handler to avoid waiting too long. | ||
| 789 | */ | ||
| 790 | static void sym_eh_timeout(u_long p) { __sym_eh_done((struct scsi_cmnd *)p, 1); } | ||
| 791 | |||
| 792 | /* | ||
| 793 | * Generic method for our eh processing. | 720 | * Generic method for our eh processing. |
| 794 | * The 'op' argument tells what we have to do. | 721 | * The 'op' argument tells what we have to do. |
| 795 | */ | 722 | */ |
| 796 | static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) | 723 | static int sym_eh_handler(int op, char *opname, struct scsi_cmnd *cmd) |
| 797 | { | 724 | { |
| 798 | struct sym_hcb *np = SYM_SOFTC_PTR(cmd); | 725 | struct sym_hcb *np = SYM_SOFTC_PTR(cmd); |
| 726 | struct sym_ucmd *ucmd = SYM_UCMD_PTR(cmd); | ||
| 727 | struct Scsi_Host *host = cmd->device->host; | ||
| 799 | SYM_QUEHEAD *qp; | 728 | SYM_QUEHEAD *qp; |
| 800 | int to_do = SYM_EH_DO_IGNORE; | 729 | int to_do = SYM_EH_DO_IGNORE; |
| 801 | int sts = -1; | 730 | int sts = -1; |
| 802 | struct sym_eh_wait eh, *ep = &eh; | 731 | struct completion eh_done; |
| 803 | 732 | ||
| 804 | dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname); | 733 | dev_warn(&cmd->device->sdev_gendev, "%s operation started.\n", opname); |
| 805 | 734 | ||
| 735 | spin_lock_irq(host->host_lock); | ||
| 806 | /* This one is queued in some place -> to wait for completion */ | 736 | /* This one is queued in some place -> to wait for completion */ |
| 807 | FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) { | 737 | FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) { |
| 808 | struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq); | 738 | struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq); |
| 809 | if (cp->cmd == cmd) { | 739 | if (cp->cmd == cmd) { |
| 810 | to_do = SYM_EH_DO_WAIT; | 740 | to_do = SYM_EH_DO_WAIT; |
| 811 | goto prepare; | 741 | break; |
| 812 | } | 742 | } |
| 813 | } | 743 | } |
| 814 | 744 | ||
| 815 | prepare: | 745 | if (to_do == SYM_EH_DO_WAIT) { |
| 816 | /* Prepare stuff to either ignore, complete or wait for completion */ | 746 | init_completion(&eh_done); |
| 817 | switch(to_do) { | 747 | ucmd->old_done = cmd->scsi_done; |
| 818 | default: | 748 | ucmd->eh_done = &eh_done; |
| 819 | case SYM_EH_DO_IGNORE: | 749 | wmb(); |
| 820 | break; | ||
| 821 | case SYM_EH_DO_WAIT: | ||
| 822 | init_completion(&ep->done); | ||
| 823 | /* fall through */ | ||
| 824 | case SYM_EH_DO_COMPLETE: | ||
| 825 | ep->old_done = cmd->scsi_done; | ||
| 826 | cmd->scsi_done = sym_eh_done; | 750 | cmd->scsi_done = sym_eh_done; |
| 827 | SYM_UCMD_PTR(cmd)->eh_wait = ep; | ||
| 828 | } | 751 | } |
| 829 | 752 | ||
| 830 | /* Try to proceed the operation we have been asked for */ | 753 | /* Try to proceed the operation we have been asked for */ |
| @@ -851,29 +774,19 @@ prepare: | |||
| 851 | 774 | ||
| 852 | /* On error, restore everything and cross fingers :) */ | 775 | /* On error, restore everything and cross fingers :) */ |
| 853 | if (sts) { | 776 | if (sts) { |
| 854 | SYM_UCMD_PTR(cmd)->eh_wait = NULL; | 777 | cmd->scsi_done = ucmd->old_done; |
| 855 | cmd->scsi_done = ep->old_done; | ||
| 856 | to_do = SYM_EH_DO_IGNORE; | 778 | to_do = SYM_EH_DO_IGNORE; |
| 857 | } | 779 | } |
| 858 | 780 | ||
| 859 | ep->to_do = to_do; | 781 | ucmd->to_do = to_do; |
| 860 | /* Complete the command with locks held as required by the driver */ | 782 | spin_unlock_irq(host->host_lock); |
| 861 | if (to_do == SYM_EH_DO_COMPLETE) | ||
| 862 | sym_xpt_done2(np, cmd, DID_ABORT); | ||
| 863 | 783 | ||
| 864 | /* Wait for completion with locks released, as required by kernel */ | ||
| 865 | if (to_do == SYM_EH_DO_WAIT) { | 784 | if (to_do == SYM_EH_DO_WAIT) { |
| 866 | init_timer(&ep->timer); | 785 | if (!wait_for_completion_timeout(&eh_done, 5*HZ)) { |
| 867 | ep->timer.expires = jiffies + (5*HZ); | 786 | ucmd->to_do = SYM_EH_DO_IGNORE; |
| 868 | ep->timer.function = sym_eh_timeout; | 787 | wmb(); |
| 869 | ep->timer.data = (u_long)cmd; | ||
| 870 | ep->timed_out = 1; /* Be pessimistic for once :) */ | ||
| 871 | add_timer(&ep->timer); | ||
| 872 | spin_unlock_irq(np->s.host->host_lock); | ||
| 873 | wait_for_completion(&ep->done); | ||
| 874 | spin_lock_irq(np->s.host->host_lock); | ||
| 875 | if (ep->timed_out) | ||
| 876 | sts = -2; | 788 | sts = -2; |
| 789 | } | ||
| 877 | } | 790 | } |
| 878 | dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname, | 791 | dev_warn(&cmd->device->sdev_gendev, "%s operation %s.\n", opname, |
| 879 | sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed"); | 792 | sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed"); |
| @@ -886,46 +799,22 @@ prepare: | |||
| 886 | */ | 799 | */ |
| 887 | static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd) | 800 | static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd) |
| 888 | { | 801 | { |
| 889 | int rc; | 802 | return sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd); |
| 890 | |||
| 891 | spin_lock_irq(cmd->device->host->host_lock); | ||
| 892 | rc = sym_eh_handler(SYM_EH_ABORT, "ABORT", cmd); | ||
| 893 | spin_unlock_irq(cmd->device->host->host_lock); | ||
| 894 | |||
| 895 | return rc; | ||
| 896 | } | 803 | } |
| 897 | 804 | ||
| 898 | static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd) | 805 | static int sym53c8xx_eh_device_reset_handler(struct scsi_cmnd *cmd) |
| 899 | { | 806 | { |
| 900 | int rc; | 807 | return sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd); |
| 901 | |||
| 902 | spin_lock_irq(cmd->device->host->host_lock); | ||
| 903 | rc = sym_eh_handler(SYM_EH_DEVICE_RESET, "DEVICE RESET", cmd); | ||
| 904 | spin_unlock_irq(cmd->device->host->host_lock); | ||
| 905 | |||
| 906 | return rc; | ||
| 907 | } | 808 | } |
| 908 | 809 | ||
| 909 | static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) | 810 | static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd) |
| 910 | { | 811 | { |
| 911 | int rc; | 812 | return sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd); |
| 912 | |||
| 913 | spin_lock_irq(cmd->device->host->host_lock); | ||
| 914 | rc = sym_eh_handler(SYM_EH_BUS_RESET, "BUS RESET", cmd); | ||
| 915 | spin_unlock_irq(cmd->device->host->host_lock); | ||
| 916 | |||
| 917 | return rc; | ||
| 918 | } | 813 | } |
| 919 | 814 | ||
| 920 | static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd) | 815 | static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd) |
| 921 | { | 816 | { |
| 922 | int rc; | 817 | return sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd); |
| 923 | |||
| 924 | spin_lock_irq(cmd->device->host->host_lock); | ||
| 925 | rc = sym_eh_handler(SYM_EH_HOST_RESET, "HOST RESET", cmd); | ||
| 926 | spin_unlock_irq(cmd->device->host->host_lock); | ||
| 927 | |||
| 928 | return rc; | ||
| 929 | } | 818 | } |
| 930 | 819 | ||
| 931 | /* | 820 | /* |
| @@ -944,15 +833,12 @@ static void sym_tune_dev_queuing(struct sym_tcb *tp, int lun, u_short reqtags) | |||
| 944 | if (reqtags > lp->s.scdev_depth) | 833 | if (reqtags > lp->s.scdev_depth) |
| 945 | reqtags = lp->s.scdev_depth; | 834 | reqtags = lp->s.scdev_depth; |
| 946 | 835 | ||
| 947 | lp->started_limit = reqtags ? reqtags : 2; | ||
| 948 | lp->started_max = 1; | ||
| 949 | lp->s.reqtags = reqtags; | 836 | lp->s.reqtags = reqtags; |
| 950 | 837 | ||
| 951 | if (reqtags != oldtags) { | 838 | if (reqtags != oldtags) { |
| 952 | dev_info(&tp->starget->dev, | 839 | dev_info(&tp->starget->dev, |
| 953 | "tagged command queuing %s, command queue depth %d.\n", | 840 | "tagged command queuing %s, command queue depth %d.\n", |
| 954 | lp->s.reqtags ? "enabled" : "disabled", | 841 | lp->s.reqtags ? "enabled" : "disabled", reqtags); |
| 955 | lp->started_limit); | ||
| 956 | } | 842 | } |
| 957 | } | 843 | } |
| 958 | 844 | ||
| @@ -1866,15 +1752,25 @@ static int __devinit sym_set_workarounds(struct sym_device *device) | |||
| 1866 | static void __devinit | 1752 | static void __devinit |
| 1867 | sym_init_device(struct pci_dev *pdev, struct sym_device *device) | 1753 | sym_init_device(struct pci_dev *pdev, struct sym_device *device) |
| 1868 | { | 1754 | { |
| 1869 | int i; | 1755 | int i = 2; |
| 1756 | struct pci_bus_region bus_addr; | ||
| 1870 | 1757 | ||
| 1871 | device->host_id = SYM_SETUP_HOST_ID; | 1758 | device->host_id = SYM_SETUP_HOST_ID; |
| 1872 | device->pdev = pdev; | 1759 | device->pdev = pdev; |
| 1873 | 1760 | ||
| 1874 | i = pci_get_base_address(pdev, 1, &device->mmio_base); | 1761 | pcibios_resource_to_bus(pdev, &bus_addr, &pdev->resource[1]); |
| 1875 | pci_get_base_address(pdev, i, &device->ram_base); | 1762 | device->mmio_base = bus_addr.start; |
| 1763 | |||
| 1764 | /* | ||
| 1765 | * If the BAR is 64-bit, resource 2 will be occupied by the | ||
| 1766 | * upper 32 bits | ||
| 1767 | */ | ||
| 1768 | if (!pdev->resource[i].flags) | ||
| 1769 | i++; | ||
| 1770 | pcibios_resource_to_bus(pdev, &bus_addr, &pdev->resource[i]); | ||
| 1771 | device->ram_base = bus_addr.start; | ||
| 1876 | 1772 | ||
| 1877 | #ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED | 1773 | #ifdef CONFIG_SCSI_SYM53C8XX_MMIO |
| 1878 | if (device->mmio_base) | 1774 | if (device->mmio_base) |
| 1879 | device->s.ioaddr = pci_iomap(pdev, 1, | 1775 | device->s.ioaddr = pci_iomap(pdev, 1, |
| 1880 | pci_resource_len(pdev, 1)); | 1776 | pci_resource_len(pdev, 1)); |
| @@ -1978,7 +1874,8 @@ static struct scsi_host_template sym2_template = { | |||
| 1978 | .eh_bus_reset_handler = sym53c8xx_eh_bus_reset_handler, | 1874 | .eh_bus_reset_handler = sym53c8xx_eh_bus_reset_handler, |
| 1979 | .eh_host_reset_handler = sym53c8xx_eh_host_reset_handler, | 1875 | .eh_host_reset_handler = sym53c8xx_eh_host_reset_handler, |
| 1980 | .this_id = 7, | 1876 | .this_id = 7, |
| 1981 | .use_clustering = DISABLE_CLUSTERING, | 1877 | .use_clustering = ENABLE_CLUSTERING, |
| 1878 | .max_sectors = 0xFFFF, | ||
| 1982 | #ifdef SYM_LINUX_PROC_INFO_SUPPORT | 1879 | #ifdef SYM_LINUX_PROC_INFO_SUPPORT |
| 1983 | .proc_info = sym53c8xx_proc_info, | 1880 | .proc_info = sym53c8xx_proc_info, |
| 1984 | .proc_name = NAME53C8XX, | 1881 | .proc_name = NAME53C8XX, |
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.h b/drivers/scsi/sym53c8xx_2/sym_glue.h index cc92d0c70cd7..a446cda3f64c 100644 --- a/drivers/scsi/sym53c8xx_2/sym_glue.h +++ b/drivers/scsi/sym53c8xx_2/sym_glue.h | |||
| @@ -68,7 +68,7 @@ | |||
| 68 | */ | 68 | */ |
| 69 | #define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2) | 69 | #define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2) |
| 70 | 70 | ||
| 71 | #define SYM_OPT_HANDLE_DEVICE_QUEUEING | 71 | #undef SYM_OPT_HANDLE_DEVICE_QUEUEING |
| 72 | #define SYM_OPT_LIMIT_COMMAND_REORDERING | 72 | #define SYM_OPT_LIMIT_COMMAND_REORDERING |
| 73 | 73 | ||
| 74 | /* | 74 | /* |
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 60850cbe3a85..a671bdc07450 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c | |||
| @@ -72,7 +72,10 @@ static void sym_printl_hex(u_char *p, int n) | |||
| 72 | 72 | ||
| 73 | static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) | 73 | static void sym_print_msg(struct sym_ccb *cp, char *label, u_char *msg) |
| 74 | { | 74 | { |
| 75 | sym_print_addr(cp->cmd, "%s: ", label); | 75 | if (label) |
| 76 | sym_print_addr(cp->cmd, "%s: ", label); | ||
| 77 | else | ||
| 78 | sym_print_addr(cp->cmd, ""); | ||
| 76 | 79 | ||
| 77 | spi_print_msg(msg); | 80 | spi_print_msg(msg); |
| 78 | printf("\n"); | 81 | printf("\n"); |
| @@ -472,7 +475,7 @@ static int sym_getpciclock (struct sym_hcb *np) | |||
| 472 | * calculations more simple. | 475 | * calculations more simple. |
| 473 | */ | 476 | */ |
| 474 | #define _5M 5000000 | 477 | #define _5M 5000000 |
| 475 | static u32 div_10M[] = {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M}; | 478 | static const u32 div_10M[] = {2*_5M, 3*_5M, 4*_5M, 6*_5M, 8*_5M, 12*_5M, 16*_5M}; |
| 476 | 479 | ||
| 477 | /* | 480 | /* |
| 478 | * Get clock factor and sync divisor for a given | 481 | * Get clock factor and sync divisor for a given |
| @@ -645,6 +648,37 @@ static void sym_save_initial_setting (struct sym_hcb *np) | |||
| 645 | } | 648 | } |
| 646 | 649 | ||
| 647 | /* | 650 | /* |
| 651 | * Set SCSI BUS mode. | ||
| 652 | * - LVD capable chips (895/895A/896/1010) report the current BUS mode | ||
| 653 | * through the STEST4 IO register. | ||
| 654 | * - For previous generation chips (825/825A/875), the user has to tell us | ||
| 655 | * how to check against HVD, since a 100% safe algorithm is not possible. | ||
| 656 | */ | ||
| 657 | static void sym_set_bus_mode(struct sym_hcb *np, struct sym_nvram *nvram) | ||
| 658 | { | ||
| 659 | if (np->scsi_mode) | ||
| 660 | return; | ||
| 661 | |||
| 662 | np->scsi_mode = SMODE_SE; | ||
| 663 | if (np->features & (FE_ULTRA2|FE_ULTRA3)) | ||
| 664 | np->scsi_mode = (np->sv_stest4 & SMODE); | ||
| 665 | else if (np->features & FE_DIFF) { | ||
| 666 | if (SYM_SETUP_SCSI_DIFF == 1) { | ||
| 667 | if (np->sv_scntl3) { | ||
| 668 | if (np->sv_stest2 & 0x20) | ||
| 669 | np->scsi_mode = SMODE_HVD; | ||
| 670 | } else if (nvram->type == SYM_SYMBIOS_NVRAM) { | ||
| 671 | if (!(INB(np, nc_gpreg) & 0x08)) | ||
| 672 | np->scsi_mode = SMODE_HVD; | ||
| 673 | } | ||
| 674 | } else if (SYM_SETUP_SCSI_DIFF == 2) | ||
| 675 | np->scsi_mode = SMODE_HVD; | ||
| 676 | } | ||
| 677 | if (np->scsi_mode == SMODE_HVD) | ||
| 678 | np->rv_stest2 |= 0x20; | ||
| 679 | } | ||
| 680 | |||
| 681 | /* | ||
| 648 | * Prepare io register values used by sym_start_up() | 682 | * Prepare io register values used by sym_start_up() |
| 649 | * according to selected and supported features. | 683 | * according to selected and supported features. |
| 650 | */ | 684 | */ |
| @@ -654,10 +688,7 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru | |||
| 654 | u32 period; | 688 | u32 period; |
| 655 | int i; | 689 | int i; |
| 656 | 690 | ||
| 657 | /* | 691 | np->maxwide = (np->features & FE_WIDE) ? 1 : 0; |
| 658 | * Wide ? | ||
| 659 | */ | ||
| 660 | np->maxwide = (np->features & FE_WIDE)? 1 : 0; | ||
| 661 | 692 | ||
| 662 | /* | 693 | /* |
| 663 | * Guess the frequency of the chip's clock. | 694 | * Guess the frequency of the chip's clock. |
| @@ -838,6 +869,7 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru | |||
| 838 | * Get parity checking, host ID and verbose mode from NVRAM | 869 | * Get parity checking, host ID and verbose mode from NVRAM |
| 839 | */ | 870 | */ |
| 840 | np->myaddr = 255; | 871 | np->myaddr = 255; |
| 872 | np->scsi_mode = 0; | ||
| 841 | sym_nvram_setup_host(shost, np, nvram); | 873 | sym_nvram_setup_host(shost, np, nvram); |
| 842 | 874 | ||
| 843 | /* | 875 | /* |
| @@ -854,33 +886,7 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru | |||
| 854 | */ | 886 | */ |
| 855 | sym_init_burst(np, burst_max); | 887 | sym_init_burst(np, burst_max); |
| 856 | 888 | ||
| 857 | /* | 889 | sym_set_bus_mode(np, nvram); |
| 858 | * Set SCSI BUS mode. | ||
| 859 | * - LVD capable chips (895/895A/896/1010) report the | ||
| 860 | * current BUS mode through the STEST4 IO register. | ||
| 861 | * - For previous generation chips (825/825A/875), | ||
| 862 | * user has to tell us how to check against HVD, | ||
| 863 | * since a 100% safe algorithm is not possible. | ||
| 864 | */ | ||
| 865 | np->scsi_mode = SMODE_SE; | ||
| 866 | if (np->features & (FE_ULTRA2|FE_ULTRA3)) | ||
| 867 | np->scsi_mode = (np->sv_stest4 & SMODE); | ||
| 868 | else if (np->features & FE_DIFF) { | ||
| 869 | if (SYM_SETUP_SCSI_DIFF == 1) { | ||
| 870 | if (np->sv_scntl3) { | ||
| 871 | if (np->sv_stest2 & 0x20) | ||
| 872 | np->scsi_mode = SMODE_HVD; | ||
| 873 | } | ||
| 874 | else if (nvram->type == SYM_SYMBIOS_NVRAM) { | ||
| 875 | if (!(INB(np, nc_gpreg) & 0x08)) | ||
| 876 | np->scsi_mode = SMODE_HVD; | ||
| 877 | } | ||
| 878 | } | ||
| 879 | else if (SYM_SETUP_SCSI_DIFF == 2) | ||
| 880 | np->scsi_mode = SMODE_HVD; | ||
| 881 | } | ||
| 882 | if (np->scsi_mode == SMODE_HVD) | ||
| 883 | np->rv_stest2 |= 0x20; | ||
| 884 | 890 | ||
| 885 | /* | 891 | /* |
| 886 | * Set LED support from SCRIPTS. | 892 | * Set LED support from SCRIPTS. |
| @@ -973,8 +979,8 @@ static int sym_prepare_setting(struct Scsi_Host *shost, struct sym_hcb *np, stru | |||
| 973 | * | 979 | * |
| 974 | * Has to be called with interrupts disabled. | 980 | * Has to be called with interrupts disabled. |
| 975 | */ | 981 | */ |
| 976 | #ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED | 982 | #ifdef CONFIG_SCSI_SYM53C8XX_MMIO |
| 977 | static int sym_regtest (struct sym_hcb *np) | 983 | static int sym_regtest(struct sym_hcb *np) |
| 978 | { | 984 | { |
| 979 | register volatile u32 data; | 985 | register volatile u32 data; |
| 980 | /* | 986 | /* |
| @@ -992,20 +998,25 @@ static int sym_regtest (struct sym_hcb *np) | |||
| 992 | #endif | 998 | #endif |
| 993 | printf ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n", | 999 | printf ("CACHE TEST FAILED: reg dstat-sstat2 readback %x.\n", |
| 994 | (unsigned) data); | 1000 | (unsigned) data); |
| 995 | return (0x10); | 1001 | return 0x10; |
| 996 | } | 1002 | } |
| 997 | return (0); | 1003 | return 0; |
| 1004 | } | ||
| 1005 | #else | ||
| 1006 | static inline int sym_regtest(struct sym_hcb *np) | ||
| 1007 | { | ||
| 1008 | return 0; | ||
| 998 | } | 1009 | } |
| 999 | #endif | 1010 | #endif |
| 1000 | 1011 | ||
| 1001 | static int sym_snooptest (struct sym_hcb *np) | 1012 | static int sym_snooptest(struct sym_hcb *np) |
| 1002 | { | 1013 | { |
| 1003 | u32 sym_rd, sym_wr, sym_bk, host_rd, host_wr, pc, dstat; | 1014 | u32 sym_rd, sym_wr, sym_bk, host_rd, host_wr, pc, dstat; |
| 1004 | int i, err=0; | 1015 | int i, err; |
| 1005 | #ifndef CONFIG_SCSI_SYM53C8XX_IOMAPPED | 1016 | |
| 1006 | err |= sym_regtest (np); | 1017 | err = sym_regtest(np); |
| 1007 | if (err) return (err); | 1018 | if (err) |
| 1008 | #endif | 1019 | return err; |
| 1009 | restart_test: | 1020 | restart_test: |
| 1010 | /* | 1021 | /* |
| 1011 | * Enable Master Parity Checking as we intend | 1022 | * Enable Master Parity Checking as we intend |
| @@ -1094,7 +1105,7 @@ restart_test: | |||
| 1094 | err |= 4; | 1105 | err |= 4; |
| 1095 | } | 1106 | } |
| 1096 | 1107 | ||
| 1097 | return (err); | 1108 | return err; |
| 1098 | } | 1109 | } |
| 1099 | 1110 | ||
| 1100 | /* | 1111 | /* |
| @@ -1464,7 +1475,7 @@ static int sym_prepare_nego(struct sym_hcb *np, struct sym_ccb *cp, u_char *msgp | |||
| 1464 | /* | 1475 | /* |
| 1465 | * Insert a job into the start queue. | 1476 | * Insert a job into the start queue. |
| 1466 | */ | 1477 | */ |
| 1467 | static void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) | 1478 | void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp) |
| 1468 | { | 1479 | { |
| 1469 | u_short qidx; | 1480 | u_short qidx; |
| 1470 | 1481 | ||
| @@ -4481,7 +4492,7 @@ static void sym_int_sir (struct sym_hcb *np) | |||
| 4481 | switch (np->msgin [2]) { | 4492 | switch (np->msgin [2]) { |
| 4482 | case M_X_MODIFY_DP: | 4493 | case M_X_MODIFY_DP: |
| 4483 | if (DEBUG_FLAGS & DEBUG_POINTER) | 4494 | if (DEBUG_FLAGS & DEBUG_POINTER) |
| 4484 | sym_print_msg(cp,"modify DP",np->msgin); | 4495 | sym_print_msg(cp, NULL, np->msgin); |
| 4485 | tmp = (np->msgin[3]<<24) + (np->msgin[4]<<16) + | 4496 | tmp = (np->msgin[3]<<24) + (np->msgin[4]<<16) + |
| 4486 | (np->msgin[5]<<8) + (np->msgin[6]); | 4497 | (np->msgin[5]<<8) + (np->msgin[6]); |
| 4487 | sym_modify_dp(np, tp, cp, tmp); | 4498 | sym_modify_dp(np, tp, cp, tmp); |
| @@ -4508,7 +4519,7 @@ static void sym_int_sir (struct sym_hcb *np) | |||
| 4508 | */ | 4519 | */ |
| 4509 | case M_IGN_RESIDUE: | 4520 | case M_IGN_RESIDUE: |
| 4510 | if (DEBUG_FLAGS & DEBUG_POINTER) | 4521 | if (DEBUG_FLAGS & DEBUG_POINTER) |
| 4511 | sym_print_msg(cp,"ign wide residue", np->msgin); | 4522 | sym_print_msg(cp, NULL, np->msgin); |
| 4512 | if (cp->host_flags & HF_SENSE) | 4523 | if (cp->host_flags & HF_SENSE) |
| 4513 | OUTL_DSP(np, SCRIPTA_BA(np, clrack)); | 4524 | OUTL_DSP(np, SCRIPTA_BA(np, clrack)); |
| 4514 | else | 4525 | else |
| @@ -4597,7 +4608,8 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t | |||
| 4597 | * Debugging purpose. | 4608 | * Debugging purpose. |
| 4598 | */ | 4609 | */ |
| 4599 | #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING | 4610 | #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING |
| 4600 | assert(lp->busy_itl == 0); | 4611 | if (lp->busy_itl != 0) |
| 4612 | goto out_free; | ||
| 4601 | #endif | 4613 | #endif |
| 4602 | /* | 4614 | /* |
| 4603 | * Allocate resources for tags if not yet. | 4615 | * Allocate resources for tags if not yet. |
| @@ -4642,7 +4654,8 @@ struct sym_ccb *sym_get_ccb (struct sym_hcb *np, struct scsi_cmnd *cmd, u_char t | |||
| 4642 | * Debugging purpose. | 4654 | * Debugging purpose. |
| 4643 | */ | 4655 | */ |
| 4644 | #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING | 4656 | #ifndef SYM_OPT_HANDLE_DEVICE_QUEUEING |
| 4645 | assert(lp->busy_itl == 0 && lp->busy_itlq == 0); | 4657 | if (lp->busy_itl != 0 || lp->busy_itlq != 0) |
| 4658 | goto out_free; | ||
| 4646 | #endif | 4659 | #endif |
| 4647 | /* | 4660 | /* |
| 4648 | * Count this nexus for this LUN. | 4661 | * Count this nexus for this LUN. |
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h index 2456090bb241..79ab6a177039 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.h +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h | |||
| @@ -1049,6 +1049,8 @@ int sym_reset_scsi_bus(struct sym_hcb *np, int enab_int); | |||
| 1049 | struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision); | 1049 | struct sym_chip *sym_lookup_chip_table(u_short device_id, u_char revision); |
| 1050 | #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING | 1050 | #ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING |
| 1051 | void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn); | 1051 | void sym_start_next_ccbs(struct sym_hcb *np, struct sym_lcb *lp, int maxn); |
| 1052 | #else | ||
| 1053 | void sym_put_start_queue(struct sym_hcb *np, struct sym_ccb *cp); | ||
| 1052 | #endif | 1054 | #endif |
| 1053 | void sym_start_up(struct sym_hcb *np, int reason); | 1055 | void sym_start_up(struct sym_hcb *np, int reason); |
| 1054 | void sym_interrupt(struct sym_hcb *np); | 1056 | void sym_interrupt(struct sym_hcb *np); |
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index 830d2c982670..b38990adf1cd 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c | |||
| @@ -68,7 +68,7 @@ | |||
| 68 | 68 | ||
| 69 | #include "usbatm.h" | 69 | #include "usbatm.h" |
| 70 | 70 | ||
| 71 | #define EAGLEUSBVERSION "ueagle 1.2" | 71 | #define EAGLEUSBVERSION "ueagle 1.3" |
| 72 | 72 | ||
| 73 | 73 | ||
| 74 | /* | 74 | /* |
| @@ -243,7 +243,7 @@ enum { | |||
| 243 | #define BULK_TIMEOUT 300 | 243 | #define BULK_TIMEOUT 300 |
| 244 | #define CTRL_TIMEOUT 1000 | 244 | #define CTRL_TIMEOUT 1000 |
| 245 | 245 | ||
| 246 | #define ACK_TIMEOUT msecs_to_jiffies(1500) | 246 | #define ACK_TIMEOUT msecs_to_jiffies(3000) |
| 247 | 247 | ||
| 248 | #define UEA_INTR_IFACE_NO 0 | 248 | #define UEA_INTR_IFACE_NO 0 |
| 249 | #define UEA_US_IFACE_NO 1 | 249 | #define UEA_US_IFACE_NO 1 |
| @@ -314,6 +314,10 @@ struct cmv { | |||
| 314 | ((d) & 0xff) << 16 | \ | 314 | ((d) & 0xff) << 16 | \ |
| 315 | ((a) & 0xff) << 8 | \ | 315 | ((a) & 0xff) << 8 | \ |
| 316 | ((b) & 0xff)) | 316 | ((b) & 0xff)) |
| 317 | #define GETSA1(a) ((a >> 8) & 0xff) | ||
| 318 | #define GETSA2(a) (a & 0xff) | ||
| 319 | #define GETSA3(a) ((a >> 24) & 0xff) | ||
| 320 | #define GETSA4(a) ((a >> 16) & 0xff) | ||
| 317 | 321 | ||
| 318 | #define SA_CNTL MAKESA('C', 'N', 'T', 'L') | 322 | #define SA_CNTL MAKESA('C', 'N', 'T', 'L') |
| 319 | #define SA_DIAG MAKESA('D', 'I', 'A', 'G') | 323 | #define SA_DIAG MAKESA('D', 'I', 'A', 'G') |
| @@ -728,11 +732,12 @@ bad2: | |||
| 728 | uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i); | 732 | uea_err(INS_TO_USBDEV(sc), "sending DSP block %u failed\n", i); |
| 729 | return; | 733 | return; |
| 730 | bad1: | 734 | bad1: |
| 731 | uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n",pageno); | 735 | uea_err(INS_TO_USBDEV(sc), "invalid DSP page %u requested\n", pageno); |
| 732 | } | 736 | } |
| 733 | 737 | ||
| 734 | static inline void wake_up_cmv_ack(struct uea_softc *sc) | 738 | static inline void wake_up_cmv_ack(struct uea_softc *sc) |
| 735 | { | 739 | { |
| 740 | BUG_ON(sc->cmv_ack); | ||
| 736 | sc->cmv_ack = 1; | 741 | sc->cmv_ack = 1; |
| 737 | wake_up(&sc->cmv_ack_wait); | 742 | wake_up(&sc->cmv_ack_wait); |
| 738 | } | 743 | } |
| @@ -743,6 +748,9 @@ static inline int wait_cmv_ack(struct uea_softc *sc) | |||
| 743 | sc->cmv_ack, ACK_TIMEOUT); | 748 | sc->cmv_ack, ACK_TIMEOUT); |
| 744 | sc->cmv_ack = 0; | 749 | sc->cmv_ack = 0; |
| 745 | 750 | ||
| 751 | uea_dbg(INS_TO_USBDEV(sc), "wait_event_timeout : %d ms\n", | ||
| 752 | jiffies_to_msecs(ret)); | ||
| 753 | |||
| 746 | if (ret < 0) | 754 | if (ret < 0) |
| 747 | return ret; | 755 | return ret; |
| 748 | 756 | ||
| @@ -791,6 +799,12 @@ static int uea_cmv(struct uea_softc *sc, | |||
| 791 | struct cmv cmv; | 799 | struct cmv cmv; |
| 792 | int ret; | 800 | int ret; |
| 793 | 801 | ||
| 802 | uea_enters(INS_TO_USBDEV(sc)); | ||
| 803 | uea_vdbg(INS_TO_USBDEV(sc), "Function : %d-%d, Address : %c%c%c%c, " | ||
| 804 | "offset : 0x%04x, data : 0x%08x\n", | ||
| 805 | FUNCTION_TYPE(function), FUNCTION_SUBTYPE(function), | ||
| 806 | GETSA1(address), GETSA2(address), GETSA3(address), | ||
| 807 | GETSA4(address), offset, data); | ||
| 794 | /* we send a request, but we expect a reply */ | 808 | /* we send a request, but we expect a reply */ |
| 795 | sc->cmv_function = function | 0x2; | 809 | sc->cmv_function = function | 0x2; |
| 796 | sc->cmv_idx++; | 810 | sc->cmv_idx++; |
| @@ -808,7 +822,9 @@ static int uea_cmv(struct uea_softc *sc, | |||
| 808 | ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv); | 822 | ret = uea_request(sc, UEA_SET_BLOCK, UEA_MPTX_START, CMV_SIZE, &cmv); |
| 809 | if (ret < 0) | 823 | if (ret < 0) |
| 810 | return ret; | 824 | return ret; |
| 811 | return wait_cmv_ack(sc); | 825 | ret = wait_cmv_ack(sc); |
| 826 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 827 | return ret; | ||
| 812 | } | 828 | } |
| 813 | 829 | ||
| 814 | static inline int uea_read_cmv(struct uea_softc *sc, | 830 | static inline int uea_read_cmv(struct uea_softc *sc, |
| @@ -922,7 +938,7 @@ static int uea_stat(struct uea_softc *sc) | |||
| 922 | * we check the status again in order to detect the failure earlier | 938 | * we check the status again in order to detect the failure earlier |
| 923 | */ | 939 | */ |
| 924 | if (sc->stats.phy.flags) { | 940 | if (sc->stats.phy.flags) { |
| 925 | uea_dbg(INS_TO_USBDEV(sc), "Stat flag = %d\n", | 941 | uea_dbg(INS_TO_USBDEV(sc), "Stat flag = 0x%x\n", |
| 926 | sc->stats.phy.flags); | 942 | sc->stats.phy.flags); |
| 927 | return 0; | 943 | return 0; |
| 928 | } | 944 | } |
| @@ -1063,7 +1079,13 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1063 | uea_enters(INS_TO_USBDEV(sc)); | 1079 | uea_enters(INS_TO_USBDEV(sc)); |
| 1064 | uea_info(INS_TO_USBDEV(sc), "(re)booting started\n"); | 1080 | uea_info(INS_TO_USBDEV(sc), "(re)booting started\n"); |
| 1065 | 1081 | ||
| 1082 | /* mask interrupt */ | ||
| 1066 | sc->booting = 1; | 1083 | sc->booting = 1; |
| 1084 | /* We need to set this here because, a ack timeout could have occured, | ||
| 1085 | * but before we start the reboot, the ack occurs and set this to 1. | ||
| 1086 | * So we will failed to wait Ready CMV. | ||
| 1087 | */ | ||
| 1088 | sc->cmv_ack = 0; | ||
| 1067 | UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST); | 1089 | UPDATE_ATM_STAT(signal, ATM_PHY_SIG_LOST); |
| 1068 | 1090 | ||
| 1069 | /* reset statistics */ | 1091 | /* reset statistics */ |
| @@ -1089,6 +1111,7 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1089 | 1111 | ||
| 1090 | msleep(1000); | 1112 | msleep(1000); |
| 1091 | sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY); | 1113 | sc->cmv_function = MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY); |
| 1114 | /* demask interrupt */ | ||
| 1092 | sc->booting = 0; | 1115 | sc->booting = 0; |
| 1093 | 1116 | ||
| 1094 | /* start loading DSP */ | 1117 | /* start loading DSP */ |
| @@ -1101,6 +1124,8 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1101 | if (ret < 0) | 1124 | if (ret < 0) |
| 1102 | return ret; | 1125 | return ret; |
| 1103 | 1126 | ||
| 1127 | uea_vdbg(INS_TO_USBDEV(sc), "Ready CMV received\n"); | ||
| 1128 | |||
| 1104 | /* Enter in R-IDLE (cmv) until instructed otherwise */ | 1129 | /* Enter in R-IDLE (cmv) until instructed otherwise */ |
| 1105 | ret = uea_write_cmv(sc, SA_CNTL, 0, 1); | 1130 | ret = uea_write_cmv(sc, SA_CNTL, 0, 1); |
| 1106 | if (ret < 0) | 1131 | if (ret < 0) |
| @@ -1121,6 +1146,7 @@ static int uea_start_reset(struct uea_softc *sc) | |||
| 1121 | } | 1146 | } |
| 1122 | /* Enter in R-ACT-REQ */ | 1147 | /* Enter in R-ACT-REQ */ |
| 1123 | ret = uea_write_cmv(sc, SA_CNTL, 0, 2); | 1148 | ret = uea_write_cmv(sc, SA_CNTL, 0, 2); |
| 1149 | uea_vdbg(INS_TO_USBDEV(sc), "Entering in R-ACT-REQ state\n"); | ||
| 1124 | out: | 1150 | out: |
| 1125 | release_firmware(cmvs_fw); | 1151 | release_firmware(cmvs_fw); |
| 1126 | sc->reset = 0; | 1152 | sc->reset = 0; |
| @@ -1235,6 +1261,7 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) | |||
| 1235 | 1261 | ||
| 1236 | if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) { | 1262 | if (cmv->bFunction == MAKEFUNCTION(ADSLDIRECTIVE, MODEMREADY)) { |
| 1237 | wake_up_cmv_ack(sc); | 1263 | wake_up_cmv_ack(sc); |
| 1264 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1238 | return; | 1265 | return; |
| 1239 | } | 1266 | } |
| 1240 | 1267 | ||
| @@ -1249,6 +1276,7 @@ static void uea_dispatch_cmv(struct uea_softc *sc, struct cmv* cmv) | |||
| 1249 | sc->data = sc->data << 16 | sc->data >> 16; | 1276 | sc->data = sc->data << 16 | sc->data >> 16; |
| 1250 | 1277 | ||
| 1251 | wake_up_cmv_ack(sc); | 1278 | wake_up_cmv_ack(sc); |
| 1279 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1252 | return; | 1280 | return; |
| 1253 | 1281 | ||
| 1254 | bad2: | 1282 | bad2: |
| @@ -1256,12 +1284,14 @@ bad2: | |||
| 1256 | "Function : %d, Subfunction : %d\n", | 1284 | "Function : %d, Subfunction : %d\n", |
| 1257 | FUNCTION_TYPE(cmv->bFunction), | 1285 | FUNCTION_TYPE(cmv->bFunction), |
| 1258 | FUNCTION_SUBTYPE(cmv->bFunction)); | 1286 | FUNCTION_SUBTYPE(cmv->bFunction)); |
| 1287 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1259 | return; | 1288 | return; |
| 1260 | 1289 | ||
| 1261 | bad1: | 1290 | bad1: |
| 1262 | uea_err(INS_TO_USBDEV(sc), "invalid cmv received, " | 1291 | uea_err(INS_TO_USBDEV(sc), "invalid cmv received, " |
| 1263 | "wPreamble %d, bDirection %d\n", | 1292 | "wPreamble %d, bDirection %d\n", |
| 1264 | le16_to_cpu(cmv->wPreamble), cmv->bDirection); | 1293 | le16_to_cpu(cmv->wPreamble), cmv->bDirection); |
| 1294 | uea_leaves(INS_TO_USBDEV(sc)); | ||
| 1265 | } | 1295 | } |
| 1266 | 1296 | ||
| 1267 | /* | 1297 | /* |
| @@ -1346,7 +1376,7 @@ static int uea_boot(struct uea_softc *sc) | |||
| 1346 | if (ret < 0) { | 1376 | if (ret < 0) { |
| 1347 | uea_err(INS_TO_USBDEV(sc), | 1377 | uea_err(INS_TO_USBDEV(sc), |
| 1348 | "urb submition failed with error %d\n", ret); | 1378 | "urb submition failed with error %d\n", ret); |
| 1349 | goto err1; | 1379 | goto err; |
| 1350 | } | 1380 | } |
| 1351 | 1381 | ||
| 1352 | sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); | 1382 | sc->kthread = kthread_run(uea_kthread, sc, "ueagle-atm"); |
| @@ -1360,10 +1390,10 @@ static int uea_boot(struct uea_softc *sc) | |||
| 1360 | 1390 | ||
| 1361 | err2: | 1391 | err2: |
| 1362 | usb_kill_urb(sc->urb_int); | 1392 | usb_kill_urb(sc->urb_int); |
| 1363 | err1: | ||
| 1364 | kfree(intr); | ||
| 1365 | err: | 1393 | err: |
| 1366 | usb_free_urb(sc->urb_int); | 1394 | usb_free_urb(sc->urb_int); |
| 1395 | sc->urb_int = NULL; | ||
| 1396 | kfree(intr); | ||
| 1367 | uea_leaves(INS_TO_USBDEV(sc)); | 1397 | uea_leaves(INS_TO_USBDEV(sc)); |
| 1368 | return -ENOMEM; | 1398 | return -ENOMEM; |
| 1369 | } | 1399 | } |
| @@ -1508,7 +1538,7 @@ static ssize_t read_##name(struct device *dev, \ | |||
| 1508 | int ret = -ENODEV; \ | 1538 | int ret = -ENODEV; \ |
| 1509 | struct uea_softc *sc; \ | 1539 | struct uea_softc *sc; \ |
| 1510 | \ | 1540 | \ |
| 1511 | mutex_lock(&uea_mutex); \ | 1541 | mutex_lock(&uea_mutex); \ |
| 1512 | sc = dev_to_uea(dev); \ | 1542 | sc = dev_to_uea(dev); \ |
| 1513 | if (!sc) \ | 1543 | if (!sc) \ |
| 1514 | goto out; \ | 1544 | goto out; \ |
| @@ -1516,7 +1546,7 @@ static ssize_t read_##name(struct device *dev, \ | |||
| 1516 | if (reset) \ | 1546 | if (reset) \ |
| 1517 | sc->stats.phy.name = 0; \ | 1547 | sc->stats.phy.name = 0; \ |
| 1518 | out: \ | 1548 | out: \ |
| 1519 | mutex_unlock(&uea_mutex); \ | 1549 | mutex_unlock(&uea_mutex); \ |
| 1520 | return ret; \ | 1550 | return ret; \ |
| 1521 | } \ | 1551 | } \ |
| 1522 | \ | 1552 | \ |
| @@ -1643,7 +1673,7 @@ static int uea_bind(struct usbatm_data *usbatm, struct usb_interface *intf, | |||
| 1643 | 1673 | ||
| 1644 | sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL); | 1674 | sc = kzalloc(sizeof(struct uea_softc), GFP_KERNEL); |
| 1645 | if (!sc) { | 1675 | if (!sc) { |
| 1646 | uea_err(INS_TO_USBDEV(sc), "uea_init: not enough memory !\n"); | 1676 | uea_err(usb, "uea_init: not enough memory !\n"); |
| 1647 | return -ENOMEM; | 1677 | return -ENOMEM; |
| 1648 | } | 1678 | } |
| 1649 | 1679 | ||
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index ff03184da403..a08787e253aa 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
| @@ -99,4 +99,11 @@ config USB_OTG_WHITELIST | |||
| 99 | normal Linux-USB hosts do (other than the warning), and is | 99 | normal Linux-USB hosts do (other than the warning), and is |
| 100 | convenient for many stages of product development. | 100 | convenient for many stages of product development. |
| 101 | 101 | ||
| 102 | config USB_OTG_BLACKLIST_HUB | ||
| 103 | bool "Disable external hubs" | ||
| 104 | depends on USB_OTG | ||
| 105 | help | ||
| 106 | If you say Y here, then Linux will refuse to enumerate | ||
| 107 | external hubs. OTG hosts are allowed to reduce hardware | ||
| 108 | and software costs by not supporting external hubs. | ||
| 102 | 109 | ||
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index 0d2193b69235..66b78404ab34 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -213,11 +213,9 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 213 | 213 | ||
| 214 | if (hcd->driver->suspend) { | 214 | if (hcd->driver->suspend) { |
| 215 | retval = hcd->driver->suspend(hcd, message); | 215 | retval = hcd->driver->suspend(hcd, message); |
| 216 | if (retval) { | 216 | suspend_report_result(hcd->driver->suspend, retval); |
| 217 | dev_dbg (&dev->dev, "PCI pre-suspend fail, %d\n", | 217 | if (retval) |
| 218 | retval); | ||
| 219 | goto done; | 218 | goto done; |
| 220 | } | ||
| 221 | } | 219 | } |
| 222 | synchronize_irq(dev->irq); | 220 | synchronize_irq(dev->irq); |
| 223 | 221 | ||
| @@ -263,6 +261,7 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 263 | * some device state (e.g. as part of clock reinit). | 261 | * some device state (e.g. as part of clock reinit). |
| 264 | */ | 262 | */ |
| 265 | retval = pci_set_power_state (dev, PCI_D3hot); | 263 | retval = pci_set_power_state (dev, PCI_D3hot); |
| 264 | suspend_report_result(pci_set_power_state, retval); | ||
| 266 | if (retval == 0) { | 265 | if (retval == 0) { |
| 267 | int wake = device_can_wakeup(&hcd->self.root_hub->dev); | 266 | int wake = device_can_wakeup(&hcd->self.root_hub->dev); |
| 268 | 267 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 8e65f7a237e4..0c87f73f2933 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -836,6 +836,13 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
| 836 | desc = intf->cur_altsetting; | 836 | desc = intf->cur_altsetting; |
| 837 | hdev = interface_to_usbdev(intf); | 837 | hdev = interface_to_usbdev(intf); |
| 838 | 838 | ||
| 839 | #ifdef CONFIG_USB_OTG_BLACKLIST_HUB | ||
| 840 | if (hdev->parent) { | ||
| 841 | dev_warn(&intf->dev, "ignoring external hub\n"); | ||
| 842 | return -ENODEV; | ||
| 843 | } | ||
| 844 | #endif | ||
| 845 | |||
| 839 | /* Some hubs have a subclass of 1, which AFAICT according to the */ | 846 | /* Some hubs have a subclass of 1, which AFAICT according to the */ |
| 840 | /* specs is not defined, but it works */ | 847 | /* specs is not defined, but it works */ |
| 841 | if ((desc->desc.bInterfaceSubClass != 0) && | 848 | if ((desc->desc.bInterfaceSubClass != 0) && |
| @@ -1022,7 +1029,6 @@ void usb_set_device_state(struct usb_device *udev, | |||
| 1022 | recursively_mark_NOTATTACHED(udev); | 1029 | recursively_mark_NOTATTACHED(udev); |
| 1023 | spin_unlock_irqrestore(&device_state_lock, flags); | 1030 | spin_unlock_irqrestore(&device_state_lock, flags); |
| 1024 | } | 1031 | } |
| 1025 | EXPORT_SYMBOL(usb_set_device_state); | ||
| 1026 | 1032 | ||
| 1027 | 1033 | ||
| 1028 | #ifdef CONFIG_PM | 1034 | #ifdef CONFIG_PM |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index d7352aa73b5e..b7fdc1cd134a 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
| @@ -1194,7 +1194,6 @@ EXPORT_SYMBOL(usb_disabled); | |||
| 1194 | EXPORT_SYMBOL_GPL(usb_get_intf); | 1194 | EXPORT_SYMBOL_GPL(usb_get_intf); |
| 1195 | EXPORT_SYMBOL_GPL(usb_put_intf); | 1195 | EXPORT_SYMBOL_GPL(usb_put_intf); |
| 1196 | 1196 | ||
| 1197 | EXPORT_SYMBOL(usb_alloc_dev); | ||
| 1198 | EXPORT_SYMBOL(usb_put_dev); | 1197 | EXPORT_SYMBOL(usb_put_dev); |
| 1199 | EXPORT_SYMBOL(usb_get_dev); | 1198 | EXPORT_SYMBOL(usb_get_dev); |
| 1200 | EXPORT_SYMBOL(usb_hub_tt_clear_buffer); | 1199 | EXPORT_SYMBOL(usb_hub_tt_clear_buffer); |
| @@ -1208,7 +1207,6 @@ EXPORT_SYMBOL(usb_ifnum_to_if); | |||
| 1208 | EXPORT_SYMBOL(usb_altnum_to_altsetting); | 1207 | EXPORT_SYMBOL(usb_altnum_to_altsetting); |
| 1209 | 1208 | ||
| 1210 | EXPORT_SYMBOL(usb_reset_device); | 1209 | EXPORT_SYMBOL(usb_reset_device); |
| 1211 | EXPORT_SYMBOL(usb_disconnect); | ||
| 1212 | 1210 | ||
| 1213 | EXPORT_SYMBOL(__usb_get_extra_descriptor); | 1211 | EXPORT_SYMBOL(__usb_get_extra_descriptor); |
| 1214 | 1212 | ||
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index d80f71877d68..363b2ad74ae6 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
| @@ -69,11 +69,11 @@ choice | |||
| 69 | often need board-specific hooks. | 69 | often need board-specific hooks. |
| 70 | 70 | ||
| 71 | config USB_GADGET_NET2280 | 71 | config USB_GADGET_NET2280 |
| 72 | boolean "NetChip 2280" | 72 | boolean "NetChip 228x" |
| 73 | depends on PCI | 73 | depends on PCI |
| 74 | select USB_GADGET_DUALSPEED | 74 | select USB_GADGET_DUALSPEED |
| 75 | help | 75 | help |
| 76 | NetChip 2280 is a PCI based USB peripheral controller which | 76 | NetChip 2280 / 2282 is a PCI based USB peripheral controller which |
| 77 | supports both full and high speed USB 2.0 data transfers. | 77 | supports both full and high speed USB 2.0 data transfers. |
| 78 | 78 | ||
| 79 | It has six configurable endpoints, as well as endpoint zero | 79 | It has six configurable endpoints, as well as endpoint zero |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 865858cfd1c2..b8d0b7825bf3 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
| @@ -1709,7 +1709,7 @@ static int __devexit at91udc_remove(struct platform_device *dev) | |||
| 1709 | } | 1709 | } |
| 1710 | 1710 | ||
| 1711 | #ifdef CONFIG_PM | 1711 | #ifdef CONFIG_PM |
| 1712 | static int at91udc_suspend(struct platform_device *dev, u32 state, u32 level) | 1712 | static int at91udc_suspend(struct platform_device *dev, pm_message_t mesg) |
| 1713 | { | 1713 | { |
| 1714 | struct at91_udc *udc = platform_get_drvdata(dev); | 1714 | struct at91_udc *udc = platform_get_drvdata(dev); |
| 1715 | 1715 | ||
| @@ -1731,7 +1731,7 @@ static int at91udc_suspend(struct platform_device *dev, u32 state, u32 level) | |||
| 1731 | return 0; | 1731 | return 0; |
| 1732 | } | 1732 | } |
| 1733 | 1733 | ||
| 1734 | static int at91udc_resume(struct platform_device *dev, u32 level) | 1734 | static int at91udc_resume(struct platform_device *dev) |
| 1735 | { | 1735 | { |
| 1736 | struct at91_udc *udc = platform_get_drvdata(dev); | 1736 | struct at91_udc *udc = platform_get_drvdata(dev); |
| 1737 | 1737 | ||
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index c3d8e5c5bf28..9c4422ac9de4 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
| @@ -2338,6 +2338,9 @@ autoconf_fail: | |||
| 2338 | hs_subset_descriptors(); | 2338 | hs_subset_descriptors(); |
| 2339 | } | 2339 | } |
| 2340 | 2340 | ||
| 2341 | device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; | ||
| 2342 | usb_gadget_set_selfpowered (gadget); | ||
| 2343 | |||
| 2341 | /* For now RNDIS is always a second config */ | 2344 | /* For now RNDIS is always a second config */ |
| 2342 | if (rndis) | 2345 | if (rndis) |
| 2343 | device_desc.bNumConfigurations = 2; | 2346 | device_desc.bNumConfigurations = 2; |
| @@ -2361,9 +2364,6 @@ autoconf_fail: | |||
| 2361 | #endif | 2364 | #endif |
| 2362 | #endif /* DUALSPEED */ | 2365 | #endif /* DUALSPEED */ |
| 2363 | 2366 | ||
| 2364 | device_desc.bMaxPacketSize0 = gadget->ep0->maxpacket; | ||
| 2365 | usb_gadget_set_selfpowered (gadget); | ||
| 2366 | |||
| 2367 | if (gadget->is_otg) { | 2367 | if (gadget->is_otg) { |
| 2368 | otg_descriptor.bmAttributes |= USB_OTG_HNP, | 2368 | otg_descriptor.bmAttributes |= USB_OTG_HNP, |
| 2369 | eth_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; | 2369 | eth_config.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index cf3be299e353..6f887478b148 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
| @@ -71,6 +71,12 @@ | |||
| 71 | * requirement amounts to two 16K buffers, size configurable by a parameter. | 71 | * requirement amounts to two 16K buffers, size configurable by a parameter. |
| 72 | * Support is included for both full-speed and high-speed operation. | 72 | * Support is included for both full-speed and high-speed operation. |
| 73 | * | 73 | * |
| 74 | * Note that the driver is slightly non-portable in that it assumes a | ||
| 75 | * single memory/DMA buffer will be useable for bulk-in, bulk-out, and | ||
| 76 | * interrupt-in endpoints. With most device controllers this isn't an | ||
| 77 | * issue, but there may be some with hardware restrictions that prevent | ||
| 78 | * a buffer from being used by more than one endpoint. | ||
| 79 | * | ||
| 74 | * Module options: | 80 | * Module options: |
| 75 | * | 81 | * |
| 76 | * file=filename[,filename...] | 82 | * file=filename[,filename...] |
| @@ -108,6 +114,14 @@ | |||
| 108 | * setting are not allowed when the medium is loaded. | 114 | * setting are not allowed when the medium is loaded. |
| 109 | * | 115 | * |
| 110 | * This gadget driver is heavily based on "Gadget Zero" by David Brownell. | 116 | * This gadget driver is heavily based on "Gadget Zero" by David Brownell. |
| 117 | * The driver's SCSI command interface was based on the "Information | ||
| 118 | * technology - Small Computer System Interface - 2" document from | ||
| 119 | * X3T9.2 Project 375D, Revision 10L, 7-SEP-93, available at | ||
| 120 | * <http://www.t10.org/ftp/t10/drafts/s2/s2-r10l.pdf>. The single exception | ||
| 121 | * is opcode 0x23 (READ FORMAT CAPACITIES), which was based on the | ||
| 122 | * "Universal Serial Bus Mass Storage Class UFI Command Specification" | ||
| 123 | * document, Revision 1.0, December 14, 1998, available at | ||
| 124 | * <http://www.usb.org/developers/devclass_docs/usbmass-ufi10.pdf>. | ||
| 111 | */ | 125 | */ |
| 112 | 126 | ||
| 113 | 127 | ||
| @@ -334,11 +348,9 @@ MODULE_LICENSE("Dual BSD/GPL"); | |||
| 334 | 348 | ||
| 335 | #define MAX_LUNS 8 | 349 | #define MAX_LUNS 8 |
| 336 | 350 | ||
| 337 | /* Arggh! There should be a module_param_array_named macro! */ | ||
| 338 | static char *file[MAX_LUNS]; | ||
| 339 | static int ro[MAX_LUNS]; | ||
| 340 | |||
| 341 | static struct { | 351 | static struct { |
| 352 | char *file[MAX_LUNS]; | ||
| 353 | int ro[MAX_LUNS]; | ||
| 342 | int num_filenames; | 354 | int num_filenames; |
| 343 | int num_ros; | 355 | int num_ros; |
| 344 | unsigned int nluns; | 356 | unsigned int nluns; |
| @@ -370,10 +382,11 @@ static struct { | |||
| 370 | }; | 382 | }; |
| 371 | 383 | ||
| 372 | 384 | ||
| 373 | module_param_array(file, charp, &mod_data.num_filenames, S_IRUGO); | 385 | module_param_array_named(file, mod_data.file, charp, &mod_data.num_filenames, |
| 386 | S_IRUGO); | ||
| 374 | MODULE_PARM_DESC(file, "names of backing files or devices"); | 387 | MODULE_PARM_DESC(file, "names of backing files or devices"); |
| 375 | 388 | ||
| 376 | module_param_array(ro, bool, &mod_data.num_ros, S_IRUGO); | 389 | module_param_array_named(ro, mod_data.ro, bool, &mod_data.num_ros, S_IRUGO); |
| 377 | MODULE_PARM_DESC(ro, "true to force read-only"); | 390 | MODULE_PARM_DESC(ro, "true to force read-only"); |
| 378 | 391 | ||
| 379 | module_param_named(luns, mod_data.nluns, uint, S_IRUGO); | 392 | module_param_named(luns, mod_data.nluns, uint, S_IRUGO); |
| @@ -1795,6 +1808,7 @@ static int do_write(struct fsg_dev *fsg) | |||
| 1795 | * the bulk-out maxpacket size */ | 1808 | * the bulk-out maxpacket size */ |
| 1796 | bh->outreq->length = bh->bulk_out_intended_length = | 1809 | bh->outreq->length = bh->bulk_out_intended_length = |
| 1797 | amount; | 1810 | amount; |
| 1811 | bh->outreq->short_not_ok = 1; | ||
| 1798 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | 1812 | start_transfer(fsg, fsg->bulk_out, bh->outreq, |
| 1799 | &bh->outreq_busy, &bh->state); | 1813 | &bh->outreq_busy, &bh->state); |
| 1800 | fsg->next_buffhd_to_fill = bh->next; | 1814 | fsg->next_buffhd_to_fill = bh->next; |
| @@ -2398,6 +2412,7 @@ static int throw_away_data(struct fsg_dev *fsg) | |||
| 2398 | * the bulk-out maxpacket size */ | 2412 | * the bulk-out maxpacket size */ |
| 2399 | bh->outreq->length = bh->bulk_out_intended_length = | 2413 | bh->outreq->length = bh->bulk_out_intended_length = |
| 2400 | amount; | 2414 | amount; |
| 2415 | bh->outreq->short_not_ok = 1; | ||
| 2401 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | 2416 | start_transfer(fsg, fsg->bulk_out, bh->outreq, |
| 2402 | &bh->outreq_busy, &bh->state); | 2417 | &bh->outreq_busy, &bh->state); |
| 2403 | fsg->next_buffhd_to_fill = bh->next; | 2418 | fsg->next_buffhd_to_fill = bh->next; |
| @@ -3029,6 +3044,7 @@ static int get_next_command(struct fsg_dev *fsg) | |||
| 3029 | 3044 | ||
| 3030 | /* Queue a request to read a Bulk-only CBW */ | 3045 | /* Queue a request to read a Bulk-only CBW */ |
| 3031 | set_bulk_out_req_length(fsg, bh, USB_BULK_CB_WRAP_LEN); | 3046 | set_bulk_out_req_length(fsg, bh, USB_BULK_CB_WRAP_LEN); |
| 3047 | bh->outreq->short_not_ok = 1; | ||
| 3032 | start_transfer(fsg, fsg->bulk_out, bh->outreq, | 3048 | start_transfer(fsg, fsg->bulk_out, bh->outreq, |
| 3033 | &bh->outreq_busy, &bh->state); | 3049 | &bh->outreq_busy, &bh->state); |
| 3034 | 3050 | ||
| @@ -3859,7 +3875,7 @@ static int __init fsg_bind(struct usb_gadget *gadget) | |||
| 3859 | 3875 | ||
| 3860 | for (i = 0; i < fsg->nluns; ++i) { | 3876 | for (i = 0; i < fsg->nluns; ++i) { |
| 3861 | curlun = &fsg->luns[i]; | 3877 | curlun = &fsg->luns[i]; |
| 3862 | curlun->ro = ro[i]; | 3878 | curlun->ro = mod_data.ro[i]; |
| 3863 | curlun->dev.parent = &gadget->dev; | 3879 | curlun->dev.parent = &gadget->dev; |
| 3864 | curlun->dev.driver = &fsg_driver.driver; | 3880 | curlun->dev.driver = &fsg_driver.driver; |
| 3865 | dev_set_drvdata(&curlun->dev, fsg); | 3881 | dev_set_drvdata(&curlun->dev, fsg); |
| @@ -3876,8 +3892,9 @@ static int __init fsg_bind(struct usb_gadget *gadget) | |||
| 3876 | kref_get(&fsg->ref); | 3892 | kref_get(&fsg->ref); |
| 3877 | } | 3893 | } |
| 3878 | 3894 | ||
| 3879 | if (file[i] && *file[i]) { | 3895 | if (mod_data.file[i] && *mod_data.file[i]) { |
| 3880 | if ((rc = open_backing_file(curlun, file[i])) != 0) | 3896 | if ((rc = open_backing_file(curlun, |
| 3897 | mod_data.file[i])) != 0) | ||
| 3881 | goto out; | 3898 | goto out; |
| 3882 | } else if (!mod_data.removable) { | 3899 | } else if (!mod_data.removable) { |
| 3883 | ERROR(fsg, "no file given for LUN%d\n", i); | 3900 | ERROR(fsg, "no file given for LUN%d\n", i); |
| @@ -3953,6 +3970,9 @@ static int __init fsg_bind(struct usb_gadget *gadget) | |||
| 3953 | for (i = 0; i < NUM_BUFFERS; ++i) { | 3970 | for (i = 0; i < NUM_BUFFERS; ++i) { |
| 3954 | struct fsg_buffhd *bh = &fsg->buffhds[i]; | 3971 | struct fsg_buffhd *bh = &fsg->buffhds[i]; |
| 3955 | 3972 | ||
| 3973 | /* Allocate for the bulk-in endpoint. We assume that | ||
| 3974 | * the buffer will also work with the bulk-out (and | ||
| 3975 | * interrupt-in) endpoint. */ | ||
| 3956 | bh->buf = usb_ep_alloc_buffer(fsg->bulk_in, mod_data.buflen, | 3976 | bh->buf = usb_ep_alloc_buffer(fsg->bulk_in, mod_data.buflen, |
| 3957 | &bh->dma, GFP_KERNEL); | 3977 | &bh->dma, GFP_KERNEL); |
| 3958 | if (!bh->buf) | 3978 | if (!bh->buf) |
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index c4081407171f..aa80f0910720 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h | |||
| @@ -100,9 +100,9 @@ | |||
| 100 | #define gadget_is_musbhsfc(g) 0 | 100 | #define gadget_is_musbhsfc(g) 0 |
| 101 | #endif | 101 | #endif |
| 102 | 102 | ||
| 103 | /* Mentor high speed "dual role" controller, peripheral mode */ | 103 | /* Mentor high speed "dual role" controller, in peripheral role */ |
| 104 | #ifdef CONFIG_USB_GADGET_MUSBHDRC | 104 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC |
| 105 | #define gadget_is_musbhdrc(g) !strcmp("musbhdrc_udc", (g)->name) | 105 | #define gadget_is_musbhdrc(g) !strcmp("musb_hdrc", (g)->name) |
| 106 | #else | 106 | #else |
| 107 | #define gadget_is_musbhdrc(g) 0 | 107 | #define gadget_is_musbhdrc(g) 0 |
| 108 | #endif | 108 | #endif |
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c index 3f618ce6998d..42b457030b03 100644 --- a/drivers/usb/gadget/inode.c +++ b/drivers/usb/gadget/inode.c | |||
| @@ -810,7 +810,7 @@ ep_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 810 | if (value == 0) | 810 | if (value == 0) |
| 811 | data->state = STATE_EP_ENABLED; | 811 | data->state = STATE_EP_ENABLED; |
| 812 | break; | 812 | break; |
| 813 | #ifdef HIGHSPEED | 813 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 814 | case USB_SPEED_HIGH: | 814 | case USB_SPEED_HIGH: |
| 815 | /* fails if caller didn't provide that descriptor... */ | 815 | /* fails if caller didn't provide that descriptor... */ |
| 816 | value = usb_ep_enable (ep, &data->hs_desc); | 816 | value = usb_ep_enable (ep, &data->hs_desc); |
| @@ -982,7 +982,7 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 982 | /* assume that was SET_CONFIGURATION */ | 982 | /* assume that was SET_CONFIGURATION */ |
| 983 | if (dev->current_config) { | 983 | if (dev->current_config) { |
| 984 | unsigned power; | 984 | unsigned power; |
| 985 | #ifdef HIGHSPEED | 985 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 986 | if (dev->gadget->speed == USB_SPEED_HIGH) | 986 | if (dev->gadget->speed == USB_SPEED_HIGH) |
| 987 | power = dev->hs_config->bMaxPower; | 987 | power = dev->hs_config->bMaxPower; |
| 988 | else | 988 | else |
| @@ -1262,7 +1262,7 @@ static struct file_operations ep0_io_operations = { | |||
| 1262 | * Unrecognized ep0 requests may be handled in user space. | 1262 | * Unrecognized ep0 requests may be handled in user space. |
| 1263 | */ | 1263 | */ |
| 1264 | 1264 | ||
| 1265 | #ifdef HIGHSPEED | 1265 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1266 | static void make_qualifier (struct dev_data *dev) | 1266 | static void make_qualifier (struct dev_data *dev) |
| 1267 | { | 1267 | { |
| 1268 | struct usb_qualifier_descriptor qual; | 1268 | struct usb_qualifier_descriptor qual; |
| @@ -1291,7 +1291,7 @@ static int | |||
| 1291 | config_buf (struct dev_data *dev, u8 type, unsigned index) | 1291 | config_buf (struct dev_data *dev, u8 type, unsigned index) |
| 1292 | { | 1292 | { |
| 1293 | int len; | 1293 | int len; |
| 1294 | #ifdef HIGHSPEED | 1294 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1295 | int hs; | 1295 | int hs; |
| 1296 | #endif | 1296 | #endif |
| 1297 | 1297 | ||
| @@ -1299,7 +1299,7 @@ config_buf (struct dev_data *dev, u8 type, unsigned index) | |||
| 1299 | if (index > 0) | 1299 | if (index > 0) |
| 1300 | return -EINVAL; | 1300 | return -EINVAL; |
| 1301 | 1301 | ||
| 1302 | #ifdef HIGHSPEED | 1302 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1303 | hs = (dev->gadget->speed == USB_SPEED_HIGH); | 1303 | hs = (dev->gadget->speed == USB_SPEED_HIGH); |
| 1304 | if (type == USB_DT_OTHER_SPEED_CONFIG) | 1304 | if (type == USB_DT_OTHER_SPEED_CONFIG) |
| 1305 | hs = !hs; | 1305 | hs = !hs; |
| @@ -1335,12 +1335,12 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1335 | dev->state = STATE_CONNECTED; | 1335 | dev->state = STATE_CONNECTED; |
| 1336 | dev->dev->bMaxPacketSize0 = gadget->ep0->maxpacket; | 1336 | dev->dev->bMaxPacketSize0 = gadget->ep0->maxpacket; |
| 1337 | 1337 | ||
| 1338 | #ifdef HIGHSPEED | 1338 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1339 | if (gadget->speed == USB_SPEED_HIGH && dev->hs_config == 0) { | 1339 | if (gadget->speed == USB_SPEED_HIGH && dev->hs_config == 0) { |
| 1340 | ERROR (dev, "no high speed config??\n"); | 1340 | ERROR (dev, "no high speed config??\n"); |
| 1341 | return -EINVAL; | 1341 | return -EINVAL; |
| 1342 | } | 1342 | } |
| 1343 | #endif /* HIGHSPEED */ | 1343 | #endif /* CONFIG_USB_GADGET_DUALSPEED */ |
| 1344 | 1344 | ||
| 1345 | INFO (dev, "connected\n"); | 1345 | INFO (dev, "connected\n"); |
| 1346 | event = next_event (dev, GADGETFS_CONNECT); | 1346 | event = next_event (dev, GADGETFS_CONNECT); |
| @@ -1352,11 +1352,11 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1352 | /* ... down_trylock (&data->lock) ... */ | 1352 | /* ... down_trylock (&data->lock) ... */ |
| 1353 | if (data->state != STATE_EP_DEFER_ENABLE) | 1353 | if (data->state != STATE_EP_DEFER_ENABLE) |
| 1354 | continue; | 1354 | continue; |
| 1355 | #ifdef HIGHSPEED | 1355 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1356 | if (gadget->speed == USB_SPEED_HIGH) | 1356 | if (gadget->speed == USB_SPEED_HIGH) |
| 1357 | value = usb_ep_enable (ep, &data->hs_desc); | 1357 | value = usb_ep_enable (ep, &data->hs_desc); |
| 1358 | else | 1358 | else |
| 1359 | #endif /* HIGHSPEED */ | 1359 | #endif /* CONFIG_USB_GADGET_DUALSPEED */ |
| 1360 | value = usb_ep_enable (ep, &data->desc); | 1360 | value = usb_ep_enable (ep, &data->desc); |
| 1361 | if (value) { | 1361 | if (value) { |
| 1362 | ERROR (dev, "deferred %s enable --> %d\n", | 1362 | ERROR (dev, "deferred %s enable --> %d\n", |
| @@ -1391,7 +1391,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1391 | value = min (w_length, (u16) sizeof *dev->dev); | 1391 | value = min (w_length, (u16) sizeof *dev->dev); |
| 1392 | req->buf = dev->dev; | 1392 | req->buf = dev->dev; |
| 1393 | break; | 1393 | break; |
| 1394 | #ifdef HIGHSPEED | 1394 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1395 | case USB_DT_DEVICE_QUALIFIER: | 1395 | case USB_DT_DEVICE_QUALIFIER: |
| 1396 | if (!dev->hs_config) | 1396 | if (!dev->hs_config) |
| 1397 | break; | 1397 | break; |
| @@ -1428,7 +1428,7 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
| 1428 | // user mode expected to disable endpoints | 1428 | // user mode expected to disable endpoints |
| 1429 | } else { | 1429 | } else { |
| 1430 | u8 config, power; | 1430 | u8 config, power; |
| 1431 | #ifdef HIGHSPEED | 1431 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1432 | if (gadget->speed == USB_SPEED_HIGH) { | 1432 | if (gadget->speed == USB_SPEED_HIGH) { |
| 1433 | config = dev->hs_config->bConfigurationValue; | 1433 | config = dev->hs_config->bConfigurationValue; |
| 1434 | power = dev->hs_config->bMaxPower; | 1434 | power = dev->hs_config->bMaxPower; |
| @@ -1728,7 +1728,7 @@ gadgetfs_suspend (struct usb_gadget *gadget) | |||
| 1728 | } | 1728 | } |
| 1729 | 1729 | ||
| 1730 | static struct usb_gadget_driver gadgetfs_driver = { | 1730 | static struct usb_gadget_driver gadgetfs_driver = { |
| 1731 | #ifdef HIGHSPEED | 1731 | #ifdef CONFIG_USB_GADGET_DUALSPEED |
| 1732 | .speed = USB_SPEED_HIGH, | 1732 | .speed = USB_SPEED_HIGH, |
| 1733 | #else | 1733 | #else |
| 1734 | .speed = USB_SPEED_FULL, | 1734 | .speed = USB_SPEED_FULL, |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index fb73dc100535..6a4b93ad1082 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | * Copyright (C) 2003 David Brownell | 26 | * Copyright (C) 2003 David Brownell |
| 27 | * Copyright (C) 2003-2005 PLX Technology, Inc. | 27 | * Copyright (C) 2003-2005 PLX Technology, Inc. |
| 28 | * | 28 | * |
| 29 | * Modified Seth Levy 2005 PLX Technology, Inc. to provide compatibility with 2282 chip | ||
| 30 | * | ||
| 29 | * This program is free software; you can redistribute it and/or modify | 31 | * This program is free software; you can redistribute it and/or modify |
| 30 | * it under the terms of the GNU General Public License as published by | 32 | * it under the terms of the GNU General Public License as published by |
| 31 | * the Free Software Foundation; either version 2 of the License, or | 33 | * the Free Software Foundation; either version 2 of the License, or |
| @@ -71,8 +73,8 @@ | |||
| 71 | #include <asm/unaligned.h> | 73 | #include <asm/unaligned.h> |
| 72 | 74 | ||
| 73 | 75 | ||
| 74 | #define DRIVER_DESC "PLX NET2280 USB Peripheral Controller" | 76 | #define DRIVER_DESC "PLX NET228x USB Peripheral Controller" |
| 75 | #define DRIVER_VERSION "2005 Feb 03" | 77 | #define DRIVER_VERSION "2005 Sept 27" |
| 76 | 78 | ||
| 77 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) | 79 | #define DMA_ADDR_INVALID (~(dma_addr_t)0) |
| 78 | #define EP_DONTUSE 13 /* nonzero */ | 80 | #define EP_DONTUSE 13 /* nonzero */ |
| @@ -118,7 +120,7 @@ module_param (fifo_mode, ushort, 0644); | |||
| 118 | /* enable_suspend -- When enabled, the driver will respond to | 120 | /* enable_suspend -- When enabled, the driver will respond to |
| 119 | * USB suspend requests by powering down the NET2280. Otherwise, | 121 | * USB suspend requests by powering down the NET2280. Otherwise, |
| 120 | * USB suspend requests will be ignored. This is acceptible for | 122 | * USB suspend requests will be ignored. This is acceptible for |
| 121 | * self-powered devices, and helps avoid some quirks. | 123 | * self-powered devices |
| 122 | */ | 124 | */ |
| 123 | static int enable_suspend = 0; | 125 | static int enable_suspend = 0; |
| 124 | 126 | ||
| @@ -223,6 +225,11 @@ net2280_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 223 | ep->is_in = (tmp & USB_DIR_IN) != 0; | 225 | ep->is_in = (tmp & USB_DIR_IN) != 0; |
| 224 | if (!ep->is_in) | 226 | if (!ep->is_in) |
| 225 | writel ((1 << SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); | 227 | writel ((1 << SET_NAK_OUT_PACKETS), &ep->regs->ep_rsp); |
| 228 | else if (dev->pdev->device != 0x2280) { | ||
| 229 | /* Added for 2282, Don't use nak packets on an in endpoint, this was ignored on 2280 */ | ||
| 230 | writel ((1 << CLEAR_NAK_OUT_PACKETS) | ||
| 231 | | (1 << CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); | ||
| 232 | } | ||
| 226 | 233 | ||
| 227 | writel (tmp, &ep->regs->ep_cfg); | 234 | writel (tmp, &ep->regs->ep_cfg); |
| 228 | 235 | ||
| @@ -232,8 +239,9 @@ net2280_enable (struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc) | |||
| 232 | writel (tmp, &dev->regs->pciirqenb0); | 239 | writel (tmp, &dev->regs->pciirqenb0); |
| 233 | 240 | ||
| 234 | tmp = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE) | 241 | tmp = (1 << DATA_PACKET_RECEIVED_INTERRUPT_ENABLE) |
| 235 | | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE) | 242 | | (1 << DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE); |
| 236 | | readl (&ep->regs->ep_irqenb); | 243 | if (dev->pdev->device == 0x2280) |
| 244 | tmp |= readl (&ep->regs->ep_irqenb); | ||
| 237 | writel (tmp, &ep->regs->ep_irqenb); | 245 | writel (tmp, &ep->regs->ep_irqenb); |
| 238 | } else { /* dma, per-request */ | 246 | } else { /* dma, per-request */ |
| 239 | tmp = (1 << (8 + ep->num)); /* completion */ | 247 | tmp = (1 << (8 + ep->num)); /* completion */ |
| @@ -314,10 +322,18 @@ static void ep_reset (struct net2280_regs __iomem *regs, struct net2280_ep *ep) | |||
| 314 | /* init to our chosen defaults, notably so that we NAK OUT | 322 | /* init to our chosen defaults, notably so that we NAK OUT |
| 315 | * packets until the driver queues a read (+note erratum 0112) | 323 | * packets until the driver queues a read (+note erratum 0112) |
| 316 | */ | 324 | */ |
| 317 | tmp = (1 << SET_NAK_OUT_PACKETS_MODE) | 325 | if (!ep->is_in || ep->dev->pdev->device == 0x2280) { |
| 326 | tmp = (1 << SET_NAK_OUT_PACKETS_MODE) | ||
| 318 | | (1 << SET_NAK_OUT_PACKETS) | 327 | | (1 << SET_NAK_OUT_PACKETS) |
| 319 | | (1 << CLEAR_EP_HIDE_STATUS_PHASE) | 328 | | (1 << CLEAR_EP_HIDE_STATUS_PHASE) |
| 320 | | (1 << CLEAR_INTERRUPT_MODE); | 329 | | (1 << CLEAR_INTERRUPT_MODE); |
| 330 | } else { | ||
| 331 | /* added for 2282 */ | ||
| 332 | tmp = (1 << CLEAR_NAK_OUT_PACKETS_MODE) | ||
| 333 | | (1 << CLEAR_NAK_OUT_PACKETS) | ||
| 334 | | (1 << CLEAR_EP_HIDE_STATUS_PHASE) | ||
| 335 | | (1 << CLEAR_INTERRUPT_MODE); | ||
| 336 | } | ||
| 321 | 337 | ||
| 322 | if (ep->num != 0) { | 338 | if (ep->num != 0) { |
| 323 | tmp |= (1 << CLEAR_ENDPOINT_TOGGLE) | 339 | tmp |= (1 << CLEAR_ENDPOINT_TOGGLE) |
| @@ -326,14 +342,18 @@ static void ep_reset (struct net2280_regs __iomem *regs, struct net2280_ep *ep) | |||
| 326 | writel (tmp, &ep->regs->ep_rsp); | 342 | writel (tmp, &ep->regs->ep_rsp); |
| 327 | 343 | ||
| 328 | /* scrub most status bits, and flush any fifo state */ | 344 | /* scrub most status bits, and flush any fifo state */ |
| 329 | writel ( (1 << TIMEOUT) | 345 | if (ep->dev->pdev->device == 0x2280) |
| 346 | tmp = (1 << FIFO_OVERFLOW) | ||
| 347 | | (1 << FIFO_UNDERFLOW); | ||
| 348 | else | ||
| 349 | tmp = 0; | ||
| 350 | |||
| 351 | writel (tmp | (1 << TIMEOUT) | ||
| 330 | | (1 << USB_STALL_SENT) | 352 | | (1 << USB_STALL_SENT) |
| 331 | | (1 << USB_IN_NAK_SENT) | 353 | | (1 << USB_IN_NAK_SENT) |
| 332 | | (1 << USB_IN_ACK_RCVD) | 354 | | (1 << USB_IN_ACK_RCVD) |
| 333 | | (1 << USB_OUT_PING_NAK_SENT) | 355 | | (1 << USB_OUT_PING_NAK_SENT) |
| 334 | | (1 << USB_OUT_ACK_SENT) | 356 | | (1 << USB_OUT_ACK_SENT) |
| 335 | | (1 << FIFO_OVERFLOW) | ||
| 336 | | (1 << FIFO_UNDERFLOW) | ||
| 337 | | (1 << FIFO_FLUSH) | 357 | | (1 << FIFO_FLUSH) |
| 338 | | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) | 358 | | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) |
| 339 | | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) | 359 | | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) |
| @@ -718,7 +738,7 @@ fill_dma_desc (struct net2280_ep *ep, struct net2280_request *req, int valid) | |||
| 718 | */ | 738 | */ |
| 719 | if (ep->is_in) | 739 | if (ep->is_in) |
| 720 | dmacount |= (1 << DMA_DIRECTION); | 740 | dmacount |= (1 << DMA_DIRECTION); |
| 721 | else if ((dmacount % ep->ep.maxpacket) != 0) | 741 | if ((!ep->is_in && (dmacount % ep->ep.maxpacket) != 0) || ep->dev->pdev->device != 0x2280) |
| 722 | dmacount |= (1 << END_OF_CHAIN); | 742 | dmacount |= (1 << END_OF_CHAIN); |
| 723 | 743 | ||
| 724 | req->valid = valid; | 744 | req->valid = valid; |
| @@ -760,9 +780,12 @@ static inline void stop_dma (struct net2280_dma_regs __iomem *dma) | |||
| 760 | static void start_queue (struct net2280_ep *ep, u32 dmactl, u32 td_dma) | 780 | static void start_queue (struct net2280_ep *ep, u32 dmactl, u32 td_dma) |
| 761 | { | 781 | { |
| 762 | struct net2280_dma_regs __iomem *dma = ep->dma; | 782 | struct net2280_dma_regs __iomem *dma = ep->dma; |
| 783 | unsigned int tmp = (1 << VALID_BIT) | (ep->is_in << DMA_DIRECTION); | ||
| 763 | 784 | ||
| 764 | writel ((1 << VALID_BIT) | (ep->is_in << DMA_DIRECTION), | 785 | if (ep->dev->pdev->device != 0x2280) |
| 765 | &dma->dmacount); | 786 | tmp |= (1 << END_OF_CHAIN); |
| 787 | |||
| 788 | writel (tmp, &dma->dmacount); | ||
| 766 | writel (readl (&dma->dmastat), &dma->dmastat); | 789 | writel (readl (&dma->dmastat), &dma->dmastat); |
| 767 | 790 | ||
| 768 | writel (td_dma, &dma->dmadesc); | 791 | writel (td_dma, &dma->dmadesc); |
| @@ -2110,7 +2133,11 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
| 2110 | VDEBUG (ep->dev, "%s ack ep_stat %08x, req %p\n", | 2133 | VDEBUG (ep->dev, "%s ack ep_stat %08x, req %p\n", |
| 2111 | ep->ep.name, t, req ? &req->req : 0); | 2134 | ep->ep.name, t, req ? &req->req : 0); |
| 2112 | #endif | 2135 | #endif |
| 2113 | writel (t & ~(1 << NAK_OUT_PACKETS), &ep->regs->ep_stat); | 2136 | if (!ep->is_in || ep->dev->pdev->device == 0x2280) |
| 2137 | writel (t & ~(1 << NAK_OUT_PACKETS), &ep->regs->ep_stat); | ||
| 2138 | else | ||
| 2139 | /* Added for 2282 */ | ||
| 2140 | writel (t, &ep->regs->ep_stat); | ||
| 2114 | 2141 | ||
| 2115 | /* for ep0, monitor token irqs to catch data stage length errors | 2142 | /* for ep0, monitor token irqs to catch data stage length errors |
| 2116 | * and to synchronize on status. | 2143 | * and to synchronize on status. |
| @@ -2214,7 +2241,8 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
| 2214 | if (likely (req)) { | 2241 | if (likely (req)) { |
| 2215 | req->td->dmacount = 0; | 2242 | req->td->dmacount = 0; |
| 2216 | t = readl (&ep->regs->ep_avail); | 2243 | t = readl (&ep->regs->ep_avail); |
| 2217 | dma_done (ep, req, count, t); | 2244 | dma_done (ep, req, count, |
| 2245 | (ep->out_overflow || t) ? -EOVERFLOW : 0); | ||
| 2218 | } | 2246 | } |
| 2219 | 2247 | ||
| 2220 | /* also flush to prevent erratum 0106 trouble */ | 2248 | /* also flush to prevent erratum 0106 trouble */ |
| @@ -2337,7 +2365,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) | |||
| 2337 | u32 raw [2]; | 2365 | u32 raw [2]; |
| 2338 | struct usb_ctrlrequest r; | 2366 | struct usb_ctrlrequest r; |
| 2339 | } u; | 2367 | } u; |
| 2340 | int tmp = 0; | 2368 | int tmp; |
| 2341 | struct net2280_request *req; | 2369 | struct net2280_request *req; |
| 2342 | 2370 | ||
| 2343 | if (dev->gadget.speed == USB_SPEED_UNKNOWN) { | 2371 | if (dev->gadget.speed == USB_SPEED_UNKNOWN) { |
| @@ -2364,14 +2392,19 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) | |||
| 2364 | } | 2392 | } |
| 2365 | ep->stopped = 0; | 2393 | ep->stopped = 0; |
| 2366 | dev->protocol_stall = 0; | 2394 | dev->protocol_stall = 0; |
| 2367 | writel ( (1 << TIMEOUT) | 2395 | |
| 2396 | if (ep->dev->pdev->device == 0x2280) | ||
| 2397 | tmp = (1 << FIFO_OVERFLOW) | ||
| 2398 | | (1 << FIFO_UNDERFLOW); | ||
| 2399 | else | ||
| 2400 | tmp = 0; | ||
| 2401 | |||
| 2402 | writel (tmp | (1 << TIMEOUT) | ||
| 2368 | | (1 << USB_STALL_SENT) | 2403 | | (1 << USB_STALL_SENT) |
| 2369 | | (1 << USB_IN_NAK_SENT) | 2404 | | (1 << USB_IN_NAK_SENT) |
| 2370 | | (1 << USB_IN_ACK_RCVD) | 2405 | | (1 << USB_IN_ACK_RCVD) |
| 2371 | | (1 << USB_OUT_PING_NAK_SENT) | 2406 | | (1 << USB_OUT_PING_NAK_SENT) |
| 2372 | | (1 << USB_OUT_ACK_SENT) | 2407 | | (1 << USB_OUT_ACK_SENT) |
| 2373 | | (1 << FIFO_OVERFLOW) | ||
| 2374 | | (1 << FIFO_UNDERFLOW) | ||
| 2375 | | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) | 2408 | | (1 << SHORT_PACKET_OUT_DONE_INTERRUPT) |
| 2376 | | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) | 2409 | | (1 << SHORT_PACKET_TRANSFERRED_INTERRUPT) |
| 2377 | | (1 << DATA_PACKET_RECEIVED_INTERRUPT) | 2410 | | (1 << DATA_PACKET_RECEIVED_INTERRUPT) |
| @@ -2385,6 +2418,8 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) | |||
| 2385 | cpu_to_le32s (&u.raw [0]); | 2418 | cpu_to_le32s (&u.raw [0]); |
| 2386 | cpu_to_le32s (&u.raw [1]); | 2419 | cpu_to_le32s (&u.raw [1]); |
| 2387 | 2420 | ||
| 2421 | tmp = 0; | ||
| 2422 | |||
| 2388 | #define w_value le16_to_cpup (&u.r.wValue) | 2423 | #define w_value le16_to_cpup (&u.r.wValue) |
| 2389 | #define w_index le16_to_cpup (&u.r.wIndex) | 2424 | #define w_index le16_to_cpup (&u.r.wIndex) |
| 2390 | #define w_length le16_to_cpup (&u.r.wLength) | 2425 | #define w_length le16_to_cpup (&u.r.wLength) |
| @@ -2594,10 +2629,17 @@ static void handle_stat1_irqs (struct net2280 *dev, u32 stat) | |||
| 2594 | writel (stat, &dev->regs->irqstat1); | 2629 | writel (stat, &dev->regs->irqstat1); |
| 2595 | 2630 | ||
| 2596 | /* some status we can just ignore */ | 2631 | /* some status we can just ignore */ |
| 2597 | stat &= ~((1 << CONTROL_STATUS_INTERRUPT) | 2632 | if (dev->pdev->device == 0x2280) |
| 2598 | | (1 << SUSPEND_REQUEST_INTERRUPT) | 2633 | stat &= ~((1 << CONTROL_STATUS_INTERRUPT) |
| 2599 | | (1 << RESUME_INTERRUPT) | 2634 | | (1 << SUSPEND_REQUEST_INTERRUPT) |
| 2600 | | (1 << SOF_INTERRUPT)); | 2635 | | (1 << RESUME_INTERRUPT) |
| 2636 | | (1 << SOF_INTERRUPT)); | ||
| 2637 | else | ||
| 2638 | stat &= ~((1 << CONTROL_STATUS_INTERRUPT) | ||
| 2639 | | (1 << RESUME_INTERRUPT) | ||
| 2640 | | (1 << SOF_DOWN_INTERRUPT) | ||
| 2641 | | (1 << SOF_INTERRUPT)); | ||
| 2642 | |||
| 2601 | if (!stat) | 2643 | if (!stat) |
| 2602 | return; | 2644 | return; |
| 2603 | // DEBUG (dev, "irqstat1 %08x\n", stat); | 2645 | // DEBUG (dev, "irqstat1 %08x\n", stat); |
| @@ -2939,6 +2981,13 @@ static struct pci_device_id pci_ids [] = { { | |||
| 2939 | .device = 0x2280, | 2981 | .device = 0x2280, |
| 2940 | .subvendor = PCI_ANY_ID, | 2982 | .subvendor = PCI_ANY_ID, |
| 2941 | .subdevice = PCI_ANY_ID, | 2983 | .subdevice = PCI_ANY_ID, |
| 2984 | }, { | ||
| 2985 | .class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), | ||
| 2986 | .class_mask = ~0, | ||
| 2987 | .vendor = 0x17cc, | ||
| 2988 | .device = 0x2282, | ||
| 2989 | .subvendor = PCI_ANY_ID, | ||
| 2990 | .subdevice = PCI_ANY_ID, | ||
| 2942 | 2991 | ||
| 2943 | }, { /* end: all zeroes */ } | 2992 | }, { /* end: all zeroes */ } |
| 2944 | }; | 2993 | }; |
diff --git a/drivers/usb/gadget/net2280.h b/drivers/usb/gadget/net2280.h index fff4509cf340..957d6df34015 100644 --- a/drivers/usb/gadget/net2280.h +++ b/drivers/usb/gadget/net2280.h | |||
| @@ -22,420 +22,7 @@ | |||
| 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 22 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | /*-------------------------------------------------------------------------*/ | 25 | #include <linux/usb/net2280.h> |
| 26 | |||
| 27 | /* NET2280 MEMORY MAPPED REGISTERS | ||
| 28 | * | ||
| 29 | * The register layout came from the chip documentation, and the bit | ||
| 30 | * number definitions were extracted from chip specification. | ||
| 31 | * | ||
| 32 | * Use the shift operator ('<<') to build bit masks, with readl/writel | ||
| 33 | * to access the registers through PCI. | ||
| 34 | */ | ||
| 35 | |||
| 36 | /* main registers, BAR0 + 0x0000 */ | ||
| 37 | struct net2280_regs { | ||
| 38 | // offset 0x0000 | ||
| 39 | u32 devinit; | ||
| 40 | #define LOCAL_CLOCK_FREQUENCY 8 | ||
| 41 | #define FORCE_PCI_RESET 7 | ||
| 42 | #define PCI_ID 6 | ||
| 43 | #define PCI_ENABLE 5 | ||
| 44 | #define FIFO_SOFT_RESET 4 | ||
| 45 | #define CFG_SOFT_RESET 3 | ||
| 46 | #define PCI_SOFT_RESET 2 | ||
| 47 | #define USB_SOFT_RESET 1 | ||
| 48 | #define M8051_RESET 0 | ||
| 49 | u32 eectl; | ||
| 50 | #define EEPROM_ADDRESS_WIDTH 23 | ||
| 51 | #define EEPROM_CHIP_SELECT_ACTIVE 22 | ||
| 52 | #define EEPROM_PRESENT 21 | ||
| 53 | #define EEPROM_VALID 20 | ||
| 54 | #define EEPROM_BUSY 19 | ||
| 55 | #define EEPROM_CHIP_SELECT_ENABLE 18 | ||
| 56 | #define EEPROM_BYTE_READ_START 17 | ||
| 57 | #define EEPROM_BYTE_WRITE_START 16 | ||
| 58 | #define EEPROM_READ_DATA 8 | ||
| 59 | #define EEPROM_WRITE_DATA 0 | ||
| 60 | u32 eeclkfreq; | ||
| 61 | u32 _unused0; | ||
| 62 | // offset 0x0010 | ||
| 63 | |||
| 64 | u32 pciirqenb0; /* interrupt PCI master ... */ | ||
| 65 | #define SETUP_PACKET_INTERRUPT_ENABLE 7 | ||
| 66 | #define ENDPOINT_F_INTERRUPT_ENABLE 6 | ||
| 67 | #define ENDPOINT_E_INTERRUPT_ENABLE 5 | ||
| 68 | #define ENDPOINT_D_INTERRUPT_ENABLE 4 | ||
| 69 | #define ENDPOINT_C_INTERRUPT_ENABLE 3 | ||
| 70 | #define ENDPOINT_B_INTERRUPT_ENABLE 2 | ||
| 71 | #define ENDPOINT_A_INTERRUPT_ENABLE 1 | ||
| 72 | #define ENDPOINT_0_INTERRUPT_ENABLE 0 | ||
| 73 | u32 pciirqenb1; | ||
| 74 | #define PCI_INTERRUPT_ENABLE 31 | ||
| 75 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 76 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 77 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 78 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 79 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 80 | #define PCI_TARGET_ABORT_ASSERTED_INTERRUPT_ENABLE 18 | ||
| 81 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 82 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 83 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 84 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 85 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 86 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 87 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 88 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 89 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 90 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 91 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 92 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 93 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 94 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 95 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 96 | u32 cpu_irqenb0; /* ... or onboard 8051 */ | ||
| 97 | #define SETUP_PACKET_INTERRUPT_ENABLE 7 | ||
| 98 | #define ENDPOINT_F_INTERRUPT_ENABLE 6 | ||
| 99 | #define ENDPOINT_E_INTERRUPT_ENABLE 5 | ||
| 100 | #define ENDPOINT_D_INTERRUPT_ENABLE 4 | ||
| 101 | #define ENDPOINT_C_INTERRUPT_ENABLE 3 | ||
| 102 | #define ENDPOINT_B_INTERRUPT_ENABLE 2 | ||
| 103 | #define ENDPOINT_A_INTERRUPT_ENABLE 1 | ||
| 104 | #define ENDPOINT_0_INTERRUPT_ENABLE 0 | ||
| 105 | u32 cpu_irqenb1; | ||
| 106 | #define CPU_INTERRUPT_ENABLE 31 | ||
| 107 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 108 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 109 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 110 | #define PCI_INTA_INTERRUPT_ENABLE 24 | ||
| 111 | #define PCI_PME_INTERRUPT_ENABLE 23 | ||
| 112 | #define PCI_SERR_INTERRUPT_ENABLE 22 | ||
| 113 | #define PCI_PERR_INTERRUPT_ENABLE 21 | ||
| 114 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 115 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 116 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 117 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 118 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 119 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 120 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 121 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 122 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 123 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 124 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 125 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 126 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 127 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 128 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 129 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 130 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 131 | |||
| 132 | // offset 0x0020 | ||
| 133 | u32 _unused1; | ||
| 134 | u32 usbirqenb1; | ||
| 135 | #define USB_INTERRUPT_ENABLE 31 | ||
| 136 | #define POWER_STATE_CHANGE_INTERRUPT_ENABLE 27 | ||
| 137 | #define PCI_ARBITER_TIMEOUT_INTERRUPT_ENABLE 26 | ||
| 138 | #define PCI_PARITY_ERROR_INTERRUPT_ENABLE 25 | ||
| 139 | #define PCI_INTA_INTERRUPT_ENABLE 24 | ||
| 140 | #define PCI_PME_INTERRUPT_ENABLE 23 | ||
| 141 | #define PCI_SERR_INTERRUPT_ENABLE 22 | ||
| 142 | #define PCI_PERR_INTERRUPT_ENABLE 21 | ||
| 143 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT_ENABLE 20 | ||
| 144 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT_ENABLE 19 | ||
| 145 | #define PCI_RETRY_ABORT_INTERRUPT_ENABLE 17 | ||
| 146 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT_ENABLE 16 | ||
| 147 | #define GPIO_INTERRUPT_ENABLE 13 | ||
| 148 | #define DMA_D_INTERRUPT_ENABLE 12 | ||
| 149 | #define DMA_C_INTERRUPT_ENABLE 11 | ||
| 150 | #define DMA_B_INTERRUPT_ENABLE 10 | ||
| 151 | #define DMA_A_INTERRUPT_ENABLE 9 | ||
| 152 | #define EEPROM_DONE_INTERRUPT_ENABLE 8 | ||
| 153 | #define VBUS_INTERRUPT_ENABLE 7 | ||
| 154 | #define CONTROL_STATUS_INTERRUPT_ENABLE 6 | ||
| 155 | #define ROOT_PORT_RESET_INTERRUPT_ENABLE 4 | ||
| 156 | #define SUSPEND_REQUEST_INTERRUPT_ENABLE 3 | ||
| 157 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT_ENABLE 2 | ||
| 158 | #define RESUME_INTERRUPT_ENABLE 1 | ||
| 159 | #define SOF_INTERRUPT_ENABLE 0 | ||
| 160 | u32 irqstat0; | ||
| 161 | #define INTA_ASSERTED 12 | ||
| 162 | #define SETUP_PACKET_INTERRUPT 7 | ||
| 163 | #define ENDPOINT_F_INTERRUPT 6 | ||
| 164 | #define ENDPOINT_E_INTERRUPT 5 | ||
| 165 | #define ENDPOINT_D_INTERRUPT 4 | ||
| 166 | #define ENDPOINT_C_INTERRUPT 3 | ||
| 167 | #define ENDPOINT_B_INTERRUPT 2 | ||
| 168 | #define ENDPOINT_A_INTERRUPT 1 | ||
| 169 | #define ENDPOINT_0_INTERRUPT 0 | ||
| 170 | u32 irqstat1; | ||
| 171 | #define POWER_STATE_CHANGE_INTERRUPT 27 | ||
| 172 | #define PCI_ARBITER_TIMEOUT_INTERRUPT 26 | ||
| 173 | #define PCI_PARITY_ERROR_INTERRUPT 25 | ||
| 174 | #define PCI_INTA_INTERRUPT 24 | ||
| 175 | #define PCI_PME_INTERRUPT 23 | ||
| 176 | #define PCI_SERR_INTERRUPT 22 | ||
| 177 | #define PCI_PERR_INTERRUPT 21 | ||
| 178 | #define PCI_MASTER_ABORT_RECEIVED_INTERRUPT 20 | ||
| 179 | #define PCI_TARGET_ABORT_RECEIVED_INTERRUPT 19 | ||
| 180 | #define PCI_RETRY_ABORT_INTERRUPT 17 | ||
| 181 | #define PCI_MASTER_CYCLE_DONE_INTERRUPT 16 | ||
| 182 | #define GPIO_INTERRUPT 13 | ||
| 183 | #define DMA_D_INTERRUPT 12 | ||
| 184 | #define DMA_C_INTERRUPT 11 | ||
| 185 | #define DMA_B_INTERRUPT 10 | ||
| 186 | #define DMA_A_INTERRUPT 9 | ||
| 187 | #define EEPROM_DONE_INTERRUPT 8 | ||
| 188 | #define VBUS_INTERRUPT 7 | ||
| 189 | #define CONTROL_STATUS_INTERRUPT 6 | ||
| 190 | #define ROOT_PORT_RESET_INTERRUPT 4 | ||
| 191 | #define SUSPEND_REQUEST_INTERRUPT 3 | ||
| 192 | #define SUSPEND_REQUEST_CHANGE_INTERRUPT 2 | ||
| 193 | #define RESUME_INTERRUPT 1 | ||
| 194 | #define SOF_INTERRUPT 0 | ||
| 195 | // offset 0x0030 | ||
| 196 | u32 idxaddr; | ||
| 197 | u32 idxdata; | ||
| 198 | u32 fifoctl; | ||
| 199 | #define PCI_BASE2_RANGE 16 | ||
| 200 | #define IGNORE_FIFO_AVAILABILITY 3 | ||
| 201 | #define PCI_BASE2_SELECT 2 | ||
| 202 | #define FIFO_CONFIGURATION_SELECT 0 | ||
| 203 | u32 _unused2; | ||
| 204 | // offset 0x0040 | ||
| 205 | u32 memaddr; | ||
| 206 | #define START 28 | ||
| 207 | #define DIRECTION 27 | ||
| 208 | #define FIFO_DIAGNOSTIC_SELECT 24 | ||
| 209 | #define MEMORY_ADDRESS 0 | ||
| 210 | u32 memdata0; | ||
| 211 | u32 memdata1; | ||
| 212 | u32 _unused3; | ||
| 213 | // offset 0x0050 | ||
| 214 | u32 gpioctl; | ||
| 215 | #define GPIO3_LED_SELECT 12 | ||
| 216 | #define GPIO3_INTERRUPT_ENABLE 11 | ||
| 217 | #define GPIO2_INTERRUPT_ENABLE 10 | ||
| 218 | #define GPIO1_INTERRUPT_ENABLE 9 | ||
| 219 | #define GPIO0_INTERRUPT_ENABLE 8 | ||
| 220 | #define GPIO3_OUTPUT_ENABLE 7 | ||
| 221 | #define GPIO2_OUTPUT_ENABLE 6 | ||
| 222 | #define GPIO1_OUTPUT_ENABLE 5 | ||
| 223 | #define GPIO0_OUTPUT_ENABLE 4 | ||
| 224 | #define GPIO3_DATA 3 | ||
| 225 | #define GPIO2_DATA 2 | ||
| 226 | #define GPIO1_DATA 1 | ||
| 227 | #define GPIO0_DATA 0 | ||
| 228 | u32 gpiostat; | ||
| 229 | #define GPIO3_INTERRUPT 3 | ||
| 230 | #define GPIO2_INTERRUPT 2 | ||
| 231 | #define GPIO1_INTERRUPT 1 | ||
| 232 | #define GPIO0_INTERRUPT 0 | ||
| 233 | } __attribute__ ((packed)); | ||
| 234 | |||
| 235 | /* usb control, BAR0 + 0x0080 */ | ||
| 236 | struct net2280_usb_regs { | ||
| 237 | // offset 0x0080 | ||
| 238 | u32 stdrsp; | ||
| 239 | #define STALL_UNSUPPORTED_REQUESTS 31 | ||
| 240 | #define SET_TEST_MODE 16 | ||
| 241 | #define GET_OTHER_SPEED_CONFIGURATION 15 | ||
| 242 | #define GET_DEVICE_QUALIFIER 14 | ||
| 243 | #define SET_ADDRESS 13 | ||
| 244 | #define ENDPOINT_SET_CLEAR_HALT 12 | ||
| 245 | #define DEVICE_SET_CLEAR_DEVICE_REMOTE_WAKEUP 11 | ||
| 246 | #define GET_STRING_DESCRIPTOR_2 10 | ||
| 247 | #define GET_STRING_DESCRIPTOR_1 9 | ||
| 248 | #define GET_STRING_DESCRIPTOR_0 8 | ||
| 249 | #define GET_SET_INTERFACE 6 | ||
| 250 | #define GET_SET_CONFIGURATION 5 | ||
| 251 | #define GET_CONFIGURATION_DESCRIPTOR 4 | ||
| 252 | #define GET_DEVICE_DESCRIPTOR 3 | ||
| 253 | #define GET_ENDPOINT_STATUS 2 | ||
| 254 | #define GET_INTERFACE_STATUS 1 | ||
| 255 | #define GET_DEVICE_STATUS 0 | ||
| 256 | u32 prodvendid; | ||
| 257 | #define PRODUCT_ID 16 | ||
| 258 | #define VENDOR_ID 0 | ||
| 259 | u32 relnum; | ||
| 260 | u32 usbctl; | ||
| 261 | #define SERIAL_NUMBER_INDEX 16 | ||
| 262 | #define PRODUCT_ID_STRING_ENABLE 13 | ||
| 263 | #define VENDOR_ID_STRING_ENABLE 12 | ||
| 264 | #define USB_ROOT_PORT_WAKEUP_ENABLE 11 | ||
| 265 | #define VBUS_PIN 10 | ||
| 266 | #define TIMED_DISCONNECT 9 | ||
| 267 | #define SUSPEND_IMMEDIATELY 7 | ||
| 268 | #define SELF_POWERED_USB_DEVICE 6 | ||
| 269 | #define REMOTE_WAKEUP_SUPPORT 5 | ||
| 270 | #define PME_POLARITY 4 | ||
| 271 | #define USB_DETECT_ENABLE 3 | ||
| 272 | #define PME_WAKEUP_ENABLE 2 | ||
| 273 | #define DEVICE_REMOTE_WAKEUP_ENABLE 1 | ||
| 274 | #define SELF_POWERED_STATUS 0 | ||
| 275 | // offset 0x0090 | ||
| 276 | u32 usbstat; | ||
| 277 | #define HIGH_SPEED 7 | ||
| 278 | #define FULL_SPEED 6 | ||
| 279 | #define GENERATE_RESUME 5 | ||
| 280 | #define GENERATE_DEVICE_REMOTE_WAKEUP 4 | ||
| 281 | u32 xcvrdiag; | ||
| 282 | #define FORCE_HIGH_SPEED_MODE 31 | ||
| 283 | #define FORCE_FULL_SPEED_MODE 30 | ||
| 284 | #define USB_TEST_MODE 24 | ||
| 285 | #define LINE_STATE 16 | ||
| 286 | #define TRANSCEIVER_OPERATION_MODE 2 | ||
| 287 | #define TRANSCEIVER_SELECT 1 | ||
| 288 | #define TERMINATION_SELECT 0 | ||
| 289 | u32 setup0123; | ||
| 290 | u32 setup4567; | ||
| 291 | // offset 0x0090 | ||
| 292 | u32 _unused0; | ||
| 293 | u32 ouraddr; | ||
| 294 | #define FORCE_IMMEDIATE 7 | ||
| 295 | #define OUR_USB_ADDRESS 0 | ||
| 296 | u32 ourconfig; | ||
| 297 | } __attribute__ ((packed)); | ||
| 298 | |||
| 299 | /* pci control, BAR0 + 0x0100 */ | ||
| 300 | struct net2280_pci_regs { | ||
| 301 | // offset 0x0100 | ||
| 302 | u32 pcimstctl; | ||
| 303 | #define PCI_ARBITER_PARK_SELECT 13 | ||
| 304 | #define PCI_MULTI LEVEL_ARBITER 12 | ||
| 305 | #define PCI_RETRY_ABORT_ENABLE 11 | ||
| 306 | #define DMA_MEMORY_WRITE_AND_INVALIDATE_ENABLE 10 | ||
| 307 | #define DMA_READ_MULTIPLE_ENABLE 9 | ||
| 308 | #define DMA_READ_LINE_ENABLE 8 | ||
| 309 | #define PCI_MASTER_COMMAND_SELECT 6 | ||
| 310 | #define MEM_READ_OR_WRITE 0 | ||
| 311 | #define IO_READ_OR_WRITE 1 | ||
| 312 | #define CFG_READ_OR_WRITE 2 | ||
| 313 | #define PCI_MASTER_START 5 | ||
| 314 | #define PCI_MASTER_READ_WRITE 4 | ||
| 315 | #define PCI_MASTER_WRITE 0 | ||
| 316 | #define PCI_MASTER_READ 1 | ||
| 317 | #define PCI_MASTER_BYTE_WRITE_ENABLES 0 | ||
| 318 | u32 pcimstaddr; | ||
| 319 | u32 pcimstdata; | ||
| 320 | u32 pcimststat; | ||
| 321 | #define PCI_ARBITER_CLEAR 2 | ||
| 322 | #define PCI_EXTERNAL_ARBITER 1 | ||
| 323 | #define PCI_HOST_MODE 0 | ||
| 324 | } __attribute__ ((packed)); | ||
| 325 | |||
| 326 | /* dma control, BAR0 + 0x0180 ... array of four structs like this, | ||
| 327 | * for channels 0..3. see also struct net2280_dma: descriptor | ||
| 328 | * that can be loaded into some of these registers. | ||
| 329 | */ | ||
| 330 | struct net2280_dma_regs { /* [11.7] */ | ||
| 331 | // offset 0x0180, 0x01a0, 0x01c0, 0x01e0, | ||
| 332 | u32 dmactl; | ||
| 333 | #define DMA_SCATTER_GATHER_DONE_INTERRUPT_ENABLE 25 | ||
| 334 | #define DMA_CLEAR_COUNT_ENABLE 21 | ||
| 335 | #define DESCRIPTOR_POLLING_RATE 19 | ||
| 336 | #define POLL_CONTINUOUS 0 | ||
| 337 | #define POLL_1_USEC 1 | ||
| 338 | #define POLL_100_USEC 2 | ||
| 339 | #define POLL_1_MSEC 3 | ||
| 340 | #define DMA_VALID_BIT_POLLING_ENABLE 18 | ||
| 341 | #define DMA_VALID_BIT_ENABLE 17 | ||
| 342 | #define DMA_SCATTER_GATHER_ENABLE 16 | ||
| 343 | #define DMA_OUT_AUTO_START_ENABLE 4 | ||
| 344 | #define DMA_PREEMPT_ENABLE 3 | ||
| 345 | #define DMA_FIFO_VALIDATE 2 | ||
| 346 | #define DMA_ENABLE 1 | ||
| 347 | #define DMA_ADDRESS_HOLD 0 | ||
| 348 | u32 dmastat; | ||
| 349 | #define DMA_SCATTER_GATHER_DONE_INTERRUPT 25 | ||
| 350 | #define DMA_TRANSACTION_DONE_INTERRUPT 24 | ||
| 351 | #define DMA_ABORT 1 | ||
| 352 | #define DMA_START 0 | ||
| 353 | u32 _unused0 [2]; | ||
| 354 | // offset 0x0190, 0x01b0, 0x01d0, 0x01f0, | ||
| 355 | u32 dmacount; | ||
| 356 | #define VALID_BIT 31 | ||
| 357 | #define DMA_DIRECTION 30 | ||
| 358 | #define DMA_DONE_INTERRUPT_ENABLE 29 | ||
| 359 | #define END_OF_CHAIN 28 | ||
| 360 | #define DMA_BYTE_COUNT_MASK ((1<<24)-1) | ||
| 361 | #define DMA_BYTE_COUNT 0 | ||
| 362 | u32 dmaaddr; | ||
| 363 | u32 dmadesc; | ||
| 364 | u32 _unused1; | ||
| 365 | } __attribute__ ((packed)); | ||
| 366 | |||
| 367 | /* dedicated endpoint registers, BAR0 + 0x0200 */ | ||
| 368 | |||
| 369 | struct net2280_dep_regs { /* [11.8] */ | ||
| 370 | // offset 0x0200, 0x0210, 0x220, 0x230, 0x240 | ||
| 371 | u32 dep_cfg; | ||
| 372 | // offset 0x0204, 0x0214, 0x224, 0x234, 0x244 | ||
| 373 | u32 dep_rsp; | ||
| 374 | u32 _unused [2]; | ||
| 375 | } __attribute__ ((packed)); | ||
| 376 | |||
| 377 | /* configurable endpoint registers, BAR0 + 0x0300 ... array of seven structs | ||
| 378 | * like this, for ep0 then the configurable endpoints A..F | ||
| 379 | * ep0 reserved for control; E and F have only 64 bytes of fifo | ||
| 380 | */ | ||
| 381 | struct net2280_ep_regs { /* [11.9] */ | ||
| 382 | // offset 0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0 | ||
| 383 | u32 ep_cfg; | ||
| 384 | #define ENDPOINT_BYTE_COUNT 16 | ||
| 385 | #define ENDPOINT_ENABLE 10 | ||
| 386 | #define ENDPOINT_TYPE 8 | ||
| 387 | #define ENDPOINT_DIRECTION 7 | ||
| 388 | #define ENDPOINT_NUMBER 0 | ||
| 389 | u32 ep_rsp; | ||
| 390 | #define SET_NAK_OUT_PACKETS 15 | ||
| 391 | #define SET_EP_HIDE_STATUS_PHASE 14 | ||
| 392 | #define SET_EP_FORCE_CRC_ERROR 13 | ||
| 393 | #define SET_INTERRUPT_MODE 12 | ||
| 394 | #define SET_CONTROL_STATUS_PHASE_HANDSHAKE 11 | ||
| 395 | #define SET_NAK_OUT_PACKETS_MODE 10 | ||
| 396 | #define SET_ENDPOINT_TOGGLE 9 | ||
| 397 | #define SET_ENDPOINT_HALT 8 | ||
| 398 | #define CLEAR_NAK_OUT_PACKETS 7 | ||
| 399 | #define CLEAR_EP_HIDE_STATUS_PHASE 6 | ||
| 400 | #define CLEAR_EP_FORCE_CRC_ERROR 5 | ||
| 401 | #define CLEAR_INTERRUPT_MODE 4 | ||
| 402 | #define CLEAR_CONTROL_STATUS_PHASE_HANDSHAKE 3 | ||
| 403 | #define CLEAR_NAK_OUT_PACKETS_MODE 2 | ||
| 404 | #define CLEAR_ENDPOINT_TOGGLE 1 | ||
| 405 | #define CLEAR_ENDPOINT_HALT 0 | ||
| 406 | u32 ep_irqenb; | ||
| 407 | #define SHORT_PACKET_OUT_DONE_INTERRUPT_ENABLE 6 | ||
| 408 | #define SHORT_PACKET_TRANSFERRED_INTERRUPT_ENABLE 5 | ||
| 409 | #define DATA_PACKET_RECEIVED_INTERRUPT_ENABLE 3 | ||
| 410 | #define DATA_PACKET_TRANSMITTED_INTERRUPT_ENABLE 2 | ||
| 411 | #define DATA_OUT_PING_TOKEN_INTERRUPT_ENABLE 1 | ||
| 412 | #define DATA_IN_TOKEN_INTERRUPT_ENABLE 0 | ||
| 413 | u32 ep_stat; | ||
| 414 | #define FIFO_VALID_COUNT 24 | ||
| 415 | #define HIGH_BANDWIDTH_OUT_TRANSACTION_PID 22 | ||
| 416 | #define TIMEOUT 21 | ||
| 417 | #define USB_STALL_SENT 20 | ||
| 418 | #define USB_IN_NAK_SENT 19 | ||
| 419 | #define USB_IN_ACK_RCVD 18 | ||
| 420 | #define USB_OUT_PING_NAK_SENT 17 | ||
| 421 | #define USB_OUT_ACK_SENT 16 | ||
| 422 | #define FIFO_OVERFLOW 13 | ||
| 423 | #define FIFO_UNDERFLOW 12 | ||
| 424 | #define FIFO_FULL 11 | ||
| 425 | #define FIFO_EMPTY 10 | ||
| 426 | #define FIFO_FLUSH 9 | ||
| 427 | #define SHORT_PACKET_OUT_DONE_INTERRUPT 6 | ||
| 428 | #define SHORT_PACKET_TRANSFERRED_INTERRUPT 5 | ||
| 429 | #define NAK_OUT_PACKETS 4 | ||
| 430 | #define DATA_PACKET_RECEIVED_INTERRUPT 3 | ||
| 431 | #define DATA_PACKET_TRANSMITTED_INTERRUPT 2 | ||
| 432 | #define DATA_OUT_PING_TOKEN_INTERRUPT 1 | ||
| 433 | #define DATA_IN_TOKEN_INTERRUPT 0 | ||
| 434 | // offset 0x0310, 0x0330, 0x0350, 0x0370, 0x0390, 0x03b0, 0x03d0 | ||
| 435 | u32 ep_avail; | ||
| 436 | u32 ep_data; | ||
| 437 | u32 _unused0 [2]; | ||
| 438 | } __attribute__ ((packed)); | ||
| 439 | 26 | ||
| 440 | /*-------------------------------------------------------------------------*/ | 27 | /*-------------------------------------------------------------------------*/ |
| 441 | 28 | ||
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index 51424f66a765..68e3d8f5da89 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
| @@ -572,9 +572,10 @@ static void source_sink_complete (struct usb_ep *ep, struct usb_request *req) | |||
| 572 | switch (status) { | 572 | switch (status) { |
| 573 | 573 | ||
| 574 | case 0: /* normal completion? */ | 574 | case 0: /* normal completion? */ |
| 575 | if (ep == dev->out_ep) | 575 | if (ep == dev->out_ep) { |
| 576 | check_read_data (dev, ep, req); | 576 | check_read_data (dev, ep, req); |
| 577 | else | 577 | memset (req->buf, 0x55, req->length); |
| 578 | } else | ||
| 578 | reinit_write_data (dev, ep, req); | 579 | reinit_write_data (dev, ep, req); |
| 579 | break; | 580 | break; |
| 580 | 581 | ||
| @@ -626,6 +627,8 @@ source_sink_start_ep (struct usb_ep *ep, gfp_t gfp_flags) | |||
| 626 | 627 | ||
| 627 | if (strcmp (ep->name, EP_IN_NAME) == 0) | 628 | if (strcmp (ep->name, EP_IN_NAME) == 0) |
| 628 | reinit_write_data (ep->driver_data, ep, req); | 629 | reinit_write_data (ep->driver_data, ep, req); |
| 630 | else | ||
| 631 | memset (req->buf, 0x55, req->length); | ||
| 629 | 632 | ||
| 630 | status = usb_ep_queue (ep, req, gfp_flags); | 633 | status = usb_ep_queue (ep, req, gfp_flags); |
| 631 | if (status) { | 634 | if (status) { |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 980030d684d5..6b7350b52419 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -20,7 +20,7 @@ | |||
| 20 | #include <asm/arch/board.h> | 20 | #include <asm/arch/board.h> |
| 21 | 21 | ||
| 22 | #ifndef CONFIG_ARCH_AT91RM9200 | 22 | #ifndef CONFIG_ARCH_AT91RM9200 |
| 23 | #error "This file is AT91RM9200 bus glue. CONFIG_ARCH_AT91RM9200 must be defined." | 23 | #error "CONFIG_ARCH_AT91RM9200 must be defined." |
| 24 | #endif | 24 | #endif |
| 25 | 25 | ||
| 26 | /* interface and function clocks */ | 26 | /* interface and function clocks */ |
| @@ -84,8 +84,6 @@ static int usb_hcd_at91_remove (struct usb_hcd *, struct platform_device *); | |||
| 84 | * Allocates basic resources for this USB host controller, and | 84 | * Allocates basic resources for this USB host controller, and |
| 85 | * then invokes the start() method for the HCD associated with it | 85 | * then invokes the start() method for the HCD associated with it |
| 86 | * through the hotplug entry's driver_data. | 86 | * through the hotplug entry's driver_data. |
| 87 | * | ||
| 88 | * Store this function in the HCD's struct pci_driver as probe(). | ||
| 89 | */ | 87 | */ |
| 90 | int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev) | 88 | int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device *pdev) |
| 91 | { | 89 | { |
| @@ -148,7 +146,6 @@ int usb_hcd_at91_probe (const struct hc_driver *driver, struct platform_device * | |||
| 148 | } | 146 | } |
| 149 | 147 | ||
| 150 | 148 | ||
| 151 | /* may be called without controller electrically present */ | ||
| 152 | /* may be called with controller, bus, and devices active */ | 149 | /* may be called with controller, bus, and devices active */ |
| 153 | 150 | ||
| 154 | /** | 151 | /** |
| @@ -166,11 +163,11 @@ static int usb_hcd_at91_remove (struct usb_hcd *hcd, struct platform_device *pde | |||
| 166 | usb_remove_hcd(hcd); | 163 | usb_remove_hcd(hcd); |
| 167 | at91_stop_hc(pdev); | 164 | at91_stop_hc(pdev); |
| 168 | iounmap(hcd->regs); | 165 | iounmap(hcd->regs); |
| 169 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 166 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 170 | 167 | ||
| 171 | clk_put(fclk); | 168 | clk_put(fclk); |
| 172 | clk_put(iclk); | 169 | clk_put(iclk); |
| 173 | fclk = iclk = NULL; | 170 | fclk = iclk = NULL; |
| 174 | 171 | ||
| 175 | dev_set_drvdata(&pdev->dev, NULL); | 172 | dev_set_drvdata(&pdev->dev, NULL); |
| 176 | return 0; | 173 | return 0; |
| @@ -235,8 +232,8 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
| 235 | .hub_control = ohci_hub_control, | 232 | .hub_control = ohci_hub_control, |
| 236 | 233 | ||
| 237 | #ifdef CONFIG_PM | 234 | #ifdef CONFIG_PM |
| 238 | .hub_suspend = ohci_hub_suspend, | 235 | .bus_suspend = ohci_bus_suspend, |
| 239 | .hub_resume = ohci_hub_resume, | 236 | .bus_resume = ohci_bus_resume, |
| 240 | #endif | 237 | #endif |
| 241 | .start_port_reset = ohci_start_port_reset, | 238 | .start_port_reset = ohci_start_port_reset, |
| 242 | }; | 239 | }; |
| @@ -254,21 +251,21 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *dev) | |||
| 254 | } | 251 | } |
| 255 | 252 | ||
| 256 | #ifdef CONFIG_PM | 253 | #ifdef CONFIG_PM |
| 257 | static int ohci_hcd_at91_drv_suspend(struct platform_device *dev, u32 state, u32 level) | ||
| 258 | { | ||
| 259 | printk("%s(%s:%d): not implemented yet\n", | ||
| 260 | __func__, __FILE__, __LINE__); | ||
| 261 | 254 | ||
| 255 | /* REVISIT suspend/resume look "too" simple here */ | ||
| 256 | |||
| 257 | static int | ||
| 258 | ohci_hcd_at91_drv_suspend(struct platform_device *dev, pm_message_t mesg) | ||
| 259 | { | ||
| 262 | clk_disable(fclk); | 260 | clk_disable(fclk); |
| 261 | clk_disable(iclk); | ||
| 263 | 262 | ||
| 264 | return 0; | 263 | return 0; |
| 265 | } | 264 | } |
| 266 | 265 | ||
| 267 | static int ohci_hcd_at91_drv_resume(struct platform_device *dev, u32 state) | 266 | static int ohci_hcd_at91_drv_resume(struct platform_device *dev) |
| 268 | { | 267 | { |
| 269 | printk("%s(%s:%d): not implemented yet\n", | 268 | clk_enable(iclk); |
| 270 | __func__, __FILE__, __LINE__); | ||
| 271 | |||
| 272 | clk_enable(fclk); | 269 | clk_enable(fclk); |
| 273 | 270 | ||
| 274 | return 0; | 271 | return 0; |
| @@ -278,6 +275,8 @@ static int ohci_hcd_at91_drv_resume(struct platform_device *dev, u32 state) | |||
| 278 | #define ohci_hcd_at91_drv_resume NULL | 275 | #define ohci_hcd_at91_drv_resume NULL |
| 279 | #endif | 276 | #endif |
| 280 | 277 | ||
| 278 | MODULE_ALIAS("at91rm9200-ohci"); | ||
| 279 | |||
| 281 | static struct platform_driver ohci_hcd_at91_driver = { | 280 | static struct platform_driver ohci_hcd_at91_driver = { |
| 282 | .probe = ohci_hcd_at91_drv_probe, | 281 | .probe = ohci_hcd_at91_drv_probe, |
| 283 | .remove = ohci_hcd_at91_drv_remove, | 282 | .remove = ohci_hcd_at91_drv_remove, |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index 682bf2215660..1da5de573a6f 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | /* clock device associated with the hcd */ | 30 | /* clock device associated with the hcd */ |
| 31 | 31 | ||
| 32 | static struct clk *clk; | 32 | static struct clk *clk; |
| 33 | static struct clk *usb_clk; | ||
| 33 | 34 | ||
| 34 | /* forward definitions */ | 35 | /* forward definitions */ |
| 35 | 36 | ||
| @@ -37,7 +38,7 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc); | |||
| 37 | 38 | ||
| 38 | /* conversion functions */ | 39 | /* conversion functions */ |
| 39 | 40 | ||
| 40 | struct s3c2410_hcd_info *to_s3c2410_info(struct usb_hcd *hcd) | 41 | static struct s3c2410_hcd_info *to_s3c2410_info(struct usb_hcd *hcd) |
| 41 | { | 42 | { |
| 42 | return hcd->self.controller->platform_data; | 43 | return hcd->self.controller->platform_data; |
| 43 | } | 44 | } |
| @@ -47,6 +48,10 @@ static void s3c2410_start_hc(struct platform_device *dev, struct usb_hcd *hcd) | |||
| 47 | struct s3c2410_hcd_info *info = dev->dev.platform_data; | 48 | struct s3c2410_hcd_info *info = dev->dev.platform_data; |
| 48 | 49 | ||
| 49 | dev_dbg(&dev->dev, "s3c2410_start_hc:\n"); | 50 | dev_dbg(&dev->dev, "s3c2410_start_hc:\n"); |
| 51 | |||
| 52 | clk_enable(usb_clk); | ||
| 53 | mdelay(2); /* let the bus clock stabilise */ | ||
| 54 | |||
| 50 | clk_enable(clk); | 55 | clk_enable(clk); |
| 51 | 56 | ||
| 52 | if (info != NULL) { | 57 | if (info != NULL) { |
| @@ -75,6 +80,7 @@ static void s3c2410_stop_hc(struct platform_device *dev) | |||
| 75 | } | 80 | } |
| 76 | 81 | ||
| 77 | clk_disable(clk); | 82 | clk_disable(clk); |
| 83 | clk_disable(usb_clk); | ||
| 78 | } | 84 | } |
| 79 | 85 | ||
| 80 | /* ohci_s3c2410_hub_status_data | 86 | /* ohci_s3c2410_hub_status_data |
| @@ -316,7 +322,8 @@ static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc) | |||
| 316 | * | 322 | * |
| 317 | */ | 323 | */ |
| 318 | 324 | ||
| 319 | void usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) | 325 | static void |
| 326 | usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) | ||
| 320 | { | 327 | { |
| 321 | usb_remove_hcd(hcd); | 328 | usb_remove_hcd(hcd); |
| 322 | s3c2410_stop_hc(dev); | 329 | s3c2410_stop_hc(dev); |
| @@ -334,8 +341,8 @@ void usb_hcd_s3c2410_remove (struct usb_hcd *hcd, struct platform_device *dev) | |||
| 334 | * through the hotplug entry's driver_data. | 341 | * through the hotplug entry's driver_data. |
| 335 | * | 342 | * |
| 336 | */ | 343 | */ |
| 337 | int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | 344 | static int usb_hcd_s3c2410_probe (const struct hc_driver *driver, |
| 338 | struct platform_device *dev) | 345 | struct platform_device *dev) |
| 339 | { | 346 | { |
| 340 | struct usb_hcd *hcd = NULL; | 347 | struct usb_hcd *hcd = NULL; |
| 341 | int retval; | 348 | int retval; |
| @@ -353,14 +360,21 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 353 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { | 360 | if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) { |
| 354 | dev_err(&dev->dev, "request_mem_region failed"); | 361 | dev_err(&dev->dev, "request_mem_region failed"); |
| 355 | retval = -EBUSY; | 362 | retval = -EBUSY; |
| 356 | goto err0; | 363 | goto err_put; |
| 357 | } | 364 | } |
| 358 | 365 | ||
| 359 | clk = clk_get(NULL, "usb-host"); | 366 | clk = clk_get(&dev->dev, "usb-host"); |
| 360 | if (IS_ERR(clk)) { | 367 | if (IS_ERR(clk)) { |
| 361 | dev_err(&dev->dev, "cannot get usb-host clock\n"); | 368 | dev_err(&dev->dev, "cannot get usb-host clock\n"); |
| 362 | retval = -ENOENT; | 369 | retval = -ENOENT; |
| 363 | goto err1; | 370 | goto err_mem; |
| 371 | } | ||
| 372 | |||
| 373 | usb_clk = clk_get(&dev->dev, "upll"); | ||
| 374 | if (IS_ERR(usb_clk)) { | ||
| 375 | dev_err(&dev->dev, "cannot get usb-host clock\n"); | ||
| 376 | retval = -ENOENT; | ||
| 377 | goto err_clk; | ||
| 364 | } | 378 | } |
| 365 | 379 | ||
| 366 | s3c2410_start_hc(dev, hcd); | 380 | s3c2410_start_hc(dev, hcd); |
| @@ -369,26 +383,29 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 369 | if (!hcd->regs) { | 383 | if (!hcd->regs) { |
| 370 | dev_err(&dev->dev, "ioremap failed\n"); | 384 | dev_err(&dev->dev, "ioremap failed\n"); |
| 371 | retval = -ENOMEM; | 385 | retval = -ENOMEM; |
| 372 | goto err2; | 386 | goto err_ioremap; |
| 373 | } | 387 | } |
| 374 | 388 | ||
| 375 | ohci_hcd_init(hcd_to_ohci(hcd)); | 389 | ohci_hcd_init(hcd_to_ohci(hcd)); |
| 376 | 390 | ||
| 377 | retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); | 391 | retval = usb_add_hcd(hcd, dev->resource[1].start, SA_INTERRUPT); |
| 378 | if (retval != 0) | 392 | if (retval != 0) |
| 379 | goto err2; | 393 | goto err_ioremap; |
| 380 | 394 | ||
| 381 | return 0; | 395 | return 0; |
| 382 | 396 | ||
| 383 | err2: | 397 | err_ioremap: |
| 384 | s3c2410_stop_hc(dev); | 398 | s3c2410_stop_hc(dev); |
| 385 | iounmap(hcd->regs); | 399 | iounmap(hcd->regs); |
| 400 | clk_put(usb_clk); | ||
| 401 | |||
| 402 | err_clk: | ||
| 386 | clk_put(clk); | 403 | clk_put(clk); |
| 387 | 404 | ||
| 388 | err1: | 405 | err_mem: |
| 389 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 406 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 390 | 407 | ||
| 391 | err0: | 408 | err_put: |
| 392 | usb_put_hcd(hcd); | 409 | usb_put_hcd(hcd); |
| 393 | return retval; | 410 | return retval; |
| 394 | } | 411 | } |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 9e81c26313f9..1045f846fbe2 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
| 17 | #include <linux/acpi.h> | 17 | #include <linux/acpi.h> |
| 18 | #include "pci-quirks.h" | ||
| 18 | 19 | ||
| 19 | 20 | ||
| 20 | #define UHCI_USBLEGSUP 0xc0 /* legacy support */ | 21 | #define UHCI_USBLEGSUP 0xc0 /* legacy support */ |
diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h new file mode 100644 index 000000000000..1564edfff6fe --- /dev/null +++ b/drivers/usb/host/pci-quirks.h | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | #ifndef __LINUX_USB_PCI_QUIRKS_H | ||
| 2 | #define __LINUX_USB_PCI_QUIRKS_H | ||
| 3 | |||
| 4 | void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); | ||
| 5 | int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); | ||
| 6 | |||
| 7 | #endif /* __LINUX_USB_PCI_QUIRKS_H */ | ||
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 4edb8330c440..c0c4db78b590 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | 50 | ||
| 51 | #include "../core/hcd.h" | 51 | #include "../core/hcd.h" |
| 52 | #include "uhci-hcd.h" | 52 | #include "uhci-hcd.h" |
| 53 | #include "pci-quirks.h" | ||
| 53 | 54 | ||
| 54 | /* | 55 | /* |
| 55 | * Version Information | 56 | * Version Information |
| @@ -100,9 +101,6 @@ static void uhci_get_current_frame_number(struct uhci_hcd *uhci); | |||
| 100 | #include "uhci-q.c" | 101 | #include "uhci-q.c" |
| 101 | #include "uhci-hub.c" | 102 | #include "uhci-hub.c" |
| 102 | 103 | ||
| 103 | extern void uhci_reset_hc(struct pci_dev *pdev, unsigned long base); | ||
| 104 | extern int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base); | ||
| 105 | |||
| 106 | /* | 104 | /* |
| 107 | * Finish up a host controller reset and update the recorded state. | 105 | * Finish up a host controller reset and update the recorded state. |
| 108 | */ | 106 | */ |
| @@ -117,8 +115,7 @@ static void finish_reset(struct uhci_hcd *uhci) | |||
| 117 | for (port = 0; port < uhci->rh_numports; ++port) | 115 | for (port = 0; port < uhci->rh_numports; ++port) |
| 118 | outw(0, uhci->io_addr + USBPORTSC1 + (port * 2)); | 116 | outw(0, uhci->io_addr + USBPORTSC1 + (port * 2)); |
| 119 | 117 | ||
| 120 | uhci->port_c_suspend = uhci->suspended_ports = | 118 | uhci->port_c_suspend = uhci->resuming_ports = 0; |
| 121 | uhci->resuming_ports = 0; | ||
| 122 | uhci->rh_state = UHCI_RH_RESET; | 119 | uhci->rh_state = UHCI_RH_RESET; |
| 123 | uhci->is_stopped = UHCI_IS_STOPPED; | 120 | uhci->is_stopped = UHCI_IS_STOPPED; |
| 124 | uhci_to_hcd(uhci)->state = HC_STATE_HALT; | 121 | uhci_to_hcd(uhci)->state = HC_STATE_HALT; |
diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index 4a69c7eb09bd..d5c8f4d92823 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h | |||
| @@ -415,7 +415,6 @@ struct uhci_hcd { | |||
| 415 | 415 | ||
| 416 | /* Support for port suspend/resume/reset */ | 416 | /* Support for port suspend/resume/reset */ |
| 417 | unsigned long port_c_suspend; /* Bit-arrays of ports */ | 417 | unsigned long port_c_suspend; /* Bit-arrays of ports */ |
| 418 | unsigned long suspended_ports; | ||
| 419 | unsigned long resuming_ports; | 418 | unsigned long resuming_ports; |
| 420 | unsigned long ports_timeout; /* Time to stop signalling */ | 419 | unsigned long ports_timeout; /* Time to stop signalling */ |
| 421 | 420 | ||
diff --git a/drivers/usb/host/uhci-hub.c b/drivers/usb/host/uhci-hub.c index 152971d16769..c8451d9578f1 100644 --- a/drivers/usb/host/uhci-hub.c +++ b/drivers/usb/host/uhci-hub.c | |||
| @@ -85,11 +85,10 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 85 | { | 85 | { |
| 86 | int status; | 86 | int status; |
| 87 | 87 | ||
| 88 | if (test_bit(port, &uhci->suspended_ports)) { | 88 | if (inw(port_addr) & (USBPORTSC_SUSP | USBPORTSC_RD)) { |
| 89 | CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); | 89 | CLR_RH_PORTSTAT(USBPORTSC_SUSP | USBPORTSC_RD); |
| 90 | clear_bit(port, &uhci->suspended_ports); | 90 | if (test_bit(port, &uhci->resuming_ports)) |
| 91 | clear_bit(port, &uhci->resuming_ports); | 91 | set_bit(port, &uhci->port_c_suspend); |
| 92 | set_bit(port, &uhci->port_c_suspend); | ||
| 93 | 92 | ||
| 94 | /* The controller won't actually turn off the RD bit until | 93 | /* The controller won't actually turn off the RD bit until |
| 95 | * it has had a chance to send a low-speed EOP sequence, | 94 | * it has had a chance to send a low-speed EOP sequence, |
| @@ -97,6 +96,7 @@ static void uhci_finish_suspend(struct uhci_hcd *uhci, int port, | |||
| 97 | * slightly longer for good luck. */ | 96 | * slightly longer for good luck. */ |
| 98 | udelay(4); | 97 | udelay(4); |
| 99 | } | 98 | } |
| 99 | clear_bit(port, &uhci->resuming_ports); | ||
| 100 | } | 100 | } |
| 101 | 101 | ||
| 102 | /* Wait for the UHCI controller in HP's iLO2 server management chip. | 102 | /* Wait for the UHCI controller in HP's iLO2 server management chip. |
| @@ -265,8 +265,6 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 265 | wPortChange |= USB_PORT_STAT_C_SUSPEND; | 265 | wPortChange |= USB_PORT_STAT_C_SUSPEND; |
| 266 | lstatus |= 1; | 266 | lstatus |= 1; |
| 267 | } | 267 | } |
| 268 | if (test_bit(port, &uhci->suspended_ports)) | ||
| 269 | lstatus |= 2; | ||
| 270 | if (test_bit(port, &uhci->resuming_ports)) | 268 | if (test_bit(port, &uhci->resuming_ports)) |
| 271 | lstatus |= 4; | 269 | lstatus |= 4; |
| 272 | 270 | ||
| @@ -309,7 +307,6 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 309 | 307 | ||
| 310 | switch (wValue) { | 308 | switch (wValue) { |
| 311 | case USB_PORT_FEAT_SUSPEND: | 309 | case USB_PORT_FEAT_SUSPEND: |
| 312 | set_bit(port, &uhci->suspended_ports); | ||
| 313 | SET_RH_PORTSTAT(USBPORTSC_SUSP); | 310 | SET_RH_PORTSTAT(USBPORTSC_SUSP); |
| 314 | OK(0); | 311 | OK(0); |
| 315 | case USB_PORT_FEAT_RESET: | 312 | case USB_PORT_FEAT_RESET: |
| @@ -343,8 +340,11 @@ static int uhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 343 | CLR_RH_PORTSTAT(USBPORTSC_PEC); | 340 | CLR_RH_PORTSTAT(USBPORTSC_PEC); |
| 344 | OK(0); | 341 | OK(0); |
| 345 | case USB_PORT_FEAT_SUSPEND: | 342 | case USB_PORT_FEAT_SUSPEND: |
| 346 | if (test_bit(port, &uhci->suspended_ports) && | 343 | if (!(inw(port_addr) & USBPORTSC_SUSP)) { |
| 347 | !test_and_set_bit(port, | 344 | |
| 345 | /* Make certain the port isn't suspended */ | ||
| 346 | uhci_finish_suspend(uhci, port, port_addr); | ||
| 347 | } else if (!test_and_set_bit(port, | ||
| 348 | &uhci->resuming_ports)) { | 348 | &uhci->resuming_ports)) { |
| 349 | SET_RH_PORTSTAT(USBPORTSC_RD); | 349 | SET_RH_PORTSTAT(USBPORTSC_RD); |
| 350 | 350 | ||
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index 5246b35301de..650103bc9618 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
| @@ -200,45 +200,41 @@ config USB_POWERMATE | |||
| 200 | To compile this driver as a module, choose M here: the | 200 | To compile this driver as a module, choose M here: the |
| 201 | module will be called powermate. | 201 | module will be called powermate. |
| 202 | 202 | ||
| 203 | config USB_MTOUCH | 203 | config USB_TOUCHSCREEN |
| 204 | tristate "MicroTouch USB Touchscreen Driver" | 204 | tristate "USB Touchscreen Driver" |
| 205 | depends on USB && INPUT | 205 | depends on USB && INPUT |
| 206 | ---help--- | 206 | ---help--- |
| 207 | Say Y here if you want to use a MicroTouch (Now 3M) USB | 207 | USB Touchscreen driver for: |
| 208 | Touchscreen controller. | 208 | - eGalax Touchkit USB |
| 209 | - PanJit TouchSet USB | ||
| 210 | - 3M MicroTouch USB | ||
| 211 | - ITM | ||
| 209 | 212 | ||
| 210 | See <file:Documentation/usb/mtouch.txt> for additional information. | 213 | Have a look at <http://linux.chapter7.ch/touchkit/> for |
| 211 | 214 | a usage description and the required user-space stuff. | |
| 212 | To compile this driver as a module, choose M here: the | ||
| 213 | module will be called mtouchusb. | ||
| 214 | |||
| 215 | config USB_ITMTOUCH | ||
| 216 | tristate "ITM Touch USB Touchscreen Driver" | ||
| 217 | depends on USB && INPUT | ||
| 218 | ---help--- | ||
| 219 | Say Y here if you want to use a ITM Touch USB | ||
| 220 | Touchscreen controller. | ||
| 221 | |||
| 222 | This touchscreen is used in LG 1510SF monitors. | ||
| 223 | 215 | ||
| 224 | To compile this driver as a module, choose M here: the | 216 | To compile this driver as a module, choose M here: the |
| 225 | module will be called itmtouch. | 217 | module will be called usbtouchscreen. |
| 226 | 218 | ||
| 227 | config USB_EGALAX | 219 | config USB_TOUCHSCREEN_EGALAX |
| 228 | tristate "eGalax TouchKit USB Touchscreen Driver" | 220 | default y |
| 229 | depends on USB && INPUT | 221 | bool "eGalax device support" if EMBEDDED |
| 230 | ---help--- | 222 | depends on USB_TOUCHSCREEN |
| 231 | Say Y here if you want to use a eGalax TouchKit USB | ||
| 232 | Touchscreen controller. | ||
| 233 | 223 | ||
| 234 | The driver has been tested on a Xenarc 700TSV monitor | 224 | config USB_TOUCHSCREEN_PANJIT |
| 235 | with eGalax touchscreen. | 225 | default y |
| 226 | bool "PanJit device support" if EMBEDDED | ||
| 227 | depends on USB_TOUCHSCREEN | ||
| 236 | 228 | ||
| 237 | Have a look at <http://linux.chapter7.ch/touchkit/> for | 229 | config USB_TOUCHSCREEN_3M |
| 238 | a usage description and the required user-space stuff. | 230 | default y |
| 231 | bool "3M/Microtouch device support" if EMBEDDED | ||
| 232 | depends on USB_TOUCHSCREEN | ||
| 239 | 233 | ||
| 240 | To compile this driver as a module, choose M here: the | 234 | config USB_TOUCHSCREEN_ITM |
| 241 | module will be called touchkitusb. | 235 | default y |
| 236 | bool "ITM device support" if EMBEDDED | ||
| 237 | depends on USB_TOUCHSCREEN | ||
| 242 | 238 | ||
| 243 | config USB_YEALINK | 239 | config USB_YEALINK |
| 244 | tristate "Yealink usb-p1k voip phone" | 240 | tristate "Yealink usb-p1k voip phone" |
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile index d512d9f488fe..764114529c56 100644 --- a/drivers/usb/input/Makefile +++ b/drivers/usb/input/Makefile | |||
| @@ -37,6 +37,7 @@ obj-$(CONFIG_USB_MOUSE) += usbmouse.o | |||
| 37 | obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o | 37 | obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o |
| 38 | obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o | 38 | obj-$(CONFIG_USB_ITMTOUCH) += itmtouch.o |
| 39 | obj-$(CONFIG_USB_EGALAX) += touchkitusb.o | 39 | obj-$(CONFIG_USB_EGALAX) += touchkitusb.o |
| 40 | obj-$(CONFIG_USB_TOUCHSCREEN) += usbtouchscreen.o | ||
| 40 | obj-$(CONFIG_USB_POWERMATE) += powermate.o | 41 | obj-$(CONFIG_USB_POWERMATE) += powermate.o |
| 41 | obj-$(CONFIG_USB_WACOM) += wacom.o | 42 | obj-$(CONFIG_USB_WACOM) += wacom.o |
| 42 | obj-$(CONFIG_USB_ACECAD) += acecad.o | 43 | obj-$(CONFIG_USB_ACECAD) += acecad.o |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index d4bf1701046b..f419bd82ab7f 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
| @@ -1372,6 +1372,11 @@ void hid_close(struct hid_device *hid) | |||
| 1372 | usb_kill_urb(hid->urbin); | 1372 | usb_kill_urb(hid->urbin); |
| 1373 | } | 1373 | } |
| 1374 | 1374 | ||
| 1375 | #define USB_VENDOR_ID_PANJIT 0x134c | ||
| 1376 | |||
| 1377 | #define USB_VENDOR_ID_SILVERCREST 0x062a | ||
| 1378 | #define USB_DEVICE_ID_SILVERCREST_KB 0x0201 | ||
| 1379 | |||
| 1375 | /* | 1380 | /* |
| 1376 | * Initialize all reports | 1381 | * Initialize all reports |
| 1377 | */ | 1382 | */ |
| @@ -1655,9 +1660,12 @@ static const struct hid_blacklist { | |||
| 1655 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE }, | 1660 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE }, |
| 1656 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE }, | 1661 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE }, |
| 1657 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE }, | 1662 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE }, |
| 1663 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 3, HID_QUIRK_IGNORE }, | ||
| 1664 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 4, HID_QUIRK_IGNORE }, | ||
| 1658 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 5, HID_QUIRK_IGNORE }, | 1665 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 5, HID_QUIRK_IGNORE }, |
| 1659 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE }, | 1666 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE }, |
| 1660 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF, HID_QUIRK_IGNORE }, | 1667 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF, HID_QUIRK_IGNORE }, |
| 1668 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_DTF + 3, HID_QUIRK_IGNORE }, | ||
| 1661 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, | 1669 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, |
| 1662 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, | 1670 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, |
| 1663 | 1671 | ||
| @@ -1675,6 +1683,7 @@ static const struct hid_blacklist { | |||
| 1675 | { USB_VENDOR_ID_HP, USB_DEVICE_ID_HP_USBHUB_KB, HID_QUIRK_NOGET }, | 1683 | { USB_VENDOR_ID_HP, USB_DEVICE_ID_HP_USBHUB_KB, HID_QUIRK_NOGET }, |
| 1676 | { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET }, | 1684 | { USB_VENDOR_ID_TANGTOP, USB_DEVICE_ID_TANGTOP_USBPS2, HID_QUIRK_NOGET }, |
| 1677 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, | 1685 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, |
| 1686 | { USB_VENDOR_ID_SILVERCREST, USB_DEVICE_ID_SILVERCREST_KB, HID_QUIRK_NOGET }, | ||
| 1678 | 1687 | ||
| 1679 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE }, | 1688 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_POWERMOUSE, HID_QUIRK_2WHEEL_POWERMOUSE }, |
| 1680 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, | 1689 | { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, |
| @@ -1701,6 +1710,11 @@ static const struct hid_blacklist { | |||
| 1701 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, | 1710 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1702 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1711 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, |
| 1703 | 1712 | ||
| 1713 | { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, | ||
| 1714 | { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, | ||
| 1715 | { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE }, | ||
| 1716 | { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE }, | ||
| 1717 | |||
| 1704 | { 0, 0 } | 1718 | { 0, 0 } |
| 1705 | }; | 1719 | }; |
| 1706 | 1720 | ||
diff --git a/drivers/usb/input/hid-ff.c b/drivers/usb/input/hid-ff.c index 72e698658b53..d5c91ee67991 100644 --- a/drivers/usb/input/hid-ff.c +++ b/drivers/usb/input/hid-ff.c | |||
| @@ -34,12 +34,6 @@ | |||
| 34 | 34 | ||
| 35 | #include "hid.h" | 35 | #include "hid.h" |
| 36 | 36 | ||
| 37 | /* Drivers' initializing functions */ | ||
| 38 | extern int hid_lgff_init(struct hid_device* hid); | ||
| 39 | extern int hid_lg3d_init(struct hid_device* hid); | ||
| 40 | extern int hid_pid_init(struct hid_device* hid); | ||
| 41 | extern int hid_tmff_init(struct hid_device* hid); | ||
| 42 | |||
| 43 | /* | 37 | /* |
| 44 | * This table contains pointers to initializers. To add support for new | 38 | * This table contains pointers to initializers. To add support for new |
| 45 | * devices, you need to add the USB vendor and product ids here. | 39 | * devices, you need to add the USB vendor and product ids here. |
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 4e1b784fe527..9c62837b5b89 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
| @@ -533,3 +533,8 @@ static inline int hid_ff_event(struct hid_device *hid, struct input_dev *input, | |||
| 533 | return hid->ff_event(hid, input, type, code, value); | 533 | return hid->ff_event(hid, input, type, code, value); |
| 534 | return -ENOSYS; | 534 | return -ENOSYS; |
| 535 | } | 535 | } |
| 536 | |||
| 537 | int hid_lgff_init(struct hid_device* hid); | ||
| 538 | int hid_tmff_init(struct hid_device* hid); | ||
| 539 | int hid_pid_init(struct hid_device* hid); | ||
| 540 | |||
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c index b4a051b549d1..3d911976f378 100644 --- a/drivers/usb/input/keyspan_remote.c +++ b/drivers/usb/input/keyspan_remote.c | |||
| @@ -297,6 +297,8 @@ static void keyspan_check_data(struct usb_keyspan *remote, struct pt_regs *regs) | |||
| 297 | remote->data.bits_left -= 6; | 297 | remote->data.bits_left -= 6; |
| 298 | } else { | 298 | } else { |
| 299 | err("%s - Error in message, invalid toggle.\n", __FUNCTION__); | 299 | err("%s - Error in message, invalid toggle.\n", __FUNCTION__); |
| 300 | remote->stage = 0; | ||
| 301 | return; | ||
| 300 | } | 302 | } |
| 301 | 303 | ||
| 302 | keyspan_load_tester(remote, 5); | 304 | keyspan_load_tester(remote, 5); |
diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c new file mode 100644 index 000000000000..e9a07c1e905b --- /dev/null +++ b/drivers/usb/input/usbtouchscreen.c | |||
| @@ -0,0 +1,605 @@ | |||
| 1 | /****************************************************************************** | ||
| 2 | * usbtouchscreen.c | ||
| 3 | * Driver for USB Touchscreens, supporting those devices: | ||
| 4 | * - eGalax Touchkit | ||
| 5 | * - 3M/Microtouch | ||
| 6 | * - ITM | ||
| 7 | * - PanJit TouchSet | ||
| 8 | * | ||
| 9 | * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch> | ||
| 10 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or | ||
| 13 | * modify it under the terms of the GNU General Public License as | ||
| 14 | * published by the Free Software Foundation; either version 2 of the | ||
| 15 | * License, or (at your option) any later version. | ||
| 16 | * | ||
| 17 | * This program is distributed in the hope that it will be useful, but | ||
| 18 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 20 | * General Public License for more details. | ||
| 21 | * | ||
| 22 | * You should have received a copy of the GNU General Public License | ||
| 23 | * along with this program; if not, write to the Free Software | ||
| 24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 25 | * | ||
| 26 | * Driver is based on touchkitusb.c | ||
| 27 | * - ITM parts are from itmtouch.c | ||
| 28 | * - 3M parts are from mtouchusb.c | ||
| 29 | * - PanJit parts are from an unmerged driver by Lanslott Gish | ||
| 30 | * | ||
| 31 | *****************************************************************************/ | ||
| 32 | |||
| 33 | //#define DEBUG | ||
| 34 | |||
| 35 | #include <linux/config.h> | ||
| 36 | #include <linux/kernel.h> | ||
| 37 | #include <linux/slab.h> | ||
| 38 | #include <linux/input.h> | ||
| 39 | #include <linux/module.h> | ||
| 40 | #include <linux/init.h> | ||
| 41 | #include <linux/usb.h> | ||
| 42 | #include <linux/usb_input.h> | ||
| 43 | |||
| 44 | |||
| 45 | #define DRIVER_VERSION "v0.3" | ||
| 46 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" | ||
| 47 | #define DRIVER_DESC "USB Touchscreen Driver" | ||
| 48 | |||
| 49 | static int swap_xy; | ||
| 50 | module_param(swap_xy, bool, 0644); | ||
| 51 | MODULE_PARM_DESC(swap_xy, "If set X and Y axes are swapped."); | ||
| 52 | |||
| 53 | /* device specifc data/functions */ | ||
| 54 | struct usbtouch_usb; | ||
| 55 | struct usbtouch_device_info { | ||
| 56 | int min_xc, max_xc; | ||
| 57 | int min_yc, max_yc; | ||
| 58 | int min_press, max_press; | ||
| 59 | int rept_size; | ||
| 60 | int flags; | ||
| 61 | |||
| 62 | void (*process_pkt) (struct usbtouch_usb *usbtouch, struct pt_regs *regs, unsigned char *pkt, int len); | ||
| 63 | int (*read_data) (unsigned char *pkt, int *x, int *y, int *touch, int *press); | ||
| 64 | int (*init) (struct usbtouch_usb *usbtouch); | ||
| 65 | }; | ||
| 66 | |||
| 67 | #define USBTOUCH_FLG_BUFFER 0x01 | ||
| 68 | |||
| 69 | |||
| 70 | /* a usbtouch device */ | ||
| 71 | struct usbtouch_usb { | ||
| 72 | unsigned char *data; | ||
| 73 | dma_addr_t data_dma; | ||
| 74 | unsigned char *buffer; | ||
| 75 | int buf_len; | ||
| 76 | struct urb *irq; | ||
| 77 | struct usb_device *udev; | ||
| 78 | struct input_dev *input; | ||
| 79 | struct usbtouch_device_info *type; | ||
| 80 | char name[128]; | ||
| 81 | char phys[64]; | ||
| 82 | }; | ||
| 83 | |||
| 84 | static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, | ||
| 85 | struct pt_regs *regs, unsigned char *pkt, int len); | ||
| 86 | |||
| 87 | /* device types */ | ||
| 88 | enum { | ||
| 89 | DEVTPYE_DUMMY = -1, | ||
| 90 | DEVTYPE_EGALAX, | ||
| 91 | DEVTYPE_PANJIT, | ||
| 92 | DEVTYPE_3M, | ||
| 93 | DEVTYPE_ITM, | ||
| 94 | }; | ||
| 95 | |||
| 96 | static struct usb_device_id usbtouch_devices[] = { | ||
| 97 | #ifdef CONFIG_USB_TOUCHSCREEN_EGALAX | ||
| 98 | {USB_DEVICE(0x3823, 0x0001), .driver_info = DEVTYPE_EGALAX}, | ||
| 99 | {USB_DEVICE(0x0123, 0x0001), .driver_info = DEVTYPE_EGALAX}, | ||
| 100 | {USB_DEVICE(0x0eef, 0x0001), .driver_info = DEVTYPE_EGALAX}, | ||
| 101 | {USB_DEVICE(0x0eef, 0x0002), .driver_info = DEVTYPE_EGALAX}, | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #ifdef CONFIG_USB_TOUCHSCREEN_PANJIT | ||
| 105 | {USB_DEVICE(0x134c, 0x0001), .driver_info = DEVTYPE_PANJIT}, | ||
| 106 | {USB_DEVICE(0x134c, 0x0002), .driver_info = DEVTYPE_PANJIT}, | ||
| 107 | {USB_DEVICE(0x134c, 0x0003), .driver_info = DEVTYPE_PANJIT}, | ||
| 108 | {USB_DEVICE(0x134c, 0x0004), .driver_info = DEVTYPE_PANJIT}, | ||
| 109 | #endif | ||
| 110 | |||
| 111 | #ifdef CONFIG_USB_TOUCHSCREEN_3M | ||
| 112 | {USB_DEVICE(0x0596, 0x0001), .driver_info = DEVTYPE_3M}, | ||
| 113 | #endif | ||
| 114 | |||
| 115 | #ifdef CONFIG_USB_TOUCHSCREEN_ITM | ||
| 116 | {USB_DEVICE(0x0403, 0xf9e9), .driver_info = DEVTYPE_ITM}, | ||
| 117 | #endif | ||
| 118 | |||
| 119 | {} | ||
| 120 | }; | ||
| 121 | |||
| 122 | |||
| 123 | /***************************************************************************** | ||
| 124 | * eGalax part | ||
| 125 | */ | ||
| 126 | |||
| 127 | #ifdef CONFIG_USB_TOUCHSCREEN_EGALAX | ||
| 128 | |||
| 129 | #define EGALAX_PKT_TYPE_MASK 0xFE | ||
| 130 | #define EGALAX_PKT_TYPE_REPT 0x80 | ||
| 131 | #define EGALAX_PKT_TYPE_DIAG 0x0A | ||
| 132 | |||
| 133 | static int egalax_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
| 134 | { | ||
| 135 | if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) | ||
| 136 | return 0; | ||
| 137 | |||
| 138 | *x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F); | ||
| 139 | *y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F); | ||
| 140 | *touch = pkt[0] & 0x01; | ||
| 141 | |||
| 142 | return 1; | ||
| 143 | |||
| 144 | } | ||
| 145 | |||
| 146 | static int egalax_get_pkt_len(unsigned char *buf) | ||
| 147 | { | ||
| 148 | switch (buf[0] & EGALAX_PKT_TYPE_MASK) { | ||
| 149 | case EGALAX_PKT_TYPE_REPT: | ||
| 150 | return 5; | ||
| 151 | |||
| 152 | case EGALAX_PKT_TYPE_DIAG: | ||
| 153 | return buf[1] + 2; | ||
| 154 | } | ||
| 155 | |||
| 156 | return 0; | ||
| 157 | } | ||
| 158 | |||
| 159 | static void egalax_process(struct usbtouch_usb *usbtouch, struct pt_regs *regs, | ||
| 160 | unsigned char *pkt, int len) | ||
| 161 | { | ||
| 162 | unsigned char *buffer; | ||
| 163 | int pkt_len, buf_len, pos; | ||
| 164 | |||
| 165 | /* if the buffer contains data, append */ | ||
| 166 | if (unlikely(usbtouch->buf_len)) { | ||
| 167 | int tmp; | ||
| 168 | |||
| 169 | /* if only 1 byte in buffer, add another one to get length */ | ||
| 170 | if (usbtouch->buf_len == 1) | ||
| 171 | usbtouch->buffer[1] = pkt[0]; | ||
| 172 | |||
| 173 | pkt_len = egalax_get_pkt_len(usbtouch->buffer); | ||
| 174 | |||
| 175 | /* unknown packet: drop everything */ | ||
| 176 | if (!pkt_len) | ||
| 177 | return; | ||
| 178 | |||
| 179 | /* append, process */ | ||
| 180 | tmp = pkt_len - usbtouch->buf_len; | ||
| 181 | memcpy(usbtouch->buffer + usbtouch->buf_len, pkt, tmp); | ||
| 182 | usbtouch_process_pkt(usbtouch, regs, usbtouch->buffer, pkt_len); | ||
| 183 | |||
| 184 | buffer = pkt + tmp; | ||
| 185 | buf_len = len - tmp; | ||
| 186 | } else { | ||
| 187 | buffer = pkt; | ||
| 188 | buf_len = len; | ||
| 189 | } | ||
| 190 | |||
| 191 | /* only one byte left in buffer */ | ||
| 192 | if (unlikely(buf_len == 1)) { | ||
| 193 | usbtouch->buffer[0] = buffer[0]; | ||
| 194 | usbtouch->buf_len = 1; | ||
| 195 | return; | ||
| 196 | } | ||
| 197 | |||
| 198 | /* loop over the buffer */ | ||
| 199 | pos = 0; | ||
| 200 | while (pos < buf_len) { | ||
| 201 | /* get packet len */ | ||
| 202 | pkt_len = egalax_get_pkt_len(buffer + pos); | ||
| 203 | |||
| 204 | /* unknown packet: drop everything */ | ||
| 205 | if (unlikely(!pkt_len)) | ||
| 206 | return; | ||
| 207 | |||
| 208 | /* full packet: process */ | ||
| 209 | if (likely(pkt_len <= buf_len)) { | ||
| 210 | usbtouch_process_pkt(usbtouch, regs, buffer + pos, pkt_len); | ||
| 211 | } else { | ||
| 212 | /* incomplete packet: save in buffer */ | ||
| 213 | memcpy(usbtouch->buffer, buffer + pos, buf_len - pos); | ||
| 214 | usbtouch->buf_len = buf_len - pos; | ||
| 215 | } | ||
| 216 | pos += pkt_len; | ||
| 217 | } | ||
| 218 | } | ||
| 219 | #endif | ||
| 220 | |||
| 221 | |||
| 222 | /***************************************************************************** | ||
| 223 | * PanJit Part | ||
| 224 | */ | ||
| 225 | #ifdef CONFIG_USB_TOUCHSCREEN_PANJIT | ||
| 226 | static int panjit_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
| 227 | { | ||
| 228 | *x = ((pkt[2] & 0x0F) << 8) | pkt[1]; | ||
| 229 | *y = ((pkt[4] & 0x0F) << 8) | pkt[3]; | ||
| 230 | *touch = pkt[0] & 0x01; | ||
| 231 | |||
| 232 | return 1; | ||
| 233 | } | ||
| 234 | #endif | ||
| 235 | |||
| 236 | |||
| 237 | /***************************************************************************** | ||
| 238 | * 3M/Microtouch Part | ||
| 239 | */ | ||
| 240 | #ifdef CONFIG_USB_TOUCHSCREEN_3M | ||
| 241 | |||
| 242 | #define MTOUCHUSB_ASYNC_REPORT 1 | ||
| 243 | #define MTOUCHUSB_RESET 7 | ||
| 244 | #define MTOUCHUSB_REQ_CTRLLR_ID 10 | ||
| 245 | |||
| 246 | static int mtouch_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
| 247 | { | ||
| 248 | *x = (pkt[8] << 8) | pkt[7]; | ||
| 249 | *y = (pkt[10] << 8) | pkt[9]; | ||
| 250 | *touch = (pkt[2] & 0x40) ? 1 : 0; | ||
| 251 | |||
| 252 | return 1; | ||
| 253 | } | ||
| 254 | |||
| 255 | static int mtouch_init(struct usbtouch_usb *usbtouch) | ||
| 256 | { | ||
| 257 | int ret; | ||
| 258 | |||
| 259 | ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), | ||
| 260 | MTOUCHUSB_RESET, | ||
| 261 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 262 | 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
| 263 | dbg("%s - usb_control_msg - MTOUCHUSB_RESET - bytes|err: %d", | ||
| 264 | __FUNCTION__, ret); | ||
| 265 | if (ret < 0) | ||
| 266 | return ret; | ||
| 267 | |||
| 268 | ret = usb_control_msg(usbtouch->udev, usb_rcvctrlpipe(usbtouch->udev, 0), | ||
| 269 | MTOUCHUSB_ASYNC_REPORT, | ||
| 270 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 271 | 1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
| 272 | dbg("%s - usb_control_msg - MTOUCHUSB_ASYNC_REPORT - bytes|err: %d", | ||
| 273 | __FUNCTION__, ret); | ||
| 274 | if (ret < 0) | ||
| 275 | return ret; | ||
| 276 | |||
| 277 | return 0; | ||
| 278 | } | ||
| 279 | #endif | ||
| 280 | |||
| 281 | |||
| 282 | /***************************************************************************** | ||
| 283 | * ITM Part | ||
| 284 | */ | ||
| 285 | #ifdef CONFIG_USB_TOUCHSCREEN_ITM | ||
| 286 | static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
| 287 | { | ||
| 288 | *x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F); | ||
| 289 | *x = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F); | ||
| 290 | *press = ((pkt[2] & 0x1F) << 7) | (pkt[5] & 0x7F); | ||
| 291 | *touch = ~pkt[7] & 0x20; | ||
| 292 | |||
| 293 | return 1; | ||
| 294 | } | ||
| 295 | #endif | ||
| 296 | |||
| 297 | |||
| 298 | /***************************************************************************** | ||
| 299 | * the different device descriptors | ||
| 300 | */ | ||
| 301 | static struct usbtouch_device_info usbtouch_dev_info[] = { | ||
| 302 | #ifdef CONFIG_USB_TOUCHSCREEN_EGALAX | ||
| 303 | [DEVTYPE_EGALAX] = { | ||
| 304 | .min_xc = 0x0, | ||
| 305 | .max_xc = 0x07ff, | ||
| 306 | .min_yc = 0x0, | ||
| 307 | .max_yc = 0x07ff, | ||
| 308 | .rept_size = 16, | ||
| 309 | .flags = USBTOUCH_FLG_BUFFER, | ||
| 310 | .process_pkt = egalax_process, | ||
| 311 | .read_data = egalax_read_data, | ||
| 312 | }, | ||
| 313 | #endif | ||
| 314 | |||
| 315 | #ifdef CONFIG_USB_TOUCHSCREEN_PANJIT | ||
| 316 | [DEVTYPE_PANJIT] = { | ||
| 317 | .min_xc = 0x0, | ||
| 318 | .max_xc = 0x0fff, | ||
| 319 | .min_yc = 0x0, | ||
| 320 | .max_yc = 0x0fff, | ||
| 321 | .rept_size = 8, | ||
| 322 | .read_data = panjit_read_data, | ||
| 323 | }, | ||
| 324 | #endif | ||
| 325 | |||
| 326 | #ifdef CONFIG_USB_TOUCHSCREEN_3M | ||
| 327 | [DEVTYPE_3M] = { | ||
| 328 | .min_xc = 0x0, | ||
| 329 | .max_xc = 0x4000, | ||
| 330 | .min_yc = 0x0, | ||
| 331 | .max_yc = 0x4000, | ||
| 332 | .rept_size = 11, | ||
| 333 | .read_data = mtouch_read_data, | ||
| 334 | .init = mtouch_init, | ||
| 335 | }, | ||
| 336 | #endif | ||
| 337 | |||
| 338 | #ifdef CONFIG_USB_TOUCHSCREEN_ITM | ||
| 339 | [DEVTYPE_ITM] = { | ||
| 340 | .min_xc = 0x0, | ||
| 341 | .max_xc = 0x0fff, | ||
| 342 | .min_yc = 0x0, | ||
| 343 | .max_yc = 0x0fff, | ||
| 344 | .max_press = 0xff, | ||
| 345 | .rept_size = 8, | ||
| 346 | .read_data = itm_read_data, | ||
| 347 | }, | ||
| 348 | #endif | ||
| 349 | }; | ||
| 350 | |||
| 351 | |||
| 352 | /***************************************************************************** | ||
| 353 | * Generic Part | ||
| 354 | */ | ||
| 355 | static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch, | ||
| 356 | struct pt_regs *regs, unsigned char *pkt, int len) | ||
| 357 | { | ||
| 358 | int x, y, touch, press; | ||
| 359 | struct usbtouch_device_info *type = usbtouch->type; | ||
| 360 | |||
| 361 | if (!type->read_data(pkt, &x, &y, &touch, &press)) | ||
| 362 | return; | ||
| 363 | |||
| 364 | input_regs(usbtouch->input, regs); | ||
| 365 | input_report_key(usbtouch->input, BTN_TOUCH, touch); | ||
| 366 | |||
| 367 | if (swap_xy) { | ||
| 368 | input_report_abs(usbtouch->input, ABS_X, y); | ||
| 369 | input_report_abs(usbtouch->input, ABS_Y, x); | ||
| 370 | } else { | ||
| 371 | input_report_abs(usbtouch->input, ABS_X, x); | ||
| 372 | input_report_abs(usbtouch->input, ABS_Y, y); | ||
| 373 | } | ||
| 374 | if (type->max_press) | ||
| 375 | input_report_abs(usbtouch->input, ABS_PRESSURE, press); | ||
| 376 | input_sync(usbtouch->input); | ||
| 377 | } | ||
| 378 | |||
| 379 | |||
| 380 | static void usbtouch_irq(struct urb *urb, struct pt_regs *regs) | ||
| 381 | { | ||
| 382 | struct usbtouch_usb *usbtouch = urb->context; | ||
| 383 | int retval; | ||
| 384 | |||
| 385 | switch (urb->status) { | ||
| 386 | case 0: | ||
| 387 | /* success */ | ||
| 388 | break; | ||
| 389 | case -ETIMEDOUT: | ||
| 390 | /* this urb is timing out */ | ||
| 391 | dbg("%s - urb timed out - was the device unplugged?", | ||
| 392 | __FUNCTION__); | ||
| 393 | return; | ||
| 394 | case -ECONNRESET: | ||
| 395 | case -ENOENT: | ||
| 396 | case -ESHUTDOWN: | ||
| 397 | /* this urb is terminated, clean up */ | ||
| 398 | dbg("%s - urb shutting down with status: %d", | ||
| 399 | __FUNCTION__, urb->status); | ||
| 400 | return; | ||
| 401 | default: | ||
| 402 | dbg("%s - nonzero urb status received: %d", | ||
| 403 | __FUNCTION__, urb->status); | ||
| 404 | goto exit; | ||
| 405 | } | ||
| 406 | |||
| 407 | usbtouch->type->process_pkt(usbtouch, regs, usbtouch->data, urb->actual_length); | ||
| 408 | |||
| 409 | exit: | ||
| 410 | retval = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 411 | if (retval) | ||
| 412 | err("%s - usb_submit_urb failed with result: %d", | ||
| 413 | __FUNCTION__, retval); | ||
| 414 | } | ||
| 415 | |||
| 416 | static int usbtouch_open(struct input_dev *input) | ||
| 417 | { | ||
| 418 | struct usbtouch_usb *usbtouch = input->private; | ||
| 419 | |||
| 420 | usbtouch->irq->dev = usbtouch->udev; | ||
| 421 | |||
| 422 | if (usb_submit_urb(usbtouch->irq, GFP_KERNEL)) | ||
| 423 | return -EIO; | ||
| 424 | |||
| 425 | return 0; | ||
| 426 | } | ||
| 427 | |||
| 428 | static void usbtouch_close(struct input_dev *input) | ||
| 429 | { | ||
| 430 | struct usbtouch_usb *usbtouch = input->private; | ||
| 431 | |||
| 432 | usb_kill_urb(usbtouch->irq); | ||
| 433 | } | ||
| 434 | |||
| 435 | |||
| 436 | static void usbtouch_free_buffers(struct usb_device *udev, | ||
| 437 | struct usbtouch_usb *usbtouch) | ||
| 438 | { | ||
| 439 | if (usbtouch->data) | ||
| 440 | usb_buffer_free(udev, usbtouch->type->rept_size, | ||
| 441 | usbtouch->data, usbtouch->data_dma); | ||
| 442 | kfree(usbtouch->buffer); | ||
| 443 | } | ||
| 444 | |||
| 445 | |||
| 446 | static int usbtouch_probe(struct usb_interface *intf, | ||
| 447 | const struct usb_device_id *id) | ||
| 448 | { | ||
| 449 | struct usbtouch_usb *usbtouch; | ||
| 450 | struct input_dev *input_dev; | ||
| 451 | struct usb_host_interface *interface; | ||
| 452 | struct usb_endpoint_descriptor *endpoint; | ||
| 453 | struct usb_device *udev = interface_to_usbdev(intf); | ||
| 454 | struct usbtouch_device_info *type; | ||
| 455 | int err; | ||
| 456 | |||
| 457 | interface = intf->cur_altsetting; | ||
| 458 | endpoint = &interface->endpoint[0].desc; | ||
| 459 | |||
| 460 | usbtouch = kzalloc(sizeof(struct usbtouch_usb), GFP_KERNEL); | ||
| 461 | input_dev = input_allocate_device(); | ||
| 462 | if (!usbtouch || !input_dev) | ||
| 463 | goto out_free; | ||
| 464 | |||
| 465 | type = &usbtouch_dev_info[id->driver_info]; | ||
| 466 | usbtouch->type = type; | ||
| 467 | if (!type->process_pkt) | ||
| 468 | type->process_pkt = usbtouch_process_pkt; | ||
| 469 | |||
| 470 | usbtouch->data = usb_buffer_alloc(udev, type->rept_size, | ||
| 471 | SLAB_KERNEL, &usbtouch->data_dma); | ||
| 472 | if (!usbtouch->data) | ||
| 473 | goto out_free; | ||
| 474 | |||
| 475 | if (type->flags & USBTOUCH_FLG_BUFFER) { | ||
| 476 | usbtouch->buffer = kmalloc(type->rept_size, GFP_KERNEL); | ||
| 477 | if (!usbtouch->buffer) | ||
| 478 | goto out_free_buffers; | ||
| 479 | } | ||
| 480 | |||
| 481 | usbtouch->irq = usb_alloc_urb(0, GFP_KERNEL); | ||
| 482 | if (!usbtouch->irq) { | ||
| 483 | dbg("%s - usb_alloc_urb failed: usbtouch->irq", __FUNCTION__); | ||
| 484 | goto out_free_buffers; | ||
| 485 | } | ||
| 486 | |||
| 487 | usbtouch->udev = udev; | ||
| 488 | usbtouch->input = input_dev; | ||
| 489 | |||
| 490 | if (udev->manufacturer) | ||
| 491 | strlcpy(usbtouch->name, udev->manufacturer, sizeof(usbtouch->name)); | ||
| 492 | |||
| 493 | if (udev->product) { | ||
| 494 | if (udev->manufacturer) | ||
| 495 | strlcat(usbtouch->name, " ", sizeof(usbtouch->name)); | ||
| 496 | strlcat(usbtouch->name, udev->product, sizeof(usbtouch->name)); | ||
| 497 | } | ||
| 498 | |||
| 499 | if (!strlen(usbtouch->name)) | ||
| 500 | snprintf(usbtouch->name, sizeof(usbtouch->name), | ||
| 501 | "USB Touchscreen %04x:%04x", | ||
| 502 | le16_to_cpu(udev->descriptor.idVendor), | ||
| 503 | le16_to_cpu(udev->descriptor.idProduct)); | ||
| 504 | |||
| 505 | usb_make_path(udev, usbtouch->phys, sizeof(usbtouch->phys)); | ||
| 506 | strlcpy(usbtouch->phys, "/input0", sizeof(usbtouch->phys)); | ||
| 507 | |||
| 508 | input_dev->name = usbtouch->name; | ||
| 509 | input_dev->phys = usbtouch->phys; | ||
| 510 | usb_to_input_id(udev, &input_dev->id); | ||
| 511 | input_dev->cdev.dev = &intf->dev; | ||
| 512 | input_dev->private = usbtouch; | ||
| 513 | input_dev->open = usbtouch_open; | ||
| 514 | input_dev->close = usbtouch_close; | ||
| 515 | |||
| 516 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | ||
| 517 | input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
| 518 | input_set_abs_params(input_dev, ABS_X, type->min_xc, type->max_xc, 0, 0); | ||
| 519 | input_set_abs_params(input_dev, ABS_Y, type->min_yc, type->max_yc, 0, 0); | ||
| 520 | if (type->max_press) | ||
| 521 | input_set_abs_params(input_dev, ABS_PRESSURE, type->min_press, | ||
| 522 | type->max_press, 0, 0); | ||
| 523 | |||
| 524 | usb_fill_int_urb(usbtouch->irq, usbtouch->udev, | ||
| 525 | usb_rcvintpipe(usbtouch->udev, 0x81), | ||
| 526 | usbtouch->data, type->rept_size, | ||
| 527 | usbtouch_irq, usbtouch, endpoint->bInterval); | ||
| 528 | |||
| 529 | usbtouch->irq->transfer_dma = usbtouch->data_dma; | ||
| 530 | usbtouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
| 531 | |||
| 532 | /* device specific init */ | ||
| 533 | if (type->init) { | ||
| 534 | err = type->init(usbtouch); | ||
| 535 | if (err) { | ||
| 536 | dbg("%s - type->init() failed, err: %d", __FUNCTION__, err); | ||
| 537 | goto out_free_buffers; | ||
| 538 | } | ||
| 539 | } | ||
| 540 | |||
| 541 | err = input_register_device(usbtouch->input); | ||
| 542 | if (err) { | ||
| 543 | dbg("%s - input_register_device failed, err: %d", __FUNCTION__, err); | ||
| 544 | goto out_free_buffers; | ||
| 545 | } | ||
| 546 | |||
| 547 | usb_set_intfdata(intf, usbtouch); | ||
| 548 | |||
| 549 | return 0; | ||
| 550 | |||
| 551 | out_free_buffers: | ||
| 552 | usbtouch_free_buffers(udev, usbtouch); | ||
| 553 | out_free: | ||
| 554 | input_free_device(input_dev); | ||
| 555 | kfree(usbtouch); | ||
| 556 | return -ENOMEM; | ||
| 557 | } | ||
| 558 | |||
| 559 | static void usbtouch_disconnect(struct usb_interface *intf) | ||
| 560 | { | ||
| 561 | struct usbtouch_usb *usbtouch = usb_get_intfdata(intf); | ||
| 562 | |||
| 563 | dbg("%s - called", __FUNCTION__); | ||
| 564 | |||
| 565 | if (!usbtouch) | ||
| 566 | return; | ||
| 567 | |||
| 568 | dbg("%s - usbtouch is initialized, cleaning up", __FUNCTION__); | ||
| 569 | usb_set_intfdata(intf, NULL); | ||
| 570 | usb_kill_urb(usbtouch->irq); | ||
| 571 | input_unregister_device(usbtouch->input); | ||
| 572 | usb_free_urb(usbtouch->irq); | ||
| 573 | usbtouch_free_buffers(interface_to_usbdev(intf), usbtouch); | ||
| 574 | kfree(usbtouch); | ||
| 575 | } | ||
| 576 | |||
| 577 | MODULE_DEVICE_TABLE(usb, usbtouch_devices); | ||
| 578 | |||
| 579 | static struct usb_driver usbtouch_driver = { | ||
| 580 | .name = "usbtouchscreen", | ||
| 581 | .probe = usbtouch_probe, | ||
| 582 | .disconnect = usbtouch_disconnect, | ||
| 583 | .id_table = usbtouch_devices, | ||
| 584 | }; | ||
| 585 | |||
| 586 | static int __init usbtouch_init(void) | ||
| 587 | { | ||
| 588 | return usb_register(&usbtouch_driver); | ||
| 589 | } | ||
| 590 | |||
| 591 | static void __exit usbtouch_cleanup(void) | ||
| 592 | { | ||
| 593 | usb_deregister(&usbtouch_driver); | ||
| 594 | } | ||
| 595 | |||
| 596 | module_init(usbtouch_init); | ||
| 597 | module_exit(usbtouch_cleanup); | ||
| 598 | |||
| 599 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 600 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
| 601 | MODULE_LICENSE("GPL"); | ||
| 602 | |||
| 603 | MODULE_ALIAS("touchkitusb"); | ||
| 604 | MODULE_ALIAS("itmtouch"); | ||
| 605 | MODULE_ALIAS("mtouchusb"); | ||
diff --git a/drivers/usb/input/wacom.c b/drivers/usb/input/wacom.c index d3e15df9e815..cf84c6096f29 100644 --- a/drivers/usb/input/wacom.c +++ b/drivers/usb/input/wacom.c | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | * Copyright (c) 2000 Daniel Egger <egger@suse.de> | 9 | * Copyright (c) 2000 Daniel Egger <egger@suse.de> |
| 10 | * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com> | 10 | * Copyright (c) 2001 Frederic Lepied <flepied@mandrakesoft.com> |
| 11 | * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be> | 11 | * Copyright (c) 2004 Panagiotis Issaris <panagiotis.issaris@mech.kuleuven.ac.be> |
| 12 | * Copyright (c) 2002-2005 Ping Cheng <pingc@wacom.com> | 12 | * Copyright (c) 2002-2006 Ping Cheng <pingc@wacom.com> |
| 13 | * | 13 | * |
| 14 | * ChangeLog: | 14 | * ChangeLog: |
| 15 | * v0.1 (vp) - Initial release | 15 | * v0.1 (vp) - Initial release |
| @@ -56,6 +56,8 @@ | |||
| 56 | * - Merged wacom_intuos3_irq into wacom_intuos_irq | 56 | * - Merged wacom_intuos3_irq into wacom_intuos_irq |
| 57 | * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc. | 57 | * v1.44 (pc) - Added support for Graphire4, Cintiq 710, Intuos3 6x11, etc. |
| 58 | * - Report Device IDs | 58 | * - Report Device IDs |
| 59 | * v1.45 (pc) - Added support for DTF 521, Intuos3 12x12 and 12x19 | ||
| 60 | * - Minor data report fix | ||
| 59 | */ | 61 | */ |
| 60 | 62 | ||
| 61 | /* | 63 | /* |
| @@ -78,7 +80,7 @@ | |||
| 78 | /* | 80 | /* |
| 79 | * Version Information | 81 | * Version Information |
| 80 | */ | 82 | */ |
| 81 | #define DRIVER_VERSION "v1.44" | 83 | #define DRIVER_VERSION "v1.45" |
| 82 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" | 84 | #define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@ucw.cz>" |
| 83 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" | 85 | #define DRIVER_DESC "USB Wacom Graphire and Wacom Intuos tablet driver" |
| 84 | #define DRIVER_LICENSE "GPL" | 86 | #define DRIVER_LICENSE "GPL" |
| @@ -99,6 +101,8 @@ enum { | |||
| 99 | PL, | 101 | PL, |
| 100 | INTUOS, | 102 | INTUOS, |
| 101 | INTUOS3, | 103 | INTUOS3, |
| 104 | INTUOS312, | ||
| 105 | INTUOS319, | ||
| 102 | CINTIQ, | 106 | CINTIQ, |
| 103 | MAX_TYPE | 107 | MAX_TYPE |
| 104 | }; | 108 | }; |
| @@ -127,7 +131,19 @@ struct wacom { | |||
| 127 | char phys[32]; | 131 | char phys[32]; |
| 128 | }; | 132 | }; |
| 129 | 133 | ||
| 134 | #define USB_REQ_GET_REPORT 0x01 | ||
| 130 | #define USB_REQ_SET_REPORT 0x09 | 135 | #define USB_REQ_SET_REPORT 0x09 |
| 136 | |||
| 137 | static int usb_get_report(struct usb_interface *intf, unsigned char type, | ||
| 138 | unsigned char id, void *buf, int size) | ||
| 139 | { | ||
| 140 | return usb_control_msg(interface_to_usbdev(intf), | ||
| 141 | usb_rcvctrlpipe(interface_to_usbdev(intf), 0), | ||
| 142 | USB_REQ_GET_REPORT, USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 143 | (type << 8) + id, intf->altsetting[0].desc.bInterfaceNumber, | ||
| 144 | buf, size, 100); | ||
| 145 | } | ||
| 146 | |||
| 131 | static int usb_set_report(struct usb_interface *intf, unsigned char type, | 147 | static int usb_set_report(struct usb_interface *intf, unsigned char type, |
| 132 | unsigned char id, void *buf, int size) | 148 | unsigned char id, void *buf, int size) |
| 133 | { | 149 | { |
| @@ -206,7 +222,8 @@ static void wacom_pl_irq(struct urb *urb, struct pt_regs *regs) | |||
| 206 | wacom->tool[1] = BTN_TOOL_PEN; | 222 | wacom->tool[1] = BTN_TOOL_PEN; |
| 207 | id = STYLUS_DEVICE_ID; | 223 | id = STYLUS_DEVICE_ID; |
| 208 | } | 224 | } |
| 209 | input_report_key(dev, wacom->tool[1], id); /* report in proximity for tool */ | 225 | input_report_key(dev, wacom->tool[1], prox); /* report in proximity for tool */ |
| 226 | input_report_abs(dev, ABS_MISC, id); /* report tool id */ | ||
| 210 | input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); | 227 | input_report_abs(dev, ABS_X, data[3] | (data[2] << 7) | ((data[1] & 0x03) << 14)); |
| 211 | input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); | 228 | input_report_abs(dev, ABS_Y, data[6] | (data[5] << 7) | ((data[4] & 0x03) << 14)); |
| 212 | input_report_abs(dev, ABS_PRESSURE, pressure); | 229 | input_report_abs(dev, ABS_PRESSURE, pressure); |
| @@ -239,7 +256,7 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs) | |||
| 239 | struct wacom *wacom = urb->context; | 256 | struct wacom *wacom = urb->context; |
| 240 | unsigned char *data = wacom->data; | 257 | unsigned char *data = wacom->data; |
| 241 | struct input_dev *dev = wacom->dev; | 258 | struct input_dev *dev = wacom->dev; |
| 242 | int retval; | 259 | int retval, id; |
| 243 | 260 | ||
| 244 | switch (urb->status) { | 261 | switch (urb->status) { |
| 245 | case 0: | 262 | case 0: |
| @@ -263,12 +280,15 @@ static void wacom_ptu_irq(struct urb *urb, struct pt_regs *regs) | |||
| 263 | 280 | ||
| 264 | input_regs(dev, regs); | 281 | input_regs(dev, regs); |
| 265 | if (data[1] & 0x04) { | 282 | if (data[1] & 0x04) { |
| 266 | input_report_key(dev, BTN_TOOL_RUBBER, (data[1] & 0x20) ? ERASER_DEVICE_ID : 0); | 283 | input_report_key(dev, BTN_TOOL_RUBBER, data[1] & 0x20); |
| 267 | input_report_key(dev, BTN_TOUCH, data[1] & 0x08); | 284 | input_report_key(dev, BTN_TOUCH, data[1] & 0x08); |
| 285 | id = ERASER_DEVICE_ID; | ||
| 268 | } else { | 286 | } else { |
| 269 | input_report_key(dev, BTN_TOOL_PEN, (data[1] & 0x20) ? STYLUS_DEVICE_ID : 0); | 287 | input_report_key(dev, BTN_TOOL_PEN, data[1] & 0x20); |
| 270 | input_report_key(dev, BTN_TOUCH, data[1] & 0x01); | 288 | input_report_key(dev, BTN_TOUCH, data[1] & 0x01); |
| 289 | id = STYLUS_DEVICE_ID; | ||
| 271 | } | 290 | } |
| 291 | input_report_abs(dev, ABS_MISC, id); /* report tool id */ | ||
| 272 | input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2])); | 292 | input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[2])); |
| 273 | input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[4])); | 293 | input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[4])); |
| 274 | input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6])); | 294 | input_report_abs(dev, ABS_PRESSURE, le16_to_cpu(*(__le16 *) &data[6])); |
| @@ -312,7 +332,8 @@ static void wacom_penpartner_irq(struct urb *urb, struct pt_regs *regs) | |||
| 312 | } | 332 | } |
| 313 | 333 | ||
| 314 | input_regs(dev, regs); | 334 | input_regs(dev, regs); |
| 315 | input_report_key(dev, BTN_TOOL_PEN, STYLUS_DEVICE_ID); | 335 | input_report_key(dev, BTN_TOOL_PEN, 1); |
| 336 | input_report_abs(dev, ABS_MISC, STYLUS_DEVICE_ID); /* report tool id */ | ||
| 316 | input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1])); | 337 | input_report_abs(dev, ABS_X, le16_to_cpu(*(__le16 *) &data[1])); |
| 317 | input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3])); | 338 | input_report_abs(dev, ABS_Y, le16_to_cpu(*(__le16 *) &data[3])); |
| 318 | input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127); | 339 | input_report_abs(dev, ABS_PRESSURE, (signed char)data[6] + 127); |
| @@ -350,6 +371,8 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) | |||
| 350 | goto exit; | 371 | goto exit; |
| 351 | } | 372 | } |
| 352 | 373 | ||
| 374 | if (data[0] == 99) return; /* for Volito tablets */ | ||
| 375 | |||
| 353 | if (data[0] != 2) { | 376 | if (data[0] != 2) { |
| 354 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); | 377 | dbg("wacom_graphire_irq: received unknown report #%d", data[0]); |
| 355 | goto exit; | 378 | goto exit; |
| @@ -374,10 +397,10 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) | |||
| 374 | case 2: /* Mouse with wheel */ | 397 | case 2: /* Mouse with wheel */ |
| 375 | input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); | 398 | input_report_key(dev, BTN_MIDDLE, data[1] & 0x04); |
| 376 | if (wacom->features->type == WACOM_G4) { | 399 | if (wacom->features->type == WACOM_G4) { |
| 377 | rw = data[7] & 0x04 ? -(data[7] & 0x03) : (data[7] & 0x03); | 400 | rw = data[7] & 0x04 ? (data[7] & 0x03)-4 : (data[7] & 0x03); |
| 378 | input_report_rel(dev, REL_WHEEL, rw); | 401 | input_report_rel(dev, REL_WHEEL, -rw); |
| 379 | } else | 402 | } else |
| 380 | input_report_rel(dev, REL_WHEEL, (signed char) data[6]); | 403 | input_report_rel(dev, REL_WHEEL, -(signed char) data[6]); |
| 381 | /* fall through */ | 404 | /* fall through */ |
| 382 | 405 | ||
| 383 | case 3: /* Mouse without wheel */ | 406 | case 3: /* Mouse without wheel */ |
| @@ -406,39 +429,27 @@ static void wacom_graphire_irq(struct urb *urb, struct pt_regs *regs) | |||
| 406 | } | 429 | } |
| 407 | } | 430 | } |
| 408 | 431 | ||
| 409 | input_report_key(dev, wacom->tool[0], (data[1] & 0x10) ? id : 0); | 432 | if (data[1] & 0x10) |
| 433 | input_report_abs(dev, ABS_MISC, id); /* report tool id */ | ||
| 434 | else | ||
| 435 | input_report_abs(dev, ABS_MISC, 0); /* reset tool id */ | ||
| 436 | input_report_key(dev, wacom->tool[0], data[1] & 0x10); | ||
| 410 | input_sync(dev); | 437 | input_sync(dev); |
| 411 | 438 | ||
| 412 | /* send pad data */ | 439 | /* send pad data */ |
| 413 | if (wacom->features->type == WACOM_G4) { | 440 | if (wacom->features->type == WACOM_G4) { |
| 414 | /* fist time sending pad data */ | 441 | if ((wacom->serial[1] & 0xc0) != (data[7] & 0xf8)) { |
| 415 | if (wacom->tool[1] != BTN_TOOL_FINGER) { | 442 | wacom->id[1] = 1; |
| 416 | wacom->id[1] = 0; | 443 | wacom->serial[1] = (data[7] & 0xf8); |
| 417 | wacom->serial[1] = (data[7] & 0x38) >> 2; | ||
| 418 | } | ||
| 419 | if (data[7] & 0xf8) { | ||
| 420 | input_report_key(dev, BTN_0, (data[7] & 0x40)); | 444 | input_report_key(dev, BTN_0, (data[7] & 0x40)); |
| 421 | input_report_key(dev, BTN_4, (data[7] & 0x80)); | 445 | input_report_key(dev, BTN_4, (data[7] & 0x80)); |
| 422 | if (((data[7] & 0x38) >> 2) == (wacom->serial[1] & 0x0e)) | 446 | rw = ((data[7] & 0x18) >> 3) - ((data[7] & 0x20) >> 3); |
| 423 | /* alter REL_WHEEL value so X apps can get it */ | ||
| 424 | wacom->serial[1] += (wacom->serial[1] & 0x01) ? -1 : 1; | ||
| 425 | else | ||
| 426 | wacom->serial[1] = (data[7] & 0x38 ) >> 2; | ||
| 427 | |||
| 428 | /* don't alter the value when there is no wheel event */ | ||
| 429 | if (wacom->serial[1] == 1) | ||
| 430 | wacom->serial[1] = 0; | ||
| 431 | rw = wacom->serial[1]; | ||
| 432 | rw = (rw & 0x08) ? -(rw & 0x07) : (rw & 0x07); | ||
| 433 | input_report_rel(dev, REL_WHEEL, rw); | 447 | input_report_rel(dev, REL_WHEEL, rw); |
| 434 | wacom->tool[1] = BTN_TOOL_FINGER; | 448 | input_report_key(dev, BTN_TOOL_FINGER, 0xf0); |
| 435 | wacom->id[1] = data[7] & 0xf8; | ||
| 436 | input_report_key(dev, wacom->tool[1], 0xf0); | ||
| 437 | input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); | 449 | input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); |
| 438 | } else if (wacom->id[1]) { | 450 | } else if (wacom->id[1]) { |
| 439 | wacom->id[1] = 0; | 451 | wacom->id[1] = 0; |
| 440 | wacom->serial[1] = 0; | 452 | input_report_key(dev, BTN_TOOL_FINGER, 0); |
| 441 | input_report_key(dev, wacom->tool[1], 0); | ||
| 442 | input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); | 453 | input_event(dev, EV_MSC, MSC_SERIAL, 0xf0); |
| 443 | } | 454 | } |
| 444 | input_sync(dev); | 455 | input_sync(dev); |
| @@ -516,21 +527,31 @@ static int wacom_intuos_inout(struct urb *urb) | |||
| 516 | default: /* Unknown tool */ | 527 | default: /* Unknown tool */ |
| 517 | wacom->tool[idx] = BTN_TOOL_PEN; | 528 | wacom->tool[idx] = BTN_TOOL_PEN; |
| 518 | } | 529 | } |
| 519 | input_report_key(dev, wacom->tool[idx], wacom->id[idx]); | 530 | if(!((wacom->tool[idx] == BTN_TOOL_LENS) && |
| 520 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); | 531 | ((wacom->features->type == INTUOS312) |
| 521 | input_sync(dev); | 532 | || (wacom->features->type == INTUOS319)))) { |
| 533 | input_report_abs(dev, ABS_MISC, wacom->id[idx]); /* report tool id */ | ||
| 534 | input_report_key(dev, wacom->tool[idx], 1); | ||
| 535 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); | ||
| 536 | input_sync(dev); | ||
| 537 | } | ||
| 522 | return 1; | 538 | return 1; |
| 523 | } | 539 | } |
| 524 | 540 | ||
| 525 | /* Exit report */ | 541 | /* Exit report */ |
| 526 | if ((data[1] & 0xfe) == 0x80) { | 542 | if ((data[1] & 0xfe) == 0x80) { |
| 527 | input_report_key(dev, wacom->tool[idx], 0); | 543 | input_report_key(dev, wacom->tool[idx], 0); |
| 544 | input_report_abs(dev, ABS_MISC, 0); /* reset tool id */ | ||
| 528 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); | 545 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); |
| 529 | input_sync(dev); | 546 | input_sync(dev); |
| 530 | return 1; | 547 | return 1; |
| 531 | } | 548 | } |
| 532 | 549 | ||
| 533 | return 0; | 550 | if((wacom->tool[idx] == BTN_TOOL_LENS) && ((wacom->features->type == INTUOS312) |
| 551 | || (wacom->features->type == INTUOS319))) | ||
| 552 | return 1; | ||
| 553 | else | ||
| 554 | return 0; | ||
| 534 | } | 555 | } |
| 535 | 556 | ||
| 536 | static void wacom_intuos_general(struct urb *urb) | 557 | static void wacom_intuos_general(struct urb *urb) |
| @@ -600,10 +621,9 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) | |||
| 600 | /* pad packets. Works as a second tool and is always in prox */ | 621 | /* pad packets. Works as a second tool and is always in prox */ |
| 601 | if (data[0] == 12) { | 622 | if (data[0] == 12) { |
| 602 | /* initiate the pad as a device */ | 623 | /* initiate the pad as a device */ |
| 603 | if (wacom->tool[1] != BTN_TOOL_FINGER) { | 624 | if (wacom->tool[1] != BTN_TOOL_FINGER) |
| 604 | wacom->tool[1] = BTN_TOOL_FINGER; | 625 | wacom->tool[1] = BTN_TOOL_FINGER; |
| 605 | input_report_key(dev, wacom->tool[1], 1); | 626 | |
| 606 | } | ||
| 607 | input_report_key(dev, BTN_0, (data[5] & 0x01)); | 627 | input_report_key(dev, BTN_0, (data[5] & 0x01)); |
| 608 | input_report_key(dev, BTN_1, (data[5] & 0x02)); | 628 | input_report_key(dev, BTN_1, (data[5] & 0x02)); |
| 609 | input_report_key(dev, BTN_2, (data[5] & 0x04)); | 629 | input_report_key(dev, BTN_2, (data[5] & 0x04)); |
| @@ -614,6 +634,11 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) | |||
| 614 | input_report_key(dev, BTN_7, (data[6] & 0x08)); | 634 | input_report_key(dev, BTN_7, (data[6] & 0x08)); |
| 615 | input_report_abs(dev, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); | 635 | input_report_abs(dev, ABS_RX, ((data[1] & 0x1f) << 8) | data[2]); |
| 616 | input_report_abs(dev, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); | 636 | input_report_abs(dev, ABS_RY, ((data[3] & 0x1f) << 8) | data[4]); |
| 637 | |||
| 638 | if((data[5] & 0x0f) | (data[6] & 0x0f) | (data[1] & 0x1f) | data[2]) | ||
| 639 | input_report_key(dev, wacom->tool[1], 1); | ||
| 640 | else | ||
| 641 | input_report_key(dev, wacom->tool[1], 0); | ||
| 617 | input_event(dev, EV_MSC, MSC_SERIAL, 0xffffffff); | 642 | input_event(dev, EV_MSC, MSC_SERIAL, 0xffffffff); |
| 618 | input_sync(dev); | 643 | input_sync(dev); |
| 619 | goto exit; | 644 | goto exit; |
| @@ -676,8 +701,8 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) | |||
| 676 | input_report_key(dev, BTN_LEFT, data[8] & 0x04); | 701 | input_report_key(dev, BTN_LEFT, data[8] & 0x04); |
| 677 | input_report_key(dev, BTN_MIDDLE, data[8] & 0x08); | 702 | input_report_key(dev, BTN_MIDDLE, data[8] & 0x08); |
| 678 | input_report_key(dev, BTN_RIGHT, data[8] & 0x10); | 703 | input_report_key(dev, BTN_RIGHT, data[8] & 0x10); |
| 679 | input_report_rel(dev, REL_WHEEL, ((data[8] & 0x02) >> 1) | 704 | input_report_rel(dev, REL_WHEEL, (data[8] & 0x01) |
| 680 | - (data[8] & 0x01)); | 705 | - ((data[8] & 0x02) >> 1)); |
| 681 | 706 | ||
| 682 | /* I3 2D mouse side buttons */ | 707 | /* I3 2D mouse side buttons */ |
| 683 | if (wacom->features->type == INTUOS3) { | 708 | if (wacom->features->type == INTUOS3) { |
| @@ -695,7 +720,8 @@ static void wacom_intuos_irq(struct urb *urb, struct pt_regs *regs) | |||
| 695 | } | 720 | } |
| 696 | } | 721 | } |
| 697 | 722 | ||
| 698 | input_report_key(dev, wacom->tool[idx], wacom->id[idx]); | 723 | input_report_abs(dev, ABS_MISC, wacom->id[idx]); /* report tool id */ |
| 724 | input_report_key(dev, wacom->tool[idx], 1); | ||
| 699 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); | 725 | input_event(dev, EV_MSC, MSC_SERIAL, wacom->serial[idx]); |
| 700 | input_sync(dev); | 726 | input_sync(dev); |
| 701 | 727 | ||
| @@ -733,7 +759,8 @@ static struct wacom_features wacom_features[] = { | |||
| 733 | { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq }, | 759 | { "Wacom PL800", 8, 7220, 5780, 511, 32, PL, wacom_pl_irq }, |
| 734 | { "Wacom PL700", 8, 6758, 5406, 511, 32, PL, wacom_pl_irq }, | 760 | { "Wacom PL700", 8, 6758, 5406, 511, 32, PL, wacom_pl_irq }, |
| 735 | { "Wacom PL510", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq }, | 761 | { "Wacom PL510", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq }, |
| 736 | { "Wacom PL710", 8, 34080, 27660, 511, 32, PL, wacom_pl_irq }, | 762 | { "Wacom DTU710", 8, 34080, 27660, 511, 32, PL, wacom_pl_irq }, |
| 763 | { "Wacom DTF521", 8, 6282, 4762, 511, 32, PL, wacom_pl_irq }, | ||
| 737 | { "Wacom DTF720", 8, 6858, 5506, 511, 32, PL, wacom_pl_irq }, | 764 | { "Wacom DTF720", 8, 6858, 5506, 511, 32, PL, wacom_pl_irq }, |
| 738 | { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq }, | 765 | { "Wacom Cintiq Partner",8, 20480, 15360, 511, 32, PL, wacom_ptu_irq }, |
| 739 | { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq }, | 766 | { "Wacom Intuos2 4x5", 10, 12700, 10600, 1023, 15, INTUOS, wacom_intuos_irq }, |
| @@ -744,6 +771,8 @@ static struct wacom_features wacom_features[] = { | |||
| 744 | { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq }, | 771 | { "Wacom Intuos3 4x5", 10, 25400, 20320, 1023, 15, INTUOS3, wacom_intuos_irq }, |
| 745 | { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq }, | 772 | { "Wacom Intuos3 6x8", 10, 40640, 30480, 1023, 15, INTUOS3, wacom_intuos_irq }, |
| 746 | { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq }, | 773 | { "Wacom Intuos3 9x12", 10, 60960, 45720, 1023, 15, INTUOS3, wacom_intuos_irq }, |
| 774 | { "Wacom Intuos3 12x12", 10, 60960, 60960, 1023, 15, INTUOS312, wacom_intuos_irq }, | ||
| 775 | { "Wacom Intuos3 12x19", 10, 97536, 60960, 1023, 15, INTUOS319, wacom_intuos_irq }, | ||
| 747 | { "Wacom Intuos3 6x11", 10, 54204, 31750, 1023, 15, INTUOS3, wacom_intuos_irq }, | 776 | { "Wacom Intuos3 6x11", 10, 54204, 31750, 1023, 15, INTUOS3, wacom_intuos_irq }, |
| 748 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq }, | 777 | { "Wacom Cintiq 21UX", 10, 87200, 65600, 1023, 15, CINTIQ, wacom_intuos_irq }, |
| 749 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, | 778 | { "Wacom Intuos2 6x8", 10, 20320, 16240, 1023, 15, INTUOS, wacom_intuos_irq }, |
| @@ -779,6 +808,7 @@ static struct usb_device_id wacom_ids[] = { | |||
| 779 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) }, | 808 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x38) }, |
| 780 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) }, | 809 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x39) }, |
| 781 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) }, | 810 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC0) }, |
| 811 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xC3) }, | ||
| 782 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) }, | 812 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x03) }, |
| 783 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) }, | 813 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x41) }, |
| 784 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) }, | 814 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x42) }, |
| @@ -788,6 +818,8 @@ static struct usb_device_id wacom_ids[] = { | |||
| 788 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, | 818 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB0) }, |
| 789 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, | 819 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB1) }, |
| 790 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, | 820 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB2) }, |
| 821 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB3) }, | ||
| 822 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB4) }, | ||
| 791 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) }, | 823 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0xB5) }, |
| 792 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, | 824 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x3F) }, |
| 793 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, | 825 | { USB_DEVICE(USB_VENDOR_ID_WACOM, 0x47) }, |
| @@ -820,7 +852,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 820 | struct usb_endpoint_descriptor *endpoint; | 852 | struct usb_endpoint_descriptor *endpoint; |
| 821 | struct wacom *wacom; | 853 | struct wacom *wacom; |
| 822 | struct input_dev *input_dev; | 854 | struct input_dev *input_dev; |
| 823 | char rep_data[2] = {0x02, 0x02}; | 855 | char rep_data[2], limit = 0; |
| 824 | 856 | ||
| 825 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); | 857 | wacom = kzalloc(sizeof(struct wacom), GFP_KERNEL); |
| 826 | input_dev = input_allocate_device(); | 858 | input_dev = input_allocate_device(); |
| @@ -857,6 +889,7 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 857 | input_set_abs_params(input_dev, ABS_X, 0, wacom->features->x_max, 4, 0); | 889 | input_set_abs_params(input_dev, ABS_X, 0, wacom->features->x_max, 4, 0); |
| 858 | input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0); | 890 | input_set_abs_params(input_dev, ABS_Y, 0, wacom->features->y_max, 4, 0); |
| 859 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); | 891 | input_set_abs_params(input_dev, ABS_PRESSURE, 0, wacom->features->pressure_max, 0, 0); |
| 892 | input_dev->absbit[LONG(ABS_MISC)] |= BIT(ABS_MISC); | ||
| 860 | 893 | ||
| 861 | switch (wacom->features->type) { | 894 | switch (wacom->features->type) { |
| 862 | case WACOM_G4: | 895 | case WACOM_G4: |
| @@ -875,6 +908,8 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 875 | break; | 908 | break; |
| 876 | 909 | ||
| 877 | case INTUOS3: | 910 | case INTUOS3: |
| 911 | case INTUOS312: | ||
| 912 | case INTUOS319: | ||
| 878 | case CINTIQ: | 913 | case CINTIQ: |
| 879 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); | 914 | input_dev->keybit[LONG(BTN_DIGI)] |= BIT(BTN_TOOL_FINGER); |
| 880 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); | 915 | input_dev->keybit[LONG(BTN_LEFT)] |= BIT(BTN_0) | BIT(BTN_1) | BIT(BTN_2) | BIT(BTN_3) | BIT(BTN_4) | BIT(BTN_5) | BIT(BTN_6) | BIT(BTN_7); |
| @@ -916,10 +951,13 @@ static int wacom_probe(struct usb_interface *intf, const struct usb_device_id *i | |||
| 916 | 951 | ||
| 917 | input_register_device(wacom->dev); | 952 | input_register_device(wacom->dev); |
| 918 | 953 | ||
| 919 | /* ask the tablet to report tablet data */ | 954 | /* Ask the tablet to report tablet data. Repeat until it succeeds */ |
| 920 | usb_set_report(intf, 3, 2, rep_data, 2); | 955 | do { |
| 921 | /* repeat once (not sure why the first call often fails) */ | 956 | rep_data[0] = 2; |
| 922 | usb_set_report(intf, 3, 2, rep_data, 2); | 957 | rep_data[1] = 2; |
| 958 | usb_set_report(intf, 3, 2, rep_data, 2); | ||
| 959 | usb_get_report(intf, 3, 2, rep_data, 2); | ||
| 960 | } while (rep_data[1] != 2 && limit++ < 5); | ||
| 923 | 961 | ||
| 924 | usb_set_intfdata(intf, wacom); | 962 | usb_set_intfdata(intf, wacom); |
| 925 | return 0; | 963 | return 0; |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 9d59b901841c..ccc5e8238bd8 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
| @@ -381,6 +381,7 @@ alloc_sglist (int nents, int max, int vary) | |||
| 381 | 381 | ||
| 382 | for (i = 0; i < nents; i++) { | 382 | for (i = 0; i < nents; i++) { |
| 383 | char *buf; | 383 | char *buf; |
| 384 | unsigned j; | ||
| 384 | 385 | ||
| 385 | buf = kzalloc (size, SLAB_KERNEL); | 386 | buf = kzalloc (size, SLAB_KERNEL); |
| 386 | if (!buf) { | 387 | if (!buf) { |
| @@ -391,6 +392,16 @@ alloc_sglist (int nents, int max, int vary) | |||
| 391 | /* kmalloc pages are always physically contiguous! */ | 392 | /* kmalloc pages are always physically contiguous! */ |
| 392 | sg_init_one(&sg[i], buf, size); | 393 | sg_init_one(&sg[i], buf, size); |
| 393 | 394 | ||
| 395 | switch (pattern) { | ||
| 396 | case 0: | ||
| 397 | /* already zeroed */ | ||
| 398 | break; | ||
| 399 | case 1: | ||
| 400 | for (j = 0; j < size; j++) | ||
| 401 | *buf++ = (u8) (j % 63); | ||
| 402 | break; | ||
| 403 | } | ||
| 404 | |||
| 394 | if (vary) { | 405 | if (vary) { |
| 395 | size += vary; | 406 | size += vary; |
| 396 | size %= max; | 407 | size %= max; |
| @@ -425,6 +436,8 @@ static int perform_sglist ( | |||
| 425 | usb_sg_wait (req); | 436 | usb_sg_wait (req); |
| 426 | retval = req->status; | 437 | retval = req->status; |
| 427 | 438 | ||
| 439 | /* FIXME check resulting data pattern */ | ||
| 440 | |||
| 428 | /* FIXME if endpoint halted, clear halt (and log) */ | 441 | /* FIXME if endpoint halted, clear halt (and log) */ |
| 429 | } | 442 | } |
| 430 | 443 | ||
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c index 3094970615cb..12b599a0b539 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c | |||
| @@ -37,7 +37,6 @@ | |||
| 37 | 37 | ||
| 38 | #include "usbnet.h" | 38 | #include "usbnet.h" |
| 39 | 39 | ||
| 40 | |||
| 41 | /* ASIX AX8817X based USB 2.0 Ethernet Devices */ | 40 | /* ASIX AX8817X based USB 2.0 Ethernet Devices */ |
| 42 | 41 | ||
| 43 | #define AX_CMD_SET_SW_MII 0x06 | 42 | #define AX_CMD_SET_SW_MII 0x06 |
| @@ -109,7 +108,7 @@ | |||
| 109 | #define AX_EEPROM_MAGIC 0xdeadbeef | 108 | #define AX_EEPROM_MAGIC 0xdeadbeef |
| 110 | 109 | ||
| 111 | /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ | 110 | /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ |
| 112 | struct ax8817x_data { | 111 | struct asix_data { |
| 113 | u8 multi_filter[AX_MCAST_FILTER_SIZE]; | 112 | u8 multi_filter[AX_MCAST_FILTER_SIZE]; |
| 114 | }; | 113 | }; |
| 115 | 114 | ||
| @@ -121,7 +120,7 @@ struct ax88172_int_data { | |||
| 121 | u16 res3; | 120 | u16 res3; |
| 122 | } __attribute__ ((packed)); | 121 | } __attribute__ ((packed)); |
| 123 | 122 | ||
| 124 | static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | 123 | static int asix_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, |
| 125 | u16 size, void *data) | 124 | u16 size, void *data) |
| 126 | { | 125 | { |
| 127 | return usb_control_msg( | 126 | return usb_control_msg( |
| @@ -136,7 +135,7 @@ static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
| 136 | USB_CTRL_GET_TIMEOUT); | 135 | USB_CTRL_GET_TIMEOUT); |
| 137 | } | 136 | } |
| 138 | 137 | ||
| 139 | static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | 138 | static int asix_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, |
| 140 | u16 size, void *data) | 139 | u16 size, void *data) |
| 141 | { | 140 | { |
| 142 | return usb_control_msg( | 141 | return usb_control_msg( |
| @@ -151,19 +150,80 @@ static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
| 151 | USB_CTRL_SET_TIMEOUT); | 150 | USB_CTRL_SET_TIMEOUT); |
| 152 | } | 151 | } |
| 153 | 152 | ||
| 154 | static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs) | 153 | static void asix_async_cmd_callback(struct urb *urb, struct pt_regs *regs) |
| 155 | { | 154 | { |
| 156 | struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; | 155 | struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; |
| 157 | 156 | ||
| 158 | if (urb->status < 0) | 157 | if (urb->status < 0) |
| 159 | printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d", | 158 | printk(KERN_DEBUG "asix_async_cmd_callback() failed with %d", |
| 160 | urb->status); | 159 | urb->status); |
| 161 | 160 | ||
| 162 | kfree(req); | 161 | kfree(req); |
| 163 | usb_free_urb(urb); | 162 | usb_free_urb(urb); |
| 164 | } | 163 | } |
| 165 | 164 | ||
| 166 | static void ax8817x_status(struct usbnet *dev, struct urb *urb) | 165 | static inline int asix_set_sw_mii(struct usbnet *dev) |
| 166 | { | ||
| 167 | int ret; | ||
| 168 | ret = asix_write_cmd(dev, AX_CMD_SET_SW_MII, 0x0000, 0, 0, NULL); | ||
| 169 | if (ret < 0) | ||
| 170 | devdbg(dev, "Failed to enable software MII access"); | ||
| 171 | return ret; | ||
| 172 | } | ||
| 173 | |||
| 174 | static inline int asix_set_hw_mii(struct usbnet *dev) | ||
| 175 | { | ||
| 176 | int ret; | ||
| 177 | ret = asix_write_cmd(dev, AX_CMD_SET_HW_MII, 0x0000, 0, 0, NULL); | ||
| 178 | if (ret < 0) | ||
| 179 | devdbg(dev, "Failed to enable hardware MII access"); | ||
| 180 | return ret; | ||
| 181 | } | ||
| 182 | |||
| 183 | static inline int asix_get_phyid(struct usbnet *dev) | ||
| 184 | { | ||
| 185 | int ret = 0; | ||
| 186 | void *buf; | ||
| 187 | |||
| 188 | buf = kmalloc(2, GFP_KERNEL); | ||
| 189 | if (!buf) | ||
| 190 | goto out1; | ||
| 191 | |||
| 192 | if ((ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, | ||
| 193 | 0, 0, 2, buf)) < 2) { | ||
| 194 | devdbg(dev, "Error reading PHYID register: %02x", ret); | ||
| 195 | goto out2; | ||
| 196 | } | ||
| 197 | ret = *((u8 *)buf + 1); | ||
| 198 | out2: | ||
| 199 | kfree(buf); | ||
| 200 | out1: | ||
| 201 | return ret; | ||
| 202 | } | ||
| 203 | |||
| 204 | static int asix_sw_reset(struct usbnet *dev, u8 flags) | ||
| 205 | { | ||
| 206 | int ret; | ||
| 207 | |||
| 208 | ret = asix_write_cmd(dev, AX_CMD_SW_RESET, flags, 0, 0, NULL); | ||
| 209 | if (ret < 0) | ||
| 210 | devdbg(dev,"Failed to send software reset: %02x", ret); | ||
| 211 | |||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | static int asix_write_rx_ctl(struct usbnet *dev, u16 mode) | ||
| 216 | { | ||
| 217 | int ret; | ||
| 218 | |||
| 219 | ret = asix_write_cmd(dev, AX_CMD_WRITE_RX_CTL, mode, 0, 0, NULL); | ||
| 220 | if (ret < 0) | ||
| 221 | devdbg(dev, "Failed to write RX_CTL mode: %02x", ret); | ||
| 222 | |||
| 223 | return ret; | ||
| 224 | } | ||
| 225 | |||
| 226 | static void asix_status(struct usbnet *dev, struct urb *urb) | ||
| 167 | { | 227 | { |
| 168 | struct ax88172_int_data *event; | 228 | struct ax88172_int_data *event; |
| 169 | int link; | 229 | int link; |
| @@ -179,12 +239,12 @@ static void ax8817x_status(struct usbnet *dev, struct urb *urb) | |||
| 179 | usbnet_defer_kevent (dev, EVENT_LINK_RESET ); | 239 | usbnet_defer_kevent (dev, EVENT_LINK_RESET ); |
| 180 | } else | 240 | } else |
| 181 | netif_carrier_off(dev->net); | 241 | netif_carrier_off(dev->net); |
| 182 | devdbg(dev, "ax8817x - Link Status is: %d", link); | 242 | devdbg(dev, "Link Status is: %d", link); |
| 183 | } | 243 | } |
| 184 | } | 244 | } |
| 185 | 245 | ||
| 186 | static void | 246 | static void |
| 187 | ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | 247 | asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, |
| 188 | u16 size, void *data) | 248 | u16 size, void *data) |
| 189 | { | 249 | { |
| 190 | struct usb_ctrlrequest *req; | 250 | struct usb_ctrlrequest *req; |
| @@ -211,7 +271,7 @@ ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
| 211 | usb_fill_control_urb(urb, dev->udev, | 271 | usb_fill_control_urb(urb, dev->udev, |
| 212 | usb_sndctrlpipe(dev->udev, 0), | 272 | usb_sndctrlpipe(dev->udev, 0), |
| 213 | (void *)req, data, size, | 273 | (void *)req, data, size, |
| 214 | ax8817x_async_cmd_callback, req); | 274 | asix_async_cmd_callback, req); |
| 215 | 275 | ||
| 216 | if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { | 276 | if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { |
| 217 | deverr(dev, "Error submitting the control message: status=%d", | 277 | deverr(dev, "Error submitting the control message: status=%d", |
| @@ -221,10 +281,10 @@ ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
| 221 | } | 281 | } |
| 222 | } | 282 | } |
| 223 | 283 | ||
| 224 | static void ax8817x_set_multicast(struct net_device *net) | 284 | static void asix_set_multicast(struct net_device *net) |
| 225 | { | 285 | { |
| 226 | struct usbnet *dev = netdev_priv(net); | 286 | struct usbnet *dev = netdev_priv(net); |
| 227 | struct ax8817x_data *data = (struct ax8817x_data *)&dev->data; | 287 | struct asix_data *data = (struct asix_data *)&dev->data; |
| 228 | u8 rx_ctl = 0x8c; | 288 | u8 rx_ctl = 0x8c; |
| 229 | 289 | ||
| 230 | if (net->flags & IFF_PROMISC) { | 290 | if (net->flags & IFF_PROMISC) { |
| @@ -255,53 +315,51 @@ static void ax8817x_set_multicast(struct net_device *net) | |||
| 255 | mc_list = mc_list->next; | 315 | mc_list = mc_list->next; |
| 256 | } | 316 | } |
| 257 | 317 | ||
| 258 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, | 318 | asix_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, |
| 259 | AX_MCAST_FILTER_SIZE, data->multi_filter); | 319 | AX_MCAST_FILTER_SIZE, data->multi_filter); |
| 260 | 320 | ||
| 261 | rx_ctl |= 0x10; | 321 | rx_ctl |= 0x10; |
| 262 | } | 322 | } |
| 263 | 323 | ||
| 264 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); | 324 | asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); |
| 265 | } | 325 | } |
| 266 | 326 | ||
| 267 | static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc) | 327 | static int asix_mdio_read(struct net_device *netdev, int phy_id, int loc) |
| 268 | { | 328 | { |
| 269 | struct usbnet *dev = netdev_priv(netdev); | 329 | struct usbnet *dev = netdev_priv(netdev); |
| 270 | u16 res; | 330 | u16 res; |
| 271 | u8 buf[1]; | ||
| 272 | 331 | ||
| 273 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | 332 | asix_set_sw_mii(dev); |
| 274 | ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, | 333 | asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, |
| 275 | (__u16)loc, 2, (u16 *)&res); | 334 | (__u16)loc, 2, (u16 *)&res); |
| 276 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | 335 | asix_set_hw_mii(dev); |
| 277 | 336 | ||
| 278 | return res & 0xffff; | 337 | return res & 0xffff; |
| 279 | } | 338 | } |
| 280 | 339 | ||
| 281 | /* same as above, but converts resulting value to cpu byte order */ | 340 | /* same as above, but converts resulting value to cpu byte order */ |
| 282 | static int ax8817x_mdio_read_le(struct net_device *netdev, int phy_id, int loc) | 341 | static int asix_mdio_read_le(struct net_device *netdev, int phy_id, int loc) |
| 283 | { | 342 | { |
| 284 | return le16_to_cpu(ax8817x_mdio_read(netdev,phy_id, loc)); | 343 | return le16_to_cpu(asix_mdio_read(netdev,phy_id, loc)); |
| 285 | } | 344 | } |
| 286 | 345 | ||
| 287 | static void | 346 | static void |
| 288 | ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) | 347 | asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) |
| 289 | { | 348 | { |
| 290 | struct usbnet *dev = netdev_priv(netdev); | 349 | struct usbnet *dev = netdev_priv(netdev); |
| 291 | u16 res = val; | 350 | u16 res = val; |
| 292 | u8 buf[1]; | ||
| 293 | 351 | ||
| 294 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | 352 | asix_set_sw_mii(dev); |
| 295 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, | 353 | asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, |
| 296 | (__u16)loc, 2, (u16 *)&res); | 354 | (__u16)loc, 2, (u16 *)&res); |
| 297 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | 355 | asix_set_hw_mii(dev); |
| 298 | } | 356 | } |
| 299 | 357 | ||
| 300 | /* same as above, but converts new value to le16 byte order before writing */ | 358 | /* same as above, but converts new value to le16 byte order before writing */ |
| 301 | static void | 359 | static void |
| 302 | ax8817x_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val) | 360 | asix_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val) |
| 303 | { | 361 | { |
| 304 | ax8817x_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) ); | 362 | asix_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) ); |
| 305 | } | 363 | } |
| 306 | 364 | ||
| 307 | static int ax88172_link_reset(struct usbnet *dev) | 365 | static int ax88172_link_reset(struct usbnet *dev) |
| @@ -312,23 +370,23 @@ static int ax88172_link_reset(struct usbnet *dev) | |||
| 312 | u8 mode; | 370 | u8 mode; |
| 313 | 371 | ||
| 314 | mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; | 372 | mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; |
| 315 | lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); | 373 | lpa = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); |
| 316 | adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); | 374 | adv = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); |
| 317 | res = mii_nway_result(lpa|adv); | 375 | res = mii_nway_result(lpa|adv); |
| 318 | if (res & LPA_DUPLEX) | 376 | if (res & LPA_DUPLEX) |
| 319 | mode |= AX_MEDIUM_FULL_DUPLEX; | 377 | mode |= AX_MEDIUM_FULL_DUPLEX; |
| 320 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | 378 | asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); |
| 321 | 379 | ||
| 322 | return 0; | 380 | return 0; |
| 323 | } | 381 | } |
| 324 | 382 | ||
| 325 | static void | 383 | static void |
| 326 | ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | 384 | asix_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) |
| 327 | { | 385 | { |
| 328 | struct usbnet *dev = netdev_priv(net); | 386 | struct usbnet *dev = netdev_priv(net); |
| 329 | u8 opt; | 387 | u8 opt; |
| 330 | 388 | ||
| 331 | if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { | 389 | if (asix_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { |
| 332 | wolinfo->supported = 0; | 390 | wolinfo->supported = 0; |
| 333 | wolinfo->wolopts = 0; | 391 | wolinfo->wolopts = 0; |
| 334 | return; | 392 | return; |
| @@ -344,7 +402,7 @@ ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | |||
| 344 | } | 402 | } |
| 345 | 403 | ||
| 346 | static int | 404 | static int |
| 347 | ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | 405 | asix_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) |
| 348 | { | 406 | { |
| 349 | struct usbnet *dev = netdev_priv(net); | 407 | struct usbnet *dev = netdev_priv(net); |
| 350 | u8 opt = 0; | 408 | u8 opt = 0; |
| @@ -357,19 +415,19 @@ ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | |||
| 357 | if (opt != 0) | 415 | if (opt != 0) |
| 358 | opt |= AX_MONITOR_MODE; | 416 | opt |= AX_MONITOR_MODE; |
| 359 | 417 | ||
| 360 | if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, | 418 | if (asix_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, |
| 361 | opt, 0, 0, &buf) < 0) | 419 | opt, 0, 0, &buf) < 0) |
| 362 | return -EINVAL; | 420 | return -EINVAL; |
| 363 | 421 | ||
| 364 | return 0; | 422 | return 0; |
| 365 | } | 423 | } |
| 366 | 424 | ||
| 367 | static int ax8817x_get_eeprom_len(struct net_device *net) | 425 | static int asix_get_eeprom_len(struct net_device *net) |
| 368 | { | 426 | { |
| 369 | return AX_EEPROM_LEN; | 427 | return AX_EEPROM_LEN; |
| 370 | } | 428 | } |
| 371 | 429 | ||
| 372 | static int ax8817x_get_eeprom(struct net_device *net, | 430 | static int asix_get_eeprom(struct net_device *net, |
| 373 | struct ethtool_eeprom *eeprom, u8 *data) | 431 | struct ethtool_eeprom *eeprom, u8 *data) |
| 374 | { | 432 | { |
| 375 | struct usbnet *dev = netdev_priv(net); | 433 | struct usbnet *dev = netdev_priv(net); |
| @@ -386,14 +444,14 @@ static int ax8817x_get_eeprom(struct net_device *net, | |||
| 386 | 444 | ||
| 387 | /* ax8817x returns 2 bytes from eeprom on read */ | 445 | /* ax8817x returns 2 bytes from eeprom on read */ |
| 388 | for (i=0; i < eeprom->len / 2; i++) { | 446 | for (i=0; i < eeprom->len / 2; i++) { |
| 389 | if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM, | 447 | if (asix_read_cmd(dev, AX_CMD_READ_EEPROM, |
| 390 | eeprom->offset + i, 0, 2, &ebuf[i]) < 0) | 448 | eeprom->offset + i, 0, 2, &ebuf[i]) < 0) |
| 391 | return -EINVAL; | 449 | return -EINVAL; |
| 392 | } | 450 | } |
| 393 | return 0; | 451 | return 0; |
| 394 | } | 452 | } |
| 395 | 453 | ||
| 396 | static void ax8817x_get_drvinfo (struct net_device *net, | 454 | static void asix_get_drvinfo (struct net_device *net, |
| 397 | struct ethtool_drvinfo *info) | 455 | struct ethtool_drvinfo *info) |
| 398 | { | 456 | { |
| 399 | /* Inherit standard device info */ | 457 | /* Inherit standard device info */ |
| @@ -401,14 +459,14 @@ static void ax8817x_get_drvinfo (struct net_device *net, | |||
| 401 | info->eedump_len = 0x3e; | 459 | info->eedump_len = 0x3e; |
| 402 | } | 460 | } |
| 403 | 461 | ||
| 404 | static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd) | 462 | static int asix_get_settings(struct net_device *net, struct ethtool_cmd *cmd) |
| 405 | { | 463 | { |
| 406 | struct usbnet *dev = netdev_priv(net); | 464 | struct usbnet *dev = netdev_priv(net); |
| 407 | 465 | ||
| 408 | return mii_ethtool_gset(&dev->mii,cmd); | 466 | return mii_ethtool_gset(&dev->mii,cmd); |
| 409 | } | 467 | } |
| 410 | 468 | ||
| 411 | static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd) | 469 | static int asix_set_settings(struct net_device *net, struct ethtool_cmd *cmd) |
| 412 | { | 470 | { |
| 413 | struct usbnet *dev = netdev_priv(net); | 471 | struct usbnet *dev = netdev_priv(net); |
| 414 | 472 | ||
| @@ -418,27 +476,27 @@ static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd) | |||
| 418 | /* We need to override some ethtool_ops so we require our | 476 | /* We need to override some ethtool_ops so we require our |
| 419 | own structure so we don't interfere with other usbnet | 477 | own structure so we don't interfere with other usbnet |
| 420 | devices that may be connected at the same time. */ | 478 | devices that may be connected at the same time. */ |
| 421 | static struct ethtool_ops ax8817x_ethtool_ops = { | 479 | static struct ethtool_ops ax88172_ethtool_ops = { |
| 422 | .get_drvinfo = ax8817x_get_drvinfo, | 480 | .get_drvinfo = asix_get_drvinfo, |
| 423 | .get_link = ethtool_op_get_link, | 481 | .get_link = ethtool_op_get_link, |
| 424 | .get_msglevel = usbnet_get_msglevel, | 482 | .get_msglevel = usbnet_get_msglevel, |
| 425 | .set_msglevel = usbnet_set_msglevel, | 483 | .set_msglevel = usbnet_set_msglevel, |
| 426 | .get_wol = ax8817x_get_wol, | 484 | .get_wol = asix_get_wol, |
| 427 | .set_wol = ax8817x_set_wol, | 485 | .set_wol = asix_set_wol, |
| 428 | .get_eeprom_len = ax8817x_get_eeprom_len, | 486 | .get_eeprom_len = asix_get_eeprom_len, |
| 429 | .get_eeprom = ax8817x_get_eeprom, | 487 | .get_eeprom = asix_get_eeprom, |
| 430 | .get_settings = ax8817x_get_settings, | 488 | .get_settings = asix_get_settings, |
| 431 | .set_settings = ax8817x_set_settings, | 489 | .set_settings = asix_set_settings, |
| 432 | }; | 490 | }; |
| 433 | 491 | ||
| 434 | static int ax8817x_ioctl (struct net_device *net, struct ifreq *rq, int cmd) | 492 | static int asix_ioctl (struct net_device *net, struct ifreq *rq, int cmd) |
| 435 | { | 493 | { |
| 436 | struct usbnet *dev = netdev_priv(net); | 494 | struct usbnet *dev = netdev_priv(net); |
| 437 | 495 | ||
| 438 | return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); | 496 | return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); |
| 439 | } | 497 | } |
| 440 | 498 | ||
| 441 | static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf) | 499 | static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) |
| 442 | { | 500 | { |
| 443 | int ret = 0; | 501 | int ret = 0; |
| 444 | void *buf; | 502 | void *buf; |
| @@ -455,55 +513,39 @@ static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 455 | 513 | ||
| 456 | /* Toggle the GPIOs in a manufacturer/model specific way */ | 514 | /* Toggle the GPIOs in a manufacturer/model specific way */ |
| 457 | for (i = 2; i >= 0; i--) { | 515 | for (i = 2; i >= 0; i--) { |
| 458 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | 516 | if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, |
| 459 | (gpio_bits >> (i * 8)) & 0xff, 0, 0, | 517 | (gpio_bits >> (i * 8)) & 0xff, 0, 0, |
| 460 | buf)) < 0) | 518 | buf)) < 0) |
| 461 | goto out2; | 519 | goto out2; |
| 462 | msleep(5); | 520 | msleep(5); |
| 463 | } | 521 | } |
| 464 | 522 | ||
| 465 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, | 523 | if ((ret = asix_write_rx_ctl(dev,0x80)) < 0) |
| 466 | 0x80, 0, 0, buf)) < 0) { | ||
| 467 | dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret); | ||
| 468 | goto out2; | 524 | goto out2; |
| 469 | } | ||
| 470 | 525 | ||
| 471 | /* Get the MAC address */ | 526 | /* Get the MAC address */ |
| 472 | memset(buf, 0, ETH_ALEN); | 527 | memset(buf, 0, ETH_ALEN); |
| 473 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, | 528 | if ((ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, |
| 474 | 0, 0, 6, buf)) < 0) { | 529 | 0, 0, 6, buf)) < 0) { |
| 475 | dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); | 530 | dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); |
| 476 | goto out2; | 531 | goto out2; |
| 477 | } | 532 | } |
| 478 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | 533 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); |
| 479 | 534 | ||
| 480 | /* Get the PHY id */ | ||
| 481 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, | ||
| 482 | 0, 0, 2, buf)) < 0) { | ||
| 483 | dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret); | ||
| 484 | goto out2; | ||
| 485 | } else if (ret < 2) { | ||
| 486 | /* this should always return 2 bytes */ | ||
| 487 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", | ||
| 488 | ret); | ||
| 489 | ret = -EIO; | ||
| 490 | goto out2; | ||
| 491 | } | ||
| 492 | |||
| 493 | /* Initialize MII structure */ | 535 | /* Initialize MII structure */ |
| 494 | dev->mii.dev = dev->net; | 536 | dev->mii.dev = dev->net; |
| 495 | dev->mii.mdio_read = ax8817x_mdio_read; | 537 | dev->mii.mdio_read = asix_mdio_read; |
| 496 | dev->mii.mdio_write = ax8817x_mdio_write; | 538 | dev->mii.mdio_write = asix_mdio_write; |
| 497 | dev->mii.phy_id_mask = 0x3f; | 539 | dev->mii.phy_id_mask = 0x3f; |
| 498 | dev->mii.reg_num_mask = 0x1f; | 540 | dev->mii.reg_num_mask = 0x1f; |
| 499 | dev->mii.phy_id = *((u8 *)buf + 1); | 541 | dev->mii.phy_id = asix_get_phyid(dev); |
| 500 | dev->net->do_ioctl = ax8817x_ioctl; | 542 | dev->net->do_ioctl = asix_ioctl; |
| 501 | 543 | ||
| 502 | dev->net->set_multicast_list = ax8817x_set_multicast; | 544 | dev->net->set_multicast_list = asix_set_multicast; |
| 503 | dev->net->ethtool_ops = &ax8817x_ethtool_ops; | 545 | dev->net->ethtool_ops = &ax88172_ethtool_ops; |
| 504 | 546 | ||
| 505 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | 547 | asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); |
| 506 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, | 548 | asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, |
| 507 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); | 549 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); |
| 508 | mii_nway_restart(&dev->mii); | 550 | mii_nway_restart(&dev->mii); |
| 509 | 551 | ||
| @@ -515,16 +557,16 @@ out1: | |||
| 515 | } | 557 | } |
| 516 | 558 | ||
| 517 | static struct ethtool_ops ax88772_ethtool_ops = { | 559 | static struct ethtool_ops ax88772_ethtool_ops = { |
| 518 | .get_drvinfo = ax8817x_get_drvinfo, | 560 | .get_drvinfo = asix_get_drvinfo, |
| 519 | .get_link = ethtool_op_get_link, | 561 | .get_link = ethtool_op_get_link, |
| 520 | .get_msglevel = usbnet_get_msglevel, | 562 | .get_msglevel = usbnet_get_msglevel, |
| 521 | .set_msglevel = usbnet_set_msglevel, | 563 | .set_msglevel = usbnet_set_msglevel, |
| 522 | .get_wol = ax8817x_get_wol, | 564 | .get_wol = asix_get_wol, |
| 523 | .set_wol = ax8817x_set_wol, | 565 | .set_wol = asix_set_wol, |
| 524 | .get_eeprom_len = ax8817x_get_eeprom_len, | 566 | .get_eeprom_len = asix_get_eeprom_len, |
| 525 | .get_eeprom = ax8817x_get_eeprom, | 567 | .get_eeprom = asix_get_eeprom, |
| 526 | .get_settings = ax8817x_get_settings, | 568 | .get_settings = asix_get_settings, |
| 527 | .set_settings = ax8817x_set_settings, | 569 | .set_settings = asix_set_settings, |
| 528 | }; | 570 | }; |
| 529 | 571 | ||
| 530 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | 572 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) |
| @@ -541,62 +583,45 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 541 | goto out1; | 583 | goto out1; |
| 542 | } | 584 | } |
| 543 | 585 | ||
| 544 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | 586 | if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_GPIOS, |
| 545 | 0x00B0, 0, 0, buf)) < 0) | 587 | 0x00B0, 0, 0, buf)) < 0) |
| 546 | goto out2; | 588 | goto out2; |
| 547 | 589 | ||
| 548 | msleep(5); | 590 | msleep(5); |
| 549 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, | 591 | if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT, |
| 550 | 0x0001, 0, 0, buf)) < 0) { | 592 | 0x0001, 0, 0, buf)) < 0) { |
| 551 | dbg("Select PHY #1 failed: %d", ret); | 593 | dbg("Select PHY #1 failed: %d", ret); |
| 552 | goto out2; | 594 | goto out2; |
| 553 | } | 595 | } |
| 554 | 596 | ||
| 555 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, | 597 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD)) < 0) |
| 556 | 0, 0, buf)) < 0) { | ||
| 557 | dbg("Failed to power down internal PHY: %d", ret); | ||
| 558 | goto out2; | 598 | goto out2; |
| 559 | } | ||
| 560 | 599 | ||
| 561 | msleep(150); | 600 | msleep(150); |
| 562 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, | 601 | if ((ret = asix_sw_reset(dev, AX_SWRESET_CLEAR)) < 0) |
| 563 | 0, 0, buf)) < 0) { | ||
| 564 | dbg("Failed to perform software reset: %d", ret); | ||
| 565 | goto out2; | 602 | goto out2; |
| 566 | } | ||
| 567 | 603 | ||
| 568 | msleep(150); | 604 | msleep(150); |
| 569 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, | 605 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0) |
| 570 | AX_SWRESET_IPRL | AX_SWRESET_PRL, | ||
| 571 | 0, 0, buf)) < 0) { | ||
| 572 | dbg("Failed to set Internal/External PHY reset control: %d", | ||
| 573 | ret); | ||
| 574 | goto out2; | 606 | goto out2; |
| 575 | } | ||
| 576 | 607 | ||
| 577 | msleep(150); | 608 | msleep(150); |
| 578 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, | 609 | if ((ret = asix_write_rx_ctl(dev, 0x00)) < 0) |
| 579 | 0x0000, 0, 0, buf)) < 0) { | ||
| 580 | dbg("Failed to reset RX_CTL: %d", ret); | ||
| 581 | goto out2; | 610 | goto out2; |
| 582 | } | ||
| 583 | 611 | ||
| 584 | /* Get the MAC address */ | 612 | /* Get the MAC address */ |
| 585 | memset(buf, 0, ETH_ALEN); | 613 | memset(buf, 0, ETH_ALEN); |
| 586 | if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID, | 614 | if ((ret = asix_read_cmd(dev, AX88772_CMD_READ_NODE_ID, |
| 587 | 0, 0, ETH_ALEN, buf)) < 0) { | 615 | 0, 0, ETH_ALEN, buf)) < 0) { |
| 588 | dbg("Failed to read MAC address: %d", ret); | 616 | dbg("Failed to read MAC address: %d", ret); |
| 589 | goto out2; | 617 | goto out2; |
| 590 | } | 618 | } |
| 591 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | 619 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); |
| 592 | 620 | ||
| 593 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, | 621 | if ((ret = asix_set_sw_mii(dev)) < 0) |
| 594 | 0, 0, 0, buf)) < 0) { | ||
| 595 | dbg("Enabling software MII failed: %d", ret); | ||
| 596 | goto out2; | 622 | goto out2; |
| 597 | } | ||
| 598 | 623 | ||
| 599 | if (((ret = ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, | 624 | if (((ret = asix_read_cmd(dev, AX_CMD_READ_MII_REG, |
| 600 | 0x0010, 2, 2, buf)) < 0) | 625 | 0x0010, 2, 2, buf)) < 0) |
| 601 | || (*((u16 *)buf) != 0x003b)) { | 626 | || (*((u16 *)buf) != 0x003b)) { |
| 602 | dbg("Read PHY register 2 must be 0x3b00: %d", ret); | 627 | dbg("Read PHY register 2 must be 0x3b00: %d", ret); |
| @@ -605,74 +630,49 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | |||
| 605 | 630 | ||
| 606 | /* Initialize MII structure */ | 631 | /* Initialize MII structure */ |
| 607 | dev->mii.dev = dev->net; | 632 | dev->mii.dev = dev->net; |
| 608 | dev->mii.mdio_read = ax8817x_mdio_read; | 633 | dev->mii.mdio_read = asix_mdio_read; |
| 609 | dev->mii.mdio_write = ax8817x_mdio_write; | 634 | dev->mii.mdio_write = asix_mdio_write; |
| 610 | dev->mii.phy_id_mask = 0xff; | 635 | dev->mii.phy_id_mask = 0xff; |
| 611 | dev->mii.reg_num_mask = 0xff; | 636 | dev->mii.reg_num_mask = 0xff; |
| 612 | dev->net->do_ioctl = ax8817x_ioctl; | 637 | dev->net->do_ioctl = asix_ioctl; |
| 638 | dev->mii.phy_id = asix_get_phyid(dev); | ||
| 613 | 639 | ||
| 614 | /* Get the PHY id */ | 640 | if ((ret = asix_sw_reset(dev, AX_SWRESET_PRL)) < 0) |
| 615 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, | ||
| 616 | 0, 0, 2, buf)) < 0) { | ||
| 617 | dbg("Error reading PHY ID: %02x", ret); | ||
| 618 | goto out2; | 641 | goto out2; |
| 619 | } else if (ret < 2) { | ||
| 620 | /* this should always return 2 bytes */ | ||
| 621 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", | ||
| 622 | ret); | ||
| 623 | ret = -EIO; | ||
| 624 | goto out2; | ||
| 625 | } | ||
| 626 | dev->mii.phy_id = *((u8 *)buf + 1); | ||
| 627 | 642 | ||
| 628 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, | ||
| 629 | 0, 0, buf)) < 0) { | ||
| 630 | dbg("Set external PHY reset pin level: %d", ret); | ||
| 631 | goto out2; | ||
| 632 | } | ||
| 633 | msleep(150); | 643 | msleep(150); |
| 634 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, | 644 | |
| 635 | AX_SWRESET_IPRL | AX_SWRESET_PRL, | 645 | if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0) |
| 636 | 0, 0, buf)) < 0) { | ||
| 637 | dbg("Set Internal/External PHY reset control: %d", ret); | ||
| 638 | goto out2; | 646 | goto out2; |
| 639 | } | ||
| 640 | msleep(150); | ||
| 641 | 647 | ||
| 648 | msleep(150); | ||
| 642 | 649 | ||
| 643 | dev->net->set_multicast_list = ax8817x_set_multicast; | 650 | dev->net->set_multicast_list = asix_set_multicast; |
| 644 | dev->net->ethtool_ops = &ax88772_ethtool_ops; | 651 | dev->net->ethtool_ops = &ax88772_ethtool_ops; |
| 645 | 652 | ||
| 646 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | 653 | asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); |
| 647 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, | 654 | asix_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, |
| 648 | ADVERTISE_ALL | ADVERTISE_CSMA); | 655 | ADVERTISE_ALL | ADVERTISE_CSMA); |
| 649 | mii_nway_restart(&dev->mii); | 656 | mii_nway_restart(&dev->mii); |
| 650 | 657 | ||
| 651 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, | 658 | if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, |
| 652 | AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { | 659 | AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { |
| 653 | dbg("Write medium mode register: %d", ret); | 660 | dbg("Write medium mode register: %d", ret); |
| 654 | goto out2; | 661 | goto out2; |
| 655 | } | 662 | } |
| 656 | 663 | ||
| 657 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, | 664 | if ((ret = asix_write_cmd(dev, AX_CMD_WRITE_IPG0, |
| 658 | AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, | 665 | AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, |
| 659 | AX88772_IPG2_DEFAULT, 0, buf)) < 0) { | 666 | AX88772_IPG2_DEFAULT, 0, buf)) < 0) { |
| 660 | dbg("Write IPG,IPG1,IPG2 failed: %d", ret); | 667 | dbg("Write IPG,IPG1,IPG2 failed: %d", ret); |
| 661 | goto out2; | 668 | goto out2; |
| 662 | } | 669 | } |
| 663 | if ((ret = | 670 | if ((ret = asix_set_hw_mii(dev)) < 0) |
| 664 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) { | ||
| 665 | dbg("Failed to set hardware MII: %02x", ret); | ||
| 666 | goto out2; | 671 | goto out2; |
| 667 | } | ||
| 668 | 672 | ||
| 669 | /* Set RX_CTL to default values with 2k buffer, and enable cactus */ | 673 | /* Set RX_CTL to default values with 2k buffer, and enable cactus */ |
| 670 | if ((ret = | 674 | if ((ret = asix_write_rx_ctl(dev, 0x0088)) < 0) |
| 671 | ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0, | ||
| 672 | buf)) < 0) { | ||
| 673 | dbg("Reset RX_CTL failed: %d", ret); | ||
| 674 | goto out2; | 675 | goto out2; |
| 675 | } | ||
| 676 | 676 | ||
| 677 | kfree(buf); | 677 | kfree(buf); |
| 678 | 678 | ||
| @@ -794,23 +794,23 @@ static int ax88772_link_reset(struct usbnet *dev) | |||
| 794 | u16 mode; | 794 | u16 mode; |
| 795 | 795 | ||
| 796 | mode = AX88772_MEDIUM_DEFAULT; | 796 | mode = AX88772_MEDIUM_DEFAULT; |
| 797 | lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); | 797 | lpa = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); |
| 798 | adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); | 798 | adv = asix_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); |
| 799 | res = mii_nway_result(lpa|adv); | 799 | res = mii_nway_result(lpa|adv); |
| 800 | 800 | ||
| 801 | if ((res & LPA_DUPLEX) == 0) | 801 | if ((res & LPA_DUPLEX) == 0) |
| 802 | mode &= ~AX88772_MEDIUM_FULL_DUPLEX; | 802 | mode &= ~AX88772_MEDIUM_FULL_DUPLEX; |
| 803 | if ((res & LPA_100) == 0) | 803 | if ((res & LPA_100) == 0) |
| 804 | mode &= ~AX88772_MEDIUM_100MB; | 804 | mode &= ~AX88772_MEDIUM_100MB; |
| 805 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | 805 | asix_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); |
| 806 | 806 | ||
| 807 | return 0; | 807 | return 0; |
| 808 | } | 808 | } |
| 809 | 809 | ||
| 810 | static const struct driver_info ax8817x_info = { | 810 | static const struct driver_info ax8817x_info = { |
| 811 | .description = "ASIX AX8817x USB 2.0 Ethernet", | 811 | .description = "ASIX AX8817x USB 2.0 Ethernet", |
| 812 | .bind = ax8817x_bind, | 812 | .bind = ax88172_bind, |
| 813 | .status = ax8817x_status, | 813 | .status = asix_status, |
| 814 | .link_reset = ax88172_link_reset, | 814 | .link_reset = ax88172_link_reset, |
| 815 | .reset = ax88172_link_reset, | 815 | .reset = ax88172_link_reset, |
| 816 | .flags = FLAG_ETHER, | 816 | .flags = FLAG_ETHER, |
| @@ -819,8 +819,8 @@ static const struct driver_info ax8817x_info = { | |||
| 819 | 819 | ||
| 820 | static const struct driver_info dlink_dub_e100_info = { | 820 | static const struct driver_info dlink_dub_e100_info = { |
| 821 | .description = "DLink DUB-E100 USB Ethernet", | 821 | .description = "DLink DUB-E100 USB Ethernet", |
| 822 | .bind = ax8817x_bind, | 822 | .bind = ax88172_bind, |
| 823 | .status = ax8817x_status, | 823 | .status = asix_status, |
| 824 | .link_reset = ax88172_link_reset, | 824 | .link_reset = ax88172_link_reset, |
| 825 | .reset = ax88172_link_reset, | 825 | .reset = ax88172_link_reset, |
| 826 | .flags = FLAG_ETHER, | 826 | .flags = FLAG_ETHER, |
| @@ -829,8 +829,8 @@ static const struct driver_info dlink_dub_e100_info = { | |||
| 829 | 829 | ||
| 830 | static const struct driver_info netgear_fa120_info = { | 830 | static const struct driver_info netgear_fa120_info = { |
| 831 | .description = "Netgear FA-120 USB Ethernet", | 831 | .description = "Netgear FA-120 USB Ethernet", |
| 832 | .bind = ax8817x_bind, | 832 | .bind = ax88172_bind, |
| 833 | .status = ax8817x_status, | 833 | .status = asix_status, |
| 834 | .link_reset = ax88172_link_reset, | 834 | .link_reset = ax88172_link_reset, |
| 835 | .reset = ax88172_link_reset, | 835 | .reset = ax88172_link_reset, |
| 836 | .flags = FLAG_ETHER, | 836 | .flags = FLAG_ETHER, |
| @@ -839,8 +839,8 @@ static const struct driver_info netgear_fa120_info = { | |||
| 839 | 839 | ||
| 840 | static const struct driver_info hawking_uf200_info = { | 840 | static const struct driver_info hawking_uf200_info = { |
| 841 | .description = "Hawking UF200 USB Ethernet", | 841 | .description = "Hawking UF200 USB Ethernet", |
| 842 | .bind = ax8817x_bind, | 842 | .bind = ax88172_bind, |
| 843 | .status = ax8817x_status, | 843 | .status = asix_status, |
| 844 | .link_reset = ax88172_link_reset, | 844 | .link_reset = ax88172_link_reset, |
| 845 | .reset = ax88172_link_reset, | 845 | .reset = ax88172_link_reset, |
| 846 | .flags = FLAG_ETHER, | 846 | .flags = FLAG_ETHER, |
| @@ -850,13 +850,12 @@ static const struct driver_info hawking_uf200_info = { | |||
| 850 | static const struct driver_info ax88772_info = { | 850 | static const struct driver_info ax88772_info = { |
| 851 | .description = "ASIX AX88772 USB 2.0 Ethernet", | 851 | .description = "ASIX AX88772 USB 2.0 Ethernet", |
| 852 | .bind = ax88772_bind, | 852 | .bind = ax88772_bind, |
| 853 | .status = ax8817x_status, | 853 | .status = asix_status, |
| 854 | .link_reset = ax88772_link_reset, | 854 | .link_reset = ax88772_link_reset, |
| 855 | .reset = ax88772_link_reset, | 855 | .reset = ax88772_link_reset, |
| 856 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, | 856 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, |
| 857 | .rx_fixup = ax88772_rx_fixup, | 857 | .rx_fixup = ax88772_rx_fixup, |
| 858 | .tx_fixup = ax88772_tx_fixup, | 858 | .tx_fixup = ax88772_tx_fixup, |
| 859 | .data = 0x00130103, | ||
| 860 | }; | 859 | }; |
| 861 | 860 | ||
| 862 | static const struct usb_device_id products [] = { | 861 | static const struct usb_device_id products [] = { |
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 5b6675684567..2deb4c01539e 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
| @@ -262,7 +262,7 @@ static int set_register(pegasus_t * pegasus, __u16 indx, __u8 data) | |||
| 262 | usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, | 262 | usb_fill_control_urb(pegasus->ctrl_urb, pegasus->usb, |
| 263 | usb_sndctrlpipe(pegasus->usb, 0), | 263 | usb_sndctrlpipe(pegasus->usb, 0), |
| 264 | (char *) &pegasus->dr, | 264 | (char *) &pegasus->dr, |
| 265 | &tmp, 1, ctrl_callback, pegasus); | 265 | tmp, 1, ctrl_callback, pegasus); |
| 266 | 266 | ||
| 267 | add_wait_queue(&pegasus->ctrl_wait, &wait); | 267 | add_wait_queue(&pegasus->ctrl_wait, &wait); |
| 268 | set_current_state(TASK_UNINTERRUPTIBLE); | 268 | set_current_state(TASK_UNINTERRUPTIBLE); |
diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c index 49991ac1bf3b..94ddfe16fdda 100644 --- a/drivers/usb/net/rndis_host.c +++ b/drivers/usb/net/rndis_host.c | |||
| @@ -39,6 +39,20 @@ | |||
| 39 | * RNDIS is NDIS remoted over USB. It's a MSFT variant of CDC ACM ... of | 39 | * RNDIS is NDIS remoted over USB. It's a MSFT variant of CDC ACM ... of |
| 40 | * course ACM was intended for modems, not Ethernet links! USB's standard | 40 | * course ACM was intended for modems, not Ethernet links! USB's standard |
| 41 | * for Ethernet links is "CDC Ethernet", which is significantly simpler. | 41 | * for Ethernet links is "CDC Ethernet", which is significantly simpler. |
| 42 | * | ||
| 43 | * NOTE that Microsoft's "RNDIS 1.0" specification is incomplete. Issues | ||
| 44 | * include: | ||
| 45 | * - Power management in particular relies on information that's scattered | ||
| 46 | * through other documentation, and which is incomplete or incorrect even | ||
| 47 | * there. | ||
| 48 | * - There are various undocumented protocol requirements, such as the | ||
| 49 | * need to send unused garbage in control-OUT messages. | ||
| 50 | * - In some cases, MS-Windows will emit undocumented requests; this | ||
| 51 | * matters more to peripheral implementations than host ones. | ||
| 52 | * | ||
| 53 | * For these reasons and others, ** USE OF RNDIS IS STRONGLY DISCOURAGED ** in | ||
| 54 | * favor of such non-proprietary alternatives as CDC Ethernet or the newer (and | ||
| 55 | * currently rare) "Ethernet Emulation Model" (EEM). | ||
| 42 | */ | 56 | */ |
| 43 | 57 | ||
| 44 | /* | 58 | /* |
| @@ -72,17 +86,17 @@ struct rndis_msg_hdr { | |||
| 72 | */ | 86 | */ |
| 73 | #define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */ | 87 | #define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */ |
| 74 | #define RNDIS_MSG_INIT ccpu2(0x00000002) | 88 | #define RNDIS_MSG_INIT ccpu2(0x00000002) |
| 75 | #define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) | 89 | #define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) |
| 76 | #define RNDIS_MSG_HALT ccpu2(0x00000003) | 90 | #define RNDIS_MSG_HALT ccpu2(0x00000003) |
| 77 | #define RNDIS_MSG_QUERY ccpu2(0x00000004) | 91 | #define RNDIS_MSG_QUERY ccpu2(0x00000004) |
| 78 | #define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) | 92 | #define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) |
| 79 | #define RNDIS_MSG_SET ccpu2(0x00000005) | 93 | #define RNDIS_MSG_SET ccpu2(0x00000005) |
| 80 | #define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) | 94 | #define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) |
| 81 | #define RNDIS_MSG_RESET ccpu2(0x00000006) | 95 | #define RNDIS_MSG_RESET ccpu2(0x00000006) |
| 82 | #define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) | 96 | #define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) |
| 83 | #define RNDIS_MSG_INDICATE ccpu2(0x00000007) | 97 | #define RNDIS_MSG_INDICATE ccpu2(0x00000007) |
| 84 | #define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008) | 98 | #define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008) |
| 85 | #define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) | 99 | #define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) |
| 86 | 100 | ||
| 87 | /* codes for "status" field of completion messages */ | 101 | /* codes for "status" field of completion messages */ |
| 88 | #define RNDIS_STATUS_SUCCESS ccpu2(0x00000000) | 102 | #define RNDIS_STATUS_SUCCESS ccpu2(0x00000000) |
| @@ -596,13 +610,13 @@ static struct usb_driver rndis_driver = { | |||
| 596 | 610 | ||
| 597 | static int __init rndis_init(void) | 611 | static int __init rndis_init(void) |
| 598 | { | 612 | { |
| 599 | return usb_register(&rndis_driver); | 613 | return usb_register(&rndis_driver); |
| 600 | } | 614 | } |
| 601 | module_init(rndis_init); | 615 | module_init(rndis_init); |
| 602 | 616 | ||
| 603 | static void __exit rndis_exit(void) | 617 | static void __exit rndis_exit(void) |
| 604 | { | 618 | { |
| 605 | usb_deregister(&rndis_driver); | 619 | usb_deregister(&rndis_driver); |
| 606 | } | 620 | } |
| 607 | module_exit(rndis_exit); | 621 | module_exit(rndis_exit); |
| 608 | 622 | ||
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 5a8a2c91c2b2..f96b73f54bf1 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
| @@ -158,6 +158,15 @@ config USB_SERIAL_FTDI_SIO | |||
| 158 | To compile this driver as a module, choose M here: the | 158 | To compile this driver as a module, choose M here: the |
| 159 | module will be called ftdi_sio. | 159 | module will be called ftdi_sio. |
| 160 | 160 | ||
| 161 | config USB_SERIAL_FUNSOFT | ||
| 162 | tristate "USB Fundamental Software Dongle Driver" | ||
| 163 | depends on USB_SERIAL | ||
| 164 | ---help--- | ||
| 165 | Say Y here if you want to use the Fundamental Software dongle. | ||
| 166 | |||
| 167 | To compile this driver as a module, choose M here: the | ||
| 168 | module will be called funsoft. | ||
| 169 | |||
| 161 | config USB_SERIAL_VISOR | 170 | config USB_SERIAL_VISOR |
| 162 | tristate "USB Handspring Visor / Palm m50x / Sony Clie Driver" | 171 | tristate "USB Handspring Visor / Palm m50x / Sony Clie Driver" |
| 163 | depends on USB_SERIAL | 172 | depends on USB_SERIAL |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index f7fe4172efed..93c21245b1af 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
| @@ -22,6 +22,7 @@ obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o | |||
| 22 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o | 22 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o |
| 23 | obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o | 23 | obj-$(CONFIG_USB_SERIAL_EMPEG) += empeg.o |
| 24 | obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o | 24 | obj-$(CONFIG_USB_SERIAL_FTDI_SIO) += ftdi_sio.o |
| 25 | obj-$(CONFIG_USB_SERIAL_FUNSOFT) += funsoft.o | ||
| 25 | obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o | 26 | obj-$(CONFIG_USB_SERIAL_GARMIN) += garmin_gps.o |
| 26 | obj-$(CONFIG_USB_SERIAL_HP4X) += hp4x.o | 27 | obj-$(CONFIG_USB_SERIAL_HP4X) += hp4x.o |
| 27 | obj-$(CONFIG_USB_SERIAL_IPAQ) += ipaq.o | 28 | obj-$(CONFIG_USB_SERIAL_IPAQ) += ipaq.o |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 167f8ec56131..8023bb7279b1 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
| @@ -54,7 +54,7 @@ static struct console usbcons; | |||
| 54 | * serial.c code, except that the specifier is "ttyUSB" instead | 54 | * serial.c code, except that the specifier is "ttyUSB" instead |
| 55 | * of "ttyS". | 55 | * of "ttyS". |
| 56 | */ | 56 | */ |
| 57 | static int __init usb_console_setup(struct console *co, char *options) | 57 | static int usb_console_setup(struct console *co, char *options) |
| 58 | { | 58 | { |
| 59 | struct usbcons_info *info = &usbcons_info; | 59 | struct usbcons_info *info = &usbcons_info; |
| 60 | int baud = 9600; | 60 | int baud = 9600; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index f3af81b4dd29..f5851db67f5b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -489,10 +489,12 @@ static struct usb_device_id id_table_combined [] = { | |||
| 489 | { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) }, | 489 | { USB_DEVICE(KOBIL_VID, KOBIL_CONV_KAAN_PID) }, |
| 490 | { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) }, | 490 | { USB_DEVICE(POSIFLEX_VID, POSIFLEX_PP7000_PID) }, |
| 491 | { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) }, | 491 | { USB_DEVICE(FTDI_VID, FTDI_TTUSB_PID) }, |
| 492 | { USB_DEVICE(FTDI_VID, FTDI_ECLO_COM_1WIRE_PID) }, | ||
| 492 | { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) }, | 493 | { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_777_PID) }, |
| 493 | { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) }, | 494 | { USB_DEVICE(FTDI_VID, FTDI_WESTREX_MODEL_8900F_PID) }, |
| 494 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, | 495 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, |
| 495 | { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) }, | 496 | { USB_DEVICE(ICOM_ID1_VID, ICOM_ID1_PID) }, |
| 497 | { USB_DEVICE(PAPOUCH_VID, PAPOUCH_TMU_PID) }, | ||
| 496 | { }, /* Optional parameter entry */ | 498 | { }, /* Optional parameter entry */ |
| 497 | { } /* Terminating entry */ | 499 | { } /* Terminating entry */ |
| 498 | }; | 500 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 8da773c2744d..2155f0e4a378 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -399,6 +399,21 @@ | |||
| 399 | #define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */ | 399 | #define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */ |
| 400 | #define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */ | 400 | #define FTDI_WESTREX_MODEL_8900F_PID 0xDC01 /* Model 8900F */ |
| 401 | 401 | ||
| 402 | /* | ||
| 403 | * Eclo (http://www.eclo.pt/) product IDs. | ||
| 404 | * PID 0xEA90 submitted by Martin Grill. | ||
| 405 | */ | ||
| 406 | #define FTDI_ECLO_COM_1WIRE_PID 0xEA90 /* COM to 1-Wire USB adaptor */ | ||
| 407 | |||
| 408 | /* | ||
| 409 | * Papouch products (http://www.papouch.com/) | ||
| 410 | * Submitted by Folkert van Heusden | ||
| 411 | */ | ||
| 412 | |||
| 413 | #define PAPOUCH_VID 0x5050 /* Vendor ID */ | ||
| 414 | #define PAPOUCH_TMU_PID 0x0400 /* TMU USB Thermometer */ | ||
| 415 | |||
| 416 | |||
| 402 | /* Commands */ | 417 | /* Commands */ |
| 403 | #define FTDI_SIO_RESET 0 /* Reset the port */ | 418 | #define FTDI_SIO_RESET 0 /* Reset the port */ |
| 404 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ | 419 | #define FTDI_SIO_MODEM_CTRL 1 /* Set the modem control register */ |
diff --git a/drivers/usb/serial/funsoft.c b/drivers/usb/serial/funsoft.c new file mode 100644 index 000000000000..803721b97e2e --- /dev/null +++ b/drivers/usb/serial/funsoft.c | |||
| @@ -0,0 +1,65 @@ | |||
| 1 | /* | ||
| 2 | * Funsoft Serial USB driver | ||
| 3 | * | ||
| 4 | * Copyright (C) 2006 Greg Kroah-Hartman <gregkh@suse.de> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License version | ||
| 8 | * 2 as published by the Free Software Foundation. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | #include <linux/tty.h> | ||
| 14 | #include <linux/module.h> | ||
| 15 | #include <linux/usb.h> | ||
| 16 | #include "usb-serial.h" | ||
| 17 | |||
| 18 | static struct usb_device_id id_table [] = { | ||
| 19 | { USB_DEVICE(0x1404, 0xcddc) }, | ||
| 20 | { }, | ||
| 21 | }; | ||
| 22 | MODULE_DEVICE_TABLE(usb, id_table); | ||
| 23 | |||
| 24 | static struct usb_driver funsoft_driver = { | ||
| 25 | .name = "funsoft", | ||
| 26 | .probe = usb_serial_probe, | ||
| 27 | .disconnect = usb_serial_disconnect, | ||
| 28 | .id_table = id_table, | ||
| 29 | .no_dynamic_id = 1, | ||
| 30 | }; | ||
| 31 | |||
| 32 | static struct usb_serial_driver funsoft_device = { | ||
| 33 | .driver = { | ||
| 34 | .owner = THIS_MODULE, | ||
| 35 | .name = "funsoft", | ||
| 36 | }, | ||
| 37 | .id_table = id_table, | ||
| 38 | .num_interrupt_in = NUM_DONT_CARE, | ||
| 39 | .num_bulk_in = NUM_DONT_CARE, | ||
| 40 | .num_bulk_out = NUM_DONT_CARE, | ||
| 41 | .num_ports = 1, | ||
| 42 | }; | ||
| 43 | |||
| 44 | static int __init funsoft_init(void) | ||
| 45 | { | ||
| 46 | int retval; | ||
| 47 | |||
| 48 | retval = usb_serial_register(&funsoft_device); | ||
| 49 | if (retval) | ||
| 50 | return retval; | ||
| 51 | retval = usb_register(&funsoft_driver); | ||
| 52 | if (retval) | ||
| 53 | usb_serial_deregister(&funsoft_device); | ||
| 54 | return retval; | ||
| 55 | } | ||
| 56 | |||
| 57 | static void __exit funsoft_exit(void) | ||
| 58 | { | ||
| 59 | usb_deregister(&funsoft_driver); | ||
| 60 | usb_serial_deregister(&funsoft_device); | ||
| 61 | } | ||
| 62 | |||
| 63 | module_init(funsoft_init); | ||
| 64 | module_exit(funsoft_exit); | ||
| 65 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index b3014fda645c..ccf746b27d4e 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -78,6 +78,7 @@ static struct usb_device_id id_table [] = { | |||
| 78 | { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) }, | 78 | { USB_DEVICE(SAGEM_VENDOR_ID, SAGEM_PRODUCT_ID) }, |
| 79 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, | 79 | { USB_DEVICE(LEADTEK_VENDOR_ID, LEADTEK_9531_PRODUCT_ID) }, |
| 80 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, | 80 | { USB_DEVICE(SPEEDDRAGON_VENDOR_ID, SPEEDDRAGON_PRODUCT_ID) }, |
| 81 | { USB_DEVICE(OTI_VENDOR_ID, OTI_PRODUCT_ID) }, | ||
| 81 | { } /* Terminating entry */ | 82 | { } /* Terminating entry */ |
| 82 | }; | 83 | }; |
| 83 | 84 | ||
diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h index 77901d143979..09f379b19e98 100644 --- a/drivers/usb/serial/pl2303.h +++ b/drivers/usb/serial/pl2303.h | |||
| @@ -79,3 +79,7 @@ | |||
| 79 | /* USB GSM cable from Speed Dragon Multimedia, Ltd */ | 79 | /* USB GSM cable from Speed Dragon Multimedia, Ltd */ |
| 80 | #define SPEEDDRAGON_VENDOR_ID 0x0e55 | 80 | #define SPEEDDRAGON_VENDOR_ID 0x0e55 |
| 81 | #define SPEEDDRAGON_PRODUCT_ID 0x110b | 81 | #define SPEEDDRAGON_PRODUCT_ID 0x110b |
| 82 | |||
| 83 | /* Ours Technology Inc DKU-5 clone, chipset: Prolific Technology Inc */ | ||
| 84 | #define OTI_VENDOR_ID 0x0ea0 | ||
| 85 | #define OTI_PRODUCT_ID 0x6858 | ||
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 097f4e8488fe..071f86a59c08 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -27,10 +27,10 @@ | |||
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/moduleparam.h> | 28 | #include <linux/moduleparam.h> |
| 29 | #include <linux/spinlock.h> | 29 | #include <linux/spinlock.h> |
| 30 | #include <linux/mutex.h> | ||
| 30 | #include <linux/list.h> | 31 | #include <linux/list.h> |
| 31 | #include <linux/smp_lock.h> | 32 | #include <linux/smp_lock.h> |
| 32 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
| 33 | #include <asm/semaphore.h> | ||
| 34 | #include <linux/usb.h> | 34 | #include <linux/usb.h> |
| 35 | #include "usb-serial.h" | 35 | #include "usb-serial.h" |
| 36 | #include "pl2303.h" | 36 | #include "pl2303.h" |
| @@ -192,7 +192,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp) | |||
| 192 | if (!port) | 192 | if (!port) |
| 193 | return -ENODEV; | 193 | return -ENODEV; |
| 194 | 194 | ||
| 195 | if (down_interruptible(&port->sem)) | 195 | if (mutex_lock_interruptible(&port->mutex)) |
| 196 | return -ERESTARTSYS; | 196 | return -ERESTARTSYS; |
| 197 | 197 | ||
| 198 | ++port->open_count; | 198 | ++port->open_count; |
| @@ -219,7 +219,7 @@ static int serial_open (struct tty_struct *tty, struct file * filp) | |||
| 219 | goto bailout_module_put; | 219 | goto bailout_module_put; |
| 220 | } | 220 | } |
| 221 | 221 | ||
| 222 | up(&port->sem); | 222 | mutex_unlock(&port->mutex); |
| 223 | return 0; | 223 | return 0; |
| 224 | 224 | ||
| 225 | bailout_module_put: | 225 | bailout_module_put: |
| @@ -227,7 +227,7 @@ bailout_module_put: | |||
| 227 | bailout_kref_put: | 227 | bailout_kref_put: |
| 228 | kref_put(&serial->kref, destroy_serial); | 228 | kref_put(&serial->kref, destroy_serial); |
| 229 | port->open_count = 0; | 229 | port->open_count = 0; |
| 230 | up(&port->sem); | 230 | mutex_unlock(&port->mutex); |
| 231 | return retval; | 231 | return retval; |
| 232 | } | 232 | } |
| 233 | 233 | ||
| @@ -240,10 +240,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp) | |||
| 240 | 240 | ||
| 241 | dbg("%s - port %d", __FUNCTION__, port->number); | 241 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 242 | 242 | ||
| 243 | down(&port->sem); | 243 | mutex_lock(&port->mutex); |
| 244 | 244 | ||
| 245 | if (port->open_count == 0) { | 245 | if (port->open_count == 0) { |
| 246 | up(&port->sem); | 246 | mutex_unlock(&port->mutex); |
| 247 | return; | 247 | return; |
| 248 | } | 248 | } |
| 249 | 249 | ||
| @@ -262,7 +262,7 @@ static void serial_close(struct tty_struct *tty, struct file * filp) | |||
| 262 | module_put(port->serial->type->driver.owner); | 262 | module_put(port->serial->type->driver.owner); |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | up(&port->sem); | 265 | mutex_unlock(&port->mutex); |
| 266 | kref_put(&port->serial->kref, destroy_serial); | 266 | kref_put(&port->serial->kref, destroy_serial); |
| 267 | } | 267 | } |
| 268 | 268 | ||
| @@ -783,7 +783,7 @@ int usb_serial_probe(struct usb_interface *interface, | |||
| 783 | port->number = i + serial->minor; | 783 | port->number = i + serial->minor; |
| 784 | port->serial = serial; | 784 | port->serial = serial; |
| 785 | spin_lock_init(&port->lock); | 785 | spin_lock_init(&port->lock); |
| 786 | sema_init(&port->sem, 1); | 786 | mutex_init(&port->mutex); |
| 787 | INIT_WORK(&port->work, usb_serial_port_softint, port); | 787 | INIT_WORK(&port->work, usb_serial_port_softint, port); |
| 788 | serial->port[i] = port; | 788 | serial->port[i] = port; |
| 789 | } | 789 | } |
diff --git a/drivers/usb/serial/usb-serial.h b/drivers/usb/serial/usb-serial.h index d7d27c3385b3..dc89d8710460 100644 --- a/drivers/usb/serial/usb-serial.h +++ b/drivers/usb/serial/usb-serial.h | |||
| @@ -16,7 +16,7 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/config.h> | 17 | #include <linux/config.h> |
| 18 | #include <linux/kref.h> | 18 | #include <linux/kref.h> |
| 19 | #include <asm/semaphore.h> | 19 | #include <linux/mutex.h> |
| 20 | 20 | ||
| 21 | #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ | 21 | #define SERIAL_TTY_MAJOR 188 /* Nice legal number now */ |
| 22 | #define SERIAL_TTY_MINORS 255 /* loads of devices :) */ | 22 | #define SERIAL_TTY_MINORS 255 /* loads of devices :) */ |
| @@ -31,7 +31,7 @@ | |||
| 31 | * @serial: pointer back to the struct usb_serial owner of this port. | 31 | * @serial: pointer back to the struct usb_serial owner of this port. |
| 32 | * @tty: pointer to the corresponding tty for this port. | 32 | * @tty: pointer to the corresponding tty for this port. |
| 33 | * @lock: spinlock to grab when updating portions of this structure. | 33 | * @lock: spinlock to grab when updating portions of this structure. |
| 34 | * @sem: semaphore used to synchronize serial_open() and serial_close() | 34 | * @mutex: mutex used to synchronize serial_open() and serial_close() |
| 35 | * access for this port. | 35 | * access for this port. |
| 36 | * @number: the number of the port (the minor number). | 36 | * @number: the number of the port (the minor number). |
| 37 | * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. | 37 | * @interrupt_in_buffer: pointer to the interrupt in buffer for this port. |
| @@ -63,7 +63,7 @@ struct usb_serial_port { | |||
| 63 | struct usb_serial * serial; | 63 | struct usb_serial * serial; |
| 64 | struct tty_struct * tty; | 64 | struct tty_struct * tty; |
| 65 | spinlock_t lock; | 65 | spinlock_t lock; |
| 66 | struct semaphore sem; | 66 | struct mutex mutex; |
| 67 | unsigned char number; | 67 | unsigned char number; |
| 68 | 68 | ||
| 69 | unsigned char * interrupt_in_buffer; | 69 | unsigned char * interrupt_in_buffer; |
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig index 92be101feba7..be9eec225743 100644 --- a/drivers/usb/storage/Kconfig +++ b/drivers/usb/storage/Kconfig | |||
| @@ -48,7 +48,8 @@ config USB_STORAGE_FREECOM | |||
| 48 | 48 | ||
| 49 | config USB_STORAGE_ISD200 | 49 | config USB_STORAGE_ISD200 |
| 50 | bool "ISD-200 USB/ATA Bridge support" | 50 | bool "ISD-200 USB/ATA Bridge support" |
| 51 | depends on USB_STORAGE && BLK_DEV_IDE | 51 | depends on USB_STORAGE |
| 52 | depends on BLK_DEV_IDE=y || BLK_DEV_IDE=USB_STORAGE | ||
| 52 | ---help--- | 53 | ---help--- |
| 53 | Say Y here if you want to use USB Mass Store devices based | 54 | Say Y here if you want to use USB Mass Store devices based |
| 54 | on the In-Systems Design ISD-200 USB/ATA bridge. | 55 | on the In-Systems Design ISD-200 USB/ATA bridge. |
