diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/ntos/miniport/qlogic | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to 'private/ntos/miniport/qlogic')
-rw-r--r-- | private/ntos/miniport/qlogic/isp_fw.c | 1245 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/makedsk.bat | 4 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/makefile | 7 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/oemsetup.inf | 571 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/qlisp.c | 3050 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/qlisp.h | 608 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/qlisp.rc | 12 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/sources | 41 | ||||
-rw-r--r-- | private/ntos/miniport/qlogic/txtsetup.oem | 97 |
9 files changed, 5635 insertions, 0 deletions
diff --git a/private/ntos/miniport/qlogic/isp_fw.c b/private/ntos/miniport/qlogic/isp_fw.c new file mode 100644 index 000000000..f74347cc4 --- /dev/null +++ b/private/ntos/miniport/qlogic/isp_fw.c @@ -0,0 +1,1245 @@ + +/* + * Version 1.27 (18:17 April 18, 1995) + */ + +unsigned short risc_code_version = 1*1024+27; + +unsigned short risc_code_addr01 = 0x1000 ; + +unsigned short risc_code01[] = { + 0x0078, 0x102f, 0x0000, 0x267b, 0x0000, 0x2043, 0x4f50, 0x5952, + 0x4947, 0x4854, 0x2031, 0x3939, 0x312c, 0x3139, 0x3932, 0x2c31, + 0x3939, 0x332c, 0x3139, 0x3934, 0x2051, 0x4c4f, 0x4749, 0x4320, + 0x434f, 0x5250, 0x4f52, 0x4154, 0x494f, 0x4e00, 0x2049, 0x5350, + 0x3130, 0x3230, 0x2046, 0x6972, 0x6d77, 0x6172, 0x6520, 0x2056, + 0x6572, 0x7369, 0x6f6e, 0x2030, 0x312e, 0x3237, 0x2020, 0x20b9, + 0x1212, 0x2071, 0x0010, 0x70c3, 0x0004, 0x20c9, 0x41ff, 0x2089, + 0x1143, 0x70c7, 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, + 0x0001, 0x3f00, 0x70d6, 0x20c1, 0x0008, 0x2009, 0xfeff, 0x2100, + 0x2003, 0xa5a5, 0xa084, 0x7fff, 0x2003, 0x0a0a, 0xa084, 0x3fff, + 0x2003, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, 0x109f, 0x20c1, + 0x0000, 0x2100, 0x2003, 0xa5a5, 0xa084, 0x7fff, 0x2003, 0x0a0a, + 0xa084, 0x3fff, 0x2003, 0x5050, 0x2114, 0xa286, 0xa5a5, 0x0040, + 0x109f, 0x2019, 0x7fff, 0xa392, 0x41ff, 0x0048, 0x109f, 0x20c1, + 0x0008, 0x2009, 0x7fff, 0x2100, 0x2003, 0x0a0a, 0xa084, 0x3fff, + 0x2003, 0x5050, 0x2114, 0xa286, 0x0a0a, 0x0040, 0x1092, 0x2019, + 0x3fff, 0xa392, 0x41ff, 0x0048, 0x1092, 0x20c1, 0x0004, 0x2009, + 0x3fff, 0x200b, 0x5050, 0x2114, 0xa286, 0x5050, 0x0040, 0x1092, + 0x0078, 0x114b, 0x98c0, 0xa188, 0x1000, 0x200b, 0xa5a5, 0x2114, + 0xa286, 0xa5a5, 0x0040, 0x109f, 0xa18a, 0x1000, 0x98c1, 0x2130, + 0xa18a, 0x0040, 0x2128, 0xa1a2, 0x3700, 0x8424, 0x8424, 0x8424, + 0x8424, 0x8424, 0x8424, 0xa192, 0x4200, 0x2009, 0x0000, 0x2001, + 0x002f, 0x1078, 0x19d8, 0x2218, 0x2079, 0x3700, 0x2fa0, 0x2408, + 0x2011, 0x0000, 0x20a9, 0x0040, 0x42a4, 0x8109, 0x00c0, 0x10ba, + 0x7eda, 0x7dce, 0x8528, 0x7dca, 0x7cd2, 0x7bd6, 0x2031, 0x0030, + 0x78b3, 0x0101, 0x780b, 0x0002, 0x780f, 0x0002, 0x784f, 0x0003, + 0x2069, 0x3740, 0x681b, 0x0028, 0x6807, 0x0007, 0x680b, 0x00fa, + 0x680f, 0x0008, 0x6813, 0x0005, 0x681f, 0x0000, 0x6823, 0x0006, + 0x6817, 0x0008, 0x6827, 0x0000, 0x2069, 0x3800, 0x2011, 0x0020, + 0x2009, 0x0010, 0x680b, 0x0c19, 0x680f, 0x0019, 0x6803, 0xfd00, + 0x6807, 0x0018, 0x6a1a, 0x2d00, 0xa0e8, 0x0008, 0xa290, 0x0004, + 0x8109, 0x00c0, 0x10ea, 0x2069, 0x3880, 0x20a9, 0x0080, 0x680b, + 0x0040, 0x7bd8, 0xa386, 0xfeff, 0x00c0, 0x110c, 0x6817, 0x0100, + 0x681f, 0x0064, 0x0078, 0x1110, 0x6817, 0x0064, 0x681f, 0x0002, + 0xade8, 0x0010, 0x0070, 0x1116, 0x0078, 0x10ff, 0x1078, 0x1c6a, + 0x1078, 0x319f, 0x1078, 0x1818, 0x1078, 0x363d, 0x3200, 0xa085, + 0x000d, 0x2090, 0x70c3, 0x0000, 0x0090, 0x112d, 0x70c0, 0xa086, + 0x0002, 0x00c0, 0x112d, 0x1078, 0x1262, 0x1078, 0x116e, 0x78b0, + 0xa005, 0x00c0, 0x1139, 0x1078, 0x19ff, 0x0068, 0x113d, 0x1078, + 0x1bc6, 0x0068, 0x113d, 0x1078, 0x190b, 0x00e0, 0x112d, 0x1078, + 0x34db, 0x0078, 0x112d, 0x114b, 0x114d, 0x1e10, 0x1e10, 0x31ff, + 0x31ff, 0x1e10, 0x1e10, 0x0078, 0x114b, 0x0078, 0x114d, 0x0078, + 0x114f, 0x0078, 0x1151, 0x2009, 0x0022, 0x2104, 0xa086, 0x4000, + 0x0040, 0x1169, 0x7008, 0x800b, 0x00c8, 0x1169, 0x7007, 0x0002, + 0xa08c, 0x0060, 0x00c0, 0x116a, 0xa084, 0x0008, 0x0040, 0x1169, + 0x087a, 0x097a, 0x70c3, 0x4002, 0x0078, 0x1265, 0x2061, 0x0000, + 0x6018, 0xa084, 0x0001, 0x00c0, 0x11df, 0x7814, 0xa005, 0x00c0, + 0x117d, 0x0010, 0x11e0, 0x0078, 0x11df, 0x2009, 0x3768, 0x2104, + 0xa005, 0x00c0, 0x11df, 0x2009, 0x3771, 0x200b, 0x0000, 0x7914, + 0xa186, 0x0042, 0x00c0, 0x11a2, 0x7816, 0x2009, 0x376f, 0x2164, + 0x200b, 0x0000, 0x6018, 0x70c6, 0x6014, 0x70ca, 0x611c, 0xa18c, + 0xff00, 0x6020, 0xa084, 0x00ff, 0xa105, 0x70ce, 0x1078, 0x180a, + 0x0078, 0x11dd, 0x7814, 0xa086, 0x0018, 0x00c0, 0x11a9, 0x1078, + 0x15ba, 0x7817, 0x0000, 0x2009, 0x376f, 0x2104, 0xa065, 0x0040, + 0x11cd, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f, 0x609f, + 0x0000, 0x2009, 0x376a, 0x211c, 0x8108, 0x2114, 0x8108, 0x2104, + 0xa210, 0xa399, 0x0000, 0x2009, 0x001c, 0x6087, 0x0103, 0x1078, + 0x1791, 0x00c0, 0x11d9, 0x1078, 0x180a, 0x2009, 0x376f, 0x200b, + 0x0000, 0x2009, 0x3769, 0x2104, 0x200b, 0x0000, 0xa005, 0x0040, + 0x11dd, 0x2001, 0x4005, 0x0078, 0x1264, 0x0078, 0x1262, 0x007c, + 0x70c3, 0x0000, 0x70c7, 0x0000, 0x70cb, 0x0000, 0x70cf, 0x0000, + 0x70c0, 0xa0bc, 0xffc0, 0x00c0, 0x1230, 0x2038, 0x0079, 0x11f0, + 0x1262, 0x12bb, 0x127f, 0x12bb, 0x1324, 0x1324, 0x1276, 0x1695, + 0x132f, 0x126e, 0x1283, 0x1285, 0x1287, 0x1289, 0x169a, 0x126e, + 0x133f, 0x136a, 0x15d2, 0x168f, 0x128b, 0x1532, 0x1554, 0x156a, + 0x1587, 0x14ef, 0x14fd, 0x1511, 0x1525, 0x13dd, 0x126e, 0x138b, + 0x1391, 0x1396, 0x139b, 0x13a1, 0x13a6, 0x13ab, 0x13b0, 0x13b5, + 0x13b9, 0x13ce, 0x13da, 0x126e, 0x126e, 0x126e, 0x126e, 0x13e9, + 0x13f2, 0x1401, 0x1427, 0x1431, 0x1438, 0x145e, 0x146d, 0x147c, + 0x148e, 0x14cf, 0x14df, 0x126e, 0x126e, 0x126e, 0x126e, 0x14e4, + 0xa0bc, 0xffa0, 0x00c0, 0x126e, 0x2038, 0xa084, 0x001f, 0x0079, + 0x1239, 0x16b1, 0x16b4, 0x16c4, 0x1740, 0x1779, 0x126e, 0x126e, + 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, + 0x126e, 0x12b1, 0x131a, 0x1335, 0x1360, 0x15c8, 0x126e, 0x126e, + 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, 0x126e, + 0x126e, 0x72ca, 0x71c6, 0x2001, 0x4006, 0x0078, 0x1264, 0x73ce, + 0x72ca, 0x71c6, 0x2001, 0x4000, 0x70c2, 0x2061, 0x0000, 0x601b, + 0x0001, 0x2091, 0x5000, 0x2091, 0x4080, 0x007c, 0x70c3, 0x4001, + 0x0078, 0x1265, 0x70c3, 0x4006, 0x0078, 0x1265, 0x2099, 0x0041, + 0x20a1, 0x0041, 0x20a9, 0x0005, 0x53a3, 0x0078, 0x1262, 0x70c4, + 0x70c3, 0x0004, 0x007a, 0x0078, 0x1262, 0x0078, 0x1262, 0x0078, + 0x1262, 0x0078, 0x1262, 0x2091, 0x8000, 0x70c3, 0x0000, 0x70c7, + 0x4953, 0x70cb, 0x5020, 0x70cf, 0x2020, 0x70d3, 0x0001, 0x3f00, + 0x70d6, 0x2079, 0x0000, 0x781b, 0x0001, 0x2031, 0x0030, 0x2059, + 0x1000, 0x2029, 0x0457, 0x2051, 0x0470, 0x2061, 0x0472, 0x20b9, + 0xffff, 0x20c1, 0x0000, 0x2091, 0x5000, 0x2091, 0x4080, 0x0078, + 0x0455, 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc, 0x75da, + 0x74de, 0x0078, 0x12be, 0x2029, 0x0000, 0x2520, 0x71d0, 0x72c8, + 0x73cc, 0x70c4, 0x20a0, 0x2098, 0x2031, 0x0030, 0x81ff, 0x0040, + 0x1262, 0x7007, 0x0004, 0x731a, 0x721e, 0x7422, 0x7526, 0x2051, + 0x0012, 0x2049, 0x12f9, 0x2041, 0x1262, 0x7003, 0x0002, 0xa786, + 0x0001, 0x0040, 0x12e1, 0xa786, 0x0050, 0x0040, 0x12e1, 0x0078, + 0x12e7, 0x2049, 0x1306, 0x2041, 0x1312, 0x7003, 0x0003, 0x7017, + 0x0000, 0x810b, 0x7112, 0x00c8, 0x12ef, 0x7017, 0x0001, 0x7007, + 0x0001, 0xa786, 0x0001, 0x0040, 0x1306, 0xa786, 0x0050, 0x0040, + 0x1306, 0x700c, 0xa084, 0x007f, 0x2009, 0x0040, 0xa102, 0x8004, + 0x094a, 0x20a8, 0x26a0, 0x53a6, 0x0078, 0x1153, 0x700c, 0xa084, + 0x007f, 0x0040, 0x1306, 0x80ac, 0x0048, 0x1306, 0x2698, 0x53a5, + 0x0078, 0x1153, 0x700c, 0xa084, 0x007f, 0x80ac, 0x2698, 0x53a5, + 0x0078, 0x1262, 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc, + 0x75da, 0x74de, 0x0078, 0x12be, 0x71c4, 0x70c8, 0x2114, 0xa79e, + 0x0004, 0x00c0, 0x132c, 0x200a, 0x72ca, 0x0078, 0x1261, 0x70c7, + 0x0001, 0x70cb, 0x001b, 0x0078, 0x1262, 0x1078, 0x1978, 0x00c0, + 0x1272, 0x75d8, 0x76dc, 0x75da, 0x76de, 0x0078, 0x1342, 0x2029, + 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, 0x74d0, 0x70c6, 0x72ca, + 0x73ce, 0x74d2, 0xa005, 0x0040, 0x135a, 0x8001, 0x787a, 0x7a82, + 0x7b86, 0x7d8a, 0x7e8e, 0x7c7e, 0x78b0, 0xa084, 0xfffc, 0x78b2, + 0x0078, 0x135e, 0x78b0, 0xa085, 0x0001, 0x78b2, 0x0078, 0x1262, + 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x76dc, 0x75da, 0x76de, + 0x0078, 0x136d, 0x2029, 0x0000, 0x2530, 0x70c4, 0x72c8, 0x73cc, + 0x74d4, 0x70c6, 0x72ca, 0x73ce, 0x74d6, 0xa005, 0x0040, 0x1385, + 0x8001, 0x7896, 0x7a9e, 0x7ba2, 0x7da6, 0x7eaa, 0x7c9a, 0x78b0, + 0xa084, 0xfcff, 0x78b2, 0x0078, 0x1389, 0x78b0, 0xa085, 0x0100, + 0x78b2, 0x0078, 0x1262, 0x2009, 0x375b, 0x210c, 0x7ad4, 0x0078, + 0x1260, 0x2009, 0x3741, 0x210c, 0x0078, 0x1261, 0x2009, 0x3742, + 0x210c, 0x0078, 0x1261, 0x2061, 0x3740, 0x610c, 0x6210, 0x0078, + 0x1260, 0x2009, 0x3745, 0x210c, 0x0078, 0x1261, 0x2009, 0x3746, + 0x210c, 0x0078, 0x1261, 0x2009, 0x3747, 0x210c, 0x0078, 0x1261, + 0x2009, 0x3748, 0x210c, 0x0078, 0x1261, 0x7908, 0x7a0c, 0x0078, + 0x1260, 0x71c4, 0x8107, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, + 0xa0e8, 0x3800, 0x6a00, 0x6804, 0xa084, 0x0008, 0x0040, 0x13cb, + 0x6b08, 0x0078, 0x13cc, 0x6b0c, 0x0078, 0x125f, 0x77c4, 0x1078, + 0x1828, 0x2091, 0x8000, 0x6b1c, 0x6a14, 0x2091, 0x8001, 0x2708, + 0x0078, 0x125f, 0x794c, 0x0078, 0x1261, 0x77c4, 0x1078, 0x1828, + 0x2091, 0x8000, 0x6908, 0x6a18, 0x6b10, 0x2091, 0x8001, 0x0078, + 0x125f, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x125a, 0x1078, 0x1cf0, + 0x0078, 0x125f, 0x71c4, 0xa182, 0x0010, 0x00c8, 0x125a, 0x2011, + 0x3741, 0x2204, 0x007e, 0x2112, 0x1078, 0x1ca9, 0x017f, 0x0078, + 0x1261, 0x71c4, 0x2011, 0x141f, 0x20a9, 0x0008, 0x2204, 0xa106, + 0x0040, 0x1411, 0x8210, 0x0070, 0x140f, 0x0078, 0x1406, 0x0078, + 0x125a, 0xa292, 0x141f, 0x027e, 0x2011, 0x3742, 0x2204, 0x2112, + 0x017f, 0x007e, 0x1078, 0x1cb5, 0x017f, 0x0078, 0x1261, 0x03e8, + 0x00fa, 0x01f4, 0x02ee, 0x0064, 0x0019, 0x0032, 0x004b, 0x2061, + 0x3740, 0x610c, 0x6210, 0x70c4, 0x600e, 0x70c8, 0x6012, 0x0078, + 0x1260, 0x2061, 0x3740, 0x6114, 0x70c4, 0x6016, 0x0078, 0x1261, + 0x71c4, 0x2011, 0x0004, 0x2019, 0x1212, 0xa186, 0x0028, 0x0040, + 0x1451, 0x2011, 0x0005, 0x2019, 0x1212, 0xa186, 0x0032, 0x0040, + 0x1451, 0x2011, 0x0006, 0x2019, 0x2323, 0xa186, 0x003c, 0x00c0, + 0x125a, 0x2061, 0x3740, 0x6018, 0x007e, 0x611a, 0x23b8, 0x1078, + 0x1cc6, 0x1078, 0x363d, 0x017f, 0x0078, 0x1261, 0x71c4, 0xa184, + 0xffcf, 0x00c0, 0x125a, 0x2011, 0x3747, 0x2204, 0x2112, 0x007e, + 0x1078, 0x1ce8, 0x017f, 0x0078, 0x1261, 0x71c4, 0xa182, 0x0010, + 0x00c8, 0x125a, 0x2011, 0x3748, 0x2204, 0x007e, 0x2112, 0x1078, + 0x1cd7, 0x017f, 0x0078, 0x1261, 0x71c4, 0x72c8, 0xa184, 0xfffd, + 0x00c0, 0x1259, 0xa284, 0xfffd, 0x00c0, 0x1259, 0x2100, 0x7908, + 0x780a, 0x2200, 0x7a0c, 0x780e, 0x0078, 0x1260, 0x71c4, 0x8107, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0e8, 0x3800, 0x2019, + 0x0000, 0x72c8, 0x6800, 0x007e, 0xa226, 0x0040, 0x14bd, 0x6a02, + 0xa484, 0x2000, 0x0040, 0x14a6, 0xa39d, 0x0010, 0xa484, 0x1000, + 0x0040, 0x14ac, 0xa39d, 0x0008, 0xa484, 0x4000, 0x0040, 0x14bd, + 0x810f, 0xa284, 0x4000, 0x0040, 0x14b9, 0x1078, 0x1d0a, 0x0078, + 0x14bd, 0x1078, 0x1cfc, 0x0078, 0x14bd, 0x72cc, 0x82ff, 0x0040, + 0x14c8, 0x6808, 0xa206, 0x0040, 0x14c8, 0x6a0a, 0xa39d, 0x000a, + 0x6804, 0xa305, 0x6806, 0x027f, 0x6b0c, 0x0078, 0x125f, 0x77c4, + 0x1078, 0x1828, 0x2091, 0x8000, 0x6a14, 0x6b1c, 0x2091, 0x8001, + 0x70c8, 0x6816, 0x70cc, 0x681e, 0x2708, 0x0078, 0x125f, 0x70c4, + 0x794c, 0x784e, 0x0078, 0x1261, 0x71c4, 0x72c8, 0x73cc, 0xa182, + 0x0010, 0x00c8, 0x125a, 0x1078, 0x1d18, 0x0078, 0x125f, 0x77c4, + 0x1078, 0x1828, 0x2091, 0x8000, 0x6a08, 0xa295, 0x0002, 0x6a0a, + 0x2091, 0x8001, 0x2708, 0x0078, 0x1260, 0x77c4, 0x1078, 0x1828, + 0x2091, 0x8000, 0x6a08, 0xa294, 0xfff9, 0x6a0a, 0x6804, 0xa005, + 0x0040, 0x150c, 0x1078, 0x1c4b, 0x2091, 0x8001, 0x2708, 0x0078, + 0x1260, 0x77c4, 0x1078, 0x1828, 0x2091, 0x8000, 0x6a08, 0xa295, + 0x0004, 0x6a0a, 0x6804, 0xa005, 0x0040, 0x1520, 0x1078, 0x1c4b, + 0x2091, 0x8001, 0x2708, 0x0078, 0x1260, 0x77c4, 0x2041, 0x0001, + 0x2049, 0x0005, 0x2051, 0x0020, 0x1078, 0x1835, 0x2708, 0x6a08, + 0x0078, 0x1260, 0x77c4, 0x73c8, 0x72cc, 0x77c6, 0x73ca, 0x72ce, + 0x1078, 0x18b0, 0x00c0, 0x1550, 0x6818, 0xa005, 0x0040, 0x154a, + 0x2708, 0x1078, 0x1d28, 0x00c0, 0x154a, 0x7817, 0x0015, 0x2091, + 0x8001, 0x007c, 0x2091, 0x8001, 0x2001, 0x4005, 0x0078, 0x1264, + 0x2091, 0x8001, 0x0078, 0x1262, 0x77c4, 0x77c6, 0x2061, 0x3740, + 0x60a3, 0x0003, 0x67b6, 0x60c7, 0x0005, 0x2041, 0x0021, 0x2049, + 0x0005, 0x2051, 0x0020, 0x1078, 0x1835, 0x7817, 0x0016, 0x1078, + 0x1c4b, 0x007c, 0x77c4, 0x77c6, 0xa7bc, 0xff00, 0x2061, 0x3740, + 0x60a3, 0x0002, 0x67b6, 0x60c7, 0x0005, 0x7817, 0x0017, 0x1078, + 0x1c4b, 0x2041, 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, + 0x1835, 0x8738, 0xa784, 0x0007, 0x00c0, 0x157f, 0x007c, 0x78b0, + 0xa084, 0x0003, 0x00c0, 0x15ab, 0x2039, 0x0000, 0x2041, 0x0021, + 0x2049, 0x0004, 0x2051, 0x0008, 0x1078, 0x1828, 0x2091, 0x8000, + 0x6808, 0xa80d, 0x690a, 0x2091, 0x8001, 0x8738, 0xa784, 0x0007, + 0x00c0, 0x1594, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, + 0x0f00, 0x00c0, 0x1594, 0x7817, 0x0018, 0x2061, 0x3740, 0x60a3, + 0x0001, 0x60c7, 0x0005, 0x1078, 0x1c4b, 0x78b0, 0xa085, 0x0002, + 0x78b2, 0x007c, 0x78b0, 0xa084, 0xfffd, 0x78b2, 0xa084, 0x0001, + 0x00c0, 0x15c4, 0x1078, 0x18f2, 0x71c4, 0x71c6, 0x794a, 0x007c, + 0x1078, 0x1978, 0x00c0, 0x1272, 0x75d8, 0x74dc, 0x75da, 0x74de, + 0x0078, 0x15d5, 0x2029, 0x0000, 0x2520, 0x71c4, 0x73c8, 0x72cc, + 0x71c6, 0x73ca, 0x72ce, 0x2079, 0x3700, 0x1078, 0x1801, 0x0040, + 0x167d, 0x20a9, 0x0005, 0x20a1, 0x3716, 0x41a1, 0x2009, 0x0040, + 0x1078, 0x17cb, 0x0040, 0x15f0, 0x1078, 0x180a, 0x0078, 0x167d, + 0x6004, 0xa084, 0xff00, 0x8007, 0x8009, 0x0040, 0x1651, 0x0c7e, + 0x2c68, 0x1078, 0x1801, 0x0040, 0x1620, 0x2c00, 0x689e, 0x8109, + 0x00c0, 0x15f8, 0x609f, 0x0000, 0x0c7f, 0x0c7e, 0x7218, 0x731c, + 0x7420, 0x7524, 0x2c68, 0x689c, 0xa065, 0x0040, 0x1650, 0x2009, + 0x0040, 0x1078, 0x17cb, 0x00c0, 0x1639, 0x6004, 0xa084, 0x00ff, + 0xa086, 0x0002, 0x00c0, 0x1620, 0x2d00, 0x6002, 0x0078, 0x1606, + 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f, 0x609f, + 0x0000, 0x1078, 0x1681, 0x2009, 0x001c, 0x6008, 0xa085, 0x0200, + 0x600a, 0x6004, 0x6086, 0x1078, 0x1791, 0x1078, 0x180a, 0x0078, + 0x167d, 0x0c7f, 0x0c7e, 0x609c, 0x2060, 0x1078, 0x186a, 0x0c7f, + 0x609f, 0x0000, 0x1078, 0x1681, 0x2009, 0x001c, 0x6087, 0x0103, + 0x601b, 0x0003, 0x1078, 0x1791, 0x1078, 0x180a, 0x0078, 0x167d, + 0x0c7f, 0x74c4, 0x73c8, 0x72cc, 0x6014, 0x7817, 0x0012, 0x0e7e, + 0x2071, 0x3740, 0x70a3, 0x0005, 0x70a7, 0x0000, 0x73aa, 0x72ae, + 0x74b2, 0x70b6, 0x70bb, 0x0000, 0x2c00, 0x70be, 0x70c3, 0x0000, + 0xa02e, 0x2530, 0x611c, 0xa184, 0x0060, 0x0040, 0x1671, 0x1078, + 0x3143, 0x0e7f, 0x6596, 0x65a6, 0x669a, 0x669a, 0x60af, 0x0000, + 0x60b3, 0x0000, 0x1078, 0x1c4b, 0x007c, 0x70c3, 0x4005, 0x0078, + 0x1265, 0x20a9, 0x0005, 0x2099, 0x3716, 0x530a, 0x2100, 0xa210, + 0xa399, 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x71c4, + 0x70c7, 0x0000, 0x7906, 0x0078, 0x1262, 0x71c4, 0x71c6, 0x2168, + 0x0078, 0x169c, 0x2069, 0x1000, 0x690c, 0xa016, 0x2d04, 0xa210, + 0x8d68, 0x8109, 0x00c0, 0x169e, 0xa285, 0x0000, 0x00c0, 0x16ac, + 0x70c3, 0x4000, 0x0078, 0x16ae, 0x70c3, 0x4003, 0x70ca, 0x0078, + 0x1265, 0x79c8, 0x0078, 0x1261, 0x71c4, 0x71c6, 0x2198, 0x20a1, + 0x0042, 0x20a9, 0x0004, 0x53a3, 0x21a0, 0x2099, 0x0042, 0x20a9, + 0x0004, 0x53a3, 0x0078, 0x1262, 0x70c4, 0x2068, 0x2079, 0x3700, + 0x1078, 0x1801, 0x0040, 0x173c, 0x6007, 0x0001, 0x600b, 0x0000, + 0x602b, 0x0000, 0x601b, 0x0006, 0x6a10, 0xa28c, 0x0007, 0xa284, + 0x00f0, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0x6016, 0xa284, + 0x0800, 0x0040, 0x16e7, 0x601b, 0x000a, 0x0078, 0x16ed, 0xa284, + 0x1000, 0x0040, 0x16ed, 0x601b, 0x000c, 0xa284, 0x0300, 0x0040, + 0x16f6, 0x602b, 0x0001, 0x8004, 0x8004, 0x8004, 0xa085, 0x0001, + 0x601e, 0x6023, 0x0000, 0x6027, 0x000a, 0xa284, 0x0400, 0x0040, + 0x1703, 0x602b, 0x0000, 0x20a9, 0x0006, 0xac80, 0x000b, 0x20a0, + 0xad80, 0x0005, 0x2098, 0x53a3, 0xa284, 0x0300, 0x00c0, 0x1718, + 0x6046, 0x604a, 0x604e, 0x6052, 0x6096, 0x609a, 0x0078, 0x1722, + 0x6800, 0x6046, 0x6804, 0x604a, 0x6e08, 0x664e, 0x6d0c, 0x6552, + 0x6596, 0x669a, 0x6014, 0x7817, 0x0042, 0x2c08, 0x2061, 0x3740, + 0x60a3, 0x0005, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x60af, 0x0000, + 0x60b3, 0x0000, 0x60b6, 0x61be, 0xa284, 0x0400, 0x60c2, 0x1078, + 0x312e, 0x1078, 0x1c4b, 0x007c, 0x70c3, 0x4005, 0x0078, 0x1265, + 0x78e0, 0xa005, 0x0040, 0x126e, 0x2091, 0x8000, 0x70c4, 0x800a, + 0x2011, 0x0010, 0x810c, 0x0048, 0x1752, 0x3a00, 0xa084, 0xfff7, + 0x0078, 0x1755, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x0005, 0x0005, + 0xa084, 0xfffb, 0x20d0, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0xa085, 0x0004, 0x20d0, 0x0005, 0x0005, + 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x8211, 0x00c0, + 0x174a, 0x3a00, 0xa085, 0x0008, 0x20d0, 0x2091, 0x8001, 0x0078, + 0x1262, 0x2011, 0x04fd, 0x2204, 0xa082, 0x0004, 0x0048, 0x178d, + 0x78e3, 0x0001, 0x2009, 0xff01, 0x200a, 0x2001, 0x000c, 0x20d8, + 0x2001, 0x000c, 0x20d0, 0x0078, 0x1262, 0x2001, 0x4005, 0x0078, + 0x1264, 0x700c, 0xa084, 0x00ff, 0x0040, 0x179d, 0x7007, 0x0004, + 0x7004, 0xa084, 0x0004, 0x00c0, 0x1798, 0x7017, 0x0000, 0x7112, + 0x721a, 0x731e, 0x7422, 0x7526, 0xac80, 0x0001, 0x8108, 0x810c, + 0x81a9, 0x8098, 0x20a1, 0x0030, 0x6084, 0x20a2, 0x53a6, 0x780c, + 0xa085, 0x0000, 0x7002, 0x7007, 0x0001, 0x2009, 0x0022, 0x2104, + 0xa084, 0x4000, 0x00c0, 0x17b5, 0x7108, 0x8103, 0x00c8, 0x17b5, + 0x7014, 0xa005, 0x0040, 0x17b5, 0x7007, 0x0002, 0xa184, 0x0060, + 0x7003, 0x0000, 0x007c, 0x700c, 0xa084, 0x00ff, 0x0040, 0x17d7, + 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, 0x17d2, 0x7017, + 0x0000, 0x7112, 0x721a, 0x7422, 0x7526, 0x731e, 0x2099, 0x0030, + 0x8108, 0x81ac, 0x780c, 0xa085, 0x0001, 0x7002, 0x7007, 0x0001, + 0x2009, 0x0022, 0x2104, 0xa084, 0x4000, 0x00c0, 0x17e8, 0x7008, + 0x800b, 0x00c8, 0x17e8, 0x7007, 0x0002, 0xa08c, 0x0060, 0x00c0, + 0x17fe, 0xac80, 0x0001, 0x20a0, 0x53a5, 0xa006, 0x7003, 0x0000, + 0x007c, 0x7850, 0xa065, 0x0040, 0x1809, 0x2c04, 0x7852, 0x2063, + 0x0000, 0x007c, 0x0f7e, 0x2079, 0x3700, 0x7850, 0x2062, 0x2c00, + 0xa005, 0x00c0, 0x1815, 0x1078, 0x1e01, 0x7852, 0x0f7f, 0x007c, + 0x2011, 0x4200, 0x7a52, 0x7bd4, 0x8319, 0x0040, 0x1825, 0xa280, + 0x002f, 0x2012, 0x2010, 0x0078, 0x181c, 0x2013, 0x0000, 0x007c, + 0xa784, 0x0f00, 0x800c, 0xa784, 0x0007, 0x8003, 0x8003, 0x8003, + 0x8003, 0xa105, 0xa0e8, 0x3880, 0x007c, 0x1078, 0x1828, 0x2900, + 0x682a, 0x2a00, 0x682e, 0x6808, 0xa084, 0xffef, 0xa80d, 0x690a, + 0x2091, 0x8000, 0x2009, 0x374f, 0x210c, 0x6804, 0xa005, 0x0040, + 0x1852, 0xa116, 0x00c0, 0x1852, 0x2060, 0x6000, 0x6806, 0x017e, + 0x0078, 0x1855, 0x2009, 0x0000, 0x017e, 0x6804, 0xa065, 0x0040, + 0x1864, 0x6000, 0x6806, 0x1078, 0x1877, 0x1078, 0x197e, 0x6810, + 0x8001, 0x6812, 0x00c0, 0x1855, 0x017f, 0x6902, 0x6906, 0x2091, + 0x8001, 0x007c, 0xa065, 0x0040, 0x1876, 0x609c, 0x609f, 0x0000, + 0x2008, 0x1078, 0x180a, 0x2100, 0x0078, 0x186a, 0x007c, 0x6007, + 0x0103, 0x20a9, 0x001c, 0xac80, 0x0005, 0x20a0, 0x2001, 0x0000, + 0x40a4, 0x6828, 0x601a, 0x682c, 0x6022, 0x007c, 0x0e7e, 0x2071, + 0x3740, 0x7040, 0xa08c, 0x0080, 0x00c0, 0x1894, 0xa088, 0x3780, + 0x2d0a, 0x8000, 0x7042, 0xa006, 0x0e7f, 0x007c, 0x0e7e, 0x2071, + 0x3740, 0x2009, 0x3780, 0x7240, 0x8221, 0x8211, 0x0048, 0x18ae, + 0x2104, 0x8108, 0xad06, 0x00c0, 0x189d, 0x8119, 0x211e, 0x8108, + 0x8318, 0x8211, 0x00c8, 0x18a6, 0x7442, 0xa006, 0x0e7f, 0x007c, + 0x1078, 0x1828, 0x2091, 0x8000, 0x6804, 0x781e, 0xa065, 0x0040, + 0x18f1, 0x0078, 0x18c1, 0x2c00, 0x781e, 0x6000, 0xa065, 0x0040, + 0x18f1, 0x6010, 0xa306, 0x00c0, 0x18bb, 0x600c, 0xa206, 0x00c0, + 0x18bb, 0x2c28, 0x6804, 0xac06, 0x00c0, 0x18d8, 0x6000, 0x2060, + 0x6806, 0xa005, 0x00c0, 0x18d8, 0x6803, 0x0000, 0x0078, 0x18e2, + 0x6400, 0x781c, 0x2060, 0x6402, 0xa486, 0x0000, 0x00c0, 0x18e2, + 0x2c00, 0x6802, 0x2560, 0x1078, 0x1877, 0x601b, 0x0005, 0x6023, + 0x0020, 0x1078, 0x197e, 0x6810, 0x8001, 0x6812, 0x2001, 0xffff, + 0xa005, 0x007c, 0x2039, 0x0000, 0x2041, 0x0021, 0x2049, 0x0004, + 0x2051, 0x0008, 0x1078, 0x1835, 0x8738, 0xa784, 0x0007, 0x00c0, + 0x18fa, 0xa7bc, 0xff00, 0x873f, 0x8738, 0x873f, 0xa784, 0x0f00, + 0x00c0, 0x18fa, 0x007c, 0x2061, 0x0000, 0x6018, 0xa084, 0x0001, + 0x00c0, 0x191c, 0x2091, 0x8001, 0x78c4, 0x78c7, 0x0000, 0x2091, + 0x8001, 0xa005, 0x00c0, 0x191d, 0x007c, 0xa08c, 0xfff0, 0x0040, + 0x1923, 0x1078, 0x1e01, 0x0079, 0x1925, 0x1935, 0x1937, 0x193d, + 0x1941, 0x1935, 0x1945, 0x1935, 0x194c, 0x1950, 0x1954, 0x1935, + 0x1935, 0x1935, 0x1935, 0x1935, 0x1935, 0x1078, 0x1e01, 0x1078, + 0x18f2, 0x2001, 0x8001, 0x0078, 0x1264, 0x2001, 0x8003, 0x0078, + 0x1264, 0x2001, 0x8004, 0x0078, 0x1264, 0x1078, 0x18f2, 0x2001, + 0x8006, 0x007c, 0x0078, 0x1264, 0x2001, 0x8008, 0x0078, 0x1264, + 0x2001, 0x8009, 0x0078, 0x1264, 0x2091, 0x8000, 0x2069, 0x3740, + 0x6800, 0xa086, 0x0000, 0x0040, 0x1962, 0x2091, 0x8001, 0x78c7, + 0x0009, 0x007c, 0x68b4, 0xa0bc, 0xff00, 0x2091, 0x8000, 0x2041, + 0x0021, 0x2049, 0x0004, 0x2051, 0x0010, 0x1078, 0x1835, 0x8738, + 0xa784, 0x0007, 0x00c0, 0x196d, 0x2001, 0x800a, 0x0078, 0x1264, + 0x2001, 0x04fd, 0x2004, 0xa086, 0x0004, 0x007c, 0x6004, 0x6086, + 0x2c08, 0x2063, 0x0000, 0x786c, 0x8000, 0x786e, 0x7870, 0xa005, + 0x7972, 0x0040, 0x198e, 0x2c02, 0x0078, 0x198f, 0x7976, 0x007c, + 0x0c7e, 0x2061, 0x3700, 0x6887, 0x0103, 0x2d08, 0x206b, 0x0000, + 0x606c, 0x8000, 0x606e, 0x6070, 0xa005, 0x6172, 0x0040, 0x19a3, + 0x2d02, 0x0078, 0x19a4, 0x6176, 0x0c7f, 0x007c, 0x1078, 0x19b7, + 0x0040, 0x19b6, 0x0c7e, 0x609c, 0xa065, 0x0040, 0x19b1, 0x1078, + 0x186a, 0x0c7f, 0x609f, 0x0000, 0x1078, 0x180a, 0x007c, 0x7874, + 0xa065, 0x0040, 0x19c9, 0x2091, 0x8000, 0x786c, 0x8001, 0x786e, + 0x2c04, 0x7876, 0xa005, 0x00c0, 0x19c7, 0x7872, 0x8000, 0x2091, + 0x8001, 0x007c, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, 0x818e, + 0x00c8, 0x19d3, 0xa200, 0x00f0, 0x19ce, 0x8086, 0x818e, 0x007c, + 0x157e, 0x20a9, 0x0010, 0xa005, 0x0040, 0x19f9, 0xa11a, 0x00c8, + 0x19f9, 0x8213, 0x818d, 0x0048, 0x19ec, 0xa11a, 0x00c8, 0x19ed, + 0x00f0, 0x19e1, 0x0078, 0x19f1, 0xa11a, 0x2308, 0x8210, 0x00f0, + 0x19e1, 0x007e, 0x3200, 0xa084, 0xf7ff, 0x2080, 0x007f, 0x157f, + 0x007c, 0x007e, 0x3200, 0xa085, 0x0800, 0x0078, 0x19f5, 0x797c, + 0x70d0, 0xa106, 0x0040, 0x1a4d, 0x2091, 0x8000, 0x2071, 0x0020, + 0x7004, 0xa005, 0x00c0, 0x1a4d, 0x7008, 0x7208, 0xa206, 0x00c0, + 0x1a4d, 0xa084, 0x4000, 0x00c0, 0x1a4d, 0x2071, 0x0010, 0x1078, + 0x1801, 0x0040, 0x1a4d, 0x7a84, 0x7b80, 0x7c8c, 0x7d88, 0x8107, + 0x8004, 0x8004, 0xa210, 0xa399, 0x0000, 0x2009, 0x0040, 0x1078, + 0x17cb, 0x2091, 0x8001, 0x0040, 0x1a44, 0x1078, 0x180a, 0x7890, + 0x8000, 0x7892, 0xa086, 0x0002, 0x00c0, 0x1a4d, 0x2091, 0x8000, + 0x78c7, 0x0002, 0x7893, 0x0000, 0x78b0, 0xa085, 0x0003, 0x78b2, + 0x2091, 0x8001, 0x0078, 0x1a4d, 0x7893, 0x0000, 0x1078, 0x1b8f, + 0x6004, 0xa084, 0x000f, 0x0079, 0x1a52, 0x2071, 0x0010, 0x2091, + 0x8001, 0x007c, 0x1a62, 0x1a77, 0x1a9d, 0x1a62, 0x1aaf, 0x1a62, + 0x1a62, 0x1a62, 0x1a62, 0x1a71, 0x1a97, 0x1a62, 0x1a62, 0x1a62, + 0x1a62, 0x1a62, 0x2039, 0x0400, 0x78c0, 0xa705, 0x78c2, 0x6008, + 0xa705, 0x600a, 0x1078, 0x1aed, 0x609c, 0x78be, 0x1078, 0x1b77, + 0x007c, 0x1078, 0x1978, 0x00c0, 0x1a62, 0x1078, 0x1ba9, 0x78c0, + 0xa084, 0x0100, 0x0040, 0x1a7e, 0x0078, 0x1a62, 0x78c3, 0x0000, + 0x6004, 0x8007, 0xa084, 0x00ff, 0x78b6, 0x8001, 0x609f, 0x0000, + 0x0040, 0x1a94, 0x1078, 0x1aed, 0x0040, 0x1a94, 0x78c0, 0xa085, + 0x0100, 0x78c2, 0x0078, 0x1a96, 0x1078, 0x1b11, 0x007c, 0x1078, + 0x1978, 0x00c0, 0x1a62, 0x1078, 0x1ba5, 0x78c0, 0xa08c, 0x0e00, + 0x00c0, 0x1aa6, 0xa084, 0x0100, 0x00c0, 0x1aa8, 0x0078, 0x1a62, + 0x1078, 0x1aed, 0x00c0, 0x1aae, 0x1078, 0x1b11, 0x007c, 0x78c0, + 0xa084, 0x0100, 0x0040, 0x1ab6, 0x0078, 0x1a62, 0x78c3, 0x0000, + 0x6714, 0x20a9, 0x0001, 0x6018, 0xa005, 0x0040, 0x1ad1, 0xa7bc, + 0xff00, 0x20a9, 0x0008, 0xa08e, 0x0001, 0x0040, 0x1ad1, 0x2039, + 0x0000, 0x20a9, 0x0080, 0xa08e, 0x0002, 0x0040, 0x1ad1, 0x0078, + 0x1aea, 0x1078, 0x1828, 0x2d00, 0xa088, 0x0002, 0x2091, 0x8000, + 0x2168, 0x682b, 0x0000, 0x682f, 0x0000, 0x2104, 0xa084, 0xffde, + 0x200a, 0x2100, 0xa088, 0x0010, 0x2091, 0x8001, 0x0070, 0x1aea, + 0x0078, 0x1ad6, 0x1078, 0x180a, 0x007c, 0x78b8, 0xa06d, 0x00c0, + 0x1af8, 0x2c00, 0x78ba, 0x78be, 0x609f, 0x0000, 0x0078, 0x1b04, + 0x2c00, 0x689e, 0x609f, 0x0000, 0x78ba, 0x2d00, 0x6002, 0x78bc, + 0xad06, 0x00c0, 0x1b04, 0x6002, 0x78b4, 0x8001, 0x78b6, 0x00c0, + 0x1b10, 0x78c0, 0xa084, 0x0000, 0x78c2, 0x78bc, 0x2060, 0xa006, + 0x007c, 0xa02e, 0x2530, 0x611c, 0x61a2, 0xa184, 0xf9ff, 0x601e, + 0xa184, 0x0060, 0x0040, 0x1b20, 0x0e7e, 0x1078, 0x3143, 0x0e7f, + 0x6596, 0x669a, 0x6714, 0x1078, 0x1828, 0x2091, 0x8000, 0x6808, + 0xa084, 0x0001, 0x0040, 0x1b3c, 0x2091, 0x8001, 0x1078, 0x1877, + 0x2091, 0x8000, 0x1078, 0x197e, 0x2091, 0x8001, 0x78bb, 0x0000, + 0x78bf, 0x0000, 0x0078, 0x1b76, 0x6024, 0xa096, 0x0001, 0x00c0, + 0x1b43, 0x8000, 0x6026, 0x6a10, 0x6814, 0x2091, 0x8001, 0xa202, + 0x0048, 0x1b52, 0x0040, 0x1b52, 0x2039, 0x0200, 0x1078, 0x1b77, + 0x0078, 0x1b76, 0x2c08, 0x2091, 0x8000, 0x6800, 0xa065, 0x0040, + 0x1b5a, 0x6102, 0x6902, 0x00c0, 0x1b5e, 0x6906, 0x2160, 0x6003, + 0x0000, 0x6810, 0x8000, 0x6812, 0x2091, 0x8001, 0x6808, 0xa08c, + 0x0040, 0x0040, 0x1b70, 0xa086, 0x0040, 0x680a, 0x1078, 0x1886, + 0x1078, 0x1c4b, 0x78bf, 0x0000, 0x78bb, 0x0000, 0x007c, 0x6008, + 0xa705, 0x600a, 0x2091, 0x8000, 0x1078, 0x197e, 0x2091, 0x8001, + 0x78bc, 0xa065, 0x0040, 0x1b8a, 0x609c, 0x78be, 0x609f, 0x0000, + 0x0078, 0x1b7a, 0x78bb, 0x0000, 0x78bf, 0x0000, 0x007c, 0x7978, + 0x787c, 0x8000, 0xa10a, 0x00c8, 0x1b96, 0xa006, 0x787e, 0x70d2, + 0x7804, 0xa005, 0x0040, 0x1ba4, 0x8001, 0x7806, 0x00c0, 0x1ba4, + 0x0068, 0x1ba4, 0x2091, 0x4080, 0x007c, 0x2039, 0x1bbd, 0x0078, + 0x1bab, 0x2039, 0x1bc3, 0x2704, 0xa005, 0x0040, 0x1bbc, 0xac00, + 0x2068, 0x6b08, 0x6c0c, 0x6910, 0x6a14, 0x690a, 0x6a0e, 0x6b12, + 0x6c16, 0x8738, 0x0078, 0x1bab, 0x007c, 0x0003, 0x0009, 0x000f, + 0x0015, 0x001b, 0x0000, 0x0015, 0x001b, 0x0000, 0x0068, 0x1bde, + 0x2029, 0x0000, 0x7874, 0xa065, 0x0040, 0x1bd9, 0x1078, 0x1bdf, + 0x0040, 0x1bd9, 0x1078, 0x1bee, 0x00c0, 0x1bd9, 0x8528, 0x0078, + 0x1bca, 0x85ff, 0x0040, 0x1bde, 0x2091, 0x4080, 0x007c, 0x7b94, + 0x7998, 0x70d4, 0xa102, 0x00c0, 0x1be8, 0x2300, 0xa005, 0x007c, + 0x0048, 0x1bec, 0xa302, 0x007c, 0x8002, 0x007c, 0x2091, 0x8000, + 0x2071, 0x0020, 0x7004, 0xa005, 0x00c0, 0x1c32, 0x7008, 0x7208, + 0xa206, 0x00c0, 0x1c32, 0xa084, 0x4000, 0x00c0, 0x1c32, 0x2071, + 0x0010, 0x1078, 0x1c37, 0x2009, 0x001c, 0x6028, 0xa005, 0x0040, + 0x1c0b, 0x2009, 0x0040, 0x1078, 0x1791, 0x0040, 0x1c24, 0x78ac, + 0x8000, 0x78ae, 0xa086, 0x0002, 0x00c0, 0x1c32, 0x2091, 0x8000, + 0x78c7, 0x0003, 0x78af, 0x0000, 0x78b0, 0xa085, 0x0300, 0x78b2, + 0x2091, 0x8001, 0x0078, 0x1c32, 0x78af, 0x0000, 0x1078, 0x19a6, + 0x7994, 0x7898, 0x8000, 0xa10a, 0x00c8, 0x1c2f, 0xa006, 0x789a, + 0x70d6, 0xa006, 0x2071, 0x0010, 0x2091, 0x8001, 0x007c, 0x8107, + 0x8004, 0x8004, 0x7aa0, 0x7b9c, 0x7ca8, 0x7da4, 0xa210, 0xa399, + 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x007c, 0x2009, 0x3768, + 0x2091, 0x8000, 0x200a, 0x0f7e, 0x2079, 0x0100, 0x2009, 0x3740, + 0x2091, 0x8000, 0x2104, 0xa086, 0x0000, 0x00c0, 0x1c66, 0x2009, + 0x3712, 0x2104, 0xa005, 0x00c0, 0x1c66, 0x7830, 0xa084, 0x00c0, + 0x00c0, 0x1c66, 0x0018, 0x1c66, 0x781b, 0x0045, 0x2091, 0x8001, + 0x0f7f, 0x007c, 0x127e, 0x2091, 0x2300, 0x2071, 0x3740, 0x2079, + 0x0100, 0x784b, 0x000f, 0x2019, 0x3041, 0x20a1, 0x012b, 0x2304, + 0xa005, 0x0040, 0x1c84, 0x789a, 0x8318, 0x23ac, 0x8318, 0x2398, + 0x53a6, 0x3318, 0x0078, 0x1c77, 0x789b, 0x0020, 0x20a9, 0x0010, + 0x78af, 0x0000, 0x78af, 0x0020, 0x0070, 0x1c90, 0x0078, 0x1c88, + 0x7003, 0x0000, 0x1078, 0x1d95, 0x7004, 0xa084, 0x000f, 0xa085, + 0x6280, 0x7806, 0x780f, 0x9200, 0x7843, 0x00d8, 0x7853, 0x0080, + 0x780b, 0x0008, 0x7047, 0x377f, 0x7043, 0x0000, 0x127f, 0x2000, + 0x007c, 0xa18c, 0x000f, 0x2011, 0x0101, 0x2204, 0xa084, 0xfff0, + 0xa105, 0x2012, 0x1078, 0x1d95, 0x007c, 0x2011, 0x0101, 0x20a9, + 0x0009, 0x810b, 0x0070, 0x1cbe, 0x0078, 0x1cb9, 0xa18c, 0x0e00, + 0x2204, 0xa084, 0xf1ff, 0xa105, 0x2012, 0x007c, 0x2009, 0x0101, + 0x20a9, 0x0005, 0x8213, 0x0070, 0x1ccf, 0x0078, 0x1cca, 0xa294, + 0x00e0, 0x2104, 0xa084, 0xff1f, 0xa205, 0x200a, 0x007c, 0x2011, + 0x0101, 0x20a9, 0x000c, 0x810b, 0x0070, 0x1ce0, 0x0078, 0x1cdb, + 0xa18c, 0xf000, 0x2204, 0xa084, 0x0fff, 0xa105, 0x2012, 0x007c, + 0x2011, 0x0102, 0x2204, 0xa084, 0xffcf, 0xa105, 0x2012, 0x007c, + 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, + 0x62ac, 0x63ac, 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, + 0x0c7e, 0x2061, 0x0100, 0x609a, 0x60a4, 0xa084, 0xffdf, 0x60ae, + 0x0c7f, 0x007c, 0x8103, 0x8003, 0xa080, 0x0022, 0x0c7e, 0x2061, + 0x0100, 0x609a, 0x60a4, 0xa085, 0x0020, 0x60ae, 0x0c7f, 0x007c, + 0x8103, 0x8003, 0xa080, 0x0020, 0x0c7e, 0x2061, 0x0100, 0x609a, + 0x60a4, 0x62ae, 0x2010, 0x60a4, 0x63ae, 0x2018, 0x0c7f, 0x007c, + 0x0c7e, 0x0e7e, 0x6818, 0xa005, 0x0040, 0x1d71, 0x2061, 0x4180, + 0x1078, 0x1d77, 0x0040, 0x1d5b, 0x20a9, 0x0000, 0x2061, 0x4080, + 0x0c7e, 0x1078, 0x1d77, 0x0040, 0x1d45, 0x0c7f, 0x8c60, 0x0070, + 0x1d43, 0x0078, 0x1d38, 0x0078, 0x1d71, 0x007f, 0xa082, 0x4080, + 0x2071, 0x3740, 0x70ba, 0x6020, 0xa085, 0x0800, 0x6022, 0x2091, + 0x8001, 0x71b6, 0x2001, 0x0004, 0x70a2, 0x70c7, 0x0005, 0x1078, + 0x1c46, 0x0078, 0x1d6d, 0x2071, 0x3740, 0x6020, 0xa085, 0x0800, + 0x6022, 0x2091, 0x8001, 0x71b6, 0x2c00, 0x70be, 0x2001, 0x0006, + 0x70a2, 0x70c7, 0x0005, 0x1078, 0x1c46, 0x2001, 0x0000, 0x0078, + 0x1d73, 0x2001, 0x0001, 0xa005, 0x0e7f, 0x0c7f, 0x007c, 0x2091, + 0x8000, 0x2c04, 0xa005, 0x0040, 0x1d90, 0x2060, 0x6010, 0xa306, + 0x00c0, 0x1d8d, 0x600c, 0xa206, 0x00c0, 0x1d8d, 0x6014, 0xa106, + 0x00c0, 0x1d8d, 0xa006, 0x0078, 0x1d94, 0x6000, 0x0078, 0x1d7a, + 0xa085, 0x0001, 0x2091, 0x8001, 0x007c, 0x2011, 0x3741, 0x220c, + 0xa18c, 0x000f, 0x2011, 0x013b, 0x2204, 0xa084, 0x0100, 0x0040, + 0x1dab, 0x2021, 0xff00, 0x2122, 0x810b, 0x810b, 0x810b, 0x810b, + 0xa18d, 0x0f00, 0x2104, 0x007c, 0x0e7e, 0x68e4, 0xa08c, 0x0020, + 0x0040, 0x1dff, 0xa084, 0x0006, 0x00c0, 0x1dff, 0x6014, 0x8007, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa0f0, 0x3800, 0x7004, + 0xa084, 0x000a, 0x00c0, 0x1dff, 0x7108, 0xa194, 0xff00, 0x0040, + 0x1dff, 0xa18c, 0x00ff, 0x2001, 0x000c, 0xa106, 0x0040, 0x1de6, + 0x2001, 0x0012, 0xa106, 0x0040, 0x1dea, 0x2001, 0x0014, 0xa106, + 0x0040, 0x1dee, 0x2001, 0x0019, 0xa106, 0x0040, 0x1df2, 0x2001, + 0x0032, 0xa106, 0x0040, 0x1df6, 0x0078, 0x1dfa, 0x2009, 0x0012, + 0x0078, 0x1dfc, 0x2009, 0x0014, 0x0078, 0x1dfc, 0x2009, 0x0019, + 0x0078, 0x1dfc, 0x2009, 0x0020, 0x0078, 0x1dfc, 0x2009, 0x003f, + 0x0078, 0x1dfc, 0x2011, 0x0000, 0x2100, 0xa205, 0x700a, 0x0e7f, + 0x007c, 0x2071, 0x0010, 0x70ca, 0x007f, 0x70c6, 0x70c3, 0x8002, + 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0078, 0x1e0e, + 0x107e, 0x007e, 0x127e, 0x2091, 0x2300, 0x7f3c, 0x7e58, 0x7c30, + 0x7d38, 0x2009, 0x3774, 0x78a0, 0x200a, 0x8108, 0x250a, 0x8108, + 0x240a, 0x8108, 0x260a, 0x8108, 0x270a, 0xa594, 0x003f, 0xa484, + 0x4000, 0x0040, 0x1e31, 0xa784, 0x007c, 0x00c0, 0x2fcb, 0x1078, + 0x1e01, 0xa49c, 0x000f, 0xa382, 0x0004, 0x0050, 0x1e39, 0x1078, + 0x1e01, 0x8507, 0xa084, 0x000f, 0x0079, 0x1e3e, 0x2272, 0x2311, + 0x232e, 0x2572, 0x27b6, 0x27f9, 0x2842, 0x28a0, 0x2908, 0x2995, + 0x1e66, 0x1e4e, 0x20db, 0x21a0, 0x2795, 0x1e4e, 0x1078, 0x1e01, + 0x0018, 0x1e15, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, + 0x7003, 0x0000, 0x703f, 0x0000, 0x7030, 0xa005, 0x0040, 0x1e62, + 0x7033, 0x0000, 0x1078, 0x2fa6, 0x0018, 0x1e15, 0x2009, 0x370f, + 0x200b, 0x0000, 0x705c, 0xa005, 0x00c0, 0x1f2e, 0x70a0, 0xa084, + 0x0007, 0x0079, 0x1e73, 0x1f51, 0x1e7b, 0x1e89, 0x1ea4, 0x1ec4, + 0x1f0c, 0x1ee8, 0x1e7b, 0x7808, 0xa084, 0xfffd, 0x780a, 0x2009, + 0x0047, 0x1078, 0x269a, 0x00c0, 0x1e87, 0x7003, 0x0004, 0x0078, + 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ea2, 0x70b4, 0x8007, 0x7882, + 0x789b, 0x0010, 0x78ab, 0x000c, 0x789b, 0x0060, 0x78ab, 0x0001, + 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078, 0x2698, 0x00c0, 0x1ea2, + 0x7003, 0x0004, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ec2, + 0x71b4, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, + 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, 0x0060, 0x78ab, 0x0002, + 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078, 0x2698, 0x00c0, 0x1ec2, + 0x7003, 0x0004, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1ee6, + 0x71b4, 0x8107, 0x7882, 0x789b, 0x0010, 0xa18c, 0x0007, 0xa18d, + 0x00c0, 0x79aa, 0x78ab, 0x0020, 0x71b8, 0x79aa, 0x78ab, 0x000d, + 0x789b, 0x0060, 0x78ab, 0x0004, 0x785b, 0x0004, 0x2009, 0x00f8, + 0x1078, 0x2698, 0x00c0, 0x1ee6, 0x7003, 0x0004, 0x0078, 0x1e50, + 0x1078, 0x2f8d, 0x00c0, 0x1f0a, 0x71b4, 0x8107, 0x789b, 0x0010, + 0xa18c, 0x0007, 0xa18d, 0x00c0, 0x79aa, 0x78ab, 0x0006, 0x789b, + 0x0060, 0x78ab, 0x0002, 0x785b, 0x0004, 0x2009, 0x00f8, 0x1078, + 0x2698, 0x00c0, 0x1f0a, 0x70bc, 0x70bf, 0x0000, 0x2068, 0x703e, + 0x7003, 0x0002, 0x0078, 0x1e50, 0x1078, 0x2f8d, 0x00c0, 0x1e50, + 0x70bc, 0x2068, 0x1078, 0x302f, 0x789b, 0x0010, 0x6814, 0xa084, + 0x0007, 0xa085, 0x0080, 0x007e, 0x007f, 0x78aa, 0x6e1c, 0x067e, + 0x067f, 0x2041, 0x0001, 0x70c0, 0xa084, 0x0400, 0x2001, 0x0004, + 0x0040, 0x1f2c, 0x2001, 0x0006, 0x0078, 0x202d, 0x1078, 0x2f8d, + 0x00c0, 0x1e50, 0x789b, 0x0010, 0x705c, 0x2068, 0x1078, 0x302f, + 0x6f14, 0x1078, 0x2ed5, 0x6008, 0xa085, 0x0010, 0x600a, 0xad80, + 0x0009, 0x2003, 0x0005, 0x6814, 0xa084, 0x0007, 0xa085, 0x0080, + 0x78aa, 0x2031, 0x0020, 0x2041, 0x0001, 0x2001, 0x0003, 0x0078, + 0x202d, 0x0018, 0x1e15, 0x7440, 0xa485, 0x0000, 0x0040, 0x1f6b, + 0xa080, 0x3780, 0x2030, 0x7144, 0x8108, 0xa12a, 0x0048, 0x1f62, + 0x2009, 0x3780, 0x2164, 0x6504, 0x85ff, 0x00c0, 0x1f78, 0x8421, + 0x00c0, 0x1f5c, 0x7146, 0x7003, 0x0000, 0x703f, 0x0000, 0x0078, + 0x1e50, 0x7640, 0xa6b0, 0x3780, 0x7144, 0x2600, 0x0078, 0x1f67, + 0x7146, 0x2568, 0x2558, 0x753e, 0x2c50, 0x6708, 0x7736, 0xa784, + 0x013f, 0x0040, 0x1fa5, 0xa784, 0x0021, 0x00c0, 0x1f75, 0xa784, + 0x0002, 0x0040, 0x1f92, 0xa784, 0x0004, 0x0040, 0x1f75, 0xa7bc, + 0xfffb, 0x670a, 0xa784, 0x0008, 0x00c0, 0x1f75, 0xa784, 0x0010, + 0x00c0, 0x1f75, 0xa784, 0x0100, 0x0040, 0x1fa5, 0x6018, 0xa005, + 0x00c0, 0x1f75, 0xa7bc, 0xfeff, 0x670a, 0x6823, 0x0000, 0x6e1c, + 0xa684, 0x000e, 0x6118, 0x0040, 0x1fb5, 0x601c, 0xa102, 0x0048, + 0x1fb8, 0x0040, 0x1fb8, 0x0078, 0x1f71, 0x81ff, 0x00c0, 0x1f71, + 0xa784, 0x0080, 0x00c0, 0x1fbe, 0x700c, 0x6022, 0x1078, 0x302f, + 0x0018, 0x1e15, 0x789b, 0x0010, 0xa046, 0x1078, 0x2f8d, 0x00c0, + 0x1e50, 0x6b14, 0xa39c, 0x0007, 0xa39d, 0x00c0, 0x704c, 0xa084, + 0x8000, 0x0040, 0x1fd7, 0xa684, 0x0001, 0x0040, 0x1fd9, 0xa39c, + 0xffbf, 0xa684, 0x0010, 0x0040, 0x1fdf, 0xa39d, 0x0020, 0x7baa, + 0x8840, 0xa684, 0x000e, 0x00c0, 0x1fea, 0xa7bd, 0x0010, 0x670a, + 0x0078, 0x202b, 0x714c, 0xa18c, 0x0800, 0x0040, 0x2b77, 0x2011, + 0x0021, 0x8004, 0x8004, 0x0048, 0x2001, 0x2011, 0x0022, 0x8004, + 0x0048, 0x2001, 0x2011, 0x0020, 0x8004, 0x0048, 0x2001, 0x0040, + 0x202b, 0x7aaa, 0x8840, 0x1078, 0x2fa6, 0x6a14, 0x610c, 0x8108, + 0xa18c, 0x00ff, 0xa1e0, 0x4080, 0x2c64, 0x8cff, 0x0040, 0x2022, + 0x6014, 0xa206, 0x00c0, 0x200c, 0x60b8, 0x8001, 0x60ba, 0x00c0, + 0x2007, 0x0c7e, 0x2a60, 0x6008, 0xa085, 0x0100, 0x600a, 0x0c7f, + 0x0078, 0x1f51, 0x1078, 0x2f8d, 0x00c0, 0x1e50, 0x2a60, 0x610e, + 0x79aa, 0x8840, 0x712e, 0x2001, 0x0001, 0x007e, 0x7150, 0xa184, + 0x0018, 0x0040, 0x2048, 0xa184, 0x0010, 0x0040, 0x203b, 0x1078, + 0x2d2d, 0x00c0, 0x2055, 0xa184, 0x0008, 0x0040, 0x2048, 0x69a0, + 0xa184, 0x0600, 0x00c0, 0x2048, 0x1078, 0x2c2b, 0x0078, 0x2055, + 0x69a0, 0xa184, 0x0200, 0x0040, 0x2051, 0x1078, 0x2c79, 0x0078, + 0x2055, 0xa184, 0x0400, 0x00c0, 0x2044, 0x007f, 0x7002, 0xa68c, + 0x0060, 0xa684, 0x0060, 0x0040, 0x2063, 0xa086, 0x0060, 0x00c0, + 0x2063, 0xa18d, 0x4000, 0x88ff, 0x0040, 0x2068, 0xa18d, 0x0004, + 0x795a, 0x69b6, 0x789b, 0x0060, 0x2800, 0x78aa, 0x789b, 0x0061, + 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, 0x8008, 0x810c, 0x0040, + 0x2b82, 0xa18c, 0x00f8, 0x00c0, 0x2b82, 0x157e, 0x137e, 0x147e, + 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, 0x80ac, 0xad80, 0x000b, + 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, 0x6814, 0x8007, 0x7882, + 0x6d94, 0x7dd6, 0x7dde, 0x6e98, 0x7ed2, 0x7eda, 0x7830, 0xa084, + 0x00c0, 0x00c0, 0x209d, 0x0098, 0x20a5, 0x6008, 0xa084, 0xffef, + 0x600a, 0x1078, 0x2fa6, 0x0078, 0x1e58, 0x7200, 0xa284, 0x0007, + 0xa086, 0x0001, 0x00c0, 0x20b2, 0x781b, 0x004a, 0x1078, 0x2fa6, + 0x0078, 0x20c3, 0x6ab4, 0xa295, 0x2000, 0x7a5a, 0x781b, 0x004a, + 0x1078, 0x2fa6, 0x7200, 0x2500, 0xa605, 0x0040, 0x20c3, 0xa284, + 0x0007, 0x1079, 0x20d1, 0xa284, 0x0007, 0xa086, 0x0001, 0x00c0, + 0x1e50, 0x6018, 0x8000, 0x601a, 0xad80, 0x0009, 0x7032, 0x0078, + 0x1e50, 0x20d9, 0x33b6, 0x33b6, 0x33a5, 0x33b6, 0x20d9, 0x33a5, + 0x20d9, 0x1078, 0x1e01, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0f7e, + 0x2079, 0x3700, 0x78b0, 0x0f7f, 0xa084, 0x0001, 0x0040, 0x2101, + 0x70a0, 0xa086, 0x0001, 0x00c0, 0x20f0, 0x70a2, 0x0078, 0x2184, + 0x70a0, 0xa086, 0x0005, 0x00c0, 0x20ff, 0x70bc, 0x2068, 0x681b, + 0x0004, 0x6817, 0x0000, 0x6820, 0xa085, 0x0008, 0x6822, 0x70a3, + 0x0000, 0x157e, 0x2011, 0x0004, 0x71a0, 0xa186, 0x0001, 0x0040, + 0x211f, 0xa186, 0x0007, 0x00c0, 0x2113, 0x2009, 0x3731, 0x200b, + 0x0005, 0x0078, 0x211f, 0x2009, 0x3713, 0x2104, 0x2009, 0x3712, + 0x200a, 0x2009, 0x3731, 0x200b, 0x0001, 0x0078, 0x2121, 0x70a3, + 0x0000, 0x1078, 0x312e, 0x20a9, 0x0010, 0x2039, 0x0000, 0x1078, + 0x2de4, 0xa7b8, 0x0100, 0x0070, 0x212f, 0x0078, 0x2127, 0x7000, + 0x0079, 0x2132, 0x2160, 0x2149, 0x2149, 0x213c, 0x2160, 0x2160, + 0x2160, 0x213a, 0x1078, 0x1e01, 0x2021, 0x3757, 0x2404, 0xa005, + 0x0040, 0x2160, 0xad06, 0x00c0, 0x2149, 0x6800, 0x2022, 0x0078, + 0x2159, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2155, 0x6f14, 0x1078, + 0x2ed5, 0x1078, 0x2b44, 0x0078, 0x2159, 0x7054, 0x2060, 0x6800, + 0x6002, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, 0x1990, + 0x2021, 0x4180, 0x1078, 0x218a, 0x2021, 0x3757, 0x1078, 0x218a, + 0x20a9, 0x0000, 0x2021, 0x4080, 0x1078, 0x218a, 0x8420, 0x0070, + 0x2173, 0x0078, 0x216c, 0x20a9, 0x0080, 0x2061, 0x3880, 0x6018, + 0x6110, 0xa102, 0x6012, 0x601b, 0x0000, 0xace0, 0x0010, 0x0070, + 0x2183, 0x0078, 0x2177, 0x157f, 0x7003, 0x0000, 0x703f, 0x0000, + 0x0078, 0x1e50, 0x047e, 0x2404, 0xa005, 0x0040, 0x219c, 0x2068, + 0x6800, 0x007e, 0x6a1a, 0x6820, 0xa085, 0x0008, 0x6822, 0x1078, + 0x1990, 0x007f, 0x0078, 0x218c, 0x047f, 0x2023, 0x0000, 0x007c, + 0xa282, 0x0003, 0x0050, 0x21a6, 0x1078, 0x1e01, 0x2300, 0x0079, + 0x21a9, 0x21ac, 0x2213, 0x2230, 0xa282, 0x0002, 0x0040, 0x21b2, + 0x1078, 0x1e01, 0x70a0, 0x70a3, 0x0000, 0x0079, 0x21b7, 0x21bf, + 0x21bf, 0x21c1, 0x21f3, 0x21f1, 0x21bf, 0x21f3, 0x21bf, 0x1078, + 0x1e01, 0x77b4, 0x1078, 0x2de4, 0x77b4, 0xa7bc, 0x0f00, 0x1078, + 0x2ed5, 0x6018, 0xa005, 0x0040, 0x21ea, 0x2021, 0x4180, 0x1078, + 0x224b, 0x0040, 0x21ea, 0x157e, 0x20a9, 0x0000, 0x2021, 0x4080, + 0x047e, 0x1078, 0x224b, 0x047f, 0x0040, 0x21e3, 0x8420, 0x0070, + 0x21e3, 0x0078, 0x21d8, 0x157f, 0x2021, 0x3757, 0x1078, 0x224b, + 0x0040, 0x21ea, 0x8738, 0xa784, 0x0007, 0x00c0, 0x21c7, 0x0078, + 0x1e58, 0x0078, 0x1e58, 0x77b4, 0x1078, 0x2ed5, 0x6018, 0xa005, + 0x0040, 0x2211, 0x2021, 0x4180, 0x1078, 0x224b, 0x0040, 0x2211, + 0x157e, 0x20a9, 0x0000, 0x2021, 0x4080, 0x047e, 0x1078, 0x224b, + 0x047f, 0x0040, 0x2210, 0x8420, 0x0070, 0x2210, 0x0078, 0x2205, + 0x157f, 0x0078, 0x1e58, 0x2200, 0x0079, 0x2216, 0x2219, 0x221b, + 0x221b, 0x1078, 0x1e01, 0x2009, 0x0012, 0x70a0, 0xa086, 0x0002, + 0x0040, 0x2224, 0x2009, 0x000e, 0x6818, 0xa084, 0x8000, 0x0040, + 0x222a, 0x691a, 0x70a3, 0x0000, 0x70a7, 0x0001, 0x0078, 0x2f58, + 0x2200, 0x0079, 0x2233, 0x2238, 0x221b, 0x2236, 0x1078, 0x1e01, + 0x1078, 0x26a7, 0x7000, 0xa086, 0x0001, 0x00c0, 0x2b1a, 0x1078, + 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b0d, 0x0040, + 0x2b1a, 0x0078, 0x1f51, 0x2404, 0xa005, 0x0040, 0x226e, 0x2068, + 0x2d04, 0x007e, 0x6814, 0xa706, 0x0040, 0x225a, 0x2d20, 0x007f, + 0x0078, 0x224c, 0x007f, 0x2022, 0x681b, 0x0004, 0x6820, 0xa085, + 0x0010, 0x6822, 0x1078, 0x1990, 0x6010, 0x8001, 0x6012, 0x6008, + 0xa084, 0xffef, 0x600a, 0x1078, 0x2b5a, 0x007c, 0xa085, 0x0001, + 0x0078, 0x226d, 0x2300, 0x0079, 0x2275, 0x227a, 0x2278, 0x22c6, + 0x1078, 0x1e01, 0x78e4, 0xa005, 0x00d0, 0x228e, 0x0018, 0x228e, + 0xa084, 0x0007, 0x0079, 0x2284, 0x229f, 0x22ac, 0x2292, 0x228c, + 0x2f80, 0x2f80, 0x228c, 0x22b9, 0x1078, 0x1e01, 0x2001, 0x0003, + 0x0078, 0x2586, 0x6818, 0xa084, 0x8000, 0x0040, 0x2299, 0x681b, + 0x001d, 0x1078, 0x2dc7, 0x781b, 0x0053, 0x0078, 0x1e50, 0x6818, + 0xa084, 0x8000, 0x0040, 0x22a6, 0x681b, 0x001d, 0x1078, 0x2dc7, + 0x781b, 0x00db, 0x0078, 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040, + 0x22b3, 0x681b, 0x001d, 0x1078, 0x2dc7, 0x781b, 0x00e2, 0x0078, + 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040, 0x22c0, 0x681b, 0x001d, + 0x1078, 0x2dc7, 0x781b, 0x009c, 0x0078, 0x1e50, 0xa584, 0x000f, + 0x00c0, 0x22e5, 0x1078, 0x26a7, 0x7000, 0x0079, 0x22cf, 0x22d7, + 0x22d9, 0x22d7, 0x2b1a, 0x2b1a, 0x2b1a, 0x2b1a, 0x22d7, 0x1078, + 0x1e01, 0x1078, 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, + 0x2b0d, 0x0040, 0x2b1a, 0x0078, 0x1f51, 0x79e4, 0xa005, 0x00d0, + 0x228e, 0x0018, 0x228e, 0xa184, 0x0007, 0x0079, 0x22ef, 0x22ff, + 0x2305, 0x22f9, 0x22f7, 0x2f80, 0x2f80, 0x22f7, 0x2f78, 0x1078, + 0x1e01, 0x1078, 0x2dcf, 0x781b, 0x0053, 0x0078, 0x1e50, 0x1078, + 0x2dcf, 0x781b, 0x00db, 0x0078, 0x1e50, 0x1078, 0x2dcf, 0x781b, + 0x00e2, 0x0078, 0x1e50, 0x1078, 0x2dcf, 0x781b, 0x009c, 0x0078, + 0x1e50, 0x2300, 0x0079, 0x2314, 0x2319, 0x2317, 0x231b, 0x1078, + 0x1e01, 0x0078, 0x28a0, 0x681b, 0x0008, 0x78a3, 0x0000, 0x79e4, + 0xa184, 0x0007, 0x0079, 0x2324, 0x232c, 0x2305, 0x2292, 0x2f58, + 0x2f80, 0x2f80, 0x232c, 0x2f78, 0x1078, 0x1e01, 0xa282, 0x0005, + 0x0050, 0x2334, 0x1078, 0x1e01, 0x2300, 0x0079, 0x2337, 0x233a, + 0x2537, 0x2543, 0x2200, 0x0079, 0x233d, 0x2357, 0x2344, 0x2357, + 0x2342, 0x251c, 0x1078, 0x1e01, 0x789b, 0x0018, 0x78a8, 0xa084, + 0x00ff, 0xa082, 0x0020, 0x0048, 0x2db3, 0xa08a, 0x0004, 0x00c8, + 0x2db3, 0x0079, 0x2353, 0x2db3, 0x2db3, 0x2db3, 0x2d6d, 0x789b, + 0x0018, 0x79a8, 0xa184, 0x0080, 0x0040, 0x236c, 0xa184, 0x0018, + 0x0040, 0x2368, 0x0078, 0x2db3, 0x7000, 0xa005, 0x00c0, 0x2362, + 0x2011, 0x0004, 0x0078, 0x29a3, 0xa184, 0x00ff, 0xa08a, 0x0010, + 0x00c8, 0x2db3, 0x0079, 0x2374, 0x2386, 0x2384, 0x239e, 0x23a2, + 0x2433, 0x2db3, 0x2db3, 0x2435, 0x2db3, 0x2db3, 0x2518, 0x2518, + 0x2db3, 0x2db3, 0x2db3, 0x251a, 0x1078, 0x1e01, 0xa684, 0x1000, + 0x0040, 0x2393, 0x2001, 0x0300, 0x8000, 0x8000, 0x783a, 0x781b, + 0x0099, 0x0078, 0x1e50, 0x6818, 0xa084, 0x8000, 0x0040, 0x239c, + 0x681b, 0x001d, 0x0078, 0x238a, 0x0078, 0x2f58, 0x681b, 0x001d, + 0x0078, 0x2dbf, 0x6920, 0xa184, 0x8000, 0x00c0, 0x23ae, 0x68af, + 0x0000, 0x68b3, 0x0000, 0xa18d, 0x8000, 0x6922, 0xa684, 0x1800, + 0x00c0, 0x23c6, 0x6820, 0xa084, 0x0001, 0x00c0, 0x23cc, 0x6818, + 0xa086, 0x0008, 0x00c0, 0x23be, 0x681b, 0x0000, 0xa684, 0x0400, + 0x0040, 0x242f, 0x781b, 0x0056, 0x0078, 0x1e50, 0xa684, 0x1000, + 0x0040, 0x23cc, 0x0078, 0x1e50, 0xa684, 0x0060, 0x0040, 0x242b, + 0xa684, 0x0800, 0x0040, 0x242b, 0xa684, 0x8000, 0x00c0, 0x23dc, + 0x69b0, 0x6aac, 0x0078, 0x23f6, 0xa6b4, 0x7fff, 0x7e5a, 0x6eb6, + 0x789b, 0x0074, 0x7aac, 0x79ac, 0x78ac, 0x801b, 0x00c8, 0x23e9, + 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x6b98, 0x2100, + 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, 0x68ae, 0xa684, 0x4000, + 0x0040, 0x23fe, 0xa6b4, 0xbfff, 0x7e5a, 0x6eb6, 0xa006, 0x1078, + 0x3474, 0x6ab0, 0x69ac, 0x6c98, 0x6b94, 0x2200, 0xa105, 0x0040, + 0x240d, 0x2200, 0xa422, 0x2100, 0xa31b, 0x6caa, 0x7cd2, 0x6ba6, + 0x7bd6, 0x2300, 0xa405, 0x00c0, 0x241d, 0xa6b5, 0x4000, 0x7e5a, + 0x6eb6, 0x781b, 0x0065, 0x0078, 0x1e50, 0x781b, 0x0065, 0x2200, + 0xa115, 0x00c0, 0x2427, 0x1078, 0x33b6, 0x0078, 0x1e50, 0x1078, + 0x33eb, 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x781b, + 0x0056, 0x0078, 0x1e50, 0x1078, 0x1e01, 0x0078, 0x248a, 0x6920, + 0xa184, 0x0100, 0x0040, 0x2449, 0xa18c, 0xfeff, 0x6922, 0x0c7e, + 0x7048, 0x2060, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x0078, + 0x2479, 0xa184, 0x0200, 0x0040, 0x2479, 0xa18c, 0xfdff, 0x6922, + 0x0c7e, 0x7048, 0x2060, 0x6004, 0xa084, 0xffef, 0x6006, 0x2008, + 0x2c48, 0x0c7f, 0xa184, 0x0008, 0x0040, 0x2479, 0x1078, 0x2ed1, + 0x1078, 0x2c2b, 0x88ff, 0x0040, 0x2479, 0x789b, 0x0060, 0x2800, + 0x78aa, 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, + 0x2475, 0x781b, 0x0053, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, + 0x1e50, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2482, 0x781b, 0x0056, + 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x0078, 0x2db9, + 0x0078, 0x2db9, 0x2019, 0x0000, 0x7990, 0xa18c, 0x0007, 0x0040, + 0x2488, 0x789b, 0x0010, 0x78a8, 0xa094, 0x00ff, 0xa286, 0x0001, + 0x00c0, 0x24ad, 0x2300, 0x7ca8, 0xa400, 0x2018, 0xa102, 0x0040, + 0x24a5, 0x0048, 0x24a5, 0x0078, 0x24a7, 0x0078, 0x2437, 0x24a8, + 0x7aa8, 0x00f0, 0x24a7, 0x0078, 0x2493, 0xa284, 0x00f0, 0xa086, + 0x0020, 0x00c0, 0x2509, 0x8318, 0x8318, 0x2300, 0xa102, 0x0040, + 0x24bd, 0x0048, 0x24bd, 0x0078, 0x2506, 0xa286, 0x0023, 0x0040, + 0x2488, 0x681c, 0xa084, 0xfff1, 0x681e, 0x7e58, 0xa684, 0xfff1, + 0xa085, 0x0010, 0x2030, 0x7e5a, 0x6008, 0xa085, 0x0010, 0x600a, + 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, 0xa184, + 0x0010, 0x0040, 0x24e1, 0x1078, 0x2ed1, 0x1078, 0x2d2d, 0x0078, + 0x24f0, 0x0c7e, 0x7048, 0x2060, 0x6004, 0x2008, 0x2c48, 0x0c7f, + 0xa184, 0x0008, 0x0040, 0x2479, 0x1078, 0x2ed1, 0x1078, 0x2c2b, + 0x88ff, 0x0040, 0x2479, 0x789b, 0x0060, 0x2800, 0x78aa, 0xa6b5, + 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2502, 0x781b, 0x0053, + 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7aa8, 0x0078, + 0x2493, 0x8318, 0x2300, 0xa102, 0x0040, 0x2512, 0x0048, 0x2512, + 0x0078, 0x2493, 0xa284, 0x0080, 0x00c0, 0x2dbf, 0x0078, 0x2db9, + 0x0078, 0x2dbf, 0x0078, 0x2db3, 0x789b, 0x0018, 0x78a8, 0xa084, + 0x00ff, 0xa08e, 0x0001, 0x0040, 0x2527, 0x1078, 0x1e01, 0x7aa8, + 0xa294, 0x00ff, 0x78a8, 0xa084, 0x00ff, 0xa08a, 0x0004, 0x00c8, + 0x2db3, 0x0079, 0x2533, 0x2db3, 0x2b9b, 0x2db3, 0x2cc8, 0xa282, + 0x0000, 0x00c0, 0x253d, 0x1078, 0x1e01, 0x1078, 0x2dc7, 0x781b, + 0x0067, 0x0078, 0x1e50, 0xa282, 0x0003, 0x00c0, 0x2549, 0x1078, + 0x1e01, 0xa484, 0x8000, 0x00c0, 0x256c, 0x70a0, 0xa005, 0x0040, + 0x2553, 0x1078, 0x1e01, 0x6f14, 0x77b6, 0xa7bc, 0x0f00, 0x1078, + 0x2ed5, 0x6008, 0xa085, 0x0021, 0x600a, 0x8738, 0xa784, 0x0007, + 0x00c0, 0x2557, 0x1078, 0x2dcb, 0x70a3, 0x0002, 0x2009, 0x3731, + 0x200b, 0x0009, 0x0078, 0x256e, 0x1078, 0x2dd7, 0x781b, 0x0067, + 0x0078, 0x1e50, 0xa282, 0x0004, 0x0050, 0x2578, 0x1078, 0x1e01, + 0x2300, 0x0079, 0x257b, 0x257e, 0x265a, 0x2682, 0xa286, 0x0003, + 0x0040, 0x2584, 0x1078, 0x1e01, 0x2001, 0x0000, 0x703a, 0x7000, + 0xa084, 0x0007, 0x0079, 0x258c, 0x2594, 0x2596, 0x2596, 0x274a, + 0x277b, 0x1e58, 0x277b, 0x2594, 0x1078, 0x1e01, 0xa684, 0x1000, + 0x00c0, 0x259e, 0x1078, 0x312e, 0x0040, 0x2634, 0x7868, 0xa08c, + 0x00ff, 0x0040, 0x25e6, 0xa186, 0x0008, 0x00c0, 0x25b5, 0x1078, + 0x2b5a, 0x6008, 0xa084, 0xffef, 0x600a, 0x1078, 0x2b0d, 0x0040, + 0x25e6, 0x1078, 0x312e, 0x0078, 0x25cd, 0xa186, 0x0028, 0x00c0, + 0x25e6, 0x1078, 0x312e, 0x6008, 0xa084, 0xffef, 0x600a, 0x6018, + 0xa005, 0x0040, 0x25cd, 0x8001, 0x601a, 0xa005, 0x0040, 0x25cd, + 0x8001, 0xa005, 0x0040, 0x25cd, 0x601e, 0x6820, 0xa084, 0x0001, + 0x0040, 0x1e58, 0x6820, 0xa084, 0xfffe, 0x6822, 0x7054, 0x0c7e, + 0x2060, 0x6800, 0x6002, 0x0c7f, 0x6004, 0x6802, 0xa005, 0x2d00, + 0x00c0, 0x25e3, 0x6002, 0x6006, 0x0078, 0x1e58, 0x017e, 0x1078, + 0x26a7, 0x017f, 0xa684, 0xdf00, 0x681e, 0x682b, 0x0000, 0x6f14, + 0x81ff, 0x0040, 0x2634, 0xa186, 0x0002, 0x00c0, 0x262c, 0xa684, + 0x0800, 0x00c0, 0x2603, 0xa684, 0x0060, 0x0040, 0x2603, 0x78d8, + 0x7adc, 0x682e, 0x6a32, 0x6820, 0xa084, 0x0800, 0x00c0, 0x2634, + 0x8717, 0xa294, 0x000f, 0x8213, 0x8213, 0x8213, 0xa290, 0x3800, + 0xa290, 0x0000, 0x221c, 0x8210, 0x2204, 0xa085, 0x0018, 0x2012, + 0x8211, 0xa384, 0x0400, 0x0040, 0x2626, 0x68a0, 0xa084, 0x0100, + 0x00c0, 0x2626, 0x1078, 0x2709, 0x0078, 0x1e58, 0x6008, 0xa085, + 0x0002, 0x600a, 0x0078, 0x2634, 0xa186, 0x0018, 0x0040, 0x2634, + 0xa186, 0x0014, 0x0040, 0x1e58, 0x6916, 0x6818, 0xa084, 0x8000, + 0x0040, 0x263c, 0x7038, 0x681a, 0xa68c, 0xdf00, 0x691e, 0x1078, + 0x2b4b, 0x1078, 0x2b5a, 0x00c0, 0x2649, 0x6008, 0xa084, 0xffef, + 0x600a, 0x6820, 0xa084, 0x0001, 0x00c0, 0x2652, 0x1078, 0x2b44, + 0x0078, 0x2656, 0x7054, 0x2060, 0x6800, 0x6002, 0x1078, 0x1990, + 0x0078, 0x1e58, 0xa282, 0x0004, 0x0048, 0x2660, 0x1078, 0x1e01, + 0x2200, 0x0079, 0x2663, 0x265e, 0x2667, 0x266d, 0x2667, 0x1078, + 0x2dc7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7890, 0x8007, 0x8001, + 0xa084, 0x0007, 0xa080, 0x0018, 0x789a, 0x79a8, 0xa18c, 0x00ff, + 0xa186, 0x0003, 0x0040, 0x267e, 0x0078, 0x2db3, 0x781b, 0x0068, + 0x0078, 0x1e50, 0x6820, 0xa085, 0x0004, 0x6822, 0x82ff, 0x00c0, + 0x268d, 0x1078, 0x2dc7, 0x0078, 0x2694, 0x8211, 0x0040, 0x2692, + 0x1078, 0x1e01, 0x1078, 0x2dd7, 0x781b, 0x0067, 0x0078, 0x1e50, + 0x1078, 0x2fa6, 0x7830, 0xa084, 0x00c0, 0x00c0, 0x26a4, 0x0018, + 0x26a4, 0x791a, 0xa006, 0x007c, 0xa085, 0x0001, 0x007c, 0xa684, + 0x0060, 0x00c0, 0x26b1, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, + 0x2708, 0xa684, 0x0800, 0x00c0, 0x26c1, 0x6998, 0x6a94, 0x692e, + 0x6a32, 0x7000, 0xa086, 0x0006, 0x0040, 0x26c0, 0x1078, 0x312e, + 0x007c, 0xa684, 0x0020, 0x0040, 0x26db, 0xa684, 0x4000, 0x0040, + 0x26cf, 0x682f, 0x0000, 0x6833, 0x0000, 0x0078, 0x26b9, 0x7038, + 0xa005, 0x00c0, 0x26d5, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x692e, + 0x6a32, 0x0078, 0x26b9, 0xa684, 0x4000, 0x0040, 0x26e5, 0x682f, + 0x0000, 0x6833, 0x0000, 0x0078, 0x26b9, 0x7038, 0xa005, 0x00c0, + 0x26eb, 0x703b, 0x0015, 0x79d8, 0x7adc, 0x78d0, 0x80fb, 0x00c8, + 0x26f2, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x692e, + 0x6a32, 0x2100, 0xa205, 0x00c0, 0x26ff, 0x0078, 0x26b9, 0x7000, + 0xa086, 0x0006, 0x0040, 0x2708, 0x1078, 0x3474, 0x0078, 0x26b9, + 0x007c, 0xa384, 0x0200, 0x0040, 0x2711, 0x6008, 0xa085, 0x0002, + 0x600a, 0x681b, 0x0006, 0x6a30, 0x692c, 0x6a3e, 0x6942, 0x682f, + 0x0003, 0x6833, 0x0000, 0x6837, 0x0020, 0x6897, 0x0000, 0x689b, + 0x0020, 0x7000, 0x0079, 0x2724, 0x272c, 0x272e, 0x2737, 0x272c, + 0x272c, 0x272c, 0x272c, 0x272c, 0x1078, 0x1e01, 0x6820, 0xa084, + 0x0001, 0x00c0, 0x2737, 0x1078, 0x2b44, 0x0078, 0x273d, 0x7054, + 0x2c50, 0x2060, 0x6800, 0x6002, 0x2a60, 0x2021, 0x3757, 0x2404, + 0xa005, 0x0040, 0x2746, 0x2020, 0x0078, 0x273f, 0x2d22, 0x206b, + 0x0000, 0x007c, 0x1078, 0x2b4b, 0x1078, 0x2b5a, 0x682b, 0x0000, + 0x789b, 0x000e, 0x6f14, 0x6817, 0x0002, 0x1078, 0x34ac, 0xa684, + 0x0800, 0x0040, 0x275f, 0x691c, 0xa18d, 0x2000, 0x691e, 0x6818, + 0xa084, 0x8000, 0x0040, 0x276f, 0x7868, 0xa08c, 0x00ff, 0x0040, + 0x276d, 0x681b, 0x001e, 0x0078, 0x276f, 0x681b, 0x0000, 0x2021, + 0x3757, 0x6800, 0x2022, 0x6a3c, 0x6940, 0x6a32, 0x692e, 0x1078, + 0x1990, 0x0078, 0x1e58, 0x1078, 0x26a7, 0x682b, 0x0000, 0x789b, + 0x000e, 0x6f14, 0x1078, 0x2fab, 0xa08c, 0x00ff, 0x6916, 0x6818, + 0xa084, 0x8000, 0x0040, 0x278e, 0x7038, 0x681a, 0xa68c, 0xdf00, + 0x691e, 0x70a3, 0x0000, 0x0078, 0x1e58, 0xa006, 0x1078, 0x312e, + 0x6817, 0x0000, 0x681b, 0x0001, 0xa68c, 0xdf00, 0x691e, 0x682b, + 0x0000, 0x7000, 0x0079, 0x27a4, 0x27ac, 0x27ae, 0x27ae, 0x27b0, + 0x27b0, 0x27b0, 0x27b0, 0x27ac, 0x1078, 0x1e01, 0x1078, 0x2b5a, + 0x6008, 0xa084, 0xffef, 0x600a, 0x0078, 0x2b25, 0x2300, 0x0079, + 0x27b9, 0x27bc, 0x27be, 0x27f7, 0x1078, 0x1e01, 0x7000, 0x0079, + 0x27c1, 0x27c9, 0x27cb, 0x27cb, 0x27e6, 0x27cb, 0x27f3, 0x27e6, + 0x27c9, 0x1078, 0x1e01, 0xa684, 0x0060, 0xa086, 0x0060, 0x00c0, + 0x27e2, 0xa6b4, 0xffdf, 0xa6b4, 0xbfff, 0xa6b5, 0x2000, 0x7e5a, + 0x681c, 0xa084, 0xffdf, 0x681e, 0x1078, 0x312e, 0x1078, 0x33b6, + 0x0078, 0x2f58, 0xa684, 0x2000, 0x0040, 0x27d5, 0x6818, 0xa084, + 0x8000, 0x0040, 0x27f3, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, + 0x27f3, 0x681b, 0x0007, 0x781b, 0x00dc, 0x0078, 0x1e50, 0x1078, + 0x1e01, 0x2300, 0x0079, 0x27fc, 0x27ff, 0x2801, 0x2834, 0x1078, + 0x1e01, 0x7000, 0x0079, 0x2804, 0x280c, 0x280e, 0x280e, 0x2829, + 0x280e, 0x2830, 0x2829, 0x280c, 0x1078, 0x1e01, 0xa684, 0x0060, + 0xa086, 0x0060, 0x00c0, 0x2825, 0xa6b4, 0xffbf, 0xa6b4, 0xbfff, + 0xa6b5, 0x2000, 0x7e5a, 0x681c, 0xa084, 0xffbf, 0x681e, 0x1078, + 0x312e, 0x1078, 0x33b6, 0x0078, 0x2f58, 0xa684, 0x2000, 0x0040, + 0x2818, 0x6818, 0xa084, 0x8000, 0x0040, 0x2830, 0x681b, 0x0007, + 0x781b, 0x00e3, 0x0078, 0x1e50, 0x6820, 0xa085, 0x0004, 0x6822, + 0x1078, 0x2f23, 0xa6b5, 0x0800, 0x1078, 0x2dc7, 0x781b, 0x0067, + 0x0078, 0x1e50, 0x2300, 0x0079, 0x2845, 0x2848, 0x284a, 0x284c, + 0x1078, 0x1e01, 0x1078, 0x1e01, 0x782b, 0x3009, 0xa684, 0x0400, + 0x00c0, 0x2866, 0x789b, 0x0060, 0x78ab, 0x0000, 0xa684, 0xfffb, + 0x785a, 0x79e4, 0xa184, 0x0020, 0x00c0, 0x2862, 0x2001, 0x0014, + 0x0078, 0x2586, 0xa184, 0x0007, 0x0079, 0x2896, 0x7a90, 0xa294, + 0x0007, 0x789b, 0x0060, 0x79a8, 0x81ff, 0x0040, 0x2894, 0x789b, + 0x0010, 0x7ba8, 0xa384, 0x0001, 0x00c0, 0x288d, 0x7ba8, 0x7ba8, + 0xa386, 0x0001, 0x00c0, 0x2880, 0x2009, 0xfff7, 0x0078, 0x2886, + 0xa386, 0x0003, 0x00c0, 0x288d, 0x2009, 0xffef, 0x0c7e, 0x7048, + 0x2060, 0x6004, 0xa104, 0x6006, 0x0c7f, 0x789b, 0x0060, 0x78ab, + 0x0000, 0xa684, 0xfffb, 0x785a, 0x0078, 0x2f58, 0x229f, 0x22ac, + 0x2f60, 0x2f60, 0x289e, 0x289e, 0x289e, 0x2f60, 0x1078, 0x1e01, + 0x79e4, 0xa184, 0x0030, 0x00c0, 0x28b6, 0x70a0, 0xa086, 0x0002, + 0x00c0, 0x28ae, 0x2011, 0x0002, 0x0078, 0x21a0, 0x6818, 0xa085, + 0x8000, 0x681a, 0x2001, 0x0014, 0x0078, 0x2586, 0xa18c, 0x0007, + 0xa186, 0x0002, 0x00c0, 0x2f80, 0xa684, 0x0400, 0x00c0, 0x28fd, + 0x6820, 0xa084, 0x0001, 0x0040, 0x2f60, 0xa68c, 0x0060, 0xa684, + 0x0060, 0x0040, 0x28d1, 0xa086, 0x0060, 0x00c0, 0x28d1, 0xa18d, + 0x4000, 0xa18c, 0xfffb, 0x795a, 0x69b6, 0x789b, 0x0060, 0x78ab, + 0x0000, 0x789b, 0x0061, 0x6818, 0xa085, 0x8000, 0x681a, 0x78aa, + 0x8008, 0x810c, 0x0040, 0x2b82, 0xa18c, 0x00f8, 0x00c0, 0x2b82, + 0x157e, 0x137e, 0x147e, 0x20a1, 0x012b, 0x789b, 0x0000, 0x8000, + 0x80ac, 0xad80, 0x000b, 0x2098, 0x53a6, 0x147f, 0x137f, 0x157f, + 0x6814, 0x8007, 0x7882, 0x0078, 0x2f60, 0x6818, 0xa084, 0x8000, + 0x0040, 0x2904, 0x681b, 0x0008, 0x781b, 0x00d7, 0x0078, 0x1e50, + 0x2300, 0x0079, 0x290b, 0x2910, 0x2993, 0x290e, 0x1078, 0x1e01, + 0x7000, 0xa084, 0x0007, 0x0079, 0x2915, 0x291d, 0x291f, 0x293b, + 0x291d, 0x291d, 0x1e58, 0x291d, 0x291d, 0x1078, 0x1e01, 0x6920, + 0xa18d, 0x0001, 0x6922, 0x6800, 0x6006, 0xa005, 0x00c0, 0x2929, + 0x6002, 0x681c, 0xa084, 0x000e, 0x0040, 0x2935, 0x7014, 0x68ba, + 0x712c, 0xa188, 0x4080, 0x0078, 0x2937, 0x2009, 0x4180, 0x2104, + 0x6802, 0x2d0a, 0x7156, 0x6920, 0xa184, 0x8000, 0x00c0, 0x2947, + 0x68af, 0x0000, 0x68b3, 0x0000, 0xa18d, 0x8000, 0x6922, 0x6eb6, + 0xa684, 0x0060, 0x0040, 0x2991, 0xa684, 0x0800, 0x00c0, 0x2958, + 0x6894, 0x68a6, 0x6898, 0x68aa, 0x1078, 0x312e, 0x0078, 0x2991, + 0xa684, 0x0020, 0x0040, 0x2965, 0xa006, 0x1078, 0x3474, 0x79d8, + 0x7adc, 0x69aa, 0x6aa6, 0x0078, 0x296b, 0x1078, 0x2ee2, 0x69aa, + 0x6aa6, 0x1078, 0x3474, 0xa684, 0x8000, 0x0040, 0x2991, 0xa684, + 0x7fff, 0x68b6, 0x789b, 0x0074, 0x1078, 0x2fab, 0x2010, 0x1078, + 0x2fab, 0x2008, 0xa684, 0x0020, 0x00c0, 0x2989, 0x1078, 0x2fab, + 0x801b, 0x00c8, 0x2984, 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, + 0x0000, 0x6b98, 0x2100, 0xa302, 0x68b2, 0x6b94, 0x2200, 0xa303, + 0x68ae, 0x0078, 0x1e58, 0x0078, 0x2dbf, 0x7033, 0x0000, 0xa282, + 0x0006, 0x0050, 0x299d, 0x1078, 0x1e01, 0x2300, 0x0079, 0x29a0, + 0x29a3, 0x29c9, 0x29ed, 0x2200, 0x0079, 0x29a6, 0x29ac, 0x2dbf, + 0x29ae, 0x29ac, 0x2a17, 0x2a68, 0x1078, 0x1e01, 0x7003, 0x0005, + 0x2001, 0x4190, 0x2068, 0x703e, 0x157e, 0x20a9, 0x002f, 0x2003, + 0x0000, 0x8000, 0x0070, 0x29be, 0x0078, 0x29b7, 0x157f, 0x6817, + 0x0000, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x0078, + 0x2db3, 0x7000, 0xa086, 0x0001, 0x00c0, 0x29d6, 0x1078, 0x2b5a, + 0x1078, 0x312e, 0x7034, 0x600a, 0x0078, 0x29db, 0x7000, 0xa086, + 0x0003, 0x0040, 0x29d0, 0x7003, 0x0005, 0x2001, 0x4190, 0x2068, + 0x703e, 0x7032, 0x2200, 0x0079, 0x29e5, 0x2dbf, 0x29eb, 0x29eb, + 0x2a17, 0x29eb, 0x2dbf, 0x1078, 0x1e01, 0x7000, 0xa086, 0x0001, + 0x00c0, 0x29fa, 0x1078, 0x2b5a, 0x1078, 0x312e, 0x7034, 0x600a, + 0x0078, 0x29ff, 0x7000, 0xa086, 0x0003, 0x0040, 0x29f4, 0x7003, + 0x0005, 0x2001, 0x4190, 0x2068, 0x703e, 0x7032, 0x2200, 0x0079, + 0x2a09, 0x2a11, 0x2a0f, 0x2a0f, 0x2a11, 0x2a0f, 0x2a11, 0x1078, + 0x1e01, 0x1078, 0x2dd7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x7000, + 0xa086, 0x0001, 0x00c0, 0x2a24, 0x1078, 0x2b5a, 0x1078, 0x312e, + 0x7034, 0x600a, 0x0078, 0x2a29, 0x7000, 0xa086, 0x0003, 0x0040, + 0x2a1e, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, 0x0018, + 0x7ca8, 0xa484, 0x0007, 0xa215, 0x2069, 0x4180, 0x2d04, 0x2d08, + 0x7156, 0x2068, 0xa005, 0x0040, 0x2a44, 0x6814, 0xa206, 0x0040, + 0x2a5d, 0x6800, 0x0078, 0x2a37, 0x7003, 0x0005, 0x2001, 0x4190, + 0x2068, 0x703e, 0x7032, 0x157e, 0x20a9, 0x002f, 0x2003, 0x0000, + 0x8000, 0x0070, 0x2a55, 0x0078, 0x2a4e, 0x157f, 0x6a16, 0x68b7, + 0x0700, 0x6823, 0x0800, 0x6827, 0x0003, 0x6eb4, 0x7e5a, 0x6820, + 0xa084, 0x0c00, 0x0040, 0x2ac6, 0x1078, 0x2dcf, 0x0078, 0x2ac6, + 0x7000, 0xa086, 0x0001, 0x00c0, 0x2a75, 0x1078, 0x2b5a, 0x1078, + 0x312e, 0x7034, 0x600a, 0x0078, 0x2a7a, 0x7000, 0xa086, 0x0003, + 0x0040, 0x2a6f, 0x7003, 0x0002, 0x7a80, 0xa294, 0x0f00, 0x789b, + 0x0018, 0x7ca8, 0xa484, 0x0007, 0xa215, 0x79a8, 0x79a8, 0xa18c, + 0x00ff, 0xa1e8, 0x4080, 0x2d04, 0x2d08, 0x7156, 0x2068, 0xa005, + 0x0040, 0x2a99, 0x6814, 0xa206, 0x0040, 0x2ab1, 0x6800, 0x0078, + 0x2a8c, 0x7003, 0x0005, 0x2001, 0x4190, 0x2068, 0x703e, 0x157e, + 0x20a9, 0x002f, 0x2003, 0x0000, 0x8000, 0x0070, 0x2aa9, 0x0078, + 0x2aa2, 0x157f, 0x6a16, 0x68b7, 0x0700, 0x6823, 0x0800, 0x6827, + 0x0003, 0x6eb4, 0x7e5a, 0x6820, 0xa084, 0x0c00, 0x0040, 0x2ac6, + 0xa084, 0x0800, 0x0040, 0x2ac0, 0x1078, 0x2dd3, 0x0078, 0x2ac6, + 0x1078, 0x2dcf, 0x70bf, 0x0000, 0x0078, 0x2ac6, 0x027e, 0x8207, + 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3800, 0x2060, + 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0xa684, 0x0060, 0x0040, + 0x2adf, 0x68a8, 0x78d2, 0x78da, 0x68a4, 0x78d6, 0x78de, 0x077f, + 0x1078, 0x2ed5, 0x2009, 0x0068, 0xa684, 0x0008, 0x0040, 0x2aea, + 0x2009, 0x0067, 0xa6b5, 0x2000, 0x7e5a, 0x791a, 0xa684, 0x0060, + 0x0040, 0x2b00, 0xa684, 0x0800, 0x00c0, 0x2afa, 0x1078, 0x33b6, + 0x0078, 0x2b00, 0xa684, 0x4000, 0x00c0, 0x2b00, 0x1078, 0x3347, + 0x2d00, 0x703e, 0x8207, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, + 0xa080, 0x3800, 0x2048, 0x0078, 0x1e50, 0x6020, 0xa005, 0x0040, + 0x2b19, 0x8001, 0x6022, 0x6008, 0xa085, 0x0008, 0x600a, 0x7010, + 0x6026, 0x007c, 0xa006, 0x1078, 0x312e, 0x6817, 0x0000, 0x681b, + 0x0001, 0x6823, 0x0040, 0x681f, 0x0100, 0x7000, 0xa084, 0x0007, + 0x0079, 0x2b2a, 0x2b32, 0x2b34, 0x2b34, 0x2b40, 0x2b3c, 0x2b32, + 0x2b3c, 0x2b32, 0x1078, 0x1e01, 0x1078, 0x2b4b, 0x1078, 0x2b44, + 0x1078, 0x1990, 0x0078, 0x1e58, 0x70a3, 0x0000, 0x0078, 0x1e58, + 0x681b, 0x0000, 0x0078, 0x274a, 0x6800, 0xa005, 0x00c0, 0x2b49, + 0x6002, 0x6006, 0x007c, 0x6010, 0xa005, 0x0040, 0x2b54, 0x8001, + 0x00d0, 0x2b54, 0x1078, 0x1e01, 0x6012, 0x6008, 0xa084, 0xffef, + 0x600a, 0x007c, 0x6018, 0xa005, 0x0040, 0x2b60, 0x8001, 0x601a, + 0x007c, 0x1078, 0x2fa6, 0x6818, 0xa084, 0x8000, 0x0040, 0x2b6a, + 0x681b, 0x0018, 0x0078, 0x2b8f, 0x1078, 0x2fa6, 0x6818, 0xa084, + 0x8000, 0x0040, 0x2b75, 0x681b, 0x0019, 0x0078, 0x2b8f, 0x1078, + 0x2fa6, 0x6818, 0xa084, 0x8000, 0x0040, 0x2b80, 0x681b, 0x001a, + 0x0078, 0x2b8f, 0x1078, 0x2fa6, 0x681b, 0x0003, 0x0078, 0x2b8f, + 0x6818, 0xa084, 0x8000, 0x0040, 0x2b8f, 0x681b, 0x0005, 0x681f, + 0x0000, 0x6823, 0x0020, 0x1078, 0x2b4b, 0x1078, 0x2b44, 0x1078, + 0x1990, 0x0078, 0x1e58, 0xa282, 0x0003, 0x00c0, 0x2db3, 0x7da8, + 0xa5ac, 0x00ff, 0x7ea8, 0xa6b4, 0x00ff, 0x6920, 0xa18d, 0x0080, + 0x6922, 0xa184, 0x0100, 0x0040, 0x2bde, 0xa18c, 0xfeff, 0x6922, + 0xa6b4, 0x00ff, 0x0040, 0x2bc8, 0xa682, 0x000c, 0x0048, 0x2bbc, + 0x0040, 0x2bbc, 0x2031, 0x000c, 0x852b, 0x852b, 0x1078, 0x2e62, + 0x0040, 0x2bc6, 0x1078, 0x2c94, 0x0078, 0x2bd1, 0x1078, 0x2e1d, + 0x0c7e, 0x2960, 0x6004, 0xa084, 0xfff5, 0x6006, 0x1078, 0x2cb8, + 0x0c7f, 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2bda, 0x781b, 0x0056, + 0x0078, 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0x0c7e, 0x7048, + 0x2060, 0x6100, 0xa18c, 0x1000, 0x0040, 0x2c1e, 0x6208, 0x8217, + 0xa294, 0x00ff, 0xa282, 0x000c, 0x0048, 0x2bf2, 0x0040, 0x2bf2, + 0x2011, 0x000c, 0x2600, 0xa202, 0x00c8, 0x2bf7, 0x2230, 0x6208, + 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x2c07, 0xa282, + 0x0019, 0x00c8, 0x2c0d, 0x2011, 0x0019, 0x0078, 0x2c0d, 0xa282, + 0x000c, 0x00c8, 0x2c0d, 0x2011, 0x000c, 0x2200, 0xa502, 0x00c8, + 0x2c12, 0x2228, 0x1078, 0x2e21, 0x852b, 0x852b, 0x1078, 0x2e62, + 0x0040, 0x2c1e, 0x1078, 0x2c94, 0x0078, 0x2c22, 0x1078, 0x2e1d, + 0x1078, 0x2cb8, 0x7858, 0xa085, 0x0004, 0x785a, 0x0c7f, 0x781b, + 0x0067, 0x0078, 0x1e50, 0x0c7e, 0x2960, 0x6000, 0xa084, 0x1000, + 0x00c0, 0x2c42, 0x6010, 0xa084, 0x000f, 0x00c0, 0x2c3c, 0xa18c, + 0xfff5, 0x6106, 0x0c7f, 0x007c, 0x2011, 0x0032, 0x2019, 0x0000, + 0x0078, 0x2c69, 0x68a0, 0xa084, 0x0200, 0x00c0, 0x2c3c, 0x6208, + 0xa294, 0x00ff, 0x7018, 0xa086, 0x0028, 0x00c0, 0x2c57, 0xa282, + 0x0019, 0x00c8, 0x2c5d, 0x2011, 0x0019, 0x0078, 0x2c5d, 0xa282, + 0x000c, 0x00c8, 0x2c5d, 0x2011, 0x000c, 0x6308, 0x831f, 0xa39c, + 0x00ff, 0xa382, 0x000c, 0x0048, 0x2c69, 0x0040, 0x2c69, 0x2019, + 0x000c, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, 0x0001, 0x7aaa, + 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, 0x0100, 0x6822, 0x0c7f, + 0x007c, 0x0c7e, 0x2960, 0xa18c, 0xfff5, 0x6106, 0x2011, 0x0032, + 0x2019, 0x0000, 0x0078, 0x2c84, 0x78ab, 0x0001, 0x78ab, 0x0003, + 0x78ab, 0x0001, 0x7aaa, 0x7baa, 0xa8c0, 0x0005, 0x6820, 0xa085, + 0x0100, 0x6822, 0x0c7f, 0x007c, 0x0c7e, 0x7148, 0x2160, 0x2008, + 0xa084, 0xfff0, 0xa635, 0x7e86, 0x6018, 0x789a, 0x7eae, 0x6612, + 0x78a4, 0xa084, 0xfff8, 0xa18c, 0x0007, 0xa105, 0x78a6, 0x6016, + 0x788a, 0xa6b4, 0x000f, 0x8637, 0x8204, 0x8004, 0xa084, 0x00ff, + 0xa605, 0x600e, 0x6004, 0xa084, 0xfff5, 0x6006, 0x0c7f, 0x007c, + 0x0c7e, 0x7048, 0x2060, 0x6018, 0x789a, 0x78a4, 0xa084, 0xfff0, + 0x78a6, 0x6012, 0x7884, 0xa084, 0xfff0, 0x7886, 0x0c7f, 0x007c, + 0xa282, 0x0002, 0x00c0, 0x2db3, 0x7aa8, 0x6920, 0xa18d, 0x0080, + 0x6922, 0xa184, 0x0200, 0x0040, 0x2d0d, 0xa18c, 0xfdff, 0x6922, + 0xa294, 0x00ff, 0xa282, 0x0002, 0x00c8, 0x2db3, 0x1078, 0x2d54, + 0x1078, 0x2cb8, 0xa980, 0x0001, 0x200c, 0x1078, 0x2ed1, 0x1078, + 0x2c2b, 0x88ff, 0x0040, 0x2d00, 0x789b, 0x0060, 0x2800, 0x78aa, + 0x7e58, 0xa6b5, 0x0004, 0x7e5a, 0xa684, 0x0400, 0x00c0, 0x2cfc, + 0x781b, 0x0053, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50, + 0x7e58, 0xa684, 0x0400, 0x00c0, 0x2d09, 0x781b, 0x0056, 0x0078, + 0x1e50, 0x781b, 0x0068, 0x0078, 0x1e50, 0xa282, 0x0002, 0x00c8, + 0x2d15, 0xa284, 0x0001, 0x0040, 0x2d1f, 0x7148, 0xa188, 0x0000, + 0x210c, 0xa18c, 0x2000, 0x00c0, 0x2d1f, 0x2011, 0x0000, 0x1078, + 0x2e0f, 0x1078, 0x2d54, 0x1078, 0x2cb8, 0x7858, 0xa085, 0x0004, + 0x785a, 0x781b, 0x0067, 0x0078, 0x1e50, 0x0c7e, 0x027e, 0x2960, + 0x6000, 0x2011, 0x0001, 0xa084, 0x2000, 0x00c0, 0x2d44, 0x6014, + 0xa084, 0x0040, 0x00c0, 0x2d42, 0xa18c, 0xffef, 0x6106, 0xa006, + 0x0078, 0x2d51, 0x2011, 0x0000, 0x78ab, 0x0001, 0x78ab, 0x0002, + 0x78ab, 0x0003, 0x7aaa, 0xa8c0, 0x0004, 0x6820, 0xa085, 0x0200, + 0x6822, 0x027f, 0x0c7f, 0x007c, 0x0c7e, 0x7048, 0x2060, 0x82ff, + 0x0040, 0x2d5c, 0x2011, 0x0040, 0x6018, 0xa080, 0x0002, 0x789a, + 0x78a4, 0xa084, 0xffbf, 0xa205, 0x78a6, 0x6016, 0x788a, 0x6004, + 0xa084, 0xffef, 0x6006, 0x0c7f, 0x007c, 0xa684, 0x0020, 0x0040, + 0x2daf, 0x7888, 0xa084, 0x0040, 0x0040, 0x2daf, 0x7bb8, 0xa384, + 0x003f, 0x831b, 0x00c8, 0x2d7d, 0x8000, 0xa005, 0x0040, 0x2d96, + 0x831b, 0x00c8, 0x2d86, 0x8001, 0x0040, 0x2dab, 0xa684, 0x4000, + 0x0040, 0x2d96, 0x78b8, 0x801b, 0x00c8, 0x2d8f, 0x8000, 0xa084, + 0x003f, 0x00c0, 0x2dab, 0xa6b4, 0xbfff, 0x7e5a, 0x79d8, 0x7adc, + 0x2001, 0x0001, 0xa108, 0x00c8, 0x2d9f, 0xa291, 0x0000, 0x79d2, + 0x79da, 0x7ad6, 0x7ade, 0x1078, 0x3474, 0x781b, 0x0065, 0x1078, + 0x3347, 0x0078, 0x1e50, 0x781b, 0x0065, 0x0078, 0x1e50, 0x781b, + 0x0068, 0x0078, 0x1e50, 0x1078, 0x2ddb, 0x781b, 0x0067, 0x0078, + 0x1e50, 0x1078, 0x2dc7, 0x781b, 0x0067, 0x0078, 0x1e50, 0x6827, + 0x0002, 0x1078, 0x2dcf, 0x781b, 0x0067, 0x0078, 0x1e50, 0x2001, + 0x0005, 0x0078, 0x2ddd, 0x2001, 0x000c, 0x0078, 0x2ddd, 0x2001, + 0x0006, 0x0078, 0x2ddd, 0x2001, 0x000d, 0x0078, 0x2ddd, 0x2001, + 0x0009, 0x0078, 0x2ddd, 0x2001, 0x0007, 0x789b, 0x007e, 0x78aa, + 0xa6b5, 0x0008, 0x7e5a, 0x007c, 0x077e, 0x873f, 0xa7bc, 0x000f, + 0x873b, 0x873b, 0x8703, 0xa0e0, 0x3800, 0xa7b8, 0x0020, 0x7f9a, + 0x79a4, 0xa184, 0x000f, 0x0040, 0x2dfd, 0xa184, 0xfff0, 0x78a6, + 0x6012, 0x6004, 0xa085, 0x0008, 0x6006, 0x8738, 0x8738, 0x7f9a, + 0x79a4, 0xa184, 0x0040, 0x0040, 0x2e0d, 0xa184, 0xffbf, 0x78a6, + 0x6016, 0x6004, 0xa085, 0x0010, 0x6006, 0x077f, 0x007c, 0x789b, + 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0002, 0x78ab, 0x0003, 0x7aaa, + 0x789b, 0x0060, 0x78ab, 0x0004, 0x007c, 0x2031, 0x0000, 0x2029, + 0x0032, 0x789b, 0x0010, 0x78ab, 0x0001, 0x78ab, 0x0003, 0x78ab, + 0x0001, 0x7daa, 0x7eaa, 0x789b, 0x0060, 0x78ab, 0x0005, 0x007c, + 0x157e, 0x8007, 0xa084, 0x00ff, 0x8003, 0x8003, 0xa080, 0x0020, + 0x789a, 0x79a4, 0xa18c, 0xfff0, 0x2001, 0x3746, 0x2004, 0xa082, + 0x0028, 0x0040, 0x2e4b, 0x2021, 0x2eb8, 0x2019, 0x0014, 0x20a9, + 0x000c, 0x0078, 0x2e51, 0x2021, 0x2ec4, 0x2019, 0x0019, 0x20a9, + 0x000d, 0x2011, 0x0064, 0x2404, 0xa084, 0xfff0, 0xa106, 0x0040, + 0x2e60, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e60, 0x0078, 0x2e53, + 0x157f, 0x007c, 0x157e, 0x2011, 0x3746, 0x2214, 0xa282, 0x0032, + 0x0048, 0x2e76, 0x0040, 0x2e7a, 0x2021, 0x2eaa, 0x2019, 0x0011, + 0x20a9, 0x000e, 0x2011, 0x0032, 0x0078, 0x2e8c, 0xa282, 0x0028, + 0x0040, 0x2e84, 0x2021, 0x2eb8, 0x2019, 0x0014, 0x20a9, 0x000c, + 0x2011, 0x0064, 0x0078, 0x2e8c, 0x2021, 0x2ec4, 0x2019, 0x0019, + 0x20a9, 0x000d, 0x2011, 0x0064, 0x2200, 0xa502, 0x0040, 0x2e9c, + 0x0048, 0x2e9c, 0x8420, 0x2300, 0xa210, 0x0070, 0x2e99, 0x0078, + 0x2e8c, 0x157f, 0xa006, 0x007c, 0x157f, 0x7a08, 0xa582, 0x00c8, + 0x00c8, 0x2ea7, 0xa285, 0x0040, 0x780a, 0x0078, 0x2ea7, 0x2404, + 0xa005, 0x007c, 0x2002, 0x3002, 0x3202, 0x4203, 0x4403, 0x5404, + 0x5604, 0x6605, 0x6805, 0x7806, 0x7a06, 0x0a07, 0x0c07, 0x0e07, + 0x3202, 0x4202, 0x5202, 0x6202, 0x7202, 0x6605, 0x7605, 0x7805, + 0x7a05, 0x7c05, 0x7e05, 0x7f05, 0x2202, 0x3202, 0x4202, 0x5202, + 0x5404, 0x6404, 0x7404, 0x7604, 0x7804, 0x7a04, 0x7c04, 0x7e04, + 0x7f04, 0x789b, 0x0010, 0xa046, 0x007c, 0xa784, 0x0f00, 0x800c, + 0xa784, 0x0007, 0x8003, 0x8003, 0x8003, 0x8003, 0xa105, 0xa0e0, + 0x3880, 0x007c, 0x79d8, 0x7adc, 0x78d0, 0x801b, 0x00c8, 0x2ee9, + 0x8000, 0xa084, 0x003f, 0xa108, 0xa291, 0x0000, 0x007c, 0x0f7e, + 0x2079, 0x0100, 0x2009, 0x3740, 0x2091, 0x8000, 0x2104, 0x0079, + 0x2ef9, 0x2f1f, 0x2f03, 0x2f03, 0x2f03, 0x2f03, 0x2f03, 0x2f03, + 0x2f01, 0x1078, 0x1e01, 0x784b, 0x0004, 0x68b4, 0xa085, 0x4000, + 0x68b6, 0x7858, 0xa085, 0x4000, 0x785a, 0x7830, 0xa084, 0x0080, + 0x00c0, 0x2f1f, 0x0018, 0x2f1f, 0x681c, 0xa084, 0x0020, 0x00c0, + 0x2f1d, 0x781b, 0x00dc, 0x0078, 0x2f1f, 0x781b, 0x00e3, 0x2091, + 0x8001, 0x0f7f, 0x007c, 0x0c7e, 0x6814, 0x8007, 0xa084, 0x000f, + 0x8003, 0x8003, 0x8003, 0xa0e0, 0x3800, 0x6004, 0xa084, 0x000a, + 0x00c0, 0x2f56, 0x6108, 0xa194, 0xff00, 0x0040, 0x2f56, 0xa18c, + 0x00ff, 0x2001, 0x0019, 0xa106, 0x0040, 0x2f45, 0x2001, 0x0032, + 0xa106, 0x0040, 0x2f49, 0x0078, 0x2f4d, 0x2009, 0x0020, 0x0078, + 0x2f4f, 0x2009, 0x003f, 0x0078, 0x2f4f, 0x2011, 0x0000, 0x2100, + 0xa205, 0x600a, 0x6004, 0xa085, 0x0002, 0x6006, 0x0c7f, 0x007c, + 0x781b, 0x0068, 0x0078, 0x1e50, 0x781b, 0x0067, 0x0078, 0x1e50, + 0x781b, 0x0056, 0x0078, 0x1e50, 0x781b, 0x0053, 0x0078, 0x1e50, + 0x781b, 0x00dc, 0x0078, 0x1e50, 0x781b, 0x00db, 0x0078, 0x1e50, + 0x781b, 0x00e3, 0x0078, 0x1e50, 0x781b, 0x00e2, 0x0078, 0x1e50, + 0x781b, 0x009d, 0x0078, 0x1e50, 0x781b, 0x009c, 0x0078, 0x1e50, + 0x6818, 0xa084, 0x8000, 0x0040, 0x2f87, 0x681b, 0x001d, 0x70a3, + 0x0001, 0x781b, 0x0047, 0x0078, 0x1e50, 0x007e, 0x7830, 0xa084, + 0x00c0, 0x00c0, 0x2fa4, 0x7808, 0xa084, 0xfffd, 0x780a, 0x0005, + 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, 0x2fa4, + 0x7808, 0xa085, 0x0002, 0x780a, 0x007f, 0x007c, 0x7808, 0xa085, + 0x0002, 0x780a, 0x007c, 0x7830, 0xa084, 0x0040, 0x00c0, 0x2fab, + 0x0098, 0x2fb4, 0x78ac, 0x007c, 0x7808, 0xa084, 0xfffd, 0x780a, + 0x0005, 0x0005, 0x0005, 0x0005, 0x78ec, 0xa084, 0x0021, 0x0040, + 0x2fc3, 0x0098, 0x2fc1, 0x78ac, 0x007e, 0x7808, 0xa085, 0x0002, + 0x780a, 0x007f, 0x007c, 0xa784, 0x0070, 0x0040, 0x2fd7, 0x0c7e, + 0x2d60, 0x2f68, 0x1078, 0x1dac, 0x2d78, 0x2c68, 0x0c7f, 0xa784, + 0x0008, 0x0040, 0x2fe4, 0x784b, 0x0008, 0x78ec, 0xa084, 0x0003, + 0x0040, 0x1e58, 0x0078, 0x2f58, 0xa784, 0x0004, 0x0040, 0x3017, + 0x78b8, 0xa084, 0x4001, 0x0040, 0x3017, 0x784b, 0x0008, 0x78ec, + 0xa084, 0x0003, 0x0040, 0x1e58, 0x78e4, 0xa084, 0x0007, 0xa086, + 0x0001, 0x00c0, 0x3017, 0x78c0, 0xa685, 0x4800, 0x2030, 0x7e5a, + 0x781b, 0x00e3, 0x0078, 0x1e50, 0x784b, 0x0008, 0x6818, 0xa084, + 0x8000, 0x0040, 0x3013, 0x681b, 0x0015, 0xa684, 0x4000, 0x0040, + 0x3013, 0x681b, 0x0007, 0x781b, 0x00dc, 0x0078, 0x1e50, 0x681b, + 0x0003, 0x7858, 0xa084, 0x3f00, 0x681e, 0x682f, 0x0000, 0x6833, + 0x0000, 0x784b, 0x0008, 0x78e4, 0xa005, 0x00d0, 0x228e, 0xa084, + 0x0020, 0x0040, 0x228e, 0x0018, 0x228e, 0x0078, 0x2db9, 0x6b14, + 0x8307, 0xa084, 0x000f, 0x8003, 0x8003, 0x8003, 0xa080, 0x3800, + 0x2060, 0x2048, 0x704a, 0x6000, 0x704e, 0x6004, 0x7052, 0x2a60, + 0x007c, 0x0020, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, + 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, + 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, + 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, 0x0020, 0x0000, + 0x0020, 0x0000, 0x0020, 0x0062, 0x0009, 0x0014, 0x0014, 0x9848, + 0x0014, 0x0014, 0x98f6, 0x98e6, 0x0014, 0x0014, 0x0080, 0x00bd, + 0x0100, 0x0402, 0x2008, 0xf880, 0x0018, 0xa20a, 0x0014, 0x300b, + 0xa20c, 0x0014, 0xa200, 0x8838, 0x3806, 0x8839, 0x28c2, 0x9cc2, + 0xa805, 0x0864, 0xa83d, 0x3008, 0x28c1, 0x9cc2, 0xa201, 0x300c, + 0x2847, 0x8161, 0x846a, 0x8000, 0x84a4, 0x1856, 0x883a, 0xa808, + 0x28e2, 0x9c9f, 0xa8f3, 0x0864, 0xa82b, 0x300c, 0xa801, 0x3008, + 0x28e1, 0x9c9f, 0x280d, 0xa204, 0x64c0, 0x67a0, 0x6fc0, 0x1814, + 0x883b, 0x7023, 0x8576, 0x8677, 0xa80f, 0x786e, 0x883e, 0xa80c, + 0x282b, 0xa205, 0x64a0, 0x67a0, 0x6fc0, 0x1814, 0x883b, 0x7023, + 0x8576, 0x8677, 0xa801, 0x883e, 0x206b, 0x28c1, 0x9cc2, 0x2044, + 0x2103, 0x20a2, 0x2081, 0xa8dc, 0xa207, 0x2901, 0xa80a, 0x0014, + 0xa203, 0x8000, 0x85a4, 0x1872, 0x879a, 0x883c, 0x1fe2, 0xf601, + 0xa208, 0x856e, 0x866f, 0x0704, 0x3008, 0x9c9f, 0x0014, 0xa202, + 0x8000, 0x85a4, 0x3009, 0x84a8, 0x19e2, 0xf848, 0x8174, 0x86eb, + 0x85eb, 0x872e, 0x87a9, 0x883f, 0x08e6, 0xa8f1, 0xf861, 0xa8e8, + 0xf801, 0x0014, 0xf881, 0x0016, 0x85b2, 0x80f0, 0x9532, 0xfaa2, + 0x1de2, 0x0014, 0x8532, 0xf221, 0x0014, 0x1de2, 0x84a8, 0xd6e0, + 0x1fe6, 0x0014, 0xa206, 0x6865, 0x817e, 0x842a, 0x1dc1, 0x8823, + 0x0016, 0x6042, 0x8008, 0xa8fa, 0x8000, 0x84a4, 0x8160, 0x842a, + 0xf021, 0x3008, 0x84a8, 0x1dc6, 0x20d7, 0x8822, 0x0016, 0x8000, + 0x2848, 0x1011, 0xa8fc, 0x3008, 0x8000, 0xa000, 0x2802, 0x1011, + 0xa8fd, 0xa886, 0x3008, 0x283d, 0x1011, 0xa8fd, 0xa209, 0x0017, + 0x300c, 0x8000, 0x85a4, 0x1de2, 0xdac1, 0x0014, 0xd301, 0x0014, + 0x26e0, 0x873a, 0xfaa2, 0x19f2, 0x1fe2, 0x0014, 0xa20b, 0x0014, + 0xa20d, 0x3806, 0x0210, 0x9ccc, 0x0704, 0x0000, 0x127e, 0x2091, + 0x2200, 0x2049, 0x312e, 0x7000, 0x7204, 0xa205, 0x720c, 0xa215, + 0x7008, 0xa084, 0xfff7, 0xa205, 0x0040, 0x3140, 0x1078, 0x31b9, + 0x127f, 0x2000, 0x007c, 0x6428, 0x84ff, 0x0040, 0x316f, 0x2c70, + 0x7004, 0xa0bc, 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb, 0x00c0, + 0x315d, 0x0048, 0x3155, 0x1078, 0x1e01, 0x609c, 0xa075, 0x0040, + 0x316f, 0x0078, 0x3148, 0x2039, 0x3174, 0x2704, 0xae68, 0x6808, + 0xa630, 0x680c, 0xa529, 0x8421, 0x0040, 0x316f, 0x8738, 0x2704, + 0xa005, 0x00c0, 0x315e, 0x709c, 0xa075, 0x00c0, 0x3148, 0x007c, + 0x0000, 0x0005, 0x0009, 0x000d, 0x0011, 0x0015, 0x0019, 0x001d, + 0x0000, 0x0003, 0x0009, 0x000f, 0x0015, 0x001b, 0x0000, 0x0000, + 0x3174, 0x3171, 0x0000, 0x0000, 0x8000, 0x0000, 0x3174, 0x0000, + 0x317c, 0x3179, 0x0000, 0x0000, 0x0000, 0x0000, 0x317c, 0x0000, + 0x3177, 0x3177, 0x0000, 0x0000, 0x8000, 0x0000, 0x3177, 0x0000, + 0x317d, 0x317d, 0x0000, 0x0000, 0x0000, 0x0000, 0x317d, 0x127e, + 0x2091, 0x2200, 0x2079, 0x3700, 0x2071, 0x0010, 0x7007, 0x000a, + 0x7007, 0x0002, 0x7003, 0x0000, 0x2071, 0x0020, 0x7007, 0x000a, + 0x7007, 0x0002, 0x7003, 0x0000, 0x2049, 0x0000, 0x127f, 0x2000, + 0x007c, 0x2049, 0x31b9, 0x2019, 0x0000, 0x7004, 0x8004, 0x00c8, + 0x31eb, 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x31c3, + 0xa184, 0x01e0, 0x0040, 0x31ce, 0x1078, 0x1e01, 0xa184, 0x4000, + 0x00c0, 0x31c3, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, 0x31e0, + 0xa386, 0x0008, 0x0040, 0x31eb, 0xa386, 0x200c, 0x00c0, 0x31c3, + 0x7200, 0x8204, 0x0048, 0x31eb, 0x730c, 0xa384, 0x00ff, 0x0040, + 0x31eb, 0x1078, 0x1e01, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, + 0xa084, 0x0008, 0x00c0, 0x31ef, 0x7007, 0x0012, 0x7108, 0x8103, + 0x0048, 0x31f4, 0x7003, 0x0000, 0x2049, 0x0000, 0x007c, 0x107e, + 0x007e, 0x127e, 0x157e, 0x2091, 0x2200, 0x7108, 0x1078, 0x320f, + 0x157f, 0x127f, 0x2091, 0x8001, 0x007f, 0x107f, 0x007c, 0x7204, + 0x7500, 0x730c, 0xa384, 0x0300, 0x00c0, 0x324e, 0xa184, 0x0060, + 0x00c0, 0x3287, 0x7008, 0x7108, 0xa106, 0x00c0, 0x321a, 0xa184, + 0x01e0, 0x00c0, 0x3287, 0xa184, 0x4000, 0x00c0, 0x321a, 0xa986, + 0x3474, 0x00c0, 0x3242, 0xa19c, 0x300c, 0xa386, 0x2004, 0x0040, + 0x3239, 0xa386, 0x0008, 0x0040, 0x3242, 0xa386, 0x200c, 0x00c0, + 0x321a, 0x7200, 0x8204, 0x0048, 0x3242, 0x730c, 0xa384, 0x00ff, + 0x00c0, 0x324e, 0xa184, 0x0007, 0x0079, 0x3246, 0x3250, 0x327b, + 0x324e, 0x327b, 0x324e, 0x32d4, 0x324e, 0x32d2, 0x1078, 0x1e01, + 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3259, 0x2049, 0x0000, 0x0078, + 0x325d, 0x1078, 0x344b, 0x00c0, 0x3259, 0x2704, 0xac00, 0xa088, + 0x0002, 0x2104, 0x8108, 0x6892, 0x2104, 0x688e, 0x8a07, 0x077e, + 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x3272, 0xa7ba, 0x3179, + 0x0078, 0x3274, 0xa7ba, 0x3171, 0x007f, 0xa73d, 0x2c00, 0x6886, + 0x6f8a, 0x077f, 0x007c, 0x7007, 0x0002, 0x8aff, 0x00c0, 0x3282, + 0x0078, 0x3286, 0x1078, 0x344b, 0x00c0, 0x3282, 0x007c, 0x7108, + 0x7008, 0xa106, 0x00c0, 0x3287, 0xa184, 0x4000, 0x00c0, 0x3287, + 0x7007, 0x0012, 0x7108, 0x7008, 0xa106, 0x00c0, 0x3292, 0xa184, + 0x4000, 0x00c0, 0x3292, 0x00e0, 0x329b, 0x2091, 0x6000, 0x00e0, + 0x329f, 0x2091, 0x6000, 0x7007, 0x0012, 0x7007, 0x0008, 0x7004, + 0xa084, 0x0008, 0x00c0, 0x32a7, 0x7007, 0x0012, 0x7108, 0x8103, + 0x0048, 0x32ac, 0x7003, 0x0000, 0x7000, 0xa005, 0x00c0, 0x32c0, + 0x7004, 0xa005, 0x00c0, 0x32c0, 0x700c, 0xa005, 0x0040, 0x32c2, + 0x0078, 0x32a3, 0x2049, 0x0000, 0x1078, 0x2eef, 0x6818, 0xa084, + 0x8000, 0x0040, 0x32cd, 0x681b, 0x0002, 0x007c, 0x1078, 0x1e01, + 0x1078, 0x1e01, 0x1078, 0x3332, 0x7210, 0x7114, 0x700c, 0xa09c, + 0x00ff, 0x2800, 0xa300, 0xa211, 0xa189, 0x0000, 0x1078, 0x3332, + 0x2704, 0x2c58, 0xac60, 0x6308, 0x2200, 0xa322, 0x630c, 0x2100, + 0xa31b, 0x2400, 0xa305, 0x0040, 0x32f7, 0x00c8, 0x32f7, 0x8412, + 0x8210, 0x830a, 0xa189, 0x0000, 0x2b60, 0x0078, 0x32de, 0x2b60, + 0x8a07, 0x007e, 0x6004, 0xa084, 0x0008, 0x0040, 0x3303, 0xa7ba, + 0x3179, 0x0078, 0x3305, 0xa7ba, 0x3171, 0x007f, 0xa73d, 0x2c00, + 0x6886, 0x6f8a, 0x6c92, 0x6b8e, 0x1078, 0x31b9, 0x007c, 0x8738, + 0x2704, 0xa005, 0x00c0, 0x3322, 0x609c, 0xa005, 0x0040, 0x332f, + 0x2060, 0x6004, 0xa084, 0x000f, 0xa080, 0x317f, 0x203c, 0x87fb, + 0x1040, 0x1e01, 0x8a51, 0x0040, 0x332e, 0x7008, 0x7508, 0xa52e, + 0x00c0, 0x3325, 0xa084, 0x0003, 0xa086, 0x0003, 0x007c, 0x2051, + 0x0000, 0x007c, 0x8a50, 0x8739, 0x2704, 0xa004, 0x00c0, 0x3346, + 0x6000, 0xa064, 0x00c0, 0x333d, 0x2d60, 0x6004, 0xa084, 0x000f, + 0xa080, 0x318f, 0x203c, 0x87fb, 0x1040, 0x1e01, 0x007c, 0x127e, + 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x6884, 0x2060, 0x6888, 0x6b8c, + 0x6c90, 0x8057, 0xaad4, 0x00ff, 0xa084, 0x00ff, 0x007e, 0x6804, + 0xa084, 0x0008, 0x007f, 0x0040, 0x3361, 0xa0b8, 0x3179, 0x0078, + 0x3363, 0xa0b8, 0x3171, 0x7e08, 0xa6b5, 0x000c, 0x681c, 0xa084, + 0x0040, 0x0040, 0x336d, 0xa6b5, 0x0001, 0x7007, 0x0004, 0x7004, + 0xa084, 0x0004, 0x00c0, 0x336f, 0x2400, 0xa305, 0x00c0, 0x337a, + 0x0078, 0x339e, 0x2c58, 0x2704, 0x6104, 0xac60, 0x6000, 0xa400, + 0x701a, 0x6004, 0xa301, 0x701e, 0xa184, 0x0008, 0x0040, 0x338e, + 0x6010, 0xa001, 0x7022, 0x6014, 0xa001, 0x7026, 0x6208, 0x2400, + 0xa202, 0x7012, 0x620c, 0x2300, 0xa203, 0x7016, 0x7602, 0x7007, + 0x0001, 0x2b60, 0x1078, 0x330f, 0x0078, 0x33a0, 0x1078, 0x344b, + 0x00c0, 0x339e, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, 0x2091, + 0x2200, 0x0d7f, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, + 0x33ac, 0x7003, 0x0008, 0x127f, 0x2000, 0x007c, 0x127e, 0x0d7e, + 0x2091, 0x2200, 0x0d7f, 0x2049, 0x33b6, 0x7007, 0x0004, 0x7004, + 0xa084, 0x0004, 0x00c0, 0x33bf, 0x7e08, 0xa6b5, 0x000c, 0x681c, + 0xa084, 0x0020, 0x00c0, 0x33ce, 0xa6b5, 0x0001, 0x6828, 0x2050, + 0x2d60, 0x6004, 0xa0bc, 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb, + 0x00c0, 0x33e4, 0x0048, 0x33de, 0x1078, 0x1e01, 0x689c, 0xa065, + 0x0040, 0x33e8, 0x0078, 0x33d1, 0x1078, 0x344b, 0x00c0, 0x33e4, + 0x127f, 0x2000, 0x007c, 0x127e, 0x007e, 0x017e, 0x0d7e, 0x2091, + 0x2200, 0x0d7f, 0x037f, 0x047f, 0x7e08, 0xa6b5, 0x000c, 0x681c, + 0xa084, 0x0040, 0x0040, 0x33fe, 0xa6b5, 0x0001, 0x2049, 0x33eb, + 0x6828, 0xa055, 0x0040, 0x3448, 0x2d70, 0x2e60, 0x7004, 0xa0bc, + 0x000f, 0xa7b8, 0x317f, 0x273c, 0x87fb, 0x00c0, 0x341a, 0x0048, + 0x3413, 0x1078, 0x1e01, 0x709c, 0xa075, 0x2060, 0x0040, 0x3448, + 0x0078, 0x3406, 0x2704, 0xae68, 0x6808, 0xa422, 0x680c, 0xa31b, + 0x0048, 0x3435, 0x8a51, 0x00c0, 0x3427, 0x1078, 0x1e01, 0x8738, + 0x2704, 0xa005, 0x00c0, 0x341b, 0x709c, 0xa075, 0x2060, 0x0040, + 0x3448, 0x2039, 0x3171, 0x0078, 0x3406, 0x8422, 0x8420, 0x831a, + 0xa399, 0x0000, 0x6908, 0x2400, 0xa122, 0x690c, 0x2300, 0xa11b, + 0x00c8, 0x3444, 0x1078, 0x1e01, 0x2071, 0x0020, 0x0078, 0x336d, + 0x127f, 0x2000, 0x007c, 0x7008, 0x7508, 0xa52e, 0x00c0, 0x344b, + 0xa084, 0x0003, 0xa086, 0x0003, 0x0040, 0x3473, 0x2704, 0xac08, + 0x2104, 0x701a, 0x8108, 0x2104, 0x701e, 0x8108, 0x2104, 0x7012, + 0x8108, 0x2104, 0x7016, 0x6004, 0xa084, 0x0008, 0x0040, 0x346e, + 0x8108, 0x2104, 0x7022, 0x8108, 0x2104, 0x7026, 0x7602, 0x7007, + 0x0001, 0x1078, 0x330f, 0x007c, 0x127e, 0x007e, 0x0d7e, 0x2091, + 0x2200, 0x2049, 0x3474, 0x0d7f, 0x087f, 0x7108, 0x7008, 0xa106, + 0x00c0, 0x347d, 0xa184, 0x4000, 0x00c0, 0x347d, 0xa184, 0x0003, + 0x00c0, 0x3492, 0x6828, 0xa005, 0x0040, 0x34a0, 0x1078, 0x32d4, + 0x0078, 0x34a0, 0x00a0, 0x3499, 0x7108, 0x1078, 0x320f, 0x0078, + 0x347d, 0x7007, 0x0010, 0x00a0, 0x349b, 0x7108, 0x1078, 0x320f, + 0x7008, 0xa086, 0x0008, 0x00c0, 0x347d, 0x7003, 0x0000, 0x2049, + 0x0000, 0x127f, 0x2000, 0x007c, 0x127e, 0x147e, 0x137e, 0x157e, + 0x0d7e, 0x2091, 0x2200, 0x0d7f, 0x2049, 0x34ac, 0xad80, 0x0011, + 0x20a0, 0x2099, 0x0031, 0x700c, 0xa084, 0x00ff, 0x682a, 0x7007, + 0x0008, 0x7007, 0x0002, 0x7003, 0x0001, 0x0040, 0x34ca, 0x8000, + 0x80ac, 0x53a5, 0x7007, 0x0004, 0x7004, 0xa084, 0x0004, 0x00c0, + 0x34cc, 0x2049, 0x0000, 0x7003, 0x0000, 0x157f, 0x137f, 0x147f, + 0x127f, 0x2000, 0x007c, 0x2091, 0x6000, 0x78b0, 0xa005, 0x0040, + 0x34f0, 0x797c, 0x70d0, 0xa106, 0x00c0, 0x34f0, 0x7804, 0xa005, + 0x0040, 0x34f0, 0x7807, 0x0000, 0x0068, 0x34f0, 0x2091, 0x4080, + 0x7820, 0x8001, 0x7822, 0x00c0, 0x3550, 0x7824, 0x7822, 0x2091, + 0x8000, 0x78e0, 0xa005, 0x0040, 0x351d, 0x78c4, 0xa005, 0x00c0, + 0x351d, 0x3a10, 0xa284, 0x0002, 0x00c0, 0x350d, 0x78c7, 0x0007, + 0x2009, 0xff01, 0x200a, 0x0078, 0x351d, 0xa284, 0x0001, 0x00c0, + 0x3515, 0x78df, 0x0000, 0x0078, 0x351d, 0x78dc, 0xa005, 0x00c0, + 0x351d, 0x78c7, 0x0008, 0x78df, 0x0001, 0x2069, 0x3740, 0x6800, + 0xa084, 0x0007, 0x0040, 0x3534, 0xa086, 0x0002, 0x0040, 0x3534, + 0x6830, 0xa00d, 0x0040, 0x3534, 0x2104, 0xa005, 0x0040, 0x3534, + 0x8001, 0x200a, 0x0040, 0x35f2, 0x7848, 0xa005, 0x0040, 0x3550, + 0x8001, 0x784a, 0x00c0, 0x3550, 0x0f7e, 0x2079, 0x0100, 0x1078, + 0x2fa6, 0x0f7f, 0x1078, 0x1c4b, 0x68c4, 0xa005, 0x0040, 0x3550, + 0x8001, 0x68c6, 0x00c0, 0x3550, 0x68a3, 0x0000, 0x68a7, 0x0001, + 0x1078, 0x3557, 0x1078, 0x357c, 0x2091, 0x8001, 0x007c, 0x7834, + 0x8001, 0x7836, 0x00c0, 0x357b, 0x7838, 0x7836, 0x2091, 0x8000, + 0x7844, 0xa005, 0x00c0, 0x3566, 0x2001, 0x0101, 0x8001, 0x7846, + 0xa080, 0x4080, 0x2040, 0x2004, 0xa065, 0x0040, 0x357b, 0x6024, + 0xa005, 0x0040, 0x3577, 0x8001, 0x6026, 0x0040, 0x35ab, 0x6000, + 0x2c40, 0x0078, 0x356c, 0x007c, 0x7828, 0x8001, 0x782a, 0x00c0, + 0x35aa, 0x782c, 0x782a, 0x7830, 0xa005, 0x00c0, 0x3589, 0x2001, + 0x0080, 0x8001, 0x7832, 0x8003, 0x8003, 0x8003, 0x8003, 0xa090, + 0x3880, 0xa298, 0x0002, 0x2304, 0xa084, 0x0008, 0x0040, 0x35aa, + 0xa290, 0x0009, 0x2204, 0xa005, 0x0040, 0x35a2, 0x8001, 0x2012, + 0x00c0, 0x35aa, 0x2304, 0xa084, 0xfff7, 0xa085, 0x0080, 0x201a, + 0x1078, 0x1c4b, 0x007c, 0x2069, 0x3740, 0x6800, 0xa005, 0x0040, + 0x35b5, 0x683c, 0xac06, 0x0040, 0x35f2, 0x601b, 0x0006, 0x60b4, + 0xa084, 0x3f00, 0x601e, 0x6020, 0xa084, 0x00ff, 0xa085, 0x0060, + 0x6022, 0x6000, 0x2042, 0x6714, 0x6fb6, 0x1078, 0x1828, 0x6818, + 0xa005, 0x0040, 0x35cd, 0x8001, 0x681a, 0x6808, 0xa084, 0xffef, + 0x680a, 0x6810, 0x8001, 0x00d0, 0x35d7, 0x1078, 0x1e01, 0x6812, + 0x602f, 0x0000, 0x6033, 0x0000, 0x2c68, 0x1078, 0x1990, 0x2069, + 0x3740, 0x2001, 0x0006, 0x68a2, 0x7944, 0xa184, 0x0100, 0x00c0, + 0x35ed, 0x69ba, 0x2001, 0x0004, 0x68a2, 0x1078, 0x1c46, 0x2091, + 0x8001, 0x007c, 0x2009, 0x374f, 0x2164, 0x2069, 0x0100, 0x1078, + 0x1dac, 0x601b, 0x0006, 0x6858, 0xa084, 0x3f00, 0x601e, 0x6020, + 0xa084, 0x00ff, 0xa085, 0x0048, 0x6022, 0x602f, 0x0000, 0x6033, + 0x0000, 0x6830, 0xa084, 0x0040, 0x0040, 0x362e, 0x684b, 0x0004, + 0x20a9, 0x0014, 0x6848, 0xa084, 0x0004, 0x0040, 0x361b, 0x0070, + 0x361b, 0x0078, 0x3612, 0x684b, 0x0009, 0x20a9, 0x0014, 0x6848, + 0xa084, 0x0001, 0x0040, 0x3628, 0x0070, 0x3628, 0x0078, 0x361f, + 0x20a9, 0x00fa, 0x0070, 0x362e, 0x0078, 0x362a, 0x6808, 0xa084, + 0xfffd, 0x680a, 0x681b, 0x0047, 0x2009, 0x3768, 0x200b, 0x0007, + 0x784c, 0x784a, 0x2091, 0x8001, 0x007c, 0x2079, 0x3700, 0x1078, + 0x3668, 0x1078, 0x364c, 0x1078, 0x365a, 0x7833, 0x0000, 0x7847, + 0x0000, 0x784b, 0x0000, 0x007c, 0x2019, 0x000c, 0x2011, 0x3746, + 0x2204, 0xa086, 0x003c, 0x0040, 0x3657, 0x2019, 0x0008, 0x7b2a, + 0x7b2e, 0x007c, 0x2019, 0x0039, 0x2011, 0x3746, 0x2204, 0xa086, + 0x003c, 0x0040, 0x3665, 0x2019, 0x0027, 0x7b36, 0x7b3a, 0x007c, + 0x2019, 0x3971, 0x2011, 0x3746, 0x2204, 0xa086, 0x003c, 0x0040, + 0x3673, 0x2019, 0x2626, 0x7b22, 0x7b26, 0x783f, 0x0000, 0x7843, + 0x000a, 0x007c, 0x3f42 +}; +unsigned short risc_code_length01 = 0x267b; + diff --git a/private/ntos/miniport/qlogic/makedsk.bat b/private/ntos/miniport/qlogic/makedsk.bat new file mode 100644 index 000000000..900260f9f --- /dev/null +++ b/private/ntos/miniport/qlogic/makedsk.bat @@ -0,0 +1,4 @@ +copy oemsetup.inf a:\ +copy ql10wnt.sys a:\ +copy qlscsi a:\ +copy txtsetup.oem a:\ diff --git a/private/ntos/miniport/qlogic/makefile b/private/ntos/miniport/qlogic/makefile new file mode 100644 index 000000000..58189757d --- /dev/null +++ b/private/ntos/miniport/qlogic/makefile @@ -0,0 +1,7 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the driver components of the Windows NT DDK +# + +!INCLUDE $(NTMAKEENV)\makefile.def diff --git a/private/ntos/miniport/qlogic/oemsetup.inf b/private/ntos/miniport/qlogic/oemsetup.inf new file mode 100644 index 000000000..8ec7286f1 --- /dev/null +++ b/private/ntos/miniport/qlogic/oemsetup.inf @@ -0,0 +1,571 @@ +;----------------------------------------------------------------------- +; OPTION TYPE +; ----------- +; This identifies the Option type we are dealing with. The different +; possible types are: +; +; COMPUTER, VIDEO, POINTER, KEYBOARD, LAYOUT, SCSI, TAPE, PRINTER, ... +;----------------------------------------------------------------------- + +[Identification] + OptionType = SCSI + +;----------------------------------------------------------------------- +; LANGUAGES SUPPORTED +; ------------------- +; +; The languages supported by the INF, For every language supported +; we need to have a separate text section for every displayable text +; section. +; +;----------------------------------------------------------------------- + +[LanguagesSupported] + ENG + + +;----------------------------------------------------------------------- +; OPTION LIST +; ----------- +; This section lists the Option key names. These keys are locale +; independent and used to represent the option in a locale independent +; manner. +; +;----------------------------------------------------------------------- + +[Options] + "QLA100" = ql10wnt + "QLA10035" = ql10nt35 + +;----------------------------------------------------------------------- +; OPTION TEXT SECTION +; ------------------- +; These are text strings used to identify the option to the user. There +; are separate sections for each language supported. The format of the +; section name is "OptionsText" concatenated with the Language represented +; by the section. +; +;----------------------------------------------------------------------- + +[OptionsTextENG] + "QLA100" = "QLogic Fast!SCSI/QLA100 (Windows NT V3.1)" + "QLA10035" = "QLogic Fast!SCSI/QLA100 (Windows NT V3.5)" + +;----------------------------------------------------------------------------------------- +; SCSI MINIPORT DRIVERS: +; +; Order of the information: +; +; Class driver = Type, Group, ErrorControl, Tag, EventMessageFile, TypesSupported +; +;----------------------------------------------------------------------------------------- + +[MiniportDrivers] + ql10wnt = !SERVICE_KERNEL_DRIVER, "SCSI Miniport", !SERVICE_ERROR_NORMAL, 31, %SystemRoot%\System32\IoLogMsg.dll , 7 + ql10nt35 = !SERVICE_KERNEL_DRIVER, "SCSI Miniport", !SERVICE_ERROR_NORMAL, 31, %SystemRoot%\System32\IoLogMsg.dll , 7 + +;--------------------------------------------------------------------------- +; 1. Identify +; +; DESCRIPTION: To verify that this INF deals with the same type of options +; as we are choosing currently. +; +; INPUT: None +; +; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL +; $($R1): Option Type (COMPUTER ...) +; $($R2): Diskette description +;--------------------------------------------------------------------------- + +[Identify] + ; + ; + read-syms Identification + + set Status = STATUS_SUCCESSFUL + set Identifier = $(OptionType) + set Media = #("Source Media Descriptions", 1, 1) + + Return $(Status) $(Identifier) $(Media) + + + +;------------------------------------------------------------------------ +; 2. ReturnOptions: +; +; DESCRIPTION: To return the option list supported by this INF and the +; localised text list representing the options. +; +; +; INPUT: $($0): Language used. ( ENG | FRN | ... ) +; +; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL | +; STATUS_NOLANGUAGE +; STATUS_FAILED +; +; $($R1): Option List +; $($R2): Option Text List +;------------------------------------------------------------------------ + +[ReturnOptions] + ; + ; + set Status = STATUS_FAILED + set OptionList = {} + set OptionTextList = {} + + ; + ; Check if the language requested is supported + ; + set LanguageList = ^(LanguagesSupported, 1) + Ifcontains(i) $($0) in $(LanguageList) + goto returnoptions + else + set Status = STATUS_NOLANGUAGE + goto finish_ReturnOptions + endif + + ; + ; form a list of all the options and another of the text representing + ; + +returnoptions = + + set OptionList = ^(Options, 0) + set OptionTextList = ^(OptionsText$($0), 1) + set Status = STATUS_SUCCESSFUL + +finish_ReturnOptions = + + Return $(Status) $(OptionList) $(OptionTextList) + + +; +; 3. InstallOption: +; +; FUNCTION: To copy files representing Options +; To configure the installed option +; To update the registry for the installed option +; +; INPUT: $($0): Language to use +; $($1): OptionID to install +; $($2): SourceDirectory +; $($3): AddCopy (YES | NO) +; $($4): DoCopy (YES | NO) +; $($5): DoConfig (YES | NO) +; +; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL | +; STATUS_NOLANGUAGE | +; STATUS_USERCANCEL | +; STATUS_FAILED +; + +[InstallOption] + + ; + ; Set default values for + ; + set Status = STATUS_FAILED + set DrivesToFree = {} + + ; + ; extract parameters + ; + set Option = $($1) + set SrcDir = $($2) + set AddCopy = $($3) + set DoCopy = $($4) + set DoConfig = $($5) + + ; + ; Check if the language requested is supported + ; + set LanguageList = ^(LanguagesSupported, 1) + Ifcontains(i) $($0) in $(LanguageList) + else + set Status = STATUS_NOLANGUAGE + goto finish_InstallOption + endif + read-syms Strings$($0) + + ; + ; check to see if Option is supported. + ; + + set OptionList = ^(Options, 0) + ifcontains $(Option) in $(OptionList) + else + Debug-Output "SCSI.INF: SCSI option is not supported." + goto finish_InstallOption + endif + set OptionList = "" + + ; + ; Option has been defined already + ; + + set MiniportDriver = #(Options, $(Option), 1) + set Type = $(#(MiniportDrivers, $(MiniportDriver), 1)) + set Group = #(MiniportDrivers, $(MiniportDriver), 2) + set ErrorControl = $(#(MiniportDrivers, $(MiniportDriver), 3)) + set Tag = #(MiniportDrivers, $(MiniportDriver), 4) + set EventMessageFile = #(MiniportDrivers, $(MiniportDriver), 5) + set TypesSupported = #(MiniportDrivers, $(MiniportDriver), 6) + + set Start = $(!SERVICE_BOOT_START) + +installtheoption = + + + ; + ; Code to add files to copy list + ; + + ifstr(i) $(AddCopy) == "YES" + set DoActualCopy = NO + set FileToCheck = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2) + LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(!STF_WINDOWSSYSPATH)"\drivers\"$(FileToCheck) + ifstr(i) $(STATUS) == NO + set DoActualCopy = YES + endif + + ifstr(i) $(DoActualCopy) == NO + shell "subroutn.inf" DriversExist $($0) $(String1) + ifint $($ShellCode) != $(!SHELL_CODE_OK) + Debug-Output "SCSI.INF: shelling DriversExist failed" + goto finish_InstallOption + endif + + ifstr(i) $($R0) == STATUS_CURRENT + else-ifstr(i) $($R0) == STATUS_NEW + set DoActualCopy = YES + else-ifstr(i) $($R0) == STATUS_USERCANCEL + Debug-Output "SCSI.INF: User cancelled SCSI installation" + goto finish_InstallOption + else + Debug-Output "SCSI.INF: Error reported in DriversExist routine in SUBROUTN.INF" + goto finish_InstallOption + endif + endif + + ifstr(i) $(DoActualCopy) == YES + + shell "subroutn.inf" DoAskSourceEx $(SrcDir) $(String2) + ifint $($ShellCode) != $(!SHELL_CODE_OK) + Debug-Output "SCSI.INF: shelling DoAskSourceEx failed" + goto finish_InstallOption + endif + + ifstr(i) $($R0) == STATUS_SUCCESSFUL + set SrcDir = $($R1) + ifstr(i) $($R2) != "" + set DrivesToFree = >($(DrivesToFree), $($R2)) + endif + else + Debug-Output "SCSI.INF: User cancelled asking source." + goto finish_InstallOption + endif + + install Install-AddCopyOption + ifstr(i) $(STF_INSTALL_OUTCOME) != "STF_SUCCESS" + Debug-Output "Adding SCSI files to copy list failed" + goto finish_InstallOption + endif + else + set DoCopy = NO + endif + + endif + + ifstr(i) $(DoCopy) == "YES" + read-syms ProgressCopy$($0) + install Install-DoCopyOption + ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_FAILURE" + Debug-Output "Copying files failed" + goto finish_InstallOption + else-ifstr(i) $(STF_INSTALL_OUTCOME) == "STF_USERQUIT" + set Status = STATUS_USERCANCEL + goto finish_InstallOption + endif + endif + + ifstr(i) $(DoConfig) == "YES" + ; + ; first run a privilege check on modifying the setup node + ; + + shell "registry.inf" CheckSetupModify + ifint $($ShellCode) != $(!SHELL_CODE_OK) + goto finish_InstallOption + endif + + ifstr(i) $($R0) != STATUS_SUCCESSFUL + goto finish_InstallOption + endif + + ; + ; then make a new SCSI entry, the entry is created automatically + ; enabled + ; + + set ServiceNode = $(MiniportDriver) + set ServiceBinary = System32\drivers\#(Files-ScsiMiniportDrivers, $(MiniportDriver), 2) + + set ServicesValues = { + + {Type, 0, $(!REG_VT_DWORD), $(Type) }, + + {Start, 0, $(!REG_VT_DWORD), $(Start) }, + + {Group, 0, $(!REG_VT_SZ), $(Group) }, + + {ErrorControl, 0, $(!REG_VT_DWORD), $(ErrorControl) }, + + {Tag, 0, $(!REG_VT_DWORD), $(Tag) }, + + {BinaryPathName, 0, $(!REG_VT_EXPAND_SZ), $(ServiceBinary) } + + } + set ParametersValues = "" + set DeviceValues = {} + set EventLogValues = { + + {EventMessageFile, 0, $(!REG_VT_EXPAND_SZ), $(EventMessageFile) }, + + {TypesSupported, 0, $(!REG_VT_DWORD), $(TypesSupported) } + + } + + shell "registry.inf" MakeServicesEntry $(ServiceNode) + + $(ServicesValues) + + $(ParametersValues) + + $(DeviceValues) + + $(EventLogValues) + + Parameters + + + + ifint $($ShellCode) != $(!SHELL_CODE_OK) + Debug-Output "Couldn't execute MakeServicesEntry in registry.inf" + goto finish_InstallOption + endif + + ifstr(i) $($R0) != STATUS_SUCCESSFUL + Debug-Output "MakeServicesEntry failed for SCSI" + goto finish_InstallOption + endif + + endif + + set Status = STATUS_SUCCESSFUL +finish_InstallOption = + + ForListDo $(DrivesToFree) + LibraryProcedure STATUS,$(!LIBHANDLE), DeleteNetConnection $($) "TRUE" + EndForListDo + + Return $(Status) + + +[Install-AddCopyOption] + + ; + ; Add the files to the copy list + ; + AddSectionKeyFileToCopyList Files-ScsiMiniportDrivers + + $(MiniportDriver) + + $(SrcDir) + + $(!STF_WINDOWSSYSPATH)\drivers + + exit + + +[Install-DoCopyOption] + + ; + ; Copy files in the copy list + ; + CopyFilesInCopyList + exit + +;------------------------------------------------------------------------- +; 4. DeInstallOption: +; +; FUNCTION: To remove files representing Option +; To remove the registry entry corresponding to the Option +; +; INPUT: $($0): Language to use +; $($1): OptionID to install +; +; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL | +; STATUS_NOLANGUAGE | +; STATUS_USERCANCEL | +; STATUS_FAILED +;------------------------------------------------------------------------- +[DeInstallOption] + ; + ; Set default values for + ; + set Status = STATUS_FAILED + ; + ; extract parameters + ; + set Option = $($1) + + ; + ; Check if the language requested is supported + ; + set LanguageList = ^(LanguagesSupported, 1) + Ifcontains(i) $($0) in $(LanguageList) + else + set Status = STATUS_NOLANGUAGE + goto finish_DeInstallOption + endif + read-syms Strings$($0) + + ; + ; check to see if Option is supported. + ; + + set OptionList = ^(Options, 0) + ifcontains $(Option) in $(OptionList) + else + goto finish_DeInstallOption + endif + set OptionList = "" + + ; + ; fetch details about option + ; + + set MiniportDriver = #(Options, $(Option), 1) + set MiniportFile = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2) + set FilePath = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile) + + ; + ; check to see if file is installed + ; if not give success + ; + + LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath) + ifstr(i) $(STATUS) == "NO" + set Status = STATUS_SUCCESSFUL + goto finish_DeInstallOption + endif + + shell "registry.inf" GetServicesEntryStart $(MiniportDriver) + ifstr(i) $($R0) != "STATUS_SUCCESSFUL" + ; this could happen if there is no start value or there is no + ; key, in which case the option is not installed + set Status = STATUS_SUCCESSFUL + goto finish_DeInstallOption + endif + + ifstr(i) $($R1) == $(!SERVICE_BOOT_START) + shell "subroutn.inf" SetupMessage $(!STF_LANGUAGE) "WARNING" $(String3) + ifstr(i) $($R0) != STATUS_SUCCESSFUL + goto do_removal + endif + ifstr(i) $($R1) == "CANCEL" + goto finish_DeInstallOption + endif + endif + +do_removal =+ + ; + ; disable the registry entry + ; + + shell "registry.inf" RemoveServicesEntry $(MiniportDriver) + ifint $($ShellCode) != $(!SHELL_CODE_OK) + Debug-Output "SCSI.INF: Failed to shell RemoveServicesEntry" + goto finish_DeInstallOption + endif + + ifstr(i) $($R0) != STATUS_SUCCESSFUL + Debug-Output "SCSI.INF: Failed to disable services entry" + goto finish_DeInstallOption + endif + + ; + ; we won't remove the file because we can only do so during the next boot. + ; if the user chooses to reinstall the same driver during this boot + ; he will still end up deleting the driver on next boot. if the file + ; should be deleted a warning should be put up saying that the user should + ; not try to reinstall the driver during this boot + ; + ; AddFileToDeleteList $(FilePath) + + set Status = STATUS_SUCCESSFUL + +finish_DeInstallOption =+ + return $(Status) + + +;------------------------------------------------------------------------- +; 5. GetInstalledOptions: +; +; FUNCTION: To find out the list of options which are installed +; +; INPUT: $($0): Language to Use +; +; OUTPUT: $($R0): STATUS: STATUS_SUCCESSFUL | +; STATUS_FAILED +; +; $($R1): List of options installed +; $($R2): Option installed Text List +;------------------------------------------------------------------------- +[GetInstalledOptions] + set Status = STATUS_FAILED + set InstalledOptions = {} + set InstalledOptionsText = {} + + ; + ; Check if the language requested is supported + ; + set LanguageList = ^(LanguagesSupported, 1) + Ifcontains(i) $($0) in $(LanguageList) + else + set Status = STATUS_NOLANGUAGE + goto finish_GetInstalledOptions + endif + + set OptionList = ^(Options, 0) + ForListDo $(OptionList) + set MiniportDriver = #(Options, $($), 1) + set MiniportFile = #(Files-ScsiMiniportDrivers, $(MiniportDriver), 2) + set FilePath = $(!STF_WINDOWSSYSPATH)"\drivers\"$(MiniportFile) + LibraryProcedure STATUS,$(!LIBHANDLE),CheckFileExistance $(FilePath) + ifstr(i) $(STATUS) == "YES" + shell "registry.inf" GetServicesEntryStart $(MiniportDriver) + ifint $($ShellCode) == $(!SHELL_CODE_OK) + ifstr(i) $($R0) == STATUS_SUCCESSFUL + ifstr(i) $($R1) != $(!SERVICE_DISABLED) + + set OptionText = #(OptionsText$($0), $($), 1) + set InstalledOptions = >($(InstalledOptions), $($)) + set InstalledOptionsText = >($(InstalledOptionsText), $(OptionText)) + + endif + endif + endif + endif + EndForListDo + set Status = STATUS_SUCCESSFUL +finish_GetInstalledOptions =+ + Return $(Status) $(InstalledOptions) $(InstalledOptionsText) + + +;************************************************************************** +; PROGRESS GUAGE VARIABLES +;************************************************************************** + +[ProgressCopyENG] + ProCaption = "Windows NT Setup" + ProCancel = "Cancel" + ProCancelMsg = "Windows NT is not correcly installed. Are you sure you want "+ + "to cancel copying files?" + ProCancelCap = "Setup Message" + ProText1 = "Copying:" + ProText2 = "To:" + +[StringsENG] + String1 = "SCSI Adapter" + String2 = "Please enter the full path to the OEM SCSI "+ + "Adapter files. Then choose Continue." + String3 = "The SCSI Adapter has been marked as a boot device. Removing "+ + "it may cause the system not to boot."$(!LF)$(!LF)"Are you sure "+ + "you want to remove the Adapter." + +[Source Media Descriptions] + 1 = "QLogic SCSI Software Diskette" , TAGFILE = qlscsi + +[Files-ScsiMiniportDrivers] +ql10wnt = 1,ql10wnt.sys , SIZE=36864 +ql10nt35 = 1,ql10nt35.sys , SIZE=36864 diff --git a/private/ntos/miniport/qlogic/qlisp.c b/private/ntos/miniport/qlogic/qlisp.c new file mode 100644 index 000000000..0d3991dfd --- /dev/null +++ b/private/ntos/miniport/qlogic/qlisp.c @@ -0,0 +1,3050 @@ +/************************************************************************/ +/* */ +/* Driver Name: QL10WNT.SYS - NT Miniport Driver for QLogic ISP1020 */ +/* */ +/* Source File Name: QLISP.C */ +/* */ +/* Function: Main driver module containing code for processing I/O */ +/* requests from NT and all code for interfacing to the */ +/* ISP1020 chip. */ +/* */ +/************************************************************************/ +/* */ +/* NOTICE */ +/* */ +/* COPYRIGHT 1994-1995 QLOGIC CORPORATION */ +/* ALL RIGHTS RESERVED */ +/* */ +/* This computer program is CONFIDENTIAL and a TRADE SECRET */ +/* of QLOGIC CORPORATION. The receipt or possesion of this */ +/* program does not convey any rights to reproduce or disclose */ +/* its contents, or to manufacture, use, or sell anything that */ +/* it may describe, in whole or in part, without the specific */ +/* written consent of QLOGIC CORPORATION. Any reproduction of */ +/* this program without the express written consent of QLOGIC */ +/* CORPORATION is a violation of the copyright laws and may */ +/* subject you to criminal prosecution. */ +/* */ +/************************************************************************/ +/* */ +/* Revision history: */ +/* */ +/* 1.00 2/23/94 TWT Initial version for NT Version 3.1 */ +/* */ +/* 1.01 5/2/94 TWT Fix interrupt sharing problem (set */ +/* InterruptMode to LevelSensitive) */ +/* */ +/* 1.02 5/6/94 TWT Force PCI bus master enabled */ +/* */ +/* 1.03 5/23/94 TWT Add conditional assembly for supporting */ +/* new features of NT Version 3.5, set bus */ +/* type to PCI and let SCSI port driver */ +/* get PCI configuration, support SCSI */ +/* IDs up to 15 (NT 3.5 driver only) */ +/* */ +/* 1.10 6/3/94 TWT Modify QLFindAdapter routine for NT 3.5 */ +/* to use NT service calls to access PCI */ +/* config space (this will allow driver to */ +/* operate on all PCI systems supported by */ +/* NT), modify QLFindAdapter routine for */ +/* NT 3.1 to support both methods of */ +/* accessing PCI config space */ +/* */ +/* 1.11 6/8/94 TWT Fix problem with accessing config space */ +/* on Opti chip set (can only read data */ +/* reg one time per write to address reg) */ +/* */ +/* 1.12 7/26/94 TWT Update RISC code to version 1.14 */ +/* */ +/* 1.13 8/17/94 TWT Set only 1 RISC retry and no delay */ +/* (NT 3.5 Disk Administrator problem) */ +/* */ +/* 2.00 8/11/94 TWT Modifications for the Chicago OS, add */ +/* QLAdapterState entry, remove path from */ +/* includes, modify NovramDelay to call */ +/* ScsiPortStallExecution, update NOVRAM */ +/* drive default parameters */ +/* */ +/* 2.01 8/25/94 TWT Replaced QLFindAdapter with code from */ +/* CHC, added support for SRB flag to */ +/* disable auto request sense (requires */ +/* RISC code version 1.15), add code to */ +/* QLAdapterState for returning control to */ +/* ROM BIOS on shutdown, check for passed */ +/* in InitiatorBusId, update RISC code to */ +/* version 1.15, add temporary conditional */ +/* assembly code for Chicago beta versions */ +/* not supporting ConfigInfo->SlotNumber */ +/* */ +/* 2.02 11/17/94 TWT Don't issue error log message for */ +/* selection timeout on Inquiry command, */ +/* restart RISC command queue after check */ +/* condition and auto-sense disabled, add */ +/* support for soft termination, add */ +/* support for 60 MHz adapters, fix bug */ +/* leaving tagged queueing disabled if */ +/* NVRAM not present or not programmed */ +/* */ +/* 2.03 11/28/94 TWT Update RISC code to version 1.16 */ +/* */ +/* 2.04 11/30/94 TWT Remove temporary code for pre-beta 2 */ +/* version of Chicago (SlotNumber is now */ +/* supported) */ +/* */ +/* 2.05 12/19/94 TWT Added reset delays to QLResetIsp to fix */ +/* problem on faster Alpha machines */ +/* */ +/* 2.06 1/4/95 TWT Set MaximumNumberOfTargets to 15 instead*/ +/* of 16 for Chicago Beta 2 (if passed in */ +/* value is 7) */ +/* */ +/* 2.07 1/6/95 TWT Add support for QLVER utility and */ +/* copyright string */ +/* */ +/* 2.08 2/7/95 TWT Update build and install scripts for */ +/* driver name change to match MS release, */ +/* modify init code to skip RISC code load */ +/* if newer version already loaded, update */ +/* RISC code to version 1.18, add driver */ +/* delay to match RISC SCSI reset delay, */ +/* cleanup unneeded test in MailboxCommand */ +/* */ +/* 2.09 3/28/95 TWT Update RISC code to version 1.22 */ +/* */ +/* 2.10 4/14/95 TWT Update RISC code to version 1.25 */ +/* */ +/* 2.11 4/27/95 TWT Update RISC code to version 1.27, add */ +/* software termination modification for */ +/* DEC boards with ISP1020A */ +/* */ +/* 2.12 5/5/95 TWT Fix problem with system hang when RISC */ +/* request queue full and SRB returned to */ +/* port driver with FALSE status (thanks */ +/* to Chao Chen for finding this problem) */ +/* */ +/* 2.13 5/9/95 TWT Renamed subroutine WaitQueueSpace to */ +/* CheckQueueSpace and modified to not wait*/ +/* for space in the RISC request queue, */ +/* modified QLStartIo to throttle back cmds*/ +/* from port driver when request queue is */ +/* nearly full, add delays to QLResetIsp */ +/* */ +/************************************************************************/ + + +// #define NT_VERSION_31 1 // If defined, compile for NT Version 3.1 + +#include "miniport.h" +#include "scsi.h" +#include "qlisp.h" + +#if DBG +#define QLPrint(arg) ScsiDebugPrint arg +#else +#define QLPrint(arg) +#endif + +// Name and version strings for QLVER utility + +CHAR CompanyName[] = "$$QLNAME$$" \ +"QLogic Corporation \0"; + +CHAR Version[] = "$$QLVER$$ 2.13\0"; + +// Copyright string + +CHAR QLogicCR[] = "Copyright (C) QLogic Corporation 1994-1995. All rights reserved."; + +/* External RISC code module definitions */ + +extern USHORT risc_code_version; +extern USHORT risc_code_addr01; +extern USHORT risc_code01[]; +extern USHORT risc_code_length01; + + +/************************************************************************/ +/* Driver SRB extension */ +/************************************************************************/ + +typedef struct _SRB_EXTENSION +{ + ULONG SrbExtensionFlags; +} SRB_EXTENSION, *PSRB_EXTENSION; + +#define SRB_EXT(x) ((PSRB_EXTENSION)(x->SrbExtension)) + +/* SrbExtensionFlags bit definitions */ + + +/************************************************************************/ +/* Driver logical unit extension */ +/************************************************************************/ + +typedef struct _HW_LUN_EXTENSION +{ + ULONG LunFlags; +} HW_LUN_EXTENSION, *PHW_LUN_EXTENSION; + +/* LunFlags bit definitions */ + +#define LFLG_INIT_COMPLETE 0x00000001 // completed initialization + + +/************************************************************************/ +/* Driver noncached memory extension (for DMA interface to ISP1020) */ +/************************************************************************/ + +typedef struct _NONCACHED_EXTENSION +{ + QUEUE_ENTRY RequestQueue[REQUEST_QUEUE_DEPTH]; + QUEUE_ENTRY ResponseQueue[RESPONSE_QUEUE_DEPTH]; +} NONCACHED_EXTENSION, *PNONCACHED_EXTENSION; + + +/************************************************************************/ +/* Driver device object extension */ +/************************************************************************/ + +typedef struct _HW_DEVICE_EXTENSION +{ + ULONG AdapterFlags; + PISP_REGS Adapter; // Address of the ISP + + // Request and Response queues and pointers + + PNONCACHED_EXTENSION NoncachedExtension; + ULONG ppRequestQueue; + ULONG ppResponseQueue; + PQUEUE_ENTRY pRequestQueue; + PQUEUE_ENTRY pResponseQueue; + USHORT request_in; + USHORT request_out; + USHORT response_out; + USHORT queue_space; + PQUEUE_ENTRY request_ptr; + PQUEUE_ENTRY response_ptr; + + // Configuration NOVRAM paramters + + UCHAR Config_Reg; + UCHAR Initiator_SCSI_Id :4; + UCHAR Host_Adapter_Enable :1; + UCHAR DisableLoadRiscCode :1; + UCHAR Bus_Reset_Delay; + UCHAR Retry_Count; + UCHAR Retry_Delay; + UCHAR ASync_Data_Setup_Time :4; + UCHAR REQ_ACK_Active_Negation :1; + UCHAR DATA_Active_Negation :1; + UCHAR Data_DMA_Burst_Enable :1; + UCHAR Cmd_DMA_Burst_Enable :1; + UCHAR Tag_Age_Limit; + UCHAR Termination_Low_Enable :1; + UCHAR Termination_High_Enable :1; + UCHAR PCMC_Burst_Enable :1; + UCHAR Sixty_MHz_Enable :1; + USHORT Selection_Timeout; + USHORT Max_Queue_Depth; + struct + { + UCHAR Capability; + UCHAR Execution_Throttle; + UCHAR Sync_Period; + UCHAR Sync_Offset :4; + UCHAR Device_Enable :1; + } Id[NUM_SCSI_IDS]; + + PSCSI_REQUEST_BLOCK WaitingSrb; +} HW_DEVICE_EXTENSION, *PHW_DEVICE_EXTENSION; + +/* AdapterFlags bit definitions */ + +#define AFLG_INIT_COMPLETE 0x00000001 // completed initialization +#define AFLG_TAGGED_QUEUING 0x00000002 // enable tagged queuing +#define AFLG_SEND_MARKER 0x00000004 // need to send marker to ISP +#define AFLG_SRB_WAITING 0x00000008 // SRB waiting for room in request Q + +/* Target "Capability" bit definitions */ + +#define CAP_STOP_QUEUE_ON_CHECK 0x02 +#define CAP_AUTO_REQ_SENSE 0x04 +#define CAP_TAGGED_QUEUING 0x08 +#define CAP_SYNC_TRANSFER 0x10 +#define CAP_WIDE_TRANSFER 0x20 + + +/* Read and write macros for ISP chip registers */ + +#define ISP_READ(ChipAddr,Register) ScsiPortReadPortUshort(&((ChipAddr)->Register)) +#define ISP_WRITE(ChipAddr,Register,Value) ScsiPortWritePortUshort(&((ChipAddr)->Register),(Value)) + +/* Table to map ISP completion status to SRB error status */ + +UCHAR CmpStsErrorMap[] = +{ + SRB_STATUS_SUCCESS, // 00h No error + SRB_STATUS_SELECTION_TIMEOUT, // 01h Incomplete transport (selection timeout) + SRB_STATUS_ERROR, // 02h DMA direction error + SRB_STATUS_ERROR, // 03h Transport error + SRB_STATUS_BUS_RESET, // 04h SCSI reset abort + SRB_STATUS_ABORTED, // 05h Aborted by system + SRB_STATUS_TIMEOUT, // 06h Timeout + SRB_STATUS_DATA_OVERRUN, // 07h Data overrun + SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 08h Command overrun + SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 09h Status overrun + SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 0Ah Bad message + SRB_STATUS_PHASE_SEQUENCE_FAILURE, // 0Bh No message out + SRB_STATUS_MESSAGE_REJECTED, // 0Ch Extended ID failed + SRB_STATUS_MESSAGE_REJECTED, // 0Dh IDE message failed + SRB_STATUS_MESSAGE_REJECTED, // 0Eh Abort message failed + SRB_STATUS_MESSAGE_REJECTED, // 0Fh Reject message failed + SRB_STATUS_MESSAGE_REJECTED, // 10h NOP message failed + SRB_STATUS_MESSAGE_REJECTED, // 11h Parity error message failed + SRB_STATUS_MESSAGE_REJECTED, // 12h Device reset message failed + SRB_STATUS_MESSAGE_REJECTED, // 13h ID message failed + SRB_STATUS_UNEXPECTED_BUS_FREE, // 14h Unexpected bus free + SRB_STATUS_DATA_OVERRUN, // 15h Data underrun + SRB_STATUS_ERROR, // 16h + SRB_STATUS_ERROR, // 17h + SRB_STATUS_ERROR, // 18h Transaction error 1 + SRB_STATUS_ERROR, // 19h Transaction error 2 + SRB_STATUS_ERROR // 1Ah Transaction error 3 +}; + +/* PCI Vendor ID and Device ID strings */ + +CHAR QLVendorId[4] = "1077"; // QLogic PCI Vendor ID +CHAR ISP1020DeviceId[4] = "1020"; // ISP1020 PCI Device ID + +USHORT findMethod = 1; // Method for scanning PCI config space + + +/* Functions passed to the OS-specific port driver */ + +ULONG QLFindAdapter(IN PVOID ServiceContext, IN PVOID Context, IN PVOID BusInformation, + IN PCHAR ArgumentString, IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again); + +BOOLEAN QLInitializeAdapter(IN PVOID ServiceContext); + +BOOLEAN QLInterruptServiceRoutine(IN PVOID ServiceContext); + +BOOLEAN QLResetScsiBus(IN PVOID ServiceContext, IN ULONG PathId); + +BOOLEAN QLStartIo(IN PVOID ServiceContext,IN PSCSI_REQUEST_BLOCK pSrb); + +BOOLEAN QLAdapterState(IN PVOID ServiceContext,IN PVOID Context,IN BOOLEAN SaveState); + +/* Internal mini-port driver functions */ + +ULONG FindAdapter_M1(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo); +ULONG FindAdapter_M2(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo); + +BOOLEAN QLResetIsp(IN PHW_DEVICE_EXTENSION pDevExt); + +BOOLEAN LoadRiscCode(IN PHW_DEVICE_EXTENSION pDevExt); + +BOOLEAN InitDeviceParameters(IN PHW_DEVICE_EXTENSION pDevExt, + IN PHW_LUN_EXTENSION pLunExt, IN PSCSI_REQUEST_BLOCK pSrb); + +BOOLEAN MailboxCommand(IN PHW_DEVICE_EXTENSION pDevExt, + USHORT *mbox_sts, UCHAR out_cnt, UCHAR in_cnt, + USHORT reg0, USHORT reg1, USHORT reg2, + USHORT reg3, USHORT reg4, USHORT reg5); + +VOID GetNovramParameters(IN PHW_DEVICE_EXTENSION pDevExt); + +BOOLEAN ReadAllNovram(IN PHW_DEVICE_EXTENSION pDevExt, UCHAR* buf); + +VOID ReadNovramWord(IN PHW_DEVICE_EXTENSION pDevExt, + USHORT addr, USHORT* ptr); +VOID NovramDelay(); + +BOOLEAN SendCommandToIsp(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb); + +VOID SetErrorStatus(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb, + PSTATUS_ENTRY pStsEntry); + +VOID QLLogError(IN PHW_DEVICE_EXTENSION pDevExt, IN PSCSI_REQUEST_BLOCK pSrb, + IN ULONG ErrorCode, IN ULONG UniqueId); + +BOOLEAN SendMarker(IN PHW_DEVICE_EXTENSION pDevExt); + +BOOLEAN CheckQueueSpace(IN PHW_DEVICE_EXTENSION pDevExt, USHORT slotcnt); + +VOID QLCleanupAfterReset(IN PHW_DEVICE_EXTENSION pDevExt); + + + +/************************************************************************/ +/* */ +/* DriverEntry */ +/* */ +/* Initial miniport driver entry routine called by NT. This routine */ +/* builds and returns to NT the HW_INITIALIZATION_DATA structure. */ +/* */ +/* Arguments: */ +/* */ +/* Driver Object is passed to ScsiPortInitialize() */ +/* */ +/* Return Value: */ +/* */ +/* Status from ScsiPortInitialize() */ +/* */ +/************************************************************************/ + +ULONG DriverEntry(IN PVOID DriverObject, IN PVOID Argument2) +{ + HW_INITIALIZATION_DATA hwInitializationData; + ULONG adapterCount; + ULONG i, status; + + QLPrint((1, "\nDriverEntry: entering\n")); + + // Zero out structure and set size of init data + + for (i=0; i<sizeof(HW_INITIALIZATION_DATA); i++) + { + ((PUCHAR)&hwInitializationData)[i] = 0; + } + hwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA); + + // Set driver entry points + + hwInitializationData.HwInitialize = QLInitializeAdapter; + hwInitializationData.HwStartIo = QLStartIo; + hwInitializationData.HwInterrupt = QLInterruptServiceRoutine; + hwInitializationData.HwFindAdapter = QLFindAdapter; + hwInitializationData.HwResetBus = QLResetScsiBus; + hwInitializationData.HwAdapterState = QLAdapterState; + +#ifdef NT_VERSION_31 + // Note: NT Version 3.1 rejects "PCIBus", set AdapterInterfaceType to "Isa" + + hwInitializationData.AdapterInterfaceType = Isa; +#else + hwInitializationData.AdapterInterfaceType = PCIBus; + hwInitializationData.VendorIdLength = 4; + hwInitializationData.VendorId = (PVOID)&QLVendorId; + hwInitializationData.DeviceIdLength = 4; + hwInitializationData.DeviceId = (PVOID)&ISP1020DeviceId; +#endif + + hwInitializationData.NumberOfAccessRanges = 1; + hwInitializationData.Reserved = 0; + hwInitializationData.MapBuffers = FALSE; + hwInitializationData.NeedPhysicalAddresses = TRUE; + hwInitializationData.TaggedQueuing = TRUE; + hwInitializationData.AutoRequestSense = TRUE; + hwInitializationData.MultipleRequestPerLu = TRUE; + hwInitializationData.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); + hwInitializationData.SpecificLuExtensionSize = sizeof(HW_LUN_EXTENSION); + hwInitializationData.SrbExtensionSize = sizeof(SRB_EXTENSION); + + adapterCount = 0; + status = ScsiPortInitialize(DriverObject, Argument2, &hwInitializationData, + &adapterCount); + + QLPrint((1, "DriverEntry: exiting, status = %lx\n", status)); + + return(status); +} + +#ifndef NT_VERSION_31 + +/************************************************************************/ +/* */ +/* QLFindAdapter NT Version 3.5 and above */ +/* */ +/* This function is called by ScsiPortInitialize to find the next */ +/* adapter and fill in the configuration information structure and */ +/* map the SCSI protocol chip for access. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* AdapterCount - Count of adapter I/O register slots tested */ +/* BusInformation - Unused */ +/* ArgumentString - Unused */ +/* ConfigInfo - Pointer to the configuration information */ +/* structure to be filled in */ +/* Again - Returns a request to call this function again */ +/* */ +/* Return Value: */ +/* */ +/* Returns a status value for the initialization */ +/* */ +/************************************************************************/ + +ULONG QLFindAdapter(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN PVOID BusInformation, IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + PACCESS_RANGE AccessRange; + ULONG retcode; + ULONG length; + + QLPrint((1, "QLFindAdapter: entering\n")); + + *Again = FALSE; + + // Get access range. + + AccessRange = &((*(ConfigInfo->AccessRanges))[0]); + + if (AccessRange->RangeLength != 0) + { + // BUGBUG - Currently, when scsiport scans the PCI bus and finds + // a SCSI adapter, it will not automatically enable the + // Bus Master bit in the PCI command register. We need + // to enable this for the adapter to function properly. + + PCI_COMMON_CONFIG pciBuffer; + + QLPrint((1, "QLFindAdapter: found ISP1020 at address %lx\n", AccessRange->RangeStart)); + QLPrint((1, "QLFindAdapter: BusInterruptLevel = %lx\n", ConfigInfo->BusInterruptLevel)); + + ScsiPortGetBusData(pDevExt, + PCIConfiguration, + ConfigInfo->SystemIoBusNumber, + ConfigInfo->SlotNumber, + &pciBuffer, + PCI_COMMON_HDR_LENGTH); + // + // Enable Bus Master bit + // + + pciBuffer.Command |= BUS_MASTER_ENABLE; + + // + // Zero bit 0 of the ROM address to take the chip + // out of the its reset state + // + + pciBuffer.u.type0.ROMBaseAddress &= 0xfffffffe; + + ScsiPortSetBusDataByOffset(pDevExt, + PCIConfiguration, + ConfigInfo->SystemIoBusNumber, + ConfigInfo->SlotNumber, + &pciBuffer, + 0, + PCI_COMMON_HDR_LENGTH); + + // Map I/O registers for adapter + + pDevExt->Adapter = ScsiPortGetDeviceBase(pDevExt, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + AccessRange->RangeStart, + AccessRange->RangeLength, + (BOOLEAN)!AccessRange->RangeInMemory); + if (pDevExt->Adapter == NULL) + { + QLPrint((1, "QLFindAdapter: Failed to map ISP registers\n")); + return(SP_RETURN_ERROR); + } + + // Reset ISP chip and read in NOVRAM parameters + + if (!QLResetIsp(pDevExt)) + { + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + return(SP_RETURN_ERROR); + } + + GetNovramParameters(pDevExt); + + // Check for disabled adapter + + if (!pDevExt->Host_Adapter_Enable) + { + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + return(SP_RETURN_ERROR); + } + + // Check for passed in SCSI ID and override NVRAM setting + + if (ConfigInfo->InitiatorBusId[0] == (CCHAR)SP_UNINITIALIZED_VALUE) + ConfigInfo->InitiatorBusId[0] = pDevExt->Initiator_SCSI_Id; + else + pDevExt->Initiator_SCSI_Id = ConfigInfo->InitiatorBusId[0]; + + // Fill in other port configuration information + + ConfigInfo->MaximumTransferLength = 0xFFFFFFFF; // unlimited + ConfigInfo->NumberOfPhysicalBreaks = MAX_SG_SEGMENTS - 1; + ConfigInfo->AlignmentMask = 0x00000003; + ConfigInfo->DmaWidth = 32; + ConfigInfo->NumberOfBuses = 1; + ConfigInfo->ScatterGather = TRUE; + ConfigInfo->Master = TRUE; + ConfigInfo->Dma32BitAddresses = TRUE; + if (!(pDevExt->AdapterFlags & AFLG_TAGGED_QUEUING)) + ConfigInfo->TaggedQueuing = FALSE; + ConfigInfo->BufferAccessScsiPortControlled = TRUE; + + // Work around for Chicago Beta 2 bug + + if (ConfigInfo->MaximumNumberOfTargets == 7) + ConfigInfo->MaximumNumberOfTargets = 15; + else + ConfigInfo->MaximumNumberOfTargets = 16; + + // Allocate a Noncached Extension request/response queues + + pDevExt->NoncachedExtension = ScsiPortGetUncachedExtension(pDevExt, + ConfigInfo, sizeof(NONCACHED_EXTENSION)); + + if (pDevExt->NoncachedExtension == NULL) + { + QLPrint((1, "QLFindAdapter: Failed to allocate noncached memory\n")); + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + return(SP_RETURN_ERROR); + } + + // Init virtual and physical queue addresses + + pDevExt->pRequestQueue = pDevExt->NoncachedExtension->RequestQueue; + pDevExt->pResponseQueue = pDevExt->NoncachedExtension->ResponseQueue; + pDevExt->ppRequestQueue = ScsiPortConvertPhysicalAddressToUlong( + ScsiPortGetPhysicalAddress(pDevExt, NULL, + pDevExt->NoncachedExtension->RequestQueue, &length)); + pDevExt->ppResponseQueue = ScsiPortConvertPhysicalAddressToUlong( + ScsiPortGetPhysicalAddress(pDevExt, NULL, + pDevExt->NoncachedExtension->ResponseQueue, &length)); + + retcode = SP_RETURN_FOUND; + *Again = TRUE; + } + else + { + // Stop searching for adapters + + retcode = SP_RETURN_NOT_FOUND; + *Again = FALSE; + } + + QLPrint((1, "QLFindAdapter: exiting, retcode = %lx\n", retcode)); + + return(retcode); +} +#endif + +#ifdef NT_VERSION_31 + +/************************************************************************/ +/* */ +/* QLFindAdapter NT Version 3.1 */ +/* */ +/* This function is called by ScsiPortInitialize to find the next */ +/* adapter and fill in the configuration information structure and */ +/* map the SCSI protocol chip for access. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* AdapterCount - Count of adapter I/O register slots tested */ +/* BusInformation - Unused */ +/* ArgumentString - Unused */ +/* ConfigInfo - Pointer to the configuration information */ +/* structure to be filled in */ +/* Again - Returns a request to call this function again */ +/* */ +/* Return Value: */ +/* */ +/* Returns a status value for the initialization */ +/* */ +/************************************************************************/ + +ULONG QLFindAdapter(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN PVOID BusInformation, IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + ULONG retcode; + ULONG length; + + QLPrint((1, "QLFindAdapter: entering\n")); + + *Again = FALSE; // preset no return call + + // Look for adapter, try both methods of accessing PCI config space + +find_adapter: + + if (findMethod == 1) + { + retcode = FindAdapter_M1(ServiceContext, AdapterCount, ConfigInfo); + } + else + { + retcode = FindAdapter_M2(ServiceContext, AdapterCount, ConfigInfo); + } + + if (retcode != SP_RETURN_FOUND) + { + if (findMethod == 1 && *AdapterCount == 0) + { + findMethod = 2; // Switch to method 2 + goto find_adapter; // Try again + } + } + else + { + // Found next adapter + // Map I/O registers for adapter + + pDevExt->Adapter = ScsiPortGetDeviceBase( + pDevExt, // HwDeviceExtension + ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType + ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber + (*ConfigInfo->AccessRanges)[0].RangeStart, + (ULONG)(sizeof(ISP_REGS)), // NumberOfBytes + TRUE); // InIoSpace + + if (pDevExt->Adapter == NULL) + { + QLPrint((1, "QLFindAdapter: Failed to map ISP registers.\n")); + return(SP_RETURN_ERROR); + } + + // Reset ISP chip and read in NOVRAM parameters + + if (!QLResetIsp(pDevExt)) + { + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + return(SP_RETURN_ERROR); + } + + GetNovramParameters(pDevExt); + + // Check for disabled adapter + + if (!pDevExt->Host_Adapter_Enable) + { + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + (*AdapterCount)++; // skip this adapter + goto find_adapter; // Try again + } + + // Check for passed in SCSI ID and override NVRAM setting + + if (ConfigInfo->InitiatorBusId[0] == (CCHAR)SP_UNINITIALIZED_VALUE) + ConfigInfo->InitiatorBusId[0] = pDevExt->Initiator_SCSI_Id; + else + pDevExt->Initiator_SCSI_Id = ConfigInfo->InitiatorBusId[0]; + + // Fill in other port configuration information + + ConfigInfo->MaximumTransferLength = 0xFFFFFFFF; // unlimited + ConfigInfo->NumberOfPhysicalBreaks = MAX_SG_SEGMENTS - 1; + ConfigInfo->AlignmentMask = 0x00000003; + ConfigInfo->DmaWidth = 32; + ConfigInfo->NumberOfBuses = 1; + ConfigInfo->ScatterGather = TRUE; + ConfigInfo->Master = TRUE; + ConfigInfo->Dma32BitAddresses = TRUE; + if (!(pDevExt->AdapterFlags & AFLG_TAGGED_QUEUING)) + ConfigInfo->TaggedQueuing = FALSE; + ConfigInfo->InterruptMode = LevelSensitive; // Set this for shared IRQ level + + // Allocate a Noncached Extension request/response queues + + pDevExt->NoncachedExtension = ScsiPortGetUncachedExtension( + pDevExt, ConfigInfo, sizeof(NONCACHED_EXTENSION)); + + if (pDevExt->NoncachedExtension == NULL) + { + QLPrint((1, "QLFindAdapter: Failed to allocate noncached memory\n")); + ScsiPortFreeDeviceBase(pDevExt, pDevExt->Adapter); + return(SP_RETURN_ERROR); + } + + // Init virtual and physical queue addresses + + pDevExt->pRequestQueue = pDevExt->NoncachedExtension->RequestQueue; + pDevExt->pResponseQueue = pDevExt->NoncachedExtension->ResponseQueue; + pDevExt->ppRequestQueue = ScsiPortConvertPhysicalAddressToUlong( + ScsiPortGetPhysicalAddress(pDevExt, NULL, + pDevExt->NoncachedExtension->RequestQueue, &length)); + pDevExt->ppResponseQueue = pDevExt->ppRequestQueue + + REQUEST_QUEUE_DEPTH * sizeof(QUEUE_ENTRY); + + (*AdapterCount)++; + *Again = TRUE; + } + + QLPrint((1, "QLFindAdapter: exiting, retcode = %lx\n", retcode)); + + return(retcode); +} + + +/************************************************************************/ +/* */ +/* FindAdapter_M1 NT Version 3.1 */ +/* */ +/* This function is called by QLFindAdapter to find the next */ +/* adapter using PCI configuration mechanism #1. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* AdapterCount - Count of adapter I/O register slots tested */ +/* ConfigInfo - Pointer to the configuration information */ +/* structure to be filled in */ +/* */ +/* Return Value: */ +/* */ +/* Returns a status value for the initialization */ +/* */ +/************************************************************************/ + +ULONG FindAdapter_M1(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + PPCI_CHIP_REGISTERS_M1 PciChip; + PPCI_REGS PciConfig = 0; + ULONG retcode = SP_RETURN_NOT_FOUND; + USHORT index, VendorId, DeviceId; + ULONG BusNum, DevNum; + ULONG ha_base; + ULONG RomBase; + ULONG cmd_reg; + ULONG dataread; + + // Map PCI chip registers + + PciChip = ScsiPortGetDeviceBase( + pDevExt, // HwDeviceExtension + ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType + ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber + ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_CONFIG_ADDRESS), + sizeof(PCI_CHIP_REGISTERS_M1), // NumberOfBytes + TRUE); // InIoSpace + + if (PciChip == NULL) + { + QLPrint((1, "FindAdapter_M1: Failed to map PCI chip registers.\n")); + return(SP_RETURN_ERROR); + } + + // Scan configuration space headers for next adapter + + for (index=0, BusNum=0; BusNum < PCI_MAXBUSNUM; BusNum++) + { + for (DevNum = 0; DevNum < PCI_MAXDEVNUM; DevNum++) + { + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->Vendor_Id))); + + dataread = ScsiPortReadPortUlong(&PciChip->Config_Data); + VendorId = (USHORT)dataread; + DeviceId = (USHORT)(dataread >> 16); + + if (VendorId == QLogic_VENDOR_ID && DeviceId == QLogic_DEVICE_ID) + { + if (index == *AdapterCount) + { + // Found next adapter + // Get base I/O address and interrupt level + + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->IO_Base_Address))); + ha_base = ScsiPortReadPortUlong(&PciChip->Config_Data) & 0xfffffffc; + + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->Interrupt_Line))); + ConfigInfo->BusInterruptLevel = + ScsiPortReadPortUlong(&PciChip->Config_Data) & 0x000000ff; + + QLPrint((1, "FindAdapter_M1: found ISP1020 at address %lx\n", ha_base)); + + // Fill in the access array information + + (*ConfigInfo->AccessRanges)[0].RangeStart = + ScsiPortConvertUlongToPhysicalAddress(ha_base); + (*ConfigInfo->AccessRanges)[0].RangeLength = sizeof(ISP_REGS); + (*ConfigInfo->AccessRanges)[0].RangeInMemory = FALSE; + + // Must clear bit 0 of ROM base address register + + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->ROM_Base_Address))); + RomBase = ScsiPortReadPortUlong(&PciChip->Config_Data); + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->ROM_Base_Address))); + ScsiPortWritePortUlong(&PciChip->Config_Data, (RomBase & 0xfffffffe)); + + // Make sure bus master enabled + + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->Command))); + cmd_reg = ScsiPortReadPortUlong(&PciChip->Config_Data); + ScsiPortWritePortUlong(&PciChip->Config_Address, + (PCI_ENABLE_CONFIG | BusNum << 16 | DevNum << 11 | + (ULONG)(&PciConfig->Command))); + ScsiPortWritePortUlong(&PciChip->Config_Data, (cmd_reg | BUS_MASTER_ENABLE)); + + retcode = SP_RETURN_FOUND; + goto find_exit; + } + index++; + } + } + } + +find_exit: + + // Disable PCI chip registers + + ScsiPortWritePortUlong(&PciChip->Config_Address, PCI_DISABLE_CONFIG); + ScsiPortFreeDeviceBase(pDevExt, PciChip); + + return(retcode); +} + + +/************************************************************************/ +/* */ +/* FindAdapter_M2 NT Version 3.1 */ +/* */ +/* This function is called by QLFindAdapter to find the next */ +/* adapter using PCI configuration mechanism #2. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* AdapterCount - Count of adapter I/O register slots tested */ +/* ConfigInfo - Pointer to the configuration information */ +/* structure to be filled in */ +/* */ +/* Return Value: */ +/* */ +/* Returns a status value for the initialization */ +/* */ +/************************************************************************/ + +ULONG FindAdapter_M2(IN PVOID ServiceContext, IN OUT PULONG AdapterCount, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + PPCI_CHIP_REGISTERS PciChip; + UCHAR config_reg; + ULONG retcode = SP_RETURN_NOT_FOUND; + PPCI_REGS PciConfig, PciSlot; + USHORT index, slot, VendorId, DeviceId; + ULONG ha_base; + USHORT RomBase; + USHORT cmd_reg; + + // Map PCI chip registers and enable configuration space + + PciChip = ScsiPortGetDeviceBase( + pDevExt, // HwDeviceExtension + ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType + ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber + ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_CONFIG), + sizeof(PCI_CHIP_REGISTERS), // NumberOfBytes + TRUE); // InIoSpace + + if (PciChip == NULL) + { + QLPrint((1, "FindAdapter_M2: Failed to map PCI chip registers.\n")); + return(SP_RETURN_ERROR); + } + + config_reg = ScsiPortReadPortUchar(&PciChip->pci_config); + ScsiPortWritePortUchar(&PciChip->pci_config, (UCHAR)(config_reg | PCI_ENABLE)); + + // Map PCI configuration space + + PciConfig = ScsiPortGetDeviceBase( + pDevExt, // HwDeviceExtension + ConfigInfo->AdapterInterfaceType, // AdapterInterfaceType + ConfigInfo->SystemIoBusNumber, // SystemIoBusNumber + ScsiPortConvertUlongToPhysicalAddress((ULONG)PCI_START), + sizeof(PCI_REGS) * PCI_SLOT_CNT, // NumberOfBytes + TRUE); // InIoSpace + + if (PciConfig == NULL) + { + QLPrint((1, "FindAdapter_M2: Failed to map PCI config space.\n")); + ScsiPortFreeDeviceBase(pDevExt, PciChip); + return(SP_RETURN_ERROR); + } + + // Scan configuration space headers for next adapter + + for (index=0, slot=0, PciSlot=PciConfig; slot<PCI_SLOT_CNT; slot++, PciSlot++) + { + VendorId = ScsiPortReadPortUshort(&PciSlot->Vendor_Id); + DeviceId = ScsiPortReadPortUshort(&PciSlot->Device_Id); + + if (VendorId == QLogic_VENDOR_ID && DeviceId == QLogic_DEVICE_ID) + { + if (index == *AdapterCount) + { + // Found next adapter + // Get base I/O address and interrupt level + + ha_base = ScsiPortReadPortUshort((PUSHORT)&PciSlot->IO_Base_Address) & 0xfffc; + ConfigInfo->BusInterruptLevel = + ScsiPortReadPortUchar(&PciSlot->Interrupt_Line); + + QLPrint((1, "FindAdapter_M2: found ISP1020 at address %lx\n", ha_base)); + + // Fill in the access array information + + (*ConfigInfo->AccessRanges)[0].RangeStart = + ScsiPortConvertUlongToPhysicalAddress(ha_base); + (*ConfigInfo->AccessRanges)[0].RangeLength = sizeof(ISP_REGS); + (*ConfigInfo->AccessRanges)[0].RangeInMemory = FALSE; + + // Must clear bit 0 of ROM base address register + + RomBase = ScsiPortReadPortUshort((PUSHORT)&PciSlot->ROM_Base_Address); + ScsiPortWritePortUshort((PUSHORT)&PciSlot->ROM_Base_Address, (USHORT)(RomBase & 0xfffe)); + + // Make sure bus master enabled + + cmd_reg = ScsiPortReadPortUshort(&PciSlot->Command); + ScsiPortWritePortUshort(&PciSlot->Command, (USHORT)(cmd_reg | BUS_MASTER_ENABLE)); + + retcode = SP_RETURN_FOUND; + break; + } + index++; + } + } + + // Disable configuration space + + ScsiPortWritePortUchar(&PciChip->pci_config, config_reg); + ScsiPortFreeDeviceBase(pDevExt, PciChip); + ScsiPortFreeDeviceBase(pDevExt, PciConfig); + + return(retcode); +} +#endif + + +/************************************************************************/ +/* */ +/* QLInitializeAdapter */ +/* */ +/* This function is called to initialize the adapter after boot or */ +/* after a power failure. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* Returns TRUE if initialization is complete */ +/* Returns FALSE if error */ +/* */ +/************************************************************************/ + +BOOLEAN QLInitializeAdapter(IN PVOID ServiceContext) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + USHORT mbox_sts[6]; + UCHAR *c_ptr; + USHORT i; + USHORT scsi_id; + USHORT ram_addr, ram_data; + USHORT running_version; + + QLPrint((1, "QLInitializeAdapter: entering\n")); + + // Check version of loaded RISC code, don't reload if same or newer version + // Must restart RISC firmware first + + if (MailboxCommand(pDevExt, mbox_sts, 2, 0, + MBOX_CMD_EXECUTE_FIRMWARE, + risc_code_addr01, + 0,0,0,0)) + { + // Get running RISC code version + + if (MailboxCommand(pDevExt, mbox_sts, 1, 3, + MBOX_CMD_ABOUT_FIRMWARE, + 0,0,0,0,0)) + { + // Compare running version to version linked with driver + + running_version = mbox_sts[1] << 10 | mbox_sts[2]; + + QLPrint((1, "QLInitializeAdapter: running RISC code version %x\n", running_version)); + QLPrint((1, "QLInitializeAdapter: driver RISC code version %x\n", risc_code_version)); + + if (risc_code_version <= running_version) + { + pDevExt->DisableLoadRiscCode = 1; + } + } + else + { + QLPrint((1, "QLInitializeAdapter: ABOUT FIRMWARE command failed\n")); + } + } + else + { + QLPrint((1, "QLInitializeAdapter: EXECUTE FIRMWARE command failed\n")); + } + + if (!pDevExt->DisableLoadRiscCode) + { + // Reset ISP chip + + if (!QLResetIsp(pDevExt)) + { + return(FALSE); + } + + // Must manually clear Burst Enable, chip reset not working correctly + + ISP_WRITE(pDevExt->Adapter, bus_config1, 0); + + // Load RISC code + + if (!LoadRiscCode(pDevExt)) + { + QLPrint((1, "QLInitializeAdapter: Load RISC code failed\n")); + return(FALSE); + } + + // Start ISP firmware + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 0, + MBOX_CMD_EXECUTE_FIRMWARE, + risc_code_addr01, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: EXECUTE FIRMWARE command failed\n")); + return(FALSE); + } + + QLPrint((1, "QLInitializeAdapter: RISC code loaded and started\n")); + } + else + { + QLPrint((1, "QLInitializeAdapter: RISC not reloaded\n")); + } + + // Set Bus Control Parameters + + ISP_WRITE(pDevExt->Adapter, bus_config1, + (USHORT)pDevExt->Config_Reg); + if (!MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_SET_BUS_CONTROL_PARAMETERS, + (USHORT)(pDevExt->Data_DMA_Burst_Enable << 1), + (USHORT)(pDevExt->Cmd_DMA_Burst_Enable << 1), + 0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET BUS CONTROL PARAMS cmd failed\n")); + return(FALSE); + } + + // Set ISP1020 clock rate + + if (pDevExt->Sixty_MHz_Enable) + { + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_CLOCK_RATE, + (USHORT)60, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET CLOCK RATE cmd failed\n")); + return(FALSE); + } + } + + // Set software controlled SCSI bus termination + // Must reset and enable termination PAL first + + for (i = 0, ram_addr = 0xFF00; i < 4; i++, ram_addr += 0x0010) + { + if (!MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_WRITE_RAM_WORD, + ram_addr, + (USHORT)0, + 0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: WRITE RAM WORD cmd failed\n")); + return(FALSE); + } + } + + if (pDevExt->Termination_High_Enable) + { + if (pDevExt->Termination_Low_Enable) + ram_addr = 0xFF00; + else + ram_addr = 0xFF40; + } + else + { + if (pDevExt->Termination_Low_Enable) + ram_addr = 0xFF80; + else + ram_addr = 0xFFC0; + } + ram_data = (USHORT)(pDevExt->Termination_High_Enable) << 1 | + (USHORT)(pDevExt->Termination_Low_Enable); + if (!MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_WRITE_RAM_WORD, + ram_addr, + ram_data, + 0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: WRITE RAM WORD cmd failed\n")); + return(FALSE); + } + + // Clear request queue area and initialize queue + + c_ptr = (UCHAR *)pDevExt->pRequestQueue; + for (i = 0; i < REQUEST_QUEUE_DEPTH * sizeof(QUEUE_ENTRY); i++) + *c_ptr++ = 0; + + pDevExt->queue_space = REQUEST_QUEUE_DEPTH - 1; + pDevExt->request_in = 0; + pDevExt->request_out = 0; + pDevExt->request_ptr = pDevExt->pRequestQueue; + + if (!MailboxCommand(pDevExt, mbox_sts, 5, 6, + MBOX_CMD_INIT_REQUEST_QUEUE, + REQUEST_QUEUE_DEPTH, + (USHORT)(pDevExt->ppRequestQueue >> 16), + (USHORT)(pDevExt->ppRequestQueue & 0xFFFF), + pDevExt->request_in, + 0)) + { + QLPrint((1, "QLInitializeAdapter: INIT REQUEST QUEUE cmd failed\n")); + return(FALSE); + } + + // Clear response queue area and initialize queue + + c_ptr = (UCHAR *)pDevExt->pResponseQueue; + for (i = 0; i < RESPONSE_QUEUE_DEPTH * sizeof(QUEUE_ENTRY); i++) + *c_ptr++ = 0; + + pDevExt->response_out = 0; + pDevExt->response_ptr = pDevExt->pResponseQueue; + + if (!MailboxCommand(pDevExt, mbox_sts, 6, 6, + MBOX_CMD_INIT_RESPONSE_QUEUE, + RESPONSE_QUEUE_DEPTH, + (USHORT)(pDevExt->ppResponseQueue >> 16), + (USHORT)(pDevExt->ppResponseQueue & 0xFFFF), + 0, + pDevExt->response_out)) + { + QLPrint((1, "QLInitializeAdapter: INIT RESPONSE QUEUE cmd failed\n")); + return(FALSE); + } + + // Set Initiator SCSI ID + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_INITIATOR_SCSI_ID, + (USHORT)pDevExt->Initiator_SCSI_Id, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET INITIATOR SCSI ID cmd failed\n")); + return(FALSE); + } + + // Set Selection Timeout + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_SELECTION_TIMEOUT, + (USHORT)pDevExt->Selection_Timeout, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET SELECTION TIMEOUT cmd failed\n")); + return(FALSE); + } + + // Disable retrys for autoconfigure + + if (!MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_SET_RETRY_COUNT, + 0,0, + 0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET RETRY COUNT cmd failed\n")); + return(FALSE); + } + + // Set Active Negation + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_ACTIVE_NEGATION_STATE, + (USHORT)((pDevExt->REQ_ACK_Active_Negation << 5) + + (pDevExt->DATA_Active_Negation << 4)), + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET ACTIVE NEGATION STATE cmd failed\n")); + return(FALSE); + } + + // Set Tag Age Limits + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_TAG_AGE_LIMIT, + pDevExt->Tag_Age_Limit, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET TAG AGE LIMIT cmd failed\n")); + return(FALSE); + } + + // Set Async Data Setup Time + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_SET_ASYNC_DATA_SETUP_TIME, + pDevExt->ASync_Data_Setup_Time, + 0,0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET ASYNC DATA SETUP TIME cmd failed\n")); + return(FALSE); + } + + // Set target parameters for doing SCSI autoconfigure + + for (scsi_id = 0; scsi_id < NUM_SCSI_IDS; scsi_id++) + { + if (!MailboxCommand(pDevExt, mbox_sts, 4, 4, + MBOX_CMD_SET_TARGET_PARAMETERS, + (USHORT)(scsi_id << 8), + (USHORT)(CAP_AUTO_REQ_SENSE << 8), + 0,0,0)) + { + QLPrint((1, "QLInitializeAdapter: SET TARGET PARAMETERS cmd failed\n")); + return(FALSE); + } + } + + // Reset SCSI bus + + QLResetScsiBus(pDevExt, 0); + + // Enable ISP interrupts + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT); + ISP_WRITE(pDevExt->Adapter, bus_sema, 0); + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT); + + QLPrint((1, "QLInitializeAdapter: exiting\n")); + + return( TRUE ); +} + + +/************************************************************************/ +/* */ +/* QLResetIsp */ +/* */ +/* This function is called to reset the ISP chip. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* Returns TRUE if reset completed OK */ +/* Returns FALSE if error */ +/* */ +/************************************************************************/ + +BOOLEAN QLResetIsp(IN PHW_DEVICE_EXTENSION pDevExt) +{ + USHORT i; + + // Reset ISP chip and disable BIOS + + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_SOFT_RESET); + + // Small delay after reset + + ScsiPortStallExecution(10); + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_RESET); + + // Small delay after reset + + ScsiPortStallExecution(10); + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_RELEASE); + + // Small delay after reset + + ScsiPortStallExecution(10); + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_WRITE_BIOS_ENABLE); + + // Small delay after reset + + ScsiPortStallExecution(10); + + // Wait for mailbox 0 to clear + + for (i = 0; i < 1000; i++) + { + if (ISP_READ(pDevExt->Adapter, mailbox0) == 0) + { + break; + } + } + if (ISP_READ(pDevExt->Adapter, mailbox0) != 0) + { + QLPrint((1, "QLResetIsp: Chip reset timeout\n")); + return(FALSE); + } + + // Check product ID of chip + + if (ISP_READ(pDevExt->Adapter, mailbox1) != PROD_ID_1 || + (ISP_READ(pDevExt->Adapter, mailbox2) != PROD_ID_2 && + ISP_READ(pDevExt->Adapter, mailbox2) != PROD_ID_2a) || + ISP_READ(pDevExt->Adapter, mailbox3) != PROD_ID_3 || + ISP_READ(pDevExt->Adapter, mailbox4) != PROD_ID_4) + { + QLPrint((1, "QLResetIsp: Failed chip product ID test\n")); + return(FALSE); + } + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* LoadRiscCode */ +/* */ +/* This function is called to load the RISC firmware. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* Returns TRUE if load completed OK */ +/* Returns FALSE if error */ +/* */ +/************************************************************************/ + +BOOLEAN LoadRiscCode(IN PHW_DEVICE_EXTENSION pDevExt) +{ + USHORT i, j; + USHORT RiscCodeAddr; + USHORT *pCode, *pBuffer; + USHORT mbox_sts[6]; + USHORT BufSize; + + // Use request/response queues buffer for loading RISC code + // (having trouble loading directly from driver code space?) + + BufSize = (REQUEST_QUEUE_DEPTH + RESPONSE_QUEUE_DEPTH) * sizeof(QUEUE_ENTRY); + pCode = risc_code01; + for (i = 0, RiscCodeAddr = risc_code_addr01; + i < risc_code_length01; + RiscCodeAddr += BufSize/2) + { + pBuffer = (USHORT *)pDevExt->pRequestQueue; + for (j = 0; j < BufSize/2 && i < risc_code_length01; j++, i++) + { + *pBuffer++ = *pCode++; + } + + if (!MailboxCommand(pDevExt, mbox_sts, 5, 5, + MBOX_CMD_LOAD_RAM, + RiscCodeAddr, + (USHORT)(pDevExt->ppRequestQueue >> 16), + (USHORT)(pDevExt->ppRequestQueue & 0xFFFF), + (USHORT)(BufSize / 2), + 0)) + { + QLPrint((1, "LoadRiscCode: LOAD RAM command failed\n")); + return(FALSE); + } + } + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* InitDeviceParameters */ +/* */ +/* This function is called to set target device parameters after */ +/* autoconfigure Inquiry commands are done */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* pLunExt - Pointer to lun extension */ +/* pSrb - Pointer to SCSI request block */ +/* */ +/* Return Value: */ +/* */ +/* Returns TRUE if completed OK */ +/* Returns FALSE if error */ +/* */ +/************************************************************************/ + +BOOLEAN InitDeviceParameters(IN PHW_DEVICE_EXTENSION pDevExt, + IN PHW_LUN_EXTENSION pLunExt, IN PSCSI_REQUEST_BLOCK pSrb) +{ + USHORT scsi_id; + USHORT mbox_sts[6]; + + + // If 1st call for this adapter, set retries and target parameters + + if (!(pDevExt->AdapterFlags & AFLG_INIT_COMPLETE)) + { + QLPrint((1, "InitDeviceParameters: set adapter init complete\n")); + + pDevExt->AdapterFlags |= AFLG_INIT_COMPLETE; + + // Reset target parameters from NOVRAM parameters + + for (scsi_id = 0; scsi_id < NUM_SCSI_IDS; scsi_id++) + { + if (!MailboxCommand(pDevExt, mbox_sts, 4, 4, + MBOX_CMD_SET_TARGET_PARAMETERS, + (USHORT)(scsi_id << 8), + (USHORT)(pDevExt->Id[scsi_id].Capability << 8), + (USHORT)((pDevExt->Id[scsi_id].Sync_Offset << 8) | + (pDevExt->Id[scsi_id].Sync_Period)), + 0,0)) + { + QLPrint((1, "InitDeviceParameters: SET TARGET PARAMS cmd failed\n")); + return(FALSE); + } + } + + // Set RETRY limits + + if (!MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_SET_RETRY_COUNT, + pDevExt->Retry_Count, + pDevExt->Retry_Delay, + 0,0,0)) + { + QLPrint((1, "InitDeviceParameters: SET RETRY COUNT cmd failed\n")); + return(FALSE); + } + } + + QLPrint((1, "InitDeviceParameters: set lun init complete\n")); + + pLunExt->LunFlags |= LFLG_INIT_COMPLETE; + + // Set device queue parameters + + if (!MailboxCommand(pDevExt, mbox_sts, 4, 4, + MBOX_CMD_SET_DEVICE_QUEUE_PARAMETERS, + (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun), + pDevExt->Max_Queue_Depth, + (USHORT)(pDevExt->Id[pSrb->TargetId].Execution_Throttle), + 0,0)) + { + QLPrint((1, "InitDeviceParameters: SET QUEUE PARAMS cmd failed\n")); + return(FALSE); + } + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* QLStartIo */ +/* */ +/* This function is called by the port driver to start execution */ +/* of an I/O request. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* pSrb - Supplies the SCSI request block to be started. */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - If the request can be accepted at this time */ +/* FALSE - If the request must be submitted later */ +/* */ +/************************************************************************/ + +BOOLEAN QLStartIo(IN PVOID ServiceContext, IN PSCSI_REQUEST_BLOCK pSrb) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + PHW_LUN_EXTENSION pLunExt; + USHORT mbox_sts[6]; + +/* + QLPrint((1, "QLStartIo: SRB function: %x", pSrb->Function)); + QLPrint((1, " flags: %lx", pSrb->SrbFlags)); + QLPrint((1, " cdb: %x\n", (USHORT)(pSrb->Cdb[0]))); +*/ + + switch (pSrb->Function) + { + case SRB_FUNCTION_EXECUTE_SCSI: + + // Get LUN extension pointer + + pLunExt = ScsiPortGetLogicalUnit(pDevExt, pSrb->PathId, + pSrb->TargetId, pSrb->Lun); + + // Finish up init stuff on 1st request after Inquiry commands + + if (!(pLunExt->LunFlags & LFLG_INIT_COMPLETE) && + pSrb->Cdb[0] != SCSIOP_INQUIRY) + { + InitDeviceParameters(pDevExt, pLunExt, pSrb); + } + + // Build request and send to ISP + + if (!SendCommandToIsp(pDevExt, pSrb)) + { + pDevExt->WaitingSrb = pSrb; + pDevExt->AdapterFlags |= AFLG_SRB_WAITING; + return(TRUE); // start command later + } + break; + + case SRB_FUNCTION_ABORT_COMMAND: + case SRB_FUNCTION_TERMINATE_IO: + + QLPrint((1, "QLStartIo: abort command function\n")); + + // Send abort command to ISP + + if (MailboxCommand(pDevExt, mbox_sts, 4, 4, + MBOX_CMD_ABORT, + (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun), + (USHORT)((ULONG)(pSrb->NextSrb) & 0x0000ffff), + (USHORT)((ULONG)(pSrb->NextSrb) >> 16 & 0x0000ffff), + 0,0)) + { + pSrb->SrbStatus = SRB_STATUS_SUCCESS; + } + else + { + QLPrint((1, "QLStartIo: ABORT cmd failed\n")); + pSrb->SrbStatus = SRB_STATUS_ABORT_FAILED; + } + + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + break; + + case SRB_FUNCTION_RESET_DEVICE: + + QLPrint((1, "QLStartIo: reset device function\n")); + + // Send abort target command to ISP + + if (MailboxCommand(pDevExt, mbox_sts, 3, 3, + MBOX_CMD_ABORT_TARGET, + (USHORT)((USHORT)pSrb->TargetId << 8), + (USHORT)pDevExt->Bus_Reset_Delay, + 0,0,0)) + { + pSrb->SrbStatus = SRB_STATUS_SUCCESS; + } + else + { + QLPrint((1, "QLStartIo: ABORT TARGET cmd failed\n")); + pSrb->SrbStatus = SRB_STATUS_ERROR; + } + + // Send marker to unlock queues + + if (!SendMarker(pDevExt)) + { + pDevExt->AdapterFlags |= AFLG_SEND_MARKER; + } + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + break; + + case SRB_FUNCTION_RESET_BUS: + + QLPrint((1, "QLStartIo: reset bus function\n")); + + // Reset SCSI bus and send marker + + if (QLResetScsiBus(pDevExt, 0)) + { + pSrb->SrbStatus = SRB_STATUS_SUCCESS; + } + else + { + pSrb->SrbStatus = SRB_STATUS_ERROR; + } + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + break; + + default: + + QLPrint((1, "QLStartIo: unsupported function %x\n", pSrb->Function)); + + // Unsupported function code, complete request with error status + + pSrb->SrbStatus = SRB_STATUS_INVALID_REQUEST; + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + break; + } + + // Request next command + + if (pDevExt->queue_space > 5) + { + ScsiPortNotification(NextLuRequest, pDevExt, pSrb->PathId, + pSrb->TargetId, pSrb->Lun); + } + else + { + ScsiPortNotification(NextRequest, pDevExt); + } + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* SendCommandToIsp */ +/* */ +/* This function is called by QLStartIo to build an ISP command */ +/* entry and pass it to the ISP for execution. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* pSrb - Supplies the SCSI request block to be started. */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - If command passed to ISP */ +/* FALSE - If no ISP request slot available */ +/* */ +/************************************************************************/ + +BOOLEAN SendCommandToIsp(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb) +{ + PCOMMAND_ENTRY pCmdEntry; + USHORT i, segmentCnt; + USHORT controlFlags = 0; + ULONG transferCnt = pSrb->DataTransferLength; + PVOID dataPointer = pSrb->DataBuffer; + ULONG length; + + // Send a Marker to ISP if needed + + if (pDevExt->AdapterFlags & AFLG_SEND_MARKER) + { + if (!SendMarker(pDevExt)) + { + return(FALSE); // Error sending marker + } + } + + // Disable ISP interrupts + + ISP_WRITE(pDevExt->Adapter, bus_icr, 0); + + // Check available request slots + + if (MAX_CONT_ENTRYS + 1 > pDevExt->queue_space) + { + if (!CheckQueueSpace(pDevExt, MAX_CONT_ENTRYS + 1)) + { + ISP_WRITE(pDevExt->Adapter, bus_icr, + ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT); + return(FALSE); // No queue space + } + } + + // Get pointer to the queue entry for the command + + pCmdEntry = (PCOMMAND_ENTRY)pDevExt->request_ptr; + + // Advance request queue pointer + + if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1)) + { + pDevExt->request_in = 0; + pDevExt->request_ptr = pDevExt->pRequestQueue; + } + else + { + pDevExt->request_in++; + pDevExt->request_ptr++; + } + pDevExt->queue_space--; + + // Setup request to send to ISP + + pCmdEntry->hdr.entry_type = ET_COMMAND; + pCmdEntry->hdr.entry_cnt = 1; // start with 1 + pCmdEntry->hdr.flags = 0; + pCmdEntry->hdr.sys_def_1 = 0; + + pCmdEntry->handle = (ULONG)pSrb; + pCmdEntry->target_id = pSrb->TargetId; + pCmdEntry->target_lun = pSrb->Lun; + pCmdEntry->reserved = 0; + + // Set command timeout value + + if (pSrb->TimeOutValue > 65535 || pSrb->TimeOutValue == 0) + { + pCmdEntry->time_out = 0; + } + else + { + pCmdEntry->time_out = (USHORT)(pSrb->TimeOutValue + 1); + } + + // Setup control flags + + if (pSrb->SrbFlags & SRB_FLAGS_DATA_IN) + { + controlFlags = CF_READ; + } + if (pSrb->SrbFlags & SRB_FLAGS_DATA_OUT) + { + controlFlags = CF_WRITE; + } + + if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_DISCONNECT) + { + controlFlags |= CF_NO_DISCONNECTS; + } + + if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) + { + controlFlags |= CF_NO_REQUEST_SENSE; + } + + if ((pSrb->SrbFlags & SRB_FLAGS_QUEUE_ACTION_ENABLE) && + (pDevExt->Id[pSrb->TargetId].Capability & CAP_TAGGED_QUEUING)) + { + if (pSrb->QueueAction == SRB_SIMPLE_TAG_REQUEST) + controlFlags |= CF_SIMPLE_TAG; + else if (pSrb->QueueAction == SRB_HEAD_OF_QUEUE_TAG_REQUEST) + controlFlags |= CF_HEAD_TAG; + else + controlFlags |= CF_ORDERED_TAG; + } + + pCmdEntry->control_flags = controlFlags; + + // Move SCSI CDB + + pCmdEntry->cdb_length = pSrb->CdbLength; + for (i = 0; i < pCmdEntry->cdb_length; i++) + { + pCmdEntry->cdb[i] = pSrb->Cdb[i]; + } + + // Setup data segments + + for (segmentCnt = 0; transferCnt && segmentCnt < 4; segmentCnt++) + { + pCmdEntry->dseg[segmentCnt].base = + ScsiPortConvertPhysicalAddressToUlong( + ScsiPortGetPhysicalAddress(pDevExt, pSrb, dataPointer, &length)); + if (length > transferCnt) + { + length = transferCnt; + } + pCmdEntry->dseg[segmentCnt].count = length; + transferCnt -= length; + dataPointer = (PUCHAR)dataPointer + length; + } + + while (transferCnt) + { + PCONTINUATION_ENTRY pContEntry; + + // Get ptr to next queue entry for command and bump entry count + + pContEntry = (PCONTINUATION_ENTRY)pDevExt->request_ptr; + + pCmdEntry->hdr.entry_cnt++; + + // Advance request queue pointer + + if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1)) + { + pDevExt->request_in = 0; + pDevExt->request_ptr = pDevExt->pRequestQueue; + } + else + { + pDevExt->request_in++; + pDevExt->request_ptr++; + } + pDevExt->queue_space--; + + // Setup header + + pContEntry->hdr.entry_type = ET_CONTINUATION; + pContEntry->hdr.entry_cnt = 1; // hopefully RISC doesn't need total here + pContEntry->hdr.flags = EF_CONTINUATION; + pContEntry->hdr.sys_def_1 = 0; + + // Fill in data segments + + for (i = 0; transferCnt && i < 7; i++, segmentCnt++) + { + pContEntry->dseg[i].base = + ScsiPortConvertPhysicalAddressToUlong( + ScsiPortGetPhysicalAddress(pDevExt, pSrb, dataPointer, &length)); + if (length > transferCnt) + { + length = transferCnt; + } + pContEntry->dseg[i].count = length; + transferCnt -= length; + dataPointer = (PUCHAR)dataPointer + length; + } + } + pCmdEntry->segment_cnt = segmentCnt; + + // Tell ISP it's got a new I/O request + + ISP_WRITE(pDevExt->Adapter, mailbox4, pDevExt->request_in); + + // Enable ISP interrupts + + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT); + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* QLInterruptServiceRoutine */ +/* */ +/* This routine is the interrupt service routine for the ISP1020. */ +/* The response queue is checked for completed commands. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - Indicates that an interrupt was found. */ +/* FALSE - Indicates the device was not interrupting. */ +/* */ +/************************************************************************/ + +BOOLEAN QLInterruptServiceRoutine(PVOID ServiceContext) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + PSCSI_REQUEST_BLOCK pSrb; + USHORT response_in; + PSTATUS_ENTRY pStsEntry; + USHORT status; + + +// QLPrint((1, "ISR: Entering, pDevExt = %lx\n", (ULONG)pDevExt)); + + if (!(ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT)) + { + // QLPrint((1, "ISR: spurious interrupt?\n")); + return(FALSE); // not my interrupt + } + + // Loop to process all responses from ISP + + do + { + // Check for async mailbox event + + if (ISP_READ(pDevExt->Adapter, bus_sema) & BUS_SEMA_LOCK) + { + // Check mailbox status + + status = ISP_READ(pDevExt->Adapter, mailbox0); + switch (status) + { + case MBOX_ASTS_SCSI_BUS_RESET: + QLPrint((1, "ISR: SCSI bus reset detected\n")); + QLCleanupAfterReset(pDevExt); + break; + + case MBOX_ASTS_TIMEOUT_RESET: + QLPrint((1, "ISR: command timeout reset\n")); + QLCleanupAfterReset(pDevExt); + break; + + default: + QLPrint((1, "ISR: Unexpected MailBox Response: %x", status)); + QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox1))); + QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox2))); + QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox3))); + QLPrint((1, " %x", ISP_READ(pDevExt->Adapter, mailbox4))); + QLPrint((1, " %x\n", ISP_READ(pDevExt->Adapter, mailbox5))); + } + + QLLogError(pDevExt, NULL, SP_INTERNAL_ADAPTER_ERROR, (ULONG)status); + + // Clear the semaphore lock + + ISP_WRITE(pDevExt->Adapter, bus_sema, 0); + } + + // Get current "response in" pointer + + response_in = ISP_READ(pDevExt->Adapter, mailbox5); + + // Clear risc interrupt + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT); + + // Process all responses from response queue + + while (pDevExt->response_out != response_in) + { + // Get pointer to next response entry + + pStsEntry = (PSTATUS_ENTRY)pDevExt->response_ptr; + + // Advance pointers for next entry + + if (pDevExt->response_out == (RESPONSE_QUEUE_DEPTH - 1)) + { + pDevExt->response_out = 0; + pDevExt->response_ptr = pDevExt->pResponseQueue; + } + else + { + pDevExt->response_out++; + pDevExt->response_ptr++; + } + + // Verify we have a valid Status queue entry + + if (pStsEntry->hdr.entry_type != ET_STATUS || + pStsEntry->hdr.flags & EF_ERROR_MASK) + { + QLPrint((1, "ISR - Invalid Status queue entry\n")); + } + + // Set SRB pointer from queue entry handle + + pSrb = (PSCSI_REQUEST_BLOCK)pStsEntry->handle; + + // Check for normal completion + + if (pStsEntry->completion_status == SCS_COMPLETE && + pStsEntry->scsi_status == SCSISTAT_GOOD) + { + pSrb->SrbStatus = SRB_STATUS_SUCCESS; + pSrb->ScsiStatus = SCSISTAT_GOOD; + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + } + + // Error handling + + else + { + // Convert ISP/SCSI error status to SRB error status + + SetErrorStatus(pDevExt, pSrb, pStsEntry); + + // Looks like retries are handled at a higher level + // Just return the error status (and sense data) + + QLPrint((1, "ISR: Request completed with error = %x\n", pSrb->SrbStatus)); + + if (pSrb->SrbStatus == SRB_STATUS_DATA_OVERRUN) + { + pSrb->DataTransferLength -= pStsEntry->residual; + } + ScsiPortNotification(RequestComplete, pDevExt, pSrb); + } + } + + // Done with responses, update the ISP + + ISP_WRITE(pDevExt->Adapter, mailbox5, pDevExt->response_out); + + } while (ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT); + + // Check for waiting SRB and try to start it again + + if (pDevExt->AdapterFlags & AFLG_SRB_WAITING) + { + pSrb = pDevExt->WaitingSrb; + if (SendCommandToIsp(pDevExt, pSrb)) + { + // Command queued OK this time, notify port driver + + pDevExt->AdapterFlags &= ~AFLG_SRB_WAITING; + ScsiPortNotification(NextLuRequest, pDevExt, pSrb->PathId, + pSrb->TargetId, pSrb->Lun); + } + } + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* SetErrorStatus */ +/* */ +/* This routine is called by the interrupt service routine to */ +/* convert an error status from the ISP into a SRB error status. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* pSrb - Pointer to SRB */ +/* pStsEntry - Pointer to status entry from the ISP */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID SetErrorStatus(PHW_DEVICE_EXTENSION pDevExt, PSCSI_REQUEST_BLOCK pSrb, + PSTATUS_ENTRY pStsEntry) +{ + ULONG length; + USHORT mbox_sts[6]; + + QLPrint((1, "ISR: completion sts=%x", pStsEntry->completion_status)); + QLPrint((1, " SCSI ID=%x", pSrb->TargetId)); + QLPrint((1, " SCSI sts=%x", pStsEntry->scsi_status)); + QLPrint((1, " sense key=%x\n", (USHORT)(pStsEntry->req_sense_data[2]))); + + // Convert ISP completion status to SRB error code + + if (pStsEntry->completion_status != SCS_COMPLETE) + { + if (pStsEntry->completion_status < sizeof(CmpStsErrorMap)) + { + pSrb->SrbStatus = CmpStsErrorMap[pStsEntry->completion_status]; + } + else + { + pSrb->SrbStatus = SRB_STATUS_ERROR; + } + if (pStsEntry->completion_status == SCS_RESET_OCCURRED || + pStsEntry->completion_status == SCS_TIMEOUT) + { + QLCleanupAfterReset(pDevExt); + } + + // Log error (if not data underrun and not Inquiry selection timeout) + + if (pSrb->SrbStatus != SRB_STATUS_DATA_OVERRUN && + (pStsEntry->completion_status != SCS_INCOMPLETE || + pSrb->Cdb[0] != SCSIOP_INQUIRY)) + { + QLLogError(pDevExt, pSrb, SP_INTERNAL_ADAPTER_ERROR, + (ULONG)pStsEntry->completion_status); + } + } + + // Handle SCSI error status, return sense data + + else + { + // Return scsi status + + pSrb->ScsiStatus = (UCHAR)pStsEntry->scsi_status; + pSrb->SrbStatus = SRB_STATUS_ERROR; + + switch(pStsEntry->scsi_status) + { + case SCSISTAT_CHECK_CONDITION: + + // Return request sense data + + if ((pStsEntry->state_flags & SS_GOT_SENSE) && + !(pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) && + pSrb->SenseInfoBufferLength) + { + + QLPrint((1, "ISR: Returning sense data\n")); + + if (pStsEntry->req_sense_length > pSrb->SenseInfoBufferLength) + length = (ULONG)(pSrb->SenseInfoBufferLength); + else + length = (ULONG)(pStsEntry->req_sense_length); + ScsiPortMoveMemory(pSrb->SenseInfoBuffer, + pStsEntry->req_sense_data, length); + pSrb->SenseInfoBufferLength = (UCHAR)length; + pSrb->SrbStatus |= SRB_STATUS_AUTOSENSE_VALID; + } + + // If check condition and autosense disabled, need to + // restart command queue + + if (pSrb->SrbFlags & SRB_FLAGS_DISABLE_AUTOSENSE) + { + // Restart RISC command queue + + QLPrint((1, "ISR: Restart RISC queue\n")); + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 3, + MBOX_CMD_START_QUEUE, + (USHORT)(((USHORT)(pSrb->TargetId) << 8) | pSrb->Lun), + 0,0,0,0)) + { + QLPrint((1, "ISR: START QUEUE command failed\n")); + } + } + break; + } + } +} + + +/************************************************************************/ +/* */ +/* QLLogError */ +/* */ +/* This routine is called to log an error to the system. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* pSrb - Supplies pointer to SRB or NULL if no SRB */ +/* ErrorCode - Supplies the error code to log with the error */ +/* UniqueId - Supplies the unique error identifier */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID QLLogError(IN PHW_DEVICE_EXTENSION pDevExt, IN PSCSI_REQUEST_BLOCK pSrb, + IN ULONG ErrorCode, IN ULONG UniqueId) +{ + + QLPrint((1, "QLLogError called\n")); + + if (pSrb == NULL) + { + ScsiPortLogError( + pDevExt, // HwDeviceExtension + NULL, // Srb + 0, // PathId + 0, // TargetId + 0, // Lun + ErrorCode, // ErrorCode + UniqueId // UniqueId + ); + } + else + { + ScsiPortLogError( + pDevExt, // HwDeviceExtension + pSrb, // Srb + pSrb->PathId, // PathId + pSrb->TargetId, // TargetId + pSrb->Lun, // Lun + ErrorCode, // ErrorCode + UniqueId // UniqueId + ); + } +} + + +/************************************************************************/ +/* */ +/* MailboxCommand */ +/* */ +/* This routine issues a mailbox command and waits for completion */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* TRUE if command completed OK */ +/* FALSE if error */ +/* */ +/************************************************************************/ + +BOOLEAN MailboxCommand(IN PHW_DEVICE_EXTENSION pDevExt, + USHORT *mbox_sts, UCHAR out_cnt, UCHAR in_cnt, + USHORT reg0, USHORT reg1, USHORT reg2, + USHORT reg3, USHORT reg4, USHORT reg5) +{ + ULONG waitcnt; + USHORT retrycnt; + USHORT controlReg; + +/* + QLPrint((1, " MailboxCommand %x", reg0)); + QLPrint((1, " %x", reg1)); + QLPrint((1, " %x", reg2)); + QLPrint((1, " %x", reg3)); + QLPrint((1, " %x", reg4)); + QLPrint((1, " %x\n", reg5)); +*/ + + // Disable adapter interrupts + + controlReg = ISP_READ(pDevExt->Adapter, bus_icr); + if (controlReg & ICR_ENABLE_ALL_INTS) + { + ISP_WRITE(pDevExt->Adapter, bus_icr, 0); + } + + // Use loop to retry mailbox command if busy status returned + + retrycnt = 16; // retry a few times if busy + do + { + // Make sure host interrupt is clear + + waitcnt = 10000; // wait a little bit if necessary + while (ISP_READ(pDevExt->Adapter, hccr) & HCCR_HOST_INT) + { + if (waitcnt-- == 0) + { + QLPrint((1, "MailboxCommand: host interrupt timeout\n")); + ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg); + return(FALSE); + } + } + + // Load data to the mailbox registers + + switch (out_cnt) + { + case 6: ISP_WRITE(pDevExt->Adapter, mailbox5, reg5); + case 5: if (reg0 != MBOX_CMD_INIT_RESPONSE_QUEUE) + ISP_WRITE(pDevExt->Adapter, mailbox4, reg4); + case 4: ISP_WRITE(pDevExt->Adapter, mailbox3, reg3); + case 3: ISP_WRITE(pDevExt->Adapter, mailbox2, reg2); + case 2: ISP_WRITE(pDevExt->Adapter, mailbox1, reg1); + case 1: ISP_WRITE(pDevExt->Adapter, mailbox0, reg0); + } + + // Wake up the ISP + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_SET_HOST_INT); + + // Wait for command to complete + + waitcnt = 100000; + while (!(ISP_READ(pDevExt->Adapter, bus_isr) & BUS_ISR_RISC_INT) || + !(ISP_READ(pDevExt->Adapter, bus_sema) & BUS_SEMA_LOCK)) + { + if (waitcnt-- == 0) + { + QLPrint((1, "MailboxCommand: cmd completion timeout\n")); + ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg); + return(FALSE); + } + } + + // Save away status registers + + mbox_sts[0] = ISP_READ(pDevExt->Adapter, mailbox0); + switch (in_cnt) + { + case 6: mbox_sts[5] = ISP_READ(pDevExt->Adapter, mailbox5); + case 5: if (reg0 != MBOX_CMD_INIT_RESPONSE_QUEUE) + mbox_sts[4] = ISP_READ(pDevExt->Adapter, mailbox4); + case 4: mbox_sts[3] = ISP_READ(pDevExt->Adapter, mailbox3); + case 3: mbox_sts[2] = ISP_READ(pDevExt->Adapter, mailbox2); + case 2: mbox_sts[1] = ISP_READ(pDevExt->Adapter, mailbox1); + } + + // Clear the semaphore lock + + ISP_WRITE(pDevExt->Adapter, bus_sema, 0); + + // Clear interrupt + + ISP_WRITE(pDevExt->Adapter, hccr, HCCR_CMD_CLEAR_RISC_INT); + + // Check status from ISP + + switch (mbox_sts[0]) + { + case MBOX_STS_BUSY: + QLPrint((1, "MailboxCommand: ISP busy\n")); + break; // retry command + + case MBOX_STS_COMMAND_COMPLETE: + ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg); + return(TRUE); // return good status + + case MBOX_ASTS_SCSI_BUS_RESET: + pDevExt->AdapterFlags |= AFLG_SEND_MARKER; + QLPrint((1, "MailboxCommand: ISP SCSI bus RESET seen\n")); + break; // retry command + + default: + QLPrint((1, "MailboxCommand: error status = %lx\n", mbox_sts[0])); + ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg); + QLLogError(pDevExt, NULL, SP_INTERNAL_ADAPTER_ERROR, + (ULONG)mbox_sts[0]); + return(FALSE); // return error status + } + } while (retrycnt--); + + QLPrint((1, "MailboxCommand: busy timeout\n")); + ISP_WRITE(pDevExt->Adapter, bus_icr, controlReg); + return(FALSE); +} + + +/************************************************************************/ +/* */ +/* SendMarker */ +/* */ +/* This call sends a Marker packet to the ISP */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - marker sent */ +/* FALSE - no slot in request queue */ +/* */ +/************************************************************************/ + +BOOLEAN SendMarker(IN PHW_DEVICE_EXTENSION pDevExt) +{ + PMARKER_ENTRY pMarkEntry; + + // Disable ISP interrupts + + ISP_WRITE(pDevExt->Adapter, bus_icr, 0); + + // Check available queue space + + if (!CheckQueueSpace(pDevExt, 1)) + { + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT); + return(FALSE); // No queue space, return error + } + + // Reset the flag so we don't send another marker + + pDevExt->AdapterFlags &= ~AFLG_SEND_MARKER; + + // Get pointer to the queue entry for the marker + + pMarkEntry = (PMARKER_ENTRY)pDevExt->request_ptr; + + // Move the internal pointers for the request queue + + if (pDevExt->request_in == (REQUEST_QUEUE_DEPTH - 1)) + { + pDevExt->request_in = 0; + pDevExt->request_ptr = pDevExt->pRequestQueue; + } + else + { + pDevExt->request_in++; + pDevExt->request_ptr++; + } + + // Put the marker in the request queue + + pMarkEntry->hdr.entry_type = ET_MARKER; + pMarkEntry->hdr.entry_cnt = 1; + pMarkEntry->hdr.flags = 0; + pMarkEntry->hdr.sys_def_1 = 0; + pMarkEntry->reserved0 = 0; + pMarkEntry->target_id = 0; + pMarkEntry->target_lun = 0; + pMarkEntry->reserved1 = 0; + pMarkEntry->modifier = 2; + + // Tell ISP it's got a new I/O request + + ISP_WRITE(pDevExt->Adapter, mailbox4, pDevExt->request_in); + + // One less I/O slot + + pDevExt->queue_space--; + + // Enable ISP interrupts + + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_ENABLE_ALL_INTS | ICR_ENABLE_RISC_INT); + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* CheckQueueSpace */ +/* */ +/* This call checks if enough request queue slots are available */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* slotcnt - number of needed slots */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - request slots are available */ +/* FALSE - request slots not available */ +/* */ +/************************************************************************/ + +BOOLEAN CheckQueueSpace(IN PHW_DEVICE_EXTENSION pDevExt, USHORT slotcnt) +{ + USHORT mailbox4; + + // Update available slot count + + mailbox4 = ISP_READ(pDevExt->Adapter, mailbox4); + pDevExt->request_out = mailbox4; + + if (pDevExt->request_in == pDevExt->request_out) + { + pDevExt->queue_space = REQUEST_QUEUE_DEPTH - 1; + } + else if (pDevExt->request_in > pDevExt->request_out) + { + pDevExt->queue_space = ((REQUEST_QUEUE_DEPTH - 1) - + (pDevExt->request_in - pDevExt->request_out)); + } + else + { + pDevExt->queue_space = (pDevExt->request_out-pDevExt->request_in)-1; + } + + // Check if enough are now available + + if (pDevExt->queue_space >= slotcnt) + { + return(TRUE); // Queue space available, return + } + else + { + QLPrint((1, "CheckQueueSpace: no request queue space\n")); + return(FALSE); // No space, return error status + } +} + + +/************************************************************************/ +/* */ +/* QLResetScsiBus */ +/* */ +/* This function resets the SCSI bus and calls the reset cleanup */ +/* function. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* PathId - Supplies the path id of the bus */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - Indicating the reset is complete */ +/* FALSE - if error doing reset */ +/* */ +/************************************************************************/ + +BOOLEAN QLResetScsiBus(IN PVOID ServiceContext, IN ULONG PathId) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + USHORT mbox_sts[6]; + USHORT i; + + QLPrint((1, "QLResetScsiBus: Resetting the SCSI bus\n")); + + // Reset SCSI bus + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_BUS_RESET, + pDevExt->Bus_Reset_Delay, + 0,0,0,0)) + { + QLPrint((1, "QLResetScsiBus: SCSI BUS RESET command failed\n")); + return(FALSE); + } + + // Wait for RISC reset delay + + for (i = 0; i < pDevExt->Bus_Reset_Delay * 1000; i++) + ScsiPortStallExecution((ULONG)1000); + + QLCleanupAfterReset(pDevExt); + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* QLCleanupAfterReset */ +/* */ +/* This routine is called after a SCSI bus reset occurs. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID QLCleanupAfterReset(IN PHW_DEVICE_EXTENSION pDevExt) +{ + + // Reenable ISP queues + + if (!SendMarker(pDevExt)) + { + QLPrint((1, "QLCleanupAfterReset: Failed to send marker\n")); + pDevExt->AdapterFlags |= AFLG_SEND_MARKER; + } + + ScsiPortNotification(ResetDetected, pDevExt, NULL); + +} + + +/************************************************************************/ +/* */ +/* QLAdapterState */ +/* */ +/* This function is called for switching states between real and */ +/* protected mode drivers. */ +/* */ +/* Arguments: */ +/* */ +/* ServiceContext - Supplies a pointer to the device extension */ +/* Context - */ +/* SaveState - TRUE indicates adapter state should be saved */ +/* FALSE indicates adapter state should be restored */ +/* */ +/* Return Value: */ +/* */ +/* TRUE - Indicating the operation is complete */ +/* FALSE - if error */ +/* */ +/************************************************************************/ + +BOOLEAN QLAdapterState(IN PVOID ServiceContext,IN PVOID Context,IN BOOLEAN SaveState) +{ + PHW_DEVICE_EXTENSION pDevExt = ServiceContext; + USHORT mbox_sts[6]; + + if (SaveState) + { + QLPrint((1, "QLAdapterState: save adapter state\n")); + } + else + { + QLPrint((1, "QLAdapterState: restore adapter state\n")); + + // Disable ISP interrupts for ROM BIOS + + ISP_WRITE(pDevExt->Adapter, bus_icr, ICR_DISABLE_ALL_INTS); + + // Disable RISC request queue + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_INIT_REQUEST_QUEUE, + 0, + 0,0,0,0)) + { + QLPrint((1, "QLAdapterState: INIT REQUEST QUEUE cmd failed\n")); + return(FALSE); + } + + // Disable RISC response queue + + if (!MailboxCommand(pDevExt, mbox_sts, 2, 2, + MBOX_CMD_INIT_RESPONSE_QUEUE, + 0, + 0,0,0,0)) + { + QLPrint((1, "QLAdapterState: INIT RESPONSE QUEUE cmd failed\n")); + return(FALSE); + } + + } + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* GetNovramParameters */ +/* */ +/* This routine gets NOVRAM parameters and sets up in host adapter */ +/* block, use default values if NOVRAM data not valid. */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID GetNovramParameters(IN PHW_DEVICE_EXTENSION pDevExt) +{ + NOVRAM NovramParameters; + PNOVRAM nvram_ptr = &NovramParameters; + USHORT i; + + // Read in entire NOVRAM and perform checksum to make sure data is valid + + if (ReadAllNovram(pDevExt, (UCHAR*)nvram_ptr)) + { + QLPrint((1, "GetNovramParameters: parameters valid\n")); + + // NOVRAM valid, use paramters + + pDevExt->Config_Reg = nvram_ptr->Fifo_Threshold; + pDevExt->Host_Adapter_Enable = nvram_ptr->Host_Adapter_Enable; + pDevExt->Initiator_SCSI_Id = nvram_ptr->Initiator_SCSI_Id; + pDevExt->Bus_Reset_Delay = nvram_ptr->Bus_Reset_Delay; + + // Only 1 retry and no delay for NT driver (Disk Administrator problem) + // pDevExt->Retry_Count = nvram_ptr->Retry_Count; + // pDevExt->Retry_Delay = nvram_ptr->Retry_Delay; + pDevExt->Retry_Count = NVRAM_DEF_RETRY_COUNT; + pDevExt->Retry_Delay = NVRAM_DEF_RETRY_DELAY; + + pDevExt->ASync_Data_Setup_Time = nvram_ptr->ASync_Data_Setup_Time; + pDevExt->REQ_ACK_Active_Negation= nvram_ptr->REQ_ACK_Active_Negation; + pDevExt->DATA_Active_Negation = nvram_ptr->DATA_Line_Active_Negation; + pDevExt->Data_DMA_Burst_Enable = nvram_ptr->Data_DMA_Burst_Enable; + pDevExt->Cmd_DMA_Burst_Enable = nvram_ptr->Command_DMA_Burst_Enable; + pDevExt->Tag_Age_Limit = nvram_ptr->Tag_Age_Limit; + pDevExt->Selection_Timeout = nvram_ptr->Selection_Timeout; + pDevExt->Max_Queue_Depth = nvram_ptr->Max_Queue_Depth; + pDevExt->Termination_Low_Enable = nvram_ptr->Termination_Low_Enable; + pDevExt->Termination_High_Enable= nvram_ptr->Termination_High_Enable; + pDevExt->PCMC_Burst_Enable = nvram_ptr->PCMC_Burst_Enable; + pDevExt->Sixty_MHz_Enable = nvram_ptr->Sixty_MHz_Enable; + + for (i = 0; i < 16; i++) + { + UCHAR temp = 0; + + temp |= nvram_ptr->Id[i].Renegotiate_on_Error << 0; + temp |= nvram_ptr->Id[i].Stop_Queue_on_Check << 1; + temp |= nvram_ptr->Id[i].Auto_Request_Sense << 2; + temp |= nvram_ptr->Id[i].Tagged_Queuing << 3; + temp |= nvram_ptr->Id[i].Sync_Data_Transfers << 4; + temp |= nvram_ptr->Id[i].Wide_Data_Transfers << 5; + temp |= nvram_ptr->Id[i].Parity_Checking << 6; + temp |= nvram_ptr->Id[i].Disconnect_Allowed << 7; + + pDevExt->Id[i].Capability = temp; + pDevExt->Id[i].Execution_Throttle = nvram_ptr->Id[i].Execution_Throttle; + pDevExt->Id[i].Sync_Period = nvram_ptr->Id[i].Sync_Period; + pDevExt->Id[i].Sync_Offset = nvram_ptr->Id[i].Sync_Offset; + pDevExt->Id[i].Device_Enable= nvram_ptr->Id[i].Device_Enable; + + // Force auto request sense ON and stop queue OFF + + pDevExt->Id[i].Capability |= CAP_AUTO_REQ_SENSE; + pDevExt->Id[i].Capability &= ~CAP_STOP_QUEUE_ON_CHECK; + + if (pDevExt->Id[i].Capability & CAP_TAGGED_QUEUING) + { + pDevExt->AdapterFlags |= AFLG_TAGGED_QUEUING; + } + } + } + else + { + QLPrint((1, "GetNovramParameters: parameters NOT valid, using defaults\n")); + + // Use defaults, NOVRAM was not programmed + + pDevExt->Config_Reg = NVRAM_DEF_FIFO_THRESHOLD; + pDevExt->Host_Adapter_Enable = NVRAM_DEF_ADAPTER_ENABLE; + pDevExt->Initiator_SCSI_Id = NVRAM_DEF_INITIATOR_SCSI_ID; + pDevExt->Bus_Reset_Delay = NVRAM_DEF_BUS_RESET_DELAY; + pDevExt->Retry_Count = NVRAM_DEF_RETRY_COUNT; + pDevExt->Retry_Delay = NVRAM_DEF_RETRY_DELAY; + pDevExt->ASync_Data_Setup_Time = NVRAM_DEF_ASYNC_SETUP_TIME; + pDevExt->REQ_ACK_Active_Negation= NVRAM_DEF_REQ_ACK_ACTIVE_NEGATION; + pDevExt->DATA_Active_Negation = NVRAM_DEF_DATA_ACTIVE_NEGATION; + pDevExt->Data_DMA_Burst_Enable = NVRAM_DEF_DATA_DMA_BURST_ENABLE; + pDevExt->Cmd_DMA_Burst_Enable = NVRAM_DEF_CMD_DMA_BURST_ENABLE; + pDevExt->Tag_Age_Limit = NVRAM_DEF_TAG_AGE_LIMIT; + pDevExt->Selection_Timeout = NVRAM_DEF_SELECTION_TIMEOUT; + pDevExt->Max_Queue_Depth = NVRAM_DEF_MAX_QUEUE_DEPTH; + pDevExt->Termination_Low_Enable = NVRAM_DEF_TERMINATION_LOW_ENABLE; + pDevExt->Termination_High_Enable= NVRAM_DEF_TERMINATION_HIGH_ENABLE; + pDevExt->PCMC_Burst_Enable = NVRAM_DEF_PCMC_BURST_ENABLE; + pDevExt->Sixty_MHz_Enable = NVRAM_DEF_SIXTY_MHZ_ENABLE; + + for (i = 0; i < 16; i++) + { + UCHAR temp = 0; + + temp |= NVRAM_DEF_RENEGOTIATE_ON_ERROR << 0; + temp |= NVRAM_DEF_STOP_QUEUE_ON_CHECK << 1; + temp |= NVRAM_DEF_AUTO_REQUEST_SENSE << 2; + temp |= NVRAM_DEF_TAGGED_QUEUING << 3; + temp |= NVRAM_DEF_SYNC_DATA_TRANSFERS << 4; + temp |= NVRAM_DEF_WIDE_DATA_TRANSFERS << 5; + temp |= NVRAM_DEF_PARITY_CHECKING << 6; + temp |= NVRAM_DEF_DISCONNECT_ALLOWED << 7; + + pDevExt->Id[i].Capability = temp; + pDevExt->Id[i].Execution_Throttle = NVRAM_DEF_EXECUTION_THROTTLE; + pDevExt->Id[i].Sync_Period = NVRAM_DEF_SYNC_PERIOD; + pDevExt->Id[i].Sync_Offset = NVRAM_DEF_SYNC_OFFSET; + pDevExt->Id[i].Device_Enable= NVRAM_DEF_DEVICE_ENABLE; + + if (pDevExt->Id[i].Capability & CAP_TAGGED_QUEUING) + { + pDevExt->AdapterFlags |= AFLG_TAGGED_QUEUING; + } + } + } + + // Enable burst mode + + if (pDevExt->Data_DMA_Burst_Enable || pDevExt->Cmd_DMA_Burst_Enable) + { + pDevExt->Config_Reg |= NVRAM_CONFIG_BURST_ENABLE; + } +} + + +/************************************************************************/ +/* */ +/* ReadAllNovram */ +/* */ +/* This routine is called to read the entire NOVRAM into buffer */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* buf - pointer to parameter buffer */ +/* */ +/* Return Value: */ +/* */ +/* TRUE if NOVRAM read OK */ +/* FALSE if NOVRAM not valid */ +/* */ +/************************************************************************/ + +BOOLEAN ReadAllNovram(IN PHW_DEVICE_EXTENSION pDevExt, UCHAR* buf) +{ + UCHAR* ptr; + UCHAR sum; + USHORT index; + + // Loop through the entire NOVRAM (64 words) + + ptr = (UCHAR*)buf; + for (index = 0; index < 64; index++, ptr += 2) + { + // Read next word from NOVRAM + + ReadNovramWord(pDevExt, index, (USHORT*)ptr); + } + + // Check for a valid signiture + + if (buf[0] != 'I' || + buf[1] != 'S' || + buf[2] != 'P' || + buf[3] != ' ') + { + return(FALSE); // invalid signature + } + + // Check version number for 2 or above + + if (buf[4] < 2) + { + QLPrint((1, "NOVRAM wrong version\n")); + return(FALSE); // wrong version (old NOVRAM layout) + } + + // Verify correct checksum + + ptr = (UCHAR*)buf; + for (sum = 0, index = 0; index < 128; index++, ptr++) + { + sum += *ptr; + } + if (sum != 0) + { + return(FALSE); // bad checksum + } + + return(TRUE); +} + + +/************************************************************************/ +/* */ +/* ReadNovramWord */ +/* */ +/* This routine is called to read a word from NOVRAM */ +/* */ +/* Arguments: */ +/* */ +/* pDevExt - Supplies a pointer to the device extension */ +/* addr - NOVRAM word offset to read */ +/* ptr - pointer to parameter buffer */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID ReadNovramWord(IN PHW_DEVICE_EXTENSION pDevExt, + USHORT addr, USHORT* ptr) +{ + USHORT word_val; + USHORT bit_val; + SHORT index; + + // Select the chip + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_SELECT); + NovramDelay(); + ISP_WRITE(pDevExt->Adapter, NvRam_reg, (NVRAM_SELECT | NVRAM_CLOCK)); + NovramDelay(); + + // Setup 9 bit command word: 1 start bit, 2 opcode bits, 6 addr bits + + word_val = (NVRAM_READ_OP << 6) | (addr & 0x3F); + + // Send the request + + for (index = 8; index >= 0; index--) + { + // determine if we should send a one or a zero + + bit_val = 0; + if ((word_val >> index) & 1) + { + bit_val = NVRAM_DATA_OUT; + } + + // send the bit to the NvRam + // 1. Select + data bit, delay + // 2. Select + data bit + clock, delay + // 3. Select + data bit (remove clock), delay + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, (USHORT)(NVRAM_SELECT | bit_val)); + NovramDelay(); + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, + (USHORT)(NVRAM_SELECT | bit_val | NVRAM_CLOCK)); + NovramDelay(); + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, (USHORT)(NVRAM_SELECT | bit_val)); + NovramDelay(); + } + + // Zap the location we're reading to before starting + + *ptr = 0; + + // read the NvRam data + + for (index = 15; index >= 0; index--) + { + // move all of bits over (bits are read in MSB manner) + + *ptr <<= 1; + + // cycle the clock + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, (NVRAM_SELECT | NVRAM_CLOCK)); + NovramDelay(); + + // see if the incoming bit should be set or not + + word_val = ISP_READ(pDevExt->Adapter, NvRam_reg); + if (word_val & NVRAM_DATA_IN) + { + *ptr |= 1; + } + + // remove the clock + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_SELECT); + NovramDelay(); + } + + // Done with this request, clear the selection + + ISP_WRITE(pDevExt->Adapter, NvRam_reg, NVRAM_DESELECT); +} + + +/************************************************************************/ +/* */ +/* NovramDelay */ +/* */ +/* This routine waits a little bit to let signals settle */ +/* */ +/* Arguments: */ +/* */ +/* None */ +/* */ +/* Return Value: */ +/* */ +/* None */ +/* */ +/************************************************************************/ + +VOID NovramDelay() +{ + + ScsiPortStallExecution((ULONG)NVRAM_DELAY_COUNT); +} diff --git a/private/ntos/miniport/qlogic/qlisp.h b/private/ntos/miniport/qlogic/qlisp.h new file mode 100644 index 000000000..2dafdd333 --- /dev/null +++ b/private/ntos/miniport/qlogic/qlisp.h @@ -0,0 +1,608 @@ +/************************************************************************/ +/* */ +/* Driver Name: QL10WNT.SYS - NT Miniport Driver for QLogic ISP1020 */ +/* */ +/* Source File Name: QLISP.H */ +/* */ +/* Function: Internal data structures and C macros. */ +/* */ +/************************************************************************/ +/* */ +/* NOTICE */ +/* */ +/* COPYRIGHT 1994-1995 QLOGIC CORPORATION */ +/* ALL RIGHTS RESERVED */ +/* */ +/* This computer program is CONFIDENTIAL and a TRADE SECRET */ +/* of QLOGIC CORPORATION. The receipt or possesion of this */ +/* program does not convey any rights to reproduce or disclose */ +/* its contents, or to manufacture, use, or sell anything that */ +/* it may describe, in whole or in part, without the specific */ +/* written consent of QLOGIC CORPORATION. Any reproduction of */ +/* this program without the express written consent of QLOGIC */ +/* CORPORATION is a violation of the copyright laws and may */ +/* subject you to criminal prosecution. */ +/* */ +/************************************************************************/ +/* */ +/* Revision history: */ +/* */ +/* See QLISP.C module for driver revision history */ +/* */ +/************************************************************************/ + + +/**********************************************************************/ +/* Local defines and constants */ +/**********************************************************************/ + +#define MAX_SUPPORTED_ADAPTERS 3 // maximum # of supported adapters +#define NUM_SCSI_IDS 16 +#define NUM_SCSI_LUNS 8 +#define REQUEST_QUEUE_DEPTH 32 +#define RESPONSE_QUEUE_DEPTH 32 +#define MAX_SG_SEGMENTS 18 // max s/g segments (cmd entry + 2 cont entrys) +#define MAX_CONT_ENTRYS 2 // max continuation entrys (2 = 18 s/g segments) +#define WAIT_QUEUE_RETRY_CNT 1000 +#define CMD_RETRY_CNT 3 +#define DEFTIMEOUT 30 // default timeout (seconds) + + +/************************************************************************/ +/* Macros */ +/************************************************************************/ + + +/**********************************************************************/ +/* Forward typedefs */ +/**********************************************************************/ + + +/************************************************************************/ +/* NOVRAM definitions */ +/************************************************************************/ + +/* NOVRAM data structure */ + +typedef struct _NOVRAM +{ + UCHAR id[4]; /* "ISP " */ + UCHAR version; + /* bits */ + UCHAR Fifo_Threshold :2; /* 0,1 */ + UCHAR Not_Used0 :1; /* 2 */ + UCHAR Host_Adapter_Enable :1; /* 3 */ + UCHAR Initiator_SCSI_Id :4; /* 4,5,6,7 */ + + UCHAR Bus_Reset_Delay; + UCHAR Retry_Count; + UCHAR Retry_Delay; + /* bits */ + UCHAR ASync_Data_Setup_Time :4; /* 0,1,2,3 */ + UCHAR REQ_ACK_Active_Negation :1; /* 4 */ + UCHAR DATA_Line_Active_Negation :1; /* 5 */ + UCHAR Data_DMA_Burst_Enable :1; /* 6 */ + UCHAR Command_DMA_Burst_Enable :1; /* 7 */ + + UCHAR Tag_Age_Limit; + /* bits */ + UCHAR Termination_Low_Enable :1; /* 0 */ + UCHAR Termination_High_Enable :1; /* 1 */ + UCHAR PCMC_Burst_Enable :1; /* 3 */ + UCHAR Sixty_MHz_Enable :1; /* 2 */ + UCHAR Not_Used1 :4; + + USHORT Selection_Timeout; + USHORT Max_Queue_Depth; + UCHAR Pad0[12]; + + struct + { /*bit*/ + UCHAR Renegotiate_on_Error :1; /* 0 */ + UCHAR Stop_Queue_on_Check :1; /* 1 */ + UCHAR Auto_Request_Sense :1; /* 2 */ + UCHAR Tagged_Queuing :1; /* 3 */ + UCHAR Sync_Data_Transfers :1; /* 4 */ + UCHAR Wide_Data_Transfers :1; /* 5 */ + UCHAR Parity_Checking :1; /* 6 */ + UCHAR Disconnect_Allowed :1; /* 7 */ + + UCHAR Execution_Throttle; + UCHAR Sync_Period; + /* bits */ + UCHAR Sync_Offset :4; /* 0,1,2,3 */ + UCHAR Device_Enable :1; /* 4 */ + UCHAR Not_Used2 :3; /* 5,6,7 */ + + UCHAR Available0; + UCHAR Available1; + } Id[16]; + + UCHAR Pad1[3]; + UCHAR Check_Sum; +} NOVRAM, *PNOVRAM; + +/* Command values */ + +#define NVRAM_START_BIT 4 +#define NVRAM_WRITE_OP (NVRAM_START_BIT+1) +#define NVRAM_READ_OP (NVRAM_START_BIT+2) +#define NVRAM_ERASE_OP (NVRAM_START_BIT+3) +#define NVRAM_DELAY_COUNT 10 + +/* NvRam Register bit values */ + +#define NVRAM_DESELECT 0x00 +#define NVRAM_CLOCK 0x01 +#define NVRAM_SELECT 0x02 +#define NVRAM_DATA_OUT 0x04 +#define NVRAM_DATA_IN 0x08 + +/* NvRam Parameter Defaults */ + +#define OFF 0 +#define ON 1 + +/* Host Adapter defaults */ + +#define NVRAM_DEF_FIFO_THRESHOLD 2 /* 32 bytes */ +#define NVRAM_DEF_ADAPTER_ENABLE ON +#define NVRAM_DEF_INITIATOR_SCSI_ID 7 +#define NVRAM_DEF_BUS_RESET_DELAY 3 /* 3 second */ +// Only 1 retry and no delay for NT driver (problem with NT 3.5 Disk Administrator) +#define NVRAM_DEF_RETRY_COUNT 1 +#define NVRAM_DEF_RETRY_DELAY 0 +#define NVRAM_DEF_ASYNC_SETUP_TIME 6 /* 4 clock periods */ +#define NVRAM_DEF_REQ_ACK_ACTIVE_NEGATION ON +#define NVRAM_DEF_DATA_ACTIVE_NEGATION ON +#define NVRAM_DEF_DATA_DMA_BURST_ENABLE ON +#define NVRAM_DEF_CMD_DMA_BURST_ENABLE ON +#define NVRAM_DEF_TAG_AGE_LIMIT 8 +#define NVRAM_DEF_SELECTION_TIMEOUT 250 /* 250 ms */ +#define NVRAM_DEF_TERMINATION_LOW_ENABLE ON +#define NVRAM_DEF_TERMINATION_HIGH_ENABLE ON +#define NVRAM_DEF_PCMC_BURST_ENABLE OFF +#define NVRAM_DEF_SIXTY_MHZ_ENABLE OFF + +/* Drive defaults */ + +#define NVRAM_DEF_RENEGOTIATE_ON_ERROR ON +#define NVRAM_DEF_STOP_QUEUE_ON_CHECK OFF +#define NVRAM_DEF_AUTO_REQUEST_SENSE ON +#define NVRAM_DEF_TAGGED_QUEUING ON +#define NVRAM_DEF_SYNC_DATA_TRANSFERS ON +#define NVRAM_DEF_WIDE_DATA_TRANSFERS ON +#define NVRAM_DEF_PARITY_CHECKING ON +#define NVRAM_DEF_DISCONNECT_ALLOWED ON +#define NVRAM_DEF_SYNC_PERIOD 25 +#define NVRAM_DEF_SYNC_OFFSET 12 +#define NVRAM_DEF_DEVICE_ENABLE ON +#define NVRAM_DEF_EXECUTION_THROTTLE 16 +#define NVRAM_DEF_MAX_QUEUE_DEPTH 256 + +#define NVRAM_CONFIG_BURST_ENABLE 0x04 + + +/************************************************************************/ +/* PCI configuration definitions */ +/************************************************************************/ + +typedef struct _PCI_CHIP_REGISTERS_M1 // Method 1 +{ + ULONG Config_Address; + ULONG Config_Data; +} PCI_CHIP_REGISTERS_M1, *PPCI_CHIP_REGISTERS_M1; + +#define PCI_MAXBUSNUM 256 +#define PCI_MAXDEVNUM 32 +#define PCI_CONFIG_ADDRESS 0xcf8 +#define PCI_CONFIG_DATA 0xcfc +#define PCI_ENABLE_CONFIG 0x80000000 +#define PCI_DISABLE_CONFIG 0x00000000 + +typedef struct _PCI_CHIP_REGISTERS // Method 2 +{ + UCHAR pci_config; +} PCI_CHIP_REGISTERS, *PPCI_CHIP_REGISTERS; + +#define PCI_CONFIG 0xcf8 +#define PCI_ENABLE 0x80 +#define PCI_START 0xC000 +#define PCI_SLOT_CNT 16 +#define PCI_LAST 0xDFFF +#define PCI_SIZE 0x100 + +#define PCI_BEGIN_SEARCH (paddr_t)0xe0000 +#define PCI_END_SEARCH (paddr_t)0xfffff + +#define PCI_BIOS_VECT 0x6EFE00F0 +#define PCI_BIOS_INT 0x1A + +#define PCI_FUNCTION_ID 0xB100 + +/* PCI Function List */ + +#define PCI_BIOS_PRESENT 0xB101 +#define FIND_PCI_DEVICE 0xB102 +#define FIND_PCI_CLASS_CODE 0xB103 +#define GENERATE_SPECIAL_CYCLE 0xB106 +#define READ_CONFIG_BYTE 0xB108 +#define READ_CONFIG_WORD 0xB109 +#define READ_CONFIG_DWORD 0xB10A +#define WRITE_CONFIG_BYTE 0xB10B +#define WRITE_CONFIG_WORD 0xB10C +#define WRITE_CONFIG_DWORD 0xB10D + +/* PCI Return Code List */ + +#define SUCCESSFUL 0x00 +#define FUNC_NOT_SUPPORTED 0x81 +#define BAD_VENDOR_ID 0x83 +#define DEVICE_NOT_FOUND 0x86 +#define BAD_REGISTER_NUMBER 0x87 + +/* Configuration space register definitions */ + +typedef struct _PCI_REGS +{ + USHORT Vendor_Id; +#define QLogic_VENDOR_ID 0x1077 + USHORT Device_Id; +#define QLogic_DEVICE_ID 0x1020 + USHORT Command; +#define BUS_MASTER_ENABLE 0x0004 + USHORT Status; + ULONG Rev_Id_Class_Code; + UCHAR Cache_Line_Size; + UCHAR Latency_Timer; + UCHAR Header_Type; + UCHAR BIST; + ULONG IO_Base_Address; + ULONG Memory_Base_Address; + ULONG Base_Address_3; + ULONG Base_Address_4; + ULONG Base_Address_5; + ULONG Base_Address_6; + ULONG Reserved_1; + ULONG Reserved_2; + ULONG ROM_Base_Address; + ULONG Reserved_3; + ULONG Reserved_4; + UCHAR Interrupt_Line; + UCHAR Interrupt_Pin; + UCHAR Minimum_Grant; + UCHAR Maximum_Latency; + UCHAR unused[192]; +} PCI_REGS, *PPCI_REGS; + + +/****************************************************************/ +/* ISP firmware interface definitions */ +/****************************************************************/ + +/*** Queue Entry structure ***/ + +typedef struct _QueueEntry +{ + UCHAR data[64]; +} QUEUE_ENTRY, *PQUEUE_ENTRY; + + +/*** ENTRY HEADER structure ***/ + +typedef struct +{ + UCHAR entry_type; + UCHAR entry_cnt; + UCHAR sys_def_1; + UCHAR flags; +} ENTRY_HEADER; + +/* Entry Header Type Definitions */ + +#define ET_COMMAND 1 +#define ET_CONTINUATION 2 +#define ET_STATUS 3 +#define ET_MARKER 4 +#define ET_EXTENDED_COMMAND 5 + +/* Entry Header Flag Definitions */ + +#define EF_CONTINUATION 0x01 +#define EF_BUSY 0x02 +#define EF_BAD_HEADER 0x04 +#define EF_BAD_PAYLOAD 0x08 +#define EF_ERROR_MASK (EF_BUSY | EF_BAD_HEADER | EF_BAD_PAYLOAD) + + +/*** DATA SEGMENT structure ***/ + +typedef struct +{ + ULONG base; + ULONG count; +} DATA_SEG; + + +/*** COMMAND ENTRY structure ***/ + +typedef struct _CommandEntry +{ + ENTRY_HEADER hdr; + ULONG handle; + UCHAR target_lun; + UCHAR target_id; + USHORT cdb_length; + USHORT control_flags; + USHORT reserved; + USHORT time_out; + USHORT segment_cnt; + UCHAR cdb[12]; + DATA_SEG dseg[4]; +} COMMAND_ENTRY, *PCOMMAND_ENTRY; + +/* Command Entry Control Flag Definitions */ + +#define CF_NO_DISCONNECTS 0x0001 +#define CF_HEAD_TAG 0x0002 +#define CF_ORDERED_TAG 0x0004 +#define CF_SIMPLE_TAG 0x0008 +#define CF_TARGET_ROUTINE 0x0010 +#define CF_READ 0x0020 +#define CF_WRITE 0x0040 +#define CF_NO_REQUEST_SENSE 0x0100 + + +/*** EXTENDED COMMAND ENTRY structure ***/ + +typedef struct _ExtCommandEntry +{ + ENTRY_HEADER hdr; + ULONG handle; + UCHAR target_lun; + UCHAR target_id; + USHORT cdb_length; + USHORT control_flags; + USHORT reserved; + USHORT time_out; + USHORT segment_cnt; + UCHAR cdb[44]; +} EXT_COMMAND_ENTRY, *PEXT_COMMAND_ENTRY; + + +/*** CONTINUATION ENTRY structure ***/ + +typedef struct _ContinuationEntry +{ + ENTRY_HEADER hdr; + ULONG reserved; + DATA_SEG dseg[7]; +} CONTINUATION_ENTRY, *PCONTINUATION_ENTRY; + + +/*** MARKER ENTRY structure ***/ + +typedef struct _MarkerEntry +{ + ENTRY_HEADER hdr; + ULONG reserved0; + UCHAR target_lun; + UCHAR target_id; + UCHAR modifier; + UCHAR reserved1; + UCHAR reserved2[52]; +} MARKER_ENTRY, *PMARKER_ENTRY; + +/* Marker Entry Modifier Definitions */ + +#define MM_SYNC_DEVICE 0 +#define MM_SYNC_TARGET 1 +#define MM_SYNC_ALL 2 + + +/*** STATUS ENTRY structure ***/ + +typedef struct _StatusEntry +{ + ENTRY_HEADER hdr; + ULONG handle; + USHORT scsi_status; + USHORT completion_status; + USHORT state_flags; + USHORT status_flags; + USHORT time; + USHORT req_sense_length; + ULONG residual; + UCHAR reserved[8]; + UCHAR req_sense_data[32]; +} STATUS_ENTRY, *PSTATUS_ENTRY; + +/* Status Entry Completion Status Defintions */ + +#define SCS_COMPLETE 0 +#define SCS_INCOMPLETE 1 +#define SCS_DMA_ERROR 2 +#define SCS_TRANSPORT_ERROR 3 +#define SCS_RESET_OCCURRED 4 +#define SCS_ABORTED 5 +#define SCS_TIMEOUT 6 +#define SCS_DATA_OVERRUN 7 +#define SCS_COMMAND_OVERRUN 8 +#define SCS_STATUS_OVERRUN 9 +#define SCS_BAD_MESSAGE 10 +#define SCS_NO_MESSAGE_OUT 11 +#define SCS_EXT_ID_FAILED 12 +#define SCS_IDE_MSG_FAILED 13 +#define SCS_ABORT_MSG_FAILED 14 +#define SCS_REJECT_MSG_FAILED 15 +#define SCS_NOP_MSG_FAILED 16 +#define SCS_PARITY_ERROR_MSG_FAILED 17 +#define SCS_DEVICE_RESET_MSG_FAILED 18 +#define SCS_ID_MSG_FAILED 19 +#define SCS_UNEXPECTED_BUS_FREE 20 + +/* Status Entry State Flag Definitions */ + +#define SS_GOT_BUS 0x0100 +#define SS_GOT_TARGET 0x0200 +#define SS_SENT_CDB 0x0400 +#define SS_TRANSFERRED_DATA 0x0800 +#define SS_GOT_STATUS 0x1000 +#define SS_GOT_SENSE 0x2000 +#define SS_TRANSFER_COMPLETE 0x4000 + +/* Status Entry Status Flag Definitions */ + +#define SST_DISCONNECT 0x0001 +#define SST_SYNCHRONOUS 0x0002 +#define SST_PARITY_ERROR 0x0004 +#define SST_BUS_RESET 0x0008 +#define SST_DEVICE_RESET 0x0010 +#define SST_ABORTED 0x0020 +#define SST_TIMEOUT 0x0040 +#define SST_NEGOTIATION 0x0080 + + +/* Mailbox Command Definitions */ + +#define MBOX_CMD_LOAD_RAM 0x0001 +#define MBOX_CMD_EXECUTE_FIRMWARE 0x0002 +#define MBOX_CMD_WRITE_RAM_WORD 0x0004 +#define MBOX_CMD_READ_RAM_WORD 0x0005 +#define MBOX_CMD_MAILBOX_REGISTER_TEST 0x0006 +#define MBOX_CMD_VERIFY_CHECKSUM 0x0007 +#define MBOX_CMD_ABOUT_FIRMWARE 0x0008 +#define MBOX_CMD_INIT_REQUEST_QUEUE 0x0010 +#define MBOX_CMD_INIT_RESPONSE_QUEUE 0x0011 +#define MBOX_CMD_STOP_FIRMWARE 0x0014 +#define MBOX_CMD_ABORT 0x0015 +#define MBOX_CMD_ABORT_DEVICE 0x0016 +#define MBOX_CMD_ABORT_TARGET 0x0017 +#define MBOX_CMD_BUS_RESET 0x0018 +#define MBOX_CMD_START_QUEUE 0x001A + +#define MBOX_CMD_SET_INITIATOR_SCSI_ID 0x0030 +#define MBOX_CMD_SET_SELECTION_TIMEOUT 0x0031 +#define MBOX_CMD_SET_RETRY_COUNT 0x0032 +#define MBOX_CMD_SET_TAG_AGE_LIMIT 0x0033 +#define MBOX_CMD_SET_CLOCK_RATE 0x0034 +#define MBOX_CMD_SET_ACTIVE_NEGATION_STATE 0x0035 +#define MBOX_CMD_SET_ASYNC_DATA_SETUP_TIME 0x0036 +#define MBOX_CMD_SET_BUS_CONTROL_PARAMETERS 0x0037 +#define MBOX_CMD_SET_TARGET_PARAMETERS 0x0038 +#define MBOX_CMD_SET_DEVICE_QUEUE_PARAMETERS 0x0039 + +#define MBOX_CMD_GET_FIRMWARE_STATUS 0x001F +#define MBOX_CMD_GET_INITIATOR_SCSI_ID 0x0020 +#define MBOX_CMD_GET_SELECTION_TIMEOUT 0x0021 +#define MBOX_CMD_GET_RETRY_COUNT 0x0022 +#define MBOX_CMD_GET_TAG_AGE_LIMIT 0x0023 +#define MBOX_CMD_GET_CLOCK_RATE 0x0024 +#define MBOX_CMD_GET_ACTIVE_NEGATION_STATE 0x0025 +#define MBOX_CMD_GET_ASYNC_DATA_SETUP_TIME 0x0026 +#define MBOX_CMD_GET_BUS_CONTROL_PARAMETERS 0x0027 +#define MBOX_CMD_GET_TARGET_PARAMETERS 0x0028 +#define MBOX_CMD_GET_DEVICE_QUEUE_PARAMETERS 0x0029 + +/* Mailbox Status Definitions */ + +#define MBOX_STS_FIRMWARE_ALIVE 0x0000 +#define MBOX_STS_CHECKSUM_ERROR 0x0001 +#define MBOX_STS_SHADOW_LOAD_ERROR 0x0002 +#define MBOX_STS_BUSY 0x0004 + +#define MBOX_STS_COMMAND_COMPLETE 0x4000 +#define MBOX_STS_INVALID_COMMAND 0x4001 +#define MBOX_STS_HOST_INTERFACE_ERROR 0x4002 +#define MBOX_STS_TEST_FAILED 0x4003 +#define MBOX_STS_COMMAND_ERROR 0x4005 +#define MBOX_STS_COMMAND_PARAMETER_ERROR 0x4006 + +#define MBOX_ASTS_SCSI_BUS_RESET 0x8001 +#define MBOX_ASTS_SYSTEM_ERROR 0x8002 +#define MBOX_ASTS_REQUEST_TRANSFER_ERROR 0x8003 +#define MBOX_ASTS_RESPONSE_TRANSFER_ERROR 0x8004 +#define MBOX_ASTS_REQUEST_QUEUE_WAKEUP 0x8005 +#define MBOX_ASTS_TIMEOUT_RESET 0x8006 + + +/****************************************************************/ +/* ISP Register Definitions */ +/****************************************************************/ + +typedef struct _ISP_REGS +{ + /* Bus interface registers */ + + USHORT bus_id_low; /* 0000 */ + USHORT bus_id_high; /* 0002 */ + USHORT bus_config0; /* 0004 */ + USHORT bus_config1; /* 0006 */ + USHORT bus_icr; /* 0008 */ + USHORT bus_isr; /* 000A */ + USHORT bus_sema; /* 000C */ + USHORT NvRam_reg; /* 000E */ + + /* Skip over DMA Controller registers */ + + UCHAR not_used0[0x0060]; /* 0010-006F */ + + /* Mailbox registers */ + + USHORT mailbox0; /* 0070 */ + USHORT mailbox1; /* 0072 */ + USHORT mailbox2; /* 0074 */ + USHORT mailbox3; /* 0076 */ + USHORT mailbox4; /* 0078 */ + USHORT mailbox5; /* 007A */ + + /* Skip down to HCCR register */ + + UCHAR not_used1[0x44]; /* 007C-00BF */ + + /* Host Configuration and Control register */ + + USHORT hccr; /* 00C0 */ + + UCHAR not_used3[0x3E]; /* 00C2-00FF */ +} ISP_REGS, *PISP_REGS; + +/* Bus Control Register Definitions */ + +#define ICR_SOFT_RESET 0x0001 +#define ICR_ENABLE_ALL_INTS 0x0002 +#define ICR_ENABLE_RISC_INT 0x0004 +#define ICR_DISABLE_ALL_INTS 0x0000 + +/* Bus Interrupt Status Register Defintions */ + +#define BUS_ISR_RISC_INT 0x0004 + +/* Bus Semaphore Register Definitions */ + +#define BUS_SEMA_LOCK 0x0001 +#define BUS_SEMA_STATUS 0x0002 + +/* Host Command and Control Register Command Definitions */ + +#define HCCR_CMD_RESET 0x1000 /* Reset RISC */ +#define HCCR_CMD_PAUSE 0x2000 /* Pause RISC */ +#define HCCR_CMD_RELEASE 0x3000 /* Release Paused RISC */ +#define HCCR_CMD_SET_HOST_INT 0x5000 /* Set Host Interrupt */ +#define HCCR_CMD_CLEAR_RISC_INT 0x7000 /* Clear RISC interrupt */ +#define HCCR_WRITE_BIOS_ENABLE 0x9000 /* Write BIOS enable */ + +/* Host Command and Control Register Status Definitions */ + +#define HCCR_HOST_INT 0x0080 /* R: Host interrupt set */ +#define HCCR_RESET 0x0040 /* R: RISC reset in progress */ +#define HCCR_PAUSE 0x0020 /* R: RISC paused */ + +/* ISP Product ID Definitions */ + +#define PROD_ID_1 0x4953 +#define PROD_ID_2 0x0000 +#define PROD_ID_2a 0x5020 +#define PROD_ID_3 0x2020 +#define PROD_ID_4 0x0001 + diff --git a/private/ntos/miniport/qlogic/qlisp.rc b/private/ntos/miniport/qlogic/qlisp.rc new file mode 100644 index 000000000..0b3dc97e0 --- /dev/null +++ b/private/ntos/miniport/qlogic/qlisp.rc @@ -0,0 +1,12 @@ +#include <windows.h> + +#include <ntverp.h> + +#define VER_FILETYPE VFT_DRV +#define VER_FILESUBTYPE VFT2_DRV_SYSTEM +#define VER_FILEDESCRIPTION_STR "QLogic ISP1020 SCSI Driver" +#define VER_INTERNALNAME_STR "ql10wnt.sys" +#define VER_ORIGINALFILENAME_STR "ql10wnt.sys" + +#include "common.ver" + diff --git a/private/ntos/miniport/qlogic/sources b/private/ntos/miniport/qlogic/sources new file mode 100644 index 000000000..2589a5a48 --- /dev/null +++ b/private/ntos/miniport/qlogic/sources @@ -0,0 +1,41 @@ +!IF 0 + +Copyright (c) 1989 Microsoft Corporation + +Module Name: + + sources. + +Abstract: + + This file specifies the target component being built and the list of + sources files needed to build that component. Also specifies optional + compiler switches and libraries that are unique for the component being + built. + + +Author: + + Steve Wood (stevewo) 12-Apr-1990 + +NOTE: Commented description of this file is in \nt\bak\bin\sources.tpl + +!ENDIF + +MAJORCOMP=ntos +MINORCOMP=miniport + +TARGETNAME=ql10wnt +TARGETPATH=\nt\public\sdk\lib +TARGETTYPE=MINIPORT + +INCLUDES=..\..\inc + +TARGETLIBS=$(BASEDIR)\public\sdk\lib\*\scsiport.lib +!IF $(ALPHA) +TARGETLIBS=$(BASEDIR)\public\sdk\lib\*\scsiport.lib $(BASEDIR)\public\sdk\lib\*\libcntpr.lib +!ENDIF + +SOURCES=qlisp.c \ + isp_fw.c \ + qlisp.rc diff --git a/private/ntos/miniport/qlogic/txtsetup.oem b/private/ntos/miniport/qlogic/txtsetup.oem new file mode 100644 index 000000000..d8a7e7f5d --- /dev/null +++ b/private/ntos/miniport/qlogic/txtsetup.oem @@ -0,0 +1,97 @@ +# +# format for txtsetup.oem. +# +# General format: +# +# [section] +# key = value1,value2,... +# +# +# The hash ('#') introduces a comment. +# Strings with embedded spaces, commas, or hashes should be double-quoted +# + + +[Disks] + +# This section lists all disks in the disk set. +# +# <description> is a descriptive name for a disk, used when +# prompting for the disk +# <tagfile> is a file whose presence allows setup to recognize +# that the disk is inserted. +# <directory> is where the files are located on the disk. +# + +d1 = "QLogic SCSI Software Diskette", \qlscsi, \nt\ + + +[Defaults] + +# This section lists the default selection for each 'required' +# hardware component. If a line is not present for a component, +# the default defaults to the first item in the [<component_name>] +# section (see below). +# +# <component_name> is one of computer, display, keyboard, mouse, scsi +# <id> is a unique <within the component> string to be associated +# with an option. + +scsi = OEMSCSI + + + +[scsi] + +# This section lists the options available for a particular component. +# +# <id> is the unique string for the option +# <description> is a text string, presented to the user in a menu +# <key_name> gives the name of the key to be created for the component in +# HKEY_LOCAL_MACHINE\ControlSet001\Services + + +OEMSCSI = "QLogic Fast!SCSI/QLA100 (Windows NT V3.1)", ql10wnt +OEMSCSI2 = "QLogic Fast!SCSI/QLA100 (Windows NT V3.5)", ql10nt35 + + + +[Files.scsi.OEMSCSI] + +# This section lists the files that should be copied if the user +# selects a particular component option. +# +# <file_type> is one of driver, port, class, dll, hal, inf, or detect. +# See below. +# <source_disk> identifies where the file is to be copied from, and must +# match en entry in the [Disks] section. +# <filename> is the name of the file. This will be appended to the +# directory specified for the disk in the [Disks] section to form the +# full path of the file on the disk. + +driver = d1, ql10wnt.sys, ql10wnt +inf = d1, oemsetup.inf + +[Files.scsi.OEMSCSI2] + +driver = d1, ql10nt35.sys, ql10nt35 +inf = d1, oemsetup.inf + + + +[Config.scsi.OEMSCSI] + +# This section specifies values to be set in the registry for +# particular component options. Required values in the services\xxx +# key are created automatically -- use this section to specify additional +# keys to be created in services\xxx and values in services\xxx and +# services\xxx\yyy. +# +# <key_name> is relative to the services node for this device. +# If it is empty, then it refers to the services node. +# If specified, the key is created first. +# <value_name> specifies the value to be set within the key +# <value_type> is a string like REG_DWORD. See below. +# <value> specifies the actual value; its format depends on <value_type> + +[Config.scsi.OEMSCSI2] |