diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-04-18 05:39:23 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-04-18 05:39:23 -0400 |
commit | 9e73972cef1c0961c78b0e0b61c4ecc275b29f04 (patch) | |
tree | 27907bbd653504d71ff47cb00bdf8cd61e82f126 /drivers | |
parent | a890b15c0990cc8d686edcc85f5fccde71ad5ce9 (diff) | |
parent | 4741c336d27dec3ea68a35659abb8dc82b142388 (diff) |
Merge branch 'upstream'
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. |