Commit fc4cbd755b75c7687b923da5b75ba4a64652582e
Committed by
Greg Kroah-Hartman
1 parent
dd4dd19e8d
Exists in
master
and in
7 other branches
USB: io_ti: Digi EdgePort update for new devices
This patch adds support for the most recent Digi EdgePort USB serial devices. Signed-off-by: Martin K. Petersen <mkp@mkp.net> Signed-off-by: Mike Swift <mikes@digi.com> Signed-off-by: Jeremy McBane <jmcbane@digi.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 3 changed files with 807 additions and 732 deletions Inline Diff
drivers/usb/serial/io_fw_down3.h
1 | //************************************************************** | 1 | //************************************************************** |
2 | //* Edgeport Binary Image (for TI based products) | 2 | //* Edgeport Binary Image (for TI based products) |
3 | //* Generated by TIBin2C v2.00 (watchport) | 3 | //* Generated by TIBin2C v2.00 (watchport) |
4 | //* Copyright (C) 2001 Inside Out Networks, All rights reserved. | 4 | //* Copyright (C) 2001 Inside Out Networks, All rights reserved. |
5 | //************************************************************** | 5 | //************************************************************** |
6 | 6 | ||
7 | 7 | ||
8 | static int IMAGE_SIZE = 12749; | 8 | static int IMAGE_SIZE = 12938; |
9 | 9 | ||
10 | struct EDGE_FIRMWARE_VERSION_INFO | 10 | struct EDGE_FIRMWARE_VERSION_INFO |
11 | { | 11 | { |
12 | unsigned char MajorVersion; | 12 | unsigned char MajorVersion; |
13 | unsigned char MinorVersion; | 13 | unsigned char MinorVersion; |
14 | unsigned short BuildNumber; | 14 | unsigned short BuildNumber; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | static struct EDGE_FIRMWARE_VERSION_INFO IMAGE_VERSION_NAME = | 17 | static struct EDGE_FIRMWARE_VERSION_INFO IMAGE_VERSION_NAME = |
18 | { | 18 | { |
19 | 4, 10, 0 // Major, Minor, Build | 19 | 4, 80, 0 // Major, Minor, Build |
20 | 20 | ||
21 | }; | 21 | }; |
22 | 22 | ||
23 | static unsigned char IMAGE_ARRAY_NAME[] = | 23 | static unsigned char IMAGE_ARRAY_NAME[] = |
24 | { | 24 | { |
25 | // struct ImageHdr | 25 | // struct ImageHdr |
26 | // { | 26 | // { |
27 | // WORD Length; | 27 | // WORD Length; |
28 | // BYTE CheckSum; | 28 | // BYTE CheckSum; |
29 | // }; | 29 | // }; |
30 | 0xca, 0x31, | 30 | 0x87, 0x32, |
31 | 0xa8, | 31 | 0x9a, |
32 | 32 | ||
33 | 0x02, 0x26, 0xfe, 0x02, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00, | 33 | 0x02, 0x27, 0xbf, 0x02, 0x21, 0xb2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x1e, 0x00, 0x00, |
34 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1a, 0x85, 0x3f, | 34 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, 0x1a, 0x85, 0x3f, |
35 | 0x8c, 0x85, 0x40, 0x8a, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, | 35 | 0x8c, 0x85, 0x40, 0x8a, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, |
36 | 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3e, | 36 | 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xe5, 0x3e, |
37 | 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x2b, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0xa6, 0x81, 0xe5, 0x3e, 0x75, | 37 | 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x2b, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0xa6, 0x81, 0xe5, 0x3e, 0x75, |
38 | 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0x78, 0x8c, 0xe5, 0x81, | 38 | 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0x78, 0x8c, 0xe5, 0x81, |
39 | 0x04, 0xc3, 0x98, 0xf9, 0x94, 0x22, 0x40, 0x03, 0x02, 0x11, 0x94, 0xe6, 0xf0, 0x08, 0xa3, 0xd9, | 39 | 0x04, 0xc3, 0x98, 0xf9, 0x94, 0x22, 0x40, 0x03, 0x02, 0x11, 0xdc, 0xe6, 0xf0, 0x08, 0xa3, 0xd9, |
40 | 0xfa, 0x74, 0x08, 0x25, 0x3e, 0xf8, 0x05, 0x3e, 0x08, 0xe6, 0x54, 0x80, 0x70, 0x0c, 0xe5, 0x3e, | 40 | 0xfa, 0x74, 0x08, 0x25, 0x3e, 0xf8, 0x05, 0x3e, 0x08, 0xe6, 0x54, 0x80, 0x70, 0x0c, 0xe5, 0x3e, |
41 | 0xb4, 0x07, 0xf3, 0x78, 0x08, 0x75, 0x3e, 0x00, 0x80, 0xef, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0x86, | 41 | 0xb4, 0x07, 0xf3, 0x78, 0x08, 0x75, 0x3e, 0x00, 0x80, 0xef, 0xe5, 0x3e, 0x24, 0x10, 0xf8, 0x86, |
42 | 0x81, 0xe5, 0x3e, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, | 42 | 0x81, 0xe5, 0x3e, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, |
43 | 0x78, 0x8c, 0xe5, 0x81, 0x04, 0xc3, 0x98, 0xf9, 0xe0, 0xf6, 0x08, 0xa3, 0xd9, 0xfa, 0xd0, 0x07, | 43 | 0x78, 0x8c, 0xe5, 0x81, 0x04, 0xc3, 0x98, 0xf9, 0xe0, 0xf6, 0x08, 0xa3, 0xd9, 0xfa, 0xd0, 0x07, |
44 | 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, | 44 | 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, |
45 | 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x30, 0x01, 0x4d, 0x30, 0xb4, 0x48, 0x10, | 45 | 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x30, 0x01, 0x4d, 0x30, 0xb4, 0x48, 0x10, |
46 | 0x00, 0x45, 0x90, 0xff, 0x08, 0xe0, 0x54, 0x20, 0xf8, 0x90, 0xff, 0x48, 0xe0, 0x54, 0x20, 0xf9, | 46 | 0x00, 0x45, 0x90, 0xff, 0x08, 0xe0, 0x54, 0x20, 0xf8, 0x90, 0xff, 0x48, 0xe0, 0x54, 0x20, 0xf9, |
47 | 0x90, 0xff, 0x10, 0xe0, 0x54, 0x20, 0xfa, 0x90, 0xff, 0x50, 0xe0, 0x54, 0x20, 0xfb, 0x74, 0x00, | 47 | 0x90, 0xff, 0x10, 0xe0, 0x54, 0x20, 0xfa, 0x90, 0xff, 0x50, 0xe0, 0x54, 0x20, 0xfb, 0x74, 0x00, |
48 | 0xf5, 0x82, 0x74, 0xf8, 0xf5, 0x83, 0xe0, 0xc8, 0xf0, 0x68, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, | 48 | 0xf5, 0x82, 0x74, 0xf8, 0xf5, 0x83, 0xe0, 0xc8, 0xf0, 0x68, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, |
49 | 0xc9, 0xf0, 0x69, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 0xca, 0xf0, 0x6a, 0x60, 0x02, 0x7e, 0x04, | 49 | 0xc9, 0xf0, 0x69, 0x60, 0x02, 0x7e, 0x04, 0xa3, 0xe0, 0xca, 0xf0, 0x6a, 0x60, 0x02, 0x7e, 0x04, |
50 | 0xa3, 0xe0, 0xcb, 0xf0, 0x6b, 0x60, 0x02, 0x7e, 0x04, 0x22, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, | 50 | 0xa3, 0xe0, 0xcb, 0xf0, 0x6b, 0x60, 0x02, 0x7e, 0x04, 0x22, 0xc0, 0xe0, 0xc0, 0xd0, 0xc0, 0xf0, |
51 | 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, | 51 | 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, |
52 | 0xc0, 0x06, 0xc0, 0x07, 0x90, 0xff, 0x93, 0x74, 0x01, 0xf0, 0xe5, 0x81, 0x94, 0xfd, 0x40, 0x03, | 52 | 0xc0, 0x06, 0xc0, 0x07, 0x74, 0x15, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x60, 0x23, 0x74, |
53 | 0x02, 0x11, 0x94, 0x85, 0x41, 0x8d, 0x85, 0x42, 0x8b, 0x74, 0xaf, 0xf5, 0x82, 0x74, 0xfa, 0xf5, | 53 | 0x66, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x14, 0xf0, 0x70, 0x16, 0x74, 0xff, 0xf0, 0x74, |
54 | 0x83, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x4a, 0xe0, 0x30, 0xe7, 0x2c, | 54 | 0x1c, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x60, 0x04, 0x14, 0xf0, 0x70, 0x04, 0xc2, 0x90, |
55 | 0x90, 0xff, 0x4e, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x20, | 55 | 0x80, 0xfc, 0x90, 0xff, 0x93, 0x74, 0x81, 0xf0, 0xe5, 0x81, 0x94, 0xfd, 0x40, 0x03, 0x02, 0x11, |
56 | 0xb4, 0x02, 0x1d, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27, | 56 | 0xdc, 0x85, 0x41, 0x8d, 0x85, 0x42, 0x8b, 0x74, 0xb2, 0xf5, 0x82, 0x74, 0xfa, 0xf5, 0x83, 0xe0, |
57 | 0x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xd0, 0x83, 0xd0, 0x82, | 57 | 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x4a, 0xe0, 0x30, 0xe7, 0x2c, 0x90, 0xff, |
58 | 0xa3, 0xe0, 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x52, 0xe0, 0x30, 0xe7, 0x2c, | 58 | 0x4e, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x20, 0xb4, 0x02, |
59 | 0x90, 0xff, 0x56, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x25, | 59 | 0x1d, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x28, 0x4e, 0x80, |
60 | 0xb4, 0x02, 0x22, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x27, | 60 | 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x04, 0xd0, 0x83, 0xd0, 0x82, 0xa3, 0xe0, |
61 | 0x8d, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, | 61 | 0xb4, 0x01, 0x1b, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x52, 0xe0, 0x30, 0xe7, 0x2c, 0x90, 0xff, |
62 | 0x80, 0x03, 0x02, 0x02, 0x62, 0x74, 0x15, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x20, 0x04, | 62 | 0x56, 0xe0, 0x30, 0xe7, 0x25, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x02, 0xf0, 0x80, 0x25, 0xb4, 0x02, |
63 | 0xf1, 0x20, 0x02, 0x03, 0x30, 0x01, 0xeb, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, | 63 | 0x22, 0xc0, 0x82, 0xc0, 0x83, 0x90, 0xff, 0x7a, 0xe0, 0x30, 0xe7, 0x05, 0x12, 0x28, 0x4e, 0x80, |
64 | 0x14, 0xfc, 0xf0, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0x64, 0x04, 0x70, 0x0f, 0xec, 0x70, 0x62, | 64 | 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x74, 0x03, 0xf0, 0x80, 0x09, 0xd0, 0x83, 0xd0, 0x82, 0x80, 0x03, |
65 | 0x7e, 0x01, 0x12, 0x00, 0xc9, 0x7c, 0x0a, 0x7d, 0xfa, 0x02, 0x02, 0x33, 0x12, 0x00, 0xc9, 0xee, | 65 | 0x02, 0x02, 0x90, 0x74, 0x16, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x20, 0x04, 0xf1, 0x20, |
66 | 0x64, 0x04, 0x60, 0x1d, 0xec, 0x70, 0x4b, 0x7c, 0x0a, 0xed, 0x14, 0xfd, 0x70, 0x15, 0xee, 0x64, | 66 | 0x02, 0x03, 0x30, 0x01, 0xeb, 0x74, 0x19, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xe0, 0x14, 0xfc, |
67 | 0x02, 0x60, 0x07, 0x7e, 0x02, 0x7d, 0x32, 0x02, 0x02, 0x33, 0x7e, 0x01, 0x7d, 0xfa, 0x02, 0x02, | 67 | 0xf0, 0xa3, 0xe0, 0xfd, 0xa3, 0xe0, 0xfe, 0x64, 0x04, 0x70, 0x0f, 0xec, 0x70, 0x62, 0x7e, 0x01, |
68 | 0x33, 0x7c, 0x0a, 0x74, 0x18, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, | 68 | 0x12, 0x00, 0xc9, 0x7c, 0x0a, 0x7d, 0xfa, 0x02, 0x02, 0x61, 0x12, 0x00, 0xc9, 0xee, 0x64, 0x04, |
69 | 0xa3, 0xee, 0xf0, 0x14, 0x60, 0x18, 0x20, 0xe1, 0x0f, 0x20, 0x01, 0x06, 0xd2, 0xb1, 0xc2, 0xb0, | 69 | 0x60, 0x1d, 0xec, 0x70, 0x4b, 0x7c, 0x0a, 0xed, 0x14, 0xfd, 0x70, 0x15, 0xee, 0x64, 0x02, 0x60, |
70 | 0x80, 0x10, 0xc2, 0xb1, 0xd2, 0xb0, 0x80, 0x0a, 0xc2, 0xb1, 0xc2, 0xb0, 0x80, 0x04, 0xd2, 0xb0, | 70 | 0x07, 0x7e, 0x02, 0x7d, 0x32, 0x02, 0x02, 0x61, 0x7e, 0x01, 0x7d, 0xfa, 0x02, 0x02, 0x61, 0x7c, |
71 | 0xd2, 0xb1, 0x78, 0x19, 0x79, 0x09, 0x7a, 0x07, 0xe7, 0x70, 0x04, 0xa6, 0x00, 0x80, 0x0b, 0xe6, | 71 | 0x0a, 0x74, 0x19, 0xf5, 0x82, 0x74, 0xf9, 0xf5, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, 0xa3, 0xee, |
72 | 0x60, 0x08, 0x16, 0xe6, 0x70, 0x04, 0xe7, 0x44, 0x80, 0xf7, 0x08, 0x09, 0xda, 0xea, 0xe5, 0x3d, | 72 | 0xf0, 0x14, 0x60, 0x18, 0x20, 0xe1, 0x0f, 0x20, 0x01, 0x06, 0xd2, 0xb1, 0xc2, 0xb0, 0x80, 0x10, |
73 | 0x60, 0x13, 0x14, 0xf5, 0x3d, 0x70, 0x0e, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, | 73 | 0xc2, 0xb1, 0xd2, 0xb0, 0x80, 0x0a, 0xc2, 0xb1, 0xc2, 0xb0, 0x80, 0x04, 0xd2, 0xb0, 0xd2, 0xb1, |
74 | 0x0f, 0xd2, 0x8c, 0xd2, 0x8d, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, | 74 | 0x78, 0x19, 0x79, 0x09, 0x7a, 0x07, 0xe7, 0x70, 0x04, 0xa6, 0x00, 0x80, 0x0b, 0xe6, 0x60, 0x08, |
75 | 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, | 75 | 0x16, 0xe6, 0x70, 0x04, 0xe7, 0x44, 0x80, 0xf7, 0x08, 0x09, 0xda, 0xea, 0xe5, 0x3d, 0x60, 0x13, |
76 | 0x90, 0xff, 0x04, 0xe0, 0x90, 0xfa, 0xb6, 0xf0, 0x90, 0xff, 0x06, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, | 76 | 0x14, 0xf5, 0x3d, 0x70, 0x0e, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0x57, 0xd2, |
77 | 0xec, 0xff, 0xea, 0xfe, 0xef, 0xc3, 0x94, 0x08, 0xee, 0x94, 0x01, 0x50, 0x02, 0x80, 0x04, 0x7e, | 77 | 0x8c, 0xd2, 0x8d, 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, |
78 | 0x01, 0x7f, 0x08, 0x8e, 0x3b, 0x8f, 0x3c, 0x90, 0xff, 0x02, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, | 78 | 0x01, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0xd0, 0xd0, 0xd0, 0xe0, 0x32, 0x90, 0xff, |
79 | 0xff, 0xea, 0x90, 0xfa, 0xba, 0xf0, 0xef, 0xa3, 0xf0, 0x12, 0x1c, 0x30, 0xe4, 0xf5, 0x4d, 0xe5, | 79 | 0x04, 0xe0, 0x90, 0xfa, 0xb9, 0xf0, 0x90, 0xff, 0x06, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, 0xff, |
80 | 0x4d, 0xc3, 0x94, 0x02, 0x50, 0x0f, 0x12, 0x1c, 0x11, 0xe4, 0x12, 0x1a, 0x38, 0x05, 0x4d, 0x04, | 80 | 0xea, 0xfe, 0xef, 0xc3, 0x94, 0x08, 0xee, 0x94, 0x01, 0x50, 0x02, 0x80, 0x04, 0x7e, 0x01, 0x7f, |
81 | 0x12, 0x1c, 0x02, 0x80, 0xea, 0x12, 0x1c, 0x30, 0x90, 0xff, 0x00, 0xe0, 0xff, 0x54, 0x60, 0x24, | 81 | 0x08, 0x8e, 0x3b, 0x8f, 0x3c, 0x90, 0xff, 0x02, 0xe0, 0xfc, 0xa3, 0xe0, 0xfa, 0xec, 0xff, 0xea, |
82 | 0xc0, 0x70, 0x03, 0x02, 0x08, 0xc5, 0x24, 0x40, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, | 82 | 0x90, 0xfa, 0xbd, 0xf0, 0xef, 0xa3, 0xf0, 0x12, 0x1c, 0xe0, 0xe4, 0xf5, 0x4d, 0xe5, 0x4d, 0xc3, |
83 | 0xe0, 0xfe, 0x54, 0x0f, 0xf5, 0x4d, 0xee, 0x30, 0xe7, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0a, | 83 | 0x94, 0x02, 0x50, 0x0f, 0x12, 0x1c, 0xc1, 0xe4, 0x12, 0x1a, 0xe8, 0x05, 0x4d, 0x04, 0x12, 0x1c, |
84 | 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 0x4c, 0x03, 0x56, 0x00, 0x04, 0x29, 0x01, 0x05, 0x3c, 0x03, | 84 | 0xb2, 0x80, 0xea, 0x12, 0x1c, 0xe0, 0x90, 0xff, 0x00, 0xe0, 0xff, 0x54, 0x60, 0x24, 0xc0, 0x70, |
85 | 0x06, 0x03, 0x05, 0x06, 0x45, 0x06, 0x07, 0xa7, 0x08, 0x07, 0xef, 0x09, 0x08, 0x4b, 0x0a, 0x08, | 85 | 0x03, 0x02, 0x08, 0xf3, 0x24, 0x40, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xfe, |
86 | 0x8b, 0x0b, 0x00, 0x00, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, | 86 | 0x54, 0x0f, 0xf5, 0x4d, 0xee, 0x30, 0xe7, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x0a, 0x90, 0xff, |
87 | 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x02, 0x45, | 87 | 0x01, 0xe0, 0x12, 0x1b, 0xfc, 0x03, 0x84, 0x00, 0x04, 0x57, 0x01, 0x05, 0x6a, 0x03, 0x06, 0x31, |
88 | 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xef, 0x54, 0x1f, 0x14, 0x60, 0x2b, 0x14, 0x60, 0x47, 0x24, | 88 | 0x05, 0x06, 0x73, 0x06, 0x07, 0xd5, 0x08, 0x08, 0x1d, 0x09, 0x08, 0x79, 0x0a, 0x08, 0xb9, 0x0b, |
89 | 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xee, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x11, 0x74, | 89 | 0x00, 0x00, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, |
90 | 0x01, 0x12, 0x1a, 0x38, 0x78, 0x67, 0xe6, 0x30, 0xe0, 0x08, 0x12, 0x1c, 0x11, 0x74, 0x02, 0x12, | 90 | 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x64, 0x02, 0x45, 0x3b, 0x60, |
91 | 0x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x09, 0x90, 0xfa, 0xb6, 0xe0, | 91 | 0x03, 0x02, 0x0f, 0x6e, 0xef, 0x54, 0x1f, 0x14, 0x60, 0x2b, 0x14, 0x60, 0x47, 0x24, 0x02, 0x60, |
92 | 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xd3, 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, | 92 | 0x03, 0x02, 0x0f, 0x6e, 0xee, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1c, 0xc1, 0x74, 0x01, 0x12, |
93 | 0x26, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe1, 0x0e, 0x90, 0xfa, 0xb6, 0xe0, 0xff, | 93 | 0x1a, 0xe8, 0x78, 0x67, 0xe6, 0x30, 0xe0, 0x08, 0x12, 0x1c, 0xc1, 0x74, 0x02, 0x12, 0x1a, 0xe8, |
94 | 0x60, 0x07, 0x64, 0x80, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f, | 94 | 0x7f, 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x09, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, |
95 | 0x26, 0xe5, 0x4d, 0x70, 0x19, 0x30, 0x0a, 0x0b, 0x90, 0xff, 0x80, 0x12, 0x1c, 0x0e, 0x12, 0x1a, | 95 | 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xd3, 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x7f, |
96 | 0x38, 0x80, 0x24, 0x90, 0xff, 0x82, 0x12, 0x1c, 0x0e, 0x12, 0x1a, 0x38, 0x80, 0x19, 0x15, 0x4d, | 96 | 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x0e, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x60, 0x07, |
97 | 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x80, 0x09, 0x12, 0x1c, | 97 | 0x64, 0x80, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0xfa, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe5, |
98 | 0xb3, 0x12, 0x1c, 0x0c, 0x12, 0x1a, 0x38, 0x12, 0x1c, 0x11, 0x12, 0x19, 0xf2, 0x60, 0x05, 0x74, | 98 | 0x4d, 0x70, 0x19, 0x30, 0x0a, 0x0b, 0x90, 0xff, 0x80, 0x12, 0x1c, 0xbe, 0x12, 0x1a, 0xe8, 0x80, |
99 | 0x01, 0x12, 0x1a, 0x38, 0x7f, 0x02, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, | 99 | 0x24, 0x90, 0xff, 0x82, 0x12, 0x1c, 0xbe, 0x12, 0x1a, 0xe8, 0x80, 0x19, 0x15, 0x4d, 0x30, 0x0a, |
100 | 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x14, 0x60, 0x2d, | 100 | 0x0b, 0x12, 0x1d, 0x55, 0x12, 0x1c, 0xbc, 0x12, 0x1a, 0xe8, 0x80, 0x09, 0x12, 0x1d, 0x63, 0x12, |
101 | 0x14, 0x60, 0x59, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x04, | 101 | 0x1c, 0xbc, 0x12, 0x1a, 0xe8, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xa2, 0x60, 0x05, 0x74, 0x01, 0x12, |
102 | 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, | 102 | 0x1a, 0xe8, 0x7f, 0x02, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, |
103 | 0x0f, 0x26, 0x78, 0x67, 0xe6, 0x54, 0xfe, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, | 103 | 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x14, 0x60, 0x2d, 0x14, 0x60, |
104 | 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x09, 0x90, 0xfa, 0xb6, | 104 | 0x59, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x04, 0xa3, 0xe0, |
105 | 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0c, 0x90, 0xfa, 0xb6, 0xe0, 0xd3, | 105 | 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, |
106 | 0x94, 0x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0, | 106 | 0x78, 0x67, 0xe6, 0x54, 0xfe, 0xf6, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x06, |
107 | 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0xb2, 0x40, 0x03, 0x02, 0x0f, | 107 | 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x09, 0x90, 0xfa, 0xb9, 0xe0, 0x60, |
108 | 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, | 108 | 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x0c, 0x90, 0xfa, 0xb9, 0xe0, 0xd3, 0x94, 0x01, |
109 | 0x07, 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x4d, 0x70, 0x0f, 0x90, 0xff, 0x82, 0xe0, | 109 | 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, |
110 | 0x54, 0xf7, 0xf0, 0x90, 0xff, 0x80, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0xe5, 0x4d, 0x24, 0xfe, 0x60, | 110 | 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0xfa, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0xe5, |
111 | 0x20, 0x24, 0xfb, 0x60, 0x34, 0x24, 0x06, 0x70, 0x35, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, | 111 | 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x07, 0xe5, |
112 | 0xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80, 0x26, 0xe4, 0xfd, 0x7f, 0x03, 0x12, 0x2d, 0xa8, 0x80, | 112 | 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x4d, 0x70, 0x0f, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, |
113 | 0x1d, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x0e, | 113 | 0xf0, 0x90, 0xff, 0x80, 0xe0, 0x54, 0xf7, 0xf0, 0x22, 0xe5, 0x4d, 0x24, 0xfe, 0x60, 0x20, 0x24, |
114 | 0xe4, 0xfd, 0x7f, 0x04, 0x12, 0x2d, 0xa8, 0x80, 0x05, 0x7f, 0x87, 0x12, 0x31, 0x32, 0x15, 0x4d, | 114 | 0xfb, 0x60, 0x34, 0x24, 0x06, 0x70, 0x35, 0x30, 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, |
115 | 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x09, 0x12, 0x1c, | 115 | 0x03, 0x12, 0x2e, 0x79, 0x80, 0x26, 0xe4, 0xfd, 0x7f, 0x03, 0x12, 0x2e, 0x79, 0x80, 0x1d, 0x30, |
116 | 0xb3, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, | 116 | 0x0a, 0x0c, 0xa2, 0x0a, 0xe4, 0x33, 0xfd, 0x7f, 0x04, 0x12, 0x2e, 0x79, 0x80, 0x0e, 0xe4, 0xfd, |
117 | 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, | 117 | 0x7f, 0x04, 0x12, 0x2e, 0x79, 0x80, 0x05, 0x7f, 0x87, 0x12, 0x31, 0xef, 0x15, 0x4d, 0x30, 0x0a, |
118 | 0x14, 0x60, 0x2d, 0x14, 0x60, 0x55, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, | 118 | 0x0b, 0x12, 0x1d, 0x55, 0xf5, 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0x80, 0x09, 0x12, 0x1d, 0x63, 0xf5, |
119 | 0xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, | 119 | 0x83, 0xe0, 0x54, 0xf7, 0xf0, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, |
120 | 0x60, 0x03, 0x02, 0x0f, 0x26, 0x78, 0x67, 0xe6, 0x44, 0x01, 0xf6, 0xe4, 0xff, 0x02, 0x31, 0xb1, | 120 | 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x14, 0x60, |
121 | 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe0, 0x07, | 121 | 0x2d, 0x14, 0x60, 0x55, 0x24, 0x02, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, |
122 | 0xe5, 0x4d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x0a, 0xe5, 0x4d, 0xd3, 0x94, | 122 | 0x04, 0xa3, 0xe0, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, |
123 | 0x01, 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xfa, 0xba, 0xe0, 0x70, | 123 | 0x02, 0x0f, 0x6e, 0x78, 0x67, 0xe6, 0x44, 0x01, 0xf6, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, |
124 | 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x12, 0x31, 0x82, | 124 | 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe0, 0x07, 0xe5, 0x4d, |
125 | 0x40, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x26, | 125 | 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x0a, 0xe5, 0x4d, 0xd3, 0x94, 0x01, 0x40, |
126 | 0xe5, 0x4d, 0x70, 0x09, 0x30, 0x0a, 0x03, 0x02, 0x1d, 0x64, 0x02, 0x1d, 0x2f, 0xe5, 0x35, 0x20, | 126 | 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3, |
127 | 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x15, 0x4d, 0x30, 0x0a, 0x0b, 0x12, 0x1c, 0xa5, 0xf5, 0x83, 0xe0, | 127 | 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x12, 0x32, 0x3f, 0x40, 0x03, |
128 | 0x44, 0x08, 0xf0, 0x80, 0x09, 0x12, 0x1c, 0xb3, 0xf5, 0x83, 0xe0, 0x44, 0x08, 0xf0, 0xe4, 0xff, | 128 | 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x06, 0x20, 0xe0, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x4d, |
129 | 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, | 129 | 0x70, 0x09, 0x30, 0x0a, 0x03, 0x02, 0x1e, 0x14, 0x02, 0x1d, 0xdf, 0xe5, 0x35, 0x20, 0xe1, 0x03, |
130 | 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, | 130 | 0x02, 0x0f, 0x6e, 0x15, 0x4d, 0x30, 0x0a, 0x0b, 0x12, 0x1d, 0x55, 0xf5, 0x83, 0xe0, 0x44, 0x08, |
131 | 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x30, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xbb, | 131 | 0xf0, 0x80, 0x09, 0x12, 0x1d, 0x63, 0xf5, 0x83, 0xe0, 0x44, 0x08, 0xf0, 0xe4, 0xff, 0x02, 0x32, |
132 | 0xe0, 0x90, 0xff, 0xff, 0xf0, 0xe0, 0x60, 0x05, 0x43, 0x35, 0x01, 0x80, 0x03, 0x53, 0x35, 0xfe, | 132 | 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, |
133 | 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, | 133 | 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03, |
134 | 0x3b, 0x70, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, | 134 | 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x30, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbe, 0xe0, 0x90, |
135 | 0xba, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0x24, 0xfe, 0x60, 0x3a, 0x14, 0x60, 0x75, 0x24, 0x02, | 135 | 0xff, 0xff, 0xf0, 0xe0, 0x60, 0x05, 0x43, 0x35, 0x01, 0x80, 0x03, 0x53, 0x35, 0xfe, 0xe4, 0xff, |
136 | 0x60, 0x03, 0x02, 0x0f, 0x26, 0xed, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0x30, 0x12, 0x1d, | 136 | 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x70, |
137 | 0x5d, 0x7d, 0x03, 0x12, 0x0f, 0x6d, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa, | 137 | 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, |
138 | 0xb3, 0xe0, 0xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, | 138 | 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0x24, 0xfe, 0x60, 0x3a, 0x14, 0x60, 0x75, 0x24, 0x02, 0x60, 0x03, |
139 | 0xaf, 0x3c, 0x02, 0x0f, 0xba, 0x12, 0x1c, 0x30, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x0d, 0x12, | 139 | 0x02, 0x0f, 0x6e, 0xed, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1c, 0xe0, 0x12, 0x1e, 0x0d, 0x7d, |
140 | 0x1d, 0x5d, 0x7d, 0x14, 0x12, 0x0f, 0x6d, 0x60, 0x10, 0x02, 0x0f, 0x26, 0x12, 0x1d, 0x5d, 0x7d, | 140 | 0x03, 0x12, 0x0f, 0xb5, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0x72, 0x90, 0xfa, 0xb6, 0xe0, |
141 | 0x04, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x0f, 0x2a, 0x90, 0xfa, 0xb3, 0xe0, | 141 | 0xfd, 0xa3, 0x12, 0x1d, 0x2b, 0x12, 0x0f, 0xd1, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, |
142 | 0xfd, 0xa3, 0x12, 0x1c, 0x7b, 0x12, 0x0f, 0x89, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, | 142 | 0x02, 0x10, 0x02, 0x12, 0x1c, 0xe0, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe4, 0x0d, 0x12, 0x1e, 0x0d, |
143 | 0x02, 0x0f, 0xba, 0x12, 0x1d, 0x5d, 0x7d, 0x05, 0x12, 0x0f, 0xc1, 0x60, 0x03, 0x02, 0x0f, 0x26, | 143 | 0x7d, 0x14, 0x12, 0x0f, 0xb5, 0x60, 0x10, 0x02, 0x0f, 0x6e, 0x12, 0x1e, 0x0d, 0x7d, 0x04, 0x12, |
144 | 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3, 0x12, 0x1c, 0x78, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, | 144 | 0x10, 0x09, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x0f, 0x72, 0x90, 0xfa, 0xb6, 0xe0, 0xfd, 0xa3, |
145 | 0xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb2, 0xf0, | 145 | 0x12, 0x1d, 0x2b, 0x12, 0x0f, 0xd1, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x02, 0x10, |
146 | 0xe4, 0xf5, 0x4c, 0x90, 0xfa, 0xb2, 0xe0, 0xff, 0xe5, 0x4c, 0xc3, 0x9f, 0x50, 0x24, 0x12, 0x1c, | 146 | 0x02, 0x12, 0x1e, 0x0d, 0x7d, 0x05, 0x12, 0x10, 0x09, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x7b, 0x01, |
147 | 0x72, 0x12, 0x0f, 0xcc, 0xff, 0xfd, 0x90, 0xfa, 0xb4, 0xe4, 0x8d, 0xf0, 0x12, 0x1a, 0x6c, 0x90, | 147 | 0x7a, 0xfa, 0x79, 0xb6, 0x12, 0x1d, 0x28, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb7, 0xe4, |
148 | 0xfa, 0xb3, 0xe0, 0xc3, 0x9f, 0xf0, 0xd3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x0f, 0x26, 0x05, 0x4c, | 148 | 0x75, 0xf0, 0x03, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xbe, 0xe0, 0x90, 0xfa, 0xb5, 0xf0, 0xe4, 0xf5, |
149 | 0x80, 0xd1, 0x12, 0x1c, 0x72, 0x12, 0x0f, 0xcc, 0x24, 0xfe, 0xff, 0x90, 0xfa, 0xb3, 0xf0, 0xfd, | 149 | 0x4c, 0x90, 0xfa, 0xb5, 0xe0, 0xff, 0xe5, 0x4c, 0xc3, 0x9f, 0x50, 0x24, 0x12, 0x1d, 0x22, 0x12, |
150 | 0xa3, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0x7a, 0xf9, 0x79, 0x6f, 0x7b, 0x01, 0x8b, 0x36, | 150 | 0x10, 0x14, 0xff, 0xfd, 0x90, 0xfa, 0xb7, 0xe4, 0x8d, 0xf0, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xb6, |
151 | 0x8a, 0x37, 0x89, 0x38, 0xe9, 0x24, 0x02, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, 0x1c, 0x78, 0x12, 0x25, | 151 | 0xe0, 0xc3, 0x9f, 0xf0, 0xd3, 0x94, 0x00, 0x50, 0x03, 0x02, 0x0f, 0x6e, 0x05, 0x4c, 0x80, 0xd1, |
152 | 0xd7, 0x8f, 0x4c, 0x05, 0x4c, 0x05, 0x4c, 0x12, 0x1c, 0x11, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x12, | 152 | 0x12, 0x1d, 0x22, 0x12, 0x10, 0x14, 0x24, 0xfe, 0xff, 0x90, 0xfa, 0xb6, 0xf0, 0xfd, 0xa3, 0xe4, |
153 | 0x1c, 0x11, 0x90, 0x00, 0x01, 0x74, 0x03, 0x12, 0x1a, 0x4a, 0xaf, 0x4c, 0x7e, 0x00, 0xc3, 0xef, | 153 | 0x75, 0xf0, 0x02, 0x12, 0x1b, 0x1c, 0x7a, 0xf9, 0x79, 0x72, 0x7b, 0x01, 0x8b, 0x36, 0x8a, 0x37, |
154 | 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x8e, 0x39, 0x8f, | 154 | 0x89, 0x38, 0xe9, 0x24, 0x02, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, 0x1d, 0x28, 0x12, 0x26, 0x98, 0x8f, |
155 | 0x3a, 0x02, 0x2c, 0x07, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, | 155 | 0x4c, 0x05, 0x4c, 0x05, 0x4c, 0x12, 0x1c, 0xc1, 0xe5, 0x4c, 0x12, 0x1a, 0xe8, 0x12, 0x1c, 0xc1, |
156 | 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, | 156 | 0x90, 0x00, 0x01, 0x74, 0x03, 0x12, 0x1a, 0xfa, 0xaf, 0x4c, 0x7e, 0x00, 0xc3, 0xef, 0x95, 0x3c, |
157 | 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, | 157 | 0xee, 0x95, 0x3b, 0x50, 0x02, 0x80, 0x04, 0xae, 0x3b, 0xaf, 0x3c, 0x8e, 0x39, 0x8f, 0x3a, 0x02, |
158 | 0x12, 0x1c, 0xc9, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, | 158 | 0x2c, 0xd8, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x64, |
159 | 0x02, 0x0f, 0x26, 0x75, 0x36, 0x00, 0x75, 0x37, 0x00, 0x75, 0x38, 0x32, 0x02, 0x0f, 0xa9, 0xe5, | 159 | 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, |
160 | 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, | 160 | 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, |
161 | 0x90, 0xfa, 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb, 0xe0, 0x94, 0x01, | 161 | 0x79, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, |
162 | 0x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x60, 0x03, | 162 | 0x6e, 0x75, 0x36, 0x00, 0x75, 0x37, 0x00, 0x75, 0x38, 0x32, 0x02, 0x0f, 0xf1, 0xe5, 0x35, 0x30, |
163 | 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, | 163 | 0xe7, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, |
164 | 0xbb, 0xe0, 0xf5, 0x32, 0xe5, 0x32, 0x70, 0x08, 0x43, 0x35, 0x01, 0x53, 0x35, 0xfd, 0x80, 0x06, | 164 | 0xb9, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xd3, 0x90, 0xfa, 0xbe, 0xe0, 0x94, 0x01, 0x90, 0xfa, |
165 | 0x53, 0x35, 0xfe, 0x43, 0x35, 0x02, 0xe4, 0xff, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x20, 0xe7, 0x03, | 165 | 0xbd, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x60, 0x03, 0x02, 0x0f, |
166 | 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, | 166 | 0x6e, 0xe5, 0x35, 0x20, 0xe0, 0x06, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbe, 0xe0, |
167 | 0xb6, 0xe0, 0x60, 0x03, 0x02, 0x0f, 0x26, 0x90, 0xfa, 0xba, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, | 167 | 0xf5, 0x32, 0xe5, 0x32, 0x70, 0x08, 0x43, 0x35, 0x01, 0x53, 0x35, 0xfd, 0x80, 0x06, 0x53, 0x35, |
168 | 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, 0xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, | 168 | 0xfe, 0x43, 0x35, 0x02, 0xe4, 0xff, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x20, 0xe7, 0x03, 0x02, 0x0f, |
169 | 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, 0x7f, 0x01, 0x02, 0x31, 0xb1, 0xe5, 0x35, 0x30, 0xe7, 0x03, | 169 | 0x6e, 0xe5, 0x3c, 0x64, 0x01, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xb9, 0xe0, |
170 | 0x02, 0x0f, 0x26, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xd3, 0x90, 0xfa, 0xbb, | 170 | 0x60, 0x03, 0x02, 0x0f, 0x6e, 0x90, 0xfa, 0xbd, 0xe0, 0x70, 0x02, 0xa3, 0xe0, 0x60, 0x03, 0x02, |
171 | 0xe0, 0x94, 0x00, 0x90, 0xfa, 0xba, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x26, 0x12, 0x1c, | 171 | 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1, |
172 | 0xc9, 0x64, 0x01, 0x60, 0x03, 0x02, 0x0f, 0x26, 0xe5, 0x35, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x26, | 172 | 0x03, 0x02, 0x0f, 0x6e, 0x7f, 0x01, 0x02, 0x32, 0x6e, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, |
173 | 0xe4, 0xff, 0x02, 0x31, 0xb1, 0x90, 0xff, 0x01, 0x12, 0x1d, 0x74, 0xef, 0x12, 0x1a, 0x38, 0x90, | 173 | 0x6e, 0xe5, 0x3c, 0x45, 0x3b, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xd3, 0x90, 0xfa, 0xbe, 0xe0, 0x94, |
174 | 0xfa, 0xb6, 0x12, 0x1d, 0x74, 0x90, 0x00, 0x01, 0xef, 0x12, 0x1a, 0x4a, 0x90, 0x00, 0x02, 0xe4, | 174 | 0x00, 0x90, 0xfa, 0xbd, 0xe0, 0x94, 0x00, 0x40, 0x03, 0x02, 0x0f, 0x6e, 0x12, 0x1d, 0x79, 0x64, |
175 | 0x12, 0x1a, 0x4a, 0x74, 0x03, 0x12, 0x1c, 0x02, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0xa3, 0xe0, 0x85, | 175 | 0x01, 0x60, 0x03, 0x02, 0x0f, 0x6e, 0xe5, 0x35, 0x20, 0xe1, 0x03, 0x02, 0x0f, 0x6e, 0xe4, 0xff, |
176 | 0x38, 0x82, 0x85, 0x37, 0x83, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, | 176 | 0x02, 0x32, 0x6e, 0x90, 0xff, 0x01, 0x12, 0x1e, 0x24, 0xef, 0x12, 0x1a, 0xe8, 0x90, 0xfa, 0xb9, |
177 | 0x4c, 0x09, 0x4a, 0x02, 0x09, 0x6c, 0x04, 0x09, 0x8e, 0x05, 0x09, 0xba, 0x06, 0x09, 0xd8, 0x07, | 177 | 0x12, 0x1e, 0x24, 0x90, 0x00, 0x01, 0xef, 0x12, 0x1a, 0xfa, 0x90, 0x00, 0x02, 0xe4, 0x12, 0x1a, |
178 | 0x09, 0xf6, 0x08, 0x0a, 0x14, 0x09, 0x0a, 0x32, 0x0b, 0x0a, 0xe7, 0x80, 0x0d, 0x6f, 0x81, 0x0d, | 178 | 0xfa, 0x74, 0x03, 0x12, 0x1c, 0xb2, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0xa3, 0xe0, 0x85, 0x38, 0x82, |
179 | 0xa0, 0x82, 0x0b, 0x2e, 0x83, 0x0b, 0x77, 0x84, 0x0b, 0x96, 0x85, 0x0b, 0xdb, 0x86, 0x0c, 0x26, | 179 | 0x85, 0x37, 0x83, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xff, 0x01, 0xe0, 0x12, 0x1b, 0xfc, 0x09, |
180 | 0x87, 0x0c, 0xb7, 0x88, 0x0d, 0x42, 0x89, 0x0a, 0x50, 0x92, 0x0a, 0x50, 0x93, 0x0e, 0x53, 0xc0, | 180 | 0x7b, 0x02, 0x09, 0x9d, 0x04, 0x09, 0xbf, 0x05, 0x09, 0xeb, 0x06, 0x0a, 0x09, 0x07, 0x0a, 0x27, |
181 | 0x0e, 0x7f, 0xc1, 0x0e, 0x90, 0xc2, 0x00, 0x00, 0x0f, 0x15, 0xe5, 0x35, 0x20, 0xe7, 0x05, 0x7f, | 181 | 0x08, 0x0a, 0x45, 0x09, 0x0a, 0x63, 0x0b, 0x0b, 0x18, 0x80, 0x0d, 0xb7, 0x81, 0x0d, 0xe8, 0x82, |
182 | 0x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, | 182 | 0x0b, 0x5f, 0x83, 0x0b, 0xa8, 0x84, 0x0b, 0xc7, 0x85, 0x0c, 0x0c, 0x86, 0x0c, 0x57, 0x87, 0x0c, |
183 | 0x7f, 0x07, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35, 0x20, 0xe7, | 183 | 0xe8, 0x88, 0x0d, 0x73, 0x89, 0x0a, 0x81, 0x92, 0x0a, 0x81, 0x93, 0x0d, 0xa0, 0xb0, 0x0e, 0x9b, |
184 | 0x05, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, | 184 | 0xc0, 0x0e, 0xc7, 0xc1, 0x0e, 0xd8, 0xc2, 0x00, 0x00, 0x0f, 0x5d, 0xe5, 0x35, 0x20, 0xe7, 0x05, |
185 | 0x7c, 0x00, 0x7f, 0x0c, 0x02, 0x11, 0x16, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0x18, 0xe5, 0x35, | 185 | 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, |
186 | 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1d, 0x92, 0x50, 0x06, 0xe5, 0x3c, 0x45, 0x3b, 0x70, | 186 | 0x00, 0x7f, 0x07, 0x02, 0x11, 0x5e, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0xb4, 0xe5, 0x35, 0x20, |
187 | 0x05, 0x7f, 0x02, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfe, 0x24, 0xfd, 0x50, 0x02, | 187 | 0xe7, 0x05, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, |
188 | 0x80, 0x03, 0x02, 0x31, 0x6f, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, | 188 | 0xfd, 0x7c, 0x00, 0x7f, 0x0c, 0x02, 0x11, 0x5e, 0xe4, 0xfd, 0x7f, 0x07, 0x02, 0x2f, 0xb4, 0xe5, |
189 | 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x08, | 189 | 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1e, 0x42, 0x50, 0x06, 0xe5, 0x3c, 0x45, 0x3b, |
190 | 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, | 190 | 0x70, 0x05, 0x7f, 0x02, 0x02, 0x31, 0xa9, 0x90, 0xfa, 0xb9, 0xe0, 0x24, 0xfe, 0x24, 0xfd, 0x50, |
191 | 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x09, 0x02, 0x11, | 191 | 0x02, 0x80, 0x03, 0x02, 0x32, 0x2c, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, |
192 | 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, | 192 | 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, |
193 | 0xc1, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0a, 0x02, 0x11, 0x16, 0x7f, | 193 | 0x08, 0x02, 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, |
194 | 0x07, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, | 194 | 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x09, 0x02, |
195 | 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0b, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, | 195 | 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, |
196 | 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x29, 0x12, 0x1c, 0xc1, 0x60, 0x03, 0x04, | 196 | 0x1d, 0x71, 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0a, 0x02, 0x11, 0x5e, |
197 | 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0e, 0x02, 0x11, 0x16, 0x7f, 0x07, 0x02, 0x30, 0xec, | 197 | 0x7f, 0x07, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71, |
198 | 0xe5, 0x35, 0x30, 0xe7, 0x56, 0x12, 0x1c, 0xc9, 0x70, 0x4a, 0x90, 0xff, 0x02, 0xe0, 0xf5, 0x4c, | 198 | 0x60, 0x03, 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0b, 0x02, 0x11, 0x5e, 0x7f, 0x07, |
199 | 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 0x4c, 0xb4, 0x83, 0x05, 0x75, | 199 | 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x03, 0x02, 0x0f, 0x71, 0x12, 0x1d, 0x71, 0x60, 0x03, |
200 | 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 0x4c, 0x12, 0x1b, 0x72, 0x12, | 200 | 0x04, 0x70, 0x09, 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0e, 0x02, 0x11, 0x5e, 0x7f, 0x07, 0x02, 0x31, |
201 | 0x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c, 0xd9, 0x12, 0x1a, 0x0b, 0x60, 0x05, 0x12, 0x31, 0xbd, | 201 | 0xa9, 0xe5, 0x35, 0x30, 0xe7, 0x56, 0x12, 0x1d, 0x79, 0x70, 0x4a, 0x90, 0xff, 0x02, 0xe0, 0xf5, |
202 | 0x80, 0x06, 0x85, 0x33, 0x39, 0x85, 0x34, 0x3a, 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, | 202 | 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, 0x4c, 0xb4, 0x83, 0x05, |
203 | 0x72, 0x02, 0x2c, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0x18, 0x12, 0x1c, 0xc9, 0x60, 0x05, | 203 | 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, 0x4c, 0x12, 0x1c, 0x22, |
204 | 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x1d, 0x92, 0x40, 0x05, 0x7f, 0x03, 0x02, 0x30, 0xec, 0x90, | 204 | 0x12, 0x1e, 0x3b, 0x12, 0x25, 0xfa, 0x12, 0x1d, 0x89, 0x12, 0x1a, 0xbb, 0x60, 0x05, 0x12, 0x32, |
205 | 0xff, 0x02, 0xe0, 0xf5, 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, 0xe5, | 205 | 0x7a, 0x80, 0x06, 0x85, 0x33, 0x39, 0x85, 0x34, 0x3a, 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, |
206 | 0x4c, 0xb4, 0x83, 0x05, 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, 0xf5, | 206 | 0x38, 0x75, 0x02, 0x2c, 0xd8, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0xb4, 0x12, 0x1d, 0x79, 0x60, |
207 | 0x4c, 0x12, 0x1b, 0x72, 0x02, 0x31, 0x6f, 0x12, 0x1d, 0x9c, 0x12, 0x2a, 0x06, 0x12, 0x1c, 0x83, | 207 | 0x05, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x1e, 0x42, 0x40, 0x05, 0x7f, 0x03, 0x02, 0x31, 0xa9, |
208 | 0xe0, 0x54, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x78, 0x68, 0x12, 0x1b, | 208 | 0x90, 0xff, 0x02, 0xe0, 0xf5, 0x4c, 0xe5, 0x4c, 0xb4, 0x82, 0x05, 0x75, 0x4c, 0x61, 0x80, 0x12, |
209 | 0x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0xf2, 0x90, 0x00, 0x02, 0xe4, 0x12, 0x1a, | 209 | 0xe5, 0x4c, 0xb4, 0x83, 0x05, 0x75, 0x4c, 0x62, 0x80, 0x08, 0xe5, 0x4c, 0xc4, 0x54, 0xf0, 0x04, |
210 | 0x4a, 0x90, 0xfa, 0xb7, 0xe0, 0x44, 0x80, 0xff, 0xf0, 0x78, 0x7c, 0xe6, 0xfc, 0x08, 0xe6, 0x8c, | 210 | 0xf5, 0x4c, 0x12, 0x1c, 0x22, 0x02, 0x32, 0x2c, 0x12, 0x1e, 0x4c, 0x12, 0x2a, 0xc7, 0x12, 0x1d, |
211 | 0x83, 0x12, 0x1c, 0x8b, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa, | 211 | 0x33, 0xe0, 0x54, 0x7f, 0xf0, 0x00, 0x00, 0x00, 0xe0, 0x90, 0xfa, 0xba, 0xf0, 0x78, 0x68, 0x12, |
212 | 0xb6, 0xe0, 0x64, 0x01, 0x70, 0x1f, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, | 212 | 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x12, 0x1a, 0xbb, 0x30, 0xe7, 0xf2, 0x90, 0x00, 0x02, 0xe4, 0x12, |
213 | 0xe0, 0xf5, 0x90, 0x80, 0x2d, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0x90, 0x90, 0xfa, 0xbb, 0xe0, 0x42, | 213 | 0x1a, 0xfa, 0x90, 0xfa, 0xba, 0xe0, 0x44, 0x80, 0xff, 0xf0, 0x78, 0x7c, 0xe6, 0xfc, 0x08, 0xe6, |
214 | 0x90, 0xd2, 0xaf, 0x80, 0x1d, 0x90, 0xfa, 0xba, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, 0xe0, | 214 | 0x8c, 0x83, 0x12, 0x1d, 0x3b, 0xef, 0xf0, 0x12, 0x32, 0x84, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x90, |
215 | 0xf5, 0xb0, 0x80, 0x0e, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0xb0, 0x90, 0xfa, 0xbb, 0xe0, 0x42, 0xb0, | 215 | 0xfa, 0xb9, 0xe0, 0x64, 0x01, 0x70, 0x1f, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, |
216 | 0xd2, 0xaf, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0xb4, 0x01, | 216 | 0xa3, 0xe0, 0xf5, 0x90, 0x80, 0x2d, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0x90, 0x90, 0xfa, 0xbe, 0xe0, |
217 | 0x0a, 0x12, 0x1c, 0x11, 0xe5, 0x90, 0x12, 0x1a, 0x38, 0x80, 0x08, 0x12, 0x1c, 0x11, 0xe5, 0xb0, | 217 | 0x42, 0x90, 0xd2, 0xaf, 0x80, 0x1d, 0x90, 0xfa, 0xbd, 0xe0, 0xff, 0x7e, 0x00, 0x70, 0x06, 0xa3, |
218 | 0x12, 0x1a, 0x38, 0x02, 0x0f, 0xa9, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0x12, 0x12, 0x1c, 0x41, | 218 | 0xe0, 0xf5, 0xb0, 0x80, 0x0e, 0xc2, 0xaf, 0xef, 0xf4, 0x52, 0xb0, 0x90, 0xfa, 0xbe, 0xe0, 0x42, |
219 | 0x20, 0xe1, 0x33, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x18, 0x04, 0x70, 0x28, 0x90, 0xfa, | 219 | 0xb0, 0xd2, 0xaf, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1c, 0xe0, 0x90, 0xfa, 0xb9, 0xe0, 0xb4, |
220 | 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x19, 0x12, 0x1d, 0xa6, | 220 | 0x01, 0x0a, 0x12, 0x1c, 0xc1, 0xe5, 0x90, 0x12, 0x1a, 0xe8, 0x80, 0x08, 0x12, 0x1c, 0xc1, 0xe5, |
221 | 0xf0, 0x80, 0x13, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0xf0, | 221 | 0xb0, 0x12, 0x1a, 0xe8, 0x02, 0x0f, 0xf1, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x24, 0x13, 0x12, 0x1c, |
222 | 0x80, 0x04, 0x12, 0x1d, 0xad, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x90, 0xfa, 0xb6, 0xe0, 0xff, | 222 | 0xf1, 0x20, 0xe1, 0x33, 0x12, 0x1d, 0x80, 0xef, 0x24, 0xfc, 0x60, 0x18, 0x04, 0x70, 0x28, 0x90, |
223 | 0x24, 0x12, 0x12, 0x1c, 0x41, 0x20, 0xe1, 0x39, 0x12, 0x1c, 0xd0, 0xef, 0x24, 0xfc, 0x60, 0x1b, | 223 | 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x19, 0x12, 0x1e, |
224 | 0x04, 0x70, 0x2e, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0, | 224 | 0x56, 0xf0, 0x80, 0x13, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, |
225 | 0x80, 0x1f, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x16, 0x90, 0xfa, 0xb7, 0xe0, 0x60, | 225 | 0xf0, 0x80, 0x04, 0x12, 0x1e, 0x5d, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x90, 0xfa, 0xb9, 0xe0, |
226 | 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, | 226 | 0xff, 0x24, 0x13, 0x12, 0x1c, 0xf1, 0x20, 0xe1, 0x39, 0x12, 0x1d, 0x80, 0xef, 0x24, 0xfc, 0x60, |
227 | 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x12, 0x1c, 0xc1, 0x60, 0x4d, 0x04, 0x60, | 227 | 0x1b, 0x04, 0x70, 0x2e, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, |
228 | 0x03, 0x02, 0x0c, 0xb2, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x0f, 0x90, 0xff, 0xa4, 0x12, 0x1c, 0x3a, | 228 | 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x16, 0x90, 0xfa, 0xba, 0xe0, |
229 | 0x30, 0xe1, 0x6f, 0x12, 0x1d, 0x7c, 0x02, 0x0c, 0xb2, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfb, 0x12, | 229 | 0x60, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, |
230 | 0x1c, 0x3d, 0xfe, 0x30, 0xe1, 0x5c, 0x30, 0xe2, 0x11, 0x30, 0xb4, 0x05, 0x12, 0x1d, 0x7c, 0x80, | 230 | 0xdf, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x12, 0x1d, 0x71, 0x60, 0x4d, 0x04, |
231 | 0x51, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x48, 0x30, 0x95, 0x05, 0x12, 0x1d, 0x7c, | 231 | 0x60, 0x03, 0x02, 0x0c, 0xe3, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x0f, 0x90, 0xff, 0xa4, 0x12, 0x1c, |
232 | 0x80, 0x40, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x37, 0x90, 0xfa, 0xb7, 0xe0, 0x60, | 232 | 0xea, 0x30, 0xe1, 0x6f, 0x12, 0x1e, 0x2c, 0x02, 0x0c, 0xe3, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfb, |
233 | 0x12, 0x90, 0xff, 0xb4, 0x12, 0x1c, 0x3a, 0x30, 0xe1, 0x28, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, | 233 | 0x12, 0x1c, 0xed, 0xfe, 0x30, 0xe1, 0x5c, 0x30, 0xe2, 0x11, 0x30, 0xb4, 0x05, 0x12, 0x1e, 0x2c, |
234 | 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xfb, 0x12, 0x1c, 0x3d, 0x30, 0xe1, 0x13, 0x30, | 234 | 0x80, 0x51, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x48, 0x30, 0x95, 0x05, 0x12, 0x1e, |
235 | 0x93, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, | 235 | 0x2c, 0x80, 0x40, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xfd, 0xf0, 0x80, 0x37, 0x90, 0xfa, 0xba, 0xe0, |
236 | 0xfd, 0xf0, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc, | 236 | 0x60, 0x12, 0x90, 0xff, 0xb4, 0x12, 0x1c, 0xea, 0x30, 0xe1, 0x28, 0x90, 0xff, 0xb4, 0xe0, 0x44, |
237 | 0x60, 0x40, 0x04, 0x70, 0x78, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xa2, 0xe0, 0x44, | 237 | 0x02, 0xf0, 0x80, 0x1f, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xfb, 0x12, 0x1c, 0xed, 0x30, 0xe1, 0x13, |
238 | 0x40, 0xf0, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x65, 0xd2, 0x03, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, | 238 | 0x30, 0x93, 0x09, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, |
239 | 0xff, 0xa3, 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x55, 0x30, 0x03, 0x0e, 0x90, 0xff, 0xa3, 0xe0, 0x44, | 239 | 0x54, 0xfd, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x90, 0xfa, 0xb9, 0xe0, 0x24, |
240 | 0x80, 0xf0, 0xc2, 0x03, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x54, 0xbf, 0xf0, | 240 | 0xfc, 0x60, 0x40, 0x04, 0x70, 0x78, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xa2, 0xe0, |
241 | 0x80, 0x3b, 0x90, 0xfa, 0xb7, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xb2, 0xe0, 0x44, 0x40, 0xf0, 0xa3, | 241 | 0x44, 0x40, 0xf0, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x65, 0xd2, 0x03, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, |
242 | 0xe0, 0xff, 0x30, 0xe7, 0x28, 0xd2, 0x04, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 0xff, 0xb3, 0xef, | 242 | 0x90, 0xff, 0xa3, 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x55, 0x30, 0x03, 0x0e, 0x90, 0xff, 0xa3, 0xe0, |
243 | 0x54, 0x7f, 0xf0, 0x80, 0x18, 0x30, 0x04, 0x0e, 0x90, 0xff, 0xb3, 0xe0, 0x44, 0x80, 0xf0, 0xc2, | 243 | 0x44, 0x80, 0xf0, 0xc2, 0x03, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x54, 0xbf, |
244 | 0x04, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x54, 0xbf, 0xf0, 0xe4, 0xff, 0x02, | 244 | 0xf0, 0x80, 0x3b, 0x90, 0xfa, 0xba, 0xe0, 0x60, 0x1d, 0x90, 0xff, 0xb2, 0xe0, 0x44, 0x40, 0xf0, |
245 | 0x30, 0xec, 0x12, 0x1c, 0x30, 0x90, 0xfa, 0xb6, 0xe0, 0x24, 0xfc, 0x60, 0x0f, 0x04, 0x70, 0x16, | 245 | 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x28, 0xd2, 0x04, 0xa3, 0xe0, 0x54, 0xdf, 0xf0, 0x90, 0xff, 0xb3, |
246 | 0x90, 0xff, 0xa6, 0xe0, 0x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x80, 0x0a, 0x90, 0xff, 0xb6, 0xe0, | 246 | 0xef, 0x54, 0x7f, 0xf0, 0x80, 0x18, 0x30, 0x04, 0x0e, 0x90, 0xff, 0xb3, 0xe0, 0x44, 0x80, 0xf0, |
247 | 0x12, 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0x07, 0xe4, | 247 | 0xc2, 0x04, 0xa3, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x54, 0xbf, 0xf0, 0xe4, 0xff, |
248 | 0xff, 0x12, 0x30, 0xec, 0x12, 0x1d, 0x37, 0x7f, 0x03, 0x12, 0x12, 0x19, 0x90, 0xf9, 0x15, 0xe0, | 248 | 0x02, 0x31, 0xa9, 0x12, 0x1c, 0xe0, 0x90, 0xfa, 0xb9, 0xe0, 0x24, 0xfc, 0x60, 0x0f, 0x04, 0x70, |
249 | 0x30, 0xe4, 0x08, 0x90, 0xff, 0x93, 0x74, 0x80, 0xf0, 0x80, 0x10, 0x90, 0xff, 0xfc, 0xe0, 0x54, | 249 | 0x16, 0x90, 0xff, 0xa6, 0xe0, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x80, 0x0a, 0x90, 0xff, 0xb6, |
250 | 0x7f, 0xf0, 0x7f, 0xff, 0x7e, 0x00, 0x12, 0x30, 0x16, 0xc2, 0x90, 0xc2, 0xaf, 0x00, 0x80, 0xfd, | 250 | 0xe0, 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0xd8, |
251 | 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x90, 0xfa, 0xbc, 0x74, 0x3e, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xfa, | 251 | 0x90, 0xf9, 0x15, 0x74, 0x01, 0xf0, 0x90, 0xf9, 0x1c, 0x74, 0x19, 0xf0, 0x90, 0xf9, 0x66, 0x74, |
252 | 0xb4, 0xf0, 0xa3, 0x74, 0x15, 0xf0, 0xe0, 0x54, 0x3f, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0xfa, | 252 | 0xff, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0xe4, 0xff, 0x12, 0x31, 0xa9, 0x12, 0x1d, 0xe7, 0x7f, |
253 | 0xb9, 0xf0, 0xd3, 0x94, 0x00, 0xe4, 0x94, 0x3e, 0x40, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa, | 253 | 0x03, 0x12, 0x12, 0x61, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe4, 0x08, 0x90, 0xff, 0x93, 0x74, 0x80, |
254 | 0xb9, 0xf0, 0x12, 0x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x73, 0x12, 0x1c, 0x4a, 0x90, 0xfa, | 254 | 0xf0, 0x80, 0x10, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0x7f, 0xf0, 0x7f, 0xff, 0x7e, 0x00, 0x12, 0x30, |
255 | 0xbc, 0x12, 0x1d, 0x56, 0x60, 0x27, 0xd3, 0xef, 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x08, 0x90, | 255 | 0xd3, 0xc2, 0x90, 0xc2, 0xaf, 0x00, 0x80, 0xfd, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x90, 0xfa, 0xbf, |
256 | 0xfa, 0xb9, 0x74, 0x40, 0xf0, 0x80, 0x08, 0x90, 0xfa, 0xbd, 0xe0, 0x90, 0xfa, 0xb9, 0xf0, 0x12, | 256 | 0x74, 0x3e, 0xf0, 0xa3, 0xe4, 0xf0, 0x90, 0xfa, 0xb7, 0xf0, 0xa3, 0x74, 0x15, 0xf0, 0xe0, 0x54, |
257 | 0x0f, 0x50, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x46, 0x12, 0x1c, 0x4a, 0x80, 0xd1, 0x75, 0x4c, 0x02, | 257 | 0x3f, 0xff, 0xc3, 0x74, 0x40, 0x9f, 0x90, 0xfa, 0xbc, 0xf0, 0xd3, 0x94, 0x00, 0xe4, 0x94, 0x3e, |
258 | 0x90, 0xfa, 0xbc, 0xe4, 0xf0, 0xa3, 0x04, 0xf0, 0x90, 0xfa, 0xb4, 0xe4, 0xf0, 0xa3, 0x74, 0x0f, | 258 | 0x40, 0x08, 0x90, 0xfa, 0xc0, 0xe0, 0x90, 0xfa, 0xbc, 0xf0, 0x12, 0x0f, 0x98, 0xe5, 0x31, 0x45, |
259 | 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0x90, 0xfa, 0xbd, 0xe0, 0xf5, 0x4a, 0x7d, 0x0f, 0x7c, | 259 | 0x30, 0x70, 0x73, 0x12, 0x1c, 0xfa, 0x90, 0xfa, 0xbf, 0x12, 0x1e, 0x06, 0x60, 0x27, 0xd3, 0xef, |
260 | 0x00, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0xe4, | 260 | 0x94, 0x40, 0xee, 0x94, 0x00, 0x40, 0x08, 0x90, 0xfa, 0xbc, 0x74, 0x40, 0xf0, 0x80, 0x08, 0x90, |
261 | 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xaf, 0x31, | 261 | 0xfa, 0xc0, 0xe0, 0x90, 0xfa, 0xbc, 0xf0, 0x12, 0x0f, 0x98, 0xe5, 0x31, 0x45, 0x30, 0x70, 0x46, |
262 | 0x02, 0x30, 0xec, 0x12, 0x1c, 0xd0, 0x30, 0xe7, 0x10, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x64, 0xf0, | 262 | 0x12, 0x1c, 0xfa, 0x80, 0xd1, 0x75, 0x4c, 0x02, 0x90, 0xfa, 0xbf, 0xe4, 0xf0, 0xa3, 0x04, 0xf0, |
263 | 0xd3, 0x94, 0x00, 0x40, 0x15, 0xc2, 0x95, 0x80, 0x11, 0x90, 0xfa, 0xb7, 0xe0, 0x54, 0x0f, 0x90, | 263 | 0x90, 0xfa, 0xb7, 0xe4, 0xf0, 0xa3, 0x74, 0x0f, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0x90, |
264 | 0xf9, 0x63, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x02, 0xc2, 0x94, 0xe4, 0xff, 0x02, 0x30, 0xec, 0x12, | 264 | 0xfa, 0xc0, 0xe0, 0xf5, 0x4a, 0x7d, 0x0f, 0x7c, 0x00, 0x12, 0x29, 0x60, 0x75, 0x30, 0x00, 0x8f, |
265 | 0x1d, 0x9c, 0xbf, 0x01, 0x04, 0xd2, 0x93, 0x80, 0x02, 0xc2, 0x93, 0xe4, 0xff, 0x02, 0x30, 0xec, | 265 | 0x31, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x4c, 0xe4, 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, |
266 | 0x12, 0x1c, 0xd0, 0x54, 0x03, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, | 266 | 0x98, 0xe4, 0xf5, 0x30, 0xf5, 0x31, 0xaf, 0x31, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x30, 0xe7, |
267 | 0x70, 0x2b, 0xd2, 0x91, 0x80, 0x27, 0xc2, 0x91, 0x80, 0x23, 0x12, 0x1d, 0xa6, 0x12, 0x0f, 0x78, | 267 | 0x10, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x67, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x15, 0xc2, 0x95, 0x80, |
268 | 0x60, 0x04, 0xd2, 0x91, 0x80, 0x17, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0x78, 0xff, | 268 | 0x11, 0x90, 0xfa, 0xba, 0xe0, 0x54, 0x0f, 0x90, 0xf9, 0x65, 0xf0, 0xd3, 0x94, 0x00, 0x40, 0x02, |
269 | 0xbf, 0xa0, 0x04, 0xc2, 0x91, 0x80, 0x02, 0xd2, 0x91, 0x12, 0x1d, 0xa6, 0xf0, 0x90, 0xfa, 0xb7, | 269 | 0xc2, 0x94, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1e, 0x4c, 0xbf, 0x01, 0x04, 0xd2, 0x93, 0x80, |
270 | 0xe0, 0x54, 0x0c, 0xff, 0x13, 0x13, 0x54, 0x3f, 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, | 270 | 0x02, 0xc2, 0x93, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0x12, 0x1d, 0x80, 0x54, 0x03, 0x14, 0x60, 0x0a, |
271 | 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x92, 0x80, 0x27, 0xc2, 0x92, 0x80, 0x23, 0x12, 0x1d, 0xad, | 271 | 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x91, 0x80, 0x27, 0xc2, 0x91, |
272 | 0x12, 0x0f, 0x98, 0x60, 0x04, 0xd2, 0x92, 0x80, 0x17, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0x12, | 272 | 0x80, 0x23, 0x12, 0x1e, 0x56, 0x12, 0x0f, 0xc0, 0x60, 0x04, 0xd2, 0x91, 0x80, 0x17, 0x90, 0xff, |
273 | 0x0f, 0x98, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x92, 0x80, 0x02, 0xd2, 0x92, 0x12, 0x1d, 0xad, 0xf0, | 273 | 0xa4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0xc0, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x91, 0x80, 0x02, 0xd2, |
274 | 0xe4, 0xff, 0x02, 0x30, 0xec, 0xe5, 0x35, 0x30, 0xe7, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, | 274 | 0x91, 0x12, 0x1e, 0x56, 0xf0, 0x90, 0xfa, 0xba, 0xe0, 0x54, 0x0c, 0xff, 0x13, 0x13, 0x54, 0x3f, |
275 | 0x18, 0x7f, 0x05, 0x02, 0x30, 0xec, 0x12, 0x31, 0xbd, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb3, | 275 | 0x14, 0x60, 0x0a, 0x14, 0x60, 0x0f, 0x14, 0x60, 0x08, 0x24, 0x03, 0x70, 0x2b, 0xd2, 0x92, 0x80, |
276 | 0x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, | 276 | 0x27, 0xc2, 0x92, 0x80, 0x23, 0x12, 0x1e, 0x5d, 0x12, 0x0f, 0xe0, 0x60, 0x04, 0xd2, 0x92, 0x80, |
277 | 0xfa, 0xb4, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, | 277 | 0x17, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x10, 0x12, 0x0f, 0xe0, 0xff, 0xbf, 0xa0, 0x04, 0xc2, 0x92, |
278 | 0xaa, 0x4e, 0xa9, 0x4f, 0x7b, 0xff, 0x90, 0xfa, 0xb4, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, | 278 | 0x80, 0x02, 0xd2, 0x92, 0x12, 0x1e, 0x5d, 0xf0, 0xe4, 0xff, 0x02, 0x31, 0xa9, 0xe5, 0x35, 0x30, |
279 | 0xb9, 0xe0, 0xf5, 0x4a, 0x12, 0x28, 0x9f, 0x75, 0x30, 0x00, 0x8f, 0x31, 0x22, 0x12, 0x22, 0xa0, | 279 | 0xe7, 0x07, 0xe4, 0xfd, 0x7f, 0x05, 0x02, 0x2f, 0xb4, 0x7f, 0x05, 0x02, 0x31, 0xa9, 0x12, 0x32, |
280 | 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff, | 280 | 0x7a, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb6, 0x90, 0xfa, 0xb7, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, |
281 | 0xa6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x12, 0x25, 0xd7, 0x8f, 0x4c, 0x7e, 0x00, | 281 | 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb7, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1b, |
282 | 0xc3, 0xef, 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x22, 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x19, 0x90, 0xff, | 282 | 0x1c, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xaa, 0x4e, 0xa9, 0x4f, 0x7b, 0xff, 0x90, 0xfa, |
283 | 0xb6, 0xe0, 0x90, 0xfa, 0xb8, 0xf0, 0x54, 0xa0, 0x22, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, | 283 | 0xb7, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xbc, 0xe0, 0xf5, 0x4a, 0x12, 0x29, 0x60, 0x75, |
284 | 0x2c, 0x07, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x02, 0x31, 0x82, 0x8e, 0x39, 0x8f, 0x3a, 0x02, 0x2c, | 284 | 0x30, 0x00, 0x8f, 0x31, 0x22, 0x12, 0x23, 0x61, 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, |
285 | 0x07, 0x12, 0x22, 0xa0, 0x7e, 0x00, 0x8e, 0x30, 0x8f, 0x31, 0xef, 0x22, 0x7d, 0x01, 0x12, 0x25, | 285 | 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x61, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xbb, 0xf0, 0x54, 0xa0, |
286 | 0xd7, 0x90, 0xfa, 0xb1, 0xe0, 0x22, 0xef, 0x90, 0xf8, 0x04, 0xf0, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, | 286 | 0x22, 0x12, 0x26, 0x98, 0x8f, 0x4c, 0x7e, 0x00, 0xc3, 0xef, 0x95, 0x3c, 0xee, 0x95, 0x3b, 0x22, |
287 | 0xee, 0x60, 0x0a, 0xc0, 0x05, 0x7d, 0x7f, 0xdd, 0xfe, 0xde, 0xfa, 0xd0, 0x05, 0xef, 0xc3, 0x94, | 287 | 0xf0, 0x7f, 0x01, 0x12, 0x12, 0x61, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xbb, 0xf0, 0x54, 0xa0, |
288 | 0x15, 0x50, 0x03, 0xd0, 0xa8, 0x22, 0x13, 0x70, 0x03, 0xd0, 0xa8, 0x22, 0xff, 0xd5, 0x07, 0xfd, | 288 | 0x22, 0x75, 0x39, 0x00, 0x75, 0x3a, 0x01, 0x02, 0x2c, 0xd8, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x02, |
289 | 0xd0, 0xa8, 0x22, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x05, 0xe5, 0x3e, 0x24, | 289 | 0x32, 0x3f, 0x8e, 0x39, 0x8f, 0x3a, 0x02, 0x2c, 0xd8, 0x12, 0x23, 0x61, 0x7e, 0x00, 0x8e, 0x30, |
290 | 0x08, 0xf8, 0x86, 0x05, 0x53, 0x05, 0x7f, 0x7c, 0xff, 0x12, 0x10, 0x78, 0x7f, 0x00, 0x7e, 0x00, | 290 | 0x8f, 0x31, 0xef, 0x22, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xb4, 0xe0, 0x22, 0xef, 0x90, |
291 | 0xe5, 0x43, 0x60, 0x46, 0xfc, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6d, 0x70, 0x0f, 0xc0, 0x83, | 291 | 0xf8, 0x04, 0xf0, 0x22, 0xc0, 0xa8, 0xc2, 0xaf, 0xee, 0x60, 0x0a, 0xc0, 0x05, 0x7d, 0x7f, 0xdd, |
292 | 0xc0, 0x82, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, | 292 | 0xfe, 0xde, 0xfa, 0xd0, 0x05, 0xef, 0xc3, 0x94, 0x15, 0x50, 0x03, 0xd0, 0xa8, 0x22, 0x13, 0x70, |
293 | 0xdc, 0xe6, 0x80, 0x26, 0xdc, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0x1e, 0xe0, 0xf8, 0xa3, 0xe0, | 293 | 0x03, 0xd0, 0xa8, 0x22, 0xff, 0xd5, 0x07, 0xfd, 0xd0, 0xa8, 0x22, 0xc0, 0x00, 0xc0, 0x01, 0xc0, |
294 | 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, | 294 | 0x02, 0xc0, 0x04, 0xc0, 0x05, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x86, 0x05, 0x53, 0x05, 0x7f, 0x7c, |
295 | 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x12, 0x11, 0x0f, 0xd0, 0x05, 0xd0, | 295 | 0xff, 0x12, 0x10, 0xc0, 0x7f, 0x00, 0x7e, 0x00, 0xe5, 0x43, 0x60, 0x46, 0xfc, 0x90, 0xf9, 0x1d, |
296 | 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x85, 0xa8, 0x44, 0x75, 0xa8, 0x88, 0xec, 0x70, | 296 | 0xe0, 0x54, 0x7f, 0x6d, 0x70, 0x0f, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, |
297 | 0x02, 0x7c, 0x3f, 0x8c, 0x3d, 0x22, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0x66, | 297 | 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xdc, 0xe6, 0x80, 0x26, 0xdc, 0x06, 0xd0, 0x82, |
298 | 0x80, 0xfb, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x04, 0xc0, 0x06, 0x7c, 0xff, 0x12, 0x10, | 298 | 0xd0, 0x83, 0x80, 0x1e, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, |
299 | 0x78, 0xe5, 0x43, 0x60, 0x42, 0xfe, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x7f, 0x6f, 0x70, 0x0b, 0xc0, | 299 | 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, |
300 | 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x15, 0x43, 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xde, 0xea, 0x80, | 300 | 0x80, 0xda, 0x12, 0x11, 0x57, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, |
301 | 0x26, 0xde, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, 0xd8, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, | 301 | 0x85, 0xa8, 0x44, 0x75, 0xa8, 0x88, 0xec, 0x70, 0x02, 0x7c, 0x3f, 0x8c, 0x3d, 0x22, 0xe5, 0x3e, |
302 | 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, | 302 | 0x24, 0x08, 0xf8, 0x76, 0x00, 0x12, 0x11, 0xae, 0x80, 0xfb, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, |
303 | 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x78, 0x08, 0x08, 0x79, 0x18, 0x09, 0x7c, 0x01, 0xe6, | 303 | 0xc0, 0x04, 0xc0, 0x06, 0x7c, 0xff, 0x12, 0x10, 0xc0, 0xe5, 0x43, 0x60, 0x42, 0xfe, 0x90, 0xf9, |
304 | 0x54, 0x7f, 0x6f, 0x70, 0x06, 0x76, 0x00, 0x77, 0x00, 0x80, 0x06, 0x08, 0x09, 0x0c, 0xbc, 0x08, | 304 | 0x1d, 0xe0, 0x54, 0x7f, 0x6f, 0x70, 0x0b, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x15, 0x43, |
305 | 0xee, 0x12, 0x11, 0x0f, 0xd0, 0x06, 0xd0, 0x04, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x75, | 305 | 0x80, 0x07, 0xa3, 0xa3, 0xa3, 0xde, 0xea, 0x80, 0x26, 0xde, 0x06, 0xd0, 0x82, 0xd0, 0x83, 0x80, |
306 | 0x3d, 0x00, 0x85, 0x44, 0xa8, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc3, 0xe5, 0x43, 0x24, | 306 | 0xd8, 0xe0, 0xf8, 0xa3, 0xe0, 0xf9, 0xa3, 0xe0, 0xfa, 0xd0, 0x82, 0xd0, 0x83, 0xe8, 0xf0, 0xa3, |
307 | 0xe8, 0x50, 0x05, 0x12, 0x11, 0x66, 0x80, 0xf4, 0xef, 0x60, 0x31, 0x90, 0x30, 0x54, 0xe4, 0x93, | 307 | 0xe9, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xa3, 0xa3, 0x80, 0xda, 0x78, |
308 | 0xc3, 0x9f, 0x40, 0x2f, 0xc0, 0x04, 0x7c, 0xff, 0x12, 0x10, 0x78, 0xd0, 0x04, 0x43, 0x07, 0x80, | 308 | 0x08, 0x08, 0x79, 0x18, 0x09, 0x7c, 0x01, 0xe6, 0x54, 0x7f, 0x6f, 0x70, 0x06, 0x76, 0x00, 0x77, |
309 | 0xe5, 0x43, 0x75, 0xf0, 0x03, 0xa4, 0x24, 0x1b, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xef, | 309 | 0x00, 0x80, 0x06, 0x08, 0x09, 0x0c, 0xbc, 0x08, 0xee, 0x12, 0x11, 0x57, 0xd0, 0x06, 0xd0, 0x04, |
310 | 0xf0, 0xec, 0xa3, 0xf0, 0xed, 0xa3, 0xf0, 0x05, 0x43, 0x12, 0x11, 0x0f, 0xd0, 0x83, 0xd0, 0x82, | 310 | 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0x22, 0x75, 0x3d, 0x00, 0x85, 0x44, 0xa8, 0x22, 0xc0, 0xf0, |
311 | 0xd0, 0xf0, 0x22, 0x02, 0x11, 0x94, 0xc0, 0x04, 0x7c, 0x20, 0xd2, 0x8c, 0xd2, 0x8d, 0xd5, 0x04, | 311 | 0xc0, 0x82, 0xc0, 0x83, 0xc3, 0xe5, 0x43, 0x24, 0xe8, 0x50, 0x05, 0x12, 0x11, 0xae, 0x80, 0xf4, |
312 | 0xfd, 0xd0, 0x04, 0x22, 0x75, 0xa8, 0x00, 0x75, 0x88, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xf0, 0x00, | 312 | 0xef, 0x60, 0x31, 0x90, 0x31, 0x11, 0xe4, 0x93, 0xc3, 0x9f, 0x40, 0x2f, 0xc0, 0x04, 0x7c, 0xff, |
313 | 0x75, 0xd0, 0x00, 0xe4, 0xf8, 0x90, 0xf8, 0x04, 0xf0, 0x90, 0x00, 0x00, 0xf6, 0x08, 0xb8, 0x00, | 313 | 0x12, 0x10, 0xc0, 0xd0, 0x04, 0x43, 0x07, 0x80, 0xe5, 0x43, 0x75, 0xf0, 0x03, 0xa4, 0x24, 0x1d, |
314 | 0xfb, 0x02, 0x00, 0x00, 0xc2, 0xaf, 0xe4, 0x90, 0xff, 0x48, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, | 314 | 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xef, 0xf0, 0xec, 0xa3, 0xf0, 0xed, 0xa3, 0xf0, 0x05, |
315 | 0xff, 0x08, 0xf0, 0x90, 0xff, 0x10, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xa3, 0xa3, 0xf0, 0xd2, 0xb1, | 315 | 0x43, 0x12, 0x11, 0x57, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0x22, 0x02, 0x11, 0xdc, 0xc0, 0x04, |
316 | 0xc2, 0xb0, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, | 316 | 0x7c, 0x20, 0xd2, 0x8c, 0xd2, 0x8d, 0xd5, 0x04, 0xfd, 0xd0, 0x04, 0x22, 0x75, 0xa8, 0x00, 0x75, |
317 | 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0xd2, 0xb0, 0xd2, 0xb1, 0x7e, 0xff, 0x7f, 0xff, 0x12, | 317 | 0x88, 0x00, 0x75, 0xb8, 0x00, 0x75, 0xf0, 0x00, 0x75, 0xd0, 0x00, 0xe4, 0xf8, 0x90, 0xf8, 0x04, |
318 | 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x0f, 0xdc, | 318 | 0xf0, 0x90, 0x00, 0x00, 0xf6, 0x08, 0xb8, 0x00, 0xfb, 0x02, 0x00, 0x00, 0xc2, 0xaf, 0xe4, 0x90, |
319 | 0x80, 0xcc, 0xc3, 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x03, 0x7f, 0xe8, 0xef, 0xf4, 0xff, 0xee, | 319 | 0xff, 0x48, 0xf0, 0x90, 0xff, 0x50, 0xf0, 0x90, 0xff, 0x08, 0xf0, 0x90, 0xff, 0x10, 0xf0, 0x90, |
320 | 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x42, 0x8e, 0x41, 0x22, 0xc3, 0xef, 0x94, 0xbc, | 320 | 0xff, 0x80, 0xf0, 0xa3, 0xa3, 0xf0, 0xd2, 0xb1, 0xc2, 0xb0, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, |
321 | 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x07, 0x7f, 0xd0, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, | 321 | 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0xd2, |
322 | 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x40, 0x8e, 0x3f, 0x22, 0xef, 0x70, 0x01, 0x22, 0xc0, 0x00, 0xc0, | 322 | 0xb0, 0xd2, 0xb1, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, |
323 | 0xa8, 0xc2, 0xaf, 0xe5, 0x3e, 0x24, 0x18, 0xf8, 0xa6, 0x07, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0xc6, | 323 | 0x24, 0x7e, 0xff, 0x7f, 0xff, 0x12, 0x10, 0x24, 0x80, 0xcc, 0xc3, 0xee, 0x94, 0x02, 0x50, 0x04, |
324 | 0x54, 0x7f, 0xf6, 0xd0, 0xa8, 0xe6, 0x30, 0xe7, 0x03, 0xd0, 0x00, 0x22, 0x12, 0x11, 0x66, 0x80, | 324 | 0x7e, 0x03, 0x7f, 0xe8, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, |
325 | 0xf4, 0xc0, 0x00, 0x7f, 0x01, 0xef, 0x24, 0x08, 0xf8, 0xe6, 0x60, 0x09, 0x0f, 0xbf, 0x08, 0xf5, | 325 | 0x42, 0x8e, 0x41, 0x22, 0xc3, 0xef, 0x94, 0xbc, 0xee, 0x94, 0x02, 0x50, 0x04, 0x7e, 0x07, 0x7f, |
326 | 0x12, 0x11, 0x66, 0x80, 0xee, 0xd0, 0x00, 0x22, 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, | 326 | 0xd0, 0xef, 0xf4, 0xff, 0xee, 0xf4, 0xfe, 0x0f, 0xbf, 0x00, 0x01, 0x0e, 0x8f, 0x40, 0x8e, 0x3f, |
327 | 0xc0, 0x06, 0xc0, 0x04, 0xed, 0x24, 0x10, 0xf8, 0x76, 0x9a, 0xed, 0x75, 0xf0, 0x21, 0xa4, 0x24, | 327 | 0x22, 0xef, 0x70, 0x01, 0x22, 0xc0, 0x00, 0xc0, 0xa8, 0xc2, 0xaf, 0xe5, 0x3e, 0x24, 0x18, 0xf8, |
328 | 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, 0xc0, 0x82, 0xc0, 0x83, 0xa3, 0xa3, 0xe4, 0x78, | 328 | 0xa6, 0x07, 0xe5, 0x3e, 0x24, 0x08, 0xf8, 0xc6, 0x54, 0x7f, 0xf6, 0xd0, 0xa8, 0xe6, 0x30, 0xe7, |
329 | 0x0d, 0xf0, 0xa3, 0xd8, 0xfc, 0xef, 0x54, 0x7f, 0x75, 0xf0, 0x02, 0xa4, 0x24, 0x36, 0xf5, 0x82, | 329 | 0x03, 0xd0, 0x00, 0x22, 0x12, 0x11, 0xae, 0x80, 0xf4, 0xc0, 0x00, 0x7f, 0x01, 0xef, 0x24, 0x08, |
330 | 0xe5, 0xf0, 0x34, 0x30, 0xf5, 0x83, 0xe4, 0x93, 0xfe, 0x74, 0x01, 0x93, 0xfc, 0xd0, 0x83, 0xd0, | 330 | 0xf8, 0xe6, 0x60, 0x09, 0x0f, 0xbf, 0x08, 0xf5, 0x12, 0x11, 0xae, 0x80, 0xee, 0xd0, 0x00, 0x22, |
331 | 0x82, 0xec, 0xf0, 0xa3, 0xee, 0xf0, 0xed, 0x24, 0x08, 0xf8, 0xef, 0x44, 0x80, 0xf6, 0xd0, 0x04, | 331 | 0xc0, 0xf0, 0xc0, 0x82, 0xc0, 0x83, 0xc0, 0x00, 0xc0, 0x06, 0xc0, 0x04, 0xed, 0x24, 0x10, 0xf8, |
332 | 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, 0xd0, 0xf0, 0x22, 0x75, 0x3e, 0x00, 0x75, 0x43, | 332 | 0x76, 0x9a, 0xed, 0x75, 0xf0, 0x21, 0xa4, 0x24, 0x05, 0xf5, 0x82, 0xe4, 0x34, 0xf8, 0xf5, 0x83, |
333 | 0x00, 0x7a, 0x08, 0x79, 0x18, 0x78, 0x08, 0x76, 0x00, 0x77, 0x00, 0x08, 0x09, 0xda, 0xf8, 0x90, | 333 | 0xc0, 0x82, 0xc0, 0x83, 0xa3, 0xa3, 0xe4, 0x78, 0x0d, 0xf0, 0xa3, 0xd8, 0xfc, 0xef, 0x54, 0x7f, |
334 | 0xf8, 0x04, 0xe0, 0xfc, 0x90, 0x30, 0x54, 0xe4, 0x93, 0xc3, 0x9c, 0x50, 0x05, 0xe4, 0x90, 0xf8, | 334 | 0x75, 0xf0, 0x02, 0xa4, 0x24, 0xf3, 0xf5, 0x82, 0xe5, 0xf0, 0x34, 0x30, 0xf5, 0x83, 0xe4, 0x93, |
335 | 0x04, 0xf0, 0x78, 0x08, 0x74, 0x80, 0x44, 0x7f, 0xf6, 0x74, 0x01, 0x44, 0x10, 0xf5, 0x89, 0x75, | 335 | 0xfe, 0x74, 0x01, 0x93, 0xfc, 0xd0, 0x83, 0xd0, 0x82, 0xec, 0xf0, 0xa3, 0xee, 0xf0, 0xed, 0x24, |
336 | 0xb8, 0x00, 0xd2, 0xab, 0xd2, 0xa9, 0x22, 0x75, 0x81, 0x8b, 0xd2, 0x8e, 0xd2, 0x8c, 0xd2, 0xaf, | 336 | 0x08, 0xf8, 0xef, 0x44, 0x80, 0xf6, 0xd0, 0x04, 0xd0, 0x06, 0xd0, 0x00, 0xd0, 0x83, 0xd0, 0x82, |
337 | 0xe5, 0x43, 0x60, 0x36, 0xff, 0x90, 0xf9, 0x1b, 0xe0, 0x54, 0x80, 0x60, 0x28, 0x78, 0x08, 0x79, | 337 | 0xd0, 0xf0, 0x22, 0x75, 0x3e, 0x00, 0x75, 0x43, 0x00, 0x7a, 0x08, 0x79, 0x18, 0x78, 0x08, 0x76, |
338 | 0x08, 0xe0, 0x54, 0x7f, 0xfa, 0x7b, 0x00, 0xe6, 0x54, 0x7f, 0xb5, 0x02, 0x02, 0x7b, 0xff, 0x08, | 338 | 0x00, 0x77, 0x00, 0x08, 0x09, 0xda, 0xf8, 0x90, 0xf8, 0x04, 0xe0, 0xfc, 0x90, 0x31, 0x11, 0xe4, |
339 | 0xd9, 0xf5, 0xeb, 0x70, 0x10, 0xea, 0xf0, 0xc0, 0x07, 0x12, 0x12, 0x41, 0xad, 0x07, 0xaf, 0x02, | 339 | 0x93, 0xc3, 0x9c, 0x50, 0x05, 0xe4, 0x90, 0xf8, 0x04, 0xf0, 0x78, 0x08, 0x74, 0x80, 0x44, 0x7f, |
340 | 0x12, 0x12, 0x58, 0xd0, 0x07, 0xa3, 0xa3, 0xa3, 0xdf, 0xce, 0x12, 0x11, 0x66, 0x80, 0xc1, 0x8f, | 340 | 0xf6, 0x74, 0x01, 0x44, 0x10, 0xf5, 0x89, 0x75, 0xb8, 0x00, 0xd2, 0xab, 0xd2, 0xa9, 0x22, 0x75, |
341 | 0x24, 0x12, 0x2a, 0x06, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x08, 0x12, | 341 | 0x81, 0x8b, 0xd2, 0x8e, 0xd2, 0x8c, 0xd2, 0xaf, 0xe5, 0x43, 0x60, 0x36, 0xff, 0x90, 0xf9, 0x1d, |
342 | 0x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xed, 0xf0, | 342 | 0xe0, 0x54, 0x80, 0x60, 0x28, 0x78, 0x08, 0x79, 0x08, 0xe0, 0x54, 0x7f, 0xfa, 0x7b, 0x00, 0xe6, |
343 | 0x12, 0x22, 0x56, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x12, 0x22, 0x99, 0x24, 0x09, 0x12, | 343 | 0x54, 0x7f, 0xb5, 0x02, 0x02, 0x7b, 0xff, 0x08, 0xd9, 0xf5, 0xeb, 0x70, 0x10, 0xea, 0xf0, 0xc0, |
344 | 0x21, 0xf3, 0xef, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe4, 0x20, 0x08, 0x12, 0x22, 0x09, 0xc0, | 344 | 0x07, 0x12, 0x12, 0x89, 0xad, 0x07, 0xaf, 0x02, 0x12, 0x12, 0xa0, 0xd0, 0x07, 0xa3, 0xa3, 0xa3, |
345 | 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0x25, 0xe0, 0xff, 0x05, 0x82, 0xd5, 0x82, 0x02, 0x15, 0x83, 0x15, | 345 | 0xdf, 0xce, 0x12, 0x11, 0xae, 0x80, 0xc1, 0x8f, 0x24, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xb5, 0xa3, |
346 | 0x82, 0xe0, 0x33, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x78, 0x80, 0x12, 0x22, 0x09, | 346 | 0xa3, 0xe0, 0xa3, 0x30, 0xe7, 0x28, 0x78, 0x7e, 0x12, 0x22, 0x99, 0xe0, 0x44, 0x01, 0xf0, 0x12, |
347 | 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0xff, 0x12, 0x22, 0x8a, 0x8a, 0x83, 0x24, 0x08, 0x12, 0x21, | 347 | 0x22, 0xfa, 0x12, 0x22, 0x9d, 0xe0, 0x20, 0xe0, 0xf6, 0x12, 0x23, 0x50, 0x74, 0x02, 0xf0, 0x12, |
348 | 0xf3, 0xef, 0xf0, 0xed, 0x12, 0x22, 0x99, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xed, 0xf0, 0x12, 0x21, | 348 | 0x22, 0xda, 0xe0, 0xa3, 0x30, 0xe5, 0x07, 0x12, 0x23, 0x50, 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x80, |
349 | 0xfb, 0xe0, 0xff, 0x30, 0xe7, 0x19, 0x12, 0x22, 0x6e, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x09, 0x12, | 349 | 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x08, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0x12, 0x23, |
350 | 0x21, 0xfb, 0xef, 0x44, 0x02, 0xf0, 0x80, 0x07, 0x12, 0x21, 0xfb, 0xef, 0x54, 0xfd, 0xf0, 0x78, | 350 | 0x39, 0x8a, 0x83, 0x24, 0x0a, 0x12, 0x22, 0xa1, 0xed, 0xf0, 0x12, 0x23, 0x06, 0x24, 0x07, 0x12, |
351 | 0x7e, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xff, 0x53, 0x07, 0xc7, 0x08, 0xe6, 0xfc, 0x08, 0xe6, | 351 | 0x22, 0xa1, 0xe0, 0xff, 0x12, 0x23, 0x5a, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0x90, 0xf9, |
352 | 0xfd, 0x12, 0x22, 0x43, 0xa3, 0xe0, 0x30, 0xe3, 0x12, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, | 352 | 0x16, 0xe0, 0x30, 0xe4, 0x20, 0x08, 0x12, 0x22, 0xb7, 0xc0, 0x83, 0xc0, 0x82, 0xa3, 0xe0, 0x25, |
353 | 0x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x31, 0x94, 0x93, 0x42, 0x07, 0x53, 0x07, 0xfb, 0x78, 0x80, | 353 | 0xe0, 0xff, 0x05, 0x82, 0xd5, 0x82, 0x02, 0x15, 0x83, 0x15, 0x82, 0xe0, 0x33, 0xd0, 0x82, 0xd0, |
354 | 0xe6, 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x06, 0x12, 0x21, 0xf3, 0xe0, 0x60, 0x03, 0x43, 0x07, | 354 | 0x83, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x22, 0xb5, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xec, 0xff, 0x12, |
355 | 0x04, 0x53, 0x07, 0xfc, 0x78, 0x80, 0x12, 0x22, 0x7a, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x42, | 355 | 0x23, 0x39, 0x8a, 0x83, 0x24, 0x08, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0xed, 0x12, 0x23, 0x5a, 0x24, |
356 | 0x07, 0x43, 0x07, 0x80, 0x12, 0x22, 0x8a, 0xf5, 0x82, 0x8a, 0x83, 0xa3, 0xa3, 0xef, 0xf0, 0x12, | 356 | 0x07, 0x12, 0x22, 0xa1, 0xed, 0xf0, 0x12, 0x22, 0xa9, 0xe0, 0x30, 0xe6, 0x0a, 0x12, 0x23, 0x41, |
357 | 0x22, 0x99, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0xff, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xe0, | 357 | 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe4, 0xf0, 0x12, 0x22, 0xa9, 0xe0, 0xff, 0x30, 0xe7, 0x1b, 0x12, |
358 | 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe1, 0x05, 0x53, 0x07, 0xdf, 0x80, 0x03, 0x43, 0x07, 0x20, 0xec, | 358 | 0x23, 0x1e, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x60, 0x09, 0x12, 0x22, 0xa9, 0xef, 0x44, 0x02, |
359 | 0x30, 0xe4, 0x05, 0x53, 0x07, 0xef, 0x80, 0x03, 0x43, 0x07, 0x10, 0x12, 0x21, 0xfb, 0xe0, 0xfe, | 359 | 0xf0, 0x80, 0x07, 0x12, 0x22, 0xa9, 0xef, 0x54, 0xfd, 0xf0, 0x78, 0x7e, 0x12, 0x22, 0xb7, 0xa3, |
360 | 0x54, 0x03, 0x60, 0x73, 0x53, 0x07, 0xdf, 0xee, 0x30, 0xe1, 0x69, 0x78, 0x80, 0x12, 0x22, 0x6f, | 360 | 0xa3, 0xe0, 0xff, 0x53, 0x07, 0xc7, 0x08, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x12, 0x22, 0xe0, 0xa3, |
361 | 0x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x14, 0xa6, 0x00, 0x14, 0xda, 0x01, 0x14, 0xdf, 0x03, | 361 | 0xe0, 0x30, 0xe3, 0x12, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x05, 0x12, 0x22, 0xa1, 0xe0, |
362 | 0x14, 0xda, 0x05, 0x14, 0xdf, 0x07, 0x14, 0xda, 0x09, 0x14, 0xdf, 0x0b, 0x14, 0xda, 0x0d, 0x14, | 362 | 0x90, 0x32, 0x51, 0x93, 0x42, 0x07, 0x53, 0x07, 0xfb, 0x12, 0x23, 0x1e, 0x24, 0x06, 0x12, 0x22, |
363 | 0xdf, 0x0f, 0x00, 0x00, 0x14, 0xe7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x21, 0x90, 0xf9, 0x15, 0xe0, | 363 | 0xa1, 0xe0, 0x60, 0x03, 0x43, 0x07, 0x04, 0x53, 0x07, 0xfc, 0x78, 0x80, 0x12, 0x23, 0x29, 0x24, |
364 | 0x30, 0xe2, 0x0d, 0x30, 0xb4, 0x05, 0x43, 0x07, 0x02, 0x80, 0x2c, 0x53, 0x07, 0xfd, 0x80, 0x27, | 364 | 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x42, 0x07, 0x43, 0x07, 0x80, 0x12, 0x23, 0x39, 0xf5, 0x82, 0x8a, |
365 | 0x30, 0x95, 0x05, 0x43, 0x07, 0x02, 0x80, 0x1f, 0x53, 0x07, 0xfd, 0x80, 0x1a, 0x30, 0x93, 0x05, | 365 | 0x83, 0xa3, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0x5a, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0xff, 0x8d, |
366 | 0x43, 0x07, 0x02, 0x80, 0x12, 0x53, 0x07, 0xfd, 0x80, 0x0d, 0x43, 0x07, 0x02, 0x80, 0x08, 0x53, | 366 | 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe1, 0x05, 0x53, 0x07, 0xdf, |
367 | 0x07, 0xfd, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x12, 0x22, 0x78, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xef, | 367 | 0x80, 0x03, 0x43, 0x07, 0x20, 0xec, 0x30, 0xe4, 0x05, 0x53, 0x07, 0xef, 0x80, 0x03, 0x43, 0x07, |
368 | 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xff, 0x12, 0x21, 0xfb, 0xe0, 0xfe, 0x54, | 368 | 0x10, 0x12, 0x22, 0xa9, 0xe0, 0xfe, 0x54, 0x03, 0x60, 0x73, 0x53, 0x07, 0xdf, 0xee, 0x30, 0xe1, |
369 | 0x03, 0x70, 0x03, 0x02, 0x15, 0xd7, 0xee, 0x20, 0xe1, 0x03, 0x02, 0x15, 0xd4, 0x12, 0x22, 0x6e, | 369 | 0x69, 0x12, 0x23, 0x1e, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x12, 0x1b, 0xfc, 0x15, 0x2c, 0x00, |
370 | 0x12, 0x21, 0xf3, 0xe0, 0x12, 0x1b, 0x4c, 0x15, 0x36, 0x00, 0x15, 0x6c, 0x01, 0x15, 0x6c, 0x03, | 370 | 0x15, 0x60, 0x01, 0x15, 0x65, 0x03, 0x15, 0x60, 0x05, 0x15, 0x65, 0x07, 0x15, 0x60, 0x09, 0x15, |
371 | 0x15, 0xa0, 0x05, 0x15, 0xa0, 0x07, 0x15, 0x86, 0x09, 0x15, 0x86, 0x0b, 0x15, 0xba, 0x0d, 0x15, | 371 | 0x65, 0x0b, 0x15, 0x60, 0x0d, 0x15, 0x65, 0x0f, 0x00, 0x00, 0x15, 0x6d, 0xe5, 0x24, 0x64, 0x03, |
372 | 0xba, 0x0f, 0x00, 0x00, 0x15, 0xd7, 0xe5, 0x24, 0x64, 0x03, 0x70, 0x23, 0x90, 0xf9, 0x15, 0xe0, | 372 | 0x70, 0x21, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe2, 0x0d, 0x30, 0xb4, 0x05, 0x43, 0x07, 0x02, 0x80, |
373 | 0x30, 0xe2, 0x0f, 0x30, 0xb1, 0x06, 0x53, 0x07, 0x7f, 0x02, 0x15, 0xd7, 0x43, 0x07, 0x80, 0x02, | 373 | 0x2c, 0x53, 0x07, 0xfd, 0x80, 0x27, 0x30, 0x95, 0x05, 0x43, 0x07, 0x02, 0x80, 0x1f, 0x53, 0x07, |
374 | 0x15, 0xd7, 0x30, 0x94, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x7d, 0x43, 0x07, 0x80, 0x80, 0x78, 0x30, | 374 | 0xfd, 0x80, 0x1a, 0x30, 0x93, 0x05, 0x43, 0x07, 0x02, 0x80, 0x12, 0x53, 0x07, 0xfd, 0x80, 0x0d, |
375 | 0x92, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x70, 0x43, 0x07, 0x80, 0x80, 0x6b, 0xe5, 0x24, 0xb4, 0x03, | 375 | 0x43, 0x07, 0x02, 0x80, 0x08, 0x53, 0x07, 0xfd, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x12, 0x23, 0x27, |
376 | 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, | 376 | 0x24, 0x04, 0x12, 0x22, 0xa1, 0xef, 0xf0, 0x8d, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xff, |
377 | 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x51, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, | 377 | 0x12, 0x22, 0xa9, 0xe0, 0xfe, 0x54, 0x03, 0x70, 0x03, 0x02, 0x16, 0x60, 0xee, 0x20, 0xe1, 0x03, |
378 | 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x37, | 378 | 0x02, 0x16, 0x5d, 0x08, 0x12, 0x23, 0x20, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0x12, 0x1b, 0xfc, |
379 | 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, | 379 | 0x15, 0xbf, 0x00, 0x15, 0xf5, 0x01, 0x15, 0xf5, 0x03, 0x16, 0x29, 0x05, 0x16, 0x29, 0x07, 0x16, |
380 | 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x43, 0x07, 0x80, 0x80, 0x1d, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, | 380 | 0x0f, 0x09, 0x16, 0x0f, 0x0b, 0x16, 0x43, 0x0d, 0x16, 0x43, 0x0f, 0x00, 0x00, 0x16, 0x60, 0xe5, |
381 | 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x43, | 381 | 0x24, 0x64, 0x03, 0x70, 0x23, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe2, 0x0f, 0x30, 0xb1, 0x06, 0x53, |
382 | 0x07, 0x80, 0x80, 0x03, 0x53, 0x07, 0x7f, 0x78, 0x80, 0x12, 0x22, 0x3f, 0xe0, 0xfc, 0xa3, 0xe0, | 382 | 0x07, 0x7f, 0x02, 0x16, 0x60, 0x43, 0x07, 0x80, 0x02, 0x16, 0x60, 0x30, 0x94, 0x05, 0x53, 0x07, |
383 | 0xfd, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x20, 0x80, 0x03, 0x53, 0x07, 0xdf, 0xec, 0x30, 0xe3, 0x05, | 383 | 0x7f, 0x80, 0x7d, 0x43, 0x07, 0x80, 0x80, 0x78, 0x30, 0x92, 0x05, 0x53, 0x07, 0x7f, 0x80, 0x70, |
384 | 0x43, 0x07, 0x40, 0x80, 0x03, 0x53, 0x07, 0xbf, 0xec, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x10, 0x80, | 384 | 0x43, 0x07, 0x80, 0x80, 0x6b, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xef, |
385 | 0x03, 0x53, 0x07, 0xef, 0xed, 0x30, 0xe4, 0x05, 0x43, 0x07, 0x08, 0x80, 0x03, 0x53, 0x07, 0xf7, | 385 | 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x51, 0xe5, |
386 | 0xed, 0x30, 0xe5, 0x05, 0x43, 0x07, 0x04, 0x80, 0x03, 0x53, 0x07, 0xfb, 0xed, 0x30, 0xe6, 0x05, | 386 | 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, |
387 | 0x43, 0x07, 0x01, 0x80, 0x03, 0x53, 0x07, 0xfe, 0xed, 0x30, 0xe7, 0x05, 0x43, 0x07, 0x02, 0x80, | 387 | 0xe0, 0x44, 0x20, 0xf0, 0x53, 0x07, 0x7f, 0x80, 0x37, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, |
388 | 0x03, 0x53, 0x07, 0xfd, 0x78, 0x7e, 0x12, 0x22, 0x3f, 0xa3, 0xef, 0xf0, 0x12, 0x31, 0xc7, 0x7f, | 388 | 0x9e, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xdf, 0xf0, 0x43, 0x07, |
389 | 0x00, 0x22, 0x90, 0xff, 0xfa, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x16, 0xf0, 0x90, 0xff, 0xf9, 0x74, | 389 | 0x80, 0x80, 0x1d, 0xe5, 0x24, 0xb4, 0x03, 0x09, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x10, 0xf0, 0x80, |
390 | 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc, | 390 | 0x07, 0x90, 0xff, 0x9e, 0xe0, 0x44, 0x20, 0xf0, 0x43, 0x07, 0x80, 0x80, 0x03, 0x53, 0x07, 0x7f, |
391 | 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1a, 0x6c, 0x12, 0x18, 0xe2, 0xe5, 0x23, 0x30, 0xe7, 0x02, 0xd2, | 391 | 0x12, 0x22, 0xda, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x30, 0xe0, 0x05, 0x43, 0x07, 0x20, 0x80, 0x03, |
392 | 0x02, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x90, 0xfa, 0xcc, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, | 392 | 0x53, 0x07, 0xdf, 0xec, 0x30, 0xe3, 0x05, 0x43, 0x07, 0x40, 0x80, 0x03, 0x53, 0x07, 0xbf, 0xec, |
393 | 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x7b, | 393 | 0x30, 0xe0, 0x05, 0x43, 0x07, 0x10, 0x80, 0x03, 0x53, 0x07, 0xef, 0xed, 0x30, 0xe4, 0x05, 0x43, |
394 | 0x00, 0x7a, 0x00, 0x79, 0x23, 0x75, 0x2d, 0x00, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0xe5, | 394 | 0x07, 0x08, 0x80, 0x03, 0x53, 0x07, 0xf7, 0xed, 0x30, 0xe5, 0x05, 0x43, 0x07, 0x04, 0x80, 0x03, |
395 | 0x23, 0x24, 0x80, 0x90, 0xff, 0xf8, 0xf0, 0xe5, 0x23, 0x64, 0x07, 0x60, 0x1e, 0xe5, 0x23, 0x64, | 395 | 0x53, 0x07, 0xfb, 0xed, 0x30, 0xe6, 0x05, 0x43, 0x07, 0x01, 0x80, 0x03, 0x53, 0x07, 0xfe, 0xed, |
396 | 0x06, 0x60, 0x18, 0xe5, 0x23, 0x64, 0x14, 0x60, 0x12, 0xe5, 0x23, 0x64, 0x41, 0x60, 0x0c, 0xe5, | 396 | 0x30, 0xe7, 0x05, 0x43, 0x07, 0x02, 0x80, 0x03, 0x53, 0x07, 0xfd, 0x78, 0x7e, 0x12, 0x22, 0xdc, |
397 | 0x23, 0x64, 0x1a, 0x70, 0x46, 0xe5, 0x24, 0x64, 0x02, 0x70, 0x40, 0xe5, 0x23, 0xb4, 0x07, 0x16, | 397 | 0xa3, 0xef, 0xf0, 0x12, 0x32, 0x84, 0x7f, 0x00, 0x22, 0x90, 0xff, 0xfa, 0x74, 0x08, 0xf0, 0xa3, |
398 | 0xd2, 0x94, 0xd2, 0x95, 0xd2, 0x92, 0xd2, 0x93, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x02, 0xf0, 0xa3, | 398 | 0x74, 0x16, 0xf0, 0x90, 0xff, 0xf9, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcf, 0xe4, |
399 | 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1e, 0xe5, 0x23, 0xb4, 0x41, 0x12, 0x90, 0xf9, 0x15, 0xe0, 0x44, | 399 | 0xfd, 0x12, 0x23, 0x61, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x03, 0x12, 0x1b, 0x1c, 0x12, 0x19, |
400 | 0x06, 0xf0, 0xa3, 0xe0, 0x44, 0x06, 0xf0, 0xd2, 0xb1, 0xd2, 0xb4, 0x80, 0x07, 0x90, 0xf9, 0x15, | 400 | 0x92, 0xe5, 0x23, 0x30, 0xe7, 0x02, 0xd2, 0x02, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x24, 0x90, 0xfa, |
401 | 0xe0, 0x44, 0x01, 0xf0, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x01, 0xf0, 0xe5, 0x23, 0x64, 0x42, 0x60, | 401 | 0xcf, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xcf, |
402 | 0x05, 0xe5, 0x23, 0xb4, 0x43, 0x0c, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x80, 0xf0, 0xa3, 0xe0, 0x44, | 402 | 0xe4, 0xf0, 0xa3, 0x74, 0x0b, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x75, 0x2d, 0x00, 0xf5, |
403 | 0x80, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0x12, 0x18, 0xe2, 0x90, 0xff, | 403 | 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0xe5, 0x23, 0x24, 0x80, 0x90, 0xff, 0xf8, 0xf0, 0xe5, 0x23, |
404 | 0xf5, 0xe5, 0x23, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x33, 0xf5, 0x34, 0xf5, 0x32, 0x12, 0x1d, 0x84, | 404 | 0x64, 0x07, 0x60, 0x1e, 0xe5, 0x23, 0x64, 0x06, 0x60, 0x18, 0xe5, 0x23, 0x64, 0x14, 0x60, 0x12, |
405 | 0x12, 0x1c, 0x30, 0x12, 0x1d, 0x8b, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x43, 0x90, 0xf9, 0x6c, 0x12, | 405 | 0xe5, 0x23, 0x64, 0x41, 0x60, 0x0c, 0xe5, 0x23, 0x64, 0x1a, 0x70, 0x46, 0xe5, 0x24, 0x64, 0x02, |
406 | 0x1b, 0x43, 0x90, 0xff, 0xff, 0xe4, 0xf0, 0x90, 0xff, 0x83, 0xe0, 0xe4, 0xf0, 0x90, 0xff, 0x81, | 406 | 0x70, 0x40, 0xe5, 0x23, 0xb4, 0x07, 0x16, 0xd2, 0x94, 0xd2, 0x95, 0xd2, 0x92, 0xd2, 0x93, 0x90, |
407 | 0xf9, 0x16, 0xe0, 0x44, 0x02, 0xf0, 0xa3, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1e, 0xe5, 0x23, 0xb4, | ||
408 | 0x41, 0x12, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x06, 0xf0, 0xa3, 0xe0, 0x44, 0x06, 0xf0, 0xd2, 0xb1, | ||
409 | 0xd2, 0xb4, 0x80, 0x07, 0x90, 0xf9, 0x16, 0xe0, 0x44, 0x01, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x44, | ||
410 | 0x01, 0xf0, 0xe5, 0x23, 0x64, 0x42, 0x60, 0x0c, 0xe5, 0x23, 0x64, 0x43, 0x60, 0x06, 0xe5, 0x23, | ||
411 | 0x64, 0x44, 0x70, 0x2e, 0x90, 0xf9, 0x16, 0xe0, 0xff, 0xe5, 0x23, 0xb4, 0x44, 0x04, 0x7e, 0x40, | ||
412 | 0x80, 0x02, 0x7e, 0x00, 0xee, 0x24, 0x80, 0x4f, 0x90, 0xf9, 0x16, 0xf0, 0xa3, 0xe0, 0xff, 0xe5, | ||
413 | 0x23, 0xb4, 0x44, 0x04, 0x7e, 0x40, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x24, 0x80, 0x4f, 0x90, 0xf9, | ||
414 | 0x17, 0xf0, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, 0xa3, 0x74, 0x0d, 0xf0, 0x12, 0x19, 0x92, 0x90, 0xff, | ||
415 | 0xf5, 0xe5, 0x23, 0xf0, 0xe4, 0xf5, 0x35, 0xf5, 0x33, 0xf5, 0x34, 0xf5, 0x32, 0x12, 0x1e, 0x34, | ||
416 | 0x12, 0x1c, 0xe0, 0x12, 0x1e, 0x3b, 0x90, 0xf9, 0x6a, 0x12, 0x1b, 0xf3, 0x90, 0xf9, 0x6f, 0x12, | ||
417 | 0x1b, 0xf3, 0x90, 0xff, 0xff, 0xe4, 0xf0, 0x90, 0xff, 0x83, 0xe0, 0xe4, 0xf0, 0x90, 0xff, 0x81, | ||
407 | 0x74, 0x80, 0xf0, 0xa3, 0x74, 0x84, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xe4, 0xf5, 0x23, 0xe5, 0x23, | 418 | 0x74, 0x80, 0xf0, 0xa3, 0x74, 0x84, 0xf0, 0x90, 0xff, 0x80, 0xf0, 0xe4, 0xf5, 0x23, 0xe5, 0x23, |
408 | 0x12, 0x1c, 0xa7, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x23, 0x12, 0x1c, 0xb5, 0xf5, 0x83, 0xe4, 0xf0, | 419 | 0x12, 0x1d, 0x57, 0xf5, 0x83, 0xe4, 0xf0, 0xe5, 0x23, 0x12, 0x1d, 0x65, 0xf5, 0x83, 0xe4, 0xf0, |
409 | 0x05, 0x23, 0xe5, 0x23, 0xb4, 0x07, 0xe7, 0x78, 0x7a, 0x76, 0xfe, 0x08, 0x76, 0xf0, 0x90, 0x31, | 420 | 0x05, 0x23, 0xe5, 0x23, 0xb4, 0x07, 0xe7, 0x78, 0x7a, 0x76, 0xfe, 0x08, 0x76, 0xf0, 0x90, 0x32, |
410 | 0x4d, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xad, 0x07, 0x90, 0x31, 0x5a, 0xe4, 0x93, 0xff, | 421 | 0x0a, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xad, 0x07, 0x90, 0x32, 0x17, 0xe4, 0x93, 0xff, |
411 | 0x08, 0xf6, 0xff, 0xed, 0x54, 0x0f, 0xfd, 0x12, 0x1c, 0x97, 0x74, 0x84, 0xf0, 0xed, 0x75, 0xf0, | 422 | 0x08, 0xf6, 0xff, 0xed, 0x54, 0x0f, 0xfd, 0x12, 0x1d, 0x47, 0x74, 0x84, 0xf0, 0xed, 0x75, 0xf0, |
412 | 0x08, 0xa4, 0x24, 0x47, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xc3, 0x74, 0xf0, | 423 | 0x08, 0xa4, 0x24, 0x47, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xc3, 0x74, 0xf0, |
413 | 0x9f, 0x78, 0x7b, 0xf6, 0x74, 0xfe, 0x94, 0x00, 0x18, 0x12, 0x1c, 0x28, 0xce, 0xc3, 0x13, 0xce, | 424 | 0x9f, 0x78, 0x7b, 0xf6, 0x74, 0xfe, 0x94, 0x00, 0x18, 0x12, 0x1c, 0xd8, 0xce, 0xc3, 0x13, 0xce, |
414 | 0x13, 0xd8, 0xf9, 0xff, 0xed, 0x12, 0x1c, 0xf8, 0xef, 0xf0, 0xed, 0x12, 0x1d, 0x1e, 0xe4, 0xf5, | 425 | 0x13, 0xd8, 0xf9, 0xff, 0xed, 0x12, 0x1d, 0xa8, 0xef, 0xf0, 0xed, 0x12, 0x1d, 0xce, 0xe4, 0xf5, |
415 | 0x23, 0xe5, 0x23, 0x90, 0x31, 0x47, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xe5, 0x23, 0x25, 0xe0, | 426 | 0x23, 0xe5, 0x23, 0x90, 0x32, 0x04, 0x93, 0xff, 0x78, 0x78, 0xf6, 0xfd, 0xe5, 0x23, 0x25, 0xe0, |
416 | 0x24, 0x4e, 0xf5, 0x82, 0xe4, 0x34, 0x31, 0xf5, 0x83, 0xe4, 0x93, 0x08, 0xf6, 0xed, 0x30, 0xe7, | 427 | 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x34, 0x32, 0xf5, 0x83, 0xe4, 0x93, 0x08, 0xf6, 0xed, 0x30, 0xe7, |
417 | 0x53, 0x18, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0x97, 0x12, 0x1d, 0x06, 0x24, 0x47, 0xf5, 0x82, | 428 | 0x53, 0x18, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1d, 0x47, 0x12, 0x1d, 0xb6, 0x24, 0x47, 0xf5, 0x82, |
418 | 0xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe9, 0x12, | 429 | 0xe4, 0x34, 0xff, 0x12, 0x1c, 0xc8, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff, 0xe9, 0x12, |
419 | 0x1c, 0xf8, 0xef, 0xf0, 0x12, 0x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, | 430 | 0x1d, 0xa8, 0xef, 0xf0, 0x12, 0x1c, 0xcf, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, |
420 | 0x0b, 0x24, 0x45, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x12, 0x1d, 0x1e, | 431 | 0xbb, 0x24, 0x45, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x12, 0x1d, 0xce, |
421 | 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x46, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, | 432 | 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x46, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, |
422 | 0xf0, 0x02, 0x18, 0xb7, 0x78, 0x78, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1c, 0xea, 0x12, 0x1d, 0x06, | 433 | 0xf0, 0x02, 0x19, 0x67, 0x78, 0x78, 0xe6, 0x54, 0x0f, 0xf9, 0x12, 0x1d, 0x9a, 0x12, 0x1d, 0xb6, |
423 | 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0x12, 0x1c, 0x18, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, | 434 | 0x24, 0x07, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0x12, 0x1c, 0xc8, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, |
424 | 0xf9, 0x12, 0x1d, 0x0b, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0x12, | 435 | 0xf9, 0x12, 0x1d, 0xbb, 0x24, 0x01, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0x12, |
425 | 0x1c, 0x1f, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 0x0b, 0x24, 0x05, 0xf5, 0x82, | 436 | 0x1c, 0xcf, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0x12, 0x1d, 0xbb, 0x24, 0x05, 0xf5, 0x82, |
426 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, | 437 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xef, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x02, 0xf5, 0x82, |
427 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, | 438 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0xe9, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x06, 0xf5, 0x82, |
428 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0x64, 0x04, 0x60, 0x03, 0x02, | 439 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0xe4, 0xf0, 0x05, 0x23, 0xe5, 0x23, 0x64, 0x04, 0x60, 0x03, 0x02, |
429 | 0x17, 0xe1, 0x90, 0x31, 0x4c, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0x12, 0x1c, 0xe8, 0xe4, 0xf0, | 440 | 0x18, 0x91, 0x90, 0x32, 0x09, 0xe4, 0x93, 0xff, 0x78, 0x78, 0xf6, 0x12, 0x1d, 0x98, 0xe4, 0xf0, |
430 | 0x90, 0x31, 0x4b, 0x93, 0xff, 0xf6, 0x12, 0x1c, 0x95, 0xe4, 0xf0, 0x90, 0xff, 0xfd, 0x74, 0x05, | 441 | 0x90, 0x32, 0x08, 0x93, 0xff, 0xf6, 0x12, 0x1d, 0x45, 0xe4, 0xf0, 0x90, 0xff, 0xfd, 0x74, 0x05, |
431 | 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, | 442 | 0xf0, 0x22, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, |
432 | 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0xe7, 0x09, 0xf6, 0x08, | 443 | 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x26, 0x98, 0xe7, 0x09, 0xf6, 0x08, |
433 | 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, | 444 | 0xdf, 0xfa, 0x80, 0x46, 0xe7, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x3e, 0x88, 0x82, 0x8c, 0x83, |
434 | 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, | 445 | 0xe7, 0x09, 0xf0, 0xa3, 0xdf, 0xfa, 0x80, 0x32, 0xe3, 0x09, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x78, |
435 | 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, | 446 | 0xe3, 0x09, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x70, 0x88, 0x82, 0x8c, 0x83, 0xe3, 0x09, 0xf0, 0xa3, |
436 | 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, | 447 | 0xdf, 0xfa, 0x80, 0x64, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf6, 0x08, 0xdf, 0xfa, 0x80, 0x58, |
437 | 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, | 448 | 0x89, 0x82, 0x8a, 0x83, 0xe0, 0xa3, 0xf2, 0x08, 0xdf, 0xfa, 0x80, 0x4c, 0x80, 0xd2, 0x80, 0xfa, |
438 | 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, | 449 | 0x80, 0xc6, 0x80, 0xd4, 0x80, 0x69, 0x80, 0xf2, 0x80, 0x33, 0x80, 0x10, 0x80, 0xa6, 0x80, 0xea, |
439 | 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, | 450 | 0x80, 0x9a, 0x80, 0xa8, 0x80, 0xda, 0x80, 0xe2, 0x80, 0xca, 0x80, 0x33, 0x89, 0x82, 0x8a, 0x83, |
440 | 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, | 451 | 0xec, 0xfa, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, 0xa3, 0xc8, |
441 | 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, | 452 | 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0x0d, 0x89, 0x82, 0x8a, |
442 | 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, | 453 | 0x83, 0xe4, 0x93, 0xa3, 0xf6, 0x08, 0xdf, 0xf9, 0xec, 0xfa, 0xa9, 0xf0, 0xed, 0xfb, 0x22, 0x89, |
443 | 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, | 454 | 0x82, 0x8a, 0x83, 0xec, 0xfa, 0xe0, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xf0, |
444 | 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, | 455 | 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xcc, 0xc5, 0x83, 0xcc, 0xdf, 0xea, 0xde, 0xe8, 0x80, 0xdb, 0x89, |
445 | 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, | 456 | 0x82, 0x8a, 0x83, 0xe4, 0x93, 0xa3, 0xf2, 0x08, 0xdf, 0xf9, 0x80, 0xcc, 0x88, 0xf0, 0xef, 0x60, |
446 | 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, | 457 | 0x01, 0x0e, 0x4e, 0x60, 0xc3, 0x88, 0xf0, 0xed, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xb9, 0xf5, |
447 | 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x19, | 458 | 0x82, 0xeb, 0x24, 0x02, 0xb4, 0x04, 0x00, 0x50, 0xaf, 0x23, 0x23, 0x45, 0x82, 0x23, 0x90, 0x19, |
448 | 0x4c, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, | 459 | 0xfc, 0x73, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xe0, 0x22, 0x50, 0x02, 0xe7, 0x22, 0xbb, |
449 | 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, | 460 | 0xfe, 0x02, 0xe3, 0x22, 0x89, 0x82, 0x8a, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x0c, 0xe5, 0x82, |
450 | 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, | 461 | 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, 0xf8, |
451 | 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, | 462 | 0xe6, 0x22, 0xbb, 0xfe, 0x06, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0x22, 0xe5, 0x82, 0x29, 0xf5, 0x82, |
452 | 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, | 463 | 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe4, 0x93, 0x22, 0xbb, 0x01, 0x06, 0x89, 0x82, 0x8a, 0x83, 0xf0, |
453 | 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, | 464 | 0x22, 0x50, 0x02, 0xf7, 0x22, 0xbb, 0xfe, 0x01, 0xf3, 0x22, 0xf8, 0xbb, 0x01, 0x0d, 0xe5, 0x82, |
454 | 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, | 465 | 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0x22, 0x50, 0x06, 0xe9, 0x25, 0x82, |
455 | 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xc5, 0xf0, 0xf8, 0xa3, | 466 | 0xc8, 0xf6, 0x22, 0xbb, 0xfe, 0x05, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0x22, 0xc5, 0xf0, 0xf8, 0xa3, |
456 | 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38, | 467 | 0xe0, 0x28, 0xf0, 0xc5, 0xf0, 0xf8, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, 0x15, 0x83, 0xe0, 0x38, |
457 | 0xf0, 0x22, 0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, | 468 | 0xf0, 0x22, 0xa3, 0xf8, 0xe0, 0xc5, 0xf0, 0x25, 0xf0, 0xf0, 0xe5, 0x82, 0x15, 0x82, 0x70, 0x02, |
458 | 0x15, 0x83, 0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, | 469 | 0x15, 0x83, 0xe0, 0xc8, 0x38, 0xf0, 0xe8, 0x22, 0xbb, 0x01, 0x10, 0xe5, 0x82, 0x29, 0xf5, 0x82, |
459 | 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, | 470 | 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe0, 0xf5, 0xf0, 0xa3, 0xe0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, |
460 | 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, | 471 | 0xf8, 0x86, 0xf0, 0x08, 0xe6, 0x22, 0xbb, 0xfe, 0x0a, 0xe9, 0x25, 0x82, 0xf8, 0xe2, 0xf5, 0xf0, |
461 | 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, | 472 | 0x08, 0xe2, 0x22, 0xe5, 0x83, 0x2a, 0xf5, 0x83, 0xe9, 0x93, 0xf5, 0xf0, 0xa3, 0xe9, 0x93, 0x22, |
462 | 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7, | 473 | 0xbb, 0x01, 0x0a, 0x89, 0x82, 0x8a, 0x83, 0xf0, 0xe5, 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x06, 0xf7, |
463 | 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8, | 474 | 0x09, 0xa7, 0xf0, 0x19, 0x22, 0xbb, 0xfe, 0x06, 0xf3, 0xe5, 0xf0, 0x09, 0xf3, 0x19, 0x22, 0xf8, |
464 | 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5, | 475 | 0xbb, 0x01, 0x11, 0xe5, 0x82, 0x29, 0xf5, 0x82, 0xe5, 0x83, 0x3a, 0xf5, 0x83, 0xe8, 0xf0, 0xe5, |
465 | 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb, | 476 | 0xf0, 0xa3, 0xf0, 0x22, 0x50, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf6, 0x08, 0xa6, 0xf0, 0x22, 0xbb, |
466 | 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xa4, 0x25, 0x82, 0xf5, | 477 | 0xfe, 0x09, 0xe9, 0x25, 0x82, 0xc8, 0xf2, 0xe5, 0xf0, 0x08, 0xf2, 0x22, 0xa4, 0x25, 0x82, 0xf5, |
467 | 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf9, | 478 | 0x82, 0xe5, 0xf0, 0x35, 0x83, 0xf5, 0x83, 0x22, 0xe6, 0xfb, 0x08, 0xe6, 0xfa, 0x08, 0xe6, 0xf9, |
468 | 0x22, 0xeb, 0xf6, 0x08, 0xea, 0xf6, 0x08, 0xe9, 0xf6, 0x22, 0xe0, 0xfb, 0xa3, 0xe0, 0xfa, 0xa3, | 479 | 0x22, 0xeb, 0xf6, 0x08, 0xea, 0xf6, 0x08, 0xe9, 0xf6, 0x22, 0xe0, 0xfb, 0xa3, 0xe0, 0xfa, 0xa3, |
469 | 0xe0, 0xf9, 0x22, 0xeb, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xe9, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82, | 480 | 0xe0, 0xf9, 0x22, 0xeb, 0xf0, 0xa3, 0xea, 0xf0, 0xa3, 0xe9, 0xf0, 0x22, 0xd0, 0x83, 0xd0, 0x82, |
470 | 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, | 481 | 0xf8, 0xe4, 0x93, 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3, 0xa3, 0x93, 0xf8, 0x74, 0x01, |
471 | 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, | 482 | 0x93, 0xf5, 0x82, 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68, 0x60, 0xef, 0xa3, 0xa3, 0xa3, |
472 | 0x80, 0xdf, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0xe5, 0x4c, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, | 483 | 0x80, 0xdf, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0xe5, 0x4c, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25, |
473 | 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0x74, 0x11, 0x12, | 484 | 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0x74, 0x11, 0x12, |
474 | 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x06, | 485 | 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x06, |
475 | 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, | 486 | 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, |
476 | 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 0x38, 0x04, 0x25, | 487 | 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, 0xe8, 0x04, 0x25, |
477 | 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, | 488 | 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0xab, 0x36, 0xfa, 0xa9, 0x38, 0xe4, 0x12, 0x1a, |
478 | 0x38, 0x04, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x04, 0xe0, 0xab, | 489 | 0xe8, 0x04, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x90, 0xff, 0x04, 0xe0, 0xab, |
479 | 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, | 490 | 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8, 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, |
480 | 0x37, 0xf5, 0x37, 0x90, 0xff, 0x05, 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0x38, | 491 | 0x37, 0xf5, 0x37, 0x90, 0xff, 0x05, 0xe0, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x12, 0x1a, 0xe8, |
481 | 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x22, 0xf5, 0x83, 0xe0, 0x54, | 492 | 0x74, 0x01, 0x25, 0x38, 0xf5, 0x38, 0xe4, 0x35, 0x37, 0xf5, 0x37, 0x22, 0xf5, 0x83, 0xe0, 0x54, |
482 | 0x08, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xf5, 0x83, 0xef, 0xf0, 0xfd, 0x7c, 0x00, 0xc3, | 493 | 0x08, 0xab, 0x36, 0xaa, 0x37, 0xa9, 0x38, 0x22, 0xf5, 0x83, 0xef, 0xf0, 0xfd, 0x7c, 0x00, 0xc3, |
483 | 0x78, 0x7b, 0xe6, 0x9d, 0xf6, 0x18, 0xe6, 0x9c, 0xf6, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x03, 0x22, | 494 | 0x78, 0x7b, 0xe6, 0x9d, 0xf6, 0x18, 0xe6, 0x9c, 0xf6, 0xe6, 0xfe, 0x08, 0xe6, 0x78, 0x03, 0x22, |
484 | 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 0x6f, 0x22, 0xe0, 0x44, 0x04, 0xf0, 0x74, 0x12, | 495 | 0x75, 0x36, 0x01, 0x75, 0x37, 0xf9, 0x75, 0x38, 0x72, 0x22, 0xe0, 0x44, 0x04, 0xf0, 0x74, 0x13, |
485 | 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xe0, 0x22, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x7e, | 496 | 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0xe0, 0x22, 0x90, 0xfa, 0xbc, 0xe0, 0xff, 0x7e, |
486 | 0x00, 0xc3, 0x90, 0xfa, 0xbd, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xbc, 0xe0, 0x9e, 0xf0, 0x90, 0xfa, | 497 | 0x00, 0xc3, 0x90, 0xfa, 0xc0, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xbf, 0xe0, 0x9e, 0xf0, 0x90, 0xfa, |
487 | 0xb4, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5, | 498 | 0xb7, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0xef, 0x25, 0x4f, 0xf5, 0x4f, 0xee, 0x35, 0x4e, 0xf5, |
488 | 0x4e, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb1, 0x90, 0xfa, 0xb4, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, | 499 | 0x4e, 0x22, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xb4, 0x90, 0xfa, 0xb7, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, |
489 | 0xf5, 0x2e, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x04, 0xf5, 0x82, 0xe4, | 500 | 0xf5, 0x2e, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x04, 0xf5, 0x82, 0xe4, |
490 | 0x35, 0x83, 0xf5, 0x83, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe4, | 501 | 0x35, 0x83, 0xf5, 0x83, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x40, 0xf5, 0x82, 0xe4, |
491 | 0x34, 0xff, 0xf5, 0x83, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x48, 0xf5, 0x82, 0xe4, | 502 | 0x34, 0xff, 0xf5, 0x83, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x48, 0xf5, 0x82, 0xe4, |
492 | 0x34, 0xff, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0xff, | 503 | 0x34, 0xff, 0x22, 0xe5, 0x4d, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x08, 0xf5, 0x82, 0xe4, 0x34, 0xff, |
493 | 0x22, 0x90, 0xfa, 0xb6, 0xe0, 0xff, 0x24, 0xfc, 0x22, 0x90, 0xff, 0x00, 0xe0, 0x54, 0x1f, 0x22, | 504 | 0x22, 0x90, 0xfa, 0xb9, 0xe0, 0xff, 0x24, 0xfc, 0x22, 0x90, 0xff, 0x00, 0xe0, 0x54, 0x1f, 0x22, |
494 | 0x90, 0xfa, 0xbb, 0xe0, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x75, 0x33, 0x00, 0x8f, 0x34, 0x90, 0xf9, | 505 | 0x90, 0xfa, 0xbe, 0xe0, 0x90, 0xfa, 0xba, 0xf0, 0x22, 0x75, 0x33, 0x00, 0x8f, 0x34, 0x90, 0xf9, |
495 | 0x6c, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x02, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, | 506 | 0x6f, 0x12, 0x1b, 0xea, 0x90, 0x00, 0x02, 0x22, 0x54, 0x0f, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x00, |
496 | 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x41, 0xf5, 0x82, | 507 | 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x75, 0xf0, 0x08, 0xa4, 0x24, 0x41, 0xf5, 0x82, |
497 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x74, 0x80, 0xf0, 0x08, 0xe6, 0xff, 0xe9, 0x75, 0xf0, 0x08, | 508 | 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x22, 0x74, 0x80, 0xf0, 0x08, 0xe6, 0xff, 0xe9, 0x75, 0xf0, 0x08, |
498 | 0xa4, 0x22, 0x74, 0xaf, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0x22, 0x75, 0xf0, | 509 | 0xa4, 0x22, 0x74, 0xb2, 0x25, 0x22, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0x22, 0x75, 0xf0, |
499 | 0x08, 0xa4, 0x24, 0x42, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x22, 0x90, | 510 | 0x08, 0xa4, 0x24, 0x42, 0xf5, 0x82, 0xe4, 0x34, 0xff, 0xf5, 0x83, 0x74, 0x80, 0xf0, 0x22, 0x90, |
500 | 0xff, 0x82, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x03, 0xf0, 0x90, 0xff, | 511 | 0xff, 0x82, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x03, 0xf0, 0x90, 0xff, |
501 | 0xfc, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x78, 0x67, 0xe6, 0x54, 0xfd, 0xf6, 0x90, 0xff, 0xfd, 0x74, | 512 | 0xfc, 0xe0, 0x54, 0xfd, 0xf0, 0x22, 0x78, 0x67, 0xe6, 0x54, 0xfd, 0xf6, 0x90, 0xff, 0xfd, 0x74, |
502 | 0x65, 0xf0, 0x22, 0x12, 0x1b, 0x1c, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x22, 0x7b, 0x01, 0x7a, | 513 | 0x65, 0xf0, 0x22, 0x12, 0x1b, 0xcc, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x22, 0x7b, 0x01, 0x7a, |
503 | 0xfa, 0x79, 0xb4, 0x22, 0x90, 0xff, 0x80, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0x83, 0xe0, | 514 | 0xfa, 0x79, 0xb7, 0x22, 0x90, 0xff, 0x80, 0xe0, 0x44, 0x08, 0xf0, 0x22, 0x90, 0xff, 0x83, 0xe0, |
504 | 0x54, 0x7f, 0xf0, 0x22, 0xe0, 0xff, 0x90, 0xf9, 0x67, 0x02, 0x1b, 0x3a, 0x90, 0xff, 0xa4, 0xe0, | 515 | 0x54, 0x7f, 0xf0, 0x22, 0xe0, 0xff, 0x90, 0xf9, 0x6a, 0x02, 0x1b, 0xea, 0x90, 0xff, 0xa4, 0xe0, |
505 | 0x44, 0x02, 0xf0, 0x22, 0x75, 0x39, 0x01, 0x75, 0x3a, 0x09, 0x22, 0x7b, 0x01, 0x7a, 0xf9, 0x79, | 516 | 0x44, 0x02, 0xf0, 0x22, 0x75, 0x39, 0x01, 0x75, 0x3a, 0x09, 0x22, 0x7b, 0x01, 0x7a, 0xf9, 0x79, |
506 | 0x6f, 0x22, 0xd3, 0xe5, 0x3c, 0x94, 0x08, 0xe5, 0x3b, 0x94, 0x01, 0x22, 0x90, 0xfa, 0xbb, 0xe0, | 517 | 0x72, 0x22, 0xd3, 0xe5, 0x3c, 0x94, 0x08, 0xe5, 0x3b, 0x94, 0x01, 0x22, 0x90, 0xfa, 0xbe, 0xe0, |
507 | 0xff, 0x90, 0xfa, 0xb7, 0xf0, 0x22, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xef, 0x22, 0x90, 0xff, 0xb4, | 518 | 0xff, 0x90, 0xfa, 0xba, 0xf0, 0x22, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xef, 0x22, 0x90, 0xff, 0xb4, |
508 | 0xe0, 0x54, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x88, 0xef, 0xf6, 0x12, 0x2a, 0x06, 0x12, 0x22, | 519 | 0xe0, 0x54, 0xef, 0x22, 0x12, 0x10, 0x4b, 0x78, 0x88, 0xef, 0xf6, 0x12, 0x2a, 0xc7, 0x12, 0x22, |
509 | 0x4a, 0x8e, 0x83, 0x24, 0x09, 0x12, 0x21, 0xf3, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x0a, | 520 | 0xfa, 0x8e, 0x83, 0x24, 0x09, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x0a, |
510 | 0x12, 0x22, 0x52, 0x24, 0x0a, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x0b, 0x12, 0x1a, 0x4a, 0x12, | 521 | 0x12, 0x23, 0x02, 0x24, 0x0a, 0x12, 0x22, 0xa1, 0xe0, 0x90, 0x00, 0x0b, 0x12, 0x1a, 0xfa, 0x12, |
511 | 0x22, 0x4a, 0xf5, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x53, 0x12, 0x22, 0x56, 0x24, | 522 | 0x22, 0xfa, 0xf5, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xa3, 0xe0, 0xf5, 0x53, 0x12, 0x23, 0x06, 0x24, |
512 | 0x04, 0x12, 0x21, 0xf3, 0xe0, 0xf5, 0x54, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x55, | 523 | 0x04, 0x12, 0x22, 0xa1, 0xe0, 0xf5, 0x54, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0xa3, 0xe0, 0xf5, 0x55, |
513 | 0xe5, 0x53, 0xc4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x78, 0x88, 0xf6, 0xd3, 0x94, 0x00, 0x40, 0x06, | 524 | 0xe5, 0x53, 0xc4, 0x13, 0x13, 0x13, 0x54, 0x01, 0x78, 0x88, 0xf6, 0xd3, 0x94, 0x00, 0x40, 0x06, |
514 | 0xe5, 0x54, 0x30, 0xe1, 0x01, 0x06, 0x78, 0x88, 0xe6, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x0c, 0xef, | 525 | 0xe5, 0x54, 0x30, 0xe1, 0x01, 0x06, 0x78, 0x88, 0xe6, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x0c, 0xef, |
515 | 0x12, 0x1a, 0x4a, 0x78, 0x80, 0x12, 0x22, 0x09, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x53, | 526 | 0x12, 0x1a, 0xfa, 0x12, 0x22, 0xb5, 0xa3, 0xa3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x53, 0x07, 0x0c, |
516 | 0x07, 0x0c, 0x53, 0x06, 0xe6, 0xe5, 0x53, 0x30, 0xe5, 0x03, 0x43, 0x07, 0x01, 0xe5, 0x54, 0x20, | 527 | 0x53, 0x06, 0xe6, 0xe5, 0x53, 0x30, 0xe5, 0x03, 0x43, 0x07, 0x01, 0xe5, 0x54, 0x20, 0xe5, 0x0e, |
517 | 0xe5, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, 0x07, 0x02, | 528 | 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, 0x07, 0x02, 0xe5, 0x53, |
518 | 0xe5, 0x53, 0x30, 0xe3, 0x03, 0x43, 0x07, 0x10, 0xe5, 0x53, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x20, | 529 | 0x30, 0xe3, 0x03, 0x43, 0x07, 0x10, 0xe5, 0x53, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x20, 0xe5, 0x53, |
519 | 0xe5, 0x53, 0x54, 0x03, 0x60, 0x03, 0x43, 0x07, 0x40, 0xe5, 0x53, 0x30, 0xe1, 0x03, 0x43, 0x07, | 530 | 0x54, 0x03, 0x60, 0x03, 0x43, 0x07, 0x40, 0xe5, 0x53, 0x30, 0xe1, 0x03, 0x43, 0x07, 0x80, 0xe5, |
520 | 0x80, 0xe5, 0x53, 0x30, 0xe4, 0x03, 0x43, 0x06, 0x01, 0xe5, 0x53, 0x30, 0xe6, 0x03, 0x43, 0x06, | 531 | 0x53, 0x30, 0xe4, 0x03, 0x43, 0x06, 0x01, 0xe5, 0x53, 0x30, 0xe6, 0x03, 0x43, 0x06, 0x08, 0xe5, |
521 | 0x08, 0xe5, 0x54, 0x20, 0xe4, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, | 532 | 0x54, 0x20, 0xe4, 0x0e, 0xe5, 0x53, 0x54, 0x7f, 0x70, 0x08, 0xe5, 0x53, 0x20, 0xe7, 0x03, 0x43, |
522 | 0x03, 0x43, 0x06, 0x10, 0x53, 0x07, 0xfb, 0x53, 0x06, 0x79, 0x90, 0x00, 0x05, 0xee, 0x8f, 0xf0, | 533 | 0x06, 0x10, 0x53, 0x07, 0xfb, 0x53, 0x06, 0x79, 0x90, 0x00, 0x05, 0xee, 0x8f, 0xf0, 0x12, 0x1b, |
523 | 0x12, 0x1a, 0xef, 0xe5, 0x55, 0x30, 0xe3, 0x12, 0x54, 0x30, 0xff, 0xc4, 0x54, 0x0f, 0x12, 0x22, | 534 | 0x9f, 0xe5, 0x55, 0x30, 0xe3, 0x12, 0x54, 0x30, 0xff, 0xc4, 0x54, 0x0f, 0x12, 0x22, 0xe7, 0x90, |
524 | 0x2c, 0x90, 0x00, 0x08, 0xef, 0x12, 0x1a, 0x4a, 0x80, 0x0a, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x08, | 535 | 0x00, 0x08, 0xef, 0x12, 0x1a, 0xfa, 0x80, 0x0a, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x08, 0xe4, 0x12, |
525 | 0xe4, 0x12, 0x1a, 0x4a, 0xe5, 0x55, 0x54, 0x03, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x07, 0xef, 0x12, | 536 | 0x1a, 0xfa, 0xe5, 0x55, 0x54, 0x03, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x07, 0xef, 0x12, 0x1a, 0xfa, |
526 | 0x1a, 0x4a, 0xe5, 0x55, 0x54, 0x04, 0xff, 0xc3, 0x13, 0x90, 0x00, 0x09, 0x12, 0x1a, 0x4a, 0x90, | 537 | 0xe5, 0x55, 0x54, 0x04, 0xff, 0xc3, 0x13, 0x90, 0x00, 0x09, 0x12, 0x1a, 0xfa, 0x90, 0x00, 0x07, |
527 | 0x00, 0x07, 0x12, 0x1a, 0x0b, 0x70, 0x13, 0x12, 0x22, 0x2d, 0xe9, 0x24, 0x09, 0xf9, 0xe4, 0x3a, | 538 | 0x12, 0x1a, 0xbb, 0x70, 0x13, 0x12, 0x22, 0xe8, 0xe9, 0x24, 0x09, 0xf9, 0xe4, 0x3a, 0xfa, 0x12, |
528 | 0xfa, 0x12, 0x19, 0xf2, 0xff, 0xc3, 0x13, 0x12, 0x1a, 0x38, 0x12, 0x22, 0x78, 0x24, 0x08, 0x12, | 539 | 0x1a, 0xa2, 0xff, 0xc3, 0x13, 0x12, 0x1a, 0xe8, 0x12, 0x23, 0x27, 0x24, 0x08, 0x12, 0x22, 0xa1, |
529 | 0x21, 0xf3, 0xe0, 0xfe, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x07, 0x12, 0x21, 0xf3, 0xe0, | 540 | 0xe0, 0xfe, 0x8d, 0x82, 0x8c, 0x83, 0xe5, 0x82, 0x24, 0x07, 0x12, 0x22, 0xa1, 0xe0, 0xfd, 0xee, |
530 | 0xfd, 0xee, 0xed, 0x12, 0x22, 0x2c, 0x90, 0x00, 0x03, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0xef, 0x12, | 541 | 0xed, 0x12, 0x22, 0xe7, 0x90, 0x00, 0x03, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x9f, 0x12, 0x32, 0x84, |
531 | 0x31, 0xc7, 0x7d, 0x0a, 0xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0x90, 0xfa, 0xe3, 0xe0, | 542 | 0x7d, 0x0a, 0xe4, 0xff, 0x12, 0x2f, 0xb4, 0x02, 0x10, 0xce, 0x90, 0xfa, 0xe6, 0xe0, 0xb4, 0x03, |
532 | 0xb4, 0x03, 0x06, 0x7e, 0x00, 0x7f, 0x40, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x08, 0x90, 0xfa, 0xd7, | 543 | 0x06, 0x7e, 0x00, 0x7f, 0x40, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x08, 0x90, 0xfa, 0xda, 0xee, 0xf0, |
533 | 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xff, 0x7e, 0x00, 0x90, 0xfa, | 544 | 0xa3, 0xef, 0xf0, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb, 0xff, 0x7e, 0x00, 0x90, 0xfa, 0xd6, 0xee, |
534 | 0xd3, 0xee, 0xf0, 0xa3, 0xef, 0xf0, 0x70, 0x03, 0x7f, 0x08, 0x22, 0x90, 0x00, 0x08, 0x12, 0x1a, | 545 | 0xf0, 0xa3, 0xef, 0xf0, 0x70, 0x03, 0x7f, 0x08, 0x22, 0x90, 0x00, 0x08, 0x12, 0x1b, 0x48, 0xff, |
535 | 0x98, 0xff, 0x90, 0xfa, 0xd5, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xae, 0x02, 0xaf, 0x01, 0x8e, | 546 | 0x90, 0xfa, 0xd8, 0xe5, 0xf0, 0xf0, 0xa3, 0xef, 0xf0, 0xae, 0x02, 0xaf, 0x01, 0x8e, 0x50, 0x8f, |
536 | 0x50, 0x8f, 0x51, 0x74, 0x0a, 0x25, 0x51, 0xf5, 0x51, 0xe4, 0x35, 0x50, 0xf5, 0x50, 0x90, 0xfa, | 547 | 0x51, 0x74, 0x0a, 0x25, 0x51, 0xf5, 0x51, 0xe4, 0x35, 0x50, 0xf5, 0x50, 0x90, 0xfa, 0xdb, 0xe0, |
537 | 0xd8, 0xe0, 0xff, 0x14, 0xfe, 0x90, 0xfa, 0xd6, 0xe0, 0x5e, 0xfe, 0xc3, 0xef, 0x9e, 0xff, 0x90, | 548 | 0xff, 0x14, 0xfe, 0x90, 0xfa, 0xd9, 0xe0, 0x5e, 0xfe, 0xc3, 0xef, 0x9e, 0xff, 0x90, 0xfa, 0xdd, |
538 | 0xfa, 0xda, 0xf0, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0x90, 0xfa, 0xd3, 0xe0, 0x94, 0x00, 0x50, | 549 | 0xf0, 0xc3, 0x90, 0xfa, 0xd7, 0xe0, 0x9f, 0x90, 0xfa, 0xd6, 0xe0, 0x94, 0x00, 0x50, 0x06, 0xa3, |
539 | 0x06, 0xa3, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03, 0xe0, 0xff, 0x22, 0x12, | 550 | 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x12, 0x20, 0xa9, 0x60, 0x03, 0xe0, 0xff, 0x22, 0x12, 0x2e, 0x2b, |
540 | 0x2d, 0x5a, 0x90, 0xfa, 0xd3, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x60, 0x2b, 0x90, 0xfa, 0xd7, | 551 | 0x90, 0xfa, 0xd6, 0xe0, 0xfe, 0xa3, 0xe0, 0xff, 0x4e, 0x60, 0x2b, 0x90, 0xfa, 0xda, 0xe0, 0xfc, |
541 | 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x07, 0xe0, 0x90, 0xfa, 0xda, | 552 | 0xa3, 0xe0, 0xfd, 0xd3, 0xef, 0x9d, 0xee, 0x9c, 0x40, 0x07, 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x80, |
542 | 0xf0, 0x80, 0x08, 0x90, 0xfa, 0xd4, 0xe0, 0x90, 0xfa, 0xda, 0xf0, 0x12, 0x1f, 0xfb, 0x60, 0x03, | 553 | 0x08, 0x90, 0xfa, 0xd7, 0xe0, 0x90, 0xfa, 0xdd, 0xf0, 0x12, 0x20, 0xa9, 0x60, 0x03, 0xe0, 0xff, |
543 | 0xe0, 0xff, 0x22, 0x12, 0x2d, 0x5a, 0x80, 0xca, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x52, 0xe4, 0xf5, | 554 | 0x22, 0x12, 0x2e, 0x2b, 0x80, 0xca, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x52, 0xe4, 0xf5, 0x2d, 0xf5, |
544 | 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7f, 0x00, 0x22, 0xaa, 0x50, 0xa9, 0x51, 0x7b, | 555 | 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x7f, 0x00, 0x22, 0xaa, 0x50, 0xa9, 0x51, 0x7b, 0x01, 0x90, |
545 | 0x01, 0x90, 0xfa, 0xd5, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xda, 0xe0, 0xf5, 0x4a, 0x12, | 556 | 0xfa, 0xd8, 0xe0, 0xfc, 0xa3, 0xe0, 0xfd, 0x90, 0xfa, 0xdd, 0xe0, 0xf5, 0x4a, 0x12, 0x29, 0x60, |
546 | 0x28, 0x9f, 0x90, 0xfa, 0xd9, 0xef, 0xf0, 0x22, 0xef, 0x24, 0xae, 0x60, 0x52, 0x24, 0xfe, 0x60, | 557 | 0x90, 0xfa, 0xdc, 0xef, 0xf0, 0x22, 0xef, 0x24, 0xae, 0x60, 0x52, 0x24, 0xfe, 0x60, 0x2e, 0x24, |
547 | 0x2e, 0x24, 0xfe, 0x70, 0x03, 0x02, 0x20, 0xbb, 0x24, 0x06, 0x60, 0x03, 0x02, 0x21, 0x03, 0x78, | 558 | 0xfe, 0x70, 0x03, 0x02, 0x21, 0x69, 0x24, 0x06, 0x60, 0x03, 0x02, 0x21, 0xb1, 0x78, 0x71, 0xe6, |
548 | 0x71, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xa5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x33, | 559 | 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xa5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x33, 0x90, 0xfa, |
549 | 0x90, 0xfa, 0x91, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xaf, 0x74, 0x01, 0xf0, 0x22, 0x78, | 560 | 0x94, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb2, 0x74, 0x01, 0xf0, 0x22, 0x78, 0x72, 0xe6, |
550 | 0x72, 0xe6, 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xb5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x43, | 561 | 0x54, 0xfb, 0xf6, 0x90, 0xff, 0xb5, 0xe0, 0xf5, 0x22, 0x44, 0x0f, 0xf0, 0x74, 0x43, 0x90, 0xfa, |
551 | 0x90, 0xfa, 0x93, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb0, 0x74, 0x01, 0xf0, 0x22, 0x90, | 562 | 0x96, 0xf0, 0xe5, 0x22, 0xa3, 0xf0, 0x90, 0xfa, 0xb3, 0x74, 0x01, 0xf0, 0x22, 0x90, 0xfa, 0xa0, |
552 | 0xfa, 0x9d, 0xe0, 0xa3, 0x20, 0xe5, 0x03, 0x02, 0x21, 0x03, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, | 563 | 0xe0, 0xa3, 0x20, 0xe5, 0x03, 0x02, 0x21, 0xb1, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0, |
553 | 0xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca, 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, | 564 | 0xa3, 0xf0, 0x90, 0xfa, 0xcd, 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xa6, 0x12, |
554 | 0xa6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa, | 565 | 0x23, 0x0d, 0x90, 0xff, 0xa6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xce, 0xe0, |
555 | 0xcb, 0xe0, 0xff, 0x74, 0x34, 0xfe, 0x12, 0x2c, 0xb4, 0xef, 0x70, 0x57, 0x90, 0xfa, 0xcb, 0xe0, | 566 | 0xff, 0x74, 0x34, 0xfe, 0x12, 0x2d, 0x85, 0xef, 0x70, 0x57, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74, |
556 | 0xff, 0x74, 0x34, 0x90, 0xfa, 0x95, 0xf0, 0xef, 0xa3, 0xf0, 0x22, 0x90, 0xfa, 0xa7, 0xe0, 0xa3, | 567 | 0x34, 0x90, 0xfa, 0x98, 0xf0, 0xef, 0xa3, 0xf0, 0x22, 0x90, 0xfa, 0xaa, 0xe0, 0xa3, 0x30, 0xe5, |
557 | 0x30, 0xe5, 0x40, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xca, | 568 | 0x40, 0x90, 0xff, 0xb6, 0xe0, 0x90, 0xfa, 0xcd, 0xf0, 0xa3, 0xf0, 0x90, 0xfa, 0xcd, 0xe0, 0xff, |
558 | 0xe0, 0xff, 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xb6, 0x12, 0x22, 0x5d, 0x90, 0xff, 0xb6, | 569 | 0x54, 0x0f, 0xfe, 0x60, 0x10, 0x90, 0xff, 0xb6, 0x12, 0x23, 0x0d, 0x90, 0xff, 0xb6, 0xe0, 0x90, |
559 | 0xe0, 0x90, 0xfa, 0xca, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0xfe, 0x12, | 570 | 0xfa, 0xcd, 0xf0, 0x80, 0xe6, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74, 0x44, 0xfe, 0x12, 0x2d, 0x85, |
560 | 0x2c, 0xb4, 0xef, 0x70, 0x0e, 0x90, 0xfa, 0xcb, 0xe0, 0xff, 0x74, 0x44, 0x90, 0xfa, 0x97, 0xf0, | 571 | 0xef, 0x70, 0x0e, 0x90, 0xfa, 0xce, 0xe0, 0xff, 0x74, 0x44, 0x90, 0xfa, 0x9a, 0xf0, 0xef, 0xa3, |
561 | 0xef, 0xa3, 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, | 572 | 0xf0, 0x22, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, |
562 | 0x00, 0xc0, 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, | 573 | 0x00, 0xc0, 0x01, 0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x04, 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0x90, |
563 | 0x07, 0x90, 0xff, 0x92, 0xe0, 0xff, 0x90, 0xfa, 0xc9, 0xf0, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0xef, | 574 | 0xff, 0x92, 0xe0, 0xff, 0x90, 0xfa, 0xcc, 0xf0, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0xef, 0x12, 0x1b, |
564 | 0x12, 0x1b, 0x4c, 0x21, 0xbb, 0x26, 0x21, 0xbb, 0x2e, 0x21, 0x5e, 0x30, 0x21, 0x5e, 0x32, 0x21, | 575 | 0xfc, 0x22, 0x69, 0x26, 0x22, 0x69, 0x2e, 0x22, 0x0c, 0x30, 0x22, 0x0c, 0x32, 0x22, 0x1a, 0x38, |
565 | 0x6c, 0x38, 0x21, 0x7e, 0x3a, 0x21, 0xb0, 0x3e, 0x21, 0x9b, 0x44, 0x21, 0x90, 0x46, 0x21, 0xa6, | 576 | 0x22, 0x2c, 0x3a, 0x22, 0x5e, 0x3e, 0x22, 0x49, 0x44, 0x22, 0x3e, 0x46, 0x22, 0x54, 0x50, 0x22, |
566 | 0x50, 0x21, 0xa6, 0x52, 0x21, 0xa6, 0x54, 0x21, 0xa6, 0x56, 0x00, 0x00, 0x21, 0xc0, 0x90, 0xfa, | 577 | 0x54, 0x52, 0x22, 0x54, 0x54, 0x22, 0x54, 0x56, 0x00, 0x00, 0x22, 0x6e, 0x90, 0xfa, 0xcc, 0xe0, |
567 | 0xc9, 0xe0, 0xfd, 0x7c, 0x00, 0x7f, 0x01, 0x12, 0x11, 0x16, 0x80, 0x62, 0x7c, 0x00, 0x7d, 0x01, | 578 | 0xfd, 0x7c, 0x00, 0x7f, 0x01, 0x12, 0x11, 0x5e, 0x80, 0x62, 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x03, |
568 | 0x7f, 0x03, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x50, 0x7c, 0x00, | 579 | 0x12, 0x11, 0x5e, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x20, 0xf0, 0x80, 0x50, 0x7c, 0x00, 0x7d, 0x01, |
569 | 0x7d, 0x01, 0x7f, 0x02, 0x12, 0x11, 0x16, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x3e, | 580 | 0x7f, 0x02, 0x12, 0x11, 0x5e, 0x90, 0xff, 0xfe, 0xe0, 0x44, 0x40, 0xf0, 0x80, 0x3e, 0x7c, 0x00, |
570 | 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x05, 0x12, 0x11, 0x16, 0x80, 0x33, 0x7c, 0x00, 0x7d, 0x01, 0x7f, | 581 | 0x7d, 0x01, 0x7f, 0x05, 0x12, 0x11, 0x5e, 0x80, 0x33, 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x06, 0x12, |
571 | 0x06, 0x12, 0x11, 0x16, 0x80, 0x28, 0x90, 0xfa, 0xc9, 0xe0, 0xff, 0x12, 0x20, 0x18, 0x80, 0x1e, | 582 | 0x11, 0x5e, 0x80, 0x28, 0x90, 0xfa, 0xcc, 0xe0, 0xff, 0x12, 0x20, 0xc6, 0x80, 0x1e, 0x7c, 0x00, |
572 | 0x7c, 0x00, 0x7d, 0x01, 0x7f, 0x04, 0x12, 0x11, 0x16, 0x80, 0x13, 0x12, 0x27, 0x8d, 0x80, 0x0e, | 583 | 0x7d, 0x01, 0x7f, 0x04, 0x12, 0x11, 0x5e, 0x80, 0x13, 0x12, 0x28, 0x4e, 0x80, 0x0e, 0x90, 0xfa, |
573 | 0x90, 0xfa, 0xc9, 0xe0, 0x24, 0x00, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0x12, 0x2c, 0xb4, 0xd0, 0x07, | 584 | 0xcc, 0xe0, 0x24, 0x00, 0xff, 0xe4, 0x34, 0xff, 0xfe, 0x12, 0x2d, 0x85, 0xd0, 0x07, 0xd0, 0x06, |
574 | 0xd0, 0x06, 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, | 585 | 0xd0, 0x05, 0xd0, 0x04, 0xd0, 0x03, 0xd0, 0x02, 0xd0, 0x01, 0xd0, 0x00, 0xd0, 0xd0, 0xd0, 0x82, |
575 | 0xd0, 0x82, 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x24, | 586 | 0xd0, 0x83, 0xd0, 0xf0, 0xd0, 0xe0, 0x32, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0x24, 0x04, 0x8e, |
576 | 0x04, 0x8e, 0x83, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x74, 0x12, 0x25, 0x24, 0xf5, | 587 | 0x83, 0xf5, 0x82, 0xe4, 0x35, 0x83, 0xf5, 0x83, 0x22, 0x74, 0x13, 0x25, 0x24, 0xf5, 0x82, 0xe4, |
577 | 0x82, 0xe4, 0x34, 0xf9, 0xf5, 0x83, 0x22, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, | 588 | 0x34, 0xf9, 0xf5, 0x83, 0x22, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0x22, |
578 | 0x83, 0x22, 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0x7b, | 589 | 0x78, 0x80, 0xe6, 0xfe, 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0x7b, 0xff, 0x7a, |
579 | 0xff, 0x7a, 0x31, 0x79, 0x99, 0x7e, 0x00, 0x7f, 0x0a, 0x02, 0x19, 0xcc, 0xff, 0x90, 0xf9, 0x6c, | 590 | 0x32, 0x79, 0x56, 0x7e, 0x00, 0x7f, 0x0a, 0x02, 0x1a, 0x7c, 0x78, 0x80, 0xe6, 0xfc, 0x08, 0xe6, |
580 | 0x02, 0x1b, 0x3a, 0x90, 0xf9, 0x67, 0x12, 0x1b, 0x3a, 0x90, 0x00, 0x04, 0x02, 0x1a, 0x0b, 0xe6, | 591 | 0xf5, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0x22, 0xff, 0x90, 0xf9, 0x6f, 0x02, 0x1b, 0xea, 0x90, 0xf9, |
581 | 0xfc, 0x08, 0xe6, 0xf5, 0x82, 0x8c, 0x83, 0xa3, 0xa3, 0x22, 0x78, 0x7e, 0xe6, 0xfe, 0x08, 0xe6, | 592 | 0x6a, 0x12, 0x1b, 0xea, 0x90, 0x00, 0x04, 0x02, 0x1a, 0xbb, 0x78, 0x7e, 0xe6, 0xfe, 0x08, 0xe6, |
582 | 0xff, 0x22, 0xed, 0x12, 0x1a, 0x4a, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x22, 0xef, 0xf0, 0x90, | 593 | 0xff, 0x22, 0xed, 0x12, 0x1a, 0xfa, 0x8f, 0x82, 0x8e, 0x83, 0xe5, 0x82, 0x22, 0xef, 0xf0, 0x90, |
583 | 0xfa, 0xcb, 0xe0, 0x54, 0x0f, 0x4e, 0xfe, 0xf0, 0xef, 0x54, 0xf0, 0x4e, 0xf0, 0x22, 0x08, 0xe6, | 594 | 0xfa, 0xce, 0xe0, 0x54, 0x0f, 0x4e, 0xfe, 0xf0, 0xef, 0x54, 0xf0, 0x4e, 0xf0, 0x22, 0x78, 0x80, |
584 | 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x24, 0x09, 0x22, 0x78, 0x7e, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x8c, | 595 | 0xe6, 0xfc, 0x08, 0xe6, 0x8c, 0x83, 0x22, 0x78, 0x7e, 0xe6, 0xfc, 0x08, 0xe6, 0xfd, 0x8c, 0x83, |
585 | 0x83, 0x22, 0xa6, 0x07, 0xe6, 0x24, 0x6e, 0xf8, 0xe6, 0x22, 0x78, 0x7e, 0xe6, 0xfa, 0x08, 0xe6, | 596 | 0x22, 0xa6, 0x07, 0xe6, 0x24, 0x6e, 0xf8, 0xe6, 0x22, 0x78, 0x7e, 0xe6, 0xfa, 0x08, 0xe6, 0xfb, |
586 | 0xfb, 0x22, 0x26, 0xf6, 0x18, 0xee, 0x36, 0xf6, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe5, 0x82, 0x22, | 597 | 0x22, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x22, 0x26, 0xf6, 0x18, 0xee, 0x36, 0xf6, 0x22, |
587 | 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0x8d, 0x28, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, 0xa3, 0x74, 0x02, | 598 | 0xef, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0x22, 0x8b, 0x82, 0x8a, 0x83, 0xe5, 0x82, |
588 | 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, 0xf5, | 599 | 0x22, 0x8b, 0x25, 0x8a, 0x26, 0x89, 0x27, 0x8d, 0x28, 0x90, 0xfa, 0xd2, 0xe4, 0xf0, 0xa3, 0x74, |
589 | 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xce, 0xe0, 0x65, 0x28, 0x60, 0x46, 0xa3, 0xe0, | 600 | 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xd1, 0x90, 0xfa, 0xd2, 0xe0, 0xf5, 0x2d, 0xa3, 0xe0, |
590 | 0xff, 0xa3, 0xe0, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xce, 0xe0, | 601 | 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xd1, 0xe0, 0x65, 0x28, 0x60, 0x46, 0xa3, |
591 | 0xff, 0x90, 0xfa, 0xd1, 0xe4, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0x12, 0x23, 0x2f, 0x90, 0xfa, 0xd1, | 602 | 0xe0, 0xff, 0xa3, 0xe0, 0xa3, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x12, 0x23, 0xf0, 0x90, 0xfa, 0xd1, |
592 | 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0xfa, 0xcf, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xfa, 0xce, 0xe0, | 603 | 0xe0, 0xff, 0x90, 0xfa, 0xd4, 0xe4, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0x12, 0x23, 0xf0, 0x90, 0xfa, |
593 | 0xa3, 0x75, 0xf0, 0x00, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x04, 0x12, 0x1a, | 604 | 0xd4, 0xe0, 0xff, 0xa3, 0xe0, 0x90, 0xfa, 0xd2, 0xcf, 0xf0, 0xa3, 0xef, 0xf0, 0x90, 0xfa, 0xd1, |
594 | 0x6c, 0x02, 0x22, 0xb1, 0x90, 0xfa, 0xd0, 0xe0, 0x24, 0x01, 0xff, 0x90, 0xfa, 0xcf, 0xe0, 0x34, | 605 | 0xe0, 0xa3, 0x75, 0xf0, 0x00, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xd2, 0xe4, 0x75, 0xf0, 0x04, 0x12, |
595 | 0x00, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x8f, 0xf0, 0x12, 0x1a, 0xd0, 0x7f, 0x00, 0x22, 0x7b, | 606 | 0x1b, 0x1c, 0x02, 0x23, 0x72, 0x90, 0xfa, 0xd3, 0xe0, 0x24, 0x01, 0xff, 0x90, 0xfa, 0xd2, 0xe0, |
596 | 0x01, 0x7a, 0xfa, 0x79, 0xce, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x6c, 0x85, | 607 | 0x34, 0x00, 0xab, 0x25, 0xaa, 0x26, 0xa9, 0x27, 0x8f, 0xf0, 0x12, 0x1b, 0x80, 0x7f, 0x00, 0x22, |
597 | 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x25, 0xd7, 0x8f, 0x62, 0x12, 0x2a, 0x06, 0x12, 0x22, | 608 | 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xd1, 0x90, 0xfa, 0xd2, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1b, 0x1c, |
598 | 0x4a, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x02, 0xf0, 0x08, | 609 | 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x02, 0x26, 0x98, 0x8f, 0x62, 0x12, 0x2a, 0xc7, 0x12, |
599 | 0x12, 0x22, 0x3f, 0xe0, 0xa3, 0x30, 0xe5, 0x0c, 0x12, 0x22, 0x56, 0x24, 0x0b, 0x12, 0x21, 0xf3, | 610 | 0x22, 0xfa, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x02, 0xf0, |
600 | 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xf5, 0x82, 0x8e, 0x83, 0xe0, | 611 | 0x08, 0x12, 0x22, 0xdc, 0xe0, 0xa3, 0x30, 0xe5, 0x0c, 0x12, 0x23, 0x06, 0x24, 0x0b, 0x12, 0x22, |
601 | 0x54, 0xb8, 0xfd, 0xf0, 0xe5, 0x62, 0x24, 0xfe, 0x44, 0x20, 0xfc, 0x4d, 0xf0, 0xe5, 0x82, 0x24, | 612 | 0xa1, 0xe0, 0x44, 0x01, 0xf0, 0x78, 0x7c, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0xf5, 0x82, 0x8e, 0x83, |
602 | 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x54, 0xb8, 0xf0, 0x4c, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, 0x74, | 613 | 0xe0, 0x54, 0xb8, 0xfd, 0xf0, 0xe5, 0x62, 0x24, 0xfe, 0x44, 0x20, 0xfc, 0x4d, 0xf0, 0xe5, 0x82, |
603 | 0x03, 0xf0, 0x18, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x05, 0x12, 0x21, 0xf3, 0xc0, | 614 | 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xb8, 0xf0, 0x4c, 0xf0, 0x8f, 0x82, 0x8e, 0x83, 0xa3, |
604 | 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x74, 0x96, 0x25, 0x62, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, | 615 | 0x74, 0x03, 0xf0, 0x18, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x8e, 0x83, 0x24, 0x05, 0x12, 0x22, 0xa1, |
605 | 0xe0, 0x54, 0xfc, 0x44, 0x03, 0xfc, 0xed, 0x4c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, 0x8e, | 616 | 0xc0, 0x83, 0xc0, 0x82, 0xe0, 0xfd, 0x74, 0x99, 0x25, 0x62, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, |
606 | 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0, | 617 | 0x83, 0xe0, 0x54, 0xfc, 0x44, 0x03, 0xfc, 0xed, 0x4c, 0xd0, 0x82, 0xd0, 0x83, 0xf0, 0x8f, 0x82, |
607 | 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x62, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, 0x12, | 618 | 0x8e, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, 0x44, 0x80, |
608 | 0x10, 0x03, 0x7f, 0x02, 0x12, 0x12, 0x19, 0x78, 0x67, 0xe6, 0x44, 0x02, 0xf6, 0xd2, 0xb0, 0xd2, | 619 | 0xf0, 0x12, 0x32, 0x84, 0x74, 0x6e, 0x25, 0x62, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, |
609 | 0xb1, 0x90, 0xf9, 0x15, 0xe0, 0x30, 0xe7, 0x07, 0x90, 0xff, 0x9e, 0xe4, 0xf0, 0x80, 0x36, 0xd2, | 620 | 0x12, 0x10, 0x4b, 0x7f, 0x02, 0x12, 0x12, 0x61, 0x78, 0x67, 0xe6, 0x44, 0x02, 0xf6, 0xd2, 0xb0, |
610 | 0xb3, 0x90, 0xff, 0xa4, 0xe0, 0x90, 0xfa, 0x7b, 0xf0, 0x90, 0xff, 0xb4, 0xe0, 0x90, 0xfa, 0x7c, | 621 | 0xd2, 0xb1, 0x90, 0xf9, 0x16, 0xe0, 0x30, 0xe7, 0x07, 0x90, 0xff, 0x9e, 0xe4, 0xf0, 0x80, 0x36, |
611 | 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x90, 0xfa, 0x79, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x90, 0xfa, 0x7a, | 622 | 0xd2, 0xb3, 0x90, 0xff, 0xa4, 0xe0, 0x90, 0xfa, 0x7e, 0xf0, 0x90, 0xff, 0xb4, 0xe0, 0x90, 0xfa, |
612 | 0xf0, 0x90, 0xff, 0xa4, 0x74, 0x30, 0xf0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xff, 0xa2, 0x74, 0x40, | 623 | 0x7f, 0xf0, 0x90, 0xff, 0xa2, 0xe0, 0x90, 0xfa, 0x7c, 0xf0, 0x90, 0xff, 0xb2, 0xe0, 0x90, 0xfa, |
613 | 0xf0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xfa, 0xe4, 0xe5, 0xa8, 0xf0, 0x75, 0xa8, 0x81, 0x90, 0xff, | 624 | 0x7d, 0xf0, 0x90, 0xff, 0xa4, 0x74, 0x30, 0xf0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xff, 0xa2, 0x74, |
614 | 0x92, 0xe0, 0x60, 0x04, 0xe4, 0xf0, 0x80, 0xf6, 0x90, 0xff, 0xfd, 0x74, 0x3a, 0xf0, 0x43, 0x87, | 625 | 0x40, 0xf0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xfa, 0xe7, 0xe5, 0xa8, 0xf0, 0x75, 0xa8, 0x81, 0x90, |
615 | 0x01, 0x00, 0x00, 0x00, 0x90, 0xfa, 0x7b, 0xe0, 0x90, 0xff, 0xa4, 0xf0, 0x90, 0xfa, 0x7c, 0xe0, | 626 | 0xff, 0x92, 0xe0, 0x60, 0x04, 0xe4, 0xf0, 0x80, 0xf6, 0x90, 0xff, 0xfd, 0x74, 0x3a, 0xf0, 0x43, |
616 | 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xfa, 0x79, 0xe0, 0x90, 0xff, 0xa2, 0xf0, 0x90, 0xfa, 0x7a, 0xe0, | 627 | 0x87, 0x01, 0x00, 0x00, 0x00, 0x90, 0xfa, 0x7e, 0xe0, 0x90, 0xff, 0xa4, 0xf0, 0x90, 0xfa, 0x7f, |
617 | 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x60, 0x02, 0xc2, 0xb3, 0x90, 0xfa, 0xe4, 0xe0, | 628 | 0xe0, 0x90, 0xff, 0xb4, 0xf0, 0x90, 0xfa, 0x7c, 0xe0, 0x90, 0xff, 0xa2, 0xf0, 0x90, 0xfa, 0x7d, |
618 | 0xf5, 0xa8, 0x02, 0x10, 0x86, 0x8b, 0x5c, 0x8a, 0x5d, 0x89, 0x5e, 0x12, 0x2d, 0x3c, 0x90, 0xfa, | 629 | 0xe0, 0x90, 0xff, 0xb2, 0xf0, 0x90, 0xf9, 0x18, 0xe0, 0x60, 0x02, 0xc2, 0xb3, 0x90, 0xfa, 0xe7, |
619 | 0xc0, 0x12, 0x1b, 0x43, 0xaa, 0x5d, 0xa9, 0x5e, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x43, 0x90, 0xfa, | 630 | 0xe0, 0xf5, 0xa8, 0x02, 0x10, 0xce, 0x8b, 0x5c, 0x8a, 0x5d, 0x89, 0x5e, 0x12, 0x2e, 0x0d, 0x90, |
620 | 0xc4, 0xe4, 0x75, 0xf0, 0x0a, 0x12, 0x1a, 0x6c, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0x3a, 0xe9, 0x24, | 631 | 0xfa, 0xc3, 0x12, 0x1b, 0xf3, 0xaa, 0x5d, 0xa9, 0x5e, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0xf3, 0x90, |
621 | 0x01, 0xf9, 0xe4, 0x3a, 0xfa, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xab, 0x5c, 0xaa, 0x5d, 0xa9, | 632 | 0xfa, 0xc7, 0xe4, 0x75, 0xf0, 0x0a, 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0xea, 0xe9, |
622 | 0x5e, 0x12, 0x2d, 0x48, 0xe0, 0xff, 0xc3, 0x13, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0xfa, 0xbe, | 633 | 0x24, 0x01, 0xf9, 0xe4, 0x3a, 0xfa, 0x90, 0xfa, 0xc9, 0x12, 0x1b, 0xf3, 0xab, 0x5c, 0xaa, 0x5d, |
623 | 0xe0, 0xff, 0x78, 0x82, 0xe6, 0xc3, 0x9f, 0x50, 0x4a, 0x90, 0xfa, 0xc0, 0x12, 0x2d, 0x1d, 0xff, | 634 | 0xa9, 0x5e, 0x12, 0x2e, 0x19, 0xe0, 0xff, 0xc3, 0x13, 0xf0, 0xe4, 0x78, 0x82, 0xf6, 0x90, 0xfa, |
624 | 0x78, 0x83, 0xf6, 0x90, 0xfa, 0xc3, 0x12, 0x2d, 0x1d, 0xfe, 0xf4, 0x5f, 0xff, 0x78, 0x83, 0xf6, | 635 | 0xc1, 0xe0, 0xff, 0x78, 0x82, 0xe6, 0xc3, 0x9f, 0x50, 0x4a, 0x90, 0xfa, 0xc3, 0x12, 0x2d, 0xee, |
625 | 0x12, 0x2d, 0x1a, 0x5e, 0x4f, 0xff, 0x78, 0x83, 0xf6, 0x12, 0x2d, 0x23, 0x75, 0xf0, 0x02, 0x12, | 636 | 0xff, 0x78, 0x83, 0xf6, 0x90, 0xfa, 0xc6, 0x12, 0x2d, 0xee, 0xfe, 0xf4, 0x5f, 0xff, 0x78, 0x83, |
626 | 0x1a, 0x6c, 0x90, 0xfa, 0xc4, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1a, 0x6c, 0xab, 0x5c, 0xaa, 0x5d, | 637 | 0xf6, 0x12, 0x2d, 0xeb, 0x5e, 0x4f, 0xff, 0x78, 0x83, 0xf6, 0x12, 0x2d, 0xf4, 0x75, 0xf0, 0x02, |
627 | 0xa9, 0x5e, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x0b, 0x30, 0xe4, 0x03, 0x12, 0x2d, 0x32, 0x78, 0x82, | 638 | 0x12, 0x1b, 0x1c, 0x90, 0xfa, 0xc7, 0xe4, 0x75, 0xf0, 0x02, 0x12, 0x1b, 0x1c, 0xab, 0x5c, 0xaa, |
628 | 0x06, 0x80, 0xaa, 0xe4, 0x90, 0xfa, 0xbf, 0xf0, 0x22, 0x8b, 0x56, 0x8a, 0x57, 0x89, 0x58, 0x90, | 639 | 0x5d, 0xa9, 0x5e, 0x90, 0x00, 0x04, 0x12, 0x1a, 0xbb, 0x30, 0xe4, 0x03, 0x12, 0x2e, 0x03, 0x78, |
629 | 0xfa, 0xbf, 0x74, 0x06, 0xf0, 0xe4, 0x90, 0xfa, 0xbe, 0xf0, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60, | 640 | 0x82, 0x06, 0x80, 0xaa, 0xe4, 0x90, 0xfa, 0xc2, 0xf0, 0x22, 0x8b, 0x56, 0x8a, 0x57, 0x89, 0x58, |
630 | 0x26, 0x14, 0x70, 0x70, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x12, 0x12, 0x24, 0x95, | 641 | 0x90, 0xfa, 0xc2, 0x74, 0x06, 0xf0, 0xe4, 0x90, 0xfa, 0xc1, 0xf0, 0x12, 0x1a, 0xa2, 0x24, 0x6e, |
631 | 0x80, 0x62, 0x12, 0x2d, 0x53, 0x12, 0x1f, 0x2c, 0x90, 0xfa, 0xbf, 0xef, 0xf0, 0x80, 0x55, 0x90, | 642 | 0x60, 0x26, 0x14, 0x70, 0x70, 0x12, 0x2d, 0xda, 0x60, 0x09, 0x24, 0x30, 0x70, 0x12, 0x12, 0x25, |
632 | 0xfa, 0xbf, 0x74, 0x81, 0xf0, 0x80, 0x4d, 0x12, 0x2d, 0x09, 0x60, 0x09, 0x24, 0x30, 0x70, 0x3e, | 643 | 0x56, 0x80, 0x62, 0x12, 0x2e, 0x24, 0x12, 0x1f, 0xda, 0x90, 0xfa, 0xc2, 0xef, 0xf0, 0x80, 0x55, |
633 | 0x12, 0x2c, 0x5f, 0x80, 0x3f, 0xe5, 0x58, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x57, 0xfa, 0x7b, 0x01, | 644 | 0x90, 0xfa, 0xc2, 0x74, 0x81, 0xf0, 0x80, 0x4d, 0x12, 0x2d, 0xda, 0x60, 0x09, 0x24, 0x30, 0x70, |
634 | 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0xfd, | 645 | 0x3e, 0x12, 0x2d, 0x30, 0x80, 0x3f, 0xe5, 0x58, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x57, 0xfa, 0x7b, |
635 | 0x90, 0x00, 0x08, 0x12, 0x1a, 0x98, 0xf5, 0x2e, 0x85, 0xf0, 0x2d, 0xd0, 0x01, 0xd0, 0x02, 0xd0, | 646 | 0x01, 0xc0, 0x03, 0xc0, 0x02, 0xc0, 0x01, 0x12, 0x2e, 0x24, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb, |
636 | 0x03, 0x12, 0x25, 0xd7, 0x90, 0xfa, 0xbe, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0x80, 0x06, 0x90, 0xfa, | 647 | 0xfd, 0x90, 0x00, 0x08, 0x12, 0x1b, 0x48, 0xf5, 0x2e, 0x85, 0xf0, 0x2d, 0xd0, 0x01, 0xd0, 0x02, |
637 | 0xbf, 0x74, 0x81, 0xf0, 0x90, 0xfa, 0xbf, 0xe0, 0x12, 0x2d, 0x53, 0x90, 0x00, 0x02, 0x12, 0x1a, | 648 | 0xd0, 0x03, 0x12, 0x26, 0x98, 0x90, 0xfa, 0xc1, 0xef, 0xf0, 0xe4, 0xa3, 0xf0, 0x80, 0x06, 0x90, |
638 | 0x4a, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x22, 0x8b, 0x29, 0x8a, 0x2a, 0x89, 0x2b, 0x8d, 0x2c, 0xe5, | 649 | 0xfa, 0xc2, 0x74, 0x81, 0xf0, 0x90, 0xfa, 0xc2, 0xe0, 0x12, 0x2e, 0x24, 0x90, 0x00, 0x02, 0x12, |
639 | 0x2c, 0x70, 0x03, 0xaf, 0x2c, 0x22, 0x12, 0x2d, 0x82, 0x70, 0x16, 0x12, 0x2d, 0xa1, 0xe5, 0x2d, | 650 | 0x1a, 0xfa, 0x90, 0xfa, 0xc1, 0xe0, 0xff, 0x22, 0x8b, 0x29, 0x8a, 0x2a, 0x89, 0x2b, 0x8d, 0x2c, |
640 | 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x26, 0x64, 0x40, 0x0b, 0x7f, 0x00, | 651 | 0xe5, 0x2c, 0x70, 0x03, 0xaf, 0x2c, 0x22, 0x12, 0x2e, 0x53, 0x70, 0x16, 0x12, 0x2e, 0x72, 0xe5, |
641 | 0x22, 0x12, 0x2d, 0xa1, 0x12, 0x26, 0x64, 0x50, 0xf8, 0x90, 0xff, 0xf3, 0x74, 0xa1, 0xf0, 0xe5, | 652 | 0x2d, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0xd8, 0x50, 0xf2, 0x12, 0x27, 0x25, 0x40, 0x0b, 0x7f, |
642 | 0x2c, 0xb4, 0x01, 0x07, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0xf1, 0xe4, 0xf0, | 653 | 0x00, 0x22, 0x12, 0x2e, 0x72, 0x12, 0x27, 0x25, 0x50, 0xf8, 0x90, 0xff, 0xf3, 0x74, 0xa1, 0xf0, |
643 | 0xf5, 0x2f, 0xe5, 0x2c, 0x14, 0xff, 0xe5, 0x2f, 0xc3, 0x9f, 0x50, 0x2a, 0x12, 0x31, 0x04, 0x40, | 654 | 0xe5, 0x2c, 0xb4, 0x01, 0x07, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0xf1, 0xe4, |
644 | 0x03, 0xaf, 0x2f, 0x22, 0xc3, 0xe5, 0x2c, 0x95, 0x2f, 0xff, 0xbf, 0x02, 0x07, 0x90, 0xff, 0xf0, | 655 | 0xf0, 0xf5, 0x2f, 0xe5, 0x2c, 0x14, 0xff, 0xe5, 0x2f, 0xc3, 0x9f, 0x50, 0x2a, 0x12, 0x31, 0xc1, |
645 | 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x2d, 0x94, 0x05, 0x2f, 0x74, 0x01, 0x25, 0x2b, 0xf5, 0x2b, 0xe4, | 656 | 0x40, 0x03, 0xaf, 0x2f, 0x22, 0xc3, 0xe5, 0x2c, 0x95, 0x2f, 0xff, 0xbf, 0x02, 0x07, 0x90, 0xff, |
646 | 0x35, 0x2a, 0xf5, 0x2a, 0x80, 0xcc, 0x12, 0x31, 0x04, 0x40, 0x03, 0x7f, 0x18, 0x22, 0x12, 0x2d, | 657 | 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x12, 0x2e, 0x65, 0x05, 0x2f, 0x74, 0x01, 0x25, 0x2b, 0xf5, 0x2b, |
647 | 0x94, 0xaf, 0x2c, 0x22, 0x90, 0xff, 0xf1, 0xe5, 0x2e, 0xf0, 0x02, 0x31, 0x1b, 0x12, 0x10, 0x03, | 658 | 0xe4, 0x35, 0x2a, 0xf5, 0x2a, 0x80, 0xcc, 0x12, 0x31, 0xc1, 0x40, 0x03, 0x7f, 0x18, 0x22, 0x12, |
648 | 0x78, 0x84, 0x12, 0x22, 0x82, 0x30, 0xe1, 0x08, 0x7f, 0x13, 0x12, 0x30, 0xec, 0x02, 0x26, 0xfb, | 659 | 0x2e, 0x65, 0xaf, 0x2c, 0x22, 0x90, 0xff, 0xf1, 0xe5, 0x2e, 0xf0, 0x02, 0x31, 0xd8, 0x12, 0x10, |
649 | 0x78, 0x84, 0xe6, 0xf9, 0x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xff, 0x30, 0xe7, 0x40, 0x54, 0x03, | 660 | 0x4b, 0x78, 0x84, 0x12, 0x23, 0x31, 0x30, 0xe1, 0x08, 0x7f, 0x13, 0x12, 0x31, 0xa9, 0x02, 0x27, |
650 | 0x60, 0x1e, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x44, 0x04, | 661 | 0xbc, 0x78, 0x84, 0xe6, 0xf9, 0x24, 0x13, 0x12, 0x22, 0xad, 0xe0, 0xff, 0x30, 0xe7, 0x40, 0x54, |
651 | 0xf0, 0x80, 0x46, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x80, 0x39, | 662 | 0x03, 0x60, 0x1e, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x44, |
652 | 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x80, | 663 | 0x04, 0xf0, 0x80, 0x46, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfd, 0xf0, 0xe0, 0x44, 0x08, 0xf0, 0x80, |
653 | 0x28, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1b, 0xef, 0x54, | 664 | 0x39, 0xe9, 0xb4, 0x03, 0x0d, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xfb, 0xf0, 0xe0, 0x44, 0x01, 0xf0, |
654 | 0x03, 0x60, 0x14, 0xe9, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, 0x07, | 665 | 0x80, 0x28, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf7, 0xf0, 0xe0, 0x44, 0x02, 0xf0, 0x80, 0x1b, 0xef, |
655 | 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 0xf0, 0xc2, 0xb3, 0x90, 0xf9, 0x17, 0xe0, 0x04, 0xf0, 0xaf, | 666 | 0x54, 0x03, 0x60, 0x14, 0xe9, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x54, 0xdf, 0xf0, 0x80, |
656 | 0x01, 0x12, 0x22, 0x33, 0xfd, 0x12, 0x2f, 0x49, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x75, 0xa8, | 667 | 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x54, 0xdf, 0xf0, 0xc2, 0xb3, 0x90, 0xf9, 0x18, 0xe0, 0x04, 0xf0, |
657 | 0x40, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x8b, 0x02, 0x27, 0x48, 0x02, 0x30, 0xcf, | 668 | 0xaf, 0x01, 0x12, 0x22, 0xee, 0xfd, 0x12, 0x2f, 0xe5, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, 0x75, |
658 | 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, 0xf4, | 669 | 0xa8, 0x40, 0x78, 0x7f, 0xe4, 0xf6, 0xd8, 0xfd, 0x75, 0x81, 0x8b, 0x02, 0x28, 0x09, 0x02, 0x31, |
659 | 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, 0x0f, | 670 | 0x8c, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08, 0xdf, |
660 | 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, 0x0b, | 671 | 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8, 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4, 0x54, |
661 | 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x2b, 0x4c, 0xe4, 0x7e, 0x01, 0x93, 0x60, | 672 | 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04, 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4, 0x80, |
662 | 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, 0x01, | 673 | 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x90, 0x2b, 0xa9, 0xe4, 0x7e, 0x01, 0x93, |
663 | 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, 0x93, | 674 | 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30, 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3, 0x60, |
664 | 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, 0xc8, | 675 | 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0, 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa, 0xe4, |
665 | 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xe4, 0xf5, 0x22, | 676 | 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0, 0xa3, |
666 | 0x12, 0x1d, 0x12, 0xe0, 0xb4, 0x04, 0x0d, 0xe5, 0x22, 0x24, 0x03, 0xff, 0x12, 0x2f, 0x77, 0x12, | 677 | 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xe4, 0xf5, |
667 | 0x1d, 0x12, 0xe4, 0xf0, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x02, 0x40, 0xe3, 0xe4, 0xf5, 0x22, | 678 | 0x22, 0x12, 0x1d, 0xc2, 0xe0, 0xb4, 0x04, 0x0d, 0xe5, 0x22, 0x24, 0x03, 0xff, 0x12, 0x30, 0x13, |
668 | 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1d, 0x53, 0x60, 0x2c, 0x12, 0x2c, 0xb4, | 679 | 0x12, 0x1d, 0xc2, 0xe4, 0xf0, 0x05, 0x22, 0xe5, 0x22, 0xc3, 0x94, 0x02, 0x40, 0xe3, 0xe4, 0xf5, |
669 | 0xef, 0x60, 0x52, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x91, 0x12, 0x1b, 0x1c, 0xe4, 0xf0, | 680 | 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x94, 0x12, 0x1e, 0x03, 0x60, 0x2c, 0x12, 0x2d, |
670 | 0xa3, 0xf0, 0x75, 0xf0, 0x0a, 0xe5, 0x22, 0x90, 0xfa, 0x9d, 0x12, 0x1b, 0x1c, 0xe0, 0xa3, 0x30, | 681 | 0x85, 0xef, 0x60, 0x52, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, 0x94, 0x12, 0x1b, 0xcc, 0xe4, |
671 | 0xe6, 0x33, 0x12, 0x1d, 0x12, 0x74, 0x04, 0xf0, 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, 0xfa, | 682 | 0xf0, 0xa3, 0xf0, 0x75, 0xf0, 0x0a, 0xe5, 0x22, 0x90, 0xfa, 0xa0, 0x12, 0x1b, 0xcc, 0xe0, 0xa3, |
672 | 0x95, 0x12, 0x1d, 0x53, 0x60, 0x16, 0x12, 0x2c, 0xb4, 0xef, 0x60, 0x19, 0x75, 0xf0, 0x02, 0xe5, | 683 | 0x30, 0xe6, 0x33, 0x12, 0x1d, 0xc2, 0x74, 0x04, 0xf0, 0x22, 0x75, 0xf0, 0x02, 0xe5, 0x22, 0x90, |
673 | 0x22, 0x90, 0xfa, 0x95, 0x12, 0x1b, 0x1c, 0xe4, 0xf0, 0xa3, 0xf0, 0x22, 0x05, 0x22, 0xe5, 0x22, | 684 | 0xfa, 0x98, 0x12, 0x1e, 0x03, 0x60, 0x16, 0x12, 0x2d, 0x85, 0xef, 0x60, 0x19, 0x75, 0xf0, 0x02, |
674 | 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x22, 0xe4, 0xff, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xfe, 0xef, | 685 | 0xe5, 0x22, 0x90, 0xfa, 0x98, 0x12, 0x1b, 0xcc, 0xe4, 0xf0, 0xa3, 0xf0, 0x22, 0x05, 0x22, 0xe5, |
675 | 0xc3, 0x9e, 0x50, 0x17, 0x74, 0xf0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xe0, 0x12, | 686 | 0x22, 0xc3, 0x94, 0x02, 0x40, 0x9b, 0x22, 0xe4, 0xff, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xfe, |
676 | 0x1c, 0x11, 0x12, 0x1a, 0x38, 0x0f, 0x12, 0x1c, 0x00, 0x80, 0xdd, 0xef, 0xfd, 0xc3, 0xe5, 0x3a, | 687 | 0xef, 0xc3, 0x9e, 0x50, 0x17, 0x74, 0xf0, 0x2f, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xe0, |
677 | 0x9d, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 0xd3, 0xe5, 0x3a, 0x94, 0x00, 0xe5, 0x39, | 688 | 0x12, 0x1c, 0xc1, 0x12, 0x1a, 0xe8, 0x0f, 0x12, 0x1c, 0xb0, 0x80, 0xdd, 0xef, 0xfd, 0xc3, 0xe5, |
678 | 0x94, 0x00, 0x40, 0x06, 0xe4, 0x90, 0xff, 0x83, 0xf0, 0x22, 0x12, 0x1d, 0x2f, 0x12, 0x1d, 0x84, | 689 | 0x3a, 0x9d, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, 0xd3, 0xe5, 0x3a, 0x94, 0x00, 0xe5, |
679 | 0x12, 0x1d, 0x76, 0x12, 0x19, 0xf2, 0x24, 0x6e, 0x60, 0x1e, 0x14, 0x60, 0x1b, 0x24, 0x8e, 0x70, | 690 | 0x39, 0x94, 0x00, 0x40, 0x06, 0xe4, 0x90, 0xff, 0x83, 0xf0, 0x22, 0x12, 0x1d, 0xdf, 0x12, 0x1e, |
680 | 0x2d, 0x90, 0x00, 0x01, 0x12, 0x1a, 0x0b, 0xff, 0x24, 0xfc, 0x60, 0x03, 0x04, 0x70, 0x1f, 0xef, | 691 | 0x34, 0x12, 0x1e, 0x26, 0x12, 0x1a, 0xa2, 0x24, 0x6e, 0x60, 0x1e, 0x14, 0x60, 0x1b, 0x24, 0x8e, |
681 | 0xfd, 0x7c, 0x00, 0x7f, 0x0d, 0x02, 0x11, 0x16, 0x12, 0x1d, 0x8b, 0x12, 0x25, 0x39, 0x12, 0x1c, | 692 | 0x70, 0x2d, 0x90, 0x00, 0x01, 0x12, 0x1a, 0xbb, 0xff, 0x24, 0xfc, 0x60, 0x03, 0x04, 0x70, 0x1f, |
682 | 0xd9, 0x12, 0x1a, 0x0b, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff, 0x12, 0x31, 0xb1, 0x22, 0x8b, | 693 | 0xef, 0xfd, 0x7c, 0x00, 0x7f, 0x0d, 0x02, 0x11, 0x5e, 0x12, 0x1e, 0x3b, 0x12, 0x25, 0xfa, 0x12, |
683 | 0x45, 0x8a, 0x46, 0x89, 0x47, 0x8c, 0x48, 0x8d, 0x49, 0xd2, 0x00, 0x12, 0x2d, 0x82, 0x70, 0x16, | 694 | 0x1d, 0x89, 0x12, 0x1a, 0xbb, 0x60, 0x03, 0x02, 0x32, 0x7a, 0xe4, 0xff, 0x12, 0x32, 0x6e, 0x22, |
684 | 0x12, 0x2d, 0xa1, 0xe5, 0x48, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0x1b, 0x50, 0xf2, 0x12, 0x29, | 695 | 0x8b, 0x45, 0x8a, 0x46, 0x89, 0x47, 0x8c, 0x48, 0x8d, 0x49, 0xd2, 0x00, 0x12, 0x2e, 0x53, 0x70, |
685 | 0x14, 0x40, 0x0b, 0x7f, 0x18, 0x22, 0x12, 0x2d, 0xa1, 0x12, 0x29, 0x14, 0x50, 0xf8, 0xe4, 0xf5, | 696 | 0x16, 0x12, 0x2e, 0x72, 0xe5, 0x48, 0x90, 0xff, 0xf1, 0xf0, 0x12, 0x31, 0xd8, 0x50, 0xf2, 0x12, |
686 | 0x4b, 0xe5, 0x4a, 0x14, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, 0x17, 0x12, 0x29, 0x04, 0x40, 0x03, | 697 | 0x29, 0xd5, 0x40, 0x0b, 0x7f, 0x18, 0x22, 0x12, 0x2e, 0x72, 0x12, 0x29, 0xd5, 0x50, 0xf8, 0xe4, |
687 | 0x7f, 0x18, 0x22, 0x05, 0x4b, 0x74, 0x01, 0x25, 0x47, 0xf5, 0x47, 0xe4, 0x35, 0x46, 0xf5, 0x46, | 698 | 0xf5, 0x4b, 0xe5, 0x4a, 0x14, 0xff, 0xe5, 0x4b, 0xc3, 0x9f, 0x50, 0x17, 0x12, 0x29, 0xc5, 0x40, |
688 | 0x80, 0xdf, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x29, 0x04, 0x40, 0x03, 0x7f, 0x18, | 699 | 0x03, 0x7f, 0x18, 0x22, 0x05, 0x4b, 0x74, 0x01, 0x25, 0x47, 0xf5, 0x47, 0xe4, 0x35, 0x46, 0xf5, |
689 | 0x22, 0x7f, 0x00, 0x22, 0xab, 0x45, 0xaa, 0x46, 0xa9, 0x47, 0x12, 0x19, 0xf2, 0x90, 0xff, 0xf1, | 700 | 0x46, 0x80, 0xdf, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x29, 0xc5, 0x40, 0x03, 0x7f, |
690 | 0xf0, 0x02, 0x31, 0x1b, 0x90, 0xff, 0xf1, 0xe5, 0x49, 0xf0, 0x02, 0x31, 0x1b, 0x7b, 0x01, 0x7a, | 701 | 0x18, 0x22, 0x7f, 0x00, 0x22, 0xab, 0x45, 0xaa, 0x46, 0xa9, 0x47, 0x12, 0x1a, 0xa2, 0x90, 0xff, |
691 | 0xfa, 0x79, 0xcc, 0xe4, 0xfd, 0x12, 0x22, 0xa0, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x09, 0x12, | 702 | 0xf1, 0xf0, 0x02, 0x31, 0xd8, 0x90, 0xff, 0xf1, 0xe5, 0x49, 0xf0, 0x02, 0x31, 0xd8, 0x7b, 0x01, |
692 | 0x1a, 0x6c, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, | 703 | 0x7a, 0xfa, 0x79, 0xcf, 0xe4, 0xfd, 0x12, 0x23, 0x61, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x09, |
693 | 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x90, 0xff, 0xf7, 0xe5, | 704 | 0x12, 0x1b, 0x1c, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, |
694 | 0x23, 0x12, 0x29, 0x78, 0x90, 0xff, 0xf6, 0xe5, 0x23, 0xf0, 0x90, 0xfa, 0xcc, 0xe4, 0xf0, 0xa3, | 705 | 0x12, 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x90, 0xff, 0xf7, |
695 | 0x74, 0x06, 0x12, 0x29, 0x78, 0xe5, 0x23, 0x30, 0xe0, 0x07, 0x90, 0xff, 0xfc, 0x74, 0x94, 0xf0, | 706 | 0xe5, 0x23, 0x12, 0x2a, 0x39, 0x90, 0xff, 0xf6, 0xe5, 0x23, 0xf0, 0x90, 0xfa, 0xcf, 0xe4, 0xf0, |
696 | 0x22, 0x90, 0xff, 0xfc, 0x74, 0x90, 0xf0, 0x22, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, 0x90, | 707 | 0xa3, 0x74, 0x06, 0x12, 0x2a, 0x39, 0xe5, 0x23, 0x30, 0xe0, 0x07, 0x90, 0xff, 0xfc, 0x74, 0x94, |
697 | 0xfa, 0xcc, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1a, 0x82, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, 0x01, | 708 | 0xf0, 0x22, 0x90, 0xff, 0xfc, 0x74, 0x90, 0xf0, 0x22, 0xf0, 0x7b, 0x00, 0x7a, 0x00, 0x79, 0x23, |
698 | 0x02, 0x25, 0xd7, 0x90, 0xff, 0x93, 0x74, 0x2a, 0xf0, 0x90, 0xff, 0xff, 0xe0, 0x60, 0x06, 0x90, | 709 | 0x90, 0xfa, 0xcf, 0xe4, 0x75, 0xf0, 0x01, 0x12, 0x1b, 0x32, 0x85, 0xf0, 0x2e, 0xf5, 0x2d, 0x7d, |
699 | 0xff, 0xfc, 0x74, 0x10, 0xf0, 0x90, 0xff, 0x91, 0xe0, 0x44, 0x90, 0xf0, 0xe4, 0x90, 0xf9, 0x15, | 710 | 0x01, 0x02, 0x26, 0x98, 0x90, 0xff, 0x93, 0x74, 0x81, 0xf0, 0x90, 0xff, 0xff, 0xe0, 0x60, 0x06, |
700 | 0xf0, 0xa3, 0xf0, 0x12, 0x2a, 0x78, 0x12, 0x16, 0x42, 0x12, 0x2f, 0xcd, 0x7e, 0x07, 0x7f, 0xd0, | 711 | 0x90, 0xff, 0xfc, 0x74, 0x10, 0xf0, 0x90, 0xff, 0x91, 0xe0, 0x44, 0x90, 0xf0, 0xe4, 0x90, 0xf9, |
701 | 0x12, 0x11, 0xe2, 0x7e, 0x0f, 0x7f, 0xa0, 0x12, 0x11, 0xfc, 0xe4, 0x78, 0x77, 0xf6, 0x78, 0x77, | 712 | 0x16, 0xf0, 0xa3, 0xf0, 0x12, 0x2b, 0x39, 0x12, 0x16, 0xc9, 0x12, 0x30, 0x69, 0x7e, 0x07, 0x7f, |
702 | 0xe6, 0xff, 0xc3, 0x94, 0x06, 0x50, 0x0b, 0x74, 0x6e, 0x2f, 0xf8, 0xe4, 0xf6, 0x78, 0x77, 0x06, | 713 | 0xd0, 0x12, 0x12, 0x2a, 0x7e, 0x0f, 0x7f, 0xa0, 0x12, 0x12, 0x44, 0xe4, 0x78, 0x77, 0xf6, 0x78, |
703 | 0x80, 0xec, 0x7f, 0x03, 0x12, 0x2e, 0xb3, 0x90, 0xf9, 0x15, 0xe0, 0x20, 0xe4, 0x05, 0x7f, 0x04, | 714 | 0x77, 0xe6, 0xff, 0xc3, 0x94, 0x06, 0x50, 0x0b, 0x74, 0x6e, 0x2f, 0xf8, 0xe4, 0xf6, 0x78, 0x77, |
704 | 0x12, 0x2e, 0xb3, 0x90, 0xff, 0x9b, 0xe4, 0xf0, 0x90, 0xff, 0x9a, 0xf0, 0x90, 0xff, 0xe8, 0xe0, | 715 | 0x06, 0x80, 0xec, 0x7f, 0x03, 0x12, 0x30, 0xb2, 0x90, 0xf9, 0x16, 0xe0, 0x20, 0xe4, 0x05, 0x7f, |
705 | 0x54, 0x1f, 0xf0, 0xd2, 0xa8, 0x22, 0x15, 0x65, 0xa8, 0x65, 0xa6, 0x07, 0x30, 0x08, 0x05, 0x12, | 716 | 0x04, 0x12, 0x30, 0xb2, 0x90, 0xff, 0x9b, 0xe4, 0xf0, 0x90, 0xff, 0x9a, 0xf0, 0x90, 0xff, 0xe8, |
706 | 0x11, 0x66, 0x80, 0xf8, 0xd2, 0x08, 0xa8, 0x65, 0xe6, 0xff, 0xb4, 0x03, 0x0f, 0x78, 0x7c, 0x76, | 717 | 0xe0, 0x54, 0x1f, 0xf0, 0xd2, 0xa8, 0x22, 0x15, 0x65, 0xa8, 0x65, 0xa6, 0x07, 0x30, 0x08, 0x05, |
707 | 0xff, 0x08, 0x76, 0xe0, 0x08, 0x76, 0xff, 0x08, 0x76, 0xa0, 0x80, 0x0d, 0x78, 0x7c, 0x76, 0xff, | 718 | 0x12, 0x11, 0xae, 0x80, 0xf8, 0xd2, 0x08, 0xa8, 0x65, 0xe6, 0xff, 0xb4, 0x03, 0x0f, 0x78, 0x7c, |
708 | 0x08, 0x76, 0xe2, 0x08, 0x76, 0xff, 0x08, 0x76, 0xb0, 0x78, 0x80, 0x76, 0xfa, 0x08, 0x76, 0x9b, | 719 | 0x76, 0xff, 0x08, 0x76, 0xe0, 0x08, 0x76, 0xff, 0x08, 0x76, 0xa0, 0x80, 0x0d, 0x78, 0x7c, 0x76, |
709 | 0xef, 0x24, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0xae, 0xf0, 0x12, 0x22, 0x92, 0x7b, 0x01, 0x7a, 0xff, | 720 | 0xff, 0x08, 0x76, 0xe2, 0x08, 0x76, 0xff, 0x08, 0x76, 0xb0, 0x78, 0x80, 0x76, 0xfa, 0x08, 0x76, |
710 | 0x79, 0x48, 0x78, 0x68, 0x12, 0x1b, 0x31, 0xa8, 0x65, 0xe6, 0x24, 0xfd, 0x75, 0xf0, 0x08, 0xa4, | 721 | 0x9e, 0xef, 0x24, 0xfd, 0x75, 0xf0, 0x0a, 0xa4, 0xae, 0xf0, 0x12, 0x23, 0x49, 0x7b, 0x01, 0x7a, |
711 | 0xff, 0xae, 0xf0, 0x78, 0x6a, 0x12, 0x22, 0x92, 0x79, 0x08, 0x78, 0x6b, 0x12, 0x1b, 0x31, 0x78, | 722 | 0xff, 0x79, 0x48, 0x78, 0x68, 0x12, 0x1b, 0xe1, 0xa8, 0x65, 0xe6, 0x24, 0xfd, 0x75, 0xf0, 0x08, |
712 | 0x6d, 0xef, 0x12, 0x22, 0x92, 0x05, 0x65, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xab, 0xf0, 0xe0, | 723 | 0xa4, 0xff, 0xae, 0xf0, 0x78, 0x6a, 0x12, 0x23, 0x49, 0x79, 0x08, 0x78, 0x6b, 0x12, 0x1b, 0xe1, |
713 | 0x44, 0x20, 0xf0, 0x90, 0xfa, 0xe3, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcc, 0xe4, | 724 | 0x78, 0x6d, 0xef, 0x12, 0x23, 0x49, 0x05, 0x65, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xab, 0xf0, |
714 | 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x25, 0xd7, 0x7e, 0x00, 0x90, 0xfa, 0xe1, 0xee, 0xf0, | 725 | 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xfa, 0xe6, 0x74, 0x02, 0xf0, 0x7b, 0x01, 0x7a, 0xfa, 0x79, 0xcf, |
715 | 0xa3, 0xef, 0xf0, 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x52, 0x09, 0x90, 0xf9, | 726 | 0xe4, 0xf5, 0x2d, 0xf5, 0x2e, 0x7d, 0x01, 0x12, 0x26, 0x98, 0x7e, 0x00, 0x90, 0xfa, 0xe4, 0xee, |
716 | 0x15, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x29, 0x90, 0xfa, 0xe1, 0xe0, 0x70, 0x04, 0xa3, 0xe0, 0x64, | 727 | 0xf0, 0xa3, 0xef, 0xf0, 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcf, 0xe0, 0xb4, 0x52, 0x09, 0x90, |
717 | 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcc, 0xe0, 0xb4, 0x10, 0x09, 0x90, 0xf9, 0x15, 0xe0, 0x44, 0x10, | 728 | 0xf9, 0x16, 0xe0, 0x54, 0xef, 0xf0, 0x80, 0x29, 0x90, 0xfa, 0xe4, 0xe0, 0x70, 0x04, 0xa3, 0xe0, |
718 | 0xf0, 0x80, 0x0d, 0x90, 0xfa, 0xe3, 0x74, 0x03, 0xf0, 0x90, 0xf9, 0x15, 0xe0, 0x54, 0xef, 0xf0, | 729 | 0x64, 0x01, 0x70, 0x10, 0x90, 0xfa, 0xcf, 0xe0, 0xb4, 0x10, 0x09, 0x90, 0xf9, 0x16, 0xe0, 0x44, |
719 | 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x22, 0x12, 0x10, 0x03, 0x78, 0x8a, 0xef, 0xf6, 0x12, | 730 | 0x10, 0xf0, 0x80, 0x0d, 0x90, 0xfa, 0xe6, 0x74, 0x03, 0xf0, 0x90, 0xf9, 0x16, 0xe0, 0x54, 0xef, |
720 | 0x2a, 0x06, 0x12, 0x22, 0x33, 0x30, 0xe0, 0x25, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x7f, 0xf0, 0x78, | 731 | 0xf0, 0x90, 0xff, 0xf0, 0xe0, 0x44, 0x20, 0xf0, 0x22, 0x03, 0x68, 0x01, 0xff, 0x48, 0x03, 0x6b, |
721 | 0x6b, 0x12, 0x1b, 0x28, 0x90, 0x00, 0x02, 0x12, 0x1a, 0x0b, 0x30, 0xe7, 0x09, 0x90, 0x00, 0x02, | 732 | 0x01, 0xff, 0x08, 0x02, 0x66, 0x00, 0x00, 0x44, 0xfa, 0x98, 0x00, 0x00, 0x00, 0x00, 0x44, 0xfa, |
722 | 0xe4, 0x12, 0x1a, 0x4a, 0x80, 0xe9, 0x12, 0x22, 0x07, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x22, 0x33, | 733 | 0x94, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xb2, 0x00, 0x00, 0x42, 0xfa, 0x7e, 0x00, 0x00, 0x42, |
723 | 0x30, 0xe1, 0x1e, 0x12, 0x21, 0xe9, 0xe0, 0x54, 0x7f, 0xf0, 0x12, 0x31, 0x5c, 0x78, 0x68, 0x12, | 734 | 0xfa, 0x7c, 0x00, 0x00, 0x42, 0xf9, 0x6d, 0xff, 0xff, 0x42, 0xfa, 0x7a, 0x00, 0x00, 0x41, 0xf9, |
724 | 0x1b, 0x28, 0x90, 0x00, 0x02, 0x74, 0x80, 0x12, 0x1a, 0x4a, 0x12, 0x21, 0xe9, 0xe0, 0x44, 0x80, | 735 | 0x66, 0xff, 0x41, 0xf9, 0x1c, 0x19, 0x41, 0xf9, 0x15, 0x00, 0x43, 0xf9, 0x19, 0x0a, 0x32, 0x02, |
725 | 0xf0, 0x12, 0x31, 0xc7, 0xe4, 0xff, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x03, 0x68, 0x01, 0xff, | 736 | 0x41, 0xf9, 0x68, 0x20, 0x41, 0xf9, 0x69, 0x20, 0x41, 0xf9, 0x65, 0x00, 0x41, 0xf9, 0x67, 0x00, |
726 | 0x48, 0x03, 0x6b, 0x01, 0xff, 0x08, 0x02, 0x66, 0x00, 0x00, 0x44, 0xfa, 0x95, 0x00, 0x00, 0x00, | 737 | 0x44, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xf9, 0x16, 0x00, 0x00, 0x41, 0xf9, 0x18, 0x00, |
727 | 0x00, 0x44, 0xfa, 0x91, 0x00, 0x00, 0x00, 0x00, 0x42, 0xfa, 0xaf, 0x00, 0x00, 0x42, 0xfa, 0x7b, | 738 | 0x01, 0x20, 0x00, 0x41, 0xf8, 0x04, 0x00, 0x00, 0x12, 0x10, 0x4b, 0x78, 0x8a, 0xef, 0xf6, 0x12, |
728 | 0x00, 0x00, 0x42, 0xfa, 0x79, 0x00, 0x00, 0x42, 0xf9, 0x6a, 0xff, 0xff, 0x42, 0xfa, 0x77, 0x00, | 739 | 0x2a, 0xc7, 0x12, 0x22, 0xee, 0x30, 0xe0, 0x29, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x54, 0x7f, |
729 | 0x00, 0x43, 0xf9, 0x18, 0x0a, 0x32, 0x02, 0x41, 0xf9, 0x65, 0x20, 0x41, 0xf9, 0x66, 0x20, 0x41, | 740 | 0xf0, 0x78, 0x6b, 0x12, 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x12, 0x1a, 0xbb, 0x30, 0xe7, 0x09, 0x90, |
730 | 0xf9, 0x63, 0x00, 0x41, 0xf9, 0x64, 0x00, 0x44, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xf9, | 741 | 0x00, 0x02, 0xe4, 0x12, 0x1a, 0xfa, 0x80, 0xe9, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x44, 0x80, |
731 | 0x15, 0x00, 0x00, 0x41, 0xf9, 0x17, 0x00, 0x01, 0x20, 0x00, 0x41, 0xf8, 0x04, 0x00, 0x00, 0x12, | 742 | 0xf0, 0x12, 0x22, 0xee, 0x30, 0xe1, 0x1e, 0x12, 0x22, 0x97, 0xe0, 0x54, 0x7f, 0xf0, 0x12, 0x32, |
732 | 0x10, 0x03, 0x78, 0x85, 0xef, 0xf6, 0x12, 0x30, 0x93, 0x12, 0x30, 0xec, 0x78, 0x85, 0xe6, 0xff, | 743 | 0x19, 0x78, 0x68, 0x12, 0x1b, 0xd8, 0x90, 0x00, 0x02, 0x74, 0x80, 0x12, 0x1a, 0xfa, 0x12, 0x22, |
733 | 0x24, 0x12, 0x12, 0x21, 0xff, 0xe0, 0xfe, 0x30, 0xe7, 0x16, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, | 744 | 0x97, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x32, 0x84, 0xe4, 0xff, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, |
734 | 0x9e, 0xe0, 0x54, 0xfa, 0xf0, 0x80, 0x22, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf5, 0xf0, 0x80, 0x19, | 745 | 0x12, 0x10, 0x4b, 0x78, 0x85, 0xef, 0xf6, 0x12, 0x31, 0x50, 0x12, 0x31, 0xa9, 0x78, 0x85, 0xe6, |
735 | 0xee, 0x54, 0x03, 0x60, 0x14, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, 0xf0, | 746 | 0xff, 0x24, 0x13, 0x12, 0x22, 0xad, 0xe0, 0xfe, 0x30, 0xe7, 0x16, 0xef, 0xb4, 0x03, 0x09, 0x90, |
736 | 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xf9, 0x17, 0xe0, 0x14, 0xf0, 0xe0, | 747 | 0xff, 0x9e, 0xe0, 0x54, 0xfa, 0xf0, 0x80, 0x22, 0x90, 0xff, 0x9e, 0xe0, 0x54, 0xf5, 0xf0, 0x80, |
737 | 0x70, 0x02, 0xd2, 0xb3, 0x02, 0x10, 0x86, 0x12, 0x1d, 0x6c, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, | 748 | 0x19, 0xee, 0x54, 0x03, 0x60, 0x14, 0xef, 0xb4, 0x03, 0x09, 0x90, 0xff, 0xa4, 0xe0, 0x44, 0x20, |
738 | 0xe5, 0x39, 0x64, 0x01, 0x60, 0x48, 0xc3, 0xe5, 0x3a, 0x94, 0x08, 0xe5, 0x39, 0x94, 0x00, 0x40, | 749 | 0xf0, 0x80, 0x07, 0x90, 0xff, 0xb4, 0xe0, 0x44, 0x20, 0xf0, 0x90, 0xf9, 0x18, 0xe0, 0x14, 0xf0, |
739 | 0x11, 0x7f, 0x08, 0xef, 0xe5, 0x3a, 0x94, 0x08, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, 0x39, | 750 | 0xe0, 0x70, 0x02, 0xd2, 0xb3, 0x02, 0x10, 0xce, 0x12, 0x1e, 0x1c, 0xe5, 0x3a, 0x64, 0x09, 0x70, |
740 | 0x80, 0x05, 0xaf, 0x3a, 0x12, 0x1d, 0x84, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x19, 0x12, 0x1c, | 751 | 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x48, 0xc3, 0xe5, 0x3a, 0x94, 0x08, 0xe5, 0x39, 0x94, 0x00, |
741 | 0x11, 0x12, 0x19, 0xf2, 0xfd, 0x74, 0xf8, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, 0xed, | 752 | 0x40, 0x11, 0x7f, 0x08, 0xef, 0xe5, 0x3a, 0x94, 0x08, 0xf5, 0x3a, 0xe5, 0x39, 0x94, 0x00, 0xf5, |
742 | 0xf0, 0x0e, 0x12, 0x1c, 0x00, 0x80, 0xe2, 0xef, 0x54, 0x7f, 0x90, 0xff, 0x81, 0xf0, 0x22, 0x8b, | 753 | 0x39, 0x80, 0x05, 0xaf, 0x3a, 0x12, 0x1e, 0x34, 0xe4, 0xfe, 0xee, 0xc3, 0x9f, 0x50, 0x19, 0x12, |
743 | 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x12, 0x2d, 0x48, 0x70, 0x05, 0xa3, 0x74, 0x08, 0xf0, 0x22, 0xab, | 754 | 0x1c, 0xc1, 0x12, 0x1a, 0xa2, 0xfd, 0x74, 0xf8, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfe, 0xf5, 0x83, |
744 | 0x59, 0xaa, 0x5a, 0xa9, 0x5b, 0x12, 0x2d, 0x3c, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x43, 0xe5, 0x5b, | 755 | 0xed, 0xf0, 0x0e, 0x12, 0x1c, 0xb0, 0x80, 0xe2, 0xef, 0x54, 0x7f, 0x90, 0xff, 0x81, 0xf0, 0x22, |
745 | 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x5a, 0xfa, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x43, 0xe4, 0x90, 0xfa, | 756 | 0x8b, 0x59, 0x8a, 0x5a, 0x89, 0x5b, 0x12, 0x2e, 0x19, 0x70, 0x05, 0xa3, 0x74, 0x08, 0xf0, 0x22, |
746 | 0xbf, 0xf0, 0x78, 0x8b, 0xf6, 0x90, 0xfa, 0xbe, 0xe0, 0xff, 0x78, 0x8b, 0xe6, 0xc3, 0x9f, 0x50, | 757 | 0xab, 0x59, 0xaa, 0x5a, 0xa9, 0x5b, 0x12, 0x2e, 0x0d, 0x90, 0xfa, 0xc9, 0x12, 0x1b, 0xf3, 0xe5, |
747 | 0x12, 0x12, 0x2d, 0x1a, 0xff, 0x12, 0x2d, 0x23, 0x12, 0x2d, 0x36, 0x78, 0x8b, 0x06, 0x12, 0x2d, | 758 | 0x5b, 0x24, 0x03, 0xf9, 0xe4, 0x35, 0x5a, 0xfa, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0xf3, 0xe4, 0x90, |
748 | 0x32, 0x80, 0xe2, 0x22, 0xad, 0x07, 0xac, 0x06, 0x90, 0x31, 0x4d, 0xe4, 0x93, 0xff, 0x78, 0x74, | 759 | 0xfa, 0xc2, 0xf0, 0x78, 0x8b, 0xf6, 0x90, 0xfa, 0xc1, 0xe0, 0xff, 0x78, 0x8b, 0xe6, 0xc3, 0x9f, |
749 | 0xf6, 0x54, 0x0f, 0x12, 0x1c, 0xf8, 0xe0, 0x08, 0x76, 0x00, 0x08, 0xf6, 0x18, 0x12, 0x1c, 0x29, | 760 | 0x50, 0x12, 0x12, 0x2d, 0xeb, 0xff, 0x12, 0x2d, 0xf4, 0x12, 0x2e, 0x07, 0x78, 0x8b, 0x06, 0x12, |
750 | 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x78, 0x75, 0xee, 0xf6, 0x08, 0xef, 0xf6, 0xee, | 761 | 0x2e, 0x03, 0x80, 0xe2, 0x22, 0xad, 0x07, 0xac, 0x06, 0x90, 0x32, 0x0a, 0xe4, 0x93, 0xff, 0x78, |
751 | 0x44, 0xf8, 0x18, 0xf6, 0xef, 0x08, 0xf6, 0x90, 0xff, 0x7a, 0xe0, 0x20, 0xe7, 0x03, 0x7f, 0x00, | 762 | 0x74, 0xf6, 0x54, 0x0f, 0x12, 0x1d, 0xa8, 0xe0, 0x08, 0x76, 0x00, 0x08, 0xf6, 0x18, 0x12, 0x1c, |
752 | 0x22, 0x78, 0x75, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0xec, 0xf0, 0xa3, 0xed, 0xf0, | 763 | 0xd9, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9, 0xff, 0x78, 0x75, 0xee, 0xf6, 0x08, 0xef, 0xf6, |
753 | 0x90, 0xff, 0x7a, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x90, | 764 | 0xee, 0x44, 0xf8, 0x18, 0xf6, 0xef, 0x08, 0xf6, 0x90, 0xff, 0x7a, 0xe0, 0x20, 0xe7, 0x03, 0x7f, |
754 | 0x00, 0x03, 0x12, 0x1a, 0x0b, 0x54, 0xf0, 0x24, 0xa0, 0x22, 0x90, 0xfa, 0xc6, 0x12, 0x1b, 0x3a, | 765 | 0x00, 0x22, 0x78, 0x75, 0xe6, 0xfe, 0x08, 0xe6, 0xf5, 0x82, 0x8e, 0x83, 0xec, 0xf0, 0xa3, 0xed, |
755 | 0x02, 0x19, 0xf2, 0x90, 0xfa, 0xc0, 0x12, 0x1b, 0x3a, 0xef, 0x12, 0x1a, 0x38, 0x90, 0xfa, 0xc7, | 766 | 0xf0, 0x90, 0xff, 0x7a, 0x74, 0x02, 0xf0, 0x7f, 0x01, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, |
756 | 0xe4, 0x22, 0x90, 0xfa, 0xc1, 0xe4, 0x75, 0xf0, 0x01, 0x02, 0x1a, 0x6c, 0x90, 0x00, 0x08, 0x12, | 767 | 0x90, 0x00, 0x03, 0x12, 0x1a, 0xbb, 0x54, 0xf0, 0x24, 0xa0, 0x22, 0x90, 0xfa, 0xc9, 0x12, 0x1b, |
757 | 0x1a, 0x98, 0xaa, 0xf0, 0xf9, 0x7b, 0x01, 0x22, 0x90, 0x00, 0x05, 0x12, 0x1a, 0x0b, 0x90, 0xfa, | 768 | 0xea, 0x02, 0x1a, 0xa2, 0x90, 0xfa, 0xc3, 0x12, 0x1b, 0xea, 0xef, 0x12, 0x1a, 0xe8, 0x90, 0xfa, |
758 | 0xbe, 0xf0, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x22, 0x90, 0xfa, 0xda, 0xe0, 0xff, 0x7e, | 769 | 0xca, 0xe4, 0x22, 0x90, 0xfa, 0xc4, 0xe4, 0x75, 0xf0, 0x01, 0x02, 0x1b, 0x1c, 0x90, 0x00, 0x08, |
759 | 0x00, 0xc3, 0x90, 0xfa, 0xd4, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xd3, 0xe0, 0x9e, 0xf0, 0x90, 0xfa, | 770 | 0x12, 0x1b, 0x48, 0xaa, 0xf0, 0xf9, 0x7b, 0x01, 0x22, 0x90, 0x00, 0x05, 0x12, 0x1a, 0xbb, 0x90, |
760 | 0xd5, 0xee, 0x8f, 0xf0, 0x12, 0x1a, 0x6c, 0xef, 0x25, 0x51, 0xf5, 0x51, 0xee, 0x35, 0x50, 0xf5, | 771 | 0xfa, 0xc1, 0xf0, 0x22, 0xab, 0x56, 0xaa, 0x57, 0xa9, 0x58, 0x22, 0x90, 0xfa, 0xdd, 0xe0, 0xff, |
761 | 0x50, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0xfa, 0xe3, | 772 | 0x7e, 0x00, 0xc3, 0x90, 0xfa, 0xd7, 0xe0, 0x9f, 0xf0, 0x90, 0xfa, 0xd6, 0xe0, 0x9e, 0xf0, 0x90, |
762 | 0xe0, 0x64, 0x03, 0x22, 0x90, 0xff, 0xf2, 0xe0, 0xab, 0x29, 0xaa, 0x2a, 0xa9, 0x2b, 0x02, 0x1a, | 773 | 0xfa, 0xd8, 0xee, 0x8f, 0xf0, 0x12, 0x1b, 0x1c, 0xef, 0x25, 0x51, 0xf5, 0x51, 0xee, 0x35, 0x50, |
763 | 0x38, 0x90, 0xff, 0xf3, 0x74, 0xa0, 0xf0, 0x22, 0x8f, 0x64, 0xed, 0x70, 0x0f, 0xe5, 0x64, 0xb4, | 774 | 0xf5, 0x50, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0x54, 0xfe, 0xf0, 0xe0, 0x54, 0xfd, 0xf0, 0x90, 0xfa, |
764 | 0x03, 0x05, 0x7f, 0x01, 0x02, 0x31, 0x32, 0x7f, 0x02, 0x02, 0x31, 0x32, 0xaf, 0x64, 0x12, 0x2a, | 775 | 0xe6, 0xe0, 0x64, 0x03, 0x22, 0x90, 0xff, 0xf2, 0xe0, 0xab, 0x29, 0xaa, 0x2a, 0xa9, 0x2b, 0x02, |
765 | 0x06, 0x74, 0x6e, 0x25, 0x64, 0xf8, 0xe6, 0x30, 0xe2, 0x0b, 0xd2, 0x09, 0x12, 0x1c, 0x83, 0xe0, | 776 | 0x1a, 0xe8, 0x90, 0xff, 0xf3, 0x74, 0xa0, 0xf0, 0x22, 0x8f, 0x64, 0xed, 0x70, 0x0f, 0xe5, 0x64, |
766 | 0x54, 0x7f, 0xf0, 0x80, 0x02, 0xc2, 0x09, 0xe5, 0x64, 0xb4, 0x03, 0x07, 0x7f, 0x81, 0x12, 0x31, | 777 | 0xb4, 0x03, 0x05, 0x7f, 0x01, 0x02, 0x31, 0xef, 0x7f, 0x02, 0x02, 0x31, 0xef, 0xaf, 0x64, 0x12, |
767 | 0x32, 0x80, 0x05, 0x7f, 0x82, 0x12, 0x31, 0x32, 0x30, 0x09, 0x07, 0x12, 0x1c, 0x83, 0xe0, 0x44, | 778 | 0x2a, 0xc7, 0x74, 0x6e, 0x25, 0x64, 0xf8, 0xe6, 0x30, 0xe2, 0x0b, 0xd2, 0x09, 0x12, 0x1d, 0x33, |
768 | 0x80, 0xf0, 0x12, 0x31, 0xc7, 0x22, 0x12, 0x10, 0x03, 0x90, 0xff, 0xfd, 0xe0, 0x44, 0x60, 0xf0, | 779 | 0xe0, 0x54, 0x7f, 0xf0, 0x80, 0x02, 0xc2, 0x09, 0xe5, 0x64, 0xb4, 0x03, 0x07, 0x7f, 0x81, 0x12, |
769 | 0xd2, 0x01, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0x00, 0xe0, 0x30, 0xe7, 0x13, | 780 | 0x31, 0xef, 0x80, 0x05, 0x7f, 0x82, 0x12, 0x31, 0xef, 0x30, 0x09, 0x07, 0x12, 0x1d, 0x33, 0xe0, |
770 | 0x90, 0xff, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x35, 0x80, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x01, | 781 | 0x44, 0x80, 0xf0, 0x12, 0x32, 0x84, 0x22, 0x12, 0x10, 0x4b, 0x90, 0xff, 0xfd, 0xe0, 0x44, 0x60, |
771 | 0xf0, 0x80, 0x0d, 0x12, 0x1d, 0x2f, 0x53, 0x35, 0x7f, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0xfe, 0xf0, | 782 | 0xf0, 0xd2, 0x01, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x02, 0xf0, 0x90, 0xff, 0x00, 0xe0, 0x30, 0xe7, |
772 | 0x90, 0xff, 0x81, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x02, 0xb0, 0x12, 0x1d, 0x37, 0x02, 0x10, 0x86, | 783 | 0x13, 0x90, 0xff, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0x43, 0x35, 0x80, 0x90, 0xff, 0xfc, 0xe0, 0x44, |
773 | 0x12, 0x10, 0x03, 0x78, 0x89, 0xef, 0xf6, 0xd2, 0x00, 0x12, 0x2a, 0x06, 0x90, 0xf9, 0x67, 0x12, | 784 | 0x01, 0xf0, 0x80, 0x0d, 0x12, 0x1d, 0xdf, 0x53, 0x35, 0x7f, 0x90, 0xff, 0xfc, 0xe0, 0x54, 0xfe, |
774 | 0x1b, 0x3a, 0xe9, 0x24, 0x03, 0xf9, 0xe4, 0x3a, 0xfa, 0xc0, 0x02, 0x78, 0x80, 0xe6, 0xfe, 0x08, | 785 | 0xf0, 0x90, 0xff, 0x81, 0xe0, 0x44, 0x80, 0xf0, 0x12, 0x02, 0xde, 0x12, 0x1d, 0xe7, 0x02, 0x10, |
775 | 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0xd0, 0x02, 0x12, 0x22, 0x25, 0x12, 0x31, 0xc7, | 786 | 0xce, 0x12, 0x10, 0x4b, 0x78, 0x89, 0xef, 0xf6, 0xd2, 0x00, 0x12, 0x2a, 0xc7, 0x90, 0xf9, 0x6a, |
776 | 0x78, 0x89, 0xe6, 0xff, 0x12, 0x13, 0x3f, 0x12, 0x30, 0xec, 0x02, 0x10, 0x86, 0x8f, 0x63, 0x12, | 787 | 0x12, 0x1b, 0xea, 0xe9, 0x24, 0x03, 0xf9, 0xe4, 0x3a, 0xfa, 0xc0, 0x02, 0x78, 0x80, 0xe6, 0xfe, |
777 | 0x2a, 0x06, 0x12, 0x22, 0x07, 0xe0, 0x54, 0x3f, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x21, 0xf3, | 788 | 0x08, 0xe6, 0xaa, 0x06, 0xf8, 0xac, 0x02, 0x7d, 0x01, 0xd0, 0x02, 0x12, 0x22, 0xd3, 0x12, 0x32, |
778 | 0xe0, 0x54, 0x3f, 0xf0, 0x08, 0xe6, 0xfe, 0x08, 0xe6, 0x8e, 0x83, 0x24, 0x0b, 0x12, 0x21, 0xf3, | 789 | 0x84, 0x78, 0x89, 0xe6, 0xff, 0x12, 0x13, 0x87, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, 0x8f, 0x63, |
779 | 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x63, 0xf8, 0x74, 0xfb, 0x56, 0xf6, | 790 | 0x12, 0x2a, 0xc7, 0x78, 0x7c, 0x12, 0x22, 0xb7, 0xe0, 0x54, 0x3f, 0xf0, 0xe5, 0x82, 0x24, 0x04, |
780 | 0x7f, 0x00, 0x22, 0x8f, 0x23, 0xc2, 0x08, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12, 0x78, 0x7e, 0x12, | 791 | 0x12, 0x22, 0xa1, 0xe0, 0x54, 0x3f, 0xf0, 0x12, 0x23, 0x41, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0, |
781 | 0x21, 0xeb, 0xe0, 0x44, 0x01, 0xf0, 0x12, 0x22, 0x4a, 0x12, 0x21, 0xef, 0xe0, 0x20, 0xe0, 0xf6, | 792 | 0x54, 0xf8, 0xf0, 0x12, 0x32, 0x84, 0x74, 0x6e, 0x25, 0x63, 0xf8, 0x74, 0xfb, 0x56, 0xf6, 0x7f, |
782 | 0xef, 0x24, 0x0b, 0xf5, 0x82, 0xe4, 0x3e, 0xf5, 0x83, 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x31, 0xc7, | 793 | 0x00, 0x22, 0x12, 0x10, 0x4b, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xfa, 0x24, 0x06, 0x12, 0x22, 0x9f, |
783 | 0xaf, 0x23, 0x12, 0x13, 0x3f, 0x22, 0x12, 0x10, 0x03, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x4a, 0x24, | 794 | 0xe0, 0xfd, 0x12, 0x22, 0xe8, 0x90, 0x00, 0x03, 0x12, 0x23, 0x02, 0x24, 0x05, 0x12, 0x22, 0xa1, |
784 | 0x06, 0x12, 0x21, 0xf1, 0xe0, 0xfd, 0x12, 0x22, 0x2d, 0x90, 0x00, 0x03, 0x12, 0x22, 0x52, 0x24, | 795 | 0xe0, 0x90, 0x00, 0x04, 0x12, 0x1a, 0xfa, 0x12, 0x32, 0x84, 0x7d, 0x02, 0xe4, 0xff, 0x12, 0x2f, |
785 | 0x05, 0x12, 0x21, 0xf3, 0xe0, 0x90, 0x00, 0x04, 0x12, 0x1a, 0x4a, 0x12, 0x31, 0xc7, 0x7d, 0x02, | 796 | 0xb4, 0x02, 0x10, 0xce, 0xae, 0x05, 0x12, 0x1d, 0x8e, 0xef, 0x12, 0x1a, 0xfa, 0x0e, 0x0e, 0x0e, |
786 | 0xe4, 0xff, 0x12, 0x2f, 0x18, 0x02, 0x10, 0x86, 0xae, 0x05, 0x12, 0x1c, 0xde, 0xef, 0x12, 0x1a, | 797 | 0xee, 0xd3, 0x95, 0x3c, 0xe4, 0x95, 0x3b, 0x40, 0x02, 0xae, 0x3c, 0xee, 0xd3, 0x94, 0x08, 0x74, |
787 | 0x4a, 0x0e, 0x0e, 0x0e, 0xee, 0xd3, 0x95, 0x3c, 0xe4, 0x95, 0x3b, 0x40, 0x02, 0xae, 0x3c, 0xee, | 798 | 0x80, 0x94, 0x81, 0x40, 0x0a, 0x7e, 0x03, 0x90, 0x00, 0x02, 0x74, 0x02, 0x12, 0x1a, 0xfa, 0xaf, |
788 | 0xd3, 0x94, 0x08, 0x74, 0x80, 0x94, 0x81, 0x40, 0x0a, 0x7e, 0x03, 0x90, 0x00, 0x02, 0x74, 0x02, | 799 | 0x06, 0x12, 0x32, 0x6e, 0x22, 0xae, 0x07, 0xed, 0x54, 0x03, 0x64, 0x01, 0x60, 0x03, 0x7f, 0x10, |
789 | 0x12, 0x1a, 0x4a, 0xaf, 0x06, 0x12, 0x31, 0xb1, 0x22, 0xae, 0x07, 0xed, 0x54, 0x03, 0x64, 0x01, | 800 | 0x22, 0xed, 0x54, 0x7c, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x7f, 0x0b, 0x22, 0x74, 0x6e, 0x2e, 0xf8, |
790 | 0x60, 0x03, 0x7f, 0x10, 0x22, 0xed, 0x54, 0x7c, 0xc3, 0x94, 0x04, 0x50, 0x03, 0x7f, 0x0b, 0x22, | 801 | 0x74, 0x02, 0x46, 0xf6, 0x74, 0x99, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfa, 0xf5, 0x83, 0xed, 0xf0, |
791 | 0x74, 0x6e, 0x2e, 0xf8, 0x74, 0x02, 0x46, 0xf6, 0x74, 0x96, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0xfa, | 802 | 0x7f, 0x00, 0x22, 0xbf, 0x03, 0x06, 0x7c, 0xff, 0x7d, 0xe0, 0x80, 0x04, 0x7c, 0xff, 0x7d, 0xe2, |
792 | 0xf5, 0x83, 0xed, 0xf0, 0x7f, 0x00, 0x22, 0xbf, 0x03, 0x06, 0x7c, 0xff, 0x7d, 0xe0, 0x80, 0x04, | 803 | 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, 0x12, 0x22, 0xa1, 0xe0, |
793 | 0x7c, 0xff, 0x7d, 0xe2, 0x8d, 0x82, 0x8c, 0x83, 0xe0, 0x44, 0x80, 0xf0, 0xe5, 0x82, 0x24, 0x04, | 804 | 0x44, 0x80, 0xf0, 0x74, 0x6e, 0x2f, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, 0x00, 0x22, 0x12, 0x10, |
794 | 0x12, 0x21, 0xf3, 0xe0, 0x44, 0x80, 0xf0, 0x74, 0x6e, 0x2f, 0xf8, 0x74, 0x04, 0x46, 0xf6, 0x7f, | 805 | 0x4b, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x16, 0x90, 0xff, 0x83, |
795 | 0x00, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, | 806 | 0xe0, 0x54, 0x0f, 0xff, 0xc3, 0xe5, 0x3a, 0x9f, 0xe5, 0x39, 0x94, 0x00, 0x40, 0x05, 0x12, 0x28, |
796 | 0x16, 0x90, 0xff, 0x83, 0xe0, 0x54, 0x0f, 0xff, 0xc3, 0xe5, 0x3a, 0x9f, 0xe5, 0x39, 0x94, 0x00, | 807 | 0xd7, 0x80, 0x03, 0x12, 0x32, 0x7a, 0x02, 0x10, 0xce, 0x90, 0xff, 0xfc, 0xe0, 0x20, 0xe7, 0x1f, |
797 | 0x40, 0x05, 0x12, 0x28, 0x16, 0x80, 0x03, 0x12, 0x31, 0xbd, 0x02, 0x10, 0x86, 0x90, 0xff, 0xfc, | 808 | 0xc2, 0xaf, 0x7d, 0xff, 0xac, 0x05, 0x1d, 0xec, 0x60, 0x15, 0x7e, 0x04, 0x7f, 0x00, 0xef, 0x1f, |
798 | 0xe0, 0x20, 0xe7, 0x1f, 0xc2, 0xaf, 0x7d, 0xff, 0xac, 0x05, 0x1d, 0xec, 0x60, 0x15, 0x7e, 0x04, | 809 | 0xaa, 0x06, 0x70, 0x01, 0x1e, 0x4a, 0x60, 0xec, 0x90, 0xff, 0x92, 0xe4, 0xf0, 0x80, 0xef, 0x22, |
799 | 0x7f, 0x00, 0xef, 0x1f, 0xaa, 0x06, 0x70, 0x01, 0x1e, 0x4a, 0x60, 0xec, 0x90, 0xff, 0x92, 0xe4, | 810 | 0x12, 0x10, 0x4b, 0x78, 0x66, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x30, 0xe0, 0x12, 0x30, 0xe1, 0x0f, |
800 | 0xf0, 0x80, 0xef, 0x22, 0x12, 0x10, 0x03, 0x78, 0x66, 0xe6, 0xfe, 0x08, 0xe6, 0xff, 0x30, 0xe0, | 811 | 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x20, 0xf0, 0x7f, 0x04, 0x12, 0x12, 0x61, 0x12, 0x1d, 0xf6, 0x02, |
801 | 0x12, 0x30, 0xe1, 0x0f, 0x90, 0xff, 0xfc, 0xe0, 0x44, 0x20, 0xf0, 0x7f, 0x04, 0x12, 0x12, 0x19, | 812 | 0x10, 0xce, 0x8f, 0x23, 0xc2, 0x08, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xc0, 0x78, 0x7e, 0x12, 0x23, |
802 | 0x12, 0x1d, 0x46, 0x02, 0x10, 0x86, 0x8e, 0x5f, 0x8f, 0x60, 0xe5, 0x60, 0x15, 0x60, 0xae, 0x5f, | 813 | 0x42, 0x24, 0x0b, 0x12, 0x22, 0xa1, 0xe0, 0x54, 0xf8, 0xf0, 0x12, 0x32, 0x84, 0xaf, 0x23, 0x12, |
803 | 0x70, 0x02, 0x15, 0x5f, 0xd3, 0x94, 0x00, 0xee, 0x94, 0x00, 0x40, 0x09, 0x7e, 0x07, 0x7f, 0xd0, | 814 | 0x13, 0x87, 0x22, 0x8e, 0x5f, 0x8f, 0x60, 0xe5, 0x60, 0x15, 0x60, 0xae, 0x5f, 0x70, 0x02, 0x15, |
804 | 0x12, 0x0f, 0xdc, 0x80, 0xe5, 0x22, 0x11, 0x94, 0x2d, 0xf6, 0x23, 0xef, 0x31, 0xa3, 0x2f, 0xf4, | 815 | 0x5f, 0xd3, 0x94, 0x00, 0xee, 0x94, 0x00, 0x40, 0x09, 0x7e, 0x07, 0x7f, 0xd0, 0x12, 0x10, 0x24, |
805 | 0x2f, 0xa2, 0x30, 0xb2, 0x2e, 0xe6, 0x26, 0x6d, 0x2b, 0xaf, 0x30, 0x55, 0x30, 0x74, 0x1d, 0xb4, | 816 | 0x80, 0xe5, 0x22, 0x11, 0xdc, 0x2e, 0xc7, 0x24, 0xb0, 0x32, 0x60, 0x30, 0x90, 0x30, 0x3e, 0x31, |
806 | 0x2e, 0x40, 0x2a, 0xe8, 0x0e, 0x12, 0x10, 0x03, 0x78, 0x86, 0x12, 0x22, 0x82, 0x20, 0xe1, 0x07, | 817 | 0x6f, 0x2f, 0x82, 0x27, 0x2e, 0x2c, 0x80, 0x31, 0x12, 0x31, 0x31, 0x1e, 0x64, 0x2f, 0x11, 0x2c, |
807 | 0x7f, 0x12, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x86, 0xe6, 0xff, 0x12, 0x23, 0x49, 0x12, 0x30, | 818 | 0x18, 0x0e, 0x12, 0x10, 0x4b, 0x78, 0x86, 0x12, 0x23, 0x31, 0x20, 0xe1, 0x07, 0x7f, 0x12, 0x12, |
808 | 0xec, 0x02, 0x10, 0x86, 0x12, 0x10, 0x03, 0x78, 0x87, 0x12, 0x22, 0x82, 0x20, 0xe2, 0x07, 0x7f, | 819 | 0x31, 0xa9, 0x80, 0x0a, 0x78, 0x86, 0xe6, 0xff, 0x12, 0x24, 0x0a, 0x12, 0x31, 0xa9, 0x02, 0x10, |
809 | 0x11, 0x12, 0x30, 0xec, 0x80, 0x0a, 0x78, 0x87, 0xe6, 0xff, 0x12, 0x2e, 0x7d, 0x12, 0x30, 0xec, | 820 | 0xce, 0x12, 0x10, 0x4b, 0x78, 0x87, 0x12, 0x23, 0x31, 0x20, 0xe2, 0x07, 0x7f, 0x11, 0x12, 0x31, |
810 | 0x02, 0x10, 0x86, 0x8f, 0x61, 0x12, 0x2e, 0x7d, 0xaf, 0x61, 0x12, 0x2a, 0x06, 0x12, 0x22, 0x12, | 821 | 0xa9, 0x80, 0x0a, 0x78, 0x87, 0xe6, 0xff, 0x12, 0x2f, 0x4e, 0x12, 0x31, 0xa9, 0x02, 0x10, 0xce, |
811 | 0x12, 0x31, 0xc7, 0x74, 0x6e, 0x25, 0x61, 0xf8, 0x74, 0xfd, 0x56, 0xf6, 0xaf, 0x61, 0x12, 0x13, | 822 | 0x8f, 0x61, 0x12, 0x2f, 0x4e, 0xaf, 0x61, 0x12, 0x2a, 0xc7, 0x12, 0x22, 0xc0, 0x12, 0x32, 0x84, |
812 | 0x3f, 0x22, 0x12, 0x10, 0x03, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, | 823 | 0x74, 0x6e, 0x25, 0x61, 0xf8, 0x74, 0xfd, 0x56, 0xf6, 0xaf, 0x61, 0x12, 0x13, 0x87, 0x22, 0x12, |
813 | 0x05, 0x12, 0x2c, 0x07, 0x80, 0x06, 0x12, 0x1d, 0x64, 0x12, 0x1d, 0x6c, 0x02, 0x10, 0x86, 0x12, | 824 | 0x10, 0x4b, 0xe5, 0x3a, 0x64, 0x09, 0x70, 0x04, 0xe5, 0x39, 0x64, 0x01, 0x60, 0x05, 0x12, 0x2c, |
814 | 0x29, 0x93, 0x12, 0x12, 0xbb, 0x90, 0xf8, 0x04, 0xe0, 0xff, 0x60, 0x05, 0x7d, 0x01, 0x12, 0x12, | 825 | 0xd8, 0x80, 0x06, 0x12, 0x1e, 0x14, 0x12, 0x1e, 0x1c, 0x02, 0x10, 0xce, 0x12, 0x2a, 0x54, 0x12, |
815 | 0x58, 0x12, 0x29, 0x1d, 0x12, 0x12, 0xf7, 0x12, 0x11, 0x74, 0x80, 0xe3, 0x12, 0x1c, 0xde, 0xef, | 826 | 0x13, 0x03, 0x90, 0xf8, 0x04, 0xe0, 0xff, 0x60, 0x05, 0x7d, 0x01, 0x12, 0x12, 0xa0, 0x12, 0x29, |
816 | 0x12, 0x1a, 0x4a, 0xe4, 0xf5, 0x33, 0xf5, 0x34, 0xef, 0x60, 0x03, 0x02, 0x31, 0xbd, 0xe4, 0xff, | 827 | 0xde, 0x12, 0x13, 0x3f, 0x12, 0x11, 0xbc, 0x80, 0xe3, 0x12, 0x1d, 0x8e, 0xef, 0x12, 0x1a, 0xfa, |
817 | 0x12, 0x31, 0xb1, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0xa0, 0x60, 0xf7, 0xef, 0x30, 0xe5, | 828 | 0xe4, 0xf5, 0x33, 0xf5, 0x34, 0xef, 0x60, 0x03, 0x02, 0x32, 0x7a, 0xe4, 0xff, 0x12, 0x32, 0x6e, |
818 | 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, | 829 | 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0xa0, 0x60, 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, |
819 | 0x54, 0x28, 0x60, 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, | 830 | 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0x90, 0xff, 0xf0, 0xe0, 0xff, 0x54, 0x28, 0x60, |
820 | 0xd3, 0x22, 0xef, 0x30, 0xe7, 0x08, 0x12, 0x1c, 0x95, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0xef, 0x12, | 831 | 0xf7, 0xef, 0x30, 0xe5, 0x08, 0x90, 0xff, 0xf0, 0x44, 0x20, 0xf0, 0xc3, 0x22, 0xd3, 0x22, 0xef, |
821 | 0x1c, 0xe8, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03, 0x87, 0x40, 0x00, | 832 | 0x30, 0xe7, 0x08, 0x12, 0x1d, 0x45, 0xe0, 0x54, 0xdf, 0xf0, 0x22, 0xef, 0x12, 0x1d, 0x98, 0xe0, |
822 | 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, 0x78, 0x7e, 0x12, 0x22, | 833 | 0x54, 0xdf, 0xf0, 0x22, 0x81, 0x01, 0x82, 0x02, 0x83, 0x03, 0x87, 0x40, 0x00, 0x40, 0x00, 0x40, |
823 | 0x09, 0xa3, 0xa3, 0xe0, 0xff, 0x30, 0xe7, 0x06, 0x54, 0x7f, 0xf0, 0x44, 0x80, 0xf0, 0x22, 0x85, | 834 | 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x08, 0x00, 0x78, 0x7e, 0x12, 0x22, 0xb7, 0xa3, 0xa3, |
824 | 0x3b, 0x39, 0x85, 0x3c, 0x3a, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, 0xf0, 0xa3, 0xe0, 0x54, 0x7f, | 835 | 0xe0, 0xff, 0x30, 0xe7, 0x06, 0x54, 0x7f, 0xf0, 0x44, 0x80, 0xf0, 0x22, 0x85, 0x3b, 0x39, 0x85, |
825 | 0xf0, 0x22, 0xe4, 0xfe, 0xee, 0x90, 0x31, 0x47, 0x93, 0xb5, 0x07, 0x02, 0xd3, 0x22, 0x0e, 0xbe, | 836 | 0x3c, 0x3a, 0x90, 0xff, 0x82, 0xe0, 0x54, 0xf7, 0xf0, 0xa3, 0xe0, 0x54, 0x7f, 0xf0, 0x22, 0xe4, |
826 | 0x07, 0xf2, 0xc3, 0x22, 0x00, 0x08, 0x18, 0x28, 0x38, 0x01, 0x81, 0x10, 0x0a, 0x02, 0x00, 0x00, | 837 | 0xfe, 0xee, 0x90, 0x32, 0x04, 0x93, 0xb5, 0x07, 0x02, 0xd3, 0x22, 0x0e, 0xbe, 0x07, 0xf2, 0xc3, |
827 | 0x00, 0x00, 0x00, 0x12, 0x10, 0x03, 0x7f, 0x02, 0x12, 0x10, 0x92, 0x12, 0x1d, 0x46, 0x02, 0x10, | 838 | 0x22, 0x00, 0x08, 0x18, 0x28, 0x38, 0x01, 0x81, 0x90, 0x0a, 0x02, 0x00, 0x00, 0x11, 0x13, 0x00, |
828 | 0x86, 0x75, 0x39, 0x00, 0x8f, 0x3a, 0x12, 0x1c, 0x30, 0x12, 0x2c, 0x07, 0x22, 0x12, 0x1d, 0x6c, | 839 | 0x12, 0x10, 0x4b, 0x7f, 0x02, 0x12, 0x10, 0xda, 0x12, 0x1d, 0xf6, 0x02, 0x10, 0xce, 0x75, 0x39, |
829 | 0x12, 0x1d, 0x2f, 0x12, 0x1d, 0x64, 0x22, 0xc2, 0x08, 0x22, | 840 | 0x00, 0x8f, 0x3a, 0x12, 0x1c, 0xe0, 0x12, 0x2c, 0xd8, 0x22, 0x12, 0x1e, 0x1c, 0x12, 0x1d, 0xdf, |
841 | 0x12, 0x1e, 0x14, 0x22, 0xc2, 0x08, 0x22, | ||
830 | }; | 842 | }; |
831 | 843 | ||
832 | #undef IMAGE_VERSION_NAME | 844 | #undef IMAGE_VERSION_NAME |
833 | 845 | ||
834 | #undef IMAGE_ARRAY_NAME | 846 | #undef IMAGE_ARRAY_NAME |
835 | 847 | ||
836 | 848 |
drivers/usb/serial/io_ti.c
1 | /* | 1 | /* |
2 | * Edgeport USB Serial Converter driver | 2 | * Edgeport USB Serial Converter driver |
3 | * | 3 | * |
4 | * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved. | 4 | * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved. |
5 | * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com> | 5 | * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com> |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
8 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
9 | * the Free Software Foundation; either version 2 of the License, or | 9 | * the Free Software Foundation; either version 2 of the License, or |
10 | * (at your option) any later version. | 10 | * (at your option) any later version. |
11 | * | 11 | * |
12 | * Supports the following devices: | 12 | * Supports the following devices: |
13 | * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT | 13 | * EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT |
14 | * | 14 | * |
15 | * For questions or problems with this driver, contact Inside Out | 15 | * For questions or problems with this driver, contact Inside Out |
16 | * Networks technical support, or Peter Berger <pberger@brimson.com>, | 16 | * Networks technical support, or Peter Berger <pberger@brimson.com>, |
17 | * or Al Borchers <alborchers@steinerpoint.com>. | 17 | * or Al Borchers <alborchers@steinerpoint.com>. |
18 | * | 18 | * |
19 | * Version history: | 19 | * Version history: |
20 | * | 20 | * |
21 | * July 11, 2002 Removed 4 port device structure since all TI UMP | 21 | * July 11, 2002 Removed 4 port device structure since all TI UMP |
22 | * chips have only 2 ports | 22 | * chips have only 2 ports |
23 | * David Iacovelli (davidi@ionetworks.com) | 23 | * David Iacovelli (davidi@ionetworks.com) |
24 | * | 24 | * |
25 | */ | 25 | */ |
26 | 26 | ||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/jiffies.h> | 28 | #include <linux/jiffies.h> |
29 | #include <linux/errno.h> | 29 | #include <linux/errno.h> |
30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/tty.h> | 32 | #include <linux/tty.h> |
33 | #include <linux/tty_driver.h> | 33 | #include <linux/tty_driver.h> |
34 | #include <linux/tty_flip.h> | 34 | #include <linux/tty_flip.h> |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/spinlock.h> | 36 | #include <linux/spinlock.h> |
37 | #include <linux/serial.h> | 37 | #include <linux/serial.h> |
38 | #include <linux/ioctl.h> | 38 | #include <linux/ioctl.h> |
39 | #include <asm/uaccess.h> | 39 | #include <asm/uaccess.h> |
40 | #include <asm/semaphore.h> | 40 | #include <asm/semaphore.h> |
41 | #include <linux/usb.h> | 41 | #include <linux/usb.h> |
42 | #include <linux/usb/serial.h> | 42 | #include <linux/usb/serial.h> |
43 | 43 | ||
44 | #include "io_16654.h" | 44 | #include "io_16654.h" |
45 | #include "io_usbvend.h" | 45 | #include "io_usbvend.h" |
46 | #include "io_ti.h" | 46 | #include "io_ti.h" |
47 | 47 | ||
48 | /* | 48 | /* |
49 | * Version Information | 49 | * Version Information |
50 | */ | 50 | */ |
51 | #define DRIVER_VERSION "v0.7" | 51 | #define DRIVER_VERSION "v0.7mode043006" |
52 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" | 52 | #define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli" |
53 | #define DRIVER_DESC "Edgeport USB Serial Driver" | 53 | #define DRIVER_DESC "Edgeport USB Serial Driver" |
54 | 54 | ||
55 | 55 | ||
56 | /* firmware image code */ | 56 | /* firmware image code */ |
57 | #define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion | 57 | #define IMAGE_VERSION_NAME PagableOperationalCodeImageVersion |
58 | #define IMAGE_ARRAY_NAME PagableOperationalCodeImage | 58 | #define IMAGE_ARRAY_NAME PagableOperationalCodeImage |
59 | #define IMAGE_SIZE PagableOperationalCodeSize | 59 | #define IMAGE_SIZE PagableOperationalCodeSize |
60 | #include "io_fw_down3.h" /* Define array OperationalCodeImage[] */ | 60 | #include "io_fw_down3.h" /* Define array OperationalCodeImage[] */ |
61 | 61 | ||
62 | #define EPROM_PAGE_SIZE 64 | 62 | #define EPROM_PAGE_SIZE 64 |
63 | 63 | ||
64 | 64 | ||
65 | struct edgeport_uart_buf_desc { | 65 | struct edgeport_uart_buf_desc { |
66 | __u32 count; // Number of bytes currently in buffer | 66 | __u32 count; // Number of bytes currently in buffer |
67 | }; | 67 | }; |
68 | 68 | ||
69 | /* different hardware types */ | 69 | /* different hardware types */ |
70 | #define HARDWARE_TYPE_930 0 | 70 | #define HARDWARE_TYPE_930 0 |
71 | #define HARDWARE_TYPE_TIUMP 1 | 71 | #define HARDWARE_TYPE_TIUMP 1 |
72 | 72 | ||
73 | // IOCTL_PRIVATE_TI_GET_MODE Definitions | 73 | // IOCTL_PRIVATE_TI_GET_MODE Definitions |
74 | #define TI_MODE_CONFIGURING 0 // Device has not entered start device | 74 | #define TI_MODE_CONFIGURING 0 // Device has not entered start device |
75 | #define TI_MODE_BOOT 1 // Staying in boot mode | 75 | #define TI_MODE_BOOT 1 // Staying in boot mode |
76 | #define TI_MODE_DOWNLOAD 2 // Made it to download mode | 76 | #define TI_MODE_DOWNLOAD 2 // Made it to download mode |
77 | #define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode | 77 | #define TI_MODE_TRANSITIONING 3 // Currently in boot mode but transitioning to download mode |
78 | 78 | ||
79 | /* read urb state */ | 79 | /* read urb state */ |
80 | #define EDGE_READ_URB_RUNNING 0 | 80 | #define EDGE_READ_URB_RUNNING 0 |
81 | #define EDGE_READ_URB_STOPPING 1 | 81 | #define EDGE_READ_URB_STOPPING 1 |
82 | #define EDGE_READ_URB_STOPPED 2 | 82 | #define EDGE_READ_URB_STOPPED 2 |
83 | 83 | ||
84 | #define EDGE_LOW_LATENCY 1 | 84 | #define EDGE_LOW_LATENCY 1 |
85 | #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */ | 85 | #define EDGE_CLOSING_WAIT 4000 /* in .01 sec */ |
86 | 86 | ||
87 | #define EDGE_OUT_BUF_SIZE 1024 | 87 | #define EDGE_OUT_BUF_SIZE 1024 |
88 | 88 | ||
89 | 89 | ||
90 | /* Product information read from the Edgeport */ | 90 | /* Product information read from the Edgeport */ |
91 | struct product_info | 91 | struct product_info |
92 | { | 92 | { |
93 | int TiMode; // Current TI Mode | 93 | int TiMode; // Current TI Mode |
94 | __u8 hardware_type; // Type of hardware | 94 | __u8 hardware_type; // Type of hardware |
95 | } __attribute__((packed)); | 95 | } __attribute__((packed)); |
96 | 96 | ||
97 | /* circular buffer */ | 97 | /* circular buffer */ |
98 | struct edge_buf { | 98 | struct edge_buf { |
99 | unsigned int buf_size; | 99 | unsigned int buf_size; |
100 | char *buf_buf; | 100 | char *buf_buf; |
101 | char *buf_get; | 101 | char *buf_get; |
102 | char *buf_put; | 102 | char *buf_put; |
103 | }; | 103 | }; |
104 | 104 | ||
105 | struct edgeport_port { | 105 | struct edgeport_port { |
106 | __u16 uart_base; | 106 | __u16 uart_base; |
107 | __u16 dma_address; | 107 | __u16 dma_address; |
108 | __u8 shadow_msr; | 108 | __u8 shadow_msr; |
109 | __u8 shadow_mcr; | 109 | __u8 shadow_mcr; |
110 | __u8 shadow_lsr; | 110 | __u8 shadow_lsr; |
111 | __u8 lsr_mask; | 111 | __u8 lsr_mask; |
112 | __u32 ump_read_timeout; /* Number of miliseconds the UMP will | 112 | __u32 ump_read_timeout; /* Number of miliseconds the UMP will |
113 | wait without data before completing | 113 | wait without data before completing |
114 | a read short */ | 114 | a read short */ |
115 | int baud_rate; | 115 | int baud_rate; |
116 | int close_pending; | 116 | int close_pending; |
117 | int lsr_event; | 117 | int lsr_event; |
118 | struct edgeport_uart_buf_desc tx; | 118 | struct edgeport_uart_buf_desc tx; |
119 | struct async_icount icount; | 119 | struct async_icount icount; |
120 | wait_queue_head_t delta_msr_wait; /* for handling sleeping while | 120 | wait_queue_head_t delta_msr_wait; /* for handling sleeping while |
121 | waiting for msr change to | 121 | waiting for msr change to |
122 | happen */ | 122 | happen */ |
123 | struct edgeport_serial *edge_serial; | 123 | struct edgeport_serial *edge_serial; |
124 | struct usb_serial_port *port; | 124 | struct usb_serial_port *port; |
125 | __u8 bUartMode; /* Port type, 0: RS232, etc. */ | 125 | __u8 bUartMode; /* Port type, 0: RS232, etc. */ |
126 | spinlock_t ep_lock; | 126 | spinlock_t ep_lock; |
127 | int ep_read_urb_state; | 127 | int ep_read_urb_state; |
128 | int ep_write_urb_in_use; | 128 | int ep_write_urb_in_use; |
129 | struct edge_buf *ep_out_buf; | 129 | struct edge_buf *ep_out_buf; |
130 | }; | 130 | }; |
131 | 131 | ||
132 | struct edgeport_serial { | 132 | struct edgeport_serial { |
133 | struct product_info product_info; | 133 | struct product_info product_info; |
134 | u8 TI_I2C_Type; // Type of I2C in UMP | 134 | u8 TI_I2C_Type; // Type of I2C in UMP |
135 | u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode | 135 | u8 TiReadI2C; // Set to TRUE if we have read the I2c in Boot Mode |
136 | struct semaphore es_sem; | 136 | struct semaphore es_sem; |
137 | int num_ports_open; | 137 | int num_ports_open; |
138 | struct usb_serial *serial; | 138 | struct usb_serial *serial; |
139 | }; | 139 | }; |
140 | 140 | ||
141 | 141 | ||
142 | /* Devices that this driver supports */ | 142 | /* Devices that this driver supports */ |
143 | static struct usb_device_id edgeport_1port_id_table [] = { | 143 | static struct usb_device_id edgeport_1port_id_table [] = { |
144 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, | 144 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, |
145 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, | 145 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, |
146 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, | 146 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, |
147 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, | 147 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, |
148 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, | 148 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, |
149 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, | 149 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, |
150 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, | 150 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, |
151 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, | 151 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, |
152 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, | 152 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, |
153 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, | 153 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, |
154 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, | 154 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, |
155 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, | 155 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, |
156 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, | 156 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, |
157 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, | 157 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, |
158 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, | 158 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, |
159 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, | 159 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, |
160 | { } | 160 | { } |
161 | }; | 161 | }; |
162 | 162 | ||
163 | static struct usb_device_id edgeport_2port_id_table [] = { | 163 | static struct usb_device_id edgeport_2port_id_table [] = { |
164 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, | 164 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, |
165 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, | 165 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, |
166 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, | 166 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, |
167 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, | 167 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, |
168 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, | 168 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, |
169 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, | 169 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, |
170 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, | 170 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, |
171 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, | 171 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, |
172 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, | 172 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, |
173 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, | 173 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, |
174 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, | 174 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, |
175 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, | 175 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, |
176 | // The 4-port shows up as two 2-port devices | 176 | /* The 4, 8 and 16 port devices show up as multiple 2 port devices */ |
177 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, | 177 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, |
178 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) }, | ||
179 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) }, | ||
180 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) }, | ||
181 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) }, | ||
178 | { } | 182 | { } |
179 | }; | 183 | }; |
180 | 184 | ||
181 | /* Devices that this driver supports */ | 185 | /* Devices that this driver supports */ |
182 | static struct usb_device_id id_table_combined [] = { | 186 | static struct usb_device_id id_table_combined [] = { |
183 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, | 187 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) }, |
184 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, | 188 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) }, |
185 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, | 189 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) }, |
186 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, | 190 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) }, |
187 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, | 191 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) }, |
188 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, | 192 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) }, |
189 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, | 193 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) }, |
190 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, | 194 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) }, |
191 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, | 195 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) }, |
192 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, | 196 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) }, |
193 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, | 197 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) }, |
194 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, | 198 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) }, |
195 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, | 199 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) }, |
196 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, | 200 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) }, |
197 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, | 201 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) }, |
198 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, | 202 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) }, |
199 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, | 203 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) }, |
200 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, | 204 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) }, |
201 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, | 205 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) }, |
202 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, | 206 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) }, |
203 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, | 207 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) }, |
204 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, | 208 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) }, |
205 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, | 209 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) }, |
206 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, | 210 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) }, |
207 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, | 211 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) }, |
208 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, | 212 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) }, |
209 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, | 213 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) }, |
210 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, | 214 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) }, |
211 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, | 215 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) }, |
216 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) }, | ||
217 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) }, | ||
218 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) }, | ||
219 | { USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) }, | ||
212 | { } | 220 | { } |
213 | }; | 221 | }; |
214 | 222 | ||
215 | MODULE_DEVICE_TABLE (usb, id_table_combined); | 223 | MODULE_DEVICE_TABLE (usb, id_table_combined); |
216 | 224 | ||
217 | static struct usb_driver io_driver = { | 225 | static struct usb_driver io_driver = { |
218 | .name = "io_ti", | 226 | .name = "io_ti", |
219 | .probe = usb_serial_probe, | 227 | .probe = usb_serial_probe, |
220 | .disconnect = usb_serial_disconnect, | 228 | .disconnect = usb_serial_disconnect, |
221 | .id_table = id_table_combined, | 229 | .id_table = id_table_combined, |
222 | .no_dynamic_id = 1, | 230 | .no_dynamic_id = 1, |
223 | }; | 231 | }; |
224 | 232 | ||
225 | 233 | ||
226 | static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion; | 234 | static struct EDGE_FIRMWARE_VERSION_INFO OperationalCodeImageVersion; |
227 | 235 | ||
228 | static int debug; | 236 | static int debug; |
229 | 237 | ||
230 | static int TIStayInBootMode = 0; | 238 | static int TIStayInBootMode = 0; |
231 | static int low_latency = EDGE_LOW_LATENCY; | 239 | static int low_latency = EDGE_LOW_LATENCY; |
232 | static int closing_wait = EDGE_CLOSING_WAIT; | 240 | static int closing_wait = EDGE_CLOSING_WAIT; |
233 | static int ignore_cpu_rev = 0; | 241 | static int ignore_cpu_rev = 0; |
242 | static int default_uart_mode = 0; /* RS232 */ | ||
234 | 243 | ||
235 | 244 | ||
236 | static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length); | 245 | static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length); |
237 | 246 | ||
238 | static void stop_read(struct edgeport_port *edge_port); | 247 | static void stop_read(struct edgeport_port *edge_port); |
239 | static int restart_read(struct edgeport_port *edge_port); | 248 | static int restart_read(struct edgeport_port *edge_port); |
240 | 249 | ||
241 | static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); | 250 | static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios); |
242 | static void edge_send(struct usb_serial_port *port); | 251 | static void edge_send(struct usb_serial_port *port); |
243 | 252 | ||
253 | /* sysfs attributes */ | ||
254 | static int edge_create_sysfs_attrs(struct usb_serial_port *port); | ||
255 | static int edge_remove_sysfs_attrs(struct usb_serial_port *port); | ||
256 | |||
244 | /* circular buffer */ | 257 | /* circular buffer */ |
245 | static struct edge_buf *edge_buf_alloc(unsigned int size); | 258 | static struct edge_buf *edge_buf_alloc(unsigned int size); |
246 | static void edge_buf_free(struct edge_buf *eb); | 259 | static void edge_buf_free(struct edge_buf *eb); |
247 | static void edge_buf_clear(struct edge_buf *eb); | 260 | static void edge_buf_clear(struct edge_buf *eb); |
248 | static unsigned int edge_buf_data_avail(struct edge_buf *eb); | 261 | static unsigned int edge_buf_data_avail(struct edge_buf *eb); |
249 | static unsigned int edge_buf_space_avail(struct edge_buf *eb); | 262 | static unsigned int edge_buf_space_avail(struct edge_buf *eb); |
250 | static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, | 263 | static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, |
251 | unsigned int count); | 264 | unsigned int count); |
252 | static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, | 265 | static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, |
253 | unsigned int count); | 266 | unsigned int count); |
254 | 267 | ||
255 | 268 | ||
256 | static int TIReadVendorRequestSync (struct usb_device *dev, | 269 | static int TIReadVendorRequestSync (struct usb_device *dev, |
257 | __u8 request, | 270 | __u8 request, |
258 | __u16 value, | 271 | __u16 value, |
259 | __u16 index, | 272 | __u16 index, |
260 | u8 *data, | 273 | u8 *data, |
261 | int size) | 274 | int size) |
262 | { | 275 | { |
263 | int status; | 276 | int status; |
264 | 277 | ||
265 | status = usb_control_msg (dev, | 278 | status = usb_control_msg (dev, |
266 | usb_rcvctrlpipe(dev, 0), | 279 | usb_rcvctrlpipe(dev, 0), |
267 | request, | 280 | request, |
268 | (USB_TYPE_VENDOR | | 281 | (USB_TYPE_VENDOR | |
269 | USB_RECIP_DEVICE | | 282 | USB_RECIP_DEVICE | |
270 | USB_DIR_IN), | 283 | USB_DIR_IN), |
271 | value, | 284 | value, |
272 | index, | 285 | index, |
273 | data, | 286 | data, |
274 | size, | 287 | size, |
275 | 1000); | 288 | 1000); |
276 | if (status < 0) | 289 | if (status < 0) |
277 | return status; | 290 | return status; |
278 | if (status != size) { | 291 | if (status != size) { |
279 | dbg ("%s - wanted to write %d, but only wrote %d", | 292 | dbg ("%s - wanted to write %d, but only wrote %d", |
280 | __FUNCTION__, size, status); | 293 | __FUNCTION__, size, status); |
281 | return -ECOMM; | 294 | return -ECOMM; |
282 | } | 295 | } |
283 | return 0; | 296 | return 0; |
284 | } | 297 | } |
285 | 298 | ||
286 | static int TISendVendorRequestSync (struct usb_device *dev, | 299 | static int TISendVendorRequestSync (struct usb_device *dev, |
287 | __u8 request, | 300 | __u8 request, |
288 | __u16 value, | 301 | __u16 value, |
289 | __u16 index, | 302 | __u16 index, |
290 | u8 *data, | 303 | u8 *data, |
291 | int size) | 304 | int size) |
292 | { | 305 | { |
293 | int status; | 306 | int status; |
294 | 307 | ||
295 | status = usb_control_msg (dev, | 308 | status = usb_control_msg (dev, |
296 | usb_sndctrlpipe(dev, 0), | 309 | usb_sndctrlpipe(dev, 0), |
297 | request, | 310 | request, |
298 | (USB_TYPE_VENDOR | | 311 | (USB_TYPE_VENDOR | |
299 | USB_RECIP_DEVICE | | 312 | USB_RECIP_DEVICE | |
300 | USB_DIR_OUT), | 313 | USB_DIR_OUT), |
301 | value, | 314 | value, |
302 | index, | 315 | index, |
303 | data, | 316 | data, |
304 | size, | 317 | size, |
305 | 1000); | 318 | 1000); |
306 | if (status < 0) | 319 | if (status < 0) |
307 | return status; | 320 | return status; |
308 | if (status != size) { | 321 | if (status != size) { |
309 | dbg ("%s - wanted to write %d, but only wrote %d", | 322 | dbg ("%s - wanted to write %d, but only wrote %d", |
310 | __FUNCTION__, size, status); | 323 | __FUNCTION__, size, status); |
311 | return -ECOMM; | 324 | return -ECOMM; |
312 | } | 325 | } |
313 | return 0; | 326 | return 0; |
314 | } | 327 | } |
315 | 328 | ||
316 | static int TIWriteCommandSync (struct usb_device *dev, __u8 command, | 329 | static int TIWriteCommandSync (struct usb_device *dev, __u8 command, |
317 | __u8 moduleid, __u16 value, u8 *data, | 330 | __u8 moduleid, __u16 value, u8 *data, |
318 | int size) | 331 | int size) |
319 | { | 332 | { |
320 | return TISendVendorRequestSync (dev, | 333 | return TISendVendorRequestSync (dev, |
321 | command, // Request | 334 | command, // Request |
322 | value, // wValue | 335 | value, // wValue |
323 | moduleid, // wIndex | 336 | moduleid, // wIndex |
324 | data, // TransferBuffer | 337 | data, // TransferBuffer |
325 | size); // TransferBufferLength | 338 | size); // TransferBufferLength |
326 | 339 | ||
327 | } | 340 | } |
328 | 341 | ||
329 | /* clear tx/rx buffers and fifo in TI UMP */ | 342 | /* clear tx/rx buffers and fifo in TI UMP */ |
330 | static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) | 343 | static int TIPurgeDataSync (struct usb_serial_port *port, __u16 mask) |
331 | { | 344 | { |
332 | int port_number = port->number - port->serial->minor; | 345 | int port_number = port->number - port->serial->minor; |
333 | 346 | ||
334 | dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask); | 347 | dbg ("%s - port %d, mask %x", __FUNCTION__, port_number, mask); |
335 | 348 | ||
336 | return TIWriteCommandSync (port->serial->dev, | 349 | return TIWriteCommandSync (port->serial->dev, |
337 | UMPC_PURGE_PORT, | 350 | UMPC_PURGE_PORT, |
338 | (__u8)(UMPM_UART1_PORT + port_number), | 351 | (__u8)(UMPM_UART1_PORT + port_number), |
339 | mask, | 352 | mask, |
340 | NULL, | 353 | NULL, |
341 | 0); | 354 | 0); |
342 | } | 355 | } |
343 | 356 | ||
344 | /** | 357 | /** |
345 | * TIReadDownloadMemory - Read edgeport memory from TI chip | 358 | * TIReadDownloadMemory - Read edgeport memory from TI chip |
346 | * @dev: usb device pointer | 359 | * @dev: usb device pointer |
347 | * @start_address: Device CPU address at which to read | 360 | * @start_address: Device CPU address at which to read |
348 | * @length: Length of above data | 361 | * @length: Length of above data |
349 | * @address_type: Can read both XDATA and I2C | 362 | * @address_type: Can read both XDATA and I2C |
350 | * @buffer: pointer to input data buffer | 363 | * @buffer: pointer to input data buffer |
351 | */ | 364 | */ |
352 | static int TIReadDownloadMemory(struct usb_device *dev, int start_address, | 365 | static int TIReadDownloadMemory(struct usb_device *dev, int start_address, |
353 | int length, __u8 address_type, __u8 *buffer) | 366 | int length, __u8 address_type, __u8 *buffer) |
354 | { | 367 | { |
355 | int status = 0; | 368 | int status = 0; |
356 | __u8 read_length; | 369 | __u8 read_length; |
357 | __be16 be_start_address; | 370 | __be16 be_start_address; |
358 | 371 | ||
359 | dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length); | 372 | dbg ("%s - @ %x for %d", __FUNCTION__, start_address, length); |
360 | 373 | ||
361 | /* Read in blocks of 64 bytes | 374 | /* Read in blocks of 64 bytes |
362 | * (TI firmware can't handle more than 64 byte reads) | 375 | * (TI firmware can't handle more than 64 byte reads) |
363 | */ | 376 | */ |
364 | while (length) { | 377 | while (length) { |
365 | if (length > 64) | 378 | if (length > 64) |
366 | read_length= 64; | 379 | read_length= 64; |
367 | else | 380 | else |
368 | read_length = (__u8)length; | 381 | read_length = (__u8)length; |
369 | 382 | ||
370 | if (read_length > 1) { | 383 | if (read_length > 1) { |
371 | dbg ("%s - @ %x for %d", __FUNCTION__, | 384 | dbg ("%s - @ %x for %d", __FUNCTION__, |
372 | start_address, read_length); | 385 | start_address, read_length); |
373 | } | 386 | } |
374 | be_start_address = cpu_to_be16 (start_address); | 387 | be_start_address = cpu_to_be16 (start_address); |
375 | status = TIReadVendorRequestSync (dev, | 388 | status = TIReadVendorRequestSync (dev, |
376 | UMPC_MEMORY_READ, // Request | 389 | UMPC_MEMORY_READ, // Request |
377 | (__u16)address_type, // wValue (Address type) | 390 | (__u16)address_type, // wValue (Address type) |
378 | (__force __u16)be_start_address, // wIndex (Address to read) | 391 | (__force __u16)be_start_address, // wIndex (Address to read) |
379 | buffer, // TransferBuffer | 392 | buffer, // TransferBuffer |
380 | read_length); // TransferBufferLength | 393 | read_length); // TransferBufferLength |
381 | 394 | ||
382 | if (status) { | 395 | if (status) { |
383 | dbg ("%s - ERROR %x", __FUNCTION__, status); | 396 | dbg ("%s - ERROR %x", __FUNCTION__, status); |
384 | return status; | 397 | return status; |
385 | } | 398 | } |
386 | 399 | ||
387 | if (read_length > 1) { | 400 | if (read_length > 1) { |
388 | usb_serial_debug_data(debug, &dev->dev, __FUNCTION__, | 401 | usb_serial_debug_data(debug, &dev->dev, __FUNCTION__, |
389 | read_length, buffer); | 402 | read_length, buffer); |
390 | } | 403 | } |
391 | 404 | ||
392 | /* Update pointers/length */ | 405 | /* Update pointers/length */ |
393 | start_address += read_length; | 406 | start_address += read_length; |
394 | buffer += read_length; | 407 | buffer += read_length; |
395 | length -= read_length; | 408 | length -= read_length; |
396 | } | 409 | } |
397 | 410 | ||
398 | return status; | 411 | return status; |
399 | } | 412 | } |
400 | 413 | ||
401 | static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer) | 414 | static int TIReadRam (struct usb_device *dev, int start_address, int length, __u8 *buffer) |
402 | { | 415 | { |
403 | return TIReadDownloadMemory (dev, | 416 | return TIReadDownloadMemory (dev, |
404 | start_address, | 417 | start_address, |
405 | length, | 418 | length, |
406 | DTK_ADDR_SPACE_XDATA, | 419 | DTK_ADDR_SPACE_XDATA, |
407 | buffer); | 420 | buffer); |
408 | } | 421 | } |
409 | 422 | ||
410 | /* Read edgeport memory to a given block */ | 423 | /* Read edgeport memory to a given block */ |
411 | static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer) | 424 | static int TIReadBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 * buffer) |
412 | { | 425 | { |
413 | int status = 0; | 426 | int status = 0; |
414 | int i; | 427 | int i; |
415 | 428 | ||
416 | for (i=0; i< length; i++) { | 429 | for (i=0; i< length; i++) { |
417 | status = TIReadVendorRequestSync (serial->serial->dev, | 430 | status = TIReadVendorRequestSync (serial->serial->dev, |
418 | UMPC_MEMORY_READ, // Request | 431 | UMPC_MEMORY_READ, // Request |
419 | serial->TI_I2C_Type, // wValue (Address type) | 432 | serial->TI_I2C_Type, // wValue (Address type) |
420 | (__u16)(start_address+i), // wIndex | 433 | (__u16)(start_address+i), // wIndex |
421 | &buffer[i], // TransferBuffer | 434 | &buffer[i], // TransferBuffer |
422 | 0x01); // TransferBufferLength | 435 | 0x01); // TransferBufferLength |
423 | if (status) { | 436 | if (status) { |
424 | dbg ("%s - ERROR %x", __FUNCTION__, status); | 437 | dbg ("%s - ERROR %x", __FUNCTION__, status); |
425 | return status; | 438 | return status; |
426 | } | 439 | } |
427 | } | 440 | } |
428 | 441 | ||
429 | dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length); | 442 | dbg ("%s - start_address = %x, length = %d", __FUNCTION__, start_address, length); |
430 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); | 443 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); |
431 | 444 | ||
432 | serial->TiReadI2C = 1; | 445 | serial->TiReadI2C = 1; |
433 | 446 | ||
434 | return status; | 447 | return status; |
435 | } | 448 | } |
436 | 449 | ||
437 | /* Write given block to TI EPROM memory */ | 450 | /* Write given block to TI EPROM memory */ |
438 | static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) | 451 | static int TIWriteBootMemory (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) |
439 | { | 452 | { |
440 | int status = 0; | 453 | int status = 0; |
441 | int i; | 454 | int i; |
442 | __u8 temp; | 455 | __u8 temp; |
443 | 456 | ||
444 | /* Must do a read before write */ | 457 | /* Must do a read before write */ |
445 | if (!serial->TiReadI2C) { | 458 | if (!serial->TiReadI2C) { |
446 | status = TIReadBootMemory(serial, 0, 1, &temp); | 459 | status = TIReadBootMemory(serial, 0, 1, &temp); |
447 | if (status) | 460 | if (status) |
448 | return status; | 461 | return status; |
449 | } | 462 | } |
450 | 463 | ||
451 | for (i=0; i < length; ++i) { | 464 | for (i=0; i < length; ++i) { |
452 | status = TISendVendorRequestSync (serial->serial->dev, | 465 | status = TISendVendorRequestSync (serial->serial->dev, |
453 | UMPC_MEMORY_WRITE, // Request | 466 | UMPC_MEMORY_WRITE, // Request |
454 | buffer[i], // wValue | 467 | buffer[i], // wValue |
455 | (__u16)(i+start_address), // wIndex | 468 | (__u16)(i+start_address), // wIndex |
456 | NULL, // TransferBuffer | 469 | NULL, // TransferBuffer |
457 | 0); // TransferBufferLength | 470 | 0); // TransferBufferLength |
458 | if (status) | 471 | if (status) |
459 | return status; | 472 | return status; |
460 | } | 473 | } |
461 | 474 | ||
462 | dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length); | 475 | dbg ("%s - start_sddr = %x, length = %d", __FUNCTION__, start_address, length); |
463 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); | 476 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, length, buffer); |
464 | 477 | ||
465 | return status; | 478 | return status; |
466 | } | 479 | } |
467 | 480 | ||
468 | 481 | ||
469 | /* Write edgeport I2C memory to TI chip */ | 482 | /* Write edgeport I2C memory to TI chip */ |
470 | static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer) | 483 | static int TIWriteDownloadI2C (struct edgeport_serial *serial, int start_address, int length, __u8 address_type, __u8 *buffer) |
471 | { | 484 | { |
472 | int status = 0; | 485 | int status = 0; |
473 | int write_length; | 486 | int write_length; |
474 | __be16 be_start_address; | 487 | __be16 be_start_address; |
475 | 488 | ||
476 | /* We can only send a maximum of 1 aligned byte page at a time */ | 489 | /* We can only send a maximum of 1 aligned byte page at a time */ |
477 | 490 | ||
478 | /* calulate the number of bytes left in the first page */ | 491 | /* calulate the number of bytes left in the first page */ |
479 | write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1)); | 492 | write_length = EPROM_PAGE_SIZE - (start_address & (EPROM_PAGE_SIZE - 1)); |
480 | 493 | ||
481 | if (write_length > length) | 494 | if (write_length > length) |
482 | write_length = length; | 495 | write_length = length; |
483 | 496 | ||
484 | dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length); | 497 | dbg ("%s - BytesInFirstPage Addr = %x, length = %d", __FUNCTION__, start_address, write_length); |
485 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); | 498 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); |
486 | 499 | ||
487 | /* Write first page */ | 500 | /* Write first page */ |
488 | be_start_address = cpu_to_be16 (start_address); | 501 | be_start_address = cpu_to_be16 (start_address); |
489 | status = TISendVendorRequestSync (serial->serial->dev, | 502 | status = TISendVendorRequestSync (serial->serial->dev, |
490 | UMPC_MEMORY_WRITE, // Request | 503 | UMPC_MEMORY_WRITE, // Request |
491 | (__u16)address_type, // wValue | 504 | (__u16)address_type, // wValue |
492 | (__force __u16)be_start_address, // wIndex | 505 | (__force __u16)be_start_address, // wIndex |
493 | buffer, // TransferBuffer | 506 | buffer, // TransferBuffer |
494 | write_length); | 507 | write_length); |
495 | if (status) { | 508 | if (status) { |
496 | dbg ("%s - ERROR %d", __FUNCTION__, status); | 509 | dbg ("%s - ERROR %d", __FUNCTION__, status); |
497 | return status; | 510 | return status; |
498 | } | 511 | } |
499 | 512 | ||
500 | length -= write_length; | 513 | length -= write_length; |
501 | start_address += write_length; | 514 | start_address += write_length; |
502 | buffer += write_length; | 515 | buffer += write_length; |
503 | 516 | ||
504 | /* We should be aligned now -- can write max page size bytes at a time */ | 517 | /* We should be aligned now -- can write max page size bytes at a time */ |
505 | while (length) { | 518 | while (length) { |
506 | if (length > EPROM_PAGE_SIZE) | 519 | if (length > EPROM_PAGE_SIZE) |
507 | write_length = EPROM_PAGE_SIZE; | 520 | write_length = EPROM_PAGE_SIZE; |
508 | else | 521 | else |
509 | write_length = length; | 522 | write_length = length; |
510 | 523 | ||
511 | dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length); | 524 | dbg ("%s - Page Write Addr = %x, length = %d", __FUNCTION__, start_address, write_length); |
512 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); | 525 | usb_serial_debug_data(debug, &serial->serial->dev->dev, __FUNCTION__, write_length, buffer); |
513 | 526 | ||
514 | /* Write next page */ | 527 | /* Write next page */ |
515 | be_start_address = cpu_to_be16 (start_address); | 528 | be_start_address = cpu_to_be16 (start_address); |
516 | status = TISendVendorRequestSync (serial->serial->dev, | 529 | status = TISendVendorRequestSync (serial->serial->dev, |
517 | UMPC_MEMORY_WRITE, // Request | 530 | UMPC_MEMORY_WRITE, // Request |
518 | (__u16)address_type, // wValue | 531 | (__u16)address_type, // wValue |
519 | (__force __u16)be_start_address, // wIndex | 532 | (__force __u16)be_start_address, // wIndex |
520 | buffer, // TransferBuffer | 533 | buffer, // TransferBuffer |
521 | write_length); // TransferBufferLength | 534 | write_length); // TransferBufferLength |
522 | if (status) { | 535 | if (status) { |
523 | dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __FUNCTION__, status); | 536 | dev_err (&serial->serial->dev->dev, "%s - ERROR %d\n", __FUNCTION__, status); |
524 | return status; | 537 | return status; |
525 | } | 538 | } |
526 | 539 | ||
527 | length -= write_length; | 540 | length -= write_length; |
528 | start_address += write_length; | 541 | start_address += write_length; |
529 | buffer += write_length; | 542 | buffer += write_length; |
530 | } | 543 | } |
531 | return status; | 544 | return status; |
532 | } | 545 | } |
533 | 546 | ||
534 | /* Examine the UMP DMA registers and LSR | 547 | /* Examine the UMP DMA registers and LSR |
535 | * | 548 | * |
536 | * Check the MSBit of the X and Y DMA byte count registers. | 549 | * Check the MSBit of the X and Y DMA byte count registers. |
537 | * A zero in this bit indicates that the TX DMA buffers are empty | 550 | * A zero in this bit indicates that the TX DMA buffers are empty |
538 | * then check the TX Empty bit in the UART. | 551 | * then check the TX Empty bit in the UART. |
539 | */ | 552 | */ |
540 | static int TIIsTxActive (struct edgeport_port *port) | 553 | static int TIIsTxActive (struct edgeport_port *port) |
541 | { | 554 | { |
542 | int status; | 555 | int status; |
543 | struct out_endpoint_desc_block *oedb; | 556 | struct out_endpoint_desc_block *oedb; |
544 | __u8 *lsr; | 557 | __u8 *lsr; |
545 | int bytes_left = 0; | 558 | int bytes_left = 0; |
546 | 559 | ||
547 | oedb = kmalloc (sizeof (* oedb), GFP_KERNEL); | 560 | oedb = kmalloc (sizeof (* oedb), GFP_KERNEL); |
548 | if (!oedb) { | 561 | if (!oedb) { |
549 | dev_err (&port->port->dev, "%s - out of memory\n", __FUNCTION__); | 562 | dev_err (&port->port->dev, "%s - out of memory\n", __FUNCTION__); |
550 | return -ENOMEM; | 563 | return -ENOMEM; |
551 | } | 564 | } |
552 | 565 | ||
553 | lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte, | 566 | lsr = kmalloc (1, GFP_KERNEL); /* Sigh, that's right, just one byte, |
554 | as not all platforms can do DMA | 567 | as not all platforms can do DMA |
555 | from stack */ | 568 | from stack */ |
556 | if (!lsr) { | 569 | if (!lsr) { |
557 | kfree(oedb); | 570 | kfree(oedb); |
558 | return -ENOMEM; | 571 | return -ENOMEM; |
559 | } | 572 | } |
560 | /* Read the DMA Count Registers */ | 573 | /* Read the DMA Count Registers */ |
561 | status = TIReadRam (port->port->serial->dev, | 574 | status = TIReadRam (port->port->serial->dev, |
562 | port->dma_address, | 575 | port->dma_address, |
563 | sizeof( *oedb), | 576 | sizeof( *oedb), |
564 | (void *)oedb); | 577 | (void *)oedb); |
565 | 578 | ||
566 | if (status) | 579 | if (status) |
567 | goto exit_is_tx_active; | 580 | goto exit_is_tx_active; |
568 | 581 | ||
569 | dbg ("%s - XByteCount 0x%X", __FUNCTION__, oedb->XByteCount); | 582 | dbg ("%s - XByteCount 0x%X", __FUNCTION__, oedb->XByteCount); |
570 | 583 | ||
571 | /* and the LSR */ | 584 | /* and the LSR */ |
572 | status = TIReadRam (port->port->serial->dev, | 585 | status = TIReadRam (port->port->serial->dev, |
573 | port->uart_base + UMPMEM_OFFS_UART_LSR, | 586 | port->uart_base + UMPMEM_OFFS_UART_LSR, |
574 | 1, | 587 | 1, |
575 | lsr); | 588 | lsr); |
576 | 589 | ||
577 | if (status) | 590 | if (status) |
578 | goto exit_is_tx_active; | 591 | goto exit_is_tx_active; |
579 | dbg ("%s - LSR = 0x%X", __FUNCTION__, *lsr); | 592 | dbg ("%s - LSR = 0x%X", __FUNCTION__, *lsr); |
580 | 593 | ||
581 | /* If either buffer has data or we are transmitting then return TRUE */ | 594 | /* If either buffer has data or we are transmitting then return TRUE */ |
582 | if ((oedb->XByteCount & 0x80 ) != 0 ) | 595 | if ((oedb->XByteCount & 0x80 ) != 0 ) |
583 | bytes_left += 64; | 596 | bytes_left += 64; |
584 | 597 | ||
585 | if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 ) | 598 | if ((*lsr & UMP_UART_LSR_TX_MASK ) == 0 ) |
586 | bytes_left += 1; | 599 | bytes_left += 1; |
587 | 600 | ||
588 | /* We return Not Active if we get any kind of error */ | 601 | /* We return Not Active if we get any kind of error */ |
589 | exit_is_tx_active: | 602 | exit_is_tx_active: |
590 | dbg ("%s - return %d", __FUNCTION__, bytes_left ); | 603 | dbg ("%s - return %d", __FUNCTION__, bytes_left ); |
591 | 604 | ||
592 | kfree(lsr); | 605 | kfree(lsr); |
593 | kfree(oedb); | 606 | kfree(oedb); |
594 | return bytes_left; | 607 | return bytes_left; |
595 | } | 608 | } |
596 | 609 | ||
597 | static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush) | 610 | static void TIChasePort(struct edgeport_port *port, unsigned long timeout, int flush) |
598 | { | 611 | { |
599 | int baud_rate; | 612 | int baud_rate; |
600 | struct tty_struct *tty = port->port->tty; | 613 | struct tty_struct *tty = port->port->tty; |
601 | wait_queue_t wait; | 614 | wait_queue_t wait; |
602 | unsigned long flags; | 615 | unsigned long flags; |
603 | 616 | ||
604 | if (!timeout) | 617 | if (!timeout) |
605 | timeout = (HZ*EDGE_CLOSING_WAIT)/100; | 618 | timeout = (HZ*EDGE_CLOSING_WAIT)/100; |
606 | 619 | ||
607 | /* wait for data to drain from the buffer */ | 620 | /* wait for data to drain from the buffer */ |
608 | spin_lock_irqsave(&port->ep_lock, flags); | 621 | spin_lock_irqsave(&port->ep_lock, flags); |
609 | init_waitqueue_entry(&wait, current); | 622 | init_waitqueue_entry(&wait, current); |
610 | add_wait_queue(&tty->write_wait, &wait); | 623 | add_wait_queue(&tty->write_wait, &wait); |
611 | for (;;) { | 624 | for (;;) { |
612 | set_current_state(TASK_INTERRUPTIBLE); | 625 | set_current_state(TASK_INTERRUPTIBLE); |
613 | if (edge_buf_data_avail(port->ep_out_buf) == 0 | 626 | if (edge_buf_data_avail(port->ep_out_buf) == 0 |
614 | || timeout == 0 || signal_pending(current) | 627 | || timeout == 0 || signal_pending(current) |
615 | || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */ | 628 | || !usb_get_intfdata(port->port->serial->interface)) /* disconnect */ |
616 | break; | 629 | break; |
617 | spin_unlock_irqrestore(&port->ep_lock, flags); | 630 | spin_unlock_irqrestore(&port->ep_lock, flags); |
618 | timeout = schedule_timeout(timeout); | 631 | timeout = schedule_timeout(timeout); |
619 | spin_lock_irqsave(&port->ep_lock, flags); | 632 | spin_lock_irqsave(&port->ep_lock, flags); |
620 | } | 633 | } |
621 | set_current_state(TASK_RUNNING); | 634 | set_current_state(TASK_RUNNING); |
622 | remove_wait_queue(&tty->write_wait, &wait); | 635 | remove_wait_queue(&tty->write_wait, &wait); |
623 | if (flush) | 636 | if (flush) |
624 | edge_buf_clear(port->ep_out_buf); | 637 | edge_buf_clear(port->ep_out_buf); |
625 | spin_unlock_irqrestore(&port->ep_lock, flags); | 638 | spin_unlock_irqrestore(&port->ep_lock, flags); |
626 | 639 | ||
627 | /* wait for data to drain from the device */ | 640 | /* wait for data to drain from the device */ |
628 | timeout += jiffies; | 641 | timeout += jiffies; |
629 | while ((long)(jiffies - timeout) < 0 && !signal_pending(current) | 642 | while ((long)(jiffies - timeout) < 0 && !signal_pending(current) |
630 | && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */ | 643 | && usb_get_intfdata(port->port->serial->interface)) { /* not disconnected */ |
631 | if (!TIIsTxActive(port)) | 644 | if (!TIIsTxActive(port)) |
632 | break; | 645 | break; |
633 | msleep(10); | 646 | msleep(10); |
634 | } | 647 | } |
635 | 648 | ||
636 | /* disconnected */ | 649 | /* disconnected */ |
637 | if (!usb_get_intfdata(port->port->serial->interface)) | 650 | if (!usb_get_intfdata(port->port->serial->interface)) |
638 | return; | 651 | return; |
639 | 652 | ||
640 | /* wait one more character time, based on baud rate */ | 653 | /* wait one more character time, based on baud rate */ |
641 | /* (TIIsTxActive doesn't seem to wait for the last byte) */ | 654 | /* (TIIsTxActive doesn't seem to wait for the last byte) */ |
642 | if ((baud_rate=port->baud_rate) == 0) | 655 | if ((baud_rate=port->baud_rate) == 0) |
643 | baud_rate = 50; | 656 | baud_rate = 50; |
644 | msleep(max(1,(10000+baud_rate-1)/baud_rate)); | 657 | msleep(max(1,(10000+baud_rate-1)/baud_rate)); |
645 | } | 658 | } |
646 | 659 | ||
647 | static int TIChooseConfiguration (struct usb_device *dev) | 660 | static int TIChooseConfiguration (struct usb_device *dev) |
648 | { | 661 | { |
649 | // There may be multiple configurations on this device, in which case | 662 | // There may be multiple configurations on this device, in which case |
650 | // we would need to read and parse all of them to find out which one | 663 | // we would need to read and parse all of them to find out which one |
651 | // we want. However, we just support one config at this point, | 664 | // we want. However, we just support one config at this point, |
652 | // configuration # 1, which is Config Descriptor 0. | 665 | // configuration # 1, which is Config Descriptor 0. |
653 | 666 | ||
654 | dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->desc.bNumInterfaces); | 667 | dbg ("%s - Number of Interfaces = %d", __FUNCTION__, dev->config->desc.bNumInterfaces); |
655 | dbg ("%s - MAX Power = %d", __FUNCTION__, dev->config->desc.bMaxPower*2); | 668 | dbg ("%s - MAX Power = %d", __FUNCTION__, dev->config->desc.bMaxPower*2); |
656 | 669 | ||
657 | if (dev->config->desc.bNumInterfaces != 1) { | 670 | if (dev->config->desc.bNumInterfaces != 1) { |
658 | dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __FUNCTION__); | 671 | dev_err (&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __FUNCTION__); |
659 | return -ENODEV; | 672 | return -ENODEV; |
660 | } | 673 | } |
661 | 674 | ||
662 | return 0; | 675 | return 0; |
663 | } | 676 | } |
664 | 677 | ||
665 | static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) | 678 | static int TIReadRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) |
666 | { | 679 | { |
667 | int status; | 680 | int status; |
668 | 681 | ||
669 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { | 682 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { |
670 | status = TIReadDownloadMemory (serial->serial->dev, | 683 | status = TIReadDownloadMemory (serial->serial->dev, |
671 | start_address, | 684 | start_address, |
672 | length, | 685 | length, |
673 | serial->TI_I2C_Type, | 686 | serial->TI_I2C_Type, |
674 | buffer); | 687 | buffer); |
675 | } else { | 688 | } else { |
676 | status = TIReadBootMemory (serial, | 689 | status = TIReadBootMemory (serial, |
677 | start_address, | 690 | start_address, |
678 | length, | 691 | length, |
679 | buffer); | 692 | buffer); |
680 | } | 693 | } |
681 | 694 | ||
682 | return status; | 695 | return status; |
683 | } | 696 | } |
684 | 697 | ||
685 | static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) | 698 | static int TIWriteRom (struct edgeport_serial *serial, int start_address, int length, __u8 *buffer) |
686 | { | 699 | { |
687 | if (serial->product_info.TiMode == TI_MODE_BOOT) | 700 | if (serial->product_info.TiMode == TI_MODE_BOOT) |
688 | return TIWriteBootMemory (serial, | 701 | return TIWriteBootMemory (serial, |
689 | start_address, | 702 | start_address, |
690 | length, | 703 | length, |
691 | buffer); | 704 | buffer); |
692 | 705 | ||
693 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) | 706 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) |
694 | return TIWriteDownloadI2C (serial, | 707 | return TIWriteDownloadI2C (serial, |
695 | start_address, | 708 | start_address, |
696 | length, | 709 | length, |
697 | serial->TI_I2C_Type, | 710 | serial->TI_I2C_Type, |
698 | buffer); | 711 | buffer); |
699 | 712 | ||
700 | return -EINVAL; | 713 | return -EINVAL; |
701 | } | 714 | } |
702 | 715 | ||
703 | 716 | ||
704 | 717 | ||
705 | /* Read a descriptor header from I2C based on type */ | 718 | /* Read a descriptor header from I2C based on type */ |
706 | static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc) | 719 | static int TIGetDescriptorAddress (struct edgeport_serial *serial, int desc_type, struct ti_i2c_desc *rom_desc) |
707 | { | 720 | { |
708 | int start_address; | 721 | int start_address; |
709 | int status; | 722 | int status; |
710 | 723 | ||
711 | /* Search for requested descriptor in I2C */ | 724 | /* Search for requested descriptor in I2C */ |
712 | start_address = 2; | 725 | start_address = 2; |
713 | do { | 726 | do { |
714 | status = TIReadRom (serial, | 727 | status = TIReadRom (serial, |
715 | start_address, | 728 | start_address, |
716 | sizeof(struct ti_i2c_desc), | 729 | sizeof(struct ti_i2c_desc), |
717 | (__u8 *)rom_desc ); | 730 | (__u8 *)rom_desc ); |
718 | if (status) | 731 | if (status) |
719 | return 0; | 732 | return 0; |
720 | 733 | ||
721 | if (rom_desc->Type == desc_type) | 734 | if (rom_desc->Type == desc_type) |
722 | return start_address; | 735 | return start_address; |
723 | 736 | ||
724 | start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; | 737 | start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; |
725 | 738 | ||
726 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); | 739 | } while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type); |
727 | 740 | ||
728 | return 0; | 741 | return 0; |
729 | } | 742 | } |
730 | 743 | ||
731 | /* Validate descriptor checksum */ | 744 | /* Validate descriptor checksum */ |
732 | static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer) | 745 | static int ValidChecksum(struct ti_i2c_desc *rom_desc, __u8 *buffer) |
733 | { | 746 | { |
734 | __u16 i; | 747 | __u16 i; |
735 | __u8 cs = 0; | 748 | __u8 cs = 0; |
736 | 749 | ||
737 | for (i=0; i < rom_desc->Size; i++) { | 750 | for (i=0; i < rom_desc->Size; i++) { |
738 | cs = (__u8)(cs + buffer[i]); | 751 | cs = (__u8)(cs + buffer[i]); |
739 | } | 752 | } |
740 | if (cs != rom_desc->CheckSum) { | 753 | if (cs != rom_desc->CheckSum) { |
741 | dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs); | 754 | dbg ("%s - Mismatch %x - %x", __FUNCTION__, rom_desc->CheckSum, cs); |
742 | return -EINVAL; | 755 | return -EINVAL; |
743 | } | 756 | } |
744 | return 0; | 757 | return 0; |
745 | } | 758 | } |
746 | 759 | ||
747 | /* Make sure that the I2C image is good */ | 760 | /* Make sure that the I2C image is good */ |
748 | static int TiValidateI2cImage (struct edgeport_serial *serial) | 761 | static int TiValidateI2cImage (struct edgeport_serial *serial) |
749 | { | 762 | { |
750 | struct device *dev = &serial->serial->dev->dev; | 763 | struct device *dev = &serial->serial->dev->dev; |
751 | int status = 0; | 764 | int status = 0; |
752 | struct ti_i2c_desc *rom_desc; | 765 | struct ti_i2c_desc *rom_desc; |
753 | int start_address = 2; | 766 | int start_address = 2; |
754 | __u8 *buffer; | 767 | __u8 *buffer; |
755 | __u16 ttype; | 768 | __u16 ttype; |
756 | 769 | ||
757 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); | 770 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); |
758 | if (!rom_desc) { | 771 | if (!rom_desc) { |
759 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); | 772 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); |
760 | return -ENOMEM; | 773 | return -ENOMEM; |
761 | } | 774 | } |
762 | buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL); | 775 | buffer = kmalloc (TI_MAX_I2C_SIZE, GFP_KERNEL); |
763 | if (!buffer) { | 776 | if (!buffer) { |
764 | dev_err (dev, "%s - out of memory when allocating buffer\n", __FUNCTION__); | 777 | dev_err (dev, "%s - out of memory when allocating buffer\n", __FUNCTION__); |
765 | kfree (rom_desc); | 778 | kfree (rom_desc); |
766 | return -ENOMEM; | 779 | return -ENOMEM; |
767 | } | 780 | } |
768 | 781 | ||
769 | // Read the first byte (Signature0) must be 0x52 or 0x10 | 782 | // Read the first byte (Signature0) must be 0x52 or 0x10 |
770 | status = TIReadRom (serial, 0, 1, buffer); | 783 | status = TIReadRom (serial, 0, 1, buffer); |
771 | if (status) | 784 | if (status) |
772 | goto ExitTiValidateI2cImage; | 785 | goto ExitTiValidateI2cImage; |
773 | 786 | ||
774 | if (*buffer != UMP5152 && *buffer != UMP3410) { | 787 | if (*buffer != UMP5152 && *buffer != UMP3410) { |
775 | dev_err (dev, "%s - invalid buffer signature\n", __FUNCTION__); | 788 | dev_err (dev, "%s - invalid buffer signature\n", __FUNCTION__); |
776 | status = -ENODEV; | 789 | status = -ENODEV; |
777 | goto ExitTiValidateI2cImage; | 790 | goto ExitTiValidateI2cImage; |
778 | } | 791 | } |
779 | 792 | ||
780 | do { | 793 | do { |
781 | // Validate the I2C | 794 | // Validate the I2C |
782 | status = TIReadRom (serial, | 795 | status = TIReadRom (serial, |
783 | start_address, | 796 | start_address, |
784 | sizeof(struct ti_i2c_desc), | 797 | sizeof(struct ti_i2c_desc), |
785 | (__u8 *)rom_desc); | 798 | (__u8 *)rom_desc); |
786 | if (status) | 799 | if (status) |
787 | break; | 800 | break; |
788 | 801 | ||
789 | if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) { | 802 | if ((start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size) > TI_MAX_I2C_SIZE) { |
790 | status = -ENODEV; | 803 | status = -ENODEV; |
791 | dbg ("%s - structure too big, erroring out.", __FUNCTION__); | 804 | dbg ("%s - structure too big, erroring out.", __FUNCTION__); |
792 | break; | 805 | break; |
793 | } | 806 | } |
794 | 807 | ||
795 | dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type); | 808 | dbg ("%s Type = 0x%x", __FUNCTION__, rom_desc->Type); |
796 | 809 | ||
797 | // Skip type 2 record | 810 | // Skip type 2 record |
798 | ttype = rom_desc->Type & 0x0f; | 811 | ttype = rom_desc->Type & 0x0f; |
799 | if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC | 812 | if ( ttype != I2C_DESC_TYPE_FIRMWARE_BASIC |
800 | && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) { | 813 | && ttype != I2C_DESC_TYPE_FIRMWARE_AUTO ) { |
801 | // Read the descriptor data | 814 | // Read the descriptor data |
802 | status = TIReadRom(serial, | 815 | status = TIReadRom(serial, |
803 | start_address+sizeof(struct ti_i2c_desc), | 816 | start_address+sizeof(struct ti_i2c_desc), |
804 | rom_desc->Size, | 817 | rom_desc->Size, |
805 | buffer); | 818 | buffer); |
806 | if (status) | 819 | if (status) |
807 | break; | 820 | break; |
808 | 821 | ||
809 | status = ValidChecksum(rom_desc, buffer); | 822 | status = ValidChecksum(rom_desc, buffer); |
810 | if (status) | 823 | if (status) |
811 | break; | 824 | break; |
812 | } | 825 | } |
813 | start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; | 826 | start_address = start_address + sizeof(struct ti_i2c_desc) + rom_desc->Size; |
814 | 827 | ||
815 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE)); | 828 | } while ((rom_desc->Type != I2C_DESC_TYPE_ION) && (start_address < TI_MAX_I2C_SIZE)); |
816 | 829 | ||
817 | if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE)) | 830 | if ((rom_desc->Type != I2C_DESC_TYPE_ION) || (start_address > TI_MAX_I2C_SIZE)) |
818 | status = -ENODEV; | 831 | status = -ENODEV; |
819 | 832 | ||
820 | ExitTiValidateI2cImage: | 833 | ExitTiValidateI2cImage: |
821 | kfree (buffer); | 834 | kfree (buffer); |
822 | kfree (rom_desc); | 835 | kfree (rom_desc); |
823 | return status; | 836 | return status; |
824 | } | 837 | } |
825 | 838 | ||
826 | static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer) | 839 | static int TIReadManufDescriptor (struct edgeport_serial *serial, __u8 *buffer) |
827 | { | 840 | { |
828 | int status; | 841 | int status; |
829 | int start_address; | 842 | int start_address; |
830 | struct ti_i2c_desc *rom_desc; | 843 | struct ti_i2c_desc *rom_desc; |
831 | struct edge_ti_manuf_descriptor *desc; | 844 | struct edge_ti_manuf_descriptor *desc; |
832 | 845 | ||
833 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); | 846 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); |
834 | if (!rom_desc) { | 847 | if (!rom_desc) { |
835 | dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __FUNCTION__); | 848 | dev_err (&serial->serial->dev->dev, "%s - out of memory\n", __FUNCTION__); |
836 | return -ENOMEM; | 849 | return -ENOMEM; |
837 | } | 850 | } |
838 | start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc); | 851 | start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_ION, rom_desc); |
839 | 852 | ||
840 | if (!start_address) { | 853 | if (!start_address) { |
841 | dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__); | 854 | dbg ("%s - Edge Descriptor not found in I2C", __FUNCTION__); |
842 | status = -ENODEV; | 855 | status = -ENODEV; |
843 | goto exit; | 856 | goto exit; |
844 | } | 857 | } |
845 | 858 | ||
846 | // Read the descriptor data | 859 | // Read the descriptor data |
847 | status = TIReadRom (serial, | 860 | status = TIReadRom (serial, |
848 | start_address+sizeof(struct ti_i2c_desc), | 861 | start_address+sizeof(struct ti_i2c_desc), |
849 | rom_desc->Size, | 862 | rom_desc->Size, |
850 | buffer); | 863 | buffer); |
851 | if (status) | 864 | if (status) |
852 | goto exit; | 865 | goto exit; |
853 | 866 | ||
854 | status = ValidChecksum(rom_desc, buffer); | 867 | status = ValidChecksum(rom_desc, buffer); |
855 | 868 | ||
856 | desc = (struct edge_ti_manuf_descriptor *)buffer; | 869 | desc = (struct edge_ti_manuf_descriptor *)buffer; |
857 | dbg ( "%s - IonConfig 0x%x", __FUNCTION__, desc->IonConfig ); | 870 | dbg ( "%s - IonConfig 0x%x", __FUNCTION__, desc->IonConfig ); |
858 | dbg ( "%s - Version %d", __FUNCTION__, desc->Version ); | 871 | dbg ( "%s - Version %d", __FUNCTION__, desc->Version ); |
859 | dbg ( "%s - Cpu/Board 0x%x", __FUNCTION__, desc->CpuRev_BoardRev ); | 872 | dbg ( "%s - Cpu/Board 0x%x", __FUNCTION__, desc->CpuRev_BoardRev ); |
860 | dbg ( "%s - NumPorts %d", __FUNCTION__, desc->NumPorts ); | 873 | dbg ( "%s - NumPorts %d", __FUNCTION__, desc->NumPorts ); |
861 | dbg ( "%s - NumVirtualPorts %d", __FUNCTION__, desc->NumVirtualPorts ); | 874 | dbg ( "%s - NumVirtualPorts %d", __FUNCTION__, desc->NumVirtualPorts ); |
862 | dbg ( "%s - TotalPorts %d", __FUNCTION__, desc->TotalPorts ); | 875 | dbg ( "%s - TotalPorts %d", __FUNCTION__, desc->TotalPorts ); |
863 | 876 | ||
864 | exit: | 877 | exit: |
865 | kfree (rom_desc); | 878 | kfree (rom_desc); |
866 | return status; | 879 | return status; |
867 | } | 880 | } |
868 | 881 | ||
869 | /* Build firmware header used for firmware update */ | 882 | /* Build firmware header used for firmware update */ |
870 | static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) | 883 | static int BuildI2CFirmwareHeader (__u8 *header, struct device *dev) |
871 | { | 884 | { |
872 | __u8 *buffer; | 885 | __u8 *buffer; |
873 | int buffer_size; | 886 | int buffer_size; |
874 | int i; | 887 | int i; |
875 | __u8 cs = 0; | 888 | __u8 cs = 0; |
876 | struct ti_i2c_desc *i2c_header; | 889 | struct ti_i2c_desc *i2c_header; |
877 | struct ti_i2c_image_header *img_header; | 890 | struct ti_i2c_image_header *img_header; |
878 | struct ti_i2c_firmware_rec *firmware_rec; | 891 | struct ti_i2c_firmware_rec *firmware_rec; |
879 | 892 | ||
880 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. | 893 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. |
881 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver | 894 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver |
882 | // will download the latest firmware (padded to 15.5k) into the UMP ram. | 895 | // will download the latest firmware (padded to 15.5k) into the UMP ram. |
883 | // And finally when the device comes back up in download mode the driver will cause | 896 | // And finally when the device comes back up in download mode the driver will cause |
884 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update | 897 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update |
885 | // the record type from 0xf2 to 0x02. | 898 | // the record type from 0xf2 to 0x02. |
886 | 899 | ||
887 | // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record) | 900 | // Allocate a 15.5k buffer + 2 bytes for version number (Firmware Record) |
888 | buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec)); | 901 | buffer_size = (((1024 * 16) - 512 )+ sizeof(struct ti_i2c_firmware_rec)); |
889 | 902 | ||
890 | buffer = kmalloc (buffer_size, GFP_KERNEL); | 903 | buffer = kmalloc (buffer_size, GFP_KERNEL); |
891 | if (!buffer) { | 904 | if (!buffer) { |
892 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); | 905 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); |
893 | return -ENOMEM; | 906 | return -ENOMEM; |
894 | } | 907 | } |
895 | 908 | ||
896 | // Set entire image of 0xffs | 909 | // Set entire image of 0xffs |
897 | memset (buffer, 0xff, buffer_size); | 910 | memset (buffer, 0xff, buffer_size); |
898 | 911 | ||
899 | // Copy version number into firmware record | 912 | // Copy version number into firmware record |
900 | firmware_rec = (struct ti_i2c_firmware_rec *)buffer; | 913 | firmware_rec = (struct ti_i2c_firmware_rec *)buffer; |
901 | 914 | ||
902 | firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; | 915 | firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; |
903 | firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; | 916 | firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; |
904 | 917 | ||
905 | // Pointer to fw_down memory image | 918 | // Pointer to fw_down memory image |
906 | img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0]; | 919 | img_header = (struct ti_i2c_image_header *)&PagableOperationalCodeImage[0]; |
907 | 920 | ||
908 | memcpy (buffer + sizeof(struct ti_i2c_firmware_rec), | 921 | memcpy (buffer + sizeof(struct ti_i2c_firmware_rec), |
909 | &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)], | 922 | &PagableOperationalCodeImage[sizeof(struct ti_i2c_image_header)], |
910 | le16_to_cpu(img_header->Length)); | 923 | le16_to_cpu(img_header->Length)); |
911 | 924 | ||
912 | for (i=0; i < buffer_size; i++) { | 925 | for (i=0; i < buffer_size; i++) { |
913 | cs = (__u8)(cs + buffer[i]); | 926 | cs = (__u8)(cs + buffer[i]); |
914 | } | 927 | } |
915 | 928 | ||
916 | kfree (buffer); | 929 | kfree (buffer); |
917 | 930 | ||
918 | // Build new header | 931 | // Build new header |
919 | i2c_header = (struct ti_i2c_desc *)header; | 932 | i2c_header = (struct ti_i2c_desc *)header; |
920 | firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; | 933 | firmware_rec = (struct ti_i2c_firmware_rec*)i2c_header->Data; |
921 | 934 | ||
922 | i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; | 935 | i2c_header->Type = I2C_DESC_TYPE_FIRMWARE_BLANK; |
923 | i2c_header->Size = (__u16)buffer_size; | 936 | i2c_header->Size = (__u16)buffer_size; |
924 | i2c_header->CheckSum = cs; | 937 | i2c_header->CheckSum = cs; |
925 | firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; | 938 | firmware_rec->Ver_Major = OperationalCodeImageVersion.MajorVersion; |
926 | firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; | 939 | firmware_rec->Ver_Minor = OperationalCodeImageVersion.MinorVersion; |
927 | 940 | ||
928 | return 0; | 941 | return 0; |
929 | } | 942 | } |
930 | 943 | ||
931 | /* Try to figure out what type of I2c we have */ | 944 | /* Try to figure out what type of I2c we have */ |
932 | static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial) | 945 | static int TIGetI2cTypeInBootMode (struct edgeport_serial *serial) |
933 | { | 946 | { |
934 | int status; | 947 | int status; |
935 | __u8 data; | 948 | __u8 data; |
936 | 949 | ||
937 | // Try to read type 2 | 950 | // Try to read type 2 |
938 | status = TIReadVendorRequestSync (serial->serial->dev, | 951 | status = TIReadVendorRequestSync (serial->serial->dev, |
939 | UMPC_MEMORY_READ, // Request | 952 | UMPC_MEMORY_READ, // Request |
940 | DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type) | 953 | DTK_ADDR_SPACE_I2C_TYPE_II, // wValue (Address type) |
941 | 0, // wIndex | 954 | 0, // wIndex |
942 | &data, // TransferBuffer | 955 | &data, // TransferBuffer |
943 | 0x01); // TransferBufferLength | 956 | 0x01); // TransferBufferLength |
944 | if (status) | 957 | if (status) |
945 | dbg ("%s - read 2 status error = %d", __FUNCTION__, status); | 958 | dbg ("%s - read 2 status error = %d", __FUNCTION__, status); |
946 | else | 959 | else |
947 | dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); | 960 | dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); |
948 | if ((!status) && (data == UMP5152 || data == UMP3410)) { | 961 | if ((!status) && (data == UMP5152 || data == UMP3410)) { |
949 | dbg ("%s - ROM_TYPE_II", __FUNCTION__); | 962 | dbg ("%s - ROM_TYPE_II", __FUNCTION__); |
950 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; | 963 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; |
951 | return 0; | 964 | return 0; |
952 | } | 965 | } |
953 | 966 | ||
954 | // Try to read type 3 | 967 | // Try to read type 3 |
955 | status = TIReadVendorRequestSync (serial->serial->dev, | 968 | status = TIReadVendorRequestSync (serial->serial->dev, |
956 | UMPC_MEMORY_READ, // Request | 969 | UMPC_MEMORY_READ, // Request |
957 | DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type) | 970 | DTK_ADDR_SPACE_I2C_TYPE_III, // wValue (Address type) |
958 | 0, // wIndex | 971 | 0, // wIndex |
959 | &data, // TransferBuffer | 972 | &data, // TransferBuffer |
960 | 0x01); // TransferBufferLength | 973 | 0x01); // TransferBufferLength |
961 | if (status) | 974 | if (status) |
962 | dbg ("%s - read 3 status error = %d", __FUNCTION__, status); | 975 | dbg ("%s - read 3 status error = %d", __FUNCTION__, status); |
963 | else | 976 | else |
964 | dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); | 977 | dbg ("%s - read 2 data = 0x%x", __FUNCTION__, data); |
965 | if ((!status) && (data == UMP5152 || data == UMP3410)) { | 978 | if ((!status) && (data == UMP5152 || data == UMP3410)) { |
966 | dbg ("%s - ROM_TYPE_III", __FUNCTION__); | 979 | dbg ("%s - ROM_TYPE_III", __FUNCTION__); |
967 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III; | 980 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III; |
968 | return 0; | 981 | return 0; |
969 | } | 982 | } |
970 | 983 | ||
971 | dbg ("%s - Unknown", __FUNCTION__); | 984 | dbg ("%s - Unknown", __FUNCTION__); |
972 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; | 985 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; |
973 | return -ENODEV; | 986 | return -ENODEV; |
974 | } | 987 | } |
975 | 988 | ||
976 | static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent) | 989 | static int TISendBulkTransferSync (struct usb_serial *serial, void *buffer, int length, int *num_sent) |
977 | { | 990 | { |
978 | int status; | 991 | int status; |
979 | 992 | ||
980 | status = usb_bulk_msg (serial->dev, | 993 | status = usb_bulk_msg (serial->dev, |
981 | usb_sndbulkpipe(serial->dev, | 994 | usb_sndbulkpipe(serial->dev, |
982 | serial->port[0]->bulk_out_endpointAddress), | 995 | serial->port[0]->bulk_out_endpointAddress), |
983 | buffer, | 996 | buffer, |
984 | length, | 997 | length, |
985 | num_sent, | 998 | num_sent, |
986 | 1000); | 999 | 1000); |
987 | return status; | 1000 | return status; |
988 | } | 1001 | } |
989 | 1002 | ||
990 | /* Download given firmware image to the device (IN BOOT MODE) */ | 1003 | /* Download given firmware image to the device (IN BOOT MODE) */ |
991 | static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length) | 1004 | static int TIDownloadCodeImage (struct edgeport_serial *serial, __u8 *image, int image_length) |
992 | { | 1005 | { |
993 | int status = 0; | 1006 | int status = 0; |
994 | int pos; | 1007 | int pos; |
995 | int transfer; | 1008 | int transfer; |
996 | int done; | 1009 | int done; |
997 | 1010 | ||
998 | // Transfer firmware image | 1011 | // Transfer firmware image |
999 | for (pos = 0; pos < image_length; ) { | 1012 | for (pos = 0; pos < image_length; ) { |
1000 | // Read the next buffer from file | 1013 | // Read the next buffer from file |
1001 | transfer = image_length - pos; | 1014 | transfer = image_length - pos; |
1002 | if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE) | 1015 | if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE) |
1003 | transfer = EDGE_FW_BULK_MAX_PACKET_SIZE; | 1016 | transfer = EDGE_FW_BULK_MAX_PACKET_SIZE; |
1004 | 1017 | ||
1005 | // Transfer data | 1018 | // Transfer data |
1006 | status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done); | 1019 | status = TISendBulkTransferSync (serial->serial, &image[pos], transfer, &done); |
1007 | if (status) | 1020 | if (status) |
1008 | break; | 1021 | break; |
1009 | // Advance buffer pointer | 1022 | // Advance buffer pointer |
1010 | pos += done; | 1023 | pos += done; |
1011 | } | 1024 | } |
1012 | 1025 | ||
1013 | return status; | 1026 | return status; |
1014 | } | 1027 | } |
1015 | 1028 | ||
1016 | // FIXME!!! | 1029 | // FIXME!!! |
1017 | static int TIConfigureBootDevice (struct usb_device *dev) | 1030 | static int TIConfigureBootDevice (struct usb_device *dev) |
1018 | { | 1031 | { |
1019 | return 0; | 1032 | return 0; |
1020 | } | 1033 | } |
1021 | 1034 | ||
1022 | /** | 1035 | /** |
1023 | * DownloadTIFirmware - Download run-time operating firmware to the TI5052 | 1036 | * DownloadTIFirmware - Download run-time operating firmware to the TI5052 |
1024 | * | 1037 | * |
1025 | * This routine downloads the main operating code into the TI5052, using the | 1038 | * This routine downloads the main operating code into the TI5052, using the |
1026 | * boot code already burned into E2PROM or ROM. | 1039 | * boot code already burned into E2PROM or ROM. |
1027 | */ | 1040 | */ |
1028 | static int TIDownloadFirmware (struct edgeport_serial *serial) | 1041 | static int TIDownloadFirmware (struct edgeport_serial *serial) |
1029 | { | 1042 | { |
1030 | struct device *dev = &serial->serial->dev->dev; | 1043 | struct device *dev = &serial->serial->dev->dev; |
1031 | int status = 0; | 1044 | int status = 0; |
1032 | int start_address; | 1045 | int start_address; |
1033 | struct edge_ti_manuf_descriptor *ti_manuf_desc; | 1046 | struct edge_ti_manuf_descriptor *ti_manuf_desc; |
1034 | struct usb_interface_descriptor *interface; | 1047 | struct usb_interface_descriptor *interface; |
1035 | int download_cur_ver; | 1048 | int download_cur_ver; |
1036 | int download_new_ver; | 1049 | int download_new_ver; |
1037 | 1050 | ||
1038 | /* This routine is entered by both the BOOT mode and the Download mode | 1051 | /* This routine is entered by both the BOOT mode and the Download mode |
1039 | * We can determine which code is running by the reading the config | 1052 | * We can determine which code is running by the reading the config |
1040 | * descriptor and if we have only one bulk pipe it is in boot mode | 1053 | * descriptor and if we have only one bulk pipe it is in boot mode |
1041 | */ | 1054 | */ |
1042 | serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP; | 1055 | serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP; |
1043 | 1056 | ||
1044 | /* Default to type 2 i2c */ | 1057 | /* Default to type 2 i2c */ |
1045 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; | 1058 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; |
1046 | 1059 | ||
1047 | status = TIChooseConfiguration (serial->serial->dev); | 1060 | status = TIChooseConfiguration (serial->serial->dev); |
1048 | if (status) | 1061 | if (status) |
1049 | return status; | 1062 | return status; |
1050 | 1063 | ||
1051 | interface = &serial->serial->interface->cur_altsetting->desc; | 1064 | interface = &serial->serial->interface->cur_altsetting->desc; |
1052 | if (!interface) { | 1065 | if (!interface) { |
1053 | dev_err (dev, "%s - no interface set, error!\n", __FUNCTION__); | 1066 | dev_err (dev, "%s - no interface set, error!\n", __FUNCTION__); |
1054 | return -ENODEV; | 1067 | return -ENODEV; |
1055 | } | 1068 | } |
1056 | 1069 | ||
1057 | // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING | 1070 | // Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING |
1058 | // if we have more than one endpoint we are definitely in download mode | 1071 | // if we have more than one endpoint we are definitely in download mode |
1059 | if (interface->bNumEndpoints > 1) | 1072 | if (interface->bNumEndpoints > 1) |
1060 | serial->product_info.TiMode = TI_MODE_DOWNLOAD; | 1073 | serial->product_info.TiMode = TI_MODE_DOWNLOAD; |
1061 | else | 1074 | else |
1062 | // Otherwise we will remain in configuring mode | 1075 | // Otherwise we will remain in configuring mode |
1063 | serial->product_info.TiMode = TI_MODE_CONFIGURING; | 1076 | serial->product_info.TiMode = TI_MODE_CONFIGURING; |
1064 | 1077 | ||
1065 | // Save Download Version Number | 1078 | // Save Download Version Number |
1066 | OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion; | 1079 | OperationalCodeImageVersion.MajorVersion = PagableOperationalCodeImageVersion.MajorVersion; |
1067 | OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion; | 1080 | OperationalCodeImageVersion.MinorVersion = PagableOperationalCodeImageVersion.MinorVersion; |
1068 | OperationalCodeImageVersion.BuildNumber = PagableOperationalCodeImageVersion.BuildNumber; | 1081 | OperationalCodeImageVersion.BuildNumber = PagableOperationalCodeImageVersion.BuildNumber; |
1069 | 1082 | ||
1070 | /********************************************************************/ | 1083 | /********************************************************************/ |
1071 | /* Download Mode */ | 1084 | /* Download Mode */ |
1072 | /********************************************************************/ | 1085 | /********************************************************************/ |
1073 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { | 1086 | if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) { |
1074 | struct ti_i2c_desc *rom_desc; | 1087 | struct ti_i2c_desc *rom_desc; |
1075 | 1088 | ||
1076 | dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__); | 1089 | dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN DOWNLOAD MODE>>>>>>>>>>", __FUNCTION__); |
1077 | 1090 | ||
1078 | status = TiValidateI2cImage (serial); | 1091 | status = TiValidateI2cImage (serial); |
1079 | if (status) { | 1092 | if (status) { |
1080 | dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>", | 1093 | dbg ("%s - <<<<<<<<<<<<<<<DOWNLOAD MODE -- BAD I2C >>>>>>>>>>", |
1081 | __FUNCTION__); | 1094 | __FUNCTION__); |
1082 | return status; | 1095 | return status; |
1083 | } | 1096 | } |
1084 | 1097 | ||
1085 | /* Validate Hardware version number | 1098 | /* Validate Hardware version number |
1086 | * Read Manufacturing Descriptor from TI Based Edgeport | 1099 | * Read Manufacturing Descriptor from TI Based Edgeport |
1087 | */ | 1100 | */ |
1088 | ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); | 1101 | ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); |
1089 | if (!ti_manuf_desc) { | 1102 | if (!ti_manuf_desc) { |
1090 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1103 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1091 | return -ENOMEM; | 1104 | return -ENOMEM; |
1092 | } | 1105 | } |
1093 | status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); | 1106 | status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); |
1094 | if (status) { | 1107 | if (status) { |
1095 | kfree (ti_manuf_desc); | 1108 | kfree (ti_manuf_desc); |
1096 | return status; | 1109 | return status; |
1097 | } | 1110 | } |
1098 | 1111 | ||
1099 | // Check version number of ION descriptor | 1112 | // Check version number of ION descriptor |
1100 | if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { | 1113 | if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { |
1101 | dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, | 1114 | dbg ( "%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, |
1102 | TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); | 1115 | TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); |
1103 | kfree (ti_manuf_desc); | 1116 | kfree (ti_manuf_desc); |
1104 | return -EINVAL; | 1117 | return -EINVAL; |
1105 | } | 1118 | } |
1106 | 1119 | ||
1107 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); | 1120 | rom_desc = kmalloc (sizeof (*rom_desc), GFP_KERNEL); |
1108 | if (!rom_desc) { | 1121 | if (!rom_desc) { |
1109 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1122 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1110 | kfree (ti_manuf_desc); | 1123 | kfree (ti_manuf_desc); |
1111 | return -ENOMEM; | 1124 | return -ENOMEM; |
1112 | } | 1125 | } |
1113 | 1126 | ||
1114 | // Search for type 2 record (firmware record) | 1127 | // Search for type 2 record (firmware record) |
1115 | if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) { | 1128 | if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc)) != 0) { |
1116 | struct ti_i2c_firmware_rec *firmware_version; | 1129 | struct ti_i2c_firmware_rec *firmware_version; |
1117 | __u8 record; | 1130 | __u8 record; |
1118 | 1131 | ||
1119 | dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__); | 1132 | dbg ("%s - Found Type FIRMWARE (Type 2) record", __FUNCTION__); |
1120 | 1133 | ||
1121 | firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL); | 1134 | firmware_version = kmalloc (sizeof (*firmware_version), GFP_KERNEL); |
1122 | if (!firmware_version) { | 1135 | if (!firmware_version) { |
1123 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1136 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1124 | kfree (rom_desc); | 1137 | kfree (rom_desc); |
1125 | kfree (ti_manuf_desc); | 1138 | kfree (ti_manuf_desc); |
1126 | return -ENOMEM; | 1139 | return -ENOMEM; |
1127 | } | 1140 | } |
1128 | 1141 | ||
1129 | // Validate version number | 1142 | // Validate version number |
1130 | // Read the descriptor data | 1143 | // Read the descriptor data |
1131 | status = TIReadRom (serial, | 1144 | status = TIReadRom (serial, |
1132 | start_address+sizeof(struct ti_i2c_desc), | 1145 | start_address+sizeof(struct ti_i2c_desc), |
1133 | sizeof(struct ti_i2c_firmware_rec), | 1146 | sizeof(struct ti_i2c_firmware_rec), |
1134 | (__u8 *)firmware_version); | 1147 | (__u8 *)firmware_version); |
1135 | if (status) { | 1148 | if (status) { |
1136 | kfree (firmware_version); | 1149 | kfree (firmware_version); |
1137 | kfree (rom_desc); | 1150 | kfree (rom_desc); |
1138 | kfree (ti_manuf_desc); | 1151 | kfree (ti_manuf_desc); |
1139 | return status; | 1152 | return status; |
1140 | } | 1153 | } |
1141 | 1154 | ||
1142 | // Check version number of download with current version in I2c | 1155 | // Check version number of download with current version in I2c |
1143 | download_cur_ver = (firmware_version->Ver_Major << 8) + | 1156 | download_cur_ver = (firmware_version->Ver_Major << 8) + |
1144 | (firmware_version->Ver_Minor); | 1157 | (firmware_version->Ver_Minor); |
1145 | download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) + | 1158 | download_new_ver = (OperationalCodeImageVersion.MajorVersion << 8) + |
1146 | (OperationalCodeImageVersion.MinorVersion); | 1159 | (OperationalCodeImageVersion.MinorVersion); |
1147 | 1160 | ||
1148 | dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d", | 1161 | dbg ("%s - >>>Firmware Versions Device %d.%d Driver %d.%d", |
1149 | __FUNCTION__, | 1162 | __FUNCTION__, |
1150 | firmware_version->Ver_Major, | 1163 | firmware_version->Ver_Major, |
1151 | firmware_version->Ver_Minor, | 1164 | firmware_version->Ver_Minor, |
1152 | OperationalCodeImageVersion.MajorVersion, | 1165 | OperationalCodeImageVersion.MajorVersion, |
1153 | OperationalCodeImageVersion.MinorVersion); | 1166 | OperationalCodeImageVersion.MinorVersion); |
1154 | 1167 | ||
1155 | // Check if we have an old version in the I2C and update if necessary | 1168 | // Check if we have an old version in the I2C and update if necessary |
1156 | if (download_cur_ver != download_new_ver) { | 1169 | if (download_cur_ver != download_new_ver) { |
1157 | dbg ("%s - Update I2C Download from %d.%d to %d.%d", | 1170 | dbg ("%s - Update I2C Download from %d.%d to %d.%d", |
1158 | __FUNCTION__, | 1171 | __FUNCTION__, |
1159 | firmware_version->Ver_Major, | 1172 | firmware_version->Ver_Major, |
1160 | firmware_version->Ver_Minor, | 1173 | firmware_version->Ver_Minor, |
1161 | OperationalCodeImageVersion.MajorVersion, | 1174 | OperationalCodeImageVersion.MajorVersion, |
1162 | OperationalCodeImageVersion.MinorVersion); | 1175 | OperationalCodeImageVersion.MinorVersion); |
1163 | 1176 | ||
1164 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. | 1177 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. |
1165 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver | 1178 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver |
1166 | // will download the latest firmware (padded to 15.5k) into the UMP ram. | 1179 | // will download the latest firmware (padded to 15.5k) into the UMP ram. |
1167 | // And finally when the device comes back up in download mode the driver will cause | 1180 | // And finally when the device comes back up in download mode the driver will cause |
1168 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update | 1181 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update |
1169 | // the record type from 0xf2 to 0x02. | 1182 | // the record type from 0xf2 to 0x02. |
1170 | 1183 | ||
1171 | record = I2C_DESC_TYPE_FIRMWARE_BLANK; | 1184 | record = I2C_DESC_TYPE_FIRMWARE_BLANK; |
1172 | 1185 | ||
1173 | // Change the I2C Firmware record type to 0xf2 to trigger an update | 1186 | // Change the I2C Firmware record type to 0xf2 to trigger an update |
1174 | status = TIWriteRom (serial, | 1187 | status = TIWriteRom (serial, |
1175 | start_address, | 1188 | start_address, |
1176 | sizeof(record), | 1189 | sizeof(record), |
1177 | &record); | 1190 | &record); |
1178 | if (status) { | 1191 | if (status) { |
1179 | kfree (firmware_version); | 1192 | kfree (firmware_version); |
1180 | kfree (rom_desc); | 1193 | kfree (rom_desc); |
1181 | kfree (ti_manuf_desc); | 1194 | kfree (ti_manuf_desc); |
1182 | return status; | 1195 | return status; |
1183 | } | 1196 | } |
1184 | 1197 | ||
1185 | // verify the write -- must do this in order for write to | 1198 | // verify the write -- must do this in order for write to |
1186 | // complete before we do the hardware reset | 1199 | // complete before we do the hardware reset |
1187 | status = TIReadRom (serial, | 1200 | status = TIReadRom (serial, |
1188 | start_address, | 1201 | start_address, |
1189 | sizeof(record), | 1202 | sizeof(record), |
1190 | &record); | 1203 | &record); |
1191 | 1204 | ||
1192 | if (status) { | 1205 | if (status) { |
1193 | kfree (firmware_version); | 1206 | kfree (firmware_version); |
1194 | kfree (rom_desc); | 1207 | kfree (rom_desc); |
1195 | kfree (ti_manuf_desc); | 1208 | kfree (ti_manuf_desc); |
1196 | return status; | 1209 | return status; |
1197 | } | 1210 | } |
1198 | 1211 | ||
1199 | if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) { | 1212 | if (record != I2C_DESC_TYPE_FIRMWARE_BLANK) { |
1200 | dev_err (dev, "%s - error resetting device\n", __FUNCTION__); | 1213 | dev_err (dev, "%s - error resetting device\n", __FUNCTION__); |
1201 | kfree (firmware_version); | 1214 | kfree (firmware_version); |
1202 | kfree (rom_desc); | 1215 | kfree (rom_desc); |
1203 | kfree (ti_manuf_desc); | 1216 | kfree (ti_manuf_desc); |
1204 | return -ENODEV; | 1217 | return -ENODEV; |
1205 | } | 1218 | } |
1206 | 1219 | ||
1207 | dbg ("%s - HARDWARE RESET", __FUNCTION__); | 1220 | dbg ("%s - HARDWARE RESET", __FUNCTION__); |
1208 | 1221 | ||
1209 | // Reset UMP -- Back to BOOT MODE | 1222 | // Reset UMP -- Back to BOOT MODE |
1210 | status = TISendVendorRequestSync (serial->serial->dev, | 1223 | status = TISendVendorRequestSync (serial->serial->dev, |
1211 | UMPC_HARDWARE_RESET, // Request | 1224 | UMPC_HARDWARE_RESET, // Request |
1212 | 0, // wValue | 1225 | 0, // wValue |
1213 | 0, // wIndex | 1226 | 0, // wIndex |
1214 | NULL, // TransferBuffer | 1227 | NULL, // TransferBuffer |
1215 | 0); // TransferBufferLength | 1228 | 0); // TransferBufferLength |
1216 | 1229 | ||
1217 | dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status); | 1230 | dbg ( "%s - HARDWARE RESET return %d", __FUNCTION__, status); |
1218 | 1231 | ||
1219 | /* return an error on purpose. */ | 1232 | /* return an error on purpose. */ |
1220 | kfree (firmware_version); | 1233 | kfree (firmware_version); |
1221 | kfree (rom_desc); | 1234 | kfree (rom_desc); |
1222 | kfree (ti_manuf_desc); | 1235 | kfree (ti_manuf_desc); |
1223 | return -ENODEV; | 1236 | return -ENODEV; |
1224 | } | 1237 | } |
1225 | kfree (firmware_version); | 1238 | kfree (firmware_version); |
1226 | } | 1239 | } |
1227 | // Search for type 0xF2 record (firmware blank record) | 1240 | // Search for type 0xF2 record (firmware blank record) |
1228 | else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) { | 1241 | else if ((start_address = TIGetDescriptorAddress (serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) { |
1229 | #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec)) | 1242 | #define HEADER_SIZE (sizeof(struct ti_i2c_desc) + sizeof(struct ti_i2c_firmware_rec)) |
1230 | __u8 *header; | 1243 | __u8 *header; |
1231 | __u8 *vheader; | 1244 | __u8 *vheader; |
1232 | 1245 | ||
1233 | header = kmalloc (HEADER_SIZE, GFP_KERNEL); | 1246 | header = kmalloc (HEADER_SIZE, GFP_KERNEL); |
1234 | if (!header) { | 1247 | if (!header) { |
1235 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1248 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1236 | kfree (rom_desc); | 1249 | kfree (rom_desc); |
1237 | kfree (ti_manuf_desc); | 1250 | kfree (ti_manuf_desc); |
1238 | return -ENOMEM; | 1251 | return -ENOMEM; |
1239 | } | 1252 | } |
1240 | 1253 | ||
1241 | vheader = kmalloc (HEADER_SIZE, GFP_KERNEL); | 1254 | vheader = kmalloc (HEADER_SIZE, GFP_KERNEL); |
1242 | if (!vheader) { | 1255 | if (!vheader) { |
1243 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1256 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1244 | kfree (header); | 1257 | kfree (header); |
1245 | kfree (rom_desc); | 1258 | kfree (rom_desc); |
1246 | kfree (ti_manuf_desc); | 1259 | kfree (ti_manuf_desc); |
1247 | return -ENOMEM; | 1260 | return -ENOMEM; |
1248 | } | 1261 | } |
1249 | 1262 | ||
1250 | dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__); | 1263 | dbg ("%s - Found Type BLANK FIRMWARE (Type F2) record", __FUNCTION__); |
1251 | 1264 | ||
1252 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. | 1265 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. |
1253 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver | 1266 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver |
1254 | // will download the latest firmware (padded to 15.5k) into the UMP ram. | 1267 | // will download the latest firmware (padded to 15.5k) into the UMP ram. |
1255 | // And finally when the device comes back up in download mode the driver will cause | 1268 | // And finally when the device comes back up in download mode the driver will cause |
1256 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update | 1269 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update |
1257 | // the record type from 0xf2 to 0x02. | 1270 | // the record type from 0xf2 to 0x02. |
1258 | status = BuildI2CFirmwareHeader(header, dev); | 1271 | status = BuildI2CFirmwareHeader(header, dev); |
1259 | if (status) { | 1272 | if (status) { |
1260 | kfree (vheader); | 1273 | kfree (vheader); |
1261 | kfree (header); | 1274 | kfree (header); |
1262 | kfree (rom_desc); | 1275 | kfree (rom_desc); |
1263 | kfree (ti_manuf_desc); | 1276 | kfree (ti_manuf_desc); |
1264 | return status; | 1277 | return status; |
1265 | } | 1278 | } |
1266 | 1279 | ||
1267 | // Update I2C with type 0xf2 record with correct size and checksum | 1280 | // Update I2C with type 0xf2 record with correct size and checksum |
1268 | status = TIWriteRom (serial, | 1281 | status = TIWriteRom (serial, |
1269 | start_address, | 1282 | start_address, |
1270 | HEADER_SIZE, | 1283 | HEADER_SIZE, |
1271 | header); | 1284 | header); |
1272 | if (status) { | 1285 | if (status) { |
1273 | kfree (vheader); | 1286 | kfree (vheader); |
1274 | kfree (header); | 1287 | kfree (header); |
1275 | kfree (rom_desc); | 1288 | kfree (rom_desc); |
1276 | kfree (ti_manuf_desc); | 1289 | kfree (ti_manuf_desc); |
1277 | return status; | 1290 | return status; |
1278 | } | 1291 | } |
1279 | 1292 | ||
1280 | // verify the write -- must do this in order for write to | 1293 | // verify the write -- must do this in order for write to |
1281 | // complete before we do the hardware reset | 1294 | // complete before we do the hardware reset |
1282 | status = TIReadRom (serial, | 1295 | status = TIReadRom (serial, |
1283 | start_address, | 1296 | start_address, |
1284 | HEADER_SIZE, | 1297 | HEADER_SIZE, |
1285 | vheader); | 1298 | vheader); |
1286 | 1299 | ||
1287 | if (status) { | 1300 | if (status) { |
1288 | dbg ("%s - can't read header back", __FUNCTION__); | 1301 | dbg ("%s - can't read header back", __FUNCTION__); |
1289 | kfree (vheader); | 1302 | kfree (vheader); |
1290 | kfree (header); | 1303 | kfree (header); |
1291 | kfree (rom_desc); | 1304 | kfree (rom_desc); |
1292 | kfree (ti_manuf_desc); | 1305 | kfree (ti_manuf_desc); |
1293 | return status; | 1306 | return status; |
1294 | } | 1307 | } |
1295 | if (memcmp(vheader, header, HEADER_SIZE)) { | 1308 | if (memcmp(vheader, header, HEADER_SIZE)) { |
1296 | dbg ("%s - write download record failed", __FUNCTION__); | 1309 | dbg ("%s - write download record failed", __FUNCTION__); |
1297 | kfree (vheader); | 1310 | kfree (vheader); |
1298 | kfree (header); | 1311 | kfree (header); |
1299 | kfree (rom_desc); | 1312 | kfree (rom_desc); |
1300 | kfree (ti_manuf_desc); | 1313 | kfree (ti_manuf_desc); |
1301 | return status; | 1314 | return status; |
1302 | } | 1315 | } |
1303 | 1316 | ||
1304 | kfree (vheader); | 1317 | kfree (vheader); |
1305 | kfree (header); | 1318 | kfree (header); |
1306 | 1319 | ||
1307 | dbg ("%s - Start firmware update", __FUNCTION__); | 1320 | dbg ("%s - Start firmware update", __FUNCTION__); |
1308 | 1321 | ||
1309 | // Tell firmware to copy download image into I2C | 1322 | // Tell firmware to copy download image into I2C |
1310 | status = TISendVendorRequestSync (serial->serial->dev, | 1323 | status = TISendVendorRequestSync (serial->serial->dev, |
1311 | UMPC_COPY_DNLD_TO_I2C, // Request | 1324 | UMPC_COPY_DNLD_TO_I2C, // Request |
1312 | 0, // wValue | 1325 | 0, // wValue |
1313 | 0, // wIndex | 1326 | 0, // wIndex |
1314 | NULL, // TransferBuffer | 1327 | NULL, // TransferBuffer |
1315 | 0); // TransferBufferLength | 1328 | 0); // TransferBufferLength |
1316 | 1329 | ||
1317 | dbg ("%s - Update complete 0x%x", __FUNCTION__, status); | 1330 | dbg ("%s - Update complete 0x%x", __FUNCTION__, status); |
1318 | if (status) { | 1331 | if (status) { |
1319 | dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __FUNCTION__); | 1332 | dev_err (dev, "%s - UMPC_COPY_DNLD_TO_I2C failed\n", __FUNCTION__); |
1320 | kfree (rom_desc); | 1333 | kfree (rom_desc); |
1321 | kfree (ti_manuf_desc); | 1334 | kfree (ti_manuf_desc); |
1322 | return status; | 1335 | return status; |
1323 | } | 1336 | } |
1324 | } | 1337 | } |
1325 | 1338 | ||
1326 | // The device is running the download code | 1339 | // The device is running the download code |
1327 | kfree (rom_desc); | 1340 | kfree (rom_desc); |
1328 | kfree (ti_manuf_desc); | 1341 | kfree (ti_manuf_desc); |
1329 | return 0; | 1342 | return 0; |
1330 | } | 1343 | } |
1331 | 1344 | ||
1332 | /********************************************************************/ | 1345 | /********************************************************************/ |
1333 | /* Boot Mode */ | 1346 | /* Boot Mode */ |
1334 | /********************************************************************/ | 1347 | /********************************************************************/ |
1335 | dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>", | 1348 | dbg ("%s - <<<<<<<<<<<<<<<RUNNING IN BOOT MODE>>>>>>>>>>>>>>>", |
1336 | __FUNCTION__); | 1349 | __FUNCTION__); |
1337 | 1350 | ||
1338 | // Configure the TI device so we can use the BULK pipes for download | 1351 | // Configure the TI device so we can use the BULK pipes for download |
1339 | status = TIConfigureBootDevice (serial->serial->dev); | 1352 | status = TIConfigureBootDevice (serial->serial->dev); |
1340 | if (status) | 1353 | if (status) |
1341 | return status; | 1354 | return status; |
1342 | 1355 | ||
1343 | if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) { | 1356 | if (le16_to_cpu(serial->serial->dev->descriptor.idVendor) != USB_VENDOR_ID_ION) { |
1344 | dbg ("%s - VID = 0x%x", __FUNCTION__, | 1357 | dbg ("%s - VID = 0x%x", __FUNCTION__, |
1345 | le16_to_cpu(serial->serial->dev->descriptor.idVendor)); | 1358 | le16_to_cpu(serial->serial->dev->descriptor.idVendor)); |
1346 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; | 1359 | serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II; |
1347 | goto StayInBootMode; | 1360 | goto StayInBootMode; |
1348 | } | 1361 | } |
1349 | 1362 | ||
1350 | // We have an ION device (I2c Must be programmed) | 1363 | // We have an ION device (I2c Must be programmed) |
1351 | // Determine I2C image type | 1364 | // Determine I2C image type |
1352 | if (TIGetI2cTypeInBootMode(serial)) { | 1365 | if (TIGetI2cTypeInBootMode(serial)) { |
1353 | goto StayInBootMode; | 1366 | goto StayInBootMode; |
1354 | } | 1367 | } |
1355 | 1368 | ||
1356 | // Registry variable set? | 1369 | // Registry variable set? |
1357 | if (TIStayInBootMode) { | 1370 | if (TIStayInBootMode) { |
1358 | dbg ("%s - TIStayInBootMode", __FUNCTION__); | 1371 | dbg ("%s - TIStayInBootMode", __FUNCTION__); |
1359 | goto StayInBootMode; | 1372 | goto StayInBootMode; |
1360 | } | 1373 | } |
1361 | 1374 | ||
1362 | // Check for ION Vendor ID and that the I2C is valid | 1375 | // Check for ION Vendor ID and that the I2C is valid |
1363 | if (!TiValidateI2cImage(serial)) { | 1376 | if (!TiValidateI2cImage(serial)) { |
1364 | struct ti_i2c_image_header *header; | 1377 | struct ti_i2c_image_header *header; |
1365 | int i; | 1378 | int i; |
1366 | __u8 cs = 0; | 1379 | __u8 cs = 0; |
1367 | __u8 *buffer; | 1380 | __u8 *buffer; |
1368 | int buffer_size; | 1381 | int buffer_size; |
1369 | 1382 | ||
1370 | /* Validate Hardware version number | 1383 | /* Validate Hardware version number |
1371 | * Read Manufacturing Descriptor from TI Based Edgeport | 1384 | * Read Manufacturing Descriptor from TI Based Edgeport |
1372 | */ | 1385 | */ |
1373 | ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); | 1386 | ti_manuf_desc = kmalloc (sizeof (*ti_manuf_desc), GFP_KERNEL); |
1374 | if (!ti_manuf_desc) { | 1387 | if (!ti_manuf_desc) { |
1375 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); | 1388 | dev_err (dev, "%s - out of memory.\n", __FUNCTION__); |
1376 | return -ENOMEM; | 1389 | return -ENOMEM; |
1377 | } | 1390 | } |
1378 | status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); | 1391 | status = TIReadManufDescriptor (serial, (__u8 *)ti_manuf_desc); |
1379 | if (status) { | 1392 | if (status) { |
1380 | kfree (ti_manuf_desc); | 1393 | kfree (ti_manuf_desc); |
1381 | goto StayInBootMode; | 1394 | goto StayInBootMode; |
1382 | } | 1395 | } |
1383 | 1396 | ||
1384 | // Check for version 2 | 1397 | // Check for version 2 |
1385 | if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { | 1398 | if (!ignore_cpu_rev && TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev) < 2) { |
1386 | dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, | 1399 | dbg ("%s - Wrong CPU Rev %d (Must be 2)", __FUNCTION__, |
1387 | TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); | 1400 | TI_GET_CPU_REVISION(ti_manuf_desc->CpuRev_BoardRev)); |
1388 | kfree (ti_manuf_desc); | 1401 | kfree (ti_manuf_desc); |
1389 | goto StayInBootMode; | 1402 | goto StayInBootMode; |
1390 | } | 1403 | } |
1391 | 1404 | ||
1392 | kfree (ti_manuf_desc); | 1405 | kfree (ti_manuf_desc); |
1393 | 1406 | ||
1394 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. | 1407 | // In order to update the I2C firmware we must change the type 2 record to type 0xF2. |
1395 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver | 1408 | // This will force the UMP to come up in Boot Mode. Then while in boot mode, the driver |
1396 | // will download the latest firmware (padded to 15.5k) into the UMP ram. | 1409 | // will download the latest firmware (padded to 15.5k) into the UMP ram. |
1397 | // And finally when the device comes back up in download mode the driver will cause | 1410 | // And finally when the device comes back up in download mode the driver will cause |
1398 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update | 1411 | // the new firmware to be copied from the UMP Ram to I2C and the firmware will update |
1399 | // the record type from 0xf2 to 0x02. | 1412 | // the record type from 0xf2 to 0x02. |
1400 | 1413 | ||
1401 | /* | 1414 | /* |
1402 | * Do we really have to copy the whole firmware image, | 1415 | * Do we really have to copy the whole firmware image, |
1403 | * or could we do this in place! | 1416 | * or could we do this in place! |
1404 | */ | 1417 | */ |
1405 | 1418 | ||
1406 | // Allocate a 15.5k buffer + 3 byte header | 1419 | // Allocate a 15.5k buffer + 3 byte header |
1407 | buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header)); | 1420 | buffer_size = (((1024 * 16) - 512) + sizeof(struct ti_i2c_image_header)); |
1408 | buffer = kmalloc (buffer_size, GFP_KERNEL); | 1421 | buffer = kmalloc (buffer_size, GFP_KERNEL); |
1409 | if (!buffer) { | 1422 | if (!buffer) { |
1410 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); | 1423 | dev_err (dev, "%s - out of memory\n", __FUNCTION__); |
1411 | return -ENOMEM; | 1424 | return -ENOMEM; |
1412 | } | 1425 | } |
1413 | 1426 | ||
1414 | // Initialize the buffer to 0xff (pad the buffer) | 1427 | // Initialize the buffer to 0xff (pad the buffer) |
1415 | memset (buffer, 0xff, buffer_size); | 1428 | memset (buffer, 0xff, buffer_size); |
1416 | 1429 | ||
1417 | memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize); | 1430 | memcpy (buffer, &PagableOperationalCodeImage[0], PagableOperationalCodeSize); |
1418 | 1431 | ||
1419 | for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) { | 1432 | for(i = sizeof(struct ti_i2c_image_header); i < buffer_size; i++) { |
1420 | cs = (__u8)(cs + buffer[i]); | 1433 | cs = (__u8)(cs + buffer[i]); |
1421 | } | 1434 | } |
1422 | 1435 | ||
1423 | header = (struct ti_i2c_image_header *)buffer; | 1436 | header = (struct ti_i2c_image_header *)buffer; |
1424 | 1437 | ||
1425 | // update length and checksum after padding | 1438 | // update length and checksum after padding |
1426 | header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header))); | 1439 | header->Length = cpu_to_le16((__u16)(buffer_size - sizeof(struct ti_i2c_image_header))); |
1427 | header->CheckSum = cs; | 1440 | header->CheckSum = cs; |
1428 | 1441 | ||
1429 | // Download the operational code | 1442 | // Download the operational code |
1430 | dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__); | 1443 | dbg ("%s - Downloading operational code image (TI UMP)", __FUNCTION__); |
1431 | status = TIDownloadCodeImage (serial, buffer, buffer_size); | 1444 | status = TIDownloadCodeImage (serial, buffer, buffer_size); |
1432 | 1445 | ||
1433 | kfree (buffer); | 1446 | kfree (buffer); |
1434 | 1447 | ||
1435 | if (status) { | 1448 | if (status) { |
1436 | dbg ("%s - Error downloading operational code image", __FUNCTION__); | 1449 | dbg ("%s - Error downloading operational code image", __FUNCTION__); |
1437 | return status; | 1450 | return status; |
1438 | } | 1451 | } |
1439 | 1452 | ||
1440 | // Device will reboot | 1453 | // Device will reboot |
1441 | serial->product_info.TiMode = TI_MODE_TRANSITIONING; | 1454 | serial->product_info.TiMode = TI_MODE_TRANSITIONING; |
1442 | 1455 | ||
1443 | dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__); | 1456 | dbg ("%s - Download successful -- Device rebooting...", __FUNCTION__); |
1444 | 1457 | ||
1445 | /* return an error on purpose */ | 1458 | /* return an error on purpose */ |
1446 | return -ENODEV; | 1459 | return -ENODEV; |
1447 | } | 1460 | } |
1448 | 1461 | ||
1449 | StayInBootMode: | 1462 | StayInBootMode: |
1450 | // Eprom is invalid or blank stay in boot mode | 1463 | // Eprom is invalid or blank stay in boot mode |
1451 | dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__); | 1464 | dbg ("%s - <<<<<<<<<<<<<<<STAYING IN BOOT MODE>>>>>>>>>>>>", __FUNCTION__); |
1452 | serial->product_info.TiMode = TI_MODE_BOOT; | 1465 | serial->product_info.TiMode = TI_MODE_BOOT; |
1453 | 1466 | ||
1454 | return 0; | 1467 | return 0; |
1455 | } | 1468 | } |
1456 | 1469 | ||
1457 | 1470 | ||
1458 | static int TISetDtr (struct edgeport_port *port) | 1471 | static int TISetDtr (struct edgeport_port *port) |
1459 | { | 1472 | { |
1460 | int port_number = port->port->number - port->port->serial->minor; | 1473 | int port_number = port->port->number - port->port->serial->minor; |
1461 | 1474 | ||
1462 | dbg ("%s", __FUNCTION__); | 1475 | dbg ("%s", __FUNCTION__); |
1463 | port->shadow_mcr |= MCR_DTR; | 1476 | port->shadow_mcr |= MCR_DTR; |
1464 | 1477 | ||
1465 | return TIWriteCommandSync (port->port->serial->dev, | 1478 | return TIWriteCommandSync (port->port->serial->dev, |
1466 | UMPC_SET_CLR_DTR, | 1479 | UMPC_SET_CLR_DTR, |
1467 | (__u8)(UMPM_UART1_PORT + port_number), | 1480 | (__u8)(UMPM_UART1_PORT + port_number), |
1468 | 1, /* set */ | 1481 | 1, /* set */ |
1469 | NULL, | 1482 | NULL, |
1470 | 0); | 1483 | 0); |
1471 | } | 1484 | } |
1472 | 1485 | ||
1473 | static int TIClearDtr (struct edgeport_port *port) | 1486 | static int TIClearDtr (struct edgeport_port *port) |
1474 | { | 1487 | { |
1475 | int port_number = port->port->number - port->port->serial->minor; | 1488 | int port_number = port->port->number - port->port->serial->minor; |
1476 | 1489 | ||
1477 | dbg ("%s", __FUNCTION__); | 1490 | dbg ("%s", __FUNCTION__); |
1478 | port->shadow_mcr &= ~MCR_DTR; | 1491 | port->shadow_mcr &= ~MCR_DTR; |
1479 | 1492 | ||
1480 | return TIWriteCommandSync (port->port->serial->dev, | 1493 | return TIWriteCommandSync (port->port->serial->dev, |
1481 | UMPC_SET_CLR_DTR, | 1494 | UMPC_SET_CLR_DTR, |
1482 | (__u8)(UMPM_UART1_PORT + port_number), | 1495 | (__u8)(UMPM_UART1_PORT + port_number), |
1483 | 0, /* clear */ | 1496 | 0, /* clear */ |
1484 | NULL, | 1497 | NULL, |
1485 | 0); | 1498 | 0); |
1486 | } | 1499 | } |
1487 | 1500 | ||
1488 | static int TISetRts (struct edgeport_port *port) | 1501 | static int TISetRts (struct edgeport_port *port) |
1489 | { | 1502 | { |
1490 | int port_number = port->port->number - port->port->serial->minor; | 1503 | int port_number = port->port->number - port->port->serial->minor; |
1491 | 1504 | ||
1492 | dbg ("%s", __FUNCTION__); | 1505 | dbg ("%s", __FUNCTION__); |
1493 | port->shadow_mcr |= MCR_RTS; | 1506 | port->shadow_mcr |= MCR_RTS; |
1494 | 1507 | ||
1495 | return TIWriteCommandSync (port->port->serial->dev, | 1508 | return TIWriteCommandSync (port->port->serial->dev, |
1496 | UMPC_SET_CLR_RTS, | 1509 | UMPC_SET_CLR_RTS, |
1497 | (__u8)(UMPM_UART1_PORT + port_number), | 1510 | (__u8)(UMPM_UART1_PORT + port_number), |
1498 | 1, /* set */ | 1511 | 1, /* set */ |
1499 | NULL, | 1512 | NULL, |
1500 | 0); | 1513 | 0); |
1501 | } | 1514 | } |
1502 | 1515 | ||
1503 | static int TIClearRts (struct edgeport_port *port) | 1516 | static int TIClearRts (struct edgeport_port *port) |
1504 | { | 1517 | { |
1505 | int port_number = port->port->number - port->port->serial->minor; | 1518 | int port_number = port->port->number - port->port->serial->minor; |
1506 | 1519 | ||
1507 | dbg ("%s", __FUNCTION__); | 1520 | dbg ("%s", __FUNCTION__); |
1508 | port->shadow_mcr &= ~MCR_RTS; | 1521 | port->shadow_mcr &= ~MCR_RTS; |
1509 | 1522 | ||
1510 | return TIWriteCommandSync (port->port->serial->dev, | 1523 | return TIWriteCommandSync (port->port->serial->dev, |
1511 | UMPC_SET_CLR_RTS, | 1524 | UMPC_SET_CLR_RTS, |
1512 | (__u8)(UMPM_UART1_PORT + port_number), | 1525 | (__u8)(UMPM_UART1_PORT + port_number), |
1513 | 0, /* clear */ | 1526 | 0, /* clear */ |
1514 | NULL, | 1527 | NULL, |
1515 | 0); | 1528 | 0); |
1516 | } | 1529 | } |
1517 | 1530 | ||
1518 | static int TISetLoopBack (struct edgeport_port *port) | 1531 | static int TISetLoopBack (struct edgeport_port *port) |
1519 | { | 1532 | { |
1520 | int port_number = port->port->number - port->port->serial->minor; | 1533 | int port_number = port->port->number - port->port->serial->minor; |
1521 | 1534 | ||
1522 | dbg ("%s", __FUNCTION__); | 1535 | dbg ("%s", __FUNCTION__); |
1523 | 1536 | ||
1524 | return TIWriteCommandSync (port->port->serial->dev, | 1537 | return TIWriteCommandSync (port->port->serial->dev, |
1525 | UMPC_SET_CLR_LOOPBACK, | 1538 | UMPC_SET_CLR_LOOPBACK, |
1526 | (__u8)(UMPM_UART1_PORT + port_number), | 1539 | (__u8)(UMPM_UART1_PORT + port_number), |
1527 | 1, /* set */ | 1540 | 1, /* set */ |
1528 | NULL, | 1541 | NULL, |
1529 | 0); | 1542 | 0); |
1530 | } | 1543 | } |
1531 | 1544 | ||
1532 | static int TIClearLoopBack (struct edgeport_port *port) | 1545 | static int TIClearLoopBack (struct edgeport_port *port) |
1533 | { | 1546 | { |
1534 | int port_number = port->port->number - port->port->serial->minor; | 1547 | int port_number = port->port->number - port->port->serial->minor; |
1535 | 1548 | ||
1536 | dbg ("%s", __FUNCTION__); | 1549 | dbg ("%s", __FUNCTION__); |
1537 | 1550 | ||
1538 | return TIWriteCommandSync (port->port->serial->dev, | 1551 | return TIWriteCommandSync (port->port->serial->dev, |
1539 | UMPC_SET_CLR_LOOPBACK, | 1552 | UMPC_SET_CLR_LOOPBACK, |
1540 | (__u8)(UMPM_UART1_PORT + port_number), | 1553 | (__u8)(UMPM_UART1_PORT + port_number), |
1541 | 0, /* clear */ | 1554 | 0, /* clear */ |
1542 | NULL, | 1555 | NULL, |
1543 | 0); | 1556 | 0); |
1544 | } | 1557 | } |
1545 | 1558 | ||
1546 | static int TISetBreak (struct edgeport_port *port) | 1559 | static int TISetBreak (struct edgeport_port *port) |
1547 | { | 1560 | { |
1548 | int port_number = port->port->number - port->port->serial->minor; | 1561 | int port_number = port->port->number - port->port->serial->minor; |
1549 | 1562 | ||
1550 | dbg ("%s", __FUNCTION__); | 1563 | dbg ("%s", __FUNCTION__); |
1551 | 1564 | ||
1552 | return TIWriteCommandSync (port->port->serial->dev, | 1565 | return TIWriteCommandSync (port->port->serial->dev, |
1553 | UMPC_SET_CLR_BREAK, | 1566 | UMPC_SET_CLR_BREAK, |
1554 | (__u8)(UMPM_UART1_PORT + port_number), | 1567 | (__u8)(UMPM_UART1_PORT + port_number), |
1555 | 1, /* set */ | 1568 | 1, /* set */ |
1556 | NULL, | 1569 | NULL, |
1557 | 0); | 1570 | 0); |
1558 | } | 1571 | } |
1559 | 1572 | ||
1560 | static int TIClearBreak (struct edgeport_port *port) | 1573 | static int TIClearBreak (struct edgeport_port *port) |
1561 | { | 1574 | { |
1562 | int port_number = port->port->number - port->port->serial->minor; | 1575 | int port_number = port->port->number - port->port->serial->minor; |
1563 | 1576 | ||
1564 | dbg ("%s", __FUNCTION__); | 1577 | dbg ("%s", __FUNCTION__); |
1565 | 1578 | ||
1566 | return TIWriteCommandSync (port->port->serial->dev, | 1579 | return TIWriteCommandSync (port->port->serial->dev, |
1567 | UMPC_SET_CLR_BREAK, | 1580 | UMPC_SET_CLR_BREAK, |
1568 | (__u8)(UMPM_UART1_PORT + port_number), | 1581 | (__u8)(UMPM_UART1_PORT + port_number), |
1569 | 0, /* clear */ | 1582 | 0, /* clear */ |
1570 | NULL, | 1583 | NULL, |
1571 | 0); | 1584 | 0); |
1572 | } | 1585 | } |
1573 | 1586 | ||
1574 | static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr) | 1587 | static int TIRestoreMCR (struct edgeport_port *port, __u8 mcr) |
1575 | { | 1588 | { |
1576 | int status = 0; | 1589 | int status = 0; |
1577 | 1590 | ||
1578 | dbg ("%s - %x", __FUNCTION__, mcr); | 1591 | dbg ("%s - %x", __FUNCTION__, mcr); |
1579 | 1592 | ||
1580 | if (mcr & MCR_DTR) | 1593 | if (mcr & MCR_DTR) |
1581 | status = TISetDtr (port); | 1594 | status = TISetDtr (port); |
1582 | else | 1595 | else |
1583 | status = TIClearDtr (port); | 1596 | status = TIClearDtr (port); |
1584 | 1597 | ||
1585 | if (status) | 1598 | if (status) |
1586 | return status; | 1599 | return status; |
1587 | 1600 | ||
1588 | if (mcr & MCR_RTS) | 1601 | if (mcr & MCR_RTS) |
1589 | status = TISetRts (port); | 1602 | status = TISetRts (port); |
1590 | else | 1603 | else |
1591 | status = TIClearRts (port); | 1604 | status = TIClearRts (port); |
1592 | 1605 | ||
1593 | if (status) | 1606 | if (status) |
1594 | return status; | 1607 | return status; |
1595 | 1608 | ||
1596 | if (mcr & MCR_LOOPBACK) | 1609 | if (mcr & MCR_LOOPBACK) |
1597 | status = TISetLoopBack (port); | 1610 | status = TISetLoopBack (port); |
1598 | else | 1611 | else |
1599 | status = TIClearLoopBack (port); | 1612 | status = TIClearLoopBack (port); |
1600 | 1613 | ||
1601 | return status; | 1614 | return status; |
1602 | } | 1615 | } |
1603 | 1616 | ||
1604 | 1617 | ||
1605 | 1618 | ||
1606 | /* Convert TI LSR to standard UART flags */ | 1619 | /* Convert TI LSR to standard UART flags */ |
1607 | static __u8 MapLineStatus (__u8 ti_lsr) | 1620 | static __u8 MapLineStatus (__u8 ti_lsr) |
1608 | { | 1621 | { |
1609 | __u8 lsr = 0; | 1622 | __u8 lsr = 0; |
1610 | 1623 | ||
1611 | #define MAP_FLAG(flagUmp, flagUart) \ | 1624 | #define MAP_FLAG(flagUmp, flagUart) \ |
1612 | if (ti_lsr & flagUmp) \ | 1625 | if (ti_lsr & flagUmp) \ |
1613 | lsr |= flagUart; | 1626 | lsr |= flagUart; |
1614 | 1627 | ||
1615 | MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */ | 1628 | MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR) /* overrun */ |
1616 | MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */ | 1629 | MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR) /* parity error */ |
1617 | MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */ | 1630 | MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR) /* framing error */ |
1618 | MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */ | 1631 | MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK) /* break detected */ |
1619 | MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */ | 1632 | MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL) /* receive data available */ |
1620 | MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */ | 1633 | MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY) /* transmit holding register empty */ |
1621 | 1634 | ||
1622 | #undef MAP_FLAG | 1635 | #undef MAP_FLAG |
1623 | 1636 | ||
1624 | return lsr; | 1637 | return lsr; |
1625 | } | 1638 | } |
1626 | 1639 | ||
1627 | static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr) | 1640 | static void handle_new_msr (struct edgeport_port *edge_port, __u8 msr) |
1628 | { | 1641 | { |
1629 | struct async_icount *icount; | 1642 | struct async_icount *icount; |
1630 | struct tty_struct *tty; | 1643 | struct tty_struct *tty; |
1631 | 1644 | ||
1632 | dbg ("%s - %02x", __FUNCTION__, msr); | 1645 | dbg ("%s - %02x", __FUNCTION__, msr); |
1633 | 1646 | ||
1634 | if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) { | 1647 | if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR | EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) { |
1635 | icount = &edge_port->icount; | 1648 | icount = &edge_port->icount; |
1636 | 1649 | ||
1637 | /* update input line counters */ | 1650 | /* update input line counters */ |
1638 | if (msr & EDGEPORT_MSR_DELTA_CTS) | 1651 | if (msr & EDGEPORT_MSR_DELTA_CTS) |
1639 | icount->cts++; | 1652 | icount->cts++; |
1640 | if (msr & EDGEPORT_MSR_DELTA_DSR) | 1653 | if (msr & EDGEPORT_MSR_DELTA_DSR) |
1641 | icount->dsr++; | 1654 | icount->dsr++; |
1642 | if (msr & EDGEPORT_MSR_DELTA_CD) | 1655 | if (msr & EDGEPORT_MSR_DELTA_CD) |
1643 | icount->dcd++; | 1656 | icount->dcd++; |
1644 | if (msr & EDGEPORT_MSR_DELTA_RI) | 1657 | if (msr & EDGEPORT_MSR_DELTA_RI) |
1645 | icount->rng++; | 1658 | icount->rng++; |
1646 | wake_up_interruptible (&edge_port->delta_msr_wait); | 1659 | wake_up_interruptible (&edge_port->delta_msr_wait); |
1647 | } | 1660 | } |
1648 | 1661 | ||
1649 | /* Save the new modem status */ | 1662 | /* Save the new modem status */ |
1650 | edge_port->shadow_msr = msr & 0xf0; | 1663 | edge_port->shadow_msr = msr & 0xf0; |
1651 | 1664 | ||
1652 | tty = edge_port->port->tty; | 1665 | tty = edge_port->port->tty; |
1653 | /* handle CTS flow control */ | 1666 | /* handle CTS flow control */ |
1654 | if (tty && C_CRTSCTS(tty)) { | 1667 | if (tty && C_CRTSCTS(tty)) { |
1655 | if (msr & EDGEPORT_MSR_CTS) { | 1668 | if (msr & EDGEPORT_MSR_CTS) { |
1656 | tty->hw_stopped = 0; | 1669 | tty->hw_stopped = 0; |
1657 | tty_wakeup(tty); | 1670 | tty_wakeup(tty); |
1658 | } else { | 1671 | } else { |
1659 | tty->hw_stopped = 1; | 1672 | tty->hw_stopped = 1; |
1660 | } | 1673 | } |
1661 | } | 1674 | } |
1662 | 1675 | ||
1663 | return; | 1676 | return; |
1664 | } | 1677 | } |
1665 | 1678 | ||
1666 | static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data) | 1679 | static void handle_new_lsr (struct edgeport_port *edge_port, int lsr_data, __u8 lsr, __u8 data) |
1667 | { | 1680 | { |
1668 | struct async_icount *icount; | 1681 | struct async_icount *icount; |
1669 | __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK)); | 1682 | __u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR | LSR_FRM_ERR | LSR_BREAK)); |
1670 | 1683 | ||
1671 | dbg ("%s - %02x", __FUNCTION__, new_lsr); | 1684 | dbg ("%s - %02x", __FUNCTION__, new_lsr); |
1672 | 1685 | ||
1673 | edge_port->shadow_lsr = lsr; | 1686 | edge_port->shadow_lsr = lsr; |
1674 | 1687 | ||
1675 | if (new_lsr & LSR_BREAK) { | 1688 | if (new_lsr & LSR_BREAK) { |
1676 | /* | 1689 | /* |
1677 | * Parity and Framing errors only count if they | 1690 | * Parity and Framing errors only count if they |
1678 | * occur exclusive of a break being received. | 1691 | * occur exclusive of a break being received. |
1679 | */ | 1692 | */ |
1680 | new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); | 1693 | new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK); |
1681 | } | 1694 | } |
1682 | 1695 | ||
1683 | /* Place LSR data byte into Rx buffer */ | 1696 | /* Place LSR data byte into Rx buffer */ |
1684 | if (lsr_data && edge_port->port->tty) | 1697 | if (lsr_data && edge_port->port->tty) |
1685 | edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1); | 1698 | edge_tty_recv(&edge_port->port->dev, edge_port->port->tty, &data, 1); |
1686 | 1699 | ||
1687 | /* update input line counters */ | 1700 | /* update input line counters */ |
1688 | icount = &edge_port->icount; | 1701 | icount = &edge_port->icount; |
1689 | if (new_lsr & LSR_BREAK) | 1702 | if (new_lsr & LSR_BREAK) |
1690 | icount->brk++; | 1703 | icount->brk++; |
1691 | if (new_lsr & LSR_OVER_ERR) | 1704 | if (new_lsr & LSR_OVER_ERR) |
1692 | icount->overrun++; | 1705 | icount->overrun++; |
1693 | if (new_lsr & LSR_PAR_ERR) | 1706 | if (new_lsr & LSR_PAR_ERR) |
1694 | icount->parity++; | 1707 | icount->parity++; |
1695 | if (new_lsr & LSR_FRM_ERR) | 1708 | if (new_lsr & LSR_FRM_ERR) |
1696 | icount->frame++; | 1709 | icount->frame++; |
1697 | } | 1710 | } |
1698 | 1711 | ||
1699 | 1712 | ||
1700 | static void edge_interrupt_callback (struct urb *urb) | 1713 | static void edge_interrupt_callback (struct urb *urb) |
1701 | { | 1714 | { |
1702 | struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context; | 1715 | struct edgeport_serial *edge_serial = (struct edgeport_serial *)urb->context; |
1703 | struct usb_serial_port *port; | 1716 | struct usb_serial_port *port; |
1704 | struct edgeport_port *edge_port; | 1717 | struct edgeport_port *edge_port; |
1705 | unsigned char *data = urb->transfer_buffer; | 1718 | unsigned char *data = urb->transfer_buffer; |
1706 | int length = urb->actual_length; | 1719 | int length = urb->actual_length; |
1707 | int port_number; | 1720 | int port_number; |
1708 | int function; | 1721 | int function; |
1709 | int status; | 1722 | int status; |
1710 | __u8 lsr; | 1723 | __u8 lsr; |
1711 | __u8 msr; | 1724 | __u8 msr; |
1712 | 1725 | ||
1713 | dbg("%s", __FUNCTION__); | 1726 | dbg("%s", __FUNCTION__); |
1714 | 1727 | ||
1715 | switch (urb->status) { | 1728 | switch (urb->status) { |
1716 | case 0: | 1729 | case 0: |
1717 | /* success */ | 1730 | /* success */ |
1718 | break; | 1731 | break; |
1719 | case -ECONNRESET: | 1732 | case -ECONNRESET: |
1720 | case -ENOENT: | 1733 | case -ENOENT: |
1721 | case -ESHUTDOWN: | 1734 | case -ESHUTDOWN: |
1722 | /* this urb is terminated, clean up */ | 1735 | /* this urb is terminated, clean up */ |
1723 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 1736 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); |
1724 | return; | 1737 | return; |
1725 | default: | 1738 | default: |
1726 | dev_err(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __FUNCTION__, urb->status); | 1739 | dev_err(&urb->dev->dev, "%s - nonzero urb status received: %d\n", __FUNCTION__, urb->status); |
1727 | goto exit; | 1740 | goto exit; |
1728 | } | 1741 | } |
1729 | 1742 | ||
1730 | if (!length) { | 1743 | if (!length) { |
1731 | dbg ("%s - no data in urb", __FUNCTION__); | 1744 | dbg ("%s - no data in urb", __FUNCTION__); |
1732 | goto exit; | 1745 | goto exit; |
1733 | } | 1746 | } |
1734 | 1747 | ||
1735 | usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data); | 1748 | usb_serial_debug_data(debug, &edge_serial->serial->dev->dev, __FUNCTION__, length, data); |
1736 | 1749 | ||
1737 | if (length != 2) { | 1750 | if (length != 2) { |
1738 | dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length); | 1751 | dbg ("%s - expecting packet of size 2, got %d", __FUNCTION__, length); |
1739 | goto exit; | 1752 | goto exit; |
1740 | } | 1753 | } |
1741 | 1754 | ||
1742 | port_number = TIUMP_GET_PORT_FROM_CODE (data[0]); | 1755 | port_number = TIUMP_GET_PORT_FROM_CODE (data[0]); |
1743 | function = TIUMP_GET_FUNC_FROM_CODE (data[0]); | 1756 | function = TIUMP_GET_FUNC_FROM_CODE (data[0]); |
1744 | dbg ("%s - port_number %d, function %d, info 0x%x", | 1757 | dbg ("%s - port_number %d, function %d, info 0x%x", |
1745 | __FUNCTION__, port_number, function, data[1]); | 1758 | __FUNCTION__, port_number, function, data[1]); |
1746 | port = edge_serial->serial->port[port_number]; | 1759 | port = edge_serial->serial->port[port_number]; |
1747 | edge_port = usb_get_serial_port_data(port); | 1760 | edge_port = usb_get_serial_port_data(port); |
1748 | if (!edge_port) { | 1761 | if (!edge_port) { |
1749 | dbg ("%s - edge_port not found", __FUNCTION__); | 1762 | dbg ("%s - edge_port not found", __FUNCTION__); |
1750 | return; | 1763 | return; |
1751 | } | 1764 | } |
1752 | switch (function) { | 1765 | switch (function) { |
1753 | case TIUMP_INTERRUPT_CODE_LSR: | 1766 | case TIUMP_INTERRUPT_CODE_LSR: |
1754 | lsr = MapLineStatus(data[1]); | 1767 | lsr = MapLineStatus(data[1]); |
1755 | if (lsr & UMP_UART_LSR_DATA_MASK) { | 1768 | if (lsr & UMP_UART_LSR_DATA_MASK) { |
1756 | /* Save the LSR event for bulk read completion routine */ | 1769 | /* Save the LSR event for bulk read completion routine */ |
1757 | dbg ("%s - LSR Event Port %u LSR Status = %02x", | 1770 | dbg ("%s - LSR Event Port %u LSR Status = %02x", |
1758 | __FUNCTION__, port_number, lsr); | 1771 | __FUNCTION__, port_number, lsr); |
1759 | edge_port->lsr_event = 1; | 1772 | edge_port->lsr_event = 1; |
1760 | edge_port->lsr_mask = lsr; | 1773 | edge_port->lsr_mask = lsr; |
1761 | } else { | 1774 | } else { |
1762 | dbg ("%s - ===== Port %d LSR Status = %02x ======", | 1775 | dbg ("%s - ===== Port %d LSR Status = %02x ======", |
1763 | __FUNCTION__, port_number, lsr); | 1776 | __FUNCTION__, port_number, lsr); |
1764 | handle_new_lsr (edge_port, 0, lsr, 0); | 1777 | handle_new_lsr (edge_port, 0, lsr, 0); |
1765 | } | 1778 | } |
1766 | break; | 1779 | break; |
1767 | 1780 | ||
1768 | case TIUMP_INTERRUPT_CODE_MSR: // MSR | 1781 | case TIUMP_INTERRUPT_CODE_MSR: // MSR |
1769 | /* Copy MSR from UMP */ | 1782 | /* Copy MSR from UMP */ |
1770 | msr = data[1]; | 1783 | msr = data[1]; |
1771 | dbg ("%s - ===== Port %u MSR Status = %02x ======\n", | 1784 | dbg ("%s - ===== Port %u MSR Status = %02x ======\n", |
1772 | __FUNCTION__, port_number, msr); | 1785 | __FUNCTION__, port_number, msr); |
1773 | handle_new_msr (edge_port, msr); | 1786 | handle_new_msr (edge_port, msr); |
1774 | break; | 1787 | break; |
1775 | 1788 | ||
1776 | default: | 1789 | default: |
1777 | dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n", | 1790 | dev_err (&urb->dev->dev, "%s - Unknown Interrupt code from UMP %x\n", |
1778 | __FUNCTION__, data[1]); | 1791 | __FUNCTION__, data[1]); |
1779 | break; | 1792 | break; |
1780 | 1793 | ||
1781 | } | 1794 | } |
1782 | 1795 | ||
1783 | exit: | 1796 | exit: |
1784 | status = usb_submit_urb (urb, GFP_ATOMIC); | 1797 | status = usb_submit_urb (urb, GFP_ATOMIC); |
1785 | if (status) | 1798 | if (status) |
1786 | dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", | 1799 | dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", |
1787 | __FUNCTION__, status); | 1800 | __FUNCTION__, status); |
1788 | } | 1801 | } |
1789 | 1802 | ||
1790 | static void edge_bulk_in_callback (struct urb *urb) | 1803 | static void edge_bulk_in_callback (struct urb *urb) |
1791 | { | 1804 | { |
1792 | struct edgeport_port *edge_port = (struct edgeport_port *)urb->context; | 1805 | struct edgeport_port *edge_port = (struct edgeport_port *)urb->context; |
1793 | unsigned char *data = urb->transfer_buffer; | 1806 | unsigned char *data = urb->transfer_buffer; |
1794 | struct tty_struct *tty; | 1807 | struct tty_struct *tty; |
1795 | int status = 0; | 1808 | int status = 0; |
1796 | int port_number; | 1809 | int port_number; |
1797 | 1810 | ||
1798 | dbg("%s", __FUNCTION__); | 1811 | dbg("%s", __FUNCTION__); |
1799 | 1812 | ||
1800 | switch (urb->status) { | 1813 | switch (urb->status) { |
1801 | case 0: | 1814 | case 0: |
1802 | /* success */ | 1815 | /* success */ |
1803 | break; | 1816 | break; |
1804 | case -ECONNRESET: | 1817 | case -ECONNRESET: |
1805 | case -ENOENT: | 1818 | case -ENOENT: |
1806 | case -ESHUTDOWN: | 1819 | case -ESHUTDOWN: |
1807 | /* this urb is terminated, clean up */ | 1820 | /* this urb is terminated, clean up */ |
1808 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 1821 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); |
1809 | return; | 1822 | return; |
1810 | default: | 1823 | default: |
1811 | dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n", | 1824 | dev_err (&urb->dev->dev,"%s - nonzero read bulk status received: %d\n", |
1812 | __FUNCTION__, urb->status ); | 1825 | __FUNCTION__, urb->status ); |
1813 | } | 1826 | } |
1814 | 1827 | ||
1815 | if (urb->status == -EPIPE) | 1828 | if (urb->status == -EPIPE) |
1816 | goto exit; | 1829 | goto exit; |
1817 | 1830 | ||
1818 | if (urb->status) { | 1831 | if (urb->status) { |
1819 | dev_err(&urb->dev->dev,"%s - stopping read!\n", __FUNCTION__); | 1832 | dev_err(&urb->dev->dev,"%s - stopping read!\n", __FUNCTION__); |
1820 | return; | 1833 | return; |
1821 | } | 1834 | } |
1822 | 1835 | ||
1823 | port_number = edge_port->port->number - edge_port->port->serial->minor; | 1836 | port_number = edge_port->port->number - edge_port->port->serial->minor; |
1824 | 1837 | ||
1825 | if (edge_port->lsr_event) { | 1838 | if (edge_port->lsr_event) { |
1826 | edge_port->lsr_event = 0; | 1839 | edge_port->lsr_event = 0; |
1827 | dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======", | 1840 | dbg ("%s ===== Port %u LSR Status = %02x, Data = %02x ======", |
1828 | __FUNCTION__, port_number, edge_port->lsr_mask, *data); | 1841 | __FUNCTION__, port_number, edge_port->lsr_mask, *data); |
1829 | handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data); | 1842 | handle_new_lsr (edge_port, 1, edge_port->lsr_mask, *data); |
1830 | /* Adjust buffer length/pointer */ | 1843 | /* Adjust buffer length/pointer */ |
1831 | --urb->actual_length; | 1844 | --urb->actual_length; |
1832 | ++data; | 1845 | ++data; |
1833 | } | 1846 | } |
1834 | 1847 | ||
1835 | tty = edge_port->port->tty; | 1848 | tty = edge_port->port->tty; |
1836 | if (tty && urb->actual_length) { | 1849 | if (tty && urb->actual_length) { |
1837 | usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, urb->actual_length, data); | 1850 | usb_serial_debug_data(debug, &edge_port->port->dev, __FUNCTION__, urb->actual_length, data); |
1838 | 1851 | ||
1839 | if (edge_port->close_pending) { | 1852 | if (edge_port->close_pending) { |
1840 | dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__); | 1853 | dbg ("%s - close is pending, dropping data on the floor.", __FUNCTION__); |
1841 | } else { | 1854 | } else { |
1842 | edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length); | 1855 | edge_tty_recv(&edge_port->port->dev, tty, data, urb->actual_length); |
1843 | } | 1856 | } |
1844 | edge_port->icount.rx += urb->actual_length; | 1857 | edge_port->icount.rx += urb->actual_length; |
1845 | } | 1858 | } |
1846 | 1859 | ||
1847 | exit: | 1860 | exit: |
1848 | /* continue read unless stopped */ | 1861 | /* continue read unless stopped */ |
1849 | spin_lock(&edge_port->ep_lock); | 1862 | spin_lock(&edge_port->ep_lock); |
1850 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) { | 1863 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) { |
1851 | urb->dev = edge_port->port->serial->dev; | 1864 | urb->dev = edge_port->port->serial->dev; |
1852 | status = usb_submit_urb(urb, GFP_ATOMIC); | 1865 | status = usb_submit_urb(urb, GFP_ATOMIC); |
1853 | } else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING) { | 1866 | } else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING) { |
1854 | edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED; | 1867 | edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED; |
1855 | } | 1868 | } |
1856 | spin_unlock(&edge_port->ep_lock); | 1869 | spin_unlock(&edge_port->ep_lock); |
1857 | if (status) | 1870 | if (status) |
1858 | dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", | 1871 | dev_err (&urb->dev->dev, "%s - usb_submit_urb failed with result %d\n", |
1859 | __FUNCTION__, status); | 1872 | __FUNCTION__, status); |
1860 | } | 1873 | } |
1861 | 1874 | ||
1862 | static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length) | 1875 | static void edge_tty_recv(struct device *dev, struct tty_struct *tty, unsigned char *data, int length) |
1863 | { | 1876 | { |
1864 | int cnt; | 1877 | int cnt; |
1865 | 1878 | ||
1866 | do { | 1879 | do { |
1867 | cnt = tty_buffer_request_room(tty, length); | 1880 | cnt = tty_buffer_request_room(tty, length); |
1868 | if (cnt < length) { | 1881 | if (cnt < length) { |
1869 | dev_err(dev, "%s - dropping data, %d bytes lost\n", | 1882 | dev_err(dev, "%s - dropping data, %d bytes lost\n", |
1870 | __FUNCTION__, length - cnt); | 1883 | __FUNCTION__, length - cnt); |
1871 | if(cnt == 0) | 1884 | if(cnt == 0) |
1872 | break; | 1885 | break; |
1873 | } | 1886 | } |
1874 | tty_insert_flip_string(tty, data, cnt); | 1887 | tty_insert_flip_string(tty, data, cnt); |
1875 | data += cnt; | 1888 | data += cnt; |
1876 | length -= cnt; | 1889 | length -= cnt; |
1877 | } while (length > 0); | 1890 | } while (length > 0); |
1878 | 1891 | ||
1879 | tty_flip_buffer_push(tty); | 1892 | tty_flip_buffer_push(tty); |
1880 | } | 1893 | } |
1881 | 1894 | ||
1882 | static void edge_bulk_out_callback (struct urb *urb) | 1895 | static void edge_bulk_out_callback (struct urb *urb) |
1883 | { | 1896 | { |
1884 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; | 1897 | struct usb_serial_port *port = (struct usb_serial_port *)urb->context; |
1885 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 1898 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
1886 | 1899 | ||
1887 | dbg ("%s - port %d", __FUNCTION__, port->number); | 1900 | dbg ("%s - port %d", __FUNCTION__, port->number); |
1888 | 1901 | ||
1889 | edge_port->ep_write_urb_in_use = 0; | 1902 | edge_port->ep_write_urb_in_use = 0; |
1890 | 1903 | ||
1891 | switch (urb->status) { | 1904 | switch (urb->status) { |
1892 | case 0: | 1905 | case 0: |
1893 | /* success */ | 1906 | /* success */ |
1894 | break; | 1907 | break; |
1895 | case -ECONNRESET: | 1908 | case -ECONNRESET: |
1896 | case -ENOENT: | 1909 | case -ENOENT: |
1897 | case -ESHUTDOWN: | 1910 | case -ESHUTDOWN: |
1898 | /* this urb is terminated, clean up */ | 1911 | /* this urb is terminated, clean up */ |
1899 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); | 1912 | dbg("%s - urb shutting down with status: %d", __FUNCTION__, urb->status); |
1900 | return; | 1913 | return; |
1901 | default: | 1914 | default: |
1902 | dev_err (&urb->dev->dev,"%s - nonzero write bulk status received: %d\n", | 1915 | dev_err (&urb->dev->dev,"%s - nonzero write bulk status received: %d\n", |
1903 | __FUNCTION__, urb->status); | 1916 | __FUNCTION__, urb->status); |
1904 | } | 1917 | } |
1905 | 1918 | ||
1906 | /* send any buffered data */ | 1919 | /* send any buffered data */ |
1907 | edge_send(port); | 1920 | edge_send(port); |
1908 | } | 1921 | } |
1909 | 1922 | ||
1910 | static int edge_open (struct usb_serial_port *port, struct file * filp) | 1923 | static int edge_open (struct usb_serial_port *port, struct file * filp) |
1911 | { | 1924 | { |
1912 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 1925 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
1913 | struct edgeport_serial *edge_serial; | 1926 | struct edgeport_serial *edge_serial; |
1914 | struct usb_device *dev; | 1927 | struct usb_device *dev; |
1915 | struct urb *urb; | 1928 | struct urb *urb; |
1916 | int port_number; | 1929 | int port_number; |
1917 | int status; | 1930 | int status; |
1918 | u16 open_settings; | 1931 | u16 open_settings; |
1919 | u8 transaction_timeout; | 1932 | u8 transaction_timeout; |
1920 | 1933 | ||
1921 | dbg("%s - port %d", __FUNCTION__, port->number); | 1934 | dbg("%s - port %d", __FUNCTION__, port->number); |
1922 | 1935 | ||
1923 | if (edge_port == NULL) | 1936 | if (edge_port == NULL) |
1924 | return -ENODEV; | 1937 | return -ENODEV; |
1925 | 1938 | ||
1926 | if (port->tty) | 1939 | if (port->tty) |
1927 | port->tty->low_latency = low_latency; | 1940 | port->tty->low_latency = low_latency; |
1928 | 1941 | ||
1929 | port_number = port->number - port->serial->minor; | 1942 | port_number = port->number - port->serial->minor; |
1930 | switch (port_number) { | 1943 | switch (port_number) { |
1931 | case 0: | 1944 | case 0: |
1932 | edge_port->uart_base = UMPMEM_BASE_UART1; | 1945 | edge_port->uart_base = UMPMEM_BASE_UART1; |
1933 | edge_port->dma_address = UMPD_OEDB1_ADDRESS; | 1946 | edge_port->dma_address = UMPD_OEDB1_ADDRESS; |
1934 | break; | 1947 | break; |
1935 | case 1: | 1948 | case 1: |
1936 | edge_port->uart_base = UMPMEM_BASE_UART2; | 1949 | edge_port->uart_base = UMPMEM_BASE_UART2; |
1937 | edge_port->dma_address = UMPD_OEDB2_ADDRESS; | 1950 | edge_port->dma_address = UMPD_OEDB2_ADDRESS; |
1938 | break; | 1951 | break; |
1939 | default: | 1952 | default: |
1940 | dev_err (&port->dev, "Unknown port number!!!\n"); | 1953 | dev_err (&port->dev, "Unknown port number!!!\n"); |
1941 | return -ENODEV; | 1954 | return -ENODEV; |
1942 | } | 1955 | } |
1943 | 1956 | ||
1944 | dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x", | 1957 | dbg ("%s - port_number = %d, uart_base = %04x, dma_address = %04x", |
1945 | __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address); | 1958 | __FUNCTION__, port_number, edge_port->uart_base, edge_port->dma_address); |
1946 | 1959 | ||
1947 | dev = port->serial->dev; | 1960 | dev = port->serial->dev; |
1948 | 1961 | ||
1949 | memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount)); | 1962 | memset (&(edge_port->icount), 0x00, sizeof(edge_port->icount)); |
1950 | init_waitqueue_head (&edge_port->delta_msr_wait); | 1963 | init_waitqueue_head (&edge_port->delta_msr_wait); |
1951 | 1964 | ||
1952 | /* turn off loopback */ | 1965 | /* turn off loopback */ |
1953 | status = TIClearLoopBack (edge_port); | 1966 | status = TIClearLoopBack (edge_port); |
1954 | if (status) { | 1967 | if (status) { |
1955 | dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n", | 1968 | dev_err(&port->dev,"%s - cannot send clear loopback command, %d\n", |
1956 | __FUNCTION__, status); | 1969 | __FUNCTION__, status); |
1957 | return status; | 1970 | return status; |
1958 | } | 1971 | } |
1959 | 1972 | ||
1960 | /* set up the port settings */ | 1973 | /* set up the port settings */ |
1961 | edge_set_termios (port, NULL); | 1974 | edge_set_termios (port, NULL); |
1962 | 1975 | ||
1963 | /* open up the port */ | 1976 | /* open up the port */ |
1964 | 1977 | ||
1965 | /* milliseconds to timeout for DMA transfer */ | 1978 | /* milliseconds to timeout for DMA transfer */ |
1966 | transaction_timeout = 2; | 1979 | transaction_timeout = 2; |
1967 | 1980 | ||
1968 | edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) ); | 1981 | edge_port->ump_read_timeout = max (20, ((transaction_timeout * 3) / 2) ); |
1969 | 1982 | ||
1970 | // milliseconds to timeout for DMA transfer | 1983 | // milliseconds to timeout for DMA transfer |
1971 | open_settings = (u8)(UMP_DMA_MODE_CONTINOUS | | 1984 | open_settings = (u8)(UMP_DMA_MODE_CONTINOUS | |
1972 | UMP_PIPE_TRANS_TIMEOUT_ENA | | 1985 | UMP_PIPE_TRANS_TIMEOUT_ENA | |
1973 | (transaction_timeout << 2)); | 1986 | (transaction_timeout << 2)); |
1974 | 1987 | ||
1975 | dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__); | 1988 | dbg ("%s - Sending UMPC_OPEN_PORT", __FUNCTION__); |
1976 | 1989 | ||
1977 | /* Tell TI to open and start the port */ | 1990 | /* Tell TI to open and start the port */ |
1978 | status = TIWriteCommandSync (dev, | 1991 | status = TIWriteCommandSync (dev, |
1979 | UMPC_OPEN_PORT, | 1992 | UMPC_OPEN_PORT, |
1980 | (u8)(UMPM_UART1_PORT + port_number), | 1993 | (u8)(UMPM_UART1_PORT + port_number), |
1981 | open_settings, | 1994 | open_settings, |
1982 | NULL, | 1995 | NULL, |
1983 | 0); | 1996 | 0); |
1984 | if (status) { | 1997 | if (status) { |
1985 | dev_err(&port->dev,"%s - cannot send open command, %d\n", __FUNCTION__, status); | 1998 | dev_err(&port->dev,"%s - cannot send open command, %d\n", __FUNCTION__, status); |
1986 | return status; | 1999 | return status; |
1987 | } | 2000 | } |
1988 | 2001 | ||
1989 | /* Start the DMA? */ | 2002 | /* Start the DMA? */ |
1990 | status = TIWriteCommandSync (dev, | 2003 | status = TIWriteCommandSync (dev, |
1991 | UMPC_START_PORT, | 2004 | UMPC_START_PORT, |
1992 | (u8)(UMPM_UART1_PORT + port_number), | 2005 | (u8)(UMPM_UART1_PORT + port_number), |
1993 | 0, | 2006 | 0, |
1994 | NULL, | 2007 | NULL, |
1995 | 0); | 2008 | 0); |
1996 | if (status) { | 2009 | if (status) { |
1997 | dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __FUNCTION__, status); | 2010 | dev_err(&port->dev,"%s - cannot send start DMA command, %d\n", __FUNCTION__, status); |
1998 | return status; | 2011 | return status; |
1999 | } | 2012 | } |
2000 | 2013 | ||
2001 | /* Clear TX and RX buffers in UMP */ | 2014 | /* Clear TX and RX buffers in UMP */ |
2002 | status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN); | 2015 | status = TIPurgeDataSync (port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN); |
2003 | if (status) { | 2016 | if (status) { |
2004 | dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __FUNCTION__, status); | 2017 | dev_err(&port->dev,"%s - cannot send clear buffers command, %d\n", __FUNCTION__, status); |
2005 | return status; | 2018 | return status; |
2006 | } | 2019 | } |
2007 | 2020 | ||
2008 | /* Read Initial MSR */ | 2021 | /* Read Initial MSR */ |
2009 | status = TIReadVendorRequestSync (dev, | 2022 | status = TIReadVendorRequestSync (dev, |
2010 | UMPC_READ_MSR, // Request | 2023 | UMPC_READ_MSR, // Request |
2011 | 0, // wValue | 2024 | 0, // wValue |
2012 | (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address) | 2025 | (__u16)(UMPM_UART1_PORT + port_number), // wIndex (Address) |
2013 | &edge_port->shadow_msr, // TransferBuffer | 2026 | &edge_port->shadow_msr, // TransferBuffer |
2014 | 1); // TransferBufferLength | 2027 | 1); // TransferBufferLength |
2015 | if (status) { | 2028 | if (status) { |
2016 | dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __FUNCTION__, status); | 2029 | dev_err(&port->dev,"%s - cannot send read MSR command, %d\n", __FUNCTION__, status); |
2017 | return status; | 2030 | return status; |
2018 | } | 2031 | } |
2019 | 2032 | ||
2020 | dbg ("ShadowMSR 0x%X", edge_port->shadow_msr); | 2033 | dbg ("ShadowMSR 0x%X", edge_port->shadow_msr); |
2021 | 2034 | ||
2022 | /* Set Initial MCR */ | 2035 | /* Set Initial MCR */ |
2023 | edge_port->shadow_mcr = MCR_RTS | MCR_DTR; | 2036 | edge_port->shadow_mcr = MCR_RTS | MCR_DTR; |
2024 | dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr); | 2037 | dbg ("ShadowMCR 0x%X", edge_port->shadow_mcr); |
2025 | 2038 | ||
2026 | edge_serial = edge_port->edge_serial; | 2039 | edge_serial = edge_port->edge_serial; |
2027 | if (down_interruptible(&edge_serial->es_sem)) | 2040 | if (down_interruptible(&edge_serial->es_sem)) |
2028 | return -ERESTARTSYS; | 2041 | return -ERESTARTSYS; |
2029 | if (edge_serial->num_ports_open == 0) { | 2042 | if (edge_serial->num_ports_open == 0) { |
2030 | /* we are the first port to be opened, let's post the interrupt urb */ | 2043 | /* we are the first port to be opened, let's post the interrupt urb */ |
2031 | urb = edge_serial->serial->port[0]->interrupt_in_urb; | 2044 | urb = edge_serial->serial->port[0]->interrupt_in_urb; |
2032 | if (!urb) { | 2045 | if (!urb) { |
2033 | dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __FUNCTION__); | 2046 | dev_err (&port->dev, "%s - no interrupt urb present, exiting\n", __FUNCTION__); |
2034 | status = -EINVAL; | 2047 | status = -EINVAL; |
2035 | goto up_es_sem; | 2048 | goto up_es_sem; |
2036 | } | 2049 | } |
2037 | urb->complete = edge_interrupt_callback; | 2050 | urb->complete = edge_interrupt_callback; |
2038 | urb->context = edge_serial; | 2051 | urb->context = edge_serial; |
2039 | urb->dev = dev; | 2052 | urb->dev = dev; |
2040 | status = usb_submit_urb (urb, GFP_KERNEL); | 2053 | status = usb_submit_urb (urb, GFP_KERNEL); |
2041 | if (status) { | 2054 | if (status) { |
2042 | dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __FUNCTION__, status); | 2055 | dev_err (&port->dev, "%s - usb_submit_urb failed with value %d\n", __FUNCTION__, status); |
2043 | goto up_es_sem; | 2056 | goto up_es_sem; |
2044 | } | 2057 | } |
2045 | } | 2058 | } |
2046 | 2059 | ||
2047 | /* | 2060 | /* |
2048 | * reset the data toggle on the bulk endpoints to work around bug in | 2061 | * reset the data toggle on the bulk endpoints to work around bug in |
2049 | * host controllers where things get out of sync some times | 2062 | * host controllers where things get out of sync some times |
2050 | */ | 2063 | */ |
2051 | usb_clear_halt (dev, port->write_urb->pipe); | 2064 | usb_clear_halt (dev, port->write_urb->pipe); |
2052 | usb_clear_halt (dev, port->read_urb->pipe); | 2065 | usb_clear_halt (dev, port->read_urb->pipe); |
2053 | 2066 | ||
2054 | /* start up our bulk read urb */ | 2067 | /* start up our bulk read urb */ |
2055 | urb = port->read_urb; | 2068 | urb = port->read_urb; |
2056 | if (!urb) { | 2069 | if (!urb) { |
2057 | dev_err (&port->dev, "%s - no read urb present, exiting\n", __FUNCTION__); | 2070 | dev_err (&port->dev, "%s - no read urb present, exiting\n", __FUNCTION__); |
2058 | status = -EINVAL; | 2071 | status = -EINVAL; |
2059 | goto unlink_int_urb; | 2072 | goto unlink_int_urb; |
2060 | } | 2073 | } |
2061 | edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; | 2074 | edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; |
2062 | urb->complete = edge_bulk_in_callback; | 2075 | urb->complete = edge_bulk_in_callback; |
2063 | urb->context = edge_port; | 2076 | urb->context = edge_port; |
2064 | urb->dev = dev; | 2077 | urb->dev = dev; |
2065 | status = usb_submit_urb (urb, GFP_KERNEL); | 2078 | status = usb_submit_urb (urb, GFP_KERNEL); |
2066 | if (status) { | 2079 | if (status) { |
2067 | dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); | 2080 | dev_err (&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); |
2068 | goto unlink_int_urb; | 2081 | goto unlink_int_urb; |
2069 | } | 2082 | } |
2070 | 2083 | ||
2071 | ++edge_serial->num_ports_open; | 2084 | ++edge_serial->num_ports_open; |
2072 | 2085 | ||
2073 | dbg("%s - exited", __FUNCTION__); | 2086 | dbg("%s - exited", __FUNCTION__); |
2074 | 2087 | ||
2075 | goto up_es_sem; | 2088 | goto up_es_sem; |
2076 | 2089 | ||
2077 | unlink_int_urb: | 2090 | unlink_int_urb: |
2078 | if (edge_port->edge_serial->num_ports_open == 0) | 2091 | if (edge_port->edge_serial->num_ports_open == 0) |
2079 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); | 2092 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); |
2080 | up_es_sem: | 2093 | up_es_sem: |
2081 | up(&edge_serial->es_sem); | 2094 | up(&edge_serial->es_sem); |
2082 | return status; | 2095 | return status; |
2083 | } | 2096 | } |
2084 | 2097 | ||
2085 | static void edge_close (struct usb_serial_port *port, struct file *filp) | 2098 | static void edge_close (struct usb_serial_port *port, struct file *filp) |
2086 | { | 2099 | { |
2087 | struct edgeport_serial *edge_serial; | 2100 | struct edgeport_serial *edge_serial; |
2088 | struct edgeport_port *edge_port; | 2101 | struct edgeport_port *edge_port; |
2089 | int port_number; | 2102 | int port_number; |
2090 | int status; | 2103 | int status; |
2091 | 2104 | ||
2092 | dbg("%s - port %d", __FUNCTION__, port->number); | 2105 | dbg("%s - port %d", __FUNCTION__, port->number); |
2093 | 2106 | ||
2094 | edge_serial = usb_get_serial_data(port->serial); | 2107 | edge_serial = usb_get_serial_data(port->serial); |
2095 | edge_port = usb_get_serial_port_data(port); | 2108 | edge_port = usb_get_serial_port_data(port); |
2096 | if ((edge_serial == NULL) || (edge_port == NULL)) | 2109 | if ((edge_serial == NULL) || (edge_port == NULL)) |
2097 | return; | 2110 | return; |
2098 | 2111 | ||
2099 | /* The bulkreadcompletion routine will check | 2112 | /* The bulkreadcompletion routine will check |
2100 | * this flag and dump add read data */ | 2113 | * this flag and dump add read data */ |
2101 | edge_port->close_pending = 1; | 2114 | edge_port->close_pending = 1; |
2102 | 2115 | ||
2103 | /* chase the port close and flush */ | 2116 | /* chase the port close and flush */ |
2104 | TIChasePort (edge_port, (HZ*closing_wait)/100, 1); | 2117 | TIChasePort (edge_port, (HZ*closing_wait)/100, 1); |
2105 | 2118 | ||
2106 | usb_kill_urb(port->read_urb); | 2119 | usb_kill_urb(port->read_urb); |
2107 | usb_kill_urb(port->write_urb); | 2120 | usb_kill_urb(port->write_urb); |
2108 | edge_port->ep_write_urb_in_use = 0; | 2121 | edge_port->ep_write_urb_in_use = 0; |
2109 | 2122 | ||
2110 | /* assuming we can still talk to the device, | 2123 | /* assuming we can still talk to the device, |
2111 | * send a close port command to it */ | 2124 | * send a close port command to it */ |
2112 | dbg("%s - send umpc_close_port", __FUNCTION__); | 2125 | dbg("%s - send umpc_close_port", __FUNCTION__); |
2113 | port_number = port->number - port->serial->minor; | 2126 | port_number = port->number - port->serial->minor; |
2114 | status = TIWriteCommandSync (port->serial->dev, | 2127 | status = TIWriteCommandSync (port->serial->dev, |
2115 | UMPC_CLOSE_PORT, | 2128 | UMPC_CLOSE_PORT, |
2116 | (__u8)(UMPM_UART1_PORT + port_number), | 2129 | (__u8)(UMPM_UART1_PORT + port_number), |
2117 | 0, | 2130 | 0, |
2118 | NULL, | 2131 | NULL, |
2119 | 0); | 2132 | 0); |
2120 | down(&edge_serial->es_sem); | 2133 | down(&edge_serial->es_sem); |
2121 | --edge_port->edge_serial->num_ports_open; | 2134 | --edge_port->edge_serial->num_ports_open; |
2122 | if (edge_port->edge_serial->num_ports_open <= 0) { | 2135 | if (edge_port->edge_serial->num_ports_open <= 0) { |
2123 | /* last port is now closed, let's shut down our interrupt urb */ | 2136 | /* last port is now closed, let's shut down our interrupt urb */ |
2124 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); | 2137 | usb_kill_urb(port->serial->port[0]->interrupt_in_urb); |
2125 | edge_port->edge_serial->num_ports_open = 0; | 2138 | edge_port->edge_serial->num_ports_open = 0; |
2126 | } | 2139 | } |
2127 | up(&edge_serial->es_sem); | 2140 | up(&edge_serial->es_sem); |
2128 | edge_port->close_pending = 0; | 2141 | edge_port->close_pending = 0; |
2129 | 2142 | ||
2130 | dbg("%s - exited", __FUNCTION__); | 2143 | dbg("%s - exited", __FUNCTION__); |
2131 | } | 2144 | } |
2132 | 2145 | ||
2133 | static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count) | 2146 | static int edge_write (struct usb_serial_port *port, const unsigned char *data, int count) |
2134 | { | 2147 | { |
2135 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2148 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2136 | unsigned long flags; | 2149 | unsigned long flags; |
2137 | 2150 | ||
2138 | dbg("%s - port %d", __FUNCTION__, port->number); | 2151 | dbg("%s - port %d", __FUNCTION__, port->number); |
2139 | 2152 | ||
2140 | if (count == 0) { | 2153 | if (count == 0) { |
2141 | dbg("%s - write request of 0 bytes", __FUNCTION__); | 2154 | dbg("%s - write request of 0 bytes", __FUNCTION__); |
2142 | return 0; | 2155 | return 0; |
2143 | } | 2156 | } |
2144 | 2157 | ||
2145 | if (edge_port == NULL) | 2158 | if (edge_port == NULL) |
2146 | return -ENODEV; | 2159 | return -ENODEV; |
2147 | if (edge_port->close_pending == 1) | 2160 | if (edge_port->close_pending == 1) |
2148 | return -ENODEV; | 2161 | return -ENODEV; |
2149 | 2162 | ||
2150 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2163 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2151 | count = edge_buf_put(edge_port->ep_out_buf, data, count); | 2164 | count = edge_buf_put(edge_port->ep_out_buf, data, count); |
2152 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2165 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2153 | 2166 | ||
2154 | edge_send(port); | 2167 | edge_send(port); |
2155 | 2168 | ||
2156 | return count; | 2169 | return count; |
2157 | } | 2170 | } |
2158 | 2171 | ||
2159 | static void edge_send(struct usb_serial_port *port) | 2172 | static void edge_send(struct usb_serial_port *port) |
2160 | { | 2173 | { |
2161 | int count, result; | 2174 | int count, result; |
2162 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2175 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2163 | struct tty_struct *tty = port->tty; | 2176 | struct tty_struct *tty = port->tty; |
2164 | unsigned long flags; | 2177 | unsigned long flags; |
2165 | 2178 | ||
2166 | 2179 | ||
2167 | dbg("%s - port %d", __FUNCTION__, port->number); | 2180 | dbg("%s - port %d", __FUNCTION__, port->number); |
2168 | 2181 | ||
2169 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2182 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2170 | 2183 | ||
2171 | if (edge_port->ep_write_urb_in_use) { | 2184 | if (edge_port->ep_write_urb_in_use) { |
2172 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2185 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2173 | return; | 2186 | return; |
2174 | } | 2187 | } |
2175 | 2188 | ||
2176 | count = edge_buf_get(edge_port->ep_out_buf, | 2189 | count = edge_buf_get(edge_port->ep_out_buf, |
2177 | port->write_urb->transfer_buffer, | 2190 | port->write_urb->transfer_buffer, |
2178 | port->bulk_out_size); | 2191 | port->bulk_out_size); |
2179 | 2192 | ||
2180 | if (count == 0) { | 2193 | if (count == 0) { |
2181 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2194 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2182 | return; | 2195 | return; |
2183 | } | 2196 | } |
2184 | 2197 | ||
2185 | edge_port->ep_write_urb_in_use = 1; | 2198 | edge_port->ep_write_urb_in_use = 1; |
2186 | 2199 | ||
2187 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2200 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2188 | 2201 | ||
2189 | usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer); | 2202 | usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, port->write_urb->transfer_buffer); |
2190 | 2203 | ||
2191 | /* set up our urb */ | 2204 | /* set up our urb */ |
2192 | usb_fill_bulk_urb (port->write_urb, port->serial->dev, | 2205 | usb_fill_bulk_urb (port->write_urb, port->serial->dev, |
2193 | usb_sndbulkpipe (port->serial->dev, | 2206 | usb_sndbulkpipe (port->serial->dev, |
2194 | port->bulk_out_endpointAddress), | 2207 | port->bulk_out_endpointAddress), |
2195 | port->write_urb->transfer_buffer, count, | 2208 | port->write_urb->transfer_buffer, count, |
2196 | edge_bulk_out_callback, | 2209 | edge_bulk_out_callback, |
2197 | port); | 2210 | port); |
2198 | 2211 | ||
2199 | /* send the data out the bulk port */ | 2212 | /* send the data out the bulk port */ |
2200 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); | 2213 | result = usb_submit_urb(port->write_urb, GFP_ATOMIC); |
2201 | if (result) { | 2214 | if (result) { |
2202 | dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result); | 2215 | dev_err(&port->dev, "%s - failed submitting write urb, error %d\n", __FUNCTION__, result); |
2203 | edge_port->ep_write_urb_in_use = 0; | 2216 | edge_port->ep_write_urb_in_use = 0; |
2204 | // TODO: reschedule edge_send | 2217 | // TODO: reschedule edge_send |
2205 | } else { | 2218 | } else { |
2206 | edge_port->icount.tx += count; | 2219 | edge_port->icount.tx += count; |
2207 | } | 2220 | } |
2208 | 2221 | ||
2209 | /* wakeup any process waiting for writes to complete */ | 2222 | /* wakeup any process waiting for writes to complete */ |
2210 | /* there is now more room in the buffer for new writes */ | 2223 | /* there is now more room in the buffer for new writes */ |
2211 | if (tty) { | 2224 | if (tty) { |
2212 | /* let the tty driver wakeup if it has a special write_wakeup function */ | 2225 | /* let the tty driver wakeup if it has a special write_wakeup function */ |
2213 | tty_wakeup(tty); | 2226 | tty_wakeup(tty); |
2214 | } | 2227 | } |
2215 | } | 2228 | } |
2216 | 2229 | ||
2217 | static int edge_write_room (struct usb_serial_port *port) | 2230 | static int edge_write_room (struct usb_serial_port *port) |
2218 | { | 2231 | { |
2219 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2232 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2220 | int room = 0; | 2233 | int room = 0; |
2221 | unsigned long flags; | 2234 | unsigned long flags; |
2222 | 2235 | ||
2223 | dbg("%s - port %d", __FUNCTION__, port->number); | 2236 | dbg("%s - port %d", __FUNCTION__, port->number); |
2224 | 2237 | ||
2225 | if (edge_port == NULL) | 2238 | if (edge_port == NULL) |
2226 | return -ENODEV; | 2239 | return -ENODEV; |
2227 | if (edge_port->close_pending == 1) | 2240 | if (edge_port->close_pending == 1) |
2228 | return -ENODEV; | 2241 | return -ENODEV; |
2229 | 2242 | ||
2230 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2243 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2231 | room = edge_buf_space_avail(edge_port->ep_out_buf); | 2244 | room = edge_buf_space_avail(edge_port->ep_out_buf); |
2232 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2245 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2233 | 2246 | ||
2234 | dbg("%s - returns %d", __FUNCTION__, room); | 2247 | dbg("%s - returns %d", __FUNCTION__, room); |
2235 | return room; | 2248 | return room; |
2236 | } | 2249 | } |
2237 | 2250 | ||
2238 | static int edge_chars_in_buffer (struct usb_serial_port *port) | 2251 | static int edge_chars_in_buffer (struct usb_serial_port *port) |
2239 | { | 2252 | { |
2240 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2253 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2241 | int chars = 0; | 2254 | int chars = 0; |
2242 | unsigned long flags; | 2255 | unsigned long flags; |
2243 | 2256 | ||
2244 | dbg("%s - port %d", __FUNCTION__, port->number); | 2257 | dbg("%s - port %d", __FUNCTION__, port->number); |
2245 | 2258 | ||
2246 | if (edge_port == NULL) | 2259 | if (edge_port == NULL) |
2247 | return -ENODEV; | 2260 | return -ENODEV; |
2248 | if (edge_port->close_pending == 1) | 2261 | if (edge_port->close_pending == 1) |
2249 | return -ENODEV; | 2262 | return -ENODEV; |
2250 | 2263 | ||
2251 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2264 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2252 | chars = edge_buf_data_avail(edge_port->ep_out_buf); | 2265 | chars = edge_buf_data_avail(edge_port->ep_out_buf); |
2253 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2266 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2254 | 2267 | ||
2255 | dbg ("%s - returns %d", __FUNCTION__, chars); | 2268 | dbg ("%s - returns %d", __FUNCTION__, chars); |
2256 | return chars; | 2269 | return chars; |
2257 | } | 2270 | } |
2258 | 2271 | ||
2259 | static void edge_throttle (struct usb_serial_port *port) | 2272 | static void edge_throttle (struct usb_serial_port *port) |
2260 | { | 2273 | { |
2261 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2274 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2262 | struct tty_struct *tty; | 2275 | struct tty_struct *tty; |
2263 | int status; | 2276 | int status; |
2264 | 2277 | ||
2265 | dbg("%s - port %d", __FUNCTION__, port->number); | 2278 | dbg("%s - port %d", __FUNCTION__, port->number); |
2266 | 2279 | ||
2267 | if (edge_port == NULL) | 2280 | if (edge_port == NULL) |
2268 | return; | 2281 | return; |
2269 | 2282 | ||
2270 | tty = port->tty; | 2283 | tty = port->tty; |
2271 | if (!tty) { | 2284 | if (!tty) { |
2272 | dbg ("%s - no tty available", __FUNCTION__); | 2285 | dbg ("%s - no tty available", __FUNCTION__); |
2273 | return; | 2286 | return; |
2274 | } | 2287 | } |
2275 | 2288 | ||
2276 | /* if we are implementing XON/XOFF, send the stop character */ | 2289 | /* if we are implementing XON/XOFF, send the stop character */ |
2277 | if (I_IXOFF(tty)) { | 2290 | if (I_IXOFF(tty)) { |
2278 | unsigned char stop_char = STOP_CHAR(tty); | 2291 | unsigned char stop_char = STOP_CHAR(tty); |
2279 | status = edge_write (port, &stop_char, 1); | 2292 | status = edge_write (port, &stop_char, 1); |
2280 | if (status <= 0) { | 2293 | if (status <= 0) { |
2281 | dev_err(&port->dev, "%s - failed to write stop character, %d\n", __FUNCTION__, status); | 2294 | dev_err(&port->dev, "%s - failed to write stop character, %d\n", __FUNCTION__, status); |
2282 | } | 2295 | } |
2283 | } | 2296 | } |
2284 | 2297 | ||
2285 | /* if we are implementing RTS/CTS, stop reads */ | 2298 | /* if we are implementing RTS/CTS, stop reads */ |
2286 | /* and the Edgeport will clear the RTS line */ | 2299 | /* and the Edgeport will clear the RTS line */ |
2287 | if (C_CRTSCTS(tty)) | 2300 | if (C_CRTSCTS(tty)) |
2288 | stop_read(edge_port); | 2301 | stop_read(edge_port); |
2289 | 2302 | ||
2290 | } | 2303 | } |
2291 | 2304 | ||
2292 | static void edge_unthrottle (struct usb_serial_port *port) | 2305 | static void edge_unthrottle (struct usb_serial_port *port) |
2293 | { | 2306 | { |
2294 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2307 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2295 | struct tty_struct *tty; | 2308 | struct tty_struct *tty; |
2296 | int status; | 2309 | int status; |
2297 | 2310 | ||
2298 | dbg("%s - port %d", __FUNCTION__, port->number); | 2311 | dbg("%s - port %d", __FUNCTION__, port->number); |
2299 | 2312 | ||
2300 | if (edge_port == NULL) | 2313 | if (edge_port == NULL) |
2301 | return; | 2314 | return; |
2302 | 2315 | ||
2303 | tty = port->tty; | 2316 | tty = port->tty; |
2304 | if (!tty) { | 2317 | if (!tty) { |
2305 | dbg ("%s - no tty available", __FUNCTION__); | 2318 | dbg ("%s - no tty available", __FUNCTION__); |
2306 | return; | 2319 | return; |
2307 | } | 2320 | } |
2308 | 2321 | ||
2309 | /* if we are implementing XON/XOFF, send the start character */ | 2322 | /* if we are implementing XON/XOFF, send the start character */ |
2310 | if (I_IXOFF(tty)) { | 2323 | if (I_IXOFF(tty)) { |
2311 | unsigned char start_char = START_CHAR(tty); | 2324 | unsigned char start_char = START_CHAR(tty); |
2312 | status = edge_write (port, &start_char, 1); | 2325 | status = edge_write (port, &start_char, 1); |
2313 | if (status <= 0) { | 2326 | if (status <= 0) { |
2314 | dev_err(&port->dev, "%s - failed to write start character, %d\n", __FUNCTION__, status); | 2327 | dev_err(&port->dev, "%s - failed to write start character, %d\n", __FUNCTION__, status); |
2315 | } | 2328 | } |
2316 | } | 2329 | } |
2317 | 2330 | ||
2318 | /* if we are implementing RTS/CTS, restart reads */ | 2331 | /* if we are implementing RTS/CTS, restart reads */ |
2319 | /* are the Edgeport will assert the RTS line */ | 2332 | /* are the Edgeport will assert the RTS line */ |
2320 | if (C_CRTSCTS(tty)) { | 2333 | if (C_CRTSCTS(tty)) { |
2321 | status = restart_read(edge_port); | 2334 | status = restart_read(edge_port); |
2322 | if (status) | 2335 | if (status) |
2323 | dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); | 2336 | dev_err(&port->dev, "%s - read bulk usb_submit_urb failed with value %d\n", __FUNCTION__, status); |
2324 | } | 2337 | } |
2325 | 2338 | ||
2326 | } | 2339 | } |
2327 | 2340 | ||
2328 | static void stop_read(struct edgeport_port *edge_port) | 2341 | static void stop_read(struct edgeport_port *edge_port) |
2329 | { | 2342 | { |
2330 | unsigned long flags; | 2343 | unsigned long flags; |
2331 | 2344 | ||
2332 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2345 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2333 | 2346 | ||
2334 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) | 2347 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING) |
2335 | edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING; | 2348 | edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING; |
2336 | edge_port->shadow_mcr &= ~MCR_RTS; | 2349 | edge_port->shadow_mcr &= ~MCR_RTS; |
2337 | 2350 | ||
2338 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2351 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2339 | } | 2352 | } |
2340 | 2353 | ||
2341 | static int restart_read(struct edgeport_port *edge_port) | 2354 | static int restart_read(struct edgeport_port *edge_port) |
2342 | { | 2355 | { |
2343 | struct urb *urb; | 2356 | struct urb *urb; |
2344 | int status = 0; | 2357 | int status = 0; |
2345 | unsigned long flags; | 2358 | unsigned long flags; |
2346 | 2359 | ||
2347 | spin_lock_irqsave(&edge_port->ep_lock, flags); | 2360 | spin_lock_irqsave(&edge_port->ep_lock, flags); |
2348 | 2361 | ||
2349 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) { | 2362 | if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) { |
2350 | urb = edge_port->port->read_urb; | 2363 | urb = edge_port->port->read_urb; |
2351 | urb->complete = edge_bulk_in_callback; | 2364 | urb->complete = edge_bulk_in_callback; |
2352 | urb->context = edge_port; | 2365 | urb->context = edge_port; |
2353 | urb->dev = edge_port->port->serial->dev; | 2366 | urb->dev = edge_port->port->serial->dev; |
2354 | status = usb_submit_urb(urb, GFP_KERNEL); | 2367 | status = usb_submit_urb(urb, GFP_KERNEL); |
2355 | } | 2368 | } |
2356 | edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; | 2369 | edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING; |
2357 | edge_port->shadow_mcr |= MCR_RTS; | 2370 | edge_port->shadow_mcr |= MCR_RTS; |
2358 | 2371 | ||
2359 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); | 2372 | spin_unlock_irqrestore(&edge_port->ep_lock, flags); |
2360 | 2373 | ||
2361 | return status; | 2374 | return status; |
2362 | } | 2375 | } |
2363 | 2376 | ||
2364 | static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios) | 2377 | static void change_port_settings (struct edgeport_port *edge_port, struct ktermios *old_termios) |
2365 | { | 2378 | { |
2366 | struct ump_uart_config *config; | 2379 | struct ump_uart_config *config; |
2367 | struct tty_struct *tty; | 2380 | struct tty_struct *tty; |
2368 | int baud; | 2381 | int baud; |
2369 | unsigned cflag; | 2382 | unsigned cflag; |
2370 | int status; | 2383 | int status; |
2371 | int port_number = edge_port->port->number - edge_port->port->serial->minor; | 2384 | int port_number = edge_port->port->number - edge_port->port->serial->minor; |
2372 | 2385 | ||
2373 | dbg("%s - port %d", __FUNCTION__, edge_port->port->number); | 2386 | dbg("%s - port %d", __FUNCTION__, edge_port->port->number); |
2374 | 2387 | ||
2375 | tty = edge_port->port->tty; | 2388 | tty = edge_port->port->tty; |
2376 | if ((!tty) || | 2389 | if ((!tty) || |
2377 | (!tty->termios)) { | 2390 | (!tty->termios)) { |
2378 | dbg("%s - no tty structures", __FUNCTION__); | 2391 | dbg("%s - no tty structures", __FUNCTION__); |
2379 | return; | 2392 | return; |
2380 | } | 2393 | } |
2381 | 2394 | ||
2382 | config = kmalloc (sizeof (*config), GFP_KERNEL); | 2395 | config = kmalloc (sizeof (*config), GFP_KERNEL); |
2383 | if (!config) { | 2396 | if (!config) { |
2384 | dev_err (&edge_port->port->dev, "%s - out of memory\n", __FUNCTION__); | 2397 | dev_err (&edge_port->port->dev, "%s - out of memory\n", __FUNCTION__); |
2385 | return; | 2398 | return; |
2386 | } | 2399 | } |
2387 | 2400 | ||
2388 | cflag = tty->termios->c_cflag; | 2401 | cflag = tty->termios->c_cflag; |
2389 | 2402 | ||
2390 | config->wFlags = 0; | 2403 | config->wFlags = 0; |
2391 | 2404 | ||
2392 | /* These flags must be set */ | 2405 | /* These flags must be set */ |
2393 | config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT; | 2406 | config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT; |
2394 | config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR; | 2407 | config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR; |
2395 | config->bUartMode = (__u8)(edge_port->bUartMode); | 2408 | config->bUartMode = (__u8)(edge_port->bUartMode); |
2396 | 2409 | ||
2397 | switch (cflag & CSIZE) { | 2410 | switch (cflag & CSIZE) { |
2398 | case CS5: | 2411 | case CS5: |
2399 | config->bDataBits = UMP_UART_CHAR5BITS; | 2412 | config->bDataBits = UMP_UART_CHAR5BITS; |
2400 | dbg ("%s - data bits = 5", __FUNCTION__); | 2413 | dbg ("%s - data bits = 5", __FUNCTION__); |
2401 | break; | 2414 | break; |
2402 | case CS6: | 2415 | case CS6: |
2403 | config->bDataBits = UMP_UART_CHAR6BITS; | 2416 | config->bDataBits = UMP_UART_CHAR6BITS; |
2404 | dbg ("%s - data bits = 6", __FUNCTION__); | 2417 | dbg ("%s - data bits = 6", __FUNCTION__); |
2405 | break; | 2418 | break; |
2406 | case CS7: | 2419 | case CS7: |
2407 | config->bDataBits = UMP_UART_CHAR7BITS; | 2420 | config->bDataBits = UMP_UART_CHAR7BITS; |
2408 | dbg ("%s - data bits = 7", __FUNCTION__); | 2421 | dbg ("%s - data bits = 7", __FUNCTION__); |
2409 | break; | 2422 | break; |
2410 | default: | 2423 | default: |
2411 | case CS8: | 2424 | case CS8: |
2412 | config->bDataBits = UMP_UART_CHAR8BITS; | 2425 | config->bDataBits = UMP_UART_CHAR8BITS; |
2413 | dbg ("%s - data bits = 8", __FUNCTION__); | 2426 | dbg ("%s - data bits = 8", __FUNCTION__); |
2414 | break; | 2427 | break; |
2415 | } | 2428 | } |
2416 | 2429 | ||
2417 | if (cflag & PARENB) { | 2430 | if (cflag & PARENB) { |
2418 | if (cflag & PARODD) { | 2431 | if (cflag & PARODD) { |
2419 | config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; | 2432 | config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; |
2420 | config->bParity = UMP_UART_ODDPARITY; | 2433 | config->bParity = UMP_UART_ODDPARITY; |
2421 | dbg("%s - parity = odd", __FUNCTION__); | 2434 | dbg("%s - parity = odd", __FUNCTION__); |
2422 | } else { | 2435 | } else { |
2423 | config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; | 2436 | config->wFlags |= UMP_MASK_UART_FLAGS_PARITY; |
2424 | config->bParity = UMP_UART_EVENPARITY; | 2437 | config->bParity = UMP_UART_EVENPARITY; |
2425 | dbg("%s - parity = even", __FUNCTION__); | 2438 | dbg("%s - parity = even", __FUNCTION__); |
2426 | } | 2439 | } |
2427 | } else { | 2440 | } else { |
2428 | config->bParity = UMP_UART_NOPARITY; | 2441 | config->bParity = UMP_UART_NOPARITY; |
2429 | dbg("%s - parity = none", __FUNCTION__); | 2442 | dbg("%s - parity = none", __FUNCTION__); |
2430 | } | 2443 | } |
2431 | 2444 | ||
2432 | if (cflag & CSTOPB) { | 2445 | if (cflag & CSTOPB) { |
2433 | config->bStopBits = UMP_UART_STOPBIT2; | 2446 | config->bStopBits = UMP_UART_STOPBIT2; |
2434 | dbg("%s - stop bits = 2", __FUNCTION__); | 2447 | dbg("%s - stop bits = 2", __FUNCTION__); |
2435 | } else { | 2448 | } else { |
2436 | config->bStopBits = UMP_UART_STOPBIT1; | 2449 | config->bStopBits = UMP_UART_STOPBIT1; |
2437 | dbg("%s - stop bits = 1", __FUNCTION__); | 2450 | dbg("%s - stop bits = 1", __FUNCTION__); |
2438 | } | 2451 | } |
2439 | 2452 | ||
2440 | /* figure out the flow control settings */ | 2453 | /* figure out the flow control settings */ |
2441 | if (cflag & CRTSCTS) { | 2454 | if (cflag & CRTSCTS) { |
2442 | config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW; | 2455 | config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW; |
2443 | config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW; | 2456 | config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW; |
2444 | dbg("%s - RTS/CTS is enabled", __FUNCTION__); | 2457 | dbg("%s - RTS/CTS is enabled", __FUNCTION__); |
2445 | } else { | 2458 | } else { |
2446 | dbg("%s - RTS/CTS is disabled", __FUNCTION__); | 2459 | dbg("%s - RTS/CTS is disabled", __FUNCTION__); |
2447 | tty->hw_stopped = 0; | 2460 | tty->hw_stopped = 0; |
2448 | restart_read(edge_port); | 2461 | restart_read(edge_port); |
2449 | } | 2462 | } |
2450 | 2463 | ||
2451 | /* if we are implementing XON/XOFF, set the start and stop character in the device */ | 2464 | /* if we are implementing XON/XOFF, set the start and stop character in the device */ |
2452 | if (I_IXOFF(tty) || I_IXON(tty)) { | 2465 | if (I_IXOFF(tty) || I_IXON(tty)) { |
2453 | config->cXon = START_CHAR(tty); | 2466 | config->cXon = START_CHAR(tty); |
2454 | config->cXoff = STOP_CHAR(tty); | 2467 | config->cXoff = STOP_CHAR(tty); |
2455 | 2468 | ||
2456 | /* if we are implementing INBOUND XON/XOFF */ | 2469 | /* if we are implementing INBOUND XON/XOFF */ |
2457 | if (I_IXOFF(tty)) { | 2470 | if (I_IXOFF(tty)) { |
2458 | config->wFlags |= UMP_MASK_UART_FLAGS_IN_X; | 2471 | config->wFlags |= UMP_MASK_UART_FLAGS_IN_X; |
2459 | dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", | 2472 | dbg ("%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", |
2460 | __FUNCTION__, config->cXon, config->cXoff); | 2473 | __FUNCTION__, config->cXon, config->cXoff); |
2461 | } else { | 2474 | } else { |
2462 | dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__); | 2475 | dbg ("%s - INBOUND XON/XOFF is disabled", __FUNCTION__); |
2463 | } | 2476 | } |
2464 | 2477 | ||
2465 | /* if we are implementing OUTBOUND XON/XOFF */ | 2478 | /* if we are implementing OUTBOUND XON/XOFF */ |
2466 | if (I_IXON(tty)) { | 2479 | if (I_IXON(tty)) { |
2467 | config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X; | 2480 | config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X; |
2468 | dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", | 2481 | dbg ("%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x", |
2469 | __FUNCTION__, config->cXon, config->cXoff); | 2482 | __FUNCTION__, config->cXon, config->cXoff); |
2470 | } else { | 2483 | } else { |
2471 | dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__); | 2484 | dbg ("%s - OUTBOUND XON/XOFF is disabled", __FUNCTION__); |
2472 | } | 2485 | } |
2473 | } | 2486 | } |
2474 | 2487 | ||
2475 | /* Round the baud rate */ | 2488 | /* Round the baud rate */ |
2476 | baud = tty_get_baud_rate(tty); | 2489 | baud = tty_get_baud_rate(tty); |
2477 | if (!baud) { | 2490 | if (!baud) { |
2478 | /* pick a default, any default... */ | 2491 | /* pick a default, any default... */ |
2479 | baud = 9600; | 2492 | baud = 9600; |
2480 | } | 2493 | } |
2481 | edge_port->baud_rate = baud; | 2494 | edge_port->baud_rate = baud; |
2482 | config->wBaudRate = (__u16)((461550L + baud/2) / baud); | 2495 | config->wBaudRate = (__u16)((461550L + baud/2) / baud); |
2483 | 2496 | ||
2484 | dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate); | 2497 | dbg ("%s - baud rate = %d, wBaudRate = %d", __FUNCTION__, baud, config->wBaudRate); |
2485 | 2498 | ||
2486 | dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate)); | 2499 | dbg ("wBaudRate: %d", (int)(461550L / config->wBaudRate)); |
2487 | dbg ("wFlags: 0x%x", config->wFlags); | 2500 | dbg ("wFlags: 0x%x", config->wFlags); |
2488 | dbg ("bDataBits: %d", config->bDataBits); | 2501 | dbg ("bDataBits: %d", config->bDataBits); |
2489 | dbg ("bParity: %d", config->bParity); | 2502 | dbg ("bParity: %d", config->bParity); |
2490 | dbg ("bStopBits: %d", config->bStopBits); | 2503 | dbg ("bStopBits: %d", config->bStopBits); |
2491 | dbg ("cXon: %d", config->cXon); | 2504 | dbg ("cXon: %d", config->cXon); |
2492 | dbg ("cXoff: %d", config->cXoff); | 2505 | dbg ("cXoff: %d", config->cXoff); |
2493 | dbg ("bUartMode: %d", config->bUartMode); | 2506 | dbg ("bUartMode: %d", config->bUartMode); |
2494 | 2507 | ||
2495 | /* move the word values into big endian mode */ | 2508 | /* move the word values into big endian mode */ |
2496 | cpu_to_be16s (&config->wFlags); | 2509 | cpu_to_be16s (&config->wFlags); |
2497 | cpu_to_be16s (&config->wBaudRate); | 2510 | cpu_to_be16s (&config->wBaudRate); |
2498 | 2511 | ||
2499 | status = TIWriteCommandSync (edge_port->port->serial->dev, | 2512 | status = TIWriteCommandSync (edge_port->port->serial->dev, |
2500 | UMPC_SET_CONFIG, | 2513 | UMPC_SET_CONFIG, |
2501 | (__u8)(UMPM_UART1_PORT + port_number), | 2514 | (__u8)(UMPM_UART1_PORT + port_number), |
2502 | 0, | 2515 | 0, |
2503 | (__u8 *)config, | 2516 | (__u8 *)config, |
2504 | sizeof(*config)); | 2517 | sizeof(*config)); |
2505 | if (status) { | 2518 | if (status) { |
2506 | dbg ("%s - error %d when trying to write config to device", | 2519 | dbg ("%s - error %d when trying to write config to device", |
2507 | __FUNCTION__, status); | 2520 | __FUNCTION__, status); |
2508 | } | 2521 | } |
2509 | 2522 | ||
2510 | kfree (config); | 2523 | kfree (config); |
2511 | 2524 | ||
2512 | return; | 2525 | return; |
2513 | } | 2526 | } |
2514 | 2527 | ||
2515 | static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) | 2528 | static void edge_set_termios (struct usb_serial_port *port, struct ktermios *old_termios) |
2516 | { | 2529 | { |
2517 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2530 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2518 | struct tty_struct *tty = port->tty; | 2531 | struct tty_struct *tty = port->tty; |
2519 | unsigned int cflag; | 2532 | unsigned int cflag; |
2520 | 2533 | ||
2521 | if (!port->tty || !port->tty->termios) { | 2534 | if (!port->tty || !port->tty->termios) { |
2522 | dbg ("%s - no tty or termios", __FUNCTION__); | 2535 | dbg ("%s - no tty or termios", __FUNCTION__); |
2523 | return; | 2536 | return; |
2524 | } | 2537 | } |
2525 | 2538 | ||
2526 | cflag = tty->termios->c_cflag; | 2539 | cflag = tty->termios->c_cflag; |
2527 | /* check that they really want us to change something */ | 2540 | /* check that they really want us to change something */ |
2528 | if (old_termios) { | 2541 | if (old_termios) { |
2529 | if (cflag == old_termios->c_cflag && | 2542 | if (cflag == old_termios->c_cflag && |
2530 | tty->termios->c_iflag == old_termios->c_iflag) { | 2543 | tty->termios->c_iflag == old_termios->c_iflag) { |
2531 | dbg ("%s - nothing to change", __FUNCTION__); | 2544 | dbg ("%s - nothing to change", __FUNCTION__); |
2532 | return; | 2545 | return; |
2533 | } | 2546 | } |
2534 | } | 2547 | } |
2535 | 2548 | ||
2536 | dbg("%s - clfag %08x iflag %08x", __FUNCTION__, | 2549 | dbg("%s - clfag %08x iflag %08x", __FUNCTION__, |
2537 | tty->termios->c_cflag, tty->termios->c_iflag); | 2550 | tty->termios->c_cflag, tty->termios->c_iflag); |
2538 | if (old_termios) { | 2551 | if (old_termios) { |
2539 | dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__, | 2552 | dbg("%s - old clfag %08x old iflag %08x", __FUNCTION__, |
2540 | old_termios->c_cflag, old_termios->c_iflag); | 2553 | old_termios->c_cflag, old_termios->c_iflag); |
2541 | } | 2554 | } |
2542 | 2555 | ||
2543 | dbg("%s - port %d", __FUNCTION__, port->number); | 2556 | dbg("%s - port %d", __FUNCTION__, port->number); |
2544 | 2557 | ||
2545 | if (edge_port == NULL) | 2558 | if (edge_port == NULL) |
2546 | return; | 2559 | return; |
2547 | 2560 | ||
2548 | /* change the port settings to the new ones specified */ | 2561 | /* change the port settings to the new ones specified */ |
2549 | change_port_settings (edge_port, old_termios); | 2562 | change_port_settings (edge_port, old_termios); |
2550 | 2563 | ||
2551 | return; | 2564 | return; |
2552 | } | 2565 | } |
2553 | 2566 | ||
2554 | static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear) | 2567 | static int edge_tiocmset (struct usb_serial_port *port, struct file *file, unsigned int set, unsigned int clear) |
2555 | { | 2568 | { |
2556 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2569 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2557 | unsigned int mcr; | 2570 | unsigned int mcr; |
2558 | 2571 | ||
2559 | dbg("%s - port %d", __FUNCTION__, port->number); | 2572 | dbg("%s - port %d", __FUNCTION__, port->number); |
2560 | 2573 | ||
2561 | mcr = edge_port->shadow_mcr; | 2574 | mcr = edge_port->shadow_mcr; |
2562 | if (set & TIOCM_RTS) | 2575 | if (set & TIOCM_RTS) |
2563 | mcr |= MCR_RTS; | 2576 | mcr |= MCR_RTS; |
2564 | if (set & TIOCM_DTR) | 2577 | if (set & TIOCM_DTR) |
2565 | mcr |= MCR_DTR; | 2578 | mcr |= MCR_DTR; |
2566 | if (set & TIOCM_LOOP) | 2579 | if (set & TIOCM_LOOP) |
2567 | mcr |= MCR_LOOPBACK; | 2580 | mcr |= MCR_LOOPBACK; |
2568 | 2581 | ||
2569 | if (clear & TIOCM_RTS) | 2582 | if (clear & TIOCM_RTS) |
2570 | mcr &= ~MCR_RTS; | 2583 | mcr &= ~MCR_RTS; |
2571 | if (clear & TIOCM_DTR) | 2584 | if (clear & TIOCM_DTR) |
2572 | mcr &= ~MCR_DTR; | 2585 | mcr &= ~MCR_DTR; |
2573 | if (clear & TIOCM_LOOP) | 2586 | if (clear & TIOCM_LOOP) |
2574 | mcr &= ~MCR_LOOPBACK; | 2587 | mcr &= ~MCR_LOOPBACK; |
2575 | 2588 | ||
2576 | edge_port->shadow_mcr = mcr; | 2589 | edge_port->shadow_mcr = mcr; |
2577 | 2590 | ||
2578 | TIRestoreMCR (edge_port, mcr); | 2591 | TIRestoreMCR (edge_port, mcr); |
2579 | 2592 | ||
2580 | return 0; | 2593 | return 0; |
2581 | } | 2594 | } |
2582 | 2595 | ||
2583 | static int edge_tiocmget(struct usb_serial_port *port, struct file *file) | 2596 | static int edge_tiocmget(struct usb_serial_port *port, struct file *file) |
2584 | { | 2597 | { |
2585 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2598 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2586 | unsigned int result = 0; | 2599 | unsigned int result = 0; |
2587 | unsigned int msr; | 2600 | unsigned int msr; |
2588 | unsigned int mcr; | 2601 | unsigned int mcr; |
2589 | 2602 | ||
2590 | dbg("%s - port %d", __FUNCTION__, port->number); | 2603 | dbg("%s - port %d", __FUNCTION__, port->number); |
2591 | 2604 | ||
2592 | msr = edge_port->shadow_msr; | 2605 | msr = edge_port->shadow_msr; |
2593 | mcr = edge_port->shadow_mcr; | 2606 | mcr = edge_port->shadow_mcr; |
2594 | result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */ | 2607 | result = ((mcr & MCR_DTR) ? TIOCM_DTR: 0) /* 0x002 */ |
2595 | | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */ | 2608 | | ((mcr & MCR_RTS) ? TIOCM_RTS: 0) /* 0x004 */ |
2596 | | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */ | 2609 | | ((msr & EDGEPORT_MSR_CTS) ? TIOCM_CTS: 0) /* 0x020 */ |
2597 | | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */ | 2610 | | ((msr & EDGEPORT_MSR_CD) ? TIOCM_CAR: 0) /* 0x040 */ |
2598 | | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */ | 2611 | | ((msr & EDGEPORT_MSR_RI) ? TIOCM_RI: 0) /* 0x080 */ |
2599 | | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */ | 2612 | | ((msr & EDGEPORT_MSR_DSR) ? TIOCM_DSR: 0); /* 0x100 */ |
2600 | 2613 | ||
2601 | 2614 | ||
2602 | dbg("%s -- %x", __FUNCTION__, result); | 2615 | dbg("%s -- %x", __FUNCTION__, result); |
2603 | 2616 | ||
2604 | return result; | 2617 | return result; |
2605 | } | 2618 | } |
2606 | 2619 | ||
2607 | static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo) | 2620 | static int get_serial_info (struct edgeport_port *edge_port, struct serial_struct __user *retinfo) |
2608 | { | 2621 | { |
2609 | struct serial_struct tmp; | 2622 | struct serial_struct tmp; |
2610 | 2623 | ||
2611 | if (!retinfo) | 2624 | if (!retinfo) |
2612 | return -EFAULT; | 2625 | return -EFAULT; |
2613 | 2626 | ||
2614 | memset(&tmp, 0, sizeof(tmp)); | 2627 | memset(&tmp, 0, sizeof(tmp)); |
2615 | 2628 | ||
2616 | tmp.type = PORT_16550A; | 2629 | tmp.type = PORT_16550A; |
2617 | tmp.line = edge_port->port->serial->minor; | 2630 | tmp.line = edge_port->port->serial->minor; |
2618 | tmp.port = edge_port->port->number; | 2631 | tmp.port = edge_port->port->number; |
2619 | tmp.irq = 0; | 2632 | tmp.irq = 0; |
2620 | tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; | 2633 | tmp.flags = ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ; |
2621 | tmp.xmit_fifo_size = edge_port->port->bulk_out_size; | 2634 | tmp.xmit_fifo_size = edge_port->port->bulk_out_size; |
2622 | tmp.baud_base = 9600; | 2635 | tmp.baud_base = 9600; |
2623 | tmp.close_delay = 5*HZ; | 2636 | tmp.close_delay = 5*HZ; |
2624 | tmp.closing_wait = closing_wait; | 2637 | tmp.closing_wait = closing_wait; |
2625 | // tmp.custom_divisor = state->custom_divisor; | 2638 | // tmp.custom_divisor = state->custom_divisor; |
2626 | // tmp.hub6 = state->hub6; | 2639 | // tmp.hub6 = state->hub6; |
2627 | // tmp.io_type = state->io_type; | 2640 | // tmp.io_type = state->io_type; |
2628 | 2641 | ||
2629 | 2642 | ||
2630 | if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) | 2643 | if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) |
2631 | return -EFAULT; | 2644 | return -EFAULT; |
2632 | return 0; | 2645 | return 0; |
2633 | } | 2646 | } |
2634 | 2647 | ||
2635 | static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) | 2648 | static int edge_ioctl (struct usb_serial_port *port, struct file *file, unsigned int cmd, unsigned long arg) |
2636 | { | 2649 | { |
2637 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2650 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2638 | struct async_icount cnow; | 2651 | struct async_icount cnow; |
2639 | struct async_icount cprev; | 2652 | struct async_icount cprev; |
2640 | 2653 | ||
2641 | dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd); | 2654 | dbg("%s - port %d, cmd = 0x%x", __FUNCTION__, port->number, cmd); |
2642 | 2655 | ||
2643 | switch (cmd) { | 2656 | switch (cmd) { |
2644 | case TIOCINQ: | 2657 | case TIOCINQ: |
2645 | dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number); | 2658 | dbg("%s - (%d) TIOCINQ", __FUNCTION__, port->number); |
2646 | // return get_number_bytes_avail(edge_port, (unsigned int *) arg); | 2659 | // return get_number_bytes_avail(edge_port, (unsigned int *) arg); |
2647 | break; | 2660 | break; |
2648 | 2661 | ||
2649 | case TIOCSERGETLSR: | 2662 | case TIOCSERGETLSR: |
2650 | dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number); | 2663 | dbg("%s - (%d) TIOCSERGETLSR", __FUNCTION__, port->number); |
2651 | // return get_lsr_info(edge_port, (unsigned int *) arg); | 2664 | // return get_lsr_info(edge_port, (unsigned int *) arg); |
2652 | break; | 2665 | break; |
2653 | 2666 | ||
2654 | case TIOCGSERIAL: | 2667 | case TIOCGSERIAL: |
2655 | dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number); | 2668 | dbg("%s - (%d) TIOCGSERIAL", __FUNCTION__, port->number); |
2656 | return get_serial_info(edge_port, (struct serial_struct __user *) arg); | 2669 | return get_serial_info(edge_port, (struct serial_struct __user *) arg); |
2657 | break; | 2670 | break; |
2658 | 2671 | ||
2659 | case TIOCSSERIAL: | 2672 | case TIOCSSERIAL: |
2660 | dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number); | 2673 | dbg("%s - (%d) TIOCSSERIAL", __FUNCTION__, port->number); |
2661 | break; | 2674 | break; |
2662 | 2675 | ||
2663 | case TIOCMIWAIT: | 2676 | case TIOCMIWAIT: |
2664 | dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number); | 2677 | dbg("%s - (%d) TIOCMIWAIT", __FUNCTION__, port->number); |
2665 | cprev = edge_port->icount; | 2678 | cprev = edge_port->icount; |
2666 | while (1) { | 2679 | while (1) { |
2667 | interruptible_sleep_on(&edge_port->delta_msr_wait); | 2680 | interruptible_sleep_on(&edge_port->delta_msr_wait); |
2668 | /* see if a signal did it */ | 2681 | /* see if a signal did it */ |
2669 | if (signal_pending(current)) | 2682 | if (signal_pending(current)) |
2670 | return -ERESTARTSYS; | 2683 | return -ERESTARTSYS; |
2671 | cnow = edge_port->icount; | 2684 | cnow = edge_port->icount; |
2672 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | 2685 | if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && |
2673 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) | 2686 | cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) |
2674 | return -EIO; /* no change => error */ | 2687 | return -EIO; /* no change => error */ |
2675 | if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || | 2688 | if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || |
2676 | ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || | 2689 | ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || |
2677 | ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || | 2690 | ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || |
2678 | ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { | 2691 | ((arg & TIOCM_CTS) && (cnow.cts != cprev.cts)) ) { |
2679 | return 0; | 2692 | return 0; |
2680 | } | 2693 | } |
2681 | cprev = cnow; | 2694 | cprev = cnow; |
2682 | } | 2695 | } |
2683 | /* not reached */ | 2696 | /* not reached */ |
2684 | break; | 2697 | break; |
2685 | 2698 | ||
2686 | case TIOCGICOUNT: | 2699 | case TIOCGICOUNT: |
2687 | dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, | 2700 | dbg ("%s - (%d) TIOCGICOUNT RX=%d, TX=%d", __FUNCTION__, |
2688 | port->number, edge_port->icount.rx, edge_port->icount.tx); | 2701 | port->number, edge_port->icount.rx, edge_port->icount.tx); |
2689 | if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount))) | 2702 | if (copy_to_user((void __user *)arg, &edge_port->icount, sizeof(edge_port->icount))) |
2690 | return -EFAULT; | 2703 | return -EFAULT; |
2691 | return 0; | 2704 | return 0; |
2692 | } | 2705 | } |
2693 | 2706 | ||
2694 | return -ENOIOCTLCMD; | 2707 | return -ENOIOCTLCMD; |
2695 | } | 2708 | } |
2696 | 2709 | ||
2697 | static void edge_break (struct usb_serial_port *port, int break_state) | 2710 | static void edge_break (struct usb_serial_port *port, int break_state) |
2698 | { | 2711 | { |
2699 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | 2712 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); |
2700 | int status; | 2713 | int status; |
2701 | 2714 | ||
2702 | dbg ("%s - state = %d", __FUNCTION__, break_state); | 2715 | dbg ("%s - state = %d", __FUNCTION__, break_state); |
2703 | 2716 | ||
2704 | /* chase the port close */ | 2717 | /* chase the port close */ |
2705 | TIChasePort (edge_port, 0, 0); | 2718 | TIChasePort (edge_port, 0, 0); |
2706 | 2719 | ||
2707 | if (break_state == -1) { | 2720 | if (break_state == -1) { |
2708 | status = TISetBreak (edge_port); | 2721 | status = TISetBreak (edge_port); |
2709 | } else { | 2722 | } else { |
2710 | status = TIClearBreak (edge_port); | 2723 | status = TIClearBreak (edge_port); |
2711 | } | 2724 | } |
2712 | if (status) { | 2725 | if (status) { |
2713 | dbg ("%s - error %d sending break set/clear command.", | 2726 | dbg ("%s - error %d sending break set/clear command.", |
2714 | __FUNCTION__, status); | 2727 | __FUNCTION__, status); |
2715 | } | 2728 | } |
2716 | } | 2729 | } |
2717 | 2730 | ||
2718 | static int edge_startup (struct usb_serial *serial) | 2731 | static int edge_startup (struct usb_serial *serial) |
2719 | { | 2732 | { |
2720 | struct edgeport_serial *edge_serial; | 2733 | struct edgeport_serial *edge_serial; |
2721 | struct edgeport_port *edge_port; | 2734 | struct edgeport_port *edge_port; |
2722 | struct usb_device *dev; | 2735 | struct usb_device *dev; |
2723 | int status; | 2736 | int status; |
2724 | int i; | 2737 | int i; |
2725 | 2738 | ||
2726 | dev = serial->dev; | 2739 | dev = serial->dev; |
2727 | 2740 | ||
2728 | /* create our private serial structure */ | 2741 | /* create our private serial structure */ |
2729 | edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); | 2742 | edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL); |
2730 | if (edge_serial == NULL) { | 2743 | if (edge_serial == NULL) { |
2731 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); | 2744 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); |
2732 | return -ENOMEM; | 2745 | return -ENOMEM; |
2733 | } | 2746 | } |
2734 | sema_init(&edge_serial->es_sem, 1); | 2747 | sema_init(&edge_serial->es_sem, 1); |
2735 | edge_serial->serial = serial; | 2748 | edge_serial->serial = serial; |
2736 | usb_set_serial_data(serial, edge_serial); | 2749 | usb_set_serial_data(serial, edge_serial); |
2737 | 2750 | ||
2738 | status = TIDownloadFirmware (edge_serial); | 2751 | status = TIDownloadFirmware (edge_serial); |
2739 | if (status) { | 2752 | if (status) { |
2740 | kfree (edge_serial); | 2753 | kfree (edge_serial); |
2741 | return status; | 2754 | return status; |
2742 | } | 2755 | } |
2743 | 2756 | ||
2744 | /* set up our port private structures */ | 2757 | /* set up our port private structures */ |
2745 | for (i = 0; i < serial->num_ports; ++i) { | 2758 | for (i = 0; i < serial->num_ports; ++i) { |
2746 | edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); | 2759 | edge_port = kzalloc(sizeof(struct edgeport_port), GFP_KERNEL); |
2747 | if (edge_port == NULL) { | 2760 | if (edge_port == NULL) { |
2748 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); | 2761 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); |
2749 | goto cleanup; | 2762 | goto cleanup; |
2750 | } | 2763 | } |
2751 | spin_lock_init(&edge_port->ep_lock); | 2764 | spin_lock_init(&edge_port->ep_lock); |
2752 | edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE); | 2765 | edge_port->ep_out_buf = edge_buf_alloc(EDGE_OUT_BUF_SIZE); |
2753 | if (edge_port->ep_out_buf == NULL) { | 2766 | if (edge_port->ep_out_buf == NULL) { |
2754 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); | 2767 | dev_err(&serial->dev->dev, "%s - Out of memory\n", __FUNCTION__); |
2755 | kfree(edge_port); | 2768 | kfree(edge_port); |
2756 | goto cleanup; | 2769 | goto cleanup; |
2757 | } | 2770 | } |
2758 | edge_port->port = serial->port[i]; | 2771 | edge_port->port = serial->port[i]; |
2759 | edge_port->edge_serial = edge_serial; | 2772 | edge_port->edge_serial = edge_serial; |
2760 | usb_set_serial_port_data(serial->port[i], edge_port); | 2773 | usb_set_serial_port_data(serial->port[i], edge_port); |
2761 | edge_port->bUartMode = 0; /* Default is RS232 */ | 2774 | edge_port->bUartMode = default_uart_mode; |
2762 | } | 2775 | } |
2763 | 2776 | ||
2764 | return 0; | 2777 | return 0; |
2765 | 2778 | ||
2766 | cleanup: | 2779 | cleanup: |
2767 | for (--i; i>=0; --i) { | 2780 | for (--i; i>=0; --i) { |
2768 | edge_port = usb_get_serial_port_data(serial->port[i]); | 2781 | edge_port = usb_get_serial_port_data(serial->port[i]); |
2769 | edge_buf_free(edge_port->ep_out_buf); | 2782 | edge_buf_free(edge_port->ep_out_buf); |
2770 | kfree(edge_port); | 2783 | kfree(edge_port); |
2771 | usb_set_serial_port_data(serial->port[i], NULL); | 2784 | usb_set_serial_port_data(serial->port[i], NULL); |
2772 | } | 2785 | } |
2773 | kfree (edge_serial); | 2786 | kfree (edge_serial); |
2774 | usb_set_serial_data(serial, NULL); | 2787 | usb_set_serial_data(serial, NULL); |
2775 | return -ENOMEM; | 2788 | return -ENOMEM; |
2776 | } | 2789 | } |
2777 | 2790 | ||
2778 | static void edge_shutdown (struct usb_serial *serial) | 2791 | static void edge_shutdown (struct usb_serial *serial) |
2779 | { | 2792 | { |
2780 | int i; | 2793 | int i; |
2781 | struct edgeport_port *edge_port; | 2794 | struct edgeport_port *edge_port; |
2782 | 2795 | ||
2783 | dbg ("%s", __FUNCTION__); | 2796 | dbg ("%s", __FUNCTION__); |
2784 | 2797 | ||
2785 | for (i=0; i < serial->num_ports; ++i) { | 2798 | for (i=0; i < serial->num_ports; ++i) { |
2786 | edge_port = usb_get_serial_port_data(serial->port[i]); | 2799 | edge_port = usb_get_serial_port_data(serial->port[i]); |
2800 | edge_remove_sysfs_attrs(edge_port->port); | ||
2787 | if (edge_port) { | 2801 | if (edge_port) { |
2788 | edge_buf_free(edge_port->ep_out_buf); | 2802 | edge_buf_free(edge_port->ep_out_buf); |
2789 | kfree(edge_port); | 2803 | kfree(edge_port); |
2790 | } | 2804 | } |
2791 | usb_set_serial_port_data(serial->port[i], NULL); | 2805 | usb_set_serial_port_data(serial->port[i], NULL); |
2792 | } | 2806 | } |
2793 | kfree (usb_get_serial_data(serial)); | 2807 | kfree (usb_get_serial_data(serial)); |
2794 | usb_set_serial_data(serial, NULL); | 2808 | usb_set_serial_data(serial, NULL); |
2795 | } | 2809 | } |
2796 | 2810 | ||
2797 | 2811 | ||
2812 | /* Sysfs Attributes */ | ||
2813 | |||
2814 | static ssize_t show_uart_mode(struct device *dev, | ||
2815 | struct device_attribute *attr, char *buf) | ||
2816 | { | ||
2817 | struct usb_serial_port *port = to_usb_serial_port(dev); | ||
2818 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | ||
2819 | |||
2820 | return sprintf(buf, "%d\n", edge_port->bUartMode); | ||
2821 | } | ||
2822 | |||
2823 | static ssize_t store_uart_mode(struct device *dev, | ||
2824 | struct device_attribute *attr, const char *valbuf, size_t count) | ||
2825 | { | ||
2826 | struct usb_serial_port *port = to_usb_serial_port(dev); | ||
2827 | struct edgeport_port *edge_port = usb_get_serial_port_data(port); | ||
2828 | unsigned int v = simple_strtoul(valbuf, NULL, 0); | ||
2829 | |||
2830 | dbg("%s: setting uart_mode = %d", __FUNCTION__, v); | ||
2831 | |||
2832 | if (v < 256) | ||
2833 | edge_port->bUartMode = v; | ||
2834 | else | ||
2835 | dev_err(dev, "%s - uart_mode %d is invalid\n", __FUNCTION__, v); | ||
2836 | |||
2837 | return count; | ||
2838 | } | ||
2839 | |||
2840 | static DEVICE_ATTR(uart_mode, S_IWUSR | S_IRUGO, show_uart_mode, store_uart_mode); | ||
2841 | |||
2842 | static int edge_create_sysfs_attrs(struct usb_serial_port *port) | ||
2843 | { | ||
2844 | return device_create_file(&port->dev, &dev_attr_uart_mode); | ||
2845 | } | ||
2846 | |||
2847 | static int edge_remove_sysfs_attrs(struct usb_serial_port *port) | ||
2848 | { | ||
2849 | device_remove_file(&port->dev, &dev_attr_uart_mode); | ||
2850 | return 0; | ||
2851 | } | ||
2852 | |||
2853 | |||
2798 | /* Circular Buffer */ | 2854 | /* Circular Buffer */ |
2799 | 2855 | ||
2800 | /* | 2856 | /* |
2801 | * edge_buf_alloc | 2857 | * edge_buf_alloc |
2802 | * | 2858 | * |
2803 | * Allocate a circular buffer and all associated memory. | 2859 | * Allocate a circular buffer and all associated memory. |
2804 | */ | 2860 | */ |
2805 | 2861 | ||
2806 | static struct edge_buf *edge_buf_alloc(unsigned int size) | 2862 | static struct edge_buf *edge_buf_alloc(unsigned int size) |
2807 | { | 2863 | { |
2808 | struct edge_buf *eb; | 2864 | struct edge_buf *eb; |
2809 | 2865 | ||
2810 | 2866 | ||
2811 | if (size == 0) | 2867 | if (size == 0) |
2812 | return NULL; | 2868 | return NULL; |
2813 | 2869 | ||
2814 | eb = kmalloc(sizeof(struct edge_buf), GFP_KERNEL); | 2870 | eb = kmalloc(sizeof(struct edge_buf), GFP_KERNEL); |
2815 | if (eb == NULL) | 2871 | if (eb == NULL) |
2816 | return NULL; | 2872 | return NULL; |
2817 | 2873 | ||
2818 | eb->buf_buf = kmalloc(size, GFP_KERNEL); | 2874 | eb->buf_buf = kmalloc(size, GFP_KERNEL); |
2819 | if (eb->buf_buf == NULL) { | 2875 | if (eb->buf_buf == NULL) { |
2820 | kfree(eb); | 2876 | kfree(eb); |
2821 | return NULL; | 2877 | return NULL; |
2822 | } | 2878 | } |
2823 | 2879 | ||
2824 | eb->buf_size = size; | 2880 | eb->buf_size = size; |
2825 | eb->buf_get = eb->buf_put = eb->buf_buf; | 2881 | eb->buf_get = eb->buf_put = eb->buf_buf; |
2826 | 2882 | ||
2827 | return eb; | 2883 | return eb; |
2828 | } | 2884 | } |
2829 | 2885 | ||
2830 | 2886 | ||
2831 | /* | 2887 | /* |
2832 | * edge_buf_free | 2888 | * edge_buf_free |
2833 | * | 2889 | * |
2834 | * Free the buffer and all associated memory. | 2890 | * Free the buffer and all associated memory. |
2835 | */ | 2891 | */ |
2836 | 2892 | ||
2837 | static void edge_buf_free(struct edge_buf *eb) | 2893 | static void edge_buf_free(struct edge_buf *eb) |
2838 | { | 2894 | { |
2839 | if (eb) { | 2895 | if (eb) { |
2840 | kfree(eb->buf_buf); | 2896 | kfree(eb->buf_buf); |
2841 | kfree(eb); | 2897 | kfree(eb); |
2842 | } | 2898 | } |
2843 | } | 2899 | } |
2844 | 2900 | ||
2845 | 2901 | ||
2846 | /* | 2902 | /* |
2847 | * edge_buf_clear | 2903 | * edge_buf_clear |
2848 | * | 2904 | * |
2849 | * Clear out all data in the circular buffer. | 2905 | * Clear out all data in the circular buffer. |
2850 | */ | 2906 | */ |
2851 | 2907 | ||
2852 | static void edge_buf_clear(struct edge_buf *eb) | 2908 | static void edge_buf_clear(struct edge_buf *eb) |
2853 | { | 2909 | { |
2854 | if (eb != NULL) | 2910 | if (eb != NULL) |
2855 | eb->buf_get = eb->buf_put; | 2911 | eb->buf_get = eb->buf_put; |
2856 | /* equivalent to a get of all data available */ | 2912 | /* equivalent to a get of all data available */ |
2857 | } | 2913 | } |
2858 | 2914 | ||
2859 | 2915 | ||
2860 | /* | 2916 | /* |
2861 | * edge_buf_data_avail | 2917 | * edge_buf_data_avail |
2862 | * | 2918 | * |
2863 | * Return the number of bytes of data available in the circular | 2919 | * Return the number of bytes of data available in the circular |
2864 | * buffer. | 2920 | * buffer. |
2865 | */ | 2921 | */ |
2866 | 2922 | ||
2867 | static unsigned int edge_buf_data_avail(struct edge_buf *eb) | 2923 | static unsigned int edge_buf_data_avail(struct edge_buf *eb) |
2868 | { | 2924 | { |
2869 | if (eb != NULL) | 2925 | if (eb != NULL) |
2870 | return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size); | 2926 | return ((eb->buf_size + eb->buf_put - eb->buf_get) % eb->buf_size); |
2871 | else | 2927 | else |
2872 | return 0; | 2928 | return 0; |
2873 | } | 2929 | } |
2874 | 2930 | ||
2875 | 2931 | ||
2876 | /* | 2932 | /* |
2877 | * edge_buf_space_avail | 2933 | * edge_buf_space_avail |
2878 | * | 2934 | * |
2879 | * Return the number of bytes of space available in the circular | 2935 | * Return the number of bytes of space available in the circular |
2880 | * buffer. | 2936 | * buffer. |
2881 | */ | 2937 | */ |
2882 | 2938 | ||
2883 | static unsigned int edge_buf_space_avail(struct edge_buf *eb) | 2939 | static unsigned int edge_buf_space_avail(struct edge_buf *eb) |
2884 | { | 2940 | { |
2885 | if (eb != NULL) | 2941 | if (eb != NULL) |
2886 | return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size); | 2942 | return ((eb->buf_size + eb->buf_get - eb->buf_put - 1) % eb->buf_size); |
2887 | else | 2943 | else |
2888 | return 0; | 2944 | return 0; |
2889 | } | 2945 | } |
2890 | 2946 | ||
2891 | 2947 | ||
2892 | /* | 2948 | /* |
2893 | * edge_buf_put | 2949 | * edge_buf_put |
2894 | * | 2950 | * |
2895 | * Copy data data from a user buffer and put it into the circular buffer. | 2951 | * Copy data data from a user buffer and put it into the circular buffer. |
2896 | * Restrict to the amount of space available. | 2952 | * Restrict to the amount of space available. |
2897 | * | 2953 | * |
2898 | * Return the number of bytes copied. | 2954 | * Return the number of bytes copied. |
2899 | */ | 2955 | */ |
2900 | 2956 | ||
2901 | static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, | 2957 | static unsigned int edge_buf_put(struct edge_buf *eb, const char *buf, |
2902 | unsigned int count) | 2958 | unsigned int count) |
2903 | { | 2959 | { |
2904 | unsigned int len; | 2960 | unsigned int len; |
2905 | 2961 | ||
2906 | 2962 | ||
2907 | if (eb == NULL) | 2963 | if (eb == NULL) |
2908 | return 0; | 2964 | return 0; |
2909 | 2965 | ||
2910 | len = edge_buf_space_avail(eb); | 2966 | len = edge_buf_space_avail(eb); |
2911 | if (count > len) | 2967 | if (count > len) |
2912 | count = len; | 2968 | count = len; |
2913 | 2969 | ||
2914 | if (count == 0) | 2970 | if (count == 0) |
2915 | return 0; | 2971 | return 0; |
2916 | 2972 | ||
2917 | len = eb->buf_buf + eb->buf_size - eb->buf_put; | 2973 | len = eb->buf_buf + eb->buf_size - eb->buf_put; |
2918 | if (count > len) { | 2974 | if (count > len) { |
2919 | memcpy(eb->buf_put, buf, len); | 2975 | memcpy(eb->buf_put, buf, len); |
2920 | memcpy(eb->buf_buf, buf+len, count - len); | 2976 | memcpy(eb->buf_buf, buf+len, count - len); |
2921 | eb->buf_put = eb->buf_buf + count - len; | 2977 | eb->buf_put = eb->buf_buf + count - len; |
2922 | } else { | 2978 | } else { |
2923 | memcpy(eb->buf_put, buf, count); | 2979 | memcpy(eb->buf_put, buf, count); |
2924 | if (count < len) | 2980 | if (count < len) |
2925 | eb->buf_put += count; | 2981 | eb->buf_put += count; |
2926 | else /* count == len */ | 2982 | else /* count == len */ |
2927 | eb->buf_put = eb->buf_buf; | 2983 | eb->buf_put = eb->buf_buf; |
2928 | } | 2984 | } |
2929 | 2985 | ||
2930 | return count; | 2986 | return count; |
2931 | } | 2987 | } |
2932 | 2988 | ||
2933 | 2989 | ||
2934 | /* | 2990 | /* |
2935 | * edge_buf_get | 2991 | * edge_buf_get |
2936 | * | 2992 | * |
2937 | * Get data from the circular buffer and copy to the given buffer. | 2993 | * Get data from the circular buffer and copy to the given buffer. |
2938 | * Restrict to the amount of data available. | 2994 | * Restrict to the amount of data available. |
2939 | * | 2995 | * |
2940 | * Return the number of bytes copied. | 2996 | * Return the number of bytes copied. |
2941 | */ | 2997 | */ |
2942 | 2998 | ||
2943 | static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, | 2999 | static unsigned int edge_buf_get(struct edge_buf *eb, char *buf, |
2944 | unsigned int count) | 3000 | unsigned int count) |
2945 | { | 3001 | { |
2946 | unsigned int len; | 3002 | unsigned int len; |
2947 | 3003 | ||
2948 | 3004 | ||
2949 | if (eb == NULL) | 3005 | if (eb == NULL) |
2950 | return 0; | 3006 | return 0; |
2951 | 3007 | ||
2952 | len = edge_buf_data_avail(eb); | 3008 | len = edge_buf_data_avail(eb); |
2953 | if (count > len) | 3009 | if (count > len) |
2954 | count = len; | 3010 | count = len; |
2955 | 3011 | ||
2956 | if (count == 0) | 3012 | if (count == 0) |
2957 | return 0; | 3013 | return 0; |
2958 | 3014 | ||
2959 | len = eb->buf_buf + eb->buf_size - eb->buf_get; | 3015 | len = eb->buf_buf + eb->buf_size - eb->buf_get; |
2960 | if (count > len) { | 3016 | if (count > len) { |
2961 | memcpy(buf, eb->buf_get, len); | 3017 | memcpy(buf, eb->buf_get, len); |
2962 | memcpy(buf+len, eb->buf_buf, count - len); | 3018 | memcpy(buf+len, eb->buf_buf, count - len); |
2963 | eb->buf_get = eb->buf_buf + count - len; | 3019 | eb->buf_get = eb->buf_buf + count - len; |
2964 | } else { | 3020 | } else { |
2965 | memcpy(buf, eb->buf_get, count); | 3021 | memcpy(buf, eb->buf_get, count); |
2966 | if (count < len) | 3022 | if (count < len) |
2967 | eb->buf_get += count; | 3023 | eb->buf_get += count; |
2968 | else /* count == len */ | 3024 | else /* count == len */ |
2969 | eb->buf_get = eb->buf_buf; | 3025 | eb->buf_get = eb->buf_buf; |
2970 | } | 3026 | } |
2971 | 3027 | ||
2972 | return count; | 3028 | return count; |
2973 | } | 3029 | } |
2974 | 3030 | ||
2975 | 3031 | ||
2976 | static struct usb_serial_driver edgeport_1port_device = { | 3032 | static struct usb_serial_driver edgeport_1port_device = { |
2977 | .driver = { | 3033 | .driver = { |
2978 | .owner = THIS_MODULE, | 3034 | .owner = THIS_MODULE, |
2979 | .name = "edgeport_ti_1", | 3035 | .name = "edgeport_ti_1", |
2980 | }, | 3036 | }, |
2981 | .description = "Edgeport TI 1 port adapter", | 3037 | .description = "Edgeport TI 1 port adapter", |
2982 | .usb_driver = &io_driver, | 3038 | .usb_driver = &io_driver, |
2983 | .id_table = edgeport_1port_id_table, | 3039 | .id_table = edgeport_1port_id_table, |
2984 | .num_interrupt_in = 1, | 3040 | .num_interrupt_in = 1, |
2985 | .num_bulk_in = 1, | 3041 | .num_bulk_in = 1, |
2986 | .num_bulk_out = 1, | 3042 | .num_bulk_out = 1, |
2987 | .num_ports = 1, | 3043 | .num_ports = 1, |
2988 | .open = edge_open, | 3044 | .open = edge_open, |
2989 | .close = edge_close, | 3045 | .close = edge_close, |
2990 | .throttle = edge_throttle, | 3046 | .throttle = edge_throttle, |
2991 | .unthrottle = edge_unthrottle, | 3047 | .unthrottle = edge_unthrottle, |
2992 | .attach = edge_startup, | 3048 | .attach = edge_startup, |
2993 | .shutdown = edge_shutdown, | 3049 | .shutdown = edge_shutdown, |
3050 | .port_probe = edge_create_sysfs_attrs, | ||
2994 | .ioctl = edge_ioctl, | 3051 | .ioctl = edge_ioctl, |
2995 | .set_termios = edge_set_termios, | 3052 | .set_termios = edge_set_termios, |
2996 | .tiocmget = edge_tiocmget, | 3053 | .tiocmget = edge_tiocmget, |
2997 | .tiocmset = edge_tiocmset, | 3054 | .tiocmset = edge_tiocmset, |
2998 | .write = edge_write, | 3055 | .write = edge_write, |
2999 | .write_room = edge_write_room, | 3056 | .write_room = edge_write_room, |
3000 | .chars_in_buffer = edge_chars_in_buffer, | 3057 | .chars_in_buffer = edge_chars_in_buffer, |
3001 | .break_ctl = edge_break, | 3058 | .break_ctl = edge_break, |
3002 | .read_int_callback = edge_interrupt_callback, | 3059 | .read_int_callback = edge_interrupt_callback, |
3003 | .read_bulk_callback = edge_bulk_in_callback, | 3060 | .read_bulk_callback = edge_bulk_in_callback, |
3004 | .write_bulk_callback = edge_bulk_out_callback, | 3061 | .write_bulk_callback = edge_bulk_out_callback, |
3005 | }; | 3062 | }; |
3006 | 3063 | ||
3007 | static struct usb_serial_driver edgeport_2port_device = { | 3064 | static struct usb_serial_driver edgeport_2port_device = { |
3008 | .driver = { | 3065 | .driver = { |
3009 | .owner = THIS_MODULE, | 3066 | .owner = THIS_MODULE, |
3010 | .name = "edgeport_ti_2", | 3067 | .name = "edgeport_ti_2", |
3011 | }, | 3068 | }, |
3012 | .description = "Edgeport TI 2 port adapter", | 3069 | .description = "Edgeport TI 2 port adapter", |
3013 | .usb_driver = &io_driver, | 3070 | .usb_driver = &io_driver, |
3014 | .id_table = edgeport_2port_id_table, | 3071 | .id_table = edgeport_2port_id_table, |
3015 | .num_interrupt_in = 1, | 3072 | .num_interrupt_in = 1, |
3016 | .num_bulk_in = 2, | 3073 | .num_bulk_in = 2, |
3017 | .num_bulk_out = 2, | 3074 | .num_bulk_out = 2, |
3018 | .num_ports = 2, | 3075 | .num_ports = 2, |
3019 | .open = edge_open, | 3076 | .open = edge_open, |
3020 | .close = edge_close, | 3077 | .close = edge_close, |
3021 | .throttle = edge_throttle, | 3078 | .throttle = edge_throttle, |
3022 | .unthrottle = edge_unthrottle, | 3079 | .unthrottle = edge_unthrottle, |
3023 | .attach = edge_startup, | 3080 | .attach = edge_startup, |
3024 | .shutdown = edge_shutdown, | 3081 | .shutdown = edge_shutdown, |
3082 | .port_probe = edge_create_sysfs_attrs, | ||
3025 | .ioctl = edge_ioctl, | 3083 | .ioctl = edge_ioctl, |
3026 | .set_termios = edge_set_termios, | 3084 | .set_termios = edge_set_termios, |
3027 | .tiocmget = edge_tiocmget, | 3085 | .tiocmget = edge_tiocmget, |
3028 | .tiocmset = edge_tiocmset, | 3086 | .tiocmset = edge_tiocmset, |
3029 | .write = edge_write, | 3087 | .write = edge_write, |
3030 | .write_room = edge_write_room, | 3088 | .write_room = edge_write_room, |
3031 | .chars_in_buffer = edge_chars_in_buffer, | 3089 | .chars_in_buffer = edge_chars_in_buffer, |
3032 | .break_ctl = edge_break, | 3090 | .break_ctl = edge_break, |
3033 | .read_int_callback = edge_interrupt_callback, | 3091 | .read_int_callback = edge_interrupt_callback, |
3034 | .read_bulk_callback = edge_bulk_in_callback, | 3092 | .read_bulk_callback = edge_bulk_in_callback, |
3035 | .write_bulk_callback = edge_bulk_out_callback, | 3093 | .write_bulk_callback = edge_bulk_out_callback, |
3036 | }; | 3094 | }; |
3037 | 3095 | ||
3038 | 3096 | ||
3039 | static int __init edgeport_init(void) | 3097 | static int __init edgeport_init(void) |
3040 | { | 3098 | { |
3041 | int retval; | 3099 | int retval; |
3042 | retval = usb_serial_register(&edgeport_1port_device); | 3100 | retval = usb_serial_register(&edgeport_1port_device); |
3043 | if (retval) | 3101 | if (retval) |
3044 | goto failed_1port_device_register; | 3102 | goto failed_1port_device_register; |
3045 | retval = usb_serial_register(&edgeport_2port_device); | 3103 | retval = usb_serial_register(&edgeport_2port_device); |
3046 | if (retval) | 3104 | if (retval) |
3047 | goto failed_2port_device_register; | 3105 | goto failed_2port_device_register; |
3048 | retval = usb_register(&io_driver); | 3106 | retval = usb_register(&io_driver); |
3049 | if (retval) | 3107 | if (retval) |
3050 | goto failed_usb_register; | 3108 | goto failed_usb_register; |
3051 | info(DRIVER_DESC " " DRIVER_VERSION); | 3109 | info(DRIVER_DESC " " DRIVER_VERSION); |
3052 | return 0; | 3110 | return 0; |
3053 | failed_usb_register: | 3111 | failed_usb_register: |
3054 | usb_serial_deregister(&edgeport_2port_device); | 3112 | usb_serial_deregister(&edgeport_2port_device); |
3055 | failed_2port_device_register: | 3113 | failed_2port_device_register: |
3056 | usb_serial_deregister(&edgeport_1port_device); | 3114 | usb_serial_deregister(&edgeport_1port_device); |
3057 | failed_1port_device_register: | 3115 | failed_1port_device_register: |
3058 | return retval; | 3116 | return retval; |
3059 | } | 3117 | } |
3060 | 3118 | ||
3061 | static void __exit edgeport_exit (void) | 3119 | static void __exit edgeport_exit (void) |
3062 | { | 3120 | { |
3063 | usb_deregister (&io_driver); | 3121 | usb_deregister (&io_driver); |
3064 | usb_serial_deregister (&edgeport_1port_device); | 3122 | usb_serial_deregister (&edgeport_1port_device); |
3065 | usb_serial_deregister (&edgeport_2port_device); | 3123 | usb_serial_deregister (&edgeport_2port_device); |
3066 | } | 3124 | } |
3067 | 3125 | ||
3068 | module_init(edgeport_init); | 3126 | module_init(edgeport_init); |
3069 | module_exit(edgeport_exit); | 3127 | module_exit(edgeport_exit); |
3070 | 3128 | ||
3071 | /* Module information */ | 3129 | /* Module information */ |
3072 | MODULE_AUTHOR(DRIVER_AUTHOR); | 3130 | MODULE_AUTHOR(DRIVER_AUTHOR); |
3073 | MODULE_DESCRIPTION(DRIVER_DESC); | 3131 | MODULE_DESCRIPTION(DRIVER_DESC); |
3074 | MODULE_LICENSE("GPL"); | 3132 | MODULE_LICENSE("GPL"); |
3075 | 3133 | ||
3076 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 3134 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
3077 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 3135 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
3078 | 3136 | ||
3079 | module_param(low_latency, bool, S_IRUGO | S_IWUSR); | 3137 | module_param(low_latency, bool, S_IRUGO | S_IWUSR); |
3080 | MODULE_PARM_DESC(low_latency, "Low latency enabled or not"); | 3138 | MODULE_PARM_DESC(low_latency, "Low latency enabled or not"); |
3081 | 3139 | ||
3082 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); | 3140 | module_param(closing_wait, int, S_IRUGO | S_IWUSR); |
3083 | MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); | 3141 | MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs"); |
3084 | 3142 | ||
3085 | module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR); | 3143 | module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR); |
3086 | MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device"); | 3144 | MODULE_PARM_DESC(ignore_cpu_rev, "Ignore the cpu revision when connecting to a device"); |
3145 | |||
3146 | module_param(default_uart_mode, int, S_IRUGO | S_IWUSR); | ||
3147 | MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ..."); | ||
3087 | 3148 | ||
3088 | 3149 |
drivers/usb/serial/io_usbvend.h
1 | /************************************************************************ | 1 | /************************************************************************ |
2 | * | 2 | * |
3 | * USBVEND.H Vendor-specific USB definitions | 3 | * USBVEND.H Vendor-specific USB definitions |
4 | * | 4 | * |
5 | * NOTE: This must be kept in sync with the Edgeport firmware and | 5 | * NOTE: This must be kept in sync with the Edgeport firmware and |
6 | * must be kept backward-compatible with older firmware. | 6 | * must be kept backward-compatible with older firmware. |
7 | * | 7 | * |
8 | ************************************************************************ | 8 | ************************************************************************ |
9 | * | 9 | * |
10 | * Copyright (C) 1998 Inside Out Networks, Inc. | 10 | * Copyright (C) 1998 Inside Out Networks, Inc. |
11 | * This program is free software; you can redistribute it and/or modify | 11 | * This program is free software; you can redistribute it and/or modify |
12 | * it under the terms of the GNU General Public License as published by | 12 | * it under the terms of the GNU General Public License as published by |
13 | * the Free Software Foundation; either version 2 of the License, or | 13 | * the Free Software Foundation; either version 2 of the License, or |
14 | * (at your option) any later version. | 14 | * (at your option) any later version. |
15 | * | 15 | * |
16 | ************************************************************************/ | 16 | ************************************************************************/ |
17 | 17 | ||
18 | #if !defined(_USBVEND_H) | 18 | #if !defined(_USBVEND_H) |
19 | #define _USBVEND_H | 19 | #define _USBVEND_H |
20 | 20 | ||
21 | /************************************************************************ | 21 | /************************************************************************ |
22 | * | 22 | * |
23 | * D e f i n e s / T y p e d e f s | 23 | * D e f i n e s / T y p e d e f s |
24 | * | 24 | * |
25 | ************************************************************************/ | 25 | ************************************************************************/ |
26 | 26 | ||
27 | // | 27 | // |
28 | // Definitions of USB product IDs | 28 | // Definitions of USB product IDs |
29 | // | 29 | // |
30 | 30 | ||
31 | #define USB_VENDOR_ID_ION 0x1608 // Our VID | 31 | #define USB_VENDOR_ID_ION 0x1608 // Our VID |
32 | #define USB_VENDOR_ID_TI 0x0451 // TI VID | 32 | #define USB_VENDOR_ID_TI 0x0451 // TI VID |
33 | #define USB_VENDOR_ID_AXIOHM 0x05D9 /* Axiohm VID */ | 33 | #define USB_VENDOR_ID_AXIOHM 0x05D9 /* Axiohm VID */ |
34 | 34 | ||
35 | // | 35 | // |
36 | // Definitions of USB product IDs (PID) | 36 | // Definitions of USB product IDs (PID) |
37 | // We break the USB-defined PID into an OEM Id field (upper 6 bits) | 37 | // We break the USB-defined PID into an OEM Id field (upper 6 bits) |
38 | // and a Device Id (bottom 10 bits). The Device Id defines what | 38 | // and a Device Id (bottom 10 bits). The Device Id defines what |
39 | // device this actually is regardless of what the OEM wants to | 39 | // device this actually is regardless of what the OEM wants to |
40 | // call it. | 40 | // call it. |
41 | // | 41 | // |
42 | 42 | ||
43 | // ION-device OEM IDs | 43 | // ION-device OEM IDs |
44 | #define ION_OEM_ID_ION 0 // 00h Inside Out Networks | 44 | #define ION_OEM_ID_ION 0 // 00h Inside Out Networks |
45 | #define ION_OEM_ID_NLYNX 1 // 01h NLynx Systems | 45 | #define ION_OEM_ID_NLYNX 1 // 01h NLynx Systems |
46 | #define ION_OEM_ID_GENERIC 2 // 02h Generic OEM | 46 | #define ION_OEM_ID_GENERIC 2 // 02h Generic OEM |
47 | #define ION_OEM_ID_MAC 3 // 03h Mac Version | 47 | #define ION_OEM_ID_MAC 3 // 03h Mac Version |
48 | #define ION_OEM_ID_MEGAWOLF 4 // 04h Lupusb OEM Mac version (MegaWolf) | 48 | #define ION_OEM_ID_MEGAWOLF 4 // 04h Lupusb OEM Mac version (MegaWolf) |
49 | #define ION_OEM_ID_MULTITECH 5 // 05h Multitech Rapidports | 49 | #define ION_OEM_ID_MULTITECH 5 // 05h Multitech Rapidports |
50 | #define ION_OEM_ID_AGILENT 6 // 06h AGILENT board | 50 | #define ION_OEM_ID_AGILENT 6 // 06h AGILENT board |
51 | 51 | ||
52 | 52 | ||
53 | // ION-device Device IDs | 53 | // ION-device Device IDs |
54 | // Product IDs - assigned to match middle digit of serial number (No longer true) | 54 | // Product IDs - assigned to match middle digit of serial number (No longer true) |
55 | 55 | ||
56 | #define ION_DEVICE_ID_80251_NETCHIP 0x020 // This bit is set in the PID if this edgeport hardware$ | 56 | #define ION_DEVICE_ID_80251_NETCHIP 0x020 // This bit is set in the PID if this edgeport hardware$ |
57 | // is based on the 80251+Netchip. | 57 | // is based on the 80251+Netchip. |
58 | 58 | ||
59 | #define ION_DEVICE_ID_GENERATION_1 0x00 // Value for 930 based edgeports | 59 | #define ION_DEVICE_ID_GENERATION_1 0x00 // Value for 930 based edgeports |
60 | #define ION_DEVICE_ID_GENERATION_2 0x01 // Value for 80251+Netchip. | 60 | #define ION_DEVICE_ID_GENERATION_2 0x01 // Value for 80251+Netchip. |
61 | #define ION_DEVICE_ID_GENERATION_3 0x02 // Value for Texas Instruments TUSB5052 chip | 61 | #define ION_DEVICE_ID_GENERATION_3 0x02 // Value for Texas Instruments TUSB5052 chip |
62 | #define ION_DEVICE_ID_GENERATION_4 0x03 // Watchport Family of products | 62 | #define ION_DEVICE_ID_GENERATION_4 0x03 // Watchport Family of products |
63 | #define ION_GENERATION_MASK 0x03 | 63 | #define ION_GENERATION_MASK 0x03 |
64 | 64 | ||
65 | #define ION_DEVICE_ID_HUB_MASK 0x0080 // This bit in the PID designates a HUB device | 65 | #define ION_DEVICE_ID_HUB_MASK 0x0080 // This bit in the PID designates a HUB device |
66 | // for example 8C would be a 421 4 port hub | 66 | // for example 8C would be a 421 4 port hub |
67 | // and 8D would be a 2 port embedded hub | 67 | // and 8D would be a 2 port embedded hub |
68 | 68 | ||
69 | #define EDGEPORT_DEVICE_ID_MASK 0x0ff // Not including OEM or GENERATION fields | 69 | #define EDGEPORT_DEVICE_ID_MASK 0x0ff // Not including OEM or GENERATION fields |
70 | 70 | ||
71 | #define ION_DEVICE_ID_UNCONFIGURED_EDGE_DEVICE 0x000 // In manufacturing only | 71 | #define ION_DEVICE_ID_UNCONFIGURED_EDGE_DEVICE 0x000 // In manufacturing only |
72 | #define ION_DEVICE_ID_EDGEPORT_4 0x001 // Edgeport/4 RS232 | 72 | #define ION_DEVICE_ID_EDGEPORT_4 0x001 // Edgeport/4 RS232 |
73 | #define ION_DEVICE_ID_EDGEPORT_8R 0x002 // Edgeport with RJ45 no Ring | 73 | #define ION_DEVICE_ID_EDGEPORT_8R 0x002 // Edgeport with RJ45 no Ring |
74 | #define ION_DEVICE_ID_RAPIDPORT_4 0x003 // Rapidport/4 | 74 | #define ION_DEVICE_ID_RAPIDPORT_4 0x003 // Rapidport/4 |
75 | #define ION_DEVICE_ID_EDGEPORT_4T 0x004 // Edgeport/4 RS232 for Telxon (aka "Fleetport") | 75 | #define ION_DEVICE_ID_EDGEPORT_4T 0x004 // Edgeport/4 RS232 for Telxon (aka "Fleetport") |
76 | #define ION_DEVICE_ID_EDGEPORT_2 0x005 // Edgeport/2 RS232 | 76 | #define ION_DEVICE_ID_EDGEPORT_2 0x005 // Edgeport/2 RS232 |
77 | #define ION_DEVICE_ID_EDGEPORT_4I 0x006 // Edgeport/4 RS422 | 77 | #define ION_DEVICE_ID_EDGEPORT_4I 0x006 // Edgeport/4 RS422 |
78 | #define ION_DEVICE_ID_EDGEPORT_2I 0x007 // Edgeport/2 RS422/RS485 | 78 | #define ION_DEVICE_ID_EDGEPORT_2I 0x007 // Edgeport/2 RS422/RS485 |
79 | #define ION_DEVICE_ID_EDGEPORT_8RR 0x008 // Edgeport with RJ45 with Data and RTS/CTS only | 79 | #define ION_DEVICE_ID_EDGEPORT_8RR 0x008 // Edgeport with RJ45 with Data and RTS/CTS only |
80 | // ION_DEVICE_ID_EDGEPORT_8_HANDBUILT 0x009 // Hand-built Edgeport/8 (Placeholder, used in middle digit of serial number only!) | 80 | // ION_DEVICE_ID_EDGEPORT_8_HANDBUILT 0x009 // Hand-built Edgeport/8 (Placeholder, used in middle digit of serial number only!) |
81 | // ION_DEVICE_ID_MULTIMODEM_4X56 0x00A // MultiTech version of RP/4 (Placeholder, used in middle digit of serial number only!) | 81 | // ION_DEVICE_ID_MULTIMODEM_4X56 0x00A // MultiTech version of RP/4 (Placeholder, used in middle digit of serial number only!) |
82 | #define ION_DEVICE_ID_EDGEPORT_PARALLEL_PORT 0x00B // Edgeport/(4)21 Parallel port (USS720) | 82 | #define ION_DEVICE_ID_EDGEPORT_PARALLEL_PORT 0x00B // Edgeport/(4)21 Parallel port (USS720) |
83 | #define ION_DEVICE_ID_EDGEPORT_421 0x00C // Edgeport/421 Hub+RS232+Parallel | 83 | #define ION_DEVICE_ID_EDGEPORT_421 0x00C // Edgeport/421 Hub+RS232+Parallel |
84 | #define ION_DEVICE_ID_EDGEPORT_21 0x00D // Edgeport/21 RS232+Parallel | 84 | #define ION_DEVICE_ID_EDGEPORT_21 0x00D // Edgeport/21 RS232+Parallel |
85 | #define ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU 0x00E // Half of an Edgeport/8 (the kind with 2 EP/4s on 1 PCB) | 85 | #define ION_DEVICE_ID_EDGEPORT_8_DUAL_CPU 0x00E // Half of an Edgeport/8 (the kind with 2 EP/4s on 1 PCB) |
86 | #define ION_DEVICE_ID_EDGEPORT_8 0x00F // Edgeport/8 (single-CPU) | 86 | #define ION_DEVICE_ID_EDGEPORT_8 0x00F // Edgeport/8 (single-CPU) |
87 | #define ION_DEVICE_ID_EDGEPORT_2_DIN 0x010 // Edgeport/2 RS232 with Apple DIN connector | 87 | #define ION_DEVICE_ID_EDGEPORT_2_DIN 0x010 // Edgeport/2 RS232 with Apple DIN connector |
88 | #define ION_DEVICE_ID_EDGEPORT_4_DIN 0x011 // Edgeport/4 RS232 with Apple DIN connector | 88 | #define ION_DEVICE_ID_EDGEPORT_4_DIN 0x011 // Edgeport/4 RS232 with Apple DIN connector |
89 | #define ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU 0x012 // Half of an Edgeport/16 (the kind with 2 EP/8s) | 89 | #define ION_DEVICE_ID_EDGEPORT_16_DUAL_CPU 0x012 // Half of an Edgeport/16 (the kind with 2 EP/8s) |
90 | #define ION_DEVICE_ID_EDGEPORT_COMPATIBLE 0x013 // Edgeport Compatible, for NCR, Axiohm etc. testing | 90 | #define ION_DEVICE_ID_EDGEPORT_COMPATIBLE 0x013 // Edgeport Compatible, for NCR, Axiohm etc. testing |
91 | #define ION_DEVICE_ID_EDGEPORT_8I 0x014 // Edgeport/8 RS422 (single-CPU) | 91 | #define ION_DEVICE_ID_EDGEPORT_8I 0x014 // Edgeport/8 RS422 (single-CPU) |
92 | #define ION_DEVICE_ID_EDGEPORT_1 0x015 // Edgeport/1 RS232 | 92 | #define ION_DEVICE_ID_EDGEPORT_1 0x015 // Edgeport/1 RS232 |
93 | #define ION_DEVICE_ID_EPOS44 0x016 // Half of an EPOS/44 (TIUMP BASED) | 93 | #define ION_DEVICE_ID_EPOS44 0x016 // Half of an EPOS/44 (TIUMP BASED) |
94 | #define ION_DEVICE_ID_EDGEPORT_42 0x017 // Edgeport/42 | 94 | #define ION_DEVICE_ID_EDGEPORT_42 0x017 // Edgeport/42 |
95 | #define ION_DEVICE_ID_EDGEPORT_412_8 0x018 // Edgeport/412 8 port part | 95 | #define ION_DEVICE_ID_EDGEPORT_412_8 0x018 // Edgeport/412 8 port part |
96 | #define ION_DEVICE_ID_EDGEPORT_412_4 0x019 // Edgeport/412 4 port part | 96 | #define ION_DEVICE_ID_EDGEPORT_412_4 0x019 // Edgeport/412 4 port part |
97 | #define ION_DEVICE_ID_EDGEPORT_22I 0x01A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 | 97 | #define ION_DEVICE_ID_EDGEPORT_22I 0x01A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 |
98 | 98 | ||
99 | // Compact Form factor TI based devices 2c, 21c, 22c, 221c | 99 | // Compact Form factor TI based devices 2c, 21c, 22c, 221c |
100 | #define ION_DEVICE_ID_EDGEPORT_2C 0x01B // Edgeport/2c is a TI based Edgeport/2 - Small I2c | 100 | #define ION_DEVICE_ID_EDGEPORT_2C 0x01B // Edgeport/2c is a TI based Edgeport/2 - Small I2c |
101 | #define ION_DEVICE_ID_EDGEPORT_221C 0x01C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and | 101 | #define ION_DEVICE_ID_EDGEPORT_221C 0x01C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and |
102 | // 2 external hub ports - Large I2C | 102 | // 2 external hub ports - Large I2C |
103 | #define ION_DEVICE_ID_EDGEPORT_22C 0x01D // Edgeport/22c is a TI based Edgeport/2 with | 103 | #define ION_DEVICE_ID_EDGEPORT_22C 0x01D // Edgeport/22c is a TI based Edgeport/2 with |
104 | // 2 external hub ports - Large I2C | 104 | // 2 external hub ports - Large I2C |
105 | #define ION_DEVICE_ID_EDGEPORT_21C 0x01E // Edgeport/21c is a TI based Edgeport/2 with lucent chip | 105 | #define ION_DEVICE_ID_EDGEPORT_21C 0x01E // Edgeport/21c is a TI based Edgeport/2 with lucent chip |
106 | // Small I2C | 106 | // Small I2C |
107 | 107 | ||
108 | 108 | ||
109 | /* | 109 | /* |
110 | * DANGER DANGER The 0x20 bit was used to indicate a 8251/netchip GEN 2 device. | 110 | * DANGER DANGER The 0x20 bit was used to indicate a 8251/netchip GEN 2 device. |
111 | * Since the MAC, Linux, and Optimal drivers still used the old code | 111 | * Since the MAC, Linux, and Optimal drivers still used the old code |
112 | * I suggest that you skip the 0x20 bit when creating new PIDs | 112 | * I suggest that you skip the 0x20 bit when creating new PIDs |
113 | */ | 113 | */ |
114 | 114 | ||
115 | 115 | ||
116 | // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) | 116 | // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) |
117 | #define ION_DEVICE_ID_TI3410_EDGEPORT_1 0x040 // Edgeport/1 RS232 | 117 | #define ION_DEVICE_ID_TI3410_EDGEPORT_1 0x040 // Edgeport/1 RS232 |
118 | #define ION_DEVICE_ID_TI3410_EDGEPORT_1I 0x041 // Edgeport/1i- RS422 model | 118 | #define ION_DEVICE_ID_TI3410_EDGEPORT_1I 0x041 // Edgeport/1i- RS422 model |
119 | 119 | ||
120 | // Ti based software switchable RS232/RS422/RS485 devices | 120 | // Ti based software switchable RS232/RS422/RS485 devices |
121 | #define ION_DEVICE_ID_EDGEPORT_4S 0x042 // Edgeport/4s - software switchable model | 121 | #define ION_DEVICE_ID_EDGEPORT_4S 0x042 // Edgeport/4s - software switchable model |
122 | #define ION_DEVICE_ID_EDGEPORT_8S 0x043 // Edgeport/8s - software switchable model | 122 | #define ION_DEVICE_ID_EDGEPORT_8S 0x043 // Edgeport/8s - software switchable model |
123 | 123 | ||
124 | // Usb to Ethernet dongle | 124 | // Usb to Ethernet dongle |
125 | #define ION_DEVICE_ID_EDGEPORT_E 0x0E0 // Edgeport/E Usb to Ethernet | 125 | #define ION_DEVICE_ID_EDGEPORT_E 0x0E0 // Edgeport/E Usb to Ethernet |
126 | 126 | ||
127 | // Edgeport TI based devices | 127 | // Edgeport TI based devices |
128 | #define ION_DEVICE_ID_TI_EDGEPORT_4 0x0201 // Edgeport/4 RS232 | 128 | #define ION_DEVICE_ID_TI_EDGEPORT_4 0x0201 // Edgeport/4 RS232 |
129 | #define ION_DEVICE_ID_TI_EDGEPORT_2 0x0205 // Edgeport/2 RS232 | 129 | #define ION_DEVICE_ID_TI_EDGEPORT_2 0x0205 // Edgeport/2 RS232 |
130 | #define ION_DEVICE_ID_TI_EDGEPORT_4I 0x0206 // Edgeport/4i RS422 | 130 | #define ION_DEVICE_ID_TI_EDGEPORT_4I 0x0206 // Edgeport/4i RS422 |
131 | #define ION_DEVICE_ID_TI_EDGEPORT_2I 0x0207 // Edgeport/2i RS422/RS485 | 131 | #define ION_DEVICE_ID_TI_EDGEPORT_2I 0x0207 // Edgeport/2i RS422/RS485 |
132 | #define ION_DEVICE_ID_TI_EDGEPORT_421 0x020C // Edgeport/421 4 hub 2 RS232 + Parallel (lucent on a different hub port) | 132 | #define ION_DEVICE_ID_TI_EDGEPORT_421 0x020C // Edgeport/421 4 hub 2 RS232 + Parallel (lucent on a different hub port) |
133 | #define ION_DEVICE_ID_TI_EDGEPORT_21 0x020D // Edgeport/21 2 RS232 + Parallel (lucent on a different hub port) | 133 | #define ION_DEVICE_ID_TI_EDGEPORT_21 0x020D // Edgeport/21 2 RS232 + Parallel (lucent on a different hub port) |
134 | #define ION_DEVICE_ID_TI_EDGEPORT_8 0x020F // Edgeport/8 (single-CPU) | 134 | #define ION_DEVICE_ID_TI_EDGEPORT_416 0x0212 // Edgeport/416 |
135 | #define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 // Edgeport/1 RS232 | 135 | #define ION_DEVICE_ID_TI_EDGEPORT_1 0x0215 // Edgeport/1 RS232 |
136 | #define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 // Edgeport/42 4 hub 2 RS232 | 136 | #define ION_DEVICE_ID_TI_EDGEPORT_42 0x0217 // Edgeport/42 4 hub 2 RS232 |
137 | #define ION_DEVICE_ID_TI_EDGEPORT_22I 0x021A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 | 137 | #define ION_DEVICE_ID_TI_EDGEPORT_22I 0x021A // Edgeport/22I is an Edgeport/4 with ports 1&2 RS422 and ports 3&4 RS232 |
138 | #define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B // Edgeport/2c RS232 | 138 | #define ION_DEVICE_ID_TI_EDGEPORT_2C 0x021B // Edgeport/2c RS232 |
139 | #define ION_DEVICE_ID_TI_EDGEPORT_221C 0x021C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and | 139 | #define ION_DEVICE_ID_TI_EDGEPORT_221C 0x021C // Edgeport/221c is a TI based Edgeport/2 with lucent chip and |
140 | // 2 external hub ports - Large I2C | 140 | // 2 external hub ports - Large I2C |
141 | #define ION_DEVICE_ID_TI_EDGEPORT_22C 0x021D // Edgeport/22c is a TI based Edgeport/2 with | 141 | #define ION_DEVICE_ID_TI_EDGEPORT_22C 0x021D // Edgeport/22c is a TI based Edgeport/2 with |
142 | // 2 external hub ports - Large I2C | 142 | // 2 external hub ports - Large I2C |
143 | #define ION_DEVICE_ID_TI_EDGEPORT_21C 0x021E // Edgeport/21c is a TI based Edgeport/2 with lucent chip | 143 | #define ION_DEVICE_ID_TI_EDGEPORT_21C 0x021E // Edgeport/21c is a TI based Edgeport/2 with lucent chip |
144 | 144 | ||
145 | // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) | 145 | // Generation 3 devices -- 3410 based edgport/1 (256 byte I2C) |
146 | #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1 0x240 // Edgeport/1 RS232 | 146 | #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1 0x0240 // Edgeport/1 RS232 |
147 | #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I 0x241 // Edgeport/1i- RS422 model | 147 | #define ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I 0x0241 // Edgeport/1i- RS422 model |
148 | 148 | ||
149 | // Ti based software switchable RS232/RS422/RS485 devices | 149 | // Ti based software switchable RS232/RS422/RS485 devices |
150 | #define ION_DEVICE_ID_TI_EDGEPORT_4S 0x242 // Edgeport/4s - software switchable model | 150 | #define ION_DEVICE_ID_TI_EDGEPORT_4S 0x0242 // Edgeport/4s - software switchable model |
151 | #define ION_DEVICE_ID_IT_EDGEPORT_8S 0x243 // Edgeport/8s - software switchable model | 151 | #define ION_DEVICE_ID_TI_EDGEPORT_8S 0x0243 // Edgeport/8s - software switchable model |
152 | #define ION_DEVICE_ID_TI_EDGEPORT_8 0x0244 // Edgeport/8 (single-CPU) | ||
153 | #define ION_DEVICE_ID_TI_EDGEPORT_416B 0x0247 // Edgeport/416 | ||
152 | 154 | ||
153 | 155 | ||
154 | /************************************************************************ | 156 | /************************************************************************ |
155 | * | 157 | * |
156 | * Generation 4 devices | 158 | * Generation 4 devices |
157 | * | 159 | * |
158 | ************************************************************************/ | 160 | ************************************************************************/ |
159 | 161 | ||
160 | // Watchport based on 3410 both 1-wire and binary products (16K I2C) | 162 | // Watchport based on 3410 both 1-wire and binary products (16K I2C) |
161 | #define ION_DEVICE_ID_WP_UNSERIALIZED 0x300 // Watchport based on 3410 both 1-wire and binary products | 163 | #define ION_DEVICE_ID_WP_UNSERIALIZED 0x300 // Watchport based on 3410 both 1-wire and binary products |
162 | #define ION_DEVICE_ID_WP_PROXIMITY 0x301 // Watchport/P Discontinued | 164 | #define ION_DEVICE_ID_WP_PROXIMITY 0x301 // Watchport/P Discontinued |
163 | #define ION_DEVICE_ID_WP_MOTION 0x302 // Watchport/M | 165 | #define ION_DEVICE_ID_WP_MOTION 0x302 // Watchport/M |
164 | #define ION_DEVICE_ID_WP_MOISTURE 0x303 // Watchport/W | 166 | #define ION_DEVICE_ID_WP_MOISTURE 0x303 // Watchport/W |
165 | #define ION_DEVICE_ID_WP_TEMPERATURE 0x304 // Watchport/T | 167 | #define ION_DEVICE_ID_WP_TEMPERATURE 0x304 // Watchport/T |
166 | #define ION_DEVICE_ID_WP_HUMIDITY 0x305 // Watchport/H | 168 | #define ION_DEVICE_ID_WP_HUMIDITY 0x305 // Watchport/H |
167 | 169 | ||
168 | #define ION_DEVICE_ID_WP_POWER 0x306 // Watchport | 170 | #define ION_DEVICE_ID_WP_POWER 0x306 // Watchport |
169 | #define ION_DEVICE_ID_WP_LIGHT 0x307 // Watchport | 171 | #define ION_DEVICE_ID_WP_LIGHT 0x307 // Watchport |
170 | #define ION_DEVICE_ID_WP_RADIATION 0x308 // Watchport | 172 | #define ION_DEVICE_ID_WP_RADIATION 0x308 // Watchport |
171 | #define ION_DEVICE_ID_WP_ACCELERATION 0x309 // Watchport/A | 173 | #define ION_DEVICE_ID_WP_ACCELERATION 0x309 // Watchport/A |
172 | #define ION_DEVICE_ID_WP_DISTANCE 0x30A // Watchport/D Discontinued | 174 | #define ION_DEVICE_ID_WP_DISTANCE 0x30A // Watchport/D Discontinued |
173 | #define ION_DEVICE_ID_WP_PROX_DIST 0x30B // Watchport/D uses distance sensor | 175 | #define ION_DEVICE_ID_WP_PROX_DIST 0x30B // Watchport/D uses distance sensor |
174 | // Default to /P function | 176 | // Default to /P function |
175 | 177 | ||
176 | #define ION_DEVICE_ID_PLUS_PWR_HP4CD 0x30C // 5052 Plus Power HubPort/4CD+ (for Dell) | 178 | #define ION_DEVICE_ID_PLUS_PWR_HP4CD 0x30C // 5052 Plus Power HubPort/4CD+ (for Dell) |
177 | #define ION_DEVICE_ID_PLUS_PWR_HP4C 0x30D // 5052 Plus Power HubPort/4C+ | 179 | #define ION_DEVICE_ID_PLUS_PWR_HP4C 0x30D // 5052 Plus Power HubPort/4C+ |
178 | #define ION_DEVICE_ID_PLUS_PWR_PCI 0x30E // 3410 Plus Power PCI Host Controller 4 port | 180 | #define ION_DEVICE_ID_PLUS_PWR_PCI 0x30E // 3410 Plus Power PCI Host Controller 4 port |
179 | 181 | ||
180 | 182 | ||
181 | // | 183 | // |
182 | // Definitions for AXIOHM USB product IDs | 184 | // Definitions for AXIOHM USB product IDs |
183 | // | 185 | // |
184 | #define USB_VENDOR_ID_AXIOHM 0x05D9 // Axiohm VID | 186 | #define USB_VENDOR_ID_AXIOHM 0x05D9 // Axiohm VID |
185 | 187 | ||
186 | #define AXIOHM_DEVICE_ID_MASK 0xffff | 188 | #define AXIOHM_DEVICE_ID_MASK 0xffff |
187 | #define AXIOHM_DEVICE_ID_EPIC_A758 0xA758 | 189 | #define AXIOHM_DEVICE_ID_EPIC_A758 0xA758 |
188 | #define AXIOHM_DEVICE_ID_EPIC_A794 0xA794 | 190 | #define AXIOHM_DEVICE_ID_EPIC_A794 0xA794 |
189 | #define AXIOHM_DEVICE_ID_EPIC_A225 0xA225 | 191 | #define AXIOHM_DEVICE_ID_EPIC_A225 0xA225 |
190 | 192 | ||
191 | 193 | ||
192 | // | 194 | // |
193 | // Definitions for NCR USB product IDs | 195 | // Definitions for NCR USB product IDs |
194 | // | 196 | // |
195 | #define USB_VENDOR_ID_NCR 0x0404 // NCR VID | 197 | #define USB_VENDOR_ID_NCR 0x0404 // NCR VID |
196 | 198 | ||
197 | #define NCR_DEVICE_ID_MASK 0xffff | 199 | #define NCR_DEVICE_ID_MASK 0xffff |
198 | #define NCR_DEVICE_ID_EPIC_0202 0x0202 | 200 | #define NCR_DEVICE_ID_EPIC_0202 0x0202 |
199 | #define NCR_DEVICE_ID_EPIC_0203 0x0203 | 201 | #define NCR_DEVICE_ID_EPIC_0203 0x0203 |
200 | #define NCR_DEVICE_ID_EPIC_0310 0x0310 | 202 | #define NCR_DEVICE_ID_EPIC_0310 0x0310 |
201 | #define NCR_DEVICE_ID_EPIC_0311 0x0311 | 203 | #define NCR_DEVICE_ID_EPIC_0311 0x0311 |
202 | #define NCR_DEVICE_ID_EPIC_0312 0x0312 | 204 | #define NCR_DEVICE_ID_EPIC_0312 0x0312 |
203 | 205 | ||
204 | 206 | ||
205 | // | 207 | // |
206 | // Definitions for SYMBOL USB product IDs | 208 | // Definitions for SYMBOL USB product IDs |
207 | // | 209 | // |
208 | #define USB_VENDOR_ID_SYMBOL 0x05E0 // Symbol VID | 210 | #define USB_VENDOR_ID_SYMBOL 0x05E0 // Symbol VID |
209 | #define SYMBOL_DEVICE_ID_MASK 0xffff | 211 | #define SYMBOL_DEVICE_ID_MASK 0xffff |
210 | #define SYMBOL_DEVICE_ID_KEYFOB 0x0700 | 212 | #define SYMBOL_DEVICE_ID_KEYFOB 0x0700 |
211 | 213 | ||
212 | 214 | ||
213 | // | 215 | // |
214 | // Definitions for other product IDs | 216 | // Definitions for other product IDs |
215 | #define ION_DEVICE_ID_MT4X56USB 0x1403 // OEM device | 217 | #define ION_DEVICE_ID_MT4X56USB 0x1403 // OEM device |
216 | 218 | ||
217 | 219 | ||
218 | #define GENERATION_ID_FROM_USB_PRODUCT_ID( ProductId ) \ | 220 | #define GENERATION_ID_FROM_USB_PRODUCT_ID( ProductId ) \ |
219 | ( (__u16) ((ProductId >> 8) & (ION_GENERATION_MASK)) ) | 221 | ( (__u16) ((ProductId >> 8) & (ION_GENERATION_MASK)) ) |
220 | 222 | ||
221 | #define MAKE_USB_PRODUCT_ID( OemId, DeviceId ) \ | 223 | #define MAKE_USB_PRODUCT_ID( OemId, DeviceId ) \ |
222 | ( (__u16) (((OemId) << 10) || (DeviceId)) ) | 224 | ( (__u16) (((OemId) << 10) || (DeviceId)) ) |
223 | 225 | ||
224 | #define DEVICE_ID_FROM_USB_PRODUCT_ID( ProductId ) \ | 226 | #define DEVICE_ID_FROM_USB_PRODUCT_ID( ProductId ) \ |
225 | ( (__u16) ((ProductId) & (EDGEPORT_DEVICE_ID_MASK)) ) | 227 | ( (__u16) ((ProductId) & (EDGEPORT_DEVICE_ID_MASK)) ) |
226 | 228 | ||
227 | #define OEM_ID_FROM_USB_PRODUCT_ID( ProductId ) \ | 229 | #define OEM_ID_FROM_USB_PRODUCT_ID( ProductId ) \ |
228 | ( (__u16) (((ProductId) >> 10) & 0x3F) ) | 230 | ( (__u16) (((ProductId) >> 10) & 0x3F) ) |
229 | 231 | ||
230 | // | 232 | // |
231 | // Definitions of parameters for download code. Note that these are | 233 | // Definitions of parameters for download code. Note that these are |
232 | // specific to a given version of download code and must change if the | 234 | // specific to a given version of download code and must change if the |
233 | // corresponding download code changes. | 235 | // corresponding download code changes. |
234 | // | 236 | // |
235 | 237 | ||
236 | // TxCredits value below which driver won't bother sending (to prevent too many small writes). | 238 | // TxCredits value below which driver won't bother sending (to prevent too many small writes). |
237 | // Send only if above 25% | 239 | // Send only if above 25% |
238 | #define EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(InitialCredit, MaxPacketSize) (max( ((InitialCredit) / 4), (MaxPacketSize) )) | 240 | #define EDGE_FW_GET_TX_CREDITS_SEND_THRESHOLD(InitialCredit, MaxPacketSize) (max( ((InitialCredit) / 4), (MaxPacketSize) )) |
239 | 241 | ||
240 | #define EDGE_FW_BULK_MAX_PACKET_SIZE 64 // Max Packet Size for Bulk In Endpoint (EP1) | 242 | #define EDGE_FW_BULK_MAX_PACKET_SIZE 64 // Max Packet Size for Bulk In Endpoint (EP1) |
241 | #define EDGE_FW_BULK_READ_BUFFER_SIZE 1024 // Size to use for Bulk reads | 243 | #define EDGE_FW_BULK_READ_BUFFER_SIZE 1024 // Size to use for Bulk reads |
242 | 244 | ||
243 | #define EDGE_FW_INT_MAX_PACKET_SIZE 32 // Max Packet Size for Interrupt In Endpoint | 245 | #define EDGE_FW_INT_MAX_PACKET_SIZE 32 // Max Packet Size for Interrupt In Endpoint |
244 | // Note that many units were shipped with MPS=16, we | 246 | // Note that many units were shipped with MPS=16, we |
245 | // force an upgrade to this value). | 247 | // force an upgrade to this value). |
246 | #define EDGE_FW_INT_INTERVAL 2 // 2ms polling on IntPipe | 248 | #define EDGE_FW_INT_INTERVAL 2 // 2ms polling on IntPipe |
247 | 249 | ||
248 | 250 | ||
249 | // | 251 | // |
250 | // Definitions of I/O Networks vendor-specific requests | 252 | // Definitions of I/O Networks vendor-specific requests |
251 | // for default endpoint | 253 | // for default endpoint |
252 | // | 254 | // |
253 | // bmRequestType = 01000000 Set vendor-specific, to device | 255 | // bmRequestType = 01000000 Set vendor-specific, to device |
254 | // bmRequestType = 11000000 Get vendor-specific, to device | 256 | // bmRequestType = 11000000 Get vendor-specific, to device |
255 | // | 257 | // |
256 | // These are the definitions for the bRequest field for the | 258 | // These are the definitions for the bRequest field for the |
257 | // above bmRequestTypes. | 259 | // above bmRequestTypes. |
258 | // | 260 | // |
259 | // For the read/write Edgeport memory commands, the parameters | 261 | // For the read/write Edgeport memory commands, the parameters |
260 | // are as follows: | 262 | // are as follows: |
261 | // wValue = 16-bit address | 263 | // wValue = 16-bit address |
262 | // wIndex = unused (though we could put segment 00: or FF: here) | 264 | // wIndex = unused (though we could put segment 00: or FF: here) |
263 | // wLength = # bytes to read/write (max 64) | 265 | // wLength = # bytes to read/write (max 64) |
264 | // | 266 | // |
265 | 267 | ||
266 | #define USB_REQUEST_ION_RESET_DEVICE 0 // Warm reboot Edgeport, retaining USB address | 268 | #define USB_REQUEST_ION_RESET_DEVICE 0 // Warm reboot Edgeport, retaining USB address |
267 | #define USB_REQUEST_ION_GET_EPIC_DESC 1 // Get Edgeport Compatibility Descriptor | 269 | #define USB_REQUEST_ION_GET_EPIC_DESC 1 // Get Edgeport Compatibility Descriptor |
268 | // unused 2 // Unused, available | 270 | // unused 2 // Unused, available |
269 | #define USB_REQUEST_ION_READ_RAM 3 // Read EdgePort RAM at specified addr | 271 | #define USB_REQUEST_ION_READ_RAM 3 // Read EdgePort RAM at specified addr |
270 | #define USB_REQUEST_ION_WRITE_RAM 4 // Write EdgePort RAM at specified addr | 272 | #define USB_REQUEST_ION_WRITE_RAM 4 // Write EdgePort RAM at specified addr |
271 | #define USB_REQUEST_ION_READ_ROM 5 // Read EdgePort ROM at specified addr | 273 | #define USB_REQUEST_ION_READ_ROM 5 // Read EdgePort ROM at specified addr |
272 | #define USB_REQUEST_ION_WRITE_ROM 6 // Write EdgePort ROM at specified addr | 274 | #define USB_REQUEST_ION_WRITE_ROM 6 // Write EdgePort ROM at specified addr |
273 | #define USB_REQUEST_ION_EXEC_DL_CODE 7 // Begin execution of RAM-based download | 275 | #define USB_REQUEST_ION_EXEC_DL_CODE 7 // Begin execution of RAM-based download |
274 | // code by jumping to address in wIndex:wValue | 276 | // code by jumping to address in wIndex:wValue |
275 | // 8 // Unused, available | 277 | // 8 // Unused, available |
276 | #define USB_REQUEST_ION_ENABLE_SUSPEND 9 // Enable/Disable suspend feature | 278 | #define USB_REQUEST_ION_ENABLE_SUSPEND 9 // Enable/Disable suspend feature |
277 | // (wValue != 0: Enable; wValue = 0: Disable) | 279 | // (wValue != 0: Enable; wValue = 0: Disable) |
278 | 280 | ||
279 | #define USB_REQUEST_ION_SEND_IOSP 10 // Send an IOSP command to the edgeport over the control pipe | 281 | #define USB_REQUEST_ION_SEND_IOSP 10 // Send an IOSP command to the edgeport over the control pipe |
280 | #define USB_REQUEST_ION_RECV_IOSP 11 // Receive an IOSP command from the edgeport over the control pipe | 282 | #define USB_REQUEST_ION_RECV_IOSP 11 // Receive an IOSP command from the edgeport over the control pipe |
281 | 283 | ||
282 | 284 | ||
283 | #define USB_REQUEST_ION_DIS_INT_TIMER 0x80 // Sent to Axiohm to enable/ disable | 285 | #define USB_REQUEST_ION_DIS_INT_TIMER 0x80 // Sent to Axiohm to enable/ disable |
284 | // interrupt token timer | 286 | // interrupt token timer |
285 | // wValue = 1, enable (default) | 287 | // wValue = 1, enable (default) |
286 | // wValue = 0, disable | 288 | // wValue = 0, disable |
287 | 289 | ||
288 | // | 290 | // |
289 | // Define parameter values for our vendor-specific commands | 291 | // Define parameter values for our vendor-specific commands |
290 | // | 292 | // |
291 | 293 | ||
292 | // | 294 | // |
293 | // Edgeport Compatibility Descriptor | 295 | // Edgeport Compatibility Descriptor |
294 | // | 296 | // |
295 | // This descriptor is only returned by Edgeport-compatible devices | 297 | // This descriptor is only returned by Edgeport-compatible devices |
296 | // supporting the EPiC spec. True ION devices do not return this | 298 | // supporting the EPiC spec. True ION devices do not return this |
297 | // descriptor, but instead return STALL on receipt of the | 299 | // descriptor, but instead return STALL on receipt of the |
298 | // GET_EPIC_DESC command. The driver interprets a STALL to mean that | 300 | // GET_EPIC_DESC command. The driver interprets a STALL to mean that |
299 | // this is a "real" Edgeport. | 301 | // this is a "real" Edgeport. |
300 | // | 302 | // |
301 | 303 | ||
302 | struct edge_compatibility_bits | 304 | struct edge_compatibility_bits |
303 | { | 305 | { |
304 | // This __u32 defines which Vendor-specific commands/functionality | 306 | // This __u32 defines which Vendor-specific commands/functionality |
305 | // the device supports on the default EP0 pipe. | 307 | // the device supports on the default EP0 pipe. |
306 | 308 | ||
307 | __u32 VendEnableSuspend : 1; // 0001 Set if device supports ION_ENABLE_SUSPEND | 309 | __u32 VendEnableSuspend : 1; // 0001 Set if device supports ION_ENABLE_SUSPEND |
308 | __u32 VendUnused : 31; // Available for future expansion, must be 0 | 310 | __u32 VendUnused : 31; // Available for future expansion, must be 0 |
309 | 311 | ||
310 | // This __u32 defines which IOSP commands are supported over the | 312 | // This __u32 defines which IOSP commands are supported over the |
311 | // bulk pipe EP1. | 313 | // bulk pipe EP1. |
312 | 314 | ||
313 | // xxxx Set if device supports: | 315 | // xxxx Set if device supports: |
314 | __u32 IOSPOpen : 1; // 0001 OPEN / OPEN_RSP (Currently must be 1) | 316 | __u32 IOSPOpen : 1; // 0001 OPEN / OPEN_RSP (Currently must be 1) |
315 | __u32 IOSPClose : 1; // 0002 CLOSE | 317 | __u32 IOSPClose : 1; // 0002 CLOSE |
316 | __u32 IOSPChase : 1; // 0004 CHASE / CHASE_RSP | 318 | __u32 IOSPChase : 1; // 0004 CHASE / CHASE_RSP |
317 | __u32 IOSPSetRxFlow : 1; // 0008 SET_RX_FLOW | 319 | __u32 IOSPSetRxFlow : 1; // 0008 SET_RX_FLOW |
318 | __u32 IOSPSetTxFlow : 1; // 0010 SET_TX_FLOW | 320 | __u32 IOSPSetTxFlow : 1; // 0010 SET_TX_FLOW |
319 | __u32 IOSPSetXChar : 1; // 0020 SET_XON_CHAR/SET_XOFF_CHAR | 321 | __u32 IOSPSetXChar : 1; // 0020 SET_XON_CHAR/SET_XOFF_CHAR |
320 | __u32 IOSPRxCheck : 1; // 0040 RX_CHECK_REQ/RX_CHECK_RSP | 322 | __u32 IOSPRxCheck : 1; // 0040 RX_CHECK_REQ/RX_CHECK_RSP |
321 | __u32 IOSPSetClrBreak : 1; // 0080 SET_BREAK/CLEAR_BREAK | 323 | __u32 IOSPSetClrBreak : 1; // 0080 SET_BREAK/CLEAR_BREAK |
322 | __u32 IOSPWriteMCR : 1; // 0100 MCR register writes (set/clr DTR/RTS) | 324 | __u32 IOSPWriteMCR : 1; // 0100 MCR register writes (set/clr DTR/RTS) |
323 | __u32 IOSPWriteLCR : 1; // 0200 LCR register writes (wordlen/stop/parity) | 325 | __u32 IOSPWriteLCR : 1; // 0200 LCR register writes (wordlen/stop/parity) |
324 | __u32 IOSPSetBaudRate : 1; // 0400 setting Baud rate (writes to LCR.80h and DLL/DLM register) | 326 | __u32 IOSPSetBaudRate : 1; // 0400 setting Baud rate (writes to LCR.80h and DLL/DLM register) |
325 | __u32 IOSPDisableIntPipe : 1; // 0800 Do not use the interrupt pipe for TxCredits or RxButesAvailable | 327 | __u32 IOSPDisableIntPipe : 1; // 0800 Do not use the interrupt pipe for TxCredits or RxButesAvailable |
326 | __u32 IOSPRxDataAvail : 1; // 1000 Return status of RX Fifo (Data available in Fifo) | 328 | __u32 IOSPRxDataAvail : 1; // 1000 Return status of RX Fifo (Data available in Fifo) |
327 | __u32 IOSPTxPurge : 1; // 2000 Purge TXBuffer and/or Fifo in Edgeport hardware | 329 | __u32 IOSPTxPurge : 1; // 2000 Purge TXBuffer and/or Fifo in Edgeport hardware |
328 | __u32 IOSPUnused : 18; // Available for future expansion, must be 0 | 330 | __u32 IOSPUnused : 18; // Available for future expansion, must be 0 |
329 | 331 | ||
330 | // This __u32 defines which 'general' features are supported | 332 | // This __u32 defines which 'general' features are supported |
331 | 333 | ||
332 | __u32 TrueEdgeport : 1; // 0001 Set if device is a 'real' Edgeport | 334 | __u32 TrueEdgeport : 1; // 0001 Set if device is a 'real' Edgeport |
333 | // (Used only by driver, NEVER set by an EPiC device) | 335 | // (Used only by driver, NEVER set by an EPiC device) |
334 | __u32 GenUnused : 31; // Available for future expansion, must be 0 | 336 | __u32 GenUnused : 31; // Available for future expansion, must be 0 |
335 | 337 | ||
336 | }; | 338 | }; |
337 | 339 | ||
338 | #define EDGE_COMPATIBILITY_MASK0 0x0001 | 340 | #define EDGE_COMPATIBILITY_MASK0 0x0001 |
339 | #define EDGE_COMPATIBILITY_MASK1 0x3FFF | 341 | #define EDGE_COMPATIBILITY_MASK1 0x3FFF |
340 | #define EDGE_COMPATIBILITY_MASK2 0x0001 | 342 | #define EDGE_COMPATIBILITY_MASK2 0x0001 |
341 | 343 | ||
342 | struct edge_compatibility_descriptor | 344 | struct edge_compatibility_descriptor |
343 | { | 345 | { |
344 | __u8 Length; // Descriptor Length (per USB spec) | 346 | __u8 Length; // Descriptor Length (per USB spec) |
345 | __u8 DescType; // Descriptor Type (per USB spec, =DEVICE type) | 347 | __u8 DescType; // Descriptor Type (per USB spec, =DEVICE type) |
346 | __u8 EpicVer; // Version of EPiC spec supported | 348 | __u8 EpicVer; // Version of EPiC spec supported |
347 | // (Currently must be 1) | 349 | // (Currently must be 1) |
348 | __u8 NumPorts; // Number of serial ports supported | 350 | __u8 NumPorts; // Number of serial ports supported |
349 | __u8 iDownloadFile; // Index of string containing download code filename | 351 | __u8 iDownloadFile; // Index of string containing download code filename |
350 | // 0=no download, FF=download compiled into driver. | 352 | // 0=no download, FF=download compiled into driver. |
351 | __u8 Unused[ 3 ]; // Available for future expansion, must be 0 | 353 | __u8 Unused[ 3 ]; // Available for future expansion, must be 0 |
352 | // (Currently must be 0). | 354 | // (Currently must be 0). |
353 | __u8 MajorVersion; // Firmware version: xx. | 355 | __u8 MajorVersion; // Firmware version: xx. |
354 | __u8 MinorVersion; // yy. | 356 | __u8 MinorVersion; // yy. |
355 | __le16 BuildNumber; // zzzz (LE format) | 357 | __le16 BuildNumber; // zzzz (LE format) |
356 | 358 | ||
357 | // The following structure contains __u32s, with each bit | 359 | // The following structure contains __u32s, with each bit |
358 | // specifying whether the EPiC device supports the given | 360 | // specifying whether the EPiC device supports the given |
359 | // command or functionality. | 361 | // command or functionality. |
360 | 362 | ||
361 | struct edge_compatibility_bits Supports; | 363 | struct edge_compatibility_bits Supports; |
362 | 364 | ||
363 | }; | 365 | }; |
364 | 366 | ||
365 | // Values for iDownloadFile | 367 | // Values for iDownloadFile |
366 | #define EDGE_DOWNLOAD_FILE_NONE 0 // No download requested | 368 | #define EDGE_DOWNLOAD_FILE_NONE 0 // No download requested |
367 | #define EDGE_DOWNLOAD_FILE_INTERNAL 0xFF // Download the file compiled into driver (930 version) | 369 | #define EDGE_DOWNLOAD_FILE_INTERNAL 0xFF // Download the file compiled into driver (930 version) |
368 | #define EDGE_DOWNLOAD_FILE_I930 0xFF // Download the file compiled into driver (930 version) | 370 | #define EDGE_DOWNLOAD_FILE_I930 0xFF // Download the file compiled into driver (930 version) |
369 | #define EDGE_DOWNLOAD_FILE_80251 0xFE // Download the file compiled into driver (80251 version) | 371 | #define EDGE_DOWNLOAD_FILE_80251 0xFE // Download the file compiled into driver (80251 version) |
370 | 372 | ||
371 | 373 | ||
372 | 374 | ||
373 | /* | 375 | /* |
374 | * Special addresses for READ/WRITE_RAM/ROM | 376 | * Special addresses for READ/WRITE_RAM/ROM |
375 | */ | 377 | */ |
376 | 378 | ||
377 | // Version 1 (original) format of DeviceParams | 379 | // Version 1 (original) format of DeviceParams |
378 | #define EDGE_MANUF_DESC_ADDR_V1 0x00FF7F00 | 380 | #define EDGE_MANUF_DESC_ADDR_V1 0x00FF7F00 |
379 | #define EDGE_MANUF_DESC_LEN_V1 sizeof(EDGE_MANUF_DESCRIPTOR_V1) | 381 | #define EDGE_MANUF_DESC_LEN_V1 sizeof(EDGE_MANUF_DESCRIPTOR_V1) |
380 | 382 | ||
381 | // Version 2 format of DeviceParams. This format is longer (3C0h) | 383 | // Version 2 format of DeviceParams. This format is longer (3C0h) |
382 | // and starts lower in memory, at the uppermost 1K in ROM. | 384 | // and starts lower in memory, at the uppermost 1K in ROM. |
383 | #define EDGE_MANUF_DESC_ADDR 0x00FF7C00 | 385 | #define EDGE_MANUF_DESC_ADDR 0x00FF7C00 |
384 | #define EDGE_MANUF_DESC_LEN sizeof(struct edge_manuf_descriptor) | 386 | #define EDGE_MANUF_DESC_LEN sizeof(struct edge_manuf_descriptor) |
385 | 387 | ||
386 | // Boot params descriptor | 388 | // Boot params descriptor |
387 | #define EDGE_BOOT_DESC_ADDR 0x00FF7FC0 | 389 | #define EDGE_BOOT_DESC_ADDR 0x00FF7FC0 |
388 | #define EDGE_BOOT_DESC_LEN sizeof(struct edge_boot_descriptor) | 390 | #define EDGE_BOOT_DESC_LEN sizeof(struct edge_boot_descriptor) |
389 | 391 | ||
390 | // Define the max block size that may be read or written | 392 | // Define the max block size that may be read or written |
391 | // in a read/write RAM/ROM command. | 393 | // in a read/write RAM/ROM command. |
392 | #define MAX_SIZE_REQ_ION_READ_MEM ( (__u16) 64 ) | 394 | #define MAX_SIZE_REQ_ION_READ_MEM ( (__u16) 64 ) |
393 | #define MAX_SIZE_REQ_ION_WRITE_MEM ( (__u16) 64 ) | 395 | #define MAX_SIZE_REQ_ION_WRITE_MEM ( (__u16) 64 ) |
394 | 396 | ||
395 | 397 | ||
396 | // | 398 | // |
397 | // Notes for the following two ION vendor-specific param descriptors: | 399 | // Notes for the following two ION vendor-specific param descriptors: |
398 | // | 400 | // |
399 | // 1. These have a standard USB descriptor header so they look like a | 401 | // 1. These have a standard USB descriptor header so they look like a |
400 | // normal descriptor. | 402 | // normal descriptor. |
401 | // 2. Any strings in the structures are in USB-defined string | 403 | // 2. Any strings in the structures are in USB-defined string |
402 | // descriptor format, so that they may be separately retrieved, | 404 | // descriptor format, so that they may be separately retrieved, |
403 | // if necessary, with a minimum of work on the 930. This also | 405 | // if necessary, with a minimum of work on the 930. This also |
404 | // requires them to be in UNICODE format, which, for English at | 406 | // requires them to be in UNICODE format, which, for English at |
405 | // least, simply means extending each __u8 into a __u16. | 407 | // least, simply means extending each __u8 into a __u16. |
406 | // 3. For all fields, 00 means 'uninitialized'. | 408 | // 3. For all fields, 00 means 'uninitialized'. |
407 | // 4. All unused areas should be set to 00 for future expansion. | 409 | // 4. All unused areas should be set to 00 for future expansion. |
408 | // | 410 | // |
409 | 411 | ||
410 | // This structure is ver 2 format. It contains ALL USB descriptors as | 412 | // This structure is ver 2 format. It contains ALL USB descriptors as |
411 | // well as the configuration parameters that were in the original V1 | 413 | // well as the configuration parameters that were in the original V1 |
412 | // structure. It is NOT modified when new boot code is downloaded; rather, | 414 | // structure. It is NOT modified when new boot code is downloaded; rather, |
413 | // these values are set or modified by manufacturing. It is located at | 415 | // these values are set or modified by manufacturing. It is located at |
414 | // xC00-xFBF (length 3C0h) in the ROM. | 416 | // xC00-xFBF (length 3C0h) in the ROM. |
415 | // This structure is a superset of the v1 structure and is arranged so | 417 | // This structure is a superset of the v1 structure and is arranged so |
416 | // that all of the v1 fields remain at the same address. We are just | 418 | // that all of the v1 fields remain at the same address. We are just |
417 | // adding more room to the front of the structure to hold the descriptors. | 419 | // adding more room to the front of the structure to hold the descriptors. |
418 | // | 420 | // |
419 | // The actual contents of this structure are defined in a 930 assembly | 421 | // The actual contents of this structure are defined in a 930 assembly |
420 | // file, converted to a binary image, and then written by the serialization | 422 | // file, converted to a binary image, and then written by the serialization |
421 | // program. The C definition of this structure just defines a dummy | 423 | // program. The C definition of this structure just defines a dummy |
422 | // area for general USB descriptors and the descriptor tables (the root | 424 | // area for general USB descriptors and the descriptor tables (the root |
423 | // descriptor starts at xC00). At the bottom of the structure are the | 425 | // descriptor starts at xC00). At the bottom of the structure are the |
424 | // fields inherited from the v1 structure. | 426 | // fields inherited from the v1 structure. |
425 | 427 | ||
426 | #define MAX_SERIALNUMBER_LEN 12 | 428 | #define MAX_SERIALNUMBER_LEN 12 |
427 | #define MAX_ASSEMBLYNUMBER_LEN 14 | 429 | #define MAX_ASSEMBLYNUMBER_LEN 14 |
428 | 430 | ||
429 | struct edge_manuf_descriptor { | 431 | struct edge_manuf_descriptor { |
430 | 432 | ||
431 | __u16 RootDescTable[0x10]; // C00 Root of descriptor tables (just a placeholder) | 433 | __u16 RootDescTable[0x10]; // C00 Root of descriptor tables (just a placeholder) |
432 | __u8 DescriptorArea[0x2E0]; // C20 Descriptors go here, up to 2E0h (just a placeholder) | 434 | __u8 DescriptorArea[0x2E0]; // C20 Descriptors go here, up to 2E0h (just a placeholder) |
433 | 435 | ||
434 | // Start of v1-compatible section | 436 | // Start of v1-compatible section |
435 | __u8 Length; // F00 Desc length for what follows, per USB (= C0h ) | 437 | __u8 Length; // F00 Desc length for what follows, per USB (= C0h ) |
436 | __u8 DescType; // F01 Desc type, per USB (=DEVICE type) | 438 | __u8 DescType; // F01 Desc type, per USB (=DEVICE type) |
437 | __u8 DescVer; // F02 Desc version/format (currently 2) | 439 | __u8 DescVer; // F02 Desc version/format (currently 2) |
438 | __u8 NumRootDescEntries; // F03 # entries in RootDescTable | 440 | __u8 NumRootDescEntries; // F03 # entries in RootDescTable |
439 | 441 | ||
440 | __u8 RomSize; // F04 Size of ROM/E2PROM in K | 442 | __u8 RomSize; // F04 Size of ROM/E2PROM in K |
441 | __u8 RamSize; // F05 Size of external RAM in K | 443 | __u8 RamSize; // F05 Size of external RAM in K |
442 | __u8 CpuRev; // F06 CPU revision level (chg only if s/w visible) | 444 | __u8 CpuRev; // F06 CPU revision level (chg only if s/w visible) |
443 | __u8 BoardRev; // F07 PCB revision level (chg only if s/w visible) | 445 | __u8 BoardRev; // F07 PCB revision level (chg only if s/w visible) |
444 | 446 | ||
445 | __u8 NumPorts; // F08 Number of ports | 447 | __u8 NumPorts; // F08 Number of ports |
446 | __u8 DescDate[3]; // F09 MM/DD/YY when descriptor template was compiler, | 448 | __u8 DescDate[3]; // F09 MM/DD/YY when descriptor template was compiler, |
447 | // so host can track changes to USB-only descriptors. | 449 | // so host can track changes to USB-only descriptors. |
448 | 450 | ||
449 | __u8 SerNumLength; // F0C USB string descriptor len | 451 | __u8 SerNumLength; // F0C USB string descriptor len |
450 | __u8 SerNumDescType; // F0D USB descriptor type (=STRING type) | 452 | __u8 SerNumDescType; // F0D USB descriptor type (=STRING type) |
451 | __le16 SerialNumber[MAX_SERIALNUMBER_LEN]; // F0E "01-01-000100" Unicode Serial Number | 453 | __le16 SerialNumber[MAX_SERIALNUMBER_LEN]; // F0E "01-01-000100" Unicode Serial Number |
452 | 454 | ||
453 | __u8 AssemblyNumLength; // F26 USB string descriptor len | 455 | __u8 AssemblyNumLength; // F26 USB string descriptor len |
454 | __u8 AssemblyNumDescType; // F27 USB descriptor type (=STRING type) | 456 | __u8 AssemblyNumDescType; // F27 USB descriptor type (=STRING type) |
455 | __le16 AssemblyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F28 "350-1000-01-A " assembly number | 457 | __le16 AssemblyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F28 "350-1000-01-A " assembly number |
456 | 458 | ||
457 | __u8 OemAssyNumLength; // F44 USB string descriptor len | 459 | __u8 OemAssyNumLength; // F44 USB string descriptor len |
458 | __u8 OemAssyNumDescType; // F45 USB descriptor type (=STRING type) | 460 | __u8 OemAssyNumDescType; // F45 USB descriptor type (=STRING type) |
459 | __le16 OemAssyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F46 "xxxxxxxxxxxxxx" OEM assembly number | 461 | __le16 OemAssyNumber[MAX_ASSEMBLYNUMBER_LEN]; // F46 "xxxxxxxxxxxxxx" OEM assembly number |
460 | 462 | ||
461 | __u8 ManufDateLength; // F62 USB string descriptor len | 463 | __u8 ManufDateLength; // F62 USB string descriptor len |
462 | __u8 ManufDateDescType; // F63 USB descriptor type (=STRING type) | 464 | __u8 ManufDateDescType; // F63 USB descriptor type (=STRING type) |
463 | __le16 ManufDate[6]; // F64 "MMDDYY" manufacturing date | 465 | __le16 ManufDate[6]; // F64 "MMDDYY" manufacturing date |
464 | 466 | ||
465 | __u8 Reserved3[0x4D]; // F70 -- unused, set to 0 -- | 467 | __u8 Reserved3[0x4D]; // F70 -- unused, set to 0 -- |
466 | 468 | ||
467 | __u8 UartType; // FBD Uart Type | 469 | __u8 UartType; // FBD Uart Type |
468 | __u8 IonPid; // FBE Product ID, == LSB of USB DevDesc.PID | 470 | __u8 IonPid; // FBE Product ID, == LSB of USB DevDesc.PID |
469 | // (Note: Edgeport/4s before 11/98 will have | 471 | // (Note: Edgeport/4s before 11/98 will have |
470 | // 00 here instead of 01) | 472 | // 00 here instead of 01) |
471 | __u8 IonConfig; // FBF Config byte for ION manufacturing use | 473 | __u8 IonConfig; // FBF Config byte for ION manufacturing use |
472 | // FBF end of structure, total len = 3C0h | 474 | // FBF end of structure, total len = 3C0h |
473 | 475 | ||
474 | }; | 476 | }; |
475 | 477 | ||
476 | 478 | ||
477 | #define MANUF_DESC_VER_1 1 // Original definition of MANUF_DESC | 479 | #define MANUF_DESC_VER_1 1 // Original definition of MANUF_DESC |
478 | #define MANUF_DESC_VER_2 2 // Ver 2, starts at xC00h len 3C0h | 480 | #define MANUF_DESC_VER_2 2 // Ver 2, starts at xC00h len 3C0h |
479 | 481 | ||
480 | 482 | ||
481 | // Uart Types | 483 | // Uart Types |
482 | // Note: Since this field was added only recently, all Edgeport/4 units | 484 | // Note: Since this field was added only recently, all Edgeport/4 units |
483 | // shipped before 11/98 will have 00 in this field. Therefore, | 485 | // shipped before 11/98 will have 00 in this field. Therefore, |
484 | // both 00 and 01 values mean '654. | 486 | // both 00 and 01 values mean '654. |
485 | #define MANUF_UART_EXAR_654_EARLY 0 // Exar 16C654 in Edgeport/4s before 11/98 | 487 | #define MANUF_UART_EXAR_654_EARLY 0 // Exar 16C654 in Edgeport/4s before 11/98 |
486 | #define MANUF_UART_EXAR_654 1 // Exar 16C654 | 488 | #define MANUF_UART_EXAR_654 1 // Exar 16C654 |
487 | #define MANUF_UART_EXAR_2852 2 // Exar 16C2852 | 489 | #define MANUF_UART_EXAR_2852 2 // Exar 16C2852 |
488 | 490 | ||
489 | // | 491 | // |
490 | // Note: The CpuRev and BoardRev values do not conform to manufacturing | 492 | // Note: The CpuRev and BoardRev values do not conform to manufacturing |
491 | // revisions; they are to be incremented only when the CPU or hardware | 493 | // revisions; they are to be incremented only when the CPU or hardware |
492 | // changes in a software-visible way, such that the 930 software or | 494 | // changes in a software-visible way, such that the 930 software or |
493 | // the host driver needs to handle the hardware differently. | 495 | // the host driver needs to handle the hardware differently. |
494 | // | 496 | // |
495 | 497 | ||
496 | // Values of bottom 5 bits of CpuRev & BoardRev for | 498 | // Values of bottom 5 bits of CpuRev & BoardRev for |
497 | // Implementation 0 (ie, 930-based) | 499 | // Implementation 0 (ie, 930-based) |
498 | #define MANUF_CPU_REV_AD4 1 // 930 AD4, with EP1 Rx bug (needs RXSPM) | 500 | #define MANUF_CPU_REV_AD4 1 // 930 AD4, with EP1 Rx bug (needs RXSPM) |
499 | #define MANUF_CPU_REV_AD5 2 // 930 AD5, with above bug (supposedly) fixed | 501 | #define MANUF_CPU_REV_AD5 2 // 930 AD5, with above bug (supposedly) fixed |
500 | #define MANUF_CPU_80251 0x20 // Intel 80251 | 502 | #define MANUF_CPU_80251 0x20 // Intel 80251 |
501 | 503 | ||
502 | 504 | ||
503 | #define MANUF_BOARD_REV_A 1 // Original version, == Manuf Rev A | 505 | #define MANUF_BOARD_REV_A 1 // Original version, == Manuf Rev A |
504 | #define MANUF_BOARD_REV_B 2 // Manuf Rev B, wakeup interrupt works | 506 | #define MANUF_BOARD_REV_B 2 // Manuf Rev B, wakeup interrupt works |
505 | #define MANUF_BOARD_REV_C 3 // Manuf Rev C, 2/4 ports, rs232/rs422 | 507 | #define MANUF_BOARD_REV_C 3 // Manuf Rev C, 2/4 ports, rs232/rs422 |
506 | #define MANUF_BOARD_REV_GENERATION_2 0x20 // Second generaiton edgeport | 508 | #define MANUF_BOARD_REV_GENERATION_2 0x20 // Second generaiton edgeport |
507 | 509 | ||
508 | 510 | ||
509 | // Values of bottom 5 bits of CpuRev & BoardRev for | 511 | // Values of bottom 5 bits of CpuRev & BoardRev for |
510 | // Implementation 1 (ie, 251+Netchip-based) | 512 | // Implementation 1 (ie, 251+Netchip-based) |
511 | #define MANUF_CPU_REV_1 1 // C251TB Rev 1 (Need actual Intel rev here) | 513 | #define MANUF_CPU_REV_1 1 // C251TB Rev 1 (Need actual Intel rev here) |
512 | 514 | ||
513 | #define MANUF_BOARD_REV_A 1 // First rev of 251+Netchip design | 515 | #define MANUF_BOARD_REV_A 1 // First rev of 251+Netchip design |
514 | 516 | ||
515 | #define MANUF_SERNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->SerialNumber) | 517 | #define MANUF_SERNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->SerialNumber) |
516 | #define MANUF_ASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->AssemblyNumber) | 518 | #define MANUF_ASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->AssemblyNumber) |
517 | #define MANUF_OEMASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->OemAssyNumber) | 519 | #define MANUF_OEMASSYNUM_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->OemAssyNumber) |
518 | #define MANUF_MANUFDATE_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->ManufDate) | 520 | #define MANUF_MANUFDATE_LENGTH sizeof(((struct edge_manuf_descriptor *)0)->ManufDate) |
519 | 521 | ||
520 | #define MANUF_ION_CONFIG_DIAG_NO_LOOP 0x20 // As below but no ext loopback test | 522 | #define MANUF_ION_CONFIG_DIAG_NO_LOOP 0x20 // As below but no ext loopback test |
521 | #define MANUF_ION_CONFIG_DIAG 0x40 // 930 based device: 1=Run h/w diags, 0=norm | 523 | #define MANUF_ION_CONFIG_DIAG 0x40 // 930 based device: 1=Run h/w diags, 0=norm |
522 | // TIUMP Device : 1=IONSERIAL needs to run Final Test | 524 | // TIUMP Device : 1=IONSERIAL needs to run Final Test |
523 | #define MANUF_ION_CONFIG_MASTER 0x80 // 930 based device: 1=Master mode, 0=Normal | 525 | #define MANUF_ION_CONFIG_MASTER 0x80 // 930 based device: 1=Master mode, 0=Normal |
524 | // TIUMP Device : 1=First device on a multi TIUMP Device | 526 | // TIUMP Device : 1=First device on a multi TIUMP Device |
525 | 527 | ||
526 | // | 528 | // |
527 | // This structure describes parameters for the boot code, and | 529 | // This structure describes parameters for the boot code, and |
528 | // is programmed along with new boot code. These are values | 530 | // is programmed along with new boot code. These are values |
529 | // which are specific to a given build of the boot code. It | 531 | // which are specific to a given build of the boot code. It |
530 | // is exactly 64 bytes long and is fixed at address FF:xFC0 | 532 | // is exactly 64 bytes long and is fixed at address FF:xFC0 |
531 | // - FF:xFFF. Note that the 930-mandated UCONFIG bytes are | 533 | // - FF:xFFF. Note that the 930-mandated UCONFIG bytes are |
532 | // included in this structure. | 534 | // included in this structure. |
533 | // | 535 | // |
534 | struct edge_boot_descriptor { | 536 | struct edge_boot_descriptor { |
535 | __u8 Length; // C0 Desc length, per USB (= 40h) | 537 | __u8 Length; // C0 Desc length, per USB (= 40h) |
536 | __u8 DescType; // C1 Desc type, per USB (= DEVICE type) | 538 | __u8 DescType; // C1 Desc type, per USB (= DEVICE type) |
537 | __u8 DescVer; // C2 Desc version/format | 539 | __u8 DescVer; // C2 Desc version/format |
538 | __u8 Reserved1; // C3 -- unused, set to 0 -- | 540 | __u8 Reserved1; // C3 -- unused, set to 0 -- |
539 | 541 | ||
540 | __le16 BootCodeLength; // C4 Boot code goes from FF:0000 to FF:(len-1) | 542 | __le16 BootCodeLength; // C4 Boot code goes from FF:0000 to FF:(len-1) |
541 | // (LE format) | 543 | // (LE format) |
542 | 544 | ||
543 | __u8 MajorVersion; // C6 Firmware version: xx. | 545 | __u8 MajorVersion; // C6 Firmware version: xx. |
544 | __u8 MinorVersion; // C7 yy. | 546 | __u8 MinorVersion; // C7 yy. |
545 | __le16 BuildNumber; // C8 zzzz (LE format) | 547 | __le16 BuildNumber; // C8 zzzz (LE format) |
546 | 548 | ||
547 | __u16 EnumRootDescTable; // CA Root of ROM-based descriptor table | 549 | __u16 EnumRootDescTable; // CA Root of ROM-based descriptor table |
548 | __u8 NumDescTypes; // CC Number of supported descriptor types | 550 | __u8 NumDescTypes; // CC Number of supported descriptor types |
549 | 551 | ||
550 | __u8 Reserved4; // CD Fix Compiler Packing | 552 | __u8 Reserved4; // CD Fix Compiler Packing |
551 | 553 | ||
552 | __le16 Capabilities; // CE-CF Capabilities flags (LE format) | 554 | __le16 Capabilities; // CE-CF Capabilities flags (LE format) |
553 | __u8 Reserved2[0x28]; // D0 -- unused, set to 0 -- | 555 | __u8 Reserved2[0x28]; // D0 -- unused, set to 0 -- |
554 | __u8 UConfig0; // F8 930-defined CPU configuration byte 0 | 556 | __u8 UConfig0; // F8 930-defined CPU configuration byte 0 |
555 | __u8 UConfig1; // F9 930-defined CPU configuration byte 1 | 557 | __u8 UConfig1; // F9 930-defined CPU configuration byte 1 |
556 | __u8 Reserved3[6]; // FA -- unused, set to 0 -- | 558 | __u8 Reserved3[6]; // FA -- unused, set to 0 -- |
557 | // FF end of structure, total len = 80 | 559 | // FF end of structure, total len = 80 |
558 | }; | 560 | }; |
559 | 561 | ||
560 | 562 | ||
561 | #define BOOT_DESC_VER_1 1 // Original definition of BOOT_PARAMS | 563 | #define BOOT_DESC_VER_1 1 // Original definition of BOOT_PARAMS |
562 | #define BOOT_DESC_VER_2 2 // 2nd definition, descriptors not included in boot | 564 | #define BOOT_DESC_VER_2 2 // 2nd definition, descriptors not included in boot |
563 | 565 | ||
564 | 566 | ||
565 | // Capabilities flags | 567 | // Capabilities flags |
566 | 568 | ||
567 | #define BOOT_CAP_RESET_CMD 0x0001 // If set, boot correctly supports ION_RESET_DEVICE | 569 | #define BOOT_CAP_RESET_CMD 0x0001 // If set, boot correctly supports ION_RESET_DEVICE |
568 | 570 | ||
569 | 571 | ||
570 | /************************************************************************ | 572 | /************************************************************************ |
571 | T I U M P D E F I N I T I O N S | 573 | T I U M P D E F I N I T I O N S |
572 | ***********************************************************************/ | 574 | ***********************************************************************/ |
573 | 575 | ||
574 | // Chip definitions in I2C | 576 | // Chip definitions in I2C |
575 | #define UMP5152 0x52 | 577 | #define UMP5152 0x52 |
576 | #define UMP3410 0x10 | 578 | #define UMP3410 0x10 |
577 | 579 | ||
578 | 580 | ||
579 | //************************************************************************ | 581 | //************************************************************************ |
580 | // TI I2C Format Definitions | 582 | // TI I2C Format Definitions |
581 | //************************************************************************ | 583 | //************************************************************************ |
582 | #define I2C_DESC_TYPE_INFO_BASIC 0x01 | 584 | #define I2C_DESC_TYPE_INFO_BASIC 0x01 |
583 | #define I2C_DESC_TYPE_FIRMWARE_BASIC 0x02 | 585 | #define I2C_DESC_TYPE_FIRMWARE_BASIC 0x02 |
584 | #define I2C_DESC_TYPE_DEVICE 0x03 | 586 | #define I2C_DESC_TYPE_DEVICE 0x03 |
585 | #define I2C_DESC_TYPE_CONFIG 0x04 | 587 | #define I2C_DESC_TYPE_CONFIG 0x04 |
586 | #define I2C_DESC_TYPE_STRING 0x05 | 588 | #define I2C_DESC_TYPE_STRING 0x05 |
587 | #define I2C_DESC_TYPE_FIRMWARE_AUTO 0x07 // for 3410 download | 589 | #define I2C_DESC_TYPE_FIRMWARE_AUTO 0x07 // for 3410 download |
588 | #define I2C_DESC_TYPE_CONFIG_KLUDGE 0x14 // for 3410 | 590 | #define I2C_DESC_TYPE_CONFIG_KLUDGE 0x14 // for 3410 |
589 | #define I2C_DESC_TYPE_WATCHPORT_VERSION 0x15 // firmware version number for watchport | 591 | #define I2C_DESC_TYPE_WATCHPORT_VERSION 0x15 // firmware version number for watchport |
590 | #define I2C_DESC_TYPE_WATCHPORT_CALIBRATION_DATA 0x16 // Watchport Calibration Data | 592 | #define I2C_DESC_TYPE_WATCHPORT_CALIBRATION_DATA 0x16 // Watchport Calibration Data |
591 | 593 | ||
592 | #define I2C_DESC_TYPE_FIRMWARE_BLANK 0xf2 | 594 | #define I2C_DESC_TYPE_FIRMWARE_BLANK 0xf2 |
593 | 595 | ||
594 | // Special section defined by ION | 596 | // Special section defined by ION |
595 | #define I2C_DESC_TYPE_ION 0 // Not defined by TI | 597 | #define I2C_DESC_TYPE_ION 0 // Not defined by TI |
596 | 598 | ||
597 | 599 | ||
598 | struct ti_i2c_desc | 600 | struct ti_i2c_desc |
599 | { | 601 | { |
600 | __u8 Type; // Type of descriptor | 602 | __u8 Type; // Type of descriptor |
601 | __u16 Size; // Size of data only not including header | 603 | __u16 Size; // Size of data only not including header |
602 | __u8 CheckSum; // Checksum (8 bit sum of data only) | 604 | __u8 CheckSum; // Checksum (8 bit sum of data only) |
603 | __u8 Data[0]; // Data starts here | 605 | __u8 Data[0]; // Data starts here |
604 | }__attribute__((packed)); | 606 | }__attribute__((packed)); |
605 | 607 | ||
606 | // for 5152 devices only (type 2 record) | 608 | // for 5152 devices only (type 2 record) |
607 | // for 3410 the version is stored in the WATCHPORT_FIRMWARE_VERSION descriptor | 609 | // for 3410 the version is stored in the WATCHPORT_FIRMWARE_VERSION descriptor |
608 | struct ti_i2c_firmware_rec | 610 | struct ti_i2c_firmware_rec |
609 | { | 611 | { |
610 | __u8 Ver_Major; // Firmware Major version number | 612 | __u8 Ver_Major; // Firmware Major version number |
611 | __u8 Ver_Minor; // Firmware Minor version number | 613 | __u8 Ver_Minor; // Firmware Minor version number |
612 | __u8 Data[0]; // Download starts here | 614 | __u8 Data[0]; // Download starts here |
613 | }__attribute__((packed)); | 615 | }__attribute__((packed)); |
614 | 616 | ||
615 | 617 | ||
616 | struct watchport_firmware_version | 618 | struct watchport_firmware_version |
617 | { | 619 | { |
618 | // Added 2 bytes for version number | 620 | // Added 2 bytes for version number |
619 | __u8 Version_Major; // Download Version (for Watchport) | 621 | __u8 Version_Major; // Download Version (for Watchport) |
620 | __u8 Version_Minor; | 622 | __u8 Version_Minor; |
621 | }__attribute__((packed)); | 623 | }__attribute__((packed)); |
622 | 624 | ||
623 | 625 | ||
624 | // Structure of header of download image in fw_down.h | 626 | // Structure of header of download image in fw_down.h |
625 | struct ti_i2c_image_header | 627 | struct ti_i2c_image_header |
626 | { | 628 | { |
627 | __le16 Length; | 629 | __le16 Length; |
628 | __u8 CheckSum; | 630 | __u8 CheckSum; |
629 | }__attribute__((packed)); | 631 | }__attribute__((packed)); |
630 | 632 | ||
631 | struct ti_basic_descriptor | 633 | struct ti_basic_descriptor |
632 | { | 634 | { |
633 | __u8 Power; // Self powered | 635 | __u8 Power; // Self powered |
634 | // bit 7: 1 - power switching supported | 636 | // bit 7: 1 - power switching supported |
635 | // 0 - power switching not supported | 637 | // 0 - power switching not supported |
636 | // | 638 | // |
637 | // bit 0: 1 - self powered | 639 | // bit 0: 1 - self powered |
638 | // 0 - bus powered | 640 | // 0 - bus powered |
639 | // | 641 | // |
640 | // | 642 | // |
641 | __u16 HubVid; // VID HUB | 643 | __u16 HubVid; // VID HUB |
642 | __u16 HubPid; // PID HUB | 644 | __u16 HubPid; // PID HUB |
643 | __u16 DevPid; // PID Edgeport | 645 | __u16 DevPid; // PID Edgeport |
644 | __u8 HubTime; // Time for power on to power good | 646 | __u8 HubTime; // Time for power on to power good |
645 | __u8 HubCurrent; // HUB Current = 100ma | 647 | __u8 HubCurrent; // HUB Current = 100ma |
646 | } __attribute__((packed)); | 648 | } __attribute__((packed)); |
647 | 649 | ||
648 | 650 | ||
649 | // CPU / Board Rev Definitions | 651 | // CPU / Board Rev Definitions |
650 | #define TI_CPU_REV_5052 2 // 5052 based edgeports | 652 | #define TI_CPU_REV_5052 2 // 5052 based edgeports |
651 | #define TI_CPU_REV_3410 3 // 3410 based edgeports | 653 | #define TI_CPU_REV_3410 3 // 3410 based edgeports |
652 | 654 | ||
653 | #define TI_BOARD_REV_TI_EP 0 // Basic ti based edgeport | 655 | #define TI_BOARD_REV_TI_EP 0 // Basic ti based edgeport |
654 | #define TI_BOARD_REV_COMPACT 1 // Compact board | 656 | #define TI_BOARD_REV_COMPACT 1 // Compact board |
655 | #define TI_BOARD_REV_WATCHPORT 2 // Watchport | 657 | #define TI_BOARD_REV_WATCHPORT 2 // Watchport |
656 | 658 | ||
657 | 659 | ||
658 | #define TI_GET_CPU_REVISION(x) (__u8)((((x)>>4)&0x0f)) | 660 | #define TI_GET_CPU_REVISION(x) (__u8)((((x)>>4)&0x0f)) |
659 | #define TI_GET_BOARD_REVISION(x) (__u8)(((x)&0x0f)) | 661 | #define TI_GET_BOARD_REVISION(x) (__u8)(((x)&0x0f)) |
660 | 662 | ||
661 | #define TI_I2C_SIZE_MASK 0x1f // 5 bits | 663 | #define TI_I2C_SIZE_MASK 0x1f // 5 bits |
662 | #define TI_GET_I2C_SIZE(x) ((((x) & TI_I2C_SIZE_MASK)+1)*256) | 664 | #define TI_GET_I2C_SIZE(x) ((((x) & TI_I2C_SIZE_MASK)+1)*256) |
663 | 665 | ||
664 | #define TI_MAX_I2C_SIZE ( 16 * 1024 ) | 666 | #define TI_MAX_I2C_SIZE ( 16 * 1024 ) |
665 | 667 | ||
666 | #define TI_MANUF_VERSION_0 0 | 668 | #define TI_MANUF_VERSION_0 0 |
667 | 669 | ||
668 | // IonConig2 flags | 670 | // IonConig2 flags |
669 | #define TI_CONFIG2_RS232 0x01 | 671 | #define TI_CONFIG2_RS232 0x01 |
670 | #define TI_CONFIG2_RS422 0x02 | 672 | #define TI_CONFIG2_RS422 0x02 |
671 | #define TI_CONFIG2_RS485 0x04 | 673 | #define TI_CONFIG2_RS485 0x04 |
672 | #define TI_CONFIG2_SWITCHABLE 0x08 | 674 | #define TI_CONFIG2_SWITCHABLE 0x08 |
673 | 675 | ||
674 | #define TI_CONFIG2_WATCHPORT 0x10 | 676 | #define TI_CONFIG2_WATCHPORT 0x10 |
675 | 677 | ||
676 | 678 | ||
677 | struct edge_ti_manuf_descriptor | 679 | struct edge_ti_manuf_descriptor |
678 | { | 680 | { |
679 | __u8 IonConfig; // Config byte for ION manufacturing use | 681 | __u8 IonConfig; // Config byte for ION manufacturing use |
680 | __u8 IonConfig2; // Expansion | 682 | __u8 IonConfig2; // Expansion |
681 | __u8 Version; // Version | 683 | __u8 Version; // Version |
682 | __u8 CpuRev_BoardRev; // CPU revision level (0xF0) and Board Rev Level (0x0F) | 684 | __u8 CpuRev_BoardRev; // CPU revision level (0xF0) and Board Rev Level (0x0F) |
683 | __u8 NumPorts; // Number of ports for this UMP | 685 | __u8 NumPorts; // Number of ports for this UMP |
684 | __u8 NumVirtualPorts; // Number of Virtual ports | 686 | __u8 NumVirtualPorts; // Number of Virtual ports |
685 | __u8 HubConfig1; // Used to configure the Hub | 687 | __u8 HubConfig1; // Used to configure the Hub |
686 | __u8 HubConfig2; // Used to configure the Hub | 688 | __u8 HubConfig2; // Used to configure the Hub |
687 | __u8 TotalPorts; // Total Number of Com Ports for the entire device (All UMPs) | 689 | __u8 TotalPorts; // Total Number of Com Ports for the entire device (All UMPs) |
688 | __u8 Reserved; // Reserved | 690 | __u8 Reserved; // Reserved |
689 | }__attribute__((packed)); | 691 | }__attribute__((packed)); |
690 | 692 | ||
691 | 693 | ||
692 | #endif // if !defined(_USBVEND_H) | 694 | #endif // if !defined(_USBVEND_H) |
693 | 695 |